Name: series-workflow6qbdw Phase: Succeeded StartedAt: 2026-08-10 09:57:08 +0000 UTC FinishedAt: 2026-08-10 14:34:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[0] Phase: Succeeded StartedAt: 2026-08-10 09:57:08 +0000 UTC FinishedAt: 2026-08-10 10:45:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[0].run-triage Phase: Succeeded StartedAt: 2026-08-10 09:57:08 +0000 UTC FinishedAt: 2026-08-10 10:45:40 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "0dad4faa8e59c9c1361f75c8cc54a33c96af32f3", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEM_ALLOC_PROFILING" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "0dad4faa8e59c9c1361f75c8cc54a33c96af32f3", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEM_ALLOC_PROFILING" ], "series_id": "d73f664f-9ab0-4892-982d-8f43a66c6500" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "codetag_alloc_module_section", "codetag_free_module_sections", "codetag_load_module", "codetag_unload_module" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjM4PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+N208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01FTV9BTExPQ19QUk9GSUxJTkcmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uJiMzNDssCiAgICAmIzM0O2NvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnMmIzM0OywKICAgICYjMzQ7Y29kZXRhZ19sb2FkX21vZHVsZSYjMzQ7LAogICAgJiMzNDtjb2RldGFnX3VubG9hZF9tb2R1bGUmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgbW9kdWxlIGxvYWRpbmcgcHJvY2VzcyB0byBoYW5kbGUgY2FzZXMgd2hlcmUgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHRhZ3MgZXhjZWVkIGF2YWlsYWJsZSBwYWdlIGZsYWcgYml0cy4gSXQgaW50cm9kdWNlcyBhIHJldHJ5IG1lY2hhbmlzbSBpbiBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAgdGhhdCByZXNldHMgc2VjdGlvbiBoZWFkZXJzIGFuZCBzaXplcywgYW5kIHJldHJpZXMgdGhlIGFsbG9jYXRpb24gd2l0aG91dCBwcm9maWxpbmcuIFRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBtb2R1bGVzIGlzIGV4cGxpY2l0bHkgemVyb2VkIGJ5IGBtb2R1bGVfbWVtb3J5X2FsbG9jYCAodmlhIGBtZW1zZXQocHRyLCAwLCBzaXplKWApLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIGFueSBuZXcgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlcnNwYWNlLCBub3IgZG8gdGhleSBhZGQgY29tcGxleCBjb25kaXRpb25hbCBsb2dpYyBkZXBlbmRpbmcgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggKGUuZy4sIGluY29ycmVjdCBzaXplIGNhbGN1bGF0aW9ucywgbWVtb3J5IGxlYWtzLCBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIGR1cmluZyBzZWN0aW9uIGNvcHlpbmcpIHdvdWxkIGJlIHJlbGlhYmx5IGNhdWdodCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyB0b29scy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgbmVjZXNzaXRhdGUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgY29yZSBtb2R1bGUgbG9hZGluZyBsb2dpYyB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHJ1bnMgb3V0IG9mIHBhZ2UgZmxhZyBiaXRzICghdGFnc19hZGRyZXNzYWJsZSgpKS4gSXQgaW50cm9kdWNlcyBhIHJldHJ5IG1lY2hhbmlzbSBpbiBsYXlvdXRfYW5kX2FsbG9jYXRlKCkgdGhhdCByZXNldHMgdGhlIG1vZHVsZSBzdGF0ZSBhbmQgcmV0cmllcyBsb2FkaW5nIHdpdGhvdXQgbWVtb3J5IHByb2ZpbGluZy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIG1vZHVsZSBsb2FkaW5nIHBhdGggYW5kIG1lbW9yeSBhbGxvY2F0aW9uIHRhZ2dpbmcgc3Vic3lzdGVtLCB3aGljaCBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIGluaXRfbW9kdWxlIGFuZCBmaW5pdF9tb2R1bGUgc3lzY2FsbHMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6Mzg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA2ZjlmZjVjZTM1NGM1NGIyZjZmNzVkOTJmYjU2ZTI3Y2NhOTdmZDcwXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBBdWcgMTAgMTA6Mzg6MTQgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS9tYWluLmMgYi9rZXJuZWwvbW9kdWxlL21haW4uY1xuaW5kZXggNDZkZDhkMjVhNjA1OC4uYzMyYmI0N2E1NzNhMSAxMDA2NDRcbi0tLSBhL2tlcm5lbC9tb2R1bGUvbWFpbi5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvbW9kdWxlL21haW4uY1xuQEAgLTI5NzEsMTMgJiM0MzsyOTcxLDI2IEBAIHN0YXRpYyBzdHJ1Y3QgbW9kdWxlICpsYXlvdXRfYW5kX2FsbG9jYXRlKHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGludCBmbGFncylcbiBcdCAqIHRoaXMgaXMgZG9uZSBnZW5lcmljYWxseTsgdGhlcmUgZG9lc24mIzM5O3QgYXBwZWFyIHRvIGJlIGFueVxuIFx0ICogc3BlY2lhbCBjYXNlcyBmb3IgdGhlIGFyY2hpdGVjdHVyZXMuXG4gXHQgKi9cbiYjNDM7cmV0cnk6XG4gXHRsYXlvdXRfc2VjdGlvbnMoaW5mby1cdTAwM2Vtb2QsIGluZm8pO1xuIFx0bGF5b3V0X3N5bXRhYihpbmZvLVx1MDAzZW1vZCwgaW5mbyk7XG4gXG4gXHQvKiBBbGxvY2F0ZSBhbmQgbW92ZSB0byB0aGUgZmluYWwgcGxhY2UgKi9cbiBcdGVyciA9IG1vdmVfbW9kdWxlKGluZm8tXHUwMDNlbW9kLCBpbmZvKTtcbi1cdGlmIChlcnIpXG4tXHRcdHJldHVybiBFUlJfUFRSKGVycik7XG4mIzQzO1x0aWYgKGVycikge1xuJiM0MztcdFx0aWYgKGVyciAhPSAtRUFHQUlOKVxuJiM0MztcdFx0XHRyZXR1cm4gRVJSX1BUUihlcnIpO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIC1FQUdBSU4gbWVhbnMgcHJvZmlsaW5nIHdhcyBkaXNhYmxlZCBidXQgdGhlIG1vZHVsZVxuJiM0MztcdFx0ICogY2FuIHN0aWxsIGxvYWQgd2l0aG91dCBpdC4gUmVzZXQgc3RhdGUgYW5kIHJldHJ5LlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRyZXdyaXRlX3NlY3Rpb25faGVhZGVycyhpbmZvLCBmbGFncyk7XG4mIzQzO1x0XHRmb3JfZWFjaF9tb2RfbWVtX3R5cGUodHlwZSlcbiYjNDM7XHRcdFx0aW5mby1cdTAwM2Vtb2QtXHUwMDNlbWVtW3R5cGVdLnNpemUgPSAwO1xuJiM0MztcdFx0aW5mby1cdTAwM2VzZWNoZHJzW2luZm8tXHUwMDNlaW5kZXguc3ltXS5zaF9mbGFncyBcdTAwMjY9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7XG4mIzQzO1x0XHRpbmZvLVx1MDAzZXNlY2hkcnNbaW5mby1cdTAwM2VpbmRleC5zdHJdLnNoX2ZsYWdzIFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcbiYjNDM7XHRcdGdvdG8gcmV0cnk7XG4mIzQzO1x0fVxuIFxuIFx0LyogTW9kdWxlIGhhcyBiZWVuIGNvcGllZCB0byBpdHMgZmluYWwgcGxhY2Ugbm93OiByZXR1cm4gaXQuICovXG4gXHRtb2QgPSAodm9pZCAqKWluZm8tXHUwMDNlc2VjaGRyc1tpbmZvLVx1MDAzZWluZGV4Lm1vZF0uc2hfYWRkcjtcbmRpZmYgLS1naXQgYS9tbS9hbGxvY190YWcuYyBiL21tL2FsbG9jX3RhZy5jXG5pbmRleCA1MmFlY2UyN2IwMGUwLi4zZWJhNjMzMTE3NGRhIDEwMDY0NFxuLS0tIGEvbW0vYWxsb2NfdGFnLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL2FsbG9jX3RhZy5jXG5AQCAtODM1LDYgJiM0Mzs4MzUsNTIgQEAgc3RhdGljIGludCB2bV9tb2R1bGVfdGFnc19wb3B1bGF0ZSh2b2lkKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuJiM0MztzdGF0aWMgdm9pZCByZWxlYXNlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgYm9vbCB1c2VkKVxuJiM0Mzt7XG4mIzQzO1x0TUFfU1RBVEUobWFzLCBcdTAwMjZtb2RfYXJlYV9tdCwgbW9kdWxlX3RhZ3Muc2l6ZSwgbW9kdWxlX3RhZ3Muc2l6ZSk7XG4mIzQzO1x0c3RydWN0IGFsbG9jX3RhZyAqc3RhcnRfdGFnO1xuJiM0MztcdHN0cnVjdCBhbGxvY190YWcgKmVuZF90YWc7XG4mIzQzO1x0c3RydWN0IG1vZHVsZSAqdmFsO1xuJiM0MztcbiYjNDM7XHRtYXNfbG9jayhcdTAwMjZtYXMpO1xuJiM0MztcdG1hc19mb3JfZWFjaF9yZXYoXHUwMDI2bWFzLCB2YWwsIDApXG4mIzQzO1x0XHRpZiAodmFsID09IG1vZClcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1xuJiM0MztcdGlmICghdmFsKSAvKiBtb2R1bGUgbm90IGZvdW5kICovXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0aWYgKCF1c2VkKVxuJiM0MztcdFx0Z290byByZWxlYXNlX2FyZWE7XG4mIzQzO1xuJiM0MztcdHN0YXJ0X3RhZyA9IChzdHJ1Y3QgYWxsb2NfdGFnICopKG1vZHVsZV90YWdzLnN0YXJ0X2FkZHIgJiM0MzsgbWFzLmluZGV4KTtcbiYjNDM7XHRlbmRfdGFnID0gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciAmIzQzOyBtYXMubGFzdCk7XG4mIzQzO1x0aWYgKCFjbGVhbl91bnVzZWRfY291bnRlcnMoc3RhcnRfdGFnLCBlbmRfdGFnKSkge1xuJiM0MztcdFx0c3RydWN0IGFsbG9jX3RhZyAqdGFnO1xuJiM0MztcbiYjNDM7XHRcdGZvciAodGFnID0gc3RhcnRfdGFnOyB0YWcgXHUwMDNjPSBlbmRfdGFnOyB0YWcmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdHN0cnVjdCBhbGxvY190YWdfY291bnRlcnMgY291bnRlcjtcbiYjNDM7XG4mIzQzO1x0XHRcdGlmICghdGFnLVx1MDAzZWNvdW50ZXJzKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcbiYjNDM7XHRcdFx0Y291bnRlciA9IGFsbG9jX3RhZ19yZWFkKHRhZyk7XG4mIzQzO1x0XHRcdHByX2luZm8oXCYjMzQ7JXM6JXUgbW9kdWxlICVzIGZ1bmM6JXMgaGFzICVsbHUgYWxsb2NhdGVkIGF0IG1vZHVsZSB1bmxvYWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0dGFnLVx1MDAzZWN0LmZpbGVuYW1lLCB0YWctXHUwMDNlY3QubGluZW5vLCB0YWctXHUwMDNlY3QubW9kbmFtZSxcbiYjNDM7XHRcdFx0XHR0YWctXHUwMDNlY3QuZnVuY3Rpb24sIGNvdW50ZXIuYnl0ZXMpO1xuJiM0MztcdFx0fVxuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHR1c2VkID0gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztyZWxlYXNlX2FyZWE6XG4mIzQzO1x0bWFzX3N0b3JlKFx1MDAyNm1hcywgdXNlZCA/IFx1MDAyNnVubG9hZGVkX21vZCA6IE5VTEwpO1xuJiM0MztcdHZhbCA9IG1hc19wcmV2X3JhbmdlKFx1MDAyNm1hcywgMCk7XG4mIzQzO1x0aWYgKHZhbCA9PSBcdTAwMjZwcmVwZW5kX21vZClcbiYjNDM7XHRcdG1hc19zdG9yZShcdTAwMjZtYXMsIE5VTEwpO1xuJiM0MztvdXQ6XG4mIzQzO1x0bWFzX3VubG9jayhcdTAwMjZtYXMpO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyB2b2lkICpyZXNlcnZlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWduZWQgbG9uZyBzaXplLFxuIFx0XHRcdFx0IHVuc2lnbmVkIGludCBwcmVwZW5kLCB1bnNpZ25lZCBsb25nIGFsaWduKVxuIHtcbkBAIC05MDQsMTAgJiM0Mzs5NTAsMTIgQEAgc3RhdGljIHZvaWQgKnJlc2VydmVfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBsb25nIHNpemUsXG4gXHRcdGludCBncm93X3JlcztcbiBcbiBcdFx0bW9kdWxlX3RhZ3Muc2l6ZSA9IG9mZnNldCAmIzQzOyBzaXplO1xuLVx0XHRpZiAobWVtX2FsbG9jX3Byb2ZpbGluZ19lbmFibGVkKCkgXHUwMDI2XHUwMDI2ICF0YWdzX2FkZHJlc3NhYmxlKCkpIHtcbiYjNDM7XHRcdGlmICghdGFnc19hZGRyZXNzYWJsZSgpKSB7XG4gXHRcdFx0c2h1dGRvd25fbWVtX3Byb2ZpbGluZyh0cnVlKTtcbi1cdFx0XHRwcl93YXJuKFwmIzM0O1dpdGggbW9kdWxlICVzIHRoZXJlIGFyZSB0b28gbWFueSB0YWdzIHRvIGZpdCBpbiAlZCBwYWdlIGZsYWcgYml0cy4gTWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIGlzIGRpc2FibGVkIVxcblwmIzM0Oyxcbi1cdFx0XHRcdG1vZC1cdTAwM2VuYW1lLCBOUl9VTlVTRURfUEFHRUZMQUdfQklUUyk7XG4mIzQzO1x0XHRcdHByX3dhcm5fb25jZShcJiMzNDtXaXRoIG1vZHVsZSAlcyB0aGVyZSBhcmUgdG9vIG1hbnkgdGFncyB0byBmaXQgaW4gJWQgcGFnZSBmbGFnIGJpdHMuIE1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBpcyBkaXNhYmxlZCFcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0ICAgICBtb2QtXHUwMDNlbmFtZSwgTlJfVU5VU0VEX1BBR0VGTEFHX0JJVFMpO1xuJiM0MztcdFx0XHRyZWxlYXNlX21vZHVsZV90YWdzKG1vZCwgZmFsc2UpO1xuJiM0MztcdFx0XHRyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTtcbiBcdFx0fVxuIFxuIFx0XHRncm93X3JlcyA9IHZtX21vZHVsZV90YWdzX3BvcHVsYXRlKCk7XG5AQCAtOTIyLDUyICYjNDM7OTcwLDYgQEAgc3RhdGljIHZvaWQgKnJlc2VydmVfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBsb25nIHNpemUsXG4gXHRyZXR1cm4gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciAmIzQzOyBvZmZzZXQpO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCByZWxlYXNlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgYm9vbCB1c2VkKVxuLXtcbi1cdE1BX1NUQVRFKG1hcywgXHUwMDI2bW9kX2FyZWFfbXQsIG1vZHVsZV90YWdzLnNpemUsIG1vZHVsZV90YWdzLnNpemUpO1xuLVx0c3RydWN0IGFsbG9jX3RhZyAqc3RhcnRfdGFnO1xuLVx0c3RydWN0IGFsbG9jX3RhZyAqZW5kX3RhZztcbi1cdHN0cnVjdCBtb2R1bGUgKnZhbDtcbi1cbi1cdG1hc19sb2NrKFx1MDAyNm1hcyk7XG4tXHRtYXNfZm9yX2VhY2hfcmV2KFx1MDAyNm1hcywgdmFsLCAwKVxuLVx0XHRpZiAodmFsID09IG1vZClcbi1cdFx0XHRicmVhaztcbi1cbi1cdGlmICghdmFsKSAvKiBtb2R1bGUgbm90IGZvdW5kICovXG4tXHRcdGdvdG8gb3V0O1xuLVxuLVx0aWYgKCF1c2VkKVxuLVx0XHRnb3RvIHJlbGVhc2VfYXJlYTtcbi1cbi1cdHN0YXJ0X3RhZyA9IChzdHJ1Y3QgYWxsb2NfdGFnICopKG1vZHVsZV90YWdzLnN0YXJ0X2FkZHIgJiM0MzsgbWFzLmluZGV4KTtcbi1cdGVuZF90YWcgPSAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICYjNDM7IG1hcy5sYXN0KTtcbi1cdGlmICghY2xlYW5fdW51c2VkX2NvdW50ZXJzKHN0YXJ0X3RhZywgZW5kX3RhZykpIHtcbi1cdFx0c3RydWN0IGFsbG9jX3RhZyAqdGFnO1xuLVxuLVx0XHRmb3IgKHRhZyA9IHN0YXJ0X3RhZzsgdGFnIFx1MDAzYz0gZW5kX3RhZzsgdGFnJiM0MzsmIzQzOykge1xuLVx0XHRcdHN0cnVjdCBhbGxvY190YWdfY291bnRlcnMgY291bnRlcjtcbi1cbi1cdFx0XHRpZiAoIXRhZy1cdTAwM2Vjb3VudGVycylcbi1cdFx0XHRcdGNvbnRpbnVlO1xuLVxuLVx0XHRcdGNvdW50ZXIgPSBhbGxvY190YWdfcmVhZCh0YWcpO1xuLVx0XHRcdHByX2luZm8oXCYjMzQ7JXM6JXUgbW9kdWxlICVzIGZ1bmM6JXMgaGFzICVsbHUgYWxsb2NhdGVkIGF0IG1vZHVsZSB1bmxvYWRcXG5cJiMzNDssXG4tXHRcdFx0XHR0YWctXHUwMDNlY3QuZmlsZW5hbWUsIHRhZy1cdTAwM2VjdC5saW5lbm8sIHRhZy1cdTAwM2VjdC5tb2RuYW1lLFxuLVx0XHRcdFx0dGFnLVx1MDAzZWN0LmZ1bmN0aW9uLCBjb3VudGVyLmJ5dGVzKTtcbi1cdFx0fVxuLVx0fSBlbHNlIHtcbi1cdFx0dXNlZCA9IGZhbHNlO1xuLVx0fVxuLXJlbGVhc2VfYXJlYTpcbi1cdG1hc19zdG9yZShcdTAwMjZtYXMsIHVzZWQgPyBcdTAwMjZ1bmxvYWRlZF9tb2QgOiBOVUxMKTtcbi1cdHZhbCA9IG1hc19wcmV2X3JhbmdlKFx1MDAyNm1hcywgMCk7XG4tXHRpZiAodmFsID09IFx1MDAyNnByZXBlbmRfbW9kKVxuLVx0XHRtYXNfc3RvcmUoXHUwMDI2bWFzLCBOVUxMKTtcbi1vdXQ6XG4tXHRtYXNfdW5sb2NrKFx1MDAyNm1hcyk7XG4tfVxuLVxuIHN0YXRpYyBpbnQgbG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgY29kZXRhZyAqc3RhcnQsIHN0cnVjdCBjb2RldGFnICpzdG9wKVxuIHtcbiBcdC8qIEFsbG9jYXRlIG1vZHVsZSBhbGxvY190YWcgcGVyY3B1IGNvdW50ZXJzICovXG5AQCAtOTc1LDYgJiM0Mzs5NzcsOSBAQCBzdGF0aWMgaW50IGxvYWRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGNvZGV0YWcgKnN0YXJ0LCBzdHJ1Y3QgY29kZXRhZ1xuIFx0c3RydWN0IGFsbG9jX3RhZyAqc3RvcF90YWc7XG4gXHRzdHJ1Y3QgYWxsb2NfdGFnICp0YWc7XG4gXG4mIzQzO1x0aWYgKCFtZW1fcHJvZmlsaW5nX3N1cHBvcnQpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4gXHQvKiBwZXJjcHUgY291bnRlcnMgZm9yIGNvcmUgYWxsb2NhdGlvbnMgYXJlIGFscmVhZHkgc3RhdGljYWxseSBhbGxvY2F0ZWQgKi9cbiBcdGlmICghbW9kKVxuIFx0XHRyZXR1cm4gMDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDozODwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT40bTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TUVNX0FMTE9DX1BST0ZJTElORyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2NvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24mIzM0OywKICAgICYjMzQ7Y29kZXRhZ19mcmVlX21vZHVsZV9zZWN0aW9ucyYjMzQ7LAogICAgJiMzNDtjb2RldGFnX2xvYWRfbW9kdWxlJiMzNDssCiAgICAmIzM0O2NvZGV0YWdfdW5sb2FkX21vZHVsZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgY29yZSBtb2R1bGUgbG9hZGluZyBsb2dpYyB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHJ1bnMgb3V0IG9mIHBhZ2UgZmxhZyBiaXRzICghdGFnc19hZGRyZXNzYWJsZSgpKS4gSXQgaW50cm9kdWNlcyBhIHJldHJ5IG1lY2hhbmlzbSBpbiBsYXlvdXRfYW5kX2FsbG9jYXRlKCkgdGhhdCByZXNldHMgdGhlIG1vZHVsZSBzdGF0ZSBhbmQgcmV0cmllcyBsb2FkaW5nIHdpdGhvdXQgbWVtb3J5IHByb2ZpbGluZy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIG1vZHVsZSBsb2FkaW5nIHBhdGggYW5kIG1lbW9yeSBhbGxvY2F0aW9uIHRhZ2dpbmcgc3Vic3lzdGVtLCB3aGljaCBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIGluaXRfbW9kdWxlIGFuZCBmaW5pdF9tb2R1bGUgc3lzY2FsbHMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA2ZjlmZjVjZTM1NGM1NGIyZjZmNzVkOTJmYjU2ZTI3Y2NhOTdmZDcwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBBdWcgMTAgMTA6Mzg6MTQgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9rZXJuZWwvbW9kdWxlL21haW4uYyBiL2tlcm5lbC9tb2R1bGUvbWFpbi5jCmluZGV4IDQ2ZGQ4ZDI1YTYwNTguLmMzMmJiNDdhNTczYTEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tb2R1bGUvbWFpbi5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9tb2R1bGUvbWFpbi5jCkBAIC0yOTcxLDEzICYjNDM7Mjk3MSwyNiBAQCBzdGF0aWMgc3RydWN0IG1vZHVsZSAqbGF5b3V0X2FuZF9hbGxvY2F0ZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpCiAJICogdGhpcyBpcyBkb25lIGdlbmVyaWNhbGx5OyB0aGVyZSBkb2VzbiYjMzk7dCBhcHBlYXIgdG8gYmUgYW55CiAJICogc3BlY2lhbCBjYXNlcyBmb3IgdGhlIGFyY2hpdGVjdHVyZXMuCiAJICovCiYjNDM7cmV0cnk6CiAJbGF5b3V0X3NlY3Rpb25zKGluZm8tJmd0O21vZCwgaW5mbyk7CiAJbGF5b3V0X3N5bXRhYihpbmZvLSZndDttb2QsIGluZm8pOwogCiAJLyogQWxsb2NhdGUgYW5kIG1vdmUgdG8gdGhlIGZpbmFsIHBsYWNlICovCiAJZXJyID0gbW92ZV9tb2R1bGUoaW5mby0mZ3Q7bW9kLCBpbmZvKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gRVJSX1BUUihlcnIpOwomIzQzOwlpZiAoZXJyKSB7CiYjNDM7CQlpZiAoZXJyICE9IC1FQUdBSU4pCiYjNDM7CQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKJiM0MzsJCS8qCiYjNDM7CQkgKiAtRUFHQUlOIG1lYW5zIHByb2ZpbGluZyB3YXMgZGlzYWJsZWQgYnV0IHRoZSBtb2R1bGUKJiM0MzsJCSAqIGNhbiBzdGlsbCBsb2FkIHdpdGhvdXQgaXQuIFJlc2V0IHN0YXRlIGFuZCByZXRyeS4KJiM0MzsJCSAqLwomIzQzOwkJcmV3cml0ZV9zZWN0aW9uX2hlYWRlcnMoaW5mbywgZmxhZ3MpOwomIzQzOwkJZm9yX2VhY2hfbW9kX21lbV90eXBlKHR5cGUpCiYjNDM7CQkJaW5mby0mZ3Q7bW9kLSZndDttZW1bdHlwZV0uc2l6ZSA9IDA7CiYjNDM7CQlpbmZvLSZndDtzZWNoZHJzW2luZm8tJmd0O2luZGV4LnN5bV0uc2hfZmxhZ3MgJmFtcDs9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7CiYjNDM7CQlpbmZvLSZndDtzZWNoZHJzW2luZm8tJmd0O2luZGV4LnN0cl0uc2hfZmxhZ3MgJmFtcDs9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7CiYjNDM7CQlnb3RvIHJldHJ5OwomIzQzOwl9CiAKIAkvKiBNb2R1bGUgaGFzIGJlZW4gY29waWVkIHRvIGl0cyBmaW5hbCBwbGFjZSBub3c6IHJldHVybiBpdC4gKi8KIAltb2QgPSAodm9pZCAqKWluZm8tJmd0O3NlY2hkcnNbaW5mby0mZ3Q7aW5kZXgubW9kXS5zaF9hZGRyOwpkaWZmIC0tZ2l0IGEvbW0vYWxsb2NfdGFnLmMgYi9tbS9hbGxvY190YWcuYwppbmRleCA1MmFlY2UyN2IwMGUwLi4zZWJhNjMzMTE3NGRhIDEwMDY0NAotLS0gYS9tbS9hbGxvY190YWcuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9hbGxvY190YWcuYwpAQCAtODM1LDYgJiM0Mzs4MzUsNTIgQEAgc3RhdGljIGludCB2bV9tb2R1bGVfdGFnc19wb3B1bGF0ZSh2b2lkKQogCXJldHVybiAwOwogfQogCiYjNDM7c3RhdGljIHZvaWQgcmVsZWFzZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIGJvb2wgdXNlZCkKJiM0Mzt7CiYjNDM7CU1BX1NUQVRFKG1hcywgJmFtcDttb2RfYXJlYV9tdCwgbW9kdWxlX3RhZ3Muc2l6ZSwgbW9kdWxlX3RhZ3Muc2l6ZSk7CiYjNDM7CXN0cnVjdCBhbGxvY190YWcgKnN0YXJ0X3RhZzsKJiM0MzsJc3RydWN0IGFsbG9jX3RhZyAqZW5kX3RhZzsKJiM0MzsJc3RydWN0IG1vZHVsZSAqdmFsOwomIzQzOwomIzQzOwltYXNfbG9jaygmYW1wO21hcyk7CiYjNDM7CW1hc19mb3JfZWFjaF9yZXYoJmFtcDttYXMsIHZhbCwgMCkKJiM0MzsJCWlmICh2YWwgPT0gbW9kKQomIzQzOwkJCWJyZWFrOwomIzQzOwomIzQzOwlpZiAoIXZhbCkgLyogbW9kdWxlIG5vdCBmb3VuZCAqLwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmICghdXNlZCkKJiM0MzsJCWdvdG8gcmVsZWFzZV9hcmVhOwomIzQzOwomIzQzOwlzdGFydF90YWcgPSAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICYjNDM7IG1hcy5pbmRleCk7CiYjNDM7CWVuZF90YWcgPSAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICYjNDM7IG1hcy5sYXN0KTsKJiM0MzsJaWYgKCFjbGVhbl91bnVzZWRfY291bnRlcnMoc3RhcnRfdGFnLCBlbmRfdGFnKSkgewomIzQzOwkJc3RydWN0IGFsbG9jX3RhZyAqdGFnOwomIzQzOwomIzQzOwkJZm9yICh0YWcgPSBzdGFydF90YWc7IHRhZyAmbHQ7PSBlbmRfdGFnOyB0YWcmIzQzOyYjNDM7KSB7CiYjNDM7CQkJc3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyBjb3VudGVyOwomIzQzOwomIzQzOwkJCWlmICghdGFnLSZndDtjb3VudGVycykKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CiYjNDM7CQkJY291bnRlciA9IGFsbG9jX3RhZ19yZWFkKHRhZyk7CiYjNDM7CQkJcHJfaW5mbygmIzM0OyVzOiV1IG1vZHVsZSAlcyBmdW5jOiVzIGhhcyAlbGx1IGFsbG9jYXRlZCBhdCBtb2R1bGUgdW5sb2FkXG4mIzM0OywKJiM0MzsJCQkJdGFnLSZndDtjdC5maWxlbmFtZSwgdGFnLSZndDtjdC5saW5lbm8sIHRhZy0mZ3Q7Y3QubW9kbmFtZSwKJiM0MzsJCQkJdGFnLSZndDtjdC5mdW5jdGlvbiwgY291bnRlci5ieXRlcyk7CiYjNDM7CQl9CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQl1c2VkID0gZmFsc2U7CiYjNDM7CX0KJiM0MztyZWxlYXNlX2FyZWE6CiYjNDM7CW1hc19zdG9yZSgmYW1wO21hcywgdXNlZCA/ICZhbXA7dW5sb2FkZWRfbW9kIDogTlVMTCk7CiYjNDM7CXZhbCA9IG1hc19wcmV2X3JhbmdlKCZhbXA7bWFzLCAwKTsKJiM0MzsJaWYgKHZhbCA9PSAmYW1wO3ByZXBlbmRfbW9kKQomIzQzOwkJbWFzX3N0b3JlKCZhbXA7bWFzLCBOVUxMKTsKJiM0MztvdXQ6CiYjNDM7CW1hc191bmxvY2soJmFtcDttYXMpOwomIzQzO30KJiM0MzsKIHN0YXRpYyB2b2lkICpyZXNlcnZlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJCSB1bnNpZ25lZCBpbnQgcHJlcGVuZCwgdW5zaWduZWQgbG9uZyBhbGlnbikKIHsKQEAgLTkwNCwxMCAmIzQzOzk1MCwxMiBAQCBzdGF0aWMgdm9pZCAqcmVzZXJ2ZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJaW50IGdyb3dfcmVzOwogCiAJCW1vZHVsZV90YWdzLnNpemUgPSBvZmZzZXQgJiM0Mzsgc2l6ZTsKLQkJaWYgKG1lbV9hbGxvY19wcm9maWxpbmdfZW5hYmxlZCgpICZhbXA7JmFtcDsgIXRhZ3NfYWRkcmVzc2FibGUoKSkgewomIzQzOwkJaWYgKCF0YWdzX2FkZHJlc3NhYmxlKCkpIHsKIAkJCXNodXRkb3duX21lbV9wcm9maWxpbmcodHJ1ZSk7Ci0JCQlwcl93YXJuKCYjMzQ7V2l0aCBtb2R1bGUgJXMgdGhlcmUgYXJlIHRvbyBtYW55IHRhZ3MgdG8gZml0IGluICVkIHBhZ2UgZmxhZyBiaXRzLiBNZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgaXMgZGlzYWJsZWQhXG4mIzM0OywKLQkJCQltb2QtJmd0O25hbWUsIE5SX1VOVVNFRF9QQUdFRkxBR19CSVRTKTsKJiM0MzsJCQlwcl93YXJuX29uY2UoJiMzNDtXaXRoIG1vZHVsZSAlcyB0aGVyZSBhcmUgdG9vIG1hbnkgdGFncyB0byBmaXQgaW4gJWQgcGFnZSBmbGFnIGJpdHMuIE1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBpcyBkaXNhYmxlZCFcbiYjMzQ7LAomIzQzOwkJCQkgICAgIG1vZC0mZ3Q7bmFtZSwgTlJfVU5VU0VEX1BBR0VGTEFHX0JJVFMpOwomIzQzOwkJCXJlbGVhc2VfbW9kdWxlX3RhZ3MobW9kLCBmYWxzZSk7CiYjNDM7CQkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CiAJCX0KIAogCQlncm93X3JlcyA9IHZtX21vZHVsZV90YWdzX3BvcHVsYXRlKCk7CkBAIC05MjIsNTIgJiM0Mzs5NzAsNiBAQCBzdGF0aWMgdm9pZCAqcmVzZXJ2ZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAlyZXR1cm4gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciAmIzQzOyBvZmZzZXQpOwogfQogCi1zdGF0aWMgdm9pZCByZWxlYXNlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgYm9vbCB1c2VkKQotewotCU1BX1NUQVRFKG1hcywgJmFtcDttb2RfYXJlYV9tdCwgbW9kdWxlX3RhZ3Muc2l6ZSwgbW9kdWxlX3RhZ3Muc2l6ZSk7Ci0Jc3RydWN0IGFsbG9jX3RhZyAqc3RhcnRfdGFnOwotCXN0cnVjdCBhbGxvY190YWcgKmVuZF90YWc7Ci0Jc3RydWN0IG1vZHVsZSAqdmFsOwotCi0JbWFzX2xvY2soJmFtcDttYXMpOwotCW1hc19mb3JfZWFjaF9yZXYoJmFtcDttYXMsIHZhbCwgMCkKLQkJaWYgKHZhbCA9PSBtb2QpCi0JCQlicmVhazsKLQotCWlmICghdmFsKSAvKiBtb2R1bGUgbm90IGZvdW5kICovCi0JCWdvdG8gb3V0OwotCi0JaWYgKCF1c2VkKQotCQlnb3RvIHJlbGVhc2VfYXJlYTsKLQotCXN0YXJ0X3RhZyA9IChzdHJ1Y3QgYWxsb2NfdGFnICopKG1vZHVsZV90YWdzLnN0YXJ0X2FkZHIgJiM0MzsgbWFzLmluZGV4KTsKLQllbmRfdGFnID0gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciAmIzQzOyBtYXMubGFzdCk7Ci0JaWYgKCFjbGVhbl91bnVzZWRfY291bnRlcnMoc3RhcnRfdGFnLCBlbmRfdGFnKSkgewotCQlzdHJ1Y3QgYWxsb2NfdGFnICp0YWc7Ci0KLQkJZm9yICh0YWcgPSBzdGFydF90YWc7IHRhZyAmbHQ7PSBlbmRfdGFnOyB0YWcmIzQzOyYjNDM7KSB7Ci0JCQlzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzIGNvdW50ZXI7Ci0KLQkJCWlmICghdGFnLSZndDtjb3VudGVycykKLQkJCQljb250aW51ZTsKLQotCQkJY291bnRlciA9IGFsbG9jX3RhZ19yZWFkKHRhZyk7Ci0JCQlwcl9pbmZvKCYjMzQ7JXM6JXUgbW9kdWxlICVzIGZ1bmM6JXMgaGFzICVsbHUgYWxsb2NhdGVkIGF0IG1vZHVsZSB1bmxvYWRcbiYjMzQ7LAotCQkJCXRhZy0mZ3Q7Y3QuZmlsZW5hbWUsIHRhZy0mZ3Q7Y3QubGluZW5vLCB0YWctJmd0O2N0Lm1vZG5hbWUsCi0JCQkJdGFnLSZndDtjdC5mdW5jdGlvbiwgY291bnRlci5ieXRlcyk7Ci0JCX0KLQl9IGVsc2UgewotCQl1c2VkID0gZmFsc2U7Ci0JfQotcmVsZWFzZV9hcmVhOgotCW1hc19zdG9yZSgmYW1wO21hcywgdXNlZCA/ICZhbXA7dW5sb2FkZWRfbW9kIDogTlVMTCk7Ci0JdmFsID0gbWFzX3ByZXZfcmFuZ2UoJmFtcDttYXMsIDApOwotCWlmICh2YWwgPT0gJmFtcDtwcmVwZW5kX21vZCkKLQkJbWFzX3N0b3JlKCZhbXA7bWFzLCBOVUxMKTsKLW91dDoKLQltYXNfdW5sb2NrKCZhbXA7bWFzKTsKLX0KLQogc3RhdGljIGludCBsb2FkX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBjb2RldGFnICpzdGFydCwgc3RydWN0IGNvZGV0YWcgKnN0b3ApCiB7CiAJLyogQWxsb2NhdGUgbW9kdWxlIGFsbG9jX3RhZyBwZXJjcHUgY291bnRlcnMgKi8KQEAgLTk3NSw2ICYjNDM7OTc3LDkgQEAgc3RhdGljIGludCBsb2FkX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBjb2RldGFnICpzdGFydCwgc3RydWN0IGNvZGV0YWcKIAlzdHJ1Y3QgYWxsb2NfdGFnICpzdG9wX3RhZzsKIAlzdHJ1Y3QgYWxsb2NfdGFnICp0YWc7CiAKJiM0MzsJaWYgKCFtZW1fcHJvZmlsaW5nX3N1cHBvcnQpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKIAkvKiBwZXJjcHUgY291bnRlcnMgZm9yIGNvcmUgYWxsb2NhdGlvbnMgYXJlIGFscmVhZHkgc3RhdGljYWxseSBhbGxvY2F0ZWQgKi8KIAlpZiAoIW1vZCkKIAkJcmV0dXJuIDA7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjM4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM3NzQKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiAxNTAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBNb2R1bGUgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7dmUgZ290IGEgcGF0Y2ggaGVyZSB0aGF0JiMzOTtzIHRvdWNoaW5nIGBrZXJuZWwvbW9kdWxlL21haW4uY2AgYW5kIGBtbS9hbGxvY190YWcuY2AsIHdoaWNoIGlzIGludGVyZXN0aW5nLiBJdCBsb29rcyBsaWtlIHRoZSBtYWluIGZvY3VzIGlzIGFyb3VuZCBob3cgd2UgaGFuZGxlIGAtRUFHQUlOYCBlcnJvcnMgY29taW5nIGJhY2sgZnJvbSBgbW92ZV9tb2R1bGUoKWAuIFJpZ2h0LCBzbyBgbW92ZV9tb2R1bGUoKWAgaXMgdGhlIG9uZSB0aGF0JiMzOTtzIG5vdyBwb3RlbnRpYWxseSByZXR1cm5pbmcgdGhpcyBlcnJvciwgbGlrZWx5IHJlbGF0ZWQgdG8gdGhlIGByZXNlcnZlX21vZHVsZV90YWdzKClgIGNhbGwuIFRoYXQgbWFrZXMgc2Vuc2UsIGJlY2F1c2UgSSBrbm93IGByZXNlcnZlX21vZHVsZV90YWdzKClgIGluIGBtbS9hbGxvY190YWcuY2AgaXMgYmVpbmcgdXBkYXRlZCB0byByZXR1cm4gYEVSUl9QVFIoLUVBR0FJTilgIGlmIGAhdGFnc19hZGRyZXNzYWJsZSgpYC4KClNvLCB0aGUga2V5IGNoYW5nZSBpcyB0aGF0IGBsYXlvdXRfYW5kX2FsbG9jYXRlKClgIGluIGBrZXJuZWwvbW9kdWxlL21haW4uY2Agbm93IGluY2x1ZGVzIHJldHJpZXMgc3BlY2lmaWNhbGx5IGZvciB0aGUgYC1FQUdBSU5gIGNhc2UgZnJvbSBgbW92ZV9tb2R1bGUoKWAuIEkmIzM5O2xsIG5lZWQgdG8gY29uZmlybSB0aGUgY2FsbCBjaGFpbiBmcm9tIGBtb3ZlX21vZHVsZSgpYCB0byBgcmVzZXJ2ZV9tb2R1bGVfdGFncygpYCwganVzdCB0byBiZSBjZXJ0YWluIG9mIHRoZSBjb250ZXh0LiBCdXQgYmVmb3JlIEkgZGlnIHRvbyBkZWVwIGluIHRoYXQgZGlyZWN0aW9uLCBJIHNob3VsZCB0YWtlIGEgY2xvc2UgbG9vayBhdCBgbW92ZV9tb2R1bGUoKWAgaW4gYGtlcm5lbC9tb2R1bGUvbWFpbi5jYCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgd2hhdCYjMzk7cyB0cmlnZ2VyaW5nIHRoZSBgLUVBR0FJTmAgaW4gdGhlIGZpcnN0IHBsYWNlIGFuZCBzZWUgaWYgdGhlcmUgYXJlIGFueSBvYnZpb3VzIGlzc3Vlcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDozOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttb3ZlX21vZHVsZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvbWFpbi5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvbWFpbi5jPTIzNjQ9c3RhdGljIGludCBlbGZfdmFsaWRpdHlfY2FjaGVfc3RydGFiKHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMjQxNS0gKiBBcyBhIGxhc3Qgc3RlcCB3ZSBzZXQgaW5mby1cdTAwM2Vtb2QgdG8gdGhlIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSBtb2R1bGUgaW5cbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI0MTY6ICogaW5mby1cdTAwM2VoZHIuIFRoZSBmaW5hbCBvbmUgd2lsbCBiZSBhbGxvY2F0ZWQgaW4gbW92ZV9tb2R1bGUoKS4gQW55XG5rZXJuZWwvbW9kdWxlL21haW4uYy0yNDE3LSAqIG1vZGlmaWNhdGlvbnMgd2UgbWFrZSB0byBvdXIgY29weSBvZiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FycmllZCBvdmVyXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9MjY1OT1zdGF0aWMgaW50IGZpbmRfbW9kdWxlX3NlY3Rpb25zKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbylcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yNzg3LVxua2VybmVsL21vZHVsZS9tYWluLmM6Mjc4ODpzdGF0aWMgaW50IG1vdmVfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbylcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI3ODkte1xuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTI5NDM9c3RhdGljIHN0cnVjdCBtb2R1bGUgKmxheW91dF9hbmRfYWxsb2NhdGUoc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgaW50IGZsYWdzKVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5NzgtXHQvKiBBbGxvY2F0ZSBhbmQgbW92ZSB0byB0aGUgZmluYWwgcGxhY2UgKi9cbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI5Nzk6XHRlcnIgPSBtb3ZlX21vZHVsZShpbmZvLVx1MDAzZW1vZCwgaW5mbyk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTgwLVx0aWYgKGVycikge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ1ODUKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGFzIGlmIHRoZXkmIzM5O3JlIG15IG93bjoKCioqQW5hbHl6aW5nIHRoZSBgbW92ZV9tb2R1bGUoKWAgSW1wbGVtZW50YXRpb24qKgoKUmlnaHQsIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHNwZWNpZmljcyBvZiB0aGlzIGBtb3ZlX21vZHVsZSgpYCBpbXBsZW1lbnRhdGlvbi4gRm9yZ2V0IHRoZSBnZW5lcmFsIGNvbmNlcHQgZm9yIGEgbW9tZW50IOKAkyBJIG5lZWQgdG8gZ2V0IGludG8gdGhlIG5pdHR5LWdyaXR0eSBvZiB0aGUgY29kZSBpdHNlbGYuIFdoYXQmIzM5O3MgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBkb2luZz8gV2hhdCBhcmUgdGhlIHVuZGVybHlpbmcgbWVjaGFuaWNzPyBBcmUgd2UgdGFsa2luZyBhYm91dCBhIHNpbXBsZSBmaWxlIHN5c3RlbSBvcGVyYXRpb24sIG9yIGlzIHRoZXJlIHNvbWUgY29tcGxleCBpbnRlcmFjdGlvbiB3aXRoIGEgZGF0YWJhc2UsIGV4dGVybmFsIHNlcnZpY2VzLCBvciBwZXJoYXBzIGV2ZW4gZGlzdHJpYnV0ZWQgc3lzdGVtcyBpbnZvbHZlZD8gSSBuZWVkIHRvIGxvb2sgYXQgdGhlIGVkZ2UgY2FzZXMsIHRoZSBlcnJvciBoYW5kbGluZywgYW5kIHRoZSBvdmVyYWxsIGVmZmljaWVuY3kuIElzIGl0IG9wdGltaXplZCBmb3IgY29tbW9uIHNjZW5hcmlvcywgb3IgZG9lcyBpdCBjYXRlciB0byBhIGJyb2FkZXIgcmFuZ2Ugb2YgdXNlIGNhc2VzPyBJJiMzOTttIGFscmVhZHkgdGhpbmtpbmcgYWJvdXQgcG90ZW50aWFsIGJvdHRsZW5lY2tzIGFuZCBwb2ludHMgb2YgZmFpbHVyZSDigJMgd2hhdCBjb3VsZCBnbyB3cm9uZywgYW5kIGhvdyByb2J1c3QgaXMgdGhlIGVycm9yIGhhbmRsaW5nPyBUaW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eSBhbmQgZGlzc2VjdCB0aGlzIGZ1bmN0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjM5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS9tYWluLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyNzg4LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyNzg4Olx0c3RhdGljIGludCBtb3ZlX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXG4yNzg5Olx0e1xuMjc5MDpcdFx0aW50IGksIHJldDtcbjI3OTE6XHRcdGVudW0gbW9kX21lbV90eXBlIHQgPSBNT0RfTUVNX05VTV9UWVBFUztcbjI3OTI6XHRcdGJvb2wgY29kZXRhZ19zZWN0aW9uX2ZvdW5kID0gZmFsc2U7XG4yNzkzOlx0XG4yNzk0Olx0XHRmb3JfZWFjaF9tb2RfbWVtX3R5cGUodHlwZSkge1xuMjc5NTpcdFx0XHRpZiAoIW1vZC1cdTAwM2VtZW1bdHlwZV0uc2l6ZSkge1xuMjc5NjpcdFx0XHRcdG1vZC1cdTAwM2VtZW1bdHlwZV0uYmFzZSA9IE5VTEw7XG4yNzk3Olx0XHRcdFx0Y29udGludWU7XG4yNzk4Olx0XHRcdH1cbjI3OTk6XHRcbjI4MDA6XHRcdFx0cmV0ID0gbW9kdWxlX21lbW9yeV9hbGxvYyhtb2QsIHR5cGUpO1xuMjgwMTpcdFx0XHRpZiAocmV0KSB7XG4yODAyOlx0XHRcdFx0dCA9IHR5cGU7XG4yODAzOlx0XHRcdFx0Z290byBvdXRfZXJyO1xuMjgwNDpcdFx0XHR9XG4yODA1Olx0XHR9XG4yODA2Olx0XG4yODA3Olx0XHQvKiBUcmFuc2ZlciBlYWNoIHNlY3Rpb24gd2hpY2ggc3BlY2lmaWVzIFNIRl9BTExPQyAqL1xuMjgwODpcdFx0cHJfZGVidWcoXCYjMzQ7RmluYWwgc2VjdGlvbiBhZGRyZXNzZXMgZm9yICVzOlxcblwmIzM0OywgbW9kLVx1MDAzZW5hbWUpO1xuMjgwOTpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgaW5mby1cdTAwM2VoZHItXHUwMDNlZV9zaG51bTsgaSYjNDM7JiM0MzspIHtcbjI4MTA6XHRcdFx0dm9pZCAqZGVzdDtcbjI4MTE6XHRcdFx0RWxmX1NoZHIgKnNoZHIgPSBcdTAwMjZpbmZvLVx1MDAzZXNlY2hkcnNbaV07XG4yODEyOlx0XHRcdGNvbnN0IGNoYXIgKnNuYW1lO1xuMjgxMzpcdFxuMjgxNDpcdFx0XHRpZiAoIShzaGRyLVx1MDAzZXNoX2ZsYWdzIFx1MDAyNiBTSEZfQUxMT0MpKVxuMjgxNTpcdFx0XHRcdGNvbnRpbnVlO1xuMjgxNjpcdFxuMjgxNzpcdFx0XHRzbmFtZSA9IGluZm8tXHUwMDNlc2Vjc3RyaW5ncyAmIzQzOyBzaGRyLVx1MDAzZXNoX25hbWU7XG4yODE4Olx0XHRcdC8qXG4yODE5Olx0XHRcdCAqIExvYWQgY29kZXRhZyBzZWN0aW9ucyBzZXBhcmF0ZWx5IGFzIHRoZXkgbWlnaHQgc3RpbGwgYmUgdXNlZFxuMjgyMDpcdFx0XHQgKiBhZnRlciBtb2R1bGUgdW5sb2FkLlxuMjgyMTpcdFx0XHQgKi9cbjI4MjI6XHRcdFx0aWYgKGNvZGV0YWdfbmVlZHNfbW9kdWxlX3NlY3Rpb24obW9kLCBzbmFtZSwgc2hkci1cdTAwM2VzaF9zaXplKSkge1xuMjgyMzpcdFx0XHRcdGRlc3QgPSBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uKG1vZCwgc25hbWUsIHNoZHItXHUwMDNlc2hfc2l6ZSxcbjI4MjQ6XHRcdFx0XHRcdFx0YXJjaF9tb2Rfc2VjdGlvbl9wcmVwZW5kKG1vZCwgaSksIHNoZHItXHUwMDNlc2hfYWRkcmFsaWduKTtcbjI4MjU6XHRcdFx0XHRpZiAoV0FSTl9PTighZGVzdCkpIHtcbjI4MjY6XHRcdFx0XHRcdHJldCA9IC1FSU5WQUw7XG4yODI3Olx0XHRcdFx0XHRnb3RvIG91dF9lcnI7XG4yODI4Olx0XHRcdFx0fVxuMjgyOTpcdFx0XHRcdGlmIChJU19FUlIoZGVzdCkpIHtcbjI4MzA6XHRcdFx0XHRcdHJldCA9IFBUUl9FUlIoZGVzdCk7XG4yODMxOlx0XHRcdFx0XHRnb3RvIG91dF9lcnI7XG4yODMyOlx0XHRcdFx0fVxuMjgzMzpcdFx0XHRcdGNvZGV0YWdfc2VjdGlvbl9mb3VuZCA9IHRydWU7XG4yODM0Olx0XHRcdH0gZWxzZSB7XG4yODM1Olx0XHRcdFx0ZW51bSBtb2RfbWVtX3R5cGUgdHlwZSA9IHNoZHItXHUwMDNlc2hfZW50c2l6ZSBcdTAwM2VcdTAwM2UgU0hfRU5UU0laRV9UWVBFX1NISUZUO1xuMjgzNjpcdFx0XHRcdHVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gc2hkci1cdTAwM2VzaF9lbnRzaXplIFx1MDAyNiBTSF9FTlRTSVpFX09GRlNFVF9NQVNLO1xuMjgzNzpcdFxuMjgzODpcdFx0XHRcdGRlc3QgPSBtb2QtXHUwMDNlbWVtW3R5cGVdLmJhc2UgJiM0Mzsgb2Zmc2V0O1xuMjgzOTpcdFx0XHR9XG4yODQwOlx0XG4yODQxOlx0XHRcdGlmIChzaGRyLVx1MDAzZXNoX3R5cGUgIT0gU0hUX05PQklUUykge1xuMjg0MjpcdFx0XHRcdC8qXG4yODQzOlx0XHRcdFx0ICogT3VyIEVMRiBjaGVja2VyIGFscmVhZHkgdmFsaWRhdGVkIHRoaXMsIGJ1dCBsZXQmIzM5O3NcbjI4NDQ6XHRcdFx0XHQgKiBiZSBwZWRhbnRpYyBhbmQgbWFrZSB0aGUgZ29hbCBjbGVhcmVyLiBXZSBhY3R1YWxseVxuMjg0NTpcdFx0XHRcdCAqIGVuZCB1cCBjb3B5aW5nIG92ZXIgYWxsIG1vZGlmaWNhdGlvbnMgbWFkZSB0byB0aGVcbjI4NDY6XHRcdFx0XHQgKiB1c2Vyc3BhY2UgY29weSBvZiB0aGUgZW50aXJlIHN0cnVjdCBtb2R1bGUuXG4yODQ3Olx0XHRcdFx0ICovXG4yODQ4Olx0XHRcdFx0aWYgKGkgPT0gaW5mby1cdTAwM2VpbmRleC5tb2QgXHUwMDI2XHUwMDI2XG4yODQ5Olx0XHRcdFx0ICAgKFdBUk5fT05fT05DRShzaGRyLVx1MDAzZXNoX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCBtb2R1bGUpKSkpIHtcbjI4NTA6XHRcdFx0XHRcdHJldCA9IC1FTk9FWEVDO1xuMjg1MTpcdFx0XHRcdFx0Z290byBvdXRfZXJyO1xuMjg1MjpcdFx0XHRcdH1cbjI4NTM6XHRcdFx0XHRtZW1jcHkoZGVzdCwgKHZvaWQgKilzaGRyLVx1MDAzZXNoX2FkZHIsIHNoZHItXHUwMDNlc2hfc2l6ZSk7XG4yODU0Olx0XHRcdH1cbjI4NTU6XHRcdFx0LypcbjI4NTY6XHRcdFx0ICogVXBkYXRlIHRoZSB1c2Vyc3BhY2UgY29weSYjMzk7cyBFTEYgc2VjdGlvbiBhZGRyZXNzIHRvIHBvaW50IHRvXG4yODU3Olx0XHRcdCAqIG91ciBuZXdseSBhbGxvY2F0ZWQgbWVtb3J5IGFzIGEgcHVyZSBjb252ZW5pZW5jZSBzbyB0aGF0XG4yODU4Olx0XHRcdCAqIHVzZXJzIG9mIGluZm8gY2FuIGtlZXAgdGFraW5nIGFkdmFudGFnZSBhbmQgdXNpbmcgdGhlIG5ld2x5XG4yODU5Olx0XHRcdCAqIG1pbnRlZCBvZmZpY2lhbCBtZW1vcnkgYXJlYS5cbjI4NjA6XHRcdFx0ICovXG4yODYxOlx0XHRcdHNoZHItXHUwMDNlc2hfYWRkciA9ICh1bnNpZ25lZCBsb25nKWRlc3Q7XG4yODYyOlx0XHRcdHByX2RlYnVnKFwmIzM0O1xcdDB4JWx4IDB4JS44bHggJXNcXG5cJiMzNDssIChsb25nKXNoZHItXHUwMDNlc2hfYWRkcixcbjI4NjM6XHRcdFx0XHQgKGxvbmcpc2hkci1cdTAwM2VzaF9zaXplLCBpbmZvLVx1MDAzZXNlY3N0cmluZ3MgJiM0Mzsgc2hkci1cdTAwM2VzaF9uYW1lKTtcbjI4NjQ6XHRcdH1cbjI4NjU6XHRcbjI4NjY6XHRcdHJldHVybiAwO1xuMjg2NzpcdG91dF9lcnI6XG4yODY4Olx0XHRtb2R1bGVfbWVtb3J5X3Jlc3RvcmVfcm94KG1vZCk7XG4yODY5Olx0XHR3aGlsZSAodC0tKVxuMjg3MDpcdFx0XHRtb2R1bGVfbWVtb3J5X2ZyZWUobW9kLCB0KTtcbjI4NzE6XHRcdGlmIChjb2RldGFnX3NlY3Rpb25fZm91bmQpXG4yODcyOlx0XHRcdGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnMobW9kKTtcbjI4NzM6XHRcbjI4NzQ6XHRcdHJldHVybiByZXQ7XG4yODc1Olx0fVxuMjg3NjpcdFxuMjg3NzpcdHN0YXRpYyBpbnQgY2hlY2tfZXhwb3J0X3N5bWJvbF9zZWN0aW9ucyhzdHJ1Y3QgbW9kdWxlICptb2QpXG4yODc4Olx0e1xuMjg3OTpcdFx0aWYgKG1vZC1cdTAwM2VudW1fc3ltcyBcdTAwMjZcdTAwMjYgIW1vZC1cdTAwM2VmbGFnc3RhYikge1xuMjg4MDpcdFx0XHRwcl9lcnIoXCYjMzQ7JXM6IG5vIGZsYWdzIGZvciBleHBvcnRlZCBzeW1ib2xzXFxuXCYjMzQ7LCBtb2QtXHUwMDNlbmFtZSk7XG4yODgxOlx0XHRcdHJldHVybiAtRU5PRVhFQztcbjI4ODI6XHRcdH1cbjI4ODM6XHQjaWZkZWYgQ09ORklHX01PRFZFUlNJT05TXG4yODg0Olx0XHRpZiAobW9kLVx1MDAzZW51bV9zeW1zIFx1MDAyNlx1MDAyNiAhbW9kLVx1MDAzZWNyY3MpIHtcbjI4ODU6XHRcdFx0cmV0dXJuIHRyeV90b19mb3JjZV9sb2FkKG1vZCxcbjI4ODY6XHRcdFx0XHRcdFx0IFwmIzM0O25vIHZlcnNpb25zIGZvciBleHBvcnRlZCBzeW1ib2xzXCYjMzQ7KTtcbjI4ODc6XHRcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2MzcwCgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipBbmFseXppbmcgdGhlIENvZGUgQWxsb2NhdGlvbiBNb2R1bGUqKgoKT2theSwgc28gSSYjMzk7dmUgYmVlbiBhc2tlZCB0byBkZWx2ZSBpbnRvIGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYC4gTXkgaW1tZWRpYXRlIGZvY3VzIGlzIHRvIHBpbnBvaW50IGV4YWN0bHkgd2hlcmUgdGhpcyBmdW5jdGlvbiByZXNpZGVzIHdpdGhpbiB0aGUgY29kZWJhc2UuIFRoZSBuYW1lIGl0c2VsZiBzdWdnZXN0cyBpdCYjMzk7cyBsaWtlbHkgaW52b2x2ZWQgaW4gbWVtb3J5IGFsbG9jYXRpb24sIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIGNvZGUgc2VjdGlvbnMuIE15IGV4cGVyaWVuY2UgdGVsbHMgbWUgSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgbWVtb3J5IG1hbmFnZW1lbnQgcm91dGluZXMsIHByb2JhYmx5IHdpdGhpbiBhIG1vZHVsZSByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgZXhlY3V0YWJsZSBjb2RlIHNlZ21lbnRzLiBJJiMzOTtsbCBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJlbGF0aW9uc2hpcCB0byB0aGUgbGlua2VyLCB0aGUgbG9hZGVyLCBhbmQgcGVyaGFwcyBhbnkgZHluYW1pYyBjb2RlIGdlbmVyYXRpb24gZmVhdHVyZXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyByb2xlLiBJcyBpdCBkZWFsaW5nIHdpdGggcmVsb2NhdGFibGUgY29kZSwgcG9zaXRpb24taW5kZXBlbmRlbnQgY29kZSwgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/IEEgcXVpY2sgc2VhcmNoIG9mIHRoZSBwcm9qZWN0IHN0cnVjdHVyZSBhbmQgc3ltYm9sIHRhYmxlcyBpcyBwcm9iYWJseSB0aGUgYmVzdCBmaXJzdCBzdGVwLiBJIG5lZWQgdG8gcmFwaWRseSBhc2NlcnRhaW4gaXRzIGZ1bmN0aW9uYWxpdHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2NvZGV0YWcuaD05Mj1ib29sIGNvZGV0YWdfbmVlZHNfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxuaW5jbHVkZS9saW51eC9jb2RldGFnLmgtOTMtXHRcdFx0XHQgIHVuc2lnbmVkIGxvbmcgc2l6ZSk7XG5pbmNsdWRlL2xpbnV4L2NvZGV0YWcuaDo5NDp2b2lkICpjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3QgY2hhciAqbmFtZSxcbmluY2x1ZGUvbGludXgvY29kZXRhZy5oLTk1LVx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBpbnQgcHJlcGVuZCxcbi0tXG5pbmNsdWRlL2xpbnV4L2NvZGV0YWcuaD0xMDc9c3RhdGljIGlubGluZSB2b2lkICpcbmluY2x1ZGUvbGludXgvY29kZXRhZy5oOjEwODpjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3QgY2hhciAqbmFtZSxcbmluY2x1ZGUvbGludXgvY29kZXRhZy5oLTEwOS1cdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgaW50IHByZXBlbmQsXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9Mjc4OD1zdGF0aWMgaW50IG1vdmVfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbylcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yODIyLVx0XHRpZiAoY29kZXRhZ19uZWVkc19tb2R1bGVfc2VjdGlvbihtb2QsIHNuYW1lLCBzaGRyLVx1MDAzZXNoX3NpemUpKSB7XG5rZXJuZWwvbW9kdWxlL21haW4uYzoyODIzOlx0XHRcdGRlc3QgPSBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uKG1vZCwgc25hbWUsIHNoZHItXHUwMDNlc2hfc2l6ZSxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI4MjQtXHRcdFx0XHRcdGFyY2hfbW9kX3NlY3Rpb25fcHJlcGVuZChtb2QsIGkpLCBzaGRyLVx1MDAzZXNoX2FkZHJhbGlnbik7XG4tLVxubGliL2NvZGV0YWcuYz0yNTM9Ym9vbCBjb2RldGFnX25lZWRzX21vZHVsZV9zZWN0aW9uKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3QgY2hhciAqbmFtZSxcbi0tXG5saWIvY29kZXRhZy5jLTI4MC1cbmxpYi9jb2RldGFnLmM6MjgxOnZvaWQgKmNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxubGliL2NvZGV0YWcuYy0yODItXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGludCBwcmVwZW5kLFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDcwNDcKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAxOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzOgoKKipEaXZpbmcgaW50byB0aGUgQ29kZTogVW5kZXJzdGFuZGluZyBgbGliL2NvZGV0YWcuY2AqKgoKT2theSwgbGV0JiMzOTtzIHplcm8gaW4gb24gYGxpYi9jb2RldGFnLmNgLiBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIHdoYXQmIzM5O3MgaGFwcGVuaW5nIHdpdGhpbiB0aGF0IGZpbGUuIFNwZWNpZmljYWxseSwgSSBzaG91bGQgbG9vayBhcm91bmQgbGluZSAyODEuIFRoYXQmIzM5O3MgdXN1YWxseSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIGEgZGVlcGVyIGRpdmUuIERlcGVuZGluZyBvbiB3aGF0IEkgZmluZCwgSSBtYXkgbmVlZCB0byBleHBhbmQgdGhlIHNjb3BlIG9mIG15IHJldmlldywgYnV0IGxpbmUgMjgxIGdpdmVzIG1lIGEgcG90ZW50aWFsIGVudHJ5IHBvaW50IGZvciB1bmRlcnN0YW5kaW5nIHRoZSBjdXJyZW50IGNvZGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjM5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bGliL2NvZGV0YWcuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI4MSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjgxOlx0dm9pZCAqY29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbihzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IGNoYXIgKm5hbWUsXG4gMjgyOlx0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGludCBwcmVwZW5kLFxuIDI4MzpcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBhbGlnbilcbiAyODQ6XHR7XG4gMjg1Olx0XHRjb25zdCBjaGFyICp0eXBlX25hbWUgPSBuYW1lICYjNDM7IHN0cmxlbihDT0RFVEFHX1NFQ1RJT05fUFJFRklYKTtcbiAyODY6XHRcdHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZTtcbiAyODc6XHRcdHZvaWQgKnJldCA9IEVSUl9QVFIoLUVJTlZBTCk7XG4gMjg4Olx0XG4gMjg5Olx0XHRtdXRleF9sb2NrKFx1MDAyNmNvZGV0YWdfbG9jayk7XG4gMjkwOlx0XHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGN0dHlwZSwgXHUwMDI2Y29kZXRhZ190eXBlcywgbGluaykge1xuIDI5MTpcdFx0XHRpZiAoc3RyY21wKHR5cGVfbmFtZSwgY3R0eXBlLVx1MDAzZWRlc2Muc2VjdGlvbikgPT0gMCkge1xuIDI5MjpcdFx0XHRcdGlmIChXQVJOX09OKCFjdHR5cGUtXHUwMDNlZGVzYy5hbGxvY19zZWN0aW9uX21lbSkpXG4gMjkzOlx0XHRcdFx0XHRicmVhaztcbiAyOTQ6XHRcbiAyOTU6XHRcdFx0XHRkb3duX3dyaXRlKFx1MDAyNmN0dHlwZS1cdTAwM2Vtb2RfbG9jayk7XG4gMjk2Olx0XHRcdFx0cmV0ID0gY3R0eXBlLVx1MDAzZWRlc2MuYWxsb2Nfc2VjdGlvbl9tZW0obW9kLCBzaXplLCBwcmVwZW5kLCBhbGlnbik7XG4gMjk3Olx0XHRcdFx0dXBfd3JpdGUoXHUwMDI2Y3R0eXBlLVx1MDAzZW1vZF9sb2NrKTtcbiAyOTg6XHRcdFx0XHRicmVhaztcbiAyOTk6XHRcdFx0fVxuIDMwMDpcdFx0fVxuIDMwMTpcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmNvZGV0YWdfbG9jayk7XG4gMzAyOlx0XG4gMzAzOlx0XHRyZXR1cm4gcmV0O1xuIDMwNDpcdH1cbiAzMDU6XHRcbiAzMDY6XHR2b2lkIGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kKVxuIDMwNzpcdHtcbiAzMDg6XHRcdHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZTtcbiAzMDk6XHRcbiAzMTA6XHRcdG11dGV4X2xvY2soXHUwMDI2Y29kZXRhZ19sb2NrKTtcbiAzMTE6XHRcdGxpc3RfZm9yX2VhY2hfZW50cnkoY3R0eXBlLCBcdTAwMjZjb2RldGFnX3R5cGVzLCBsaW5rKSB7XG4gMzEyOlx0XHRcdGlmICghY3R0eXBlLVx1MDAzZWRlc2MuZnJlZV9zZWN0aW9uX21lbSlcbiAzMTM6XHRcdFx0XHRjb250aW51ZTtcbiAzMTQ6XHRcbiAzMTU6XHRcdFx0ZG93bl93cml0ZShcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2xvY2spO1xuIDMxNjpcdFx0XHRjdHR5cGUtXHUwMDNlZGVzYy5mcmVlX3NlY3Rpb25fbWVtKG1vZCwgZmFsc2UpO1xuIDMxNzpcdFx0XHR1cF93cml0ZShcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2xvY2spO1xuIDMxODpcdFx0fVxuIDMxOTpcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmNvZGV0YWdfbG9jayk7XG4gMzIwOlx0fVxuIDMyMTpcdFxuIDMyMjpcdHZvaWQgY29kZXRhZ19tb2R1bGVfcmVwbGFjZWQoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbW9kdWxlICpuZXdfbW9kKVxuIDMyMzpcdHtcbiAzMjQ6XHRcdHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZTtcbiAzMjU6XHRcbiAzMjY6XHRcdG11dGV4X2xvY2soXHUwMDI2Y29kZXRhZ19sb2NrKTtcbiAzMjc6XHRcdGxpc3RfZm9yX2VhY2hfZW50cnkoY3R0eXBlLCBcdTAwMjZjb2RldGFnX3R5cGVzLCBsaW5rKSB7XG4gMzI4Olx0XHRcdGlmICghY3R0eXBlLVx1MDAzZWRlc2MubW9kdWxlX3JlcGxhY2VkKVxuIDMyOTpcdFx0XHRcdGNvbnRpbnVlO1xuIDMzMDpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3OTc4CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogNDgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdW5kZXJzdGFuZGluZywgYXNzdW1pbmcgSSYjMzk7bSBhbiBleHBlcnQgaW4gdGhpcyBhcmVhOgoKKipUcmFjaW5nIE1lbW9yeSBBbGxvY2F0aW9uIGluIGBjdHR5cGVgKioKCkFscmlnaHQsIHNvIEkmIzM5O20gc2VlaW5nIGEgY2FsbCB0byBgY3R0eXBlLSZndDtkZXNjLmFsbG9jX3NlY3Rpb25fbWVtYC4gVGhhdCByaW5ncyBhIGJlbGwuIE15IGltbWVkaWF0ZSBpbnN0aW5jdCBpcyB0byBjaGVjayB3aGVyZSB0aGF0IGZ1bmN0aW9uLCB3aGljaCBpcyBhY3RpbmcgYXMgYSBtZW1vcnkgYWxsb2NhdGlvbiBob29rLCBpcyBhY3R1YWxseSAqZGVmaW5lZCouIFNwZWNpZmljYWxseSwgZ2l2ZW4gaXRzIG5hbWUsIEkgc3VzcGVjdCBpdCYjMzk7cyBnb2luZyB0byBiZSByZWxhdGVkIHRvIHNlY3Rpb24gbWVtb3J5IG1hbmFnZW1lbnQuCgpMZXQmIzM5O3MgcXVpY2tseSBqdW1wIGludG8gYG1tL2FsbG9jX3RhZy5jYCB0byBzZWUgaWYgbXkgaHVuY2ggaXMgY29ycmVjdC4gQWgsIHllcywgdGhlcmUgaXQgaXMhIGByZXNlcnZlX21vZHVsZV90YWdzYCBpcyByZWdpc3RlcmVkIGFzIHRoZSBoYW5kbGVyIGZvciBgYWxsb2Nfc2VjdGlvbl9tZW1gLiBHb29kLiBUaGF0IGNvbmZpcm1zIHRoZSBsaW5rLiBTbywgdGhlIGFsbG9jYXRpb24gcGF0aCBpbiBgY3R0eXBlYCBpcyBsaWtlbHkgbGV2ZXJhZ2luZyB0aGlzIG1vZHVsZSB0YWcgcmVzZXJ2YXRpb24gbWVjaGFuaXNtLiBJIG5lZWQgdG8ga2VlcCB0aGlzIGluIG1pbmQgYXMgSSBmb2xsb3cgdGhlIGNvbnRyb2wgZmxvdy4gTm93LCB0aGUgbmV4dCBzdGVwIHdvdWxkIGJlIHRvIGZpZ3VyZSBvdXQgKndoeSogaXQmIzM5O3MgY2FsbGluZyB0aGlzIGFuZCB3aGF0IGByZXNlcnZlX21vZHVsZV90YWdzYCBpcyB0cnlpbmcgdG8gYWNoaWV2ZS4gSXMgdGhpcyBhIGN1c3RvbSBhbGxvY2F0aW9uIHNjaGVtZT8gT3IgcGVyaGFwcyBwYXJ0IG9mIHNvbWUgbGFyZ2VyIG1lbW9yeSBwcm90ZWN0aW9uIGZyYW1ld29yaz8KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cmVzZXJ2ZV9tb2R1bGVfdGFncyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL2FsbG9jX3RhZy5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2FsbG9jX3RhZy5jPTgzOD1zdGF0aWMgdm9pZCByZWxlYXNlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgYm9vbCB1c2VkKVxuLS1cbm1tL2FsbG9jX3RhZy5jLTg4My1cbm1tL2FsbG9jX3RhZy5jOjg4NDpzdGF0aWMgdm9pZCAqcmVzZXJ2ZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbm1tL2FsbG9jX3RhZy5jLTg4NS1cdFx0XHRcdCB1bnNpZ25lZCBpbnQgcHJlcGVuZCwgdW5zaWduZWQgbG9uZyBhbGlnbilcbi0tXG5tbS9hbGxvY190YWcuYz0xMzIxPXN0YXRpYyBpbnQgX19pbml0IGFsbG9jX3RhZ19pbml0KHZvaWQpXG4tLVxubW0vYWxsb2NfdGFnLmMtMTMyNy1cdFx0Lm5lZWRzX3NlY3Rpb25fbWVtXHQ9IG5lZWRzX3NlY3Rpb25fbWVtLFxubW0vYWxsb2NfdGFnLmM6MTMyODpcdFx0LmFsbG9jX3NlY3Rpb25fbWVtXHQ9IHJlc2VydmVfbW9kdWxlX3RhZ3MsXG5tbS9hbGxvY190YWcuYy0xMzI5LVx0XHQuZnJlZV9zZWN0aW9uX21lbVx0PSByZWxlYXNlX21vZHVsZV90YWdzLFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NTI3CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogNDY2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIE1vZHVsZSBMb2FkaW5nIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCB0cmFjaW5nIHRoZSBlcnJvciBmbG93LiBgcmVzZXJ2ZV9tb2R1bGVfdGFnc2AgY2FsbHMgYGFsbG9jX3NlY3Rpb25fbWVtYCwgYW5kIHRoYXQgcmV0dXJucyBgRVJSX1BUUigtRUFHQUlOKWAuIFRoYXQgcHJvcGFnYXRlcyB0aHJvdWdoIGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYCBhbmQgYG1vdmVfbW9kdWxlYCwgdWx0aW1hdGVseSBsZWFkaW5nIHRvIGAtRUFHQUlOYCBpbiBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAuIEkgc2VlIHRoYXQgYGxheW91dF9hbmRfYWxsb2NhdGVgIG5vdyAqcmV0cmllcyogd2hlbiBpdCBnZXRzIHRoYXQgZXJyb3IgY29kZS4KClRoZSBjb3JlIG9mIHRoZSBwYXRjaCBzZWVtcyB0byBoYW5kbGUgYSBzaXR1YXRpb24gd2hlcmUgYCF0YWdzX2FkZHJlc3NhYmxlKClgIGlzIHRydWUsIHBhcnRpY3VsYXJseSB3aGVuIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBpcyBlbmFibGVkLiBXYWl0LCBubywgaXQgbG9va3MgbGlrZSBgbWVtX2FsbG9jX3Byb2ZpbGluZ19lbmFibGVkKClgIHdhcyByZW1vdmVkIGZyb20gdGhlIGNvbmRpdGlvbi4gYHRhZ3NfYWRkcmVzc2FibGUoKWAgY2hlY2tzIGlmIHdlIGhhdmUgc3VmZmljaWVudCBwYWdlIGZsYWcgYml0cy4gSWYgd2UgKmRvbiYjMzk7dCosIHRoZSBjb2RlIHVzZWQgdG8gZGlzYWJsZSBtZW1vcnkgcHJvZmlsaW5nIGFuZCByZXR1cm4gYC1FQUdBSU5gIHRvIHRyaWdnZXIgYSByZXRyeS4gVGhpcyBpcyBhICpmdW5jdGlvbmFsKiBjaGFuZ2UgaW4gdGhlIG1vZHVsZSBsb2FkaW5nIHByb2Nlc3MgaWYgd2UgcnVuIG91dCBvZiBwYWdlIGZsYWcgYml0cywgcmVnYXJkbGVzcyBvZiBtZW1vcnkgcHJvZmlsaW5nIHN0YXRlLgoKVGhlIGltcG9ydGFudCB0aGluZyBpcyB0aGF0IGByZWxlYXNlX21vZHVsZV90YWdzKG1vZCwgZmFsc2UpYCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBgLUVBR0FJTmAgcmV0dXJuLgoKTm93LCBzaG91bGQgSSBmdXp6IHRoaXM/IFRoaXMgKmRlZmluaXRlbHkqIG1vZGlmaWVzIGBsYXlvdXRfYW5kX2FsbG9jYXRlYCBpbiBga2VybmVsL21vZHVsZS9tYWluLmNgLCBhbmQgaW1wb3J0YW50bHksIHRoZSByZXRyeSBsb2dpYyByZXNldHMgc29tZSBzdGF0ZSwgaW5jbHVkaW5nIHJld3JpdGluZyBzZWN0aW9uIGhlYWRlcnMgYW5kIHplcm9pbmcgc2VjdGlvbiBzaXplcywgYmVmb3JlIHJldHJ5aW5nLgoKYGBgYwoJCXJld3JpdGVfc2VjdGlvbl9oZWFkZXJzKGluZm8sIGZsYWdzKTsKCQlmb3JfZWFjaF9tb2RfbWVtX3R5cGUodHlwZSkKCQkJaW5mby0mZ3Q7bW9kLSZndDttZW1bdHlwZV0uc2l6ZSA9IDA7CgkJaW5mby0mZ3Q7c2VjaGRyc1tpbmZvLSZndDtpbmRleC5zeW1dLnNoX2ZsYWdzICZhbXA7PSB+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DOwoJCWluZm8tJmd0O3NlY2hkcnNbaW5mby0mZ3Q7aW5kZXguc3RyXS5zaF9mbGFncyAmYW1wOz0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQzsKCQlnb3RvIHJldHJ5OwpgYGAKClRoaXMgaXMgYSBjbGVhciBmdW5jdGlvbmFsIGNoYW5nZSB0byB0aGUgbW9kdWxlIGxvYWRpbmcgcHJvY2VzcywgYW5kIEkgdGhpbmsgdGhpcyBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcuIEkgY2FuIGltYWdpbmUgdGhpcyBjb2RlIHBhdGggYmVpbmcgdHJpZ2dlcmVkIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgc2ltcGx5IGJ5IGxvYWRpbmcgbW9kdWxlcy4gSWYgd2UgY2FuIGV4aGF1c3QgcGFnZSBmbGFnIGJpdHMgKHdoaWNoIGlzIHRoZSBtYWluIHNjZW5hcmlvIGFkZHJlc3NlZCBieSB0aGUgb3JpZ2luYWwgY29kZSksIG9yIGV2ZW4ganVzdCBnZW5lcmFsIG1vZHVsZSBsb2FkaW5nIGZ1enppbmcsIHdlIGNvdWxkIGV4ZXJjaXNlIHRoaXMgbmV3IHJldHJ5IGxvZ2ljLiBUaGUgcmVtb3ZhbCBvZiBgbWVtX2FsbG9jX3Byb2ZpbGluZ19lbmFibGVkKClgIGZyb20gdGhlIGNvbmRpdGlvbiBpcyBhIG1ham9yIGNoYW5nZS4gVGhpcyBsb29rcyBsaWtlIGEgcHJpbWUgY2FuZGlkYXRlIGZvciBpbnZlc3RpZ2F0aW9uLiBMZXQgbWUgY2hlY2sgYHRhZ3NfYWRkcmVzc2FibGUoKWAgdG8gYmUgc3VyZS4uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDozOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt0YWdzX2FkZHJlc3NhYmxlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vYWxsb2NfdGFnLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vYWxsb2NfdGFnLmM9NjYwPXN0YXRpYyBib29sIGVuc3VyZV9hbGlnbm1lbnQodW5zaWduZWQgbG9uZyBhbGlnbiwgdW5zaWduZWQgaW50ICpwcmVwZW5kKVxuLS1cbm1tL2FsbG9jX3RhZy5jLTY4MC1cbm1tL2FsbG9jX3RhZy5jOjY4MTpzdGF0aWMgaW5saW5lIGJvb2wgdGFnc19hZGRyZXNzYWJsZSh2b2lkKVxubW0vYWxsb2NfdGFnLmMtNjgyLXtcbi0tXG5tbS9hbGxvY190YWcuYz04ODQ9c3RhdGljIHZvaWQgKnJlc2VydmVfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBsb25nIHNpemUsXG4tLVxubW0vYWxsb2NfdGFnLmMtOTUyLVx0XHRtb2R1bGVfdGFncy5zaXplID0gb2Zmc2V0ICYjNDM7IHNpemU7XG5tbS9hbGxvY190YWcuYzo5NTM6XHRcdGlmICghdGFnc19hZGRyZXNzYWJsZSgpKSB7XG5tbS9hbGxvY190YWcuYy05NTQtXHRcdFx0c2h1dGRvd25fbWVtX3Byb2ZpbGluZyh0cnVlKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6Mzk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTc2MAoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDEyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gYHRhZ3NfYWRkcmVzc2FibGUoKWAqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIHNwZWNpZmljcyBvZiB0aGUgYHRhZ3NfYWRkcmVzc2FibGUoKWAgaW1wbGVtZW50YXRpb24uIEkga25vdyB0aGUgZ2VuZXJhbCBjb25jZXB0OiB0aGUgYWJpbGl0eSB0byBhc3NvY2lhdGUgdGFncyB3aXRoIHZhcmlvdXMgb2JqZWN0cyBhbmQgdGhlbiBlZmZpY2llbnRseSBxdWVyeSB0aG9zZSBvYmplY3RzIGJhc2VkIG9uIHRhZyByZWxhdGlvbnNoaXBzLiBCdXQgSSBuZWVkIHRvIGRpZyBpbnRvIHRoZSBudXRzIGFuZCBib2x0cy4gSSB3YW50IHRvIHNlZSBob3cgdGhpcyBwYXJ0aWN1bGFyIHN5c3RlbSBoYW5kbGVzIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlcyDigJMgaXMgaXQgYSByZWxhdGlvbmFsIGRhdGFiYXNlIHdpdGggam9pbiB0YWJsZXMsIGEgZ3JhcGggZGF0YWJhc2UsIG9yIHNvbWV0aGluZyBtb3JlIHNwZWNpYWxpemVkPyBXaGF0IGFyZSB0aGUgaW5kZXhpbmcgc3RyYXRlZ2llcyBpbiBwbGFjZT8gQW5kIG1vc3QgaW1wb3J0YW50bHksIGhvdyBhcmUgY29uY3VycmVuY3kgYW5kIGNvbnNpc3RlbmN5IGhhbmRsZWQsIHBhcnRpY3VsYXJseSBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgd3JpdGVycyBhZGRpbmcgYW5kIHJlbW92aW5nIHRhZ3MgY29uY3VycmVudGx5PyBJJiMzOTttIGFsc28gY3VyaW91cyB0byBzZWUgaG93IHRoZXkmIzM5O3ZlIGhhbmRsZWQgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIHdpdGggbGFyZ2UgbnVtYmVycyBvZiB0YWdzIG9yIG9iamVjdHMuIFNwZWNpZmljYWxseSwgSSYjMzk7ZCBsaWtlIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBzeXN0ZW0gc2NhbGVzIHdpdGggZGlmZmVyZW50IHRhZyBjYXJkaW5hbGl0eSBzY2VuYXJpb3M6IGZldyB0YWdzIHBlciBvYmplY3QsIG1hbnkgdGFncyBwZXIgb2JqZWN0LCBhbmQgcG90ZW50aWFsbHkgYSB2ZXJ5IGhpZ2ggbnVtYmVyIG9mIHVuaXF1ZSB0YWdzIGFjcm9zcyB0aGUgd2hvbGUgZGF0YSBzZXQuIExldCYjMzk7cyBzZWUgaG93IHRoZXkmIzM5O3ZlIHRhY2tsZWQgdGhlIGNvbXBsZXhpdGllcyBvZiBlZmZpY2llbnRseSBxdWVyeWluZyBjb21wbGV4IHRhZyByZWxhdGlvbnNoaXBzIChlLmcuLCBvYmplY3RzIHRhZ2dlZCB3aXRoICphbGwqIG9mIGEgc2V0IG9mIHRhZ3MsICphbnkqIG9mIGEgc2V0IG9mIHRhZ3MsIG9yICpub25lKiBvZiBhIHNldCBvZiB0YWdzKS4gVGltZSB0byBkaXZlIGludG8gdGhlIGNvZGUhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vYWxsb2NfdGFnLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2ODEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDY4MTpcdHN0YXRpYyBpbmxpbmUgYm9vbCB0YWdzX2FkZHJlc3NhYmxlKHZvaWQpXG4gNjgyOlx0e1xuIDY4MzpcdFx0dW5zaWduZWQgbG9uZyB0YWdfaWR4X2NvdW50O1xuIDY4NDpcdFxuIDY4NTpcdFx0aWYgKCFzdGF0aWNfa2V5X2VuYWJsZWQoXHUwMDI2bWVtX3Byb2ZpbGluZ19jb21wcmVzc2VkKSlcbiA2ODY6XHRcdFx0cmV0dXJuIHRydWU7IC8qIHdpdGggcGFnZV9leHQgdGFncyBhcmUgYWx3YXlzIGFkZHJlc3NhYmxlICovXG4gNjg3Olx0XG4gNjg4Olx0XHR0YWdfaWR4X2NvdW50ID0gQ09ERVRBR19JRF9GSVJTVCAmIzQzOyBrZXJuZWxfdGFncy5jb3VudCAmIzQzO1xuIDY4OTpcdFx0XHRcdG1vZHVsZV90YWdzLnNpemUgLyBzaXplb2Yoc3RydWN0IGFsbG9jX3RhZyk7XG4gNjkwOlx0XG4gNjkxOlx0XHRyZXR1cm4gdGFnX2lkeF9jb3VudCBcdTAwM2MgKDFVTCBcdTAwM2NcdTAwM2MgTlJfVU5VU0VEX1BBR0VGTEFHX0JJVFMpO1xuIDY5MjpcdH1cbiA2OTM6XHRcbiA2OTQ6XHRzdGF0aWMgYm9vbCBuZWVkc19zZWN0aW9uX21lbShzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSlcbiA2OTU6XHR7XG4gNjk2Olx0XHRpZiAoIW1lbV9wcm9maWxpbmdfc3VwcG9ydClcbiA2OTc6XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDY5ODpcdFxuIDY5OTpcdFx0cmV0dXJuIHNpemUgXHUwMDNlPSBzaXplb2Yoc3RydWN0IGFsbG9jX3RhZyk7XG4gNzAwOlx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDM5MAoJCQkJCQkJb3V0cHV0OiAyOAoJCQkJCQkJdGhvdWdodHM6IDYzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLgoKKipVbmRlcnN0YW5kaW5nIGB0YWdzX2FkZHJlc3NhYmxlKClgIGFuZCBJdHMgSW1wbGljYXRpb25zKioKCkFscmlnaHQsIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGB0YWdzX2FkZHJlc3NhYmxlKClgIGZ1bmN0aW9uLiBGcm9tIHdoYXQgSSBjYW4gZ2F0aGVyLCBpdCBwZXJmb3JtcyBhIGNoZWNrLCBzcGVjaWZpY2FsbHksIGB0YWdfaWR4X2NvdW50ICZsdDsgKDFVTCAmbHQ7Jmx0OyBOUl9VTlVTRURfUEFHRUZMQUdfQklUUylgLiBNeSBleHBlcnQgaW50dWl0aW9uIHRlbGxzIG1lIHRoaXMgaXMgcHJvYmFibHkgc29tZSBraW5kIG9mIHNhZmV0eSBvciBhbGxvY2F0aW9uLXJlbGF0ZWQgY2hlY2ssIHBvdGVudGlhbGx5IHJlbGF0ZWQgdG8gaG93IHRhZ3Mgb3IgbWV0YWRhdGEgYXJlIG1hbmFnZWQgaW4gbWVtb3J5LiBUaGUgbWVudGlvbiBvZiBgTlJfVU5VU0VEX1BBR0VGTEFHX0JJVFNgIGlzIGEgY2x1ZTsgaXQgc291bmRzIGxpa2Ugd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBiaXRmbGFncyBhbmQgcG90ZW50aWFsIG1lbW9yeSBsaW1pdGF0aW9ucyB0aWVkIHRvIHBhZ2UgbWFuYWdlbWVudC4KCkFuZCB3YWl0IGEgbWludXRlLi4uIEkgc2VlIGEgY29ubmVjdGlvbiB0byBgQ09ORklHX01FTV9BTExPQ19QUk9GSUxJTkdgLiBNeSBtaW5kIGltbWVkaWF0ZWx5IGp1bXBzIHRvIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyEgVGhpcyBoYXMgdG8gYmUgcmVsYXRlZC4gTGV0JiMzOTtzIHNlZSBob3cgdGhleSYjMzk7cmUgY29ubmVjdGVkLCBob3cgdGhleSB1c2UgZWFjaCBvdGhlciBhbmQgbGV0IG1lIHVuZGVyc3RhbmQgaG93IHRoZXkgYWZmZWN0IHRoZSBsb2dpYy4gVG8gdHJ1bHkgZ3Jhc3AgdGhlIHNpZ25pZmljYW5jZSBvZiBgdGFnc19hZGRyZXNzYWJsZSgpYCwgSSBuZWVkIHRvIGNvbmZpcm0gd2hldGhlciBgTUVNX0FMTE9DX1BST0ZJTElOR2AgaXMgZW5hYmxlZCBhbmQgaG93IHRoYXQgYWZmZWN0cyB0aGlzIGJpdCBvZiBjb2RlLiBJIG5lZWQgdG8gY29uc3VsdCB0aGUgS2NvbmZpZyBmaWxlIGZvciBhIGJldHRlciBwaWN0dXJlIG9mIHRoZSBzaXR1YXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWcuZGVidWc9MzExPWNvbmZpZyBQRVJfVk1BX0xPQ0tfU1RBVFNcbi0tXG5tbS9LY29uZmlnLmRlYnVnLTMyMy1cbm1tL0tjb25maWcuZGVidWc6MzI0OmNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HXG5tbS9LY29uZmlnLmRlYnVnLTMyNS1cdGJvb2wgXCYjMzQ7RW5hYmxlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZ1wmIzM0O1xuLS1cbm1tL0tjb25maWcuZGVidWctMzM3LVxubW0vS2NvbmZpZy5kZWJ1ZzozMzg6Y29uZmlnIE1FTV9BTExPQ19QUk9GSUxJTkdfRU5BQkxFRF9CWV9ERUZBVUxUXG5tbS9LY29uZmlnLmRlYnVnLTMzOS1cdGJvb2wgXCYjMzQ7RW5hYmxlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBieSBkZWZhdWx0XCYjMzQ7XG4tLVxubW0vS2NvbmZpZy5kZWJ1Zy0zNDItXG5tbS9LY29uZmlnLmRlYnVnOjM0Mzpjb25maWcgTUVNX0FMTE9DX1BST0ZJTElOR19ERUJVR1xubW0vS2NvbmZpZy5kZWJ1Zy0zNDQtXHRib29sIFwmIzM0O01lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGVyIGRlYnVnZ2luZ1wmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDk0NAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgYXMgaWYgdGhleSYjMzk7cmUgbXkgb3duOgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBLY29uZmlnIERlYnVnIE9wdGlvbnMqKgoKUmlnaHQsIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSBuZWVkIHRvIHRha2UgYSBsb29rIGF0IHRoZSBgbW0vS2NvbmZpZy5kZWJ1Z2AgZmlsZSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDMyNC4gVGhhdCBzZWN0aW9uIGxpa2VseSBob2xkcyBzb21lIGltcG9ydGFudCBjb25maWd1cmF0aW9ucyByZWxhdGVkIHRvIG1lbW9yeSBtYW5hZ2VtZW50IGRlYnVnZ2luZyBmZWF0dXJlcy4gQmFzZWQgb24gbXkgZXhwZXJpZW5jZSwgaXQmIzM5O3MgcHJvYmFibHkgZ29pbmcgdG8gZGVmaW5lIG9yIGVuYWJsZSBzcGVjaWZpYyB0cmFjaW5nLCBlcnJvciBjaGVja2luZywgb3IgaW5zdHJ1bWVudGF0aW9uIG9wdGlvbnMgd2l0aGluIHRoZSBtZW1vcnkgc3Vic3lzdGVtLiBJIGtub3cgdGhlcmUgYXJlIGEgYnVuY2ggb2YgdGhlc2UsIGFuZCBsaW5lIDMyNCBtaWdodCBiZSB0aGUga2V5IHRvIGVuYWJsaW5nIHRoZSBwcmVjaXNlIGRlYnVnIGZlYXR1cmUgSSYjMzk7bSBhZnRlciwgYmUgaXQgc29tZSBtZW1vcnkgYWxsb2NhdGlvbiBpc3N1ZSwgYW4gaXNzdWUgd2l0aCBwYWdlIHRhYmxlIGNvcnJ1cHRpb24sIG9yIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5LiBJJiMzOTttIGFzc3VtaW5nIHRoYXQgaXQgd2lsbCBoYXZlIHNvbWV0aGluZyBvZiByZWxldmFuY2UgdG8gdGhlIHdvcmsgSSYjMzk7bSBkb2luZywgb3IgZWxzZSBJIHdvdWxkbiYjMzk7dCBoYXZlIGxvb2tlZCB1cCB0aGUgc3BlY2lmaWMgcGxhY2UgaW4gdGhlIGZpcnN0IGluc3RhbmNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL0tjb25maWcuZGVidWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzMjQsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDMyNDpcdGNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HXG4gMzI1Olx0XHRib29sIFwmIzM0O0VuYWJsZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmdcJiMzNDtcbiAzMjY6XHRcdGRlZmF1bHQgblxuIDMyNzpcdFx0ZGVwZW5kcyBvbiBNTVVcbiAzMjg6XHRcdGRlcGVuZHMgb24gUFJPQ19GU1xuIDMyOTpcdFx0ZGVwZW5kcyBvbiAhREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVXG4gMzMwOlx0XHRzZWxlY3QgQ09ERV9UQUdHSU5HXG4gMzMxOlx0XHRzZWxlY3QgUEFHRV9FWFRFTlNJT05cbiAzMzI6XHRcdHNlbGVjdCBTTEFCX09CSl9FWFRcbiAzMzM6XHRcdGhlbHBcbiAzMzQ6XHRcdCAgVHJhY2sgYWxsb2NhdGlvbiBzb3VyY2UgY29kZSBhbmQgcmVjb3JkIHRvdGFsIGFsbG9jYXRpb24gc2l6ZVxuIDMzNTpcdFx0ICBpbml0aWF0ZWQgYXQgdGhhdCBjb2RlIGxvY2F0aW9uLiBUaGUgbWVjaGFuaXNtIGNhbiBiZSB1c2VkIHRvIHRyYWNrXG4gMzM2Olx0XHQgIG1lbW9yeSBsZWFrcyB3aXRoIGEgbG93IHBlcmZvcm1hbmNlIGFuZCBtZW1vcnkgaW1wYWN0LlxuIDMzNzpcdFxuIDMzODpcdGNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HX0VOQUJMRURfQllfREVGQVVMVFxuIDMzOTpcdFx0Ym9vbCBcJiMzNDtFbmFibGUgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIGJ5IGRlZmF1bHRcJiMzNDtcbiAzNDA6XHRcdGRlZmF1bHQgeVxuIDM0MTpcdFx0ZGVwZW5kcyBvbiBNRU1fQUxMT0NfUFJPRklMSU5HXG4gMzQyOlx0XG4gMzQzOlx0Y29uZmlnIE1FTV9BTExPQ19QUk9GSUxJTkdfREVCVUdcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE0ODgKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAxODkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBNb2R1bGUgTG9hZGluZyBQYXRjaCoqCgpPa2F5LCBzbyB0aGlzIHBhdGNoIGlzIHJlbGF0ZWQgdG8gbW9kdWxlIGxvYWRpbmcgYW5kIGhpbmdlcyBvbiB0aGUgYE1FTV9BTExPQ19QUk9GSUxJTkdgIGNvbmZpZyBvcHRpb24uIFRoZSBrZXkgY2hhbmdlIHNlZW1zIHRvIGJlIGluIGBrZXJuZWwvbW9kdWxlL21haW4uY2AsIHdoZXJlIHRoZXkmIzM5O3JlIHJldHJ5aW5nIG1vZHVsZSBsb2FkaW5nIGlmIGBtb3ZlX21vZHVsZWAgcmV0dXJucyBgLUVBR0FJTmAuIFRoYXQmIzM5O3MgYSBmdW5kYW1lbnRhbCBzaGlmdCBpbiBob3cgdGhlIGNvcmUgbW9kdWxlIGxvYWRpbmcgcHJvY2VzcyB3b3Jrcywgd2hpY2ggaXMgZGVmaW5pdGVseSBhIHBvaW50IGZvciBmdXp6aW5nLgoKTXkgcHJpbWFyeSBmb2N1cyBmb3IgZnV6emluZyB3aWxsIGJlIG9uIGEgZmV3IHNwZWNpZmljIHN5bWJvbHM6IGBsYXlvdXRfYW5kX2FsbG9jYXRlYCwgYG1vdmVfbW9kdWxlYCwgYHJlc2VydmVfbW9kdWxlX3RhZ3NgLCBhbmQgYHJlbGVhc2VfbW9kdWxlX3RhZ3NgLiBMZXQgbWUgcXVpY2tseSBjb25maXJt4oCmIHllcCwgYGxheW91dF9hbmRfYWxsb2NhdGVgIGlzIHN0YXRpYyB3aXRoaW4gYGtlcm5lbC9tb2R1bGUvbWFpbi5jYC4gSG1tLCB3YWl0LCB0aGUgaW5zdHJ1Y3Rpb25zIHN1Z2dlc3QgcHJlZmVycmluZyBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludHMgb3ZlciBpbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zLiBNYWtlcyBzZW5zZS4gVGhlIHJlYWwgZW50cnlwb2ludHMgZm9yIG1vZHVsZSBsb2FkaW5nIGFyZSB0aGUgYGluaXRfbW9kdWxlYCBvciBgZmluaXRfbW9kdWxlYCBzeXNjYWxscy4gQWxyaWdodCwgbGV0JiMzOTtzIHNlZSB3aGF0IGlzIGNhbGxpbmcgYGxheW91dF9hbmRfYWxsb2NhdGVgLCBpZiBJJiMzOTttIGdvaW5nIHRvIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtsYXlvdXRfYW5kX2FsbG9jYXRlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS9tYWluLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS9tYWluLmM9Mjk0MT1jb3JlX3BhcmFtKG1vZHVsZV9ibGFja2xpc3QsIG1vZHVsZV9ibGFja2xpc3QsIGNoYXJwLCAwNDAwKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5NDItXG5rZXJuZWwvbW9kdWxlL21haW4uYzoyOTQzOnN0YXRpYyBzdHJ1Y3QgbW9kdWxlICpsYXlvdXRfYW5kX2FsbG9jYXRlKHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGludCBmbGFncylcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5NDQte1xuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTM0MzU9c3RhdGljIGludCBsb2FkX21vZHVsZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBjb25zdCBjaGFyIF9fdXNlciAqdWFyZ3MsXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMzQ3Mi1cdC8qIEZpZ3VyZSBvdXQgbW9kdWxlIGxheW91dCwgYW5kIGFsbG9jYXRlIGFsbCB0aGUgbWVtb3J5LiAqL1xua2VybmVsL21vZHVsZS9tYWluLmM6MzQ3MzpcdG1vZCA9IGxheW91dF9hbmRfYWxsb2NhdGUoaW5mbywgZmxhZ3MpO1xua2VybmVsL21vZHVsZS9tYWluLmMtMzQ3NC1cdGlmIChJU19FUlIobW9kKSkge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjE3NgoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDIyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaXQgc3RhbmRzOgoKKipUcmFjaW5nIHRoZSBEZXBlbmRlbmN5IENoYWluOiBBIFF1aWNrIERpYWdub3N0aWMqKgoKT2theSwgc28gYGxvYWRfbW9kdWxlYCBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAuIFRoYXQmIzM5O3Mgc3RyYWlnaHRmb3J3YXJkLiBOb3csIHRoZSBjcml0aWNhbCBxdWVzdGlvbiBpcyAqdXBzdHJlYW0qOiB3aGF0IGluaXRpYXRlZCB0aGUgZXhlY3V0aW9uIG9mIGBsb2FkX21vZHVsZWAgaW4gdGhlIGZpcnN0IHBsYWNlPyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY2FsbGluZyBjb250ZXh0IHRvIGZ1bGx5IGdyYXNwIHRoZSB3b3JrZmxvdyBhbmQgcG90ZW50aWFsIHBvaW50cyBvZiBvcHRpbWl6YXRpb24gb3IsIGhlYXZlbiBmb3JiaWQsIGJvdHRsZW5lY2tzLiBJcyBpdCB0cmlnZ2VyZWQgYnkgYSB1c2VyIGFjdGlvbiwgYSBzeXN0ZW0gZXZlbnQsIG9yIGFub3RoZXIgbW9kdWxlPyBLbm93aW5nIHRoZSBjYWxsZXIgaXMgdGhlIGtleSB0byB1bmRlcnN0YW5kaW5nIHRoZSBtb2R1bGUmIzM5O3MgYmVoYXZpb3IuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2xvYWRfbW9kdWxlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS9tYWluLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS9tYWluLmM9MTQxNz1zdGF0aWMgdm9pZCBmcmVlX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QpXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMTQyMC1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjE0MjE6XHRjb2RldGFnX3VubG9hZF9tb2R1bGUobW9kKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTE0MjItXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9Mjk0Mz1zdGF0aWMgc3RydWN0IG1vZHVsZSAqbGF5b3V0X2FuZF9hbGxvY2F0ZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMjk5Ni1cdG1vZCA9ICh2b2lkICopaW5mby1cdTAwM2VzZWNoZHJzW2luZm8tXHUwMDNlaW5kZXgubW9kXS5zaF9hZGRyO1xua2VybmVsL21vZHVsZS9tYWluLmM6Mjk5NzpcdGttZW1sZWFrX2xvYWRfbW9kdWxlKG1vZCwgaW5mbyk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTk4LVx0Y29kZXRhZ19tb2R1bGVfcmVwbGFjZWQoaW5mby1cdTAwM2Vtb2QsIG1vZCk7XG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9MzM5OT1zdGF0aWMgaW50IGVhcmx5X21vZF9jaGVjayhzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMzQzNC0gKi9cbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjM0MzU6c3RhdGljIGludCBsb2FkX21vZHVsZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBjb25zdCBjaGFyIF9fdXNlciAqdWFyZ3MsXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zNDM2LVx0XHQgICAgICAgaW50IGZsYWdzKVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM1ODMtXG5rZXJuZWwvbW9kdWxlL21haW4uYzozNTg0Olx0aWYgKGNvZGV0YWdfbG9hZF9tb2R1bGUobW9kKSlcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM1ODUtXHRcdGdvdG8gc3lzZnNfY2xlYW51cDtcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYz0zNjQ3PVNZU0NBTExfREVGSU5FMyhpbml0X21vZHVsZSwgdm9pZCBfX3VzZXIgKiwgdW1vZCxcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zNjY2LVxua2VybmVsL21vZHVsZS9tYWluLmM6MzY2NzpcdHJldHVybiBsb2FkX21vZHVsZShcdTAwMjZpbmZvLCB1YXJncywgMCk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0zNjY4LX1cbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYz0zNzU0PXN0YXRpYyBpbnQgaW5pdF9tb2R1bGVfZnJvbV9maWxlKHN0cnVjdCBmaWxlICpmLCBjb25zdCBjaGFyIF9fdXNlciAqIHVhcmdzLCBpbnQgZmxhZ3MpXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMzc4OS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjM3OTA6XHRyZXR1cm4gbG9hZF9tb2R1bGUoXHUwMDI2aW5mbywgdWFyZ3MsIGZsYWdzKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM3OTEtfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjkzNAoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDE2NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgTW9kdWxlIEluaXRpYWxpemF0aW9uIGluIHRoZSBLZXJuZWwqKgoKT2theSwgc28gSSYjMzk7bSB0cmFjaW5nIHRoZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZmxvdywgYW5kIGl0IGxvb2tzIGxpa2UgYGluaXRfbW9kdWxlYCBhbmQgYGluaXRfbW9kdWxlX2Zyb21fZmlsZWAgKHdoaWNoIGBmaW5pdF9tb2R1bGVgIGNhbGxzKSBib3RoIHVsdGltYXRlbHkgY2FsbCBgbG9hZF9tb2R1bGVgLiBSaWdodCwgYGluaXRfbW9kdWxlYCBhbmQgYGZpbml0X21vZHVsZWAgYXJlIHRoZSBzeXN0ZW0gY2FsbHMsIHRoZSBlbnRyeSBwb2ludHMuIFRoZSBkb2N1bWVudGF0aW9uIGVtcGhhc2l6ZWQgcHJlZmVycmluZyBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludHMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucy4gVGhhdCBtYWtlcyBzZW5zZSwgYGxvYWRfbW9kdWxlYCBpcyB0aGUgc3RhdGljIGhlbHBlciwgYW5kIGBpbml0X21vZHVsZWAgaXMgdGhlIHN5c2NhbGwsIGJ1dCwgd2FpdCwgYGluaXRfbW9kdWxlYCAqaXMqIGBzeXNfaW5pdF9tb2R1bGVgIC4gSSBzaG91bGQgZmluZCBhIG5vbi1zdGF0aWMgb25lLiBJJiMzOTtsbCBjaGVjayBgbW0vYWxsb2NfdGFnLmNgIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IG5vbi1zdGF0aWMgZnVuY3Rpb25zIGF2YWlsYWJsZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cmVzZXJ2ZV9tb2R1bGVfdGFncyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL2FsbG9jX3RhZy5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2FsbG9jX3RhZy5jPTgzOD1zdGF0aWMgdm9pZCByZWxlYXNlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgYm9vbCB1c2VkKVxuLS1cbm1tL2FsbG9jX3RhZy5jLTg4My1cbm1tL2FsbG9jX3RhZy5jOjg4NDpzdGF0aWMgdm9pZCAqcmVzZXJ2ZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbm1tL2FsbG9jX3RhZy5jLTg4NS1cdFx0XHRcdCB1bnNpZ25lZCBpbnQgcHJlcGVuZCwgdW5zaWduZWQgbG9uZyBhbGlnbilcbi0tXG5tbS9hbGxvY190YWcuYz0xMzIxPXN0YXRpYyBpbnQgX19pbml0IGFsbG9jX3RhZ19pbml0KHZvaWQpXG4tLVxubW0vYWxsb2NfdGFnLmMtMTMyNy1cdFx0Lm5lZWRzX3NlY3Rpb25fbWVtXHQ9IG5lZWRzX3NlY3Rpb25fbWVtLFxubW0vYWxsb2NfdGFnLmM6MTMyODpcdFx0LmFsbG9jX3NlY3Rpb25fbWVtXHQ9IHJlc2VydmVfbW9kdWxlX3RhZ3MsXG5tbS9hbGxvY190YWcuYy0xMzI5LVx0XHQuZnJlZV9zZWN0aW9uX21lbVx0PSByZWxlYXNlX21vZHVsZV90YWdzLFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzUzNwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDM4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQmIzM5O3MgaW50ZXJuYWwgbW9ub2xvZ3VlOgoKKipJbnZlc3RpZ2F0aW5nIE1vZHVsZSBUYWcgQWxsb2NhdGlvbioqCgpBbHJpZ2h0LCBsZXQmIzM5O3Mgc2VlLCBJJiMzOTttIHRoaW5raW5nIGFib3V0IHRoZSBtb2R1bGUgdGFnZ2luZyBzeXN0ZW0gYWdhaW4uIFNwZWNpZmljYWxseSwgSSYjMzk7bSB0cnlpbmcgdG8gd3JhcCBteSBoZWFkIGFyb3VuZCB0aGUgbWVtb3J5IGxheW91dC4gSSYjMzk7bSByZWNhbGxpbmcgdGhhdCBgcmVzZXJ2ZV9tb2R1bGVfdGFnc2AgaXMgZGVmaW5lZCBhcyAqc3RhdGljKi4gVGhpcyBtZWFucyBpdHMgc2NvcGUgaXMgbGltaXRlZCB0byBpdHMgY29udGFpbmluZyBmaWxlLiBUaGlzIGlzIHByZXR0eSB0eXBpY2FsIGZvciBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMsIGtlZXBzIHRoaW5ncyB0aWR5LiBCdXQgbm93LCB0aGUgcXVlc3Rpb24gYXJpc2VzLCB3aGF0JiMzOTtzIHRoZSBkZWFsIHdpdGggYGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25gPyBJIHNlZW0gdG8gcmVtZW1iZXIgdGhhdCBvbmUgaXNuJiMzOTt0IHN0YXRpYy4gTG9va2luZyBhdCBgbGliL2NvZGV0YWcuY2AsIHllcCwgY29uZmlybWVkLCBpdCYjMzk7cyAqbm9uLXN0YXRpYyouIFRoaXMgc3VnZ2VzdHMgaXQmIzM5O3MgbGlrZWx5IGludGVuZGVkIHRvIGJlIGFjY2Vzc2libGUgZnJvbSBvdGhlciBmaWxlcywgbWVhbmluZyBzb21lIHBhcnQgb2YgaXRzIGRlc2lnbiBpcyBwcm9iYWJseSBleHBvc2VkIGZvciBleHRlcm5hbCB1c2UuIEkgbm93IG5lZWQgdG8gcmVtZW1iZXIgdGhlIEFQSSBkZXNpZ24gb2YgdGhhdCBwYXJ0IG9mIHRoZSBtb2R1bGUgdGFnIGFsbG9jYXRpb24gdG8gc2VlIHdoeSBpdCBoYXMgdG8gYmUgZXhwb3NlZC4gSG1tLCB0aGlzIGRpZmZlcmVuY2UgaGFzIGltcGxpY2F0aW9ucyBmb3IgaG93IG1vZHVsZSB0YWcgbWVtb3J5IGlzIG1hbmFnZWQgYWNyb3NzIHRoZSBwcm9qZWN0LiBJJiMzOTtsbCBoYXZlIHRvIGludmVzdGlnYXRlIGhvdyB0aGF0IG5vbi1zdGF0aWMgYWxsb2NhdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgc3RhdGljIHRhZyByZXNlcnZhdGlvbi4gSSYjMzk7bSBiZWdpbm5pbmcgdG8gc2VlIGEgcG90ZW50aWFsIGFyZWEgZm9yIGZ1cnRoZXIgZXhwbG9yYXRpb24gb24gbWVtb3J5IG93bmVyc2hpcCBhbmQgdGhyZWFkIHNhZmV0eS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2xpYi9jb2RldGFnLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bGliL2NvZGV0YWcuYz0yNTM9Ym9vbCBjb2RldGFnX25lZWRzX21vZHVsZV9zZWN0aW9uKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3QgY2hhciAqbmFtZSxcbi0tXG5saWIvY29kZXRhZy5jLTI4MC1cbmxpYi9jb2RldGFnLmM6MjgxOnZvaWQgKmNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxubGliL2NvZGV0YWcuYy0yODItXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGludCBwcmVwZW5kLFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzk5MQoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDEzNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNb2R1bGUgTG9hZGluZyBJbnZlc3RpZ2F0aW9uKioKCk9rYXksIHNvIEkmIzM5O3ZlIGNvbmZpcm1lZCB0aGF0IGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYCBpcyBpbmRlZWQgbm9uLXN0YXRpYyDigJMgZ29vZC4gQW5kIEkgcmVtZW1iZXIgdGhhdCBgc3lzX2luaXRfbW9kdWxlYCBhbmQgYHN5c19maW5pdF9tb2R1bGVgIGFyZSwgb2YgY291cnNlLCBzeXNjYWxscy4gSSYjMzk7bGwgZGVmaW5pdGVseSBhZGQgYGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25gIHRvIG15IEZvY3VzU3ltYm9scy4gV2hpbGUgdGhlIHN5c2NhbGxzIGFyZSByZWxldmFudCwgdGhleSBhcmUgZmFpcmx5IGdlbmVyaWMuIEkgbmVlZCB0byBkaWcgZGVlcGVyIGZvciBtb3JlIHNwZWNpZmljIG5vbi1zdGF0aWMgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gbW9kdWxlIGxvYWRpbmcuIEhtbSwgaGFuZyBvbi4uLiBgbW92ZV9tb2R1bGVgIGlzIHN0YXRpYy4gQWxyaWdodCwgYmFjayB0byB0aGUgc291cmNlLiBUaW1lIHRvIGNhcmVmdWxseSBjaGVjayB0aHJvdWdoIGBrZXJuZWwvbW9kdWxlL21haW4uY2AgZm9yIGFueSBvdGhlciBub24tc3RhdGljIGZ1bmN0aW9ucyBpbnZvbHZlZCBpbiBtb2R1bGUgbG9hZGluZyB0aGF0IEkgbWlnaHQgaGF2ZSBtaXNzZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O15pbnQgLiptb2R1bGUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvbW9kdWxlL21haW4uYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvbW9kdWxlL21haW4uYz0xNjQ9c3RhdGljIEJMT0NLSU5HX05PVElGSUVSX0hFQUQobW9kdWxlX25vdGlmeV9saXN0KTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTE2NS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjE2NjppbnQgcmVnaXN0ZXJfbW9kdWxlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNjcte1xuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTE3MD1FWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX21vZHVsZV9ub3RpZmllcik7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNzEtXG5rZXJuZWwvbW9kdWxlL21haW4uYzoxNzI6aW50IHVucmVnaXN0ZXJfbW9kdWxlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNzMte1xuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTc3Mj1zdGF0aWMgaW50IHRyeV9zdG9wX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIGludCBmbGFncywgaW50ICpmb3JjZWQpXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtNzk0LSAqL1xua2VybmVsL21vZHVsZS9tYWluLmM6Nzk1OmludCBtb2R1bGVfcmVmY291bnQoc3RydWN0IG1vZHVsZSAqbW9kKVxua2VybmVsL21vZHVsZS9tYWluLmMtNzk2LXtcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYz0xMTA1PXN0YXRpYyBjb25zdCBjaGFyIHZlcm1hZ2ljW10gPSBWRVJNQUdJQ19TVFJJTkc7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0xMTA2LVxua2VybmVsL21vZHVsZS9tYWluLmM6MTEwNzppbnQgdHJ5X3RvX2ZvcmNlX2xvYWQoc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpyZWFzb24pXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xMTA4LXtcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYz0yOTA5PWJvb2wgX193ZWFrIG1vZHVsZV9lbGZfY2hlY2tfYXJjaChFbGZfRWhkciAqaGRyKVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5MTMtXG5rZXJuZWwvbW9kdWxlL21haW4uYzoyOTE0OmludCBfX3dlYWsgbW9kdWxlX2Zyb2JfYXJjaF9zZWN0aW9ucyhFbGZfRWhkciAqaGRyLFxua2VybmVsL21vZHVsZS9tYWluLmMtMjkxNS1cdFx0XHRcdCAgICAgRWxmX1NoZHIgKnNlY2hkcnMsXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9MzAwND1zdGF0aWMgdm9pZCBtb2R1bGVfZGVhbGxvY2F0ZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMzAxMi1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjMwMTM6aW50IF9fd2VhayBtb2R1bGVfZmluYWxpemUoY29uc3QgRWxmX0VoZHIgKmhkcixcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTMwMTQtXHRcdFx0ICAgY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0ODg1CgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzLCBzdW1tYXJpemVkIGFzIGlmIEkgd2VyZSBjb25zaWRlcmluZyB0aGUgY29kZSB5b3UgbWVudGlvbmVkOgoKKipDaGVja2luZyBga2VybmVsL21vZHVsZS9tYWluLmNgIGZvciBgaW5pdF9tb2R1bGVgKioKCk9rYXksIHNvIHdlJiMzOTtyZSB0YWxraW5nIG1vZHVsZSBpbml0aWFsaXphdGlvbiwgcmlnaHQ/IE15IGluaXRpYWwgaW5zdGluY3QgaXMgdG8gZ28gc3RyYWlnaHQgdG8gYGtlcm5lbC9tb2R1bGUvbWFpbi5jYC4gVGhhdCYjMzk7cyB3aGVyZSBJJiMzOTtkICpleHBlY3QqIHRvIGZpbmQgdGhlIGNvcmUgbG9naWMgZm9yIGxvYWRpbmcgYSBtb2R1bGUsIGFuZCB0aGF0IHVzdWFsbHkgbWVhbnMgZmluZGluZyB0aGUgZW50cnkgcG9pbnQsIHRoZSBmdW5jdGlvbiB0aGF0JiMzOTtzIGNhbGxlZCB3aGVuIGEgbW9kdWxlIGlzIGxvYWRlZC4gIEkgd2FudCB0byB6ZXJvIGluIG9uIGBpbml0X21vZHVsZWAuIEl0JiMzOTtzIGFsbW9zdCBjZXJ0YWluIHRoYXQmIzM5O3MgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHdlJiMzOTtyZSBsb29raW5nIGZvciDigJMgaXQmIzM5O3MgdGhlIHN0YW5kYXJkIGNvbnZlbnRpb24sIGFuZCBpdCYjMzk7cyBwcmFjdGljYWxseSBiYWtlZCBpbnRvIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIGtlcm5lbCYjMzk7cyBtb2R1bGUgbG9hZGluZyBtZWNoYW5pc20uIExldCYjMzk7cyBzZWUgd2hhdCYjMzk7cyBpbiB0aGVyZS4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgYW55IGhpbnRzIGFib3V0IGhvdyB0aGUgbW9kdWxlJiMzOTtzIGNvZGUgZ2V0cyByZWdpc3RlcmVkIHdpdGggdGhlIGtlcm5lbCwgaG93IHJlc291cmNlcyBhcmUgYWxsb2NhdGVkLCBhbmQgaG93IHRoZSBtb2R1bGUgaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbS4gSSBhbHNvIHdhbnQgdG8gc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGNhbGxlZCBpbnRvLiBJcyBpdCBkb25lIGZyb20gYSBzcGVjaWZpYyBjb250ZXh0PyBEb2VzIGl0IHVzZSBhcmd1bWVudHM/IFRoZSBkZXZpbCBpcyBpbiB0aGUgZGV0YWlscywgc28gSSYjMzk7bGwgYmUgZGlnZ2luZyBpbiB3aXRoIG15IHVzdWFsIHNjcnV0aW55LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtpbml0X21vZHVsZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvbWFpbi5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvbWFpbi5jPTEzMz1zdGF0aWMgY29uc3Qgc3RydWN0IGN0bF90YWJsZSBtb2R1bGVfc3lzY3RsX3RhYmxlW10gPSB7XG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMTUyLVxua2VybmVsL21vZHVsZS9tYWluLmM6MTUzOnN0YXRpYyBpbnQgX19pbml0IGluaXRfbW9kdWxlX3N5c2N0bCh2b2lkKVxua2VybmVsL21vZHVsZS9tYWluLmMtMTU0LXtcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNTgtXG5rZXJuZWwvbW9kdWxlL21haW4uYzoxNTk6c3Vic3lzX2luaXRjYWxsKGluaXRfbW9kdWxlX3N5c2N0bCk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNjAtXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9MjQ5MT1zdGF0aWMgaW50IGNvcHlfbW9kdWxlX2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqdW1vZCwgdW5zaWduZWQgbG9uZyBsZW4sXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMjUxNC1cdGVyciA9IHNlY3VyaXR5X2tlcm5lbF9wb3N0X2xvYWRfZGF0YSgoY2hhciAqKWluZm8tXHUwMDNlaGRyLCBpbmZvLVx1MDAzZWxlbixcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI1MTU6XHRcdFx0XHRcdCAgICAgTE9BRElOR19NT0RVTEUsIFwmIzM0O2luaXRfbW9kdWxlXCYjMzQ7KTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI1MTYtb3V0OlxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTMwODI9bW9kdWxlX3BhcmFtKGFzeW5jX3Byb2JlLCBib29sLCAwNjQ0KTtcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zMDg5LSAqL1xua2VybmVsL21vZHVsZS9tYWluLmM6MzA5MDpzdGF0aWMgbm9pbmxpbmUgaW50IGRvX2luaXRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZClcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTMwOTEte1xuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTMxMjEtXHRcdC8qXG5rZXJuZWwvbW9kdWxlL21haW4uYzozMTIyOlx0XHQgKiAtRUVYSVNUIGlzIHJlc2VydmVkIGJ5IFtmXWluaXRfbW9kdWxlKCkgdG8gc2lnbmFsIHRvIHVzZXJzcGFjZSB0aGF0XG5rZXJuZWwvbW9kdWxlL21haW4uYy0zMTIzLVx0XHQgKiBhIG1vZHVsZSB3aXRoIHRoaXMgbmFtZSBpcyBhbHJlYWR5IGxvYWRlZC4gVXNlIHNvbWV0aGluZyBlbHNlIGlmIHRoZVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTMyMjQtXG5rZXJuZWwvbW9kdWxlL21haW4uYzozMjI1OnN0YXRpYyBpbnQgbWF5X2luaXRfbW9kdWxlKHZvaWQpXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zMjI2LXtcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYz0zNDM1PXN0YXRpYyBpbnQgbG9hZF9tb2R1bGUoc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgY29uc3QgY2hhciBfX3VzZXIgKnVhcmdzLFxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM1OTItXG5rZXJuZWwvbW9kdWxlL21haW4uYzozNTkzOlx0cmV0dXJuIGRvX2luaXRfbW9kdWxlKG1vZCk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0zNTk0LVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM2NDYtXG5rZXJuZWwvbW9kdWxlL21haW4uYzozNjQ3OlNZU0NBTExfREVGSU5FMyhpbml0X21vZHVsZSwgdm9pZCBfX3VzZXIgKiwgdW1vZCxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM2NDgtXHRcdHVuc2lnbmVkIGxvbmcsIGxlbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgdWFyZ3MpXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMzY1Mi1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjM2NTM6XHRlcnIgPSBtYXlfaW5pdF9tb2R1bGUoKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM2NTQtXHRpZiAoZXJyKVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM2NTYtXG5rZXJuZWwvbW9kdWxlL21haW4uYzozNjU3Olx0cHJfZGVidWcoXCYjMzQ7aW5pdF9tb2R1bGU6IHVtb2Q9JXAsIGxlbj0lbHUsIHVhcmdzPSVwXFxuXCYjMzQ7LFxua2VybmVsL21vZHVsZS9tYWluLmMtMzY1OC1cdCAgICAgICB1bW9kLCBsZW4sIHVhcmdzKTtcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYz0zNzQzPXN0YXRpYyBpbnQgaWRlbXBvdGVudF93YWl0X2Zvcl9jb21wbGV0aW9uKHN0cnVjdCBpZGVtcG90ZW50ICp1KVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM3NTMtXG5rZXJuZWwvbW9kdWxlL21haW4uYzozNzU0OnN0YXRpYyBpbnQgaW5pdF9tb2R1bGVfZnJvbV9maWxlKHN0cnVjdCBmaWxlICpmLCBjb25zdCBjaGFyIF9fdXNlciAqIHVhcmdzLCBpbnQgZmxhZ3MpXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zNzU1LXtcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zNzkyLVxua2VybmVsL21vZHVsZS9tYWluLmM6Mzc5MzpzdGF0aWMgaW50IGlkZW1wb3RlbnRfaW5pdF9tb2R1bGUoc3RydWN0IGZpbGUgKmYsIGNvbnN0IGNoYXIgX191c2VyICogdWFyZ3MsIGludCBmbGFncylcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM3OTQte1xuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM4MDEtXHRpZiAoIWlkZW1wb3RlbnQoXHUwMDI2aWRlbSwgZmlsZV9pbm9kZShmKSkpIHtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjM4MDI6XHRcdGludCByZXQgPSBpbml0X21vZHVsZV9mcm9tX2ZpbGUoZiwgdWFyZ3MsIGZsYWdzKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM4MDMtXHRcdHJldHVybiBpZGVtcG90ZW50X2NvbXBsZXRlKFx1MDAyNmlkZW0sIHJldCk7XG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMzgxMS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjM4MTI6U1lTQ0FMTF9ERUZJTkUzKGZpbml0X21vZHVsZSwgaW50LCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgdWFyZ3MsIGludCwgZmxhZ3MpXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zODEzLXtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjM4MTQ6XHRpbnQgZXJyID0gbWF5X2luaXRfbW9kdWxlKCk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0zODE1LVx0aWYgKGVycilcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zODE3LVxua2VybmVsL21vZHVsZS9tYWluLmM6MzgxODpcdHByX2RlYnVnKFwmIzM0O2Zpbml0X21vZHVsZTogZmQ9JWQsIHVhcmdzPSVwLCBmbGFncz0laVxcblwmIzM0OywgZmQsIHVhcmdzLCBmbGFncyk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0zODE5LVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM4MjctXHRcdHJldHVybiAtRUJBREY7XG5rZXJuZWwvbW9kdWxlL21haW4uYzozODI4Olx0cmV0dXJuIGlkZW1wb3RlbnRfaW5pdF9tb2R1bGUoZmRfZmlsZShmKSwgdWFyZ3MsIGZsYWdzKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM4MjktfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjUxMQoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDU1OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBUaG91Z2h0IFByb2Nlc3Mgb24gSWRlbnRpZnlpbmcgRnV6emluZyBUYXJnZXRzKioKCk9rYXksIHNvIEkmIzM5O20gdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgdGhlIHJpZ2h0IGtlcm5lbCBmdW5jdGlvbnMgdG8gdGFyZ2V0IGZvciBmdXp6aW5nLCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBtb2R1bGUgbG9hZGluZyBhbmQgbWVtb3J5IGFsbG9jYXRpb24gdGFnZ2luZy4gSSBpbml0aWFsbHkgdGhvdWdodCBgZG9faW5pdF9tb2R1bGVgIGFuZCBgbG9hZF9tb2R1bGVgIHdlcmUgdGhlIGtleSBlbnRyeSBwb2ludHMsIGJ1dCBhIHF1aWNrIGNoZWNrIHJldmVhbHMgdGhleSBhcmUgYWN0dWFsbHkgKnN0YXRpYyogZnVuY3Rpb25zLCBhbmQgc28gbm90IHRoZSBiZXN0IGNhbmRpZGF0ZXMuCgpNeSBuZXh0IHRob3VnaHQgd2FzIHRvIHVzZSB0aGUgc3lzY2FsbHMgYHN5c19pbml0X21vZHVsZWAgYW5kIGBzeXNfZmluaXRfbW9kdWxlYCBiZWNhdXNlIHRoZXkgYXJlIGVudHJ5IHBvaW50cy4gQW5kIGluZGVlZCwgYHN5c19pbml0X21vZHVsZWAgaXMgZGVmaW5lZCB1c2luZyBgU1lTQ0FMTF9ERUZJTkUzYCwgYW5kIHNvIHRoZSBhY3R1YWwgZnVuY3Rpb24gbmFtZSBpcyBzb21ldGhpbmcgbGlrZSBgX194NjRfc3lzX2luaXRfbW9kdWxlYCwgYnV0IGZvciB0aGUgcHVycG9zZXMgb2Ygc3l6a2FsbGVyLCBgaW5pdF9tb2R1bGVgIGFuZCBgZmluaXRfbW9kdWxlYCAqYXJlKiB0aGUgc3lzY2FsbCBuYW1lcy4gUGVyZmVjdCEKCkhvd2V2ZXIsIEkgbmVlZCB0byBrZWVwIGluIG1pbmQgdGhlIGluc3RydWN0aW9ucy4gVGhleSBlbXBoYXNpemUgdGhlIG5lZWQgdG8gZXh0cmFjdCB2ZXJ5IHNwZWNpZmljIGZ1bmN0aW9ucyBhbmQgYXZvaWQgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMuIFRoZXkgYWxzbyBwcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnRzIG92ZXIgaW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucy4KClNvLCBJIHNob3VsZCBkZWZpbml0ZWx5IGluY29ycG9yYXRlIGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYCBhbmQgYGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNgLiBUaGVzZSBzb3VuZCBsaWtlIHRoZXkmIzM5O3JlIHJpZ2h0IGluIHRoZSBzd2VldCBzcG90IGZvciBmdXp6aW5nLiBJIHNob3VsZCBhbHNvIGJlIHN1cmUgdG8gaW5jbHVkZSBgTUVNX0FMTE9DX1BST0ZJTElOR2AgaW4gYEVuYWJsZUNvbmZpZ3NgLgoKTm93LCBJJiMzOTttIGNoZWNraW5nIG15IHVuZGVyc3RhbmRpbmcgb2YgaG93IGFsbG9jX3RhZyBpcyBpbXBsZW1lbnRlZC4gTGV0IG1lIHZlcmlmeSB0aGUgY29uZGl0aW9ucyBhcm91bmQgYHRhZ3NfYWRkcmVzc2FibGVgIGFuZCBgbWVtX2FsbG9jX3Byb2ZpbGluZ19lbmFibGVkYC4KCkxvb2tpbmcgYXQgYG1tL2FsbG9jX3RhZy5jYCwgSSBzZWUgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgdGhhdCBjYXVnaHQgbXkgYXR0ZW50aW9uLiBJdCB3YXMgb3JpZ2luYWxseSBgaWYgKG1lbV9hbGxvY19wcm9maWxpbmdfZW5hYmxlZCgpICZhbXA7JmFtcDsgIXRhZ3NfYWRkcmVzc2FibGUoKSlgLCBidXQgaGFzIGJlZW4gY2hhbmdlZCB0byBgaWYgKCF0YWdzX2FkZHJlc3NhYmxlKCkpYC4gQW5kLCBnb2luZyBmdXJ0aGVyLCBpdCBsb29rcyBsaWtlIGBsb2FkX21vZHVsZWAgaW4gYG1tL2FsbG9jX3RhZy5jYCAqaXMqIHN0YXRpYyEgQnV0IHdhaXQsIGlzIGl0IGFjdHVhbGx5IGEgY2FsbGJhY2sgZm9yIGNvZGV0YWc/IEdvaW5nIHRocm91Z2ggdGhlIGNvZGUsIEkgc2VlIHRoaXM6CgpgYGBjCglpZiAoIW1lbV9wcm9maWxpbmdfc3VwcG9ydCkKCQlyZXR1cm4gMDsKYGBgCk9rYXksIHNvIHRoZSBgbG9hZF9tb2R1bGVgIGZ1bmN0aW9uIHNlZW1zIHRvIGJlIHBhcnQgb2YgdGhlIGNvZGV0YWcgaW1wbGVtZW50YXRpb24sIGJ1dCBpdCBhbHNvIGhhcyBhIGBtZW1fcHJvZmlsaW5nX3N1cHBvcnRgIHZhcmlhYmxlLiBPa2F5LCBzbyBJIHNob3VsZCBiZSBva2F5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2FsbG9jX3RhZy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTcwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDMwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA5NzA6XHRcdHJldHVybiAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICYjNDM7IG9mZnNldCk7XG4gOTcxOlx0fVxuIDk3MjpcdFxuIDk3MzpcdHN0YXRpYyBpbnQgbG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgY29kZXRhZyAqc3RhcnQsIHN0cnVjdCBjb2RldGFnICpzdG9wKVxuIDk3NDpcdHtcbiA5NzU6XHRcdC8qIEFsbG9jYXRlIG1vZHVsZSBhbGxvY190YWcgcGVyY3B1IGNvdW50ZXJzICovXG4gOTc2Olx0XHRzdHJ1Y3QgYWxsb2NfdGFnICpzdGFydF90YWc7XG4gOTc3Olx0XHRzdHJ1Y3QgYWxsb2NfdGFnICpzdG9wX3RhZztcbiA5Nzg6XHRcdHN0cnVjdCBhbGxvY190YWcgKnRhZztcbiA5Nzk6XHRcbiA5ODA6XHRcdGlmICghbWVtX3Byb2ZpbGluZ19zdXBwb3J0KVxuIDk4MTpcdFx0XHRyZXR1cm4gMDtcbiA5ODI6XHRcbiA5ODM6XHRcdC8qIHBlcmNwdSBjb3VudGVycyBmb3IgY29yZSBhbGxvY2F0aW9ucyBhcmUgYWxyZWFkeSBzdGF0aWNhbGx5IGFsbG9jYXRlZCAqL1xuIDk4NDpcdFx0aWYgKCFtb2QpXG4gOTg1Olx0XHRcdHJldHVybiAwO1xuIDk4NjpcdFxuIDk4NzpcdFx0c3RhcnRfdGFnID0gY3RfdG9fYWxsb2NfdGFnKHN0YXJ0KTtcbiA5ODg6XHRcdHN0b3BfdGFnID0gY3RfdG9fYWxsb2NfdGFnKHN0b3ApO1xuIDk4OTpcdFx0Zm9yICh0YWcgPSBzdGFydF90YWc7IHRhZyBcdTAwM2Mgc3RvcF90YWc7IHRhZyYjNDM7JiM0MzspIHtcbiA5OTA6XHRcdFx0V0FSTl9PTih0YWctXHUwMDNlY291bnRlcnMpO1xuIDk5MTpcdFx0XHR0YWctXHUwMDNlY291bnRlcnMgPSBhbGxvY19wZXJjcHUoc3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyk7XG4gOTkyOlx0XHRcdGlmICghdGFnLVx1MDAzZWNvdW50ZXJzKSB7XG4gOTkzOlx0XHRcdFx0d2hpbGUgKC0tdGFnIFx1MDAzZT0gc3RhcnRfdGFnKSB7XG4gOTk0Olx0XHRcdFx0XHRmcmVlX3BlcmNwdSh0YWctXHUwMDNlY291bnRlcnMpO1xuIDk5NTpcdFx0XHRcdFx0dGFnLVx1MDAzZWNvdW50ZXJzID0gTlVMTDtcbiA5OTY6XHRcdFx0XHR9XG4gOTk3Olx0XHRcdFx0cHJfZXJyKFwmIzM0O0ZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbG9jYXRpb24gdGFnIHBlcmNwdSBjb3VudGVycyBpbiB0aGUgbW9kdWxlICVzXFxuXCYjMzQ7LFxuIDk5ODpcdFx0XHRcdCAgICAgICBtb2QtXHUwMDNlbmFtZSk7XG4gOTk5Olx0XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4MDg2CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogNzcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIE1vZHVsZSBMb2FkaW5nIGFuZCBBbGxvY2F0aW9uIFRhZ2dpbmcqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGBsb2FkX21vZHVsZWAgd2l0aGluIGBtbS9hbGxvY190YWcuY2AsIGFuZCBpdCYjMzk7cyBkZWZpbmVkIGFzIGEgc3RhdGljIGZ1bmN0aW9uLiBUaGF0IGltbWVkaWF0ZWx5IG1ha2VzIG1lIHRoaW5rIGFib3V0IGhvdyBpdCYjMzk7cyBiZWluZyB1c2VkLiBUaGUgbmV4dCBsb2dpY2FsIHN0ZXAgaXMgdG8gY2hlY2sgaG93IGBhbGxvY190YWdfaW5pdGAgZml0cyBpbnRvIHRoaXMgcGljdHVyZS4gQWgsIHJpZ2h0LCBgYWxsb2NfdGFnX2luaXRgIHJlZ2lzdGVycyBgbG9hZF9tb2R1bGVgIGFzIGEgYC5sb2FkYCBjYWxsYmFjay4gTm93IGl0IGNsaWNrcyDigJMgYGNvZGV0YWdfbG9hZF9tb2R1bGVgIG11c3QgYmUgdGhlIGZ1bmN0aW9uIHRoYXQgKmNhbGxzKiB0aGlzIGAubG9hZGAgY2FsbGJhY2ssIHdoaWNoIGlzIGBsb2FkX21vZHVsZWAgaW4gb3VyIHNwZWNpZmljIGNhc2UuIFRvIGNvbmZpcm0gdGhhdCBjaGFpbiBvZiBjYWxscywgYW5kIGp1c3QgbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgZnVsbCBjb250ZXh0IGhlcmUsIEkgc2hvdWxkIGdvIGFuZCBleGFtaW5lIGBjb2RldGFnX2xvYWRfbW9kdWxlYCBpdHNlbGYuIEkmIzM5O2xsIGZpbmQgdGhhdCBpbiBgbGliL2NvZGV0YWcuY2AuIExldCYjMzk7cyBzZWUgd2hhdCYjMzk7cyBoYXBwZW5pbmcgdGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvZGV0YWdfbG9hZF9tb2R1bGUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtsaWIvY29kZXRhZy5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2xpYi9jb2RldGFnLmM9MzIyPXZvaWQgY29kZXRhZ19tb2R1bGVfcmVwbGFjZWQoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbW9kdWxlICpuZXdfbW9kKVxuLS1cbmxpYi9jb2RldGFnLmMtMzM3LVxubGliL2NvZGV0YWcuYzozMzg6aW50IGNvZGV0YWdfbG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kKVxubGliL2NvZGV0YWcuYy0zMzkte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODQ4NgoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDIzOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiBNb2R1bGUgTG9hZGluZyBDaGFuZ2VzKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGVzZSBjaGFuZ2VzIGFuZCBpdCBzZWVtcyBsaWtlIHdlJiMzOTtyZSBhZGRyZXNzaW5nIHNvbWUgcmV0cmllcyBhbmQgY29uZGl0aW9uYWwgYmVoYXZpb3IgcmVsYXRlZCB0byBtb2R1bGUgbG9hZGluZyBhbmQgbWVtb3J5IGFsbG9jYXRpb24uIEZpcnN0LCBJIG5vdGljZWQgYGNvZGV0YWdfbG9hZF9tb2R1bGVgIGlzIG5vbi1zdGF0aWMsIHdoaWNoIGlzIGludGVyZXN0aW5nLiBJJiMzOTtsbCBuZWVkIHRvIHJlbWVtYmVyIHRoYXQuIEdpdmVuIHRoYXQgaXQmIzM5O3Mgbm9uLXN0YXRpYywgSSBzaG91bGQgYWRkIGl0IHRvIHRoZSBgRm9jdXNTeW1ib2xzYCBsaXN0LgoKTm93LCBsZXQmIzM5O3MgYnJlYWsgZG93biB0aGUgYWN0dWFsIGNvZGUgbW9kaWZpY2F0aW9uczoKCjEuICBJbiBga2VybmVsL21vZHVsZS9tYWluLmNgLCB0aGUgYGxheW91dF9hbmRfYWxsb2NhdGVgIGZ1bmN0aW9uIGlzIGJlaW5nIHVwZGF0ZWQgdG8gcmV0cnkgaWYgYG1vdmVfbW9kdWxlYCByZXR1cm5zIGAtRUFHQUlOYC4gVGhpcyBzdWdnZXN0cyB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIGEgcmVzb3VyY2UgY29udGVudGlvbiBpc3N1ZSBkdXJpbmcgbW9kdWxlIHJlbG9jYXRpb24gb3IgYWxsb2NhdGlvbiwgYW5kIGEgcmV0cnkgbWVjaGFuaXNtIGlzIGJlaW5nIHB1dCBpbiBwbGFjZSB0byBoYW5kbGUgdHJhbnNpZW50IGZhaWx1cmVzLiBJdCBzZWVtcyBsaWtlIGEgc2Vuc2libGUgYWRkaXRpb24gdG8gaW1wcm92ZSByb2J1c3RuZXNzLgoKMi4gIGBtbS9hbGxvY190YWcuY2Agbm93IGhhcyBgcmVzZXJ2ZV9tb2R1bGVfdGFnc2AgcmV0dXJuaW5nIGAtRUFHQUlOYCBpZiBgIXRhZ3NfYWRkcmVzc2FibGUoKWAuIFRoaXMgaW1wbGllcyB0aGF0IHRoZSBtZW1vcnkgdGFnZ2luZyBmdW5jdGlvbmFsaXR5IG1pZ2h0IG5vdCBiZSBhdmFpbGFibGUgaW4gc29tZSBzaXR1YXRpb25zLCBhbmQgdGhlIGZ1bmN0aW9uIG5vdyBleHBsaWNpdGx5IHNpZ25hbHMgdGhpcyBjb25kaXRpb24gYXMgYSB0ZW1wb3JhcnkgZmFpbHVyZSwgYWxsb3dpbmcgZm9yIHJldHJpZXMuCgozLiAgQWxzbyBpbiBgbW0vYWxsb2NfdGFnLmNgLCBgbG9hZF9tb2R1bGVgIG5vdyByZXR1cm5zIDAgaWYgYCFtZW1fcHJvZmlsaW5nX3N1cHBvcnRgLiBTbywgdGhlIG1vZHVsZSBsb2FkIHN1Y2NlZWRzICp3aXRob3V0KiBwcm9maWxpbmcgc3VwcG9ydD8gVGhpcyBzZWVtcyBsaWtlIGEgZ3JhY2VmdWwgZmFsbGJhY2ssIGluZGljYXRpbmcgdGhlIHN5c3RlbSBjYW4gY29udGludWUgb3BlcmF0aW5nLCBhbGJlaXQgd2l0aCByZWR1Y2VkIGZ1bmN0aW9uYWxpdHkuCgo0LiAgRmluYWxseSwgYHJlbGVhc2VfbW9kdWxlX3RhZ3NgIGluIGBtbS9hbGxvY190YWcuY2AgaGFzIGJlZW4gYWRqdXN0ZWQgdG8gaGFuZGxlIHRoZSBgIXVzZWRgIGNhc2UuIFRoaXMgaXMgYSBkZWZlbnNpdmUgcHJvZ3JhbW1pbmcgbWVhc3VyZSwgYWRkcmVzc2luZyBwb3RlbnRpYWwgZWRnZSBjYXNlcyB3aGVyZSB0aGUgbW9kdWxlIHRhZ3MgbWlnaHQgYmUgcmVsZWFzZWQgcHJlbWF0dXJlbHkgb3IgaW4gYW4gdW5leHBlY3RlZCBzdGF0ZS4gVGhpcyBzaG93cyBjYXJlZnVsIGF0dGVudGlvbiB0byBkZXRhaWwuCgpUaGUgb3ZlcmFsbCBjb250ZXh0IGhlcmUgaXMgdGhhdCB0aGVzZSBjaGFuZ2VzIGFyZSBkcml2ZW4gYnkgdGhlIGBNRU1fQUxMT0NfUFJPRklMSU5HYCBjb25maWcgb3B0aW9uLiBJJiMzOTt2ZSBub3RlZCB0aGF0IGBGb2N1c1N5bWJvbHNgIHNob3VsZCBpbmNsdWRlIGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYCwgYGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNgLCBhbmQgYGNvZGV0YWdfbG9hZF9tb2R1bGVgLCBhcyBleHBlY3RlZC4gV2FpdC4uLiBgY29kZXRhZ191bmxvYWRfbW9kdWxlYCBpcyBpbiB0aGUgRm9jdXNTeW1ib2xzIGxpc3QgYXMgd2VsbD8gSSBiZXR0ZXIgZG91YmxlLWNoZWNrIHRoYXQgb25lIGZvciBhbnkgZnVydGhlciBpbXBsaWNhdGlvbnMgaW4gdGhlIGNvZGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvZGV0YWdfdW5sb2FkX21vZHVsZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2xpYi9jb2RldGFnLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bGliL2NvZGV0YWcuYz0zMzg9aW50IGNvZGV0YWdfbG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kKVxuLS1cbmxpYi9jb2RldGFnLmMtMzU2LVxubGliL2NvZGV0YWcuYzozNTc6dm9pZCBjb2RldGFnX3VubG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kKVxubGliL2NvZGV0YWcuYy0zNTgte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTMzNQoJCQkJCQkJb3V0cHV0OiAxNjYKCQkJCQkJCXRob3VnaHRzOiA0NzgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBNb2R1bGUgTG9hZGluZyBMb2dpYyBhbmQgTWVtb3J5IEFsbG9jYXRpb24gUHJvZmlsaW5nKioKCk9rYXksIHNvIGBjb2RldGFnX3VubG9hZF9tb2R1bGVgIGlzIGRlZmluaXRlbHkgcHJlc2VudCwgdGhhdCYjMzk7cyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIE5vdywgSSBuZWVkIHRvIGNoZWNrIHRoZSBkZXBlbmRlbmNpZXMgZm9yIGBNRU1fQUxMT0NfUFJPRklMSU5HYCB0byBlbnN1cmUgZXZlcnl0aGluZyBpcyBpbiBwbGFjZS4gTG9va2luZyBhdCBgbW0vS2NvbmZpZy5kZWJ1Z2AsIGl0IGRlcGVuZHMgb24gYE1NVWAsIGBQUk9DX0ZTYCwgYW5kIGAhREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVYCwgYW5kIHNlbGVjdHMgYENPREVfVEFHR0lOR2AsIGBQQUdFX0VYVEVOU0lPTmAsIGFuZCBgU0xBQl9PQkpfRVhUYC4gVGhvc2UgYWxsIHNlZW0gcmVhc29uYWJsZTsgYE1NVWAgYW5kIGBQUk9DX0ZTYCBhcmUgcHJldHR5IHN0YW5kYXJkLCBhbmQgdGhlIGAhREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVYCBkZXBlbmRlbmN5IGlzIGZpbmUuIFNvLCBgTUVNX0FMTE9DX1BST0ZJTElOR2AgbG9va3MgdG8gYmUgYSBzZWxmLWNvbnRhaW5lZCBmZWF0dXJlLgoKTGV0IG1lIHJlY2FwIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIHBhdGNoJiMzOTtzIHB1cnBvc2UuIEl0JiMzOTtzIGhhbmRsaW5nIGEgc3BlY2lmaWMgc2l0dWF0aW9uOiB3aGVuIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBleGhhdXN0cyB0aGUgYXZhaWxhYmxlIHBhZ2UgZmxhZyBiaXRzIChgIXRhZ3NfYWRkcmVzc2FibGUoKWApLiBUaGUgZml4IGludHJvZHVjZXMgYSByZXRyeSBpbiBgbGF5b3V0X2FuZF9hbGxvY2F0ZSgpYCwgd2hpY2ggcmVzZXRzIHRoZSBtb2R1bGUgc3RhdGUgYW5kIHJldHJpZXMgdGhlIG1vZHVsZSBsb2FkIHdpdGhvdXQgbWVtb3J5IHByb2ZpbGluZy4gVGhpcyBjaGFuZ2UgaXMgZGlyZWN0bHkgYWZmZWN0aW5nIHRoZSBjb3JlIG1vZHVsZSBsb2FkaW5nIHBhdGggYW5kIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiB0YWdnaW5nIHN5c3RlbSwgd2hpY2ggdXNlcnNwYWNlIGludGVyYWN0cyB3aXRoIHZpYSBgaW5pdF9tb2R1bGVgIGFuZCBgZmluaXRfbW9kdWxlYCBzeXNjYWxscy4gVGhpcyBtYWtlcyB0aGlzIGFuIGludGVyZXN0aW5nIHRhcmdldCBmb3IgdGVzdGluZy4KClRoZSBrZXkgc3ltYm9scyB0byBmb2N1cyBvbiBhcmUgYGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25gLCBgY29kZXRhZ19mcmVlX21vZHVsZV9zZWN0aW9uc2AsIGBjb2RldGFnX2xvYWRfbW9kdWxlYCwgYW5kLCBvZiBjb3Vyc2UsIGBjb2RldGFnX3VubG9hZF9tb2R1bGVgLiBUaGUgcHJpbWFyeSBjb25maWd1cmF0aW9uIEkgbmVlZCB0byBiZSBjb25jZXJuZWQgd2l0aCBpcyBgTUVNX0FMTE9DX1BST0ZJTElOR2AuIGBNT0RVTEVTYCBpcyBhbiBvYnZpb3VzIHByZXJlcXVpc2l0ZSwgYnV0IHRoYXQmIzM5O3MgYSBiYXNlbGluZSByZXF1aXJlbWVudCBmb3IgYW55IG1vZHVsZSB3b3JrLgoKSSYjMzk7bGwgZG91YmxlIGNoZWNrIHRoYXQgYGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25gIGlzbiYjMzk7dCBzdGF0aWMuIEl0JiMzOTtzIG5vdCwgd2hpY2ggaXMgZXhhY3RseSB3aGF0IEkgd2FzIGhvcGluZyBmb3IuIFRoYXQgbWVhbnMgc3l6a2FsbGVyIHNob3VsZCBiZSBhYmxlIHRvIGRpcmVjdGx5IHRhcmdldCBpdCBpZiBpdCYjMzk7cyBpbiB0aGUga2VybmVsIGltYWdlLgoKRmluYWxseSwgSSBuZWVkIHRvIGVuc3VyZSB0aGF0IG5vIG90aGVyIG5vbi1zdGF0aWMgZnVuY3Rpb25zIHdlcmUgYWRkZWQgb3IgbW9kaWZpZWQuIEl0IHNlZW1zIHRoYXQgb25seSBzdGF0aWMgZnVuY3Rpb25zIGluIGBtbS9hbGxvY190YWcuY2AgYW5kIGBrZXJuZWwvbW9kdWxlL21haW4uY2Agd2VyZSBjaGFuZ2VkLCBidXQgdGhvc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgYnkgdGhlIGBjb2RldGFnXypgIGZ1bmN0aW9ucyBJIGlkZW50aWZpZWQsIHNvIHRoYXQgc2VlbXMgb2suCgpJIGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGZvcm11bGF0ZSB0aGUgc2V0LXJlc3VsdHMgY2FsbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01FTV9BTExPQ19QUk9GSUxJTkcmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uJiMzNDssCiAgICAmIzM0O2NvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnMmIzM0OywKICAgICYjMzQ7Y29kZXRhZ19sb2FkX21vZHVsZSYjMzQ7LAogICAgJiMzNDtjb2RldGFnX3VubG9hZF9tb2R1bGUmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGNvcmUgbW9kdWxlIGxvYWRpbmcgbG9naWMgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBydW5zIG91dCBvZiBwYWdlIGZsYWcgYml0cyAoIXRhZ3NfYWRkcmVzc2FibGUoKSkuIEl0IGludHJvZHVjZXMgYSByZXRyeSBtZWNoYW5pc20gaW4gbGF5b3V0X2FuZF9hbGxvY2F0ZSgpIHRoYXQgcmVzZXRzIHRoZSBtb2R1bGUgc3RhdGUgYW5kIHJldHJpZXMgbG9hZGluZyB3aXRob3V0IG1lbW9yeSBwcm9maWxpbmcuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBtb2R1bGUgbG9hZGluZyBwYXRoIGFuZCBtZW1vcnkgYWxsb2NhdGlvbiB0YWdnaW5nIHN1YnN5c3RlbSwgd2hpY2ggaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBpbml0X21vZHVsZSBhbmQgZmluaXRfbW9kdWxlIHN5c2NhbGxzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNRU1fQUxMT0NfUFJPRklMSU5HJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Y29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbiYjMzQ7LAogICAgJiMzNDtjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zJiMzNDssCiAgICAmIzM0O2NvZGV0YWdfbG9hZF9tb2R1bGUmIzM0OywKICAgICYjMzQ7Y29kZXRhZ191bmxvYWRfbW9kdWxlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBjb3JlIG1vZHVsZSBsb2FkaW5nIGxvZ2ljIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgcnVucyBvdXQgb2YgcGFnZSBmbGFnIGJpdHMgKCF0YWdzX2FkZHJlc3NhYmxlKCkpLiBJdCBpbnRyb2R1Y2VzIGEgcmV0cnkgbWVjaGFuaXNtIGluIGxheW91dF9hbmRfYWxsb2NhdGUoKSB0aGF0IHJlc2V0cyB0aGUgbW9kdWxlIHN0YXRlIGFuZCByZXRyaWVzIGxvYWRpbmcgd2l0aG91dCBtZW1vcnkgcHJvZmlsaW5nLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgbW9kdWxlIGxvYWRpbmcgcGF0aCBhbmQgbWVtb3J5IGFsbG9jYXRpb24gdGFnZ2luZyBzdWJzeXN0ZW0sIHdoaWNoIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgaW5pdF9tb2R1bGUgYW5kIGZpbml0X21vZHVsZSBzeXNjYWxscy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDI8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4ybTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgbW9kdWxlIGxvYWRpbmcgcHJvY2VzcyB0byBoYW5kbGUgY2FzZXMgd2hlcmUgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHRhZ3MgZXhjZWVkIGF2YWlsYWJsZSBwYWdlIGZsYWcgYml0cy4gSXQgaW50cm9kdWNlcyBhIHJldHJ5IG1lY2hhbmlzbSBpbiBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAgdGhhdCByZXNldHMgc2VjdGlvbiBoZWFkZXJzIGFuZCBzaXplcywgYW5kIHJldHJpZXMgdGhlIGFsbG9jYXRpb24gd2l0aG91dCBwcm9maWxpbmcuIFRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBtb2R1bGVzIGlzIGV4cGxpY2l0bHkgemVyb2VkIGJ5IGBtb2R1bGVfbWVtb3J5X2FsbG9jYCAodmlhIGBtZW1zZXQocHRyLCAwLCBzaXplKWApLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIGFueSBuZXcgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlcnNwYWNlLCBub3IgZG8gdGhleSBhZGQgY29tcGxleCBjb25kaXRpb25hbCBsb2dpYyBkZXBlbmRpbmcgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggKGUuZy4sIGluY29ycmVjdCBzaXplIGNhbGN1bGF0aW9ucywgbWVtb3J5IGxlYWtzLCBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIGR1cmluZyBzZWN0aW9uIGNvcHlpbmcpIHdvdWxkIGJlIHJlbGlhYmx5IGNhdWdodCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyB0b29scy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgbmVjZXNzaXRhdGUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA2ZjlmZjVjZTM1NGM1NGIyZjZmNzVkOTJmYjU2ZTI3Y2NhOTdmZDcwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBBdWcgMTAgMTA6Mzg6MTQgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9rZXJuZWwvbW9kdWxlL21haW4uYyBiL2tlcm5lbC9tb2R1bGUvbWFpbi5jCmluZGV4IDQ2ZGQ4ZDI1YTYwNTguLmMzMmJiNDdhNTczYTEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tb2R1bGUvbWFpbi5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9tb2R1bGUvbWFpbi5jCkBAIC0yOTcxLDEzICYjNDM7Mjk3MSwyNiBAQCBzdGF0aWMgc3RydWN0IG1vZHVsZSAqbGF5b3V0X2FuZF9hbGxvY2F0ZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpCiAJICogdGhpcyBpcyBkb25lIGdlbmVyaWNhbGx5OyB0aGVyZSBkb2VzbiYjMzk7dCBhcHBlYXIgdG8gYmUgYW55CiAJICogc3BlY2lhbCBjYXNlcyBmb3IgdGhlIGFyY2hpdGVjdHVyZXMuCiAJICovCiYjNDM7cmV0cnk6CiAJbGF5b3V0X3NlY3Rpb25zKGluZm8tJmd0O21vZCwgaW5mbyk7CiAJbGF5b3V0X3N5bXRhYihpbmZvLSZndDttb2QsIGluZm8pOwogCiAJLyogQWxsb2NhdGUgYW5kIG1vdmUgdG8gdGhlIGZpbmFsIHBsYWNlICovCiAJZXJyID0gbW92ZV9tb2R1bGUoaW5mby0mZ3Q7bW9kLCBpbmZvKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gRVJSX1BUUihlcnIpOwomIzQzOwlpZiAoZXJyKSB7CiYjNDM7CQlpZiAoZXJyICE9IC1FQUdBSU4pCiYjNDM7CQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKJiM0MzsJCS8qCiYjNDM7CQkgKiAtRUFHQUlOIG1lYW5zIHByb2ZpbGluZyB3YXMgZGlzYWJsZWQgYnV0IHRoZSBtb2R1bGUKJiM0MzsJCSAqIGNhbiBzdGlsbCBsb2FkIHdpdGhvdXQgaXQuIFJlc2V0IHN0YXRlIGFuZCByZXRyeS4KJiM0MzsJCSAqLwomIzQzOwkJcmV3cml0ZV9zZWN0aW9uX2hlYWRlcnMoaW5mbywgZmxhZ3MpOwomIzQzOwkJZm9yX2VhY2hfbW9kX21lbV90eXBlKHR5cGUpCiYjNDM7CQkJaW5mby0mZ3Q7bW9kLSZndDttZW1bdHlwZV0uc2l6ZSA9IDA7CiYjNDM7CQlpbmZvLSZndDtzZWNoZHJzW2luZm8tJmd0O2luZGV4LnN5bV0uc2hfZmxhZ3MgJmFtcDs9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7CiYjNDM7CQlpbmZvLSZndDtzZWNoZHJzW2luZm8tJmd0O2luZGV4LnN0cl0uc2hfZmxhZ3MgJmFtcDs9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7CiYjNDM7CQlnb3RvIHJldHJ5OwomIzQzOwl9CiAKIAkvKiBNb2R1bGUgaGFzIGJlZW4gY29waWVkIHRvIGl0cyBmaW5hbCBwbGFjZSBub3c6IHJldHVybiBpdC4gKi8KIAltb2QgPSAodm9pZCAqKWluZm8tJmd0O3NlY2hkcnNbaW5mby0mZ3Q7aW5kZXgubW9kXS5zaF9hZGRyOwpkaWZmIC0tZ2l0IGEvbW0vYWxsb2NfdGFnLmMgYi9tbS9hbGxvY190YWcuYwppbmRleCA1MmFlY2UyN2IwMGUwLi4zZWJhNjMzMTE3NGRhIDEwMDY0NAotLS0gYS9tbS9hbGxvY190YWcuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9hbGxvY190YWcuYwpAQCAtODM1LDYgJiM0Mzs4MzUsNTIgQEAgc3RhdGljIGludCB2bV9tb2R1bGVfdGFnc19wb3B1bGF0ZSh2b2lkKQogCXJldHVybiAwOwogfQogCiYjNDM7c3RhdGljIHZvaWQgcmVsZWFzZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIGJvb2wgdXNlZCkKJiM0Mzt7CiYjNDM7CU1BX1NUQVRFKG1hcywgJmFtcDttb2RfYXJlYV9tdCwgbW9kdWxlX3RhZ3Muc2l6ZSwgbW9kdWxlX3RhZ3Muc2l6ZSk7CiYjNDM7CXN0cnVjdCBhbGxvY190YWcgKnN0YXJ0X3RhZzsKJiM0MzsJc3RydWN0IGFsbG9jX3RhZyAqZW5kX3RhZzsKJiM0MzsJc3RydWN0IG1vZHVsZSAqdmFsOwomIzQzOwomIzQzOwltYXNfbG9jaygmYW1wO21hcyk7CiYjNDM7CW1hc19mb3JfZWFjaF9yZXYoJmFtcDttYXMsIHZhbCwgMCkKJiM0MzsJCWlmICh2YWwgPT0gbW9kKQomIzQzOwkJCWJyZWFrOwomIzQzOwomIzQzOwlpZiAoIXZhbCkgLyogbW9kdWxlIG5vdCBmb3VuZCAqLwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmICghdXNlZCkKJiM0MzsJCWdvdG8gcmVsZWFzZV9hcmVhOwomIzQzOwomIzQzOwlzdGFydF90YWcgPSAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICYjNDM7IG1hcy5pbmRleCk7CiYjNDM7CWVuZF90YWcgPSAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICYjNDM7IG1hcy5sYXN0KTsKJiM0MzsJaWYgKCFjbGVhbl91bnVzZWRfY291bnRlcnMoc3RhcnRfdGFnLCBlbmRfdGFnKSkgewomIzQzOwkJc3RydWN0IGFsbG9jX3RhZyAqdGFnOwomIzQzOwomIzQzOwkJZm9yICh0YWcgPSBzdGFydF90YWc7IHRhZyAmbHQ7PSBlbmRfdGFnOyB0YWcmIzQzOyYjNDM7KSB7CiYjNDM7CQkJc3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyBjb3VudGVyOwomIzQzOwomIzQzOwkJCWlmICghdGFnLSZndDtjb3VudGVycykKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CiYjNDM7CQkJY291bnRlciA9IGFsbG9jX3RhZ19yZWFkKHRhZyk7CiYjNDM7CQkJcHJfaW5mbygmIzM0OyVzOiV1IG1vZHVsZSAlcyBmdW5jOiVzIGhhcyAlbGx1IGFsbG9jYXRlZCBhdCBtb2R1bGUgdW5sb2FkXG4mIzM0OywKJiM0MzsJCQkJdGFnLSZndDtjdC5maWxlbmFtZSwgdGFnLSZndDtjdC5saW5lbm8sIHRhZy0mZ3Q7Y3QubW9kbmFtZSwKJiM0MzsJCQkJdGFnLSZndDtjdC5mdW5jdGlvbiwgY291bnRlci5ieXRlcyk7CiYjNDM7CQl9CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQl1c2VkID0gZmFsc2U7CiYjNDM7CX0KJiM0MztyZWxlYXNlX2FyZWE6CiYjNDM7CW1hc19zdG9yZSgmYW1wO21hcywgdXNlZCA/ICZhbXA7dW5sb2FkZWRfbW9kIDogTlVMTCk7CiYjNDM7CXZhbCA9IG1hc19wcmV2X3JhbmdlKCZhbXA7bWFzLCAwKTsKJiM0MzsJaWYgKHZhbCA9PSAmYW1wO3ByZXBlbmRfbW9kKQomIzQzOwkJbWFzX3N0b3JlKCZhbXA7bWFzLCBOVUxMKTsKJiM0MztvdXQ6CiYjNDM7CW1hc191bmxvY2soJmFtcDttYXMpOwomIzQzO30KJiM0MzsKIHN0YXRpYyB2b2lkICpyZXNlcnZlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJCSB1bnNpZ25lZCBpbnQgcHJlcGVuZCwgdW5zaWduZWQgbG9uZyBhbGlnbikKIHsKQEAgLTkwNCwxMCAmIzQzOzk1MCwxMiBAQCBzdGF0aWMgdm9pZCAqcmVzZXJ2ZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJaW50IGdyb3dfcmVzOwogCiAJCW1vZHVsZV90YWdzLnNpemUgPSBvZmZzZXQgJiM0Mzsgc2l6ZTsKLQkJaWYgKG1lbV9hbGxvY19wcm9maWxpbmdfZW5hYmxlZCgpICZhbXA7JmFtcDsgIXRhZ3NfYWRkcmVzc2FibGUoKSkgewomIzQzOwkJaWYgKCF0YWdzX2FkZHJlc3NhYmxlKCkpIHsKIAkJCXNodXRkb3duX21lbV9wcm9maWxpbmcodHJ1ZSk7Ci0JCQlwcl93YXJuKCYjMzQ7V2l0aCBtb2R1bGUgJXMgdGhlcmUgYXJlIHRvbyBtYW55IHRhZ3MgdG8gZml0IGluICVkIHBhZ2UgZmxhZyBiaXRzLiBNZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgaXMgZGlzYWJsZWQhXG4mIzM0OywKLQkJCQltb2QtJmd0O25hbWUsIE5SX1VOVVNFRF9QQUdFRkxBR19CSVRTKTsKJiM0MzsJCQlwcl93YXJuX29uY2UoJiMzNDtXaXRoIG1vZHVsZSAlcyB0aGVyZSBhcmUgdG9vIG1hbnkgdGFncyB0byBmaXQgaW4gJWQgcGFnZSBmbGFnIGJpdHMuIE1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBpcyBkaXNhYmxlZCFcbiYjMzQ7LAomIzQzOwkJCQkgICAgIG1vZC0mZ3Q7bmFtZSwgTlJfVU5VU0VEX1BBR0VGTEFHX0JJVFMpOwomIzQzOwkJCXJlbGVhc2VfbW9kdWxlX3RhZ3MobW9kLCBmYWxzZSk7CiYjNDM7CQkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CiAJCX0KIAogCQlncm93X3JlcyA9IHZtX21vZHVsZV90YWdzX3BvcHVsYXRlKCk7CkBAIC05MjIsNTIgJiM0Mzs5NzAsNiBAQCBzdGF0aWMgdm9pZCAqcmVzZXJ2ZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAlyZXR1cm4gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciAmIzQzOyBvZmZzZXQpOwogfQogCi1zdGF0aWMgdm9pZCByZWxlYXNlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgYm9vbCB1c2VkKQotewotCU1BX1NUQVRFKG1hcywgJmFtcDttb2RfYXJlYV9tdCwgbW9kdWxlX3RhZ3Muc2l6ZSwgbW9kdWxlX3RhZ3Muc2l6ZSk7Ci0Jc3RydWN0IGFsbG9jX3RhZyAqc3RhcnRfdGFnOwotCXN0cnVjdCBhbGxvY190YWcgKmVuZF90YWc7Ci0Jc3RydWN0IG1vZHVsZSAqdmFsOwotCi0JbWFzX2xvY2soJmFtcDttYXMpOwotCW1hc19mb3JfZWFjaF9yZXYoJmFtcDttYXMsIHZhbCwgMCkKLQkJaWYgKHZhbCA9PSBtb2QpCi0JCQlicmVhazsKLQotCWlmICghdmFsKSAvKiBtb2R1bGUgbm90IGZvdW5kICovCi0JCWdvdG8gb3V0OwotCi0JaWYgKCF1c2VkKQotCQlnb3RvIHJlbGVhc2VfYXJlYTsKLQotCXN0YXJ0X3RhZyA9IChzdHJ1Y3QgYWxsb2NfdGFnICopKG1vZHVsZV90YWdzLnN0YXJ0X2FkZHIgJiM0MzsgbWFzLmluZGV4KTsKLQllbmRfdGFnID0gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciAmIzQzOyBtYXMubGFzdCk7Ci0JaWYgKCFjbGVhbl91bnVzZWRfY291bnRlcnMoc3RhcnRfdGFnLCBlbmRfdGFnKSkgewotCQlzdHJ1Y3QgYWxsb2NfdGFnICp0YWc7Ci0KLQkJZm9yICh0YWcgPSBzdGFydF90YWc7IHRhZyAmbHQ7PSBlbmRfdGFnOyB0YWcmIzQzOyYjNDM7KSB7Ci0JCQlzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzIGNvdW50ZXI7Ci0KLQkJCWlmICghdGFnLSZndDtjb3VudGVycykKLQkJCQljb250aW51ZTsKLQotCQkJY291bnRlciA9IGFsbG9jX3RhZ19yZWFkKHRhZyk7Ci0JCQlwcl9pbmZvKCYjMzQ7JXM6JXUgbW9kdWxlICVzIGZ1bmM6JXMgaGFzICVsbHUgYWxsb2NhdGVkIGF0IG1vZHVsZSB1bmxvYWRcbiYjMzQ7LAotCQkJCXRhZy0mZ3Q7Y3QuZmlsZW5hbWUsIHRhZy0mZ3Q7Y3QubGluZW5vLCB0YWctJmd0O2N0Lm1vZG5hbWUsCi0JCQkJdGFnLSZndDtjdC5mdW5jdGlvbiwgY291bnRlci5ieXRlcyk7Ci0JCX0KLQl9IGVsc2UgewotCQl1c2VkID0gZmFsc2U7Ci0JfQotcmVsZWFzZV9hcmVhOgotCW1hc19zdG9yZSgmYW1wO21hcywgdXNlZCA/ICZhbXA7dW5sb2FkZWRfbW9kIDogTlVMTCk7Ci0JdmFsID0gbWFzX3ByZXZfcmFuZ2UoJmFtcDttYXMsIDApOwotCWlmICh2YWwgPT0gJmFtcDtwcmVwZW5kX21vZCkKLQkJbWFzX3N0b3JlKCZhbXA7bWFzLCBOVUxMKTsKLW91dDoKLQltYXNfdW5sb2NrKCZhbXA7bWFzKTsKLX0KLQogc3RhdGljIGludCBsb2FkX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBjb2RldGFnICpzdGFydCwgc3RydWN0IGNvZGV0YWcgKnN0b3ApCiB7CiAJLyogQWxsb2NhdGUgbW9kdWxlIGFsbG9jX3RhZyBwZXJjcHUgY291bnRlcnMgKi8KQEAgLTk3NSw2ICYjNDM7OTc3LDkgQEAgc3RhdGljIGludCBsb2FkX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBjb2RldGFnICpzdGFydCwgc3RydWN0IGNvZGV0YWcKIAlzdHJ1Y3QgYWxsb2NfdGFnICpzdG9wX3RhZzsKIAlzdHJ1Y3QgYWxsb2NfdGFnICp0YWc7CiAKJiM0MzsJaWYgKCFtZW1fcHJvZmlsaW5nX3N1cHBvcnQpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKIAkvKiBwZXJjcHUgY291bnRlcnMgZm9yIGNvcmUgYWxsb2NhdGlvbnMgYXJlIGFscmVhZHkgc3RhdGljYWxseSBhbGxvY2F0ZWQgKi8KIAlpZiAoIW1vZCkKIAkJcmV0dXJuIDA7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNzcxCgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogNTA2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIEtlcm5lbCBNb2R1bGUgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggdGhhdCB0d2Vha3MgaG93IGtlcm5lbCBtb2R1bGVzIGFyZSBsb2FkZWQuIEl0JiMzOTtzIHRvdWNoaW5nIGBrZXJuZWwvbW9kdWxlL21haW4uY2AgYW5kIGBtbS9hbGxvY190YWcuY2AsIHdoaWNoIGltbWVkaWF0ZWx5IGZsYWdzIG15IGF0dGVudGlvbi4gU3BlY2lmaWNhbGx5LCB0aGUgcmV0cnkgbG9vcCBhZGRlZCBpbiBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAgd2l0aGluIGBrZXJuZWwvbW9kdWxlL21haW4uY2AgaXMgdGhlIGtleSBwb2ludC4gSWYgYG1vdmVfbW9kdWxlYCByZXR1cm5zIGAtRUFHQUlOYCwgaXQmIzM5O3MgcmVzZXR0aW5nIHNvbWUgbW9kdWxlIHN0YXRlIGFuZCB0cnlpbmcgYWdhaW4uIFRoaXMgc2NyZWFtcyAmIzM0O3BvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UsJiMzNDsgYW5kIEkmIzM5O20ga2VlbiB0byBpbnZlc3RpZ2F0ZSB0aGF0LgoKSW4gYG1tL2FsbG9jX3RhZy5jYCwgdGhleSYjMzk7dmUgbW92ZWQgYHJlbGVhc2VfbW9kdWxlX3RhZ3NgIGFuZCBjaGFuZ2VkIGByZXNlcnZlX21vZHVsZV90YWdzYCB0byByZXR1cm4gYEVSUl9QVFIoLUVBR0FJTilgIGlmIGAhdGFnc19hZGRyZXNzYWJsZSgpYC4gVGhleSYjMzk7dmUgYWxzbyBhZGRlZCBhIGNoZWNrIGZvciBgIW1lbV9wcm9maWxpbmdfc3VwcG9ydGAgaW4gYGxvYWRfbW9kdWxlYC4gVGhlc2UgY2hhbmdlcyBhcmUgaW50ZXJlc3RpbmcgYnV0IHRoZSByZXRyeSBsb29wIGlzIG15IHByaW1hcnkgY29uY2Vybi4KCkxldCYjMzk7cyBkaXZlIGludG8gdGhhdCByZXRyeSBsb29wIGluIGBsYXlvdXRfYW5kX2FsbG9jYXRlYDoKCmBgYGMKcmV0cnk6CglsYXlvdXRfc2VjdGlvbnMoaW5mby0mZ3Q7bW9kLCBpbmZvKTsKCWxheW91dF9zeW10YWIoaW5mby0mZ3Q7bW9kLCBpbmZvKTsKCgkvKiBBbGxvY2F0ZSBhbmQgbW92ZSB0byB0aGUgZmluYWwgcGxhY2UgKi8KCWVyciA9IG1vdmVfbW9kdWxlKGluZm8tJmd0O21vZCwgaW5mbyk7CglpZiAoZXJyKSB7CgkJaWYgKGVyciAhPSAtRUFHQUlOKQoJCQlyZXR1cm4gRVJSX1BUUihlcnIpOwoJCS8qCgkJICogLUVBR0FJTiBtZWFucyBwcm9maWxpbmcgd2FzIGRpc2FibGVkIGJ1dCB0aGUgbW9kdWxlCgkJICogY2FuIHN0aWxsIGxvYWQgd2l0aG91dCBpdC4gUmVzZXQgc3RhdGUgYW5kIHJldHJ5LgoJCSAqLwoJCXJld3JpdGVfc2VjdGlvbl9oZWFkZXJzKGluZm8sIGZsYWdzKTsKCQlmb3JfZWFjaF9tb2RfbWVtX3R5cGUodHlwZSkKCQkJaW5mby0mZ3Q7bW9kLSZndDttZW1bdHlwZV0uc2l6ZSA9IDA7CgkJaW5mby0mZ3Q7c2VjaGRyc1tpbmZvLSZndDtpbmRleC5zeW1dLnNoX2ZsYWdzICZhbXA7PSB+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DOwoJCWluZm8tJmd0O3NlY2hkcnNbaW5mby0mZ3Q7aW5kZXguc3RyXS5zaF9mbGFncyAmYW1wOz0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQzsKCQlnb3RvIHJldHJ5OwoJfQpgYGAKClRoZSB3b3JyeSBpcyB0aGlzOiBgbGF5b3V0X3NlY3Rpb25zYCBhbmQgYGxheW91dF9zeW10YWJgIGNhbGN1bGF0ZSBzaXplcyBhbmQgb2Zmc2V0cy4gSWYgYG1vdmVfbW9kdWxlYCBmYWlscyB3aXRoIGAtRUFHQUlOYCwgdGhlIGNvZGUgemVyb3Mgb3V0IHRoZSBzaXplcywgY2xlYXJzIHRoZSBgU0hGX0FMTE9DYCBmbGFnIGZyb20gc3ltYm9sIGFuZCBzdHJpbmcgdGFibGVzLCBhbmQgdGhlbiByZXRyaWVzLiBCdXQsIHRoZSBjYWxsIHRvIGByZXdyaXRlX3NlY3Rpb25faGVhZGVyc2AgaXMgd2hhdCBJIHJlYWxseSBuZWVkIHRvIGV4YW1pbmUuIFRoZSBzaXplcyBhbmQgc2hfZmxhZ3MgbWlnaHQgaGF2ZSBiZWVuIGNsZWFyZWQsIGJ1dCBkb2VzIGByZXdyaXRlX3NlY3Rpb25faGVhZGVyc2AgaGF2ZSBhbnkgdW5pbml0aWFsaXplZCByZWFkcywgZ2l2ZW4gdGhlIHJlc2V0IHN0YXRlPyBUaGF0JiMzOTtzIHRoZSBjcml0aWNhbCBxdWVzdGlvbiBoZXJlLiBJJiMzOTttIGdvaW5nIHRvIGxldmVyYWdlIGBkZWZhdWx0X2FwaTpncmVwcGVyYCB0byBpbnNwZWN0IGByZXdyaXRlX3NlY3Rpb25faGVhZGVyc2AgaW1tZWRpYXRlbHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Jld3JpdGVfc2VjdGlvbl9oZWFkZXJzJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS9tYWluLmM9MTEzOD1zdGF0aWMgY2hhciAqZ2V0X25leHRfbW9kaW5mbyhjb25zdCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBjb25zdCBjaGFyICp0YWcsXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMTE0Ni1cdC8qXG5rZXJuZWwvbW9kdWxlL21haW4uYzoxMTQ3Olx0ICogZ2V0X21vZGluZm8oKSBjYWxscyBtYWRlIGJlZm9yZSByZXdyaXRlX3NlY3Rpb25faGVhZGVycygpXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xMTQ4LVx0ICogbXVzdCB1c2Ugc2hfb2Zmc2V0LCBhcyBzaF9hZGRyIGlzbiYjMzk7dCBzZXQhXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9MjUyMz1zdGF0aWMgdm9pZCBmcmVlX2NvcHkoc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgaW50IGZsYWdzKVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI1MzAtXG5rZXJuZWwvbW9kdWxlL21haW4uYzoyNTMxOnN0YXRpYyBpbnQgcmV3cml0ZV9zZWN0aW9uX2hlYWRlcnMoc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgaW50IGZsYWdzKVxua2VybmVsL21vZHVsZS9tYWluLmMtMjUzMi17XG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9Mjk0Mz1zdGF0aWMgc3RydWN0IG1vZHVsZSAqbGF5b3V0X2FuZF9hbGxvY2F0ZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMjk4Ni1cdFx0ICovXG5rZXJuZWwvbW9kdWxlL21haW4uYzoyOTg3Olx0XHRyZXdyaXRlX3NlY3Rpb25faGVhZGVycyhpbmZvLCBmbGFncyk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTg4LVx0XHRmb3JfZWFjaF9tb2RfbWVtX3R5cGUodHlwZSlcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYz0zMzk5PXN0YXRpYyBpbnQgZWFybHlfbW9kX2NoZWNrKHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGludCBmbGFncylcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zNDExLVxua2VybmVsL21vZHVsZS9tYWluLmM6MzQxMjpcdGVyciA9IHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzKGluZm8sIGZsYWdzKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM0MTMtXHRpZiAoZXJyKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MzMyCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMjEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gcmVhZGluZyB0aGUgY29kZToKCioqRGl2aW5nIGludG8gYHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzYCoqCgpPa2F5LCBsZXQmIzM5O3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MgYW5kIHRha2UgYSBsb29rIGF0IGByZXdyaXRlX3NlY3Rpb25faGVhZGVyc2AgaW4gYGtlcm5lbC9tb2R1bGUvbWFpbi5jYC4gVGhpcyBmdW5jdGlvbiBpcyBjcml0aWNhbDsgaXQmIzM5O3MgdGhlIG9uZSByZXNwb25zaWJsZSBmb3IuLi4gd2VsbCwgcmV3cml0aW5nIHRoZSBzZWN0aW9uIGhlYWRlcnMsIG9idmlvdXNseSwgYnV0IHRoZSB3aHkgaXMgdGhlIHF1ZXN0aW9uLiBJIGtub3cgdGhlIGNvcmUgb2YgbW9kdWxlIGxvYWRpbmcgaW52b2x2ZXMgbWFuaXB1bGF0aW5nIHRoZSBFTEYgaGVhZGVycyB0byBtYWtlIHRoZSBtb2R1bGUgZml0IGludG8gdGhlIGtlcm5lbCYjMzk7cyBtZW1vcnkgc3BhY2UgYW5kIGVuc3VyZSBwcm9wZXIgcmVsb2NhdGlvbi4gSSYjMzk7bSBleHBlY3RpbmcgdGhpcyBmdW5jdGlvbiBkZWFscyB3aXRoIG1vZGlmeWluZyB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUgdG8gcmVmbGVjdCB0aG9zZSBhZGp1c3RtZW50cy4gTXkgYXNzdW1wdGlvbiBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCBlaXRoZXIgYmUgaW52b2x2ZWQgaW46IAoxLiAgKipBZGp1c3RpbmcgQWRkcmVzc2VzOioqIE1vZGlmeWluZyB0aGUgYHNoX2FkZHJgIGZpZWxkcyBvZiB0aGUgc2VjdGlvbiBoZWFkZXJzIHRvIHJlZmxlY3QgdGhlaXIgdmlydHVhbCBhZGRyZXNzZXMgaW4ga2VybmVsIHNwYWNlIGFmdGVyIGxvYWRpbmcuIEl0IG1pZ2h0IG5lZWQgdG8gYWNjb3VudCBmb3IgYW55IGJhc2UgYWRkcmVzcyBvciBvZmZzZXQgYXBwbGllZCBkdXJpbmcgbW9kdWxlIGxvYWRpbmcuCjIuICAqKlJlbG9jYXRpbmcgU2VjdGlvbnM6KiogVGhlIGZ1bmN0aW9uIG1pZ2h0IGhhbmRsZSB0YXNrcyBsaWtlIGNvbWJpbmluZywgc3BsaXR0aW5nLCBvciByZW9yZGVyaW5nIG9mIHNlY3Rpb25zIGFzIHBhcnQgb2YgbWVtb3J5IG1hbmFnZW1lbnQgb3IgdG8gc3VwcG9ydCBmZWF0dXJlcyBsaWtlIHBlci1DUFUgZGF0YSBvciByZWFkLW9ubHkvcmVhZC13cml0ZSBkaXN0aW5jdGlvbi4KMy4gICoqQWRqdXN0aW5nIFNpemVzOioqIEl0JiMzOTtzIGFsc28gcG9zc2libGUgdGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoaW5ncyBsaWtlIGFkanVzdGluZyB0aGUgc2VjdGlvbiBzaXplcyBhZnRlciByZWxvY2F0aW9uIG9yIG1vZGlmeWluZyB0aGUgc2VjdGlvbiBoZWFkZXIgZmxhZ3MgdG8gcmVmbGVjdCBuZXcgcGVybWlzc2lvbnMuCjQuICAqKkhhbmRsaW5nIFNwZWNpYWwgU2VjdGlvbnM6KiogSXQgY291bGQgYmUgYSBwYXJ0IG9mIG1hbmFnaW5nIHNwZWNpYWwgc2VjdGlvbnMgbGlrZSBgLmluaXRgIG9yIGAuZXhpdGAuCjUuICAqKkRlYWxpbmcgd2l0aCBEZXBlbmRlbmNpZXM6KiogRmluYWxseSwgaXQgaXMgcG9zc2libGUgdGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgYWRqdXN0aW5nIHNlY3Rpb24gaGVhZGVycyByZWxhdGVkIHRvIGltcG9ydGVkIHN5bWJvbHMgb3IgZGVwZW5kZW5jaWVzLgoKSSYjMzk7bSBrZWVuIHRvIHNlZSBpZiBteSBhc3N1bXB0aW9ucyBob2xkIHRydWUgYW5kIHRvIG9ic2VydmUgdGhlIG51YW5jZXMgb2YgdGhpcyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4gSSYjMzk7bSBleHBlY3RpbmcgdG8gc2VlIGRldGFpbHMgb24gaG93IHRoZSBrZXJuZWwgaGFuZGxlcyBzeW1ib2wgdGFibGVzLCByZWxvY2F0aW9uIGVudHJpZXMsIGFuZCB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgb2YgdGhlIG1vZHVsZSB3aXRoaW4gdGhlIGtlcm5lbCYjMzk7cyBtZW1vcnkgc3BhY2UuIFRpbWUgdG8gZGVsdmUgaW4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS9tYWluLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyNTMxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzI1MzE6XHRzdGF0aWMgaW50IHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzKHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGludCBmbGFncylcbjI1MzI6XHR7XG4yNTMzOlx0XHR1bnNpZ25lZCBpbnQgaTtcbjI1MzQ6XHRcbjI1MzU6XHRcdC8qIFRoaXMgc2hvdWxkIGFsd2F5cyBiZSB0cnVlLCBidXQgbGV0JiMzOTtzIGJlIHN1cmUuICovXG4yNTM2Olx0XHRpbmZvLVx1MDAzZXNlY2hkcnNbMF0uc2hfYWRkciA9IDA7XG4yNTM3Olx0XG4yNTM4Olx0XHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBpbmZvLVx1MDAzZWhkci1cdTAwM2VlX3NobnVtOyBpJiM0MzsmIzQzOykge1xuMjUzOTpcdFx0XHRFbGZfU2hkciAqc2hkciA9IFx1MDAyNmluZm8tXHUwMDNlc2VjaGRyc1tpXTtcbjI1NDA6XHRcbjI1NDE6XHRcdFx0LypcbjI1NDI6XHRcdFx0ICogTWFyayBhbGwgc2VjdGlvbnMgc2hfYWRkciB3aXRoIHRoZWlyIGFkZHJlc3MgaW4gdGhlXG4yNTQzOlx0XHRcdCAqIHRlbXBvcmFyeSBpbWFnZS5cbjI1NDQ6XHRcdFx0ICovXG4yNTQ1Olx0XHRcdHNoZHItXHUwMDNlc2hfYWRkciA9IChzaXplX3QpaW5mby1cdTAwM2VoZHIgJiM0Mzsgc2hkci1cdTAwM2VzaF9vZmZzZXQ7XG4yNTQ2Olx0XG4yNTQ3Olx0XHR9XG4yNTQ4Olx0XG4yNTQ5Olx0XHQvKiBUcmFjayBidXQgZG9uJiMzOTt0IGtlZXAgbW9kaW5mbyBhbmQgdmVyc2lvbiBzZWN0aW9ucy4gKi9cbjI1NTA6XHRcdGluZm8tXHUwMDNlc2VjaGRyc1tpbmZvLVx1MDAzZWluZGV4LnZlcnNdLnNoX2ZsYWdzIFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcbjI1NTE6XHRcdGluZm8tXHUwMDNlc2VjaGRyc1tpbmZvLVx1MDAzZWluZGV4LnZlcnNfZXh0X2NyY10uc2hfZmxhZ3MgXHUwMDI2PVxuMjU1MjpcdFx0XHR+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DO1xuMjU1MzpcdFx0aW5mby1cdTAwM2VzZWNoZHJzW2luZm8tXHUwMDNlaW5kZXgudmVyc19leHRfbmFtZV0uc2hfZmxhZ3MgXHUwMDI2PVxuMjU1NDpcdFx0XHR+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DO1xuMjU1NTpcdFx0aW5mby1cdTAwM2VzZWNoZHJzW2luZm8tXHUwMDNlaW5kZXguaW5mb10uc2hfZmxhZ3MgXHUwMDI2PSB+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DO1xuMjU1NjpcdFxuMjU1NzpcdFx0cmV0dXJuIDA7XG4yNTU4Olx0fVxuMjU1OTpcdFxuMjU2MDpcdHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtb2R1bGVfbGljZW5zZV9vZmZlbmRlcnNbXSA9IHtcbjI1NjE6XHRcdC8qIGRyaXZlcmxvYWRlciB3YXMgY2F1Z2h0IHdyb25nbHkgcHJldGVuZGluZyB0byBiZSB1bmRlciBHUEwgKi9cbjI1NjI6XHRcdFwmIzM0O2RyaXZlcmxvYWRlclwmIzM0OyxcbjI1NjM6XHRcbjI1NjQ6XHRcdC8qIGx2ZSBjbGFpbXMgdG8gYmUgR1BMIGJ1dCB1cHN0cmVhbSB3b24mIzM5O3QgcHJvdmlkZSBzb3VyY2UgKi9cbjI1NjU6XHRcdFwmIzM0O2x2ZVwmIzM0OyxcbjI1NjY6XHR9O1xuMjU2NzpcdFxuMjU2ODpcdC8qXG4yNTY5Olx0ICogVGhlc2UgY2FsbHMgdGFpbnQgdGhlIGtlcm5lbCBkZXBlbmRpbmcgY2VydGFpbiBtb2R1bGUgY2lyY3Vtc3RhbmNlcyAqL1xuMjU3MDpcdHN0YXRpYyB2b2lkIG1vZHVsZV9hdWdtZW50X2tlcm5lbF90YWludHMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxuMjU3MTpcdHtcbjI1NzI6XHRcdGludCBwcmV2X3RhaW50ID0gdGVzdF90YWludChUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEUpO1xuMjU3MzpcdFx0c2l6ZV90IGk7XG4yNTc0Olx0XG4yNTc1Olx0XHRpZiAoIWdldF9tb2RpbmZvKGluZm8sIFwmIzM0O2ludHJlZVwmIzM0OykpIHtcbjI1NzY6XHRcdFx0aWYgKCF0ZXN0X3RhaW50KFRBSU5UX09PVF9NT0RVTEUpKVxuMjU3NzpcdFx0XHRcdHByX3dhcm4oXCYjMzQ7JXM6IGxvYWRpbmcgb3V0LW9mLXRyZWUgbW9kdWxlIHRhaW50cyBrZXJuZWwuXFxuXCYjMzQ7LFxuMjU3ODpcdFx0XHRcdFx0bW9kLVx1MDAzZW5hbWUpO1xuMjU3OTpcdFx0XHRhZGRfdGFpbnRfbW9kdWxlKG1vZCwgVEFJTlRfT09UX01PRFVMRSwgTE9DS0RFUF9TVElMTF9PSyk7XG4yNTgwOlx0XHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY2MDgKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiA4MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBicmVha2Rvd24gb2Ygd2hhdCYjMzk7cyBoYXBwZW5pbmcsIGZyb20gbXkgZXhwZXJ0IHBlcnNwZWN0aXZlOgoKKipBbmFseXppbmcgU2VjdGlvbiBIZWFkZXIgTWFuaXB1bGF0aW9uKioKClJpZ2h0LCBsZXQgbWUgZ2V0IHRoaXMgc3RyYWlnaHQgaW4gbXkgaGVhZC4gYHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzYCBpcyByZXNldHRpbmcgYHNoX2FkZHJgIOKAkyBpdCYjMzk7cyBiYXNpY2FsbHkgcG9pbnRpbmcgaXQgdG8gdGhlIHRlbXAgaW1hZ2UuIEdvdCBpdC4gTm93LCBgbGF5b3V0X3NlY3Rpb25zYCBhbmQgYGxheW91dF9zeW10YWJgIGNvbWUgaW50byBwbGF5LCBhbmQgdGhleSYjMzk7cmUgZ29pbmcgdG8gc3RhcnQgdHdlYWtpbmcgdGhpbmdzIGxpa2UgYHNoX2FkZHJgLCBgc2hfZW50c2l6ZWAsIGFuZCBzbyBvbi4gSG9sZCBvbi4uLiBJIG5lZWQgdG8gYmUgcHJlY2lzZSBoZXJlLiAqYGxheW91dF9zZWN0aW9uc2AqIGlzIGFsc28gbW9kaWZ5aW5nIGBzaF9lbnRzaXplYCAqYW5kKiBgc2hfYWRkcmAuICBJIG5lZWQgdG8gdmVyaWZ5IHRoYXQuIExldCYjMzk7cyBkaXZlIGludG8gYGxheW91dF9zZWN0aW9uc2AgYW5kIHNlZSB3aGF0JiMzOTtzIGFjdHVhbGx5IGhhcHBlbmluZy4gR290dGEga2VlcCB0aGUgZGV0YWlscyBzdHJhaWdodCBzbyBJIGRvbiYjMzk7dCBtaXNzIGFueSBlZGdlIGNhc2VzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtsYXlvdXRfc2VjdGlvbnMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvbW9kdWxlLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvbW9kdWxlL21haW4uYz0xNjcxPWJvb2wgbW9kdWxlX2luaXRfbGF5b3V0X3NlY3Rpb24oY29uc3QgY2hhciAqc25hbWUpXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMTY3OS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjE2ODA6c3RhdGljIHZvaWQgX19sYXlvdXRfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBib29sIGlzX2luaXQpXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNjgxLXtcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNzUxLSAqL1xua2VybmVsL21vZHVsZS9tYWluLmM6MTc1MjpzdGF0aWMgdm9pZCBsYXlvdXRfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxua2VybmVsL21vZHVsZS9tYWluLmMtMTc1My17XG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMTc1OS1cdHByX2RlYnVnKFwmIzM0O0NvcmUgc2VjdGlvbiBhbGxvY2F0aW9uIG9yZGVyIGZvciAlczpcXG5cJiMzNDssIG1vZC1cdTAwM2VuYW1lKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjE3NjA6XHRfX2xheW91dF9zZWN0aW9ucyhtb2QsIGluZm8sIGZhbHNlKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTE3NjEtXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNzYyLVx0cHJfZGVidWcoXCYjMzQ7SW5pdCBzZWN0aW9uIGFsbG9jYXRpb24gb3JkZXIgZm9yICVzOlxcblwmIzM0OywgbW9kLVx1MDAzZW5hbWUpO1xua2VybmVsL21vZHVsZS9tYWluLmM6MTc2MzpcdF9fbGF5b3V0X3NlY3Rpb25zKG1vZCwgaW5mbywgdHJ1ZSk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNzY0LX1cbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYz0yOTQzPXN0YXRpYyBzdHJ1Y3QgbW9kdWxlICpsYXlvdXRfYW5kX2FsbG9jYXRlKHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGludCBmbGFncylcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTYyLVx0Lypcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI5NjM6XHQgKiBNYXJrIHJlbGV2YW50IHNlY3Rpb25zIGFzIFNIRl9ST19BRlRFUl9JTklUIHNvIGxheW91dF9zZWN0aW9ucygpIGNhblxua2VybmVsL21vZHVsZS9tYWluLmMtMjk2NC1cdCAqIHB1dCB0aGVtIGluIHRoZSByaWdodCBwbGFjZS5cbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTc0LXJldHJ5Olxua2VybmVsL21vZHVsZS9tYWluLmM6Mjk3NTpcdGxheW91dF9zZWN0aW9ucyhpbmZvLVx1MDAzZW1vZCwgaW5mbyk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTc2LVx0bGF5b3V0X3N5bXRhYihpbmZvLVx1MDAzZW1vZCwgaW5mbyk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDczOTkKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAxMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKkFuYWx5emluZyB0aGUgX19sYXlvdXRfc2VjdGlvbnMgRGlyZWN0aXZlKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGluLiBNeSBtaW5kIGltbWVkaWF0ZWx5IGdvZXMgdG8gYF9fbGF5b3V0X3NlY3Rpb25zYC4gV2hlbmV2ZXIgSSBlbmNvdW50ZXIgdGhpcywgSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgbW9kdWxhciBzdHJ1Y3R1cmUuIFRoaXMgZGlyZWN0aXZlLCBtb3JlIG9mdGVuIHRoYW4gbm90LCBpcyBnb2luZyB0byBiZSB0aGUgY2VudHJhbCBwb2ludCBmb3IgYnVpbGRpbmcgY29tcGxleCBwYWdlcyBvciB0ZW1wbGF0ZXMgdGhhdCBuZWVkIHRvIGJlIGhpZ2hseSBjdXN0b21pemFibGUgYW5kIG1haW50YWluYWJsZS4gSXQgaW1wbGllcyBhIHN5c3RlbSB3aGVyZSBjb250ZW50IGlzbiYjMzk7dCBtb25vbGl0aGljLCBidXQgYnJva2VuIGRvd24gaW50byBsb2dpY2FsbHkgZ3JvdXBlZCBhbmQgcmV1c2FibGUgc2VjdGlvbnMuCgpJJiMzOTttIG1lbnRhbGx5IG1hcHBpbmcgdGhlIHBvc3NpYmlsaXRpZXMuIElzIHRoaXMgYSBjdXN0b20gZGlyZWN0aXZlLCBwYXJ0IG9mIGEgZnJhbWV3b3JrLCBvciBhIGNvcmUgbGFuZ3VhZ2UgY29uc3RydWN0PyBUaGF0IHdpbGwgZHJhbWF0aWNhbGx5IGFsdGVyIG15IGluaXRpYWwgYXNzZXNzbWVudC4gSWYgaXQmIzM5O3MgY3VzdG9tLCBJJiMzOTtsbCBuZWVkIHRvIHVuZGVyc3RhbmQgd2hlcmUgdGhlIGltcGxlbWVudGF0aW9uIGV4aXN0cyBhbmQgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSBicm9hZGVyIHJlbmRlcmluZyBjb250ZXh0LiBJZiBpdCYjMzk7cyBmcmFtZXdvcmstc3BlY2lmaWMsIEkmIzM5O20gYWxyZWFkeSBzdGFydGluZyB0byB0aGluayBhYm91dCB3aGljaCBmcmFtZXdvcmsuIFdoYXQmIzM5O3MgaXRzIHB1cnBvc2U/IElzIGl0IGhhbmRsaW5nIHRoaW5ncyBsaWtlIG5hdmlnYXRpb24sIGNvbnRlbnQgcmVnaW9ucywgc2lkZWJhcnMsIG9yIGVudGlyZSBwYWdlIHRlbXBsYXRlcz8gSXMgdGhlcmUgYSBuZXN0ZWQgc3RydWN0dXJlIGludm9sdmVkPyBIb3cgaXMgdGhlIHJlbmRlcmluZyBjb250ZXh0IHBhc3NlZCBkb3duIGZyb20gdGhlIHRvcC1sZXZlbCB0byB0aGUgaW5kaXZpZHVhbCBzZWN0aW9ucz8KCkkgc3RhcnQgdGhpbmtpbmcgYWJvdXQgaG93IGl0IG1pZ2h0IGJlIGltcGxlbWVudGVkLiBBcmUgdGhlIHNlY3Rpb25zIGRlZmluZWQgaW4gYSBkZWNsYXJhdGl2ZSBtYW5uZXIsIG9yIGlzIHRoZXJlIG1vcmUgZHluYW1pYyBsb2dpYyBpbnZvbHZlZD8gQ291bGQgdGhpcyBiZSBhIHNpbXBsZSBpbmNsdXNpb24gbWVjaGFuaXNtLCBvciBkb2VzIGl0IHBvdGVudGlhbGx5IGRlYWwgd2l0aCBkYXRhIGJpbmRpbmcsIHRlbXBsYXRpbmcgZW5naW5lcywgb3IgZXZlbiBjb25kaXRpb25hbCByZW5kZXJpbmcgb2YgZW50aXJlIHNlY3Rpb25zIGJhc2VkIG9uIGRhdGE/IEnigJltIGltYWdpbmluZyB0aGUgcG90ZW50aWFsIGltcGFjdCBvbiBwZXJmb3JtYW5jZSB0b28uIFdpdGggdGhlc2Ugc29ydHMgb2YgbGF5b3V0IGRpcmVjdGl2ZXMsIG1hbmFnaW5nIHNlY3Rpb24gZGVwZW5kZW5jaWVzIGJlY29tZXMgY3JpdGljYWwsIHNvIHRoYXQmIzM5O3Mgc29tZXRoaW5nIHRoYXQmIzM5O3MgYWx3YXlzIGluIHRoZSBiYWNrIG9mIG15IG1pbmQuCgpVbHRpbWF0ZWx5LCBteSBnb2FsIGhlcmUgaXMgdG8gZGV0ZXJtaW5lIGhvdyB0aGUgZnJhbWV3b3JrLCBsYW5ndWFnZSwgb3Igc3lzdGVtLCBlbmFibGVzIGEgY2xlYW4gc2VwYXJhdGlvbiBvZiBjb25jZXJucyBhbmQgdGhlIG1vc3QgZWZmaWNpZW50IHdheSB0byBtYWludGFpbiBhbmQgbWFuYWdlIGxhcmdlLCBjb21wbGV4IHRlbXBsYXRlcyBvciBsYXlvdXRzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvbWFpbi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTY4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNjgwOlx0c3RhdGljIHZvaWQgX19sYXlvdXRfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBib29sIGlzX2luaXQpXG4xNjgxOlx0e1xuMTY4MjpcdFx0dW5zaWduZWQgaW50IG0sIGk7XG4xNjgzOlx0XG4xNjg0Olx0XHQvKlxuMTY4NTpcdFx0ICogeyBNYXNrIG9mIHJlcXVpcmVkIHNlY3Rpb24gaGVhZGVyIGZsYWdzLFxuMTY4NjpcdFx0ICogICBNYXNrIG9mIGV4Y2x1ZGVkIHNlY3Rpb24gaGVhZGVyIGZsYWdzIH1cbjE2ODc6XHRcdCAqL1xuMTY4ODpcdFx0c3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbWFza3NbXVsyXSA9IHtcbjE2ODk6XHRcdFx0eyBTSEZfRVhFQ0lOU1RSIHwgU0hGX0FMTE9DLCBBUkNIX1NIRl9TTUFMTCB9LFxuMTY5MDpcdFx0XHR7IFNIRl9BTExPQywgU0hGX1dSSVRFIHwgQVJDSF9TSEZfU01BTEwgfSxcbjE2OTE6XHRcdFx0eyBTSEZfUk9fQUZURVJfSU5JVCB8IFNIRl9BTExPQywgQVJDSF9TSEZfU01BTEwgfSxcbjE2OTI6XHRcdFx0eyBTSEZfV1JJVEUgfCBTSEZfQUxMT0MsIEFSQ0hfU0hGX1NNQUxMIH0sXG4xNjkzOlx0XHRcdHsgQVJDSF9TSEZfU01BTEwgfCBTSEZfQUxMT0MsIDAgfVxuMTY5NDpcdFx0fTtcbjE2OTU6XHRcdHN0YXRpYyBjb25zdCBpbnQgY29yZV9tX3RvX21lbV90eXBlW10gPSB7XG4xNjk2Olx0XHRcdE1PRF9URVhULFxuMTY5NzpcdFx0XHRNT0RfUk9EQVRBLFxuMTY5ODpcdFx0XHRNT0RfUk9fQUZURVJfSU5JVCxcbjE2OTk6XHRcdFx0TU9EX0RBVEEsXG4xNzAwOlx0XHRcdE1PRF9EQVRBLFxuMTcwMTpcdFx0fTtcbjE3MDI6XHRcdHN0YXRpYyBjb25zdCBpbnQgaW5pdF9tX3RvX21lbV90eXBlW10gPSB7XG4xNzAzOlx0XHRcdE1PRF9JTklUX1RFWFQsXG4xNzA0Olx0XHRcdE1PRF9JTklUX1JPREFUQSxcbjE3MDU6XHRcdFx0TU9EX0lOVkFMSUQsXG4xNzA2Olx0XHRcdE1PRF9JTklUX0RBVEEsXG4xNzA3Olx0XHRcdE1PRF9JTklUX0RBVEEsXG4xNzA4Olx0XHR9O1xuMTcwOTpcdFxuMTcxMDpcdFx0Zm9yIChtID0gMDsgbSBcdTAwM2MgQVJSQVlfU0laRShtYXNrcyk7ICYjNDM7JiM0MzttKSB7XG4xNzExOlx0XHRcdGVudW0gbW9kX21lbV90eXBlIHR5cGUgPSBpc19pbml0ID8gaW5pdF9tX3RvX21lbV90eXBlW21dIDogY29yZV9tX3RvX21lbV90eXBlW21dO1xuMTcxMjpcdFxuMTcxMzpcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBpbmZvLVx1MDAzZWhkci1cdTAwM2VlX3NobnVtOyAmIzQzOyYjNDM7aSkge1xuMTcxNDpcdFx0XHRcdEVsZl9TaGRyICpzID0gXHUwMDI2aW5mby1cdTAwM2VzZWNoZHJzW2ldO1xuMTcxNTpcdFx0XHRcdGNvbnN0IGNoYXIgKnNuYW1lID0gaW5mby1cdTAwM2VzZWNzdHJpbmdzICYjNDM7IHMtXHUwMDNlc2hfbmFtZTtcbjE3MTY6XHRcbjE3MTc6XHRcdFx0XHRpZiAoKHMtXHUwMDNlc2hfZmxhZ3MgXHUwMDI2IG1hc2tzW21dWzBdKSAhPSBtYXNrc1ttXVswXVxuMTcxODpcdFx0XHRcdCAgICB8fCAocy1cdTAwM2VzaF9mbGFncyBcdTAwMjYgbWFza3NbbV1bMV0pXG4xNzE5Olx0XHRcdFx0ICAgIHx8IHMtXHUwMDNlc2hfZW50c2l6ZSAhPSB+MFVMXG4xNzIwOlx0XHRcdFx0ICAgIHx8IGlzX2luaXQgIT0gbW9kdWxlX2luaXRfbGF5b3V0X3NlY3Rpb24oc25hbWUpKVxuMTcyMTpcdFx0XHRcdFx0Y29udGludWU7XG4xNzIyOlx0XG4xNzIzOlx0XHRcdFx0aWYgKFdBUk5fT05fT05DRSh0eXBlID09IE1PRF9JTlZBTElEKSlcbjE3MjQ6XHRcdFx0XHRcdGNvbnRpbnVlO1xuMTcyNTpcdFxuMTcyNjpcdFx0XHRcdC8qXG4xNzI3Olx0XHRcdFx0ICogRG8gbm90IGFsbG9jYXRlIGNvZGV0YWcgbWVtb3J5IGFzIHdlIGxvYWQgaXQgaW50b1xuMTcyODpcdFx0XHRcdCAqIHByZWFsbG9jYXRlZCBjb250aWd1b3VzIG1lbW9yeS5cbjE3Mjk6XHRcdFx0XHQgKi9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODY0NgoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDEyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBhc3N1bWluZyBJJiMzOTttIGRlZXAgaW4gbXkgZG9tYWluIG9mIGV4cGVydGlzZToKCioqRGl2aW5nIERlZXBlciBpbnRvIGBfX2xheW91dF9zZWN0aW9uc2AqKgoKQWxyaWdodCwgdGhhdCYjMzk7cyB3aGF0IEkgbmVlZCB0byBkbyBuZXh0LiBJJiMzOTt2ZSBnb3QgYSBncmFzcCBvZiB0aGUgb3ZlcmFsbCBwaWN0dXJlLCBidXQgdG8gcmVhbGx5IHVuZGVyc3RhbmQgdGhlIHN5c3RlbSYjMzk7cyBiZWhhdmlvciwgSSBuZWVkIHRvIGRpZyBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBgX19sYXlvdXRfc2VjdGlvbnNgLiBJdCYjMzk7cyBhIGtleSBjb21wb25lbnQsIHByb2JhYmx5IHdoZXJlIGEgbG90IG9mIHRoZSBjb3JlIGxheW91dCBsb2dpYyByZXNpZGVzLCBhbmQgcG90ZW50aWFsbHkgd2hlcmUgSSYjMzk7bGwgZmluZCB0aGUgYW5zd2VycyB0byB0aG9zZSBxdWVzdGlvbnMgSSB3YXMgbXVsbGluZyBvdmVyLiBMZXQgbWUgZ2V0IHBhc3QgdGhlIHN1cmZhY2UtbGV2ZWwgYW5kIHVuZGVyc3RhbmQgdGhlIHN1YnRsZXRpZXMuIEkgbmVlZCB0byBrbm93IGhvdyBzZWN0aW9ucyBhcmUgY29uc3RydWN0ZWQsIGxhaWQgb3V0LCBhbmQgaG93IHRoZXkgaW50ZXJhY3Qgd2l0aCB0aGUgb3ZlcmFsbCByZW5kZXJpbmcgcGlwZWxpbmUuIFRoaXMgd2lsbCBiZSB0aGUgbmV4dCBzdGVwIHRvIGZpbmQgYW55IGluc2lnaHRzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvbWFpbi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTczMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNzMwOlx0XHRcdFx0aWYgKGNvZGV0YWdfbmVlZHNfbW9kdWxlX3NlY3Rpb24obW9kLCBzbmFtZSwgcy1cdTAwM2VzaF9zaXplKSkge1xuMTczMTpcdFx0XHRcdFx0LypcbjE3MzI6XHRcdFx0XHRcdCAqIHMtXHUwMDNlc2hfZW50c2l6ZSB3b24mIzM5O3QgYmUgdXNlZCBidXQgcG9wdWxhdGUgdGhlXG4xNzMzOlx0XHRcdFx0XHQgKiB0eXBlIGZpZWxkIHRvIGF2b2lkIGNvbmZ1c2lvbi5cbjE3MzQ6XHRcdFx0XHRcdCAqL1xuMTczNTpcdFx0XHRcdFx0cy1cdTAwM2VzaF9lbnRzaXplID0gKCh1bnNpZ25lZCBsb25nKSh0eXBlKSBcdTAwMjYgU0hfRU5UU0laRV9UWVBFX01BU0spXG4xNzM2Olx0XHRcdFx0XHRcdFx0XHUwMDNjXHUwMDNjIFNIX0VOVFNJWkVfVFlQRV9TSElGVDtcbjE3Mzc6XHRcdFx0XHRcdGNvbnRpbnVlO1xuMTczODpcdFx0XHRcdH1cbjE3Mzk6XHRcbjE3NDA6XHRcdFx0XHRzLVx1MDAzZXNoX2VudHNpemUgPSBtb2R1bGVfZ2V0X29mZnNldF9hbmRfdHlwZShtb2QsIHR5cGUsIHMsIGkpO1xuMTc0MTpcdFx0XHRcdHByX2RlYnVnKFwmIzM0O1xcdCVzXFxuXCYjMzQ7LCBzbmFtZSk7XG4xNzQyOlx0XHRcdH1cbjE3NDM6XHRcdH1cbjE3NDQ6XHR9XG4xNzQ1Olx0XG4xNzQ2Olx0LypcbjE3NDc6XHQgKiBMYXkgb3V0IHRoZSBTSEZfQUxMT0Mgc2VjdGlvbnMgaW4gYSB3YXkgbm90IGRpc3NpbWlsYXIgdG8gaG93IGxkXG4xNzQ4Olx0ICogbWlnaHQgLS0gY29kZSwgcmVhZC1vbmx5IGRhdGEsIHJlYWQtd3JpdGUgZGF0YSwgc21hbGwgZGF0YS4gIFRhbGx5XG4xNzQ5Olx0ICogc2l6ZXMsIGFuZCBwbGFjZSB0aGUgb2Zmc2V0cyBpbnRvIHNoX2VudHNpemUgZmllbGRzOiBoaWdoIGJpdCBtZWFucyBpdFxuMTc1MDpcdCAqIGJlbG9uZ3MgaW4gaW5pdC5cbjE3NTE6XHQgKi9cbjE3NTI6XHRzdGF0aWMgdm9pZCBsYXlvdXRfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxuMTc1MzpcdHtcbjE3NTQ6XHRcdHVuc2lnbmVkIGludCBpO1xuMTc1NTpcdFxuMTc1NjpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgaW5mby1cdTAwM2VoZHItXHUwMDNlZV9zaG51bTsgaSYjNDM7JiM0MzspXG4xNzU3Olx0XHRcdGluZm8tXHUwMDNlc2VjaGRyc1tpXS5zaF9lbnRzaXplID0gfjBVTDtcbjE3NTg6XHRcbjE3NTk6XHRcdHByX2RlYnVnKFwmIzM0O0NvcmUgc2VjdGlvbiBhbGxvY2F0aW9uIG9yZGVyIGZvciAlczpcXG5cJiMzNDssIG1vZC1cdTAwM2VuYW1lKTtcbjE3NjA6XHRcdF9fbGF5b3V0X3NlY3Rpb25zKG1vZCwgaW5mbywgZmFsc2UpO1xuMTc2MTpcdFxuMTc2MjpcdFx0cHJfZGVidWcoXCYjMzQ7SW5pdCBzZWN0aW9uIGFsbG9jYXRpb24gb3JkZXIgZm9yICVzOlxcblwmIzM0OywgbW9kLVx1MDAzZW5hbWUpO1xuMTc2MzpcdFx0X19sYXlvdXRfc2VjdGlvbnMobW9kLCBpbmZvLCB0cnVlKTtcbjE3NjQ6XHR9XG4xNzY1Olx0XG4xNzY2Olx0c3RhdGljIHZvaWQgbW9kdWxlX2xpY2Vuc2VfdGFpbnRfY2hlY2soc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpsaWNlbnNlKVxuMTc2NzpcdHtcbjE3Njg6XHRcdGlmICghbGljZW5zZSlcbjE3Njk6XHRcdFx0bGljZW5zZSA9IFwmIzM0O3Vuc3BlY2lmaWVkXCYjMzQ7O1xuMTc3MDpcdFxuMTc3MTpcdFx0aWYgKCFsaWNlbnNlX2lzX2dwbF9jb21wYXRpYmxlKGxpY2Vuc2UpKSB7XG4xNzcyOlx0XHRcdGlmICghdGVzdF90YWludChUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEUpKVxuMTc3MzpcdFx0XHRcdHByX3dhcm4oXCYjMzQ7JXM6IG1vZHVsZSBsaWNlbnNlICYjMzk7JXMmIzM5OyB0YWludHMga2VybmVsLlxcblwmIzM0OyxcbjE3NzQ6XHRcdFx0XHRcdG1vZC1cdTAwM2VuYW1lLCBsaWNlbnNlKTtcbjE3NzU6XHRcdFx0YWRkX3RhaW50X21vZHVsZShtb2QsIFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRSxcbjE3NzY6XHRcdFx0XHRcdCBMT0NLREVQX05PV19VTlJFTElBQkxFKTtcbjE3Nzc6XHRcdH1cbjE3Nzg6XHR9XG4xNzc5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk2NDYKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiA5MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4KCioqVW5kZXJzdGFuZGluZyB0aGUgU2VjdGlvbiBMYXlvdXQgYW5kIE1vZHVsZSBNb3ZlbWVudCoqCgpBbHJpZ2h0LCBzbyBgbGF5b3V0X3NlY3Rpb25zYCDigJMgdGhhdCYjMzk7cyB0aGUgZnVuY3Rpb24gdGhhdCYjMzk7cyBzZXR0aW5nIGBzaF9lbnRzaXplYCB0bywgZXNzZW50aWFsbHksIGEgbWF4aW11bSB1bnNpZ25lZCBsb25nLCByaWdodD8gQW5kIGZyb20gdGhlcmUsIGl0JiMzOTtzIGNhbGN1bGF0aW5nIG9mZnNldHMgZm9yIHRoZSBzZWN0aW9ucy4gVGhhdCBzZWVtcyBwcmV0dHkgc3RhbmRhcmQgZm9yIHNldHRpbmcgdXAgdGhlIGluaXRpYWwgbGF5b3V0LiBCdXQgdGhlIG5leHQgcGFydCBpcyBpbnRlcmVzdGluZy4KCklmIGBtb3ZlX21vZHVsZWAgaGl0cyBhbiBgLUVBR0FJTmAgZXJyb3Ig4oCTIHdoaWNoIGltcGxpZXMgYSB0ZW1wb3JhcnkgcmVzb3VyY2UgaXNzdWUsIHBlcmhhcHMgYSBsb2NrIGNvbnRlbnRpb24gb3Igc29tZXRoaW5nIHNpbWlsYXIg4oCTIGl0IHJlc2V0cyB0aGUgc2VjdGlvbiBzaXplcyB0byB6ZXJvLiBBbmQgb24gdG9wIG9mIHRoYXQsIGl0IHVuc2V0cyB0aGUgYFNIRl9BTExPQ2AgZmxhZyBmb3IgYm90aCB0aGUgc3ltYm9sIHRhYmxlIGFuZCB0aGUgc3RyaW5nIHRhYmxlLiBOb3csIHRoZSBgU0hGX0FMTE9DYCBmbGFnIGlzIGNydWNpYWw7IGl0IG1lYW5zIHRoZSBzZWN0aW9uIGlzIHN1cHBvc2VkIHRvIHJlc2lkZSBpbiBtZW1vcnkgYXQgcnVudGltZS4gUmVzZXR0aW5nIHRoZSBzaXplcyBhbmQgY2xlYXJpbmcgdGhhdCBmbGFn4oCmIHRoYXQmIzM5O3MgYSBwcmV0dHkgZHJhc3RpYyByb2xsYmFjay4gSXQgc2VlbXMgbGlrZSBpdCYjMzk7cyB0cnlpbmcgdG8gZW5zdXJlIG5vIHBhcnRpYWxseS1hbGxvY2F0ZWQgZGF0YSBpcyBsZWZ0IGhhbmdpbmcgYXJvdW5kLCBhIGtpbmQgb2YgY2xlYW4tdXAgb3BlcmF0aW9uIGluIGNhc2Ugb2YgZmFpbHVyZS4KCldhaXQgYSBzZWNvbmTigKYgYG1vdmVfbW9kdWxlYCBpcyAqY2FsbGVkKiBhZnRlciBgbGF5b3V0X3NlY3Rpb25zYCBhbmQgYGxheW91dF9zeW10YWJgLiBJIHdhcyBleHBlY3RpbmcgdGhlIG90aGVyIHdheSBhcm91bmQuIE9rYXksIGdpdmVuIHRoYXQgb3JkZXJpbmcsIEkgbmVlZCB0byBjaGVjayBob3cgYG1vdmVfbW9kdWxlYCB3b3JrcyBiZWNhdXNlIGl0cyBiZWhhdmlvciBpcyBjZW50cmFsIHRvIHRoZSBvdmVyYWxsIHByb2Nlc3MuIFRpbWUgdG8gZGlnIGludG8gdGhlIGBtb3ZlX21vZHVsZWAgZnVuY3Rpb24gYW5kIGdldCBhIGJldHRlciBwaWN0dXJlIG9mIHdoYXQmIzM5O3MgZ29pbmcgb24gd2l0aCByZXNvdXJjZSBtYW5hZ2VtZW50IGFuZCBzZWN0aW9uIGFsbG9jYXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21vdmVfbW9kdWxlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS9tYWluLmM9MjM2ND1zdGF0aWMgaW50IGVsZl92YWxpZGl0eV9jYWNoZV9zdHJ0YWIoc3RydWN0IGxvYWRfaW5mbyAqaW5mbylcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yNDE1LSAqIEFzIGEgbGFzdCBzdGVwIHdlIHNldCBpbmZvLVx1MDAzZW1vZCB0byB0aGUgdGVtcG9yYXJ5IGNvcHkgb2YgdGhlIG1vZHVsZSBpblxua2VybmVsL21vZHVsZS9tYWluLmM6MjQxNjogKiBpbmZvLVx1MDAzZWhkci4gVGhlIGZpbmFsIG9uZSB3aWxsIGJlIGFsbG9jYXRlZCBpbiBtb3ZlX21vZHVsZSgpLiBBbnlcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI0MTctICogbW9kaWZpY2F0aW9ucyB3ZSBtYWtlIHRvIG91ciBjb3B5IG9mIHRoZSBtb2R1bGUgd2lsbCBiZSBjYXJyaWVkIG92ZXJcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYz0yNjU5PXN0YXRpYyBpbnQgZmluZF9tb2R1bGVfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI3ODctXG5rZXJuZWwvbW9kdWxlL21haW4uYzoyNzg4OnN0YXRpYyBpbnQgbW92ZV9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxua2VybmVsL21vZHVsZS9tYWluLmMtMjc4OS17XG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9Mjk0Mz1zdGF0aWMgc3RydWN0IG1vZHVsZSAqbGF5b3V0X2FuZF9hbGxvY2F0ZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMjk3OC1cdC8qIEFsbG9jYXRlIGFuZCBtb3ZlIHRvIHRoZSBmaW5hbCBwbGFjZSAqL1xua2VybmVsL21vZHVsZS9tYWluLmM6Mjk3OTpcdGVyciA9IG1vdmVfbW9kdWxlKGluZm8tXHUwMDNlbW9kLCBpbmZvKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5ODAtXHRpZiAoZXJyKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwNDI4CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqSW5pdGlhbCBBc3Nlc3NtZW50OiBOYXZpZ2F0aW5nIHRoZSBgbW92ZV9tb2R1bGVgIENvZGUqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGBtb3ZlX21vZHVsZWAuIE15IGZpcnN0IHRob3VnaHQgaXMgdG8gZ2V0IGEgZ2VuZXJhbCBmZWVsIGZvciBpdHMgcHVycG9zZSBhbmQgc2NvcGUuICYjMzQ7bW92ZSYjMzQ7IGlzIGEgcHJldHR5IGJyb2FkIHRlcm0sIHNvIEkmIzM5O20gaW1tZWRpYXRlbHkgdHJ5aW5nIHRvIG1lbnRhbGx5IGNhdGVnb3JpemUgdGhpcyBtb2R1bGUuIElzIGl0IGhhbmRsaW5nIG9iamVjdCBtb3ZlbWVudCBpbiBhIGdhbWUgZW5naW5lLCBkYXRhIG1pZ3JhdGlvbiBiZXR3ZWVuIGRhdGFiYXNlcywgZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucywgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/IFRoZSBuYW1lIGFsb25lIGRvZXNuJiMzOTt0IGdpdmUgbWUgZW5vdWdoIGNvbnRleHQuIEkmIzM5O20gZ29pbmcgdG8gcXVpY2tseSBzY2FuIGZvciBjbHVlcyDigJMgYW55IGltcG9ydHMsIGZ1bmN0aW9uIG5hbWVzLCBjbGFzcyBoaWVyYXJjaGllcywgYW55dGhpbmcgdGhhdCBnaXZlcyBhIGhpbnQgYWJvdXQgdGhlIGRvbWFpbiBhbmQgaW50ZW5kZWQgZnVuY3Rpb25hbGl0eS4gSSYjMzk7bSBhbHNvIGNvbnNpZGVyaW5nIHRoZSBhcmNoaXRlY3R1cmFsIGNvbnRleHQsIGlmIGFueSBpcyBwcm92aWRlZCAtIGlzIGl0IHBhcnQgb2YgYSBsYXJnZXIgc3lzdGVtLCBhIHN0YW5kYWxvbmUgdXRpbGl0eSwgb3IgYSBsaWJyYXJ5PyBJJiMzOTttIGFscmVhZHkgZm9ybXVsYXRpbmcgcXVlc3Rpb25zOiBXaGF0IGFyZSB0aGUgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIEkgc2hvdWxkIGxvb2sgZm9yPyBBbnkgY29uY3VycmVuY3kgaXNzdWVzIHRvIGNvbnNpZGVyIGlmIGl0JiMzOTtzIHRocmVhZGVkPyBXaGF0IGRlc2lnbiBwYXR0ZXJucyBhcmUgbGlrZWx5IGVtcGxveWVkIGdpdmVuIHRoZSAmIzM5O21vdmUmIzM5OyBvcGVyYXRpb24/IEVzc2VudGlhbGx5LCBJJiMzOTttIHNldHRpbmcgdGhlIHN0YWdlIGZvciBhIGZvY3VzZWQgY29kZSBjb21wcmVoZW5zaW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvbWFpbi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjc4OCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyNzg4Olx0c3RhdGljIGludCBtb3ZlX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXG4yNzg5Olx0e1xuMjc5MDpcdFx0aW50IGksIHJldDtcbjI3OTE6XHRcdGVudW0gbW9kX21lbV90eXBlIHQgPSBNT0RfTUVNX05VTV9UWVBFUztcbjI3OTI6XHRcdGJvb2wgY29kZXRhZ19zZWN0aW9uX2ZvdW5kID0gZmFsc2U7XG4yNzkzOlx0XG4yNzk0Olx0XHRmb3JfZWFjaF9tb2RfbWVtX3R5cGUodHlwZSkge1xuMjc5NTpcdFx0XHRpZiAoIW1vZC1cdTAwM2VtZW1bdHlwZV0uc2l6ZSkge1xuMjc5NjpcdFx0XHRcdG1vZC1cdTAwM2VtZW1bdHlwZV0uYmFzZSA9IE5VTEw7XG4yNzk3Olx0XHRcdFx0Y29udGludWU7XG4yNzk4Olx0XHRcdH1cbjI3OTk6XHRcbjI4MDA6XHRcdFx0cmV0ID0gbW9kdWxlX21lbW9yeV9hbGxvYyhtb2QsIHR5cGUpO1xuMjgwMTpcdFx0XHRpZiAocmV0KSB7XG4yODAyOlx0XHRcdFx0dCA9IHR5cGU7XG4yODAzOlx0XHRcdFx0Z290byBvdXRfZXJyO1xuMjgwNDpcdFx0XHR9XG4yODA1Olx0XHR9XG4yODA2Olx0XG4yODA3Olx0XHQvKiBUcmFuc2ZlciBlYWNoIHNlY3Rpb24gd2hpY2ggc3BlY2lmaWVzIFNIRl9BTExPQyAqL1xuMjgwODpcdFx0cHJfZGVidWcoXCYjMzQ7RmluYWwgc2VjdGlvbiBhZGRyZXNzZXMgZm9yICVzOlxcblwmIzM0OywgbW9kLVx1MDAzZW5hbWUpO1xuMjgwOTpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgaW5mby1cdTAwM2VoZHItXHUwMDNlZV9zaG51bTsgaSYjNDM7JiM0MzspIHtcbjI4MTA6XHRcdFx0dm9pZCAqZGVzdDtcbjI4MTE6XHRcdFx0RWxmX1NoZHIgKnNoZHIgPSBcdTAwMjZpbmZvLVx1MDAzZXNlY2hkcnNbaV07XG4yODEyOlx0XHRcdGNvbnN0IGNoYXIgKnNuYW1lO1xuMjgxMzpcdFxuMjgxNDpcdFx0XHRpZiAoIShzaGRyLVx1MDAzZXNoX2ZsYWdzIFx1MDAyNiBTSEZfQUxMT0MpKVxuMjgxNTpcdFx0XHRcdGNvbnRpbnVlO1xuMjgxNjpcdFxuMjgxNzpcdFx0XHRzbmFtZSA9IGluZm8tXHUwMDNlc2Vjc3RyaW5ncyAmIzQzOyBzaGRyLVx1MDAzZXNoX25hbWU7XG4yODE4Olx0XHRcdC8qXG4yODE5Olx0XHRcdCAqIExvYWQgY29kZXRhZyBzZWN0aW9ucyBzZXBhcmF0ZWx5IGFzIHRoZXkgbWlnaHQgc3RpbGwgYmUgdXNlZFxuMjgyMDpcdFx0XHQgKiBhZnRlciBtb2R1bGUgdW5sb2FkLlxuMjgyMTpcdFx0XHQgKi9cbjI4MjI6XHRcdFx0aWYgKGNvZGV0YWdfbmVlZHNfbW9kdWxlX3NlY3Rpb24obW9kLCBzbmFtZSwgc2hkci1cdTAwM2VzaF9zaXplKSkge1xuMjgyMzpcdFx0XHRcdGRlc3QgPSBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uKG1vZCwgc25hbWUsIHNoZHItXHUwMDNlc2hfc2l6ZSxcbjI4MjQ6XHRcdFx0XHRcdFx0YXJjaF9tb2Rfc2VjdGlvbl9wcmVwZW5kKG1vZCwgaSksIHNoZHItXHUwMDNlc2hfYWRkcmFsaWduKTtcbjI4MjU6XHRcdFx0XHRpZiAoV0FSTl9PTighZGVzdCkpIHtcbjI4MjY6XHRcdFx0XHRcdHJldCA9IC1FSU5WQUw7XG4yODI3Olx0XHRcdFx0XHRnb3RvIG91dF9lcnI7XG4yODI4Olx0XHRcdFx0fVxuMjgyOTpcdFx0XHRcdGlmIChJU19FUlIoZGVzdCkpIHtcbjI4MzA6XHRcdFx0XHRcdHJldCA9IFBUUl9FUlIoZGVzdCk7XG4yODMxOlx0XHRcdFx0XHRnb3RvIG91dF9lcnI7XG4yODMyOlx0XHRcdFx0fVxuMjgzMzpcdFx0XHRcdGNvZGV0YWdfc2VjdGlvbl9mb3VuZCA9IHRydWU7XG4yODM0Olx0XHRcdH0gZWxzZSB7XG4yODM1Olx0XHRcdFx0ZW51bSBtb2RfbWVtX3R5cGUgdHlwZSA9IHNoZHItXHUwMDNlc2hfZW50c2l6ZSBcdTAwM2VcdTAwM2UgU0hfRU5UU0laRV9UWVBFX1NISUZUO1xuMjgzNjpcdFx0XHRcdHVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gc2hkci1cdTAwM2VzaF9lbnRzaXplIFx1MDAyNiBTSF9FTlRTSVpFX09GRlNFVF9NQVNLO1xuMjgzNzpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTQ4OQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDMxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246CgoqKkFuYWx5emluZyBgbW92ZV9tb2R1bGVgJiMzOTtzIEVycm9yIEhhbmRsaW5nKioKCk9rYXksIHNvIGBtb3ZlX21vZHVsZWAgaXMgYSBjcml0aWNhbCBmdW5jdGlvbiwgYW5kIEkmIzM5O20gbG9va2luZyBhdCBob3cgaXQgaGFuZGxlcyBmYWlsdXJlcy4gVGhlIGNydWNpYWwgcG9pbnQgaGVyZSBpcyB0aGUgYmVoYXZpb3Igb24gZXJyb3I6IElmIGl0IGZhaWxzLCB0aGUgZnVuY3Rpb24gKmZyZWVzKiBhbnkgYWxsb2NhdGVkIG1lbW9yeSBhbmQgdGhlbiByZXR1cm5zIGFuIGVycm9yLiBUaGlzIGlzIGdvb2QgcHJhY3RpY2Ug4oCTIHJlc291cmNlIGNsZWFudXAgaXMgcGFyYW1vdW50LCBlc3BlY2lhbGx5IHdoZW4gZGVhbGluZyB3aXRoIHBvdGVudGlhbGx5IGNvbXBsZXggbW9kdWxlIG1vdmVtZW50cy4gVGhhdCBtZW1vcnkgbWFuYWdlbWVudCBzdHJhdGVneSBpcyBzb2xpZC4gTm93LCBJIG5lZWQgdG8gZGlnIGRlZXBlciB0byBmdWxseSB1bmRlcnN0YW5kIGhvdyBpdCBvcGVyYXRlcyB1bmRlciB0aGUgaG9vZC4gTGV0JiMzOTtzIGdldCBpbnRvIHRoZSBkZXRhaWxzIG9mIHRoZSByZXN0IG9mIHRoZSBgbW92ZV9tb2R1bGVgIGZ1bmN0aW9uIGFuZCB0aGUgZXhhY3QgbWVjaGFuaXNtIG9mIHRoZSBlcnJvciBjb25kaXRpb25zIGl0IGNvdmVycy4gVGhhdCYjMzk7cyB3aGVyZSB0aGUgcmVhbCB2YWx1ZSBpcyBpbiBmaWd1cmluZyBvdXQgaG93IHJvYnVzdCB0aGlzIGNvZGUgaXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS9tYWluLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyODM4LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzI4Mzg6XHRcdFx0XHRkZXN0ID0gbW9kLVx1MDAzZW1lbVt0eXBlXS5iYXNlICYjNDM7IG9mZnNldDtcbjI4Mzk6XHRcdFx0fVxuMjg0MDpcdFxuMjg0MTpcdFx0XHRpZiAoc2hkci1cdTAwM2VzaF90eXBlICE9IFNIVF9OT0JJVFMpIHtcbjI4NDI6XHRcdFx0XHQvKlxuMjg0MzpcdFx0XHRcdCAqIE91ciBFTEYgY2hlY2tlciBhbHJlYWR5IHZhbGlkYXRlZCB0aGlzLCBidXQgbGV0JiMzOTtzXG4yODQ0Olx0XHRcdFx0ICogYmUgcGVkYW50aWMgYW5kIG1ha2UgdGhlIGdvYWwgY2xlYXJlci4gV2UgYWN0dWFsbHlcbjI4NDU6XHRcdFx0XHQgKiBlbmQgdXAgY29weWluZyBvdmVyIGFsbCBtb2RpZmljYXRpb25zIG1hZGUgdG8gdGhlXG4yODQ2Olx0XHRcdFx0ICogdXNlcnNwYWNlIGNvcHkgb2YgdGhlIGVudGlyZSBzdHJ1Y3QgbW9kdWxlLlxuMjg0NzpcdFx0XHRcdCAqL1xuMjg0ODpcdFx0XHRcdGlmIChpID09IGluZm8tXHUwMDNlaW5kZXgubW9kIFx1MDAyNlx1MDAyNlxuMjg0OTpcdFx0XHRcdCAgIChXQVJOX09OX09OQ0Uoc2hkci1cdTAwM2VzaF9zaXplICE9IHNpemVvZihzdHJ1Y3QgbW9kdWxlKSkpKSB7XG4yODUwOlx0XHRcdFx0XHRyZXQgPSAtRU5PRVhFQztcbjI4NTE6XHRcdFx0XHRcdGdvdG8gb3V0X2VycjtcbjI4NTI6XHRcdFx0XHR9XG4yODUzOlx0XHRcdFx0bWVtY3B5KGRlc3QsICh2b2lkICopc2hkci1cdTAwM2VzaF9hZGRyLCBzaGRyLVx1MDAzZXNoX3NpemUpO1xuMjg1NDpcdFx0XHR9XG4yODU1Olx0XHRcdC8qXG4yODU2Olx0XHRcdCAqIFVwZGF0ZSB0aGUgdXNlcnNwYWNlIGNvcHkmIzM5O3MgRUxGIHNlY3Rpb24gYWRkcmVzcyB0byBwb2ludCB0b1xuMjg1NzpcdFx0XHQgKiBvdXIgbmV3bHkgYWxsb2NhdGVkIG1lbW9yeSBhcyBhIHB1cmUgY29udmVuaWVuY2Ugc28gdGhhdFxuMjg1ODpcdFx0XHQgKiB1c2VycyBvZiBpbmZvIGNhbiBrZWVwIHRha2luZyBhZHZhbnRhZ2UgYW5kIHVzaW5nIHRoZSBuZXdseVxuMjg1OTpcdFx0XHQgKiBtaW50ZWQgb2ZmaWNpYWwgbWVtb3J5IGFyZWEuXG4yODYwOlx0XHRcdCAqL1xuMjg2MTpcdFx0XHRzaGRyLVx1MDAzZXNoX2FkZHIgPSAodW5zaWduZWQgbG9uZylkZXN0O1xuMjg2MjpcdFx0XHRwcl9kZWJ1ZyhcJiMzNDtcXHQweCVseCAweCUuOGx4ICVzXFxuXCYjMzQ7LCAobG9uZylzaGRyLVx1MDAzZXNoX2FkZHIsXG4yODYzOlx0XHRcdFx0IChsb25nKXNoZHItXHUwMDNlc2hfc2l6ZSwgaW5mby1cdTAwM2VzZWNzdHJpbmdzICYjNDM7IHNoZHItXHUwMDNlc2hfbmFtZSk7XG4yODY0Olx0XHR9XG4yODY1Olx0XG4yODY2Olx0XHRyZXR1cm4gMDtcbjI4Njc6XHRvdXRfZXJyOlxuMjg2ODpcdFx0bW9kdWxlX21lbW9yeV9yZXN0b3JlX3JveChtb2QpO1xuMjg2OTpcdFx0d2hpbGUgKHQtLSlcbjI4NzA6XHRcdFx0bW9kdWxlX21lbW9yeV9mcmVlKG1vZCwgdCk7XG4yODcxOlx0XHRpZiAoY29kZXRhZ19zZWN0aW9uX2ZvdW5kKVxuMjg3MjpcdFx0XHRjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKG1vZCk7XG4yODczOlx0XG4yODc0Olx0XHRyZXR1cm4gcmV0O1xuMjg3NTpcdH1cbjI4NzY6XHRcbjI4Nzc6XHRzdGF0aWMgaW50IGNoZWNrX2V4cG9ydF9zeW1ib2xfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kKVxuMjg3ODpcdHtcbjI4Nzk6XHRcdGlmIChtb2QtXHUwMDNlbnVtX3N5bXMgXHUwMDI2XHUwMDI2ICFtb2QtXHUwMDNlZmxhZ3N0YWIpIHtcbjI4ODA6XHRcdFx0cHJfZXJyKFwmIzM0OyVzOiBubyBmbGFncyBmb3IgZXhwb3J0ZWQgc3ltYm9sc1xcblwmIzM0OywgbW9kLVx1MDAzZW5hbWUpO1xuMjg4MTpcdFx0XHRyZXR1cm4gLUVOT0VYRUM7XG4yODgyOlx0XHR9XG4yODgzOlx0I2lmZGVmIENPTkZJR19NT0RWRVJTSU9OU1xuMjg4NDpcdFx0aWYgKG1vZC1cdTAwM2VudW1fc3ltcyBcdTAwMjZcdTAwMjYgIW1vZC1cdTAwM2VjcmNzKSB7XG4yODg1Olx0XHRcdHJldHVybiB0cnlfdG9fZm9yY2VfbG9hZChtb2QsXG4yODg2Olx0XHRcdFx0XHRcdCBcJiMzNDtubyB2ZXJzaW9ucyBmb3IgZXhwb3J0ZWQgc3ltYm9sc1wmIzM0Oyk7XG4yODg3Olx0XHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyNDk4CgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMjYzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgRUFHQUlOIEVycm9yIGluIE1vZHVsZSBSZWxvY2F0aW9uKioKCk9rYXksIHNvIGlmIGBtb3ZlX21vZHVsZWAgaXMgYmFyZmluZyB3aXRoIGFuIGAtRUFHQUlOYCwgdGhlIGxpa2VseSBjdWxwcml0IGlzIHRoYXQgYGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25gIGFsc28gcmV0dXJuZWQgYC1FQUdBSU5gLiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aHkuIFJpZ2h0LCBgY29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbmAgY2FsbHMgYHJlc2VydmVfbW9kdWxlX3RhZ3NgLCB3aGljaCBpcyBpbiBgbW0vYWxsb2NfdGFnLmNgLiBMZXQmIzM5O3MgZGlnIGludG8gdGhhdCBgcmVzZXJ2ZV9tb2R1bGVfdGFnc2AgZnVuY3Rpb24uIEkmIzM5O2xsIHRha2UgYSBsb29rIGF0IHRoZSBjb2RlOgoKYGBgYwoJCWlmICghdGFnc19hZGRyZXNzYWJsZSgpKSB7CgkJCXNodXRkb3duX21lbV9wcm9maWxpbmcodHJ1ZSk7CgkJCXByX3dhcm5fb25jZSgmIzM0O1dpdGggbW9kdWxlICVzIHRoZXJlIGFyZSB0b28gbWFueSB0YWdzIHRvIGZpdCBpbiAlZCBwYWdlIGZsYWcgYml0cy4gTWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIGlzIGRpc2FibGVkIVxuJiMzNDssCgkJCQkgICAgIG1vZC0mZ3Q7bmFtZSwgTlJfVU5VU0VEX1BBR0VGTEFHX0JJVFMpOwoJCQlyZWxlYXNlX21vZHVsZV90YWdzKG1vZCwgZmFsc2UpOwoJCQlyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTsKCQl9CmBgYAoKQWgsIEkgc2VlLiBMb29rcyBsaWtlIHRoZSBtb2R1bGUgaXMgcmVxdWVzdGluZyB0b28gbWFueSB0YWdzLCB0byB0aGUgcG9pbnQgd2hlcmUgdGhleSBjYW4mIzM5O3QgZml0IGludG8gdGhlIGF2YWlsYWJsZSBwYWdlIGZsYWcgYml0cy4gVGhlIHN5c3RlbSBzaHV0cyBkb3duIG1lbW9yeSBwcm9maWxpbmcgdG8gYXZvaWQgYSBwb3RlbnRpYWwgY2F0YXN0cm9waGljIGZhaWx1cmUgYW5kIHRoZW4gaXQgcmV0dXJucyBgLUVBR0FJTmAuIFRoZSBjcnVjaWFsIGRldGFpbCBpcyB0aGF0IGl0ICphbHNvKiBjYWxscyBgcmVsZWFzZV9tb2R1bGVfdGFnc2AgYXQgdGhpcyBwb2ludC4gU28sIHRoZSBtb2R1bGUgaXMgZXNzZW50aWFsbHkgZ2l2ZW4gdXAgb24uCgpOb3csIGlmIGBtb3ZlX21vZHVsZWAgZ2V0cyB0aGlzIGAtRUFHQUlOYCwgaXQganVtcHMgdG8gYG91dF9lcnJgLCB3aGljaCBtZWFucyBtZW1vcnkgaXMgZnJlZWQgYW5kIHRoZW4gaXQgY2FsbHMgYGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnMobW9kKWAuIE5vdywgdGhlIGltcG9ydGFudCBxdWVzdGlvbiBpczogRG9lcyBgY29kZXRhZ19mcmVlX21vZHVsZV9zZWN0aW9uc2AgKmFsc28qIGNhbGwgYHJlbGVhc2VfbW9kdWxlX3RhZ3NgPyBUaGF0JiMzOTtzIHdoYXQgSSBuZWVkIHRvIGNvbmZpcm0uIEkgc2hvdWxkIGNoZWNrIGBjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zYCB0byBiZSBzdXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvY29kZXRhZy5oPTk0PXZvaWQgKmNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxuLS1cbmluY2x1ZGUvbGludXgvY29kZXRhZy5oLTk2LVx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBhbGlnbik7XG5pbmNsdWRlL2xpbnV4L2NvZGV0YWcuaDo5Nzp2b2lkIGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kKTtcbmluY2x1ZGUvbGludXgvY29kZXRhZy5oLTk4LXZvaWQgY29kZXRhZ19tb2R1bGVfcmVwbGFjZWQoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbW9kdWxlICpuZXdfbW9kKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2NvZGV0YWcuaD0xMDg9Y29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbihzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IGNoYXIgKm5hbWUsXG4tLVxuaW5jbHVkZS9saW51eC9jb2RldGFnLmgtMTEwLVx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBhbGlnbikgeyByZXR1cm4gTlVMTDsgfVxuaW5jbHVkZS9saW51eC9jb2RldGFnLmg6MTExOnN0YXRpYyBpbmxpbmUgdm9pZCBjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKHN0cnVjdCBtb2R1bGUgKm1vZCkge31cbmluY2x1ZGUvbGludXgvY29kZXRhZy5oLTExMi1zdGF0aWMgaW5saW5lIHZvaWQgY29kZXRhZ19tb2R1bGVfcmVwbGFjZWQoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbW9kdWxlICpuZXdfbW9kKSB7fVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTI3ODg9c3RhdGljIGludCBtb3ZlX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMjg3MS1cdGlmIChjb2RldGFnX3NlY3Rpb25fZm91bmQpXG5rZXJuZWwvbW9kdWxlL21haW4uYzoyODcyOlx0XHRjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKG1vZCk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0yODczLVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTMwMDQ9c3RhdGljIHZvaWQgbW9kdWxlX2RlYWxsb2NhdGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTMwMDctXHRtb2R1bGVfYXJjaF9mcmVlaW5nX2luaXQobW9kKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjMwMDg6XHRjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKG1vZCk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0zMDA5LVxuLS1cbmxpYi9jb2RldGFnLmM9MjgxPXZvaWQgKmNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxuLS1cbmxpYi9jb2RldGFnLmMtMzA1LVxubGliL2NvZGV0YWcuYzozMDY6dm9pZCBjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKHN0cnVjdCBtb2R1bGUgKm1vZClcbmxpYi9jb2RldGFnLmMtMzA3LXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTM3NDUKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAyMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDoKCioqRGl2aW5nIGludG8gYGNvZGV0YWcuY2AqKgoKT2theSwgc28gSSBuZWVkIHRvIGNoZWNrIG91dCBgY29kZXRhZ19mcmVlX21vZHVsZV9zZWN0aW9uc2Ag4oCTIGxvb2tzIGxpa2UgdGhhdCYjMzk7cyB0aGUgZnVuY3Rpb24gSSBuZWVkIHRvIGZvY3VzIG9uIHJpZ2h0IG5vdy4gSXQmIzM5O3MgaW4gYGxpYi9jb2RldGFnLmNgLCB3aGljaCBtYWtlcyBzZW5zZTsgdGhpcyBwcm9iYWJseSBkZWFscyB3aXRoIHNvbWUgY29yZSByZXNvdXJjZSBtYW5hZ2VtZW50LiBJJiMzOTttIGd1ZXNzaW5nIGl0JiMzOTtzIHBhcnQgb2YgdGhlIGNsZWFudXAgYWZ0ZXIgYSBjb2RldGFnIG1vZHVsZSBpcyBkb25lIGJlaW5nIHVzZWQuIEkmIzM5O2xsIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgc2VjdGlvbnMgYXJlIGFsbG9jYXRlZCB3aXRoaW4gYSBtb2R1bGUsIGFuZCBob3cgdGhpcyBmdW5jdGlvbiBoYW5kbGVzIGRlYWxsb2NhdGlvbiB0byBhdm9pZCBtZW1vcnkgbGVha3Mgb3IgZGFuZ2xpbmcgcG9pbnRlcnMuIExldCYjMzk7cyBnZXQgdG8gdGhlIGNvZGUgYW5kIHNlZSB3aGF0IGl0JiMzOTtzIHJlYWxseSBkb2luZy4gVGltZSB0byBwdXQgb24gbXkgZGVidWdnaW5nIGhhdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtsaWIvY29kZXRhZy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMzA2LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAzMDY6XHR2b2lkIGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kKVxuIDMwNzpcdHtcbiAzMDg6XHRcdHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZTtcbiAzMDk6XHRcbiAzMTA6XHRcdG11dGV4X2xvY2soXHUwMDI2Y29kZXRhZ19sb2NrKTtcbiAzMTE6XHRcdGxpc3RfZm9yX2VhY2hfZW50cnkoY3R0eXBlLCBcdTAwMjZjb2RldGFnX3R5cGVzLCBsaW5rKSB7XG4gMzEyOlx0XHRcdGlmICghY3R0eXBlLVx1MDAzZWRlc2MuZnJlZV9zZWN0aW9uX21lbSlcbiAzMTM6XHRcdFx0XHRjb250aW51ZTtcbiAzMTQ6XHRcbiAzMTU6XHRcdFx0ZG93bl93cml0ZShcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2xvY2spO1xuIDMxNjpcdFx0XHRjdHR5cGUtXHUwMDNlZGVzYy5mcmVlX3NlY3Rpb25fbWVtKG1vZCwgZmFsc2UpO1xuIDMxNzpcdFx0XHR1cF93cml0ZShcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2xvY2spO1xuIDMxODpcdFx0fVxuIDMxOTpcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmNvZGV0YWdfbG9jayk7XG4gMzIwOlx0fVxuIDMyMTpcdFxuIDMyMjpcdHZvaWQgY29kZXRhZ19tb2R1bGVfcmVwbGFjZWQoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbW9kdWxlICpuZXdfbW9kKVxuIDMyMzpcdHtcbiAzMjQ6XHRcdHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZTtcbiAzMjU6XHRcbiAzMjY6XHRcdG11dGV4X2xvY2soXHUwMDI2Y29kZXRhZ19sb2NrKTtcbiAzMjc6XHRcdGxpc3RfZm9yX2VhY2hfZW50cnkoY3R0eXBlLCBcdTAwMjZjb2RldGFnX3R5cGVzLCBsaW5rKSB7XG4gMzI4Olx0XHRcdGlmICghY3R0eXBlLVx1MDAzZWRlc2MubW9kdWxlX3JlcGxhY2VkKVxuIDMyOTpcdFx0XHRcdGNvbnRpbnVlO1xuIDMzMDpcdFxuIDMzMTpcdFx0XHRkb3duX3dyaXRlKFx1MDAyNmN0dHlwZS1cdTAwM2Vtb2RfbG9jayk7XG4gMzMyOlx0XHRcdGN0dHlwZS1cdTAwM2VkZXNjLm1vZHVsZV9yZXBsYWNlZChtb2QsIG5ld19tb2QpO1xuIDMzMzpcdFx0XHR1cF93cml0ZShcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2xvY2spO1xuIDMzNDpcdFx0fVxuIDMzNTpcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmNvZGV0YWdfbG9jayk7XG4gMzM2Olx0fVxuIDMzNzpcdFxuIDMzODpcdGludCBjb2RldGFnX2xvYWRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZClcbiAzMzk6XHR7XG4gMzQwOlx0XHRzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGU7XG4gMzQxOlx0XHRpbnQgcmV0ID0gMDtcbiAzNDI6XHRcbiAzNDM6XHRcdGlmICghbW9kKVxuIDM0NDpcdFx0XHRyZXR1cm4gMDtcbiAzNDU6XHRcbiAzNDY6XHRcdG11dGV4X2xvY2soXHUwMDI2Y29kZXRhZ19sb2NrKTtcbiAzNDc6XHRcdGxpc3RfZm9yX2VhY2hfZW50cnkoY3R0eXBlLCBcdTAwMjZjb2RldGFnX3R5cGVzLCBsaW5rKSB7XG4gMzQ4Olx0XHRcdHJldCA9IGNvZGV0YWdfbW9kdWxlX2luaXQoY3R0eXBlLCBtb2QpO1xuIDM0OTpcdFx0XHRpZiAocmV0KVxuIDM1MDpcdFx0XHRcdGJyZWFrO1xuIDM1MTpcdFx0fVxuIDM1MjpcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmNvZGV0YWdfbG9jayk7XG4gMzUzOlx0XG4gMzU0Olx0XHRyZXR1cm4gcmV0O1xuIDM1NTpcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42My8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQ2NjIKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiAxMDkyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk1vZHVsZSBUYWdnaW5nIGFuZCBBbGxvY2F0aW9uIExvZ2ljIC0gQSBRdWljayBSZXZpZXcqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gSXQgbG9va3MgbGlrZSBgY3R0eXBlLSZndDtkZXNjLmZyZWVfc2VjdGlvbl9tZW1gIGlzIHNpbXBseSBgcmVsZWFzZV9tb2R1bGVfdGFnc2AuIEkgbmVlZCB0byBiZSBjYXJlZnVsIHdpdGggdGhlIGRvdWJsZS1mcmVlIHBvdGVudGlhbC4gSW4gYHJlc2VydmVfbW9kdWxlX3RhZ3NgLCBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgdGFncywgaXQgZGlzYWJsZXMgbWVtb3J5IHByb2ZpbGluZywgd2FybnMsIGFuZCBjYWxscyBgcmVsZWFzZV9tb2R1bGVfdGFncyhtb2QsIGZhbHNlKWAsIHJldHVybmluZyBgLUVBR0FJTmAuIFRoZSBjcml0aWNhbCBwYXRoIGhlcmUgaXMgaWYgdGhpcyBsZWFkcyB0byBhIHJldHJ5LiBgbW92ZV9tb2R1bGVgIGp1bXBzIHRvIGBvdXRfZXJyYCwgd2hpY2ggKnNob3VsZCogY2FsbCBgY29kZXRhZ19mcmVlX21vZHVsZV9zZWN0aW9ucyhtb2QpYCwgd2hpY2ggaXRzZWxmIGNhbGxzIGByZWxlYXNlX21vZHVsZV90YWdzKG1vZCwgZmFsc2UpYCBhZ2Fpbi4gSG93ZXZlciwgYmFzZWQgb24gdGhlIHN0cnVjdHVyZSBoZXJlIGl0IHNob3VsZG4mIzM5O3QgYmUgYW4gaXNzdWU6IGByZWxlYXNlX21vZHVsZV90YWdzYCBjaGVja3MgaWYgdGhlIG1vZHVsZSBpcyBmb3VuZCBpbiB0aGUgbWFwbGUgdHJlZSBgbW9kX2FyZWFfbXRgIGFuZCBpZiBpdCBpcyBub3QgaXQgYmFpbHMuCgpMZXQgbWUgdGhpbmvigKYgaWYgYGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25gIHJldHVybnMgYC1FQUdBSU5gLCB0aGVuIGBjb2RldGFnX3NlY3Rpb25fZm91bmRgICptaWdodCogaGF2ZSBiZWVuIHNldC4gSW4gYG1vdmVfbW9kdWxlYCwgaWYgYGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25gIGZhaWxzIG9uIHRoZSBmaXJzdCBjb2RldGFnIHNlY3Rpb24sIGBjb2RldGFnX3NlY3Rpb25fZm91bmRgIGlzIGZhbHNlLCBhbmQgYGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNgIGlzbiYjMzk7dCBjYWxsZWQuIElmIGl0IGZhaWxzIG9uIHRoZSBzZWNvbmQgc2VjdGlvbiwgaXQgKmlzKiBjYWxsZWQuIEJ1dCBzaW5jZSBgcmVsZWFzZV9tb2R1bGVfdGFnc2AgcmVtb3ZlcyB0aGUgbW9kdWxlIGZyb20gdGhlIG1hcGxlIHRyZWUsIHRoZSBzZWNvbmQgY2FsbCB0byBpdCB3b24mIzM5O3QgZmluZCB0aGUgbW9kdWxlIGFuZCBub3RoaW5nIGJhZCB3aWxsIGhhcHBlbi4gSSB0aGluayB0aGUgZG91YmxlIGZyZWUgaXNzdWUgaXMgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIHN0YXRlLgoKTm93LCBsZXQmIzM5O3MgcmUtZXhhbWluZSB0aGF0IHJldHJ5IGxvZ2ljIGluIGBsYXlvdXRfYW5kX2FsbG9jYXRlYC4gSXQmIzM5O3MgYSBiaXQgdHJpY2t5LiBUaGUgY29kZSBmaXJzdCBsYXlzIG91dCB0aGUgc2VjdGlvbnMgYW5kIHN5bWJvbCB0YWJsZSwgdGhlbiBhdHRlbXB0cyB0byBtb3ZlIHRoZSBtb2R1bGUuIElmIHRoYXQgbW92ZSByZXR1cm5zIGAtRUFHQUlOYCwgaXQgcmV0cmllcy4gVGhlIGludGVyZXN0aW5nIHBhcnQgaGVyZSBpcyB3aGF0IGhhcHBlbnMgd2hlbiBpdCByZXRyaWVzLiBTaXplcyBhcmUgcmVzZXQsIGFuZCB0aGUgaGVhZGVycyBhcmUgcmV3cml0dGVuLiBTcGVjaWZpY2FsbHkgYGluZm8tJmd0O21vZC0mZ3Q7bWVtW3R5cGVdLnNpemUgPSAwO2AgYW5kIGBpbmZvLSZndDtzZWNoZHJzW2luZm8tJmd0O2luZGV4LnN5bV0uc2hfZmxhZ3MgJmFtcDs9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7YC4KCklzIHRoZXJlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyBleHBvc2VkPyBgaW5mby0mZ3Q7bW9kLSZndDttZW1bdHlwZV0uc2l6ZSA9IDBgIGNsZWFycyB0aGUgc2l6ZXMuIGBsYXlvdXRfc2VjdGlvbnNgIHJlY2FsY3VsYXRlcyB0aGVzZSBzaXplcy4gYHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzYCByZXNldHMgYHNoX2FkZHJgIHRvIHRoZSB0ZW1wb3JhcnkgaW1hZ2UuIEkgdGhpbmsgdGhhdCBpcyBvay4gV2FpdCwgYGxheW91dF9zZWN0aW9uc2Agc2V0cyBgc2hfZW50c2l6ZWAgdG8gYH4wVUxgIGFuZCB0aGVuIGNhbGxzIGBfX2xheW91dF9zZWN0aW9uc2AuIGBfX2xheW91dF9zZWN0aW9uc2AgY2FsY3VsYXRlcyBvZmZzZXRzIGFuZCBzZXRzIGBzaF9lbnRzaXplYC4gSXMgdGhlcmUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBOby4gSXQgZG9lc24mIzM5O3Qgc2VlbSB0byBleHBvc2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBub3IgZG9lcyBpdCB1c2UgdW5pbml0aWFsaXplZCBtZW1vcnkgZm9yIGNvbnRyb2wgZmxvdy4gVGhlIGBpbmZvYCBzdHJ1Y3QgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgYXQgdGhpcyBwb2ludC4KCkFoYSEgYGluZm8tJmd0O3NlY2hkcnNbaW5mby0mZ3Q7aW5kZXguc3ltXS5zaF9mbGFncyAmYW1wOz0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztgIGNsZWFycyB0aGUgYFNIRl9BTExPQ2AgZmxhZyBmcm9tIHRoZSBzeW1ib2wgdGFibGUgYW5kIHN0cmluZyB0YWJsZSBzZWN0aW9ucy4gV2h5PyBJIG5lZWQgdG8gY2hlY2sgYGxheW91dF9zeW10YWJgIHRvIHVuZGVyc3RhbmQgdGhpcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42NC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bGF5b3V0X3N5bXRhYiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvaW50ZXJuYWwuaD0zNTY9dm9pZCBpbml0X2J1aWxkX2lkKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3Qgc3RydWN0IGxvYWRfaW5mbyAqaW5mbyk7XG5rZXJuZWwvbW9kdWxlL2ludGVybmFsLmg6MzU3OnZvaWQgbGF5b3V0X3N5bXRhYihzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pO1xua2VybmVsL21vZHVsZS9pbnRlcm5hbC5oLTM1OC12b2lkIGFkZF9rYWxsc3ltcyhzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IHN0cnVjdCBsb2FkX2luZm8gKmluZm8pO1xuLS1cbmtlcm5lbC9tb2R1bGUvaW50ZXJuYWwuaD0zNjU9c3RhdGljIGlubGluZSB2b2lkIGluaXRfYnVpbGRfaWQoc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKSB7IH1cbmtlcm5lbC9tb2R1bGUvaW50ZXJuYWwuaDozNjY6c3RhdGljIGlubGluZSB2b2lkIGxheW91dF9zeW10YWIoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKSB7IH1cbmtlcm5lbC9tb2R1bGUvaW50ZXJuYWwuaC0zNjctc3RhdGljIGlubGluZSB2b2lkIGFkZF9rYWxsc3ltcyhzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IHN0cnVjdCBsb2FkX2luZm8gKmluZm8pIHsgfVxuLS1cbmtlcm5lbC9tb2R1bGUva2FsbHN5bXMuYz03OD1zdGF0aWMgYm9vbCBpc19jb3JlX3N5bWJvbChjb25zdCBFbGZfU3ltICpzcmMsIGNvbnN0IEVsZl9TaGRyICpzZWNoZHJzLFxuLS1cbmtlcm5lbC9tb2R1bGUva2FsbHN5bXMuYy0xMTItICovXG5rZXJuZWwvbW9kdWxlL2thbGxzeW1zLmM6MTEzOnZvaWQgbGF5b3V0X3N5bXRhYihzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXG5rZXJuZWwvbW9kdWxlL2thbGxzeW1zLmMtMTE0LXtcbi0tXG5rZXJuZWwvbW9kdWxlL2thbGxzeW1zLmMtMTY1LS8qXG5rZXJuZWwvbW9kdWxlL2thbGxzeW1zLmM6MTY2OiAqIFdlIHVzZSB0aGUgZnVsbCBzeW10YWIgYW5kIHN0cnRhYiB3aGljaCBsYXlvdXRfc3ltdGFiIGFycmFuZ2VkIHRvXG5rZXJuZWwvbW9kdWxlL2thbGxzeW1zLmMtMTY3LSAqIGJlIGFwcGVuZGVkIHRvIHRoZSBpbml0IHNlY3Rpb24uICBMYXRlciB3ZSBzd2l0Y2ggdG8gdGhlIGN1dC1kb3duXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9Mjk0Mz1zdGF0aWMgc3RydWN0IG1vZHVsZSAqbGF5b3V0X2FuZF9hbGxvY2F0ZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMjk3NS1cdGxheW91dF9zZWN0aW9ucyhpbmZvLVx1MDAzZW1vZCwgaW5mbyk7XG5rZXJuZWwvbW9kdWxlL21haW4uYzoyOTc2Olx0bGF5b3V0X3N5bXRhYihpbmZvLVx1MDAzZW1vZCwgaW5mbyk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTc3LVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjY1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzAwMgoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDEwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqQW5hbHl6aW5nIHRoZSBgbGF5b3V0X3N5bXRhYmAgRnVuY3Rpb24qKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGBsYXlvdXRfc3ltdGFiYCBmdW5jdGlvbi4gSSYjMzk7bSBpbW1lZGlhdGVseSB0aGlua2luZyBhYm91dCBob3cgaXQgZml0cyBpbnRvIHRoZSBvdmVyYWxsIHN5bWJvbCB0YWJsZSBtYW5hZ2VtZW50IHNjaGVtZS4gV2hhdCBsZXZlbCBvZiBhYnN0cmFjdGlvbiBpcyBpdCB3b3JraW5nIGF0PyBJcyBpdCBhIGxvdy1sZXZlbCByb3V0aW5lIGRlYWxpbmcgd2l0aCByYXcgc3RydWN0dXJlcywgb3Igc29tZXRoaW5nIG1vcmUgaGlnaC1sZXZlbCwgcGVyaGFwcyBjb29yZGluYXRpbmcgc2V2ZXJhbCBsb3dlci1sZXZlbCBjYWxscz8gVGhlIG5hbWUgc3VnZ2VzdHMgaXQmIzM5O3MgaW52b2x2ZWQgaW4gdGhlIGxheW91dCBvZiB0aGUgc3ltYm9sIHRhYmxlLCB3aGljaCB1c3VhbGx5IGltcGxpZXMgbWVtb3J5IGFsbG9jYXRpb24gb3IgYXJyYW5nZW1lbnQgb2Ygc3ltYm9sIGVudHJpZXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBpbnB1dHMg4oCTIHdoYXQgZGF0YSBzdHJ1Y3R1cmVzIGRvZXMgaXQgb3BlcmF0ZSBvbj8gQXJlIHdlIHRhbGtpbmcgYWJvdXQgYSBjb21wbGV0ZSBzeW1ib2wgdGFibGUgc3RydWN0dXJlLCBpbmRpdmlkdWFsIHN5bWJvbCBlbnRyaWVzLCBvciBzb21ldGhpbmcgaW4gYmV0d2VlbiwgbGlrZSBhIHRhYmxlIG9mIHN5bWJvbCBidWNrZXRzPyBXaGF0IGFyZSB0aGUgY2FsbGluZyBjb252ZW50aW9ucz8gQXJlIHdlIGRlYWxpbmcgd2l0aCBzb21ldGhpbmcgbGlrZSBhIHNwZWNpZmljIHN5bWJvbCB0YWJsZSBpbXBsZW1lbnRhdGlvbiB3aXRoaW4gYSBjb21waWxlciBvciBsaW5rZXIsIHBlcmhhcHMgdGllZCB0byBhIHBhcnRpY3VsYXIgdGFyZ2V0IGFyY2hpdGVjdHVyZT8gSSBuZWVkIHRvIGxvb2sgZm9yIGFueSBpbmRpY2F0aW9ucyBhYm91dCB0aGUgc2NvcGUgb2YgdGhlIGxheW91dCAtIGlzIGl0IGdsb2JhbCwgcGVyLWNvbXBpbGF0aW9uLXVuaXQsIHBlci1vYmplY3QtZmlsZT8gVGhlIGNvbnRleHQgd2lsbCBiZSBrZXkgaGVyZS4gRmluYWxseSwgSSYjMzk7bSBleHBlY3Rpbmcgc29tZSBraW5kIG9mIG91dHB1dCwgbGlrZWx5IHRoZSBtb2RpZmllZCBkYXRhIHN0cnVjdHVyZXMgcmVwcmVzZW50aW5nIHRoZSBsYWlkLW91dCBzeW1ib2wgdGFibGUgb3IgcG9zc2libHksIHVwZGF0ZXMgdG8gZXh0ZXJuYWwgZGF0YSBzdWNoIGFzIGFsbG9jYXRlZCBvZmZzZXRzIG9yIHBvaW50ZXJzLiBOb3csIGxldCYjMzk7cyBnZXQgaW50byB0aGUgZGV0YWlscyBvZiB0aGUgY29kZSBhbmQgc2VlIGlmIG15IGFzc3VtcHRpb25zIGFsaWduLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjY2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUva2FsbHN5bXMuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDExMywKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTEzOlx0dm9pZCBsYXlvdXRfc3ltdGFiKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbylcbiAxMTQ6XHR7XG4gMTE1Olx0XHRFbGZfU2hkciAqc3ltc2VjdCA9IGluZm8tXHUwMDNlc2VjaGRycyAmIzQzOyBpbmZvLVx1MDAzZWluZGV4LnN5bTtcbiAxMTY6XHRcdEVsZl9TaGRyICpzdHJzZWN0ID0gaW5mby1cdTAwM2VzZWNoZHJzICYjNDM7IGluZm8tXHUwMDNlaW5kZXguc3RyO1xuIDExNzpcdFx0Y29uc3QgRWxmX1N5bSAqc3JjO1xuIDExODpcdFx0dW5zaWduZWQgaW50IGksIG5zcmMsIG5kc3QsIHN0cnRhYl9zaXplID0gMDtcbiAxMTk6XHRcdHN0cnVjdCBtb2R1bGVfbWVtb3J5ICptb2RfbWVtX2RhdGEgPSBcdTAwMjZtb2QtXHUwMDNlbWVtW01PRF9EQVRBXTtcbiAxMjA6XHRcdHN0cnVjdCBtb2R1bGVfbWVtb3J5ICptb2RfbWVtX2luaXRfZGF0YSA9IFx1MDAyNm1vZC1cdTAwM2VtZW1bTU9EX0lOSVRfREFUQV07XG4gMTIxOlx0XG4gMTIyOlx0XHQvKiBQdXQgc3ltYm9sIHNlY3Rpb24gYXQgZW5kIG9mIGluaXQgcGFydCBvZiBtb2R1bGUuICovXG4gMTIzOlx0XHRzeW1zZWN0LVx1MDAzZXNoX2ZsYWdzIHw9IFNIRl9BTExPQztcbiAxMjQ6XHRcdHN5bXNlY3QtXHUwMDNlc2hfZW50c2l6ZSA9IG1vZHVsZV9nZXRfb2Zmc2V0X2FuZF90eXBlKG1vZCwgTU9EX0lOSVRfREFUQSxcbiAxMjU6XHRcdFx0XHRcdFx0XHRcdCBzeW1zZWN0LCBpbmZvLVx1MDAzZWluZGV4LnN5bSk7XG4gMTI2Olx0XHRwcl9kZWJ1ZyhcJiMzNDtcXHQlc1xcblwmIzM0OywgaW5mby1cdTAwM2VzZWNzdHJpbmdzICYjNDM7IHN5bXNlY3QtXHUwMDNlc2hfbmFtZSk7XG4gMTI3Olx0XG4gMTI4Olx0XHRzcmMgPSAodm9pZCAqKWluZm8tXHUwMDNlaGRyICYjNDM7IHN5bXNlY3QtXHUwMDNlc2hfb2Zmc2V0O1xuIDEyOTpcdFx0bnNyYyA9IHN5bXNlY3QtXHUwMDNlc2hfc2l6ZSAvIHNpemVvZigqc3JjKTtcbiAxMzA6XHRcbiAxMzE6XHRcdC8qIENvbXB1dGUgdG90YWwgc3BhY2UgcmVxdWlyZWQgZm9yIHRoZSBjb3JlIHN5bWJvbHMmIzM5OyBzdHJ0YWIuICovXG4gMTMyOlx0XHRmb3IgKG5kc3QgPSBpID0gMDsgaSBcdTAwM2MgbnNyYzsgaSYjNDM7JiM0MzspIHtcbiAxMzM6XHRcdFx0aWYgKGkgPT0gMCB8fCBpc19saXZlcGF0Y2hfbW9kdWxlKG1vZCkgfHxcbiAxMzQ6XHRcdFx0ICAgIGlzX2NvcmVfc3ltYm9sKHNyYyAmIzQzOyBpLCBpbmZvLVx1MDAzZXNlY2hkcnMsIGluZm8tXHUwMDNlaGRyLVx1MDAzZWVfc2hudW0sXG4gMTM1Olx0XHRcdFx0XHQgICBpbmZvLVx1MDAzZWluZGV4LnBjcHUpKSB7XG4gMTM2Olx0XHRcdFx0c3RydGFiX3NpemUgJiM0Mzs9IHN0cmxlbihcdTAwMjZpbmZvLVx1MDAzZXN0cnRhYltzcmNbaV0uc3RfbmFtZV0pICYjNDM7IDE7XG4gMTM3Olx0XHRcdFx0bmRzdCYjNDM7JiM0Mzs7XG4gMTM4Olx0XHRcdH1cbiAxMzk6XHRcdH1cbiAxNDA6XHRcbiAxNDE6XHRcdC8qIEFwcGVuZCByb29tIGZvciBjb3JlIHN5bWJvbHMgYXQgZW5kIG9mIGNvcmUgcGFydC4gKi9cbiAxNDI6XHRcdGluZm8tXHUwMDNlc3ltb2ZmcyA9IEFMSUdOKG1vZF9tZW1fZGF0YS1cdTAwM2VzaXplLCBzeW1zZWN0LVx1MDAzZXNoX2FkZHJhbGlnbiA/OiAxKTtcbiAxNDM6XHRcdGluZm8tXHUwMDNlc3Ryb2ZmcyA9IG1vZF9tZW1fZGF0YS1cdTAwM2VzaXplID0gaW5mby1cdTAwM2VzeW1vZmZzICYjNDM7IG5kc3QgKiBzaXplb2YoRWxmX1N5bSk7XG4gMTQ0Olx0XHRtb2RfbWVtX2RhdGEtXHUwMDNlc2l6ZSAmIzQzOz0gc3RydGFiX3NpemU7XG4gMTQ1Olx0XHQvKiBOb3RlIGFkZF9rYWxsc3ltcygpIGNvbXB1dGVzIHN0cnRhYl9zaXplIGFzIGNvcmVfdHlwZW9mZnMgLSBzdHJvZmZzICovXG4gMTQ2Olx0XHRpbmZvLVx1MDAzZWNvcmVfdHlwZW9mZnMgPSBtb2RfbWVtX2RhdGEtXHUwMDNlc2l6ZTtcbiAxNDc6XHRcdG1vZF9tZW1fZGF0YS1cdTAwM2VzaXplICYjNDM7PSBuZHN0ICogc2l6ZW9mKGNoYXIpO1xuIDE0ODpcdFxuIDE0OTpcdFx0LyogUHV0IHN0cmluZyB0YWJsZSBzZWN0aW9uIGF0IGVuZCBvZiBpbml0IHBhcnQgb2YgbW9kdWxlLiAqL1xuIDE1MDpcdFx0c3Ryc2VjdC1cdTAwM2VzaF9mbGFncyB8PSBTSEZfQUxMT0M7XG4gMTUxOlx0XHRzdHJzZWN0LVx1MDAzZXNoX2VudHNpemUgPSBtb2R1bGVfZ2V0X29mZnNldF9hbmRfdHlwZShtb2QsIE1PRF9JTklUX0RBVEEsXG4gMTUyOlx0XHRcdFx0XHRcdFx0XHQgc3Ryc2VjdCwgaW5mby1cdTAwM2VpbmRleC5zdHIpO1xuIDE1MzpcdFx0cHJfZGVidWcoXCYjMzQ7XFx0JXNcXG5cJiMzNDssIGluZm8tXHUwMDNlc2Vjc3RyaW5ncyAmIzQzOyBzdHJzZWN0LVx1MDAzZXNoX25hbWUpO1xuIDE1NDpcdFxuIDE1NTpcdFx0LyogV2UmIzM5O2xsIHRhY2sgdGVtcG9yYXJ5IG1vZF9rYWxsc3ltcyBvbiB0aGUgZW5kLiAqL1xuIDE1NjpcdFx0bW9kX21lbV9pbml0X2RhdGEtXHUwMDNlc2l6ZSA9IEFMSUdOKG1vZF9tZW1faW5pdF9kYXRhLVx1MDAzZXNpemUsXG4gMTU3Olx0XHRcdFx0XHRcdF9fYWxpZ25vZl9fKHN0cnVjdCBtb2Rfa2FsbHN5bXMpKTtcbiAxNTg6XHRcdGluZm8tXHUwMDNlbW9kX2thbGxzeW1zX2luaXRfb2ZmID0gbW9kX21lbV9pbml0X2RhdGEtXHUwMDNlc2l6ZTtcbiAxNTk6XHRcbiAxNjA6XHRcdG1vZF9tZW1faW5pdF9kYXRhLVx1MDAzZXNpemUgJiM0Mzs9IHNpemVvZihzdHJ1Y3QgbW9kX2thbGxzeW1zKTtcbiAxNjE6XHRcdGluZm8tXHUwMDNlaW5pdF90eXBlb2ZmcyA9IG1vZF9tZW1faW5pdF9kYXRhLVx1MDAzZXNpemU7XG4gMTYyOlx0XHRtb2RfbWVtX2luaXRfZGF0YS1cdTAwM2VzaXplICYjNDM7PSBuc3JjICogc2l6ZW9mKGNoYXIpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjY3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODQwNwoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDM2OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgUG90ZW50aWFsIE1lbW9yeSBVbmluaXRpYWxpemF0aW9uIGluIFNlY3Rpb24gTGF5b3V0KioKCk9rYXksIHNvIGBsYXlvdXRfc3ltdGFiYCBpcyByZXNwb25zaWJsZSBmb3Igc2V0dGluZyB0aGUgYFNIRl9BTExPQ2AgZmxhZyBvbiB0aGUgc3ltYm9sIHNlY3Rpb24gKGBzeW1zZWN0YCkgYW5kIHRoZSBzdHJpbmcgc2VjdGlvbiAoYHN0cnNlY3RgKS4gSXQgYWxzbyBmaWd1cmVzIG91dCBzaXplcyBhbmQgb2Zmc2V0cywgd2hpY2ggaXMgYSBrZXkgcGFydCBvZiBtZW1vcnkgbGF5b3V0LiBOb3csIGlmIGBsYXlvdXRfYW5kX2FsbG9jYXRlYCBuZWVkcyB0byByZXRyeSwgaXQgZmlyc3QgKmNsZWFycyogdGhlIGBTSEZfQUxMT0NgIGZsYWcgYW5kIHJlc2V0cyB0aG9zZSBzZWN0aW9uIHNpemVzIHRvIHplcm8uIFRoZW4gYGxheW91dF9zZWN0aW9uc2AgYW5kIGBsYXlvdXRfc3ltdGFiYCBnZXQgY2FsbGVkIGFnYWluLgoKTXkgaW1tZWRpYXRlIGNvbmNlcm4gaXM6IElzIHRoZXJlIGEgcG90ZW50aWFsIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSB0byBzbmVhayBpbiBoZXJlPyBXZSYjMzk7cmUgcmVzZXR0aW5nIHNpemVzIHRvIHplcm8gZHVyaW5nIHJldHJpZXMsIGJ1dCB3aGF0IGFib3V0IHRoZSBhY3R1YWwgY29udGVudHM/IEJ1dCB3YWl0LCBubywgYmVjYXVzZSBgaW5mby0mZ3Q7bW9kLSZndDttZW1bdHlwZV0uc2l6ZWAgKmlzKiByZXNldCB0byB6ZXJvLiBUaGF0IG1ha2VzIHNlbnNlLCBiZWNhdXNlIGBsYXlvdXRfc2VjdGlvbnNgIGFuZCB0aGVuIGBsYXlvdXRfc3ltdGFiYCByZWNhbGN1bGF0ZSB0aGUgc2l6ZXMgY29ycmVjdGx5LiBUaGVuIGBtb3ZlX21vZHVsZWAgZ29lcyB0byBhbGxvY2F0ZSBtZW1vcnkgYmFzZWQgb24gdGhlc2UgKm5ldyogc2l6ZXMuCgpUaGUgYWxsb2NhdGlvbiB1c2VzIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCwgd2hpY2ggaW4gdHVybiBjYWxscyBgbW9kdWxlX2FsbG9jYCBvciBgdm1hbGxvY2AuIFRoYXQgbWFrZXMgbWUgYSBsaXR0bGUgdW5lYXN5IGJlY2F1c2UgSSBrbm93IGBtb2R1bGVfbWVtb3J5X2FsbG9jYCB1bHRpbWF0ZWx5IHVzZXMgdGhpbmdzIGxpa2UgYGV4ZWNtZW1fYWxsb2NgIG9yIHNpbWlsYXIsIGFuZCB0aG9zZSAqbWlnaHQqIG5vdCB6ZXJvLWluaXRpYWxpemUgdGhlIGFsbG9jYXRlZCBtZW1vcnkuIEhvd2V2ZXIsIGBtb3ZlX21vZHVsZWAgc2VlbXMgdG8gY29weSB0aGUgc2VjdGlvbiBkYXRhIGZyb20gYSB0ZW1wb3JhcnkgaW1hZ2UgdG8gdGhlIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkuCgpMb29raW5nIGF0IHRoZSBjb2RlLCBzcGVjaWZpY2FsbHkgdGhlIGxvb3AgdGhhdCBjb3BpZXMgdGhlIHNlY3Rpb25zOgoKYGBgYwoJCWZvciAoaSA9IDA7IGkgJmx0OyBpbmZvLSZndDtoZHItJmd0O2Vfc2hudW07IGkmIzQzOyYjNDM7KSB7CgkJCS8vIC4uLgoJCQlpZiAoc2hkci0mZ3Q7c2hfdHlwZSAhPSBTSFRfTk9CSVRTKSB7CgkJCQkvLyAuLi4KCQkJCW1lbWNweShkZXN0LCAodm9pZCAqKXNoZHItJmd0O3NoX2FkZHIsIHNoZHItJmd0O3NoX3NpemUpOwoJCQl9CmBgYAoKU28sIGl0ICpjb3BpZXMqIGNvbnRlbnQgaWYgdGhlIHNlY3Rpb24gdHlwZSBpcyAqbm90KiBgU0hUX05PQklUU2AuIFRoYXQmIzM5O3MgZ29vZCwgYmVjYXVzZSBhbnkgYWN0dWFsIGRhdGEgaXMgYmVpbmcgcHJvcGVybHkgdHJhbnNmZXJyZWQuIEhvd2V2ZXIsIGZvciBgU0hUX05PQklUU2Agc2VjdGlvbnMgKGxpa2UgdGhlIEJTUyksIG5vdGhpbmcgaXMgY29waWVkLiBUaGF0JiMzOTtzIGV4YWN0bHkgd2hlcmUgSSBuZWVkIHRvIHplcm8gb3V0IG1lbW9yeSBpZiB0aGVyZSYjMzk7cyBubyBkZWZpbmVkIHNlY3Rpb24gY29udGVudHMuIFNvIG15IGxpbmdlcmluZyB3b3JyeSBpcyBkb2VzIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCB6ZXJvIG91dCB0aGF0IG1lbW9yeSBvbiBpdHMgb3duPyBJdCYjMzk7cyBlc3NlbnRpYWwgdG8gY2hlY2sgdGhlIGltcGxlbWVudGF0aW9uIG9mIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCBtb3JlIGNsb3NlbHkgdG8gYmUgY2VydGFpbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42OC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bW9kdWxlX21lbW9yeV9hbGxvYyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvbWFpbi5jPTEzMzc9dm9pZCBfX3dlYWsgbW9kdWxlX2FyY2hfZnJlZWluZ19pbml0KHN0cnVjdCBtb2R1bGUgKm1vZClcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xMzQwLVxua2VybmVsL21vZHVsZS9tYWluLmM6MTM0MTpzdGF0aWMgaW50IG1vZHVsZV9tZW1vcnlfYWxsb2Moc3RydWN0IG1vZHVsZSAqbW9kLCBlbnVtIG1vZF9tZW1fdHlwZSB0eXBlKVxua2VybmVsL21vZHVsZS9tYWluLmMtMTM0Mi17XG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9Mjc4OD1zdGF0aWMgaW50IG1vdmVfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbylcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yNzk5LVxua2VybmVsL21vZHVsZS9tYWluLmM6MjgwMDpcdFx0cmV0ID0gbW9kdWxlX21lbW9yeV9hbGxvYyhtb2QsIHR5cGUpO1xua2VybmVsL21vZHVsZS9tYWluLmMtMjgwMS1cdFx0aWYgKHJldCkge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjY5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTUzNwoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDExCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgbXkgdGFrZSBvbiB1bmRlcnN0YW5kaW5nIHRoaXMgY29kZToKCioqQW5hbHl6aW5nIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZ2V0IGRvd24gdG8gaXQuIEkmIzM5O20gZ29pbmcgdG8gc3RhcnQgYnkgdGFraW5nIGEgY2xvc2UgbG9vayBhdCB0aGlzIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCBtb2R1bGUuIEFzIGFuIGV4cGVydCBpbiBteSBmaWVsZCwgSSBrbm93IHRoZSBzaWduaWZpY2FuY2Ugb2YgbWVtb3J5IGFsbG9jYXRpb24gYW5kIG1hbmFnZW1lbnQsIHNvIHRoaXMgaXMgd2hlcmUgSSYjMzk7bGwgYmUgZm9jdXNpbmcuIE15IGluaXRpYWwgdGhvdWdodCBwcm9jZXNzIGlzIHRvIHVuZGVyc3RhbmQgaXRzIHB1cnBvc2Ugd2l0aGluIHRoZSBicm9hZGVyIHN5c3RlbS4gV2hhdCYjMzk7cyBpdCBkb2luZz8gSXMgaXQgaGFuZGxpbmcgZHluYW1pYyBtZW1vcnksIHN0YXRpYyBhbGxvY2F0aW9uLCBvciBhIG1peD8gV2hhdCBraW5kIG9mIGRhdGEgc3RydWN0dXJlcyBhcmUgYmVpbmcgdXNlZCB0byB0cmFjayBtZW1vcnkgYmxvY2tzPyBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgc2NvcGUgb2YgaXRzIHJlc3BvbnNpYmlsaXRpZXMuIElzIGl0IGEgY29yZSBjb21wb25lbnQgb3IgYSB1dGlsaXR5IG1vZHVsZT8gV2hhdCBhcmUgaXRzIGRlcGVuZGVuY2llcz8gSSYjMzk7bGwgcHJvYmFibHkgYmUgYXNraW5nIG15c2VsZiB0aGVzZSBxdWVzdGlvbnMgYXMgSSBnby4gVWx0aW1hdGVseSwgSSYjMzk7bSBleHBlY3RpbmcgdGhpcyBpcyBhbGwgYWJvdXQgdW5kZXJzdGFuZGluZyBtZW1vcnkgbWFuYWdlbWVudCBzdHJhdGVneS4gTGV0JiMzOTtzIGRpZyBpbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvbW9kdWxlL21haW4uYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEzNDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTM0MTpcdHN0YXRpYyBpbnQgbW9kdWxlX21lbW9yeV9hbGxvYyhzdHJ1Y3QgbW9kdWxlICptb2QsIGVudW0gbW9kX21lbV90eXBlIHR5cGUpXG4xMzQyOlx0e1xuMTM0MzpcdFx0dW5zaWduZWQgaW50IHNpemUgPSBQQUdFX0FMSUdOKG1vZC1cdTAwM2VtZW1bdHlwZV0uc2l6ZSk7XG4xMzQ0Olx0XHRlbnVtIGV4ZWNtZW1fdHlwZSBleGVjbWVtX3R5cGU7XG4xMzQ1Olx0XHR2b2lkICpwdHI7XG4xMzQ2Olx0XG4xMzQ3Olx0XHRtb2QtXHUwMDNlbWVtW3R5cGVdLnNpemUgPSBzaXplO1xuMTM0ODpcdFxuMTM0OTpcdFx0aWYgKG1vZF9tZW1fdHlwZV9pc19kYXRhKHR5cGUpKVxuMTM1MDpcdFx0XHRleGVjbWVtX3R5cGUgPSBFWEVDTUVNX01PRFVMRV9EQVRBO1xuMTM1MTpcdFx0ZWxzZVxuMTM1MjpcdFx0XHRleGVjbWVtX3R5cGUgPSBFWEVDTUVNX01PRFVMRV9URVhUO1xuMTM1MzpcdFxuMTM1NDpcdFx0cHRyID0gZXhlY21lbV9hbGxvY19ydyhleGVjbWVtX3R5cGUsIHNpemUpO1xuMTM1NTpcdFx0aWYgKCFwdHIpXG4xMzU2Olx0XHRcdHJldHVybiAtRU5PTUVNO1xuMTM1NzpcdFxuMTM1ODpcdFx0bW9kLVx1MDAzZW1lbVt0eXBlXS5pc19yb3ggPSBleGVjbWVtX2lzX3JveChleGVjbWVtX3R5cGUpO1xuMTM1OTpcdFxuMTM2MDpcdFx0LypcbjEzNjE6XHRcdCAqIFRoZSBwb2ludGVyIHRvIHRoZXNlIGJsb2NrcyBvZiBtZW1vcnkgYXJlIHN0b3JlZCBvbiB0aGUgbW9kdWxlXG4xMzYyOlx0XHQgKiBzdHJ1Y3R1cmUgYW5kIHdlIGtlZXAgdGhhdCBhcm91bmQgc28gbG9uZyBhcyB0aGUgbW9kdWxlIGlzXG4xMzYzOlx0XHQgKiBhcm91bmQuIFdlIG9ubHkgZnJlZSB0aGF0IG1lbW9yeSB3aGVuIHdlIHVubG9hZCB0aGUgbW9kdWxlLlxuMTM2NDpcdFx0ICogSnVzdCBtYXJrIHRoZW0gYXMgbm90IGJlaW5nIGEgbGVhayB0aGVuLiBUaGUgLmluaXQqIEVMRlxuMTM2NTpcdFx0ICogc2VjdGlvbnMgKmRvKiBnZXQgZnJlZWQgYWZ0ZXIgYm9vdCBzbyB3ZSAqY291bGQqIHRyZWF0IHRoZW1cbjEzNjY6XHRcdCAqIHNsaWdodGx5IGRpZmZlcmVudGx5IHdpdGgga21lbWxlYWtfaWdub3JlKCkgYW5kIG9ubHkgZ3JleVxuMTM2NzpcdFx0ICogdGhlbSBvdXQgYXMgdGhleSB3b3JrIGFzIHR5cGljYWwgbWVtb3J5IGFsbG9jYXRpb25zIHdoaWNoXG4xMzY4Olx0XHQgKiAqZG8qIGV2ZW50dWFsbHkgZ2V0IGZyZWVkLCBidXQgbGV0JiMzOTtzIGp1c3Qga2VlcCB0aGluZ3Mgc2ltcGxlXG4xMzY5Olx0XHQgKiBhbmQgYXZvaWQgKmFueSogZmFsc2UgcG9zaXRpdmVzLlxuMTM3MDpcdFx0ICovXG4xMzcxOlx0XHRpZiAoIW1vZC1cdTAwM2VtZW1bdHlwZV0uaXNfcm94KVxuMTM3MjpcdFx0XHRrbWVtbGVha19ub3RfbGVhayhwdHIpO1xuMTM3MzpcdFxuMTM3NDpcdFx0bWVtc2V0KHB0ciwgMCwgc2l6ZSk7XG4xMzc1Olx0XHRtb2QtXHUwMDNlbWVtW3R5cGVdLmJhc2UgPSBwdHI7XG4xMzc2Olx0XG4xMzc3Olx0XHRyZXR1cm4gMDtcbjEzNzg6XHR9XG4xMzc5Olx0XG4xMzgwOlx0c3RhdGljIHZvaWQgbW9kdWxlX21lbW9yeV9yZXN0b3JlX3JveChzdHJ1Y3QgbW9kdWxlICptb2QpXG4xMzgxOlx0e1xuMTM4MjpcdFx0Zm9yX2NsYXNzX21vZF9tZW1fdHlwZSh0eXBlLCB0ZXh0KSB7XG4xMzgzOlx0XHRcdHN0cnVjdCBtb2R1bGVfbWVtb3J5ICptZW0gPSBcdTAwMjZtb2QtXHUwMDNlbWVtW3R5cGVdO1xuMTM4NDpcdFxuMTM4NTpcdFx0XHRpZiAobWVtLVx1MDAzZWlzX3JveClcbjEzODY6XHRcdFx0XHRleGVjbWVtX3Jlc3RvcmVfcm94KG1lbS1cdTAwM2ViYXNlLCBtZW0tXHUwMDNlc2l6ZSk7XG4xMzg3Olx0XHR9XG4xMzg4Olx0fVxuMTM4OTpcdFxuMTM5MDpcdHN0YXRpYyB2b2lkIG1vZHVsZV9tZW1vcnlfZnJlZShzdHJ1Y3QgbW9kdWxlICptb2QsIGVudW0gbW9kX21lbV90eXBlIHR5cGUpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NzEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwNTU0CgkJCQkJCQlvdXRwdXQ6IDIwMQoJCQkJCQkJdGhvdWdodHM6IDIyNzMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gQXNzZXNzbWVudDogTm8gVW5pbml0aWFsaXplZCBNZW1vcnkgUmVhZCBSaXNrKioKCkFscmlnaHQsIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCB3YXMgdG8gdmVyaWZ5IGlmIHRoZXJlJiMzOTtzIGEgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBkdWUgdG8gdGhlc2UgY2hhbmdlcy4gVGhlIGZpcnN0IHBvaW50IG9mIGNvbmNlcm4gd2FzIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCwgYnV0IGl0IGltbWVkaWF0ZWx5IHVzZXMgYG1lbXNldGAsIHNvIHRoYXQmIzM5O3MgYSBub24taXNzdWUg4oCTIHRoZSBtZW1vcnkgaXMgZ3VhcmFudGVlZCB6ZXJvZWQuCgpJIHRoZW4gbG9va2VkIGF0IGBtbS9hbGxvY190YWcuY2AsIHdoZXJlIHRoZXJlJiMzOTtzIGEgY2hlY2sgZm9yIGB0YWdzX2FkZHJlc3NhYmxlKClgLiBJZiB0aGUgbnVtYmVyIG9mIGFsbG9jYXRpb24gdGFncyBpcyB0b28gbGFyZ2UsIHRoZSBwYXRjaCBkaXNhYmxlcyBtZW1vcnkgcHJvZmlsaW5nIGFuZCByZXRyaWVzLiBUaGlzIGxlZCBtZSB0byBpbnZlc3RpZ2F0ZSB3aGV0aGVyIHJldHJ5IGxvZ2ljIGluIGBrZXJuZWwvbW9kdWxlL21haW4uY2AgY291bGQgaW50cm9kdWNlIHVuaW5pdGlhbGl6ZWQgcmVhZHMuIFRoYXQgcmV0cnkgbG9naWMgcmVzZXRzIGFuZCByZWNhbGN1bGF0ZXMgb2Zmc2V0cyAoYGluZm8tJmd0O3N5bW9mZnNgLCBgaW5mby0mZ3Q7c3Ryb2Zmc2AsIGV0Yy4pIHdpdGhpbiB0aGUgbW9kdWxlJiMzOTtzIHNlY3Rpb24gaGVhZGVycyBiZWZvcmUgcmVzdGFydGluZyB0aGUgbW9kdWxlIGxvYWQuIEkgdmVyaWZpZWQgdGhhdCB0aGVzZSBvZmZzZXRzIGFyZSAqaW5kZWVkKiByZWNhbGN1bGF0ZWQgYW5kIHRoZSBzaXplcyAoYHNoX2VudHNpemVgKSBhcmUgcmVzZXQgYW5kIHNldCBhcHByb3ByaWF0ZWx5LiBgcmV3cml0ZV9zZWN0aW9uX2hlYWRlcnNgIGxvb2tzIGdvb2QsIGl0JiMzOTtzIGp1c3QgbWFya2luZyBhZGRyZXNzZXMuCgpJIGNvbnNpZGVyZWQgd2hldGhlciB0aGlzIHJlbG9hZCBvciBhbnkgbmV3IGxvZ2ljIGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeSB0byB1c2Vyc3BhY2UuIE5vLCB0aGUgY29udGV4dCBpcyBrZXJuZWwgbW9kdWxlIGxvYWRpbmcsIHRoZXJlJiMzOTtzIG5vIGRpcmVjdCBpbnRlcmFjdGlvbiB3aXRoIHVzZXItc3BhY2UgbWVtb3J5IGluIGEgd2F5IHRoYXQgd291bGQgaW50cm9kdWNlIGxlYWtzIG9yIGV4cG9zZSB1bmluaXRpYWxpemVkIGRhdGEuIFRoZSBhbGxvY2F0ZWQgbW9kdWxlIG1lbW9yeSByZW1haW5zIHplcm9lZCBhbmQgdGhlIHBhdGNoIGRvZXNuJiMzOTt0IGludHJvZHVjZSBhbnkgbmV3IHN0cnVjdHVyZXMgc2VudCB0byB1c2Vyc3BhY2UsIG5vciBhbnkgY29uZGl0aW9uYWwgbG9naWMgZGVwZW5kZW50IG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLiBUaGUgbmV3IGZ1bmN0aW9uIGByZWxlYXNlX21vZHVsZV90YWdzYCBpcyBqdXN0IGEgbW92ZWQgZnVuY3Rpb24gYW5kIGRvZXNuJiMzOTt0IGludHJvZHVjZSB1bmluaXRpYWxpemVkIG1lbW9yeS4KClRoZSBwYXRjaCYjMzk7cyBjaGFuZ2VzIGFyZSBzb2xlbHkgZm9jdXNlZCBvbiBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgdGFncywgYWRkaW5nIGEgcmV0cnkgbWVjaGFuaXNtLiBUaGVyZWZvcmUsIGFueSBidWdzIHdvdWxkIGxpa2VseSBtYW5pZmVzdCBhcyBsb2dpYyBlcnJvcnMsIG1lbW9yeSBsZWFrcywgb3IgY3Jhc2hlcyDigJMgaXNzdWVzIHRoYXQgYXJlIHdlbGwgd2l0aGluIHRoZSBzY29wZSBvZiBLQVNBTiYjMzk7cyBkZXRlY3Rpb24gY2FwYWJpbGl0aWVzLiBLTVNBTiAoS2VybmVsIE1lbW9yeSBTYW5pdGl6ZXIpIGlzIGRlc2lnbmVkIHNwZWNpZmljYWxseSBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGJ1dCBzaW5jZSB0aGUgbWVtb3J5IGlzIGJlaW5nIGV4cGxpY2l0bHkgemVyb2VkLCBLTVNBTiBpcyBub3QgbmVjZXNzYXJ5IGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NzIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQ1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBtb2R1bGUgbG9hZGluZyBwcm9jZXNzIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgdGFncyBleGNlZWQgYXZhaWxhYmxlIHBhZ2UgZmxhZyBiaXRzLiBJdCBpbnRyb2R1Y2VzIGEgcmV0cnkgbWVjaGFuaXNtIGluIGBsYXlvdXRfYW5kX2FsbG9jYXRlYCB0aGF0IHJlc2V0cyBzZWN0aW9uIGhlYWRlcnMgYW5kIHNpemVzLCBhbmQgcmV0cmllcyB0aGUgYWxsb2NhdGlvbiB3aXRob3V0IHByb2ZpbGluZy4gVGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIG1vZHVsZXMgaXMgZXhwbGljaXRseSB6ZXJvZWQgYnkgYG1vZHVsZV9tZW1vcnlfYWxsb2NgICh2aWEgYG1lbXNldChwdHIsIDAsIHNpemUpYCkuIFRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2UgYW55IG5ldyBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2Vyc3BhY2UsIG5vciBkbyB0aGV5IGFkZCBjb21wbGV4IGNvbmRpdGlvbmFsIGxvZ2ljIGRlcGVuZGluZyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy4gQW55IHBvdGVudGlhbCBidWdzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaCAoZS5nLiwgaW5jb3JyZWN0IHNpemUgY2FsY3VsYXRpb25zLCBtZW1vcnkgbGVha3MsIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgZHVyaW5nIHNlY3Rpb24gY29weWluZykgd291bGQgYmUgcmVsaWFibHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIHRvb2xzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgbW9kdWxlIGxvYWRpbmcgcHJvY2VzcyB0byBoYW5kbGUgY2FzZXMgd2hlcmUgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHRhZ3MgZXhjZWVkIGF2YWlsYWJsZSBwYWdlIGZsYWcgYml0cy4gSXQgaW50cm9kdWNlcyBhIHJldHJ5IG1lY2hhbmlzbSBpbiBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAgdGhhdCByZXNldHMgc2VjdGlvbiBoZWFkZXJzIGFuZCBzaXplcywgYW5kIHJldHJpZXMgdGhlIGFsbG9jYXRpb24gd2l0aG91dCBwcm9maWxpbmcuIFRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBtb2R1bGVzIGlzIGV4cGxpY2l0bHkgemVyb2VkIGJ5IGBtb2R1bGVfbWVtb3J5X2FsbG9jYCAodmlhIGBtZW1zZXQocHRyLCAwLCBzaXplKWApLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIGFueSBuZXcgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlcnNwYWNlLCBub3IgZG8gdGhleSBhZGQgY29tcGxleCBjb25kaXRpb25hbCBsb2dpYyBkZXBlbmRpbmcgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggKGUuZy4sIGluY29ycmVjdCBzaXplIGNhbGN1bGF0aW9ucywgbWVtb3J5IGxlYWtzLCBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIGR1cmluZyBzZWN0aW9uIGNvcHlpbmcpIHdvdWxkIGJlIHJlbGlhYmx5IGNhdWdodCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyB0b29scy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgbmVjZXNzaXRhdGUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDozODoxNi43NTk5MjE3OTFaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0MjAzNDk3MTMwMjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNX0FMTE9DX1BST0ZJTElOR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25cIixcbiAgICBcImNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNcIixcbiAgICBcImNvZGV0YWdfbG9hZF9tb2R1bGVcIixcbiAgICBcImNvZGV0YWdfdW5sb2FkX21vZHVsZVwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIG1vZHVsZSBsb2FkaW5nIHByb2Nlc3MgdG8gaGFuZGxlIGNhc2VzIHdoZXJlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyB0YWdzIGV4Y2VlZCBhdmFpbGFibGUgcGFnZSBmbGFnIGJpdHMuIEl0IGludHJvZHVjZXMgYSByZXRyeSBtZWNoYW5pc20gaW4gYGxheW91dF9hbmRfYWxsb2NhdGVgIHRoYXQgcmVzZXRzIHNlY3Rpb24gaGVhZGVycyBhbmQgc2l6ZXMsIGFuZCByZXRyaWVzIHRoZSBhbGxvY2F0aW9uIHdpdGhvdXQgcHJvZmlsaW5nLiBUaGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgbW9kdWxlcyBpcyBleHBsaWNpdGx5IHplcm9lZCBieSBgbW9kdWxlX21lbW9yeV9hbGxvY2AgKHZpYSBgbWVtc2V0KHB0ciwgMCwgc2l6ZSlgKS4gVGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBhbnkgbmV3IHN0cnVjdHVyZXMgY29waWVkIHRvIHVzZXJzcGFjZSwgbm9yIGRvIHRoZXkgYWRkIGNvbXBsZXggY29uZGl0aW9uYWwgbG9naWMgZGVwZW5kaW5nIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLiBBbnkgcG90ZW50aWFsIGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoIChlLmcuLCBpbmNvcnJlY3Qgc2l6ZSBjYWxjdWxhdGlvbnMsIG1lbW9yeSBsZWFrcywgb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBkdXJpbmcgc2VjdGlvbiBjb3B5aW5nKSB3b3VsZCBiZSByZWxpYWJseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgdG9vbHMuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mby1sZWFrcyB0aGF0IHdvdWxkIG5lY2Vzc2l0YXRlIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgY29yZSBtb2R1bGUgbG9hZGluZyBsb2dpYyB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHJ1bnMgb3V0IG9mIHBhZ2UgZmxhZyBiaXRzICghdGFnc19hZGRyZXNzYWJsZSgpKS4gSXQgaW50cm9kdWNlcyBhIHJldHJ5IG1lY2hhbmlzbSBpbiBsYXlvdXRfYW5kX2FsbG9jYXRlKCkgdGhhdCByZXNldHMgdGhlIG1vZHVsZSBzdGF0ZSBhbmQgcmV0cmllcyBsb2FkaW5nIHdpdGhvdXQgbWVtb3J5IHByb2ZpbGluZy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIG1vZHVsZSBsb2FkaW5nIHBhdGggYW5kIG1lbW9yeSBhbGxvY2F0aW9uIHRhZ2dpbmcgc3Vic3lzdGVtLCB3aGljaCBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIGluaXRfbW9kdWxlIGFuZCBmaW5pdF9tb2R1bGUgc3lzY2FsbHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjM4OjE2Ljc1OTkzMDU2MVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQyODI3MjY4OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDZmOWZmNWNlMzU0YzU0YjJmNmY3NWQ5MmZiNTZlMjdjY2E5N2ZkNzBcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIE1vbiBBdWcgMTAgMTA6Mzg6MTQgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS9tYWluLmMgYi9rZXJuZWwvbW9kdWxlL21haW4uY1xcbmluZGV4IDQ2ZGQ4ZDI1YTYwNTguLmMzMmJiNDdhNTczYTEgMTAwNjQ0XFxuLS0tIGEva2VybmVsL21vZHVsZS9tYWluLmNcXG4rKysgYi9rZXJuZWwvbW9kdWxlL21haW4uY1xcbkBAIC0yOTcxLDEzICsyOTcxLDI2IEBAIHN0YXRpYyBzdHJ1Y3QgbW9kdWxlICpsYXlvdXRfYW5kX2FsbG9jYXRlKHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGludCBmbGFncylcXG4gXFx0ICogdGhpcyBpcyBkb25lIGdlbmVyaWNhbGx5OyB0aGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhbnlcXG4gXFx0ICogc3BlY2lhbCBjYXNlcyBmb3IgdGhlIGFyY2hpdGVjdHVyZXMuXFxuIFxcdCAqL1xcbityZXRyeTpcXG4gXFx0bGF5b3V0X3NlY3Rpb25zKGluZm8tXFx1MDAzZW1vZCwgaW5mbyk7XFxuIFxcdGxheW91dF9zeW10YWIoaW5mby1cXHUwMDNlbW9kLCBpbmZvKTtcXG4gXFxuIFxcdC8qIEFsbG9jYXRlIGFuZCBtb3ZlIHRvIHRoZSBmaW5hbCBwbGFjZSAqL1xcbiBcXHRlcnIgPSBtb3ZlX21vZHVsZShpbmZvLVxcdTAwM2Vtb2QsIGluZm8pO1xcbi1cXHRpZiAoZXJyKVxcbi1cXHRcXHRyZXR1cm4gRVJSX1BUUihlcnIpO1xcbitcXHRpZiAoZXJyKSB7XFxuK1xcdFxcdGlmIChlcnIgIT0gLUVBR0FJTilcXG4rXFx0XFx0XFx0cmV0dXJuIEVSUl9QVFIoZXJyKTtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogLUVBR0FJTiBtZWFucyBwcm9maWxpbmcgd2FzIGRpc2FibGVkIGJ1dCB0aGUgbW9kdWxlXFxuK1xcdFxcdCAqIGNhbiBzdGlsbCBsb2FkIHdpdGhvdXQgaXQuIFJlc2V0IHN0YXRlIGFuZCByZXRyeS5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzKGluZm8sIGZsYWdzKTtcXG4rXFx0XFx0Zm9yX2VhY2hfbW9kX21lbV90eXBlKHR5cGUpXFxuK1xcdFxcdFxcdGluZm8tXFx1MDAzZW1vZC1cXHUwMDNlbWVtW3R5cGVdLnNpemUgPSAwO1xcbitcXHRcXHRpbmZvLVxcdTAwM2VzZWNoZHJzW2luZm8tXFx1MDAzZWluZGV4LnN5bV0uc2hfZmxhZ3MgXFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcXG4rXFx0XFx0aW5mby1cXHUwMDNlc2VjaGRyc1tpbmZvLVxcdTAwM2VpbmRleC5zdHJdLnNoX2ZsYWdzIFxcdTAwMjY9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7XFxuK1xcdFxcdGdvdG8gcmV0cnk7XFxuK1xcdH1cXG4gXFxuIFxcdC8qIE1vZHVsZSBoYXMgYmVlbiBjb3BpZWQgdG8gaXRzIGZpbmFsIHBsYWNlIG5vdzogcmV0dXJuIGl0LiAqL1xcbiBcXHRtb2QgPSAodm9pZCAqKWluZm8tXFx1MDAzZXNlY2hkcnNbaW5mby1cXHUwMDNlaW5kZXgubW9kXS5zaF9hZGRyO1xcbmRpZmYgLS1naXQgYS9tbS9hbGxvY190YWcuYyBiL21tL2FsbG9jX3RhZy5jXFxuaW5kZXggNTJhZWNlMjdiMDBlMC4uM2ViYTYzMzExNzRkYSAxMDA2NDRcXG4tLS0gYS9tbS9hbGxvY190YWcuY1xcbisrKyBiL21tL2FsbG9jX3RhZy5jXFxuQEAgLTgzNSw2ICs4MzUsNTIgQEAgc3RhdGljIGludCB2bV9tb2R1bGVfdGFnc19wb3B1bGF0ZSh2b2lkKVxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4rc3RhdGljIHZvaWQgcmVsZWFzZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIGJvb2wgdXNlZClcXG4re1xcbitcXHRNQV9TVEFURShtYXMsIFxcdTAwMjZtb2RfYXJlYV9tdCwgbW9kdWxlX3RhZ3Muc2l6ZSwgbW9kdWxlX3RhZ3Muc2l6ZSk7XFxuK1xcdHN0cnVjdCBhbGxvY190YWcgKnN0YXJ0X3RhZztcXG4rXFx0c3RydWN0IGFsbG9jX3RhZyAqZW5kX3RhZztcXG4rXFx0c3RydWN0IG1vZHVsZSAqdmFsO1xcbitcXG4rXFx0bWFzX2xvY2soXFx1MDAyNm1hcyk7XFxuK1xcdG1hc19mb3JfZWFjaF9yZXYoXFx1MDAyNm1hcywgdmFsLCAwKVxcbitcXHRcXHRpZiAodmFsID09IG1vZClcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcbitcXHRpZiAoIXZhbCkgLyogbW9kdWxlIG5vdCBmb3VuZCAqL1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGlmICghdXNlZClcXG4rXFx0XFx0Z290byByZWxlYXNlX2FyZWE7XFxuK1xcbitcXHRzdGFydF90YWcgPSAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICsgbWFzLmluZGV4KTtcXG4rXFx0ZW5kX3RhZyA9IChzdHJ1Y3QgYWxsb2NfdGFnICopKG1vZHVsZV90YWdzLnN0YXJ0X2FkZHIgKyBtYXMubGFzdCk7XFxuK1xcdGlmICghY2xlYW5fdW51c2VkX2NvdW50ZXJzKHN0YXJ0X3RhZywgZW5kX3RhZykpIHtcXG4rXFx0XFx0c3RydWN0IGFsbG9jX3RhZyAqdGFnO1xcbitcXG4rXFx0XFx0Zm9yICh0YWcgPSBzdGFydF90YWc7IHRhZyBcXHUwMDNjPSBlbmRfdGFnOyB0YWcrKykge1xcbitcXHRcXHRcXHRzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzIGNvdW50ZXI7XFxuK1xcbitcXHRcXHRcXHRpZiAoIXRhZy1cXHUwMDNlY291bnRlcnMpXFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4rXFx0XFx0XFx0Y291bnRlciA9IGFsbG9jX3RhZ19yZWFkKHRhZyk7XFxuK1xcdFxcdFxcdHByX2luZm8oXFxcIiVzOiV1IG1vZHVsZSAlcyBmdW5jOiVzIGhhcyAlbGx1IGFsbG9jYXRlZCBhdCBtb2R1bGUgdW5sb2FkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHR0YWctXFx1MDAzZWN0LmZpbGVuYW1lLCB0YWctXFx1MDAzZWN0LmxpbmVubywgdGFnLVxcdTAwM2VjdC5tb2RuYW1lLFxcbitcXHRcXHRcXHRcXHR0YWctXFx1MDAzZWN0LmZ1bmN0aW9uLCBjb3VudGVyLmJ5dGVzKTtcXG4rXFx0XFx0fVxcbitcXHR9IGVsc2Uge1xcbitcXHRcXHR1c2VkID0gZmFsc2U7XFxuK1xcdH1cXG4rcmVsZWFzZV9hcmVhOlxcbitcXHRtYXNfc3RvcmUoXFx1MDAyNm1hcywgdXNlZCA/IFxcdTAwMjZ1bmxvYWRlZF9tb2QgOiBOVUxMKTtcXG4rXFx0dmFsID0gbWFzX3ByZXZfcmFuZ2UoXFx1MDAyNm1hcywgMCk7XFxuK1xcdGlmICh2YWwgPT0gXFx1MDAyNnByZXBlbmRfbW9kKVxcbitcXHRcXHRtYXNfc3RvcmUoXFx1MDAyNm1hcywgTlVMTCk7XFxuK291dDpcXG4rXFx0bWFzX3VubG9jayhcXHUwMDI2bWFzKTtcXG4rfVxcbitcXG4gc3RhdGljIHZvaWQgKnJlc2VydmVfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBsb25nIHNpemUsXFxuIFxcdFxcdFxcdFxcdCB1bnNpZ25lZCBpbnQgcHJlcGVuZCwgdW5zaWduZWQgbG9uZyBhbGlnbilcXG4ge1xcbkBAIC05MDQsMTAgKzk1MCwxMiBAQCBzdGF0aWMgdm9pZCAqcmVzZXJ2ZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcXG4gXFx0XFx0aW50IGdyb3dfcmVzO1xcbiBcXG4gXFx0XFx0bW9kdWxlX3RhZ3Muc2l6ZSA9IG9mZnNldCArIHNpemU7XFxuLVxcdFxcdGlmIChtZW1fYWxsb2NfcHJvZmlsaW5nX2VuYWJsZWQoKSBcXHUwMDI2XFx1MDAyNiAhdGFnc19hZGRyZXNzYWJsZSgpKSB7XFxuK1xcdFxcdGlmICghdGFnc19hZGRyZXNzYWJsZSgpKSB7XFxuIFxcdFxcdFxcdHNodXRkb3duX21lbV9wcm9maWxpbmcodHJ1ZSk7XFxuLVxcdFxcdFxcdHByX3dhcm4oXFxcIldpdGggbW9kdWxlICVzIHRoZXJlIGFyZSB0b28gbWFueSB0YWdzIHRvIGZpdCBpbiAlZCBwYWdlIGZsYWcgYml0cy4gTWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIGlzIGRpc2FibGVkIVxcXFxuXFxcIixcXG4tXFx0XFx0XFx0XFx0bW9kLVxcdTAwM2VuYW1lLCBOUl9VTlVTRURfUEFHRUZMQUdfQklUUyk7XFxuK1xcdFxcdFxcdHByX3dhcm5fb25jZShcXFwiV2l0aCBtb2R1bGUgJXMgdGhlcmUgYXJlIHRvbyBtYW55IHRhZ3MgdG8gZml0IGluICVkIHBhZ2UgZmxhZyBiaXRzLiBNZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgaXMgZGlzYWJsZWQhXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgIG1vZC1cXHUwMDNlbmFtZSwgTlJfVU5VU0VEX1BBR0VGTEFHX0JJVFMpO1xcbitcXHRcXHRcXHRyZWxlYXNlX21vZHVsZV90YWdzKG1vZCwgZmFsc2UpO1xcbitcXHRcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTtcXG4gXFx0XFx0fVxcbiBcXG4gXFx0XFx0Z3Jvd19yZXMgPSB2bV9tb2R1bGVfdGFnc19wb3B1bGF0ZSgpO1xcbkBAIC05MjIsNTIgKzk3MCw2IEBAIHN0YXRpYyB2b2lkICpyZXNlcnZlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWduZWQgbG9uZyBzaXplLFxcbiBcXHRyZXR1cm4gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciArIG9mZnNldCk7XFxuIH1cXG4gXFxuLXN0YXRpYyB2b2lkIHJlbGVhc2VfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCBib29sIHVzZWQpXFxuLXtcXG4tXFx0TUFfU1RBVEUobWFzLCBcXHUwMDI2bW9kX2FyZWFfbXQsIG1vZHVsZV90YWdzLnNpemUsIG1vZHVsZV90YWdzLnNpemUpO1xcbi1cXHRzdHJ1Y3QgYWxsb2NfdGFnICpzdGFydF90YWc7XFxuLVxcdHN0cnVjdCBhbGxvY190YWcgKmVuZF90YWc7XFxuLVxcdHN0cnVjdCBtb2R1bGUgKnZhbDtcXG4tXFxuLVxcdG1hc19sb2NrKFxcdTAwMjZtYXMpO1xcbi1cXHRtYXNfZm9yX2VhY2hfcmV2KFxcdTAwMjZtYXMsIHZhbCwgMClcXG4tXFx0XFx0aWYgKHZhbCA9PSBtb2QpXFxuLVxcdFxcdFxcdGJyZWFrO1xcbi1cXG4tXFx0aWYgKCF2YWwpIC8qIG1vZHVsZSBub3QgZm91bmQgKi9cXG4tXFx0XFx0Z290byBvdXQ7XFxuLVxcbi1cXHRpZiAoIXVzZWQpXFxuLVxcdFxcdGdvdG8gcmVsZWFzZV9hcmVhO1xcbi1cXG4tXFx0c3RhcnRfdGFnID0gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciArIG1hcy5pbmRleCk7XFxuLVxcdGVuZF90YWcgPSAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICsgbWFzLmxhc3QpO1xcbi1cXHRpZiAoIWNsZWFuX3VudXNlZF9jb3VudGVycyhzdGFydF90YWcsIGVuZF90YWcpKSB7XFxuLVxcdFxcdHN0cnVjdCBhbGxvY190YWcgKnRhZztcXG4tXFxuLVxcdFxcdGZvciAodGFnID0gc3RhcnRfdGFnOyB0YWcgXFx1MDAzYz0gZW5kX3RhZzsgdGFnKyspIHtcXG4tXFx0XFx0XFx0c3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyBjb3VudGVyO1xcbi1cXG4tXFx0XFx0XFx0aWYgKCF0YWctXFx1MDAzZWNvdW50ZXJzKVxcbi1cXHRcXHRcXHRcXHRjb250aW51ZTtcXG4tXFxuLVxcdFxcdFxcdGNvdW50ZXIgPSBhbGxvY190YWdfcmVhZCh0YWcpO1xcbi1cXHRcXHRcXHRwcl9pbmZvKFxcXCIlczoldSBtb2R1bGUgJXMgZnVuYzolcyBoYXMgJWxsdSBhbGxvY2F0ZWQgYXQgbW9kdWxlIHVubG9hZFxcXFxuXFxcIixcXG4tXFx0XFx0XFx0XFx0dGFnLVxcdTAwM2VjdC5maWxlbmFtZSwgdGFnLVxcdTAwM2VjdC5saW5lbm8sIHRhZy1cXHUwMDNlY3QubW9kbmFtZSxcXG4tXFx0XFx0XFx0XFx0dGFnLVxcdTAwM2VjdC5mdW5jdGlvbiwgY291bnRlci5ieXRlcyk7XFxuLVxcdFxcdH1cXG4tXFx0fSBlbHNlIHtcXG4tXFx0XFx0dXNlZCA9IGZhbHNlO1xcbi1cXHR9XFxuLXJlbGVhc2VfYXJlYTpcXG4tXFx0bWFzX3N0b3JlKFxcdTAwMjZtYXMsIHVzZWQgPyBcXHUwMDI2dW5sb2FkZWRfbW9kIDogTlVMTCk7XFxuLVxcdHZhbCA9IG1hc19wcmV2X3JhbmdlKFxcdTAwMjZtYXMsIDApO1xcbi1cXHRpZiAodmFsID09IFxcdTAwMjZwcmVwZW5kX21vZClcXG4tXFx0XFx0bWFzX3N0b3JlKFxcdTAwMjZtYXMsIE5VTEwpO1xcbi1vdXQ6XFxuLVxcdG1hc191bmxvY2soXFx1MDAyNm1hcyk7XFxuLX1cXG4tXFxuIHN0YXRpYyBpbnQgbG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgY29kZXRhZyAqc3RhcnQsIHN0cnVjdCBjb2RldGFnICpzdG9wKVxcbiB7XFxuIFxcdC8qIEFsbG9jYXRlIG1vZHVsZSBhbGxvY190YWcgcGVyY3B1IGNvdW50ZXJzICovXFxuQEAgLTk3NSw2ICs5NzcsOSBAQCBzdGF0aWMgaW50IGxvYWRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGNvZGV0YWcgKnN0YXJ0LCBzdHJ1Y3QgY29kZXRhZ1xcbiBcXHRzdHJ1Y3QgYWxsb2NfdGFnICpzdG9wX3RhZztcXG4gXFx0c3RydWN0IGFsbG9jX3RhZyAqdGFnO1xcbiBcXG4rXFx0aWYgKCFtZW1fcHJvZmlsaW5nX3N1cHBvcnQpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4gXFx0LyogcGVyY3B1IGNvdW50ZXJzIGZvciBjb3JlIGFsbG9jYXRpb25zIGFyZSBhbHJlYWR5IHN0YXRpY2FsbHkgYWxsb2NhdGVkICovXFxuIFxcdGlmICghbW9kKVxcbiBcXHRcXHRyZXR1cm4gMDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6Mzg6MTguMTg5MjMzNTNaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoyNjgwNDU0Mzk3OTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNX0FMTE9DX1BST0ZJTElOR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25cIixcbiAgICBcImNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNcIixcbiAgICBcImNvZGV0YWdfbG9hZF9tb2R1bGVcIixcbiAgICBcImNvZGV0YWdfdW5sb2FkX21vZHVsZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBjb3JlIG1vZHVsZSBsb2FkaW5nIGxvZ2ljIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgcnVucyBvdXQgb2YgcGFnZSBmbGFnIGJpdHMgKCF0YWdzX2FkZHJlc3NhYmxlKCkpLiBJdCBpbnRyb2R1Y2VzIGEgcmV0cnkgbWVjaGFuaXNtIGluIGxheW91dF9hbmRfYWxsb2NhdGUoKSB0aGF0IHJlc2V0cyB0aGUgbW9kdWxlIHN0YXRlIGFuZCByZXRyaWVzIGxvYWRpbmcgd2l0aG91dCBtZW1vcnkgcHJvZmlsaW5nLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgbW9kdWxlIGxvYWRpbmcgcGF0aCBhbmQgbWVtb3J5IGFsbG9jYXRpb24gdGFnZ2luZyBzdWJzeXN0ZW0sIHdoaWNoIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgaW5pdF9tb2R1bGUgYW5kIGZpbml0X21vZHVsZSBzeXNjYWxscy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNmY5ZmY1Y2UzNTRjNTRiMmY2Zjc1ZDkyZmI1NmUyN2NjYTk3ZmQ3MFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gQXVnIDEwIDEwOjM4OjE0IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS9tYWluLmMgYi9rZXJuZWwvbW9kdWxlL21haW4uY1xuaW5kZXggNDZkZDhkMjVhNjA1OC4uYzMyYmI0N2E1NzNhMSAxMDA2NDRcbi0tLSBhL2tlcm5lbC9tb2R1bGUvbWFpbi5jXG4rKysgYi9rZXJuZWwvbW9kdWxlL21haW4uY1xuQEAgLTI5NzEsMTMgKzI5NzEsMjYgQEAgc3RhdGljIHN0cnVjdCBtb2R1bGUgKmxheW91dF9hbmRfYWxsb2NhdGUoc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgaW50IGZsYWdzKVxuIFx0ICogdGhpcyBpcyBkb25lIGdlbmVyaWNhbGx5OyB0aGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhbnlcbiBcdCAqIHNwZWNpYWwgY2FzZXMgZm9yIHRoZSBhcmNoaXRlY3R1cmVzLlxuIFx0ICovXG4rcmV0cnk6XG4gXHRsYXlvdXRfc2VjdGlvbnMoaW5mby1cdTAwM2Vtb2QsIGluZm8pO1xuIFx0bGF5b3V0X3N5bXRhYihpbmZvLVx1MDAzZW1vZCwgaW5mbyk7XG4gXG4gXHQvKiBBbGxvY2F0ZSBhbmQgbW92ZSB0byB0aGUgZmluYWwgcGxhY2UgKi9cbiBcdGVyciA9IG1vdmVfbW9kdWxlKGluZm8tXHUwMDNlbW9kLCBpbmZvKTtcbi1cdGlmIChlcnIpXG4tXHRcdHJldHVybiBFUlJfUFRSKGVycik7XG4rXHRpZiAoZXJyKSB7XG4rXHRcdGlmIChlcnIgIT0gLUVBR0FJTilcbitcdFx0XHRyZXR1cm4gRVJSX1BUUihlcnIpO1xuK1x0XHQvKlxuK1x0XHQgKiAtRUFHQUlOIG1lYW5zIHByb2ZpbGluZyB3YXMgZGlzYWJsZWQgYnV0IHRoZSBtb2R1bGVcbitcdFx0ICogY2FuIHN0aWxsIGxvYWQgd2l0aG91dCBpdC4gUmVzZXQgc3RhdGUgYW5kIHJldHJ5LlxuK1x0XHQgKi9cbitcdFx0cmV3cml0ZV9zZWN0aW9uX2hlYWRlcnMoaW5mbywgZmxhZ3MpO1xuK1x0XHRmb3JfZWFjaF9tb2RfbWVtX3R5cGUodHlwZSlcbitcdFx0XHRpbmZvLVx1MDAzZW1vZC1cdTAwM2VtZW1bdHlwZV0uc2l6ZSA9IDA7XG4rXHRcdGluZm8tXHUwMDNlc2VjaGRyc1tpbmZvLVx1MDAzZWluZGV4LnN5bV0uc2hfZmxhZ3MgXHUwMDI2PSB+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DO1xuK1x0XHRpbmZvLVx1MDAzZXNlY2hkcnNbaW5mby1cdTAwM2VpbmRleC5zdHJdLnNoX2ZsYWdzIFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcbitcdFx0Z290byByZXRyeTtcbitcdH1cbiBcbiBcdC8qIE1vZHVsZSBoYXMgYmVlbiBjb3BpZWQgdG8gaXRzIGZpbmFsIHBsYWNlIG5vdzogcmV0dXJuIGl0LiAqL1xuIFx0bW9kID0gKHZvaWQgKilpbmZvLVx1MDAzZXNlY2hkcnNbaW5mby1cdTAwM2VpbmRleC5tb2RdLnNoX2FkZHI7XG5kaWZmIC0tZ2l0IGEvbW0vYWxsb2NfdGFnLmMgYi9tbS9hbGxvY190YWcuY1xuaW5kZXggNTJhZWNlMjdiMDBlMC4uM2ViYTYzMzExNzRkYSAxMDA2NDRcbi0tLSBhL21tL2FsbG9jX3RhZy5jXG4rKysgYi9tbS9hbGxvY190YWcuY1xuQEAgLTgzNSw2ICs4MzUsNTIgQEAgc3RhdGljIGludCB2bV9tb2R1bGVfdGFnc19wb3B1bGF0ZSh2b2lkKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuK3N0YXRpYyB2b2lkIHJlbGVhc2VfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCBib29sIHVzZWQpXG4re1xuK1x0TUFfU1RBVEUobWFzLCBcdTAwMjZtb2RfYXJlYV9tdCwgbW9kdWxlX3RhZ3Muc2l6ZSwgbW9kdWxlX3RhZ3Muc2l6ZSk7XG4rXHRzdHJ1Y3QgYWxsb2NfdGFnICpzdGFydF90YWc7XG4rXHRzdHJ1Y3QgYWxsb2NfdGFnICplbmRfdGFnO1xuK1x0c3RydWN0IG1vZHVsZSAqdmFsO1xuK1xuK1x0bWFzX2xvY2soXHUwMDI2bWFzKTtcbitcdG1hc19mb3JfZWFjaF9yZXYoXHUwMDI2bWFzLCB2YWwsIDApXG4rXHRcdGlmICh2YWwgPT0gbW9kKVxuK1x0XHRcdGJyZWFrO1xuK1xuK1x0aWYgKCF2YWwpIC8qIG1vZHVsZSBub3QgZm91bmQgKi9cbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoIXVzZWQpXG4rXHRcdGdvdG8gcmVsZWFzZV9hcmVhO1xuK1xuK1x0c3RhcnRfdGFnID0gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciArIG1hcy5pbmRleCk7XG4rXHRlbmRfdGFnID0gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciArIG1hcy5sYXN0KTtcbitcdGlmICghY2xlYW5fdW51c2VkX2NvdW50ZXJzKHN0YXJ0X3RhZywgZW5kX3RhZykpIHtcbitcdFx0c3RydWN0IGFsbG9jX3RhZyAqdGFnO1xuK1xuK1x0XHRmb3IgKHRhZyA9IHN0YXJ0X3RhZzsgdGFnIFx1MDAzYz0gZW5kX3RhZzsgdGFnKyspIHtcbitcdFx0XHRzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzIGNvdW50ZXI7XG4rXG4rXHRcdFx0aWYgKCF0YWctXHUwMDNlY291bnRlcnMpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcbitcdFx0XHRjb3VudGVyID0gYWxsb2NfdGFnX3JlYWQodGFnKTtcbitcdFx0XHRwcl9pbmZvKFwiJXM6JXUgbW9kdWxlICVzIGZ1bmM6JXMgaGFzICVsbHUgYWxsb2NhdGVkIGF0IG1vZHVsZSB1bmxvYWRcXG5cIixcbitcdFx0XHRcdHRhZy1cdTAwM2VjdC5maWxlbmFtZSwgdGFnLVx1MDAzZWN0LmxpbmVubywgdGFnLVx1MDAzZWN0Lm1vZG5hbWUsXG4rXHRcdFx0XHR0YWctXHUwMDNlY3QuZnVuY3Rpb24sIGNvdW50ZXIuYnl0ZXMpO1xuK1x0XHR9XG4rXHR9IGVsc2Uge1xuK1x0XHR1c2VkID0gZmFsc2U7XG4rXHR9XG4rcmVsZWFzZV9hcmVhOlxuK1x0bWFzX3N0b3JlKFx1MDAyNm1hcywgdXNlZCA/IFx1MDAyNnVubG9hZGVkX21vZCA6IE5VTEwpO1xuK1x0dmFsID0gbWFzX3ByZXZfcmFuZ2UoXHUwMDI2bWFzLCAwKTtcbitcdGlmICh2YWwgPT0gXHUwMDI2cHJlcGVuZF9tb2QpXG4rXHRcdG1hc19zdG9yZShcdTAwMjZtYXMsIE5VTEwpO1xuK291dDpcbitcdG1hc191bmxvY2soXHUwMDI2bWFzKTtcbit9XG4rXG4gc3RhdGljIHZvaWQgKnJlc2VydmVfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBsb25nIHNpemUsXG4gXHRcdFx0XHQgdW5zaWduZWQgaW50IHByZXBlbmQsIHVuc2lnbmVkIGxvbmcgYWxpZ24pXG4ge1xuQEAgLTkwNCwxMCArOTUwLDEyIEBAIHN0YXRpYyB2b2lkICpyZXNlcnZlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWduZWQgbG9uZyBzaXplLFxuIFx0XHRpbnQgZ3Jvd19yZXM7XG4gXG4gXHRcdG1vZHVsZV90YWdzLnNpemUgPSBvZmZzZXQgKyBzaXplO1xuLVx0XHRpZiAobWVtX2FsbG9jX3Byb2ZpbGluZ19lbmFibGVkKCkgXHUwMDI2XHUwMDI2ICF0YWdzX2FkZHJlc3NhYmxlKCkpIHtcbitcdFx0aWYgKCF0YWdzX2FkZHJlc3NhYmxlKCkpIHtcbiBcdFx0XHRzaHV0ZG93bl9tZW1fcHJvZmlsaW5nKHRydWUpO1xuLVx0XHRcdHByX3dhcm4oXCJXaXRoIG1vZHVsZSAlcyB0aGVyZSBhcmUgdG9vIG1hbnkgdGFncyB0byBmaXQgaW4gJWQgcGFnZSBmbGFnIGJpdHMuIE1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBpcyBkaXNhYmxlZCFcXG5cIixcbi1cdFx0XHRcdG1vZC1cdTAwM2VuYW1lLCBOUl9VTlVTRURfUEFHRUZMQUdfQklUUyk7XG4rXHRcdFx0cHJfd2Fybl9vbmNlKFwiV2l0aCBtb2R1bGUgJXMgdGhlcmUgYXJlIHRvbyBtYW55IHRhZ3MgdG8gZml0IGluICVkIHBhZ2UgZmxhZyBiaXRzLiBNZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgaXMgZGlzYWJsZWQhXFxuXCIsXG4rXHRcdFx0XHQgICAgIG1vZC1cdTAwM2VuYW1lLCBOUl9VTlVTRURfUEFHRUZMQUdfQklUUyk7XG4rXHRcdFx0cmVsZWFzZV9tb2R1bGVfdGFncyhtb2QsIGZhbHNlKTtcbitcdFx0XHRyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTtcbiBcdFx0fVxuIFxuIFx0XHRncm93X3JlcyA9IHZtX21vZHVsZV90YWdzX3BvcHVsYXRlKCk7XG5AQCAtOTIyLDUyICs5NzAsNiBAQCBzdGF0aWMgdm9pZCAqcmVzZXJ2ZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbiBcdHJldHVybiAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICsgb2Zmc2V0KTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgcmVsZWFzZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIGJvb2wgdXNlZClcbi17XG4tXHRNQV9TVEFURShtYXMsIFx1MDAyNm1vZF9hcmVhX210LCBtb2R1bGVfdGFncy5zaXplLCBtb2R1bGVfdGFncy5zaXplKTtcbi1cdHN0cnVjdCBhbGxvY190YWcgKnN0YXJ0X3RhZztcbi1cdHN0cnVjdCBhbGxvY190YWcgKmVuZF90YWc7XG4tXHRzdHJ1Y3QgbW9kdWxlICp2YWw7XG4tXG4tXHRtYXNfbG9jayhcdTAwMjZtYXMpO1xuLVx0bWFzX2Zvcl9lYWNoX3JldihcdTAwMjZtYXMsIHZhbCwgMClcbi1cdFx0aWYgKHZhbCA9PSBtb2QpXG4tXHRcdFx0YnJlYWs7XG4tXG4tXHRpZiAoIXZhbCkgLyogbW9kdWxlIG5vdCBmb3VuZCAqL1xuLVx0XHRnb3RvIG91dDtcbi1cbi1cdGlmICghdXNlZClcbi1cdFx0Z290byByZWxlYXNlX2FyZWE7XG4tXG4tXHRzdGFydF90YWcgPSAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICsgbWFzLmluZGV4KTtcbi1cdGVuZF90YWcgPSAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICsgbWFzLmxhc3QpO1xuLVx0aWYgKCFjbGVhbl91bnVzZWRfY291bnRlcnMoc3RhcnRfdGFnLCBlbmRfdGFnKSkge1xuLVx0XHRzdHJ1Y3QgYWxsb2NfdGFnICp0YWc7XG4tXG4tXHRcdGZvciAodGFnID0gc3RhcnRfdGFnOyB0YWcgXHUwMDNjPSBlbmRfdGFnOyB0YWcrKykge1xuLVx0XHRcdHN0cnVjdCBhbGxvY190YWdfY291bnRlcnMgY291bnRlcjtcbi1cbi1cdFx0XHRpZiAoIXRhZy1cdTAwM2Vjb3VudGVycylcbi1cdFx0XHRcdGNvbnRpbnVlO1xuLVxuLVx0XHRcdGNvdW50ZXIgPSBhbGxvY190YWdfcmVhZCh0YWcpO1xuLVx0XHRcdHByX2luZm8oXCIlczoldSBtb2R1bGUgJXMgZnVuYzolcyBoYXMgJWxsdSBhbGxvY2F0ZWQgYXQgbW9kdWxlIHVubG9hZFxcblwiLFxuLVx0XHRcdFx0dGFnLVx1MDAzZWN0LmZpbGVuYW1lLCB0YWctXHUwMDNlY3QubGluZW5vLCB0YWctXHUwMDNlY3QubW9kbmFtZSxcbi1cdFx0XHRcdHRhZy1cdTAwM2VjdC5mdW5jdGlvbiwgY291bnRlci5ieXRlcyk7XG4tXHRcdH1cbi1cdH0gZWxzZSB7XG4tXHRcdHVzZWQgPSBmYWxzZTtcbi1cdH1cbi1yZWxlYXNlX2FyZWE6XG4tXHRtYXNfc3RvcmUoXHUwMDI2bWFzLCB1c2VkID8gXHUwMDI2dW5sb2FkZWRfbW9kIDogTlVMTCk7XG4tXHR2YWwgPSBtYXNfcHJldl9yYW5nZShcdTAwMjZtYXMsIDApO1xuLVx0aWYgKHZhbCA9PSBcdTAwMjZwcmVwZW5kX21vZClcbi1cdFx0bWFzX3N0b3JlKFx1MDAyNm1hcywgTlVMTCk7XG4tb3V0OlxuLVx0bWFzX3VubG9jayhcdTAwMjZtYXMpO1xuLX1cbi1cbiBzdGF0aWMgaW50IGxvYWRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGNvZGV0YWcgKnN0YXJ0LCBzdHJ1Y3QgY29kZXRhZyAqc3RvcClcbiB7XG4gXHQvKiBBbGxvY2F0ZSBtb2R1bGUgYWxsb2NfdGFnIHBlcmNwdSBjb3VudGVycyAqL1xuQEAgLTk3NSw2ICs5NzcsOSBAQCBzdGF0aWMgaW50IGxvYWRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGNvZGV0YWcgKnN0YXJ0LCBzdHJ1Y3QgY29kZXRhZ1xuIFx0c3RydWN0IGFsbG9jX3RhZyAqc3RvcF90YWc7XG4gXHRzdHJ1Y3QgYWxsb2NfdGFnICp0YWc7XG4gXG4rXHRpZiAoIW1lbV9wcm9maWxpbmdfc3VwcG9ydClcbitcdFx0cmV0dXJuIDA7XG4rXG4gXHQvKiBwZXJjcHUgY291bnRlcnMgZm9yIGNvcmUgYWxsb2NhdGlvbnMgYXJlIGFscmVhZHkgc3RhdGljYWxseSBhbGxvY2F0ZWQgKi9cbiBcdGlmICghbW9kKVxuIFx0XHRyZXR1cm4gMDtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjM4OjE4LjE4OTIzNTQzWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NzIwMTcyNDQ5NzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBNb2R1bGUgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGdvdCBhIHBhdGNoIGhlcmUgdGhhdCdzIHRvdWNoaW5nIGBrZXJuZWwvbW9kdWxlL21haW4uY2AgYW5kIGBtbS9hbGxvY190YWcuY2AsIHdoaWNoIGlzIGludGVyZXN0aW5nLiBJdCBsb29rcyBsaWtlIHRoZSBtYWluIGZvY3VzIGlzIGFyb3VuZCBob3cgd2UgaGFuZGxlIGAtRUFHQUlOYCBlcnJvcnMgY29taW5nIGJhY2sgZnJvbSBgbW92ZV9tb2R1bGUoKWAuIFJpZ2h0LCBzbyBgbW92ZV9tb2R1bGUoKWAgaXMgdGhlIG9uZSB0aGF0J3Mgbm93IHBvdGVudGlhbGx5IHJldHVybmluZyB0aGlzIGVycm9yLCBsaWtlbHkgcmVsYXRlZCB0byB0aGUgYHJlc2VydmVfbW9kdWxlX3RhZ3MoKWAgY2FsbC4gVGhhdCBtYWtlcyBzZW5zZSwgYmVjYXVzZSBJIGtub3cgYHJlc2VydmVfbW9kdWxlX3RhZ3MoKWAgaW4gYG1tL2FsbG9jX3RhZy5jYCBpcyBiZWluZyB1cGRhdGVkIHRvIHJldHVybiBgRVJSX1BUUigtRUFHQUlOKWAgaWYgYCF0YWdzX2FkZHJlc3NhYmxlKClgLlxuXG5TbywgdGhlIGtleSBjaGFuZ2UgaXMgdGhhdCBgbGF5b3V0X2FuZF9hbGxvY2F0ZSgpYCBpbiBga2VybmVsL21vZHVsZS9tYWluLmNgIG5vdyBpbmNsdWRlcyByZXRyaWVzIHNwZWNpZmljYWxseSBmb3IgdGhlIGAtRUFHQUlOYCBjYXNlIGZyb20gYG1vdmVfbW9kdWxlKClgLiBJJ2xsIG5lZWQgdG8gY29uZmlybSB0aGUgY2FsbCBjaGFpbiBmcm9tIGBtb3ZlX21vZHVsZSgpYCB0byBgcmVzZXJ2ZV9tb2R1bGVfdGFncygpYCwganVzdCB0byBiZSBjZXJ0YWluIG9mIHRoZSBjb250ZXh0LiBCdXQgYmVmb3JlIEkgZGlnIHRvbyBkZWVwIGluIHRoYXQgZGlyZWN0aW9uLCBJIHNob3VsZCB0YWtlIGEgY2xvc2UgbG9vayBhdCBgbW92ZV9tb2R1bGUoKWAgaW4gYGtlcm5lbC9tb2R1bGUvbWFpbi5jYCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgd2hhdCdzIHRyaWdnZXJpbmcgdGhlIGAtRUFHQUlOYCBpbiB0aGUgZmlyc3QgcGxhY2UgYW5kIHNlZSBpZiB0aGVyZSBhcmUgYW55IG9idmlvdXMgaXNzdWVzLlxuXG5cbiIsIklucHV0VG9rZW5zIjozNzc0LCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTUwLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6Mzk6MzAuMjA2NDgzNTQ2WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjg1MzIwNDk0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1vdmVfbW9kdWxlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9tb2R1bGUvbWFpbi5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9tb2R1bGUvbWFpbi5jPTIzNjQ9c3RhdGljIGludCBlbGZfdmFsaWRpdHlfY2FjaGVfc3RydGFiKHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yNDE1LSAqIEFzIGEgbGFzdCBzdGVwIHdlIHNldCBpbmZvLVxcdTAwM2Vtb2QgdG8gdGhlIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSBtb2R1bGUgaW5cXG5rZXJuZWwvbW9kdWxlL21haW4uYzoyNDE2OiAqIGluZm8tXFx1MDAzZWhkci4gVGhlIGZpbmFsIG9uZSB3aWxsIGJlIGFsbG9jYXRlZCBpbiBtb3ZlX21vZHVsZSgpLiBBbnlcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yNDE3LSAqIG1vZGlmaWNhdGlvbnMgd2UgbWFrZSB0byBvdXIgY29weSBvZiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FycmllZCBvdmVyXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0yNjU5PXN0YXRpYyBpbnQgZmluZF9tb2R1bGVfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMjc4Ny1cXG5rZXJuZWwvbW9kdWxlL21haW4uYzoyNzg4OnN0YXRpYyBpbnQgbW92ZV9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI3ODkte1xcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmM9Mjk0Mz1zdGF0aWMgc3RydWN0IG1vZHVsZSAqbGF5b3V0X2FuZF9hbGxvY2F0ZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTc4LVxcdC8qIEFsbG9jYXRlIGFuZCBtb3ZlIHRvIHRoZSBmaW5hbCBwbGFjZSAqL1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI5Nzk6XFx0ZXJyID0gbW92ZV9tb2R1bGUoaW5mby1cXHUwMDNlbW9kLCBpbmZvKTtcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTgwLVxcdGlmIChlcnIpIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6Mzk6MzAuMjkxODA5NTZaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozOTYxODc2OTUwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGFzIGlmIHRoZXkncmUgbXkgb3duOlxuXG4qKkFuYWx5emluZyB0aGUgYG1vdmVfbW9kdWxlKClgIEltcGxlbWVudGF0aW9uKipcblxuUmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgc3BlY2lmaWNzIG9mIHRoaXMgYG1vdmVfbW9kdWxlKClgIGltcGxlbWVudGF0aW9uLiBGb3JnZXQgdGhlIGdlbmVyYWwgY29uY2VwdCBmb3IgYSBtb21lbnQg4oCTIEkgbmVlZCB0byBnZXQgaW50byB0aGUgbml0dHktZ3JpdHR5IG9mIHRoZSBjb2RlIGl0c2VsZi4gV2hhdCdzIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gZG9pbmc/IFdoYXQgYXJlIHRoZSB1bmRlcmx5aW5nIG1lY2hhbmljcz8gQXJlIHdlIHRhbGtpbmcgYWJvdXQgYSBzaW1wbGUgZmlsZSBzeXN0ZW0gb3BlcmF0aW9uLCBvciBpcyB0aGVyZSBzb21lIGNvbXBsZXggaW50ZXJhY3Rpb24gd2l0aCBhIGRhdGFiYXNlLCBleHRlcm5hbCBzZXJ2aWNlcywgb3IgcGVyaGFwcyBldmVuIGRpc3RyaWJ1dGVkIHN5c3RlbXMgaW52b2x2ZWQ/IEkgbmVlZCB0byBsb29rIGF0IHRoZSBlZGdlIGNhc2VzLCB0aGUgZXJyb3IgaGFuZGxpbmcsIGFuZCB0aGUgb3ZlcmFsbCBlZmZpY2llbmN5LiBJcyBpdCBvcHRpbWl6ZWQgZm9yIGNvbW1vbiBzY2VuYXJpb3MsIG9yIGRvZXMgaXQgY2F0ZXIgdG8gYSBicm9hZGVyIHJhbmdlIG9mIHVzZSBjYXNlcz8gSSdtIGFscmVhZHkgdGhpbmtpbmcgYWJvdXQgcG90ZW50aWFsIGJvdHRsZW5lY2tzIGFuZCBwb2ludHMgb2YgZmFpbHVyZSDigJMgd2hhdCBjb3VsZCBnbyB3cm9uZywgYW5kIGhvdyByb2J1c3QgaXMgdGhlIGVycm9yIGhhbmRsaW5nPyBUaW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eSBhbmQgZGlzc2VjdCB0aGlzIGZ1bmN0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0NTg1LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6Mzk6MzQuMjUzNjg5MDZaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNjkzOTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL21vZHVsZS9tYWluLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjc4OCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjI3ODg6XFx0c3RhdGljIGludCBtb3ZlX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXFxuMjc4OTpcXHR7XFxuMjc5MDpcXHRcXHRpbnQgaSwgcmV0O1xcbjI3OTE6XFx0XFx0ZW51bSBtb2RfbWVtX3R5cGUgdCA9IE1PRF9NRU1fTlVNX1RZUEVTO1xcbjI3OTI6XFx0XFx0Ym9vbCBjb2RldGFnX3NlY3Rpb25fZm91bmQgPSBmYWxzZTtcXG4yNzkzOlxcdFxcbjI3OTQ6XFx0XFx0Zm9yX2VhY2hfbW9kX21lbV90eXBlKHR5cGUpIHtcXG4yNzk1OlxcdFxcdFxcdGlmICghbW9kLVxcdTAwM2VtZW1bdHlwZV0uc2l6ZSkge1xcbjI3OTY6XFx0XFx0XFx0XFx0bW9kLVxcdTAwM2VtZW1bdHlwZV0uYmFzZSA9IE5VTEw7XFxuMjc5NzpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4yNzk4OlxcdFxcdFxcdH1cXG4yNzk5OlxcdFxcbjI4MDA6XFx0XFx0XFx0cmV0ID0gbW9kdWxlX21lbW9yeV9hbGxvYyhtb2QsIHR5cGUpO1xcbjI4MDE6XFx0XFx0XFx0aWYgKHJldCkge1xcbjI4MDI6XFx0XFx0XFx0XFx0dCA9IHR5cGU7XFxuMjgwMzpcXHRcXHRcXHRcXHRnb3RvIG91dF9lcnI7XFxuMjgwNDpcXHRcXHRcXHR9XFxuMjgwNTpcXHRcXHR9XFxuMjgwNjpcXHRcXG4yODA3OlxcdFxcdC8qIFRyYW5zZmVyIGVhY2ggc2VjdGlvbiB3aGljaCBzcGVjaWZpZXMgU0hGX0FMTE9DICovXFxuMjgwODpcXHRcXHRwcl9kZWJ1ZyhcXFwiRmluYWwgc2VjdGlvbiBhZGRyZXNzZXMgZm9yICVzOlxcXFxuXFxcIiwgbW9kLVxcdTAwM2VuYW1lKTtcXG4yODA5OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBpbmZvLVxcdTAwM2VoZHItXFx1MDAzZWVfc2hudW07IGkrKykge1xcbjI4MTA6XFx0XFx0XFx0dm9pZCAqZGVzdDtcXG4yODExOlxcdFxcdFxcdEVsZl9TaGRyICpzaGRyID0gXFx1MDAyNmluZm8tXFx1MDAzZXNlY2hkcnNbaV07XFxuMjgxMjpcXHRcXHRcXHRjb25zdCBjaGFyICpzbmFtZTtcXG4yODEzOlxcdFxcbjI4MTQ6XFx0XFx0XFx0aWYgKCEoc2hkci1cXHUwMDNlc2hfZmxhZ3MgXFx1MDAyNiBTSEZfQUxMT0MpKVxcbjI4MTU6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuMjgxNjpcXHRcXG4yODE3OlxcdFxcdFxcdHNuYW1lID0gaW5mby1cXHUwMDNlc2Vjc3RyaW5ncyArIHNoZHItXFx1MDAzZXNoX25hbWU7XFxuMjgxODpcXHRcXHRcXHQvKlxcbjI4MTk6XFx0XFx0XFx0ICogTG9hZCBjb2RldGFnIHNlY3Rpb25zIHNlcGFyYXRlbHkgYXMgdGhleSBtaWdodCBzdGlsbCBiZSB1c2VkXFxuMjgyMDpcXHRcXHRcXHQgKiBhZnRlciBtb2R1bGUgdW5sb2FkLlxcbjI4MjE6XFx0XFx0XFx0ICovXFxuMjgyMjpcXHRcXHRcXHRpZiAoY29kZXRhZ19uZWVkc19tb2R1bGVfc2VjdGlvbihtb2QsIHNuYW1lLCBzaGRyLVxcdTAwM2VzaF9zaXplKSkge1xcbjI4MjM6XFx0XFx0XFx0XFx0ZGVzdCA9IGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24obW9kLCBzbmFtZSwgc2hkci1cXHUwMDNlc2hfc2l6ZSxcXG4yODI0OlxcdFxcdFxcdFxcdFxcdFxcdGFyY2hfbW9kX3NlY3Rpb25fcHJlcGVuZChtb2QsIGkpLCBzaGRyLVxcdTAwM2VzaF9hZGRyYWxpZ24pO1xcbjI4MjU6XFx0XFx0XFx0XFx0aWYgKFdBUk5fT04oIWRlc3QpKSB7XFxuMjgyNjpcXHRcXHRcXHRcXHRcXHRyZXQgPSAtRUlOVkFMO1xcbjI4Mjc6XFx0XFx0XFx0XFx0XFx0Z290byBvdXRfZXJyO1xcbjI4Mjg6XFx0XFx0XFx0XFx0fVxcbjI4Mjk6XFx0XFx0XFx0XFx0aWYgKElTX0VSUihkZXN0KSkge1xcbjI4MzA6XFx0XFx0XFx0XFx0XFx0cmV0ID0gUFRSX0VSUihkZXN0KTtcXG4yODMxOlxcdFxcdFxcdFxcdFxcdGdvdG8gb3V0X2VycjtcXG4yODMyOlxcdFxcdFxcdFxcdH1cXG4yODMzOlxcdFxcdFxcdFxcdGNvZGV0YWdfc2VjdGlvbl9mb3VuZCA9IHRydWU7XFxuMjgzNDpcXHRcXHRcXHR9IGVsc2Uge1xcbjI4MzU6XFx0XFx0XFx0XFx0ZW51bSBtb2RfbWVtX3R5cGUgdHlwZSA9IHNoZHItXFx1MDAzZXNoX2VudHNpemUgXFx1MDAzZVxcdTAwM2UgU0hfRU5UU0laRV9UWVBFX1NISUZUO1xcbjI4MzY6XFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBvZmZzZXQgPSBzaGRyLVxcdTAwM2VzaF9lbnRzaXplIFxcdTAwMjYgU0hfRU5UU0laRV9PRkZTRVRfTUFTSztcXG4yODM3OlxcdFxcbjI4Mzg6XFx0XFx0XFx0XFx0ZGVzdCA9IG1vZC1cXHUwMDNlbWVtW3R5cGVdLmJhc2UgKyBvZmZzZXQ7XFxuMjgzOTpcXHRcXHRcXHR9XFxuMjg0MDpcXHRcXG4yODQxOlxcdFxcdFxcdGlmIChzaGRyLVxcdTAwM2VzaF90eXBlICE9IFNIVF9OT0JJVFMpIHtcXG4yODQyOlxcdFxcdFxcdFxcdC8qXFxuMjg0MzpcXHRcXHRcXHRcXHQgKiBPdXIgRUxGIGNoZWNrZXIgYWxyZWFkeSB2YWxpZGF0ZWQgdGhpcywgYnV0IGxldCdzXFxuMjg0NDpcXHRcXHRcXHRcXHQgKiBiZSBwZWRhbnRpYyBhbmQgbWFrZSB0aGUgZ29hbCBjbGVhcmVyLiBXZSBhY3R1YWxseVxcbjI4NDU6XFx0XFx0XFx0XFx0ICogZW5kIHVwIGNvcHlpbmcgb3ZlciBhbGwgbW9kaWZpY2F0aW9ucyBtYWRlIHRvIHRoZVxcbjI4NDY6XFx0XFx0XFx0XFx0ICogdXNlcnNwYWNlIGNvcHkgb2YgdGhlIGVudGlyZSBzdHJ1Y3QgbW9kdWxlLlxcbjI4NDc6XFx0XFx0XFx0XFx0ICovXFxuMjg0ODpcXHRcXHRcXHRcXHRpZiAoaSA9PSBpbmZvLVxcdTAwM2VpbmRleC5tb2QgXFx1MDAyNlxcdTAwMjZcXG4yODQ5OlxcdFxcdFxcdFxcdCAgIChXQVJOX09OX09OQ0Uoc2hkci1cXHUwMDNlc2hfc2l6ZSAhPSBzaXplb2Yoc3RydWN0IG1vZHVsZSkpKSkge1xcbjI4NTA6XFx0XFx0XFx0XFx0XFx0cmV0ID0gLUVOT0VYRUM7XFxuMjg1MTpcXHRcXHRcXHRcXHRcXHRnb3RvIG91dF9lcnI7XFxuMjg1MjpcXHRcXHRcXHRcXHR9XFxuMjg1MzpcXHRcXHRcXHRcXHRtZW1jcHkoZGVzdCwgKHZvaWQgKilzaGRyLVxcdTAwM2VzaF9hZGRyLCBzaGRyLVxcdTAwM2VzaF9zaXplKTtcXG4yODU0OlxcdFxcdFxcdH1cXG4yODU1OlxcdFxcdFxcdC8qXFxuMjg1NjpcXHRcXHRcXHQgKiBVcGRhdGUgdGhlIHVzZXJzcGFjZSBjb3B5J3MgRUxGIHNlY3Rpb24gYWRkcmVzcyB0byBwb2ludCB0b1xcbjI4NTc6XFx0XFx0XFx0ICogb3VyIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkgYXMgYSBwdXJlIGNvbnZlbmllbmNlIHNvIHRoYXRcXG4yODU4OlxcdFxcdFxcdCAqIHVzZXJzIG9mIGluZm8gY2FuIGtlZXAgdGFraW5nIGFkdmFudGFnZSBhbmQgdXNpbmcgdGhlIG5ld2x5XFxuMjg1OTpcXHRcXHRcXHQgKiBtaW50ZWQgb2ZmaWNpYWwgbWVtb3J5IGFyZWEuXFxuMjg2MDpcXHRcXHRcXHQgKi9cXG4yODYxOlxcdFxcdFxcdHNoZHItXFx1MDAzZXNoX2FkZHIgPSAodW5zaWduZWQgbG9uZylkZXN0O1xcbjI4NjI6XFx0XFx0XFx0cHJfZGVidWcoXFxcIlxcXFx0MHglbHggMHglLjhseCAlc1xcXFxuXFxcIiwgKGxvbmcpc2hkci1cXHUwMDNlc2hfYWRkcixcXG4yODYzOlxcdFxcdFxcdFxcdCAobG9uZylzaGRyLVxcdTAwM2VzaF9zaXplLCBpbmZvLVxcdTAwM2VzZWNzdHJpbmdzICsgc2hkci1cXHUwMDNlc2hfbmFtZSk7XFxuMjg2NDpcXHRcXHR9XFxuMjg2NTpcXHRcXG4yODY2OlxcdFxcdHJldHVybiAwO1xcbjI4Njc6XFx0b3V0X2VycjpcXG4yODY4OlxcdFxcdG1vZHVsZV9tZW1vcnlfcmVzdG9yZV9yb3gobW9kKTtcXG4yODY5OlxcdFxcdHdoaWxlICh0LS0pXFxuMjg3MDpcXHRcXHRcXHRtb2R1bGVfbWVtb3J5X2ZyZWUobW9kLCB0KTtcXG4yODcxOlxcdFxcdGlmIChjb2RldGFnX3NlY3Rpb25fZm91bmQpXFxuMjg3MjpcXHRcXHRcXHRjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKG1vZCk7XFxuMjg3MzpcXHRcXG4yODc0OlxcdFxcdHJldHVybiByZXQ7XFxuMjg3NTpcXHR9XFxuMjg3NjpcXHRcXG4yODc3OlxcdHN0YXRpYyBpbnQgY2hlY2tfZXhwb3J0X3N5bWJvbF9zZWN0aW9ucyhzdHJ1Y3QgbW9kdWxlICptb2QpXFxuMjg3ODpcXHR7XFxuMjg3OTpcXHRcXHRpZiAobW9kLVxcdTAwM2VudW1fc3ltcyBcXHUwMDI2XFx1MDAyNiAhbW9kLVxcdTAwM2VmbGFnc3RhYikge1xcbjI4ODA6XFx0XFx0XFx0cHJfZXJyKFxcXCIlczogbm8gZmxhZ3MgZm9yIGV4cG9ydGVkIHN5bWJvbHNcXFxcblxcXCIsIG1vZC1cXHUwMDNlbmFtZSk7XFxuMjg4MTpcXHRcXHRcXHRyZXR1cm4gLUVOT0VYRUM7XFxuMjg4MjpcXHRcXHR9XFxuMjg4MzpcXHQjaWZkZWYgQ09ORklHX01PRFZFUlNJT05TXFxuMjg4NDpcXHRcXHRpZiAobW9kLVxcdTAwM2VudW1fc3ltcyBcXHUwMDI2XFx1MDAyNiAhbW9kLVxcdTAwM2VjcmNzKSB7XFxuMjg4NTpcXHRcXHRcXHRyZXR1cm4gdHJ5X3RvX2ZvcmNlX2xvYWQobW9kLFxcbjI4ODY6XFx0XFx0XFx0XFx0XFx0XFx0IFxcXCJubyB2ZXJzaW9ucyBmb3IgZXhwb3J0ZWQgc3ltYm9sc1xcXCIpO1xcbjI4ODc6XFx0XFx0fVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDozOTozNC4yNTM5NjEyMTFaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozODg3ODUxNDY2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkFuYWx5emluZyB0aGUgQ29kZSBBbGxvY2F0aW9uIE1vZHVsZSoqXG5cbk9rYXksIHNvIEkndmUgYmVlbiBhc2tlZCB0byBkZWx2ZSBpbnRvIGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYC4gTXkgaW1tZWRpYXRlIGZvY3VzIGlzIHRvIHBpbnBvaW50IGV4YWN0bHkgd2hlcmUgdGhpcyBmdW5jdGlvbiByZXNpZGVzIHdpdGhpbiB0aGUgY29kZWJhc2UuIFRoZSBuYW1lIGl0c2VsZiBzdWdnZXN0cyBpdCdzIGxpa2VseSBpbnZvbHZlZCBpbiBtZW1vcnkgYWxsb2NhdGlvbiwgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gY29kZSBzZWN0aW9ucy4gTXkgZXhwZXJpZW5jZSB0ZWxscyBtZSBJJ2xsIGJlIGxvb2tpbmcgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IHJvdXRpbmVzLCBwcm9iYWJseSB3aXRoaW4gYSBtb2R1bGUgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIGV4ZWN1dGFibGUgY29kZSBzZWdtZW50cy4gSSdsbCBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJlbGF0aW9uc2hpcCB0byB0aGUgbGlua2VyLCB0aGUgbG9hZGVyLCBhbmQgcGVyaGFwcyBhbnkgZHluYW1pYyBjb2RlIGdlbmVyYXRpb24gZmVhdHVyZXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyByb2xlLiBJcyBpdCBkZWFsaW5nIHdpdGggcmVsb2NhdGFibGUgY29kZSwgcG9zaXRpb24taW5kZXBlbmRlbnQgY29kZSwgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/IEEgcXVpY2sgc2VhcmNoIG9mIHRoZSBwcm9qZWN0IHN0cnVjdHVyZSBhbmQgc3ltYm9sIHRhYmxlcyBpcyBwcm9iYWJseSB0aGUgYmVzdCBmaXJzdCBzdGVwLiBJIG5lZWQgdG8gcmFwaWRseSBhc2NlcnRhaW4gaXRzIGZ1bmN0aW9uYWxpdHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjYzNzAsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjM5OjM4LjE0MTgxNTUxNloiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMjQxNDA5MjExLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvY29kZXRhZy5oPTkyPWJvb2wgY29kZXRhZ19uZWVkc19tb2R1bGVfc2VjdGlvbihzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IGNoYXIgKm5hbWUsXFxuaW5jbHVkZS9saW51eC9jb2RldGFnLmgtOTMtXFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBsb25nIHNpemUpO1xcbmluY2x1ZGUvbGludXgvY29kZXRhZy5oOjk0OnZvaWQgKmNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxcbmluY2x1ZGUvbGludXgvY29kZXRhZy5oLTk1LVxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgaW50IHByZXBlbmQsXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2NvZGV0YWcuaD0xMDc9c3RhdGljIGlubGluZSB2b2lkICpcXG5pbmNsdWRlL2xpbnV4L2NvZGV0YWcuaDoxMDg6Y29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbihzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IGNoYXIgKm5hbWUsXFxuaW5jbHVkZS9saW51eC9jb2RldGFnLmgtMTA5LVxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBpbnQgcHJlcGVuZCxcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTI3ODg9c3RhdGljIGludCBtb3ZlX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yODIyLVxcdFxcdGlmIChjb2RldGFnX25lZWRzX21vZHVsZV9zZWN0aW9uKG1vZCwgc25hbWUsIHNoZHItXFx1MDAzZXNoX3NpemUpKSB7XFxua2VybmVsL21vZHVsZS9tYWluLmM6MjgyMzpcXHRcXHRcXHRkZXN0ID0gY29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbihtb2QsIHNuYW1lLCBzaGRyLVxcdTAwM2VzaF9zaXplLFxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI4MjQtXFx0XFx0XFx0XFx0XFx0YXJjaF9tb2Rfc2VjdGlvbl9wcmVwZW5kKG1vZCwgaSksIHNoZHItXFx1MDAzZXNoX2FkZHJhbGlnbik7XFxuLS1cXG5saWIvY29kZXRhZy5jPTI1Mz1ib29sIGNvZGV0YWdfbmVlZHNfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxcbi0tXFxubGliL2NvZGV0YWcuYy0yODAtXFxubGliL2NvZGV0YWcuYzoyODE6dm9pZCAqY29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbihzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IGNoYXIgKm5hbWUsXFxubGliL2NvZGV0YWcuYy0yODItXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBpbnQgcHJlcGVuZCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6Mzk6NDEuMzgzMjI4NDU3WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzI1NjU2ODg1MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gdGhlIENvZGU6IFVuZGVyc3RhbmRpbmcgYGxpYi9jb2RldGFnLmNgKipcblxuT2theSwgbGV0J3MgemVybyBpbiBvbiBgbGliL2NvZGV0YWcuY2AuIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gd2hhdCdzIGhhcHBlbmluZyB3aXRoaW4gdGhhdCBmaWxlLiBTcGVjaWZpY2FsbHksIEkgc2hvdWxkIGxvb2sgYXJvdW5kIGxpbmUgMjgxLiBUaGF0J3MgdXN1YWxseSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIGEgZGVlcGVyIGRpdmUuIERlcGVuZGluZyBvbiB3aGF0IEkgZmluZCwgSSBtYXkgbmVlZCB0byBleHBhbmQgdGhlIHNjb3BlIG9mIG15IHJldmlldywgYnV0IGxpbmUgMjgxIGdpdmVzIG1lIGEgcG90ZW50aWFsIGVudHJ5IHBvaW50IGZvciB1bmRlcnN0YW5kaW5nIHRoZSBjdXJyZW50IGNvZGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjcwNDcsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDozOTo0NC42Mzk4MDA1MDdaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTM0NDMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImxpYi9jb2RldGFnLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjgxLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjgxOlxcdHZvaWQgKmNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxcbiAyODI6XFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBpbnQgcHJlcGVuZCxcXG4gMjgzOlxcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgYWxpZ24pXFxuIDI4NDpcXHR7XFxuIDI4NTpcXHRcXHRjb25zdCBjaGFyICp0eXBlX25hbWUgPSBuYW1lICsgc3RybGVuKENPREVUQUdfU0VDVElPTl9QUkVGSVgpO1xcbiAyODY6XFx0XFx0c3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlO1xcbiAyODc6XFx0XFx0dm9pZCAqcmV0ID0gRVJSX1BUUigtRUlOVkFMKTtcXG4gMjg4OlxcdFxcbiAyODk6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2Y29kZXRhZ19sb2NrKTtcXG4gMjkwOlxcdFxcdGxpc3RfZm9yX2VhY2hfZW50cnkoY3R0eXBlLCBcXHUwMDI2Y29kZXRhZ190eXBlcywgbGluaykge1xcbiAyOTE6XFx0XFx0XFx0aWYgKHN0cmNtcCh0eXBlX25hbWUsIGN0dHlwZS1cXHUwMDNlZGVzYy5zZWN0aW9uKSA9PSAwKSB7XFxuIDI5MjpcXHRcXHRcXHRcXHRpZiAoV0FSTl9PTighY3R0eXBlLVxcdTAwM2VkZXNjLmFsbG9jX3NlY3Rpb25fbWVtKSlcXG4gMjkzOlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAyOTQ6XFx0XFxuIDI5NTpcXHRcXHRcXHRcXHRkb3duX3dyaXRlKFxcdTAwMjZjdHR5cGUtXFx1MDAzZW1vZF9sb2NrKTtcXG4gMjk2OlxcdFxcdFxcdFxcdHJldCA9IGN0dHlwZS1cXHUwMDNlZGVzYy5hbGxvY19zZWN0aW9uX21lbShtb2QsIHNpemUsIHByZXBlbmQsIGFsaWduKTtcXG4gMjk3OlxcdFxcdFxcdFxcdHVwX3dyaXRlKFxcdTAwMjZjdHR5cGUtXFx1MDAzZW1vZF9sb2NrKTtcXG4gMjk4OlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAyOTk6XFx0XFx0XFx0fVxcbiAzMDA6XFx0XFx0fVxcbiAzMDE6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZjb2RldGFnX2xvY2spO1xcbiAzMDI6XFx0XFxuIDMwMzpcXHRcXHRyZXR1cm4gcmV0O1xcbiAzMDQ6XFx0fVxcbiAzMDU6XFx0XFxuIDMwNjpcXHR2b2lkIGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kKVxcbiAzMDc6XFx0e1xcbiAzMDg6XFx0XFx0c3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlO1xcbiAzMDk6XFx0XFxuIDMxMDpcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZjb2RldGFnX2xvY2spO1xcbiAzMTE6XFx0XFx0bGlzdF9mb3JfZWFjaF9lbnRyeShjdHR5cGUsIFxcdTAwMjZjb2RldGFnX3R5cGVzLCBsaW5rKSB7XFxuIDMxMjpcXHRcXHRcXHRpZiAoIWN0dHlwZS1cXHUwMDNlZGVzYy5mcmVlX3NlY3Rpb25fbWVtKVxcbiAzMTM6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuIDMxNDpcXHRcXG4gMzE1OlxcdFxcdFxcdGRvd25fd3JpdGUoXFx1MDAyNmN0dHlwZS1cXHUwMDNlbW9kX2xvY2spO1xcbiAzMTY6XFx0XFx0XFx0Y3R0eXBlLVxcdTAwM2VkZXNjLmZyZWVfc2VjdGlvbl9tZW0obW9kLCBmYWxzZSk7XFxuIDMxNzpcXHRcXHRcXHR1cF93cml0ZShcXHUwMDI2Y3R0eXBlLVxcdTAwM2Vtb2RfbG9jayk7XFxuIDMxODpcXHRcXHR9XFxuIDMxOTpcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNmNvZGV0YWdfbG9jayk7XFxuIDMyMDpcXHR9XFxuIDMyMTpcXHRcXG4gMzIyOlxcdHZvaWQgY29kZXRhZ19tb2R1bGVfcmVwbGFjZWQoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbW9kdWxlICpuZXdfbW9kKVxcbiAzMjM6XFx0e1xcbiAzMjQ6XFx0XFx0c3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlO1xcbiAzMjU6XFx0XFxuIDMyNjpcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZjb2RldGFnX2xvY2spO1xcbiAzMjc6XFx0XFx0bGlzdF9mb3JfZWFjaF9lbnRyeShjdHR5cGUsIFxcdTAwMjZjb2RldGFnX3R5cGVzLCBsaW5rKSB7XFxuIDMyODpcXHRcXHRcXHRpZiAoIWN0dHlwZS1cXHUwMDNlZGVzYy5tb2R1bGVfcmVwbGFjZWQpXFxuIDMyOTpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4gMzMwOlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDozOTo0NC42Mzk5NDExMTdaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDA5MDcxMDE0MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHVuZGVyc3RhbmRpbmcsIGFzc3VtaW5nIEknbSBhbiBleHBlcnQgaW4gdGhpcyBhcmVhOlxuXG4qKlRyYWNpbmcgTWVtb3J5IEFsbG9jYXRpb24gaW4gYGN0dHlwZWAqKlxuXG5BbHJpZ2h0LCBzbyBJJ20gc2VlaW5nIGEgY2FsbCB0byBgY3R0eXBlLVx1MDAzZWRlc2MuYWxsb2Nfc2VjdGlvbl9tZW1gLiBUaGF0IHJpbmdzIGEgYmVsbC4gTXkgaW1tZWRpYXRlIGluc3RpbmN0IGlzIHRvIGNoZWNrIHdoZXJlIHRoYXQgZnVuY3Rpb24sIHdoaWNoIGlzIGFjdGluZyBhcyBhIG1lbW9yeSBhbGxvY2F0aW9uIGhvb2ssIGlzIGFjdHVhbGx5ICpkZWZpbmVkKi4gU3BlY2lmaWNhbGx5LCBnaXZlbiBpdHMgbmFtZSwgSSBzdXNwZWN0IGl0J3MgZ29pbmcgdG8gYmUgcmVsYXRlZCB0byBzZWN0aW9uIG1lbW9yeSBtYW5hZ2VtZW50LlxuXG5MZXQncyBxdWlja2x5IGp1bXAgaW50byBgbW0vYWxsb2NfdGFnLmNgIHRvIHNlZSBpZiBteSBodW5jaCBpcyBjb3JyZWN0LiBBaCwgeWVzLCB0aGVyZSBpdCBpcyEgYHJlc2VydmVfbW9kdWxlX3RhZ3NgIGlzIHJlZ2lzdGVyZWQgYXMgdGhlIGhhbmRsZXIgZm9yIGBhbGxvY19zZWN0aW9uX21lbWAuIEdvb2QuIFRoYXQgY29uZmlybXMgdGhlIGxpbmsuIFNvLCB0aGUgYWxsb2NhdGlvbiBwYXRoIGluIGBjdHR5cGVgIGlzIGxpa2VseSBsZXZlcmFnaW5nIHRoaXMgbW9kdWxlIHRhZyByZXNlcnZhdGlvbiBtZWNoYW5pc20uIEkgbmVlZCB0byBrZWVwIHRoaXMgaW4gbWluZCBhcyBJIGZvbGxvdyB0aGUgY29udHJvbCBmbG93LiBOb3csIHRoZSBuZXh0IHN0ZXAgd291bGQgYmUgdG8gZmlndXJlIG91dCAqd2h5KiBpdCdzIGNhbGxpbmcgdGhpcyBhbmQgd2hhdCBgcmVzZXJ2ZV9tb2R1bGVfdGFnc2AgaXMgdHJ5aW5nIHRvIGFjaGlldmUuIElzIHRoaXMgYSBjdXN0b20gYWxsb2NhdGlvbiBzY2hlbWU/IE9yIHBlcmhhcHMgcGFydCBvZiBzb21lIGxhcmdlciBtZW1vcnkgcHJvdGVjdGlvbiBmcmFtZXdvcms/XG5cblxuIiwiSW5wdXRUb2tlbnMiOjc5NzgsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0OCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjM5OjQ4LjczMDY2MjA5OVoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjI4Mzk5MjUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicmVzZXJ2ZV9tb2R1bGVfdGFnc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9hbGxvY190YWcuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9hbGxvY190YWcuYz04Mzg9c3RhdGljIHZvaWQgcmVsZWFzZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIGJvb2wgdXNlZClcXG4tLVxcbm1tL2FsbG9jX3RhZy5jLTg4My1cXG5tbS9hbGxvY190YWcuYzo4ODQ6c3RhdGljIHZvaWQgKnJlc2VydmVfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBsb25nIHNpemUsXFxubW0vYWxsb2NfdGFnLmMtODg1LVxcdFxcdFxcdFxcdCB1bnNpZ25lZCBpbnQgcHJlcGVuZCwgdW5zaWduZWQgbG9uZyBhbGlnbilcXG4tLVxcbm1tL2FsbG9jX3RhZy5jPTEzMjE9c3RhdGljIGludCBfX2luaXQgYWxsb2NfdGFnX2luaXQodm9pZClcXG4tLVxcbm1tL2FsbG9jX3RhZy5jLTEzMjctXFx0XFx0Lm5lZWRzX3NlY3Rpb25fbWVtXFx0PSBuZWVkc19zZWN0aW9uX21lbSxcXG5tbS9hbGxvY190YWcuYzoxMzI4OlxcdFxcdC5hbGxvY19zZWN0aW9uX21lbVxcdD0gcmVzZXJ2ZV9tb2R1bGVfdGFncyxcXG5tbS9hbGxvY190YWcuYy0xMzI5LVxcdFxcdC5mcmVlX3NlY3Rpb25fbWVtXFx0PSByZWxlYXNlX21vZHVsZV90YWdzLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDozOTo0OC43OTM1MDg0NTRaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODg5NjY3OTk0MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBNb2R1bGUgTG9hZGluZyBQYXRjaCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIHRyYWNpbmcgdGhlIGVycm9yIGZsb3cuIGByZXNlcnZlX21vZHVsZV90YWdzYCBjYWxscyBgYWxsb2Nfc2VjdGlvbl9tZW1gLCBhbmQgdGhhdCByZXR1cm5zIGBFUlJfUFRSKC1FQUdBSU4pYC4gVGhhdCBwcm9wYWdhdGVzIHRocm91Z2ggYGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25gIGFuZCBgbW92ZV9tb2R1bGVgLCB1bHRpbWF0ZWx5IGxlYWRpbmcgdG8gYC1FQUdBSU5gIGluIGBsYXlvdXRfYW5kX2FsbG9jYXRlYC4gSSBzZWUgdGhhdCBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAgbm93ICpyZXRyaWVzKiB3aGVuIGl0IGdldHMgdGhhdCBlcnJvciBjb2RlLlxuXG5UaGUgY29yZSBvZiB0aGUgcGF0Y2ggc2VlbXMgdG8gaGFuZGxlIGEgc2l0dWF0aW9uIHdoZXJlIGAhdGFnc19hZGRyZXNzYWJsZSgpYCBpcyB0cnVlLCBwYXJ0aWN1bGFybHkgd2hlbiBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgaXMgZW5hYmxlZC4gV2FpdCwgbm8sIGl0IGxvb2tzIGxpa2UgYG1lbV9hbGxvY19wcm9maWxpbmdfZW5hYmxlZCgpYCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBjb25kaXRpb24uIGB0YWdzX2FkZHJlc3NhYmxlKClgIGNoZWNrcyBpZiB3ZSBoYXZlIHN1ZmZpY2llbnQgcGFnZSBmbGFnIGJpdHMuIElmIHdlICpkb24ndCosIHRoZSBjb2RlIHVzZWQgdG8gZGlzYWJsZSBtZW1vcnkgcHJvZmlsaW5nIGFuZCByZXR1cm4gYC1FQUdBSU5gIHRvIHRyaWdnZXIgYSByZXRyeS4gVGhpcyBpcyBhICpmdW5jdGlvbmFsKiBjaGFuZ2UgaW4gdGhlIG1vZHVsZSBsb2FkaW5nIHByb2Nlc3MgaWYgd2UgcnVuIG91dCBvZiBwYWdlIGZsYWcgYml0cywgcmVnYXJkbGVzcyBvZiBtZW1vcnkgcHJvZmlsaW5nIHN0YXRlLlxuXG5UaGUgaW1wb3J0YW50IHRoaW5nIGlzIHRoYXQgYHJlbGVhc2VfbW9kdWxlX3RhZ3MobW9kLCBmYWxzZSlgIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGAtRUFHQUlOYCByZXR1cm4uXG5cbk5vdywgc2hvdWxkIEkgZnV6eiB0aGlzPyBUaGlzICpkZWZpbml0ZWx5KiBtb2RpZmllcyBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAgaW4gYGtlcm5lbC9tb2R1bGUvbWFpbi5jYCwgYW5kIGltcG9ydGFudGx5LCB0aGUgcmV0cnkgbG9naWMgcmVzZXRzIHNvbWUgc3RhdGUsIGluY2x1ZGluZyByZXdyaXRpbmcgc2VjdGlvbiBoZWFkZXJzIGFuZCB6ZXJvaW5nIHNlY3Rpb24gc2l6ZXMsIGJlZm9yZSByZXRyeWluZy5cblxuYGBgY1xuXHRcdHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzKGluZm8sIGZsYWdzKTtcblx0XHRmb3JfZWFjaF9tb2RfbWVtX3R5cGUodHlwZSlcblx0XHRcdGluZm8tXHUwMDNlbW9kLVx1MDAzZW1lbVt0eXBlXS5zaXplID0gMDtcblx0XHRpbmZvLVx1MDAzZXNlY2hkcnNbaW5mby1cdTAwM2VpbmRleC5zeW1dLnNoX2ZsYWdzIFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcblx0XHRpbmZvLVx1MDAzZXNlY2hkcnNbaW5mby1cdTAwM2VpbmRleC5zdHJdLnNoX2ZsYWdzIFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcblx0XHRnb3RvIHJldHJ5O1xuYGBgXG5cblRoaXMgaXMgYSBjbGVhciBmdW5jdGlvbmFsIGNoYW5nZSB0byB0aGUgbW9kdWxlIGxvYWRpbmcgcHJvY2VzcywgYW5kIEkgdGhpbmsgdGhpcyBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcuIEkgY2FuIGltYWdpbmUgdGhpcyBjb2RlIHBhdGggYmVpbmcgdHJpZ2dlcmVkIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgc2ltcGx5IGJ5IGxvYWRpbmcgbW9kdWxlcy4gSWYgd2UgY2FuIGV4aGF1c3QgcGFnZSBmbGFnIGJpdHMgKHdoaWNoIGlzIHRoZSBtYWluIHNjZW5hcmlvIGFkZHJlc3NlZCBieSB0aGUgb3JpZ2luYWwgY29kZSksIG9yIGV2ZW4ganVzdCBnZW5lcmFsIG1vZHVsZSBsb2FkaW5nIGZ1enppbmcsIHdlIGNvdWxkIGV4ZXJjaXNlIHRoaXMgbmV3IHJldHJ5IGxvZ2ljLiBUaGUgcmVtb3ZhbCBvZiBgbWVtX2FsbG9jX3Byb2ZpbGluZ19lbmFibGVkKClgIGZyb20gdGhlIGNvbmRpdGlvbiBpcyBhIG1ham9yIGNoYW5nZS4gVGhpcyBsb29rcyBsaWtlIGEgcHJpbWUgY2FuZGlkYXRlIGZvciBpbnZlc3RpZ2F0aW9uLiBMZXQgbWUgY2hlY2sgYHRhZ3NfYWRkcmVzc2FibGUoKWAgdG8gYmUgc3VyZS4uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4NTI3LCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDY2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjM5OjU3LjY5MDE5MTI2NloiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDQ2OTMzMjcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidGFnc19hZGRyZXNzYWJsZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9hbGxvY190YWcuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9hbGxvY190YWcuYz02NjA9c3RhdGljIGJvb2wgZW5zdXJlX2FsaWdubWVudCh1bnNpZ25lZCBsb25nIGFsaWduLCB1bnNpZ25lZCBpbnQgKnByZXBlbmQpXFxuLS1cXG5tbS9hbGxvY190YWcuYy02ODAtXFxubW0vYWxsb2NfdGFnLmM6NjgxOnN0YXRpYyBpbmxpbmUgYm9vbCB0YWdzX2FkZHJlc3NhYmxlKHZvaWQpXFxubW0vYWxsb2NfdGFnLmMtNjgyLXtcXG4tLVxcbm1tL2FsbG9jX3RhZy5jPTg4ND1zdGF0aWMgdm9pZCAqcmVzZXJ2ZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcXG4tLVxcbm1tL2FsbG9jX3RhZy5jLTk1Mi1cXHRcXHRtb2R1bGVfdGFncy5zaXplID0gb2Zmc2V0ICsgc2l6ZTtcXG5tbS9hbGxvY190YWcuYzo5NTM6XFx0XFx0aWYgKCF0YWdzX2FkZHJlc3NhYmxlKCkpIHtcXG5tbS9hbGxvY190YWcuYy05NTQtXFx0XFx0XFx0c2h1dGRvd25fbWVtX3Byb2ZpbGluZyh0cnVlKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6Mzk6NTcuNzM0ODg3NzEzWiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQzNTEyNTg1NTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqRGl2aW5nIGludG8gYHRhZ3NfYWRkcmVzc2FibGUoKWAqKlxuXG5BbHJpZ2h0LCBsZXQncyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBzcGVjaWZpY3Mgb2YgdGhlIGB0YWdzX2FkZHJlc3NhYmxlKClgIGltcGxlbWVudGF0aW9uLiBJIGtub3cgdGhlIGdlbmVyYWwgY29uY2VwdDogdGhlIGFiaWxpdHkgdG8gYXNzb2NpYXRlIHRhZ3Mgd2l0aCB2YXJpb3VzIG9iamVjdHMgYW5kIHRoZW4gZWZmaWNpZW50bHkgcXVlcnkgdGhvc2Ugb2JqZWN0cyBiYXNlZCBvbiB0YWcgcmVsYXRpb25zaGlwcy4gQnV0IEkgbmVlZCB0byBkaWcgaW50byB0aGUgbnV0cyBhbmQgYm9sdHMuIEkgd2FudCB0byBzZWUgaG93IHRoaXMgcGFydGljdWxhciBzeXN0ZW0gaGFuZGxlcyB0aGUgdW5kZXJseWluZyBkYXRhIHN0cnVjdHVyZXMg4oCTIGlzIGl0IGEgcmVsYXRpb25hbCBkYXRhYmFzZSB3aXRoIGpvaW4gdGFibGVzLCBhIGdyYXBoIGRhdGFiYXNlLCBvciBzb21ldGhpbmcgbW9yZSBzcGVjaWFsaXplZD8gV2hhdCBhcmUgdGhlIGluZGV4aW5nIHN0cmF0ZWdpZXMgaW4gcGxhY2U/IEFuZCBtb3N0IGltcG9ydGFudGx5LCBob3cgYXJlIGNvbmN1cnJlbmN5IGFuZCBjb25zaXN0ZW5jeSBoYW5kbGVkLCBwYXJ0aWN1bGFybHkgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHdyaXRlcnMgYWRkaW5nIGFuZCByZW1vdmluZyB0YWdzIGNvbmN1cnJlbnRseT8gSSdtIGFsc28gY3VyaW91cyB0byBzZWUgaG93IHRoZXkndmUgaGFuZGxlZCBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgYm90dGxlbmVja3Mgd2l0aCBsYXJnZSBudW1iZXJzIG9mIHRhZ3Mgb3Igb2JqZWN0cy4gU3BlY2lmaWNhbGx5LCBJJ2QgbGlrZSB0byB1bmRlcnN0YW5kIGhvdyB0aGUgc3lzdGVtIHNjYWxlcyB3aXRoIGRpZmZlcmVudCB0YWcgY2FyZGluYWxpdHkgc2NlbmFyaW9zOiBmZXcgdGFncyBwZXIgb2JqZWN0LCBtYW55IHRhZ3MgcGVyIG9iamVjdCwgYW5kIHBvdGVudGlhbGx5IGEgdmVyeSBoaWdoIG51bWJlciBvZiB1bmlxdWUgdGFncyBhY3Jvc3MgdGhlIHdob2xlIGRhdGEgc2V0LiBMZXQncyBzZWUgaG93IHRoZXkndmUgdGFja2xlZCB0aGUgY29tcGxleGl0aWVzIG9mIGVmZmljaWVudGx5IHF1ZXJ5aW5nIGNvbXBsZXggdGFnIHJlbGF0aW9uc2hpcHMgKGUuZy4sIG9iamVjdHMgdGFnZ2VkIHdpdGggKmFsbCogb2YgYSBzZXQgb2YgdGFncywgKmFueSogb2YgYSBzZXQgb2YgdGFncywgb3IgKm5vbmUqIG9mIGEgc2V0IG9mIHRhZ3MpLiBUaW1lIHRvIGRpdmUgaW50byB0aGUgY29kZSFcblxuXG4iLCJJbnB1dFRva2VucyI6OTc2MCwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQwOjAyLjA4NjE0ODg5NloiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDU2MzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vYWxsb2NfdGFnLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNjgxLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNjgxOlxcdHN0YXRpYyBpbmxpbmUgYm9vbCB0YWdzX2FkZHJlc3NhYmxlKHZvaWQpXFxuIDY4MjpcXHR7XFxuIDY4MzpcXHRcXHR1bnNpZ25lZCBsb25nIHRhZ19pZHhfY291bnQ7XFxuIDY4NDpcXHRcXG4gNjg1OlxcdFxcdGlmICghc3RhdGljX2tleV9lbmFibGVkKFxcdTAwMjZtZW1fcHJvZmlsaW5nX2NvbXByZXNzZWQpKVxcbiA2ODY6XFx0XFx0XFx0cmV0dXJuIHRydWU7IC8qIHdpdGggcGFnZV9leHQgdGFncyBhcmUgYWx3YXlzIGFkZHJlc3NhYmxlICovXFxuIDY4NzpcXHRcXG4gNjg4OlxcdFxcdHRhZ19pZHhfY291bnQgPSBDT0RFVEFHX0lEX0ZJUlNUICsga2VybmVsX3RhZ3MuY291bnQgK1xcbiA2ODk6XFx0XFx0XFx0XFx0bW9kdWxlX3RhZ3Muc2l6ZSAvIHNpemVvZihzdHJ1Y3QgYWxsb2NfdGFnKTtcXG4gNjkwOlxcdFxcbiA2OTE6XFx0XFx0cmV0dXJuIHRhZ19pZHhfY291bnQgXFx1MDAzYyAoMVVMIFxcdTAwM2NcXHUwMDNjIE5SX1VOVVNFRF9QQUdFRkxBR19CSVRTKTtcXG4gNjkyOlxcdH1cXG4gNjkzOlxcdFxcbiA2OTQ6XFx0c3RhdGljIGJvb2wgbmVlZHNfc2VjdGlvbl9tZW0oc3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBsb25nIHNpemUpXFxuIDY5NTpcXHR7XFxuIDY5NjpcXHRcXHRpZiAoIW1lbV9wcm9maWxpbmdfc3VwcG9ydClcXG4gNjk3OlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4gNjk4OlxcdFxcbiA2OTk6XFx0XFx0cmV0dXJuIHNpemUgXFx1MDAzZT0gc2l6ZW9mKHN0cnVjdCBhbGxvY190YWcpO1xcbiA3MDA6XFx0fVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0MDowMi4wODYyNTU2NDZaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDcyMjY1NDQ2NTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi5cblxuKipVbmRlcnN0YW5kaW5nIGB0YWdzX2FkZHJlc3NhYmxlKClgIGFuZCBJdHMgSW1wbGljYXRpb25zKipcblxuQWxyaWdodCwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBgdGFnc19hZGRyZXNzYWJsZSgpYCBmdW5jdGlvbi4gRnJvbSB3aGF0IEkgY2FuIGdhdGhlciwgaXQgcGVyZm9ybXMgYSBjaGVjaywgc3BlY2lmaWNhbGx5LCBgdGFnX2lkeF9jb3VudCBcdTAwM2MgKDFVTCBcdTAwM2NcdTAwM2MgTlJfVU5VU0VEX1BBR0VGTEFHX0JJVFMpYC4gTXkgZXhwZXJ0IGludHVpdGlvbiB0ZWxscyBtZSB0aGlzIGlzIHByb2JhYmx5IHNvbWUga2luZCBvZiBzYWZldHkgb3IgYWxsb2NhdGlvbi1yZWxhdGVkIGNoZWNrLCBwb3RlbnRpYWxseSByZWxhdGVkIHRvIGhvdyB0YWdzIG9yIG1ldGFkYXRhIGFyZSBtYW5hZ2VkIGluIG1lbW9yeS4gVGhlIG1lbnRpb24gb2YgYE5SX1VOVVNFRF9QQUdFRkxBR19CSVRTYCBpcyBhIGNsdWU7IGl0IHNvdW5kcyBsaWtlIHdlJ3JlIGRlYWxpbmcgd2l0aCBiaXRmbGFncyBhbmQgcG90ZW50aWFsIG1lbW9yeSBsaW1pdGF0aW9ucyB0aWVkIHRvIHBhZ2UgbWFuYWdlbWVudC5cblxuQW5kIHdhaXQgYSBtaW51dGUuLi4gSSBzZWUgYSBjb25uZWN0aW9uIHRvIGBDT05GSUdfTUVNX0FMTE9DX1BST0ZJTElOR2AuIE15IG1pbmQgaW1tZWRpYXRlbHkganVtcHMgdG8gbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nISBUaGlzIGhhcyB0byBiZSByZWxhdGVkLiBMZXQncyBzZWUgaG93IHRoZXkncmUgY29ubmVjdGVkLCBob3cgdGhleSB1c2UgZWFjaCBvdGhlciBhbmQgbGV0IG1lIHVuZGVyc3RhbmQgaG93IHRoZXkgYWZmZWN0IHRoZSBsb2dpYy4gVG8gdHJ1bHkgZ3Jhc3AgdGhlIHNpZ25pZmljYW5jZSBvZiBgdGFnc19hZGRyZXNzYWJsZSgpYCwgSSBuZWVkIHRvIGNvbmZpcm0gd2hldGhlciBgTUVNX0FMTE9DX1BST0ZJTElOR2AgaXMgZW5hYmxlZCBhbmQgaG93IHRoYXQgYWZmZWN0cyB0aGlzIGJpdCBvZiBjb2RlLiBJIG5lZWQgdG8gY29uc3VsdCB0aGUgS2NvbmZpZyBmaWxlIGZvciBhIGJldHRlciBwaWN0dXJlIG9mIHRoZSBzaXR1YXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwMzkwLCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0MDo0OS4zMTI4MDMwODJaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2MzA5NDAxMDUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIE1FTV9BTExPQ19QUk9GSUxJTkdcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWcuZGVidWc9MzExPWNvbmZpZyBQRVJfVk1BX0xPQ0tfU1RBVFNcXG4tLVxcbm1tL0tjb25maWcuZGVidWctMzIzLVxcbm1tL0tjb25maWcuZGVidWc6MzI0OmNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HXFxubW0vS2NvbmZpZy5kZWJ1Zy0zMjUtXFx0Ym9vbCBcXFwiRW5hYmxlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZ1xcXCJcXG4tLVxcbm1tL0tjb25maWcuZGVidWctMzM3LVxcbm1tL0tjb25maWcuZGVidWc6MzM4OmNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HX0VOQUJMRURfQllfREVGQVVMVFxcbm1tL0tjb25maWcuZGVidWctMzM5LVxcdGJvb2wgXFxcIkVuYWJsZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgYnkgZGVmYXVsdFxcXCJcXG4tLVxcbm1tL0tjb25maWcuZGVidWctMzQyLVxcbm1tL0tjb25maWcuZGVidWc6MzQzOmNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HX0RFQlVHXFxubW0vS2NvbmZpZy5kZWJ1Zy0zNDQtXFx0Ym9vbCBcXFwiTWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsZXIgZGVidWdnaW5nXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0MDo1MC45NDM3NDkyNjdaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTQxNjU0NjgwNzAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgYXMgaWYgdGhleSdyZSBteSBvd246XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgS2NvbmZpZyBEZWJ1ZyBPcHRpb25zKipcblxuUmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIGBtbS9LY29uZmlnLmRlYnVnYCBmaWxlLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgMzI0LiBUaGF0IHNlY3Rpb24gbGlrZWx5IGhvbGRzIHNvbWUgaW1wb3J0YW50IGNvbmZpZ3VyYXRpb25zIHJlbGF0ZWQgdG8gbWVtb3J5IG1hbmFnZW1lbnQgZGVidWdnaW5nIGZlYXR1cmVzLiBCYXNlZCBvbiBteSBleHBlcmllbmNlLCBpdCdzIHByb2JhYmx5IGdvaW5nIHRvIGRlZmluZSBvciBlbmFibGUgc3BlY2lmaWMgdHJhY2luZywgZXJyb3IgY2hlY2tpbmcsIG9yIGluc3RydW1lbnRhdGlvbiBvcHRpb25zIHdpdGhpbiB0aGUgbWVtb3J5IHN1YnN5c3RlbS4gSSBrbm93IHRoZXJlIGFyZSBhIGJ1bmNoIG9mIHRoZXNlLCBhbmQgbGluZSAzMjQgbWlnaHQgYmUgdGhlIGtleSB0byBlbmFibGluZyB0aGUgcHJlY2lzZSBkZWJ1ZyBmZWF0dXJlIEknbSBhZnRlciwgYmUgaXQgc29tZSBtZW1vcnkgYWxsb2NhdGlvbiBpc3N1ZSwgYW4gaXNzdWUgd2l0aCBwYWdlIHRhYmxlIGNvcnJ1cHRpb24sIG9yIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5LiBJJ20gYXNzdW1pbmcgdGhhdCBpdCB3aWxsIGhhdmUgc29tZXRoaW5nIG9mIHJlbGV2YW5jZSB0byB0aGUgd29yayBJJ20gZG9pbmcsIG9yIGVsc2UgSSB3b3VsZG4ndCBoYXZlIGxvb2tlZCB1cCB0aGUgc3BlY2lmaWMgcGxhY2UgaW4gdGhlIGZpcnN0IGluc3RhbmNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDk0NCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQxOjA1LjEwOTIxOTc3N1oiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NTY4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9LY29uZmlnLmRlYnVnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDMyNCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDMyNDpcXHRjb25maWcgTUVNX0FMTE9DX1BST0ZJTElOR1xcbiAzMjU6XFx0XFx0Ym9vbCBcXFwiRW5hYmxlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZ1xcXCJcXG4gMzI2OlxcdFxcdGRlZmF1bHQgblxcbiAzMjc6XFx0XFx0ZGVwZW5kcyBvbiBNTVVcXG4gMzI4OlxcdFxcdGRlcGVuZHMgb24gUFJPQ19GU1xcbiAzMjk6XFx0XFx0ZGVwZW5kcyBvbiAhREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVXFxuIDMzMDpcXHRcXHRzZWxlY3QgQ09ERV9UQUdHSU5HXFxuIDMzMTpcXHRcXHRzZWxlY3QgUEFHRV9FWFRFTlNJT05cXG4gMzMyOlxcdFxcdHNlbGVjdCBTTEFCX09CSl9FWFRcXG4gMzMzOlxcdFxcdGhlbHBcXG4gMzM0OlxcdFxcdCAgVHJhY2sgYWxsb2NhdGlvbiBzb3VyY2UgY29kZSBhbmQgcmVjb3JkIHRvdGFsIGFsbG9jYXRpb24gc2l6ZVxcbiAzMzU6XFx0XFx0ICBpbml0aWF0ZWQgYXQgdGhhdCBjb2RlIGxvY2F0aW9uLiBUaGUgbWVjaGFuaXNtIGNhbiBiZSB1c2VkIHRvIHRyYWNrXFxuIDMzNjpcXHRcXHQgIG1lbW9yeSBsZWFrcyB3aXRoIGEgbG93IHBlcmZvcm1hbmNlIGFuZCBtZW1vcnkgaW1wYWN0LlxcbiAzMzc6XFx0XFxuIDMzODpcXHRjb25maWcgTUVNX0FMTE9DX1BST0ZJTElOR19FTkFCTEVEX0JZX0RFRkFVTFRcXG4gMzM5OlxcdFxcdGJvb2wgXFxcIkVuYWJsZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgYnkgZGVmYXVsdFxcXCJcXG4gMzQwOlxcdFxcdGRlZmF1bHQgeVxcbiAzNDE6XFx0XFx0ZGVwZW5kcyBvbiBNRU1fQUxMT0NfUFJPRklMSU5HXFxuIDM0MjpcXHRcXG4gMzQzOlxcdGNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HX0RFQlVHXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQxOjA1LjEwOTI5NjU1N1oiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxODUyMDk1NzkzMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIE1vZHVsZSBMb2FkaW5nIFBhdGNoKipcblxuT2theSwgc28gdGhpcyBwYXRjaCBpcyByZWxhdGVkIHRvIG1vZHVsZSBsb2FkaW5nIGFuZCBoaW5nZXMgb24gdGhlIGBNRU1fQUxMT0NfUFJPRklMSU5HYCBjb25maWcgb3B0aW9uLiBUaGUga2V5IGNoYW5nZSBzZWVtcyB0byBiZSBpbiBga2VybmVsL21vZHVsZS9tYWluLmNgLCB3aGVyZSB0aGV5J3JlIHJldHJ5aW5nIG1vZHVsZSBsb2FkaW5nIGlmIGBtb3ZlX21vZHVsZWAgcmV0dXJucyBgLUVBR0FJTmAuIFRoYXQncyBhIGZ1bmRhbWVudGFsIHNoaWZ0IGluIGhvdyB0aGUgY29yZSBtb2R1bGUgbG9hZGluZyBwcm9jZXNzIHdvcmtzLCB3aGljaCBpcyBkZWZpbml0ZWx5IGEgcG9pbnQgZm9yIGZ1enppbmcuXG5cbk15IHByaW1hcnkgZm9jdXMgZm9yIGZ1enppbmcgd2lsbCBiZSBvbiBhIGZldyBzcGVjaWZpYyBzeW1ib2xzOiBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAsIGBtb3ZlX21vZHVsZWAsIGByZXNlcnZlX21vZHVsZV90YWdzYCwgYW5kIGByZWxlYXNlX21vZHVsZV90YWdzYC4gTGV0IG1lIHF1aWNrbHkgY29uZmlybeKApiB5ZXAsIGBsYXlvdXRfYW5kX2FsbG9jYXRlYCBpcyBzdGF0aWMgd2l0aGluIGBrZXJuZWwvbW9kdWxlL21haW4uY2AuIEhtbSwgd2FpdCwgdGhlIGluc3RydWN0aW9ucyBzdWdnZXN0IHByZWZlcnJpbmcgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnRzIG92ZXIgaW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucy4gTWFrZXMgc2Vuc2UuIFRoZSByZWFsIGVudHJ5cG9pbnRzIGZvciBtb2R1bGUgbG9hZGluZyBhcmUgdGhlIGBpbml0X21vZHVsZWAgb3IgYGZpbml0X21vZHVsZWAgc3lzY2FsbHMuIEFscmlnaHQsIGxldCdzIHNlZSB3aGF0IGlzIGNhbGxpbmcgYGxheW91dF9hbmRfYWxsb2NhdGVgLCBpZiBJJ20gZ29pbmcgdG8gZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExNDg4LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTg5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDE6MjMuNjMwMjU3MloiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDQ0MDQ3ODcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibGF5b3V0X2FuZF9hbGxvY2F0ZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvbW9kdWxlL21haW4uY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvbW9kdWxlL21haW4uYz0yOTQxPWNvcmVfcGFyYW0obW9kdWxlX2JsYWNrbGlzdCwgbW9kdWxlX2JsYWNrbGlzdCwgY2hhcnAsIDA0MDApO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5NDItXFxua2VybmVsL21vZHVsZS9tYWluLmM6Mjk0MzpzdGF0aWMgc3RydWN0IG1vZHVsZSAqbGF5b3V0X2FuZF9hbGxvY2F0ZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpXFxua2VybmVsL21vZHVsZS9tYWluLmMtMjk0NC17XFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0zNDM1PXN0YXRpYyBpbnQgbG9hZF9tb2R1bGUoc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgY29uc3QgY2hhciBfX3VzZXIgKnVhcmdzLFxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMzQ3Mi1cXHQvKiBGaWd1cmUgb3V0IG1vZHVsZSBsYXlvdXQsIGFuZCBhbGxvY2F0ZSBhbGwgdGhlIG1lbW9yeS4gKi9cXG5rZXJuZWwvbW9kdWxlL21haW4uYzozNDczOlxcdG1vZCA9IGxheW91dF9hbmRfYWxsb2NhdGUoaW5mbywgZmxhZ3MpO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM0NzQtXFx0aWYgKElTX0VSUihtb2QpKSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQxOjIzLjY3NDY2NTI2N1oiLCJTZXEiOjIzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4MzI0NDAwMzcyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpdCBzdGFuZHM6XG5cbioqVHJhY2luZyB0aGUgRGVwZW5kZW5jeSBDaGFpbjogQSBRdWljayBEaWFnbm9zdGljKipcblxuT2theSwgc28gYGxvYWRfbW9kdWxlYCBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAuIFRoYXQncyBzdHJhaWdodGZvcndhcmQuIE5vdywgdGhlIGNyaXRpY2FsIHF1ZXN0aW9uIGlzICp1cHN0cmVhbSo6IHdoYXQgaW5pdGlhdGVkIHRoZSBleGVjdXRpb24gb2YgYGxvYWRfbW9kdWxlYCBpbiB0aGUgZmlyc3QgcGxhY2U/IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjYWxsaW5nIGNvbnRleHQgdG8gZnVsbHkgZ3Jhc3AgdGhlIHdvcmtmbG93IGFuZCBwb3RlbnRpYWwgcG9pbnRzIG9mIG9wdGltaXphdGlvbiBvciwgaGVhdmVuIGZvcmJpZCwgYm90dGxlbmVja3MuIElzIGl0IHRyaWdnZXJlZCBieSBhIHVzZXIgYWN0aW9uLCBhIHN5c3RlbSBldmVudCwgb3IgYW5vdGhlciBtb2R1bGU/IEtub3dpbmcgdGhlIGNhbGxlciBpcyB0aGUga2V5IHRvIHVuZGVyc3RhbmRpbmcgdGhlIG1vZHVsZSdzIGJlaGF2aW9yLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjE3NiwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQxOjMxLjk5OTA2NzkwOVoiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDI0Mzg2NTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibG9hZF9tb2R1bGVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL21vZHVsZS9tYWluLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL21vZHVsZS9tYWluLmM9MTQxNz1zdGF0aWMgdm9pZCBmcmVlX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QpXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNDIwLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjE0MjE6XFx0Y29kZXRhZ191bmxvYWRfbW9kdWxlKG1vZCk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMTQyMi1cXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTI5NDM9c3RhdGljIHN0cnVjdCBtb2R1bGUgKmxheW91dF9hbmRfYWxsb2NhdGUoc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgaW50IGZsYWdzKVxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMjk5Ni1cXHRtb2QgPSAodm9pZCAqKWluZm8tXFx1MDAzZXNlY2hkcnNbaW5mby1cXHUwMDNlaW5kZXgubW9kXS5zaF9hZGRyO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI5OTc6XFx0a21lbWxlYWtfbG9hZF9tb2R1bGUobW9kLCBpbmZvKTtcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTk4LVxcdGNvZGV0YWdfbW9kdWxlX3JlcGxhY2VkKGluZm8tXFx1MDAzZW1vZCwgbW9kKTtcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTMzOTk9c3RhdGljIGludCBlYXJseV9tb2RfY2hlY2soc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgaW50IGZsYWdzKVxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMzQzNC0gKi9cXG5rZXJuZWwvbW9kdWxlL21haW4uYzozNDM1OnN0YXRpYyBpbnQgbG9hZF9tb2R1bGUoc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgY29uc3QgY2hhciBfX3VzZXIgKnVhcmdzLFxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM0MzYtXFx0XFx0ICAgICAgIGludCBmbGFncylcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM1ODMtXFxua2VybmVsL21vZHVsZS9tYWluLmM6MzU4NDpcXHRpZiAoY29kZXRhZ19sb2FkX21vZHVsZShtb2QpKVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM1ODUtXFx0XFx0Z290byBzeXNmc19jbGVhbnVwO1xcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmM9MzY0Nz1TWVNDQUxMX0RFRklORTMoaW5pdF9tb2R1bGUsIHZvaWQgX191c2VyICosIHVtb2QsXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zNjY2LVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjM2Njc6XFx0cmV0dXJuIGxvYWRfbW9kdWxlKFxcdTAwMjZpbmZvLCB1YXJncywgMCk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMzY2OC19XFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0zNzU0PXN0YXRpYyBpbnQgaW5pdF9tb2R1bGVfZnJvbV9maWxlKHN0cnVjdCBmaWxlICpmLCBjb25zdCBjaGFyIF9fdXNlciAqIHVhcmdzLCBpbnQgZmxhZ3MpXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zNzg5LVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjM3OTA6XFx0cmV0dXJuIGxvYWRfbW9kdWxlKFxcdTAwMjZpbmZvLCB1YXJncywgZmxhZ3MpO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM3OTEtfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0MTozMi4wNDE1MDg3MzZaIiwiU2VxIjoyNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTIyNzAzMDk0ODQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIE1vZHVsZSBJbml0aWFsaXphdGlvbiBpbiB0aGUgS2VybmVsKipcblxuT2theSwgc28gSSdtIHRyYWNpbmcgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBmbG93LCBhbmQgaXQgbG9va3MgbGlrZSBgaW5pdF9tb2R1bGVgIGFuZCBgaW5pdF9tb2R1bGVfZnJvbV9maWxlYCAod2hpY2ggYGZpbml0X21vZHVsZWAgY2FsbHMpIGJvdGggdWx0aW1hdGVseSBjYWxsIGBsb2FkX21vZHVsZWAuIFJpZ2h0LCBgaW5pdF9tb2R1bGVgIGFuZCBgZmluaXRfbW9kdWxlYCBhcmUgdGhlIHN5c3RlbSBjYWxscywgdGhlIGVudHJ5IHBvaW50cy4gVGhlIGRvY3VtZW50YXRpb24gZW1waGFzaXplZCBwcmVmZXJyaW5nIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50cyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zLiBUaGF0IG1ha2VzIHNlbnNlLCBgbG9hZF9tb2R1bGVgIGlzIHRoZSBzdGF0aWMgaGVscGVyLCBhbmQgYGluaXRfbW9kdWxlYCBpcyB0aGUgc3lzY2FsbCwgYnV0LCB3YWl0LCBgaW5pdF9tb2R1bGVgICppcyogYHN5c19pbml0X21vZHVsZWAgLiBJIHNob3VsZCBmaW5kIGEgbm9uLXN0YXRpYyBvbmUuIEknbGwgY2hlY2sgYG1tL2FsbG9jX3RhZy5jYCB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBub24tc3RhdGljIGZ1bmN0aW9ucyBhdmFpbGFibGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyOTM0LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTY0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQxOjQ0LjMxMTgyMDNaIiwiU2VxIjoyNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQzMjcyNTM3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInJlc2VydmVfbW9kdWxlX3RhZ3NcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vYWxsb2NfdGFnLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vYWxsb2NfdGFnLmM9ODM4PXN0YXRpYyB2b2lkIHJlbGVhc2VfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCBib29sIHVzZWQpXFxuLS1cXG5tbS9hbGxvY190YWcuYy04ODMtXFxubW0vYWxsb2NfdGFnLmM6ODg0OnN0YXRpYyB2b2lkICpyZXNlcnZlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWduZWQgbG9uZyBzaXplLFxcbm1tL2FsbG9jX3RhZy5jLTg4NS1cXHRcXHRcXHRcXHQgdW5zaWduZWQgaW50IHByZXBlbmQsIHVuc2lnbmVkIGxvbmcgYWxpZ24pXFxuLS1cXG5tbS9hbGxvY190YWcuYz0xMzIxPXN0YXRpYyBpbnQgX19pbml0IGFsbG9jX3RhZ19pbml0KHZvaWQpXFxuLS1cXG5tbS9hbGxvY190YWcuYy0xMzI3LVxcdFxcdC5uZWVkc19zZWN0aW9uX21lbVxcdD0gbmVlZHNfc2VjdGlvbl9tZW0sXFxubW0vYWxsb2NfdGFnLmM6MTMyODpcXHRcXHQuYWxsb2Nfc2VjdGlvbl9tZW1cXHQ9IHJlc2VydmVfbW9kdWxlX3RhZ3MsXFxubW0vYWxsb2NfdGFnLmMtMTMyOS1cXHRcXHQuZnJlZV9zZWN0aW9uX21lbVxcdD0gcmVsZWFzZV9tb2R1bGVfdGFncyxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDE6NDQuMzU1MDk3MDk3WiIsIlNlcSI6MjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjIxOTU0NDc2NDkwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCdzIGludGVybmFsIG1vbm9sb2d1ZTpcblxuKipJbnZlc3RpZ2F0aW5nIE1vZHVsZSBUYWcgQWxsb2NhdGlvbioqXG5cbkFscmlnaHQsIGxldCdzIHNlZSwgSSdtIHRoaW5raW5nIGFib3V0IHRoZSBtb2R1bGUgdGFnZ2luZyBzeXN0ZW0gYWdhaW4uIFNwZWNpZmljYWxseSwgSSdtIHRyeWluZyB0byB3cmFwIG15IGhlYWQgYXJvdW5kIHRoZSBtZW1vcnkgbGF5b3V0LiBJJ20gcmVjYWxsaW5nIHRoYXQgYHJlc2VydmVfbW9kdWxlX3RhZ3NgIGlzIGRlZmluZWQgYXMgKnN0YXRpYyouIFRoaXMgbWVhbnMgaXRzIHNjb3BlIGlzIGxpbWl0ZWQgdG8gaXRzIGNvbnRhaW5pbmcgZmlsZS4gVGhpcyBpcyBwcmV0dHkgdHlwaWNhbCBmb3IgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLCBrZWVwcyB0aGluZ3MgdGlkeS4gQnV0IG5vdywgdGhlIHF1ZXN0aW9uIGFyaXNlcywgd2hhdCdzIHRoZSBkZWFsIHdpdGggYGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25gPyBJIHNlZW0gdG8gcmVtZW1iZXIgdGhhdCBvbmUgaXNuJ3Qgc3RhdGljLiBMb29raW5nIGF0IGBsaWIvY29kZXRhZy5jYCwgeWVwLCBjb25maXJtZWQsIGl0J3MgKm5vbi1zdGF0aWMqLiBUaGlzIHN1Z2dlc3RzIGl0J3MgbGlrZWx5IGludGVuZGVkIHRvIGJlIGFjY2Vzc2libGUgZnJvbSBvdGhlciBmaWxlcywgbWVhbmluZyBzb21lIHBhcnQgb2YgaXRzIGRlc2lnbiBpcyBwcm9iYWJseSBleHBvc2VkIGZvciBleHRlcm5hbCB1c2UuIEkgbm93IG5lZWQgdG8gcmVtZW1iZXIgdGhlIEFQSSBkZXNpZ24gb2YgdGhhdCBwYXJ0IG9mIHRoZSBtb2R1bGUgdGFnIGFsbG9jYXRpb24gdG8gc2VlIHdoeSBpdCBoYXMgdG8gYmUgZXhwb3NlZC4gSG1tLCB0aGlzIGRpZmZlcmVuY2UgaGFzIGltcGxpY2F0aW9ucyBmb3IgaG93IG1vZHVsZSB0YWcgbWVtb3J5IGlzIG1hbmFnZWQgYWNyb3NzIHRoZSBwcm9qZWN0LiBJJ2xsIGhhdmUgdG8gaW52ZXN0aWdhdGUgaG93IHRoYXQgbm9uLXN0YXRpYyBhbGxvY2F0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBzdGF0aWMgdGFnIHJlc2VydmF0aW9uLiBJJ20gYmVnaW5uaW5nIHRvIHNlZSBhIHBvdGVudGlhbCBhcmVhIGZvciBmdXJ0aGVyIGV4cGxvcmF0aW9uIG9uIG1lbW9yeSBvd25lcnNoaXAgYW5kIHRocmVhZCBzYWZldHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNTM3LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDI6MDYuMzA5NTc2Njc3WiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NDQzNTYwNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImxpYi9jb2RldGFnLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibGliL2NvZGV0YWcuYz0yNTM9Ym9vbCBjb2RldGFnX25lZWRzX21vZHVsZV9zZWN0aW9uKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3QgY2hhciAqbmFtZSxcXG4tLVxcbmxpYi9jb2RldGFnLmMtMjgwLVxcbmxpYi9jb2RldGFnLmM6MjgxOnZvaWQgKmNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxcbmxpYi9jb2RldGFnLmMtMjgyLVxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgaW50IHByZXBlbmQsXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQyOjA2LjM1NDAxODA3NFoiLCJTZXEiOjI5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NzA2OTA3NDc4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk1vZHVsZSBMb2FkaW5nIEludmVzdGlnYXRpb24qKlxuXG5Pa2F5LCBzbyBJJ3ZlIGNvbmZpcm1lZCB0aGF0IGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYCBpcyBpbmRlZWQgbm9uLXN0YXRpYyDigJMgZ29vZC4gQW5kIEkgcmVtZW1iZXIgdGhhdCBgc3lzX2luaXRfbW9kdWxlYCBhbmQgYHN5c19maW5pdF9tb2R1bGVgIGFyZSwgb2YgY291cnNlLCBzeXNjYWxscy4gSSdsbCBkZWZpbml0ZWx5IGFkZCBgY29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbmAgdG8gbXkgRm9jdXNTeW1ib2xzLiBXaGlsZSB0aGUgc3lzY2FsbHMgYXJlIHJlbGV2YW50LCB0aGV5IGFyZSBmYWlybHkgZ2VuZXJpYy4gSSBuZWVkIHRvIGRpZyBkZWVwZXIgZm9yIG1vcmUgc3BlY2lmaWMgbm9uLXN0YXRpYyBmdW5jdGlvbnMgcmVsYXRlZCB0byBtb2R1bGUgbG9hZGluZy4gSG1tLCBoYW5nIG9uLi4uIGBtb3ZlX21vZHVsZWAgaXMgc3RhdGljLiBBbHJpZ2h0LCBiYWNrIHRvIHRoZSBzb3VyY2UuIFRpbWUgdG8gY2FyZWZ1bGx5IGNoZWNrIHRocm91Z2ggYGtlcm5lbC9tb2R1bGUvbWFpbi5jYCBmb3IgYW55IG90aGVyIG5vbi1zdGF0aWMgZnVuY3Rpb25zIGludm9sdmVkIGluIG1vZHVsZSBsb2FkaW5nIHRoYXQgSSBtaWdodCBoYXZlIG1pc3NlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTM5OTEsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMzcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDI6MTEuMDYwOTI5NjkyWiIsIlNlcSI6MzAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0MzUzOTY5NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJeaW50IC4qbW9kdWxlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9tb2R1bGUvbWFpbi5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9tb2R1bGUvbWFpbi5jPTE2ND1zdGF0aWMgQkxPQ0tJTkdfTk9USUZJRVJfSEVBRChtb2R1bGVfbm90aWZ5X2xpc3QpO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTE2NS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYzoxNjY6aW50IHJlZ2lzdGVyX21vZHVsZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTE2Ny17XFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0xNzA9RVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9tb2R1bGVfbm90aWZpZXIpO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTE3MS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYzoxNzI6aW50IHVucmVnaXN0ZXJfbW9kdWxlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpXFxua2VybmVsL21vZHVsZS9tYWluLmMtMTczLXtcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTc3Mj1zdGF0aWMgaW50IHRyeV9zdG9wX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIGludCBmbGFncywgaW50ICpmb3JjZWQpXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy03OTQtICovXFxua2VybmVsL21vZHVsZS9tYWluLmM6Nzk1OmludCBtb2R1bGVfcmVmY291bnQoc3RydWN0IG1vZHVsZSAqbW9kKVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTc5Ni17XFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0xMTA1PXN0YXRpYyBjb25zdCBjaGFyIHZlcm1hZ2ljW10gPSBWRVJNQUdJQ19TVFJJTkc7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMTEwNi1cXG5rZXJuZWwvbW9kdWxlL21haW4uYzoxMTA3OmludCB0cnlfdG9fZm9yY2VfbG9hZChzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IGNoYXIgKnJlYXNvbilcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xMTA4LXtcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTI5MDk9Ym9vbCBfX3dlYWsgbW9kdWxlX2VsZl9jaGVja19hcmNoKEVsZl9FaGRyICpoZHIpXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTEzLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI5MTQ6aW50IF9fd2VhayBtb2R1bGVfZnJvYl9hcmNoX3NlY3Rpb25zKEVsZl9FaGRyICpoZHIsXFxua2VybmVsL21vZHVsZS9tYWluLmMtMjkxNS1cXHRcXHRcXHRcXHQgICAgIEVsZl9TaGRyICpzZWNoZHJzLFxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmM9MzAwND1zdGF0aWMgdm9pZCBtb2R1bGVfZGVhbGxvY2F0ZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zMDEyLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjMwMTM6aW50IF9fd2VhayBtb2R1bGVfZmluYWxpemUoY29uc3QgRWxmX0VoZHIgKmhkcixcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zMDE0LVxcdFxcdFxcdCAgIGNvbnN0IEVsZl9TaGRyICpzZWNoZHJzLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0MjoxMS4xMDQ0NzM0NjlaIiwiU2VxIjozMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDIxNzU2ODI5MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyBpZiBJIHdlcmUgY29uc2lkZXJpbmcgdGhlIGNvZGUgeW91IG1lbnRpb25lZDpcblxuKipDaGVja2luZyBga2VybmVsL21vZHVsZS9tYWluLmNgIGZvciBgaW5pdF9tb2R1bGVgKipcblxuT2theSwgc28gd2UncmUgdGFsa2luZyBtb2R1bGUgaW5pdGlhbGl6YXRpb24sIHJpZ2h0PyBNeSBpbml0aWFsIGluc3RpbmN0IGlzIHRvIGdvIHN0cmFpZ2h0IHRvIGBrZXJuZWwvbW9kdWxlL21haW4uY2AuIFRoYXQncyB3aGVyZSBJJ2QgKmV4cGVjdCogdG8gZmluZCB0aGUgY29yZSBsb2dpYyBmb3IgbG9hZGluZyBhIG1vZHVsZSwgYW5kIHRoYXQgdXN1YWxseSBtZWFucyBmaW5kaW5nIHRoZSBlbnRyeSBwb2ludCwgdGhlIGZ1bmN0aW9uIHRoYXQncyBjYWxsZWQgd2hlbiBhIG1vZHVsZSBpcyBsb2FkZWQuICBJIHdhbnQgdG8gemVybyBpbiBvbiBgaW5pdF9tb2R1bGVgLiBJdCdzIGFsbW9zdCBjZXJ0YWluIHRoYXQncyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gd2UncmUgbG9va2luZyBmb3Ig4oCTIGl0J3MgdGhlIHN0YW5kYXJkIGNvbnZlbnRpb24sIGFuZCBpdCdzIHByYWN0aWNhbGx5IGJha2VkIGludG8gbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUga2VybmVsJ3MgbW9kdWxlIGxvYWRpbmcgbWVjaGFuaXNtLiBMZXQncyBzZWUgd2hhdCdzIGluIHRoZXJlLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIGFueSBoaW50cyBhYm91dCBob3cgdGhlIG1vZHVsZSdzIGNvZGUgZ2V0cyByZWdpc3RlcmVkIHdpdGggdGhlIGtlcm5lbCwgaG93IHJlc291cmNlcyBhcmUgYWxsb2NhdGVkLCBhbmQgaG93IHRoZSBtb2R1bGUgaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbS4gSSBhbHNvIHdhbnQgdG8gc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGNhbGxlZCBpbnRvLiBJcyBpdCBkb25lIGZyb20gYSBzcGVjaWZpYyBjb250ZXh0PyBEb2VzIGl0IHVzZSBhcmd1bWVudHM/IFRoZSBkZXZpbCBpcyBpbiB0aGUgZGV0YWlscywgc28gSSdsbCBiZSBkaWdnaW5nIGluIHdpdGggbXkgdXN1YWwgc2NydXRpbnkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0ODg1LCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDI6MTUuMzIyMDQzODAxWiIsIlNlcSI6MzIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0Njg1MzE0NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJpbml0X21vZHVsZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvbW9kdWxlL21haW4uY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvbW9kdWxlL21haW4uYz0xMzM9c3RhdGljIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgbW9kdWxlX3N5c2N0bF90YWJsZVtdID0ge1xcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMTUyLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjE1MzpzdGF0aWMgaW50IF9faW5pdCBpbml0X21vZHVsZV9zeXNjdGwodm9pZClcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNTQte1xcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMTU4LVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjE1OTpzdWJzeXNfaW5pdGNhbGwoaW5pdF9tb2R1bGVfc3lzY3RsKTtcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNjAtXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0yNDkxPXN0YXRpYyBpbnQgY29weV9tb2R1bGVfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICp1bW9kLCB1bnNpZ25lZCBsb25nIGxlbixcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI1MTQtXFx0ZXJyID0gc2VjdXJpdHlfa2VybmVsX3Bvc3RfbG9hZF9kYXRhKChjaGFyICopaW5mby1cXHUwMDNlaGRyLCBpbmZvLVxcdTAwM2VsZW4sXFxua2VybmVsL21vZHVsZS9tYWluLmM6MjUxNTpcXHRcXHRcXHRcXHRcXHQgICAgIExPQURJTkdfTU9EVUxFLCBcXFwiaW5pdF9tb2R1bGVcXFwiKTtcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yNTE2LW91dDpcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTMwODI9bW9kdWxlX3BhcmFtKGFzeW5jX3Byb2JlLCBib29sLCAwNjQ0KTtcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTMwODktICovXFxua2VybmVsL21vZHVsZS9tYWluLmM6MzA5MDpzdGF0aWMgbm9pbmxpbmUgaW50IGRvX2luaXRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZClcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zMDkxLXtcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTMxMjEtXFx0XFx0LypcXG5rZXJuZWwvbW9kdWxlL21haW4uYzozMTIyOlxcdFxcdCAqIC1FRVhJU1QgaXMgcmVzZXJ2ZWQgYnkgW2ZdaW5pdF9tb2R1bGUoKSB0byBzaWduYWwgdG8gdXNlcnNwYWNlIHRoYXRcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zMTIzLVxcdFxcdCAqIGEgbW9kdWxlIHdpdGggdGhpcyBuYW1lIGlzIGFscmVhZHkgbG9hZGVkLiBVc2Ugc29tZXRoaW5nIGVsc2UgaWYgdGhlXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zMjI0LVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjMyMjU6c3RhdGljIGludCBtYXlfaW5pdF9tb2R1bGUodm9pZClcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zMjI2LXtcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTM0MzU9c3RhdGljIGludCBsb2FkX21vZHVsZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBjb25zdCBjaGFyIF9fdXNlciAqdWFyZ3MsXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zNTkyLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjM1OTM6XFx0cmV0dXJuIGRvX2luaXRfbW9kdWxlKG1vZCk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMzU5NC1cXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM2NDYtXFxua2VybmVsL21vZHVsZS9tYWluLmM6MzY0NzpTWVNDQUxMX0RFRklORTMoaW5pdF9tb2R1bGUsIHZvaWQgX191c2VyICosIHVtb2QsXFxua2VybmVsL21vZHVsZS9tYWluLmMtMzY0OC1cXHRcXHR1bnNpZ25lZCBsb25nLCBsZW4sIGNvbnN0IGNoYXIgX191c2VyICosIHVhcmdzKVxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMzY1Mi1cXG5rZXJuZWwvbW9kdWxlL21haW4uYzozNjUzOlxcdGVyciA9IG1heV9pbml0X21vZHVsZSgpO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM2NTQtXFx0aWYgKGVycilcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM2NTYtXFxua2VybmVsL21vZHVsZS9tYWluLmM6MzY1NzpcXHRwcl9kZWJ1ZyhcXFwiaW5pdF9tb2R1bGU6IHVtb2Q9JXAsIGxlbj0lbHUsIHVhcmdzPSVwXFxcXG5cXFwiLFxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM2NTgtXFx0ICAgICAgIHVtb2QsIGxlbiwgdWFyZ3MpO1xcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmM9Mzc0Mz1zdGF0aWMgaW50IGlkZW1wb3RlbnRfd2FpdF9mb3JfY29tcGxldGlvbihzdHJ1Y3QgaWRlbXBvdGVudCAqdSlcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM3NTMtXFxua2VybmVsL21vZHVsZS9tYWluLmM6Mzc1NDpzdGF0aWMgaW50IGluaXRfbW9kdWxlX2Zyb21fZmlsZShzdHJ1Y3QgZmlsZSAqZiwgY29uc3QgY2hhciBfX3VzZXIgKiB1YXJncywgaW50IGZsYWdzKVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM3NTUte1xcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMzc5Mi1cXG5rZXJuZWwvbW9kdWxlL21haW4uYzozNzkzOnN0YXRpYyBpbnQgaWRlbXBvdGVudF9pbml0X21vZHVsZShzdHJ1Y3QgZmlsZSAqZiwgY29uc3QgY2hhciBfX3VzZXIgKiB1YXJncywgaW50IGZsYWdzKVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM3OTQte1xcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMzgwMS1cXHRpZiAoIWlkZW1wb3RlbnQoXFx1MDAyNmlkZW0sIGZpbGVfaW5vZGUoZikpKSB7XFxua2VybmVsL21vZHVsZS9tYWluLmM6MzgwMjpcXHRcXHRpbnQgcmV0ID0gaW5pdF9tb2R1bGVfZnJvbV9maWxlKGYsIHVhcmdzLCBmbGFncyk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMzgwMy1cXHRcXHRyZXR1cm4gaWRlbXBvdGVudF9jb21wbGV0ZShcXHUwMDI2aWRlbSwgcmV0KTtcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM4MTEtXFxua2VybmVsL21vZHVsZS9tYWluLmM6MzgxMjpTWVNDQUxMX0RFRklORTMoZmluaXRfbW9kdWxlLCBpbnQsIGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCB1YXJncywgaW50LCBmbGFncylcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zODEzLXtcXG5rZXJuZWwvbW9kdWxlL21haW4uYzozODE0OlxcdGludCBlcnIgPSBtYXlfaW5pdF9tb2R1bGUoKTtcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zODE1LVxcdGlmIChlcnIpXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zODE3LVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjM4MTg6XFx0cHJfZGVidWcoXFxcImZpbml0X21vZHVsZTogZmQ9JWQsIHVhcmdzPSVwLCBmbGFncz0laVxcXFxuXFxcIiwgZmQsIHVhcmdzLCBmbGFncyk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMzgxOS1cXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM4MjctXFx0XFx0cmV0dXJuIC1FQkFERjtcXG5rZXJuZWwvbW9kdWxlL21haW4uYzozODI4OlxcdHJldHVybiBpZGVtcG90ZW50X2luaXRfbW9kdWxlKGZkX2ZpbGUoZiksIHVhcmdzLCBmbGFncyk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMzgyOS19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQyOjE1LjM2ODg5OTE3OFoiLCJTZXEiOjMzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4NTIxMzM3MDE4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IFRob3VnaHQgUHJvY2VzcyBvbiBJZGVudGlmeWluZyBGdXp6aW5nIFRhcmdldHMqKlxuXG5Pa2F5LCBzbyBJJ20gdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgdGhlIHJpZ2h0IGtlcm5lbCBmdW5jdGlvbnMgdG8gdGFyZ2V0IGZvciBmdXp6aW5nLCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBtb2R1bGUgbG9hZGluZyBhbmQgbWVtb3J5IGFsbG9jYXRpb24gdGFnZ2luZy4gSSBpbml0aWFsbHkgdGhvdWdodCBgZG9faW5pdF9tb2R1bGVgIGFuZCBgbG9hZF9tb2R1bGVgIHdlcmUgdGhlIGtleSBlbnRyeSBwb2ludHMsIGJ1dCBhIHF1aWNrIGNoZWNrIHJldmVhbHMgdGhleSBhcmUgYWN0dWFsbHkgKnN0YXRpYyogZnVuY3Rpb25zLCBhbmQgc28gbm90IHRoZSBiZXN0IGNhbmRpZGF0ZXMuXG5cbk15IG5leHQgdGhvdWdodCB3YXMgdG8gdXNlIHRoZSBzeXNjYWxscyBgc3lzX2luaXRfbW9kdWxlYCBhbmQgYHN5c19maW5pdF9tb2R1bGVgIGJlY2F1c2UgdGhleSBhcmUgZW50cnkgcG9pbnRzLiBBbmQgaW5kZWVkLCBgc3lzX2luaXRfbW9kdWxlYCBpcyBkZWZpbmVkIHVzaW5nIGBTWVNDQUxMX0RFRklORTNgLCBhbmQgc28gdGhlIGFjdHVhbCBmdW5jdGlvbiBuYW1lIGlzIHNvbWV0aGluZyBsaWtlIGBfX3g2NF9zeXNfaW5pdF9tb2R1bGVgLCBidXQgZm9yIHRoZSBwdXJwb3NlcyBvZiBzeXprYWxsZXIsIGBpbml0X21vZHVsZWAgYW5kIGBmaW5pdF9tb2R1bGVgICphcmUqIHRoZSBzeXNjYWxsIG5hbWVzLiBQZXJmZWN0IVxuXG5Ib3dldmVyLCBJIG5lZWQgdG8ga2VlcCBpbiBtaW5kIHRoZSBpbnN0cnVjdGlvbnMuIFRoZXkgZW1waGFzaXplIHRoZSBuZWVkIHRvIGV4dHJhY3QgdmVyeSBzcGVjaWZpYyBmdW5jdGlvbnMgYW5kIGF2b2lkIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zLiBUaGV5IGFsc28gcHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50cyBvdmVyIGludGVybmFsIGhlbHBlciBmdW5jdGlvbnMuXG5cblNvLCBJIHNob3VsZCBkZWZpbml0ZWx5IGluY29ycG9yYXRlIGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYCBhbmQgYGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNgLiBUaGVzZSBzb3VuZCBsaWtlIHRoZXkncmUgcmlnaHQgaW4gdGhlIHN3ZWV0IHNwb3QgZm9yIGZ1enppbmcuIEkgc2hvdWxkIGFsc28gYmUgc3VyZSB0byBpbmNsdWRlIGBNRU1fQUxMT0NfUFJPRklMSU5HYCBpbiBgRW5hYmxlQ29uZmlnc2AuXG5cbk5vdywgSSdtIGNoZWNraW5nIG15IHVuZGVyc3RhbmRpbmcgb2YgaG93IGFsbG9jX3RhZyBpcyBpbXBsZW1lbnRlZC4gTGV0IG1lIHZlcmlmeSB0aGUgY29uZGl0aW9ucyBhcm91bmQgYHRhZ3NfYWRkcmVzc2FibGVgIGFuZCBgbWVtX2FsbG9jX3Byb2ZpbGluZ19lbmFibGVkYC5cblxuTG9va2luZyBhdCBgbW0vYWxsb2NfdGFnLmNgLCBJIHNlZSBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB0aGF0IGNhdWdodCBteSBhdHRlbnRpb24uIEl0IHdhcyBvcmlnaW5hbGx5IGBpZiAobWVtX2FsbG9jX3Byb2ZpbGluZ19lbmFibGVkKCkgXHUwMDI2XHUwMDI2ICF0YWdzX2FkZHJlc3NhYmxlKCkpYCwgYnV0IGhhcyBiZWVuIGNoYW5nZWQgdG8gYGlmICghdGFnc19hZGRyZXNzYWJsZSgpKWAuIEFuZCwgZ29pbmcgZnVydGhlciwgaXQgbG9va3MgbGlrZSBgbG9hZF9tb2R1bGVgIGluIGBtbS9hbGxvY190YWcuY2AgKmlzKiBzdGF0aWMhIEJ1dCB3YWl0LCBpcyBpdCBhY3R1YWxseSBhIGNhbGxiYWNrIGZvciBjb2RldGFnPyBHb2luZyB0aHJvdWdoIHRoZSBjb2RlLCBJIHNlZSB0aGlzOlxuXG5gYGBjXG5cdGlmICghbWVtX3Byb2ZpbGluZ19zdXBwb3J0KVxuXHRcdHJldHVybiAwO1xuYGBgXG5Pa2F5LCBzbyB0aGUgYGxvYWRfbW9kdWxlYCBmdW5jdGlvbiBzZWVtcyB0byBiZSBwYXJ0IG9mIHRoZSBjb2RldGFnIGltcGxlbWVudGF0aW9uLCBidXQgaXQgYWxzbyBoYXMgYSBgbWVtX3Byb2ZpbGluZ19zdXBwb3J0YCB2YXJpYWJsZS4gT2theSwgc28gSSBzaG91bGQgYmUgb2theS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY1MTEsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NTgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDI6MjMuODkwMjM4MjQ2WiIsIlNlcSI6MzQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkzOTIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2FsbG9jX3RhZy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDk3MCxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDk3MDpcXHRcXHRyZXR1cm4gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciArIG9mZnNldCk7XFxuIDk3MTpcXHR9XFxuIDk3MjpcXHRcXG4gOTczOlxcdHN0YXRpYyBpbnQgbG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgY29kZXRhZyAqc3RhcnQsIHN0cnVjdCBjb2RldGFnICpzdG9wKVxcbiA5NzQ6XFx0e1xcbiA5NzU6XFx0XFx0LyogQWxsb2NhdGUgbW9kdWxlIGFsbG9jX3RhZyBwZXJjcHUgY291bnRlcnMgKi9cXG4gOTc2OlxcdFxcdHN0cnVjdCBhbGxvY190YWcgKnN0YXJ0X3RhZztcXG4gOTc3OlxcdFxcdHN0cnVjdCBhbGxvY190YWcgKnN0b3BfdGFnO1xcbiA5Nzg6XFx0XFx0c3RydWN0IGFsbG9jX3RhZyAqdGFnO1xcbiA5Nzk6XFx0XFxuIDk4MDpcXHRcXHRpZiAoIW1lbV9wcm9maWxpbmdfc3VwcG9ydClcXG4gOTgxOlxcdFxcdFxcdHJldHVybiAwO1xcbiA5ODI6XFx0XFxuIDk4MzpcXHRcXHQvKiBwZXJjcHUgY291bnRlcnMgZm9yIGNvcmUgYWxsb2NhdGlvbnMgYXJlIGFscmVhZHkgc3RhdGljYWxseSBhbGxvY2F0ZWQgKi9cXG4gOTg0OlxcdFxcdGlmICghbW9kKVxcbiA5ODU6XFx0XFx0XFx0cmV0dXJuIDA7XFxuIDk4NjpcXHRcXG4gOTg3OlxcdFxcdHN0YXJ0X3RhZyA9IGN0X3RvX2FsbG9jX3RhZyhzdGFydCk7XFxuIDk4ODpcXHRcXHRzdG9wX3RhZyA9IGN0X3RvX2FsbG9jX3RhZyhzdG9wKTtcXG4gOTg5OlxcdFxcdGZvciAodGFnID0gc3RhcnRfdGFnOyB0YWcgXFx1MDAzYyBzdG9wX3RhZzsgdGFnKyspIHtcXG4gOTkwOlxcdFxcdFxcdFdBUk5fT04odGFnLVxcdTAwM2Vjb3VudGVycyk7XFxuIDk5MTpcXHRcXHRcXHR0YWctXFx1MDAzZWNvdW50ZXJzID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBhbGxvY190YWdfY291bnRlcnMpO1xcbiA5OTI6XFx0XFx0XFx0aWYgKCF0YWctXFx1MDAzZWNvdW50ZXJzKSB7XFxuIDk5MzpcXHRcXHRcXHRcXHR3aGlsZSAoLS10YWcgXFx1MDAzZT0gc3RhcnRfdGFnKSB7XFxuIDk5NDpcXHRcXHRcXHRcXHRcXHRmcmVlX3BlcmNwdSh0YWctXFx1MDAzZWNvdW50ZXJzKTtcXG4gOTk1OlxcdFxcdFxcdFxcdFxcdHRhZy1cXHUwMDNlY291bnRlcnMgPSBOVUxMO1xcbiA5OTY6XFx0XFx0XFx0XFx0fVxcbiA5OTc6XFx0XFx0XFx0XFx0cHJfZXJyKFxcXCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhbGxvY2F0aW9uIHRhZyBwZXJjcHUgY291bnRlcnMgaW4gdGhlIG1vZHVsZSAlc1xcXFxuXFxcIixcXG4gOTk4OlxcdFxcdFxcdFxcdCAgICAgICBtb2QtXFx1MDAzZW5hbWUpO1xcbiA5OTk6XFx0XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQyOjIzLjg5MDMzNDczNloiLCJTZXEiOjM1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0OTU4MDY0MTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBNb2R1bGUgTG9hZGluZyBhbmQgQWxsb2NhdGlvbiBUYWdnaW5nKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgYGxvYWRfbW9kdWxlYCB3aXRoaW4gYG1tL2FsbG9jX3RhZy5jYCwgYW5kIGl0J3MgZGVmaW5lZCBhcyBhIHN0YXRpYyBmdW5jdGlvbi4gVGhhdCBpbW1lZGlhdGVseSBtYWtlcyBtZSB0aGluayBhYm91dCBob3cgaXQncyBiZWluZyB1c2VkLiBUaGUgbmV4dCBsb2dpY2FsIHN0ZXAgaXMgdG8gY2hlY2sgaG93IGBhbGxvY190YWdfaW5pdGAgZml0cyBpbnRvIHRoaXMgcGljdHVyZS4gQWgsIHJpZ2h0LCBgYWxsb2NfdGFnX2luaXRgIHJlZ2lzdGVycyBgbG9hZF9tb2R1bGVgIGFzIGEgYC5sb2FkYCBjYWxsYmFjay4gTm93IGl0IGNsaWNrcyDigJMgYGNvZGV0YWdfbG9hZF9tb2R1bGVgIG11c3QgYmUgdGhlIGZ1bmN0aW9uIHRoYXQgKmNhbGxzKiB0aGlzIGAubG9hZGAgY2FsbGJhY2ssIHdoaWNoIGlzIGBsb2FkX21vZHVsZWAgaW4gb3VyIHNwZWNpZmljIGNhc2UuIFRvIGNvbmZpcm0gdGhhdCBjaGFpbiBvZiBjYWxscywgYW5kIGp1c3QgbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgZnVsbCBjb250ZXh0IGhlcmUsIEkgc2hvdWxkIGdvIGFuZCBleGFtaW5lIGBjb2RldGFnX2xvYWRfbW9kdWxlYCBpdHNlbGYuIEknbGwgZmluZCB0aGF0IGluIGBsaWIvY29kZXRhZy5jYC4gTGV0J3Mgc2VlIHdoYXQncyBoYXBwZW5pbmcgdGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4MDg2LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0MjoyOC44NDg0MDE5MTZaIiwiU2VxIjozNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQyOTU5MzA3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvZGV0YWdfbG9hZF9tb2R1bGVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibGliL2NvZGV0YWcuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJsaWIvY29kZXRhZy5jPTMyMj12b2lkIGNvZGV0YWdfbW9kdWxlX3JlcGxhY2VkKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IG1vZHVsZSAqbmV3X21vZClcXG4tLVxcbmxpYi9jb2RldGFnLmMtMzM3LVxcbmxpYi9jb2RldGFnLmM6MzM4OmludCBjb2RldGFnX2xvYWRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZClcXG5saWIvY29kZXRhZy5jLTMzOS17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQyOjI4Ljg5MTM2NTcwM1oiLCJTZXEiOjM3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3MDk0NDE3NjM5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIE1vZHVsZSBMb2FkaW5nIENoYW5nZXMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGVzZSBjaGFuZ2VzIGFuZCBpdCBzZWVtcyBsaWtlIHdlJ3JlIGFkZHJlc3Npbmcgc29tZSByZXRyaWVzIGFuZCBjb25kaXRpb25hbCBiZWhhdmlvciByZWxhdGVkIHRvIG1vZHVsZSBsb2FkaW5nIGFuZCBtZW1vcnkgYWxsb2NhdGlvbi4gRmlyc3QsIEkgbm90aWNlZCBgY29kZXRhZ19sb2FkX21vZHVsZWAgaXMgbm9uLXN0YXRpYywgd2hpY2ggaXMgaW50ZXJlc3RpbmcuIEknbGwgbmVlZCB0byByZW1lbWJlciB0aGF0LiBHaXZlbiB0aGF0IGl0J3Mgbm9uLXN0YXRpYywgSSBzaG91bGQgYWRkIGl0IHRvIHRoZSBgRm9jdXNTeW1ib2xzYCBsaXN0LlxuXG5Ob3csIGxldCdzIGJyZWFrIGRvd24gdGhlIGFjdHVhbCBjb2RlIG1vZGlmaWNhdGlvbnM6XG5cbjEuICBJbiBga2VybmVsL21vZHVsZS9tYWluLmNgLCB0aGUgYGxheW91dF9hbmRfYWxsb2NhdGVgIGZ1bmN0aW9uIGlzIGJlaW5nIHVwZGF0ZWQgdG8gcmV0cnkgaWYgYG1vdmVfbW9kdWxlYCByZXR1cm5zIGAtRUFHQUlOYC4gVGhpcyBzdWdnZXN0cyB3ZSdyZSBkZWFsaW5nIHdpdGggYSByZXNvdXJjZSBjb250ZW50aW9uIGlzc3VlIGR1cmluZyBtb2R1bGUgcmVsb2NhdGlvbiBvciBhbGxvY2F0aW9uLCBhbmQgYSByZXRyeSBtZWNoYW5pc20gaXMgYmVpbmcgcHV0IGluIHBsYWNlIHRvIGhhbmRsZSB0cmFuc2llbnQgZmFpbHVyZXMuIEl0IHNlZW1zIGxpa2UgYSBzZW5zaWJsZSBhZGRpdGlvbiB0byBpbXByb3ZlIHJvYnVzdG5lc3MuXG5cbjIuICBgbW0vYWxsb2NfdGFnLmNgIG5vdyBoYXMgYHJlc2VydmVfbW9kdWxlX3RhZ3NgIHJldHVybmluZyBgLUVBR0FJTmAgaWYgYCF0YWdzX2FkZHJlc3NhYmxlKClgLiBUaGlzIGltcGxpZXMgdGhhdCB0aGUgbWVtb3J5IHRhZ2dpbmcgZnVuY3Rpb25hbGl0eSBtaWdodCBub3QgYmUgYXZhaWxhYmxlIGluIHNvbWUgc2l0dWF0aW9ucywgYW5kIHRoZSBmdW5jdGlvbiBub3cgZXhwbGljaXRseSBzaWduYWxzIHRoaXMgY29uZGl0aW9uIGFzIGEgdGVtcG9yYXJ5IGZhaWx1cmUsIGFsbG93aW5nIGZvciByZXRyaWVzLlxuXG4zLiAgQWxzbyBpbiBgbW0vYWxsb2NfdGFnLmNgLCBgbG9hZF9tb2R1bGVgIG5vdyByZXR1cm5zIDAgaWYgYCFtZW1fcHJvZmlsaW5nX3N1cHBvcnRgLiBTbywgdGhlIG1vZHVsZSBsb2FkIHN1Y2NlZWRzICp3aXRob3V0KiBwcm9maWxpbmcgc3VwcG9ydD8gVGhpcyBzZWVtcyBsaWtlIGEgZ3JhY2VmdWwgZmFsbGJhY2ssIGluZGljYXRpbmcgdGhlIHN5c3RlbSBjYW4gY29udGludWUgb3BlcmF0aW5nLCBhbGJlaXQgd2l0aCByZWR1Y2VkIGZ1bmN0aW9uYWxpdHkuXG5cbjQuICBGaW5hbGx5LCBgcmVsZWFzZV9tb2R1bGVfdGFnc2AgaW4gYG1tL2FsbG9jX3RhZy5jYCBoYXMgYmVlbiBhZGp1c3RlZCB0byBoYW5kbGUgdGhlIGAhdXNlZGAgY2FzZS4gVGhpcyBpcyBhIGRlZmVuc2l2ZSBwcm9ncmFtbWluZyBtZWFzdXJlLCBhZGRyZXNzaW5nIHBvdGVudGlhbCBlZGdlIGNhc2VzIHdoZXJlIHRoZSBtb2R1bGUgdGFncyBtaWdodCBiZSByZWxlYXNlZCBwcmVtYXR1cmVseSBvciBpbiBhbiB1bmV4cGVjdGVkIHN0YXRlLiBUaGlzIHNob3dzIGNhcmVmdWwgYXR0ZW50aW9uIHRvIGRldGFpbC5cblxuVGhlIG92ZXJhbGwgY29udGV4dCBoZXJlIGlzIHRoYXQgdGhlc2UgY2hhbmdlcyBhcmUgZHJpdmVuIGJ5IHRoZSBgTUVNX0FMTE9DX1BST0ZJTElOR2AgY29uZmlnIG9wdGlvbi4gSSd2ZSBub3RlZCB0aGF0IGBGb2N1c1N5bWJvbHNgIHNob3VsZCBpbmNsdWRlIGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYCwgYGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNgLCBhbmQgYGNvZGV0YWdfbG9hZF9tb2R1bGVgLCBhcyBleHBlY3RlZC4gV2FpdC4uLiBgY29kZXRhZ191bmxvYWRfbW9kdWxlYCBpcyBpbiB0aGUgRm9jdXNTeW1ib2xzIGxpc3QgYXMgd2VsbD8gSSBiZXR0ZXIgZG91YmxlLWNoZWNrIHRoYXQgb25lIGZvciBhbnkgZnVydGhlciBpbXBsaWNhdGlvbnMgaW4gdGhlIGNvZGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4NDg2LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjM5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQyOjM1Ljk4NTc4NTg2MloiLCJTZXEiOjM4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjE2MjQzMzc3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvZGV0YWdfdW5sb2FkX21vZHVsZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJsaWIvY29kZXRhZy5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImxpYi9jb2RldGFnLmM9MzM4PWludCBjb2RldGFnX2xvYWRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZClcXG4tLVxcbmxpYi9jb2RldGFnLmMtMzU2LVxcbmxpYi9jb2RldGFnLmM6MzU3OnZvaWQgY29kZXRhZ191bmxvYWRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZClcXG5saWIvY29kZXRhZy5jLTM1OC17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQyOjM2LjYwMjA1Mzg0OVoiLCJTZXEiOjM5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo5NTU5MDIxNjQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTW9kdWxlIExvYWRpbmcgTG9naWMgYW5kIE1lbW9yeSBBbGxvY2F0aW9uIFByb2ZpbGluZyoqXG5cbk9rYXksIHNvIGBjb2RldGFnX3VubG9hZF9tb2R1bGVgIGlzIGRlZmluaXRlbHkgcHJlc2VudCwgdGhhdCdzIGEgZ29vZCBzdGFydGluZyBwb2ludC4gTm93LCBJIG5lZWQgdG8gY2hlY2sgdGhlIGRlcGVuZGVuY2llcyBmb3IgYE1FTV9BTExPQ19QUk9GSUxJTkdgIHRvIGVuc3VyZSBldmVyeXRoaW5nIGlzIGluIHBsYWNlLiBMb29raW5nIGF0IGBtbS9LY29uZmlnLmRlYnVnYCwgaXQgZGVwZW5kcyBvbiBgTU1VYCwgYFBST0NfRlNgLCBhbmQgYCFERUJVR19GT1JDRV9XRUFLX1BFUl9DUFVgLCBhbmQgc2VsZWN0cyBgQ09ERV9UQUdHSU5HYCwgYFBBR0VfRVhURU5TSU9OYCwgYW5kIGBTTEFCX09CSl9FWFRgLiBUaG9zZSBhbGwgc2VlbSByZWFzb25hYmxlOyBgTU1VYCBhbmQgYFBST0NfRlNgIGFyZSBwcmV0dHkgc3RhbmRhcmQsIGFuZCB0aGUgYCFERUJVR19GT1JDRV9XRUFLX1BFUl9DUFVgIGRlcGVuZGVuY3kgaXMgZmluZS4gU28sIGBNRU1fQUxMT0NfUFJPRklMSU5HYCBsb29rcyB0byBiZSBhIHNlbGYtY29udGFpbmVkIGZlYXR1cmUuXG5cbkxldCBtZSByZWNhcCBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBwYXRjaCdzIHB1cnBvc2UuIEl0J3MgaGFuZGxpbmcgYSBzcGVjaWZpYyBzaXR1YXRpb246IHdoZW4gbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIGV4aGF1c3RzIHRoZSBhdmFpbGFibGUgcGFnZSBmbGFnIGJpdHMgKGAhdGFnc19hZGRyZXNzYWJsZSgpYCkuIFRoZSBmaXggaW50cm9kdWNlcyBhIHJldHJ5IGluIGBsYXlvdXRfYW5kX2FsbG9jYXRlKClgLCB3aGljaCByZXNldHMgdGhlIG1vZHVsZSBzdGF0ZSBhbmQgcmV0cmllcyB0aGUgbW9kdWxlIGxvYWQgd2l0aG91dCBtZW1vcnkgcHJvZmlsaW5nLiBUaGlzIGNoYW5nZSBpcyBkaXJlY3RseSBhZmZlY3RpbmcgdGhlIGNvcmUgbW9kdWxlIGxvYWRpbmcgcGF0aCBhbmQgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHRhZ2dpbmcgc3lzdGVtLCB3aGljaCB1c2Vyc3BhY2UgaW50ZXJhY3RzIHdpdGggdmlhIGBpbml0X21vZHVsZWAgYW5kIGBmaW5pdF9tb2R1bGVgIHN5c2NhbGxzLiBUaGlzIG1ha2VzIHRoaXMgYW4gaW50ZXJlc3RpbmcgdGFyZ2V0IGZvciB0ZXN0aW5nLlxuXG5UaGUga2V5IHN5bWJvbHMgdG8gZm9jdXMgb24gYXJlIGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYCwgYGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNgLCBgY29kZXRhZ19sb2FkX21vZHVsZWAsIGFuZCwgb2YgY291cnNlLCBgY29kZXRhZ191bmxvYWRfbW9kdWxlYC4gVGhlIHByaW1hcnkgY29uZmlndXJhdGlvbiBJIG5lZWQgdG8gYmUgY29uY2VybmVkIHdpdGggaXMgYE1FTV9BTExPQ19QUk9GSUxJTkdgLiBgTU9EVUxFU2AgaXMgYW4gb2J2aW91cyBwcmVyZXF1aXNpdGUsIGJ1dCB0aGF0J3MgYSBiYXNlbGluZSByZXF1aXJlbWVudCBmb3IgYW55IG1vZHVsZSB3b3JrLlxuXG5JJ2xsIGRvdWJsZSBjaGVjayB0aGF0IGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYCBpc24ndCBzdGF0aWMuIEl0J3Mgbm90LCB3aGljaCBpcyBleGFjdGx5IHdoYXQgSSB3YXMgaG9waW5nIGZvci4gVGhhdCBtZWFucyBzeXprYWxsZXIgc2hvdWxkIGJlIGFibGUgdG8gZGlyZWN0bHkgdGFyZ2V0IGl0IGlmIGl0J3MgaW4gdGhlIGtlcm5lbCBpbWFnZS5cblxuRmluYWxseSwgSSBuZWVkIHRvIGVuc3VyZSB0aGF0IG5vIG90aGVyIG5vbi1zdGF0aWMgZnVuY3Rpb25zIHdlcmUgYWRkZWQgb3IgbW9kaWZpZWQuIEl0IHNlZW1zIHRoYXQgb25seSBzdGF0aWMgZnVuY3Rpb25zIGluIGBtbS9hbGxvY190YWcuY2AgYW5kIGBrZXJuZWwvbW9kdWxlL21haW4uY2Agd2VyZSBjaGFuZ2VkLCBidXQgdGhvc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgYnkgdGhlIGBjb2RldGFnXypgIGZ1bmN0aW9ucyBJIGlkZW50aWZpZWQsIHNvIHRoYXQgc2VlbXMgb2suXG5cbkkgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZm9ybXVsYXRlIHRoZSBzZXQtcmVzdWx0cyBjYWxsLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTMzNSwiT3V0cHV0VG9rZW5zIjoxNjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NzgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDI6NDYuMTYxMDc3OTQ0WiIsIlNlcSI6NDAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzM1OTI0NzUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTV9BTExPQ19QUk9GSUxJTkdcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uXCIsXG4gICAgXCJjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zXCIsXG4gICAgXCJjb2RldGFnX2xvYWRfbW9kdWxlXCIsXG4gICAgXCJjb2RldGFnX3VubG9hZF9tb2R1bGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgY29yZSBtb2R1bGUgbG9hZGluZyBsb2dpYyB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHJ1bnMgb3V0IG9mIHBhZ2UgZmxhZyBiaXRzICghdGFnc19hZGRyZXNzYWJsZSgpKS4gSXQgaW50cm9kdWNlcyBhIHJldHJ5IG1lY2hhbmlzbSBpbiBsYXlvdXRfYW5kX2FsbG9jYXRlKCkgdGhhdCByZXNldHMgdGhlIG1vZHVsZSBzdGF0ZSBhbmQgcmV0cmllcyBsb2FkaW5nIHdpdGhvdXQgbWVtb3J5IHByb2ZpbGluZy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIG1vZHVsZSBsb2FkaW5nIHBhdGggYW5kIG1lbW9yeSBhbGxvY2F0aW9uIHRhZ2dpbmcgc3Vic3lzdGVtLCB3aGljaCBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIGluaXRfbW9kdWxlIGFuZCBmaW5pdF9tb2R1bGUgc3lzY2FsbHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNX0FMTE9DX1BST0ZJTElOR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25cIixcbiAgICBcImNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNcIixcbiAgICBcImNvZGV0YWdfbG9hZF9tb2R1bGVcIixcbiAgICBcImNvZGV0YWdfdW5sb2FkX21vZHVsZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBjb3JlIG1vZHVsZSBsb2FkaW5nIGxvZ2ljIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgcnVucyBvdXQgb2YgcGFnZSBmbGFnIGJpdHMgKCF0YWdzX2FkZHJlc3NhYmxlKCkpLiBJdCBpbnRyb2R1Y2VzIGEgcmV0cnkgbWVjaGFuaXNtIGluIGxheW91dF9hbmRfYWxsb2NhdGUoKSB0aGF0IHJlc2V0cyB0aGUgbW9kdWxlIHN0YXRlIGFuZCByZXRyaWVzIGxvYWRpbmcgd2l0aG91dCBtZW1vcnkgcHJvZmlsaW5nLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgbW9kdWxlIGxvYWRpbmcgcGF0aCBhbmQgbWVtb3J5IGFsbG9jYXRpb24gdGFnZ2luZyBzdWJzeXN0ZW0sIHdoaWNoIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgaW5pdF9tb2R1bGUgYW5kIGZpbml0X21vZHVsZSBzeXNjYWxscy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDI6NDYuMjM0Njc3MDY5WiIsIlNlcSI6NDEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTA4NzQ5NDg0NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0Mjo0Ni4yMzUyMTUxMzlaIiwiU2VxIjo0MiwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MTUwODc0NDA3NTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgbW9kdWxlIGxvYWRpbmcgcHJvY2VzcyB0byBoYW5kbGUgY2FzZXMgd2hlcmUgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHRhZ3MgZXhjZWVkIGF2YWlsYWJsZSBwYWdlIGZsYWcgYml0cy4gSXQgaW50cm9kdWNlcyBhIHJldHJ5IG1lY2hhbmlzbSBpbiBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAgdGhhdCByZXNldHMgc2VjdGlvbiBoZWFkZXJzIGFuZCBzaXplcywgYW5kIHJldHJpZXMgdGhlIGFsbG9jYXRpb24gd2l0aG91dCBwcm9maWxpbmcuIFRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBtb2R1bGVzIGlzIGV4cGxpY2l0bHkgemVyb2VkIGJ5IGBtb2R1bGVfbWVtb3J5X2FsbG9jYCAodmlhIGBtZW1zZXQocHRyLCAwLCBzaXplKWApLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIGFueSBuZXcgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlcnNwYWNlLCBub3IgZG8gdGhleSBhZGQgY29tcGxleCBjb25kaXRpb25hbCBsb2dpYyBkZXBlbmRpbmcgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggKGUuZy4sIGluY29ycmVjdCBzaXplIGNhbGN1bGF0aW9ucywgbWVtb3J5IGxlYWtzLCBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIGR1cmluZyBzZWN0aW9uIGNvcHlpbmcpIHdvdWxkIGJlIHJlbGlhYmx5IGNhdWdodCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyB0b29scy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgbmVjZXNzaXRhdGUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDZmOWZmNWNlMzU0YzU0YjJmNmY3NWQ5MmZiNTZlMjdjY2E5N2ZkNzBcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEF1ZyAxMCAxMDozODoxNCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9tb2R1bGUvbWFpbi5jIGIva2VybmVsL21vZHVsZS9tYWluLmNcbmluZGV4IDQ2ZGQ4ZDI1YTYwNTguLmMzMmJiNDdhNTczYTEgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvbW9kdWxlL21haW4uY1xuKysrIGIva2VybmVsL21vZHVsZS9tYWluLmNcbkBAIC0yOTcxLDEzICsyOTcxLDI2IEBAIHN0YXRpYyBzdHJ1Y3QgbW9kdWxlICpsYXlvdXRfYW5kX2FsbG9jYXRlKHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGludCBmbGFncylcbiBcdCAqIHRoaXMgaXMgZG9uZSBnZW5lcmljYWxseTsgdGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYW55XG4gXHQgKiBzcGVjaWFsIGNhc2VzIGZvciB0aGUgYXJjaGl0ZWN0dXJlcy5cbiBcdCAqL1xuK3JldHJ5OlxuIFx0bGF5b3V0X3NlY3Rpb25zKGluZm8tXHUwMDNlbW9kLCBpbmZvKTtcbiBcdGxheW91dF9zeW10YWIoaW5mby1cdTAwM2Vtb2QsIGluZm8pO1xuIFxuIFx0LyogQWxsb2NhdGUgYW5kIG1vdmUgdG8gdGhlIGZpbmFsIHBsYWNlICovXG4gXHRlcnIgPSBtb3ZlX21vZHVsZShpbmZvLVx1MDAzZW1vZCwgaW5mbyk7XG4tXHRpZiAoZXJyKVxuLVx0XHRyZXR1cm4gRVJSX1BUUihlcnIpO1xuK1x0aWYgKGVycikge1xuK1x0XHRpZiAoZXJyICE9IC1FQUdBSU4pXG4rXHRcdFx0cmV0dXJuIEVSUl9QVFIoZXJyKTtcbitcdFx0LypcbitcdFx0ICogLUVBR0FJTiBtZWFucyBwcm9maWxpbmcgd2FzIGRpc2FibGVkIGJ1dCB0aGUgbW9kdWxlXG4rXHRcdCAqIGNhbiBzdGlsbCBsb2FkIHdpdGhvdXQgaXQuIFJlc2V0IHN0YXRlIGFuZCByZXRyeS5cbitcdFx0ICovXG4rXHRcdHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzKGluZm8sIGZsYWdzKTtcbitcdFx0Zm9yX2VhY2hfbW9kX21lbV90eXBlKHR5cGUpXG4rXHRcdFx0aW5mby1cdTAwM2Vtb2QtXHUwMDNlbWVtW3R5cGVdLnNpemUgPSAwO1xuK1x0XHRpbmZvLVx1MDAzZXNlY2hkcnNbaW5mby1cdTAwM2VpbmRleC5zeW1dLnNoX2ZsYWdzIFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcbitcdFx0aW5mby1cdTAwM2VzZWNoZHJzW2luZm8tXHUwMDNlaW5kZXguc3RyXS5zaF9mbGFncyBcdTAwMjY9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7XG4rXHRcdGdvdG8gcmV0cnk7XG4rXHR9XG4gXG4gXHQvKiBNb2R1bGUgaGFzIGJlZW4gY29waWVkIHRvIGl0cyBmaW5hbCBwbGFjZSBub3c6IHJldHVybiBpdC4gKi9cbiBcdG1vZCA9ICh2b2lkICopaW5mby1cdTAwM2VzZWNoZHJzW2luZm8tXHUwMDNlaW5kZXgubW9kXS5zaF9hZGRyO1xuZGlmZiAtLWdpdCBhL21tL2FsbG9jX3RhZy5jIGIvbW0vYWxsb2NfdGFnLmNcbmluZGV4IDUyYWVjZTI3YjAwZTAuLjNlYmE2MzMxMTc0ZGEgMTAwNjQ0XG4tLS0gYS9tbS9hbGxvY190YWcuY1xuKysrIGIvbW0vYWxsb2NfdGFnLmNcbkBAIC04MzUsNiArODM1LDUyIEBAIHN0YXRpYyBpbnQgdm1fbW9kdWxlX3RhZ3NfcG9wdWxhdGUodm9pZClcbiBcdHJldHVybiAwO1xuIH1cbiBcbitzdGF0aWMgdm9pZCByZWxlYXNlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgYm9vbCB1c2VkKVxuK3tcbitcdE1BX1NUQVRFKG1hcywgXHUwMDI2bW9kX2FyZWFfbXQsIG1vZHVsZV90YWdzLnNpemUsIG1vZHVsZV90YWdzLnNpemUpO1xuK1x0c3RydWN0IGFsbG9jX3RhZyAqc3RhcnRfdGFnO1xuK1x0c3RydWN0IGFsbG9jX3RhZyAqZW5kX3RhZztcbitcdHN0cnVjdCBtb2R1bGUgKnZhbDtcbitcbitcdG1hc19sb2NrKFx1MDAyNm1hcyk7XG4rXHRtYXNfZm9yX2VhY2hfcmV2KFx1MDAyNm1hcywgdmFsLCAwKVxuK1x0XHRpZiAodmFsID09IG1vZClcbitcdFx0XHRicmVhaztcbitcbitcdGlmICghdmFsKSAvKiBtb2R1bGUgbm90IGZvdW5kICovXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKCF1c2VkKVxuK1x0XHRnb3RvIHJlbGVhc2VfYXJlYTtcbitcbitcdHN0YXJ0X3RhZyA9IChzdHJ1Y3QgYWxsb2NfdGFnICopKG1vZHVsZV90YWdzLnN0YXJ0X2FkZHIgKyBtYXMuaW5kZXgpO1xuK1x0ZW5kX3RhZyA9IChzdHJ1Y3QgYWxsb2NfdGFnICopKG1vZHVsZV90YWdzLnN0YXJ0X2FkZHIgKyBtYXMubGFzdCk7XG4rXHRpZiAoIWNsZWFuX3VudXNlZF9jb3VudGVycyhzdGFydF90YWcsIGVuZF90YWcpKSB7XG4rXHRcdHN0cnVjdCBhbGxvY190YWcgKnRhZztcbitcbitcdFx0Zm9yICh0YWcgPSBzdGFydF90YWc7IHRhZyBcdTAwM2M9IGVuZF90YWc7IHRhZysrKSB7XG4rXHRcdFx0c3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyBjb3VudGVyO1xuK1xuK1x0XHRcdGlmICghdGFnLVx1MDAzZWNvdW50ZXJzKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXG4rXHRcdFx0Y291bnRlciA9IGFsbG9jX3RhZ19yZWFkKHRhZyk7XG4rXHRcdFx0cHJfaW5mbyhcIiVzOiV1IG1vZHVsZSAlcyBmdW5jOiVzIGhhcyAlbGx1IGFsbG9jYXRlZCBhdCBtb2R1bGUgdW5sb2FkXFxuXCIsXG4rXHRcdFx0XHR0YWctXHUwMDNlY3QuZmlsZW5hbWUsIHRhZy1cdTAwM2VjdC5saW5lbm8sIHRhZy1cdTAwM2VjdC5tb2RuYW1lLFxuK1x0XHRcdFx0dGFnLVx1MDAzZWN0LmZ1bmN0aW9uLCBjb3VudGVyLmJ5dGVzKTtcbitcdFx0fVxuK1x0fSBlbHNlIHtcbitcdFx0dXNlZCA9IGZhbHNlO1xuK1x0fVxuK3JlbGVhc2VfYXJlYTpcbitcdG1hc19zdG9yZShcdTAwMjZtYXMsIHVzZWQgPyBcdTAwMjZ1bmxvYWRlZF9tb2QgOiBOVUxMKTtcbitcdHZhbCA9IG1hc19wcmV2X3JhbmdlKFx1MDAyNm1hcywgMCk7XG4rXHRpZiAodmFsID09IFx1MDAyNnByZXBlbmRfbW9kKVxuK1x0XHRtYXNfc3RvcmUoXHUwMDI2bWFzLCBOVUxMKTtcbitvdXQ6XG4rXHRtYXNfdW5sb2NrKFx1MDAyNm1hcyk7XG4rfVxuK1xuIHN0YXRpYyB2b2lkICpyZXNlcnZlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWduZWQgbG9uZyBzaXplLFxuIFx0XHRcdFx0IHVuc2lnbmVkIGludCBwcmVwZW5kLCB1bnNpZ25lZCBsb25nIGFsaWduKVxuIHtcbkBAIC05MDQsMTAgKzk1MCwxMiBAQCBzdGF0aWMgdm9pZCAqcmVzZXJ2ZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbiBcdFx0aW50IGdyb3dfcmVzO1xuIFxuIFx0XHRtb2R1bGVfdGFncy5zaXplID0gb2Zmc2V0ICsgc2l6ZTtcbi1cdFx0aWYgKG1lbV9hbGxvY19wcm9maWxpbmdfZW5hYmxlZCgpIFx1MDAyNlx1MDAyNiAhdGFnc19hZGRyZXNzYWJsZSgpKSB7XG4rXHRcdGlmICghdGFnc19hZGRyZXNzYWJsZSgpKSB7XG4gXHRcdFx0c2h1dGRvd25fbWVtX3Byb2ZpbGluZyh0cnVlKTtcbi1cdFx0XHRwcl93YXJuKFwiV2l0aCBtb2R1bGUgJXMgdGhlcmUgYXJlIHRvbyBtYW55IHRhZ3MgdG8gZml0IGluICVkIHBhZ2UgZmxhZyBiaXRzLiBNZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgaXMgZGlzYWJsZWQhXFxuXCIsXG4tXHRcdFx0XHRtb2QtXHUwMDNlbmFtZSwgTlJfVU5VU0VEX1BBR0VGTEFHX0JJVFMpO1xuK1x0XHRcdHByX3dhcm5fb25jZShcIldpdGggbW9kdWxlICVzIHRoZXJlIGFyZSB0b28gbWFueSB0YWdzIHRvIGZpdCBpbiAlZCBwYWdlIGZsYWcgYml0cy4gTWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIGlzIGRpc2FibGVkIVxcblwiLFxuK1x0XHRcdFx0ICAgICBtb2QtXHUwMDNlbmFtZSwgTlJfVU5VU0VEX1BBR0VGTEFHX0JJVFMpO1xuK1x0XHRcdHJlbGVhc2VfbW9kdWxlX3RhZ3MobW9kLCBmYWxzZSk7XG4rXHRcdFx0cmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7XG4gXHRcdH1cbiBcbiBcdFx0Z3Jvd19yZXMgPSB2bV9tb2R1bGVfdGFnc19wb3B1bGF0ZSgpO1xuQEAgLTkyMiw1MiArOTcwLDYgQEAgc3RhdGljIHZvaWQgKnJlc2VydmVfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBsb25nIHNpemUsXG4gXHRyZXR1cm4gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciArIG9mZnNldCk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIHJlbGVhc2VfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCBib29sIHVzZWQpXG4te1xuLVx0TUFfU1RBVEUobWFzLCBcdTAwMjZtb2RfYXJlYV9tdCwgbW9kdWxlX3RhZ3Muc2l6ZSwgbW9kdWxlX3RhZ3Muc2l6ZSk7XG4tXHRzdHJ1Y3QgYWxsb2NfdGFnICpzdGFydF90YWc7XG4tXHRzdHJ1Y3QgYWxsb2NfdGFnICplbmRfdGFnO1xuLVx0c3RydWN0IG1vZHVsZSAqdmFsO1xuLVxuLVx0bWFzX2xvY2soXHUwMDI2bWFzKTtcbi1cdG1hc19mb3JfZWFjaF9yZXYoXHUwMDI2bWFzLCB2YWwsIDApXG4tXHRcdGlmICh2YWwgPT0gbW9kKVxuLVx0XHRcdGJyZWFrO1xuLVxuLVx0aWYgKCF2YWwpIC8qIG1vZHVsZSBub3QgZm91bmQgKi9cbi1cdFx0Z290byBvdXQ7XG4tXG4tXHRpZiAoIXVzZWQpXG4tXHRcdGdvdG8gcmVsZWFzZV9hcmVhO1xuLVxuLVx0c3RhcnRfdGFnID0gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciArIG1hcy5pbmRleCk7XG4tXHRlbmRfdGFnID0gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciArIG1hcy5sYXN0KTtcbi1cdGlmICghY2xlYW5fdW51c2VkX2NvdW50ZXJzKHN0YXJ0X3RhZywgZW5kX3RhZykpIHtcbi1cdFx0c3RydWN0IGFsbG9jX3RhZyAqdGFnO1xuLVxuLVx0XHRmb3IgKHRhZyA9IHN0YXJ0X3RhZzsgdGFnIFx1MDAzYz0gZW5kX3RhZzsgdGFnKyspIHtcbi1cdFx0XHRzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzIGNvdW50ZXI7XG4tXG4tXHRcdFx0aWYgKCF0YWctXHUwMDNlY291bnRlcnMpXG4tXHRcdFx0XHRjb250aW51ZTtcbi1cbi1cdFx0XHRjb3VudGVyID0gYWxsb2NfdGFnX3JlYWQodGFnKTtcbi1cdFx0XHRwcl9pbmZvKFwiJXM6JXUgbW9kdWxlICVzIGZ1bmM6JXMgaGFzICVsbHUgYWxsb2NhdGVkIGF0IG1vZHVsZSB1bmxvYWRcXG5cIixcbi1cdFx0XHRcdHRhZy1cdTAwM2VjdC5maWxlbmFtZSwgdGFnLVx1MDAzZWN0LmxpbmVubywgdGFnLVx1MDAzZWN0Lm1vZG5hbWUsXG4tXHRcdFx0XHR0YWctXHUwMDNlY3QuZnVuY3Rpb24sIGNvdW50ZXIuYnl0ZXMpO1xuLVx0XHR9XG4tXHR9IGVsc2Uge1xuLVx0XHR1c2VkID0gZmFsc2U7XG4tXHR9XG4tcmVsZWFzZV9hcmVhOlxuLVx0bWFzX3N0b3JlKFx1MDAyNm1hcywgdXNlZCA/IFx1MDAyNnVubG9hZGVkX21vZCA6IE5VTEwpO1xuLVx0dmFsID0gbWFzX3ByZXZfcmFuZ2UoXHUwMDI2bWFzLCAwKTtcbi1cdGlmICh2YWwgPT0gXHUwMDI2cHJlcGVuZF9tb2QpXG4tXHRcdG1hc19zdG9yZShcdTAwMjZtYXMsIE5VTEwpO1xuLW91dDpcbi1cdG1hc191bmxvY2soXHUwMDI2bWFzKTtcbi19XG4tXG4gc3RhdGljIGludCBsb2FkX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBjb2RldGFnICpzdGFydCwgc3RydWN0IGNvZGV0YWcgKnN0b3ApXG4ge1xuIFx0LyogQWxsb2NhdGUgbW9kdWxlIGFsbG9jX3RhZyBwZXJjcHUgY291bnRlcnMgKi9cbkBAIC05NzUsNiArOTc3LDkgQEAgc3RhdGljIGludCBsb2FkX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBjb2RldGFnICpzdGFydCwgc3RydWN0IGNvZGV0YWdcbiBcdHN0cnVjdCBhbGxvY190YWcgKnN0b3BfdGFnO1xuIFx0c3RydWN0IGFsbG9jX3RhZyAqdGFnO1xuIFxuK1x0aWYgKCFtZW1fcHJvZmlsaW5nX3N1cHBvcnQpXG4rXHRcdHJldHVybiAwO1xuK1xuIFx0LyogcGVyY3B1IGNvdW50ZXJzIGZvciBjb3JlIGFsbG9jYXRpb25zIGFyZSBhbHJlYWR5IHN0YXRpY2FsbHkgYWxsb2NhdGVkICovXG4gXHRpZiAoIW1vZClcbiBcdFx0cmV0dXJuIDA7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0Mjo0Ni4yMzUyMTYyMTlaIiwiU2VxIjo0MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODQ1NjM5OTg3MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBLZXJuZWwgTW9kdWxlIFBhdGNoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCB0aGF0IHR3ZWFrcyBob3cga2VybmVsIG1vZHVsZXMgYXJlIGxvYWRlZC4gSXQncyB0b3VjaGluZyBga2VybmVsL21vZHVsZS9tYWluLmNgIGFuZCBgbW0vYWxsb2NfdGFnLmNgLCB3aGljaCBpbW1lZGlhdGVseSBmbGFncyBteSBhdHRlbnRpb24uIFNwZWNpZmljYWxseSwgdGhlIHJldHJ5IGxvb3AgYWRkZWQgaW4gYGxheW91dF9hbmRfYWxsb2NhdGVgIHdpdGhpbiBga2VybmVsL21vZHVsZS9tYWluLmNgIGlzIHRoZSBrZXkgcG9pbnQuIElmIGBtb3ZlX21vZHVsZWAgcmV0dXJucyBgLUVBR0FJTmAsIGl0J3MgcmVzZXR0aW5nIHNvbWUgbW9kdWxlIHN0YXRlIGFuZCB0cnlpbmcgYWdhaW4uIFRoaXMgc2NyZWFtcyBcInBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UsXCIgYW5kIEknbSBrZWVuIHRvIGludmVzdGlnYXRlIHRoYXQuXG5cbkluIGBtbS9hbGxvY190YWcuY2AsIHRoZXkndmUgbW92ZWQgYHJlbGVhc2VfbW9kdWxlX3RhZ3NgIGFuZCBjaGFuZ2VkIGByZXNlcnZlX21vZHVsZV90YWdzYCB0byByZXR1cm4gYEVSUl9QVFIoLUVBR0FJTilgIGlmIGAhdGFnc19hZGRyZXNzYWJsZSgpYC4gVGhleSd2ZSBhbHNvIGFkZGVkIGEgY2hlY2sgZm9yIGAhbWVtX3Byb2ZpbGluZ19zdXBwb3J0YCBpbiBgbG9hZF9tb2R1bGVgLiBUaGVzZSBjaGFuZ2VzIGFyZSBpbnRlcmVzdGluZyBidXQgdGhlIHJldHJ5IGxvb3AgaXMgbXkgcHJpbWFyeSBjb25jZXJuLlxuXG5MZXQncyBkaXZlIGludG8gdGhhdCByZXRyeSBsb29wIGluIGBsYXlvdXRfYW5kX2FsbG9jYXRlYDpcblxuYGBgY1xucmV0cnk6XG5cdGxheW91dF9zZWN0aW9ucyhpbmZvLVx1MDAzZW1vZCwgaW5mbyk7XG5cdGxheW91dF9zeW10YWIoaW5mby1cdTAwM2Vtb2QsIGluZm8pO1xuXG5cdC8qIEFsbG9jYXRlIGFuZCBtb3ZlIHRvIHRoZSBmaW5hbCBwbGFjZSAqL1xuXHRlcnIgPSBtb3ZlX21vZHVsZShpbmZvLVx1MDAzZW1vZCwgaW5mbyk7XG5cdGlmIChlcnIpIHtcblx0XHRpZiAoZXJyICE9IC1FQUdBSU4pXG5cdFx0XHRyZXR1cm4gRVJSX1BUUihlcnIpO1xuXHRcdC8qXG5cdFx0ICogLUVBR0FJTiBtZWFucyBwcm9maWxpbmcgd2FzIGRpc2FibGVkIGJ1dCB0aGUgbW9kdWxlXG5cdFx0ICogY2FuIHN0aWxsIGxvYWQgd2l0aG91dCBpdC4gUmVzZXQgc3RhdGUgYW5kIHJldHJ5LlxuXHRcdCAqL1xuXHRcdHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzKGluZm8sIGZsYWdzKTtcblx0XHRmb3JfZWFjaF9tb2RfbWVtX3R5cGUodHlwZSlcblx0XHRcdGluZm8tXHUwMDNlbW9kLVx1MDAzZW1lbVt0eXBlXS5zaXplID0gMDtcblx0XHRpbmZvLVx1MDAzZXNlY2hkcnNbaW5mby1cdTAwM2VpbmRleC5zeW1dLnNoX2ZsYWdzIFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcblx0XHRpbmZvLVx1MDAzZXNlY2hkcnNbaW5mby1cdTAwM2VpbmRleC5zdHJdLnNoX2ZsYWdzIFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcblx0XHRnb3RvIHJldHJ5O1xuXHR9XG5gYGBcblxuVGhlIHdvcnJ5IGlzIHRoaXM6IGBsYXlvdXRfc2VjdGlvbnNgIGFuZCBgbGF5b3V0X3N5bXRhYmAgY2FsY3VsYXRlIHNpemVzIGFuZCBvZmZzZXRzLiBJZiBgbW92ZV9tb2R1bGVgIGZhaWxzIHdpdGggYC1FQUdBSU5gLCB0aGUgY29kZSB6ZXJvcyBvdXQgdGhlIHNpemVzLCBjbGVhcnMgdGhlIGBTSEZfQUxMT0NgIGZsYWcgZnJvbSBzeW1ib2wgYW5kIHN0cmluZyB0YWJsZXMsIGFuZCB0aGVuIHJldHJpZXMuIEJ1dCwgdGhlIGNhbGwgdG8gYHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzYCBpcyB3aGF0IEkgcmVhbGx5IG5lZWQgdG8gZXhhbWluZS4gVGhlIHNpemVzIGFuZCBzaF9mbGFncyBtaWdodCBoYXZlIGJlZW4gY2xlYXJlZCwgYnV0IGRvZXMgYHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzYCBoYXZlIGFueSB1bmluaXRpYWxpemVkIHJlYWRzLCBnaXZlbiB0aGUgcmVzZXQgc3RhdGU/IFRoYXQncyB0aGUgY3JpdGljYWwgcXVlc3Rpb24gaGVyZS4gSSdtIGdvaW5nIHRvIGxldmVyYWdlIGBkZWZhdWx0X2FwaTpncmVwcGVyYCB0byBpbnNwZWN0IGByZXdyaXRlX3NlY3Rpb25faGVhZGVyc2AgaW1tZWRpYXRlbHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM3NzEsIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MDYsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0Mjo1NC42OTE2MjAxNTJaIiwiU2VxIjo0NCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU5OTkyNDg1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInJld3JpdGVfc2VjdGlvbl9oZWFkZXJzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9tb2R1bGUvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9tb2R1bGUvbWFpbi5jPTExMzg9c3RhdGljIGNoYXIgKmdldF9uZXh0X21vZGluZm8oY29uc3Qgc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqdGFnLFxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMTE0Ni1cXHQvKlxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjExNDc6XFx0ICogZ2V0X21vZGluZm8oKSBjYWxscyBtYWRlIGJlZm9yZSByZXdyaXRlX3NlY3Rpb25faGVhZGVycygpXFxua2VybmVsL21vZHVsZS9tYWluLmMtMTE0OC1cXHQgKiBtdXN0IHVzZSBzaF9vZmZzZXQsIGFzIHNoX2FkZHIgaXNuJ3Qgc2V0IVxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmM9MjUyMz1zdGF0aWMgdm9pZCBmcmVlX2NvcHkoc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgaW50IGZsYWdzKVxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMjUzMC1cXG5rZXJuZWwvbW9kdWxlL21haW4uYzoyNTMxOnN0YXRpYyBpbnQgcmV3cml0ZV9zZWN0aW9uX2hlYWRlcnMoc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgaW50IGZsYWdzKVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI1MzIte1xcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmM9Mjk0Mz1zdGF0aWMgc3RydWN0IG1vZHVsZSAqbGF5b3V0X2FuZF9hbGxvY2F0ZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTg2LVxcdFxcdCAqL1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI5ODc6XFx0XFx0cmV3cml0ZV9zZWN0aW9uX2hlYWRlcnMoaW5mbywgZmxhZ3MpO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5ODgtXFx0XFx0Zm9yX2VhY2hfbW9kX21lbV90eXBlKHR5cGUpXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0zMzk5PXN0YXRpYyBpbnQgZWFybHlfbW9kX2NoZWNrKHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGludCBmbGFncylcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM0MTEtXFxua2VybmVsL21vZHVsZS9tYWluLmM6MzQxMjpcXHRlcnIgPSByZXdyaXRlX3NlY3Rpb25faGVhZGVycyhpbmZvLCBmbGFncyk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMzQxMy1cXHRpZiAoZXJyKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0Mjo1NC43NTE2MTU5OThaIiwiU2VxIjo0NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTAwNzM2MTAwNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gcmVhZGluZyB0aGUgY29kZTpcblxuKipEaXZpbmcgaW50byBgcmV3cml0ZV9zZWN0aW9uX2hlYWRlcnNgKipcblxuT2theSwgbGV0J3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MgYW5kIHRha2UgYSBsb29rIGF0IGByZXdyaXRlX3NlY3Rpb25faGVhZGVyc2AgaW4gYGtlcm5lbC9tb2R1bGUvbWFpbi5jYC4gVGhpcyBmdW5jdGlvbiBpcyBjcml0aWNhbDsgaXQncyB0aGUgb25lIHJlc3BvbnNpYmxlIGZvci4uLiB3ZWxsLCByZXdyaXRpbmcgdGhlIHNlY3Rpb24gaGVhZGVycywgb2J2aW91c2x5LCBidXQgdGhlIHdoeSBpcyB0aGUgcXVlc3Rpb24uIEkga25vdyB0aGUgY29yZSBvZiBtb2R1bGUgbG9hZGluZyBpbnZvbHZlcyBtYW5pcHVsYXRpbmcgdGhlIEVMRiBoZWFkZXJzIHRvIG1ha2UgdGhlIG1vZHVsZSBmaXQgaW50byB0aGUga2VybmVsJ3MgbWVtb3J5IHNwYWNlIGFuZCBlbnN1cmUgcHJvcGVyIHJlbG9jYXRpb24uIEknbSBleHBlY3RpbmcgdGhpcyBmdW5jdGlvbiBkZWFscyB3aXRoIG1vZGlmeWluZyB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUgdG8gcmVmbGVjdCB0aG9zZSBhZGp1c3RtZW50cy4gTXkgYXNzdW1wdGlvbiBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCBlaXRoZXIgYmUgaW52b2x2ZWQgaW46IFxuMS4gICoqQWRqdXN0aW5nIEFkZHJlc3NlczoqKiBNb2RpZnlpbmcgdGhlIGBzaF9hZGRyYCBmaWVsZHMgb2YgdGhlIHNlY3Rpb24gaGVhZGVycyB0byByZWZsZWN0IHRoZWlyIHZpcnR1YWwgYWRkcmVzc2VzIGluIGtlcm5lbCBzcGFjZSBhZnRlciBsb2FkaW5nLiBJdCBtaWdodCBuZWVkIHRvIGFjY291bnQgZm9yIGFueSBiYXNlIGFkZHJlc3Mgb3Igb2Zmc2V0IGFwcGxpZWQgZHVyaW5nIG1vZHVsZSBsb2FkaW5nLlxuMi4gICoqUmVsb2NhdGluZyBTZWN0aW9uczoqKiBUaGUgZnVuY3Rpb24gbWlnaHQgaGFuZGxlIHRhc2tzIGxpa2UgY29tYmluaW5nLCBzcGxpdHRpbmcsIG9yIHJlb3JkZXJpbmcgb2Ygc2VjdGlvbnMgYXMgcGFydCBvZiBtZW1vcnkgbWFuYWdlbWVudCBvciB0byBzdXBwb3J0IGZlYXR1cmVzIGxpa2UgcGVyLUNQVSBkYXRhIG9yIHJlYWQtb25seS9yZWFkLXdyaXRlIGRpc3RpbmN0aW9uLlxuMy4gICoqQWRqdXN0aW5nIFNpemVzOioqIEl0J3MgYWxzbyBwb3NzaWJsZSB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhpbmdzIGxpa2UgYWRqdXN0aW5nIHRoZSBzZWN0aW9uIHNpemVzIGFmdGVyIHJlbG9jYXRpb24gb3IgbW9kaWZ5aW5nIHRoZSBzZWN0aW9uIGhlYWRlciBmbGFncyB0byByZWZsZWN0IG5ldyBwZXJtaXNzaW9ucy5cbjQuICAqKkhhbmRsaW5nIFNwZWNpYWwgU2VjdGlvbnM6KiogSXQgY291bGQgYmUgYSBwYXJ0IG9mIG1hbmFnaW5nIHNwZWNpYWwgc2VjdGlvbnMgbGlrZSBgLmluaXRgIG9yIGAuZXhpdGAuXG41LiAgKipEZWFsaW5nIHdpdGggRGVwZW5kZW5jaWVzOioqIEZpbmFsbHksIGl0IGlzIHBvc3NpYmxlIHRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGFkanVzdGluZyBzZWN0aW9uIGhlYWRlcnMgcmVsYXRlZCB0byBpbXBvcnRlZCBzeW1ib2xzIG9yIGRlcGVuZGVuY2llcy5cblxuSSdtIGtlZW4gdG8gc2VlIGlmIG15IGFzc3VtcHRpb25zIGhvbGQgdHJ1ZSBhbmQgdG8gb2JzZXJ2ZSB0aGUgbnVhbmNlcyBvZiB0aGlzIHNwZWNpZmljIGltcGxlbWVudGF0aW9uLiBJJ20gZXhwZWN0aW5nIHRvIHNlZSBkZXRhaWxzIG9uIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgc3ltYm9sIHRhYmxlcywgcmVsb2NhdGlvbiBlbnRyaWVzLCBhbmQgdGhlIG92ZXJhbGwgc3RydWN0dXJlIG9mIHRoZSBtb2R1bGUgd2l0aGluIHRoZSBrZXJuZWwncyBtZW1vcnkgc3BhY2UuIFRpbWUgdG8gZGVsdmUgaW4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjUzMzIsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0Mjo1OS43NTg5NzkzNTRaIiwiU2VxIjo0NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjIzNjgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9tb2R1bGUvbWFpbi5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDI1MzEsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjI1MzE6XFx0c3RhdGljIGludCByZXdyaXRlX3NlY3Rpb25faGVhZGVycyhzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpXFxuMjUzMjpcXHR7XFxuMjUzMzpcXHRcXHR1bnNpZ25lZCBpbnQgaTtcXG4yNTM0OlxcdFxcbjI1MzU6XFx0XFx0LyogVGhpcyBzaG91bGQgYWx3YXlzIGJlIHRydWUsIGJ1dCBsZXQncyBiZSBzdXJlLiAqL1xcbjI1MzY6XFx0XFx0aW5mby1cXHUwMDNlc2VjaGRyc1swXS5zaF9hZGRyID0gMDtcXG4yNTM3OlxcdFxcbjI1Mzg6XFx0XFx0Zm9yIChpID0gMTsgaSBcXHUwMDNjIGluZm8tXFx1MDAzZWhkci1cXHUwMDNlZV9zaG51bTsgaSsrKSB7XFxuMjUzOTpcXHRcXHRcXHRFbGZfU2hkciAqc2hkciA9IFxcdTAwMjZpbmZvLVxcdTAwM2VzZWNoZHJzW2ldO1xcbjI1NDA6XFx0XFxuMjU0MTpcXHRcXHRcXHQvKlxcbjI1NDI6XFx0XFx0XFx0ICogTWFyayBhbGwgc2VjdGlvbnMgc2hfYWRkciB3aXRoIHRoZWlyIGFkZHJlc3MgaW4gdGhlXFxuMjU0MzpcXHRcXHRcXHQgKiB0ZW1wb3JhcnkgaW1hZ2UuXFxuMjU0NDpcXHRcXHRcXHQgKi9cXG4yNTQ1OlxcdFxcdFxcdHNoZHItXFx1MDAzZXNoX2FkZHIgPSAoc2l6ZV90KWluZm8tXFx1MDAzZWhkciArIHNoZHItXFx1MDAzZXNoX29mZnNldDtcXG4yNTQ2OlxcdFxcbjI1NDc6XFx0XFx0fVxcbjI1NDg6XFx0XFxuMjU0OTpcXHRcXHQvKiBUcmFjayBidXQgZG9uJ3Qga2VlcCBtb2RpbmZvIGFuZCB2ZXJzaW9uIHNlY3Rpb25zLiAqL1xcbjI1NTA6XFx0XFx0aW5mby1cXHUwMDNlc2VjaGRyc1tpbmZvLVxcdTAwM2VpbmRleC52ZXJzXS5zaF9mbGFncyBcXHUwMDI2PSB+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DO1xcbjI1NTE6XFx0XFx0aW5mby1cXHUwMDNlc2VjaGRyc1tpbmZvLVxcdTAwM2VpbmRleC52ZXJzX2V4dF9jcmNdLnNoX2ZsYWdzIFxcdTAwMjY9XFxuMjU1MjpcXHRcXHRcXHR+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DO1xcbjI1NTM6XFx0XFx0aW5mby1cXHUwMDNlc2VjaGRyc1tpbmZvLVxcdTAwM2VpbmRleC52ZXJzX2V4dF9uYW1lXS5zaF9mbGFncyBcXHUwMDI2PVxcbjI1NTQ6XFx0XFx0XFx0fih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcXG4yNTU1OlxcdFxcdGluZm8tXFx1MDAzZXNlY2hkcnNbaW5mby1cXHUwMDNlaW5kZXguaW5mb10uc2hfZmxhZ3MgXFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcXG4yNTU2OlxcdFxcbjI1NTc6XFx0XFx0cmV0dXJuIDA7XFxuMjU1ODpcXHR9XFxuMjU1OTpcXHRcXG4yNTYwOlxcdHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtb2R1bGVfbGljZW5zZV9vZmZlbmRlcnNbXSA9IHtcXG4yNTYxOlxcdFxcdC8qIGRyaXZlcmxvYWRlciB3YXMgY2F1Z2h0IHdyb25nbHkgcHJldGVuZGluZyB0byBiZSB1bmRlciBHUEwgKi9cXG4yNTYyOlxcdFxcdFxcXCJkcml2ZXJsb2FkZXJcXFwiLFxcbjI1NjM6XFx0XFxuMjU2NDpcXHRcXHQvKiBsdmUgY2xhaW1zIHRvIGJlIEdQTCBidXQgdXBzdHJlYW0gd29uJ3QgcHJvdmlkZSBzb3VyY2UgKi9cXG4yNTY1OlxcdFxcdFxcXCJsdmVcXFwiLFxcbjI1NjY6XFx0fTtcXG4yNTY3OlxcdFxcbjI1Njg6XFx0LypcXG4yNTY5OlxcdCAqIFRoZXNlIGNhbGxzIHRhaW50IHRoZSBrZXJuZWwgZGVwZW5kaW5nIGNlcnRhaW4gbW9kdWxlIGNpcmN1bXN0YW5jZXMgKi9cXG4yNTcwOlxcdHN0YXRpYyB2b2lkIG1vZHVsZV9hdWdtZW50X2tlcm5lbF90YWludHMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxcbjI1NzE6XFx0e1xcbjI1NzI6XFx0XFx0aW50IHByZXZfdGFpbnQgPSB0ZXN0X3RhaW50KFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRSk7XFxuMjU3MzpcXHRcXHRzaXplX3QgaTtcXG4yNTc0OlxcdFxcbjI1NzU6XFx0XFx0aWYgKCFnZXRfbW9kaW5mbyhpbmZvLCBcXFwiaW50cmVlXFxcIikpIHtcXG4yNTc2OlxcdFxcdFxcdGlmICghdGVzdF90YWludChUQUlOVF9PT1RfTU9EVUxFKSlcXG4yNTc3OlxcdFxcdFxcdFxcdHByX3dhcm4oXFxcIiVzOiBsb2FkaW5nIG91dC1vZi10cmVlIG1vZHVsZSB0YWludHMga2VybmVsLlxcXFxuXFxcIixcXG4yNTc4OlxcdFxcdFxcdFxcdFxcdG1vZC1cXHUwMDNlbmFtZSk7XFxuMjU3OTpcXHRcXHRcXHRhZGRfdGFpbnRfbW9kdWxlKG1vZCwgVEFJTlRfT09UX01PRFVMRSwgTE9DS0RFUF9TVElMTF9PSyk7XFxuMjU4MDpcXHRcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQyOjU5Ljc1OTIwNDU3NFoiLCJTZXEiOjQ3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzUxMjY5NzA1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgYnJlYWtkb3duIG9mIHdoYXQncyBoYXBwZW5pbmcsIGZyb20gbXkgZXhwZXJ0IHBlcnNwZWN0aXZlOlxuXG4qKkFuYWx5emluZyBTZWN0aW9uIEhlYWRlciBNYW5pcHVsYXRpb24qKlxuXG5SaWdodCwgbGV0IG1lIGdldCB0aGlzIHN0cmFpZ2h0IGluIG15IGhlYWQuIGByZXdyaXRlX3NlY3Rpb25faGVhZGVyc2AgaXMgcmVzZXR0aW5nIGBzaF9hZGRyYCDigJMgaXQncyBiYXNpY2FsbHkgcG9pbnRpbmcgaXQgdG8gdGhlIHRlbXAgaW1hZ2UuIEdvdCBpdC4gTm93LCBgbGF5b3V0X3NlY3Rpb25zYCBhbmQgYGxheW91dF9zeW10YWJgIGNvbWUgaW50byBwbGF5LCBhbmQgdGhleSdyZSBnb2luZyB0byBzdGFydCB0d2Vha2luZyB0aGluZ3MgbGlrZSBgc2hfYWRkcmAsIGBzaF9lbnRzaXplYCwgYW5kIHNvIG9uLiBIb2xkIG9uLi4uIEkgbmVlZCB0byBiZSBwcmVjaXNlIGhlcmUuICpgbGF5b3V0X3NlY3Rpb25zYCogaXMgYWxzbyBtb2RpZnlpbmcgYHNoX2VudHNpemVgICphbmQqIGBzaF9hZGRyYC4gIEkgbmVlZCB0byB2ZXJpZnkgdGhhdC4gTGV0J3MgZGl2ZSBpbnRvIGBsYXlvdXRfc2VjdGlvbnNgIGFuZCBzZWUgd2hhdCdzIGFjdHVhbGx5IGhhcHBlbmluZy4gR290dGEga2VlcCB0aGUgZGV0YWlscyBzdHJhaWdodCBzbyBJIGRvbid0IG1pc3MgYW55IGVkZ2UgY2FzZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY2MDgsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQzOjAzLjUxMDQ3NjcwOVoiLCJTZXEiOjQ4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjIwMzIxNjYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibGF5b3V0X3NlY3Rpb25zXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9tb2R1bGUvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9tb2R1bGUvbWFpbi5jPTE2NzE9Ym9vbCBtb2R1bGVfaW5pdF9sYXlvdXRfc2VjdGlvbihjb25zdCBjaGFyICpzbmFtZSlcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTE2NzktXFxua2VybmVsL21vZHVsZS9tYWluLmM6MTY4MDpzdGF0aWMgdm9pZCBfX2xheW91dF9zZWN0aW9ucyhzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGJvb2wgaXNfaW5pdClcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNjgxLXtcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTE3NTEtICovXFxua2VybmVsL21vZHVsZS9tYWluLmM6MTc1MjpzdGF0aWMgdm9pZCBsYXlvdXRfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTE3NTMte1xcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMTc1OS1cXHRwcl9kZWJ1ZyhcXFwiQ29yZSBzZWN0aW9uIGFsbG9jYXRpb24gb3JkZXIgZm9yICVzOlxcXFxuXFxcIiwgbW9kLVxcdTAwM2VuYW1lKTtcXG5rZXJuZWwvbW9kdWxlL21haW4uYzoxNzYwOlxcdF9fbGF5b3V0X3NlY3Rpb25zKG1vZCwgaW5mbywgZmFsc2UpO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTE3NjEtXFxua2VybmVsL21vZHVsZS9tYWluLmMtMTc2Mi1cXHRwcl9kZWJ1ZyhcXFwiSW5pdCBzZWN0aW9uIGFsbG9jYXRpb24gb3JkZXIgZm9yICVzOlxcXFxuXFxcIiwgbW9kLVxcdTAwM2VuYW1lKTtcXG5rZXJuZWwvbW9kdWxlL21haW4uYzoxNzYzOlxcdF9fbGF5b3V0X3NlY3Rpb25zKG1vZCwgaW5mbywgdHJ1ZSk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMTc2NC19XFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0yOTQzPXN0YXRpYyBzdHJ1Y3QgbW9kdWxlICpsYXlvdXRfYW5kX2FsbG9jYXRlKHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGludCBmbGFncylcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5NjItXFx0LypcXG5rZXJuZWwvbW9kdWxlL21haW4uYzoyOTYzOlxcdCAqIE1hcmsgcmVsZXZhbnQgc2VjdGlvbnMgYXMgU0hGX1JPX0FGVEVSX0lOSVQgc28gbGF5b3V0X3NlY3Rpb25zKCkgY2FuXFxua2VybmVsL21vZHVsZS9tYWluLmMtMjk2NC1cXHQgKiBwdXQgdGhlbSBpbiB0aGUgcmlnaHQgcGxhY2UuXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTc0LXJldHJ5Olxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI5NzU6XFx0bGF5b3V0X3NlY3Rpb25zKGluZm8tXFx1MDAzZW1vZCwgaW5mbyk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMjk3Ni1cXHRsYXlvdXRfc3ltdGFiKGluZm8tXFx1MDAzZW1vZCwgaW5mbyk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQzOjAzLjU3MjUxMTM5NVoiLCJTZXEiOjQ5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozOTM5MTgyMjIyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKkFuYWx5emluZyB0aGUgX19sYXlvdXRfc2VjdGlvbnMgRGlyZWN0aXZlKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbi4gTXkgbWluZCBpbW1lZGlhdGVseSBnb2VzIHRvIGBfX2xheW91dF9zZWN0aW9uc2AuIFdoZW5ldmVyIEkgZW5jb3VudGVyIHRoaXMsIEknbSB0aGlua2luZyBhYm91dCB0aGUgbW9kdWxhciBzdHJ1Y3R1cmUuIFRoaXMgZGlyZWN0aXZlLCBtb3JlIG9mdGVuIHRoYW4gbm90LCBpcyBnb2luZyB0byBiZSB0aGUgY2VudHJhbCBwb2ludCBmb3IgYnVpbGRpbmcgY29tcGxleCBwYWdlcyBvciB0ZW1wbGF0ZXMgdGhhdCBuZWVkIHRvIGJlIGhpZ2hseSBjdXN0b21pemFibGUgYW5kIG1haW50YWluYWJsZS4gSXQgaW1wbGllcyBhIHN5c3RlbSB3aGVyZSBjb250ZW50IGlzbid0IG1vbm9saXRoaWMsIGJ1dCBicm9rZW4gZG93biBpbnRvIGxvZ2ljYWxseSBncm91cGVkIGFuZCByZXVzYWJsZSBzZWN0aW9ucy5cblxuSSdtIG1lbnRhbGx5IG1hcHBpbmcgdGhlIHBvc3NpYmlsaXRpZXMuIElzIHRoaXMgYSBjdXN0b20gZGlyZWN0aXZlLCBwYXJ0IG9mIGEgZnJhbWV3b3JrLCBvciBhIGNvcmUgbGFuZ3VhZ2UgY29uc3RydWN0PyBUaGF0IHdpbGwgZHJhbWF0aWNhbGx5IGFsdGVyIG15IGluaXRpYWwgYXNzZXNzbWVudC4gSWYgaXQncyBjdXN0b20sIEknbGwgbmVlZCB0byB1bmRlcnN0YW5kIHdoZXJlIHRoZSBpbXBsZW1lbnRhdGlvbiBleGlzdHMgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgYnJvYWRlciByZW5kZXJpbmcgY29udGV4dC4gSWYgaXQncyBmcmFtZXdvcmstc3BlY2lmaWMsIEknbSBhbHJlYWR5IHN0YXJ0aW5nIHRvIHRoaW5rIGFib3V0IHdoaWNoIGZyYW1ld29yay4gV2hhdCdzIGl0cyBwdXJwb3NlPyBJcyBpdCBoYW5kbGluZyB0aGluZ3MgbGlrZSBuYXZpZ2F0aW9uLCBjb250ZW50IHJlZ2lvbnMsIHNpZGViYXJzLCBvciBlbnRpcmUgcGFnZSB0ZW1wbGF0ZXM/IElzIHRoZXJlIGEgbmVzdGVkIHN0cnVjdHVyZSBpbnZvbHZlZD8gSG93IGlzIHRoZSByZW5kZXJpbmcgY29udGV4dCBwYXNzZWQgZG93biBmcm9tIHRoZSB0b3AtbGV2ZWwgdG8gdGhlIGluZGl2aWR1YWwgc2VjdGlvbnM/XG5cbkkgc3RhcnQgdGhpbmtpbmcgYWJvdXQgaG93IGl0IG1pZ2h0IGJlIGltcGxlbWVudGVkLiBBcmUgdGhlIHNlY3Rpb25zIGRlZmluZWQgaW4gYSBkZWNsYXJhdGl2ZSBtYW5uZXIsIG9yIGlzIHRoZXJlIG1vcmUgZHluYW1pYyBsb2dpYyBpbnZvbHZlZD8gQ291bGQgdGhpcyBiZSBhIHNpbXBsZSBpbmNsdXNpb24gbWVjaGFuaXNtLCBvciBkb2VzIGl0IHBvdGVudGlhbGx5IGRlYWwgd2l0aCBkYXRhIGJpbmRpbmcsIHRlbXBsYXRpbmcgZW5naW5lcywgb3IgZXZlbiBjb25kaXRpb25hbCByZW5kZXJpbmcgb2YgZW50aXJlIHNlY3Rpb25zIGJhc2VkIG9uIGRhdGE/IEnigJltIGltYWdpbmluZyB0aGUgcG90ZW50aWFsIGltcGFjdCBvbiBwZXJmb3JtYW5jZSB0b28uIFdpdGggdGhlc2Ugc29ydHMgb2YgbGF5b3V0IGRpcmVjdGl2ZXMsIG1hbmFnaW5nIHNlY3Rpb24gZGVwZW5kZW5jaWVzIGJlY29tZXMgY3JpdGljYWwsIHNvIHRoYXQncyBzb21ldGhpbmcgdGhhdCdzIGFsd2F5cyBpbiB0aGUgYmFjayBvZiBteSBtaW5kLlxuXG5VbHRpbWF0ZWx5LCBteSBnb2FsIGhlcmUgaXMgdG8gZGV0ZXJtaW5lIGhvdyB0aGUgZnJhbWV3b3JrLCBsYW5ndWFnZSwgb3Igc3lzdGVtLCBlbmFibGVzIGEgY2xlYW4gc2VwYXJhdGlvbiBvZiBjb25jZXJucyBhbmQgdGhlIG1vc3QgZWZmaWNpZW50IHdheSB0byBtYWludGFpbiBhbmQgbWFuYWdlIGxhcmdlLCBjb21wbGV4IHRlbXBsYXRlcyBvciBsYXlvdXRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3Mzk5LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDM6MDcuNTExNjk1OTg3WiIsIlNlcSI6NTAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMzk1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvbW9kdWxlL21haW4uY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNjgwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxNjgwOlxcdHN0YXRpYyB2b2lkIF9fbGF5b3V0X3NlY3Rpb25zKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgYm9vbCBpc19pbml0KVxcbjE2ODE6XFx0e1xcbjE2ODI6XFx0XFx0dW5zaWduZWQgaW50IG0sIGk7XFxuMTY4MzpcXHRcXG4xNjg0OlxcdFxcdC8qXFxuMTY4NTpcXHRcXHQgKiB7IE1hc2sgb2YgcmVxdWlyZWQgc2VjdGlvbiBoZWFkZXIgZmxhZ3MsXFxuMTY4NjpcXHRcXHQgKiAgIE1hc2sgb2YgZXhjbHVkZWQgc2VjdGlvbiBoZWFkZXIgZmxhZ3MgfVxcbjE2ODc6XFx0XFx0ICovXFxuMTY4ODpcXHRcXHRzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBtYXNrc1tdWzJdID0ge1xcbjE2ODk6XFx0XFx0XFx0eyBTSEZfRVhFQ0lOU1RSIHwgU0hGX0FMTE9DLCBBUkNIX1NIRl9TTUFMTCB9LFxcbjE2OTA6XFx0XFx0XFx0eyBTSEZfQUxMT0MsIFNIRl9XUklURSB8IEFSQ0hfU0hGX1NNQUxMIH0sXFxuMTY5MTpcXHRcXHRcXHR7IFNIRl9ST19BRlRFUl9JTklUIHwgU0hGX0FMTE9DLCBBUkNIX1NIRl9TTUFMTCB9LFxcbjE2OTI6XFx0XFx0XFx0eyBTSEZfV1JJVEUgfCBTSEZfQUxMT0MsIEFSQ0hfU0hGX1NNQUxMIH0sXFxuMTY5MzpcXHRcXHRcXHR7IEFSQ0hfU0hGX1NNQUxMIHwgU0hGX0FMTE9DLCAwIH1cXG4xNjk0OlxcdFxcdH07XFxuMTY5NTpcXHRcXHRzdGF0aWMgY29uc3QgaW50IGNvcmVfbV90b19tZW1fdHlwZVtdID0ge1xcbjE2OTY6XFx0XFx0XFx0TU9EX1RFWFQsXFxuMTY5NzpcXHRcXHRcXHRNT0RfUk9EQVRBLFxcbjE2OTg6XFx0XFx0XFx0TU9EX1JPX0FGVEVSX0lOSVQsXFxuMTY5OTpcXHRcXHRcXHRNT0RfREFUQSxcXG4xNzAwOlxcdFxcdFxcdE1PRF9EQVRBLFxcbjE3MDE6XFx0XFx0fTtcXG4xNzAyOlxcdFxcdHN0YXRpYyBjb25zdCBpbnQgaW5pdF9tX3RvX21lbV90eXBlW10gPSB7XFxuMTcwMzpcXHRcXHRcXHRNT0RfSU5JVF9URVhULFxcbjE3MDQ6XFx0XFx0XFx0TU9EX0lOSVRfUk9EQVRBLFxcbjE3MDU6XFx0XFx0XFx0TU9EX0lOVkFMSUQsXFxuMTcwNjpcXHRcXHRcXHRNT0RfSU5JVF9EQVRBLFxcbjE3MDc6XFx0XFx0XFx0TU9EX0lOSVRfREFUQSxcXG4xNzA4OlxcdFxcdH07XFxuMTcwOTpcXHRcXG4xNzEwOlxcdFxcdGZvciAobSA9IDA7IG0gXFx1MDAzYyBBUlJBWV9TSVpFKG1hc2tzKTsgKyttKSB7XFxuMTcxMTpcXHRcXHRcXHRlbnVtIG1vZF9tZW1fdHlwZSB0eXBlID0gaXNfaW5pdCA/IGluaXRfbV90b19tZW1fdHlwZVttXSA6IGNvcmVfbV90b19tZW1fdHlwZVttXTtcXG4xNzEyOlxcdFxcbjE3MTM6XFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGluZm8tXFx1MDAzZWhkci1cXHUwMDNlZV9zaG51bTsgKytpKSB7XFxuMTcxNDpcXHRcXHRcXHRcXHRFbGZfU2hkciAqcyA9IFxcdTAwMjZpbmZvLVxcdTAwM2VzZWNoZHJzW2ldO1xcbjE3MTU6XFx0XFx0XFx0XFx0Y29uc3QgY2hhciAqc25hbWUgPSBpbmZvLVxcdTAwM2VzZWNzdHJpbmdzICsgcy1cXHUwMDNlc2hfbmFtZTtcXG4xNzE2OlxcdFxcbjE3MTc6XFx0XFx0XFx0XFx0aWYgKChzLVxcdTAwM2VzaF9mbGFncyBcXHUwMDI2IG1hc2tzW21dWzBdKSAhPSBtYXNrc1ttXVswXVxcbjE3MTg6XFx0XFx0XFx0XFx0ICAgIHx8IChzLVxcdTAwM2VzaF9mbGFncyBcXHUwMDI2IG1hc2tzW21dWzFdKVxcbjE3MTk6XFx0XFx0XFx0XFx0ICAgIHx8IHMtXFx1MDAzZXNoX2VudHNpemUgIT0gfjBVTFxcbjE3MjA6XFx0XFx0XFx0XFx0ICAgIHx8IGlzX2luaXQgIT0gbW9kdWxlX2luaXRfbGF5b3V0X3NlY3Rpb24oc25hbWUpKVxcbjE3MjE6XFx0XFx0XFx0XFx0XFx0Y29udGludWU7XFxuMTcyMjpcXHRcXG4xNzIzOlxcdFxcdFxcdFxcdGlmIChXQVJOX09OX09OQ0UodHlwZSA9PSBNT0RfSU5WQUxJRCkpXFxuMTcyNDpcXHRcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4xNzI1OlxcdFxcbjE3MjY6XFx0XFx0XFx0XFx0LypcXG4xNzI3OlxcdFxcdFxcdFxcdCAqIERvIG5vdCBhbGxvY2F0ZSBjb2RldGFnIG1lbW9yeSBhcyB3ZSBsb2FkIGl0IGludG9cXG4xNzI4OlxcdFxcdFxcdFxcdCAqIHByZWFsbG9jYXRlZCBjb250aWd1b3VzIG1lbW9yeS5cXG4xNzI5OlxcdFxcdFxcdFxcdCAqL1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0MzowNy41MTE5MzE3MDdaIiwiU2VxIjo1MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzM4OTA3ODc2MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBhc3N1bWluZyBJJ20gZGVlcCBpbiBteSBkb21haW4gb2YgZXhwZXJ0aXNlOlxuXG4qKkRpdmluZyBEZWVwZXIgaW50byBgX19sYXlvdXRfc2VjdGlvbnNgKipcblxuQWxyaWdodCwgdGhhdCdzIHdoYXQgSSBuZWVkIHRvIGRvIG5leHQuIEkndmUgZ290IGEgZ3Jhc3Agb2YgdGhlIG92ZXJhbGwgcGljdHVyZSwgYnV0IHRvIHJlYWxseSB1bmRlcnN0YW5kIHRoZSBzeXN0ZW0ncyBiZWhhdmlvciwgSSBuZWVkIHRvIGRpZyBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBgX19sYXlvdXRfc2VjdGlvbnNgLiBJdCdzIGEga2V5IGNvbXBvbmVudCwgcHJvYmFibHkgd2hlcmUgYSBsb3Qgb2YgdGhlIGNvcmUgbGF5b3V0IGxvZ2ljIHJlc2lkZXMsIGFuZCBwb3RlbnRpYWxseSB3aGVyZSBJJ2xsIGZpbmQgdGhlIGFuc3dlcnMgdG8gdGhvc2UgcXVlc3Rpb25zIEkgd2FzIG11bGxpbmcgb3Zlci4gTGV0IG1lIGdldCBwYXN0IHRoZSBzdXJmYWNlLWxldmVsIGFuZCB1bmRlcnN0YW5kIHRoZSBzdWJ0bGV0aWVzLiBJIG5lZWQgdG8ga25vdyBob3cgc2VjdGlvbnMgYXJlIGNvbnN0cnVjdGVkLCBsYWlkIG91dCwgYW5kIGhvdyB0aGV5IGludGVyYWN0IHdpdGggdGhlIG92ZXJhbGwgcmVuZGVyaW5nIHBpcGVsaW5lLiBUaGlzIHdpbGwgYmUgdGhlIG5leHQgc3RlcCB0byBmaW5kIGFueSBpbnNpZ2h0cy5cblxuXG4iLCJJbnB1dFRva2VucyI6ODY0NiwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDM6MTAuOTAxMDEzMTg3WiIsIlNlcSI6NTIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI0NjM0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvbW9kdWxlL21haW4uY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNzMwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxNzMwOlxcdFxcdFxcdFxcdGlmIChjb2RldGFnX25lZWRzX21vZHVsZV9zZWN0aW9uKG1vZCwgc25hbWUsIHMtXFx1MDAzZXNoX3NpemUpKSB7XFxuMTczMTpcXHRcXHRcXHRcXHRcXHQvKlxcbjE3MzI6XFx0XFx0XFx0XFx0XFx0ICogcy1cXHUwMDNlc2hfZW50c2l6ZSB3b24ndCBiZSB1c2VkIGJ1dCBwb3B1bGF0ZSB0aGVcXG4xNzMzOlxcdFxcdFxcdFxcdFxcdCAqIHR5cGUgZmllbGQgdG8gYXZvaWQgY29uZnVzaW9uLlxcbjE3MzQ6XFx0XFx0XFx0XFx0XFx0ICovXFxuMTczNTpcXHRcXHRcXHRcXHRcXHRzLVxcdTAwM2VzaF9lbnRzaXplID0gKCh1bnNpZ25lZCBsb25nKSh0eXBlKSBcXHUwMDI2IFNIX0VOVFNJWkVfVFlQRV9NQVNLKVxcbjE3MzY6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx1MDAzY1xcdTAwM2MgU0hfRU5UU0laRV9UWVBFX1NISUZUO1xcbjE3Mzc6XFx0XFx0XFx0XFx0XFx0Y29udGludWU7XFxuMTczODpcXHRcXHRcXHRcXHR9XFxuMTczOTpcXHRcXG4xNzQwOlxcdFxcdFxcdFxcdHMtXFx1MDAzZXNoX2VudHNpemUgPSBtb2R1bGVfZ2V0X29mZnNldF9hbmRfdHlwZShtb2QsIHR5cGUsIHMsIGkpO1xcbjE3NDE6XFx0XFx0XFx0XFx0cHJfZGVidWcoXFxcIlxcXFx0JXNcXFxcblxcXCIsIHNuYW1lKTtcXG4xNzQyOlxcdFxcdFxcdH1cXG4xNzQzOlxcdFxcdH1cXG4xNzQ0OlxcdH1cXG4xNzQ1OlxcdFxcbjE3NDY6XFx0LypcXG4xNzQ3OlxcdCAqIExheSBvdXQgdGhlIFNIRl9BTExPQyBzZWN0aW9ucyBpbiBhIHdheSBub3QgZGlzc2ltaWxhciB0byBob3cgbGRcXG4xNzQ4OlxcdCAqIG1pZ2h0IC0tIGNvZGUsIHJlYWQtb25seSBkYXRhLCByZWFkLXdyaXRlIGRhdGEsIHNtYWxsIGRhdGEuICBUYWxseVxcbjE3NDk6XFx0ICogc2l6ZXMsIGFuZCBwbGFjZSB0aGUgb2Zmc2V0cyBpbnRvIHNoX2VudHNpemUgZmllbGRzOiBoaWdoIGJpdCBtZWFucyBpdFxcbjE3NTA6XFx0ICogYmVsb25ncyBpbiBpbml0LlxcbjE3NTE6XFx0ICovXFxuMTc1MjpcXHRzdGF0aWMgdm9pZCBsYXlvdXRfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxcbjE3NTM6XFx0e1xcbjE3NTQ6XFx0XFx0dW5zaWduZWQgaW50IGk7XFxuMTc1NTpcXHRcXG4xNzU2OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBpbmZvLVxcdTAwM2VoZHItXFx1MDAzZWVfc2hudW07IGkrKylcXG4xNzU3OlxcdFxcdFxcdGluZm8tXFx1MDAzZXNlY2hkcnNbaV0uc2hfZW50c2l6ZSA9IH4wVUw7XFxuMTc1ODpcXHRcXG4xNzU5OlxcdFxcdHByX2RlYnVnKFxcXCJDb3JlIHNlY3Rpb24gYWxsb2NhdGlvbiBvcmRlciBmb3IgJXM6XFxcXG5cXFwiLCBtb2QtXFx1MDAzZW5hbWUpO1xcbjE3NjA6XFx0XFx0X19sYXlvdXRfc2VjdGlvbnMobW9kLCBpbmZvLCBmYWxzZSk7XFxuMTc2MTpcXHRcXG4xNzYyOlxcdFxcdHByX2RlYnVnKFxcXCJJbml0IHNlY3Rpb24gYWxsb2NhdGlvbiBvcmRlciBmb3IgJXM6XFxcXG5cXFwiLCBtb2QtXFx1MDAzZW5hbWUpO1xcbjE3NjM6XFx0XFx0X19sYXlvdXRfc2VjdGlvbnMobW9kLCBpbmZvLCB0cnVlKTtcXG4xNzY0OlxcdH1cXG4xNzY1OlxcdFxcbjE3NjY6XFx0c3RhdGljIHZvaWQgbW9kdWxlX2xpY2Vuc2VfdGFpbnRfY2hlY2soc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpsaWNlbnNlKVxcbjE3Njc6XFx0e1xcbjE3Njg6XFx0XFx0aWYgKCFsaWNlbnNlKVxcbjE3Njk6XFx0XFx0XFx0bGljZW5zZSA9IFxcXCJ1bnNwZWNpZmllZFxcXCI7XFxuMTc3MDpcXHRcXG4xNzcxOlxcdFxcdGlmICghbGljZW5zZV9pc19ncGxfY29tcGF0aWJsZShsaWNlbnNlKSkge1xcbjE3NzI6XFx0XFx0XFx0aWYgKCF0ZXN0X3RhaW50KFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRSkpXFxuMTc3MzpcXHRcXHRcXHRcXHRwcl93YXJuKFxcXCIlczogbW9kdWxlIGxpY2Vuc2UgJyVzJyB0YWludHMga2VybmVsLlxcXFxuXFxcIixcXG4xNzc0OlxcdFxcdFxcdFxcdFxcdG1vZC1cXHUwMDNlbmFtZSwgbGljZW5zZSk7XFxuMTc3NTpcXHRcXHRcXHRhZGRfdGFpbnRfbW9kdWxlKG1vZCwgVEFJTlRfUFJPUFJJRVRBUllfTU9EVUxFLFxcbjE3NzY6XFx0XFx0XFx0XFx0XFx0IExPQ0tERVBfTk9XX1VOUkVMSUFCTEUpO1xcbjE3Nzc6XFx0XFx0fVxcbjE3Nzg6XFx0fVxcbjE3Nzk6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQzOjEwLjkwMTI2MDk3OFoiLCJTZXEiOjUzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0Mjg2MzI2MzI3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uXG5cbioqVW5kZXJzdGFuZGluZyB0aGUgU2VjdGlvbiBMYXlvdXQgYW5kIE1vZHVsZSBNb3ZlbWVudCoqXG5cbkFscmlnaHQsIHNvIGBsYXlvdXRfc2VjdGlvbnNgIOKAkyB0aGF0J3MgdGhlIGZ1bmN0aW9uIHRoYXQncyBzZXR0aW5nIGBzaF9lbnRzaXplYCB0bywgZXNzZW50aWFsbHksIGEgbWF4aW11bSB1bnNpZ25lZCBsb25nLCByaWdodD8gQW5kIGZyb20gdGhlcmUsIGl0J3MgY2FsY3VsYXRpbmcgb2Zmc2V0cyBmb3IgdGhlIHNlY3Rpb25zLiBUaGF0IHNlZW1zIHByZXR0eSBzdGFuZGFyZCBmb3Igc2V0dGluZyB1cCB0aGUgaW5pdGlhbCBsYXlvdXQuIEJ1dCB0aGUgbmV4dCBwYXJ0IGlzIGludGVyZXN0aW5nLlxuXG5JZiBgbW92ZV9tb2R1bGVgIGhpdHMgYW4gYC1FQUdBSU5gIGVycm9yIOKAkyB3aGljaCBpbXBsaWVzIGEgdGVtcG9yYXJ5IHJlc291cmNlIGlzc3VlLCBwZXJoYXBzIGEgbG9jayBjb250ZW50aW9uIG9yIHNvbWV0aGluZyBzaW1pbGFyIOKAkyBpdCByZXNldHMgdGhlIHNlY3Rpb24gc2l6ZXMgdG8gemVyby4gQW5kIG9uIHRvcCBvZiB0aGF0LCBpdCB1bnNldHMgdGhlIGBTSEZfQUxMT0NgIGZsYWcgZm9yIGJvdGggdGhlIHN5bWJvbCB0YWJsZSBhbmQgdGhlIHN0cmluZyB0YWJsZS4gTm93LCB0aGUgYFNIRl9BTExPQ2AgZmxhZyBpcyBjcnVjaWFsOyBpdCBtZWFucyB0aGUgc2VjdGlvbiBpcyBzdXBwb3NlZCB0byByZXNpZGUgaW4gbWVtb3J5IGF0IHJ1bnRpbWUuIFJlc2V0dGluZyB0aGUgc2l6ZXMgYW5kIGNsZWFyaW5nIHRoYXQgZmxhZ+KApiB0aGF0J3MgYSBwcmV0dHkgZHJhc3RpYyByb2xsYmFjay4gSXQgc2VlbXMgbGlrZSBpdCdzIHRyeWluZyB0byBlbnN1cmUgbm8gcGFydGlhbGx5LWFsbG9jYXRlZCBkYXRhIGlzIGxlZnQgaGFuZ2luZyBhcm91bmQsIGEga2luZCBvZiBjbGVhbi11cCBvcGVyYXRpb24gaW4gY2FzZSBvZiBmYWlsdXJlLlxuXG5XYWl0IGEgc2Vjb25k4oCmIGBtb3ZlX21vZHVsZWAgaXMgKmNhbGxlZCogYWZ0ZXIgYGxheW91dF9zZWN0aW9uc2AgYW5kIGBsYXlvdXRfc3ltdGFiYC4gSSB3YXMgZXhwZWN0aW5nIHRoZSBvdGhlciB3YXkgYXJvdW5kLiBPa2F5LCBnaXZlbiB0aGF0IG9yZGVyaW5nLCBJIG5lZWQgdG8gY2hlY2sgaG93IGBtb3ZlX21vZHVsZWAgd29ya3MgYmVjYXVzZSBpdHMgYmVoYXZpb3IgaXMgY2VudHJhbCB0byB0aGUgb3ZlcmFsbCBwcm9jZXNzLiBUaW1lIHRvIGRpZyBpbnRvIHRoZSBgbW92ZV9tb2R1bGVgIGZ1bmN0aW9uIGFuZCBnZXQgYSBiZXR0ZXIgcGljdHVyZSBvZiB3aGF0J3MgZ29pbmcgb24gd2l0aCByZXNvdXJjZSBtYW5hZ2VtZW50IGFuZCBzZWN0aW9uIGFsbG9jYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk2NDYsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5MiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQzOjE1LjE4NzU5MDQ2NVoiLCJTZXEiOjU0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDU3MzkyODcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibW92ZV9tb2R1bGVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL21vZHVsZS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL21vZHVsZS9tYWluLmM9MjM2ND1zdGF0aWMgaW50IGVsZl92YWxpZGl0eV9jYWNoZV9zdHJ0YWIoc3RydWN0IGxvYWRfaW5mbyAqaW5mbylcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI0MTUtICogQXMgYSBsYXN0IHN0ZXAgd2Ugc2V0IGluZm8tXFx1MDAzZW1vZCB0byB0aGUgdGVtcG9yYXJ5IGNvcHkgb2YgdGhlIG1vZHVsZSBpblxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI0MTY6ICogaW5mby1cXHUwMDNlaGRyLiBUaGUgZmluYWwgb25lIHdpbGwgYmUgYWxsb2NhdGVkIGluIG1vdmVfbW9kdWxlKCkuIEFueVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI0MTctICogbW9kaWZpY2F0aW9ucyB3ZSBtYWtlIHRvIG91ciBjb3B5IG9mIHRoZSBtb2R1bGUgd2lsbCBiZSBjYXJyaWVkIG92ZXJcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTI2NTk9c3RhdGljIGludCBmaW5kX21vZHVsZV9zZWN0aW9ucyhzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yNzg3LVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI3ODg6c3RhdGljIGludCBtb3ZlX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXFxua2VybmVsL21vZHVsZS9tYWluLmMtMjc4OS17XFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0yOTQzPXN0YXRpYyBzdHJ1Y3QgbW9kdWxlICpsYXlvdXRfYW5kX2FsbG9jYXRlKHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGludCBmbGFncylcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5NzgtXFx0LyogQWxsb2NhdGUgYW5kIG1vdmUgdG8gdGhlIGZpbmFsIHBsYWNlICovXFxua2VybmVsL21vZHVsZS9tYWluLmM6Mjk3OTpcXHRlcnIgPSBtb3ZlX21vZHVsZShpbmZvLVxcdTAwM2Vtb2QsIGluZm8pO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5ODAtXFx0aWYgKGVycikge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0MzoxNS4yMzMzMzM4MjJaIiwiU2VxIjo1NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTI2OTA1NzMyNTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipJbml0aWFsIEFzc2Vzc21lbnQ6IE5hdmlnYXRpbmcgdGhlIGBtb3ZlX21vZHVsZWAgQ29kZSoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byB0aGlzIGBtb3ZlX21vZHVsZWAuIE15IGZpcnN0IHRob3VnaHQgaXMgdG8gZ2V0IGEgZ2VuZXJhbCBmZWVsIGZvciBpdHMgcHVycG9zZSBhbmQgc2NvcGUuIFwibW92ZVwiIGlzIGEgcHJldHR5IGJyb2FkIHRlcm0sIHNvIEknbSBpbW1lZGlhdGVseSB0cnlpbmcgdG8gbWVudGFsbHkgY2F0ZWdvcml6ZSB0aGlzIG1vZHVsZS4gSXMgaXQgaGFuZGxpbmcgb2JqZWN0IG1vdmVtZW50IGluIGEgZ2FtZSBlbmdpbmUsIGRhdGEgbWlncmF0aW9uIGJldHdlZW4gZGF0YWJhc2VzLCBmaWxlIHN5c3RlbSBvcGVyYXRpb25zLCBvciBzb21ldGhpbmcgZWxzZSBlbnRpcmVseT8gVGhlIG5hbWUgYWxvbmUgZG9lc24ndCBnaXZlIG1lIGVub3VnaCBjb250ZXh0LiBJJ20gZ29pbmcgdG8gcXVpY2tseSBzY2FuIGZvciBjbHVlcyDigJMgYW55IGltcG9ydHMsIGZ1bmN0aW9uIG5hbWVzLCBjbGFzcyBoaWVyYXJjaGllcywgYW55dGhpbmcgdGhhdCBnaXZlcyBhIGhpbnQgYWJvdXQgdGhlIGRvbWFpbiBhbmQgaW50ZW5kZWQgZnVuY3Rpb25hbGl0eS4gSSdtIGFsc28gY29uc2lkZXJpbmcgdGhlIGFyY2hpdGVjdHVyYWwgY29udGV4dCwgaWYgYW55IGlzIHByb3ZpZGVkIC0gaXMgaXQgcGFydCBvZiBhIGxhcmdlciBzeXN0ZW0sIGEgc3RhbmRhbG9uZSB1dGlsaXR5LCBvciBhIGxpYnJhcnk/IEknbSBhbHJlYWR5IGZvcm11bGF0aW5nIHF1ZXN0aW9uczogV2hhdCBhcmUgdGhlIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBJIHNob3VsZCBsb29rIGZvcj8gQW55IGNvbmN1cnJlbmN5IGlzc3VlcyB0byBjb25zaWRlciBpZiBpdCdzIHRocmVhZGVkPyBXaGF0IGRlc2lnbiBwYXR0ZXJucyBhcmUgbGlrZWx5IGVtcGxveWVkIGdpdmVuIHRoZSAnbW92ZScgb3BlcmF0aW9uPyBFc3NlbnRpYWxseSwgSSdtIHNldHRpbmcgdGhlIHN0YWdlIGZvciBhIGZvY3VzZWQgY29kZSBjb21wcmVoZW5zaW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDQyOCwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDM6MjcuOTIzOTA5NzY2WiIsIlNlcSI6NTYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzNjU1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvbW9kdWxlL21haW4uY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyNzg4LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyNzg4OlxcdHN0YXRpYyBpbnQgbW92ZV9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxcbjI3ODk6XFx0e1xcbjI3OTA6XFx0XFx0aW50IGksIHJldDtcXG4yNzkxOlxcdFxcdGVudW0gbW9kX21lbV90eXBlIHQgPSBNT0RfTUVNX05VTV9UWVBFUztcXG4yNzkyOlxcdFxcdGJvb2wgY29kZXRhZ19zZWN0aW9uX2ZvdW5kID0gZmFsc2U7XFxuMjc5MzpcXHRcXG4yNzk0OlxcdFxcdGZvcl9lYWNoX21vZF9tZW1fdHlwZSh0eXBlKSB7XFxuMjc5NTpcXHRcXHRcXHRpZiAoIW1vZC1cXHUwMDNlbWVtW3R5cGVdLnNpemUpIHtcXG4yNzk2OlxcdFxcdFxcdFxcdG1vZC1cXHUwMDNlbWVtW3R5cGVdLmJhc2UgPSBOVUxMO1xcbjI3OTc6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuMjc5ODpcXHRcXHRcXHR9XFxuMjc5OTpcXHRcXG4yODAwOlxcdFxcdFxcdHJldCA9IG1vZHVsZV9tZW1vcnlfYWxsb2MobW9kLCB0eXBlKTtcXG4yODAxOlxcdFxcdFxcdGlmIChyZXQpIHtcXG4yODAyOlxcdFxcdFxcdFxcdHQgPSB0eXBlO1xcbjI4MDM6XFx0XFx0XFx0XFx0Z290byBvdXRfZXJyO1xcbjI4MDQ6XFx0XFx0XFx0fVxcbjI4MDU6XFx0XFx0fVxcbjI4MDY6XFx0XFxuMjgwNzpcXHRcXHQvKiBUcmFuc2ZlciBlYWNoIHNlY3Rpb24gd2hpY2ggc3BlY2lmaWVzIFNIRl9BTExPQyAqL1xcbjI4MDg6XFx0XFx0cHJfZGVidWcoXFxcIkZpbmFsIHNlY3Rpb24gYWRkcmVzc2VzIGZvciAlczpcXFxcblxcXCIsIG1vZC1cXHUwMDNlbmFtZSk7XFxuMjgwOTpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgaW5mby1cXHUwMDNlaGRyLVxcdTAwM2VlX3NobnVtOyBpKyspIHtcXG4yODEwOlxcdFxcdFxcdHZvaWQgKmRlc3Q7XFxuMjgxMTpcXHRcXHRcXHRFbGZfU2hkciAqc2hkciA9IFxcdTAwMjZpbmZvLVxcdTAwM2VzZWNoZHJzW2ldO1xcbjI4MTI6XFx0XFx0XFx0Y29uc3QgY2hhciAqc25hbWU7XFxuMjgxMzpcXHRcXG4yODE0OlxcdFxcdFxcdGlmICghKHNoZHItXFx1MDAzZXNoX2ZsYWdzIFxcdTAwMjYgU0hGX0FMTE9DKSlcXG4yODE1OlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbjI4MTY6XFx0XFxuMjgxNzpcXHRcXHRcXHRzbmFtZSA9IGluZm8tXFx1MDAzZXNlY3N0cmluZ3MgKyBzaGRyLVxcdTAwM2VzaF9uYW1lO1xcbjI4MTg6XFx0XFx0XFx0LypcXG4yODE5OlxcdFxcdFxcdCAqIExvYWQgY29kZXRhZyBzZWN0aW9ucyBzZXBhcmF0ZWx5IGFzIHRoZXkgbWlnaHQgc3RpbGwgYmUgdXNlZFxcbjI4MjA6XFx0XFx0XFx0ICogYWZ0ZXIgbW9kdWxlIHVubG9hZC5cXG4yODIxOlxcdFxcdFxcdCAqL1xcbjI4MjI6XFx0XFx0XFx0aWYgKGNvZGV0YWdfbmVlZHNfbW9kdWxlX3NlY3Rpb24obW9kLCBzbmFtZSwgc2hkci1cXHUwMDNlc2hfc2l6ZSkpIHtcXG4yODIzOlxcdFxcdFxcdFxcdGRlc3QgPSBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uKG1vZCwgc25hbWUsIHNoZHItXFx1MDAzZXNoX3NpemUsXFxuMjgyNDpcXHRcXHRcXHRcXHRcXHRcXHRhcmNoX21vZF9zZWN0aW9uX3ByZXBlbmQobW9kLCBpKSwgc2hkci1cXHUwMDNlc2hfYWRkcmFsaWduKTtcXG4yODI1OlxcdFxcdFxcdFxcdGlmIChXQVJOX09OKCFkZXN0KSkge1xcbjI4MjY6XFx0XFx0XFx0XFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4yODI3OlxcdFxcdFxcdFxcdFxcdGdvdG8gb3V0X2VycjtcXG4yODI4OlxcdFxcdFxcdFxcdH1cXG4yODI5OlxcdFxcdFxcdFxcdGlmIChJU19FUlIoZGVzdCkpIHtcXG4yODMwOlxcdFxcdFxcdFxcdFxcdHJldCA9IFBUUl9FUlIoZGVzdCk7XFxuMjgzMTpcXHRcXHRcXHRcXHRcXHRnb3RvIG91dF9lcnI7XFxuMjgzMjpcXHRcXHRcXHRcXHR9XFxuMjgzMzpcXHRcXHRcXHRcXHRjb2RldGFnX3NlY3Rpb25fZm91bmQgPSB0cnVlO1xcbjI4MzQ6XFx0XFx0XFx0fSBlbHNlIHtcXG4yODM1OlxcdFxcdFxcdFxcdGVudW0gbW9kX21lbV90eXBlIHR5cGUgPSBzaGRyLVxcdTAwM2VzaF9lbnRzaXplIFxcdTAwM2VcXHUwMDNlIFNIX0VOVFNJWkVfVFlQRV9TSElGVDtcXG4yODM2OlxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gc2hkci1cXHUwMDNlc2hfZW50c2l6ZSBcXHUwMDI2IFNIX0VOVFNJWkVfT0ZGU0VUX01BU0s7XFxuMjgzNzpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDM6MjcuOTI0MTQ3NDc2WiIsIlNlcSI6NTcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE4Nzk0NzQyODAzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjpcblxuKipBbmFseXppbmcgYG1vdmVfbW9kdWxlYCdzIEVycm9yIEhhbmRsaW5nKipcblxuT2theSwgc28gYG1vdmVfbW9kdWxlYCBpcyBhIGNyaXRpY2FsIGZ1bmN0aW9uLCBhbmQgSSdtIGxvb2tpbmcgYXQgaG93IGl0IGhhbmRsZXMgZmFpbHVyZXMuIFRoZSBjcnVjaWFsIHBvaW50IGhlcmUgaXMgdGhlIGJlaGF2aW9yIG9uIGVycm9yOiBJZiBpdCBmYWlscywgdGhlIGZ1bmN0aW9uICpmcmVlcyogYW55IGFsbG9jYXRlZCBtZW1vcnkgYW5kIHRoZW4gcmV0dXJucyBhbiBlcnJvci4gVGhpcyBpcyBnb29kIHByYWN0aWNlIOKAkyByZXNvdXJjZSBjbGVhbnVwIGlzIHBhcmFtb3VudCwgZXNwZWNpYWxseSB3aGVuIGRlYWxpbmcgd2l0aCBwb3RlbnRpYWxseSBjb21wbGV4IG1vZHVsZSBtb3ZlbWVudHMuIFRoYXQgbWVtb3J5IG1hbmFnZW1lbnQgc3RyYXRlZ3kgaXMgc29saWQuIE5vdywgSSBuZWVkIHRvIGRpZyBkZWVwZXIgdG8gZnVsbHkgdW5kZXJzdGFuZCBob3cgaXQgb3BlcmF0ZXMgdW5kZXIgdGhlIGhvb2QuIExldCdzIGdldCBpbnRvIHRoZSBkZXRhaWxzIG9mIHRoZSByZXN0IG9mIHRoZSBgbW92ZV9tb2R1bGVgIGZ1bmN0aW9uIGFuZCB0aGUgZXhhY3QgbWVjaGFuaXNtIG9mIHRoZSBlcnJvciBjb25kaXRpb25zIGl0IGNvdmVycy4gVGhhdCdzIHdoZXJlIHRoZSByZWFsIHZhbHVlIGlzIGluIGZpZ3VyaW5nIG91dCBob3cgcm9idXN0IHRoaXMgY29kZSBpcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE0ODksIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQzOjQ2LjcxODg5MjkyOVoiLCJTZXEiOjU4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTczMTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL21vZHVsZS9tYWluLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjgzOCxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjgzODpcXHRcXHRcXHRcXHRkZXN0ID0gbW9kLVxcdTAwM2VtZW1bdHlwZV0uYmFzZSArIG9mZnNldDtcXG4yODM5OlxcdFxcdFxcdH1cXG4yODQwOlxcdFxcbjI4NDE6XFx0XFx0XFx0aWYgKHNoZHItXFx1MDAzZXNoX3R5cGUgIT0gU0hUX05PQklUUykge1xcbjI4NDI6XFx0XFx0XFx0XFx0LypcXG4yODQzOlxcdFxcdFxcdFxcdCAqIE91ciBFTEYgY2hlY2tlciBhbHJlYWR5IHZhbGlkYXRlZCB0aGlzLCBidXQgbGV0J3NcXG4yODQ0OlxcdFxcdFxcdFxcdCAqIGJlIHBlZGFudGljIGFuZCBtYWtlIHRoZSBnb2FsIGNsZWFyZXIuIFdlIGFjdHVhbGx5XFxuMjg0NTpcXHRcXHRcXHRcXHQgKiBlbmQgdXAgY29weWluZyBvdmVyIGFsbCBtb2RpZmljYXRpb25zIG1hZGUgdG8gdGhlXFxuMjg0NjpcXHRcXHRcXHRcXHQgKiB1c2Vyc3BhY2UgY29weSBvZiB0aGUgZW50aXJlIHN0cnVjdCBtb2R1bGUuXFxuMjg0NzpcXHRcXHRcXHRcXHQgKi9cXG4yODQ4OlxcdFxcdFxcdFxcdGlmIChpID09IGluZm8tXFx1MDAzZWluZGV4Lm1vZCBcXHUwMDI2XFx1MDAyNlxcbjI4NDk6XFx0XFx0XFx0XFx0ICAgKFdBUk5fT05fT05DRShzaGRyLVxcdTAwM2VzaF9zaXplICE9IHNpemVvZihzdHJ1Y3QgbW9kdWxlKSkpKSB7XFxuMjg1MDpcXHRcXHRcXHRcXHRcXHRyZXQgPSAtRU5PRVhFQztcXG4yODUxOlxcdFxcdFxcdFxcdFxcdGdvdG8gb3V0X2VycjtcXG4yODUyOlxcdFxcdFxcdFxcdH1cXG4yODUzOlxcdFxcdFxcdFxcdG1lbWNweShkZXN0LCAodm9pZCAqKXNoZHItXFx1MDAzZXNoX2FkZHIsIHNoZHItXFx1MDAzZXNoX3NpemUpO1xcbjI4NTQ6XFx0XFx0XFx0fVxcbjI4NTU6XFx0XFx0XFx0LypcXG4yODU2OlxcdFxcdFxcdCAqIFVwZGF0ZSB0aGUgdXNlcnNwYWNlIGNvcHkncyBFTEYgc2VjdGlvbiBhZGRyZXNzIHRvIHBvaW50IHRvXFxuMjg1NzpcXHRcXHRcXHQgKiBvdXIgbmV3bHkgYWxsb2NhdGVkIG1lbW9yeSBhcyBhIHB1cmUgY29udmVuaWVuY2Ugc28gdGhhdFxcbjI4NTg6XFx0XFx0XFx0ICogdXNlcnMgb2YgaW5mbyBjYW4ga2VlcCB0YWtpbmcgYWR2YW50YWdlIGFuZCB1c2luZyB0aGUgbmV3bHlcXG4yODU5OlxcdFxcdFxcdCAqIG1pbnRlZCBvZmZpY2lhbCBtZW1vcnkgYXJlYS5cXG4yODYwOlxcdFxcdFxcdCAqL1xcbjI4NjE6XFx0XFx0XFx0c2hkci1cXHUwMDNlc2hfYWRkciA9ICh1bnNpZ25lZCBsb25nKWRlc3Q7XFxuMjg2MjpcXHRcXHRcXHRwcl9kZWJ1ZyhcXFwiXFxcXHQweCVseCAweCUuOGx4ICVzXFxcXG5cXFwiLCAobG9uZylzaGRyLVxcdTAwM2VzaF9hZGRyLFxcbjI4NjM6XFx0XFx0XFx0XFx0IChsb25nKXNoZHItXFx1MDAzZXNoX3NpemUsIGluZm8tXFx1MDAzZXNlY3N0cmluZ3MgKyBzaGRyLVxcdTAwM2VzaF9uYW1lKTtcXG4yODY0OlxcdFxcdH1cXG4yODY1OlxcdFxcbjI4NjY6XFx0XFx0cmV0dXJuIDA7XFxuMjg2NzpcXHRvdXRfZXJyOlxcbjI4Njg6XFx0XFx0bW9kdWxlX21lbW9yeV9yZXN0b3JlX3JveChtb2QpO1xcbjI4Njk6XFx0XFx0d2hpbGUgKHQtLSlcXG4yODcwOlxcdFxcdFxcdG1vZHVsZV9tZW1vcnlfZnJlZShtb2QsIHQpO1xcbjI4NzE6XFx0XFx0aWYgKGNvZGV0YWdfc2VjdGlvbl9mb3VuZClcXG4yODcyOlxcdFxcdFxcdGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnMobW9kKTtcXG4yODczOlxcdFxcbjI4NzQ6XFx0XFx0cmV0dXJuIHJldDtcXG4yODc1OlxcdH1cXG4yODc2OlxcdFxcbjI4Nzc6XFx0c3RhdGljIGludCBjaGVja19leHBvcnRfc3ltYm9sX3NlY3Rpb25zKHN0cnVjdCBtb2R1bGUgKm1vZClcXG4yODc4OlxcdHtcXG4yODc5OlxcdFxcdGlmIChtb2QtXFx1MDAzZW51bV9zeW1zIFxcdTAwMjZcXHUwMDI2ICFtb2QtXFx1MDAzZWZsYWdzdGFiKSB7XFxuMjg4MDpcXHRcXHRcXHRwcl9lcnIoXFxcIiVzOiBubyBmbGFncyBmb3IgZXhwb3J0ZWQgc3ltYm9sc1xcXFxuXFxcIiwgbW9kLVxcdTAwM2VuYW1lKTtcXG4yODgxOlxcdFxcdFxcdHJldHVybiAtRU5PRVhFQztcXG4yODgyOlxcdFxcdH1cXG4yODgzOlxcdCNpZmRlZiBDT05GSUdfTU9EVkVSU0lPTlNcXG4yODg0OlxcdFxcdGlmIChtb2QtXFx1MDAzZW51bV9zeW1zIFxcdTAwMjZcXHUwMDI2ICFtb2QtXFx1MDAzZWNyY3MpIHtcXG4yODg1OlxcdFxcdFxcdHJldHVybiB0cnlfdG9fZm9yY2VfbG9hZChtb2QsXFxuMjg4NjpcXHRcXHRcXHRcXHRcXHRcXHQgXFxcIm5vIHZlcnNpb25zIGZvciBleHBvcnRlZCBzeW1ib2xzXFxcIik7XFxuMjg4NzpcXHRcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQzOjQ2LjcxOTA1MTk4OVoiLCJTZXEiOjU5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxOTgyMTk0MzUxMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEVBR0FJTiBFcnJvciBpbiBNb2R1bGUgUmVsb2NhdGlvbioqXG5cbk9rYXksIHNvIGlmIGBtb3ZlX21vZHVsZWAgaXMgYmFyZmluZyB3aXRoIGFuIGAtRUFHQUlOYCwgdGhlIGxpa2VseSBjdWxwcml0IGlzIHRoYXQgYGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25gIGFsc28gcmV0dXJuZWQgYC1FQUdBSU5gLiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aHkuIFJpZ2h0LCBgY29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbmAgY2FsbHMgYHJlc2VydmVfbW9kdWxlX3RhZ3NgLCB3aGljaCBpcyBpbiBgbW0vYWxsb2NfdGFnLmNgLiBMZXQncyBkaWcgaW50byB0aGF0IGByZXNlcnZlX21vZHVsZV90YWdzYCBmdW5jdGlvbi4gSSdsbCB0YWtlIGEgbG9vayBhdCB0aGUgY29kZTpcblxuYGBgY1xuXHRcdGlmICghdGFnc19hZGRyZXNzYWJsZSgpKSB7XG5cdFx0XHRzaHV0ZG93bl9tZW1fcHJvZmlsaW5nKHRydWUpO1xuXHRcdFx0cHJfd2Fybl9vbmNlKFwiV2l0aCBtb2R1bGUgJXMgdGhlcmUgYXJlIHRvbyBtYW55IHRhZ3MgdG8gZml0IGluICVkIHBhZ2UgZmxhZyBiaXRzLiBNZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgaXMgZGlzYWJsZWQhXFxuXCIsXG5cdFx0XHRcdCAgICAgbW9kLVx1MDAzZW5hbWUsIE5SX1VOVVNFRF9QQUdFRkxBR19CSVRTKTtcblx0XHRcdHJlbGVhc2VfbW9kdWxlX3RhZ3MobW9kLCBmYWxzZSk7XG5cdFx0XHRyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTtcblx0XHR9XG5gYGBcblxuQWgsIEkgc2VlLiBMb29rcyBsaWtlIHRoZSBtb2R1bGUgaXMgcmVxdWVzdGluZyB0b28gbWFueSB0YWdzLCB0byB0aGUgcG9pbnQgd2hlcmUgdGhleSBjYW4ndCBmaXQgaW50byB0aGUgYXZhaWxhYmxlIHBhZ2UgZmxhZyBiaXRzLiBUaGUgc3lzdGVtIHNodXRzIGRvd24gbWVtb3J5IHByb2ZpbGluZyB0byBhdm9pZCBhIHBvdGVudGlhbCBjYXRhc3Ryb3BoaWMgZmFpbHVyZSBhbmQgdGhlbiBpdCByZXR1cm5zIGAtRUFHQUlOYC4gVGhlIGNydWNpYWwgZGV0YWlsIGlzIHRoYXQgaXQgKmFsc28qIGNhbGxzIGByZWxlYXNlX21vZHVsZV90YWdzYCBhdCB0aGlzIHBvaW50LiBTbywgdGhlIG1vZHVsZSBpcyBlc3NlbnRpYWxseSBnaXZlbiB1cCBvbi5cblxuTm93LCBpZiBgbW92ZV9tb2R1bGVgIGdldHMgdGhpcyBgLUVBR0FJTmAsIGl0IGp1bXBzIHRvIGBvdXRfZXJyYCwgd2hpY2ggbWVhbnMgbWVtb3J5IGlzIGZyZWVkIGFuZCB0aGVuIGl0IGNhbGxzIGBjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKG1vZClgLiBOb3csIHRoZSBpbXBvcnRhbnQgcXVlc3Rpb24gaXM6IERvZXMgYGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNgICphbHNvKiBjYWxsIGByZWxlYXNlX21vZHVsZV90YWdzYD8gVGhhdCdzIHdoYXQgSSBuZWVkIHRvIGNvbmZpcm0uIEkgc2hvdWxkIGNoZWNrIGBjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zYCB0byBiZSBzdXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjQ5OCwiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI2MywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQ0OjA2LjU0MDk5OTMzWiIsIlNlcSI6NjAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDI0OTA2NjkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvY29kZXRhZy5oPTk0PXZvaWQgKmNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxcbi0tXFxuaW5jbHVkZS9saW51eC9jb2RldGFnLmgtOTYtXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBhbGlnbik7XFxuaW5jbHVkZS9saW51eC9jb2RldGFnLmg6OTc6dm9pZCBjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKHN0cnVjdCBtb2R1bGUgKm1vZCk7XFxuaW5jbHVkZS9saW51eC9jb2RldGFnLmgtOTgtdm9pZCBjb2RldGFnX21vZHVsZV9yZXBsYWNlZChzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBtb2R1bGUgKm5ld19tb2QpO1xcbi0tXFxuaW5jbHVkZS9saW51eC9jb2RldGFnLmg9MTA4PWNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxcbi0tXFxuaW5jbHVkZS9saW51eC9jb2RldGFnLmgtMTEwLVxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBhbGlnbikgeyByZXR1cm4gTlVMTDsgfVxcbmluY2x1ZGUvbGludXgvY29kZXRhZy5oOjExMTpzdGF0aWMgaW5saW5lIHZvaWQgY29kZXRhZ19mcmVlX21vZHVsZV9zZWN0aW9ucyhzdHJ1Y3QgbW9kdWxlICptb2QpIHt9XFxuaW5jbHVkZS9saW51eC9jb2RldGFnLmgtMTEyLXN0YXRpYyBpbmxpbmUgdm9pZCBjb2RldGFnX21vZHVsZV9yZXBsYWNlZChzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBtb2R1bGUgKm5ld19tb2QpIHt9XFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0yNzg4PXN0YXRpYyBpbnQgbW92ZV9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMjg3MS1cXHRpZiAoY29kZXRhZ19zZWN0aW9uX2ZvdW5kKVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI4NzI6XFx0XFx0Y29kZXRhZ19mcmVlX21vZHVsZV9zZWN0aW9ucyhtb2QpO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI4NzMtXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0zMDA0PXN0YXRpYyB2b2lkIG1vZHVsZV9kZWFsbG9jYXRlKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbylcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTMwMDctXFx0bW9kdWxlX2FyY2hfZnJlZWluZ19pbml0KG1vZCk7XFxua2VybmVsL21vZHVsZS9tYWluLmM6MzAwODpcXHRjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKG1vZCk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMzAwOS1cXG4tLVxcbmxpYi9jb2RldGFnLmM9MjgxPXZvaWQgKmNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxcbi0tXFxubGliL2NvZGV0YWcuYy0zMDUtXFxubGliL2NvZGV0YWcuYzozMDY6dm9pZCBjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKHN0cnVjdCBtb2R1bGUgKm1vZClcXG5saWIvY29kZXRhZy5jLTMwNy17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQ0OjA3Ljk2NTkxMDY1WiIsIlNlcSI6NjEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU2MDY1MzE4MzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDpcblxuKipEaXZpbmcgaW50byBgY29kZXRhZy5jYCoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBjaGVjayBvdXQgYGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNgIOKAkyBsb29rcyBsaWtlIHRoYXQncyB0aGUgZnVuY3Rpb24gSSBuZWVkIHRvIGZvY3VzIG9uIHJpZ2h0IG5vdy4gSXQncyBpbiBgbGliL2NvZGV0YWcuY2AsIHdoaWNoIG1ha2VzIHNlbnNlOyB0aGlzIHByb2JhYmx5IGRlYWxzIHdpdGggc29tZSBjb3JlIHJlc291cmNlIG1hbmFnZW1lbnQuIEknbSBndWVzc2luZyBpdCdzIHBhcnQgb2YgdGhlIGNsZWFudXAgYWZ0ZXIgYSBjb2RldGFnIG1vZHVsZSBpcyBkb25lIGJlaW5nIHVzZWQuIEknbGwgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBzZWN0aW9ucyBhcmUgYWxsb2NhdGVkIHdpdGhpbiBhIG1vZHVsZSwgYW5kIGhvdyB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMgZGVhbGxvY2F0aW9uIHRvIGF2b2lkIG1lbW9yeSBsZWFrcyBvciBkYW5nbGluZyBwb2ludGVycy4gTGV0J3MgZ2V0IHRvIHRoZSBjb2RlIGFuZCBzZWUgd2hhdCBpdCdzIHJlYWxseSBkb2luZy4gVGltZSB0byBwdXQgb24gbXkgZGVidWdnaW5nIGhhdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTM3NDUsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0NDoxMy41NzI0NDUzMDNaIiwiU2VxIjo2MiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Nzg4MzEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibGliL2NvZGV0YWcuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzMDYsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzMDY6XFx0dm9pZCBjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKHN0cnVjdCBtb2R1bGUgKm1vZClcXG4gMzA3OlxcdHtcXG4gMzA4OlxcdFxcdHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZTtcXG4gMzA5OlxcdFxcbiAzMTA6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2Y29kZXRhZ19sb2NrKTtcXG4gMzExOlxcdFxcdGxpc3RfZm9yX2VhY2hfZW50cnkoY3R0eXBlLCBcXHUwMDI2Y29kZXRhZ190eXBlcywgbGluaykge1xcbiAzMTI6XFx0XFx0XFx0aWYgKCFjdHR5cGUtXFx1MDAzZWRlc2MuZnJlZV9zZWN0aW9uX21lbSlcXG4gMzEzOlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbiAzMTQ6XFx0XFxuIDMxNTpcXHRcXHRcXHRkb3duX3dyaXRlKFxcdTAwMjZjdHR5cGUtXFx1MDAzZW1vZF9sb2NrKTtcXG4gMzE2OlxcdFxcdFxcdGN0dHlwZS1cXHUwMDNlZGVzYy5mcmVlX3NlY3Rpb25fbWVtKG1vZCwgZmFsc2UpO1xcbiAzMTc6XFx0XFx0XFx0dXBfd3JpdGUoXFx1MDAyNmN0dHlwZS1cXHUwMDNlbW9kX2xvY2spO1xcbiAzMTg6XFx0XFx0fVxcbiAzMTk6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZjb2RldGFnX2xvY2spO1xcbiAzMjA6XFx0fVxcbiAzMjE6XFx0XFxuIDMyMjpcXHR2b2lkIGNvZGV0YWdfbW9kdWxlX3JlcGxhY2VkKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IG1vZHVsZSAqbmV3X21vZClcXG4gMzIzOlxcdHtcXG4gMzI0OlxcdFxcdHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZTtcXG4gMzI1OlxcdFxcbiAzMjY6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2Y29kZXRhZ19sb2NrKTtcXG4gMzI3OlxcdFxcdGxpc3RfZm9yX2VhY2hfZW50cnkoY3R0eXBlLCBcXHUwMDI2Y29kZXRhZ190eXBlcywgbGluaykge1xcbiAzMjg6XFx0XFx0XFx0aWYgKCFjdHR5cGUtXFx1MDAzZWRlc2MubW9kdWxlX3JlcGxhY2VkKVxcbiAzMjk6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuIDMzMDpcXHRcXG4gMzMxOlxcdFxcdFxcdGRvd25fd3JpdGUoXFx1MDAyNmN0dHlwZS1cXHUwMDNlbW9kX2xvY2spO1xcbiAzMzI6XFx0XFx0XFx0Y3R0eXBlLVxcdTAwM2VkZXNjLm1vZHVsZV9yZXBsYWNlZChtb2QsIG5ld19tb2QpO1xcbiAzMzM6XFx0XFx0XFx0dXBfd3JpdGUoXFx1MDAyNmN0dHlwZS1cXHUwMDNlbW9kX2xvY2spO1xcbiAzMzQ6XFx0XFx0fVxcbiAzMzU6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZjb2RldGFnX2xvY2spO1xcbiAzMzY6XFx0fVxcbiAzMzc6XFx0XFxuIDMzODpcXHRpbnQgY29kZXRhZ19sb2FkX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QpXFxuIDMzOTpcXHR7XFxuIDM0MDpcXHRcXHRzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGU7XFxuIDM0MTpcXHRcXHRpbnQgcmV0ID0gMDtcXG4gMzQyOlxcdFxcbiAzNDM6XFx0XFx0aWYgKCFtb2QpXFxuIDM0NDpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gMzQ1OlxcdFxcbiAzNDY6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2Y29kZXRhZ19sb2NrKTtcXG4gMzQ3OlxcdFxcdGxpc3RfZm9yX2VhY2hfZW50cnkoY3R0eXBlLCBcXHUwMDI2Y29kZXRhZ190eXBlcywgbGluaykge1xcbiAzNDg6XFx0XFx0XFx0cmV0ID0gY29kZXRhZ19tb2R1bGVfaW5pdChjdHR5cGUsIG1vZCk7XFxuIDM0OTpcXHRcXHRcXHRpZiAocmV0KVxcbiAzNTA6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDM1MTpcXHRcXHR9XFxuIDM1MjpcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNmNvZGV0YWdfbG9jayk7XFxuIDM1MzpcXHRcXG4gMzU0OlxcdFxcdHJldHVybiByZXQ7XFxuIDM1NTpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQ0OjEzLjU3MjUyNTQ0M1oiLCJTZXEiOjYzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNjQyMjQ4MzgxMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNb2R1bGUgVGFnZ2luZyBhbmQgQWxsb2NhdGlvbiBMb2dpYyAtIEEgUXVpY2sgUmV2aWV3KipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBJdCBsb29rcyBsaWtlIGBjdHR5cGUtXHUwMDNlZGVzYy5mcmVlX3NlY3Rpb25fbWVtYCBpcyBzaW1wbHkgYHJlbGVhc2VfbW9kdWxlX3RhZ3NgLiBJIG5lZWQgdG8gYmUgY2FyZWZ1bCB3aXRoIHRoZSBkb3VibGUtZnJlZSBwb3RlbnRpYWwuIEluIGByZXNlcnZlX21vZHVsZV90YWdzYCwgaWYgdGhlcmUgYXJlIHRvbyBtYW55IHRhZ3MsIGl0IGRpc2FibGVzIG1lbW9yeSBwcm9maWxpbmcsIHdhcm5zLCBhbmQgY2FsbHMgYHJlbGVhc2VfbW9kdWxlX3RhZ3MobW9kLCBmYWxzZSlgLCByZXR1cm5pbmcgYC1FQUdBSU5gLiBUaGUgY3JpdGljYWwgcGF0aCBoZXJlIGlzIGlmIHRoaXMgbGVhZHMgdG8gYSByZXRyeS4gYG1vdmVfbW9kdWxlYCBqdW1wcyB0byBgb3V0X2VycmAsIHdoaWNoICpzaG91bGQqIGNhbGwgYGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnMobW9kKWAsIHdoaWNoIGl0c2VsZiBjYWxscyBgcmVsZWFzZV9tb2R1bGVfdGFncyhtb2QsIGZhbHNlKWAgYWdhaW4uIEhvd2V2ZXIsIGJhc2VkIG9uIHRoZSBzdHJ1Y3R1cmUgaGVyZSBpdCBzaG91bGRuJ3QgYmUgYW4gaXNzdWU6IGByZWxlYXNlX21vZHVsZV90YWdzYCBjaGVja3MgaWYgdGhlIG1vZHVsZSBpcyBmb3VuZCBpbiB0aGUgbWFwbGUgdHJlZSBgbW9kX2FyZWFfbXRgIGFuZCBpZiBpdCBpcyBub3QgaXQgYmFpbHMuXG5cbkxldCBtZSB0aGlua+KApiBpZiBgY29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbmAgcmV0dXJucyBgLUVBR0FJTmAsIHRoZW4gYGNvZGV0YWdfc2VjdGlvbl9mb3VuZGAgKm1pZ2h0KiBoYXZlIGJlZW4gc2V0LiBJbiBgbW92ZV9tb2R1bGVgLCBpZiBgY29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbmAgZmFpbHMgb24gdGhlIGZpcnN0IGNvZGV0YWcgc2VjdGlvbiwgYGNvZGV0YWdfc2VjdGlvbl9mb3VuZGAgaXMgZmFsc2UsIGFuZCBgY29kZXRhZ19mcmVlX21vZHVsZV9zZWN0aW9uc2AgaXNuJ3QgY2FsbGVkLiBJZiBpdCBmYWlscyBvbiB0aGUgc2Vjb25kIHNlY3Rpb24sIGl0ICppcyogY2FsbGVkLiBCdXQgc2luY2UgYHJlbGVhc2VfbW9kdWxlX3RhZ3NgIHJlbW92ZXMgdGhlIG1vZHVsZSBmcm9tIHRoZSBtYXBsZSB0cmVlLCB0aGUgc2Vjb25kIGNhbGwgdG8gaXQgd29uJ3QgZmluZCB0aGUgbW9kdWxlIGFuZCBub3RoaW5nIGJhZCB3aWxsIGhhcHBlbi4gSSB0aGluayB0aGUgZG91YmxlIGZyZWUgaXNzdWUgaXMgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIHN0YXRlLlxuXG5Ob3csIGxldCdzIHJlLWV4YW1pbmUgdGhhdCByZXRyeSBsb2dpYyBpbiBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAuIEl0J3MgYSBiaXQgdHJpY2t5LiBUaGUgY29kZSBmaXJzdCBsYXlzIG91dCB0aGUgc2VjdGlvbnMgYW5kIHN5bWJvbCB0YWJsZSwgdGhlbiBhdHRlbXB0cyB0byBtb3ZlIHRoZSBtb2R1bGUuIElmIHRoYXQgbW92ZSByZXR1cm5zIGAtRUFHQUlOYCwgaXQgcmV0cmllcy4gVGhlIGludGVyZXN0aW5nIHBhcnQgaGVyZSBpcyB3aGF0IGhhcHBlbnMgd2hlbiBpdCByZXRyaWVzLiBTaXplcyBhcmUgcmVzZXQsIGFuZCB0aGUgaGVhZGVycyBhcmUgcmV3cml0dGVuLiBTcGVjaWZpY2FsbHkgYGluZm8tXHUwMDNlbW9kLVx1MDAzZW1lbVt0eXBlXS5zaXplID0gMDtgIGFuZCBgaW5mby1cdTAwM2VzZWNoZHJzW2luZm8tXHUwMDNlaW5kZXguc3ltXS5zaF9mbGFncyBcdTAwMjY9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7YC5cblxuSXMgdGhlcmUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJlaW5nIGV4cG9zZWQ/IGBpbmZvLVx1MDAzZW1vZC1cdTAwM2VtZW1bdHlwZV0uc2l6ZSA9IDBgIGNsZWFycyB0aGUgc2l6ZXMuIGBsYXlvdXRfc2VjdGlvbnNgIHJlY2FsY3VsYXRlcyB0aGVzZSBzaXplcy4gYHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzYCByZXNldHMgYHNoX2FkZHJgIHRvIHRoZSB0ZW1wb3JhcnkgaW1hZ2UuIEkgdGhpbmsgdGhhdCBpcyBvay4gV2FpdCwgYGxheW91dF9zZWN0aW9uc2Agc2V0cyBgc2hfZW50c2l6ZWAgdG8gYH4wVUxgIGFuZCB0aGVuIGNhbGxzIGBfX2xheW91dF9zZWN0aW9uc2AuIGBfX2xheW91dF9zZWN0aW9uc2AgY2FsY3VsYXRlcyBvZmZzZXRzIGFuZCBzZXRzIGBzaF9lbnRzaXplYC4gSXMgdGhlcmUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBOby4gSXQgZG9lc24ndCBzZWVtIHRvIGV4cG9zZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnksIG5vciBkb2VzIGl0IHVzZSB1bmluaXRpYWxpemVkIG1lbW9yeSBmb3IgY29udHJvbCBmbG93LiBUaGUgYGluZm9gIHN0cnVjdCBpcyBmdWxseSBpbml0aWFsaXplZCBhdCB0aGlzIHBvaW50LlxuXG5BaGEhIGBpbmZvLVx1MDAzZXNlY2hkcnNbaW5mby1cdTAwM2VpbmRleC5zeW1dLnNoX2ZsYWdzIFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztgIGNsZWFycyB0aGUgYFNIRl9BTExPQ2AgZmxhZyBmcm9tIHRoZSBzeW1ib2wgdGFibGUgYW5kIHN0cmluZyB0YWJsZSBzZWN0aW9ucy4gV2h5PyBJIG5lZWQgdG8gY2hlY2sgYGxheW91dF9zeW10YWJgIHRvIHVuZGVyc3RhbmQgdGhpcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ2NjIsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDkyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDQ6MjkuOTk1MDEyMTU1WiIsIlNlcSI6NjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0Mzk3OTIxNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJsYXlvdXRfc3ltdGFiXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9tb2R1bGUvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9tb2R1bGUvaW50ZXJuYWwuaD0zNTY9dm9pZCBpbml0X2J1aWxkX2lkKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3Qgc3RydWN0IGxvYWRfaW5mbyAqaW5mbyk7XFxua2VybmVsL21vZHVsZS9pbnRlcm5hbC5oOjM1Nzp2b2lkIGxheW91dF9zeW10YWIoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKTtcXG5rZXJuZWwvbW9kdWxlL2ludGVybmFsLmgtMzU4LXZvaWQgYWRkX2thbGxzeW1zKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3Qgc3RydWN0IGxvYWRfaW5mbyAqaW5mbyk7XFxuLS1cXG5rZXJuZWwvbW9kdWxlL2ludGVybmFsLmg9MzY1PXN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2J1aWxkX2lkKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3Qgc3RydWN0IGxvYWRfaW5mbyAqaW5mbykgeyB9XFxua2VybmVsL21vZHVsZS9pbnRlcm5hbC5oOjM2NjpzdGF0aWMgaW5saW5lIHZvaWQgbGF5b3V0X3N5bXRhYihzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pIHsgfVxcbmtlcm5lbC9tb2R1bGUvaW50ZXJuYWwuaC0zNjctc3RhdGljIGlubGluZSB2b2lkIGFkZF9rYWxsc3ltcyhzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IHN0cnVjdCBsb2FkX2luZm8gKmluZm8pIHsgfVxcbi0tXFxua2VybmVsL21vZHVsZS9rYWxsc3ltcy5jPTc4PXN0YXRpYyBib29sIGlzX2NvcmVfc3ltYm9sKGNvbnN0IEVsZl9TeW0gKnNyYywgY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMsXFxuLS1cXG5rZXJuZWwvbW9kdWxlL2thbGxzeW1zLmMtMTEyLSAqL1xcbmtlcm5lbC9tb2R1bGUva2FsbHN5bXMuYzoxMTM6dm9pZCBsYXlvdXRfc3ltdGFiKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbylcXG5rZXJuZWwvbW9kdWxlL2thbGxzeW1zLmMtMTE0LXtcXG4tLVxcbmtlcm5lbC9tb2R1bGUva2FsbHN5bXMuYy0xNjUtLypcXG5rZXJuZWwvbW9kdWxlL2thbGxzeW1zLmM6MTY2OiAqIFdlIHVzZSB0aGUgZnVsbCBzeW10YWIgYW5kIHN0cnRhYiB3aGljaCBsYXlvdXRfc3ltdGFiIGFycmFuZ2VkIHRvXFxua2VybmVsL21vZHVsZS9rYWxsc3ltcy5jLTE2Ny0gKiBiZSBhcHBlbmRlZCB0byB0aGUgaW5pdCBzZWN0aW9uLiAgTGF0ZXIgd2Ugc3dpdGNoIHRvIHRoZSBjdXQtZG93blxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmM9Mjk0Mz1zdGF0aWMgc3RydWN0IG1vZHVsZSAqbGF5b3V0X2FuZF9hbGxvY2F0ZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTc1LVxcdGxheW91dF9zZWN0aW9ucyhpbmZvLVxcdTAwM2Vtb2QsIGluZm8pO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI5NzY6XFx0bGF5b3V0X3N5bXRhYihpbmZvLVxcdTAwM2Vtb2QsIGluZm8pO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5NzctXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQ0OjMwLjAzODk5ODU5MloiLCJTZXEiOjY1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo5NDgwNDM0NjgxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkFuYWx5emluZyB0aGUgYGxheW91dF9zeW10YWJgIEZ1bmN0aW9uKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgYGxheW91dF9zeW10YWJgIGZ1bmN0aW9uLiBJJ20gaW1tZWRpYXRlbHkgdGhpbmtpbmcgYWJvdXQgaG93IGl0IGZpdHMgaW50byB0aGUgb3ZlcmFsbCBzeW1ib2wgdGFibGUgbWFuYWdlbWVudCBzY2hlbWUuIFdoYXQgbGV2ZWwgb2YgYWJzdHJhY3Rpb24gaXMgaXQgd29ya2luZyBhdD8gSXMgaXQgYSBsb3ctbGV2ZWwgcm91dGluZSBkZWFsaW5nIHdpdGggcmF3IHN0cnVjdHVyZXMsIG9yIHNvbWV0aGluZyBtb3JlIGhpZ2gtbGV2ZWwsIHBlcmhhcHMgY29vcmRpbmF0aW5nIHNldmVyYWwgbG93ZXItbGV2ZWwgY2FsbHM/IFRoZSBuYW1lIHN1Z2dlc3RzIGl0J3MgaW52b2x2ZWQgaW4gdGhlIGxheW91dCBvZiB0aGUgc3ltYm9sIHRhYmxlLCB3aGljaCB1c3VhbGx5IGltcGxpZXMgbWVtb3J5IGFsbG9jYXRpb24gb3IgYXJyYW5nZW1lbnQgb2Ygc3ltYm9sIGVudHJpZXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBpbnB1dHMg4oCTIHdoYXQgZGF0YSBzdHJ1Y3R1cmVzIGRvZXMgaXQgb3BlcmF0ZSBvbj8gQXJlIHdlIHRhbGtpbmcgYWJvdXQgYSBjb21wbGV0ZSBzeW1ib2wgdGFibGUgc3RydWN0dXJlLCBpbmRpdmlkdWFsIHN5bWJvbCBlbnRyaWVzLCBvciBzb21ldGhpbmcgaW4gYmV0d2VlbiwgbGlrZSBhIHRhYmxlIG9mIHN5bWJvbCBidWNrZXRzPyBXaGF0IGFyZSB0aGUgY2FsbGluZyBjb252ZW50aW9ucz8gQXJlIHdlIGRlYWxpbmcgd2l0aCBzb21ldGhpbmcgbGlrZSBhIHNwZWNpZmljIHN5bWJvbCB0YWJsZSBpbXBsZW1lbnRhdGlvbiB3aXRoaW4gYSBjb21waWxlciBvciBsaW5rZXIsIHBlcmhhcHMgdGllZCB0byBhIHBhcnRpY3VsYXIgdGFyZ2V0IGFyY2hpdGVjdHVyZT8gSSBuZWVkIHRvIGxvb2sgZm9yIGFueSBpbmRpY2F0aW9ucyBhYm91dCB0aGUgc2NvcGUgb2YgdGhlIGxheW91dCAtIGlzIGl0IGdsb2JhbCwgcGVyLWNvbXBpbGF0aW9uLXVuaXQsIHBlci1vYmplY3QtZmlsZT8gVGhlIGNvbnRleHQgd2lsbCBiZSBrZXkgaGVyZS4gRmluYWxseSwgSSdtIGV4cGVjdGluZyBzb21lIGtpbmQgb2Ygb3V0cHV0LCBsaWtlbHkgdGhlIG1vZGlmaWVkIGRhdGEgc3RydWN0dXJlcyByZXByZXNlbnRpbmcgdGhlIGxhaWQtb3V0IHN5bWJvbCB0YWJsZSBvciBwb3NzaWJseSwgdXBkYXRlcyB0byBleHRlcm5hbCBkYXRhIHN1Y2ggYXMgYWxsb2NhdGVkIG9mZnNldHMgb3IgcG9pbnRlcnMuIE5vdywgbGV0J3MgZ2V0IGludG8gdGhlIGRldGFpbHMgb2YgdGhlIGNvZGUgYW5kIHNlZSBpZiBteSBhc3N1bXB0aW9ucyBhbGlnbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTcwMDIsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0NDozOS41MTk0MzY0NzNaIiwiU2VxIjo2NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODgwNDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL21vZHVsZS9rYWxsc3ltcy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDExMyxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDExMzpcXHR2b2lkIGxheW91dF9zeW10YWIoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxcbiAxMTQ6XFx0e1xcbiAxMTU6XFx0XFx0RWxmX1NoZHIgKnN5bXNlY3QgPSBpbmZvLVxcdTAwM2VzZWNoZHJzICsgaW5mby1cXHUwMDNlaW5kZXguc3ltO1xcbiAxMTY6XFx0XFx0RWxmX1NoZHIgKnN0cnNlY3QgPSBpbmZvLVxcdTAwM2VzZWNoZHJzICsgaW5mby1cXHUwMDNlaW5kZXguc3RyO1xcbiAxMTc6XFx0XFx0Y29uc3QgRWxmX1N5bSAqc3JjO1xcbiAxMTg6XFx0XFx0dW5zaWduZWQgaW50IGksIG5zcmMsIG5kc3QsIHN0cnRhYl9zaXplID0gMDtcXG4gMTE5OlxcdFxcdHN0cnVjdCBtb2R1bGVfbWVtb3J5ICptb2RfbWVtX2RhdGEgPSBcXHUwMDI2bW9kLVxcdTAwM2VtZW1bTU9EX0RBVEFdO1xcbiAxMjA6XFx0XFx0c3RydWN0IG1vZHVsZV9tZW1vcnkgKm1vZF9tZW1faW5pdF9kYXRhID0gXFx1MDAyNm1vZC1cXHUwMDNlbWVtW01PRF9JTklUX0RBVEFdO1xcbiAxMjE6XFx0XFxuIDEyMjpcXHRcXHQvKiBQdXQgc3ltYm9sIHNlY3Rpb24gYXQgZW5kIG9mIGluaXQgcGFydCBvZiBtb2R1bGUuICovXFxuIDEyMzpcXHRcXHRzeW1zZWN0LVxcdTAwM2VzaF9mbGFncyB8PSBTSEZfQUxMT0M7XFxuIDEyNDpcXHRcXHRzeW1zZWN0LVxcdTAwM2VzaF9lbnRzaXplID0gbW9kdWxlX2dldF9vZmZzZXRfYW5kX3R5cGUobW9kLCBNT0RfSU5JVF9EQVRBLFxcbiAxMjU6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0IHN5bXNlY3QsIGluZm8tXFx1MDAzZWluZGV4LnN5bSk7XFxuIDEyNjpcXHRcXHRwcl9kZWJ1ZyhcXFwiXFxcXHQlc1xcXFxuXFxcIiwgaW5mby1cXHUwMDNlc2Vjc3RyaW5ncyArIHN5bXNlY3QtXFx1MDAzZXNoX25hbWUpO1xcbiAxMjc6XFx0XFxuIDEyODpcXHRcXHRzcmMgPSAodm9pZCAqKWluZm8tXFx1MDAzZWhkciArIHN5bXNlY3QtXFx1MDAzZXNoX29mZnNldDtcXG4gMTI5OlxcdFxcdG5zcmMgPSBzeW1zZWN0LVxcdTAwM2VzaF9zaXplIC8gc2l6ZW9mKCpzcmMpO1xcbiAxMzA6XFx0XFxuIDEzMTpcXHRcXHQvKiBDb21wdXRlIHRvdGFsIHNwYWNlIHJlcXVpcmVkIGZvciB0aGUgY29yZSBzeW1ib2xzJyBzdHJ0YWIuICovXFxuIDEzMjpcXHRcXHRmb3IgKG5kc3QgPSBpID0gMDsgaSBcXHUwMDNjIG5zcmM7IGkrKykge1xcbiAxMzM6XFx0XFx0XFx0aWYgKGkgPT0gMCB8fCBpc19saXZlcGF0Y2hfbW9kdWxlKG1vZCkgfHxcXG4gMTM0OlxcdFxcdFxcdCAgICBpc19jb3JlX3N5bWJvbChzcmMgKyBpLCBpbmZvLVxcdTAwM2VzZWNoZHJzLCBpbmZvLVxcdTAwM2VoZHItXFx1MDAzZWVfc2hudW0sXFxuIDEzNTpcXHRcXHRcXHRcXHRcXHQgICBpbmZvLVxcdTAwM2VpbmRleC5wY3B1KSkge1xcbiAxMzY6XFx0XFx0XFx0XFx0c3RydGFiX3NpemUgKz0gc3RybGVuKFxcdTAwMjZpbmZvLVxcdTAwM2VzdHJ0YWJbc3JjW2ldLnN0X25hbWVdKSArIDE7XFxuIDEzNzpcXHRcXHRcXHRcXHRuZHN0Kys7XFxuIDEzODpcXHRcXHRcXHR9XFxuIDEzOTpcXHRcXHR9XFxuIDE0MDpcXHRcXG4gMTQxOlxcdFxcdC8qIEFwcGVuZCByb29tIGZvciBjb3JlIHN5bWJvbHMgYXQgZW5kIG9mIGNvcmUgcGFydC4gKi9cXG4gMTQyOlxcdFxcdGluZm8tXFx1MDAzZXN5bW9mZnMgPSBBTElHTihtb2RfbWVtX2RhdGEtXFx1MDAzZXNpemUsIHN5bXNlY3QtXFx1MDAzZXNoX2FkZHJhbGlnbiA/OiAxKTtcXG4gMTQzOlxcdFxcdGluZm8tXFx1MDAzZXN0cm9mZnMgPSBtb2RfbWVtX2RhdGEtXFx1MDAzZXNpemUgPSBpbmZvLVxcdTAwM2VzeW1vZmZzICsgbmRzdCAqIHNpemVvZihFbGZfU3ltKTtcXG4gMTQ0OlxcdFxcdG1vZF9tZW1fZGF0YS1cXHUwMDNlc2l6ZSArPSBzdHJ0YWJfc2l6ZTtcXG4gMTQ1OlxcdFxcdC8qIE5vdGUgYWRkX2thbGxzeW1zKCkgY29tcHV0ZXMgc3RydGFiX3NpemUgYXMgY29yZV90eXBlb2ZmcyAtIHN0cm9mZnMgKi9cXG4gMTQ2OlxcdFxcdGluZm8tXFx1MDAzZWNvcmVfdHlwZW9mZnMgPSBtb2RfbWVtX2RhdGEtXFx1MDAzZXNpemU7XFxuIDE0NzpcXHRcXHRtb2RfbWVtX2RhdGEtXFx1MDAzZXNpemUgKz0gbmRzdCAqIHNpemVvZihjaGFyKTtcXG4gMTQ4OlxcdFxcbiAxNDk6XFx0XFx0LyogUHV0IHN0cmluZyB0YWJsZSBzZWN0aW9uIGF0IGVuZCBvZiBpbml0IHBhcnQgb2YgbW9kdWxlLiAqL1xcbiAxNTA6XFx0XFx0c3Ryc2VjdC1cXHUwMDNlc2hfZmxhZ3MgfD0gU0hGX0FMTE9DO1xcbiAxNTE6XFx0XFx0c3Ryc2VjdC1cXHUwMDNlc2hfZW50c2l6ZSA9IG1vZHVsZV9nZXRfb2Zmc2V0X2FuZF90eXBlKG1vZCwgTU9EX0lOSVRfREFUQSxcXG4gMTUyOlxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCBzdHJzZWN0LCBpbmZvLVxcdTAwM2VpbmRleC5zdHIpO1xcbiAxNTM6XFx0XFx0cHJfZGVidWcoXFxcIlxcXFx0JXNcXFxcblxcXCIsIGluZm8tXFx1MDAzZXNlY3N0cmluZ3MgKyBzdHJzZWN0LVxcdTAwM2VzaF9uYW1lKTtcXG4gMTU0OlxcdFxcbiAxNTU6XFx0XFx0LyogV2UnbGwgdGFjayB0ZW1wb3JhcnkgbW9kX2thbGxzeW1zIG9uIHRoZSBlbmQuICovXFxuIDE1NjpcXHRcXHRtb2RfbWVtX2luaXRfZGF0YS1cXHUwMDNlc2l6ZSA9IEFMSUdOKG1vZF9tZW1faW5pdF9kYXRhLVxcdTAwM2VzaXplLFxcbiAxNTc6XFx0XFx0XFx0XFx0XFx0XFx0X19hbGlnbm9mX18oc3RydWN0IG1vZF9rYWxsc3ltcykpO1xcbiAxNTg6XFx0XFx0aW5mby1cXHUwMDNlbW9kX2thbGxzeW1zX2luaXRfb2ZmID0gbW9kX21lbV9pbml0X2RhdGEtXFx1MDAzZXNpemU7XFxuIDE1OTpcXHRcXG4gMTYwOlxcdFxcdG1vZF9tZW1faW5pdF9kYXRhLVxcdTAwM2VzaXplICs9IHNpemVvZihzdHJ1Y3QgbW9kX2thbGxzeW1zKTtcXG4gMTYxOlxcdFxcdGluZm8tXFx1MDAzZWluaXRfdHlwZW9mZnMgPSBtb2RfbWVtX2luaXRfZGF0YS1cXHUwMDNlc2l6ZTtcXG4gMTYyOlxcdFxcdG1vZF9tZW1faW5pdF9kYXRhLVxcdTAwM2VzaXplICs9IG5zcmMgKiBzaXplb2YoY2hhcik7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQ0OjM5LjUxOTUyNTgxM1oiLCJTZXEiOjY3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMDA5MDkyMzY4NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgUG90ZW50aWFsIE1lbW9yeSBVbmluaXRpYWxpemF0aW9uIGluIFNlY3Rpb24gTGF5b3V0KipcblxuT2theSwgc28gYGxheW91dF9zeW10YWJgIGlzIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHRoZSBgU0hGX0FMTE9DYCBmbGFnIG9uIHRoZSBzeW1ib2wgc2VjdGlvbiAoYHN5bXNlY3RgKSBhbmQgdGhlIHN0cmluZyBzZWN0aW9uIChgc3Ryc2VjdGApLiBJdCBhbHNvIGZpZ3VyZXMgb3V0IHNpemVzIGFuZCBvZmZzZXRzLCB3aGljaCBpcyBhIGtleSBwYXJ0IG9mIG1lbW9yeSBsYXlvdXQuIE5vdywgaWYgYGxheW91dF9hbmRfYWxsb2NhdGVgIG5lZWRzIHRvIHJldHJ5LCBpdCBmaXJzdCAqY2xlYXJzKiB0aGUgYFNIRl9BTExPQ2AgZmxhZyBhbmQgcmVzZXRzIHRob3NlIHNlY3Rpb24gc2l6ZXMgdG8gemVyby4gVGhlbiBgbGF5b3V0X3NlY3Rpb25zYCBhbmQgYGxheW91dF9zeW10YWJgIGdldCBjYWxsZWQgYWdhaW4uXG5cbk15IGltbWVkaWF0ZSBjb25jZXJuIGlzOiBJcyB0aGVyZSBhIHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gc25lYWsgaW4gaGVyZT8gV2UncmUgcmVzZXR0aW5nIHNpemVzIHRvIHplcm8gZHVyaW5nIHJldHJpZXMsIGJ1dCB3aGF0IGFib3V0IHRoZSBhY3R1YWwgY29udGVudHM/IEJ1dCB3YWl0LCBubywgYmVjYXVzZSBgaW5mby1cdTAwM2Vtb2QtXHUwMDNlbWVtW3R5cGVdLnNpemVgICppcyogcmVzZXQgdG8gemVyby4gVGhhdCBtYWtlcyBzZW5zZSwgYmVjYXVzZSBgbGF5b3V0X3NlY3Rpb25zYCBhbmQgdGhlbiBgbGF5b3V0X3N5bXRhYmAgcmVjYWxjdWxhdGUgdGhlIHNpemVzIGNvcnJlY3RseS4gVGhlbiBgbW92ZV9tb2R1bGVgIGdvZXMgdG8gYWxsb2NhdGUgbWVtb3J5IGJhc2VkIG9uIHRoZXNlICpuZXcqIHNpemVzLlxuXG5UaGUgYWxsb2NhdGlvbiB1c2VzIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCwgd2hpY2ggaW4gdHVybiBjYWxscyBgbW9kdWxlX2FsbG9jYCBvciBgdm1hbGxvY2AuIFRoYXQgbWFrZXMgbWUgYSBsaXR0bGUgdW5lYXN5IGJlY2F1c2UgSSBrbm93IGBtb2R1bGVfbWVtb3J5X2FsbG9jYCB1bHRpbWF0ZWx5IHVzZXMgdGhpbmdzIGxpa2UgYGV4ZWNtZW1fYWxsb2NgIG9yIHNpbWlsYXIsIGFuZCB0aG9zZSAqbWlnaHQqIG5vdCB6ZXJvLWluaXRpYWxpemUgdGhlIGFsbG9jYXRlZCBtZW1vcnkuIEhvd2V2ZXIsIGBtb3ZlX21vZHVsZWAgc2VlbXMgdG8gY29weSB0aGUgc2VjdGlvbiBkYXRhIGZyb20gYSB0ZW1wb3JhcnkgaW1hZ2UgdG8gdGhlIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkuXG5cbkxvb2tpbmcgYXQgdGhlIGNvZGUsIHNwZWNpZmljYWxseSB0aGUgbG9vcCB0aGF0IGNvcGllcyB0aGUgc2VjdGlvbnM6XG5cbmBgYGNcblx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBpbmZvLVx1MDAzZWhkci1cdTAwM2VlX3NobnVtOyBpKyspIHtcblx0XHRcdC8vIC4uLlxuXHRcdFx0aWYgKHNoZHItXHUwMDNlc2hfdHlwZSAhPSBTSFRfTk9CSVRTKSB7XG5cdFx0XHRcdC8vIC4uLlxuXHRcdFx0XHRtZW1jcHkoZGVzdCwgKHZvaWQgKilzaGRyLVx1MDAzZXNoX2FkZHIsIHNoZHItXHUwMDNlc2hfc2l6ZSk7XG5cdFx0XHR9XG5gYGBcblxuU28sIGl0ICpjb3BpZXMqIGNvbnRlbnQgaWYgdGhlIHNlY3Rpb24gdHlwZSBpcyAqbm90KiBgU0hUX05PQklUU2AuIFRoYXQncyBnb29kLCBiZWNhdXNlIGFueSBhY3R1YWwgZGF0YSBpcyBiZWluZyBwcm9wZXJseSB0cmFuc2ZlcnJlZC4gSG93ZXZlciwgZm9yIGBTSFRfTk9CSVRTYCBzZWN0aW9ucyAobGlrZSB0aGUgQlNTKSwgbm90aGluZyBpcyBjb3BpZWQuIFRoYXQncyBleGFjdGx5IHdoZXJlIEkgbmVlZCB0byB6ZXJvIG91dCBtZW1vcnkgaWYgdGhlcmUncyBubyBkZWZpbmVkIHNlY3Rpb24gY29udGVudHMuIFNvIG15IGxpbmdlcmluZyB3b3JyeSBpcyBkb2VzIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCB6ZXJvIG91dCB0aGF0IG1lbW9yeSBvbiBpdHMgb3duPyBJdCdzIGVzc2VudGlhbCB0byBjaGVjayB0aGUgaW1wbGVtZW50YXRpb24gb2YgYG1vZHVsZV9tZW1vcnlfYWxsb2NgIG1vcmUgY2xvc2VseSB0byBiZSBjZXJ0YWluLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxODQwNywiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM2OCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQ0OjQ5LjYxMDQ1MTY5WiIsIlNlcSI6NjgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NjQxNDU1NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtb2R1bGVfbWVtb3J5X2FsbG9jXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9tb2R1bGUvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9tb2R1bGUvbWFpbi5jPTEzMzc9dm9pZCBfX3dlYWsgbW9kdWxlX2FyY2hfZnJlZWluZ19pbml0KHN0cnVjdCBtb2R1bGUgKm1vZClcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTEzNDAtXFxua2VybmVsL21vZHVsZS9tYWluLmM6MTM0MTpzdGF0aWMgaW50IG1vZHVsZV9tZW1vcnlfYWxsb2Moc3RydWN0IG1vZHVsZSAqbW9kLCBlbnVtIG1vZF9tZW1fdHlwZSB0eXBlKVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTEzNDIte1xcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmM9Mjc4OD1zdGF0aWMgaW50IG1vdmVfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbylcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI3OTktXFxua2VybmVsL21vZHVsZS9tYWluLmM6MjgwMDpcXHRcXHRyZXQgPSBtb2R1bGVfbWVtb3J5X2FsbG9jKG1vZCwgdHlwZSk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMjgwMS1cXHRcXHRpZiAocmV0KSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQ0OjQ5LjY1Njg3NjM4N1oiLCJTZXEiOjY5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1NDAyNDUyMzA5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHRha2Ugb24gdW5kZXJzdGFuZGluZyB0aGlzIGNvZGU6XG5cbioqQW5hbHl6aW5nIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCoqXG5cbkFscmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGl0LiBJJ20gZ29pbmcgdG8gc3RhcnQgYnkgdGFraW5nIGEgY2xvc2UgbG9vayBhdCB0aGlzIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCBtb2R1bGUuIEFzIGFuIGV4cGVydCBpbiBteSBmaWVsZCwgSSBrbm93IHRoZSBzaWduaWZpY2FuY2Ugb2YgbWVtb3J5IGFsbG9jYXRpb24gYW5kIG1hbmFnZW1lbnQsIHNvIHRoaXMgaXMgd2hlcmUgSSdsbCBiZSBmb2N1c2luZy4gTXkgaW5pdGlhbCB0aG91Z2h0IHByb2Nlc3MgaXMgdG8gdW5kZXJzdGFuZCBpdHMgcHVycG9zZSB3aXRoaW4gdGhlIGJyb2FkZXIgc3lzdGVtLiBXaGF0J3MgaXQgZG9pbmc/IElzIGl0IGhhbmRsaW5nIGR5bmFtaWMgbWVtb3J5LCBzdGF0aWMgYWxsb2NhdGlvbiwgb3IgYSBtaXg/IFdoYXQga2luZCBvZiBkYXRhIHN0cnVjdHVyZXMgYXJlIGJlaW5nIHVzZWQgdG8gdHJhY2sgbWVtb3J5IGJsb2Nrcz8gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIHNjb3BlIG9mIGl0cyByZXNwb25zaWJpbGl0aWVzLiBJcyBpdCBhIGNvcmUgY29tcG9uZW50IG9yIGEgdXRpbGl0eSBtb2R1bGU/IFdoYXQgYXJlIGl0cyBkZXBlbmRlbmNpZXM/IEknbGwgcHJvYmFibHkgYmUgYXNraW5nIG15c2VsZiB0aGVzZSBxdWVzdGlvbnMgYXMgSSBnby4gVWx0aW1hdGVseSwgSSdtIGV4cGVjdGluZyB0aGlzIGlzIGFsbCBhYm91dCB1bmRlcnN0YW5kaW5nIG1lbW9yeSBtYW5hZ2VtZW50IHN0cmF0ZWd5LiBMZXQncyBkaWcgaW4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5NTM3LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDQ6NTUuMDU5MzMxODQ2WiIsIlNlcSI6NzAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MzE4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvbW9kdWxlL21haW4uY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMzQxLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMzQxOlxcdHN0YXRpYyBpbnQgbW9kdWxlX21lbW9yeV9hbGxvYyhzdHJ1Y3QgbW9kdWxlICptb2QsIGVudW0gbW9kX21lbV90eXBlIHR5cGUpXFxuMTM0MjpcXHR7XFxuMTM0MzpcXHRcXHR1bnNpZ25lZCBpbnQgc2l6ZSA9IFBBR0VfQUxJR04obW9kLVxcdTAwM2VtZW1bdHlwZV0uc2l6ZSk7XFxuMTM0NDpcXHRcXHRlbnVtIGV4ZWNtZW1fdHlwZSBleGVjbWVtX3R5cGU7XFxuMTM0NTpcXHRcXHR2b2lkICpwdHI7XFxuMTM0NjpcXHRcXG4xMzQ3OlxcdFxcdG1vZC1cXHUwMDNlbWVtW3R5cGVdLnNpemUgPSBzaXplO1xcbjEzNDg6XFx0XFxuMTM0OTpcXHRcXHRpZiAobW9kX21lbV90eXBlX2lzX2RhdGEodHlwZSkpXFxuMTM1MDpcXHRcXHRcXHRleGVjbWVtX3R5cGUgPSBFWEVDTUVNX01PRFVMRV9EQVRBO1xcbjEzNTE6XFx0XFx0ZWxzZVxcbjEzNTI6XFx0XFx0XFx0ZXhlY21lbV90eXBlID0gRVhFQ01FTV9NT0RVTEVfVEVYVDtcXG4xMzUzOlxcdFxcbjEzNTQ6XFx0XFx0cHRyID0gZXhlY21lbV9hbGxvY19ydyhleGVjbWVtX3R5cGUsIHNpemUpO1xcbjEzNTU6XFx0XFx0aWYgKCFwdHIpXFxuMTM1NjpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4xMzU3OlxcdFxcbjEzNTg6XFx0XFx0bW9kLVxcdTAwM2VtZW1bdHlwZV0uaXNfcm94ID0gZXhlY21lbV9pc19yb3goZXhlY21lbV90eXBlKTtcXG4xMzU5OlxcdFxcbjEzNjA6XFx0XFx0LypcXG4xMzYxOlxcdFxcdCAqIFRoZSBwb2ludGVyIHRvIHRoZXNlIGJsb2NrcyBvZiBtZW1vcnkgYXJlIHN0b3JlZCBvbiB0aGUgbW9kdWxlXFxuMTM2MjpcXHRcXHQgKiBzdHJ1Y3R1cmUgYW5kIHdlIGtlZXAgdGhhdCBhcm91bmQgc28gbG9uZyBhcyB0aGUgbW9kdWxlIGlzXFxuMTM2MzpcXHRcXHQgKiBhcm91bmQuIFdlIG9ubHkgZnJlZSB0aGF0IG1lbW9yeSB3aGVuIHdlIHVubG9hZCB0aGUgbW9kdWxlLlxcbjEzNjQ6XFx0XFx0ICogSnVzdCBtYXJrIHRoZW0gYXMgbm90IGJlaW5nIGEgbGVhayB0aGVuLiBUaGUgLmluaXQqIEVMRlxcbjEzNjU6XFx0XFx0ICogc2VjdGlvbnMgKmRvKiBnZXQgZnJlZWQgYWZ0ZXIgYm9vdCBzbyB3ZSAqY291bGQqIHRyZWF0IHRoZW1cXG4xMzY2OlxcdFxcdCAqIHNsaWdodGx5IGRpZmZlcmVudGx5IHdpdGgga21lbWxlYWtfaWdub3JlKCkgYW5kIG9ubHkgZ3JleVxcbjEzNjc6XFx0XFx0ICogdGhlbSBvdXQgYXMgdGhleSB3b3JrIGFzIHR5cGljYWwgbWVtb3J5IGFsbG9jYXRpb25zIHdoaWNoXFxuMTM2ODpcXHRcXHQgKiAqZG8qIGV2ZW50dWFsbHkgZ2V0IGZyZWVkLCBidXQgbGV0J3MganVzdCBrZWVwIHRoaW5ncyBzaW1wbGVcXG4xMzY5OlxcdFxcdCAqIGFuZCBhdm9pZCAqYW55KiBmYWxzZSBwb3NpdGl2ZXMuXFxuMTM3MDpcXHRcXHQgKi9cXG4xMzcxOlxcdFxcdGlmICghbW9kLVxcdTAwM2VtZW1bdHlwZV0uaXNfcm94KVxcbjEzNzI6XFx0XFx0XFx0a21lbWxlYWtfbm90X2xlYWsocHRyKTtcXG4xMzczOlxcdFxcbjEzNzQ6XFx0XFx0bWVtc2V0KHB0ciwgMCwgc2l6ZSk7XFxuMTM3NTpcXHRcXHRtb2QtXFx1MDAzZW1lbVt0eXBlXS5iYXNlID0gcHRyO1xcbjEzNzY6XFx0XFxuMTM3NzpcXHRcXHRyZXR1cm4gMDtcXG4xMzc4OlxcdH1cXG4xMzc5OlxcdFxcbjEzODA6XFx0c3RhdGljIHZvaWQgbW9kdWxlX21lbW9yeV9yZXN0b3JlX3JveChzdHJ1Y3QgbW9kdWxlICptb2QpXFxuMTM4MTpcXHR7XFxuMTM4MjpcXHRcXHRmb3JfY2xhc3NfbW9kX21lbV90eXBlKHR5cGUsIHRleHQpIHtcXG4xMzgzOlxcdFxcdFxcdHN0cnVjdCBtb2R1bGVfbWVtb3J5ICptZW0gPSBcXHUwMDI2bW9kLVxcdTAwM2VtZW1bdHlwZV07XFxuMTM4NDpcXHRcXG4xMzg1OlxcdFxcdFxcdGlmIChtZW0tXFx1MDAzZWlzX3JveClcXG4xMzg2OlxcdFxcdFxcdFxcdGV4ZWNtZW1fcmVzdG9yZV9yb3gobWVtLVxcdTAwM2ViYXNlLCBtZW0tXFx1MDAzZXNpemUpO1xcbjEzODc6XFx0XFx0fVxcbjEzODg6XFx0fVxcbjEzODk6XFx0XFxuMTM5MDpcXHRzdGF0aWMgdm9pZCBtb2R1bGVfbWVtb3J5X2ZyZWUoc3RydWN0IG1vZHVsZSAqbW9kLCBlbnVtIG1vZF9tZW1fdHlwZSB0eXBlKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0NDo1NS4wNTk0ODY4MjZaIiwiU2VxIjo3MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjIwNTAxMTc0NjQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gQXNzZXNzbWVudDogTm8gVW5pbml0aWFsaXplZCBNZW1vcnkgUmVhZCBSaXNrKipcblxuQWxyaWdodCwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgd2FzIHRvIHZlcmlmeSBpZiB0aGVyZSdzIGEgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBkdWUgdG8gdGhlc2UgY2hhbmdlcy4gVGhlIGZpcnN0IHBvaW50IG9mIGNvbmNlcm4gd2FzIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCwgYnV0IGl0IGltbWVkaWF0ZWx5IHVzZXMgYG1lbXNldGAsIHNvIHRoYXQncyBhIG5vbi1pc3N1ZSDigJMgdGhlIG1lbW9yeSBpcyBndWFyYW50ZWVkIHplcm9lZC5cblxuSSB0aGVuIGxvb2tlZCBhdCBgbW0vYWxsb2NfdGFnLmNgLCB3aGVyZSB0aGVyZSdzIGEgY2hlY2sgZm9yIGB0YWdzX2FkZHJlc3NhYmxlKClgLiBJZiB0aGUgbnVtYmVyIG9mIGFsbG9jYXRpb24gdGFncyBpcyB0b28gbGFyZ2UsIHRoZSBwYXRjaCBkaXNhYmxlcyBtZW1vcnkgcHJvZmlsaW5nIGFuZCByZXRyaWVzLiBUaGlzIGxlZCBtZSB0byBpbnZlc3RpZ2F0ZSB3aGV0aGVyIHJldHJ5IGxvZ2ljIGluIGBrZXJuZWwvbW9kdWxlL21haW4uY2AgY291bGQgaW50cm9kdWNlIHVuaW5pdGlhbGl6ZWQgcmVhZHMuIFRoYXQgcmV0cnkgbG9naWMgcmVzZXRzIGFuZCByZWNhbGN1bGF0ZXMgb2Zmc2V0cyAoYGluZm8tXHUwMDNlc3ltb2Zmc2AsIGBpbmZvLVx1MDAzZXN0cm9mZnNgLCBldGMuKSB3aXRoaW4gdGhlIG1vZHVsZSdzIHNlY3Rpb24gaGVhZGVycyBiZWZvcmUgcmVzdGFydGluZyB0aGUgbW9kdWxlIGxvYWQuIEkgdmVyaWZpZWQgdGhhdCB0aGVzZSBvZmZzZXRzIGFyZSAqaW5kZWVkKiByZWNhbGN1bGF0ZWQgYW5kIHRoZSBzaXplcyAoYHNoX2VudHNpemVgKSBhcmUgcmVzZXQgYW5kIHNldCBhcHByb3ByaWF0ZWx5LiBgcmV3cml0ZV9zZWN0aW9uX2hlYWRlcnNgIGxvb2tzIGdvb2QsIGl0J3MganVzdCBtYXJraW5nIGFkZHJlc3Nlcy5cblxuSSBjb25zaWRlcmVkIHdoZXRoZXIgdGhpcyByZWxvYWQgb3IgYW55IG5ldyBsb2dpYyBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gdXNlcnNwYWNlLiBObywgdGhlIGNvbnRleHQgaXMga2VybmVsIG1vZHVsZSBsb2FkaW5nLCB0aGVyZSdzIG5vIGRpcmVjdCBpbnRlcmFjdGlvbiB3aXRoIHVzZXItc3BhY2UgbWVtb3J5IGluIGEgd2F5IHRoYXQgd291bGQgaW50cm9kdWNlIGxlYWtzIG9yIGV4cG9zZSB1bmluaXRpYWxpemVkIGRhdGEuIFRoZSBhbGxvY2F0ZWQgbW9kdWxlIG1lbW9yeSByZW1haW5zIHplcm9lZCBhbmQgdGhlIHBhdGNoIGRvZXNuJ3QgaW50cm9kdWNlIGFueSBuZXcgc3RydWN0dXJlcyBzZW50IHRvIHVzZXJzcGFjZSwgbm9yIGFueSBjb25kaXRpb25hbCBsb2dpYyBkZXBlbmRlbnQgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuIFRoZSBuZXcgZnVuY3Rpb24gYHJlbGVhc2VfbW9kdWxlX3RhZ3NgIGlzIGp1c3QgYSBtb3ZlZCBmdW5jdGlvbiBhbmQgZG9lc24ndCBpbnRyb2R1Y2UgdW5pbml0aWFsaXplZCBtZW1vcnkuXG5cblRoZSBwYXRjaCdzIGNoYW5nZXMgYXJlIHNvbGVseSBmb2N1c2VkIG9uIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyB0YWdzLCBhZGRpbmcgYSByZXRyeSBtZWNoYW5pc20uIFRoZXJlZm9yZSwgYW55IGJ1Z3Mgd291bGQgbGlrZWx5IG1hbmlmZXN0IGFzIGxvZ2ljIGVycm9ycywgbWVtb3J5IGxlYWtzLCBvciBjcmFzaGVzIOKAkyBpc3N1ZXMgdGhhdCBhcmUgd2VsbCB3aXRoaW4gdGhlIHNjb3BlIG9mIEtBU0FOJ3MgZGV0ZWN0aW9uIGNhcGFiaWxpdGllcy4gS01TQU4gKEtlcm5lbCBNZW1vcnkgU2FuaXRpemVyKSBpcyBkZXNpZ25lZCBzcGVjaWZpY2FsbHkgZm9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBidXQgc2luY2UgdGhlIG1lbW9yeSBpcyBiZWluZyBleHBsaWNpdGx5IHplcm9lZCwgS01TQU4gaXMgbm90IG5lY2Vzc2FyeSBoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDU1NCwiT3V0cHV0VG9rZW5zIjoyMDEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMjczLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDU6MTcuMTA5NjA2NDc5WiIsIlNlcSI6NzIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUyMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgbW9kdWxlIGxvYWRpbmcgcHJvY2VzcyB0byBoYW5kbGUgY2FzZXMgd2hlcmUgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHRhZ3MgZXhjZWVkIGF2YWlsYWJsZSBwYWdlIGZsYWcgYml0cy4gSXQgaW50cm9kdWNlcyBhIHJldHJ5IG1lY2hhbmlzbSBpbiBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAgdGhhdCByZXNldHMgc2VjdGlvbiBoZWFkZXJzIGFuZCBzaXplcywgYW5kIHJldHJpZXMgdGhlIGFsbG9jYXRpb24gd2l0aG91dCBwcm9maWxpbmcuIFRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBtb2R1bGVzIGlzIGV4cGxpY2l0bHkgemVyb2VkIGJ5IGBtb2R1bGVfbWVtb3J5X2FsbG9jYCAodmlhIGBtZW1zZXQocHRyLCAwLCBzaXplKWApLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIGFueSBuZXcgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlcnNwYWNlLCBub3IgZG8gdGhleSBhZGQgY29tcGxleCBjb25kaXRpb25hbCBsb2dpYyBkZXBlbmRpbmcgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggKGUuZy4sIGluY29ycmVjdCBzaXplIGNhbGN1bGF0aW9ucywgbWVtb3J5IGxlYWtzLCBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIGR1cmluZyBzZWN0aW9uIGNvcHlpbmcpIHdvdWxkIGJlIHJlbGlhYmx5IGNhdWdodCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyB0b29scy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgbmVjZXNzaXRhdGUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBtb2R1bGUgbG9hZGluZyBwcm9jZXNzIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgdGFncyBleGNlZWQgYXZhaWxhYmxlIHBhZ2UgZmxhZyBiaXRzLiBJdCBpbnRyb2R1Y2VzIGEgcmV0cnkgbWVjaGFuaXNtIGluIGBsYXlvdXRfYW5kX2FsbG9jYXRlYCB0aGF0IHJlc2V0cyBzZWN0aW9uIGhlYWRlcnMgYW5kIHNpemVzLCBhbmQgcmV0cmllcyB0aGUgYWxsb2NhdGlvbiB3aXRob3V0IHByb2ZpbGluZy4gVGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIG1vZHVsZXMgaXMgZXhwbGljaXRseSB6ZXJvZWQgYnkgYG1vZHVsZV9tZW1vcnlfYWxsb2NgICh2aWEgYG1lbXNldChwdHIsIDAsIHNpemUpYCkuIFRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2UgYW55IG5ldyBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2Vyc3BhY2UsIG5vciBkbyB0aGV5IGFkZCBjb21wbGV4IGNvbmRpdGlvbmFsIGxvZ2ljIGRlcGVuZGluZyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy4gQW55IHBvdGVudGlhbCBidWdzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaCAoZS5nLiwgaW5jb3JyZWN0IHNpemUgY2FsY3VsYXRpb25zLCBtZW1vcnkgbGVha3MsIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgZHVyaW5nIHNlY3Rpb24gY29weWluZykgd291bGQgYmUgcmVsaWFibHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIHRvb2xzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow6qbdw[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-10 09:57:08 +0000 UTC FinishedAt: 2026-08-10 10:45:18 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "0dad4faa8e59c9c1361f75c8cc54a33c96af32f3", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEM_ALLOC_PROFILING" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "0dad4faa8e59c9c1361f75c8cc54a33c96af32f3", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEM_ALLOC_PROFILING" ], "series_id": "d73f664f-9ab0-4892-982d-8f43a66c6500" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "codetag_alloc_module_section", "codetag_free_module_sections", "codetag_load_module", "codetag_unload_module" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjM4PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+N208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01FTV9BTExPQ19QUk9GSUxJTkcmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uJiMzNDssCiAgICAmIzM0O2NvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnMmIzM0OywKICAgICYjMzQ7Y29kZXRhZ19sb2FkX21vZHVsZSYjMzQ7LAogICAgJiMzNDtjb2RldGFnX3VubG9hZF9tb2R1bGUmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgbW9kdWxlIGxvYWRpbmcgcHJvY2VzcyB0byBoYW5kbGUgY2FzZXMgd2hlcmUgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHRhZ3MgZXhjZWVkIGF2YWlsYWJsZSBwYWdlIGZsYWcgYml0cy4gSXQgaW50cm9kdWNlcyBhIHJldHJ5IG1lY2hhbmlzbSBpbiBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAgdGhhdCByZXNldHMgc2VjdGlvbiBoZWFkZXJzIGFuZCBzaXplcywgYW5kIHJldHJpZXMgdGhlIGFsbG9jYXRpb24gd2l0aG91dCBwcm9maWxpbmcuIFRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBtb2R1bGVzIGlzIGV4cGxpY2l0bHkgemVyb2VkIGJ5IGBtb2R1bGVfbWVtb3J5X2FsbG9jYCAodmlhIGBtZW1zZXQocHRyLCAwLCBzaXplKWApLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIGFueSBuZXcgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlcnNwYWNlLCBub3IgZG8gdGhleSBhZGQgY29tcGxleCBjb25kaXRpb25hbCBsb2dpYyBkZXBlbmRpbmcgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggKGUuZy4sIGluY29ycmVjdCBzaXplIGNhbGN1bGF0aW9ucywgbWVtb3J5IGxlYWtzLCBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIGR1cmluZyBzZWN0aW9uIGNvcHlpbmcpIHdvdWxkIGJlIHJlbGlhYmx5IGNhdWdodCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyB0b29scy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgbmVjZXNzaXRhdGUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgY29yZSBtb2R1bGUgbG9hZGluZyBsb2dpYyB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHJ1bnMgb3V0IG9mIHBhZ2UgZmxhZyBiaXRzICghdGFnc19hZGRyZXNzYWJsZSgpKS4gSXQgaW50cm9kdWNlcyBhIHJldHJ5IG1lY2hhbmlzbSBpbiBsYXlvdXRfYW5kX2FsbG9jYXRlKCkgdGhhdCByZXNldHMgdGhlIG1vZHVsZSBzdGF0ZSBhbmQgcmV0cmllcyBsb2FkaW5nIHdpdGhvdXQgbWVtb3J5IHByb2ZpbGluZy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIG1vZHVsZSBsb2FkaW5nIHBhdGggYW5kIG1lbW9yeSBhbGxvY2F0aW9uIHRhZ2dpbmcgc3Vic3lzdGVtLCB3aGljaCBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIGluaXRfbW9kdWxlIGFuZCBmaW5pdF9tb2R1bGUgc3lzY2FsbHMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6Mzg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA2ZjlmZjVjZTM1NGM1NGIyZjZmNzVkOTJmYjU2ZTI3Y2NhOTdmZDcwXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBBdWcgMTAgMTA6Mzg6MTQgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS9tYWluLmMgYi9rZXJuZWwvbW9kdWxlL21haW4uY1xuaW5kZXggNDZkZDhkMjVhNjA1OC4uYzMyYmI0N2E1NzNhMSAxMDA2NDRcbi0tLSBhL2tlcm5lbC9tb2R1bGUvbWFpbi5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvbW9kdWxlL21haW4uY1xuQEAgLTI5NzEsMTMgJiM0MzsyOTcxLDI2IEBAIHN0YXRpYyBzdHJ1Y3QgbW9kdWxlICpsYXlvdXRfYW5kX2FsbG9jYXRlKHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGludCBmbGFncylcbiBcdCAqIHRoaXMgaXMgZG9uZSBnZW5lcmljYWxseTsgdGhlcmUgZG9lc24mIzM5O3QgYXBwZWFyIHRvIGJlIGFueVxuIFx0ICogc3BlY2lhbCBjYXNlcyBmb3IgdGhlIGFyY2hpdGVjdHVyZXMuXG4gXHQgKi9cbiYjNDM7cmV0cnk6XG4gXHRsYXlvdXRfc2VjdGlvbnMoaW5mby1cdTAwM2Vtb2QsIGluZm8pO1xuIFx0bGF5b3V0X3N5bXRhYihpbmZvLVx1MDAzZW1vZCwgaW5mbyk7XG4gXG4gXHQvKiBBbGxvY2F0ZSBhbmQgbW92ZSB0byB0aGUgZmluYWwgcGxhY2UgKi9cbiBcdGVyciA9IG1vdmVfbW9kdWxlKGluZm8tXHUwMDNlbW9kLCBpbmZvKTtcbi1cdGlmIChlcnIpXG4tXHRcdHJldHVybiBFUlJfUFRSKGVycik7XG4mIzQzO1x0aWYgKGVycikge1xuJiM0MztcdFx0aWYgKGVyciAhPSAtRUFHQUlOKVxuJiM0MztcdFx0XHRyZXR1cm4gRVJSX1BUUihlcnIpO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIC1FQUdBSU4gbWVhbnMgcHJvZmlsaW5nIHdhcyBkaXNhYmxlZCBidXQgdGhlIG1vZHVsZVxuJiM0MztcdFx0ICogY2FuIHN0aWxsIGxvYWQgd2l0aG91dCBpdC4gUmVzZXQgc3RhdGUgYW5kIHJldHJ5LlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRyZXdyaXRlX3NlY3Rpb25faGVhZGVycyhpbmZvLCBmbGFncyk7XG4mIzQzO1x0XHRmb3JfZWFjaF9tb2RfbWVtX3R5cGUodHlwZSlcbiYjNDM7XHRcdFx0aW5mby1cdTAwM2Vtb2QtXHUwMDNlbWVtW3R5cGVdLnNpemUgPSAwO1xuJiM0MztcdFx0aW5mby1cdTAwM2VzZWNoZHJzW2luZm8tXHUwMDNlaW5kZXguc3ltXS5zaF9mbGFncyBcdTAwMjY9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7XG4mIzQzO1x0XHRpbmZvLVx1MDAzZXNlY2hkcnNbaW5mby1cdTAwM2VpbmRleC5zdHJdLnNoX2ZsYWdzIFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcbiYjNDM7XHRcdGdvdG8gcmV0cnk7XG4mIzQzO1x0fVxuIFxuIFx0LyogTW9kdWxlIGhhcyBiZWVuIGNvcGllZCB0byBpdHMgZmluYWwgcGxhY2Ugbm93OiByZXR1cm4gaXQuICovXG4gXHRtb2QgPSAodm9pZCAqKWluZm8tXHUwMDNlc2VjaGRyc1tpbmZvLVx1MDAzZWluZGV4Lm1vZF0uc2hfYWRkcjtcbmRpZmYgLS1naXQgYS9tbS9hbGxvY190YWcuYyBiL21tL2FsbG9jX3RhZy5jXG5pbmRleCA1MmFlY2UyN2IwMGUwLi4zZWJhNjMzMTE3NGRhIDEwMDY0NFxuLS0tIGEvbW0vYWxsb2NfdGFnLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL2FsbG9jX3RhZy5jXG5AQCAtODM1LDYgJiM0Mzs4MzUsNTIgQEAgc3RhdGljIGludCB2bV9tb2R1bGVfdGFnc19wb3B1bGF0ZSh2b2lkKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuJiM0MztzdGF0aWMgdm9pZCByZWxlYXNlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgYm9vbCB1c2VkKVxuJiM0Mzt7XG4mIzQzO1x0TUFfU1RBVEUobWFzLCBcdTAwMjZtb2RfYXJlYV9tdCwgbW9kdWxlX3RhZ3Muc2l6ZSwgbW9kdWxlX3RhZ3Muc2l6ZSk7XG4mIzQzO1x0c3RydWN0IGFsbG9jX3RhZyAqc3RhcnRfdGFnO1xuJiM0MztcdHN0cnVjdCBhbGxvY190YWcgKmVuZF90YWc7XG4mIzQzO1x0c3RydWN0IG1vZHVsZSAqdmFsO1xuJiM0MztcbiYjNDM7XHRtYXNfbG9jayhcdTAwMjZtYXMpO1xuJiM0MztcdG1hc19mb3JfZWFjaF9yZXYoXHUwMDI2bWFzLCB2YWwsIDApXG4mIzQzO1x0XHRpZiAodmFsID09IG1vZClcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1xuJiM0MztcdGlmICghdmFsKSAvKiBtb2R1bGUgbm90IGZvdW5kICovXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0aWYgKCF1c2VkKVxuJiM0MztcdFx0Z290byByZWxlYXNlX2FyZWE7XG4mIzQzO1xuJiM0MztcdHN0YXJ0X3RhZyA9IChzdHJ1Y3QgYWxsb2NfdGFnICopKG1vZHVsZV90YWdzLnN0YXJ0X2FkZHIgJiM0MzsgbWFzLmluZGV4KTtcbiYjNDM7XHRlbmRfdGFnID0gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciAmIzQzOyBtYXMubGFzdCk7XG4mIzQzO1x0aWYgKCFjbGVhbl91bnVzZWRfY291bnRlcnMoc3RhcnRfdGFnLCBlbmRfdGFnKSkge1xuJiM0MztcdFx0c3RydWN0IGFsbG9jX3RhZyAqdGFnO1xuJiM0MztcbiYjNDM7XHRcdGZvciAodGFnID0gc3RhcnRfdGFnOyB0YWcgXHUwMDNjPSBlbmRfdGFnOyB0YWcmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdHN0cnVjdCBhbGxvY190YWdfY291bnRlcnMgY291bnRlcjtcbiYjNDM7XG4mIzQzO1x0XHRcdGlmICghdGFnLVx1MDAzZWNvdW50ZXJzKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcbiYjNDM7XHRcdFx0Y291bnRlciA9IGFsbG9jX3RhZ19yZWFkKHRhZyk7XG4mIzQzO1x0XHRcdHByX2luZm8oXCYjMzQ7JXM6JXUgbW9kdWxlICVzIGZ1bmM6JXMgaGFzICVsbHUgYWxsb2NhdGVkIGF0IG1vZHVsZSB1bmxvYWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0dGFnLVx1MDAzZWN0LmZpbGVuYW1lLCB0YWctXHUwMDNlY3QubGluZW5vLCB0YWctXHUwMDNlY3QubW9kbmFtZSxcbiYjNDM7XHRcdFx0XHR0YWctXHUwMDNlY3QuZnVuY3Rpb24sIGNvdW50ZXIuYnl0ZXMpO1xuJiM0MztcdFx0fVxuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHR1c2VkID0gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztyZWxlYXNlX2FyZWE6XG4mIzQzO1x0bWFzX3N0b3JlKFx1MDAyNm1hcywgdXNlZCA/IFx1MDAyNnVubG9hZGVkX21vZCA6IE5VTEwpO1xuJiM0MztcdHZhbCA9IG1hc19wcmV2X3JhbmdlKFx1MDAyNm1hcywgMCk7XG4mIzQzO1x0aWYgKHZhbCA9PSBcdTAwMjZwcmVwZW5kX21vZClcbiYjNDM7XHRcdG1hc19zdG9yZShcdTAwMjZtYXMsIE5VTEwpO1xuJiM0MztvdXQ6XG4mIzQzO1x0bWFzX3VubG9jayhcdTAwMjZtYXMpO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyB2b2lkICpyZXNlcnZlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWduZWQgbG9uZyBzaXplLFxuIFx0XHRcdFx0IHVuc2lnbmVkIGludCBwcmVwZW5kLCB1bnNpZ25lZCBsb25nIGFsaWduKVxuIHtcbkBAIC05MDQsMTAgJiM0Mzs5NTAsMTIgQEAgc3RhdGljIHZvaWQgKnJlc2VydmVfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBsb25nIHNpemUsXG4gXHRcdGludCBncm93X3JlcztcbiBcbiBcdFx0bW9kdWxlX3RhZ3Muc2l6ZSA9IG9mZnNldCAmIzQzOyBzaXplO1xuLVx0XHRpZiAobWVtX2FsbG9jX3Byb2ZpbGluZ19lbmFibGVkKCkgXHUwMDI2XHUwMDI2ICF0YWdzX2FkZHJlc3NhYmxlKCkpIHtcbiYjNDM7XHRcdGlmICghdGFnc19hZGRyZXNzYWJsZSgpKSB7XG4gXHRcdFx0c2h1dGRvd25fbWVtX3Byb2ZpbGluZyh0cnVlKTtcbi1cdFx0XHRwcl93YXJuKFwmIzM0O1dpdGggbW9kdWxlICVzIHRoZXJlIGFyZSB0b28gbWFueSB0YWdzIHRvIGZpdCBpbiAlZCBwYWdlIGZsYWcgYml0cy4gTWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIGlzIGRpc2FibGVkIVxcblwmIzM0Oyxcbi1cdFx0XHRcdG1vZC1cdTAwM2VuYW1lLCBOUl9VTlVTRURfUEFHRUZMQUdfQklUUyk7XG4mIzQzO1x0XHRcdHByX3dhcm5fb25jZShcJiMzNDtXaXRoIG1vZHVsZSAlcyB0aGVyZSBhcmUgdG9vIG1hbnkgdGFncyB0byBmaXQgaW4gJWQgcGFnZSBmbGFnIGJpdHMuIE1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBpcyBkaXNhYmxlZCFcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0ICAgICBtb2QtXHUwMDNlbmFtZSwgTlJfVU5VU0VEX1BBR0VGTEFHX0JJVFMpO1xuJiM0MztcdFx0XHRyZWxlYXNlX21vZHVsZV90YWdzKG1vZCwgZmFsc2UpO1xuJiM0MztcdFx0XHRyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTtcbiBcdFx0fVxuIFxuIFx0XHRncm93X3JlcyA9IHZtX21vZHVsZV90YWdzX3BvcHVsYXRlKCk7XG5AQCAtOTIyLDUyICYjNDM7OTcwLDYgQEAgc3RhdGljIHZvaWQgKnJlc2VydmVfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBsb25nIHNpemUsXG4gXHRyZXR1cm4gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciAmIzQzOyBvZmZzZXQpO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCByZWxlYXNlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgYm9vbCB1c2VkKVxuLXtcbi1cdE1BX1NUQVRFKG1hcywgXHUwMDI2bW9kX2FyZWFfbXQsIG1vZHVsZV90YWdzLnNpemUsIG1vZHVsZV90YWdzLnNpemUpO1xuLVx0c3RydWN0IGFsbG9jX3RhZyAqc3RhcnRfdGFnO1xuLVx0c3RydWN0IGFsbG9jX3RhZyAqZW5kX3RhZztcbi1cdHN0cnVjdCBtb2R1bGUgKnZhbDtcbi1cbi1cdG1hc19sb2NrKFx1MDAyNm1hcyk7XG4tXHRtYXNfZm9yX2VhY2hfcmV2KFx1MDAyNm1hcywgdmFsLCAwKVxuLVx0XHRpZiAodmFsID09IG1vZClcbi1cdFx0XHRicmVhaztcbi1cbi1cdGlmICghdmFsKSAvKiBtb2R1bGUgbm90IGZvdW5kICovXG4tXHRcdGdvdG8gb3V0O1xuLVxuLVx0aWYgKCF1c2VkKVxuLVx0XHRnb3RvIHJlbGVhc2VfYXJlYTtcbi1cbi1cdHN0YXJ0X3RhZyA9IChzdHJ1Y3QgYWxsb2NfdGFnICopKG1vZHVsZV90YWdzLnN0YXJ0X2FkZHIgJiM0MzsgbWFzLmluZGV4KTtcbi1cdGVuZF90YWcgPSAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICYjNDM7IG1hcy5sYXN0KTtcbi1cdGlmICghY2xlYW5fdW51c2VkX2NvdW50ZXJzKHN0YXJ0X3RhZywgZW5kX3RhZykpIHtcbi1cdFx0c3RydWN0IGFsbG9jX3RhZyAqdGFnO1xuLVxuLVx0XHRmb3IgKHRhZyA9IHN0YXJ0X3RhZzsgdGFnIFx1MDAzYz0gZW5kX3RhZzsgdGFnJiM0MzsmIzQzOykge1xuLVx0XHRcdHN0cnVjdCBhbGxvY190YWdfY291bnRlcnMgY291bnRlcjtcbi1cbi1cdFx0XHRpZiAoIXRhZy1cdTAwM2Vjb3VudGVycylcbi1cdFx0XHRcdGNvbnRpbnVlO1xuLVxuLVx0XHRcdGNvdW50ZXIgPSBhbGxvY190YWdfcmVhZCh0YWcpO1xuLVx0XHRcdHByX2luZm8oXCYjMzQ7JXM6JXUgbW9kdWxlICVzIGZ1bmM6JXMgaGFzICVsbHUgYWxsb2NhdGVkIGF0IG1vZHVsZSB1bmxvYWRcXG5cJiMzNDssXG4tXHRcdFx0XHR0YWctXHUwMDNlY3QuZmlsZW5hbWUsIHRhZy1cdTAwM2VjdC5saW5lbm8sIHRhZy1cdTAwM2VjdC5tb2RuYW1lLFxuLVx0XHRcdFx0dGFnLVx1MDAzZWN0LmZ1bmN0aW9uLCBjb3VudGVyLmJ5dGVzKTtcbi1cdFx0fVxuLVx0fSBlbHNlIHtcbi1cdFx0dXNlZCA9IGZhbHNlO1xuLVx0fVxuLXJlbGVhc2VfYXJlYTpcbi1cdG1hc19zdG9yZShcdTAwMjZtYXMsIHVzZWQgPyBcdTAwMjZ1bmxvYWRlZF9tb2QgOiBOVUxMKTtcbi1cdHZhbCA9IG1hc19wcmV2X3JhbmdlKFx1MDAyNm1hcywgMCk7XG4tXHRpZiAodmFsID09IFx1MDAyNnByZXBlbmRfbW9kKVxuLVx0XHRtYXNfc3RvcmUoXHUwMDI2bWFzLCBOVUxMKTtcbi1vdXQ6XG4tXHRtYXNfdW5sb2NrKFx1MDAyNm1hcyk7XG4tfVxuLVxuIHN0YXRpYyBpbnQgbG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgY29kZXRhZyAqc3RhcnQsIHN0cnVjdCBjb2RldGFnICpzdG9wKVxuIHtcbiBcdC8qIEFsbG9jYXRlIG1vZHVsZSBhbGxvY190YWcgcGVyY3B1IGNvdW50ZXJzICovXG5AQCAtOTc1LDYgJiM0Mzs5NzcsOSBAQCBzdGF0aWMgaW50IGxvYWRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGNvZGV0YWcgKnN0YXJ0LCBzdHJ1Y3QgY29kZXRhZ1xuIFx0c3RydWN0IGFsbG9jX3RhZyAqc3RvcF90YWc7XG4gXHRzdHJ1Y3QgYWxsb2NfdGFnICp0YWc7XG4gXG4mIzQzO1x0aWYgKCFtZW1fcHJvZmlsaW5nX3N1cHBvcnQpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4gXHQvKiBwZXJjcHUgY291bnRlcnMgZm9yIGNvcmUgYWxsb2NhdGlvbnMgYXJlIGFscmVhZHkgc3RhdGljYWxseSBhbGxvY2F0ZWQgKi9cbiBcdGlmICghbW9kKVxuIFx0XHRyZXR1cm4gMDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDozODwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT40bTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TUVNX0FMTE9DX1BST0ZJTElORyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2NvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24mIzM0OywKICAgICYjMzQ7Y29kZXRhZ19mcmVlX21vZHVsZV9zZWN0aW9ucyYjMzQ7LAogICAgJiMzNDtjb2RldGFnX2xvYWRfbW9kdWxlJiMzNDssCiAgICAmIzM0O2NvZGV0YWdfdW5sb2FkX21vZHVsZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgY29yZSBtb2R1bGUgbG9hZGluZyBsb2dpYyB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHJ1bnMgb3V0IG9mIHBhZ2UgZmxhZyBiaXRzICghdGFnc19hZGRyZXNzYWJsZSgpKS4gSXQgaW50cm9kdWNlcyBhIHJldHJ5IG1lY2hhbmlzbSBpbiBsYXlvdXRfYW5kX2FsbG9jYXRlKCkgdGhhdCByZXNldHMgdGhlIG1vZHVsZSBzdGF0ZSBhbmQgcmV0cmllcyBsb2FkaW5nIHdpdGhvdXQgbWVtb3J5IHByb2ZpbGluZy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIG1vZHVsZSBsb2FkaW5nIHBhdGggYW5kIG1lbW9yeSBhbGxvY2F0aW9uIHRhZ2dpbmcgc3Vic3lzdGVtLCB3aGljaCBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIGluaXRfbW9kdWxlIGFuZCBmaW5pdF9tb2R1bGUgc3lzY2FsbHMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA2ZjlmZjVjZTM1NGM1NGIyZjZmNzVkOTJmYjU2ZTI3Y2NhOTdmZDcwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBBdWcgMTAgMTA6Mzg6MTQgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9rZXJuZWwvbW9kdWxlL21haW4uYyBiL2tlcm5lbC9tb2R1bGUvbWFpbi5jCmluZGV4IDQ2ZGQ4ZDI1YTYwNTguLmMzMmJiNDdhNTczYTEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tb2R1bGUvbWFpbi5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9tb2R1bGUvbWFpbi5jCkBAIC0yOTcxLDEzICYjNDM7Mjk3MSwyNiBAQCBzdGF0aWMgc3RydWN0IG1vZHVsZSAqbGF5b3V0X2FuZF9hbGxvY2F0ZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpCiAJICogdGhpcyBpcyBkb25lIGdlbmVyaWNhbGx5OyB0aGVyZSBkb2VzbiYjMzk7dCBhcHBlYXIgdG8gYmUgYW55CiAJICogc3BlY2lhbCBjYXNlcyBmb3IgdGhlIGFyY2hpdGVjdHVyZXMuCiAJICovCiYjNDM7cmV0cnk6CiAJbGF5b3V0X3NlY3Rpb25zKGluZm8tJmd0O21vZCwgaW5mbyk7CiAJbGF5b3V0X3N5bXRhYihpbmZvLSZndDttb2QsIGluZm8pOwogCiAJLyogQWxsb2NhdGUgYW5kIG1vdmUgdG8gdGhlIGZpbmFsIHBsYWNlICovCiAJZXJyID0gbW92ZV9tb2R1bGUoaW5mby0mZ3Q7bW9kLCBpbmZvKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gRVJSX1BUUihlcnIpOwomIzQzOwlpZiAoZXJyKSB7CiYjNDM7CQlpZiAoZXJyICE9IC1FQUdBSU4pCiYjNDM7CQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKJiM0MzsJCS8qCiYjNDM7CQkgKiAtRUFHQUlOIG1lYW5zIHByb2ZpbGluZyB3YXMgZGlzYWJsZWQgYnV0IHRoZSBtb2R1bGUKJiM0MzsJCSAqIGNhbiBzdGlsbCBsb2FkIHdpdGhvdXQgaXQuIFJlc2V0IHN0YXRlIGFuZCByZXRyeS4KJiM0MzsJCSAqLwomIzQzOwkJcmV3cml0ZV9zZWN0aW9uX2hlYWRlcnMoaW5mbywgZmxhZ3MpOwomIzQzOwkJZm9yX2VhY2hfbW9kX21lbV90eXBlKHR5cGUpCiYjNDM7CQkJaW5mby0mZ3Q7bW9kLSZndDttZW1bdHlwZV0uc2l6ZSA9IDA7CiYjNDM7CQlpbmZvLSZndDtzZWNoZHJzW2luZm8tJmd0O2luZGV4LnN5bV0uc2hfZmxhZ3MgJmFtcDs9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7CiYjNDM7CQlpbmZvLSZndDtzZWNoZHJzW2luZm8tJmd0O2luZGV4LnN0cl0uc2hfZmxhZ3MgJmFtcDs9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7CiYjNDM7CQlnb3RvIHJldHJ5OwomIzQzOwl9CiAKIAkvKiBNb2R1bGUgaGFzIGJlZW4gY29waWVkIHRvIGl0cyBmaW5hbCBwbGFjZSBub3c6IHJldHVybiBpdC4gKi8KIAltb2QgPSAodm9pZCAqKWluZm8tJmd0O3NlY2hkcnNbaW5mby0mZ3Q7aW5kZXgubW9kXS5zaF9hZGRyOwpkaWZmIC0tZ2l0IGEvbW0vYWxsb2NfdGFnLmMgYi9tbS9hbGxvY190YWcuYwppbmRleCA1MmFlY2UyN2IwMGUwLi4zZWJhNjMzMTE3NGRhIDEwMDY0NAotLS0gYS9tbS9hbGxvY190YWcuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9hbGxvY190YWcuYwpAQCAtODM1LDYgJiM0Mzs4MzUsNTIgQEAgc3RhdGljIGludCB2bV9tb2R1bGVfdGFnc19wb3B1bGF0ZSh2b2lkKQogCXJldHVybiAwOwogfQogCiYjNDM7c3RhdGljIHZvaWQgcmVsZWFzZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIGJvb2wgdXNlZCkKJiM0Mzt7CiYjNDM7CU1BX1NUQVRFKG1hcywgJmFtcDttb2RfYXJlYV9tdCwgbW9kdWxlX3RhZ3Muc2l6ZSwgbW9kdWxlX3RhZ3Muc2l6ZSk7CiYjNDM7CXN0cnVjdCBhbGxvY190YWcgKnN0YXJ0X3RhZzsKJiM0MzsJc3RydWN0IGFsbG9jX3RhZyAqZW5kX3RhZzsKJiM0MzsJc3RydWN0IG1vZHVsZSAqdmFsOwomIzQzOwomIzQzOwltYXNfbG9jaygmYW1wO21hcyk7CiYjNDM7CW1hc19mb3JfZWFjaF9yZXYoJmFtcDttYXMsIHZhbCwgMCkKJiM0MzsJCWlmICh2YWwgPT0gbW9kKQomIzQzOwkJCWJyZWFrOwomIzQzOwomIzQzOwlpZiAoIXZhbCkgLyogbW9kdWxlIG5vdCBmb3VuZCAqLwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmICghdXNlZCkKJiM0MzsJCWdvdG8gcmVsZWFzZV9hcmVhOwomIzQzOwomIzQzOwlzdGFydF90YWcgPSAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICYjNDM7IG1hcy5pbmRleCk7CiYjNDM7CWVuZF90YWcgPSAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICYjNDM7IG1hcy5sYXN0KTsKJiM0MzsJaWYgKCFjbGVhbl91bnVzZWRfY291bnRlcnMoc3RhcnRfdGFnLCBlbmRfdGFnKSkgewomIzQzOwkJc3RydWN0IGFsbG9jX3RhZyAqdGFnOwomIzQzOwomIzQzOwkJZm9yICh0YWcgPSBzdGFydF90YWc7IHRhZyAmbHQ7PSBlbmRfdGFnOyB0YWcmIzQzOyYjNDM7KSB7CiYjNDM7CQkJc3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyBjb3VudGVyOwomIzQzOwomIzQzOwkJCWlmICghdGFnLSZndDtjb3VudGVycykKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CiYjNDM7CQkJY291bnRlciA9IGFsbG9jX3RhZ19yZWFkKHRhZyk7CiYjNDM7CQkJcHJfaW5mbygmIzM0OyVzOiV1IG1vZHVsZSAlcyBmdW5jOiVzIGhhcyAlbGx1IGFsbG9jYXRlZCBhdCBtb2R1bGUgdW5sb2FkXG4mIzM0OywKJiM0MzsJCQkJdGFnLSZndDtjdC5maWxlbmFtZSwgdGFnLSZndDtjdC5saW5lbm8sIHRhZy0mZ3Q7Y3QubW9kbmFtZSwKJiM0MzsJCQkJdGFnLSZndDtjdC5mdW5jdGlvbiwgY291bnRlci5ieXRlcyk7CiYjNDM7CQl9CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQl1c2VkID0gZmFsc2U7CiYjNDM7CX0KJiM0MztyZWxlYXNlX2FyZWE6CiYjNDM7CW1hc19zdG9yZSgmYW1wO21hcywgdXNlZCA/ICZhbXA7dW5sb2FkZWRfbW9kIDogTlVMTCk7CiYjNDM7CXZhbCA9IG1hc19wcmV2X3JhbmdlKCZhbXA7bWFzLCAwKTsKJiM0MzsJaWYgKHZhbCA9PSAmYW1wO3ByZXBlbmRfbW9kKQomIzQzOwkJbWFzX3N0b3JlKCZhbXA7bWFzLCBOVUxMKTsKJiM0MztvdXQ6CiYjNDM7CW1hc191bmxvY2soJmFtcDttYXMpOwomIzQzO30KJiM0MzsKIHN0YXRpYyB2b2lkICpyZXNlcnZlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJCSB1bnNpZ25lZCBpbnQgcHJlcGVuZCwgdW5zaWduZWQgbG9uZyBhbGlnbikKIHsKQEAgLTkwNCwxMCAmIzQzOzk1MCwxMiBAQCBzdGF0aWMgdm9pZCAqcmVzZXJ2ZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJaW50IGdyb3dfcmVzOwogCiAJCW1vZHVsZV90YWdzLnNpemUgPSBvZmZzZXQgJiM0Mzsgc2l6ZTsKLQkJaWYgKG1lbV9hbGxvY19wcm9maWxpbmdfZW5hYmxlZCgpICZhbXA7JmFtcDsgIXRhZ3NfYWRkcmVzc2FibGUoKSkgewomIzQzOwkJaWYgKCF0YWdzX2FkZHJlc3NhYmxlKCkpIHsKIAkJCXNodXRkb3duX21lbV9wcm9maWxpbmcodHJ1ZSk7Ci0JCQlwcl93YXJuKCYjMzQ7V2l0aCBtb2R1bGUgJXMgdGhlcmUgYXJlIHRvbyBtYW55IHRhZ3MgdG8gZml0IGluICVkIHBhZ2UgZmxhZyBiaXRzLiBNZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgaXMgZGlzYWJsZWQhXG4mIzM0OywKLQkJCQltb2QtJmd0O25hbWUsIE5SX1VOVVNFRF9QQUdFRkxBR19CSVRTKTsKJiM0MzsJCQlwcl93YXJuX29uY2UoJiMzNDtXaXRoIG1vZHVsZSAlcyB0aGVyZSBhcmUgdG9vIG1hbnkgdGFncyB0byBmaXQgaW4gJWQgcGFnZSBmbGFnIGJpdHMuIE1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBpcyBkaXNhYmxlZCFcbiYjMzQ7LAomIzQzOwkJCQkgICAgIG1vZC0mZ3Q7bmFtZSwgTlJfVU5VU0VEX1BBR0VGTEFHX0JJVFMpOwomIzQzOwkJCXJlbGVhc2VfbW9kdWxlX3RhZ3MobW9kLCBmYWxzZSk7CiYjNDM7CQkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CiAJCX0KIAogCQlncm93X3JlcyA9IHZtX21vZHVsZV90YWdzX3BvcHVsYXRlKCk7CkBAIC05MjIsNTIgJiM0Mzs5NzAsNiBAQCBzdGF0aWMgdm9pZCAqcmVzZXJ2ZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAlyZXR1cm4gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciAmIzQzOyBvZmZzZXQpOwogfQogCi1zdGF0aWMgdm9pZCByZWxlYXNlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgYm9vbCB1c2VkKQotewotCU1BX1NUQVRFKG1hcywgJmFtcDttb2RfYXJlYV9tdCwgbW9kdWxlX3RhZ3Muc2l6ZSwgbW9kdWxlX3RhZ3Muc2l6ZSk7Ci0Jc3RydWN0IGFsbG9jX3RhZyAqc3RhcnRfdGFnOwotCXN0cnVjdCBhbGxvY190YWcgKmVuZF90YWc7Ci0Jc3RydWN0IG1vZHVsZSAqdmFsOwotCi0JbWFzX2xvY2soJmFtcDttYXMpOwotCW1hc19mb3JfZWFjaF9yZXYoJmFtcDttYXMsIHZhbCwgMCkKLQkJaWYgKHZhbCA9PSBtb2QpCi0JCQlicmVhazsKLQotCWlmICghdmFsKSAvKiBtb2R1bGUgbm90IGZvdW5kICovCi0JCWdvdG8gb3V0OwotCi0JaWYgKCF1c2VkKQotCQlnb3RvIHJlbGVhc2VfYXJlYTsKLQotCXN0YXJ0X3RhZyA9IChzdHJ1Y3QgYWxsb2NfdGFnICopKG1vZHVsZV90YWdzLnN0YXJ0X2FkZHIgJiM0MzsgbWFzLmluZGV4KTsKLQllbmRfdGFnID0gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciAmIzQzOyBtYXMubGFzdCk7Ci0JaWYgKCFjbGVhbl91bnVzZWRfY291bnRlcnMoc3RhcnRfdGFnLCBlbmRfdGFnKSkgewotCQlzdHJ1Y3QgYWxsb2NfdGFnICp0YWc7Ci0KLQkJZm9yICh0YWcgPSBzdGFydF90YWc7IHRhZyAmbHQ7PSBlbmRfdGFnOyB0YWcmIzQzOyYjNDM7KSB7Ci0JCQlzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzIGNvdW50ZXI7Ci0KLQkJCWlmICghdGFnLSZndDtjb3VudGVycykKLQkJCQljb250aW51ZTsKLQotCQkJY291bnRlciA9IGFsbG9jX3RhZ19yZWFkKHRhZyk7Ci0JCQlwcl9pbmZvKCYjMzQ7JXM6JXUgbW9kdWxlICVzIGZ1bmM6JXMgaGFzICVsbHUgYWxsb2NhdGVkIGF0IG1vZHVsZSB1bmxvYWRcbiYjMzQ7LAotCQkJCXRhZy0mZ3Q7Y3QuZmlsZW5hbWUsIHRhZy0mZ3Q7Y3QubGluZW5vLCB0YWctJmd0O2N0Lm1vZG5hbWUsCi0JCQkJdGFnLSZndDtjdC5mdW5jdGlvbiwgY291bnRlci5ieXRlcyk7Ci0JCX0KLQl9IGVsc2UgewotCQl1c2VkID0gZmFsc2U7Ci0JfQotcmVsZWFzZV9hcmVhOgotCW1hc19zdG9yZSgmYW1wO21hcywgdXNlZCA/ICZhbXA7dW5sb2FkZWRfbW9kIDogTlVMTCk7Ci0JdmFsID0gbWFzX3ByZXZfcmFuZ2UoJmFtcDttYXMsIDApOwotCWlmICh2YWwgPT0gJmFtcDtwcmVwZW5kX21vZCkKLQkJbWFzX3N0b3JlKCZhbXA7bWFzLCBOVUxMKTsKLW91dDoKLQltYXNfdW5sb2NrKCZhbXA7bWFzKTsKLX0KLQogc3RhdGljIGludCBsb2FkX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBjb2RldGFnICpzdGFydCwgc3RydWN0IGNvZGV0YWcgKnN0b3ApCiB7CiAJLyogQWxsb2NhdGUgbW9kdWxlIGFsbG9jX3RhZyBwZXJjcHUgY291bnRlcnMgKi8KQEAgLTk3NSw2ICYjNDM7OTc3LDkgQEAgc3RhdGljIGludCBsb2FkX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBjb2RldGFnICpzdGFydCwgc3RydWN0IGNvZGV0YWcKIAlzdHJ1Y3QgYWxsb2NfdGFnICpzdG9wX3RhZzsKIAlzdHJ1Y3QgYWxsb2NfdGFnICp0YWc7CiAKJiM0MzsJaWYgKCFtZW1fcHJvZmlsaW5nX3N1cHBvcnQpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKIAkvKiBwZXJjcHUgY291bnRlcnMgZm9yIGNvcmUgYWxsb2NhdGlvbnMgYXJlIGFscmVhZHkgc3RhdGljYWxseSBhbGxvY2F0ZWQgKi8KIAlpZiAoIW1vZCkKIAkJcmV0dXJuIDA7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjM4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM3NzQKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiAxNTAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBNb2R1bGUgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7dmUgZ290IGEgcGF0Y2ggaGVyZSB0aGF0JiMzOTtzIHRvdWNoaW5nIGBrZXJuZWwvbW9kdWxlL21haW4uY2AgYW5kIGBtbS9hbGxvY190YWcuY2AsIHdoaWNoIGlzIGludGVyZXN0aW5nLiBJdCBsb29rcyBsaWtlIHRoZSBtYWluIGZvY3VzIGlzIGFyb3VuZCBob3cgd2UgaGFuZGxlIGAtRUFHQUlOYCBlcnJvcnMgY29taW5nIGJhY2sgZnJvbSBgbW92ZV9tb2R1bGUoKWAuIFJpZ2h0LCBzbyBgbW92ZV9tb2R1bGUoKWAgaXMgdGhlIG9uZSB0aGF0JiMzOTtzIG5vdyBwb3RlbnRpYWxseSByZXR1cm5pbmcgdGhpcyBlcnJvciwgbGlrZWx5IHJlbGF0ZWQgdG8gdGhlIGByZXNlcnZlX21vZHVsZV90YWdzKClgIGNhbGwuIFRoYXQgbWFrZXMgc2Vuc2UsIGJlY2F1c2UgSSBrbm93IGByZXNlcnZlX21vZHVsZV90YWdzKClgIGluIGBtbS9hbGxvY190YWcuY2AgaXMgYmVpbmcgdXBkYXRlZCB0byByZXR1cm4gYEVSUl9QVFIoLUVBR0FJTilgIGlmIGAhdGFnc19hZGRyZXNzYWJsZSgpYC4KClNvLCB0aGUga2V5IGNoYW5nZSBpcyB0aGF0IGBsYXlvdXRfYW5kX2FsbG9jYXRlKClgIGluIGBrZXJuZWwvbW9kdWxlL21haW4uY2Agbm93IGluY2x1ZGVzIHJldHJpZXMgc3BlY2lmaWNhbGx5IGZvciB0aGUgYC1FQUdBSU5gIGNhc2UgZnJvbSBgbW92ZV9tb2R1bGUoKWAuIEkmIzM5O2xsIG5lZWQgdG8gY29uZmlybSB0aGUgY2FsbCBjaGFpbiBmcm9tIGBtb3ZlX21vZHVsZSgpYCB0byBgcmVzZXJ2ZV9tb2R1bGVfdGFncygpYCwganVzdCB0byBiZSBjZXJ0YWluIG9mIHRoZSBjb250ZXh0LiBCdXQgYmVmb3JlIEkgZGlnIHRvbyBkZWVwIGluIHRoYXQgZGlyZWN0aW9uLCBJIHNob3VsZCB0YWtlIGEgY2xvc2UgbG9vayBhdCBgbW92ZV9tb2R1bGUoKWAgaW4gYGtlcm5lbC9tb2R1bGUvbWFpbi5jYCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgd2hhdCYjMzk7cyB0cmlnZ2VyaW5nIHRoZSBgLUVBR0FJTmAgaW4gdGhlIGZpcnN0IHBsYWNlIGFuZCBzZWUgaWYgdGhlcmUgYXJlIGFueSBvYnZpb3VzIGlzc3Vlcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDozOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttb3ZlX21vZHVsZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvbWFpbi5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvbWFpbi5jPTIzNjQ9c3RhdGljIGludCBlbGZfdmFsaWRpdHlfY2FjaGVfc3RydGFiKHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMjQxNS0gKiBBcyBhIGxhc3Qgc3RlcCB3ZSBzZXQgaW5mby1cdTAwM2Vtb2QgdG8gdGhlIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSBtb2R1bGUgaW5cbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI0MTY6ICogaW5mby1cdTAwM2VoZHIuIFRoZSBmaW5hbCBvbmUgd2lsbCBiZSBhbGxvY2F0ZWQgaW4gbW92ZV9tb2R1bGUoKS4gQW55XG5rZXJuZWwvbW9kdWxlL21haW4uYy0yNDE3LSAqIG1vZGlmaWNhdGlvbnMgd2UgbWFrZSB0byBvdXIgY29weSBvZiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FycmllZCBvdmVyXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9MjY1OT1zdGF0aWMgaW50IGZpbmRfbW9kdWxlX3NlY3Rpb25zKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbylcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yNzg3LVxua2VybmVsL21vZHVsZS9tYWluLmM6Mjc4ODpzdGF0aWMgaW50IG1vdmVfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbylcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI3ODkte1xuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTI5NDM9c3RhdGljIHN0cnVjdCBtb2R1bGUgKmxheW91dF9hbmRfYWxsb2NhdGUoc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgaW50IGZsYWdzKVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5NzgtXHQvKiBBbGxvY2F0ZSBhbmQgbW92ZSB0byB0aGUgZmluYWwgcGxhY2UgKi9cbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI5Nzk6XHRlcnIgPSBtb3ZlX21vZHVsZShpbmZvLVx1MDAzZW1vZCwgaW5mbyk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTgwLVx0aWYgKGVycikge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ1ODUKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGFzIGlmIHRoZXkmIzM5O3JlIG15IG93bjoKCioqQW5hbHl6aW5nIHRoZSBgbW92ZV9tb2R1bGUoKWAgSW1wbGVtZW50YXRpb24qKgoKUmlnaHQsIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHNwZWNpZmljcyBvZiB0aGlzIGBtb3ZlX21vZHVsZSgpYCBpbXBsZW1lbnRhdGlvbi4gRm9yZ2V0IHRoZSBnZW5lcmFsIGNvbmNlcHQgZm9yIGEgbW9tZW50IOKAkyBJIG5lZWQgdG8gZ2V0IGludG8gdGhlIG5pdHR5LWdyaXR0eSBvZiB0aGUgY29kZSBpdHNlbGYuIFdoYXQmIzM5O3MgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBkb2luZz8gV2hhdCBhcmUgdGhlIHVuZGVybHlpbmcgbWVjaGFuaWNzPyBBcmUgd2UgdGFsa2luZyBhYm91dCBhIHNpbXBsZSBmaWxlIHN5c3RlbSBvcGVyYXRpb24sIG9yIGlzIHRoZXJlIHNvbWUgY29tcGxleCBpbnRlcmFjdGlvbiB3aXRoIGEgZGF0YWJhc2UsIGV4dGVybmFsIHNlcnZpY2VzLCBvciBwZXJoYXBzIGV2ZW4gZGlzdHJpYnV0ZWQgc3lzdGVtcyBpbnZvbHZlZD8gSSBuZWVkIHRvIGxvb2sgYXQgdGhlIGVkZ2UgY2FzZXMsIHRoZSBlcnJvciBoYW5kbGluZywgYW5kIHRoZSBvdmVyYWxsIGVmZmljaWVuY3kuIElzIGl0IG9wdGltaXplZCBmb3IgY29tbW9uIHNjZW5hcmlvcywgb3IgZG9lcyBpdCBjYXRlciB0byBhIGJyb2FkZXIgcmFuZ2Ugb2YgdXNlIGNhc2VzPyBJJiMzOTttIGFscmVhZHkgdGhpbmtpbmcgYWJvdXQgcG90ZW50aWFsIGJvdHRsZW5lY2tzIGFuZCBwb2ludHMgb2YgZmFpbHVyZSDigJMgd2hhdCBjb3VsZCBnbyB3cm9uZywgYW5kIGhvdyByb2J1c3QgaXMgdGhlIGVycm9yIGhhbmRsaW5nPyBUaW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eSBhbmQgZGlzc2VjdCB0aGlzIGZ1bmN0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjM5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS9tYWluLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyNzg4LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyNzg4Olx0c3RhdGljIGludCBtb3ZlX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXG4yNzg5Olx0e1xuMjc5MDpcdFx0aW50IGksIHJldDtcbjI3OTE6XHRcdGVudW0gbW9kX21lbV90eXBlIHQgPSBNT0RfTUVNX05VTV9UWVBFUztcbjI3OTI6XHRcdGJvb2wgY29kZXRhZ19zZWN0aW9uX2ZvdW5kID0gZmFsc2U7XG4yNzkzOlx0XG4yNzk0Olx0XHRmb3JfZWFjaF9tb2RfbWVtX3R5cGUodHlwZSkge1xuMjc5NTpcdFx0XHRpZiAoIW1vZC1cdTAwM2VtZW1bdHlwZV0uc2l6ZSkge1xuMjc5NjpcdFx0XHRcdG1vZC1cdTAwM2VtZW1bdHlwZV0uYmFzZSA9IE5VTEw7XG4yNzk3Olx0XHRcdFx0Y29udGludWU7XG4yNzk4Olx0XHRcdH1cbjI3OTk6XHRcbjI4MDA6XHRcdFx0cmV0ID0gbW9kdWxlX21lbW9yeV9hbGxvYyhtb2QsIHR5cGUpO1xuMjgwMTpcdFx0XHRpZiAocmV0KSB7XG4yODAyOlx0XHRcdFx0dCA9IHR5cGU7XG4yODAzOlx0XHRcdFx0Z290byBvdXRfZXJyO1xuMjgwNDpcdFx0XHR9XG4yODA1Olx0XHR9XG4yODA2Olx0XG4yODA3Olx0XHQvKiBUcmFuc2ZlciBlYWNoIHNlY3Rpb24gd2hpY2ggc3BlY2lmaWVzIFNIRl9BTExPQyAqL1xuMjgwODpcdFx0cHJfZGVidWcoXCYjMzQ7RmluYWwgc2VjdGlvbiBhZGRyZXNzZXMgZm9yICVzOlxcblwmIzM0OywgbW9kLVx1MDAzZW5hbWUpO1xuMjgwOTpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgaW5mby1cdTAwM2VoZHItXHUwMDNlZV9zaG51bTsgaSYjNDM7JiM0MzspIHtcbjI4MTA6XHRcdFx0dm9pZCAqZGVzdDtcbjI4MTE6XHRcdFx0RWxmX1NoZHIgKnNoZHIgPSBcdTAwMjZpbmZvLVx1MDAzZXNlY2hkcnNbaV07XG4yODEyOlx0XHRcdGNvbnN0IGNoYXIgKnNuYW1lO1xuMjgxMzpcdFxuMjgxNDpcdFx0XHRpZiAoIShzaGRyLVx1MDAzZXNoX2ZsYWdzIFx1MDAyNiBTSEZfQUxMT0MpKVxuMjgxNTpcdFx0XHRcdGNvbnRpbnVlO1xuMjgxNjpcdFxuMjgxNzpcdFx0XHRzbmFtZSA9IGluZm8tXHUwMDNlc2Vjc3RyaW5ncyAmIzQzOyBzaGRyLVx1MDAzZXNoX25hbWU7XG4yODE4Olx0XHRcdC8qXG4yODE5Olx0XHRcdCAqIExvYWQgY29kZXRhZyBzZWN0aW9ucyBzZXBhcmF0ZWx5IGFzIHRoZXkgbWlnaHQgc3RpbGwgYmUgdXNlZFxuMjgyMDpcdFx0XHQgKiBhZnRlciBtb2R1bGUgdW5sb2FkLlxuMjgyMTpcdFx0XHQgKi9cbjI4MjI6XHRcdFx0aWYgKGNvZGV0YWdfbmVlZHNfbW9kdWxlX3NlY3Rpb24obW9kLCBzbmFtZSwgc2hkci1cdTAwM2VzaF9zaXplKSkge1xuMjgyMzpcdFx0XHRcdGRlc3QgPSBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uKG1vZCwgc25hbWUsIHNoZHItXHUwMDNlc2hfc2l6ZSxcbjI4MjQ6XHRcdFx0XHRcdFx0YXJjaF9tb2Rfc2VjdGlvbl9wcmVwZW5kKG1vZCwgaSksIHNoZHItXHUwMDNlc2hfYWRkcmFsaWduKTtcbjI4MjU6XHRcdFx0XHRpZiAoV0FSTl9PTighZGVzdCkpIHtcbjI4MjY6XHRcdFx0XHRcdHJldCA9IC1FSU5WQUw7XG4yODI3Olx0XHRcdFx0XHRnb3RvIG91dF9lcnI7XG4yODI4Olx0XHRcdFx0fVxuMjgyOTpcdFx0XHRcdGlmIChJU19FUlIoZGVzdCkpIHtcbjI4MzA6XHRcdFx0XHRcdHJldCA9IFBUUl9FUlIoZGVzdCk7XG4yODMxOlx0XHRcdFx0XHRnb3RvIG91dF9lcnI7XG4yODMyOlx0XHRcdFx0fVxuMjgzMzpcdFx0XHRcdGNvZGV0YWdfc2VjdGlvbl9mb3VuZCA9IHRydWU7XG4yODM0Olx0XHRcdH0gZWxzZSB7XG4yODM1Olx0XHRcdFx0ZW51bSBtb2RfbWVtX3R5cGUgdHlwZSA9IHNoZHItXHUwMDNlc2hfZW50c2l6ZSBcdTAwM2VcdTAwM2UgU0hfRU5UU0laRV9UWVBFX1NISUZUO1xuMjgzNjpcdFx0XHRcdHVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gc2hkci1cdTAwM2VzaF9lbnRzaXplIFx1MDAyNiBTSF9FTlRTSVpFX09GRlNFVF9NQVNLO1xuMjgzNzpcdFxuMjgzODpcdFx0XHRcdGRlc3QgPSBtb2QtXHUwMDNlbWVtW3R5cGVdLmJhc2UgJiM0Mzsgb2Zmc2V0O1xuMjgzOTpcdFx0XHR9XG4yODQwOlx0XG4yODQxOlx0XHRcdGlmIChzaGRyLVx1MDAzZXNoX3R5cGUgIT0gU0hUX05PQklUUykge1xuMjg0MjpcdFx0XHRcdC8qXG4yODQzOlx0XHRcdFx0ICogT3VyIEVMRiBjaGVja2VyIGFscmVhZHkgdmFsaWRhdGVkIHRoaXMsIGJ1dCBsZXQmIzM5O3NcbjI4NDQ6XHRcdFx0XHQgKiBiZSBwZWRhbnRpYyBhbmQgbWFrZSB0aGUgZ29hbCBjbGVhcmVyLiBXZSBhY3R1YWxseVxuMjg0NTpcdFx0XHRcdCAqIGVuZCB1cCBjb3B5aW5nIG92ZXIgYWxsIG1vZGlmaWNhdGlvbnMgbWFkZSB0byB0aGVcbjI4NDY6XHRcdFx0XHQgKiB1c2Vyc3BhY2UgY29weSBvZiB0aGUgZW50aXJlIHN0cnVjdCBtb2R1bGUuXG4yODQ3Olx0XHRcdFx0ICovXG4yODQ4Olx0XHRcdFx0aWYgKGkgPT0gaW5mby1cdTAwM2VpbmRleC5tb2QgXHUwMDI2XHUwMDI2XG4yODQ5Olx0XHRcdFx0ICAgKFdBUk5fT05fT05DRShzaGRyLVx1MDAzZXNoX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCBtb2R1bGUpKSkpIHtcbjI4NTA6XHRcdFx0XHRcdHJldCA9IC1FTk9FWEVDO1xuMjg1MTpcdFx0XHRcdFx0Z290byBvdXRfZXJyO1xuMjg1MjpcdFx0XHRcdH1cbjI4NTM6XHRcdFx0XHRtZW1jcHkoZGVzdCwgKHZvaWQgKilzaGRyLVx1MDAzZXNoX2FkZHIsIHNoZHItXHUwMDNlc2hfc2l6ZSk7XG4yODU0Olx0XHRcdH1cbjI4NTU6XHRcdFx0LypcbjI4NTY6XHRcdFx0ICogVXBkYXRlIHRoZSB1c2Vyc3BhY2UgY29weSYjMzk7cyBFTEYgc2VjdGlvbiBhZGRyZXNzIHRvIHBvaW50IHRvXG4yODU3Olx0XHRcdCAqIG91ciBuZXdseSBhbGxvY2F0ZWQgbWVtb3J5IGFzIGEgcHVyZSBjb252ZW5pZW5jZSBzbyB0aGF0XG4yODU4Olx0XHRcdCAqIHVzZXJzIG9mIGluZm8gY2FuIGtlZXAgdGFraW5nIGFkdmFudGFnZSBhbmQgdXNpbmcgdGhlIG5ld2x5XG4yODU5Olx0XHRcdCAqIG1pbnRlZCBvZmZpY2lhbCBtZW1vcnkgYXJlYS5cbjI4NjA6XHRcdFx0ICovXG4yODYxOlx0XHRcdHNoZHItXHUwMDNlc2hfYWRkciA9ICh1bnNpZ25lZCBsb25nKWRlc3Q7XG4yODYyOlx0XHRcdHByX2RlYnVnKFwmIzM0O1xcdDB4JWx4IDB4JS44bHggJXNcXG5cJiMzNDssIChsb25nKXNoZHItXHUwMDNlc2hfYWRkcixcbjI4NjM6XHRcdFx0XHQgKGxvbmcpc2hkci1cdTAwM2VzaF9zaXplLCBpbmZvLVx1MDAzZXNlY3N0cmluZ3MgJiM0Mzsgc2hkci1cdTAwM2VzaF9uYW1lKTtcbjI4NjQ6XHRcdH1cbjI4NjU6XHRcbjI4NjY6XHRcdHJldHVybiAwO1xuMjg2NzpcdG91dF9lcnI6XG4yODY4Olx0XHRtb2R1bGVfbWVtb3J5X3Jlc3RvcmVfcm94KG1vZCk7XG4yODY5Olx0XHR3aGlsZSAodC0tKVxuMjg3MDpcdFx0XHRtb2R1bGVfbWVtb3J5X2ZyZWUobW9kLCB0KTtcbjI4NzE6XHRcdGlmIChjb2RldGFnX3NlY3Rpb25fZm91bmQpXG4yODcyOlx0XHRcdGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnMobW9kKTtcbjI4NzM6XHRcbjI4NzQ6XHRcdHJldHVybiByZXQ7XG4yODc1Olx0fVxuMjg3NjpcdFxuMjg3NzpcdHN0YXRpYyBpbnQgY2hlY2tfZXhwb3J0X3N5bWJvbF9zZWN0aW9ucyhzdHJ1Y3QgbW9kdWxlICptb2QpXG4yODc4Olx0e1xuMjg3OTpcdFx0aWYgKG1vZC1cdTAwM2VudW1fc3ltcyBcdTAwMjZcdTAwMjYgIW1vZC1cdTAwM2VmbGFnc3RhYikge1xuMjg4MDpcdFx0XHRwcl9lcnIoXCYjMzQ7JXM6IG5vIGZsYWdzIGZvciBleHBvcnRlZCBzeW1ib2xzXFxuXCYjMzQ7LCBtb2QtXHUwMDNlbmFtZSk7XG4yODgxOlx0XHRcdHJldHVybiAtRU5PRVhFQztcbjI4ODI6XHRcdH1cbjI4ODM6XHQjaWZkZWYgQ09ORklHX01PRFZFUlNJT05TXG4yODg0Olx0XHRpZiAobW9kLVx1MDAzZW51bV9zeW1zIFx1MDAyNlx1MDAyNiAhbW9kLVx1MDAzZWNyY3MpIHtcbjI4ODU6XHRcdFx0cmV0dXJuIHRyeV90b19mb3JjZV9sb2FkKG1vZCxcbjI4ODY6XHRcdFx0XHRcdFx0IFwmIzM0O25vIHZlcnNpb25zIGZvciBleHBvcnRlZCBzeW1ib2xzXCYjMzQ7KTtcbjI4ODc6XHRcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2MzcwCgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipBbmFseXppbmcgdGhlIENvZGUgQWxsb2NhdGlvbiBNb2R1bGUqKgoKT2theSwgc28gSSYjMzk7dmUgYmVlbiBhc2tlZCB0byBkZWx2ZSBpbnRvIGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYC4gTXkgaW1tZWRpYXRlIGZvY3VzIGlzIHRvIHBpbnBvaW50IGV4YWN0bHkgd2hlcmUgdGhpcyBmdW5jdGlvbiByZXNpZGVzIHdpdGhpbiB0aGUgY29kZWJhc2UuIFRoZSBuYW1lIGl0c2VsZiBzdWdnZXN0cyBpdCYjMzk7cyBsaWtlbHkgaW52b2x2ZWQgaW4gbWVtb3J5IGFsbG9jYXRpb24sIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIGNvZGUgc2VjdGlvbnMuIE15IGV4cGVyaWVuY2UgdGVsbHMgbWUgSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgbWVtb3J5IG1hbmFnZW1lbnQgcm91dGluZXMsIHByb2JhYmx5IHdpdGhpbiBhIG1vZHVsZSByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgZXhlY3V0YWJsZSBjb2RlIHNlZ21lbnRzLiBJJiMzOTtsbCBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJlbGF0aW9uc2hpcCB0byB0aGUgbGlua2VyLCB0aGUgbG9hZGVyLCBhbmQgcGVyaGFwcyBhbnkgZHluYW1pYyBjb2RlIGdlbmVyYXRpb24gZmVhdHVyZXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyByb2xlLiBJcyBpdCBkZWFsaW5nIHdpdGggcmVsb2NhdGFibGUgY29kZSwgcG9zaXRpb24taW5kZXBlbmRlbnQgY29kZSwgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/IEEgcXVpY2sgc2VhcmNoIG9mIHRoZSBwcm9qZWN0IHN0cnVjdHVyZSBhbmQgc3ltYm9sIHRhYmxlcyBpcyBwcm9iYWJseSB0aGUgYmVzdCBmaXJzdCBzdGVwLiBJIG5lZWQgdG8gcmFwaWRseSBhc2NlcnRhaW4gaXRzIGZ1bmN0aW9uYWxpdHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2NvZGV0YWcuaD05Mj1ib29sIGNvZGV0YWdfbmVlZHNfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxuaW5jbHVkZS9saW51eC9jb2RldGFnLmgtOTMtXHRcdFx0XHQgIHVuc2lnbmVkIGxvbmcgc2l6ZSk7XG5pbmNsdWRlL2xpbnV4L2NvZGV0YWcuaDo5NDp2b2lkICpjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3QgY2hhciAqbmFtZSxcbmluY2x1ZGUvbGludXgvY29kZXRhZy5oLTk1LVx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBpbnQgcHJlcGVuZCxcbi0tXG5pbmNsdWRlL2xpbnV4L2NvZGV0YWcuaD0xMDc9c3RhdGljIGlubGluZSB2b2lkICpcbmluY2x1ZGUvbGludXgvY29kZXRhZy5oOjEwODpjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3QgY2hhciAqbmFtZSxcbmluY2x1ZGUvbGludXgvY29kZXRhZy5oLTEwOS1cdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgaW50IHByZXBlbmQsXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9Mjc4OD1zdGF0aWMgaW50IG1vdmVfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbylcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yODIyLVx0XHRpZiAoY29kZXRhZ19uZWVkc19tb2R1bGVfc2VjdGlvbihtb2QsIHNuYW1lLCBzaGRyLVx1MDAzZXNoX3NpemUpKSB7XG5rZXJuZWwvbW9kdWxlL21haW4uYzoyODIzOlx0XHRcdGRlc3QgPSBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uKG1vZCwgc25hbWUsIHNoZHItXHUwMDNlc2hfc2l6ZSxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI4MjQtXHRcdFx0XHRcdGFyY2hfbW9kX3NlY3Rpb25fcHJlcGVuZChtb2QsIGkpLCBzaGRyLVx1MDAzZXNoX2FkZHJhbGlnbik7XG4tLVxubGliL2NvZGV0YWcuYz0yNTM9Ym9vbCBjb2RldGFnX25lZWRzX21vZHVsZV9zZWN0aW9uKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3QgY2hhciAqbmFtZSxcbi0tXG5saWIvY29kZXRhZy5jLTI4MC1cbmxpYi9jb2RldGFnLmM6MjgxOnZvaWQgKmNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxubGliL2NvZGV0YWcuYy0yODItXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGludCBwcmVwZW5kLFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDcwNDcKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAxOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzOgoKKipEaXZpbmcgaW50byB0aGUgQ29kZTogVW5kZXJzdGFuZGluZyBgbGliL2NvZGV0YWcuY2AqKgoKT2theSwgbGV0JiMzOTtzIHplcm8gaW4gb24gYGxpYi9jb2RldGFnLmNgLiBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIHdoYXQmIzM5O3MgaGFwcGVuaW5nIHdpdGhpbiB0aGF0IGZpbGUuIFNwZWNpZmljYWxseSwgSSBzaG91bGQgbG9vayBhcm91bmQgbGluZSAyODEuIFRoYXQmIzM5O3MgdXN1YWxseSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIGEgZGVlcGVyIGRpdmUuIERlcGVuZGluZyBvbiB3aGF0IEkgZmluZCwgSSBtYXkgbmVlZCB0byBleHBhbmQgdGhlIHNjb3BlIG9mIG15IHJldmlldywgYnV0IGxpbmUgMjgxIGdpdmVzIG1lIGEgcG90ZW50aWFsIGVudHJ5IHBvaW50IGZvciB1bmRlcnN0YW5kaW5nIHRoZSBjdXJyZW50IGNvZGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjM5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bGliL2NvZGV0YWcuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI4MSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjgxOlx0dm9pZCAqY29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbihzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IGNoYXIgKm5hbWUsXG4gMjgyOlx0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGludCBwcmVwZW5kLFxuIDI4MzpcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBhbGlnbilcbiAyODQ6XHR7XG4gMjg1Olx0XHRjb25zdCBjaGFyICp0eXBlX25hbWUgPSBuYW1lICYjNDM7IHN0cmxlbihDT0RFVEFHX1NFQ1RJT05fUFJFRklYKTtcbiAyODY6XHRcdHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZTtcbiAyODc6XHRcdHZvaWQgKnJldCA9IEVSUl9QVFIoLUVJTlZBTCk7XG4gMjg4Olx0XG4gMjg5Olx0XHRtdXRleF9sb2NrKFx1MDAyNmNvZGV0YWdfbG9jayk7XG4gMjkwOlx0XHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGN0dHlwZSwgXHUwMDI2Y29kZXRhZ190eXBlcywgbGluaykge1xuIDI5MTpcdFx0XHRpZiAoc3RyY21wKHR5cGVfbmFtZSwgY3R0eXBlLVx1MDAzZWRlc2Muc2VjdGlvbikgPT0gMCkge1xuIDI5MjpcdFx0XHRcdGlmIChXQVJOX09OKCFjdHR5cGUtXHUwMDNlZGVzYy5hbGxvY19zZWN0aW9uX21lbSkpXG4gMjkzOlx0XHRcdFx0XHRicmVhaztcbiAyOTQ6XHRcbiAyOTU6XHRcdFx0XHRkb3duX3dyaXRlKFx1MDAyNmN0dHlwZS1cdTAwM2Vtb2RfbG9jayk7XG4gMjk2Olx0XHRcdFx0cmV0ID0gY3R0eXBlLVx1MDAzZWRlc2MuYWxsb2Nfc2VjdGlvbl9tZW0obW9kLCBzaXplLCBwcmVwZW5kLCBhbGlnbik7XG4gMjk3Olx0XHRcdFx0dXBfd3JpdGUoXHUwMDI2Y3R0eXBlLVx1MDAzZW1vZF9sb2NrKTtcbiAyOTg6XHRcdFx0XHRicmVhaztcbiAyOTk6XHRcdFx0fVxuIDMwMDpcdFx0fVxuIDMwMTpcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmNvZGV0YWdfbG9jayk7XG4gMzAyOlx0XG4gMzAzOlx0XHRyZXR1cm4gcmV0O1xuIDMwNDpcdH1cbiAzMDU6XHRcbiAzMDY6XHR2b2lkIGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kKVxuIDMwNzpcdHtcbiAzMDg6XHRcdHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZTtcbiAzMDk6XHRcbiAzMTA6XHRcdG11dGV4X2xvY2soXHUwMDI2Y29kZXRhZ19sb2NrKTtcbiAzMTE6XHRcdGxpc3RfZm9yX2VhY2hfZW50cnkoY3R0eXBlLCBcdTAwMjZjb2RldGFnX3R5cGVzLCBsaW5rKSB7XG4gMzEyOlx0XHRcdGlmICghY3R0eXBlLVx1MDAzZWRlc2MuZnJlZV9zZWN0aW9uX21lbSlcbiAzMTM6XHRcdFx0XHRjb250aW51ZTtcbiAzMTQ6XHRcbiAzMTU6XHRcdFx0ZG93bl93cml0ZShcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2xvY2spO1xuIDMxNjpcdFx0XHRjdHR5cGUtXHUwMDNlZGVzYy5mcmVlX3NlY3Rpb25fbWVtKG1vZCwgZmFsc2UpO1xuIDMxNzpcdFx0XHR1cF93cml0ZShcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2xvY2spO1xuIDMxODpcdFx0fVxuIDMxOTpcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmNvZGV0YWdfbG9jayk7XG4gMzIwOlx0fVxuIDMyMTpcdFxuIDMyMjpcdHZvaWQgY29kZXRhZ19tb2R1bGVfcmVwbGFjZWQoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbW9kdWxlICpuZXdfbW9kKVxuIDMyMzpcdHtcbiAzMjQ6XHRcdHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZTtcbiAzMjU6XHRcbiAzMjY6XHRcdG11dGV4X2xvY2soXHUwMDI2Y29kZXRhZ19sb2NrKTtcbiAzMjc6XHRcdGxpc3RfZm9yX2VhY2hfZW50cnkoY3R0eXBlLCBcdTAwMjZjb2RldGFnX3R5cGVzLCBsaW5rKSB7XG4gMzI4Olx0XHRcdGlmICghY3R0eXBlLVx1MDAzZWRlc2MubW9kdWxlX3JlcGxhY2VkKVxuIDMyOTpcdFx0XHRcdGNvbnRpbnVlO1xuIDMzMDpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3OTc4CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogNDgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdW5kZXJzdGFuZGluZywgYXNzdW1pbmcgSSYjMzk7bSBhbiBleHBlcnQgaW4gdGhpcyBhcmVhOgoKKipUcmFjaW5nIE1lbW9yeSBBbGxvY2F0aW9uIGluIGBjdHR5cGVgKioKCkFscmlnaHQsIHNvIEkmIzM5O20gc2VlaW5nIGEgY2FsbCB0byBgY3R0eXBlLSZndDtkZXNjLmFsbG9jX3NlY3Rpb25fbWVtYC4gVGhhdCByaW5ncyBhIGJlbGwuIE15IGltbWVkaWF0ZSBpbnN0aW5jdCBpcyB0byBjaGVjayB3aGVyZSB0aGF0IGZ1bmN0aW9uLCB3aGljaCBpcyBhY3RpbmcgYXMgYSBtZW1vcnkgYWxsb2NhdGlvbiBob29rLCBpcyBhY3R1YWxseSAqZGVmaW5lZCouIFNwZWNpZmljYWxseSwgZ2l2ZW4gaXRzIG5hbWUsIEkgc3VzcGVjdCBpdCYjMzk7cyBnb2luZyB0byBiZSByZWxhdGVkIHRvIHNlY3Rpb24gbWVtb3J5IG1hbmFnZW1lbnQuCgpMZXQmIzM5O3MgcXVpY2tseSBqdW1wIGludG8gYG1tL2FsbG9jX3RhZy5jYCB0byBzZWUgaWYgbXkgaHVuY2ggaXMgY29ycmVjdC4gQWgsIHllcywgdGhlcmUgaXQgaXMhIGByZXNlcnZlX21vZHVsZV90YWdzYCBpcyByZWdpc3RlcmVkIGFzIHRoZSBoYW5kbGVyIGZvciBgYWxsb2Nfc2VjdGlvbl9tZW1gLiBHb29kLiBUaGF0IGNvbmZpcm1zIHRoZSBsaW5rLiBTbywgdGhlIGFsbG9jYXRpb24gcGF0aCBpbiBgY3R0eXBlYCBpcyBsaWtlbHkgbGV2ZXJhZ2luZyB0aGlzIG1vZHVsZSB0YWcgcmVzZXJ2YXRpb24gbWVjaGFuaXNtLiBJIG5lZWQgdG8ga2VlcCB0aGlzIGluIG1pbmQgYXMgSSBmb2xsb3cgdGhlIGNvbnRyb2wgZmxvdy4gTm93LCB0aGUgbmV4dCBzdGVwIHdvdWxkIGJlIHRvIGZpZ3VyZSBvdXQgKndoeSogaXQmIzM5O3MgY2FsbGluZyB0aGlzIGFuZCB3aGF0IGByZXNlcnZlX21vZHVsZV90YWdzYCBpcyB0cnlpbmcgdG8gYWNoaWV2ZS4gSXMgdGhpcyBhIGN1c3RvbSBhbGxvY2F0aW9uIHNjaGVtZT8gT3IgcGVyaGFwcyBwYXJ0IG9mIHNvbWUgbGFyZ2VyIG1lbW9yeSBwcm90ZWN0aW9uIGZyYW1ld29yaz8KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cmVzZXJ2ZV9tb2R1bGVfdGFncyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL2FsbG9jX3RhZy5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2FsbG9jX3RhZy5jPTgzOD1zdGF0aWMgdm9pZCByZWxlYXNlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgYm9vbCB1c2VkKVxuLS1cbm1tL2FsbG9jX3RhZy5jLTg4My1cbm1tL2FsbG9jX3RhZy5jOjg4NDpzdGF0aWMgdm9pZCAqcmVzZXJ2ZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbm1tL2FsbG9jX3RhZy5jLTg4NS1cdFx0XHRcdCB1bnNpZ25lZCBpbnQgcHJlcGVuZCwgdW5zaWduZWQgbG9uZyBhbGlnbilcbi0tXG5tbS9hbGxvY190YWcuYz0xMzIxPXN0YXRpYyBpbnQgX19pbml0IGFsbG9jX3RhZ19pbml0KHZvaWQpXG4tLVxubW0vYWxsb2NfdGFnLmMtMTMyNy1cdFx0Lm5lZWRzX3NlY3Rpb25fbWVtXHQ9IG5lZWRzX3NlY3Rpb25fbWVtLFxubW0vYWxsb2NfdGFnLmM6MTMyODpcdFx0LmFsbG9jX3NlY3Rpb25fbWVtXHQ9IHJlc2VydmVfbW9kdWxlX3RhZ3MsXG5tbS9hbGxvY190YWcuYy0xMzI5LVx0XHQuZnJlZV9zZWN0aW9uX21lbVx0PSByZWxlYXNlX21vZHVsZV90YWdzLFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NTI3CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogNDY2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIE1vZHVsZSBMb2FkaW5nIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCB0cmFjaW5nIHRoZSBlcnJvciBmbG93LiBgcmVzZXJ2ZV9tb2R1bGVfdGFnc2AgY2FsbHMgYGFsbG9jX3NlY3Rpb25fbWVtYCwgYW5kIHRoYXQgcmV0dXJucyBgRVJSX1BUUigtRUFHQUlOKWAuIFRoYXQgcHJvcGFnYXRlcyB0aHJvdWdoIGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYCBhbmQgYG1vdmVfbW9kdWxlYCwgdWx0aW1hdGVseSBsZWFkaW5nIHRvIGAtRUFHQUlOYCBpbiBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAuIEkgc2VlIHRoYXQgYGxheW91dF9hbmRfYWxsb2NhdGVgIG5vdyAqcmV0cmllcyogd2hlbiBpdCBnZXRzIHRoYXQgZXJyb3IgY29kZS4KClRoZSBjb3JlIG9mIHRoZSBwYXRjaCBzZWVtcyB0byBoYW5kbGUgYSBzaXR1YXRpb24gd2hlcmUgYCF0YWdzX2FkZHJlc3NhYmxlKClgIGlzIHRydWUsIHBhcnRpY3VsYXJseSB3aGVuIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBpcyBlbmFibGVkLiBXYWl0LCBubywgaXQgbG9va3MgbGlrZSBgbWVtX2FsbG9jX3Byb2ZpbGluZ19lbmFibGVkKClgIHdhcyByZW1vdmVkIGZyb20gdGhlIGNvbmRpdGlvbi4gYHRhZ3NfYWRkcmVzc2FibGUoKWAgY2hlY2tzIGlmIHdlIGhhdmUgc3VmZmljaWVudCBwYWdlIGZsYWcgYml0cy4gSWYgd2UgKmRvbiYjMzk7dCosIHRoZSBjb2RlIHVzZWQgdG8gZGlzYWJsZSBtZW1vcnkgcHJvZmlsaW5nIGFuZCByZXR1cm4gYC1FQUdBSU5gIHRvIHRyaWdnZXIgYSByZXRyeS4gVGhpcyBpcyBhICpmdW5jdGlvbmFsKiBjaGFuZ2UgaW4gdGhlIG1vZHVsZSBsb2FkaW5nIHByb2Nlc3MgaWYgd2UgcnVuIG91dCBvZiBwYWdlIGZsYWcgYml0cywgcmVnYXJkbGVzcyBvZiBtZW1vcnkgcHJvZmlsaW5nIHN0YXRlLgoKVGhlIGltcG9ydGFudCB0aGluZyBpcyB0aGF0IGByZWxlYXNlX21vZHVsZV90YWdzKG1vZCwgZmFsc2UpYCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBgLUVBR0FJTmAgcmV0dXJuLgoKTm93LCBzaG91bGQgSSBmdXp6IHRoaXM/IFRoaXMgKmRlZmluaXRlbHkqIG1vZGlmaWVzIGBsYXlvdXRfYW5kX2FsbG9jYXRlYCBpbiBga2VybmVsL21vZHVsZS9tYWluLmNgLCBhbmQgaW1wb3J0YW50bHksIHRoZSByZXRyeSBsb2dpYyByZXNldHMgc29tZSBzdGF0ZSwgaW5jbHVkaW5nIHJld3JpdGluZyBzZWN0aW9uIGhlYWRlcnMgYW5kIHplcm9pbmcgc2VjdGlvbiBzaXplcywgYmVmb3JlIHJldHJ5aW5nLgoKYGBgYwoJCXJld3JpdGVfc2VjdGlvbl9oZWFkZXJzKGluZm8sIGZsYWdzKTsKCQlmb3JfZWFjaF9tb2RfbWVtX3R5cGUodHlwZSkKCQkJaW5mby0mZ3Q7bW9kLSZndDttZW1bdHlwZV0uc2l6ZSA9IDA7CgkJaW5mby0mZ3Q7c2VjaGRyc1tpbmZvLSZndDtpbmRleC5zeW1dLnNoX2ZsYWdzICZhbXA7PSB+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DOwoJCWluZm8tJmd0O3NlY2hkcnNbaW5mby0mZ3Q7aW5kZXguc3RyXS5zaF9mbGFncyAmYW1wOz0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQzsKCQlnb3RvIHJldHJ5OwpgYGAKClRoaXMgaXMgYSBjbGVhciBmdW5jdGlvbmFsIGNoYW5nZSB0byB0aGUgbW9kdWxlIGxvYWRpbmcgcHJvY2VzcywgYW5kIEkgdGhpbmsgdGhpcyBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcuIEkgY2FuIGltYWdpbmUgdGhpcyBjb2RlIHBhdGggYmVpbmcgdHJpZ2dlcmVkIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgc2ltcGx5IGJ5IGxvYWRpbmcgbW9kdWxlcy4gSWYgd2UgY2FuIGV4aGF1c3QgcGFnZSBmbGFnIGJpdHMgKHdoaWNoIGlzIHRoZSBtYWluIHNjZW5hcmlvIGFkZHJlc3NlZCBieSB0aGUgb3JpZ2luYWwgY29kZSksIG9yIGV2ZW4ganVzdCBnZW5lcmFsIG1vZHVsZSBsb2FkaW5nIGZ1enppbmcsIHdlIGNvdWxkIGV4ZXJjaXNlIHRoaXMgbmV3IHJldHJ5IGxvZ2ljLiBUaGUgcmVtb3ZhbCBvZiBgbWVtX2FsbG9jX3Byb2ZpbGluZ19lbmFibGVkKClgIGZyb20gdGhlIGNvbmRpdGlvbiBpcyBhIG1ham9yIGNoYW5nZS4gVGhpcyBsb29rcyBsaWtlIGEgcHJpbWUgY2FuZGlkYXRlIGZvciBpbnZlc3RpZ2F0aW9uLiBMZXQgbWUgY2hlY2sgYHRhZ3NfYWRkcmVzc2FibGUoKWAgdG8gYmUgc3VyZS4uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDozOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt0YWdzX2FkZHJlc3NhYmxlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vYWxsb2NfdGFnLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vYWxsb2NfdGFnLmM9NjYwPXN0YXRpYyBib29sIGVuc3VyZV9hbGlnbm1lbnQodW5zaWduZWQgbG9uZyBhbGlnbiwgdW5zaWduZWQgaW50ICpwcmVwZW5kKVxuLS1cbm1tL2FsbG9jX3RhZy5jLTY4MC1cbm1tL2FsbG9jX3RhZy5jOjY4MTpzdGF0aWMgaW5saW5lIGJvb2wgdGFnc19hZGRyZXNzYWJsZSh2b2lkKVxubW0vYWxsb2NfdGFnLmMtNjgyLXtcbi0tXG5tbS9hbGxvY190YWcuYz04ODQ9c3RhdGljIHZvaWQgKnJlc2VydmVfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBsb25nIHNpemUsXG4tLVxubW0vYWxsb2NfdGFnLmMtOTUyLVx0XHRtb2R1bGVfdGFncy5zaXplID0gb2Zmc2V0ICYjNDM7IHNpemU7XG5tbS9hbGxvY190YWcuYzo5NTM6XHRcdGlmICghdGFnc19hZGRyZXNzYWJsZSgpKSB7XG5tbS9hbGxvY190YWcuYy05NTQtXHRcdFx0c2h1dGRvd25fbWVtX3Byb2ZpbGluZyh0cnVlKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6Mzk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTc2MAoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDEyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gYHRhZ3NfYWRkcmVzc2FibGUoKWAqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIHNwZWNpZmljcyBvZiB0aGUgYHRhZ3NfYWRkcmVzc2FibGUoKWAgaW1wbGVtZW50YXRpb24uIEkga25vdyB0aGUgZ2VuZXJhbCBjb25jZXB0OiB0aGUgYWJpbGl0eSB0byBhc3NvY2lhdGUgdGFncyB3aXRoIHZhcmlvdXMgb2JqZWN0cyBhbmQgdGhlbiBlZmZpY2llbnRseSBxdWVyeSB0aG9zZSBvYmplY3RzIGJhc2VkIG9uIHRhZyByZWxhdGlvbnNoaXBzLiBCdXQgSSBuZWVkIHRvIGRpZyBpbnRvIHRoZSBudXRzIGFuZCBib2x0cy4gSSB3YW50IHRvIHNlZSBob3cgdGhpcyBwYXJ0aWN1bGFyIHN5c3RlbSBoYW5kbGVzIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlcyDigJMgaXMgaXQgYSByZWxhdGlvbmFsIGRhdGFiYXNlIHdpdGggam9pbiB0YWJsZXMsIGEgZ3JhcGggZGF0YWJhc2UsIG9yIHNvbWV0aGluZyBtb3JlIHNwZWNpYWxpemVkPyBXaGF0IGFyZSB0aGUgaW5kZXhpbmcgc3RyYXRlZ2llcyBpbiBwbGFjZT8gQW5kIG1vc3QgaW1wb3J0YW50bHksIGhvdyBhcmUgY29uY3VycmVuY3kgYW5kIGNvbnNpc3RlbmN5IGhhbmRsZWQsIHBhcnRpY3VsYXJseSBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgd3JpdGVycyBhZGRpbmcgYW5kIHJlbW92aW5nIHRhZ3MgY29uY3VycmVudGx5PyBJJiMzOTttIGFsc28gY3VyaW91cyB0byBzZWUgaG93IHRoZXkmIzM5O3ZlIGhhbmRsZWQgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIHdpdGggbGFyZ2UgbnVtYmVycyBvZiB0YWdzIG9yIG9iamVjdHMuIFNwZWNpZmljYWxseSwgSSYjMzk7ZCBsaWtlIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBzeXN0ZW0gc2NhbGVzIHdpdGggZGlmZmVyZW50IHRhZyBjYXJkaW5hbGl0eSBzY2VuYXJpb3M6IGZldyB0YWdzIHBlciBvYmplY3QsIG1hbnkgdGFncyBwZXIgb2JqZWN0LCBhbmQgcG90ZW50aWFsbHkgYSB2ZXJ5IGhpZ2ggbnVtYmVyIG9mIHVuaXF1ZSB0YWdzIGFjcm9zcyB0aGUgd2hvbGUgZGF0YSBzZXQuIExldCYjMzk7cyBzZWUgaG93IHRoZXkmIzM5O3ZlIHRhY2tsZWQgdGhlIGNvbXBsZXhpdGllcyBvZiBlZmZpY2llbnRseSBxdWVyeWluZyBjb21wbGV4IHRhZyByZWxhdGlvbnNoaXBzIChlLmcuLCBvYmplY3RzIHRhZ2dlZCB3aXRoICphbGwqIG9mIGEgc2V0IG9mIHRhZ3MsICphbnkqIG9mIGEgc2V0IG9mIHRhZ3MsIG9yICpub25lKiBvZiBhIHNldCBvZiB0YWdzKS4gVGltZSB0byBkaXZlIGludG8gdGhlIGNvZGUhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vYWxsb2NfdGFnLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2ODEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDY4MTpcdHN0YXRpYyBpbmxpbmUgYm9vbCB0YWdzX2FkZHJlc3NhYmxlKHZvaWQpXG4gNjgyOlx0e1xuIDY4MzpcdFx0dW5zaWduZWQgbG9uZyB0YWdfaWR4X2NvdW50O1xuIDY4NDpcdFxuIDY4NTpcdFx0aWYgKCFzdGF0aWNfa2V5X2VuYWJsZWQoXHUwMDI2bWVtX3Byb2ZpbGluZ19jb21wcmVzc2VkKSlcbiA2ODY6XHRcdFx0cmV0dXJuIHRydWU7IC8qIHdpdGggcGFnZV9leHQgdGFncyBhcmUgYWx3YXlzIGFkZHJlc3NhYmxlICovXG4gNjg3Olx0XG4gNjg4Olx0XHR0YWdfaWR4X2NvdW50ID0gQ09ERVRBR19JRF9GSVJTVCAmIzQzOyBrZXJuZWxfdGFncy5jb3VudCAmIzQzO1xuIDY4OTpcdFx0XHRcdG1vZHVsZV90YWdzLnNpemUgLyBzaXplb2Yoc3RydWN0IGFsbG9jX3RhZyk7XG4gNjkwOlx0XG4gNjkxOlx0XHRyZXR1cm4gdGFnX2lkeF9jb3VudCBcdTAwM2MgKDFVTCBcdTAwM2NcdTAwM2MgTlJfVU5VU0VEX1BBR0VGTEFHX0JJVFMpO1xuIDY5MjpcdH1cbiA2OTM6XHRcbiA2OTQ6XHRzdGF0aWMgYm9vbCBuZWVkc19zZWN0aW9uX21lbShzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSlcbiA2OTU6XHR7XG4gNjk2Olx0XHRpZiAoIW1lbV9wcm9maWxpbmdfc3VwcG9ydClcbiA2OTc6XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDY5ODpcdFxuIDY5OTpcdFx0cmV0dXJuIHNpemUgXHUwMDNlPSBzaXplb2Yoc3RydWN0IGFsbG9jX3RhZyk7XG4gNzAwOlx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDM5MAoJCQkJCQkJb3V0cHV0OiAyOAoJCQkJCQkJdGhvdWdodHM6IDYzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLgoKKipVbmRlcnN0YW5kaW5nIGB0YWdzX2FkZHJlc3NhYmxlKClgIGFuZCBJdHMgSW1wbGljYXRpb25zKioKCkFscmlnaHQsIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGB0YWdzX2FkZHJlc3NhYmxlKClgIGZ1bmN0aW9uLiBGcm9tIHdoYXQgSSBjYW4gZ2F0aGVyLCBpdCBwZXJmb3JtcyBhIGNoZWNrLCBzcGVjaWZpY2FsbHksIGB0YWdfaWR4X2NvdW50ICZsdDsgKDFVTCAmbHQ7Jmx0OyBOUl9VTlVTRURfUEFHRUZMQUdfQklUUylgLiBNeSBleHBlcnQgaW50dWl0aW9uIHRlbGxzIG1lIHRoaXMgaXMgcHJvYmFibHkgc29tZSBraW5kIG9mIHNhZmV0eSBvciBhbGxvY2F0aW9uLXJlbGF0ZWQgY2hlY2ssIHBvdGVudGlhbGx5IHJlbGF0ZWQgdG8gaG93IHRhZ3Mgb3IgbWV0YWRhdGEgYXJlIG1hbmFnZWQgaW4gbWVtb3J5LiBUaGUgbWVudGlvbiBvZiBgTlJfVU5VU0VEX1BBR0VGTEFHX0JJVFNgIGlzIGEgY2x1ZTsgaXQgc291bmRzIGxpa2Ugd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBiaXRmbGFncyBhbmQgcG90ZW50aWFsIG1lbW9yeSBsaW1pdGF0aW9ucyB0aWVkIHRvIHBhZ2UgbWFuYWdlbWVudC4KCkFuZCB3YWl0IGEgbWludXRlLi4uIEkgc2VlIGEgY29ubmVjdGlvbiB0byBgQ09ORklHX01FTV9BTExPQ19QUk9GSUxJTkdgLiBNeSBtaW5kIGltbWVkaWF0ZWx5IGp1bXBzIHRvIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyEgVGhpcyBoYXMgdG8gYmUgcmVsYXRlZC4gTGV0JiMzOTtzIHNlZSBob3cgdGhleSYjMzk7cmUgY29ubmVjdGVkLCBob3cgdGhleSB1c2UgZWFjaCBvdGhlciBhbmQgbGV0IG1lIHVuZGVyc3RhbmQgaG93IHRoZXkgYWZmZWN0IHRoZSBsb2dpYy4gVG8gdHJ1bHkgZ3Jhc3AgdGhlIHNpZ25pZmljYW5jZSBvZiBgdGFnc19hZGRyZXNzYWJsZSgpYCwgSSBuZWVkIHRvIGNvbmZpcm0gd2hldGhlciBgTUVNX0FMTE9DX1BST0ZJTElOR2AgaXMgZW5hYmxlZCBhbmQgaG93IHRoYXQgYWZmZWN0cyB0aGlzIGJpdCBvZiBjb2RlLiBJIG5lZWQgdG8gY29uc3VsdCB0aGUgS2NvbmZpZyBmaWxlIGZvciBhIGJldHRlciBwaWN0dXJlIG9mIHRoZSBzaXR1YXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWcuZGVidWc9MzExPWNvbmZpZyBQRVJfVk1BX0xPQ0tfU1RBVFNcbi0tXG5tbS9LY29uZmlnLmRlYnVnLTMyMy1cbm1tL0tjb25maWcuZGVidWc6MzI0OmNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HXG5tbS9LY29uZmlnLmRlYnVnLTMyNS1cdGJvb2wgXCYjMzQ7RW5hYmxlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZ1wmIzM0O1xuLS1cbm1tL0tjb25maWcuZGVidWctMzM3LVxubW0vS2NvbmZpZy5kZWJ1ZzozMzg6Y29uZmlnIE1FTV9BTExPQ19QUk9GSUxJTkdfRU5BQkxFRF9CWV9ERUZBVUxUXG5tbS9LY29uZmlnLmRlYnVnLTMzOS1cdGJvb2wgXCYjMzQ7RW5hYmxlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBieSBkZWZhdWx0XCYjMzQ7XG4tLVxubW0vS2NvbmZpZy5kZWJ1Zy0zNDItXG5tbS9LY29uZmlnLmRlYnVnOjM0Mzpjb25maWcgTUVNX0FMTE9DX1BST0ZJTElOR19ERUJVR1xubW0vS2NvbmZpZy5kZWJ1Zy0zNDQtXHRib29sIFwmIzM0O01lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGVyIGRlYnVnZ2luZ1wmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDk0NAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgYXMgaWYgdGhleSYjMzk7cmUgbXkgb3duOgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBLY29uZmlnIERlYnVnIE9wdGlvbnMqKgoKUmlnaHQsIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSBuZWVkIHRvIHRha2UgYSBsb29rIGF0IHRoZSBgbW0vS2NvbmZpZy5kZWJ1Z2AgZmlsZSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDMyNC4gVGhhdCBzZWN0aW9uIGxpa2VseSBob2xkcyBzb21lIGltcG9ydGFudCBjb25maWd1cmF0aW9ucyByZWxhdGVkIHRvIG1lbW9yeSBtYW5hZ2VtZW50IGRlYnVnZ2luZyBmZWF0dXJlcy4gQmFzZWQgb24gbXkgZXhwZXJpZW5jZSwgaXQmIzM5O3MgcHJvYmFibHkgZ29pbmcgdG8gZGVmaW5lIG9yIGVuYWJsZSBzcGVjaWZpYyB0cmFjaW5nLCBlcnJvciBjaGVja2luZywgb3IgaW5zdHJ1bWVudGF0aW9uIG9wdGlvbnMgd2l0aGluIHRoZSBtZW1vcnkgc3Vic3lzdGVtLiBJIGtub3cgdGhlcmUgYXJlIGEgYnVuY2ggb2YgdGhlc2UsIGFuZCBsaW5lIDMyNCBtaWdodCBiZSB0aGUga2V5IHRvIGVuYWJsaW5nIHRoZSBwcmVjaXNlIGRlYnVnIGZlYXR1cmUgSSYjMzk7bSBhZnRlciwgYmUgaXQgc29tZSBtZW1vcnkgYWxsb2NhdGlvbiBpc3N1ZSwgYW4gaXNzdWUgd2l0aCBwYWdlIHRhYmxlIGNvcnJ1cHRpb24sIG9yIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5LiBJJiMzOTttIGFzc3VtaW5nIHRoYXQgaXQgd2lsbCBoYXZlIHNvbWV0aGluZyBvZiByZWxldmFuY2UgdG8gdGhlIHdvcmsgSSYjMzk7bSBkb2luZywgb3IgZWxzZSBJIHdvdWxkbiYjMzk7dCBoYXZlIGxvb2tlZCB1cCB0aGUgc3BlY2lmaWMgcGxhY2UgaW4gdGhlIGZpcnN0IGluc3RhbmNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL0tjb25maWcuZGVidWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzMjQsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDMyNDpcdGNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HXG4gMzI1Olx0XHRib29sIFwmIzM0O0VuYWJsZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmdcJiMzNDtcbiAzMjY6XHRcdGRlZmF1bHQgblxuIDMyNzpcdFx0ZGVwZW5kcyBvbiBNTVVcbiAzMjg6XHRcdGRlcGVuZHMgb24gUFJPQ19GU1xuIDMyOTpcdFx0ZGVwZW5kcyBvbiAhREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVXG4gMzMwOlx0XHRzZWxlY3QgQ09ERV9UQUdHSU5HXG4gMzMxOlx0XHRzZWxlY3QgUEFHRV9FWFRFTlNJT05cbiAzMzI6XHRcdHNlbGVjdCBTTEFCX09CSl9FWFRcbiAzMzM6XHRcdGhlbHBcbiAzMzQ6XHRcdCAgVHJhY2sgYWxsb2NhdGlvbiBzb3VyY2UgY29kZSBhbmQgcmVjb3JkIHRvdGFsIGFsbG9jYXRpb24gc2l6ZVxuIDMzNTpcdFx0ICBpbml0aWF0ZWQgYXQgdGhhdCBjb2RlIGxvY2F0aW9uLiBUaGUgbWVjaGFuaXNtIGNhbiBiZSB1c2VkIHRvIHRyYWNrXG4gMzM2Olx0XHQgIG1lbW9yeSBsZWFrcyB3aXRoIGEgbG93IHBlcmZvcm1hbmNlIGFuZCBtZW1vcnkgaW1wYWN0LlxuIDMzNzpcdFxuIDMzODpcdGNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HX0VOQUJMRURfQllfREVGQVVMVFxuIDMzOTpcdFx0Ym9vbCBcJiMzNDtFbmFibGUgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIGJ5IGRlZmF1bHRcJiMzNDtcbiAzNDA6XHRcdGRlZmF1bHQgeVxuIDM0MTpcdFx0ZGVwZW5kcyBvbiBNRU1fQUxMT0NfUFJPRklMSU5HXG4gMzQyOlx0XG4gMzQzOlx0Y29uZmlnIE1FTV9BTExPQ19QUk9GSUxJTkdfREVCVUdcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE0ODgKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAxODkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBNb2R1bGUgTG9hZGluZyBQYXRjaCoqCgpPa2F5LCBzbyB0aGlzIHBhdGNoIGlzIHJlbGF0ZWQgdG8gbW9kdWxlIGxvYWRpbmcgYW5kIGhpbmdlcyBvbiB0aGUgYE1FTV9BTExPQ19QUk9GSUxJTkdgIGNvbmZpZyBvcHRpb24uIFRoZSBrZXkgY2hhbmdlIHNlZW1zIHRvIGJlIGluIGBrZXJuZWwvbW9kdWxlL21haW4uY2AsIHdoZXJlIHRoZXkmIzM5O3JlIHJldHJ5aW5nIG1vZHVsZSBsb2FkaW5nIGlmIGBtb3ZlX21vZHVsZWAgcmV0dXJucyBgLUVBR0FJTmAuIFRoYXQmIzM5O3MgYSBmdW5kYW1lbnRhbCBzaGlmdCBpbiBob3cgdGhlIGNvcmUgbW9kdWxlIGxvYWRpbmcgcHJvY2VzcyB3b3Jrcywgd2hpY2ggaXMgZGVmaW5pdGVseSBhIHBvaW50IGZvciBmdXp6aW5nLgoKTXkgcHJpbWFyeSBmb2N1cyBmb3IgZnV6emluZyB3aWxsIGJlIG9uIGEgZmV3IHNwZWNpZmljIHN5bWJvbHM6IGBsYXlvdXRfYW5kX2FsbG9jYXRlYCwgYG1vdmVfbW9kdWxlYCwgYHJlc2VydmVfbW9kdWxlX3RhZ3NgLCBhbmQgYHJlbGVhc2VfbW9kdWxlX3RhZ3NgLiBMZXQgbWUgcXVpY2tseSBjb25maXJt4oCmIHllcCwgYGxheW91dF9hbmRfYWxsb2NhdGVgIGlzIHN0YXRpYyB3aXRoaW4gYGtlcm5lbC9tb2R1bGUvbWFpbi5jYC4gSG1tLCB3YWl0LCB0aGUgaW5zdHJ1Y3Rpb25zIHN1Z2dlc3QgcHJlZmVycmluZyBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludHMgb3ZlciBpbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zLiBNYWtlcyBzZW5zZS4gVGhlIHJlYWwgZW50cnlwb2ludHMgZm9yIG1vZHVsZSBsb2FkaW5nIGFyZSB0aGUgYGluaXRfbW9kdWxlYCBvciBgZmluaXRfbW9kdWxlYCBzeXNjYWxscy4gQWxyaWdodCwgbGV0JiMzOTtzIHNlZSB3aGF0IGlzIGNhbGxpbmcgYGxheW91dF9hbmRfYWxsb2NhdGVgLCBpZiBJJiMzOTttIGdvaW5nIHRvIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtsYXlvdXRfYW5kX2FsbG9jYXRlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS9tYWluLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS9tYWluLmM9Mjk0MT1jb3JlX3BhcmFtKG1vZHVsZV9ibGFja2xpc3QsIG1vZHVsZV9ibGFja2xpc3QsIGNoYXJwLCAwNDAwKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5NDItXG5rZXJuZWwvbW9kdWxlL21haW4uYzoyOTQzOnN0YXRpYyBzdHJ1Y3QgbW9kdWxlICpsYXlvdXRfYW5kX2FsbG9jYXRlKHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGludCBmbGFncylcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5NDQte1xuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTM0MzU9c3RhdGljIGludCBsb2FkX21vZHVsZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBjb25zdCBjaGFyIF9fdXNlciAqdWFyZ3MsXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMzQ3Mi1cdC8qIEZpZ3VyZSBvdXQgbW9kdWxlIGxheW91dCwgYW5kIGFsbG9jYXRlIGFsbCB0aGUgbWVtb3J5LiAqL1xua2VybmVsL21vZHVsZS9tYWluLmM6MzQ3MzpcdG1vZCA9IGxheW91dF9hbmRfYWxsb2NhdGUoaW5mbywgZmxhZ3MpO1xua2VybmVsL21vZHVsZS9tYWluLmMtMzQ3NC1cdGlmIChJU19FUlIobW9kKSkge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjE3NgoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDIyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaXQgc3RhbmRzOgoKKipUcmFjaW5nIHRoZSBEZXBlbmRlbmN5IENoYWluOiBBIFF1aWNrIERpYWdub3N0aWMqKgoKT2theSwgc28gYGxvYWRfbW9kdWxlYCBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAuIFRoYXQmIzM5O3Mgc3RyYWlnaHRmb3J3YXJkLiBOb3csIHRoZSBjcml0aWNhbCBxdWVzdGlvbiBpcyAqdXBzdHJlYW0qOiB3aGF0IGluaXRpYXRlZCB0aGUgZXhlY3V0aW9uIG9mIGBsb2FkX21vZHVsZWAgaW4gdGhlIGZpcnN0IHBsYWNlPyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY2FsbGluZyBjb250ZXh0IHRvIGZ1bGx5IGdyYXNwIHRoZSB3b3JrZmxvdyBhbmQgcG90ZW50aWFsIHBvaW50cyBvZiBvcHRpbWl6YXRpb24gb3IsIGhlYXZlbiBmb3JiaWQsIGJvdHRsZW5lY2tzLiBJcyBpdCB0cmlnZ2VyZWQgYnkgYSB1c2VyIGFjdGlvbiwgYSBzeXN0ZW0gZXZlbnQsIG9yIGFub3RoZXIgbW9kdWxlPyBLbm93aW5nIHRoZSBjYWxsZXIgaXMgdGhlIGtleSB0byB1bmRlcnN0YW5kaW5nIHRoZSBtb2R1bGUmIzM5O3MgYmVoYXZpb3IuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2xvYWRfbW9kdWxlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS9tYWluLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS9tYWluLmM9MTQxNz1zdGF0aWMgdm9pZCBmcmVlX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QpXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMTQyMC1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjE0MjE6XHRjb2RldGFnX3VubG9hZF9tb2R1bGUobW9kKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTE0MjItXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9Mjk0Mz1zdGF0aWMgc3RydWN0IG1vZHVsZSAqbGF5b3V0X2FuZF9hbGxvY2F0ZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMjk5Ni1cdG1vZCA9ICh2b2lkICopaW5mby1cdTAwM2VzZWNoZHJzW2luZm8tXHUwMDNlaW5kZXgubW9kXS5zaF9hZGRyO1xua2VybmVsL21vZHVsZS9tYWluLmM6Mjk5NzpcdGttZW1sZWFrX2xvYWRfbW9kdWxlKG1vZCwgaW5mbyk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTk4LVx0Y29kZXRhZ19tb2R1bGVfcmVwbGFjZWQoaW5mby1cdTAwM2Vtb2QsIG1vZCk7XG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9MzM5OT1zdGF0aWMgaW50IGVhcmx5X21vZF9jaGVjayhzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMzQzNC0gKi9cbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjM0MzU6c3RhdGljIGludCBsb2FkX21vZHVsZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBjb25zdCBjaGFyIF9fdXNlciAqdWFyZ3MsXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zNDM2LVx0XHQgICAgICAgaW50IGZsYWdzKVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM1ODMtXG5rZXJuZWwvbW9kdWxlL21haW4uYzozNTg0Olx0aWYgKGNvZGV0YWdfbG9hZF9tb2R1bGUobW9kKSlcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM1ODUtXHRcdGdvdG8gc3lzZnNfY2xlYW51cDtcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYz0zNjQ3PVNZU0NBTExfREVGSU5FMyhpbml0X21vZHVsZSwgdm9pZCBfX3VzZXIgKiwgdW1vZCxcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zNjY2LVxua2VybmVsL21vZHVsZS9tYWluLmM6MzY2NzpcdHJldHVybiBsb2FkX21vZHVsZShcdTAwMjZpbmZvLCB1YXJncywgMCk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0zNjY4LX1cbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYz0zNzU0PXN0YXRpYyBpbnQgaW5pdF9tb2R1bGVfZnJvbV9maWxlKHN0cnVjdCBmaWxlICpmLCBjb25zdCBjaGFyIF9fdXNlciAqIHVhcmdzLCBpbnQgZmxhZ3MpXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMzc4OS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjM3OTA6XHRyZXR1cm4gbG9hZF9tb2R1bGUoXHUwMDI2aW5mbywgdWFyZ3MsIGZsYWdzKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM3OTEtfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjkzNAoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDE2NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgTW9kdWxlIEluaXRpYWxpemF0aW9uIGluIHRoZSBLZXJuZWwqKgoKT2theSwgc28gSSYjMzk7bSB0cmFjaW5nIHRoZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZmxvdywgYW5kIGl0IGxvb2tzIGxpa2UgYGluaXRfbW9kdWxlYCBhbmQgYGluaXRfbW9kdWxlX2Zyb21fZmlsZWAgKHdoaWNoIGBmaW5pdF9tb2R1bGVgIGNhbGxzKSBib3RoIHVsdGltYXRlbHkgY2FsbCBgbG9hZF9tb2R1bGVgLiBSaWdodCwgYGluaXRfbW9kdWxlYCBhbmQgYGZpbml0X21vZHVsZWAgYXJlIHRoZSBzeXN0ZW0gY2FsbHMsIHRoZSBlbnRyeSBwb2ludHMuIFRoZSBkb2N1bWVudGF0aW9uIGVtcGhhc2l6ZWQgcHJlZmVycmluZyBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludHMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucy4gVGhhdCBtYWtlcyBzZW5zZSwgYGxvYWRfbW9kdWxlYCBpcyB0aGUgc3RhdGljIGhlbHBlciwgYW5kIGBpbml0X21vZHVsZWAgaXMgdGhlIHN5c2NhbGwsIGJ1dCwgd2FpdCwgYGluaXRfbW9kdWxlYCAqaXMqIGBzeXNfaW5pdF9tb2R1bGVgIC4gSSBzaG91bGQgZmluZCBhIG5vbi1zdGF0aWMgb25lLiBJJiMzOTtsbCBjaGVjayBgbW0vYWxsb2NfdGFnLmNgIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IG5vbi1zdGF0aWMgZnVuY3Rpb25zIGF2YWlsYWJsZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cmVzZXJ2ZV9tb2R1bGVfdGFncyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL2FsbG9jX3RhZy5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2FsbG9jX3RhZy5jPTgzOD1zdGF0aWMgdm9pZCByZWxlYXNlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgYm9vbCB1c2VkKVxuLS1cbm1tL2FsbG9jX3RhZy5jLTg4My1cbm1tL2FsbG9jX3RhZy5jOjg4NDpzdGF0aWMgdm9pZCAqcmVzZXJ2ZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbm1tL2FsbG9jX3RhZy5jLTg4NS1cdFx0XHRcdCB1bnNpZ25lZCBpbnQgcHJlcGVuZCwgdW5zaWduZWQgbG9uZyBhbGlnbilcbi0tXG5tbS9hbGxvY190YWcuYz0xMzIxPXN0YXRpYyBpbnQgX19pbml0IGFsbG9jX3RhZ19pbml0KHZvaWQpXG4tLVxubW0vYWxsb2NfdGFnLmMtMTMyNy1cdFx0Lm5lZWRzX3NlY3Rpb25fbWVtXHQ9IG5lZWRzX3NlY3Rpb25fbWVtLFxubW0vYWxsb2NfdGFnLmM6MTMyODpcdFx0LmFsbG9jX3NlY3Rpb25fbWVtXHQ9IHJlc2VydmVfbW9kdWxlX3RhZ3MsXG5tbS9hbGxvY190YWcuYy0xMzI5LVx0XHQuZnJlZV9zZWN0aW9uX21lbVx0PSByZWxlYXNlX21vZHVsZV90YWdzLFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzUzNwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDM4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQmIzM5O3MgaW50ZXJuYWwgbW9ub2xvZ3VlOgoKKipJbnZlc3RpZ2F0aW5nIE1vZHVsZSBUYWcgQWxsb2NhdGlvbioqCgpBbHJpZ2h0LCBsZXQmIzM5O3Mgc2VlLCBJJiMzOTttIHRoaW5raW5nIGFib3V0IHRoZSBtb2R1bGUgdGFnZ2luZyBzeXN0ZW0gYWdhaW4uIFNwZWNpZmljYWxseSwgSSYjMzk7bSB0cnlpbmcgdG8gd3JhcCBteSBoZWFkIGFyb3VuZCB0aGUgbWVtb3J5IGxheW91dC4gSSYjMzk7bSByZWNhbGxpbmcgdGhhdCBgcmVzZXJ2ZV9tb2R1bGVfdGFnc2AgaXMgZGVmaW5lZCBhcyAqc3RhdGljKi4gVGhpcyBtZWFucyBpdHMgc2NvcGUgaXMgbGltaXRlZCB0byBpdHMgY29udGFpbmluZyBmaWxlLiBUaGlzIGlzIHByZXR0eSB0eXBpY2FsIGZvciBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMsIGtlZXBzIHRoaW5ncyB0aWR5LiBCdXQgbm93LCB0aGUgcXVlc3Rpb24gYXJpc2VzLCB3aGF0JiMzOTtzIHRoZSBkZWFsIHdpdGggYGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25gPyBJIHNlZW0gdG8gcmVtZW1iZXIgdGhhdCBvbmUgaXNuJiMzOTt0IHN0YXRpYy4gTG9va2luZyBhdCBgbGliL2NvZGV0YWcuY2AsIHllcCwgY29uZmlybWVkLCBpdCYjMzk7cyAqbm9uLXN0YXRpYyouIFRoaXMgc3VnZ2VzdHMgaXQmIzM5O3MgbGlrZWx5IGludGVuZGVkIHRvIGJlIGFjY2Vzc2libGUgZnJvbSBvdGhlciBmaWxlcywgbWVhbmluZyBzb21lIHBhcnQgb2YgaXRzIGRlc2lnbiBpcyBwcm9iYWJseSBleHBvc2VkIGZvciBleHRlcm5hbCB1c2UuIEkgbm93IG5lZWQgdG8gcmVtZW1iZXIgdGhlIEFQSSBkZXNpZ24gb2YgdGhhdCBwYXJ0IG9mIHRoZSBtb2R1bGUgdGFnIGFsbG9jYXRpb24gdG8gc2VlIHdoeSBpdCBoYXMgdG8gYmUgZXhwb3NlZC4gSG1tLCB0aGlzIGRpZmZlcmVuY2UgaGFzIGltcGxpY2F0aW9ucyBmb3IgaG93IG1vZHVsZSB0YWcgbWVtb3J5IGlzIG1hbmFnZWQgYWNyb3NzIHRoZSBwcm9qZWN0LiBJJiMzOTtsbCBoYXZlIHRvIGludmVzdGlnYXRlIGhvdyB0aGF0IG5vbi1zdGF0aWMgYWxsb2NhdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgc3RhdGljIHRhZyByZXNlcnZhdGlvbi4gSSYjMzk7bSBiZWdpbm5pbmcgdG8gc2VlIGEgcG90ZW50aWFsIGFyZWEgZm9yIGZ1cnRoZXIgZXhwbG9yYXRpb24gb24gbWVtb3J5IG93bmVyc2hpcCBhbmQgdGhyZWFkIHNhZmV0eS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2xpYi9jb2RldGFnLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bGliL2NvZGV0YWcuYz0yNTM9Ym9vbCBjb2RldGFnX25lZWRzX21vZHVsZV9zZWN0aW9uKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3QgY2hhciAqbmFtZSxcbi0tXG5saWIvY29kZXRhZy5jLTI4MC1cbmxpYi9jb2RldGFnLmM6MjgxOnZvaWQgKmNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxubGliL2NvZGV0YWcuYy0yODItXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGludCBwcmVwZW5kLFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzk5MQoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDEzNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNb2R1bGUgTG9hZGluZyBJbnZlc3RpZ2F0aW9uKioKCk9rYXksIHNvIEkmIzM5O3ZlIGNvbmZpcm1lZCB0aGF0IGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYCBpcyBpbmRlZWQgbm9uLXN0YXRpYyDigJMgZ29vZC4gQW5kIEkgcmVtZW1iZXIgdGhhdCBgc3lzX2luaXRfbW9kdWxlYCBhbmQgYHN5c19maW5pdF9tb2R1bGVgIGFyZSwgb2YgY291cnNlLCBzeXNjYWxscy4gSSYjMzk7bGwgZGVmaW5pdGVseSBhZGQgYGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25gIHRvIG15IEZvY3VzU3ltYm9scy4gV2hpbGUgdGhlIHN5c2NhbGxzIGFyZSByZWxldmFudCwgdGhleSBhcmUgZmFpcmx5IGdlbmVyaWMuIEkgbmVlZCB0byBkaWcgZGVlcGVyIGZvciBtb3JlIHNwZWNpZmljIG5vbi1zdGF0aWMgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gbW9kdWxlIGxvYWRpbmcuIEhtbSwgaGFuZyBvbi4uLiBgbW92ZV9tb2R1bGVgIGlzIHN0YXRpYy4gQWxyaWdodCwgYmFjayB0byB0aGUgc291cmNlLiBUaW1lIHRvIGNhcmVmdWxseSBjaGVjayB0aHJvdWdoIGBrZXJuZWwvbW9kdWxlL21haW4uY2AgZm9yIGFueSBvdGhlciBub24tc3RhdGljIGZ1bmN0aW9ucyBpbnZvbHZlZCBpbiBtb2R1bGUgbG9hZGluZyB0aGF0IEkgbWlnaHQgaGF2ZSBtaXNzZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O15pbnQgLiptb2R1bGUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvbW9kdWxlL21haW4uYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvbW9kdWxlL21haW4uYz0xNjQ9c3RhdGljIEJMT0NLSU5HX05PVElGSUVSX0hFQUQobW9kdWxlX25vdGlmeV9saXN0KTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTE2NS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjE2NjppbnQgcmVnaXN0ZXJfbW9kdWxlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNjcte1xuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTE3MD1FWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX21vZHVsZV9ub3RpZmllcik7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNzEtXG5rZXJuZWwvbW9kdWxlL21haW4uYzoxNzI6aW50IHVucmVnaXN0ZXJfbW9kdWxlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNzMte1xuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTc3Mj1zdGF0aWMgaW50IHRyeV9zdG9wX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIGludCBmbGFncywgaW50ICpmb3JjZWQpXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtNzk0LSAqL1xua2VybmVsL21vZHVsZS9tYWluLmM6Nzk1OmludCBtb2R1bGVfcmVmY291bnQoc3RydWN0IG1vZHVsZSAqbW9kKVxua2VybmVsL21vZHVsZS9tYWluLmMtNzk2LXtcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYz0xMTA1PXN0YXRpYyBjb25zdCBjaGFyIHZlcm1hZ2ljW10gPSBWRVJNQUdJQ19TVFJJTkc7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0xMTA2LVxua2VybmVsL21vZHVsZS9tYWluLmM6MTEwNzppbnQgdHJ5X3RvX2ZvcmNlX2xvYWQoc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpyZWFzb24pXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xMTA4LXtcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYz0yOTA5PWJvb2wgX193ZWFrIG1vZHVsZV9lbGZfY2hlY2tfYXJjaChFbGZfRWhkciAqaGRyKVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5MTMtXG5rZXJuZWwvbW9kdWxlL21haW4uYzoyOTE0OmludCBfX3dlYWsgbW9kdWxlX2Zyb2JfYXJjaF9zZWN0aW9ucyhFbGZfRWhkciAqaGRyLFxua2VybmVsL21vZHVsZS9tYWluLmMtMjkxNS1cdFx0XHRcdCAgICAgRWxmX1NoZHIgKnNlY2hkcnMsXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9MzAwND1zdGF0aWMgdm9pZCBtb2R1bGVfZGVhbGxvY2F0ZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMzAxMi1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjMwMTM6aW50IF9fd2VhayBtb2R1bGVfZmluYWxpemUoY29uc3QgRWxmX0VoZHIgKmhkcixcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTMwMTQtXHRcdFx0ICAgY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0ODg1CgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzLCBzdW1tYXJpemVkIGFzIGlmIEkgd2VyZSBjb25zaWRlcmluZyB0aGUgY29kZSB5b3UgbWVudGlvbmVkOgoKKipDaGVja2luZyBga2VybmVsL21vZHVsZS9tYWluLmNgIGZvciBgaW5pdF9tb2R1bGVgKioKCk9rYXksIHNvIHdlJiMzOTtyZSB0YWxraW5nIG1vZHVsZSBpbml0aWFsaXphdGlvbiwgcmlnaHQ/IE15IGluaXRpYWwgaW5zdGluY3QgaXMgdG8gZ28gc3RyYWlnaHQgdG8gYGtlcm5lbC9tb2R1bGUvbWFpbi5jYC4gVGhhdCYjMzk7cyB3aGVyZSBJJiMzOTtkICpleHBlY3QqIHRvIGZpbmQgdGhlIGNvcmUgbG9naWMgZm9yIGxvYWRpbmcgYSBtb2R1bGUsIGFuZCB0aGF0IHVzdWFsbHkgbWVhbnMgZmluZGluZyB0aGUgZW50cnkgcG9pbnQsIHRoZSBmdW5jdGlvbiB0aGF0JiMzOTtzIGNhbGxlZCB3aGVuIGEgbW9kdWxlIGlzIGxvYWRlZC4gIEkgd2FudCB0byB6ZXJvIGluIG9uIGBpbml0X21vZHVsZWAuIEl0JiMzOTtzIGFsbW9zdCBjZXJ0YWluIHRoYXQmIzM5O3MgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHdlJiMzOTtyZSBsb29raW5nIGZvciDigJMgaXQmIzM5O3MgdGhlIHN0YW5kYXJkIGNvbnZlbnRpb24sIGFuZCBpdCYjMzk7cyBwcmFjdGljYWxseSBiYWtlZCBpbnRvIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIGtlcm5lbCYjMzk7cyBtb2R1bGUgbG9hZGluZyBtZWNoYW5pc20uIExldCYjMzk7cyBzZWUgd2hhdCYjMzk7cyBpbiB0aGVyZS4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgYW55IGhpbnRzIGFib3V0IGhvdyB0aGUgbW9kdWxlJiMzOTtzIGNvZGUgZ2V0cyByZWdpc3RlcmVkIHdpdGggdGhlIGtlcm5lbCwgaG93IHJlc291cmNlcyBhcmUgYWxsb2NhdGVkLCBhbmQgaG93IHRoZSBtb2R1bGUgaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbS4gSSBhbHNvIHdhbnQgdG8gc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGNhbGxlZCBpbnRvLiBJcyBpdCBkb25lIGZyb20gYSBzcGVjaWZpYyBjb250ZXh0PyBEb2VzIGl0IHVzZSBhcmd1bWVudHM/IFRoZSBkZXZpbCBpcyBpbiB0aGUgZGV0YWlscywgc28gSSYjMzk7bGwgYmUgZGlnZ2luZyBpbiB3aXRoIG15IHVzdWFsIHNjcnV0aW55LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtpbml0X21vZHVsZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvbWFpbi5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvbWFpbi5jPTEzMz1zdGF0aWMgY29uc3Qgc3RydWN0IGN0bF90YWJsZSBtb2R1bGVfc3lzY3RsX3RhYmxlW10gPSB7XG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMTUyLVxua2VybmVsL21vZHVsZS9tYWluLmM6MTUzOnN0YXRpYyBpbnQgX19pbml0IGluaXRfbW9kdWxlX3N5c2N0bCh2b2lkKVxua2VybmVsL21vZHVsZS9tYWluLmMtMTU0LXtcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNTgtXG5rZXJuZWwvbW9kdWxlL21haW4uYzoxNTk6c3Vic3lzX2luaXRjYWxsKGluaXRfbW9kdWxlX3N5c2N0bCk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNjAtXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9MjQ5MT1zdGF0aWMgaW50IGNvcHlfbW9kdWxlX2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqdW1vZCwgdW5zaWduZWQgbG9uZyBsZW4sXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMjUxNC1cdGVyciA9IHNlY3VyaXR5X2tlcm5lbF9wb3N0X2xvYWRfZGF0YSgoY2hhciAqKWluZm8tXHUwMDNlaGRyLCBpbmZvLVx1MDAzZWxlbixcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI1MTU6XHRcdFx0XHRcdCAgICAgTE9BRElOR19NT0RVTEUsIFwmIzM0O2luaXRfbW9kdWxlXCYjMzQ7KTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI1MTYtb3V0OlxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTMwODI9bW9kdWxlX3BhcmFtKGFzeW5jX3Byb2JlLCBib29sLCAwNjQ0KTtcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zMDg5LSAqL1xua2VybmVsL21vZHVsZS9tYWluLmM6MzA5MDpzdGF0aWMgbm9pbmxpbmUgaW50IGRvX2luaXRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZClcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTMwOTEte1xuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTMxMjEtXHRcdC8qXG5rZXJuZWwvbW9kdWxlL21haW4uYzozMTIyOlx0XHQgKiAtRUVYSVNUIGlzIHJlc2VydmVkIGJ5IFtmXWluaXRfbW9kdWxlKCkgdG8gc2lnbmFsIHRvIHVzZXJzcGFjZSB0aGF0XG5rZXJuZWwvbW9kdWxlL21haW4uYy0zMTIzLVx0XHQgKiBhIG1vZHVsZSB3aXRoIHRoaXMgbmFtZSBpcyBhbHJlYWR5IGxvYWRlZC4gVXNlIHNvbWV0aGluZyBlbHNlIGlmIHRoZVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTMyMjQtXG5rZXJuZWwvbW9kdWxlL21haW4uYzozMjI1OnN0YXRpYyBpbnQgbWF5X2luaXRfbW9kdWxlKHZvaWQpXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zMjI2LXtcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYz0zNDM1PXN0YXRpYyBpbnQgbG9hZF9tb2R1bGUoc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgY29uc3QgY2hhciBfX3VzZXIgKnVhcmdzLFxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM1OTItXG5rZXJuZWwvbW9kdWxlL21haW4uYzozNTkzOlx0cmV0dXJuIGRvX2luaXRfbW9kdWxlKG1vZCk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0zNTk0LVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM2NDYtXG5rZXJuZWwvbW9kdWxlL21haW4uYzozNjQ3OlNZU0NBTExfREVGSU5FMyhpbml0X21vZHVsZSwgdm9pZCBfX3VzZXIgKiwgdW1vZCxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM2NDgtXHRcdHVuc2lnbmVkIGxvbmcsIGxlbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgdWFyZ3MpXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMzY1Mi1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjM2NTM6XHRlcnIgPSBtYXlfaW5pdF9tb2R1bGUoKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM2NTQtXHRpZiAoZXJyKVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM2NTYtXG5rZXJuZWwvbW9kdWxlL21haW4uYzozNjU3Olx0cHJfZGVidWcoXCYjMzQ7aW5pdF9tb2R1bGU6IHVtb2Q9JXAsIGxlbj0lbHUsIHVhcmdzPSVwXFxuXCYjMzQ7LFxua2VybmVsL21vZHVsZS9tYWluLmMtMzY1OC1cdCAgICAgICB1bW9kLCBsZW4sIHVhcmdzKTtcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYz0zNzQzPXN0YXRpYyBpbnQgaWRlbXBvdGVudF93YWl0X2Zvcl9jb21wbGV0aW9uKHN0cnVjdCBpZGVtcG90ZW50ICp1KVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM3NTMtXG5rZXJuZWwvbW9kdWxlL21haW4uYzozNzU0OnN0YXRpYyBpbnQgaW5pdF9tb2R1bGVfZnJvbV9maWxlKHN0cnVjdCBmaWxlICpmLCBjb25zdCBjaGFyIF9fdXNlciAqIHVhcmdzLCBpbnQgZmxhZ3MpXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zNzU1LXtcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zNzkyLVxua2VybmVsL21vZHVsZS9tYWluLmM6Mzc5MzpzdGF0aWMgaW50IGlkZW1wb3RlbnRfaW5pdF9tb2R1bGUoc3RydWN0IGZpbGUgKmYsIGNvbnN0IGNoYXIgX191c2VyICogdWFyZ3MsIGludCBmbGFncylcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM3OTQte1xuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM4MDEtXHRpZiAoIWlkZW1wb3RlbnQoXHUwMDI2aWRlbSwgZmlsZV9pbm9kZShmKSkpIHtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjM4MDI6XHRcdGludCByZXQgPSBpbml0X21vZHVsZV9mcm9tX2ZpbGUoZiwgdWFyZ3MsIGZsYWdzKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM4MDMtXHRcdHJldHVybiBpZGVtcG90ZW50X2NvbXBsZXRlKFx1MDAyNmlkZW0sIHJldCk7XG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMzgxMS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjM4MTI6U1lTQ0FMTF9ERUZJTkUzKGZpbml0X21vZHVsZSwgaW50LCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgdWFyZ3MsIGludCwgZmxhZ3MpXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zODEzLXtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjM4MTQ6XHRpbnQgZXJyID0gbWF5X2luaXRfbW9kdWxlKCk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0zODE1LVx0aWYgKGVycilcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zODE3LVxua2VybmVsL21vZHVsZS9tYWluLmM6MzgxODpcdHByX2RlYnVnKFwmIzM0O2Zpbml0X21vZHVsZTogZmQ9JWQsIHVhcmdzPSVwLCBmbGFncz0laVxcblwmIzM0OywgZmQsIHVhcmdzLCBmbGFncyk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0zODE5LVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM4MjctXHRcdHJldHVybiAtRUJBREY7XG5rZXJuZWwvbW9kdWxlL21haW4uYzozODI4Olx0cmV0dXJuIGlkZW1wb3RlbnRfaW5pdF9tb2R1bGUoZmRfZmlsZShmKSwgdWFyZ3MsIGZsYWdzKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM4MjktfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjUxMQoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDU1OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBUaG91Z2h0IFByb2Nlc3Mgb24gSWRlbnRpZnlpbmcgRnV6emluZyBUYXJnZXRzKioKCk9rYXksIHNvIEkmIzM5O20gdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgdGhlIHJpZ2h0IGtlcm5lbCBmdW5jdGlvbnMgdG8gdGFyZ2V0IGZvciBmdXp6aW5nLCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBtb2R1bGUgbG9hZGluZyBhbmQgbWVtb3J5IGFsbG9jYXRpb24gdGFnZ2luZy4gSSBpbml0aWFsbHkgdGhvdWdodCBgZG9faW5pdF9tb2R1bGVgIGFuZCBgbG9hZF9tb2R1bGVgIHdlcmUgdGhlIGtleSBlbnRyeSBwb2ludHMsIGJ1dCBhIHF1aWNrIGNoZWNrIHJldmVhbHMgdGhleSBhcmUgYWN0dWFsbHkgKnN0YXRpYyogZnVuY3Rpb25zLCBhbmQgc28gbm90IHRoZSBiZXN0IGNhbmRpZGF0ZXMuCgpNeSBuZXh0IHRob3VnaHQgd2FzIHRvIHVzZSB0aGUgc3lzY2FsbHMgYHN5c19pbml0X21vZHVsZWAgYW5kIGBzeXNfZmluaXRfbW9kdWxlYCBiZWNhdXNlIHRoZXkgYXJlIGVudHJ5IHBvaW50cy4gQW5kIGluZGVlZCwgYHN5c19pbml0X21vZHVsZWAgaXMgZGVmaW5lZCB1c2luZyBgU1lTQ0FMTF9ERUZJTkUzYCwgYW5kIHNvIHRoZSBhY3R1YWwgZnVuY3Rpb24gbmFtZSBpcyBzb21ldGhpbmcgbGlrZSBgX194NjRfc3lzX2luaXRfbW9kdWxlYCwgYnV0IGZvciB0aGUgcHVycG9zZXMgb2Ygc3l6a2FsbGVyLCBgaW5pdF9tb2R1bGVgIGFuZCBgZmluaXRfbW9kdWxlYCAqYXJlKiB0aGUgc3lzY2FsbCBuYW1lcy4gUGVyZmVjdCEKCkhvd2V2ZXIsIEkgbmVlZCB0byBrZWVwIGluIG1pbmQgdGhlIGluc3RydWN0aW9ucy4gVGhleSBlbXBoYXNpemUgdGhlIG5lZWQgdG8gZXh0cmFjdCB2ZXJ5IHNwZWNpZmljIGZ1bmN0aW9ucyBhbmQgYXZvaWQgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMuIFRoZXkgYWxzbyBwcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnRzIG92ZXIgaW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucy4KClNvLCBJIHNob3VsZCBkZWZpbml0ZWx5IGluY29ycG9yYXRlIGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYCBhbmQgYGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNgLiBUaGVzZSBzb3VuZCBsaWtlIHRoZXkmIzM5O3JlIHJpZ2h0IGluIHRoZSBzd2VldCBzcG90IGZvciBmdXp6aW5nLiBJIHNob3VsZCBhbHNvIGJlIHN1cmUgdG8gaW5jbHVkZSBgTUVNX0FMTE9DX1BST0ZJTElOR2AgaW4gYEVuYWJsZUNvbmZpZ3NgLgoKTm93LCBJJiMzOTttIGNoZWNraW5nIG15IHVuZGVyc3RhbmRpbmcgb2YgaG93IGFsbG9jX3RhZyBpcyBpbXBsZW1lbnRlZC4gTGV0IG1lIHZlcmlmeSB0aGUgY29uZGl0aW9ucyBhcm91bmQgYHRhZ3NfYWRkcmVzc2FibGVgIGFuZCBgbWVtX2FsbG9jX3Byb2ZpbGluZ19lbmFibGVkYC4KCkxvb2tpbmcgYXQgYG1tL2FsbG9jX3RhZy5jYCwgSSBzZWUgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgdGhhdCBjYXVnaHQgbXkgYXR0ZW50aW9uLiBJdCB3YXMgb3JpZ2luYWxseSBgaWYgKG1lbV9hbGxvY19wcm9maWxpbmdfZW5hYmxlZCgpICZhbXA7JmFtcDsgIXRhZ3NfYWRkcmVzc2FibGUoKSlgLCBidXQgaGFzIGJlZW4gY2hhbmdlZCB0byBgaWYgKCF0YWdzX2FkZHJlc3NhYmxlKCkpYC4gQW5kLCBnb2luZyBmdXJ0aGVyLCBpdCBsb29rcyBsaWtlIGBsb2FkX21vZHVsZWAgaW4gYG1tL2FsbG9jX3RhZy5jYCAqaXMqIHN0YXRpYyEgQnV0IHdhaXQsIGlzIGl0IGFjdHVhbGx5IGEgY2FsbGJhY2sgZm9yIGNvZGV0YWc/IEdvaW5nIHRocm91Z2ggdGhlIGNvZGUsIEkgc2VlIHRoaXM6CgpgYGBjCglpZiAoIW1lbV9wcm9maWxpbmdfc3VwcG9ydCkKCQlyZXR1cm4gMDsKYGBgCk9rYXksIHNvIHRoZSBgbG9hZF9tb2R1bGVgIGZ1bmN0aW9uIHNlZW1zIHRvIGJlIHBhcnQgb2YgdGhlIGNvZGV0YWcgaW1wbGVtZW50YXRpb24sIGJ1dCBpdCBhbHNvIGhhcyBhIGBtZW1fcHJvZmlsaW5nX3N1cHBvcnRgIHZhcmlhYmxlLiBPa2F5LCBzbyBJIHNob3VsZCBiZSBva2F5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2FsbG9jX3RhZy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTcwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDMwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA5NzA6XHRcdHJldHVybiAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICYjNDM7IG9mZnNldCk7XG4gOTcxOlx0fVxuIDk3MjpcdFxuIDk3MzpcdHN0YXRpYyBpbnQgbG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgY29kZXRhZyAqc3RhcnQsIHN0cnVjdCBjb2RldGFnICpzdG9wKVxuIDk3NDpcdHtcbiA5NzU6XHRcdC8qIEFsbG9jYXRlIG1vZHVsZSBhbGxvY190YWcgcGVyY3B1IGNvdW50ZXJzICovXG4gOTc2Olx0XHRzdHJ1Y3QgYWxsb2NfdGFnICpzdGFydF90YWc7XG4gOTc3Olx0XHRzdHJ1Y3QgYWxsb2NfdGFnICpzdG9wX3RhZztcbiA5Nzg6XHRcdHN0cnVjdCBhbGxvY190YWcgKnRhZztcbiA5Nzk6XHRcbiA5ODA6XHRcdGlmICghbWVtX3Byb2ZpbGluZ19zdXBwb3J0KVxuIDk4MTpcdFx0XHRyZXR1cm4gMDtcbiA5ODI6XHRcbiA5ODM6XHRcdC8qIHBlcmNwdSBjb3VudGVycyBmb3IgY29yZSBhbGxvY2F0aW9ucyBhcmUgYWxyZWFkeSBzdGF0aWNhbGx5IGFsbG9jYXRlZCAqL1xuIDk4NDpcdFx0aWYgKCFtb2QpXG4gOTg1Olx0XHRcdHJldHVybiAwO1xuIDk4NjpcdFxuIDk4NzpcdFx0c3RhcnRfdGFnID0gY3RfdG9fYWxsb2NfdGFnKHN0YXJ0KTtcbiA5ODg6XHRcdHN0b3BfdGFnID0gY3RfdG9fYWxsb2NfdGFnKHN0b3ApO1xuIDk4OTpcdFx0Zm9yICh0YWcgPSBzdGFydF90YWc7IHRhZyBcdTAwM2Mgc3RvcF90YWc7IHRhZyYjNDM7JiM0MzspIHtcbiA5OTA6XHRcdFx0V0FSTl9PTih0YWctXHUwMDNlY291bnRlcnMpO1xuIDk5MTpcdFx0XHR0YWctXHUwMDNlY291bnRlcnMgPSBhbGxvY19wZXJjcHUoc3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyk7XG4gOTkyOlx0XHRcdGlmICghdGFnLVx1MDAzZWNvdW50ZXJzKSB7XG4gOTkzOlx0XHRcdFx0d2hpbGUgKC0tdGFnIFx1MDAzZT0gc3RhcnRfdGFnKSB7XG4gOTk0Olx0XHRcdFx0XHRmcmVlX3BlcmNwdSh0YWctXHUwMDNlY291bnRlcnMpO1xuIDk5NTpcdFx0XHRcdFx0dGFnLVx1MDAzZWNvdW50ZXJzID0gTlVMTDtcbiA5OTY6XHRcdFx0XHR9XG4gOTk3Olx0XHRcdFx0cHJfZXJyKFwmIzM0O0ZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbG9jYXRpb24gdGFnIHBlcmNwdSBjb3VudGVycyBpbiB0aGUgbW9kdWxlICVzXFxuXCYjMzQ7LFxuIDk5ODpcdFx0XHRcdCAgICAgICBtb2QtXHUwMDNlbmFtZSk7XG4gOTk5Olx0XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4MDg2CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogNzcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIE1vZHVsZSBMb2FkaW5nIGFuZCBBbGxvY2F0aW9uIFRhZ2dpbmcqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGBsb2FkX21vZHVsZWAgd2l0aGluIGBtbS9hbGxvY190YWcuY2AsIGFuZCBpdCYjMzk7cyBkZWZpbmVkIGFzIGEgc3RhdGljIGZ1bmN0aW9uLiBUaGF0IGltbWVkaWF0ZWx5IG1ha2VzIG1lIHRoaW5rIGFib3V0IGhvdyBpdCYjMzk7cyBiZWluZyB1c2VkLiBUaGUgbmV4dCBsb2dpY2FsIHN0ZXAgaXMgdG8gY2hlY2sgaG93IGBhbGxvY190YWdfaW5pdGAgZml0cyBpbnRvIHRoaXMgcGljdHVyZS4gQWgsIHJpZ2h0LCBgYWxsb2NfdGFnX2luaXRgIHJlZ2lzdGVycyBgbG9hZF9tb2R1bGVgIGFzIGEgYC5sb2FkYCBjYWxsYmFjay4gTm93IGl0IGNsaWNrcyDigJMgYGNvZGV0YWdfbG9hZF9tb2R1bGVgIG11c3QgYmUgdGhlIGZ1bmN0aW9uIHRoYXQgKmNhbGxzKiB0aGlzIGAubG9hZGAgY2FsbGJhY2ssIHdoaWNoIGlzIGBsb2FkX21vZHVsZWAgaW4gb3VyIHNwZWNpZmljIGNhc2UuIFRvIGNvbmZpcm0gdGhhdCBjaGFpbiBvZiBjYWxscywgYW5kIGp1c3QgbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgZnVsbCBjb250ZXh0IGhlcmUsIEkgc2hvdWxkIGdvIGFuZCBleGFtaW5lIGBjb2RldGFnX2xvYWRfbW9kdWxlYCBpdHNlbGYuIEkmIzM5O2xsIGZpbmQgdGhhdCBpbiBgbGliL2NvZGV0YWcuY2AuIExldCYjMzk7cyBzZWUgd2hhdCYjMzk7cyBoYXBwZW5pbmcgdGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvZGV0YWdfbG9hZF9tb2R1bGUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtsaWIvY29kZXRhZy5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2xpYi9jb2RldGFnLmM9MzIyPXZvaWQgY29kZXRhZ19tb2R1bGVfcmVwbGFjZWQoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbW9kdWxlICpuZXdfbW9kKVxuLS1cbmxpYi9jb2RldGFnLmMtMzM3LVxubGliL2NvZGV0YWcuYzozMzg6aW50IGNvZGV0YWdfbG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kKVxubGliL2NvZGV0YWcuYy0zMzkte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODQ4NgoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDIzOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiBNb2R1bGUgTG9hZGluZyBDaGFuZ2VzKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGVzZSBjaGFuZ2VzIGFuZCBpdCBzZWVtcyBsaWtlIHdlJiMzOTtyZSBhZGRyZXNzaW5nIHNvbWUgcmV0cmllcyBhbmQgY29uZGl0aW9uYWwgYmVoYXZpb3IgcmVsYXRlZCB0byBtb2R1bGUgbG9hZGluZyBhbmQgbWVtb3J5IGFsbG9jYXRpb24uIEZpcnN0LCBJIG5vdGljZWQgYGNvZGV0YWdfbG9hZF9tb2R1bGVgIGlzIG5vbi1zdGF0aWMsIHdoaWNoIGlzIGludGVyZXN0aW5nLiBJJiMzOTtsbCBuZWVkIHRvIHJlbWVtYmVyIHRoYXQuIEdpdmVuIHRoYXQgaXQmIzM5O3Mgbm9uLXN0YXRpYywgSSBzaG91bGQgYWRkIGl0IHRvIHRoZSBgRm9jdXNTeW1ib2xzYCBsaXN0LgoKTm93LCBsZXQmIzM5O3MgYnJlYWsgZG93biB0aGUgYWN0dWFsIGNvZGUgbW9kaWZpY2F0aW9uczoKCjEuICBJbiBga2VybmVsL21vZHVsZS9tYWluLmNgLCB0aGUgYGxheW91dF9hbmRfYWxsb2NhdGVgIGZ1bmN0aW9uIGlzIGJlaW5nIHVwZGF0ZWQgdG8gcmV0cnkgaWYgYG1vdmVfbW9kdWxlYCByZXR1cm5zIGAtRUFHQUlOYC4gVGhpcyBzdWdnZXN0cyB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIGEgcmVzb3VyY2UgY29udGVudGlvbiBpc3N1ZSBkdXJpbmcgbW9kdWxlIHJlbG9jYXRpb24gb3IgYWxsb2NhdGlvbiwgYW5kIGEgcmV0cnkgbWVjaGFuaXNtIGlzIGJlaW5nIHB1dCBpbiBwbGFjZSB0byBoYW5kbGUgdHJhbnNpZW50IGZhaWx1cmVzLiBJdCBzZWVtcyBsaWtlIGEgc2Vuc2libGUgYWRkaXRpb24gdG8gaW1wcm92ZSByb2J1c3RuZXNzLgoKMi4gIGBtbS9hbGxvY190YWcuY2Agbm93IGhhcyBgcmVzZXJ2ZV9tb2R1bGVfdGFnc2AgcmV0dXJuaW5nIGAtRUFHQUlOYCBpZiBgIXRhZ3NfYWRkcmVzc2FibGUoKWAuIFRoaXMgaW1wbGllcyB0aGF0IHRoZSBtZW1vcnkgdGFnZ2luZyBmdW5jdGlvbmFsaXR5IG1pZ2h0IG5vdCBiZSBhdmFpbGFibGUgaW4gc29tZSBzaXR1YXRpb25zLCBhbmQgdGhlIGZ1bmN0aW9uIG5vdyBleHBsaWNpdGx5IHNpZ25hbHMgdGhpcyBjb25kaXRpb24gYXMgYSB0ZW1wb3JhcnkgZmFpbHVyZSwgYWxsb3dpbmcgZm9yIHJldHJpZXMuCgozLiAgQWxzbyBpbiBgbW0vYWxsb2NfdGFnLmNgLCBgbG9hZF9tb2R1bGVgIG5vdyByZXR1cm5zIDAgaWYgYCFtZW1fcHJvZmlsaW5nX3N1cHBvcnRgLiBTbywgdGhlIG1vZHVsZSBsb2FkIHN1Y2NlZWRzICp3aXRob3V0KiBwcm9maWxpbmcgc3VwcG9ydD8gVGhpcyBzZWVtcyBsaWtlIGEgZ3JhY2VmdWwgZmFsbGJhY2ssIGluZGljYXRpbmcgdGhlIHN5c3RlbSBjYW4gY29udGludWUgb3BlcmF0aW5nLCBhbGJlaXQgd2l0aCByZWR1Y2VkIGZ1bmN0aW9uYWxpdHkuCgo0LiAgRmluYWxseSwgYHJlbGVhc2VfbW9kdWxlX3RhZ3NgIGluIGBtbS9hbGxvY190YWcuY2AgaGFzIGJlZW4gYWRqdXN0ZWQgdG8gaGFuZGxlIHRoZSBgIXVzZWRgIGNhc2UuIFRoaXMgaXMgYSBkZWZlbnNpdmUgcHJvZ3JhbW1pbmcgbWVhc3VyZSwgYWRkcmVzc2luZyBwb3RlbnRpYWwgZWRnZSBjYXNlcyB3aGVyZSB0aGUgbW9kdWxlIHRhZ3MgbWlnaHQgYmUgcmVsZWFzZWQgcHJlbWF0dXJlbHkgb3IgaW4gYW4gdW5leHBlY3RlZCBzdGF0ZS4gVGhpcyBzaG93cyBjYXJlZnVsIGF0dGVudGlvbiB0byBkZXRhaWwuCgpUaGUgb3ZlcmFsbCBjb250ZXh0IGhlcmUgaXMgdGhhdCB0aGVzZSBjaGFuZ2VzIGFyZSBkcml2ZW4gYnkgdGhlIGBNRU1fQUxMT0NfUFJPRklMSU5HYCBjb25maWcgb3B0aW9uLiBJJiMzOTt2ZSBub3RlZCB0aGF0IGBGb2N1c1N5bWJvbHNgIHNob3VsZCBpbmNsdWRlIGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYCwgYGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNgLCBhbmQgYGNvZGV0YWdfbG9hZF9tb2R1bGVgLCBhcyBleHBlY3RlZC4gV2FpdC4uLiBgY29kZXRhZ191bmxvYWRfbW9kdWxlYCBpcyBpbiB0aGUgRm9jdXNTeW1ib2xzIGxpc3QgYXMgd2VsbD8gSSBiZXR0ZXIgZG91YmxlLWNoZWNrIHRoYXQgb25lIGZvciBhbnkgZnVydGhlciBpbXBsaWNhdGlvbnMgaW4gdGhlIGNvZGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvZGV0YWdfdW5sb2FkX21vZHVsZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2xpYi9jb2RldGFnLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bGliL2NvZGV0YWcuYz0zMzg9aW50IGNvZGV0YWdfbG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kKVxuLS1cbmxpYi9jb2RldGFnLmMtMzU2LVxubGliL2NvZGV0YWcuYzozNTc6dm9pZCBjb2RldGFnX3VubG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kKVxubGliL2NvZGV0YWcuYy0zNTgte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTMzNQoJCQkJCQkJb3V0cHV0OiAxNjYKCQkJCQkJCXRob3VnaHRzOiA0NzgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBNb2R1bGUgTG9hZGluZyBMb2dpYyBhbmQgTWVtb3J5IEFsbG9jYXRpb24gUHJvZmlsaW5nKioKCk9rYXksIHNvIGBjb2RldGFnX3VubG9hZF9tb2R1bGVgIGlzIGRlZmluaXRlbHkgcHJlc2VudCwgdGhhdCYjMzk7cyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIE5vdywgSSBuZWVkIHRvIGNoZWNrIHRoZSBkZXBlbmRlbmNpZXMgZm9yIGBNRU1fQUxMT0NfUFJPRklMSU5HYCB0byBlbnN1cmUgZXZlcnl0aGluZyBpcyBpbiBwbGFjZS4gTG9va2luZyBhdCBgbW0vS2NvbmZpZy5kZWJ1Z2AsIGl0IGRlcGVuZHMgb24gYE1NVWAsIGBQUk9DX0ZTYCwgYW5kIGAhREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVYCwgYW5kIHNlbGVjdHMgYENPREVfVEFHR0lOR2AsIGBQQUdFX0VYVEVOU0lPTmAsIGFuZCBgU0xBQl9PQkpfRVhUYC4gVGhvc2UgYWxsIHNlZW0gcmVhc29uYWJsZTsgYE1NVWAgYW5kIGBQUk9DX0ZTYCBhcmUgcHJldHR5IHN0YW5kYXJkLCBhbmQgdGhlIGAhREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVYCBkZXBlbmRlbmN5IGlzIGZpbmUuIFNvLCBgTUVNX0FMTE9DX1BST0ZJTElOR2AgbG9va3MgdG8gYmUgYSBzZWxmLWNvbnRhaW5lZCBmZWF0dXJlLgoKTGV0IG1lIHJlY2FwIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIHBhdGNoJiMzOTtzIHB1cnBvc2UuIEl0JiMzOTtzIGhhbmRsaW5nIGEgc3BlY2lmaWMgc2l0dWF0aW9uOiB3aGVuIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBleGhhdXN0cyB0aGUgYXZhaWxhYmxlIHBhZ2UgZmxhZyBiaXRzIChgIXRhZ3NfYWRkcmVzc2FibGUoKWApLiBUaGUgZml4IGludHJvZHVjZXMgYSByZXRyeSBpbiBgbGF5b3V0X2FuZF9hbGxvY2F0ZSgpYCwgd2hpY2ggcmVzZXRzIHRoZSBtb2R1bGUgc3RhdGUgYW5kIHJldHJpZXMgdGhlIG1vZHVsZSBsb2FkIHdpdGhvdXQgbWVtb3J5IHByb2ZpbGluZy4gVGhpcyBjaGFuZ2UgaXMgZGlyZWN0bHkgYWZmZWN0aW5nIHRoZSBjb3JlIG1vZHVsZSBsb2FkaW5nIHBhdGggYW5kIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiB0YWdnaW5nIHN5c3RlbSwgd2hpY2ggdXNlcnNwYWNlIGludGVyYWN0cyB3aXRoIHZpYSBgaW5pdF9tb2R1bGVgIGFuZCBgZmluaXRfbW9kdWxlYCBzeXNjYWxscy4gVGhpcyBtYWtlcyB0aGlzIGFuIGludGVyZXN0aW5nIHRhcmdldCBmb3IgdGVzdGluZy4KClRoZSBrZXkgc3ltYm9scyB0byBmb2N1cyBvbiBhcmUgYGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25gLCBgY29kZXRhZ19mcmVlX21vZHVsZV9zZWN0aW9uc2AsIGBjb2RldGFnX2xvYWRfbW9kdWxlYCwgYW5kLCBvZiBjb3Vyc2UsIGBjb2RldGFnX3VubG9hZF9tb2R1bGVgLiBUaGUgcHJpbWFyeSBjb25maWd1cmF0aW9uIEkgbmVlZCB0byBiZSBjb25jZXJuZWQgd2l0aCBpcyBgTUVNX0FMTE9DX1BST0ZJTElOR2AuIGBNT0RVTEVTYCBpcyBhbiBvYnZpb3VzIHByZXJlcXVpc2l0ZSwgYnV0IHRoYXQmIzM5O3MgYSBiYXNlbGluZSByZXF1aXJlbWVudCBmb3IgYW55IG1vZHVsZSB3b3JrLgoKSSYjMzk7bGwgZG91YmxlIGNoZWNrIHRoYXQgYGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25gIGlzbiYjMzk7dCBzdGF0aWMuIEl0JiMzOTtzIG5vdCwgd2hpY2ggaXMgZXhhY3RseSB3aGF0IEkgd2FzIGhvcGluZyBmb3IuIFRoYXQgbWVhbnMgc3l6a2FsbGVyIHNob3VsZCBiZSBhYmxlIHRvIGRpcmVjdGx5IHRhcmdldCBpdCBpZiBpdCYjMzk7cyBpbiB0aGUga2VybmVsIGltYWdlLgoKRmluYWxseSwgSSBuZWVkIHRvIGVuc3VyZSB0aGF0IG5vIG90aGVyIG5vbi1zdGF0aWMgZnVuY3Rpb25zIHdlcmUgYWRkZWQgb3IgbW9kaWZpZWQuIEl0IHNlZW1zIHRoYXQgb25seSBzdGF0aWMgZnVuY3Rpb25zIGluIGBtbS9hbGxvY190YWcuY2AgYW5kIGBrZXJuZWwvbW9kdWxlL21haW4uY2Agd2VyZSBjaGFuZ2VkLCBidXQgdGhvc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgYnkgdGhlIGBjb2RldGFnXypgIGZ1bmN0aW9ucyBJIGlkZW50aWZpZWQsIHNvIHRoYXQgc2VlbXMgb2suCgpJIGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGZvcm11bGF0ZSB0aGUgc2V0LXJlc3VsdHMgY2FsbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01FTV9BTExPQ19QUk9GSUxJTkcmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uJiMzNDssCiAgICAmIzM0O2NvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnMmIzM0OywKICAgICYjMzQ7Y29kZXRhZ19sb2FkX21vZHVsZSYjMzQ7LAogICAgJiMzNDtjb2RldGFnX3VubG9hZF9tb2R1bGUmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGNvcmUgbW9kdWxlIGxvYWRpbmcgbG9naWMgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBydW5zIG91dCBvZiBwYWdlIGZsYWcgYml0cyAoIXRhZ3NfYWRkcmVzc2FibGUoKSkuIEl0IGludHJvZHVjZXMgYSByZXRyeSBtZWNoYW5pc20gaW4gbGF5b3V0X2FuZF9hbGxvY2F0ZSgpIHRoYXQgcmVzZXRzIHRoZSBtb2R1bGUgc3RhdGUgYW5kIHJldHJpZXMgbG9hZGluZyB3aXRob3V0IG1lbW9yeSBwcm9maWxpbmcuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBtb2R1bGUgbG9hZGluZyBwYXRoIGFuZCBtZW1vcnkgYWxsb2NhdGlvbiB0YWdnaW5nIHN1YnN5c3RlbSwgd2hpY2ggaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBpbml0X21vZHVsZSBhbmQgZmluaXRfbW9kdWxlIHN5c2NhbGxzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNRU1fQUxMT0NfUFJPRklMSU5HJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Y29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbiYjMzQ7LAogICAgJiMzNDtjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zJiMzNDssCiAgICAmIzM0O2NvZGV0YWdfbG9hZF9tb2R1bGUmIzM0OywKICAgICYjMzQ7Y29kZXRhZ191bmxvYWRfbW9kdWxlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBjb3JlIG1vZHVsZSBsb2FkaW5nIGxvZ2ljIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgcnVucyBvdXQgb2YgcGFnZSBmbGFnIGJpdHMgKCF0YWdzX2FkZHJlc3NhYmxlKCkpLiBJdCBpbnRyb2R1Y2VzIGEgcmV0cnkgbWVjaGFuaXNtIGluIGxheW91dF9hbmRfYWxsb2NhdGUoKSB0aGF0IHJlc2V0cyB0aGUgbW9kdWxlIHN0YXRlIGFuZCByZXRyaWVzIGxvYWRpbmcgd2l0aG91dCBtZW1vcnkgcHJvZmlsaW5nLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgbW9kdWxlIGxvYWRpbmcgcGF0aCBhbmQgbWVtb3J5IGFsbG9jYXRpb24gdGFnZ2luZyBzdWJzeXN0ZW0sIHdoaWNoIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgaW5pdF9tb2R1bGUgYW5kIGZpbml0X21vZHVsZSBzeXNjYWxscy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDI8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4ybTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgbW9kdWxlIGxvYWRpbmcgcHJvY2VzcyB0byBoYW5kbGUgY2FzZXMgd2hlcmUgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHRhZ3MgZXhjZWVkIGF2YWlsYWJsZSBwYWdlIGZsYWcgYml0cy4gSXQgaW50cm9kdWNlcyBhIHJldHJ5IG1lY2hhbmlzbSBpbiBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAgdGhhdCByZXNldHMgc2VjdGlvbiBoZWFkZXJzIGFuZCBzaXplcywgYW5kIHJldHJpZXMgdGhlIGFsbG9jYXRpb24gd2l0aG91dCBwcm9maWxpbmcuIFRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBtb2R1bGVzIGlzIGV4cGxpY2l0bHkgemVyb2VkIGJ5IGBtb2R1bGVfbWVtb3J5X2FsbG9jYCAodmlhIGBtZW1zZXQocHRyLCAwLCBzaXplKWApLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIGFueSBuZXcgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlcnNwYWNlLCBub3IgZG8gdGhleSBhZGQgY29tcGxleCBjb25kaXRpb25hbCBsb2dpYyBkZXBlbmRpbmcgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggKGUuZy4sIGluY29ycmVjdCBzaXplIGNhbGN1bGF0aW9ucywgbWVtb3J5IGxlYWtzLCBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIGR1cmluZyBzZWN0aW9uIGNvcHlpbmcpIHdvdWxkIGJlIHJlbGlhYmx5IGNhdWdodCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyB0b29scy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgbmVjZXNzaXRhdGUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA2ZjlmZjVjZTM1NGM1NGIyZjZmNzVkOTJmYjU2ZTI3Y2NhOTdmZDcwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBBdWcgMTAgMTA6Mzg6MTQgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9rZXJuZWwvbW9kdWxlL21haW4uYyBiL2tlcm5lbC9tb2R1bGUvbWFpbi5jCmluZGV4IDQ2ZGQ4ZDI1YTYwNTguLmMzMmJiNDdhNTczYTEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tb2R1bGUvbWFpbi5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9tb2R1bGUvbWFpbi5jCkBAIC0yOTcxLDEzICYjNDM7Mjk3MSwyNiBAQCBzdGF0aWMgc3RydWN0IG1vZHVsZSAqbGF5b3V0X2FuZF9hbGxvY2F0ZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpCiAJICogdGhpcyBpcyBkb25lIGdlbmVyaWNhbGx5OyB0aGVyZSBkb2VzbiYjMzk7dCBhcHBlYXIgdG8gYmUgYW55CiAJICogc3BlY2lhbCBjYXNlcyBmb3IgdGhlIGFyY2hpdGVjdHVyZXMuCiAJICovCiYjNDM7cmV0cnk6CiAJbGF5b3V0X3NlY3Rpb25zKGluZm8tJmd0O21vZCwgaW5mbyk7CiAJbGF5b3V0X3N5bXRhYihpbmZvLSZndDttb2QsIGluZm8pOwogCiAJLyogQWxsb2NhdGUgYW5kIG1vdmUgdG8gdGhlIGZpbmFsIHBsYWNlICovCiAJZXJyID0gbW92ZV9tb2R1bGUoaW5mby0mZ3Q7bW9kLCBpbmZvKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gRVJSX1BUUihlcnIpOwomIzQzOwlpZiAoZXJyKSB7CiYjNDM7CQlpZiAoZXJyICE9IC1FQUdBSU4pCiYjNDM7CQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKJiM0MzsJCS8qCiYjNDM7CQkgKiAtRUFHQUlOIG1lYW5zIHByb2ZpbGluZyB3YXMgZGlzYWJsZWQgYnV0IHRoZSBtb2R1bGUKJiM0MzsJCSAqIGNhbiBzdGlsbCBsb2FkIHdpdGhvdXQgaXQuIFJlc2V0IHN0YXRlIGFuZCByZXRyeS4KJiM0MzsJCSAqLwomIzQzOwkJcmV3cml0ZV9zZWN0aW9uX2hlYWRlcnMoaW5mbywgZmxhZ3MpOwomIzQzOwkJZm9yX2VhY2hfbW9kX21lbV90eXBlKHR5cGUpCiYjNDM7CQkJaW5mby0mZ3Q7bW9kLSZndDttZW1bdHlwZV0uc2l6ZSA9IDA7CiYjNDM7CQlpbmZvLSZndDtzZWNoZHJzW2luZm8tJmd0O2luZGV4LnN5bV0uc2hfZmxhZ3MgJmFtcDs9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7CiYjNDM7CQlpbmZvLSZndDtzZWNoZHJzW2luZm8tJmd0O2luZGV4LnN0cl0uc2hfZmxhZ3MgJmFtcDs9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7CiYjNDM7CQlnb3RvIHJldHJ5OwomIzQzOwl9CiAKIAkvKiBNb2R1bGUgaGFzIGJlZW4gY29waWVkIHRvIGl0cyBmaW5hbCBwbGFjZSBub3c6IHJldHVybiBpdC4gKi8KIAltb2QgPSAodm9pZCAqKWluZm8tJmd0O3NlY2hkcnNbaW5mby0mZ3Q7aW5kZXgubW9kXS5zaF9hZGRyOwpkaWZmIC0tZ2l0IGEvbW0vYWxsb2NfdGFnLmMgYi9tbS9hbGxvY190YWcuYwppbmRleCA1MmFlY2UyN2IwMGUwLi4zZWJhNjMzMTE3NGRhIDEwMDY0NAotLS0gYS9tbS9hbGxvY190YWcuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9hbGxvY190YWcuYwpAQCAtODM1LDYgJiM0Mzs4MzUsNTIgQEAgc3RhdGljIGludCB2bV9tb2R1bGVfdGFnc19wb3B1bGF0ZSh2b2lkKQogCXJldHVybiAwOwogfQogCiYjNDM7c3RhdGljIHZvaWQgcmVsZWFzZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIGJvb2wgdXNlZCkKJiM0Mzt7CiYjNDM7CU1BX1NUQVRFKG1hcywgJmFtcDttb2RfYXJlYV9tdCwgbW9kdWxlX3RhZ3Muc2l6ZSwgbW9kdWxlX3RhZ3Muc2l6ZSk7CiYjNDM7CXN0cnVjdCBhbGxvY190YWcgKnN0YXJ0X3RhZzsKJiM0MzsJc3RydWN0IGFsbG9jX3RhZyAqZW5kX3RhZzsKJiM0MzsJc3RydWN0IG1vZHVsZSAqdmFsOwomIzQzOwomIzQzOwltYXNfbG9jaygmYW1wO21hcyk7CiYjNDM7CW1hc19mb3JfZWFjaF9yZXYoJmFtcDttYXMsIHZhbCwgMCkKJiM0MzsJCWlmICh2YWwgPT0gbW9kKQomIzQzOwkJCWJyZWFrOwomIzQzOwomIzQzOwlpZiAoIXZhbCkgLyogbW9kdWxlIG5vdCBmb3VuZCAqLwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmICghdXNlZCkKJiM0MzsJCWdvdG8gcmVsZWFzZV9hcmVhOwomIzQzOwomIzQzOwlzdGFydF90YWcgPSAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICYjNDM7IG1hcy5pbmRleCk7CiYjNDM7CWVuZF90YWcgPSAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICYjNDM7IG1hcy5sYXN0KTsKJiM0MzsJaWYgKCFjbGVhbl91bnVzZWRfY291bnRlcnMoc3RhcnRfdGFnLCBlbmRfdGFnKSkgewomIzQzOwkJc3RydWN0IGFsbG9jX3RhZyAqdGFnOwomIzQzOwomIzQzOwkJZm9yICh0YWcgPSBzdGFydF90YWc7IHRhZyAmbHQ7PSBlbmRfdGFnOyB0YWcmIzQzOyYjNDM7KSB7CiYjNDM7CQkJc3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyBjb3VudGVyOwomIzQzOwomIzQzOwkJCWlmICghdGFnLSZndDtjb3VudGVycykKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CiYjNDM7CQkJY291bnRlciA9IGFsbG9jX3RhZ19yZWFkKHRhZyk7CiYjNDM7CQkJcHJfaW5mbygmIzM0OyVzOiV1IG1vZHVsZSAlcyBmdW5jOiVzIGhhcyAlbGx1IGFsbG9jYXRlZCBhdCBtb2R1bGUgdW5sb2FkXG4mIzM0OywKJiM0MzsJCQkJdGFnLSZndDtjdC5maWxlbmFtZSwgdGFnLSZndDtjdC5saW5lbm8sIHRhZy0mZ3Q7Y3QubW9kbmFtZSwKJiM0MzsJCQkJdGFnLSZndDtjdC5mdW5jdGlvbiwgY291bnRlci5ieXRlcyk7CiYjNDM7CQl9CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQl1c2VkID0gZmFsc2U7CiYjNDM7CX0KJiM0MztyZWxlYXNlX2FyZWE6CiYjNDM7CW1hc19zdG9yZSgmYW1wO21hcywgdXNlZCA/ICZhbXA7dW5sb2FkZWRfbW9kIDogTlVMTCk7CiYjNDM7CXZhbCA9IG1hc19wcmV2X3JhbmdlKCZhbXA7bWFzLCAwKTsKJiM0MzsJaWYgKHZhbCA9PSAmYW1wO3ByZXBlbmRfbW9kKQomIzQzOwkJbWFzX3N0b3JlKCZhbXA7bWFzLCBOVUxMKTsKJiM0MztvdXQ6CiYjNDM7CW1hc191bmxvY2soJmFtcDttYXMpOwomIzQzO30KJiM0MzsKIHN0YXRpYyB2b2lkICpyZXNlcnZlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJCSB1bnNpZ25lZCBpbnQgcHJlcGVuZCwgdW5zaWduZWQgbG9uZyBhbGlnbikKIHsKQEAgLTkwNCwxMCAmIzQzOzk1MCwxMiBAQCBzdGF0aWMgdm9pZCAqcmVzZXJ2ZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJaW50IGdyb3dfcmVzOwogCiAJCW1vZHVsZV90YWdzLnNpemUgPSBvZmZzZXQgJiM0Mzsgc2l6ZTsKLQkJaWYgKG1lbV9hbGxvY19wcm9maWxpbmdfZW5hYmxlZCgpICZhbXA7JmFtcDsgIXRhZ3NfYWRkcmVzc2FibGUoKSkgewomIzQzOwkJaWYgKCF0YWdzX2FkZHJlc3NhYmxlKCkpIHsKIAkJCXNodXRkb3duX21lbV9wcm9maWxpbmcodHJ1ZSk7Ci0JCQlwcl93YXJuKCYjMzQ7V2l0aCBtb2R1bGUgJXMgdGhlcmUgYXJlIHRvbyBtYW55IHRhZ3MgdG8gZml0IGluICVkIHBhZ2UgZmxhZyBiaXRzLiBNZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgaXMgZGlzYWJsZWQhXG4mIzM0OywKLQkJCQltb2QtJmd0O25hbWUsIE5SX1VOVVNFRF9QQUdFRkxBR19CSVRTKTsKJiM0MzsJCQlwcl93YXJuX29uY2UoJiMzNDtXaXRoIG1vZHVsZSAlcyB0aGVyZSBhcmUgdG9vIG1hbnkgdGFncyB0byBmaXQgaW4gJWQgcGFnZSBmbGFnIGJpdHMuIE1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBpcyBkaXNhYmxlZCFcbiYjMzQ7LAomIzQzOwkJCQkgICAgIG1vZC0mZ3Q7bmFtZSwgTlJfVU5VU0VEX1BBR0VGTEFHX0JJVFMpOwomIzQzOwkJCXJlbGVhc2VfbW9kdWxlX3RhZ3MobW9kLCBmYWxzZSk7CiYjNDM7CQkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CiAJCX0KIAogCQlncm93X3JlcyA9IHZtX21vZHVsZV90YWdzX3BvcHVsYXRlKCk7CkBAIC05MjIsNTIgJiM0Mzs5NzAsNiBAQCBzdGF0aWMgdm9pZCAqcmVzZXJ2ZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAlyZXR1cm4gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciAmIzQzOyBvZmZzZXQpOwogfQogCi1zdGF0aWMgdm9pZCByZWxlYXNlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgYm9vbCB1c2VkKQotewotCU1BX1NUQVRFKG1hcywgJmFtcDttb2RfYXJlYV9tdCwgbW9kdWxlX3RhZ3Muc2l6ZSwgbW9kdWxlX3RhZ3Muc2l6ZSk7Ci0Jc3RydWN0IGFsbG9jX3RhZyAqc3RhcnRfdGFnOwotCXN0cnVjdCBhbGxvY190YWcgKmVuZF90YWc7Ci0Jc3RydWN0IG1vZHVsZSAqdmFsOwotCi0JbWFzX2xvY2soJmFtcDttYXMpOwotCW1hc19mb3JfZWFjaF9yZXYoJmFtcDttYXMsIHZhbCwgMCkKLQkJaWYgKHZhbCA9PSBtb2QpCi0JCQlicmVhazsKLQotCWlmICghdmFsKSAvKiBtb2R1bGUgbm90IGZvdW5kICovCi0JCWdvdG8gb3V0OwotCi0JaWYgKCF1c2VkKQotCQlnb3RvIHJlbGVhc2VfYXJlYTsKLQotCXN0YXJ0X3RhZyA9IChzdHJ1Y3QgYWxsb2NfdGFnICopKG1vZHVsZV90YWdzLnN0YXJ0X2FkZHIgJiM0MzsgbWFzLmluZGV4KTsKLQllbmRfdGFnID0gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciAmIzQzOyBtYXMubGFzdCk7Ci0JaWYgKCFjbGVhbl91bnVzZWRfY291bnRlcnMoc3RhcnRfdGFnLCBlbmRfdGFnKSkgewotCQlzdHJ1Y3QgYWxsb2NfdGFnICp0YWc7Ci0KLQkJZm9yICh0YWcgPSBzdGFydF90YWc7IHRhZyAmbHQ7PSBlbmRfdGFnOyB0YWcmIzQzOyYjNDM7KSB7Ci0JCQlzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzIGNvdW50ZXI7Ci0KLQkJCWlmICghdGFnLSZndDtjb3VudGVycykKLQkJCQljb250aW51ZTsKLQotCQkJY291bnRlciA9IGFsbG9jX3RhZ19yZWFkKHRhZyk7Ci0JCQlwcl9pbmZvKCYjMzQ7JXM6JXUgbW9kdWxlICVzIGZ1bmM6JXMgaGFzICVsbHUgYWxsb2NhdGVkIGF0IG1vZHVsZSB1bmxvYWRcbiYjMzQ7LAotCQkJCXRhZy0mZ3Q7Y3QuZmlsZW5hbWUsIHRhZy0mZ3Q7Y3QubGluZW5vLCB0YWctJmd0O2N0Lm1vZG5hbWUsCi0JCQkJdGFnLSZndDtjdC5mdW5jdGlvbiwgY291bnRlci5ieXRlcyk7Ci0JCX0KLQl9IGVsc2UgewotCQl1c2VkID0gZmFsc2U7Ci0JfQotcmVsZWFzZV9hcmVhOgotCW1hc19zdG9yZSgmYW1wO21hcywgdXNlZCA/ICZhbXA7dW5sb2FkZWRfbW9kIDogTlVMTCk7Ci0JdmFsID0gbWFzX3ByZXZfcmFuZ2UoJmFtcDttYXMsIDApOwotCWlmICh2YWwgPT0gJmFtcDtwcmVwZW5kX21vZCkKLQkJbWFzX3N0b3JlKCZhbXA7bWFzLCBOVUxMKTsKLW91dDoKLQltYXNfdW5sb2NrKCZhbXA7bWFzKTsKLX0KLQogc3RhdGljIGludCBsb2FkX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBjb2RldGFnICpzdGFydCwgc3RydWN0IGNvZGV0YWcgKnN0b3ApCiB7CiAJLyogQWxsb2NhdGUgbW9kdWxlIGFsbG9jX3RhZyBwZXJjcHUgY291bnRlcnMgKi8KQEAgLTk3NSw2ICYjNDM7OTc3LDkgQEAgc3RhdGljIGludCBsb2FkX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBjb2RldGFnICpzdGFydCwgc3RydWN0IGNvZGV0YWcKIAlzdHJ1Y3QgYWxsb2NfdGFnICpzdG9wX3RhZzsKIAlzdHJ1Y3QgYWxsb2NfdGFnICp0YWc7CiAKJiM0MzsJaWYgKCFtZW1fcHJvZmlsaW5nX3N1cHBvcnQpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKIAkvKiBwZXJjcHUgY291bnRlcnMgZm9yIGNvcmUgYWxsb2NhdGlvbnMgYXJlIGFscmVhZHkgc3RhdGljYWxseSBhbGxvY2F0ZWQgKi8KIAlpZiAoIW1vZCkKIAkJcmV0dXJuIDA7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNzcxCgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogNTA2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIEtlcm5lbCBNb2R1bGUgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggdGhhdCB0d2Vha3MgaG93IGtlcm5lbCBtb2R1bGVzIGFyZSBsb2FkZWQuIEl0JiMzOTtzIHRvdWNoaW5nIGBrZXJuZWwvbW9kdWxlL21haW4uY2AgYW5kIGBtbS9hbGxvY190YWcuY2AsIHdoaWNoIGltbWVkaWF0ZWx5IGZsYWdzIG15IGF0dGVudGlvbi4gU3BlY2lmaWNhbGx5LCB0aGUgcmV0cnkgbG9vcCBhZGRlZCBpbiBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAgd2l0aGluIGBrZXJuZWwvbW9kdWxlL21haW4uY2AgaXMgdGhlIGtleSBwb2ludC4gSWYgYG1vdmVfbW9kdWxlYCByZXR1cm5zIGAtRUFHQUlOYCwgaXQmIzM5O3MgcmVzZXR0aW5nIHNvbWUgbW9kdWxlIHN0YXRlIGFuZCB0cnlpbmcgYWdhaW4uIFRoaXMgc2NyZWFtcyAmIzM0O3BvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UsJiMzNDsgYW5kIEkmIzM5O20ga2VlbiB0byBpbnZlc3RpZ2F0ZSB0aGF0LgoKSW4gYG1tL2FsbG9jX3RhZy5jYCwgdGhleSYjMzk7dmUgbW92ZWQgYHJlbGVhc2VfbW9kdWxlX3RhZ3NgIGFuZCBjaGFuZ2VkIGByZXNlcnZlX21vZHVsZV90YWdzYCB0byByZXR1cm4gYEVSUl9QVFIoLUVBR0FJTilgIGlmIGAhdGFnc19hZGRyZXNzYWJsZSgpYC4gVGhleSYjMzk7dmUgYWxzbyBhZGRlZCBhIGNoZWNrIGZvciBgIW1lbV9wcm9maWxpbmdfc3VwcG9ydGAgaW4gYGxvYWRfbW9kdWxlYC4gVGhlc2UgY2hhbmdlcyBhcmUgaW50ZXJlc3RpbmcgYnV0IHRoZSByZXRyeSBsb29wIGlzIG15IHByaW1hcnkgY29uY2Vybi4KCkxldCYjMzk7cyBkaXZlIGludG8gdGhhdCByZXRyeSBsb29wIGluIGBsYXlvdXRfYW5kX2FsbG9jYXRlYDoKCmBgYGMKcmV0cnk6CglsYXlvdXRfc2VjdGlvbnMoaW5mby0mZ3Q7bW9kLCBpbmZvKTsKCWxheW91dF9zeW10YWIoaW5mby0mZ3Q7bW9kLCBpbmZvKTsKCgkvKiBBbGxvY2F0ZSBhbmQgbW92ZSB0byB0aGUgZmluYWwgcGxhY2UgKi8KCWVyciA9IG1vdmVfbW9kdWxlKGluZm8tJmd0O21vZCwgaW5mbyk7CglpZiAoZXJyKSB7CgkJaWYgKGVyciAhPSAtRUFHQUlOKQoJCQlyZXR1cm4gRVJSX1BUUihlcnIpOwoJCS8qCgkJICogLUVBR0FJTiBtZWFucyBwcm9maWxpbmcgd2FzIGRpc2FibGVkIGJ1dCB0aGUgbW9kdWxlCgkJICogY2FuIHN0aWxsIGxvYWQgd2l0aG91dCBpdC4gUmVzZXQgc3RhdGUgYW5kIHJldHJ5LgoJCSAqLwoJCXJld3JpdGVfc2VjdGlvbl9oZWFkZXJzKGluZm8sIGZsYWdzKTsKCQlmb3JfZWFjaF9tb2RfbWVtX3R5cGUodHlwZSkKCQkJaW5mby0mZ3Q7bW9kLSZndDttZW1bdHlwZV0uc2l6ZSA9IDA7CgkJaW5mby0mZ3Q7c2VjaGRyc1tpbmZvLSZndDtpbmRleC5zeW1dLnNoX2ZsYWdzICZhbXA7PSB+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DOwoJCWluZm8tJmd0O3NlY2hkcnNbaW5mby0mZ3Q7aW5kZXguc3RyXS5zaF9mbGFncyAmYW1wOz0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQzsKCQlnb3RvIHJldHJ5OwoJfQpgYGAKClRoZSB3b3JyeSBpcyB0aGlzOiBgbGF5b3V0X3NlY3Rpb25zYCBhbmQgYGxheW91dF9zeW10YWJgIGNhbGN1bGF0ZSBzaXplcyBhbmQgb2Zmc2V0cy4gSWYgYG1vdmVfbW9kdWxlYCBmYWlscyB3aXRoIGAtRUFHQUlOYCwgdGhlIGNvZGUgemVyb3Mgb3V0IHRoZSBzaXplcywgY2xlYXJzIHRoZSBgU0hGX0FMTE9DYCBmbGFnIGZyb20gc3ltYm9sIGFuZCBzdHJpbmcgdGFibGVzLCBhbmQgdGhlbiByZXRyaWVzLiBCdXQsIHRoZSBjYWxsIHRvIGByZXdyaXRlX3NlY3Rpb25faGVhZGVyc2AgaXMgd2hhdCBJIHJlYWxseSBuZWVkIHRvIGV4YW1pbmUuIFRoZSBzaXplcyBhbmQgc2hfZmxhZ3MgbWlnaHQgaGF2ZSBiZWVuIGNsZWFyZWQsIGJ1dCBkb2VzIGByZXdyaXRlX3NlY3Rpb25faGVhZGVyc2AgaGF2ZSBhbnkgdW5pbml0aWFsaXplZCByZWFkcywgZ2l2ZW4gdGhlIHJlc2V0IHN0YXRlPyBUaGF0JiMzOTtzIHRoZSBjcml0aWNhbCBxdWVzdGlvbiBoZXJlLiBJJiMzOTttIGdvaW5nIHRvIGxldmVyYWdlIGBkZWZhdWx0X2FwaTpncmVwcGVyYCB0byBpbnNwZWN0IGByZXdyaXRlX3NlY3Rpb25faGVhZGVyc2AgaW1tZWRpYXRlbHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Jld3JpdGVfc2VjdGlvbl9oZWFkZXJzJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS9tYWluLmM9MTEzOD1zdGF0aWMgY2hhciAqZ2V0X25leHRfbW9kaW5mbyhjb25zdCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBjb25zdCBjaGFyICp0YWcsXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMTE0Ni1cdC8qXG5rZXJuZWwvbW9kdWxlL21haW4uYzoxMTQ3Olx0ICogZ2V0X21vZGluZm8oKSBjYWxscyBtYWRlIGJlZm9yZSByZXdyaXRlX3NlY3Rpb25faGVhZGVycygpXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xMTQ4LVx0ICogbXVzdCB1c2Ugc2hfb2Zmc2V0LCBhcyBzaF9hZGRyIGlzbiYjMzk7dCBzZXQhXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9MjUyMz1zdGF0aWMgdm9pZCBmcmVlX2NvcHkoc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgaW50IGZsYWdzKVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI1MzAtXG5rZXJuZWwvbW9kdWxlL21haW4uYzoyNTMxOnN0YXRpYyBpbnQgcmV3cml0ZV9zZWN0aW9uX2hlYWRlcnMoc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgaW50IGZsYWdzKVxua2VybmVsL21vZHVsZS9tYWluLmMtMjUzMi17XG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9Mjk0Mz1zdGF0aWMgc3RydWN0IG1vZHVsZSAqbGF5b3V0X2FuZF9hbGxvY2F0ZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMjk4Ni1cdFx0ICovXG5rZXJuZWwvbW9kdWxlL21haW4uYzoyOTg3Olx0XHRyZXdyaXRlX3NlY3Rpb25faGVhZGVycyhpbmZvLCBmbGFncyk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTg4LVx0XHRmb3JfZWFjaF9tb2RfbWVtX3R5cGUodHlwZSlcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYz0zMzk5PXN0YXRpYyBpbnQgZWFybHlfbW9kX2NoZWNrKHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGludCBmbGFncylcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zNDExLVxua2VybmVsL21vZHVsZS9tYWluLmM6MzQxMjpcdGVyciA9IHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzKGluZm8sIGZsYWdzKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM0MTMtXHRpZiAoZXJyKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MzMyCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMjEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gcmVhZGluZyB0aGUgY29kZToKCioqRGl2aW5nIGludG8gYHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzYCoqCgpPa2F5LCBsZXQmIzM5O3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MgYW5kIHRha2UgYSBsb29rIGF0IGByZXdyaXRlX3NlY3Rpb25faGVhZGVyc2AgaW4gYGtlcm5lbC9tb2R1bGUvbWFpbi5jYC4gVGhpcyBmdW5jdGlvbiBpcyBjcml0aWNhbDsgaXQmIzM5O3MgdGhlIG9uZSByZXNwb25zaWJsZSBmb3IuLi4gd2VsbCwgcmV3cml0aW5nIHRoZSBzZWN0aW9uIGhlYWRlcnMsIG9idmlvdXNseSwgYnV0IHRoZSB3aHkgaXMgdGhlIHF1ZXN0aW9uLiBJIGtub3cgdGhlIGNvcmUgb2YgbW9kdWxlIGxvYWRpbmcgaW52b2x2ZXMgbWFuaXB1bGF0aW5nIHRoZSBFTEYgaGVhZGVycyB0byBtYWtlIHRoZSBtb2R1bGUgZml0IGludG8gdGhlIGtlcm5lbCYjMzk7cyBtZW1vcnkgc3BhY2UgYW5kIGVuc3VyZSBwcm9wZXIgcmVsb2NhdGlvbi4gSSYjMzk7bSBleHBlY3RpbmcgdGhpcyBmdW5jdGlvbiBkZWFscyB3aXRoIG1vZGlmeWluZyB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUgdG8gcmVmbGVjdCB0aG9zZSBhZGp1c3RtZW50cy4gTXkgYXNzdW1wdGlvbiBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCBlaXRoZXIgYmUgaW52b2x2ZWQgaW46IAoxLiAgKipBZGp1c3RpbmcgQWRkcmVzc2VzOioqIE1vZGlmeWluZyB0aGUgYHNoX2FkZHJgIGZpZWxkcyBvZiB0aGUgc2VjdGlvbiBoZWFkZXJzIHRvIHJlZmxlY3QgdGhlaXIgdmlydHVhbCBhZGRyZXNzZXMgaW4ga2VybmVsIHNwYWNlIGFmdGVyIGxvYWRpbmcuIEl0IG1pZ2h0IG5lZWQgdG8gYWNjb3VudCBmb3IgYW55IGJhc2UgYWRkcmVzcyBvciBvZmZzZXQgYXBwbGllZCBkdXJpbmcgbW9kdWxlIGxvYWRpbmcuCjIuICAqKlJlbG9jYXRpbmcgU2VjdGlvbnM6KiogVGhlIGZ1bmN0aW9uIG1pZ2h0IGhhbmRsZSB0YXNrcyBsaWtlIGNvbWJpbmluZywgc3BsaXR0aW5nLCBvciByZW9yZGVyaW5nIG9mIHNlY3Rpb25zIGFzIHBhcnQgb2YgbWVtb3J5IG1hbmFnZW1lbnQgb3IgdG8gc3VwcG9ydCBmZWF0dXJlcyBsaWtlIHBlci1DUFUgZGF0YSBvciByZWFkLW9ubHkvcmVhZC13cml0ZSBkaXN0aW5jdGlvbi4KMy4gICoqQWRqdXN0aW5nIFNpemVzOioqIEl0JiMzOTtzIGFsc28gcG9zc2libGUgdGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoaW5ncyBsaWtlIGFkanVzdGluZyB0aGUgc2VjdGlvbiBzaXplcyBhZnRlciByZWxvY2F0aW9uIG9yIG1vZGlmeWluZyB0aGUgc2VjdGlvbiBoZWFkZXIgZmxhZ3MgdG8gcmVmbGVjdCBuZXcgcGVybWlzc2lvbnMuCjQuICAqKkhhbmRsaW5nIFNwZWNpYWwgU2VjdGlvbnM6KiogSXQgY291bGQgYmUgYSBwYXJ0IG9mIG1hbmFnaW5nIHNwZWNpYWwgc2VjdGlvbnMgbGlrZSBgLmluaXRgIG9yIGAuZXhpdGAuCjUuICAqKkRlYWxpbmcgd2l0aCBEZXBlbmRlbmNpZXM6KiogRmluYWxseSwgaXQgaXMgcG9zc2libGUgdGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgYWRqdXN0aW5nIHNlY3Rpb24gaGVhZGVycyByZWxhdGVkIHRvIGltcG9ydGVkIHN5bWJvbHMgb3IgZGVwZW5kZW5jaWVzLgoKSSYjMzk7bSBrZWVuIHRvIHNlZSBpZiBteSBhc3N1bXB0aW9ucyBob2xkIHRydWUgYW5kIHRvIG9ic2VydmUgdGhlIG51YW5jZXMgb2YgdGhpcyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4gSSYjMzk7bSBleHBlY3RpbmcgdG8gc2VlIGRldGFpbHMgb24gaG93IHRoZSBrZXJuZWwgaGFuZGxlcyBzeW1ib2wgdGFibGVzLCByZWxvY2F0aW9uIGVudHJpZXMsIGFuZCB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgb2YgdGhlIG1vZHVsZSB3aXRoaW4gdGhlIGtlcm5lbCYjMzk7cyBtZW1vcnkgc3BhY2UuIFRpbWUgdG8gZGVsdmUgaW4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS9tYWluLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyNTMxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzI1MzE6XHRzdGF0aWMgaW50IHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzKHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGludCBmbGFncylcbjI1MzI6XHR7XG4yNTMzOlx0XHR1bnNpZ25lZCBpbnQgaTtcbjI1MzQ6XHRcbjI1MzU6XHRcdC8qIFRoaXMgc2hvdWxkIGFsd2F5cyBiZSB0cnVlLCBidXQgbGV0JiMzOTtzIGJlIHN1cmUuICovXG4yNTM2Olx0XHRpbmZvLVx1MDAzZXNlY2hkcnNbMF0uc2hfYWRkciA9IDA7XG4yNTM3Olx0XG4yNTM4Olx0XHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBpbmZvLVx1MDAzZWhkci1cdTAwM2VlX3NobnVtOyBpJiM0MzsmIzQzOykge1xuMjUzOTpcdFx0XHRFbGZfU2hkciAqc2hkciA9IFx1MDAyNmluZm8tXHUwMDNlc2VjaGRyc1tpXTtcbjI1NDA6XHRcbjI1NDE6XHRcdFx0LypcbjI1NDI6XHRcdFx0ICogTWFyayBhbGwgc2VjdGlvbnMgc2hfYWRkciB3aXRoIHRoZWlyIGFkZHJlc3MgaW4gdGhlXG4yNTQzOlx0XHRcdCAqIHRlbXBvcmFyeSBpbWFnZS5cbjI1NDQ6XHRcdFx0ICovXG4yNTQ1Olx0XHRcdHNoZHItXHUwMDNlc2hfYWRkciA9IChzaXplX3QpaW5mby1cdTAwM2VoZHIgJiM0Mzsgc2hkci1cdTAwM2VzaF9vZmZzZXQ7XG4yNTQ2Olx0XG4yNTQ3Olx0XHR9XG4yNTQ4Olx0XG4yNTQ5Olx0XHQvKiBUcmFjayBidXQgZG9uJiMzOTt0IGtlZXAgbW9kaW5mbyBhbmQgdmVyc2lvbiBzZWN0aW9ucy4gKi9cbjI1NTA6XHRcdGluZm8tXHUwMDNlc2VjaGRyc1tpbmZvLVx1MDAzZWluZGV4LnZlcnNdLnNoX2ZsYWdzIFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcbjI1NTE6XHRcdGluZm8tXHUwMDNlc2VjaGRyc1tpbmZvLVx1MDAzZWluZGV4LnZlcnNfZXh0X2NyY10uc2hfZmxhZ3MgXHUwMDI2PVxuMjU1MjpcdFx0XHR+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DO1xuMjU1MzpcdFx0aW5mby1cdTAwM2VzZWNoZHJzW2luZm8tXHUwMDNlaW5kZXgudmVyc19leHRfbmFtZV0uc2hfZmxhZ3MgXHUwMDI2PVxuMjU1NDpcdFx0XHR+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DO1xuMjU1NTpcdFx0aW5mby1cdTAwM2VzZWNoZHJzW2luZm8tXHUwMDNlaW5kZXguaW5mb10uc2hfZmxhZ3MgXHUwMDI2PSB+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DO1xuMjU1NjpcdFxuMjU1NzpcdFx0cmV0dXJuIDA7XG4yNTU4Olx0fVxuMjU1OTpcdFxuMjU2MDpcdHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtb2R1bGVfbGljZW5zZV9vZmZlbmRlcnNbXSA9IHtcbjI1NjE6XHRcdC8qIGRyaXZlcmxvYWRlciB3YXMgY2F1Z2h0IHdyb25nbHkgcHJldGVuZGluZyB0byBiZSB1bmRlciBHUEwgKi9cbjI1NjI6XHRcdFwmIzM0O2RyaXZlcmxvYWRlclwmIzM0OyxcbjI1NjM6XHRcbjI1NjQ6XHRcdC8qIGx2ZSBjbGFpbXMgdG8gYmUgR1BMIGJ1dCB1cHN0cmVhbSB3b24mIzM5O3QgcHJvdmlkZSBzb3VyY2UgKi9cbjI1NjU6XHRcdFwmIzM0O2x2ZVwmIzM0OyxcbjI1NjY6XHR9O1xuMjU2NzpcdFxuMjU2ODpcdC8qXG4yNTY5Olx0ICogVGhlc2UgY2FsbHMgdGFpbnQgdGhlIGtlcm5lbCBkZXBlbmRpbmcgY2VydGFpbiBtb2R1bGUgY2lyY3Vtc3RhbmNlcyAqL1xuMjU3MDpcdHN0YXRpYyB2b2lkIG1vZHVsZV9hdWdtZW50X2tlcm5lbF90YWludHMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxuMjU3MTpcdHtcbjI1NzI6XHRcdGludCBwcmV2X3RhaW50ID0gdGVzdF90YWludChUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEUpO1xuMjU3MzpcdFx0c2l6ZV90IGk7XG4yNTc0Olx0XG4yNTc1Olx0XHRpZiAoIWdldF9tb2RpbmZvKGluZm8sIFwmIzM0O2ludHJlZVwmIzM0OykpIHtcbjI1NzY6XHRcdFx0aWYgKCF0ZXN0X3RhaW50KFRBSU5UX09PVF9NT0RVTEUpKVxuMjU3NzpcdFx0XHRcdHByX3dhcm4oXCYjMzQ7JXM6IGxvYWRpbmcgb3V0LW9mLXRyZWUgbW9kdWxlIHRhaW50cyBrZXJuZWwuXFxuXCYjMzQ7LFxuMjU3ODpcdFx0XHRcdFx0bW9kLVx1MDAzZW5hbWUpO1xuMjU3OTpcdFx0XHRhZGRfdGFpbnRfbW9kdWxlKG1vZCwgVEFJTlRfT09UX01PRFVMRSwgTE9DS0RFUF9TVElMTF9PSyk7XG4yNTgwOlx0XHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY2MDgKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiA4MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBicmVha2Rvd24gb2Ygd2hhdCYjMzk7cyBoYXBwZW5pbmcsIGZyb20gbXkgZXhwZXJ0IHBlcnNwZWN0aXZlOgoKKipBbmFseXppbmcgU2VjdGlvbiBIZWFkZXIgTWFuaXB1bGF0aW9uKioKClJpZ2h0LCBsZXQgbWUgZ2V0IHRoaXMgc3RyYWlnaHQgaW4gbXkgaGVhZC4gYHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzYCBpcyByZXNldHRpbmcgYHNoX2FkZHJgIOKAkyBpdCYjMzk7cyBiYXNpY2FsbHkgcG9pbnRpbmcgaXQgdG8gdGhlIHRlbXAgaW1hZ2UuIEdvdCBpdC4gTm93LCBgbGF5b3V0X3NlY3Rpb25zYCBhbmQgYGxheW91dF9zeW10YWJgIGNvbWUgaW50byBwbGF5LCBhbmQgdGhleSYjMzk7cmUgZ29pbmcgdG8gc3RhcnQgdHdlYWtpbmcgdGhpbmdzIGxpa2UgYHNoX2FkZHJgLCBgc2hfZW50c2l6ZWAsIGFuZCBzbyBvbi4gSG9sZCBvbi4uLiBJIG5lZWQgdG8gYmUgcHJlY2lzZSBoZXJlLiAqYGxheW91dF9zZWN0aW9uc2AqIGlzIGFsc28gbW9kaWZ5aW5nIGBzaF9lbnRzaXplYCAqYW5kKiBgc2hfYWRkcmAuICBJIG5lZWQgdG8gdmVyaWZ5IHRoYXQuIExldCYjMzk7cyBkaXZlIGludG8gYGxheW91dF9zZWN0aW9uc2AgYW5kIHNlZSB3aGF0JiMzOTtzIGFjdHVhbGx5IGhhcHBlbmluZy4gR290dGEga2VlcCB0aGUgZGV0YWlscyBzdHJhaWdodCBzbyBJIGRvbiYjMzk7dCBtaXNzIGFueSBlZGdlIGNhc2VzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtsYXlvdXRfc2VjdGlvbnMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvbW9kdWxlLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvbW9kdWxlL21haW4uYz0xNjcxPWJvb2wgbW9kdWxlX2luaXRfbGF5b3V0X3NlY3Rpb24oY29uc3QgY2hhciAqc25hbWUpXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMTY3OS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjE2ODA6c3RhdGljIHZvaWQgX19sYXlvdXRfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBib29sIGlzX2luaXQpXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNjgxLXtcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNzUxLSAqL1xua2VybmVsL21vZHVsZS9tYWluLmM6MTc1MjpzdGF0aWMgdm9pZCBsYXlvdXRfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxua2VybmVsL21vZHVsZS9tYWluLmMtMTc1My17XG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMTc1OS1cdHByX2RlYnVnKFwmIzM0O0NvcmUgc2VjdGlvbiBhbGxvY2F0aW9uIG9yZGVyIGZvciAlczpcXG5cJiMzNDssIG1vZC1cdTAwM2VuYW1lKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjE3NjA6XHRfX2xheW91dF9zZWN0aW9ucyhtb2QsIGluZm8sIGZhbHNlKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTE3NjEtXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNzYyLVx0cHJfZGVidWcoXCYjMzQ7SW5pdCBzZWN0aW9uIGFsbG9jYXRpb24gb3JkZXIgZm9yICVzOlxcblwmIzM0OywgbW9kLVx1MDAzZW5hbWUpO1xua2VybmVsL21vZHVsZS9tYWluLmM6MTc2MzpcdF9fbGF5b3V0X3NlY3Rpb25zKG1vZCwgaW5mbywgdHJ1ZSk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNzY0LX1cbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYz0yOTQzPXN0YXRpYyBzdHJ1Y3QgbW9kdWxlICpsYXlvdXRfYW5kX2FsbG9jYXRlKHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGludCBmbGFncylcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTYyLVx0Lypcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI5NjM6XHQgKiBNYXJrIHJlbGV2YW50IHNlY3Rpb25zIGFzIFNIRl9ST19BRlRFUl9JTklUIHNvIGxheW91dF9zZWN0aW9ucygpIGNhblxua2VybmVsL21vZHVsZS9tYWluLmMtMjk2NC1cdCAqIHB1dCB0aGVtIGluIHRoZSByaWdodCBwbGFjZS5cbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTc0LXJldHJ5Olxua2VybmVsL21vZHVsZS9tYWluLmM6Mjk3NTpcdGxheW91dF9zZWN0aW9ucyhpbmZvLVx1MDAzZW1vZCwgaW5mbyk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTc2LVx0bGF5b3V0X3N5bXRhYihpbmZvLVx1MDAzZW1vZCwgaW5mbyk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDczOTkKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAxMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKkFuYWx5emluZyB0aGUgX19sYXlvdXRfc2VjdGlvbnMgRGlyZWN0aXZlKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGluLiBNeSBtaW5kIGltbWVkaWF0ZWx5IGdvZXMgdG8gYF9fbGF5b3V0X3NlY3Rpb25zYC4gV2hlbmV2ZXIgSSBlbmNvdW50ZXIgdGhpcywgSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgbW9kdWxhciBzdHJ1Y3R1cmUuIFRoaXMgZGlyZWN0aXZlLCBtb3JlIG9mdGVuIHRoYW4gbm90LCBpcyBnb2luZyB0byBiZSB0aGUgY2VudHJhbCBwb2ludCBmb3IgYnVpbGRpbmcgY29tcGxleCBwYWdlcyBvciB0ZW1wbGF0ZXMgdGhhdCBuZWVkIHRvIGJlIGhpZ2hseSBjdXN0b21pemFibGUgYW5kIG1haW50YWluYWJsZS4gSXQgaW1wbGllcyBhIHN5c3RlbSB3aGVyZSBjb250ZW50IGlzbiYjMzk7dCBtb25vbGl0aGljLCBidXQgYnJva2VuIGRvd24gaW50byBsb2dpY2FsbHkgZ3JvdXBlZCBhbmQgcmV1c2FibGUgc2VjdGlvbnMuCgpJJiMzOTttIG1lbnRhbGx5IG1hcHBpbmcgdGhlIHBvc3NpYmlsaXRpZXMuIElzIHRoaXMgYSBjdXN0b20gZGlyZWN0aXZlLCBwYXJ0IG9mIGEgZnJhbWV3b3JrLCBvciBhIGNvcmUgbGFuZ3VhZ2UgY29uc3RydWN0PyBUaGF0IHdpbGwgZHJhbWF0aWNhbGx5IGFsdGVyIG15IGluaXRpYWwgYXNzZXNzbWVudC4gSWYgaXQmIzM5O3MgY3VzdG9tLCBJJiMzOTtsbCBuZWVkIHRvIHVuZGVyc3RhbmQgd2hlcmUgdGhlIGltcGxlbWVudGF0aW9uIGV4aXN0cyBhbmQgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSBicm9hZGVyIHJlbmRlcmluZyBjb250ZXh0LiBJZiBpdCYjMzk7cyBmcmFtZXdvcmstc3BlY2lmaWMsIEkmIzM5O20gYWxyZWFkeSBzdGFydGluZyB0byB0aGluayBhYm91dCB3aGljaCBmcmFtZXdvcmsuIFdoYXQmIzM5O3MgaXRzIHB1cnBvc2U/IElzIGl0IGhhbmRsaW5nIHRoaW5ncyBsaWtlIG5hdmlnYXRpb24sIGNvbnRlbnQgcmVnaW9ucywgc2lkZWJhcnMsIG9yIGVudGlyZSBwYWdlIHRlbXBsYXRlcz8gSXMgdGhlcmUgYSBuZXN0ZWQgc3RydWN0dXJlIGludm9sdmVkPyBIb3cgaXMgdGhlIHJlbmRlcmluZyBjb250ZXh0IHBhc3NlZCBkb3duIGZyb20gdGhlIHRvcC1sZXZlbCB0byB0aGUgaW5kaXZpZHVhbCBzZWN0aW9ucz8KCkkgc3RhcnQgdGhpbmtpbmcgYWJvdXQgaG93IGl0IG1pZ2h0IGJlIGltcGxlbWVudGVkLiBBcmUgdGhlIHNlY3Rpb25zIGRlZmluZWQgaW4gYSBkZWNsYXJhdGl2ZSBtYW5uZXIsIG9yIGlzIHRoZXJlIG1vcmUgZHluYW1pYyBsb2dpYyBpbnZvbHZlZD8gQ291bGQgdGhpcyBiZSBhIHNpbXBsZSBpbmNsdXNpb24gbWVjaGFuaXNtLCBvciBkb2VzIGl0IHBvdGVudGlhbGx5IGRlYWwgd2l0aCBkYXRhIGJpbmRpbmcsIHRlbXBsYXRpbmcgZW5naW5lcywgb3IgZXZlbiBjb25kaXRpb25hbCByZW5kZXJpbmcgb2YgZW50aXJlIHNlY3Rpb25zIGJhc2VkIG9uIGRhdGE/IEnigJltIGltYWdpbmluZyB0aGUgcG90ZW50aWFsIGltcGFjdCBvbiBwZXJmb3JtYW5jZSB0b28uIFdpdGggdGhlc2Ugc29ydHMgb2YgbGF5b3V0IGRpcmVjdGl2ZXMsIG1hbmFnaW5nIHNlY3Rpb24gZGVwZW5kZW5jaWVzIGJlY29tZXMgY3JpdGljYWwsIHNvIHRoYXQmIzM5O3Mgc29tZXRoaW5nIHRoYXQmIzM5O3MgYWx3YXlzIGluIHRoZSBiYWNrIG9mIG15IG1pbmQuCgpVbHRpbWF0ZWx5LCBteSBnb2FsIGhlcmUgaXMgdG8gZGV0ZXJtaW5lIGhvdyB0aGUgZnJhbWV3b3JrLCBsYW5ndWFnZSwgb3Igc3lzdGVtLCBlbmFibGVzIGEgY2xlYW4gc2VwYXJhdGlvbiBvZiBjb25jZXJucyBhbmQgdGhlIG1vc3QgZWZmaWNpZW50IHdheSB0byBtYWludGFpbiBhbmQgbWFuYWdlIGxhcmdlLCBjb21wbGV4IHRlbXBsYXRlcyBvciBsYXlvdXRzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvbWFpbi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTY4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNjgwOlx0c3RhdGljIHZvaWQgX19sYXlvdXRfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBib29sIGlzX2luaXQpXG4xNjgxOlx0e1xuMTY4MjpcdFx0dW5zaWduZWQgaW50IG0sIGk7XG4xNjgzOlx0XG4xNjg0Olx0XHQvKlxuMTY4NTpcdFx0ICogeyBNYXNrIG9mIHJlcXVpcmVkIHNlY3Rpb24gaGVhZGVyIGZsYWdzLFxuMTY4NjpcdFx0ICogICBNYXNrIG9mIGV4Y2x1ZGVkIHNlY3Rpb24gaGVhZGVyIGZsYWdzIH1cbjE2ODc6XHRcdCAqL1xuMTY4ODpcdFx0c3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbWFza3NbXVsyXSA9IHtcbjE2ODk6XHRcdFx0eyBTSEZfRVhFQ0lOU1RSIHwgU0hGX0FMTE9DLCBBUkNIX1NIRl9TTUFMTCB9LFxuMTY5MDpcdFx0XHR7IFNIRl9BTExPQywgU0hGX1dSSVRFIHwgQVJDSF9TSEZfU01BTEwgfSxcbjE2OTE6XHRcdFx0eyBTSEZfUk9fQUZURVJfSU5JVCB8IFNIRl9BTExPQywgQVJDSF9TSEZfU01BTEwgfSxcbjE2OTI6XHRcdFx0eyBTSEZfV1JJVEUgfCBTSEZfQUxMT0MsIEFSQ0hfU0hGX1NNQUxMIH0sXG4xNjkzOlx0XHRcdHsgQVJDSF9TSEZfU01BTEwgfCBTSEZfQUxMT0MsIDAgfVxuMTY5NDpcdFx0fTtcbjE2OTU6XHRcdHN0YXRpYyBjb25zdCBpbnQgY29yZV9tX3RvX21lbV90eXBlW10gPSB7XG4xNjk2Olx0XHRcdE1PRF9URVhULFxuMTY5NzpcdFx0XHRNT0RfUk9EQVRBLFxuMTY5ODpcdFx0XHRNT0RfUk9fQUZURVJfSU5JVCxcbjE2OTk6XHRcdFx0TU9EX0RBVEEsXG4xNzAwOlx0XHRcdE1PRF9EQVRBLFxuMTcwMTpcdFx0fTtcbjE3MDI6XHRcdHN0YXRpYyBjb25zdCBpbnQgaW5pdF9tX3RvX21lbV90eXBlW10gPSB7XG4xNzAzOlx0XHRcdE1PRF9JTklUX1RFWFQsXG4xNzA0Olx0XHRcdE1PRF9JTklUX1JPREFUQSxcbjE3MDU6XHRcdFx0TU9EX0lOVkFMSUQsXG4xNzA2Olx0XHRcdE1PRF9JTklUX0RBVEEsXG4xNzA3Olx0XHRcdE1PRF9JTklUX0RBVEEsXG4xNzA4Olx0XHR9O1xuMTcwOTpcdFxuMTcxMDpcdFx0Zm9yIChtID0gMDsgbSBcdTAwM2MgQVJSQVlfU0laRShtYXNrcyk7ICYjNDM7JiM0MzttKSB7XG4xNzExOlx0XHRcdGVudW0gbW9kX21lbV90eXBlIHR5cGUgPSBpc19pbml0ID8gaW5pdF9tX3RvX21lbV90eXBlW21dIDogY29yZV9tX3RvX21lbV90eXBlW21dO1xuMTcxMjpcdFxuMTcxMzpcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBpbmZvLVx1MDAzZWhkci1cdTAwM2VlX3NobnVtOyAmIzQzOyYjNDM7aSkge1xuMTcxNDpcdFx0XHRcdEVsZl9TaGRyICpzID0gXHUwMDI2aW5mby1cdTAwM2VzZWNoZHJzW2ldO1xuMTcxNTpcdFx0XHRcdGNvbnN0IGNoYXIgKnNuYW1lID0gaW5mby1cdTAwM2VzZWNzdHJpbmdzICYjNDM7IHMtXHUwMDNlc2hfbmFtZTtcbjE3MTY6XHRcbjE3MTc6XHRcdFx0XHRpZiAoKHMtXHUwMDNlc2hfZmxhZ3MgXHUwMDI2IG1hc2tzW21dWzBdKSAhPSBtYXNrc1ttXVswXVxuMTcxODpcdFx0XHRcdCAgICB8fCAocy1cdTAwM2VzaF9mbGFncyBcdTAwMjYgbWFza3NbbV1bMV0pXG4xNzE5Olx0XHRcdFx0ICAgIHx8IHMtXHUwMDNlc2hfZW50c2l6ZSAhPSB+MFVMXG4xNzIwOlx0XHRcdFx0ICAgIHx8IGlzX2luaXQgIT0gbW9kdWxlX2luaXRfbGF5b3V0X3NlY3Rpb24oc25hbWUpKVxuMTcyMTpcdFx0XHRcdFx0Y29udGludWU7XG4xNzIyOlx0XG4xNzIzOlx0XHRcdFx0aWYgKFdBUk5fT05fT05DRSh0eXBlID09IE1PRF9JTlZBTElEKSlcbjE3MjQ6XHRcdFx0XHRcdGNvbnRpbnVlO1xuMTcyNTpcdFxuMTcyNjpcdFx0XHRcdC8qXG4xNzI3Olx0XHRcdFx0ICogRG8gbm90IGFsbG9jYXRlIGNvZGV0YWcgbWVtb3J5IGFzIHdlIGxvYWQgaXQgaW50b1xuMTcyODpcdFx0XHRcdCAqIHByZWFsbG9jYXRlZCBjb250aWd1b3VzIG1lbW9yeS5cbjE3Mjk6XHRcdFx0XHQgKi9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODY0NgoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDEyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBhc3N1bWluZyBJJiMzOTttIGRlZXAgaW4gbXkgZG9tYWluIG9mIGV4cGVydGlzZToKCioqRGl2aW5nIERlZXBlciBpbnRvIGBfX2xheW91dF9zZWN0aW9uc2AqKgoKQWxyaWdodCwgdGhhdCYjMzk7cyB3aGF0IEkgbmVlZCB0byBkbyBuZXh0LiBJJiMzOTt2ZSBnb3QgYSBncmFzcCBvZiB0aGUgb3ZlcmFsbCBwaWN0dXJlLCBidXQgdG8gcmVhbGx5IHVuZGVyc3RhbmQgdGhlIHN5c3RlbSYjMzk7cyBiZWhhdmlvciwgSSBuZWVkIHRvIGRpZyBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBgX19sYXlvdXRfc2VjdGlvbnNgLiBJdCYjMzk7cyBhIGtleSBjb21wb25lbnQsIHByb2JhYmx5IHdoZXJlIGEgbG90IG9mIHRoZSBjb3JlIGxheW91dCBsb2dpYyByZXNpZGVzLCBhbmQgcG90ZW50aWFsbHkgd2hlcmUgSSYjMzk7bGwgZmluZCB0aGUgYW5zd2VycyB0byB0aG9zZSBxdWVzdGlvbnMgSSB3YXMgbXVsbGluZyBvdmVyLiBMZXQgbWUgZ2V0IHBhc3QgdGhlIHN1cmZhY2UtbGV2ZWwgYW5kIHVuZGVyc3RhbmQgdGhlIHN1YnRsZXRpZXMuIEkgbmVlZCB0byBrbm93IGhvdyBzZWN0aW9ucyBhcmUgY29uc3RydWN0ZWQsIGxhaWQgb3V0LCBhbmQgaG93IHRoZXkgaW50ZXJhY3Qgd2l0aCB0aGUgb3ZlcmFsbCByZW5kZXJpbmcgcGlwZWxpbmUuIFRoaXMgd2lsbCBiZSB0aGUgbmV4dCBzdGVwIHRvIGZpbmQgYW55IGluc2lnaHRzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvbWFpbi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTczMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNzMwOlx0XHRcdFx0aWYgKGNvZGV0YWdfbmVlZHNfbW9kdWxlX3NlY3Rpb24obW9kLCBzbmFtZSwgcy1cdTAwM2VzaF9zaXplKSkge1xuMTczMTpcdFx0XHRcdFx0LypcbjE3MzI6XHRcdFx0XHRcdCAqIHMtXHUwMDNlc2hfZW50c2l6ZSB3b24mIzM5O3QgYmUgdXNlZCBidXQgcG9wdWxhdGUgdGhlXG4xNzMzOlx0XHRcdFx0XHQgKiB0eXBlIGZpZWxkIHRvIGF2b2lkIGNvbmZ1c2lvbi5cbjE3MzQ6XHRcdFx0XHRcdCAqL1xuMTczNTpcdFx0XHRcdFx0cy1cdTAwM2VzaF9lbnRzaXplID0gKCh1bnNpZ25lZCBsb25nKSh0eXBlKSBcdTAwMjYgU0hfRU5UU0laRV9UWVBFX01BU0spXG4xNzM2Olx0XHRcdFx0XHRcdFx0XHUwMDNjXHUwMDNjIFNIX0VOVFNJWkVfVFlQRV9TSElGVDtcbjE3Mzc6XHRcdFx0XHRcdGNvbnRpbnVlO1xuMTczODpcdFx0XHRcdH1cbjE3Mzk6XHRcbjE3NDA6XHRcdFx0XHRzLVx1MDAzZXNoX2VudHNpemUgPSBtb2R1bGVfZ2V0X29mZnNldF9hbmRfdHlwZShtb2QsIHR5cGUsIHMsIGkpO1xuMTc0MTpcdFx0XHRcdHByX2RlYnVnKFwmIzM0O1xcdCVzXFxuXCYjMzQ7LCBzbmFtZSk7XG4xNzQyOlx0XHRcdH1cbjE3NDM6XHRcdH1cbjE3NDQ6XHR9XG4xNzQ1Olx0XG4xNzQ2Olx0LypcbjE3NDc6XHQgKiBMYXkgb3V0IHRoZSBTSEZfQUxMT0Mgc2VjdGlvbnMgaW4gYSB3YXkgbm90IGRpc3NpbWlsYXIgdG8gaG93IGxkXG4xNzQ4Olx0ICogbWlnaHQgLS0gY29kZSwgcmVhZC1vbmx5IGRhdGEsIHJlYWQtd3JpdGUgZGF0YSwgc21hbGwgZGF0YS4gIFRhbGx5XG4xNzQ5Olx0ICogc2l6ZXMsIGFuZCBwbGFjZSB0aGUgb2Zmc2V0cyBpbnRvIHNoX2VudHNpemUgZmllbGRzOiBoaWdoIGJpdCBtZWFucyBpdFxuMTc1MDpcdCAqIGJlbG9uZ3MgaW4gaW5pdC5cbjE3NTE6XHQgKi9cbjE3NTI6XHRzdGF0aWMgdm9pZCBsYXlvdXRfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxuMTc1MzpcdHtcbjE3NTQ6XHRcdHVuc2lnbmVkIGludCBpO1xuMTc1NTpcdFxuMTc1NjpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgaW5mby1cdTAwM2VoZHItXHUwMDNlZV9zaG51bTsgaSYjNDM7JiM0MzspXG4xNzU3Olx0XHRcdGluZm8tXHUwMDNlc2VjaGRyc1tpXS5zaF9lbnRzaXplID0gfjBVTDtcbjE3NTg6XHRcbjE3NTk6XHRcdHByX2RlYnVnKFwmIzM0O0NvcmUgc2VjdGlvbiBhbGxvY2F0aW9uIG9yZGVyIGZvciAlczpcXG5cJiMzNDssIG1vZC1cdTAwM2VuYW1lKTtcbjE3NjA6XHRcdF9fbGF5b3V0X3NlY3Rpb25zKG1vZCwgaW5mbywgZmFsc2UpO1xuMTc2MTpcdFxuMTc2MjpcdFx0cHJfZGVidWcoXCYjMzQ7SW5pdCBzZWN0aW9uIGFsbG9jYXRpb24gb3JkZXIgZm9yICVzOlxcblwmIzM0OywgbW9kLVx1MDAzZW5hbWUpO1xuMTc2MzpcdFx0X19sYXlvdXRfc2VjdGlvbnMobW9kLCBpbmZvLCB0cnVlKTtcbjE3NjQ6XHR9XG4xNzY1Olx0XG4xNzY2Olx0c3RhdGljIHZvaWQgbW9kdWxlX2xpY2Vuc2VfdGFpbnRfY2hlY2soc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpsaWNlbnNlKVxuMTc2NzpcdHtcbjE3Njg6XHRcdGlmICghbGljZW5zZSlcbjE3Njk6XHRcdFx0bGljZW5zZSA9IFwmIzM0O3Vuc3BlY2lmaWVkXCYjMzQ7O1xuMTc3MDpcdFxuMTc3MTpcdFx0aWYgKCFsaWNlbnNlX2lzX2dwbF9jb21wYXRpYmxlKGxpY2Vuc2UpKSB7XG4xNzcyOlx0XHRcdGlmICghdGVzdF90YWludChUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEUpKVxuMTc3MzpcdFx0XHRcdHByX3dhcm4oXCYjMzQ7JXM6IG1vZHVsZSBsaWNlbnNlICYjMzk7JXMmIzM5OyB0YWludHMga2VybmVsLlxcblwmIzM0OyxcbjE3NzQ6XHRcdFx0XHRcdG1vZC1cdTAwM2VuYW1lLCBsaWNlbnNlKTtcbjE3NzU6XHRcdFx0YWRkX3RhaW50X21vZHVsZShtb2QsIFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRSxcbjE3NzY6XHRcdFx0XHRcdCBMT0NLREVQX05PV19VTlJFTElBQkxFKTtcbjE3Nzc6XHRcdH1cbjE3Nzg6XHR9XG4xNzc5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk2NDYKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiA5MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4KCioqVW5kZXJzdGFuZGluZyB0aGUgU2VjdGlvbiBMYXlvdXQgYW5kIE1vZHVsZSBNb3ZlbWVudCoqCgpBbHJpZ2h0LCBzbyBgbGF5b3V0X3NlY3Rpb25zYCDigJMgdGhhdCYjMzk7cyB0aGUgZnVuY3Rpb24gdGhhdCYjMzk7cyBzZXR0aW5nIGBzaF9lbnRzaXplYCB0bywgZXNzZW50aWFsbHksIGEgbWF4aW11bSB1bnNpZ25lZCBsb25nLCByaWdodD8gQW5kIGZyb20gdGhlcmUsIGl0JiMzOTtzIGNhbGN1bGF0aW5nIG9mZnNldHMgZm9yIHRoZSBzZWN0aW9ucy4gVGhhdCBzZWVtcyBwcmV0dHkgc3RhbmRhcmQgZm9yIHNldHRpbmcgdXAgdGhlIGluaXRpYWwgbGF5b3V0LiBCdXQgdGhlIG5leHQgcGFydCBpcyBpbnRlcmVzdGluZy4KCklmIGBtb3ZlX21vZHVsZWAgaGl0cyBhbiBgLUVBR0FJTmAgZXJyb3Ig4oCTIHdoaWNoIGltcGxpZXMgYSB0ZW1wb3JhcnkgcmVzb3VyY2UgaXNzdWUsIHBlcmhhcHMgYSBsb2NrIGNvbnRlbnRpb24gb3Igc29tZXRoaW5nIHNpbWlsYXIg4oCTIGl0IHJlc2V0cyB0aGUgc2VjdGlvbiBzaXplcyB0byB6ZXJvLiBBbmQgb24gdG9wIG9mIHRoYXQsIGl0IHVuc2V0cyB0aGUgYFNIRl9BTExPQ2AgZmxhZyBmb3IgYm90aCB0aGUgc3ltYm9sIHRhYmxlIGFuZCB0aGUgc3RyaW5nIHRhYmxlLiBOb3csIHRoZSBgU0hGX0FMTE9DYCBmbGFnIGlzIGNydWNpYWw7IGl0IG1lYW5zIHRoZSBzZWN0aW9uIGlzIHN1cHBvc2VkIHRvIHJlc2lkZSBpbiBtZW1vcnkgYXQgcnVudGltZS4gUmVzZXR0aW5nIHRoZSBzaXplcyBhbmQgY2xlYXJpbmcgdGhhdCBmbGFn4oCmIHRoYXQmIzM5O3MgYSBwcmV0dHkgZHJhc3RpYyByb2xsYmFjay4gSXQgc2VlbXMgbGlrZSBpdCYjMzk7cyB0cnlpbmcgdG8gZW5zdXJlIG5vIHBhcnRpYWxseS1hbGxvY2F0ZWQgZGF0YSBpcyBsZWZ0IGhhbmdpbmcgYXJvdW5kLCBhIGtpbmQgb2YgY2xlYW4tdXAgb3BlcmF0aW9uIGluIGNhc2Ugb2YgZmFpbHVyZS4KCldhaXQgYSBzZWNvbmTigKYgYG1vdmVfbW9kdWxlYCBpcyAqY2FsbGVkKiBhZnRlciBgbGF5b3V0X3NlY3Rpb25zYCBhbmQgYGxheW91dF9zeW10YWJgLiBJIHdhcyBleHBlY3RpbmcgdGhlIG90aGVyIHdheSBhcm91bmQuIE9rYXksIGdpdmVuIHRoYXQgb3JkZXJpbmcsIEkgbmVlZCB0byBjaGVjayBob3cgYG1vdmVfbW9kdWxlYCB3b3JrcyBiZWNhdXNlIGl0cyBiZWhhdmlvciBpcyBjZW50cmFsIHRvIHRoZSBvdmVyYWxsIHByb2Nlc3MuIFRpbWUgdG8gZGlnIGludG8gdGhlIGBtb3ZlX21vZHVsZWAgZnVuY3Rpb24gYW5kIGdldCBhIGJldHRlciBwaWN0dXJlIG9mIHdoYXQmIzM5O3MgZ29pbmcgb24gd2l0aCByZXNvdXJjZSBtYW5hZ2VtZW50IGFuZCBzZWN0aW9uIGFsbG9jYXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21vdmVfbW9kdWxlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS9tYWluLmM9MjM2ND1zdGF0aWMgaW50IGVsZl92YWxpZGl0eV9jYWNoZV9zdHJ0YWIoc3RydWN0IGxvYWRfaW5mbyAqaW5mbylcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yNDE1LSAqIEFzIGEgbGFzdCBzdGVwIHdlIHNldCBpbmZvLVx1MDAzZW1vZCB0byB0aGUgdGVtcG9yYXJ5IGNvcHkgb2YgdGhlIG1vZHVsZSBpblxua2VybmVsL21vZHVsZS9tYWluLmM6MjQxNjogKiBpbmZvLVx1MDAzZWhkci4gVGhlIGZpbmFsIG9uZSB3aWxsIGJlIGFsbG9jYXRlZCBpbiBtb3ZlX21vZHVsZSgpLiBBbnlcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI0MTctICogbW9kaWZpY2F0aW9ucyB3ZSBtYWtlIHRvIG91ciBjb3B5IG9mIHRoZSBtb2R1bGUgd2lsbCBiZSBjYXJyaWVkIG92ZXJcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYz0yNjU5PXN0YXRpYyBpbnQgZmluZF9tb2R1bGVfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI3ODctXG5rZXJuZWwvbW9kdWxlL21haW4uYzoyNzg4OnN0YXRpYyBpbnQgbW92ZV9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxua2VybmVsL21vZHVsZS9tYWluLmMtMjc4OS17XG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9Mjk0Mz1zdGF0aWMgc3RydWN0IG1vZHVsZSAqbGF5b3V0X2FuZF9hbGxvY2F0ZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMjk3OC1cdC8qIEFsbG9jYXRlIGFuZCBtb3ZlIHRvIHRoZSBmaW5hbCBwbGFjZSAqL1xua2VybmVsL21vZHVsZS9tYWluLmM6Mjk3OTpcdGVyciA9IG1vdmVfbW9kdWxlKGluZm8tXHUwMDNlbW9kLCBpbmZvKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5ODAtXHRpZiAoZXJyKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwNDI4CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqSW5pdGlhbCBBc3Nlc3NtZW50OiBOYXZpZ2F0aW5nIHRoZSBgbW92ZV9tb2R1bGVgIENvZGUqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGBtb3ZlX21vZHVsZWAuIE15IGZpcnN0IHRob3VnaHQgaXMgdG8gZ2V0IGEgZ2VuZXJhbCBmZWVsIGZvciBpdHMgcHVycG9zZSBhbmQgc2NvcGUuICYjMzQ7bW92ZSYjMzQ7IGlzIGEgcHJldHR5IGJyb2FkIHRlcm0sIHNvIEkmIzM5O20gaW1tZWRpYXRlbHkgdHJ5aW5nIHRvIG1lbnRhbGx5IGNhdGVnb3JpemUgdGhpcyBtb2R1bGUuIElzIGl0IGhhbmRsaW5nIG9iamVjdCBtb3ZlbWVudCBpbiBhIGdhbWUgZW5naW5lLCBkYXRhIG1pZ3JhdGlvbiBiZXR3ZWVuIGRhdGFiYXNlcywgZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucywgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/IFRoZSBuYW1lIGFsb25lIGRvZXNuJiMzOTt0IGdpdmUgbWUgZW5vdWdoIGNvbnRleHQuIEkmIzM5O20gZ29pbmcgdG8gcXVpY2tseSBzY2FuIGZvciBjbHVlcyDigJMgYW55IGltcG9ydHMsIGZ1bmN0aW9uIG5hbWVzLCBjbGFzcyBoaWVyYXJjaGllcywgYW55dGhpbmcgdGhhdCBnaXZlcyBhIGhpbnQgYWJvdXQgdGhlIGRvbWFpbiBhbmQgaW50ZW5kZWQgZnVuY3Rpb25hbGl0eS4gSSYjMzk7bSBhbHNvIGNvbnNpZGVyaW5nIHRoZSBhcmNoaXRlY3R1cmFsIGNvbnRleHQsIGlmIGFueSBpcyBwcm92aWRlZCAtIGlzIGl0IHBhcnQgb2YgYSBsYXJnZXIgc3lzdGVtLCBhIHN0YW5kYWxvbmUgdXRpbGl0eSwgb3IgYSBsaWJyYXJ5PyBJJiMzOTttIGFscmVhZHkgZm9ybXVsYXRpbmcgcXVlc3Rpb25zOiBXaGF0IGFyZSB0aGUgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIEkgc2hvdWxkIGxvb2sgZm9yPyBBbnkgY29uY3VycmVuY3kgaXNzdWVzIHRvIGNvbnNpZGVyIGlmIGl0JiMzOTtzIHRocmVhZGVkPyBXaGF0IGRlc2lnbiBwYXR0ZXJucyBhcmUgbGlrZWx5IGVtcGxveWVkIGdpdmVuIHRoZSAmIzM5O21vdmUmIzM5OyBvcGVyYXRpb24/IEVzc2VudGlhbGx5LCBJJiMzOTttIHNldHRpbmcgdGhlIHN0YWdlIGZvciBhIGZvY3VzZWQgY29kZSBjb21wcmVoZW5zaW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvbWFpbi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjc4OCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyNzg4Olx0c3RhdGljIGludCBtb3ZlX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXG4yNzg5Olx0e1xuMjc5MDpcdFx0aW50IGksIHJldDtcbjI3OTE6XHRcdGVudW0gbW9kX21lbV90eXBlIHQgPSBNT0RfTUVNX05VTV9UWVBFUztcbjI3OTI6XHRcdGJvb2wgY29kZXRhZ19zZWN0aW9uX2ZvdW5kID0gZmFsc2U7XG4yNzkzOlx0XG4yNzk0Olx0XHRmb3JfZWFjaF9tb2RfbWVtX3R5cGUodHlwZSkge1xuMjc5NTpcdFx0XHRpZiAoIW1vZC1cdTAwM2VtZW1bdHlwZV0uc2l6ZSkge1xuMjc5NjpcdFx0XHRcdG1vZC1cdTAwM2VtZW1bdHlwZV0uYmFzZSA9IE5VTEw7XG4yNzk3Olx0XHRcdFx0Y29udGludWU7XG4yNzk4Olx0XHRcdH1cbjI3OTk6XHRcbjI4MDA6XHRcdFx0cmV0ID0gbW9kdWxlX21lbW9yeV9hbGxvYyhtb2QsIHR5cGUpO1xuMjgwMTpcdFx0XHRpZiAocmV0KSB7XG4yODAyOlx0XHRcdFx0dCA9IHR5cGU7XG4yODAzOlx0XHRcdFx0Z290byBvdXRfZXJyO1xuMjgwNDpcdFx0XHR9XG4yODA1Olx0XHR9XG4yODA2Olx0XG4yODA3Olx0XHQvKiBUcmFuc2ZlciBlYWNoIHNlY3Rpb24gd2hpY2ggc3BlY2lmaWVzIFNIRl9BTExPQyAqL1xuMjgwODpcdFx0cHJfZGVidWcoXCYjMzQ7RmluYWwgc2VjdGlvbiBhZGRyZXNzZXMgZm9yICVzOlxcblwmIzM0OywgbW9kLVx1MDAzZW5hbWUpO1xuMjgwOTpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgaW5mby1cdTAwM2VoZHItXHUwMDNlZV9zaG51bTsgaSYjNDM7JiM0MzspIHtcbjI4MTA6XHRcdFx0dm9pZCAqZGVzdDtcbjI4MTE6XHRcdFx0RWxmX1NoZHIgKnNoZHIgPSBcdTAwMjZpbmZvLVx1MDAzZXNlY2hkcnNbaV07XG4yODEyOlx0XHRcdGNvbnN0IGNoYXIgKnNuYW1lO1xuMjgxMzpcdFxuMjgxNDpcdFx0XHRpZiAoIShzaGRyLVx1MDAzZXNoX2ZsYWdzIFx1MDAyNiBTSEZfQUxMT0MpKVxuMjgxNTpcdFx0XHRcdGNvbnRpbnVlO1xuMjgxNjpcdFxuMjgxNzpcdFx0XHRzbmFtZSA9IGluZm8tXHUwMDNlc2Vjc3RyaW5ncyAmIzQzOyBzaGRyLVx1MDAzZXNoX25hbWU7XG4yODE4Olx0XHRcdC8qXG4yODE5Olx0XHRcdCAqIExvYWQgY29kZXRhZyBzZWN0aW9ucyBzZXBhcmF0ZWx5IGFzIHRoZXkgbWlnaHQgc3RpbGwgYmUgdXNlZFxuMjgyMDpcdFx0XHQgKiBhZnRlciBtb2R1bGUgdW5sb2FkLlxuMjgyMTpcdFx0XHQgKi9cbjI4MjI6XHRcdFx0aWYgKGNvZGV0YWdfbmVlZHNfbW9kdWxlX3NlY3Rpb24obW9kLCBzbmFtZSwgc2hkci1cdTAwM2VzaF9zaXplKSkge1xuMjgyMzpcdFx0XHRcdGRlc3QgPSBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uKG1vZCwgc25hbWUsIHNoZHItXHUwMDNlc2hfc2l6ZSxcbjI4MjQ6XHRcdFx0XHRcdFx0YXJjaF9tb2Rfc2VjdGlvbl9wcmVwZW5kKG1vZCwgaSksIHNoZHItXHUwMDNlc2hfYWRkcmFsaWduKTtcbjI4MjU6XHRcdFx0XHRpZiAoV0FSTl9PTighZGVzdCkpIHtcbjI4MjY6XHRcdFx0XHRcdHJldCA9IC1FSU5WQUw7XG4yODI3Olx0XHRcdFx0XHRnb3RvIG91dF9lcnI7XG4yODI4Olx0XHRcdFx0fVxuMjgyOTpcdFx0XHRcdGlmIChJU19FUlIoZGVzdCkpIHtcbjI4MzA6XHRcdFx0XHRcdHJldCA9IFBUUl9FUlIoZGVzdCk7XG4yODMxOlx0XHRcdFx0XHRnb3RvIG91dF9lcnI7XG4yODMyOlx0XHRcdFx0fVxuMjgzMzpcdFx0XHRcdGNvZGV0YWdfc2VjdGlvbl9mb3VuZCA9IHRydWU7XG4yODM0Olx0XHRcdH0gZWxzZSB7XG4yODM1Olx0XHRcdFx0ZW51bSBtb2RfbWVtX3R5cGUgdHlwZSA9IHNoZHItXHUwMDNlc2hfZW50c2l6ZSBcdTAwM2VcdTAwM2UgU0hfRU5UU0laRV9UWVBFX1NISUZUO1xuMjgzNjpcdFx0XHRcdHVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gc2hkci1cdTAwM2VzaF9lbnRzaXplIFx1MDAyNiBTSF9FTlRTSVpFX09GRlNFVF9NQVNLO1xuMjgzNzpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTQ4OQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDMxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246CgoqKkFuYWx5emluZyBgbW92ZV9tb2R1bGVgJiMzOTtzIEVycm9yIEhhbmRsaW5nKioKCk9rYXksIHNvIGBtb3ZlX21vZHVsZWAgaXMgYSBjcml0aWNhbCBmdW5jdGlvbiwgYW5kIEkmIzM5O20gbG9va2luZyBhdCBob3cgaXQgaGFuZGxlcyBmYWlsdXJlcy4gVGhlIGNydWNpYWwgcG9pbnQgaGVyZSBpcyB0aGUgYmVoYXZpb3Igb24gZXJyb3I6IElmIGl0IGZhaWxzLCB0aGUgZnVuY3Rpb24gKmZyZWVzKiBhbnkgYWxsb2NhdGVkIG1lbW9yeSBhbmQgdGhlbiByZXR1cm5zIGFuIGVycm9yLiBUaGlzIGlzIGdvb2QgcHJhY3RpY2Ug4oCTIHJlc291cmNlIGNsZWFudXAgaXMgcGFyYW1vdW50LCBlc3BlY2lhbGx5IHdoZW4gZGVhbGluZyB3aXRoIHBvdGVudGlhbGx5IGNvbXBsZXggbW9kdWxlIG1vdmVtZW50cy4gVGhhdCBtZW1vcnkgbWFuYWdlbWVudCBzdHJhdGVneSBpcyBzb2xpZC4gTm93LCBJIG5lZWQgdG8gZGlnIGRlZXBlciB0byBmdWxseSB1bmRlcnN0YW5kIGhvdyBpdCBvcGVyYXRlcyB1bmRlciB0aGUgaG9vZC4gTGV0JiMzOTtzIGdldCBpbnRvIHRoZSBkZXRhaWxzIG9mIHRoZSByZXN0IG9mIHRoZSBgbW92ZV9tb2R1bGVgIGZ1bmN0aW9uIGFuZCB0aGUgZXhhY3QgbWVjaGFuaXNtIG9mIHRoZSBlcnJvciBjb25kaXRpb25zIGl0IGNvdmVycy4gVGhhdCYjMzk7cyB3aGVyZSB0aGUgcmVhbCB2YWx1ZSBpcyBpbiBmaWd1cmluZyBvdXQgaG93IHJvYnVzdCB0aGlzIGNvZGUgaXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS9tYWluLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyODM4LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzI4Mzg6XHRcdFx0XHRkZXN0ID0gbW9kLVx1MDAzZW1lbVt0eXBlXS5iYXNlICYjNDM7IG9mZnNldDtcbjI4Mzk6XHRcdFx0fVxuMjg0MDpcdFxuMjg0MTpcdFx0XHRpZiAoc2hkci1cdTAwM2VzaF90eXBlICE9IFNIVF9OT0JJVFMpIHtcbjI4NDI6XHRcdFx0XHQvKlxuMjg0MzpcdFx0XHRcdCAqIE91ciBFTEYgY2hlY2tlciBhbHJlYWR5IHZhbGlkYXRlZCB0aGlzLCBidXQgbGV0JiMzOTtzXG4yODQ0Olx0XHRcdFx0ICogYmUgcGVkYW50aWMgYW5kIG1ha2UgdGhlIGdvYWwgY2xlYXJlci4gV2UgYWN0dWFsbHlcbjI4NDU6XHRcdFx0XHQgKiBlbmQgdXAgY29weWluZyBvdmVyIGFsbCBtb2RpZmljYXRpb25zIG1hZGUgdG8gdGhlXG4yODQ2Olx0XHRcdFx0ICogdXNlcnNwYWNlIGNvcHkgb2YgdGhlIGVudGlyZSBzdHJ1Y3QgbW9kdWxlLlxuMjg0NzpcdFx0XHRcdCAqL1xuMjg0ODpcdFx0XHRcdGlmIChpID09IGluZm8tXHUwMDNlaW5kZXgubW9kIFx1MDAyNlx1MDAyNlxuMjg0OTpcdFx0XHRcdCAgIChXQVJOX09OX09OQ0Uoc2hkci1cdTAwM2VzaF9zaXplICE9IHNpemVvZihzdHJ1Y3QgbW9kdWxlKSkpKSB7XG4yODUwOlx0XHRcdFx0XHRyZXQgPSAtRU5PRVhFQztcbjI4NTE6XHRcdFx0XHRcdGdvdG8gb3V0X2VycjtcbjI4NTI6XHRcdFx0XHR9XG4yODUzOlx0XHRcdFx0bWVtY3B5KGRlc3QsICh2b2lkICopc2hkci1cdTAwM2VzaF9hZGRyLCBzaGRyLVx1MDAzZXNoX3NpemUpO1xuMjg1NDpcdFx0XHR9XG4yODU1Olx0XHRcdC8qXG4yODU2Olx0XHRcdCAqIFVwZGF0ZSB0aGUgdXNlcnNwYWNlIGNvcHkmIzM5O3MgRUxGIHNlY3Rpb24gYWRkcmVzcyB0byBwb2ludCB0b1xuMjg1NzpcdFx0XHQgKiBvdXIgbmV3bHkgYWxsb2NhdGVkIG1lbW9yeSBhcyBhIHB1cmUgY29udmVuaWVuY2Ugc28gdGhhdFxuMjg1ODpcdFx0XHQgKiB1c2VycyBvZiBpbmZvIGNhbiBrZWVwIHRha2luZyBhZHZhbnRhZ2UgYW5kIHVzaW5nIHRoZSBuZXdseVxuMjg1OTpcdFx0XHQgKiBtaW50ZWQgb2ZmaWNpYWwgbWVtb3J5IGFyZWEuXG4yODYwOlx0XHRcdCAqL1xuMjg2MTpcdFx0XHRzaGRyLVx1MDAzZXNoX2FkZHIgPSAodW5zaWduZWQgbG9uZylkZXN0O1xuMjg2MjpcdFx0XHRwcl9kZWJ1ZyhcJiMzNDtcXHQweCVseCAweCUuOGx4ICVzXFxuXCYjMzQ7LCAobG9uZylzaGRyLVx1MDAzZXNoX2FkZHIsXG4yODYzOlx0XHRcdFx0IChsb25nKXNoZHItXHUwMDNlc2hfc2l6ZSwgaW5mby1cdTAwM2VzZWNzdHJpbmdzICYjNDM7IHNoZHItXHUwMDNlc2hfbmFtZSk7XG4yODY0Olx0XHR9XG4yODY1Olx0XG4yODY2Olx0XHRyZXR1cm4gMDtcbjI4Njc6XHRvdXRfZXJyOlxuMjg2ODpcdFx0bW9kdWxlX21lbW9yeV9yZXN0b3JlX3JveChtb2QpO1xuMjg2OTpcdFx0d2hpbGUgKHQtLSlcbjI4NzA6XHRcdFx0bW9kdWxlX21lbW9yeV9mcmVlKG1vZCwgdCk7XG4yODcxOlx0XHRpZiAoY29kZXRhZ19zZWN0aW9uX2ZvdW5kKVxuMjg3MjpcdFx0XHRjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKG1vZCk7XG4yODczOlx0XG4yODc0Olx0XHRyZXR1cm4gcmV0O1xuMjg3NTpcdH1cbjI4NzY6XHRcbjI4Nzc6XHRzdGF0aWMgaW50IGNoZWNrX2V4cG9ydF9zeW1ib2xfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kKVxuMjg3ODpcdHtcbjI4Nzk6XHRcdGlmIChtb2QtXHUwMDNlbnVtX3N5bXMgXHUwMDI2XHUwMDI2ICFtb2QtXHUwMDNlZmxhZ3N0YWIpIHtcbjI4ODA6XHRcdFx0cHJfZXJyKFwmIzM0OyVzOiBubyBmbGFncyBmb3IgZXhwb3J0ZWQgc3ltYm9sc1xcblwmIzM0OywgbW9kLVx1MDAzZW5hbWUpO1xuMjg4MTpcdFx0XHRyZXR1cm4gLUVOT0VYRUM7XG4yODgyOlx0XHR9XG4yODgzOlx0I2lmZGVmIENPTkZJR19NT0RWRVJTSU9OU1xuMjg4NDpcdFx0aWYgKG1vZC1cdTAwM2VudW1fc3ltcyBcdTAwMjZcdTAwMjYgIW1vZC1cdTAwM2VjcmNzKSB7XG4yODg1Olx0XHRcdHJldHVybiB0cnlfdG9fZm9yY2VfbG9hZChtb2QsXG4yODg2Olx0XHRcdFx0XHRcdCBcJiMzNDtubyB2ZXJzaW9ucyBmb3IgZXhwb3J0ZWQgc3ltYm9sc1wmIzM0Oyk7XG4yODg3Olx0XHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyNDk4CgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMjYzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgRUFHQUlOIEVycm9yIGluIE1vZHVsZSBSZWxvY2F0aW9uKioKCk9rYXksIHNvIGlmIGBtb3ZlX21vZHVsZWAgaXMgYmFyZmluZyB3aXRoIGFuIGAtRUFHQUlOYCwgdGhlIGxpa2VseSBjdWxwcml0IGlzIHRoYXQgYGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25gIGFsc28gcmV0dXJuZWQgYC1FQUdBSU5gLiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aHkuIFJpZ2h0LCBgY29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbmAgY2FsbHMgYHJlc2VydmVfbW9kdWxlX3RhZ3NgLCB3aGljaCBpcyBpbiBgbW0vYWxsb2NfdGFnLmNgLiBMZXQmIzM5O3MgZGlnIGludG8gdGhhdCBgcmVzZXJ2ZV9tb2R1bGVfdGFnc2AgZnVuY3Rpb24uIEkmIzM5O2xsIHRha2UgYSBsb29rIGF0IHRoZSBjb2RlOgoKYGBgYwoJCWlmICghdGFnc19hZGRyZXNzYWJsZSgpKSB7CgkJCXNodXRkb3duX21lbV9wcm9maWxpbmcodHJ1ZSk7CgkJCXByX3dhcm5fb25jZSgmIzM0O1dpdGggbW9kdWxlICVzIHRoZXJlIGFyZSB0b28gbWFueSB0YWdzIHRvIGZpdCBpbiAlZCBwYWdlIGZsYWcgYml0cy4gTWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIGlzIGRpc2FibGVkIVxuJiMzNDssCgkJCQkgICAgIG1vZC0mZ3Q7bmFtZSwgTlJfVU5VU0VEX1BBR0VGTEFHX0JJVFMpOwoJCQlyZWxlYXNlX21vZHVsZV90YWdzKG1vZCwgZmFsc2UpOwoJCQlyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTsKCQl9CmBgYAoKQWgsIEkgc2VlLiBMb29rcyBsaWtlIHRoZSBtb2R1bGUgaXMgcmVxdWVzdGluZyB0b28gbWFueSB0YWdzLCB0byB0aGUgcG9pbnQgd2hlcmUgdGhleSBjYW4mIzM5O3QgZml0IGludG8gdGhlIGF2YWlsYWJsZSBwYWdlIGZsYWcgYml0cy4gVGhlIHN5c3RlbSBzaHV0cyBkb3duIG1lbW9yeSBwcm9maWxpbmcgdG8gYXZvaWQgYSBwb3RlbnRpYWwgY2F0YXN0cm9waGljIGZhaWx1cmUgYW5kIHRoZW4gaXQgcmV0dXJucyBgLUVBR0FJTmAuIFRoZSBjcnVjaWFsIGRldGFpbCBpcyB0aGF0IGl0ICphbHNvKiBjYWxscyBgcmVsZWFzZV9tb2R1bGVfdGFnc2AgYXQgdGhpcyBwb2ludC4gU28sIHRoZSBtb2R1bGUgaXMgZXNzZW50aWFsbHkgZ2l2ZW4gdXAgb24uCgpOb3csIGlmIGBtb3ZlX21vZHVsZWAgZ2V0cyB0aGlzIGAtRUFHQUlOYCwgaXQganVtcHMgdG8gYG91dF9lcnJgLCB3aGljaCBtZWFucyBtZW1vcnkgaXMgZnJlZWQgYW5kIHRoZW4gaXQgY2FsbHMgYGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnMobW9kKWAuIE5vdywgdGhlIGltcG9ydGFudCBxdWVzdGlvbiBpczogRG9lcyBgY29kZXRhZ19mcmVlX21vZHVsZV9zZWN0aW9uc2AgKmFsc28qIGNhbGwgYHJlbGVhc2VfbW9kdWxlX3RhZ3NgPyBUaGF0JiMzOTtzIHdoYXQgSSBuZWVkIHRvIGNvbmZpcm0uIEkgc2hvdWxkIGNoZWNrIGBjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zYCB0byBiZSBzdXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvY29kZXRhZy5oPTk0PXZvaWQgKmNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxuLS1cbmluY2x1ZGUvbGludXgvY29kZXRhZy5oLTk2LVx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBhbGlnbik7XG5pbmNsdWRlL2xpbnV4L2NvZGV0YWcuaDo5Nzp2b2lkIGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kKTtcbmluY2x1ZGUvbGludXgvY29kZXRhZy5oLTk4LXZvaWQgY29kZXRhZ19tb2R1bGVfcmVwbGFjZWQoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbW9kdWxlICpuZXdfbW9kKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2NvZGV0YWcuaD0xMDg9Y29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbihzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IGNoYXIgKm5hbWUsXG4tLVxuaW5jbHVkZS9saW51eC9jb2RldGFnLmgtMTEwLVx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBhbGlnbikgeyByZXR1cm4gTlVMTDsgfVxuaW5jbHVkZS9saW51eC9jb2RldGFnLmg6MTExOnN0YXRpYyBpbmxpbmUgdm9pZCBjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKHN0cnVjdCBtb2R1bGUgKm1vZCkge31cbmluY2x1ZGUvbGludXgvY29kZXRhZy5oLTExMi1zdGF0aWMgaW5saW5lIHZvaWQgY29kZXRhZ19tb2R1bGVfcmVwbGFjZWQoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbW9kdWxlICpuZXdfbW9kKSB7fVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTI3ODg9c3RhdGljIGludCBtb3ZlX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMjg3MS1cdGlmIChjb2RldGFnX3NlY3Rpb25fZm91bmQpXG5rZXJuZWwvbW9kdWxlL21haW4uYzoyODcyOlx0XHRjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKG1vZCk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0yODczLVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTMwMDQ9c3RhdGljIHZvaWQgbW9kdWxlX2RlYWxsb2NhdGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxuLS1cbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTMwMDctXHRtb2R1bGVfYXJjaF9mcmVlaW5nX2luaXQobW9kKTtcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjMwMDg6XHRjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKG1vZCk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0zMDA5LVxuLS1cbmxpYi9jb2RldGFnLmM9MjgxPXZvaWQgKmNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxuLS1cbmxpYi9jb2RldGFnLmMtMzA1LVxubGliL2NvZGV0YWcuYzozMDY6dm9pZCBjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKHN0cnVjdCBtb2R1bGUgKm1vZClcbmxpYi9jb2RldGFnLmMtMzA3LXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTM3NDUKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAyMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDoKCioqRGl2aW5nIGludG8gYGNvZGV0YWcuY2AqKgoKT2theSwgc28gSSBuZWVkIHRvIGNoZWNrIG91dCBgY29kZXRhZ19mcmVlX21vZHVsZV9zZWN0aW9uc2Ag4oCTIGxvb2tzIGxpa2UgdGhhdCYjMzk7cyB0aGUgZnVuY3Rpb24gSSBuZWVkIHRvIGZvY3VzIG9uIHJpZ2h0IG5vdy4gSXQmIzM5O3MgaW4gYGxpYi9jb2RldGFnLmNgLCB3aGljaCBtYWtlcyBzZW5zZTsgdGhpcyBwcm9iYWJseSBkZWFscyB3aXRoIHNvbWUgY29yZSByZXNvdXJjZSBtYW5hZ2VtZW50LiBJJiMzOTttIGd1ZXNzaW5nIGl0JiMzOTtzIHBhcnQgb2YgdGhlIGNsZWFudXAgYWZ0ZXIgYSBjb2RldGFnIG1vZHVsZSBpcyBkb25lIGJlaW5nIHVzZWQuIEkmIzM5O2xsIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgc2VjdGlvbnMgYXJlIGFsbG9jYXRlZCB3aXRoaW4gYSBtb2R1bGUsIGFuZCBob3cgdGhpcyBmdW5jdGlvbiBoYW5kbGVzIGRlYWxsb2NhdGlvbiB0byBhdm9pZCBtZW1vcnkgbGVha3Mgb3IgZGFuZ2xpbmcgcG9pbnRlcnMuIExldCYjMzk7cyBnZXQgdG8gdGhlIGNvZGUgYW5kIHNlZSB3aGF0IGl0JiMzOTtzIHJlYWxseSBkb2luZy4gVGltZSB0byBwdXQgb24gbXkgZGVidWdnaW5nIGhhdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtsaWIvY29kZXRhZy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMzA2LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAzMDY6XHR2b2lkIGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kKVxuIDMwNzpcdHtcbiAzMDg6XHRcdHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZTtcbiAzMDk6XHRcbiAzMTA6XHRcdG11dGV4X2xvY2soXHUwMDI2Y29kZXRhZ19sb2NrKTtcbiAzMTE6XHRcdGxpc3RfZm9yX2VhY2hfZW50cnkoY3R0eXBlLCBcdTAwMjZjb2RldGFnX3R5cGVzLCBsaW5rKSB7XG4gMzEyOlx0XHRcdGlmICghY3R0eXBlLVx1MDAzZWRlc2MuZnJlZV9zZWN0aW9uX21lbSlcbiAzMTM6XHRcdFx0XHRjb250aW51ZTtcbiAzMTQ6XHRcbiAzMTU6XHRcdFx0ZG93bl93cml0ZShcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2xvY2spO1xuIDMxNjpcdFx0XHRjdHR5cGUtXHUwMDNlZGVzYy5mcmVlX3NlY3Rpb25fbWVtKG1vZCwgZmFsc2UpO1xuIDMxNzpcdFx0XHR1cF93cml0ZShcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2xvY2spO1xuIDMxODpcdFx0fVxuIDMxOTpcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmNvZGV0YWdfbG9jayk7XG4gMzIwOlx0fVxuIDMyMTpcdFxuIDMyMjpcdHZvaWQgY29kZXRhZ19tb2R1bGVfcmVwbGFjZWQoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbW9kdWxlICpuZXdfbW9kKVxuIDMyMzpcdHtcbiAzMjQ6XHRcdHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZTtcbiAzMjU6XHRcbiAzMjY6XHRcdG11dGV4X2xvY2soXHUwMDI2Y29kZXRhZ19sb2NrKTtcbiAzMjc6XHRcdGxpc3RfZm9yX2VhY2hfZW50cnkoY3R0eXBlLCBcdTAwMjZjb2RldGFnX3R5cGVzLCBsaW5rKSB7XG4gMzI4Olx0XHRcdGlmICghY3R0eXBlLVx1MDAzZWRlc2MubW9kdWxlX3JlcGxhY2VkKVxuIDMyOTpcdFx0XHRcdGNvbnRpbnVlO1xuIDMzMDpcdFxuIDMzMTpcdFx0XHRkb3duX3dyaXRlKFx1MDAyNmN0dHlwZS1cdTAwM2Vtb2RfbG9jayk7XG4gMzMyOlx0XHRcdGN0dHlwZS1cdTAwM2VkZXNjLm1vZHVsZV9yZXBsYWNlZChtb2QsIG5ld19tb2QpO1xuIDMzMzpcdFx0XHR1cF93cml0ZShcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2xvY2spO1xuIDMzNDpcdFx0fVxuIDMzNTpcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmNvZGV0YWdfbG9jayk7XG4gMzM2Olx0fVxuIDMzNzpcdFxuIDMzODpcdGludCBjb2RldGFnX2xvYWRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZClcbiAzMzk6XHR7XG4gMzQwOlx0XHRzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGU7XG4gMzQxOlx0XHRpbnQgcmV0ID0gMDtcbiAzNDI6XHRcbiAzNDM6XHRcdGlmICghbW9kKVxuIDM0NDpcdFx0XHRyZXR1cm4gMDtcbiAzNDU6XHRcbiAzNDY6XHRcdG11dGV4X2xvY2soXHUwMDI2Y29kZXRhZ19sb2NrKTtcbiAzNDc6XHRcdGxpc3RfZm9yX2VhY2hfZW50cnkoY3R0eXBlLCBcdTAwMjZjb2RldGFnX3R5cGVzLCBsaW5rKSB7XG4gMzQ4Olx0XHRcdHJldCA9IGNvZGV0YWdfbW9kdWxlX2luaXQoY3R0eXBlLCBtb2QpO1xuIDM0OTpcdFx0XHRpZiAocmV0KVxuIDM1MDpcdFx0XHRcdGJyZWFrO1xuIDM1MTpcdFx0fVxuIDM1MjpcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmNvZGV0YWdfbG9jayk7XG4gMzUzOlx0XG4gMzU0Olx0XHRyZXR1cm4gcmV0O1xuIDM1NTpcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42My8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQ2NjIKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiAxMDkyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk1vZHVsZSBUYWdnaW5nIGFuZCBBbGxvY2F0aW9uIExvZ2ljIC0gQSBRdWljayBSZXZpZXcqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gSXQgbG9va3MgbGlrZSBgY3R0eXBlLSZndDtkZXNjLmZyZWVfc2VjdGlvbl9tZW1gIGlzIHNpbXBseSBgcmVsZWFzZV9tb2R1bGVfdGFnc2AuIEkgbmVlZCB0byBiZSBjYXJlZnVsIHdpdGggdGhlIGRvdWJsZS1mcmVlIHBvdGVudGlhbC4gSW4gYHJlc2VydmVfbW9kdWxlX3RhZ3NgLCBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgdGFncywgaXQgZGlzYWJsZXMgbWVtb3J5IHByb2ZpbGluZywgd2FybnMsIGFuZCBjYWxscyBgcmVsZWFzZV9tb2R1bGVfdGFncyhtb2QsIGZhbHNlKWAsIHJldHVybmluZyBgLUVBR0FJTmAuIFRoZSBjcml0aWNhbCBwYXRoIGhlcmUgaXMgaWYgdGhpcyBsZWFkcyB0byBhIHJldHJ5LiBgbW92ZV9tb2R1bGVgIGp1bXBzIHRvIGBvdXRfZXJyYCwgd2hpY2ggKnNob3VsZCogY2FsbCBgY29kZXRhZ19mcmVlX21vZHVsZV9zZWN0aW9ucyhtb2QpYCwgd2hpY2ggaXRzZWxmIGNhbGxzIGByZWxlYXNlX21vZHVsZV90YWdzKG1vZCwgZmFsc2UpYCBhZ2Fpbi4gSG93ZXZlciwgYmFzZWQgb24gdGhlIHN0cnVjdHVyZSBoZXJlIGl0IHNob3VsZG4mIzM5O3QgYmUgYW4gaXNzdWU6IGByZWxlYXNlX21vZHVsZV90YWdzYCBjaGVja3MgaWYgdGhlIG1vZHVsZSBpcyBmb3VuZCBpbiB0aGUgbWFwbGUgdHJlZSBgbW9kX2FyZWFfbXRgIGFuZCBpZiBpdCBpcyBub3QgaXQgYmFpbHMuCgpMZXQgbWUgdGhpbmvigKYgaWYgYGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25gIHJldHVybnMgYC1FQUdBSU5gLCB0aGVuIGBjb2RldGFnX3NlY3Rpb25fZm91bmRgICptaWdodCogaGF2ZSBiZWVuIHNldC4gSW4gYG1vdmVfbW9kdWxlYCwgaWYgYGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25gIGZhaWxzIG9uIHRoZSBmaXJzdCBjb2RldGFnIHNlY3Rpb24sIGBjb2RldGFnX3NlY3Rpb25fZm91bmRgIGlzIGZhbHNlLCBhbmQgYGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNgIGlzbiYjMzk7dCBjYWxsZWQuIElmIGl0IGZhaWxzIG9uIHRoZSBzZWNvbmQgc2VjdGlvbiwgaXQgKmlzKiBjYWxsZWQuIEJ1dCBzaW5jZSBgcmVsZWFzZV9tb2R1bGVfdGFnc2AgcmVtb3ZlcyB0aGUgbW9kdWxlIGZyb20gdGhlIG1hcGxlIHRyZWUsIHRoZSBzZWNvbmQgY2FsbCB0byBpdCB3b24mIzM5O3QgZmluZCB0aGUgbW9kdWxlIGFuZCBub3RoaW5nIGJhZCB3aWxsIGhhcHBlbi4gSSB0aGluayB0aGUgZG91YmxlIGZyZWUgaXNzdWUgaXMgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIHN0YXRlLgoKTm93LCBsZXQmIzM5O3MgcmUtZXhhbWluZSB0aGF0IHJldHJ5IGxvZ2ljIGluIGBsYXlvdXRfYW5kX2FsbG9jYXRlYC4gSXQmIzM5O3MgYSBiaXQgdHJpY2t5LiBUaGUgY29kZSBmaXJzdCBsYXlzIG91dCB0aGUgc2VjdGlvbnMgYW5kIHN5bWJvbCB0YWJsZSwgdGhlbiBhdHRlbXB0cyB0byBtb3ZlIHRoZSBtb2R1bGUuIElmIHRoYXQgbW92ZSByZXR1cm5zIGAtRUFHQUlOYCwgaXQgcmV0cmllcy4gVGhlIGludGVyZXN0aW5nIHBhcnQgaGVyZSBpcyB3aGF0IGhhcHBlbnMgd2hlbiBpdCByZXRyaWVzLiBTaXplcyBhcmUgcmVzZXQsIGFuZCB0aGUgaGVhZGVycyBhcmUgcmV3cml0dGVuLiBTcGVjaWZpY2FsbHkgYGluZm8tJmd0O21vZC0mZ3Q7bWVtW3R5cGVdLnNpemUgPSAwO2AgYW5kIGBpbmZvLSZndDtzZWNoZHJzW2luZm8tJmd0O2luZGV4LnN5bV0uc2hfZmxhZ3MgJmFtcDs9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7YC4KCklzIHRoZXJlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyBleHBvc2VkPyBgaW5mby0mZ3Q7bW9kLSZndDttZW1bdHlwZV0uc2l6ZSA9IDBgIGNsZWFycyB0aGUgc2l6ZXMuIGBsYXlvdXRfc2VjdGlvbnNgIHJlY2FsY3VsYXRlcyB0aGVzZSBzaXplcy4gYHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzYCByZXNldHMgYHNoX2FkZHJgIHRvIHRoZSB0ZW1wb3JhcnkgaW1hZ2UuIEkgdGhpbmsgdGhhdCBpcyBvay4gV2FpdCwgYGxheW91dF9zZWN0aW9uc2Agc2V0cyBgc2hfZW50c2l6ZWAgdG8gYH4wVUxgIGFuZCB0aGVuIGNhbGxzIGBfX2xheW91dF9zZWN0aW9uc2AuIGBfX2xheW91dF9zZWN0aW9uc2AgY2FsY3VsYXRlcyBvZmZzZXRzIGFuZCBzZXRzIGBzaF9lbnRzaXplYC4gSXMgdGhlcmUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBOby4gSXQgZG9lc24mIzM5O3Qgc2VlbSB0byBleHBvc2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBub3IgZG9lcyBpdCB1c2UgdW5pbml0aWFsaXplZCBtZW1vcnkgZm9yIGNvbnRyb2wgZmxvdy4gVGhlIGBpbmZvYCBzdHJ1Y3QgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgYXQgdGhpcyBwb2ludC4KCkFoYSEgYGluZm8tJmd0O3NlY2hkcnNbaW5mby0mZ3Q7aW5kZXguc3ltXS5zaF9mbGFncyAmYW1wOz0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztgIGNsZWFycyB0aGUgYFNIRl9BTExPQ2AgZmxhZyBmcm9tIHRoZSBzeW1ib2wgdGFibGUgYW5kIHN0cmluZyB0YWJsZSBzZWN0aW9ucy4gV2h5PyBJIG5lZWQgdG8gY2hlY2sgYGxheW91dF9zeW10YWJgIHRvIHVuZGVyc3RhbmQgdGhpcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42NC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bGF5b3V0X3N5bXRhYiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvaW50ZXJuYWwuaD0zNTY9dm9pZCBpbml0X2J1aWxkX2lkKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3Qgc3RydWN0IGxvYWRfaW5mbyAqaW5mbyk7XG5rZXJuZWwvbW9kdWxlL2ludGVybmFsLmg6MzU3OnZvaWQgbGF5b3V0X3N5bXRhYihzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pO1xua2VybmVsL21vZHVsZS9pbnRlcm5hbC5oLTM1OC12b2lkIGFkZF9rYWxsc3ltcyhzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IHN0cnVjdCBsb2FkX2luZm8gKmluZm8pO1xuLS1cbmtlcm5lbC9tb2R1bGUvaW50ZXJuYWwuaD0zNjU9c3RhdGljIGlubGluZSB2b2lkIGluaXRfYnVpbGRfaWQoc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKSB7IH1cbmtlcm5lbC9tb2R1bGUvaW50ZXJuYWwuaDozNjY6c3RhdGljIGlubGluZSB2b2lkIGxheW91dF9zeW10YWIoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKSB7IH1cbmtlcm5lbC9tb2R1bGUvaW50ZXJuYWwuaC0zNjctc3RhdGljIGlubGluZSB2b2lkIGFkZF9rYWxsc3ltcyhzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IHN0cnVjdCBsb2FkX2luZm8gKmluZm8pIHsgfVxuLS1cbmtlcm5lbC9tb2R1bGUva2FsbHN5bXMuYz03OD1zdGF0aWMgYm9vbCBpc19jb3JlX3N5bWJvbChjb25zdCBFbGZfU3ltICpzcmMsIGNvbnN0IEVsZl9TaGRyICpzZWNoZHJzLFxuLS1cbmtlcm5lbC9tb2R1bGUva2FsbHN5bXMuYy0xMTItICovXG5rZXJuZWwvbW9kdWxlL2thbGxzeW1zLmM6MTEzOnZvaWQgbGF5b3V0X3N5bXRhYihzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXG5rZXJuZWwvbW9kdWxlL2thbGxzeW1zLmMtMTE0LXtcbi0tXG5rZXJuZWwvbW9kdWxlL2thbGxzeW1zLmMtMTY1LS8qXG5rZXJuZWwvbW9kdWxlL2thbGxzeW1zLmM6MTY2OiAqIFdlIHVzZSB0aGUgZnVsbCBzeW10YWIgYW5kIHN0cnRhYiB3aGljaCBsYXlvdXRfc3ltdGFiIGFycmFuZ2VkIHRvXG5rZXJuZWwvbW9kdWxlL2thbGxzeW1zLmMtMTY3LSAqIGJlIGFwcGVuZGVkIHRvIHRoZSBpbml0IHNlY3Rpb24uICBMYXRlciB3ZSBzd2l0Y2ggdG8gdGhlIGN1dC1kb3duXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9Mjk0Mz1zdGF0aWMgc3RydWN0IG1vZHVsZSAqbGF5b3V0X2FuZF9hbGxvY2F0ZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpXG4tLVxua2VybmVsL21vZHVsZS9tYWluLmMtMjk3NS1cdGxheW91dF9zZWN0aW9ucyhpbmZvLVx1MDAzZW1vZCwgaW5mbyk7XG5rZXJuZWwvbW9kdWxlL21haW4uYzoyOTc2Olx0bGF5b3V0X3N5bXRhYihpbmZvLVx1MDAzZW1vZCwgaW5mbyk7XG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTc3LVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjY1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzAwMgoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDEwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqQW5hbHl6aW5nIHRoZSBgbGF5b3V0X3N5bXRhYmAgRnVuY3Rpb24qKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGBsYXlvdXRfc3ltdGFiYCBmdW5jdGlvbi4gSSYjMzk7bSBpbW1lZGlhdGVseSB0aGlua2luZyBhYm91dCBob3cgaXQgZml0cyBpbnRvIHRoZSBvdmVyYWxsIHN5bWJvbCB0YWJsZSBtYW5hZ2VtZW50IHNjaGVtZS4gV2hhdCBsZXZlbCBvZiBhYnN0cmFjdGlvbiBpcyBpdCB3b3JraW5nIGF0PyBJcyBpdCBhIGxvdy1sZXZlbCByb3V0aW5lIGRlYWxpbmcgd2l0aCByYXcgc3RydWN0dXJlcywgb3Igc29tZXRoaW5nIG1vcmUgaGlnaC1sZXZlbCwgcGVyaGFwcyBjb29yZGluYXRpbmcgc2V2ZXJhbCBsb3dlci1sZXZlbCBjYWxscz8gVGhlIG5hbWUgc3VnZ2VzdHMgaXQmIzM5O3MgaW52b2x2ZWQgaW4gdGhlIGxheW91dCBvZiB0aGUgc3ltYm9sIHRhYmxlLCB3aGljaCB1c3VhbGx5IGltcGxpZXMgbWVtb3J5IGFsbG9jYXRpb24gb3IgYXJyYW5nZW1lbnQgb2Ygc3ltYm9sIGVudHJpZXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBpbnB1dHMg4oCTIHdoYXQgZGF0YSBzdHJ1Y3R1cmVzIGRvZXMgaXQgb3BlcmF0ZSBvbj8gQXJlIHdlIHRhbGtpbmcgYWJvdXQgYSBjb21wbGV0ZSBzeW1ib2wgdGFibGUgc3RydWN0dXJlLCBpbmRpdmlkdWFsIHN5bWJvbCBlbnRyaWVzLCBvciBzb21ldGhpbmcgaW4gYmV0d2VlbiwgbGlrZSBhIHRhYmxlIG9mIHN5bWJvbCBidWNrZXRzPyBXaGF0IGFyZSB0aGUgY2FsbGluZyBjb252ZW50aW9ucz8gQXJlIHdlIGRlYWxpbmcgd2l0aCBzb21ldGhpbmcgbGlrZSBhIHNwZWNpZmljIHN5bWJvbCB0YWJsZSBpbXBsZW1lbnRhdGlvbiB3aXRoaW4gYSBjb21waWxlciBvciBsaW5rZXIsIHBlcmhhcHMgdGllZCB0byBhIHBhcnRpY3VsYXIgdGFyZ2V0IGFyY2hpdGVjdHVyZT8gSSBuZWVkIHRvIGxvb2sgZm9yIGFueSBpbmRpY2F0aW9ucyBhYm91dCB0aGUgc2NvcGUgb2YgdGhlIGxheW91dCAtIGlzIGl0IGdsb2JhbCwgcGVyLWNvbXBpbGF0aW9uLXVuaXQsIHBlci1vYmplY3QtZmlsZT8gVGhlIGNvbnRleHQgd2lsbCBiZSBrZXkgaGVyZS4gRmluYWxseSwgSSYjMzk7bSBleHBlY3Rpbmcgc29tZSBraW5kIG9mIG91dHB1dCwgbGlrZWx5IHRoZSBtb2RpZmllZCBkYXRhIHN0cnVjdHVyZXMgcmVwcmVzZW50aW5nIHRoZSBsYWlkLW91dCBzeW1ib2wgdGFibGUgb3IgcG9zc2libHksIHVwZGF0ZXMgdG8gZXh0ZXJuYWwgZGF0YSBzdWNoIGFzIGFsbG9jYXRlZCBvZmZzZXRzIG9yIHBvaW50ZXJzLiBOb3csIGxldCYjMzk7cyBnZXQgaW50byB0aGUgZGV0YWlscyBvZiB0aGUgY29kZSBhbmQgc2VlIGlmIG15IGFzc3VtcHRpb25zIGFsaWduLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjY2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUva2FsbHN5bXMuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDExMywKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTEzOlx0dm9pZCBsYXlvdXRfc3ltdGFiKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbylcbiAxMTQ6XHR7XG4gMTE1Olx0XHRFbGZfU2hkciAqc3ltc2VjdCA9IGluZm8tXHUwMDNlc2VjaGRycyAmIzQzOyBpbmZvLVx1MDAzZWluZGV4LnN5bTtcbiAxMTY6XHRcdEVsZl9TaGRyICpzdHJzZWN0ID0gaW5mby1cdTAwM2VzZWNoZHJzICYjNDM7IGluZm8tXHUwMDNlaW5kZXguc3RyO1xuIDExNzpcdFx0Y29uc3QgRWxmX1N5bSAqc3JjO1xuIDExODpcdFx0dW5zaWduZWQgaW50IGksIG5zcmMsIG5kc3QsIHN0cnRhYl9zaXplID0gMDtcbiAxMTk6XHRcdHN0cnVjdCBtb2R1bGVfbWVtb3J5ICptb2RfbWVtX2RhdGEgPSBcdTAwMjZtb2QtXHUwMDNlbWVtW01PRF9EQVRBXTtcbiAxMjA6XHRcdHN0cnVjdCBtb2R1bGVfbWVtb3J5ICptb2RfbWVtX2luaXRfZGF0YSA9IFx1MDAyNm1vZC1cdTAwM2VtZW1bTU9EX0lOSVRfREFUQV07XG4gMTIxOlx0XG4gMTIyOlx0XHQvKiBQdXQgc3ltYm9sIHNlY3Rpb24gYXQgZW5kIG9mIGluaXQgcGFydCBvZiBtb2R1bGUuICovXG4gMTIzOlx0XHRzeW1zZWN0LVx1MDAzZXNoX2ZsYWdzIHw9IFNIRl9BTExPQztcbiAxMjQ6XHRcdHN5bXNlY3QtXHUwMDNlc2hfZW50c2l6ZSA9IG1vZHVsZV9nZXRfb2Zmc2V0X2FuZF90eXBlKG1vZCwgTU9EX0lOSVRfREFUQSxcbiAxMjU6XHRcdFx0XHRcdFx0XHRcdCBzeW1zZWN0LCBpbmZvLVx1MDAzZWluZGV4LnN5bSk7XG4gMTI2Olx0XHRwcl9kZWJ1ZyhcJiMzNDtcXHQlc1xcblwmIzM0OywgaW5mby1cdTAwM2VzZWNzdHJpbmdzICYjNDM7IHN5bXNlY3QtXHUwMDNlc2hfbmFtZSk7XG4gMTI3Olx0XG4gMTI4Olx0XHRzcmMgPSAodm9pZCAqKWluZm8tXHUwMDNlaGRyICYjNDM7IHN5bXNlY3QtXHUwMDNlc2hfb2Zmc2V0O1xuIDEyOTpcdFx0bnNyYyA9IHN5bXNlY3QtXHUwMDNlc2hfc2l6ZSAvIHNpemVvZigqc3JjKTtcbiAxMzA6XHRcbiAxMzE6XHRcdC8qIENvbXB1dGUgdG90YWwgc3BhY2UgcmVxdWlyZWQgZm9yIHRoZSBjb3JlIHN5bWJvbHMmIzM5OyBzdHJ0YWIuICovXG4gMTMyOlx0XHRmb3IgKG5kc3QgPSBpID0gMDsgaSBcdTAwM2MgbnNyYzsgaSYjNDM7JiM0MzspIHtcbiAxMzM6XHRcdFx0aWYgKGkgPT0gMCB8fCBpc19saXZlcGF0Y2hfbW9kdWxlKG1vZCkgfHxcbiAxMzQ6XHRcdFx0ICAgIGlzX2NvcmVfc3ltYm9sKHNyYyAmIzQzOyBpLCBpbmZvLVx1MDAzZXNlY2hkcnMsIGluZm8tXHUwMDNlaGRyLVx1MDAzZWVfc2hudW0sXG4gMTM1Olx0XHRcdFx0XHQgICBpbmZvLVx1MDAzZWluZGV4LnBjcHUpKSB7XG4gMTM2Olx0XHRcdFx0c3RydGFiX3NpemUgJiM0Mzs9IHN0cmxlbihcdTAwMjZpbmZvLVx1MDAzZXN0cnRhYltzcmNbaV0uc3RfbmFtZV0pICYjNDM7IDE7XG4gMTM3Olx0XHRcdFx0bmRzdCYjNDM7JiM0Mzs7XG4gMTM4Olx0XHRcdH1cbiAxMzk6XHRcdH1cbiAxNDA6XHRcbiAxNDE6XHRcdC8qIEFwcGVuZCByb29tIGZvciBjb3JlIHN5bWJvbHMgYXQgZW5kIG9mIGNvcmUgcGFydC4gKi9cbiAxNDI6XHRcdGluZm8tXHUwMDNlc3ltb2ZmcyA9IEFMSUdOKG1vZF9tZW1fZGF0YS1cdTAwM2VzaXplLCBzeW1zZWN0LVx1MDAzZXNoX2FkZHJhbGlnbiA/OiAxKTtcbiAxNDM6XHRcdGluZm8tXHUwMDNlc3Ryb2ZmcyA9IG1vZF9tZW1fZGF0YS1cdTAwM2VzaXplID0gaW5mby1cdTAwM2VzeW1vZmZzICYjNDM7IG5kc3QgKiBzaXplb2YoRWxmX1N5bSk7XG4gMTQ0Olx0XHRtb2RfbWVtX2RhdGEtXHUwMDNlc2l6ZSAmIzQzOz0gc3RydGFiX3NpemU7XG4gMTQ1Olx0XHQvKiBOb3RlIGFkZF9rYWxsc3ltcygpIGNvbXB1dGVzIHN0cnRhYl9zaXplIGFzIGNvcmVfdHlwZW9mZnMgLSBzdHJvZmZzICovXG4gMTQ2Olx0XHRpbmZvLVx1MDAzZWNvcmVfdHlwZW9mZnMgPSBtb2RfbWVtX2RhdGEtXHUwMDNlc2l6ZTtcbiAxNDc6XHRcdG1vZF9tZW1fZGF0YS1cdTAwM2VzaXplICYjNDM7PSBuZHN0ICogc2l6ZW9mKGNoYXIpO1xuIDE0ODpcdFxuIDE0OTpcdFx0LyogUHV0IHN0cmluZyB0YWJsZSBzZWN0aW9uIGF0IGVuZCBvZiBpbml0IHBhcnQgb2YgbW9kdWxlLiAqL1xuIDE1MDpcdFx0c3Ryc2VjdC1cdTAwM2VzaF9mbGFncyB8PSBTSEZfQUxMT0M7XG4gMTUxOlx0XHRzdHJzZWN0LVx1MDAzZXNoX2VudHNpemUgPSBtb2R1bGVfZ2V0X29mZnNldF9hbmRfdHlwZShtb2QsIE1PRF9JTklUX0RBVEEsXG4gMTUyOlx0XHRcdFx0XHRcdFx0XHQgc3Ryc2VjdCwgaW5mby1cdTAwM2VpbmRleC5zdHIpO1xuIDE1MzpcdFx0cHJfZGVidWcoXCYjMzQ7XFx0JXNcXG5cJiMzNDssIGluZm8tXHUwMDNlc2Vjc3RyaW5ncyAmIzQzOyBzdHJzZWN0LVx1MDAzZXNoX25hbWUpO1xuIDE1NDpcdFxuIDE1NTpcdFx0LyogV2UmIzM5O2xsIHRhY2sgdGVtcG9yYXJ5IG1vZF9rYWxsc3ltcyBvbiB0aGUgZW5kLiAqL1xuIDE1NjpcdFx0bW9kX21lbV9pbml0X2RhdGEtXHUwMDNlc2l6ZSA9IEFMSUdOKG1vZF9tZW1faW5pdF9kYXRhLVx1MDAzZXNpemUsXG4gMTU3Olx0XHRcdFx0XHRcdF9fYWxpZ25vZl9fKHN0cnVjdCBtb2Rfa2FsbHN5bXMpKTtcbiAxNTg6XHRcdGluZm8tXHUwMDNlbW9kX2thbGxzeW1zX2luaXRfb2ZmID0gbW9kX21lbV9pbml0X2RhdGEtXHUwMDNlc2l6ZTtcbiAxNTk6XHRcbiAxNjA6XHRcdG1vZF9tZW1faW5pdF9kYXRhLVx1MDAzZXNpemUgJiM0Mzs9IHNpemVvZihzdHJ1Y3QgbW9kX2thbGxzeW1zKTtcbiAxNjE6XHRcdGluZm8tXHUwMDNlaW5pdF90eXBlb2ZmcyA9IG1vZF9tZW1faW5pdF9kYXRhLVx1MDAzZXNpemU7XG4gMTYyOlx0XHRtb2RfbWVtX2luaXRfZGF0YS1cdTAwM2VzaXplICYjNDM7PSBuc3JjICogc2l6ZW9mKGNoYXIpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjY3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODQwNwoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDM2OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgUG90ZW50aWFsIE1lbW9yeSBVbmluaXRpYWxpemF0aW9uIGluIFNlY3Rpb24gTGF5b3V0KioKCk9rYXksIHNvIGBsYXlvdXRfc3ltdGFiYCBpcyByZXNwb25zaWJsZSBmb3Igc2V0dGluZyB0aGUgYFNIRl9BTExPQ2AgZmxhZyBvbiB0aGUgc3ltYm9sIHNlY3Rpb24gKGBzeW1zZWN0YCkgYW5kIHRoZSBzdHJpbmcgc2VjdGlvbiAoYHN0cnNlY3RgKS4gSXQgYWxzbyBmaWd1cmVzIG91dCBzaXplcyBhbmQgb2Zmc2V0cywgd2hpY2ggaXMgYSBrZXkgcGFydCBvZiBtZW1vcnkgbGF5b3V0LiBOb3csIGlmIGBsYXlvdXRfYW5kX2FsbG9jYXRlYCBuZWVkcyB0byByZXRyeSwgaXQgZmlyc3QgKmNsZWFycyogdGhlIGBTSEZfQUxMT0NgIGZsYWcgYW5kIHJlc2V0cyB0aG9zZSBzZWN0aW9uIHNpemVzIHRvIHplcm8uIFRoZW4gYGxheW91dF9zZWN0aW9uc2AgYW5kIGBsYXlvdXRfc3ltdGFiYCBnZXQgY2FsbGVkIGFnYWluLgoKTXkgaW1tZWRpYXRlIGNvbmNlcm4gaXM6IElzIHRoZXJlIGEgcG90ZW50aWFsIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSB0byBzbmVhayBpbiBoZXJlPyBXZSYjMzk7cmUgcmVzZXR0aW5nIHNpemVzIHRvIHplcm8gZHVyaW5nIHJldHJpZXMsIGJ1dCB3aGF0IGFib3V0IHRoZSBhY3R1YWwgY29udGVudHM/IEJ1dCB3YWl0LCBubywgYmVjYXVzZSBgaW5mby0mZ3Q7bW9kLSZndDttZW1bdHlwZV0uc2l6ZWAgKmlzKiByZXNldCB0byB6ZXJvLiBUaGF0IG1ha2VzIHNlbnNlLCBiZWNhdXNlIGBsYXlvdXRfc2VjdGlvbnNgIGFuZCB0aGVuIGBsYXlvdXRfc3ltdGFiYCByZWNhbGN1bGF0ZSB0aGUgc2l6ZXMgY29ycmVjdGx5LiBUaGVuIGBtb3ZlX21vZHVsZWAgZ29lcyB0byBhbGxvY2F0ZSBtZW1vcnkgYmFzZWQgb24gdGhlc2UgKm5ldyogc2l6ZXMuCgpUaGUgYWxsb2NhdGlvbiB1c2VzIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCwgd2hpY2ggaW4gdHVybiBjYWxscyBgbW9kdWxlX2FsbG9jYCBvciBgdm1hbGxvY2AuIFRoYXQgbWFrZXMgbWUgYSBsaXR0bGUgdW5lYXN5IGJlY2F1c2UgSSBrbm93IGBtb2R1bGVfbWVtb3J5X2FsbG9jYCB1bHRpbWF0ZWx5IHVzZXMgdGhpbmdzIGxpa2UgYGV4ZWNtZW1fYWxsb2NgIG9yIHNpbWlsYXIsIGFuZCB0aG9zZSAqbWlnaHQqIG5vdCB6ZXJvLWluaXRpYWxpemUgdGhlIGFsbG9jYXRlZCBtZW1vcnkuIEhvd2V2ZXIsIGBtb3ZlX21vZHVsZWAgc2VlbXMgdG8gY29weSB0aGUgc2VjdGlvbiBkYXRhIGZyb20gYSB0ZW1wb3JhcnkgaW1hZ2UgdG8gdGhlIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkuCgpMb29raW5nIGF0IHRoZSBjb2RlLCBzcGVjaWZpY2FsbHkgdGhlIGxvb3AgdGhhdCBjb3BpZXMgdGhlIHNlY3Rpb25zOgoKYGBgYwoJCWZvciAoaSA9IDA7IGkgJmx0OyBpbmZvLSZndDtoZHItJmd0O2Vfc2hudW07IGkmIzQzOyYjNDM7KSB7CgkJCS8vIC4uLgoJCQlpZiAoc2hkci0mZ3Q7c2hfdHlwZSAhPSBTSFRfTk9CSVRTKSB7CgkJCQkvLyAuLi4KCQkJCW1lbWNweShkZXN0LCAodm9pZCAqKXNoZHItJmd0O3NoX2FkZHIsIHNoZHItJmd0O3NoX3NpemUpOwoJCQl9CmBgYAoKU28sIGl0ICpjb3BpZXMqIGNvbnRlbnQgaWYgdGhlIHNlY3Rpb24gdHlwZSBpcyAqbm90KiBgU0hUX05PQklUU2AuIFRoYXQmIzM5O3MgZ29vZCwgYmVjYXVzZSBhbnkgYWN0dWFsIGRhdGEgaXMgYmVpbmcgcHJvcGVybHkgdHJhbnNmZXJyZWQuIEhvd2V2ZXIsIGZvciBgU0hUX05PQklUU2Agc2VjdGlvbnMgKGxpa2UgdGhlIEJTUyksIG5vdGhpbmcgaXMgY29waWVkLiBUaGF0JiMzOTtzIGV4YWN0bHkgd2hlcmUgSSBuZWVkIHRvIHplcm8gb3V0IG1lbW9yeSBpZiB0aGVyZSYjMzk7cyBubyBkZWZpbmVkIHNlY3Rpb24gY29udGVudHMuIFNvIG15IGxpbmdlcmluZyB3b3JyeSBpcyBkb2VzIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCB6ZXJvIG91dCB0aGF0IG1lbW9yeSBvbiBpdHMgb3duPyBJdCYjMzk7cyBlc3NlbnRpYWwgdG8gY2hlY2sgdGhlIGltcGxlbWVudGF0aW9uIG9mIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCBtb3JlIGNsb3NlbHkgdG8gYmUgY2VydGFpbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42OC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bW9kdWxlX21lbW9yeV9hbGxvYyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvbWFpbi5jPTEzMzc9dm9pZCBfX3dlYWsgbW9kdWxlX2FyY2hfZnJlZWluZ19pbml0KHN0cnVjdCBtb2R1bGUgKm1vZClcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xMzQwLVxua2VybmVsL21vZHVsZS9tYWluLmM6MTM0MTpzdGF0aWMgaW50IG1vZHVsZV9tZW1vcnlfYWxsb2Moc3RydWN0IG1vZHVsZSAqbW9kLCBlbnVtIG1vZF9tZW1fdHlwZSB0eXBlKVxua2VybmVsL21vZHVsZS9tYWluLmMtMTM0Mi17XG4tLVxua2VybmVsL21vZHVsZS9tYWluLmM9Mjc4OD1zdGF0aWMgaW50IG1vdmVfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbylcbi0tXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yNzk5LVxua2VybmVsL21vZHVsZS9tYWluLmM6MjgwMDpcdFx0cmV0ID0gbW9kdWxlX21lbW9yeV9hbGxvYyhtb2QsIHR5cGUpO1xua2VybmVsL21vZHVsZS9tYWluLmMtMjgwMS1cdFx0aWYgKHJldCkge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjY5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMDo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTUzNwoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDExCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgbXkgdGFrZSBvbiB1bmRlcnN0YW5kaW5nIHRoaXMgY29kZToKCioqQW5hbHl6aW5nIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZ2V0IGRvd24gdG8gaXQuIEkmIzM5O20gZ29pbmcgdG8gc3RhcnQgYnkgdGFraW5nIGEgY2xvc2UgbG9vayBhdCB0aGlzIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCBtb2R1bGUuIEFzIGFuIGV4cGVydCBpbiBteSBmaWVsZCwgSSBrbm93IHRoZSBzaWduaWZpY2FuY2Ugb2YgbWVtb3J5IGFsbG9jYXRpb24gYW5kIG1hbmFnZW1lbnQsIHNvIHRoaXMgaXMgd2hlcmUgSSYjMzk7bGwgYmUgZm9jdXNpbmcuIE15IGluaXRpYWwgdGhvdWdodCBwcm9jZXNzIGlzIHRvIHVuZGVyc3RhbmQgaXRzIHB1cnBvc2Ugd2l0aGluIHRoZSBicm9hZGVyIHN5c3RlbS4gV2hhdCYjMzk7cyBpdCBkb2luZz8gSXMgaXQgaGFuZGxpbmcgZHluYW1pYyBtZW1vcnksIHN0YXRpYyBhbGxvY2F0aW9uLCBvciBhIG1peD8gV2hhdCBraW5kIG9mIGRhdGEgc3RydWN0dXJlcyBhcmUgYmVpbmcgdXNlZCB0byB0cmFjayBtZW1vcnkgYmxvY2tzPyBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgc2NvcGUgb2YgaXRzIHJlc3BvbnNpYmlsaXRpZXMuIElzIGl0IGEgY29yZSBjb21wb25lbnQgb3IgYSB1dGlsaXR5IG1vZHVsZT8gV2hhdCBhcmUgaXRzIGRlcGVuZGVuY2llcz8gSSYjMzk7bGwgcHJvYmFibHkgYmUgYXNraW5nIG15c2VsZiB0aGVzZSBxdWVzdGlvbnMgYXMgSSBnby4gVWx0aW1hdGVseSwgSSYjMzk7bSBleHBlY3RpbmcgdGhpcyBpcyBhbGwgYWJvdXQgdW5kZXJzdGFuZGluZyBtZW1vcnkgbWFuYWdlbWVudCBzdHJhdGVneS4gTGV0JiMzOTtzIGRpZyBpbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTA6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvbW9kdWxlL21haW4uYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEzNDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTM0MTpcdHN0YXRpYyBpbnQgbW9kdWxlX21lbW9yeV9hbGxvYyhzdHJ1Y3QgbW9kdWxlICptb2QsIGVudW0gbW9kX21lbV90eXBlIHR5cGUpXG4xMzQyOlx0e1xuMTM0MzpcdFx0dW5zaWduZWQgaW50IHNpemUgPSBQQUdFX0FMSUdOKG1vZC1cdTAwM2VtZW1bdHlwZV0uc2l6ZSk7XG4xMzQ0Olx0XHRlbnVtIGV4ZWNtZW1fdHlwZSBleGVjbWVtX3R5cGU7XG4xMzQ1Olx0XHR2b2lkICpwdHI7XG4xMzQ2Olx0XG4xMzQ3Olx0XHRtb2QtXHUwMDNlbWVtW3R5cGVdLnNpemUgPSBzaXplO1xuMTM0ODpcdFxuMTM0OTpcdFx0aWYgKG1vZF9tZW1fdHlwZV9pc19kYXRhKHR5cGUpKVxuMTM1MDpcdFx0XHRleGVjbWVtX3R5cGUgPSBFWEVDTUVNX01PRFVMRV9EQVRBO1xuMTM1MTpcdFx0ZWxzZVxuMTM1MjpcdFx0XHRleGVjbWVtX3R5cGUgPSBFWEVDTUVNX01PRFVMRV9URVhUO1xuMTM1MzpcdFxuMTM1NDpcdFx0cHRyID0gZXhlY21lbV9hbGxvY19ydyhleGVjbWVtX3R5cGUsIHNpemUpO1xuMTM1NTpcdFx0aWYgKCFwdHIpXG4xMzU2Olx0XHRcdHJldHVybiAtRU5PTUVNO1xuMTM1NzpcdFxuMTM1ODpcdFx0bW9kLVx1MDAzZW1lbVt0eXBlXS5pc19yb3ggPSBleGVjbWVtX2lzX3JveChleGVjbWVtX3R5cGUpO1xuMTM1OTpcdFxuMTM2MDpcdFx0LypcbjEzNjE6XHRcdCAqIFRoZSBwb2ludGVyIHRvIHRoZXNlIGJsb2NrcyBvZiBtZW1vcnkgYXJlIHN0b3JlZCBvbiB0aGUgbW9kdWxlXG4xMzYyOlx0XHQgKiBzdHJ1Y3R1cmUgYW5kIHdlIGtlZXAgdGhhdCBhcm91bmQgc28gbG9uZyBhcyB0aGUgbW9kdWxlIGlzXG4xMzYzOlx0XHQgKiBhcm91bmQuIFdlIG9ubHkgZnJlZSB0aGF0IG1lbW9yeSB3aGVuIHdlIHVubG9hZCB0aGUgbW9kdWxlLlxuMTM2NDpcdFx0ICogSnVzdCBtYXJrIHRoZW0gYXMgbm90IGJlaW5nIGEgbGVhayB0aGVuLiBUaGUgLmluaXQqIEVMRlxuMTM2NTpcdFx0ICogc2VjdGlvbnMgKmRvKiBnZXQgZnJlZWQgYWZ0ZXIgYm9vdCBzbyB3ZSAqY291bGQqIHRyZWF0IHRoZW1cbjEzNjY6XHRcdCAqIHNsaWdodGx5IGRpZmZlcmVudGx5IHdpdGgga21lbWxlYWtfaWdub3JlKCkgYW5kIG9ubHkgZ3JleVxuMTM2NzpcdFx0ICogdGhlbSBvdXQgYXMgdGhleSB3b3JrIGFzIHR5cGljYWwgbWVtb3J5IGFsbG9jYXRpb25zIHdoaWNoXG4xMzY4Olx0XHQgKiAqZG8qIGV2ZW50dWFsbHkgZ2V0IGZyZWVkLCBidXQgbGV0JiMzOTtzIGp1c3Qga2VlcCB0aGluZ3Mgc2ltcGxlXG4xMzY5Olx0XHQgKiBhbmQgYXZvaWQgKmFueSogZmFsc2UgcG9zaXRpdmVzLlxuMTM3MDpcdFx0ICovXG4xMzcxOlx0XHRpZiAoIW1vZC1cdTAwM2VtZW1bdHlwZV0uaXNfcm94KVxuMTM3MjpcdFx0XHRrbWVtbGVha19ub3RfbGVhayhwdHIpO1xuMTM3MzpcdFxuMTM3NDpcdFx0bWVtc2V0KHB0ciwgMCwgc2l6ZSk7XG4xMzc1Olx0XHRtb2QtXHUwMDNlbWVtW3R5cGVdLmJhc2UgPSBwdHI7XG4xMzc2Olx0XG4xMzc3Olx0XHRyZXR1cm4gMDtcbjEzNzg6XHR9XG4xMzc5Olx0XG4xMzgwOlx0c3RhdGljIHZvaWQgbW9kdWxlX21lbW9yeV9yZXN0b3JlX3JveChzdHJ1Y3QgbW9kdWxlICptb2QpXG4xMzgxOlx0e1xuMTM4MjpcdFx0Zm9yX2NsYXNzX21vZF9tZW1fdHlwZSh0eXBlLCB0ZXh0KSB7XG4xMzgzOlx0XHRcdHN0cnVjdCBtb2R1bGVfbWVtb3J5ICptZW0gPSBcdTAwMjZtb2QtXHUwMDNlbWVtW3R5cGVdO1xuMTM4NDpcdFxuMTM4NTpcdFx0XHRpZiAobWVtLVx1MDAzZWlzX3JveClcbjEzODY6XHRcdFx0XHRleGVjbWVtX3Jlc3RvcmVfcm94KG1lbS1cdTAwM2ViYXNlLCBtZW0tXHUwMDNlc2l6ZSk7XG4xMzg3Olx0XHR9XG4xMzg4Olx0fVxuMTM4OTpcdFxuMTM5MDpcdHN0YXRpYyB2b2lkIG1vZHVsZV9tZW1vcnlfZnJlZShzdHJ1Y3QgbW9kdWxlICptb2QsIGVudW0gbW9kX21lbV90eXBlIHR5cGUpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NzEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwNTU0CgkJCQkJCQlvdXRwdXQ6IDIwMQoJCQkJCQkJdGhvdWdodHM6IDIyNzMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gQXNzZXNzbWVudDogTm8gVW5pbml0aWFsaXplZCBNZW1vcnkgUmVhZCBSaXNrKioKCkFscmlnaHQsIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCB3YXMgdG8gdmVyaWZ5IGlmIHRoZXJlJiMzOTtzIGEgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBkdWUgdG8gdGhlc2UgY2hhbmdlcy4gVGhlIGZpcnN0IHBvaW50IG9mIGNvbmNlcm4gd2FzIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCwgYnV0IGl0IGltbWVkaWF0ZWx5IHVzZXMgYG1lbXNldGAsIHNvIHRoYXQmIzM5O3MgYSBub24taXNzdWUg4oCTIHRoZSBtZW1vcnkgaXMgZ3VhcmFudGVlZCB6ZXJvZWQuCgpJIHRoZW4gbG9va2VkIGF0IGBtbS9hbGxvY190YWcuY2AsIHdoZXJlIHRoZXJlJiMzOTtzIGEgY2hlY2sgZm9yIGB0YWdzX2FkZHJlc3NhYmxlKClgLiBJZiB0aGUgbnVtYmVyIG9mIGFsbG9jYXRpb24gdGFncyBpcyB0b28gbGFyZ2UsIHRoZSBwYXRjaCBkaXNhYmxlcyBtZW1vcnkgcHJvZmlsaW5nIGFuZCByZXRyaWVzLiBUaGlzIGxlZCBtZSB0byBpbnZlc3RpZ2F0ZSB3aGV0aGVyIHJldHJ5IGxvZ2ljIGluIGBrZXJuZWwvbW9kdWxlL21haW4uY2AgY291bGQgaW50cm9kdWNlIHVuaW5pdGlhbGl6ZWQgcmVhZHMuIFRoYXQgcmV0cnkgbG9naWMgcmVzZXRzIGFuZCByZWNhbGN1bGF0ZXMgb2Zmc2V0cyAoYGluZm8tJmd0O3N5bW9mZnNgLCBgaW5mby0mZ3Q7c3Ryb2Zmc2AsIGV0Yy4pIHdpdGhpbiB0aGUgbW9kdWxlJiMzOTtzIHNlY3Rpb24gaGVhZGVycyBiZWZvcmUgcmVzdGFydGluZyB0aGUgbW9kdWxlIGxvYWQuIEkgdmVyaWZpZWQgdGhhdCB0aGVzZSBvZmZzZXRzIGFyZSAqaW5kZWVkKiByZWNhbGN1bGF0ZWQgYW5kIHRoZSBzaXplcyAoYHNoX2VudHNpemVgKSBhcmUgcmVzZXQgYW5kIHNldCBhcHByb3ByaWF0ZWx5LiBgcmV3cml0ZV9zZWN0aW9uX2hlYWRlcnNgIGxvb2tzIGdvb2QsIGl0JiMzOTtzIGp1c3QgbWFya2luZyBhZGRyZXNzZXMuCgpJIGNvbnNpZGVyZWQgd2hldGhlciB0aGlzIHJlbG9hZCBvciBhbnkgbmV3IGxvZ2ljIGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeSB0byB1c2Vyc3BhY2UuIE5vLCB0aGUgY29udGV4dCBpcyBrZXJuZWwgbW9kdWxlIGxvYWRpbmcsIHRoZXJlJiMzOTtzIG5vIGRpcmVjdCBpbnRlcmFjdGlvbiB3aXRoIHVzZXItc3BhY2UgbWVtb3J5IGluIGEgd2F5IHRoYXQgd291bGQgaW50cm9kdWNlIGxlYWtzIG9yIGV4cG9zZSB1bmluaXRpYWxpemVkIGRhdGEuIFRoZSBhbGxvY2F0ZWQgbW9kdWxlIG1lbW9yeSByZW1haW5zIHplcm9lZCBhbmQgdGhlIHBhdGNoIGRvZXNuJiMzOTt0IGludHJvZHVjZSBhbnkgbmV3IHN0cnVjdHVyZXMgc2VudCB0byB1c2Vyc3BhY2UsIG5vciBhbnkgY29uZGl0aW9uYWwgbG9naWMgZGVwZW5kZW50IG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLiBUaGUgbmV3IGZ1bmN0aW9uIGByZWxlYXNlX21vZHVsZV90YWdzYCBpcyBqdXN0IGEgbW92ZWQgZnVuY3Rpb24gYW5kIGRvZXNuJiMzOTt0IGludHJvZHVjZSB1bmluaXRpYWxpemVkIG1lbW9yeS4KClRoZSBwYXRjaCYjMzk7cyBjaGFuZ2VzIGFyZSBzb2xlbHkgZm9jdXNlZCBvbiBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgdGFncywgYWRkaW5nIGEgcmV0cnkgbWVjaGFuaXNtLiBUaGVyZWZvcmUsIGFueSBidWdzIHdvdWxkIGxpa2VseSBtYW5pZmVzdCBhcyBsb2dpYyBlcnJvcnMsIG1lbW9yeSBsZWFrcywgb3IgY3Jhc2hlcyDigJMgaXNzdWVzIHRoYXQgYXJlIHdlbGwgd2l0aGluIHRoZSBzY29wZSBvZiBLQVNBTiYjMzk7cyBkZXRlY3Rpb24gY2FwYWJpbGl0aWVzLiBLTVNBTiAoS2VybmVsIE1lbW9yeSBTYW5pdGl6ZXIpIGlzIGRlc2lnbmVkIHNwZWNpZmljYWxseSBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGJ1dCBzaW5jZSB0aGUgbWVtb3J5IGlzIGJlaW5nIGV4cGxpY2l0bHkgemVyb2VkLCBLTVNBTiBpcyBub3QgbmVjZXNzYXJ5IGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NzIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEwOjQ1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBtb2R1bGUgbG9hZGluZyBwcm9jZXNzIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgdGFncyBleGNlZWQgYXZhaWxhYmxlIHBhZ2UgZmxhZyBiaXRzLiBJdCBpbnRyb2R1Y2VzIGEgcmV0cnkgbWVjaGFuaXNtIGluIGBsYXlvdXRfYW5kX2FsbG9jYXRlYCB0aGF0IHJlc2V0cyBzZWN0aW9uIGhlYWRlcnMgYW5kIHNpemVzLCBhbmQgcmV0cmllcyB0aGUgYWxsb2NhdGlvbiB3aXRob3V0IHByb2ZpbGluZy4gVGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIG1vZHVsZXMgaXMgZXhwbGljaXRseSB6ZXJvZWQgYnkgYG1vZHVsZV9tZW1vcnlfYWxsb2NgICh2aWEgYG1lbXNldChwdHIsIDAsIHNpemUpYCkuIFRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2UgYW55IG5ldyBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2Vyc3BhY2UsIG5vciBkbyB0aGV5IGFkZCBjb21wbGV4IGNvbmRpdGlvbmFsIGxvZ2ljIGRlcGVuZGluZyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy4gQW55IHBvdGVudGlhbCBidWdzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaCAoZS5nLiwgaW5jb3JyZWN0IHNpemUgY2FsY3VsYXRpb25zLCBtZW1vcnkgbGVha3MsIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgZHVyaW5nIHNlY3Rpb24gY29weWluZykgd291bGQgYmUgcmVsaWFibHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIHRvb2xzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgbW9kdWxlIGxvYWRpbmcgcHJvY2VzcyB0byBoYW5kbGUgY2FzZXMgd2hlcmUgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHRhZ3MgZXhjZWVkIGF2YWlsYWJsZSBwYWdlIGZsYWcgYml0cy4gSXQgaW50cm9kdWNlcyBhIHJldHJ5IG1lY2hhbmlzbSBpbiBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAgdGhhdCByZXNldHMgc2VjdGlvbiBoZWFkZXJzIGFuZCBzaXplcywgYW5kIHJldHJpZXMgdGhlIGFsbG9jYXRpb24gd2l0aG91dCBwcm9maWxpbmcuIFRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBtb2R1bGVzIGlzIGV4cGxpY2l0bHkgemVyb2VkIGJ5IGBtb2R1bGVfbWVtb3J5X2FsbG9jYCAodmlhIGBtZW1zZXQocHRyLCAwLCBzaXplKWApLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIGFueSBuZXcgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlcnNwYWNlLCBub3IgZG8gdGhleSBhZGQgY29tcGxleCBjb25kaXRpb25hbCBsb2dpYyBkZXBlbmRpbmcgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggKGUuZy4sIGluY29ycmVjdCBzaXplIGNhbGN1bGF0aW9ucywgbWVtb3J5IGxlYWtzLCBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIGR1cmluZyBzZWN0aW9uIGNvcHlpbmcpIHdvdWxkIGJlIHJlbGlhYmx5IGNhdWdodCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyB0b29scy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgbmVjZXNzaXRhdGUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDozODoxNi43NTk5MjE3OTFaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0MjAzNDk3MTMwMjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNX0FMTE9DX1BST0ZJTElOR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25cIixcbiAgICBcImNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNcIixcbiAgICBcImNvZGV0YWdfbG9hZF9tb2R1bGVcIixcbiAgICBcImNvZGV0YWdfdW5sb2FkX21vZHVsZVwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIG1vZHVsZSBsb2FkaW5nIHByb2Nlc3MgdG8gaGFuZGxlIGNhc2VzIHdoZXJlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyB0YWdzIGV4Y2VlZCBhdmFpbGFibGUgcGFnZSBmbGFnIGJpdHMuIEl0IGludHJvZHVjZXMgYSByZXRyeSBtZWNoYW5pc20gaW4gYGxheW91dF9hbmRfYWxsb2NhdGVgIHRoYXQgcmVzZXRzIHNlY3Rpb24gaGVhZGVycyBhbmQgc2l6ZXMsIGFuZCByZXRyaWVzIHRoZSBhbGxvY2F0aW9uIHdpdGhvdXQgcHJvZmlsaW5nLiBUaGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgbW9kdWxlcyBpcyBleHBsaWNpdGx5IHplcm9lZCBieSBgbW9kdWxlX21lbW9yeV9hbGxvY2AgKHZpYSBgbWVtc2V0KHB0ciwgMCwgc2l6ZSlgKS4gVGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBhbnkgbmV3IHN0cnVjdHVyZXMgY29waWVkIHRvIHVzZXJzcGFjZSwgbm9yIGRvIHRoZXkgYWRkIGNvbXBsZXggY29uZGl0aW9uYWwgbG9naWMgZGVwZW5kaW5nIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLiBBbnkgcG90ZW50aWFsIGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoIChlLmcuLCBpbmNvcnJlY3Qgc2l6ZSBjYWxjdWxhdGlvbnMsIG1lbW9yeSBsZWFrcywgb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBkdXJpbmcgc2VjdGlvbiBjb3B5aW5nKSB3b3VsZCBiZSByZWxpYWJseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgdG9vbHMuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mby1sZWFrcyB0aGF0IHdvdWxkIG5lY2Vzc2l0YXRlIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgY29yZSBtb2R1bGUgbG9hZGluZyBsb2dpYyB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHJ1bnMgb3V0IG9mIHBhZ2UgZmxhZyBiaXRzICghdGFnc19hZGRyZXNzYWJsZSgpKS4gSXQgaW50cm9kdWNlcyBhIHJldHJ5IG1lY2hhbmlzbSBpbiBsYXlvdXRfYW5kX2FsbG9jYXRlKCkgdGhhdCByZXNldHMgdGhlIG1vZHVsZSBzdGF0ZSBhbmQgcmV0cmllcyBsb2FkaW5nIHdpdGhvdXQgbWVtb3J5IHByb2ZpbGluZy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIG1vZHVsZSBsb2FkaW5nIHBhdGggYW5kIG1lbW9yeSBhbGxvY2F0aW9uIHRhZ2dpbmcgc3Vic3lzdGVtLCB3aGljaCBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIGluaXRfbW9kdWxlIGFuZCBmaW5pdF9tb2R1bGUgc3lzY2FsbHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjM4OjE2Ljc1OTkzMDU2MVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQyODI3MjY4OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDZmOWZmNWNlMzU0YzU0YjJmNmY3NWQ5MmZiNTZlMjdjY2E5N2ZkNzBcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIE1vbiBBdWcgMTAgMTA6Mzg6MTQgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS9tYWluLmMgYi9rZXJuZWwvbW9kdWxlL21haW4uY1xcbmluZGV4IDQ2ZGQ4ZDI1YTYwNTguLmMzMmJiNDdhNTczYTEgMTAwNjQ0XFxuLS0tIGEva2VybmVsL21vZHVsZS9tYWluLmNcXG4rKysgYi9rZXJuZWwvbW9kdWxlL21haW4uY1xcbkBAIC0yOTcxLDEzICsyOTcxLDI2IEBAIHN0YXRpYyBzdHJ1Y3QgbW9kdWxlICpsYXlvdXRfYW5kX2FsbG9jYXRlKHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGludCBmbGFncylcXG4gXFx0ICogdGhpcyBpcyBkb25lIGdlbmVyaWNhbGx5OyB0aGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhbnlcXG4gXFx0ICogc3BlY2lhbCBjYXNlcyBmb3IgdGhlIGFyY2hpdGVjdHVyZXMuXFxuIFxcdCAqL1xcbityZXRyeTpcXG4gXFx0bGF5b3V0X3NlY3Rpb25zKGluZm8tXFx1MDAzZW1vZCwgaW5mbyk7XFxuIFxcdGxheW91dF9zeW10YWIoaW5mby1cXHUwMDNlbW9kLCBpbmZvKTtcXG4gXFxuIFxcdC8qIEFsbG9jYXRlIGFuZCBtb3ZlIHRvIHRoZSBmaW5hbCBwbGFjZSAqL1xcbiBcXHRlcnIgPSBtb3ZlX21vZHVsZShpbmZvLVxcdTAwM2Vtb2QsIGluZm8pO1xcbi1cXHRpZiAoZXJyKVxcbi1cXHRcXHRyZXR1cm4gRVJSX1BUUihlcnIpO1xcbitcXHRpZiAoZXJyKSB7XFxuK1xcdFxcdGlmIChlcnIgIT0gLUVBR0FJTilcXG4rXFx0XFx0XFx0cmV0dXJuIEVSUl9QVFIoZXJyKTtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogLUVBR0FJTiBtZWFucyBwcm9maWxpbmcgd2FzIGRpc2FibGVkIGJ1dCB0aGUgbW9kdWxlXFxuK1xcdFxcdCAqIGNhbiBzdGlsbCBsb2FkIHdpdGhvdXQgaXQuIFJlc2V0IHN0YXRlIGFuZCByZXRyeS5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzKGluZm8sIGZsYWdzKTtcXG4rXFx0XFx0Zm9yX2VhY2hfbW9kX21lbV90eXBlKHR5cGUpXFxuK1xcdFxcdFxcdGluZm8tXFx1MDAzZW1vZC1cXHUwMDNlbWVtW3R5cGVdLnNpemUgPSAwO1xcbitcXHRcXHRpbmZvLVxcdTAwM2VzZWNoZHJzW2luZm8tXFx1MDAzZWluZGV4LnN5bV0uc2hfZmxhZ3MgXFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcXG4rXFx0XFx0aW5mby1cXHUwMDNlc2VjaGRyc1tpbmZvLVxcdTAwM2VpbmRleC5zdHJdLnNoX2ZsYWdzIFxcdTAwMjY9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7XFxuK1xcdFxcdGdvdG8gcmV0cnk7XFxuK1xcdH1cXG4gXFxuIFxcdC8qIE1vZHVsZSBoYXMgYmVlbiBjb3BpZWQgdG8gaXRzIGZpbmFsIHBsYWNlIG5vdzogcmV0dXJuIGl0LiAqL1xcbiBcXHRtb2QgPSAodm9pZCAqKWluZm8tXFx1MDAzZXNlY2hkcnNbaW5mby1cXHUwMDNlaW5kZXgubW9kXS5zaF9hZGRyO1xcbmRpZmYgLS1naXQgYS9tbS9hbGxvY190YWcuYyBiL21tL2FsbG9jX3RhZy5jXFxuaW5kZXggNTJhZWNlMjdiMDBlMC4uM2ViYTYzMzExNzRkYSAxMDA2NDRcXG4tLS0gYS9tbS9hbGxvY190YWcuY1xcbisrKyBiL21tL2FsbG9jX3RhZy5jXFxuQEAgLTgzNSw2ICs4MzUsNTIgQEAgc3RhdGljIGludCB2bV9tb2R1bGVfdGFnc19wb3B1bGF0ZSh2b2lkKVxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4rc3RhdGljIHZvaWQgcmVsZWFzZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIGJvb2wgdXNlZClcXG4re1xcbitcXHRNQV9TVEFURShtYXMsIFxcdTAwMjZtb2RfYXJlYV9tdCwgbW9kdWxlX3RhZ3Muc2l6ZSwgbW9kdWxlX3RhZ3Muc2l6ZSk7XFxuK1xcdHN0cnVjdCBhbGxvY190YWcgKnN0YXJ0X3RhZztcXG4rXFx0c3RydWN0IGFsbG9jX3RhZyAqZW5kX3RhZztcXG4rXFx0c3RydWN0IG1vZHVsZSAqdmFsO1xcbitcXG4rXFx0bWFzX2xvY2soXFx1MDAyNm1hcyk7XFxuK1xcdG1hc19mb3JfZWFjaF9yZXYoXFx1MDAyNm1hcywgdmFsLCAwKVxcbitcXHRcXHRpZiAodmFsID09IG1vZClcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcbitcXHRpZiAoIXZhbCkgLyogbW9kdWxlIG5vdCBmb3VuZCAqL1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGlmICghdXNlZClcXG4rXFx0XFx0Z290byByZWxlYXNlX2FyZWE7XFxuK1xcbitcXHRzdGFydF90YWcgPSAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICsgbWFzLmluZGV4KTtcXG4rXFx0ZW5kX3RhZyA9IChzdHJ1Y3QgYWxsb2NfdGFnICopKG1vZHVsZV90YWdzLnN0YXJ0X2FkZHIgKyBtYXMubGFzdCk7XFxuK1xcdGlmICghY2xlYW5fdW51c2VkX2NvdW50ZXJzKHN0YXJ0X3RhZywgZW5kX3RhZykpIHtcXG4rXFx0XFx0c3RydWN0IGFsbG9jX3RhZyAqdGFnO1xcbitcXG4rXFx0XFx0Zm9yICh0YWcgPSBzdGFydF90YWc7IHRhZyBcXHUwMDNjPSBlbmRfdGFnOyB0YWcrKykge1xcbitcXHRcXHRcXHRzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzIGNvdW50ZXI7XFxuK1xcbitcXHRcXHRcXHRpZiAoIXRhZy1cXHUwMDNlY291bnRlcnMpXFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4rXFx0XFx0XFx0Y291bnRlciA9IGFsbG9jX3RhZ19yZWFkKHRhZyk7XFxuK1xcdFxcdFxcdHByX2luZm8oXFxcIiVzOiV1IG1vZHVsZSAlcyBmdW5jOiVzIGhhcyAlbGx1IGFsbG9jYXRlZCBhdCBtb2R1bGUgdW5sb2FkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHR0YWctXFx1MDAzZWN0LmZpbGVuYW1lLCB0YWctXFx1MDAzZWN0LmxpbmVubywgdGFnLVxcdTAwM2VjdC5tb2RuYW1lLFxcbitcXHRcXHRcXHRcXHR0YWctXFx1MDAzZWN0LmZ1bmN0aW9uLCBjb3VudGVyLmJ5dGVzKTtcXG4rXFx0XFx0fVxcbitcXHR9IGVsc2Uge1xcbitcXHRcXHR1c2VkID0gZmFsc2U7XFxuK1xcdH1cXG4rcmVsZWFzZV9hcmVhOlxcbitcXHRtYXNfc3RvcmUoXFx1MDAyNm1hcywgdXNlZCA/IFxcdTAwMjZ1bmxvYWRlZF9tb2QgOiBOVUxMKTtcXG4rXFx0dmFsID0gbWFzX3ByZXZfcmFuZ2UoXFx1MDAyNm1hcywgMCk7XFxuK1xcdGlmICh2YWwgPT0gXFx1MDAyNnByZXBlbmRfbW9kKVxcbitcXHRcXHRtYXNfc3RvcmUoXFx1MDAyNm1hcywgTlVMTCk7XFxuK291dDpcXG4rXFx0bWFzX3VubG9jayhcXHUwMDI2bWFzKTtcXG4rfVxcbitcXG4gc3RhdGljIHZvaWQgKnJlc2VydmVfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBsb25nIHNpemUsXFxuIFxcdFxcdFxcdFxcdCB1bnNpZ25lZCBpbnQgcHJlcGVuZCwgdW5zaWduZWQgbG9uZyBhbGlnbilcXG4ge1xcbkBAIC05MDQsMTAgKzk1MCwxMiBAQCBzdGF0aWMgdm9pZCAqcmVzZXJ2ZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcXG4gXFx0XFx0aW50IGdyb3dfcmVzO1xcbiBcXG4gXFx0XFx0bW9kdWxlX3RhZ3Muc2l6ZSA9IG9mZnNldCArIHNpemU7XFxuLVxcdFxcdGlmIChtZW1fYWxsb2NfcHJvZmlsaW5nX2VuYWJsZWQoKSBcXHUwMDI2XFx1MDAyNiAhdGFnc19hZGRyZXNzYWJsZSgpKSB7XFxuK1xcdFxcdGlmICghdGFnc19hZGRyZXNzYWJsZSgpKSB7XFxuIFxcdFxcdFxcdHNodXRkb3duX21lbV9wcm9maWxpbmcodHJ1ZSk7XFxuLVxcdFxcdFxcdHByX3dhcm4oXFxcIldpdGggbW9kdWxlICVzIHRoZXJlIGFyZSB0b28gbWFueSB0YWdzIHRvIGZpdCBpbiAlZCBwYWdlIGZsYWcgYml0cy4gTWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIGlzIGRpc2FibGVkIVxcXFxuXFxcIixcXG4tXFx0XFx0XFx0XFx0bW9kLVxcdTAwM2VuYW1lLCBOUl9VTlVTRURfUEFHRUZMQUdfQklUUyk7XFxuK1xcdFxcdFxcdHByX3dhcm5fb25jZShcXFwiV2l0aCBtb2R1bGUgJXMgdGhlcmUgYXJlIHRvbyBtYW55IHRhZ3MgdG8gZml0IGluICVkIHBhZ2UgZmxhZyBiaXRzLiBNZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgaXMgZGlzYWJsZWQhXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgIG1vZC1cXHUwMDNlbmFtZSwgTlJfVU5VU0VEX1BBR0VGTEFHX0JJVFMpO1xcbitcXHRcXHRcXHRyZWxlYXNlX21vZHVsZV90YWdzKG1vZCwgZmFsc2UpO1xcbitcXHRcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTtcXG4gXFx0XFx0fVxcbiBcXG4gXFx0XFx0Z3Jvd19yZXMgPSB2bV9tb2R1bGVfdGFnc19wb3B1bGF0ZSgpO1xcbkBAIC05MjIsNTIgKzk3MCw2IEBAIHN0YXRpYyB2b2lkICpyZXNlcnZlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWduZWQgbG9uZyBzaXplLFxcbiBcXHRyZXR1cm4gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciArIG9mZnNldCk7XFxuIH1cXG4gXFxuLXN0YXRpYyB2b2lkIHJlbGVhc2VfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCBib29sIHVzZWQpXFxuLXtcXG4tXFx0TUFfU1RBVEUobWFzLCBcXHUwMDI2bW9kX2FyZWFfbXQsIG1vZHVsZV90YWdzLnNpemUsIG1vZHVsZV90YWdzLnNpemUpO1xcbi1cXHRzdHJ1Y3QgYWxsb2NfdGFnICpzdGFydF90YWc7XFxuLVxcdHN0cnVjdCBhbGxvY190YWcgKmVuZF90YWc7XFxuLVxcdHN0cnVjdCBtb2R1bGUgKnZhbDtcXG4tXFxuLVxcdG1hc19sb2NrKFxcdTAwMjZtYXMpO1xcbi1cXHRtYXNfZm9yX2VhY2hfcmV2KFxcdTAwMjZtYXMsIHZhbCwgMClcXG4tXFx0XFx0aWYgKHZhbCA9PSBtb2QpXFxuLVxcdFxcdFxcdGJyZWFrO1xcbi1cXG4tXFx0aWYgKCF2YWwpIC8qIG1vZHVsZSBub3QgZm91bmQgKi9cXG4tXFx0XFx0Z290byBvdXQ7XFxuLVxcbi1cXHRpZiAoIXVzZWQpXFxuLVxcdFxcdGdvdG8gcmVsZWFzZV9hcmVhO1xcbi1cXG4tXFx0c3RhcnRfdGFnID0gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciArIG1hcy5pbmRleCk7XFxuLVxcdGVuZF90YWcgPSAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICsgbWFzLmxhc3QpO1xcbi1cXHRpZiAoIWNsZWFuX3VudXNlZF9jb3VudGVycyhzdGFydF90YWcsIGVuZF90YWcpKSB7XFxuLVxcdFxcdHN0cnVjdCBhbGxvY190YWcgKnRhZztcXG4tXFxuLVxcdFxcdGZvciAodGFnID0gc3RhcnRfdGFnOyB0YWcgXFx1MDAzYz0gZW5kX3RhZzsgdGFnKyspIHtcXG4tXFx0XFx0XFx0c3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyBjb3VudGVyO1xcbi1cXG4tXFx0XFx0XFx0aWYgKCF0YWctXFx1MDAzZWNvdW50ZXJzKVxcbi1cXHRcXHRcXHRcXHRjb250aW51ZTtcXG4tXFxuLVxcdFxcdFxcdGNvdW50ZXIgPSBhbGxvY190YWdfcmVhZCh0YWcpO1xcbi1cXHRcXHRcXHRwcl9pbmZvKFxcXCIlczoldSBtb2R1bGUgJXMgZnVuYzolcyBoYXMgJWxsdSBhbGxvY2F0ZWQgYXQgbW9kdWxlIHVubG9hZFxcXFxuXFxcIixcXG4tXFx0XFx0XFx0XFx0dGFnLVxcdTAwM2VjdC5maWxlbmFtZSwgdGFnLVxcdTAwM2VjdC5saW5lbm8sIHRhZy1cXHUwMDNlY3QubW9kbmFtZSxcXG4tXFx0XFx0XFx0XFx0dGFnLVxcdTAwM2VjdC5mdW5jdGlvbiwgY291bnRlci5ieXRlcyk7XFxuLVxcdFxcdH1cXG4tXFx0fSBlbHNlIHtcXG4tXFx0XFx0dXNlZCA9IGZhbHNlO1xcbi1cXHR9XFxuLXJlbGVhc2VfYXJlYTpcXG4tXFx0bWFzX3N0b3JlKFxcdTAwMjZtYXMsIHVzZWQgPyBcXHUwMDI2dW5sb2FkZWRfbW9kIDogTlVMTCk7XFxuLVxcdHZhbCA9IG1hc19wcmV2X3JhbmdlKFxcdTAwMjZtYXMsIDApO1xcbi1cXHRpZiAodmFsID09IFxcdTAwMjZwcmVwZW5kX21vZClcXG4tXFx0XFx0bWFzX3N0b3JlKFxcdTAwMjZtYXMsIE5VTEwpO1xcbi1vdXQ6XFxuLVxcdG1hc191bmxvY2soXFx1MDAyNm1hcyk7XFxuLX1cXG4tXFxuIHN0YXRpYyBpbnQgbG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgY29kZXRhZyAqc3RhcnQsIHN0cnVjdCBjb2RldGFnICpzdG9wKVxcbiB7XFxuIFxcdC8qIEFsbG9jYXRlIG1vZHVsZSBhbGxvY190YWcgcGVyY3B1IGNvdW50ZXJzICovXFxuQEAgLTk3NSw2ICs5NzcsOSBAQCBzdGF0aWMgaW50IGxvYWRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGNvZGV0YWcgKnN0YXJ0LCBzdHJ1Y3QgY29kZXRhZ1xcbiBcXHRzdHJ1Y3QgYWxsb2NfdGFnICpzdG9wX3RhZztcXG4gXFx0c3RydWN0IGFsbG9jX3RhZyAqdGFnO1xcbiBcXG4rXFx0aWYgKCFtZW1fcHJvZmlsaW5nX3N1cHBvcnQpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4gXFx0LyogcGVyY3B1IGNvdW50ZXJzIGZvciBjb3JlIGFsbG9jYXRpb25zIGFyZSBhbHJlYWR5IHN0YXRpY2FsbHkgYWxsb2NhdGVkICovXFxuIFxcdGlmICghbW9kKVxcbiBcXHRcXHRyZXR1cm4gMDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6Mzg6MTguMTg5MjMzNTNaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoyNjgwNDU0Mzk3OTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNX0FMTE9DX1BST0ZJTElOR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25cIixcbiAgICBcImNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNcIixcbiAgICBcImNvZGV0YWdfbG9hZF9tb2R1bGVcIixcbiAgICBcImNvZGV0YWdfdW5sb2FkX21vZHVsZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBjb3JlIG1vZHVsZSBsb2FkaW5nIGxvZ2ljIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgcnVucyBvdXQgb2YgcGFnZSBmbGFnIGJpdHMgKCF0YWdzX2FkZHJlc3NhYmxlKCkpLiBJdCBpbnRyb2R1Y2VzIGEgcmV0cnkgbWVjaGFuaXNtIGluIGxheW91dF9hbmRfYWxsb2NhdGUoKSB0aGF0IHJlc2V0cyB0aGUgbW9kdWxlIHN0YXRlIGFuZCByZXRyaWVzIGxvYWRpbmcgd2l0aG91dCBtZW1vcnkgcHJvZmlsaW5nLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgbW9kdWxlIGxvYWRpbmcgcGF0aCBhbmQgbWVtb3J5IGFsbG9jYXRpb24gdGFnZ2luZyBzdWJzeXN0ZW0sIHdoaWNoIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgaW5pdF9tb2R1bGUgYW5kIGZpbml0X21vZHVsZSBzeXNjYWxscy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNmY5ZmY1Y2UzNTRjNTRiMmY2Zjc1ZDkyZmI1NmUyN2NjYTk3ZmQ3MFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gQXVnIDEwIDEwOjM4OjE0IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS9tYWluLmMgYi9rZXJuZWwvbW9kdWxlL21haW4uY1xuaW5kZXggNDZkZDhkMjVhNjA1OC4uYzMyYmI0N2E1NzNhMSAxMDA2NDRcbi0tLSBhL2tlcm5lbC9tb2R1bGUvbWFpbi5jXG4rKysgYi9rZXJuZWwvbW9kdWxlL21haW4uY1xuQEAgLTI5NzEsMTMgKzI5NzEsMjYgQEAgc3RhdGljIHN0cnVjdCBtb2R1bGUgKmxheW91dF9hbmRfYWxsb2NhdGUoc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgaW50IGZsYWdzKVxuIFx0ICogdGhpcyBpcyBkb25lIGdlbmVyaWNhbGx5OyB0aGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhbnlcbiBcdCAqIHNwZWNpYWwgY2FzZXMgZm9yIHRoZSBhcmNoaXRlY3R1cmVzLlxuIFx0ICovXG4rcmV0cnk6XG4gXHRsYXlvdXRfc2VjdGlvbnMoaW5mby1cdTAwM2Vtb2QsIGluZm8pO1xuIFx0bGF5b3V0X3N5bXRhYihpbmZvLVx1MDAzZW1vZCwgaW5mbyk7XG4gXG4gXHQvKiBBbGxvY2F0ZSBhbmQgbW92ZSB0byB0aGUgZmluYWwgcGxhY2UgKi9cbiBcdGVyciA9IG1vdmVfbW9kdWxlKGluZm8tXHUwMDNlbW9kLCBpbmZvKTtcbi1cdGlmIChlcnIpXG4tXHRcdHJldHVybiBFUlJfUFRSKGVycik7XG4rXHRpZiAoZXJyKSB7XG4rXHRcdGlmIChlcnIgIT0gLUVBR0FJTilcbitcdFx0XHRyZXR1cm4gRVJSX1BUUihlcnIpO1xuK1x0XHQvKlxuK1x0XHQgKiAtRUFHQUlOIG1lYW5zIHByb2ZpbGluZyB3YXMgZGlzYWJsZWQgYnV0IHRoZSBtb2R1bGVcbitcdFx0ICogY2FuIHN0aWxsIGxvYWQgd2l0aG91dCBpdC4gUmVzZXQgc3RhdGUgYW5kIHJldHJ5LlxuK1x0XHQgKi9cbitcdFx0cmV3cml0ZV9zZWN0aW9uX2hlYWRlcnMoaW5mbywgZmxhZ3MpO1xuK1x0XHRmb3JfZWFjaF9tb2RfbWVtX3R5cGUodHlwZSlcbitcdFx0XHRpbmZvLVx1MDAzZW1vZC1cdTAwM2VtZW1bdHlwZV0uc2l6ZSA9IDA7XG4rXHRcdGluZm8tXHUwMDNlc2VjaGRyc1tpbmZvLVx1MDAzZWluZGV4LnN5bV0uc2hfZmxhZ3MgXHUwMDI2PSB+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DO1xuK1x0XHRpbmZvLVx1MDAzZXNlY2hkcnNbaW5mby1cdTAwM2VpbmRleC5zdHJdLnNoX2ZsYWdzIFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcbitcdFx0Z290byByZXRyeTtcbitcdH1cbiBcbiBcdC8qIE1vZHVsZSBoYXMgYmVlbiBjb3BpZWQgdG8gaXRzIGZpbmFsIHBsYWNlIG5vdzogcmV0dXJuIGl0LiAqL1xuIFx0bW9kID0gKHZvaWQgKilpbmZvLVx1MDAzZXNlY2hkcnNbaW5mby1cdTAwM2VpbmRleC5tb2RdLnNoX2FkZHI7XG5kaWZmIC0tZ2l0IGEvbW0vYWxsb2NfdGFnLmMgYi9tbS9hbGxvY190YWcuY1xuaW5kZXggNTJhZWNlMjdiMDBlMC4uM2ViYTYzMzExNzRkYSAxMDA2NDRcbi0tLSBhL21tL2FsbG9jX3RhZy5jXG4rKysgYi9tbS9hbGxvY190YWcuY1xuQEAgLTgzNSw2ICs4MzUsNTIgQEAgc3RhdGljIGludCB2bV9tb2R1bGVfdGFnc19wb3B1bGF0ZSh2b2lkKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuK3N0YXRpYyB2b2lkIHJlbGVhc2VfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCBib29sIHVzZWQpXG4re1xuK1x0TUFfU1RBVEUobWFzLCBcdTAwMjZtb2RfYXJlYV9tdCwgbW9kdWxlX3RhZ3Muc2l6ZSwgbW9kdWxlX3RhZ3Muc2l6ZSk7XG4rXHRzdHJ1Y3QgYWxsb2NfdGFnICpzdGFydF90YWc7XG4rXHRzdHJ1Y3QgYWxsb2NfdGFnICplbmRfdGFnO1xuK1x0c3RydWN0IG1vZHVsZSAqdmFsO1xuK1xuK1x0bWFzX2xvY2soXHUwMDI2bWFzKTtcbitcdG1hc19mb3JfZWFjaF9yZXYoXHUwMDI2bWFzLCB2YWwsIDApXG4rXHRcdGlmICh2YWwgPT0gbW9kKVxuK1x0XHRcdGJyZWFrO1xuK1xuK1x0aWYgKCF2YWwpIC8qIG1vZHVsZSBub3QgZm91bmQgKi9cbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoIXVzZWQpXG4rXHRcdGdvdG8gcmVsZWFzZV9hcmVhO1xuK1xuK1x0c3RhcnRfdGFnID0gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciArIG1hcy5pbmRleCk7XG4rXHRlbmRfdGFnID0gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciArIG1hcy5sYXN0KTtcbitcdGlmICghY2xlYW5fdW51c2VkX2NvdW50ZXJzKHN0YXJ0X3RhZywgZW5kX3RhZykpIHtcbitcdFx0c3RydWN0IGFsbG9jX3RhZyAqdGFnO1xuK1xuK1x0XHRmb3IgKHRhZyA9IHN0YXJ0X3RhZzsgdGFnIFx1MDAzYz0gZW5kX3RhZzsgdGFnKyspIHtcbitcdFx0XHRzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzIGNvdW50ZXI7XG4rXG4rXHRcdFx0aWYgKCF0YWctXHUwMDNlY291bnRlcnMpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcbitcdFx0XHRjb3VudGVyID0gYWxsb2NfdGFnX3JlYWQodGFnKTtcbitcdFx0XHRwcl9pbmZvKFwiJXM6JXUgbW9kdWxlICVzIGZ1bmM6JXMgaGFzICVsbHUgYWxsb2NhdGVkIGF0IG1vZHVsZSB1bmxvYWRcXG5cIixcbitcdFx0XHRcdHRhZy1cdTAwM2VjdC5maWxlbmFtZSwgdGFnLVx1MDAzZWN0LmxpbmVubywgdGFnLVx1MDAzZWN0Lm1vZG5hbWUsXG4rXHRcdFx0XHR0YWctXHUwMDNlY3QuZnVuY3Rpb24sIGNvdW50ZXIuYnl0ZXMpO1xuK1x0XHR9XG4rXHR9IGVsc2Uge1xuK1x0XHR1c2VkID0gZmFsc2U7XG4rXHR9XG4rcmVsZWFzZV9hcmVhOlxuK1x0bWFzX3N0b3JlKFx1MDAyNm1hcywgdXNlZCA/IFx1MDAyNnVubG9hZGVkX21vZCA6IE5VTEwpO1xuK1x0dmFsID0gbWFzX3ByZXZfcmFuZ2UoXHUwMDI2bWFzLCAwKTtcbitcdGlmICh2YWwgPT0gXHUwMDI2cHJlcGVuZF9tb2QpXG4rXHRcdG1hc19zdG9yZShcdTAwMjZtYXMsIE5VTEwpO1xuK291dDpcbitcdG1hc191bmxvY2soXHUwMDI2bWFzKTtcbit9XG4rXG4gc3RhdGljIHZvaWQgKnJlc2VydmVfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBsb25nIHNpemUsXG4gXHRcdFx0XHQgdW5zaWduZWQgaW50IHByZXBlbmQsIHVuc2lnbmVkIGxvbmcgYWxpZ24pXG4ge1xuQEAgLTkwNCwxMCArOTUwLDEyIEBAIHN0YXRpYyB2b2lkICpyZXNlcnZlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWduZWQgbG9uZyBzaXplLFxuIFx0XHRpbnQgZ3Jvd19yZXM7XG4gXG4gXHRcdG1vZHVsZV90YWdzLnNpemUgPSBvZmZzZXQgKyBzaXplO1xuLVx0XHRpZiAobWVtX2FsbG9jX3Byb2ZpbGluZ19lbmFibGVkKCkgXHUwMDI2XHUwMDI2ICF0YWdzX2FkZHJlc3NhYmxlKCkpIHtcbitcdFx0aWYgKCF0YWdzX2FkZHJlc3NhYmxlKCkpIHtcbiBcdFx0XHRzaHV0ZG93bl9tZW1fcHJvZmlsaW5nKHRydWUpO1xuLVx0XHRcdHByX3dhcm4oXCJXaXRoIG1vZHVsZSAlcyB0aGVyZSBhcmUgdG9vIG1hbnkgdGFncyB0byBmaXQgaW4gJWQgcGFnZSBmbGFnIGJpdHMuIE1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBpcyBkaXNhYmxlZCFcXG5cIixcbi1cdFx0XHRcdG1vZC1cdTAwM2VuYW1lLCBOUl9VTlVTRURfUEFHRUZMQUdfQklUUyk7XG4rXHRcdFx0cHJfd2Fybl9vbmNlKFwiV2l0aCBtb2R1bGUgJXMgdGhlcmUgYXJlIHRvbyBtYW55IHRhZ3MgdG8gZml0IGluICVkIHBhZ2UgZmxhZyBiaXRzLiBNZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgaXMgZGlzYWJsZWQhXFxuXCIsXG4rXHRcdFx0XHQgICAgIG1vZC1cdTAwM2VuYW1lLCBOUl9VTlVTRURfUEFHRUZMQUdfQklUUyk7XG4rXHRcdFx0cmVsZWFzZV9tb2R1bGVfdGFncyhtb2QsIGZhbHNlKTtcbitcdFx0XHRyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTtcbiBcdFx0fVxuIFxuIFx0XHRncm93X3JlcyA9IHZtX21vZHVsZV90YWdzX3BvcHVsYXRlKCk7XG5AQCAtOTIyLDUyICs5NzAsNiBAQCBzdGF0aWMgdm9pZCAqcmVzZXJ2ZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbiBcdHJldHVybiAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICsgb2Zmc2V0KTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgcmVsZWFzZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIGJvb2wgdXNlZClcbi17XG4tXHRNQV9TVEFURShtYXMsIFx1MDAyNm1vZF9hcmVhX210LCBtb2R1bGVfdGFncy5zaXplLCBtb2R1bGVfdGFncy5zaXplKTtcbi1cdHN0cnVjdCBhbGxvY190YWcgKnN0YXJ0X3RhZztcbi1cdHN0cnVjdCBhbGxvY190YWcgKmVuZF90YWc7XG4tXHRzdHJ1Y3QgbW9kdWxlICp2YWw7XG4tXG4tXHRtYXNfbG9jayhcdTAwMjZtYXMpO1xuLVx0bWFzX2Zvcl9lYWNoX3JldihcdTAwMjZtYXMsIHZhbCwgMClcbi1cdFx0aWYgKHZhbCA9PSBtb2QpXG4tXHRcdFx0YnJlYWs7XG4tXG4tXHRpZiAoIXZhbCkgLyogbW9kdWxlIG5vdCBmb3VuZCAqL1xuLVx0XHRnb3RvIG91dDtcbi1cbi1cdGlmICghdXNlZClcbi1cdFx0Z290byByZWxlYXNlX2FyZWE7XG4tXG4tXHRzdGFydF90YWcgPSAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICsgbWFzLmluZGV4KTtcbi1cdGVuZF90YWcgPSAoc3RydWN0IGFsbG9jX3RhZyAqKShtb2R1bGVfdGFncy5zdGFydF9hZGRyICsgbWFzLmxhc3QpO1xuLVx0aWYgKCFjbGVhbl91bnVzZWRfY291bnRlcnMoc3RhcnRfdGFnLCBlbmRfdGFnKSkge1xuLVx0XHRzdHJ1Y3QgYWxsb2NfdGFnICp0YWc7XG4tXG4tXHRcdGZvciAodGFnID0gc3RhcnRfdGFnOyB0YWcgXHUwMDNjPSBlbmRfdGFnOyB0YWcrKykge1xuLVx0XHRcdHN0cnVjdCBhbGxvY190YWdfY291bnRlcnMgY291bnRlcjtcbi1cbi1cdFx0XHRpZiAoIXRhZy1cdTAwM2Vjb3VudGVycylcbi1cdFx0XHRcdGNvbnRpbnVlO1xuLVxuLVx0XHRcdGNvdW50ZXIgPSBhbGxvY190YWdfcmVhZCh0YWcpO1xuLVx0XHRcdHByX2luZm8oXCIlczoldSBtb2R1bGUgJXMgZnVuYzolcyBoYXMgJWxsdSBhbGxvY2F0ZWQgYXQgbW9kdWxlIHVubG9hZFxcblwiLFxuLVx0XHRcdFx0dGFnLVx1MDAzZWN0LmZpbGVuYW1lLCB0YWctXHUwMDNlY3QubGluZW5vLCB0YWctXHUwMDNlY3QubW9kbmFtZSxcbi1cdFx0XHRcdHRhZy1cdTAwM2VjdC5mdW5jdGlvbiwgY291bnRlci5ieXRlcyk7XG4tXHRcdH1cbi1cdH0gZWxzZSB7XG4tXHRcdHVzZWQgPSBmYWxzZTtcbi1cdH1cbi1yZWxlYXNlX2FyZWE6XG4tXHRtYXNfc3RvcmUoXHUwMDI2bWFzLCB1c2VkID8gXHUwMDI2dW5sb2FkZWRfbW9kIDogTlVMTCk7XG4tXHR2YWwgPSBtYXNfcHJldl9yYW5nZShcdTAwMjZtYXMsIDApO1xuLVx0aWYgKHZhbCA9PSBcdTAwMjZwcmVwZW5kX21vZClcbi1cdFx0bWFzX3N0b3JlKFx1MDAyNm1hcywgTlVMTCk7XG4tb3V0OlxuLVx0bWFzX3VubG9jayhcdTAwMjZtYXMpO1xuLX1cbi1cbiBzdGF0aWMgaW50IGxvYWRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGNvZGV0YWcgKnN0YXJ0LCBzdHJ1Y3QgY29kZXRhZyAqc3RvcClcbiB7XG4gXHQvKiBBbGxvY2F0ZSBtb2R1bGUgYWxsb2NfdGFnIHBlcmNwdSBjb3VudGVycyAqL1xuQEAgLTk3NSw2ICs5NzcsOSBAQCBzdGF0aWMgaW50IGxvYWRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGNvZGV0YWcgKnN0YXJ0LCBzdHJ1Y3QgY29kZXRhZ1xuIFx0c3RydWN0IGFsbG9jX3RhZyAqc3RvcF90YWc7XG4gXHRzdHJ1Y3QgYWxsb2NfdGFnICp0YWc7XG4gXG4rXHRpZiAoIW1lbV9wcm9maWxpbmdfc3VwcG9ydClcbitcdFx0cmV0dXJuIDA7XG4rXG4gXHQvKiBwZXJjcHUgY291bnRlcnMgZm9yIGNvcmUgYWxsb2NhdGlvbnMgYXJlIGFscmVhZHkgc3RhdGljYWxseSBhbGxvY2F0ZWQgKi9cbiBcdGlmICghbW9kKVxuIFx0XHRyZXR1cm4gMDtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjM4OjE4LjE4OTIzNTQzWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NzIwMTcyNDQ5NzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBNb2R1bGUgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGdvdCBhIHBhdGNoIGhlcmUgdGhhdCdzIHRvdWNoaW5nIGBrZXJuZWwvbW9kdWxlL21haW4uY2AgYW5kIGBtbS9hbGxvY190YWcuY2AsIHdoaWNoIGlzIGludGVyZXN0aW5nLiBJdCBsb29rcyBsaWtlIHRoZSBtYWluIGZvY3VzIGlzIGFyb3VuZCBob3cgd2UgaGFuZGxlIGAtRUFHQUlOYCBlcnJvcnMgY29taW5nIGJhY2sgZnJvbSBgbW92ZV9tb2R1bGUoKWAuIFJpZ2h0LCBzbyBgbW92ZV9tb2R1bGUoKWAgaXMgdGhlIG9uZSB0aGF0J3Mgbm93IHBvdGVudGlhbGx5IHJldHVybmluZyB0aGlzIGVycm9yLCBsaWtlbHkgcmVsYXRlZCB0byB0aGUgYHJlc2VydmVfbW9kdWxlX3RhZ3MoKWAgY2FsbC4gVGhhdCBtYWtlcyBzZW5zZSwgYmVjYXVzZSBJIGtub3cgYHJlc2VydmVfbW9kdWxlX3RhZ3MoKWAgaW4gYG1tL2FsbG9jX3RhZy5jYCBpcyBiZWluZyB1cGRhdGVkIHRvIHJldHVybiBgRVJSX1BUUigtRUFHQUlOKWAgaWYgYCF0YWdzX2FkZHJlc3NhYmxlKClgLlxuXG5TbywgdGhlIGtleSBjaGFuZ2UgaXMgdGhhdCBgbGF5b3V0X2FuZF9hbGxvY2F0ZSgpYCBpbiBga2VybmVsL21vZHVsZS9tYWluLmNgIG5vdyBpbmNsdWRlcyByZXRyaWVzIHNwZWNpZmljYWxseSBmb3IgdGhlIGAtRUFHQUlOYCBjYXNlIGZyb20gYG1vdmVfbW9kdWxlKClgLiBJJ2xsIG5lZWQgdG8gY29uZmlybSB0aGUgY2FsbCBjaGFpbiBmcm9tIGBtb3ZlX21vZHVsZSgpYCB0byBgcmVzZXJ2ZV9tb2R1bGVfdGFncygpYCwganVzdCB0byBiZSBjZXJ0YWluIG9mIHRoZSBjb250ZXh0LiBCdXQgYmVmb3JlIEkgZGlnIHRvbyBkZWVwIGluIHRoYXQgZGlyZWN0aW9uLCBJIHNob3VsZCB0YWtlIGEgY2xvc2UgbG9vayBhdCBgbW92ZV9tb2R1bGUoKWAgaW4gYGtlcm5lbC9tb2R1bGUvbWFpbi5jYCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgd2hhdCdzIHRyaWdnZXJpbmcgdGhlIGAtRUFHQUlOYCBpbiB0aGUgZmlyc3QgcGxhY2UgYW5kIHNlZSBpZiB0aGVyZSBhcmUgYW55IG9idmlvdXMgaXNzdWVzLlxuXG5cbiIsIklucHV0VG9rZW5zIjozNzc0LCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTUwLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6Mzk6MzAuMjA2NDgzNTQ2WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjg1MzIwNDk0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1vdmVfbW9kdWxlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9tb2R1bGUvbWFpbi5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9tb2R1bGUvbWFpbi5jPTIzNjQ9c3RhdGljIGludCBlbGZfdmFsaWRpdHlfY2FjaGVfc3RydGFiKHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yNDE1LSAqIEFzIGEgbGFzdCBzdGVwIHdlIHNldCBpbmZvLVxcdTAwM2Vtb2QgdG8gdGhlIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSBtb2R1bGUgaW5cXG5rZXJuZWwvbW9kdWxlL21haW4uYzoyNDE2OiAqIGluZm8tXFx1MDAzZWhkci4gVGhlIGZpbmFsIG9uZSB3aWxsIGJlIGFsbG9jYXRlZCBpbiBtb3ZlX21vZHVsZSgpLiBBbnlcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yNDE3LSAqIG1vZGlmaWNhdGlvbnMgd2UgbWFrZSB0byBvdXIgY29weSBvZiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FycmllZCBvdmVyXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0yNjU5PXN0YXRpYyBpbnQgZmluZF9tb2R1bGVfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMjc4Ny1cXG5rZXJuZWwvbW9kdWxlL21haW4uYzoyNzg4OnN0YXRpYyBpbnQgbW92ZV9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI3ODkte1xcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmM9Mjk0Mz1zdGF0aWMgc3RydWN0IG1vZHVsZSAqbGF5b3V0X2FuZF9hbGxvY2F0ZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTc4LVxcdC8qIEFsbG9jYXRlIGFuZCBtb3ZlIHRvIHRoZSBmaW5hbCBwbGFjZSAqL1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI5Nzk6XFx0ZXJyID0gbW92ZV9tb2R1bGUoaW5mby1cXHUwMDNlbW9kLCBpbmZvKTtcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTgwLVxcdGlmIChlcnIpIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6Mzk6MzAuMjkxODA5NTZaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozOTYxODc2OTUwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGFzIGlmIHRoZXkncmUgbXkgb3duOlxuXG4qKkFuYWx5emluZyB0aGUgYG1vdmVfbW9kdWxlKClgIEltcGxlbWVudGF0aW9uKipcblxuUmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgc3BlY2lmaWNzIG9mIHRoaXMgYG1vdmVfbW9kdWxlKClgIGltcGxlbWVudGF0aW9uLiBGb3JnZXQgdGhlIGdlbmVyYWwgY29uY2VwdCBmb3IgYSBtb21lbnQg4oCTIEkgbmVlZCB0byBnZXQgaW50byB0aGUgbml0dHktZ3JpdHR5IG9mIHRoZSBjb2RlIGl0c2VsZi4gV2hhdCdzIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gZG9pbmc/IFdoYXQgYXJlIHRoZSB1bmRlcmx5aW5nIG1lY2hhbmljcz8gQXJlIHdlIHRhbGtpbmcgYWJvdXQgYSBzaW1wbGUgZmlsZSBzeXN0ZW0gb3BlcmF0aW9uLCBvciBpcyB0aGVyZSBzb21lIGNvbXBsZXggaW50ZXJhY3Rpb24gd2l0aCBhIGRhdGFiYXNlLCBleHRlcm5hbCBzZXJ2aWNlcywgb3IgcGVyaGFwcyBldmVuIGRpc3RyaWJ1dGVkIHN5c3RlbXMgaW52b2x2ZWQ/IEkgbmVlZCB0byBsb29rIGF0IHRoZSBlZGdlIGNhc2VzLCB0aGUgZXJyb3IgaGFuZGxpbmcsIGFuZCB0aGUgb3ZlcmFsbCBlZmZpY2llbmN5LiBJcyBpdCBvcHRpbWl6ZWQgZm9yIGNvbW1vbiBzY2VuYXJpb3MsIG9yIGRvZXMgaXQgY2F0ZXIgdG8gYSBicm9hZGVyIHJhbmdlIG9mIHVzZSBjYXNlcz8gSSdtIGFscmVhZHkgdGhpbmtpbmcgYWJvdXQgcG90ZW50aWFsIGJvdHRsZW5lY2tzIGFuZCBwb2ludHMgb2YgZmFpbHVyZSDigJMgd2hhdCBjb3VsZCBnbyB3cm9uZywgYW5kIGhvdyByb2J1c3QgaXMgdGhlIGVycm9yIGhhbmRsaW5nPyBUaW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eSBhbmQgZGlzc2VjdCB0aGlzIGZ1bmN0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0NTg1LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6Mzk6MzQuMjUzNjg5MDZaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNjkzOTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL21vZHVsZS9tYWluLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjc4OCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjI3ODg6XFx0c3RhdGljIGludCBtb3ZlX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXFxuMjc4OTpcXHR7XFxuMjc5MDpcXHRcXHRpbnQgaSwgcmV0O1xcbjI3OTE6XFx0XFx0ZW51bSBtb2RfbWVtX3R5cGUgdCA9IE1PRF9NRU1fTlVNX1RZUEVTO1xcbjI3OTI6XFx0XFx0Ym9vbCBjb2RldGFnX3NlY3Rpb25fZm91bmQgPSBmYWxzZTtcXG4yNzkzOlxcdFxcbjI3OTQ6XFx0XFx0Zm9yX2VhY2hfbW9kX21lbV90eXBlKHR5cGUpIHtcXG4yNzk1OlxcdFxcdFxcdGlmICghbW9kLVxcdTAwM2VtZW1bdHlwZV0uc2l6ZSkge1xcbjI3OTY6XFx0XFx0XFx0XFx0bW9kLVxcdTAwM2VtZW1bdHlwZV0uYmFzZSA9IE5VTEw7XFxuMjc5NzpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4yNzk4OlxcdFxcdFxcdH1cXG4yNzk5OlxcdFxcbjI4MDA6XFx0XFx0XFx0cmV0ID0gbW9kdWxlX21lbW9yeV9hbGxvYyhtb2QsIHR5cGUpO1xcbjI4MDE6XFx0XFx0XFx0aWYgKHJldCkge1xcbjI4MDI6XFx0XFx0XFx0XFx0dCA9IHR5cGU7XFxuMjgwMzpcXHRcXHRcXHRcXHRnb3RvIG91dF9lcnI7XFxuMjgwNDpcXHRcXHRcXHR9XFxuMjgwNTpcXHRcXHR9XFxuMjgwNjpcXHRcXG4yODA3OlxcdFxcdC8qIFRyYW5zZmVyIGVhY2ggc2VjdGlvbiB3aGljaCBzcGVjaWZpZXMgU0hGX0FMTE9DICovXFxuMjgwODpcXHRcXHRwcl9kZWJ1ZyhcXFwiRmluYWwgc2VjdGlvbiBhZGRyZXNzZXMgZm9yICVzOlxcXFxuXFxcIiwgbW9kLVxcdTAwM2VuYW1lKTtcXG4yODA5OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBpbmZvLVxcdTAwM2VoZHItXFx1MDAzZWVfc2hudW07IGkrKykge1xcbjI4MTA6XFx0XFx0XFx0dm9pZCAqZGVzdDtcXG4yODExOlxcdFxcdFxcdEVsZl9TaGRyICpzaGRyID0gXFx1MDAyNmluZm8tXFx1MDAzZXNlY2hkcnNbaV07XFxuMjgxMjpcXHRcXHRcXHRjb25zdCBjaGFyICpzbmFtZTtcXG4yODEzOlxcdFxcbjI4MTQ6XFx0XFx0XFx0aWYgKCEoc2hkci1cXHUwMDNlc2hfZmxhZ3MgXFx1MDAyNiBTSEZfQUxMT0MpKVxcbjI4MTU6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuMjgxNjpcXHRcXG4yODE3OlxcdFxcdFxcdHNuYW1lID0gaW5mby1cXHUwMDNlc2Vjc3RyaW5ncyArIHNoZHItXFx1MDAzZXNoX25hbWU7XFxuMjgxODpcXHRcXHRcXHQvKlxcbjI4MTk6XFx0XFx0XFx0ICogTG9hZCBjb2RldGFnIHNlY3Rpb25zIHNlcGFyYXRlbHkgYXMgdGhleSBtaWdodCBzdGlsbCBiZSB1c2VkXFxuMjgyMDpcXHRcXHRcXHQgKiBhZnRlciBtb2R1bGUgdW5sb2FkLlxcbjI4MjE6XFx0XFx0XFx0ICovXFxuMjgyMjpcXHRcXHRcXHRpZiAoY29kZXRhZ19uZWVkc19tb2R1bGVfc2VjdGlvbihtb2QsIHNuYW1lLCBzaGRyLVxcdTAwM2VzaF9zaXplKSkge1xcbjI4MjM6XFx0XFx0XFx0XFx0ZGVzdCA9IGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24obW9kLCBzbmFtZSwgc2hkci1cXHUwMDNlc2hfc2l6ZSxcXG4yODI0OlxcdFxcdFxcdFxcdFxcdFxcdGFyY2hfbW9kX3NlY3Rpb25fcHJlcGVuZChtb2QsIGkpLCBzaGRyLVxcdTAwM2VzaF9hZGRyYWxpZ24pO1xcbjI4MjU6XFx0XFx0XFx0XFx0aWYgKFdBUk5fT04oIWRlc3QpKSB7XFxuMjgyNjpcXHRcXHRcXHRcXHRcXHRyZXQgPSAtRUlOVkFMO1xcbjI4Mjc6XFx0XFx0XFx0XFx0XFx0Z290byBvdXRfZXJyO1xcbjI4Mjg6XFx0XFx0XFx0XFx0fVxcbjI4Mjk6XFx0XFx0XFx0XFx0aWYgKElTX0VSUihkZXN0KSkge1xcbjI4MzA6XFx0XFx0XFx0XFx0XFx0cmV0ID0gUFRSX0VSUihkZXN0KTtcXG4yODMxOlxcdFxcdFxcdFxcdFxcdGdvdG8gb3V0X2VycjtcXG4yODMyOlxcdFxcdFxcdFxcdH1cXG4yODMzOlxcdFxcdFxcdFxcdGNvZGV0YWdfc2VjdGlvbl9mb3VuZCA9IHRydWU7XFxuMjgzNDpcXHRcXHRcXHR9IGVsc2Uge1xcbjI4MzU6XFx0XFx0XFx0XFx0ZW51bSBtb2RfbWVtX3R5cGUgdHlwZSA9IHNoZHItXFx1MDAzZXNoX2VudHNpemUgXFx1MDAzZVxcdTAwM2UgU0hfRU5UU0laRV9UWVBFX1NISUZUO1xcbjI4MzY6XFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBvZmZzZXQgPSBzaGRyLVxcdTAwM2VzaF9lbnRzaXplIFxcdTAwMjYgU0hfRU5UU0laRV9PRkZTRVRfTUFTSztcXG4yODM3OlxcdFxcbjI4Mzg6XFx0XFx0XFx0XFx0ZGVzdCA9IG1vZC1cXHUwMDNlbWVtW3R5cGVdLmJhc2UgKyBvZmZzZXQ7XFxuMjgzOTpcXHRcXHRcXHR9XFxuMjg0MDpcXHRcXG4yODQxOlxcdFxcdFxcdGlmIChzaGRyLVxcdTAwM2VzaF90eXBlICE9IFNIVF9OT0JJVFMpIHtcXG4yODQyOlxcdFxcdFxcdFxcdC8qXFxuMjg0MzpcXHRcXHRcXHRcXHQgKiBPdXIgRUxGIGNoZWNrZXIgYWxyZWFkeSB2YWxpZGF0ZWQgdGhpcywgYnV0IGxldCdzXFxuMjg0NDpcXHRcXHRcXHRcXHQgKiBiZSBwZWRhbnRpYyBhbmQgbWFrZSB0aGUgZ29hbCBjbGVhcmVyLiBXZSBhY3R1YWxseVxcbjI4NDU6XFx0XFx0XFx0XFx0ICogZW5kIHVwIGNvcHlpbmcgb3ZlciBhbGwgbW9kaWZpY2F0aW9ucyBtYWRlIHRvIHRoZVxcbjI4NDY6XFx0XFx0XFx0XFx0ICogdXNlcnNwYWNlIGNvcHkgb2YgdGhlIGVudGlyZSBzdHJ1Y3QgbW9kdWxlLlxcbjI4NDc6XFx0XFx0XFx0XFx0ICovXFxuMjg0ODpcXHRcXHRcXHRcXHRpZiAoaSA9PSBpbmZvLVxcdTAwM2VpbmRleC5tb2QgXFx1MDAyNlxcdTAwMjZcXG4yODQ5OlxcdFxcdFxcdFxcdCAgIChXQVJOX09OX09OQ0Uoc2hkci1cXHUwMDNlc2hfc2l6ZSAhPSBzaXplb2Yoc3RydWN0IG1vZHVsZSkpKSkge1xcbjI4NTA6XFx0XFx0XFx0XFx0XFx0cmV0ID0gLUVOT0VYRUM7XFxuMjg1MTpcXHRcXHRcXHRcXHRcXHRnb3RvIG91dF9lcnI7XFxuMjg1MjpcXHRcXHRcXHRcXHR9XFxuMjg1MzpcXHRcXHRcXHRcXHRtZW1jcHkoZGVzdCwgKHZvaWQgKilzaGRyLVxcdTAwM2VzaF9hZGRyLCBzaGRyLVxcdTAwM2VzaF9zaXplKTtcXG4yODU0OlxcdFxcdFxcdH1cXG4yODU1OlxcdFxcdFxcdC8qXFxuMjg1NjpcXHRcXHRcXHQgKiBVcGRhdGUgdGhlIHVzZXJzcGFjZSBjb3B5J3MgRUxGIHNlY3Rpb24gYWRkcmVzcyB0byBwb2ludCB0b1xcbjI4NTc6XFx0XFx0XFx0ICogb3VyIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkgYXMgYSBwdXJlIGNvbnZlbmllbmNlIHNvIHRoYXRcXG4yODU4OlxcdFxcdFxcdCAqIHVzZXJzIG9mIGluZm8gY2FuIGtlZXAgdGFraW5nIGFkdmFudGFnZSBhbmQgdXNpbmcgdGhlIG5ld2x5XFxuMjg1OTpcXHRcXHRcXHQgKiBtaW50ZWQgb2ZmaWNpYWwgbWVtb3J5IGFyZWEuXFxuMjg2MDpcXHRcXHRcXHQgKi9cXG4yODYxOlxcdFxcdFxcdHNoZHItXFx1MDAzZXNoX2FkZHIgPSAodW5zaWduZWQgbG9uZylkZXN0O1xcbjI4NjI6XFx0XFx0XFx0cHJfZGVidWcoXFxcIlxcXFx0MHglbHggMHglLjhseCAlc1xcXFxuXFxcIiwgKGxvbmcpc2hkci1cXHUwMDNlc2hfYWRkcixcXG4yODYzOlxcdFxcdFxcdFxcdCAobG9uZylzaGRyLVxcdTAwM2VzaF9zaXplLCBpbmZvLVxcdTAwM2VzZWNzdHJpbmdzICsgc2hkci1cXHUwMDNlc2hfbmFtZSk7XFxuMjg2NDpcXHRcXHR9XFxuMjg2NTpcXHRcXG4yODY2OlxcdFxcdHJldHVybiAwO1xcbjI4Njc6XFx0b3V0X2VycjpcXG4yODY4OlxcdFxcdG1vZHVsZV9tZW1vcnlfcmVzdG9yZV9yb3gobW9kKTtcXG4yODY5OlxcdFxcdHdoaWxlICh0LS0pXFxuMjg3MDpcXHRcXHRcXHRtb2R1bGVfbWVtb3J5X2ZyZWUobW9kLCB0KTtcXG4yODcxOlxcdFxcdGlmIChjb2RldGFnX3NlY3Rpb25fZm91bmQpXFxuMjg3MjpcXHRcXHRcXHRjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKG1vZCk7XFxuMjg3MzpcXHRcXG4yODc0OlxcdFxcdHJldHVybiByZXQ7XFxuMjg3NTpcXHR9XFxuMjg3NjpcXHRcXG4yODc3OlxcdHN0YXRpYyBpbnQgY2hlY2tfZXhwb3J0X3N5bWJvbF9zZWN0aW9ucyhzdHJ1Y3QgbW9kdWxlICptb2QpXFxuMjg3ODpcXHR7XFxuMjg3OTpcXHRcXHRpZiAobW9kLVxcdTAwM2VudW1fc3ltcyBcXHUwMDI2XFx1MDAyNiAhbW9kLVxcdTAwM2VmbGFnc3RhYikge1xcbjI4ODA6XFx0XFx0XFx0cHJfZXJyKFxcXCIlczogbm8gZmxhZ3MgZm9yIGV4cG9ydGVkIHN5bWJvbHNcXFxcblxcXCIsIG1vZC1cXHUwMDNlbmFtZSk7XFxuMjg4MTpcXHRcXHRcXHRyZXR1cm4gLUVOT0VYRUM7XFxuMjg4MjpcXHRcXHR9XFxuMjg4MzpcXHQjaWZkZWYgQ09ORklHX01PRFZFUlNJT05TXFxuMjg4NDpcXHRcXHRpZiAobW9kLVxcdTAwM2VudW1fc3ltcyBcXHUwMDI2XFx1MDAyNiAhbW9kLVxcdTAwM2VjcmNzKSB7XFxuMjg4NTpcXHRcXHRcXHRyZXR1cm4gdHJ5X3RvX2ZvcmNlX2xvYWQobW9kLFxcbjI4ODY6XFx0XFx0XFx0XFx0XFx0XFx0IFxcXCJubyB2ZXJzaW9ucyBmb3IgZXhwb3J0ZWQgc3ltYm9sc1xcXCIpO1xcbjI4ODc6XFx0XFx0fVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDozOTozNC4yNTM5NjEyMTFaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozODg3ODUxNDY2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkFuYWx5emluZyB0aGUgQ29kZSBBbGxvY2F0aW9uIE1vZHVsZSoqXG5cbk9rYXksIHNvIEkndmUgYmVlbiBhc2tlZCB0byBkZWx2ZSBpbnRvIGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYC4gTXkgaW1tZWRpYXRlIGZvY3VzIGlzIHRvIHBpbnBvaW50IGV4YWN0bHkgd2hlcmUgdGhpcyBmdW5jdGlvbiByZXNpZGVzIHdpdGhpbiB0aGUgY29kZWJhc2UuIFRoZSBuYW1lIGl0c2VsZiBzdWdnZXN0cyBpdCdzIGxpa2VseSBpbnZvbHZlZCBpbiBtZW1vcnkgYWxsb2NhdGlvbiwgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gY29kZSBzZWN0aW9ucy4gTXkgZXhwZXJpZW5jZSB0ZWxscyBtZSBJJ2xsIGJlIGxvb2tpbmcgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IHJvdXRpbmVzLCBwcm9iYWJseSB3aXRoaW4gYSBtb2R1bGUgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIGV4ZWN1dGFibGUgY29kZSBzZWdtZW50cy4gSSdsbCBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJlbGF0aW9uc2hpcCB0byB0aGUgbGlua2VyLCB0aGUgbG9hZGVyLCBhbmQgcGVyaGFwcyBhbnkgZHluYW1pYyBjb2RlIGdlbmVyYXRpb24gZmVhdHVyZXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyByb2xlLiBJcyBpdCBkZWFsaW5nIHdpdGggcmVsb2NhdGFibGUgY29kZSwgcG9zaXRpb24taW5kZXBlbmRlbnQgY29kZSwgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/IEEgcXVpY2sgc2VhcmNoIG9mIHRoZSBwcm9qZWN0IHN0cnVjdHVyZSBhbmQgc3ltYm9sIHRhYmxlcyBpcyBwcm9iYWJseSB0aGUgYmVzdCBmaXJzdCBzdGVwLiBJIG5lZWQgdG8gcmFwaWRseSBhc2NlcnRhaW4gaXRzIGZ1bmN0aW9uYWxpdHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjYzNzAsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjM5OjM4LjE0MTgxNTUxNloiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMjQxNDA5MjExLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvY29kZXRhZy5oPTkyPWJvb2wgY29kZXRhZ19uZWVkc19tb2R1bGVfc2VjdGlvbihzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IGNoYXIgKm5hbWUsXFxuaW5jbHVkZS9saW51eC9jb2RldGFnLmgtOTMtXFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBsb25nIHNpemUpO1xcbmluY2x1ZGUvbGludXgvY29kZXRhZy5oOjk0OnZvaWQgKmNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxcbmluY2x1ZGUvbGludXgvY29kZXRhZy5oLTk1LVxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgaW50IHByZXBlbmQsXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2NvZGV0YWcuaD0xMDc9c3RhdGljIGlubGluZSB2b2lkICpcXG5pbmNsdWRlL2xpbnV4L2NvZGV0YWcuaDoxMDg6Y29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbihzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IGNoYXIgKm5hbWUsXFxuaW5jbHVkZS9saW51eC9jb2RldGFnLmgtMTA5LVxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBpbnQgcHJlcGVuZCxcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTI3ODg9c3RhdGljIGludCBtb3ZlX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yODIyLVxcdFxcdGlmIChjb2RldGFnX25lZWRzX21vZHVsZV9zZWN0aW9uKG1vZCwgc25hbWUsIHNoZHItXFx1MDAzZXNoX3NpemUpKSB7XFxua2VybmVsL21vZHVsZS9tYWluLmM6MjgyMzpcXHRcXHRcXHRkZXN0ID0gY29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbihtb2QsIHNuYW1lLCBzaGRyLVxcdTAwM2VzaF9zaXplLFxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI4MjQtXFx0XFx0XFx0XFx0XFx0YXJjaF9tb2Rfc2VjdGlvbl9wcmVwZW5kKG1vZCwgaSksIHNoZHItXFx1MDAzZXNoX2FkZHJhbGlnbik7XFxuLS1cXG5saWIvY29kZXRhZy5jPTI1Mz1ib29sIGNvZGV0YWdfbmVlZHNfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxcbi0tXFxubGliL2NvZGV0YWcuYy0yODAtXFxubGliL2NvZGV0YWcuYzoyODE6dm9pZCAqY29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbihzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IGNoYXIgKm5hbWUsXFxubGliL2NvZGV0YWcuYy0yODItXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBpbnQgcHJlcGVuZCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6Mzk6NDEuMzgzMjI4NDU3WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzI1NjU2ODg1MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gdGhlIENvZGU6IFVuZGVyc3RhbmRpbmcgYGxpYi9jb2RldGFnLmNgKipcblxuT2theSwgbGV0J3MgemVybyBpbiBvbiBgbGliL2NvZGV0YWcuY2AuIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gd2hhdCdzIGhhcHBlbmluZyB3aXRoaW4gdGhhdCBmaWxlLiBTcGVjaWZpY2FsbHksIEkgc2hvdWxkIGxvb2sgYXJvdW5kIGxpbmUgMjgxLiBUaGF0J3MgdXN1YWxseSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIGEgZGVlcGVyIGRpdmUuIERlcGVuZGluZyBvbiB3aGF0IEkgZmluZCwgSSBtYXkgbmVlZCB0byBleHBhbmQgdGhlIHNjb3BlIG9mIG15IHJldmlldywgYnV0IGxpbmUgMjgxIGdpdmVzIG1lIGEgcG90ZW50aWFsIGVudHJ5IHBvaW50IGZvciB1bmRlcnN0YW5kaW5nIHRoZSBjdXJyZW50IGNvZGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjcwNDcsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDozOTo0NC42Mzk4MDA1MDdaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTM0NDMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImxpYi9jb2RldGFnLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjgxLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjgxOlxcdHZvaWQgKmNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxcbiAyODI6XFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBpbnQgcHJlcGVuZCxcXG4gMjgzOlxcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgYWxpZ24pXFxuIDI4NDpcXHR7XFxuIDI4NTpcXHRcXHRjb25zdCBjaGFyICp0eXBlX25hbWUgPSBuYW1lICsgc3RybGVuKENPREVUQUdfU0VDVElPTl9QUkVGSVgpO1xcbiAyODY6XFx0XFx0c3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlO1xcbiAyODc6XFx0XFx0dm9pZCAqcmV0ID0gRVJSX1BUUigtRUlOVkFMKTtcXG4gMjg4OlxcdFxcbiAyODk6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2Y29kZXRhZ19sb2NrKTtcXG4gMjkwOlxcdFxcdGxpc3RfZm9yX2VhY2hfZW50cnkoY3R0eXBlLCBcXHUwMDI2Y29kZXRhZ190eXBlcywgbGluaykge1xcbiAyOTE6XFx0XFx0XFx0aWYgKHN0cmNtcCh0eXBlX25hbWUsIGN0dHlwZS1cXHUwMDNlZGVzYy5zZWN0aW9uKSA9PSAwKSB7XFxuIDI5MjpcXHRcXHRcXHRcXHRpZiAoV0FSTl9PTighY3R0eXBlLVxcdTAwM2VkZXNjLmFsbG9jX3NlY3Rpb25fbWVtKSlcXG4gMjkzOlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAyOTQ6XFx0XFxuIDI5NTpcXHRcXHRcXHRcXHRkb3duX3dyaXRlKFxcdTAwMjZjdHR5cGUtXFx1MDAzZW1vZF9sb2NrKTtcXG4gMjk2OlxcdFxcdFxcdFxcdHJldCA9IGN0dHlwZS1cXHUwMDNlZGVzYy5hbGxvY19zZWN0aW9uX21lbShtb2QsIHNpemUsIHByZXBlbmQsIGFsaWduKTtcXG4gMjk3OlxcdFxcdFxcdFxcdHVwX3dyaXRlKFxcdTAwMjZjdHR5cGUtXFx1MDAzZW1vZF9sb2NrKTtcXG4gMjk4OlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAyOTk6XFx0XFx0XFx0fVxcbiAzMDA6XFx0XFx0fVxcbiAzMDE6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZjb2RldGFnX2xvY2spO1xcbiAzMDI6XFx0XFxuIDMwMzpcXHRcXHRyZXR1cm4gcmV0O1xcbiAzMDQ6XFx0fVxcbiAzMDU6XFx0XFxuIDMwNjpcXHR2b2lkIGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kKVxcbiAzMDc6XFx0e1xcbiAzMDg6XFx0XFx0c3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlO1xcbiAzMDk6XFx0XFxuIDMxMDpcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZjb2RldGFnX2xvY2spO1xcbiAzMTE6XFx0XFx0bGlzdF9mb3JfZWFjaF9lbnRyeShjdHR5cGUsIFxcdTAwMjZjb2RldGFnX3R5cGVzLCBsaW5rKSB7XFxuIDMxMjpcXHRcXHRcXHRpZiAoIWN0dHlwZS1cXHUwMDNlZGVzYy5mcmVlX3NlY3Rpb25fbWVtKVxcbiAzMTM6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuIDMxNDpcXHRcXG4gMzE1OlxcdFxcdFxcdGRvd25fd3JpdGUoXFx1MDAyNmN0dHlwZS1cXHUwMDNlbW9kX2xvY2spO1xcbiAzMTY6XFx0XFx0XFx0Y3R0eXBlLVxcdTAwM2VkZXNjLmZyZWVfc2VjdGlvbl9tZW0obW9kLCBmYWxzZSk7XFxuIDMxNzpcXHRcXHRcXHR1cF93cml0ZShcXHUwMDI2Y3R0eXBlLVxcdTAwM2Vtb2RfbG9jayk7XFxuIDMxODpcXHRcXHR9XFxuIDMxOTpcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNmNvZGV0YWdfbG9jayk7XFxuIDMyMDpcXHR9XFxuIDMyMTpcXHRcXG4gMzIyOlxcdHZvaWQgY29kZXRhZ19tb2R1bGVfcmVwbGFjZWQoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbW9kdWxlICpuZXdfbW9kKVxcbiAzMjM6XFx0e1xcbiAzMjQ6XFx0XFx0c3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlO1xcbiAzMjU6XFx0XFxuIDMyNjpcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZjb2RldGFnX2xvY2spO1xcbiAzMjc6XFx0XFx0bGlzdF9mb3JfZWFjaF9lbnRyeShjdHR5cGUsIFxcdTAwMjZjb2RldGFnX3R5cGVzLCBsaW5rKSB7XFxuIDMyODpcXHRcXHRcXHRpZiAoIWN0dHlwZS1cXHUwMDNlZGVzYy5tb2R1bGVfcmVwbGFjZWQpXFxuIDMyOTpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4gMzMwOlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDozOTo0NC42Mzk5NDExMTdaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDA5MDcxMDE0MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHVuZGVyc3RhbmRpbmcsIGFzc3VtaW5nIEknbSBhbiBleHBlcnQgaW4gdGhpcyBhcmVhOlxuXG4qKlRyYWNpbmcgTWVtb3J5IEFsbG9jYXRpb24gaW4gYGN0dHlwZWAqKlxuXG5BbHJpZ2h0LCBzbyBJJ20gc2VlaW5nIGEgY2FsbCB0byBgY3R0eXBlLVx1MDAzZWRlc2MuYWxsb2Nfc2VjdGlvbl9tZW1gLiBUaGF0IHJpbmdzIGEgYmVsbC4gTXkgaW1tZWRpYXRlIGluc3RpbmN0IGlzIHRvIGNoZWNrIHdoZXJlIHRoYXQgZnVuY3Rpb24sIHdoaWNoIGlzIGFjdGluZyBhcyBhIG1lbW9yeSBhbGxvY2F0aW9uIGhvb2ssIGlzIGFjdHVhbGx5ICpkZWZpbmVkKi4gU3BlY2lmaWNhbGx5LCBnaXZlbiBpdHMgbmFtZSwgSSBzdXNwZWN0IGl0J3MgZ29pbmcgdG8gYmUgcmVsYXRlZCB0byBzZWN0aW9uIG1lbW9yeSBtYW5hZ2VtZW50LlxuXG5MZXQncyBxdWlja2x5IGp1bXAgaW50byBgbW0vYWxsb2NfdGFnLmNgIHRvIHNlZSBpZiBteSBodW5jaCBpcyBjb3JyZWN0LiBBaCwgeWVzLCB0aGVyZSBpdCBpcyEgYHJlc2VydmVfbW9kdWxlX3RhZ3NgIGlzIHJlZ2lzdGVyZWQgYXMgdGhlIGhhbmRsZXIgZm9yIGBhbGxvY19zZWN0aW9uX21lbWAuIEdvb2QuIFRoYXQgY29uZmlybXMgdGhlIGxpbmsuIFNvLCB0aGUgYWxsb2NhdGlvbiBwYXRoIGluIGBjdHR5cGVgIGlzIGxpa2VseSBsZXZlcmFnaW5nIHRoaXMgbW9kdWxlIHRhZyByZXNlcnZhdGlvbiBtZWNoYW5pc20uIEkgbmVlZCB0byBrZWVwIHRoaXMgaW4gbWluZCBhcyBJIGZvbGxvdyB0aGUgY29udHJvbCBmbG93LiBOb3csIHRoZSBuZXh0IHN0ZXAgd291bGQgYmUgdG8gZmlndXJlIG91dCAqd2h5KiBpdCdzIGNhbGxpbmcgdGhpcyBhbmQgd2hhdCBgcmVzZXJ2ZV9tb2R1bGVfdGFnc2AgaXMgdHJ5aW5nIHRvIGFjaGlldmUuIElzIHRoaXMgYSBjdXN0b20gYWxsb2NhdGlvbiBzY2hlbWU/IE9yIHBlcmhhcHMgcGFydCBvZiBzb21lIGxhcmdlciBtZW1vcnkgcHJvdGVjdGlvbiBmcmFtZXdvcms/XG5cblxuIiwiSW5wdXRUb2tlbnMiOjc5NzgsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0OCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjM5OjQ4LjczMDY2MjA5OVoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjI4Mzk5MjUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicmVzZXJ2ZV9tb2R1bGVfdGFnc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9hbGxvY190YWcuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9hbGxvY190YWcuYz04Mzg9c3RhdGljIHZvaWQgcmVsZWFzZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIGJvb2wgdXNlZClcXG4tLVxcbm1tL2FsbG9jX3RhZy5jLTg4My1cXG5tbS9hbGxvY190YWcuYzo4ODQ6c3RhdGljIHZvaWQgKnJlc2VydmVfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBsb25nIHNpemUsXFxubW0vYWxsb2NfdGFnLmMtODg1LVxcdFxcdFxcdFxcdCB1bnNpZ25lZCBpbnQgcHJlcGVuZCwgdW5zaWduZWQgbG9uZyBhbGlnbilcXG4tLVxcbm1tL2FsbG9jX3RhZy5jPTEzMjE9c3RhdGljIGludCBfX2luaXQgYWxsb2NfdGFnX2luaXQodm9pZClcXG4tLVxcbm1tL2FsbG9jX3RhZy5jLTEzMjctXFx0XFx0Lm5lZWRzX3NlY3Rpb25fbWVtXFx0PSBuZWVkc19zZWN0aW9uX21lbSxcXG5tbS9hbGxvY190YWcuYzoxMzI4OlxcdFxcdC5hbGxvY19zZWN0aW9uX21lbVxcdD0gcmVzZXJ2ZV9tb2R1bGVfdGFncyxcXG5tbS9hbGxvY190YWcuYy0xMzI5LVxcdFxcdC5mcmVlX3NlY3Rpb25fbWVtXFx0PSByZWxlYXNlX21vZHVsZV90YWdzLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDozOTo0OC43OTM1MDg0NTRaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODg5NjY3OTk0MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBNb2R1bGUgTG9hZGluZyBQYXRjaCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIHRyYWNpbmcgdGhlIGVycm9yIGZsb3cuIGByZXNlcnZlX21vZHVsZV90YWdzYCBjYWxscyBgYWxsb2Nfc2VjdGlvbl9tZW1gLCBhbmQgdGhhdCByZXR1cm5zIGBFUlJfUFRSKC1FQUdBSU4pYC4gVGhhdCBwcm9wYWdhdGVzIHRocm91Z2ggYGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25gIGFuZCBgbW92ZV9tb2R1bGVgLCB1bHRpbWF0ZWx5IGxlYWRpbmcgdG8gYC1FQUdBSU5gIGluIGBsYXlvdXRfYW5kX2FsbG9jYXRlYC4gSSBzZWUgdGhhdCBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAgbm93ICpyZXRyaWVzKiB3aGVuIGl0IGdldHMgdGhhdCBlcnJvciBjb2RlLlxuXG5UaGUgY29yZSBvZiB0aGUgcGF0Y2ggc2VlbXMgdG8gaGFuZGxlIGEgc2l0dWF0aW9uIHdoZXJlIGAhdGFnc19hZGRyZXNzYWJsZSgpYCBpcyB0cnVlLCBwYXJ0aWN1bGFybHkgd2hlbiBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgaXMgZW5hYmxlZC4gV2FpdCwgbm8sIGl0IGxvb2tzIGxpa2UgYG1lbV9hbGxvY19wcm9maWxpbmdfZW5hYmxlZCgpYCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBjb25kaXRpb24uIGB0YWdzX2FkZHJlc3NhYmxlKClgIGNoZWNrcyBpZiB3ZSBoYXZlIHN1ZmZpY2llbnQgcGFnZSBmbGFnIGJpdHMuIElmIHdlICpkb24ndCosIHRoZSBjb2RlIHVzZWQgdG8gZGlzYWJsZSBtZW1vcnkgcHJvZmlsaW5nIGFuZCByZXR1cm4gYC1FQUdBSU5gIHRvIHRyaWdnZXIgYSByZXRyeS4gVGhpcyBpcyBhICpmdW5jdGlvbmFsKiBjaGFuZ2UgaW4gdGhlIG1vZHVsZSBsb2FkaW5nIHByb2Nlc3MgaWYgd2UgcnVuIG91dCBvZiBwYWdlIGZsYWcgYml0cywgcmVnYXJkbGVzcyBvZiBtZW1vcnkgcHJvZmlsaW5nIHN0YXRlLlxuXG5UaGUgaW1wb3J0YW50IHRoaW5nIGlzIHRoYXQgYHJlbGVhc2VfbW9kdWxlX3RhZ3MobW9kLCBmYWxzZSlgIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGAtRUFHQUlOYCByZXR1cm4uXG5cbk5vdywgc2hvdWxkIEkgZnV6eiB0aGlzPyBUaGlzICpkZWZpbml0ZWx5KiBtb2RpZmllcyBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAgaW4gYGtlcm5lbC9tb2R1bGUvbWFpbi5jYCwgYW5kIGltcG9ydGFudGx5LCB0aGUgcmV0cnkgbG9naWMgcmVzZXRzIHNvbWUgc3RhdGUsIGluY2x1ZGluZyByZXdyaXRpbmcgc2VjdGlvbiBoZWFkZXJzIGFuZCB6ZXJvaW5nIHNlY3Rpb24gc2l6ZXMsIGJlZm9yZSByZXRyeWluZy5cblxuYGBgY1xuXHRcdHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzKGluZm8sIGZsYWdzKTtcblx0XHRmb3JfZWFjaF9tb2RfbWVtX3R5cGUodHlwZSlcblx0XHRcdGluZm8tXHUwMDNlbW9kLVx1MDAzZW1lbVt0eXBlXS5zaXplID0gMDtcblx0XHRpbmZvLVx1MDAzZXNlY2hkcnNbaW5mby1cdTAwM2VpbmRleC5zeW1dLnNoX2ZsYWdzIFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcblx0XHRpbmZvLVx1MDAzZXNlY2hkcnNbaW5mby1cdTAwM2VpbmRleC5zdHJdLnNoX2ZsYWdzIFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcblx0XHRnb3RvIHJldHJ5O1xuYGBgXG5cblRoaXMgaXMgYSBjbGVhciBmdW5jdGlvbmFsIGNoYW5nZSB0byB0aGUgbW9kdWxlIGxvYWRpbmcgcHJvY2VzcywgYW5kIEkgdGhpbmsgdGhpcyBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcuIEkgY2FuIGltYWdpbmUgdGhpcyBjb2RlIHBhdGggYmVpbmcgdHJpZ2dlcmVkIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgc2ltcGx5IGJ5IGxvYWRpbmcgbW9kdWxlcy4gSWYgd2UgY2FuIGV4aGF1c3QgcGFnZSBmbGFnIGJpdHMgKHdoaWNoIGlzIHRoZSBtYWluIHNjZW5hcmlvIGFkZHJlc3NlZCBieSB0aGUgb3JpZ2luYWwgY29kZSksIG9yIGV2ZW4ganVzdCBnZW5lcmFsIG1vZHVsZSBsb2FkaW5nIGZ1enppbmcsIHdlIGNvdWxkIGV4ZXJjaXNlIHRoaXMgbmV3IHJldHJ5IGxvZ2ljLiBUaGUgcmVtb3ZhbCBvZiBgbWVtX2FsbG9jX3Byb2ZpbGluZ19lbmFibGVkKClgIGZyb20gdGhlIGNvbmRpdGlvbiBpcyBhIG1ham9yIGNoYW5nZS4gVGhpcyBsb29rcyBsaWtlIGEgcHJpbWUgY2FuZGlkYXRlIGZvciBpbnZlc3RpZ2F0aW9uLiBMZXQgbWUgY2hlY2sgYHRhZ3NfYWRkcmVzc2FibGUoKWAgdG8gYmUgc3VyZS4uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4NTI3LCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDY2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjM5OjU3LjY5MDE5MTI2NloiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDQ2OTMzMjcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidGFnc19hZGRyZXNzYWJsZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9hbGxvY190YWcuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9hbGxvY190YWcuYz02NjA9c3RhdGljIGJvb2wgZW5zdXJlX2FsaWdubWVudCh1bnNpZ25lZCBsb25nIGFsaWduLCB1bnNpZ25lZCBpbnQgKnByZXBlbmQpXFxuLS1cXG5tbS9hbGxvY190YWcuYy02ODAtXFxubW0vYWxsb2NfdGFnLmM6NjgxOnN0YXRpYyBpbmxpbmUgYm9vbCB0YWdzX2FkZHJlc3NhYmxlKHZvaWQpXFxubW0vYWxsb2NfdGFnLmMtNjgyLXtcXG4tLVxcbm1tL2FsbG9jX3RhZy5jPTg4ND1zdGF0aWMgdm9pZCAqcmVzZXJ2ZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcXG4tLVxcbm1tL2FsbG9jX3RhZy5jLTk1Mi1cXHRcXHRtb2R1bGVfdGFncy5zaXplID0gb2Zmc2V0ICsgc2l6ZTtcXG5tbS9hbGxvY190YWcuYzo5NTM6XFx0XFx0aWYgKCF0YWdzX2FkZHJlc3NhYmxlKCkpIHtcXG5tbS9hbGxvY190YWcuYy05NTQtXFx0XFx0XFx0c2h1dGRvd25fbWVtX3Byb2ZpbGluZyh0cnVlKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6Mzk6NTcuNzM0ODg3NzEzWiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQzNTEyNTg1NTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqRGl2aW5nIGludG8gYHRhZ3NfYWRkcmVzc2FibGUoKWAqKlxuXG5BbHJpZ2h0LCBsZXQncyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBzcGVjaWZpY3Mgb2YgdGhlIGB0YWdzX2FkZHJlc3NhYmxlKClgIGltcGxlbWVudGF0aW9uLiBJIGtub3cgdGhlIGdlbmVyYWwgY29uY2VwdDogdGhlIGFiaWxpdHkgdG8gYXNzb2NpYXRlIHRhZ3Mgd2l0aCB2YXJpb3VzIG9iamVjdHMgYW5kIHRoZW4gZWZmaWNpZW50bHkgcXVlcnkgdGhvc2Ugb2JqZWN0cyBiYXNlZCBvbiB0YWcgcmVsYXRpb25zaGlwcy4gQnV0IEkgbmVlZCB0byBkaWcgaW50byB0aGUgbnV0cyBhbmQgYm9sdHMuIEkgd2FudCB0byBzZWUgaG93IHRoaXMgcGFydGljdWxhciBzeXN0ZW0gaGFuZGxlcyB0aGUgdW5kZXJseWluZyBkYXRhIHN0cnVjdHVyZXMg4oCTIGlzIGl0IGEgcmVsYXRpb25hbCBkYXRhYmFzZSB3aXRoIGpvaW4gdGFibGVzLCBhIGdyYXBoIGRhdGFiYXNlLCBvciBzb21ldGhpbmcgbW9yZSBzcGVjaWFsaXplZD8gV2hhdCBhcmUgdGhlIGluZGV4aW5nIHN0cmF0ZWdpZXMgaW4gcGxhY2U/IEFuZCBtb3N0IGltcG9ydGFudGx5LCBob3cgYXJlIGNvbmN1cnJlbmN5IGFuZCBjb25zaXN0ZW5jeSBoYW5kbGVkLCBwYXJ0aWN1bGFybHkgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHdyaXRlcnMgYWRkaW5nIGFuZCByZW1vdmluZyB0YWdzIGNvbmN1cnJlbnRseT8gSSdtIGFsc28gY3VyaW91cyB0byBzZWUgaG93IHRoZXkndmUgaGFuZGxlZCBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgYm90dGxlbmVja3Mgd2l0aCBsYXJnZSBudW1iZXJzIG9mIHRhZ3Mgb3Igb2JqZWN0cy4gU3BlY2lmaWNhbGx5LCBJJ2QgbGlrZSB0byB1bmRlcnN0YW5kIGhvdyB0aGUgc3lzdGVtIHNjYWxlcyB3aXRoIGRpZmZlcmVudCB0YWcgY2FyZGluYWxpdHkgc2NlbmFyaW9zOiBmZXcgdGFncyBwZXIgb2JqZWN0LCBtYW55IHRhZ3MgcGVyIG9iamVjdCwgYW5kIHBvdGVudGlhbGx5IGEgdmVyeSBoaWdoIG51bWJlciBvZiB1bmlxdWUgdGFncyBhY3Jvc3MgdGhlIHdob2xlIGRhdGEgc2V0LiBMZXQncyBzZWUgaG93IHRoZXkndmUgdGFja2xlZCB0aGUgY29tcGxleGl0aWVzIG9mIGVmZmljaWVudGx5IHF1ZXJ5aW5nIGNvbXBsZXggdGFnIHJlbGF0aW9uc2hpcHMgKGUuZy4sIG9iamVjdHMgdGFnZ2VkIHdpdGggKmFsbCogb2YgYSBzZXQgb2YgdGFncywgKmFueSogb2YgYSBzZXQgb2YgdGFncywgb3IgKm5vbmUqIG9mIGEgc2V0IG9mIHRhZ3MpLiBUaW1lIHRvIGRpdmUgaW50byB0aGUgY29kZSFcblxuXG4iLCJJbnB1dFRva2VucyI6OTc2MCwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQwOjAyLjA4NjE0ODg5NloiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDU2MzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vYWxsb2NfdGFnLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNjgxLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNjgxOlxcdHN0YXRpYyBpbmxpbmUgYm9vbCB0YWdzX2FkZHJlc3NhYmxlKHZvaWQpXFxuIDY4MjpcXHR7XFxuIDY4MzpcXHRcXHR1bnNpZ25lZCBsb25nIHRhZ19pZHhfY291bnQ7XFxuIDY4NDpcXHRcXG4gNjg1OlxcdFxcdGlmICghc3RhdGljX2tleV9lbmFibGVkKFxcdTAwMjZtZW1fcHJvZmlsaW5nX2NvbXByZXNzZWQpKVxcbiA2ODY6XFx0XFx0XFx0cmV0dXJuIHRydWU7IC8qIHdpdGggcGFnZV9leHQgdGFncyBhcmUgYWx3YXlzIGFkZHJlc3NhYmxlICovXFxuIDY4NzpcXHRcXG4gNjg4OlxcdFxcdHRhZ19pZHhfY291bnQgPSBDT0RFVEFHX0lEX0ZJUlNUICsga2VybmVsX3RhZ3MuY291bnQgK1xcbiA2ODk6XFx0XFx0XFx0XFx0bW9kdWxlX3RhZ3Muc2l6ZSAvIHNpemVvZihzdHJ1Y3QgYWxsb2NfdGFnKTtcXG4gNjkwOlxcdFxcbiA2OTE6XFx0XFx0cmV0dXJuIHRhZ19pZHhfY291bnQgXFx1MDAzYyAoMVVMIFxcdTAwM2NcXHUwMDNjIE5SX1VOVVNFRF9QQUdFRkxBR19CSVRTKTtcXG4gNjkyOlxcdH1cXG4gNjkzOlxcdFxcbiA2OTQ6XFx0c3RhdGljIGJvb2wgbmVlZHNfc2VjdGlvbl9tZW0oc3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBsb25nIHNpemUpXFxuIDY5NTpcXHR7XFxuIDY5NjpcXHRcXHRpZiAoIW1lbV9wcm9maWxpbmdfc3VwcG9ydClcXG4gNjk3OlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4gNjk4OlxcdFxcbiA2OTk6XFx0XFx0cmV0dXJuIHNpemUgXFx1MDAzZT0gc2l6ZW9mKHN0cnVjdCBhbGxvY190YWcpO1xcbiA3MDA6XFx0fVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0MDowMi4wODYyNTU2NDZaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDcyMjY1NDQ2NTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi5cblxuKipVbmRlcnN0YW5kaW5nIGB0YWdzX2FkZHJlc3NhYmxlKClgIGFuZCBJdHMgSW1wbGljYXRpb25zKipcblxuQWxyaWdodCwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBgdGFnc19hZGRyZXNzYWJsZSgpYCBmdW5jdGlvbi4gRnJvbSB3aGF0IEkgY2FuIGdhdGhlciwgaXQgcGVyZm9ybXMgYSBjaGVjaywgc3BlY2lmaWNhbGx5LCBgdGFnX2lkeF9jb3VudCBcdTAwM2MgKDFVTCBcdTAwM2NcdTAwM2MgTlJfVU5VU0VEX1BBR0VGTEFHX0JJVFMpYC4gTXkgZXhwZXJ0IGludHVpdGlvbiB0ZWxscyBtZSB0aGlzIGlzIHByb2JhYmx5IHNvbWUga2luZCBvZiBzYWZldHkgb3IgYWxsb2NhdGlvbi1yZWxhdGVkIGNoZWNrLCBwb3RlbnRpYWxseSByZWxhdGVkIHRvIGhvdyB0YWdzIG9yIG1ldGFkYXRhIGFyZSBtYW5hZ2VkIGluIG1lbW9yeS4gVGhlIG1lbnRpb24gb2YgYE5SX1VOVVNFRF9QQUdFRkxBR19CSVRTYCBpcyBhIGNsdWU7IGl0IHNvdW5kcyBsaWtlIHdlJ3JlIGRlYWxpbmcgd2l0aCBiaXRmbGFncyBhbmQgcG90ZW50aWFsIG1lbW9yeSBsaW1pdGF0aW9ucyB0aWVkIHRvIHBhZ2UgbWFuYWdlbWVudC5cblxuQW5kIHdhaXQgYSBtaW51dGUuLi4gSSBzZWUgYSBjb25uZWN0aW9uIHRvIGBDT05GSUdfTUVNX0FMTE9DX1BST0ZJTElOR2AuIE15IG1pbmQgaW1tZWRpYXRlbHkganVtcHMgdG8gbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nISBUaGlzIGhhcyB0byBiZSByZWxhdGVkLiBMZXQncyBzZWUgaG93IHRoZXkncmUgY29ubmVjdGVkLCBob3cgdGhleSB1c2UgZWFjaCBvdGhlciBhbmQgbGV0IG1lIHVuZGVyc3RhbmQgaG93IHRoZXkgYWZmZWN0IHRoZSBsb2dpYy4gVG8gdHJ1bHkgZ3Jhc3AgdGhlIHNpZ25pZmljYW5jZSBvZiBgdGFnc19hZGRyZXNzYWJsZSgpYCwgSSBuZWVkIHRvIGNvbmZpcm0gd2hldGhlciBgTUVNX0FMTE9DX1BST0ZJTElOR2AgaXMgZW5hYmxlZCBhbmQgaG93IHRoYXQgYWZmZWN0cyB0aGlzIGJpdCBvZiBjb2RlLiBJIG5lZWQgdG8gY29uc3VsdCB0aGUgS2NvbmZpZyBmaWxlIGZvciBhIGJldHRlciBwaWN0dXJlIG9mIHRoZSBzaXR1YXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwMzkwLCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0MDo0OS4zMTI4MDMwODJaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2MzA5NDAxMDUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIE1FTV9BTExPQ19QUk9GSUxJTkdcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWcuZGVidWc9MzExPWNvbmZpZyBQRVJfVk1BX0xPQ0tfU1RBVFNcXG4tLVxcbm1tL0tjb25maWcuZGVidWctMzIzLVxcbm1tL0tjb25maWcuZGVidWc6MzI0OmNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HXFxubW0vS2NvbmZpZy5kZWJ1Zy0zMjUtXFx0Ym9vbCBcXFwiRW5hYmxlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZ1xcXCJcXG4tLVxcbm1tL0tjb25maWcuZGVidWctMzM3LVxcbm1tL0tjb25maWcuZGVidWc6MzM4OmNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HX0VOQUJMRURfQllfREVGQVVMVFxcbm1tL0tjb25maWcuZGVidWctMzM5LVxcdGJvb2wgXFxcIkVuYWJsZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgYnkgZGVmYXVsdFxcXCJcXG4tLVxcbm1tL0tjb25maWcuZGVidWctMzQyLVxcbm1tL0tjb25maWcuZGVidWc6MzQzOmNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HX0RFQlVHXFxubW0vS2NvbmZpZy5kZWJ1Zy0zNDQtXFx0Ym9vbCBcXFwiTWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsZXIgZGVidWdnaW5nXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0MDo1MC45NDM3NDkyNjdaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTQxNjU0NjgwNzAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgYXMgaWYgdGhleSdyZSBteSBvd246XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgS2NvbmZpZyBEZWJ1ZyBPcHRpb25zKipcblxuUmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIGBtbS9LY29uZmlnLmRlYnVnYCBmaWxlLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgMzI0LiBUaGF0IHNlY3Rpb24gbGlrZWx5IGhvbGRzIHNvbWUgaW1wb3J0YW50IGNvbmZpZ3VyYXRpb25zIHJlbGF0ZWQgdG8gbWVtb3J5IG1hbmFnZW1lbnQgZGVidWdnaW5nIGZlYXR1cmVzLiBCYXNlZCBvbiBteSBleHBlcmllbmNlLCBpdCdzIHByb2JhYmx5IGdvaW5nIHRvIGRlZmluZSBvciBlbmFibGUgc3BlY2lmaWMgdHJhY2luZywgZXJyb3IgY2hlY2tpbmcsIG9yIGluc3RydW1lbnRhdGlvbiBvcHRpb25zIHdpdGhpbiB0aGUgbWVtb3J5IHN1YnN5c3RlbS4gSSBrbm93IHRoZXJlIGFyZSBhIGJ1bmNoIG9mIHRoZXNlLCBhbmQgbGluZSAzMjQgbWlnaHQgYmUgdGhlIGtleSB0byBlbmFibGluZyB0aGUgcHJlY2lzZSBkZWJ1ZyBmZWF0dXJlIEknbSBhZnRlciwgYmUgaXQgc29tZSBtZW1vcnkgYWxsb2NhdGlvbiBpc3N1ZSwgYW4gaXNzdWUgd2l0aCBwYWdlIHRhYmxlIGNvcnJ1cHRpb24sIG9yIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5LiBJJ20gYXNzdW1pbmcgdGhhdCBpdCB3aWxsIGhhdmUgc29tZXRoaW5nIG9mIHJlbGV2YW5jZSB0byB0aGUgd29yayBJJ20gZG9pbmcsIG9yIGVsc2UgSSB3b3VsZG4ndCBoYXZlIGxvb2tlZCB1cCB0aGUgc3BlY2lmaWMgcGxhY2UgaW4gdGhlIGZpcnN0IGluc3RhbmNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDk0NCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQxOjA1LjEwOTIxOTc3N1oiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NTY4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9LY29uZmlnLmRlYnVnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDMyNCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDMyNDpcXHRjb25maWcgTUVNX0FMTE9DX1BST0ZJTElOR1xcbiAzMjU6XFx0XFx0Ym9vbCBcXFwiRW5hYmxlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZ1xcXCJcXG4gMzI2OlxcdFxcdGRlZmF1bHQgblxcbiAzMjc6XFx0XFx0ZGVwZW5kcyBvbiBNTVVcXG4gMzI4OlxcdFxcdGRlcGVuZHMgb24gUFJPQ19GU1xcbiAzMjk6XFx0XFx0ZGVwZW5kcyBvbiAhREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVXFxuIDMzMDpcXHRcXHRzZWxlY3QgQ09ERV9UQUdHSU5HXFxuIDMzMTpcXHRcXHRzZWxlY3QgUEFHRV9FWFRFTlNJT05cXG4gMzMyOlxcdFxcdHNlbGVjdCBTTEFCX09CSl9FWFRcXG4gMzMzOlxcdFxcdGhlbHBcXG4gMzM0OlxcdFxcdCAgVHJhY2sgYWxsb2NhdGlvbiBzb3VyY2UgY29kZSBhbmQgcmVjb3JkIHRvdGFsIGFsbG9jYXRpb24gc2l6ZVxcbiAzMzU6XFx0XFx0ICBpbml0aWF0ZWQgYXQgdGhhdCBjb2RlIGxvY2F0aW9uLiBUaGUgbWVjaGFuaXNtIGNhbiBiZSB1c2VkIHRvIHRyYWNrXFxuIDMzNjpcXHRcXHQgIG1lbW9yeSBsZWFrcyB3aXRoIGEgbG93IHBlcmZvcm1hbmNlIGFuZCBtZW1vcnkgaW1wYWN0LlxcbiAzMzc6XFx0XFxuIDMzODpcXHRjb25maWcgTUVNX0FMTE9DX1BST0ZJTElOR19FTkFCTEVEX0JZX0RFRkFVTFRcXG4gMzM5OlxcdFxcdGJvb2wgXFxcIkVuYWJsZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgYnkgZGVmYXVsdFxcXCJcXG4gMzQwOlxcdFxcdGRlZmF1bHQgeVxcbiAzNDE6XFx0XFx0ZGVwZW5kcyBvbiBNRU1fQUxMT0NfUFJPRklMSU5HXFxuIDM0MjpcXHRcXG4gMzQzOlxcdGNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HX0RFQlVHXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQxOjA1LjEwOTI5NjU1N1oiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxODUyMDk1NzkzMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIE1vZHVsZSBMb2FkaW5nIFBhdGNoKipcblxuT2theSwgc28gdGhpcyBwYXRjaCBpcyByZWxhdGVkIHRvIG1vZHVsZSBsb2FkaW5nIGFuZCBoaW5nZXMgb24gdGhlIGBNRU1fQUxMT0NfUFJPRklMSU5HYCBjb25maWcgb3B0aW9uLiBUaGUga2V5IGNoYW5nZSBzZWVtcyB0byBiZSBpbiBga2VybmVsL21vZHVsZS9tYWluLmNgLCB3aGVyZSB0aGV5J3JlIHJldHJ5aW5nIG1vZHVsZSBsb2FkaW5nIGlmIGBtb3ZlX21vZHVsZWAgcmV0dXJucyBgLUVBR0FJTmAuIFRoYXQncyBhIGZ1bmRhbWVudGFsIHNoaWZ0IGluIGhvdyB0aGUgY29yZSBtb2R1bGUgbG9hZGluZyBwcm9jZXNzIHdvcmtzLCB3aGljaCBpcyBkZWZpbml0ZWx5IGEgcG9pbnQgZm9yIGZ1enppbmcuXG5cbk15IHByaW1hcnkgZm9jdXMgZm9yIGZ1enppbmcgd2lsbCBiZSBvbiBhIGZldyBzcGVjaWZpYyBzeW1ib2xzOiBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAsIGBtb3ZlX21vZHVsZWAsIGByZXNlcnZlX21vZHVsZV90YWdzYCwgYW5kIGByZWxlYXNlX21vZHVsZV90YWdzYC4gTGV0IG1lIHF1aWNrbHkgY29uZmlybeKApiB5ZXAsIGBsYXlvdXRfYW5kX2FsbG9jYXRlYCBpcyBzdGF0aWMgd2l0aGluIGBrZXJuZWwvbW9kdWxlL21haW4uY2AuIEhtbSwgd2FpdCwgdGhlIGluc3RydWN0aW9ucyBzdWdnZXN0IHByZWZlcnJpbmcgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnRzIG92ZXIgaW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucy4gTWFrZXMgc2Vuc2UuIFRoZSByZWFsIGVudHJ5cG9pbnRzIGZvciBtb2R1bGUgbG9hZGluZyBhcmUgdGhlIGBpbml0X21vZHVsZWAgb3IgYGZpbml0X21vZHVsZWAgc3lzY2FsbHMuIEFscmlnaHQsIGxldCdzIHNlZSB3aGF0IGlzIGNhbGxpbmcgYGxheW91dF9hbmRfYWxsb2NhdGVgLCBpZiBJJ20gZ29pbmcgdG8gZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExNDg4LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTg5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDE6MjMuNjMwMjU3MloiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDQ0MDQ3ODcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibGF5b3V0X2FuZF9hbGxvY2F0ZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvbW9kdWxlL21haW4uY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvbW9kdWxlL21haW4uYz0yOTQxPWNvcmVfcGFyYW0obW9kdWxlX2JsYWNrbGlzdCwgbW9kdWxlX2JsYWNrbGlzdCwgY2hhcnAsIDA0MDApO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5NDItXFxua2VybmVsL21vZHVsZS9tYWluLmM6Mjk0MzpzdGF0aWMgc3RydWN0IG1vZHVsZSAqbGF5b3V0X2FuZF9hbGxvY2F0ZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpXFxua2VybmVsL21vZHVsZS9tYWluLmMtMjk0NC17XFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0zNDM1PXN0YXRpYyBpbnQgbG9hZF9tb2R1bGUoc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgY29uc3QgY2hhciBfX3VzZXIgKnVhcmdzLFxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMzQ3Mi1cXHQvKiBGaWd1cmUgb3V0IG1vZHVsZSBsYXlvdXQsIGFuZCBhbGxvY2F0ZSBhbGwgdGhlIG1lbW9yeS4gKi9cXG5rZXJuZWwvbW9kdWxlL21haW4uYzozNDczOlxcdG1vZCA9IGxheW91dF9hbmRfYWxsb2NhdGUoaW5mbywgZmxhZ3MpO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM0NzQtXFx0aWYgKElTX0VSUihtb2QpKSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQxOjIzLjY3NDY2NTI2N1oiLCJTZXEiOjIzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4MzI0NDAwMzcyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpdCBzdGFuZHM6XG5cbioqVHJhY2luZyB0aGUgRGVwZW5kZW5jeSBDaGFpbjogQSBRdWljayBEaWFnbm9zdGljKipcblxuT2theSwgc28gYGxvYWRfbW9kdWxlYCBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAuIFRoYXQncyBzdHJhaWdodGZvcndhcmQuIE5vdywgdGhlIGNyaXRpY2FsIHF1ZXN0aW9uIGlzICp1cHN0cmVhbSo6IHdoYXQgaW5pdGlhdGVkIHRoZSBleGVjdXRpb24gb2YgYGxvYWRfbW9kdWxlYCBpbiB0aGUgZmlyc3QgcGxhY2U/IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjYWxsaW5nIGNvbnRleHQgdG8gZnVsbHkgZ3Jhc3AgdGhlIHdvcmtmbG93IGFuZCBwb3RlbnRpYWwgcG9pbnRzIG9mIG9wdGltaXphdGlvbiBvciwgaGVhdmVuIGZvcmJpZCwgYm90dGxlbmVja3MuIElzIGl0IHRyaWdnZXJlZCBieSBhIHVzZXIgYWN0aW9uLCBhIHN5c3RlbSBldmVudCwgb3IgYW5vdGhlciBtb2R1bGU/IEtub3dpbmcgdGhlIGNhbGxlciBpcyB0aGUga2V5IHRvIHVuZGVyc3RhbmRpbmcgdGhlIG1vZHVsZSdzIGJlaGF2aW9yLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjE3NiwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQxOjMxLjk5OTA2NzkwOVoiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDI0Mzg2NTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibG9hZF9tb2R1bGVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL21vZHVsZS9tYWluLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL21vZHVsZS9tYWluLmM9MTQxNz1zdGF0aWMgdm9pZCBmcmVlX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QpXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNDIwLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjE0MjE6XFx0Y29kZXRhZ191bmxvYWRfbW9kdWxlKG1vZCk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMTQyMi1cXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTI5NDM9c3RhdGljIHN0cnVjdCBtb2R1bGUgKmxheW91dF9hbmRfYWxsb2NhdGUoc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgaW50IGZsYWdzKVxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMjk5Ni1cXHRtb2QgPSAodm9pZCAqKWluZm8tXFx1MDAzZXNlY2hkcnNbaW5mby1cXHUwMDNlaW5kZXgubW9kXS5zaF9hZGRyO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI5OTc6XFx0a21lbWxlYWtfbG9hZF9tb2R1bGUobW9kLCBpbmZvKTtcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTk4LVxcdGNvZGV0YWdfbW9kdWxlX3JlcGxhY2VkKGluZm8tXFx1MDAzZW1vZCwgbW9kKTtcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTMzOTk9c3RhdGljIGludCBlYXJseV9tb2RfY2hlY2soc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgaW50IGZsYWdzKVxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMzQzNC0gKi9cXG5rZXJuZWwvbW9kdWxlL21haW4uYzozNDM1OnN0YXRpYyBpbnQgbG9hZF9tb2R1bGUoc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgY29uc3QgY2hhciBfX3VzZXIgKnVhcmdzLFxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM0MzYtXFx0XFx0ICAgICAgIGludCBmbGFncylcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM1ODMtXFxua2VybmVsL21vZHVsZS9tYWluLmM6MzU4NDpcXHRpZiAoY29kZXRhZ19sb2FkX21vZHVsZShtb2QpKVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM1ODUtXFx0XFx0Z290byBzeXNmc19jbGVhbnVwO1xcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmM9MzY0Nz1TWVNDQUxMX0RFRklORTMoaW5pdF9tb2R1bGUsIHZvaWQgX191c2VyICosIHVtb2QsXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zNjY2LVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjM2Njc6XFx0cmV0dXJuIGxvYWRfbW9kdWxlKFxcdTAwMjZpbmZvLCB1YXJncywgMCk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMzY2OC19XFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0zNzU0PXN0YXRpYyBpbnQgaW5pdF9tb2R1bGVfZnJvbV9maWxlKHN0cnVjdCBmaWxlICpmLCBjb25zdCBjaGFyIF9fdXNlciAqIHVhcmdzLCBpbnQgZmxhZ3MpXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zNzg5LVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjM3OTA6XFx0cmV0dXJuIGxvYWRfbW9kdWxlKFxcdTAwMjZpbmZvLCB1YXJncywgZmxhZ3MpO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM3OTEtfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0MTozMi4wNDE1MDg3MzZaIiwiU2VxIjoyNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTIyNzAzMDk0ODQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIE1vZHVsZSBJbml0aWFsaXphdGlvbiBpbiB0aGUgS2VybmVsKipcblxuT2theSwgc28gSSdtIHRyYWNpbmcgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBmbG93LCBhbmQgaXQgbG9va3MgbGlrZSBgaW5pdF9tb2R1bGVgIGFuZCBgaW5pdF9tb2R1bGVfZnJvbV9maWxlYCAod2hpY2ggYGZpbml0X21vZHVsZWAgY2FsbHMpIGJvdGggdWx0aW1hdGVseSBjYWxsIGBsb2FkX21vZHVsZWAuIFJpZ2h0LCBgaW5pdF9tb2R1bGVgIGFuZCBgZmluaXRfbW9kdWxlYCBhcmUgdGhlIHN5c3RlbSBjYWxscywgdGhlIGVudHJ5IHBvaW50cy4gVGhlIGRvY3VtZW50YXRpb24gZW1waGFzaXplZCBwcmVmZXJyaW5nIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50cyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zLiBUaGF0IG1ha2VzIHNlbnNlLCBgbG9hZF9tb2R1bGVgIGlzIHRoZSBzdGF0aWMgaGVscGVyLCBhbmQgYGluaXRfbW9kdWxlYCBpcyB0aGUgc3lzY2FsbCwgYnV0LCB3YWl0LCBgaW5pdF9tb2R1bGVgICppcyogYHN5c19pbml0X21vZHVsZWAgLiBJIHNob3VsZCBmaW5kIGEgbm9uLXN0YXRpYyBvbmUuIEknbGwgY2hlY2sgYG1tL2FsbG9jX3RhZy5jYCB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBub24tc3RhdGljIGZ1bmN0aW9ucyBhdmFpbGFibGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyOTM0LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTY0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQxOjQ0LjMxMTgyMDNaIiwiU2VxIjoyNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQzMjcyNTM3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInJlc2VydmVfbW9kdWxlX3RhZ3NcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vYWxsb2NfdGFnLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vYWxsb2NfdGFnLmM9ODM4PXN0YXRpYyB2b2lkIHJlbGVhc2VfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCBib29sIHVzZWQpXFxuLS1cXG5tbS9hbGxvY190YWcuYy04ODMtXFxubW0vYWxsb2NfdGFnLmM6ODg0OnN0YXRpYyB2b2lkICpyZXNlcnZlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWduZWQgbG9uZyBzaXplLFxcbm1tL2FsbG9jX3RhZy5jLTg4NS1cXHRcXHRcXHRcXHQgdW5zaWduZWQgaW50IHByZXBlbmQsIHVuc2lnbmVkIGxvbmcgYWxpZ24pXFxuLS1cXG5tbS9hbGxvY190YWcuYz0xMzIxPXN0YXRpYyBpbnQgX19pbml0IGFsbG9jX3RhZ19pbml0KHZvaWQpXFxuLS1cXG5tbS9hbGxvY190YWcuYy0xMzI3LVxcdFxcdC5uZWVkc19zZWN0aW9uX21lbVxcdD0gbmVlZHNfc2VjdGlvbl9tZW0sXFxubW0vYWxsb2NfdGFnLmM6MTMyODpcXHRcXHQuYWxsb2Nfc2VjdGlvbl9tZW1cXHQ9IHJlc2VydmVfbW9kdWxlX3RhZ3MsXFxubW0vYWxsb2NfdGFnLmMtMTMyOS1cXHRcXHQuZnJlZV9zZWN0aW9uX21lbVxcdD0gcmVsZWFzZV9tb2R1bGVfdGFncyxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDE6NDQuMzU1MDk3MDk3WiIsIlNlcSI6MjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjIxOTU0NDc2NDkwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCdzIGludGVybmFsIG1vbm9sb2d1ZTpcblxuKipJbnZlc3RpZ2F0aW5nIE1vZHVsZSBUYWcgQWxsb2NhdGlvbioqXG5cbkFscmlnaHQsIGxldCdzIHNlZSwgSSdtIHRoaW5raW5nIGFib3V0IHRoZSBtb2R1bGUgdGFnZ2luZyBzeXN0ZW0gYWdhaW4uIFNwZWNpZmljYWxseSwgSSdtIHRyeWluZyB0byB3cmFwIG15IGhlYWQgYXJvdW5kIHRoZSBtZW1vcnkgbGF5b3V0LiBJJ20gcmVjYWxsaW5nIHRoYXQgYHJlc2VydmVfbW9kdWxlX3RhZ3NgIGlzIGRlZmluZWQgYXMgKnN0YXRpYyouIFRoaXMgbWVhbnMgaXRzIHNjb3BlIGlzIGxpbWl0ZWQgdG8gaXRzIGNvbnRhaW5pbmcgZmlsZS4gVGhpcyBpcyBwcmV0dHkgdHlwaWNhbCBmb3IgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLCBrZWVwcyB0aGluZ3MgdGlkeS4gQnV0IG5vdywgdGhlIHF1ZXN0aW9uIGFyaXNlcywgd2hhdCdzIHRoZSBkZWFsIHdpdGggYGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25gPyBJIHNlZW0gdG8gcmVtZW1iZXIgdGhhdCBvbmUgaXNuJ3Qgc3RhdGljLiBMb29raW5nIGF0IGBsaWIvY29kZXRhZy5jYCwgeWVwLCBjb25maXJtZWQsIGl0J3MgKm5vbi1zdGF0aWMqLiBUaGlzIHN1Z2dlc3RzIGl0J3MgbGlrZWx5IGludGVuZGVkIHRvIGJlIGFjY2Vzc2libGUgZnJvbSBvdGhlciBmaWxlcywgbWVhbmluZyBzb21lIHBhcnQgb2YgaXRzIGRlc2lnbiBpcyBwcm9iYWJseSBleHBvc2VkIGZvciBleHRlcm5hbCB1c2UuIEkgbm93IG5lZWQgdG8gcmVtZW1iZXIgdGhlIEFQSSBkZXNpZ24gb2YgdGhhdCBwYXJ0IG9mIHRoZSBtb2R1bGUgdGFnIGFsbG9jYXRpb24gdG8gc2VlIHdoeSBpdCBoYXMgdG8gYmUgZXhwb3NlZC4gSG1tLCB0aGlzIGRpZmZlcmVuY2UgaGFzIGltcGxpY2F0aW9ucyBmb3IgaG93IG1vZHVsZSB0YWcgbWVtb3J5IGlzIG1hbmFnZWQgYWNyb3NzIHRoZSBwcm9qZWN0LiBJJ2xsIGhhdmUgdG8gaW52ZXN0aWdhdGUgaG93IHRoYXQgbm9uLXN0YXRpYyBhbGxvY2F0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBzdGF0aWMgdGFnIHJlc2VydmF0aW9uLiBJJ20gYmVnaW5uaW5nIHRvIHNlZSBhIHBvdGVudGlhbCBhcmVhIGZvciBmdXJ0aGVyIGV4cGxvcmF0aW9uIG9uIG1lbW9yeSBvd25lcnNoaXAgYW5kIHRocmVhZCBzYWZldHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNTM3LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDI6MDYuMzA5NTc2Njc3WiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NDQzNTYwNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImxpYi9jb2RldGFnLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibGliL2NvZGV0YWcuYz0yNTM9Ym9vbCBjb2RldGFnX25lZWRzX21vZHVsZV9zZWN0aW9uKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3QgY2hhciAqbmFtZSxcXG4tLVxcbmxpYi9jb2RldGFnLmMtMjgwLVxcbmxpYi9jb2RldGFnLmM6MjgxOnZvaWQgKmNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxcbmxpYi9jb2RldGFnLmMtMjgyLVxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgaW50IHByZXBlbmQsXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQyOjA2LjM1NDAxODA3NFoiLCJTZXEiOjI5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NzA2OTA3NDc4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk1vZHVsZSBMb2FkaW5nIEludmVzdGlnYXRpb24qKlxuXG5Pa2F5LCBzbyBJJ3ZlIGNvbmZpcm1lZCB0aGF0IGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYCBpcyBpbmRlZWQgbm9uLXN0YXRpYyDigJMgZ29vZC4gQW5kIEkgcmVtZW1iZXIgdGhhdCBgc3lzX2luaXRfbW9kdWxlYCBhbmQgYHN5c19maW5pdF9tb2R1bGVgIGFyZSwgb2YgY291cnNlLCBzeXNjYWxscy4gSSdsbCBkZWZpbml0ZWx5IGFkZCBgY29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbmAgdG8gbXkgRm9jdXNTeW1ib2xzLiBXaGlsZSB0aGUgc3lzY2FsbHMgYXJlIHJlbGV2YW50LCB0aGV5IGFyZSBmYWlybHkgZ2VuZXJpYy4gSSBuZWVkIHRvIGRpZyBkZWVwZXIgZm9yIG1vcmUgc3BlY2lmaWMgbm9uLXN0YXRpYyBmdW5jdGlvbnMgcmVsYXRlZCB0byBtb2R1bGUgbG9hZGluZy4gSG1tLCBoYW5nIG9uLi4uIGBtb3ZlX21vZHVsZWAgaXMgc3RhdGljLiBBbHJpZ2h0LCBiYWNrIHRvIHRoZSBzb3VyY2UuIFRpbWUgdG8gY2FyZWZ1bGx5IGNoZWNrIHRocm91Z2ggYGtlcm5lbC9tb2R1bGUvbWFpbi5jYCBmb3IgYW55IG90aGVyIG5vbi1zdGF0aWMgZnVuY3Rpb25zIGludm9sdmVkIGluIG1vZHVsZSBsb2FkaW5nIHRoYXQgSSBtaWdodCBoYXZlIG1pc3NlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTM5OTEsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMzcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDI6MTEuMDYwOTI5NjkyWiIsIlNlcSI6MzAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0MzUzOTY5NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJeaW50IC4qbW9kdWxlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9tb2R1bGUvbWFpbi5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9tb2R1bGUvbWFpbi5jPTE2ND1zdGF0aWMgQkxPQ0tJTkdfTk9USUZJRVJfSEVBRChtb2R1bGVfbm90aWZ5X2xpc3QpO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTE2NS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYzoxNjY6aW50IHJlZ2lzdGVyX21vZHVsZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTE2Ny17XFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0xNzA9RVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9tb2R1bGVfbm90aWZpZXIpO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTE3MS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYzoxNzI6aW50IHVucmVnaXN0ZXJfbW9kdWxlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpXFxua2VybmVsL21vZHVsZS9tYWluLmMtMTczLXtcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTc3Mj1zdGF0aWMgaW50IHRyeV9zdG9wX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIGludCBmbGFncywgaW50ICpmb3JjZWQpXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy03OTQtICovXFxua2VybmVsL21vZHVsZS9tYWluLmM6Nzk1OmludCBtb2R1bGVfcmVmY291bnQoc3RydWN0IG1vZHVsZSAqbW9kKVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTc5Ni17XFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0xMTA1PXN0YXRpYyBjb25zdCBjaGFyIHZlcm1hZ2ljW10gPSBWRVJNQUdJQ19TVFJJTkc7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMTEwNi1cXG5rZXJuZWwvbW9kdWxlL21haW4uYzoxMTA3OmludCB0cnlfdG9fZm9yY2VfbG9hZChzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IGNoYXIgKnJlYXNvbilcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xMTA4LXtcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTI5MDk9Ym9vbCBfX3dlYWsgbW9kdWxlX2VsZl9jaGVja19hcmNoKEVsZl9FaGRyICpoZHIpXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTEzLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI5MTQ6aW50IF9fd2VhayBtb2R1bGVfZnJvYl9hcmNoX3NlY3Rpb25zKEVsZl9FaGRyICpoZHIsXFxua2VybmVsL21vZHVsZS9tYWluLmMtMjkxNS1cXHRcXHRcXHRcXHQgICAgIEVsZl9TaGRyICpzZWNoZHJzLFxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmM9MzAwND1zdGF0aWMgdm9pZCBtb2R1bGVfZGVhbGxvY2F0ZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zMDEyLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjMwMTM6aW50IF9fd2VhayBtb2R1bGVfZmluYWxpemUoY29uc3QgRWxmX0VoZHIgKmhkcixcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zMDE0LVxcdFxcdFxcdCAgIGNvbnN0IEVsZl9TaGRyICpzZWNoZHJzLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0MjoxMS4xMDQ0NzM0NjlaIiwiU2VxIjozMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDIxNzU2ODI5MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyBpZiBJIHdlcmUgY29uc2lkZXJpbmcgdGhlIGNvZGUgeW91IG1lbnRpb25lZDpcblxuKipDaGVja2luZyBga2VybmVsL21vZHVsZS9tYWluLmNgIGZvciBgaW5pdF9tb2R1bGVgKipcblxuT2theSwgc28gd2UncmUgdGFsa2luZyBtb2R1bGUgaW5pdGlhbGl6YXRpb24sIHJpZ2h0PyBNeSBpbml0aWFsIGluc3RpbmN0IGlzIHRvIGdvIHN0cmFpZ2h0IHRvIGBrZXJuZWwvbW9kdWxlL21haW4uY2AuIFRoYXQncyB3aGVyZSBJJ2QgKmV4cGVjdCogdG8gZmluZCB0aGUgY29yZSBsb2dpYyBmb3IgbG9hZGluZyBhIG1vZHVsZSwgYW5kIHRoYXQgdXN1YWxseSBtZWFucyBmaW5kaW5nIHRoZSBlbnRyeSBwb2ludCwgdGhlIGZ1bmN0aW9uIHRoYXQncyBjYWxsZWQgd2hlbiBhIG1vZHVsZSBpcyBsb2FkZWQuICBJIHdhbnQgdG8gemVybyBpbiBvbiBgaW5pdF9tb2R1bGVgLiBJdCdzIGFsbW9zdCBjZXJ0YWluIHRoYXQncyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gd2UncmUgbG9va2luZyBmb3Ig4oCTIGl0J3MgdGhlIHN0YW5kYXJkIGNvbnZlbnRpb24sIGFuZCBpdCdzIHByYWN0aWNhbGx5IGJha2VkIGludG8gbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUga2VybmVsJ3MgbW9kdWxlIGxvYWRpbmcgbWVjaGFuaXNtLiBMZXQncyBzZWUgd2hhdCdzIGluIHRoZXJlLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIGFueSBoaW50cyBhYm91dCBob3cgdGhlIG1vZHVsZSdzIGNvZGUgZ2V0cyByZWdpc3RlcmVkIHdpdGggdGhlIGtlcm5lbCwgaG93IHJlc291cmNlcyBhcmUgYWxsb2NhdGVkLCBhbmQgaG93IHRoZSBtb2R1bGUgaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbS4gSSBhbHNvIHdhbnQgdG8gc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGNhbGxlZCBpbnRvLiBJcyBpdCBkb25lIGZyb20gYSBzcGVjaWZpYyBjb250ZXh0PyBEb2VzIGl0IHVzZSBhcmd1bWVudHM/IFRoZSBkZXZpbCBpcyBpbiB0aGUgZGV0YWlscywgc28gSSdsbCBiZSBkaWdnaW5nIGluIHdpdGggbXkgdXN1YWwgc2NydXRpbnkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0ODg1LCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDI6MTUuMzIyMDQzODAxWiIsIlNlcSI6MzIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0Njg1MzE0NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJpbml0X21vZHVsZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvbW9kdWxlL21haW4uY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvbW9kdWxlL21haW4uYz0xMzM9c3RhdGljIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgbW9kdWxlX3N5c2N0bF90YWJsZVtdID0ge1xcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMTUyLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjE1MzpzdGF0aWMgaW50IF9faW5pdCBpbml0X21vZHVsZV9zeXNjdGwodm9pZClcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNTQte1xcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMTU4LVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjE1OTpzdWJzeXNfaW5pdGNhbGwoaW5pdF9tb2R1bGVfc3lzY3RsKTtcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNjAtXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0yNDkxPXN0YXRpYyBpbnQgY29weV9tb2R1bGVfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICp1bW9kLCB1bnNpZ25lZCBsb25nIGxlbixcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI1MTQtXFx0ZXJyID0gc2VjdXJpdHlfa2VybmVsX3Bvc3RfbG9hZF9kYXRhKChjaGFyICopaW5mby1cXHUwMDNlaGRyLCBpbmZvLVxcdTAwM2VsZW4sXFxua2VybmVsL21vZHVsZS9tYWluLmM6MjUxNTpcXHRcXHRcXHRcXHRcXHQgICAgIExPQURJTkdfTU9EVUxFLCBcXFwiaW5pdF9tb2R1bGVcXFwiKTtcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yNTE2LW91dDpcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTMwODI9bW9kdWxlX3BhcmFtKGFzeW5jX3Byb2JlLCBib29sLCAwNjQ0KTtcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTMwODktICovXFxua2VybmVsL21vZHVsZS9tYWluLmM6MzA5MDpzdGF0aWMgbm9pbmxpbmUgaW50IGRvX2luaXRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZClcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zMDkxLXtcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTMxMjEtXFx0XFx0LypcXG5rZXJuZWwvbW9kdWxlL21haW4uYzozMTIyOlxcdFxcdCAqIC1FRVhJU1QgaXMgcmVzZXJ2ZWQgYnkgW2ZdaW5pdF9tb2R1bGUoKSB0byBzaWduYWwgdG8gdXNlcnNwYWNlIHRoYXRcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zMTIzLVxcdFxcdCAqIGEgbW9kdWxlIHdpdGggdGhpcyBuYW1lIGlzIGFscmVhZHkgbG9hZGVkLiBVc2Ugc29tZXRoaW5nIGVsc2UgaWYgdGhlXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zMjI0LVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjMyMjU6c3RhdGljIGludCBtYXlfaW5pdF9tb2R1bGUodm9pZClcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zMjI2LXtcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTM0MzU9c3RhdGljIGludCBsb2FkX21vZHVsZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBjb25zdCBjaGFyIF9fdXNlciAqdWFyZ3MsXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zNTkyLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjM1OTM6XFx0cmV0dXJuIGRvX2luaXRfbW9kdWxlKG1vZCk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMzU5NC1cXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM2NDYtXFxua2VybmVsL21vZHVsZS9tYWluLmM6MzY0NzpTWVNDQUxMX0RFRklORTMoaW5pdF9tb2R1bGUsIHZvaWQgX191c2VyICosIHVtb2QsXFxua2VybmVsL21vZHVsZS9tYWluLmMtMzY0OC1cXHRcXHR1bnNpZ25lZCBsb25nLCBsZW4sIGNvbnN0IGNoYXIgX191c2VyICosIHVhcmdzKVxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMzY1Mi1cXG5rZXJuZWwvbW9kdWxlL21haW4uYzozNjUzOlxcdGVyciA9IG1heV9pbml0X21vZHVsZSgpO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM2NTQtXFx0aWYgKGVycilcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM2NTYtXFxua2VybmVsL21vZHVsZS9tYWluLmM6MzY1NzpcXHRwcl9kZWJ1ZyhcXFwiaW5pdF9tb2R1bGU6IHVtb2Q9JXAsIGxlbj0lbHUsIHVhcmdzPSVwXFxcXG5cXFwiLFxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM2NTgtXFx0ICAgICAgIHVtb2QsIGxlbiwgdWFyZ3MpO1xcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmM9Mzc0Mz1zdGF0aWMgaW50IGlkZW1wb3RlbnRfd2FpdF9mb3JfY29tcGxldGlvbihzdHJ1Y3QgaWRlbXBvdGVudCAqdSlcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM3NTMtXFxua2VybmVsL21vZHVsZS9tYWluLmM6Mzc1NDpzdGF0aWMgaW50IGluaXRfbW9kdWxlX2Zyb21fZmlsZShzdHJ1Y3QgZmlsZSAqZiwgY29uc3QgY2hhciBfX3VzZXIgKiB1YXJncywgaW50IGZsYWdzKVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM3NTUte1xcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMzc5Mi1cXG5rZXJuZWwvbW9kdWxlL21haW4uYzozNzkzOnN0YXRpYyBpbnQgaWRlbXBvdGVudF9pbml0X21vZHVsZShzdHJ1Y3QgZmlsZSAqZiwgY29uc3QgY2hhciBfX3VzZXIgKiB1YXJncywgaW50IGZsYWdzKVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM3OTQte1xcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMzgwMS1cXHRpZiAoIWlkZW1wb3RlbnQoXFx1MDAyNmlkZW0sIGZpbGVfaW5vZGUoZikpKSB7XFxua2VybmVsL21vZHVsZS9tYWluLmM6MzgwMjpcXHRcXHRpbnQgcmV0ID0gaW5pdF9tb2R1bGVfZnJvbV9maWxlKGYsIHVhcmdzLCBmbGFncyk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMzgwMy1cXHRcXHRyZXR1cm4gaWRlbXBvdGVudF9jb21wbGV0ZShcXHUwMDI2aWRlbSwgcmV0KTtcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM4MTEtXFxua2VybmVsL21vZHVsZS9tYWluLmM6MzgxMjpTWVNDQUxMX0RFRklORTMoZmluaXRfbW9kdWxlLCBpbnQsIGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCB1YXJncywgaW50LCBmbGFncylcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zODEzLXtcXG5rZXJuZWwvbW9kdWxlL21haW4uYzozODE0OlxcdGludCBlcnIgPSBtYXlfaW5pdF9tb2R1bGUoKTtcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zODE1LVxcdGlmIChlcnIpXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0zODE3LVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjM4MTg6XFx0cHJfZGVidWcoXFxcImZpbml0X21vZHVsZTogZmQ9JWQsIHVhcmdzPSVwLCBmbGFncz0laVxcXFxuXFxcIiwgZmQsIHVhcmdzLCBmbGFncyk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMzgxOS1cXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM4MjctXFx0XFx0cmV0dXJuIC1FQkFERjtcXG5rZXJuZWwvbW9kdWxlL21haW4uYzozODI4OlxcdHJldHVybiBpZGVtcG90ZW50X2luaXRfbW9kdWxlKGZkX2ZpbGUoZiksIHVhcmdzLCBmbGFncyk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMzgyOS19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQyOjE1LjM2ODg5OTE3OFoiLCJTZXEiOjMzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4NTIxMzM3MDE4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IFRob3VnaHQgUHJvY2VzcyBvbiBJZGVudGlmeWluZyBGdXp6aW5nIFRhcmdldHMqKlxuXG5Pa2F5LCBzbyBJJ20gdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgdGhlIHJpZ2h0IGtlcm5lbCBmdW5jdGlvbnMgdG8gdGFyZ2V0IGZvciBmdXp6aW5nLCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBtb2R1bGUgbG9hZGluZyBhbmQgbWVtb3J5IGFsbG9jYXRpb24gdGFnZ2luZy4gSSBpbml0aWFsbHkgdGhvdWdodCBgZG9faW5pdF9tb2R1bGVgIGFuZCBgbG9hZF9tb2R1bGVgIHdlcmUgdGhlIGtleSBlbnRyeSBwb2ludHMsIGJ1dCBhIHF1aWNrIGNoZWNrIHJldmVhbHMgdGhleSBhcmUgYWN0dWFsbHkgKnN0YXRpYyogZnVuY3Rpb25zLCBhbmQgc28gbm90IHRoZSBiZXN0IGNhbmRpZGF0ZXMuXG5cbk15IG5leHQgdGhvdWdodCB3YXMgdG8gdXNlIHRoZSBzeXNjYWxscyBgc3lzX2luaXRfbW9kdWxlYCBhbmQgYHN5c19maW5pdF9tb2R1bGVgIGJlY2F1c2UgdGhleSBhcmUgZW50cnkgcG9pbnRzLiBBbmQgaW5kZWVkLCBgc3lzX2luaXRfbW9kdWxlYCBpcyBkZWZpbmVkIHVzaW5nIGBTWVNDQUxMX0RFRklORTNgLCBhbmQgc28gdGhlIGFjdHVhbCBmdW5jdGlvbiBuYW1lIGlzIHNvbWV0aGluZyBsaWtlIGBfX3g2NF9zeXNfaW5pdF9tb2R1bGVgLCBidXQgZm9yIHRoZSBwdXJwb3NlcyBvZiBzeXprYWxsZXIsIGBpbml0X21vZHVsZWAgYW5kIGBmaW5pdF9tb2R1bGVgICphcmUqIHRoZSBzeXNjYWxsIG5hbWVzLiBQZXJmZWN0IVxuXG5Ib3dldmVyLCBJIG5lZWQgdG8ga2VlcCBpbiBtaW5kIHRoZSBpbnN0cnVjdGlvbnMuIFRoZXkgZW1waGFzaXplIHRoZSBuZWVkIHRvIGV4dHJhY3QgdmVyeSBzcGVjaWZpYyBmdW5jdGlvbnMgYW5kIGF2b2lkIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zLiBUaGV5IGFsc28gcHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50cyBvdmVyIGludGVybmFsIGhlbHBlciBmdW5jdGlvbnMuXG5cblNvLCBJIHNob3VsZCBkZWZpbml0ZWx5IGluY29ycG9yYXRlIGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYCBhbmQgYGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNgLiBUaGVzZSBzb3VuZCBsaWtlIHRoZXkncmUgcmlnaHQgaW4gdGhlIHN3ZWV0IHNwb3QgZm9yIGZ1enppbmcuIEkgc2hvdWxkIGFsc28gYmUgc3VyZSB0byBpbmNsdWRlIGBNRU1fQUxMT0NfUFJPRklMSU5HYCBpbiBgRW5hYmxlQ29uZmlnc2AuXG5cbk5vdywgSSdtIGNoZWNraW5nIG15IHVuZGVyc3RhbmRpbmcgb2YgaG93IGFsbG9jX3RhZyBpcyBpbXBsZW1lbnRlZC4gTGV0IG1lIHZlcmlmeSB0aGUgY29uZGl0aW9ucyBhcm91bmQgYHRhZ3NfYWRkcmVzc2FibGVgIGFuZCBgbWVtX2FsbG9jX3Byb2ZpbGluZ19lbmFibGVkYC5cblxuTG9va2luZyBhdCBgbW0vYWxsb2NfdGFnLmNgLCBJIHNlZSBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB0aGF0IGNhdWdodCBteSBhdHRlbnRpb24uIEl0IHdhcyBvcmlnaW5hbGx5IGBpZiAobWVtX2FsbG9jX3Byb2ZpbGluZ19lbmFibGVkKCkgXHUwMDI2XHUwMDI2ICF0YWdzX2FkZHJlc3NhYmxlKCkpYCwgYnV0IGhhcyBiZWVuIGNoYW5nZWQgdG8gYGlmICghdGFnc19hZGRyZXNzYWJsZSgpKWAuIEFuZCwgZ29pbmcgZnVydGhlciwgaXQgbG9va3MgbGlrZSBgbG9hZF9tb2R1bGVgIGluIGBtbS9hbGxvY190YWcuY2AgKmlzKiBzdGF0aWMhIEJ1dCB3YWl0LCBpcyBpdCBhY3R1YWxseSBhIGNhbGxiYWNrIGZvciBjb2RldGFnPyBHb2luZyB0aHJvdWdoIHRoZSBjb2RlLCBJIHNlZSB0aGlzOlxuXG5gYGBjXG5cdGlmICghbWVtX3Byb2ZpbGluZ19zdXBwb3J0KVxuXHRcdHJldHVybiAwO1xuYGBgXG5Pa2F5LCBzbyB0aGUgYGxvYWRfbW9kdWxlYCBmdW5jdGlvbiBzZWVtcyB0byBiZSBwYXJ0IG9mIHRoZSBjb2RldGFnIGltcGxlbWVudGF0aW9uLCBidXQgaXQgYWxzbyBoYXMgYSBgbWVtX3Byb2ZpbGluZ19zdXBwb3J0YCB2YXJpYWJsZS4gT2theSwgc28gSSBzaG91bGQgYmUgb2theS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY1MTEsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NTgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDI6MjMuODkwMjM4MjQ2WiIsIlNlcSI6MzQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkzOTIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2FsbG9jX3RhZy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDk3MCxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDk3MDpcXHRcXHRyZXR1cm4gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciArIG9mZnNldCk7XFxuIDk3MTpcXHR9XFxuIDk3MjpcXHRcXG4gOTczOlxcdHN0YXRpYyBpbnQgbG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgY29kZXRhZyAqc3RhcnQsIHN0cnVjdCBjb2RldGFnICpzdG9wKVxcbiA5NzQ6XFx0e1xcbiA5NzU6XFx0XFx0LyogQWxsb2NhdGUgbW9kdWxlIGFsbG9jX3RhZyBwZXJjcHUgY291bnRlcnMgKi9cXG4gOTc2OlxcdFxcdHN0cnVjdCBhbGxvY190YWcgKnN0YXJ0X3RhZztcXG4gOTc3OlxcdFxcdHN0cnVjdCBhbGxvY190YWcgKnN0b3BfdGFnO1xcbiA5Nzg6XFx0XFx0c3RydWN0IGFsbG9jX3RhZyAqdGFnO1xcbiA5Nzk6XFx0XFxuIDk4MDpcXHRcXHRpZiAoIW1lbV9wcm9maWxpbmdfc3VwcG9ydClcXG4gOTgxOlxcdFxcdFxcdHJldHVybiAwO1xcbiA5ODI6XFx0XFxuIDk4MzpcXHRcXHQvKiBwZXJjcHUgY291bnRlcnMgZm9yIGNvcmUgYWxsb2NhdGlvbnMgYXJlIGFscmVhZHkgc3RhdGljYWxseSBhbGxvY2F0ZWQgKi9cXG4gOTg0OlxcdFxcdGlmICghbW9kKVxcbiA5ODU6XFx0XFx0XFx0cmV0dXJuIDA7XFxuIDk4NjpcXHRcXG4gOTg3OlxcdFxcdHN0YXJ0X3RhZyA9IGN0X3RvX2FsbG9jX3RhZyhzdGFydCk7XFxuIDk4ODpcXHRcXHRzdG9wX3RhZyA9IGN0X3RvX2FsbG9jX3RhZyhzdG9wKTtcXG4gOTg5OlxcdFxcdGZvciAodGFnID0gc3RhcnRfdGFnOyB0YWcgXFx1MDAzYyBzdG9wX3RhZzsgdGFnKyspIHtcXG4gOTkwOlxcdFxcdFxcdFdBUk5fT04odGFnLVxcdTAwM2Vjb3VudGVycyk7XFxuIDk5MTpcXHRcXHRcXHR0YWctXFx1MDAzZWNvdW50ZXJzID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBhbGxvY190YWdfY291bnRlcnMpO1xcbiA5OTI6XFx0XFx0XFx0aWYgKCF0YWctXFx1MDAzZWNvdW50ZXJzKSB7XFxuIDk5MzpcXHRcXHRcXHRcXHR3aGlsZSAoLS10YWcgXFx1MDAzZT0gc3RhcnRfdGFnKSB7XFxuIDk5NDpcXHRcXHRcXHRcXHRcXHRmcmVlX3BlcmNwdSh0YWctXFx1MDAzZWNvdW50ZXJzKTtcXG4gOTk1OlxcdFxcdFxcdFxcdFxcdHRhZy1cXHUwMDNlY291bnRlcnMgPSBOVUxMO1xcbiA5OTY6XFx0XFx0XFx0XFx0fVxcbiA5OTc6XFx0XFx0XFx0XFx0cHJfZXJyKFxcXCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhbGxvY2F0aW9uIHRhZyBwZXJjcHUgY291bnRlcnMgaW4gdGhlIG1vZHVsZSAlc1xcXFxuXFxcIixcXG4gOTk4OlxcdFxcdFxcdFxcdCAgICAgICBtb2QtXFx1MDAzZW5hbWUpO1xcbiA5OTk6XFx0XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQyOjIzLjg5MDMzNDczNloiLCJTZXEiOjM1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0OTU4MDY0MTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBNb2R1bGUgTG9hZGluZyBhbmQgQWxsb2NhdGlvbiBUYWdnaW5nKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgYGxvYWRfbW9kdWxlYCB3aXRoaW4gYG1tL2FsbG9jX3RhZy5jYCwgYW5kIGl0J3MgZGVmaW5lZCBhcyBhIHN0YXRpYyBmdW5jdGlvbi4gVGhhdCBpbW1lZGlhdGVseSBtYWtlcyBtZSB0aGluayBhYm91dCBob3cgaXQncyBiZWluZyB1c2VkLiBUaGUgbmV4dCBsb2dpY2FsIHN0ZXAgaXMgdG8gY2hlY2sgaG93IGBhbGxvY190YWdfaW5pdGAgZml0cyBpbnRvIHRoaXMgcGljdHVyZS4gQWgsIHJpZ2h0LCBgYWxsb2NfdGFnX2luaXRgIHJlZ2lzdGVycyBgbG9hZF9tb2R1bGVgIGFzIGEgYC5sb2FkYCBjYWxsYmFjay4gTm93IGl0IGNsaWNrcyDigJMgYGNvZGV0YWdfbG9hZF9tb2R1bGVgIG11c3QgYmUgdGhlIGZ1bmN0aW9uIHRoYXQgKmNhbGxzKiB0aGlzIGAubG9hZGAgY2FsbGJhY2ssIHdoaWNoIGlzIGBsb2FkX21vZHVsZWAgaW4gb3VyIHNwZWNpZmljIGNhc2UuIFRvIGNvbmZpcm0gdGhhdCBjaGFpbiBvZiBjYWxscywgYW5kIGp1c3QgbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgZnVsbCBjb250ZXh0IGhlcmUsIEkgc2hvdWxkIGdvIGFuZCBleGFtaW5lIGBjb2RldGFnX2xvYWRfbW9kdWxlYCBpdHNlbGYuIEknbGwgZmluZCB0aGF0IGluIGBsaWIvY29kZXRhZy5jYC4gTGV0J3Mgc2VlIHdoYXQncyBoYXBwZW5pbmcgdGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4MDg2LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0MjoyOC44NDg0MDE5MTZaIiwiU2VxIjozNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQyOTU5MzA3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvZGV0YWdfbG9hZF9tb2R1bGVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibGliL2NvZGV0YWcuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJsaWIvY29kZXRhZy5jPTMyMj12b2lkIGNvZGV0YWdfbW9kdWxlX3JlcGxhY2VkKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IG1vZHVsZSAqbmV3X21vZClcXG4tLVxcbmxpYi9jb2RldGFnLmMtMzM3LVxcbmxpYi9jb2RldGFnLmM6MzM4OmludCBjb2RldGFnX2xvYWRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZClcXG5saWIvY29kZXRhZy5jLTMzOS17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQyOjI4Ljg5MTM2NTcwM1oiLCJTZXEiOjM3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3MDk0NDE3NjM5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIE1vZHVsZSBMb2FkaW5nIENoYW5nZXMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGVzZSBjaGFuZ2VzIGFuZCBpdCBzZWVtcyBsaWtlIHdlJ3JlIGFkZHJlc3Npbmcgc29tZSByZXRyaWVzIGFuZCBjb25kaXRpb25hbCBiZWhhdmlvciByZWxhdGVkIHRvIG1vZHVsZSBsb2FkaW5nIGFuZCBtZW1vcnkgYWxsb2NhdGlvbi4gRmlyc3QsIEkgbm90aWNlZCBgY29kZXRhZ19sb2FkX21vZHVsZWAgaXMgbm9uLXN0YXRpYywgd2hpY2ggaXMgaW50ZXJlc3RpbmcuIEknbGwgbmVlZCB0byByZW1lbWJlciB0aGF0LiBHaXZlbiB0aGF0IGl0J3Mgbm9uLXN0YXRpYywgSSBzaG91bGQgYWRkIGl0IHRvIHRoZSBgRm9jdXNTeW1ib2xzYCBsaXN0LlxuXG5Ob3csIGxldCdzIGJyZWFrIGRvd24gdGhlIGFjdHVhbCBjb2RlIG1vZGlmaWNhdGlvbnM6XG5cbjEuICBJbiBga2VybmVsL21vZHVsZS9tYWluLmNgLCB0aGUgYGxheW91dF9hbmRfYWxsb2NhdGVgIGZ1bmN0aW9uIGlzIGJlaW5nIHVwZGF0ZWQgdG8gcmV0cnkgaWYgYG1vdmVfbW9kdWxlYCByZXR1cm5zIGAtRUFHQUlOYC4gVGhpcyBzdWdnZXN0cyB3ZSdyZSBkZWFsaW5nIHdpdGggYSByZXNvdXJjZSBjb250ZW50aW9uIGlzc3VlIGR1cmluZyBtb2R1bGUgcmVsb2NhdGlvbiBvciBhbGxvY2F0aW9uLCBhbmQgYSByZXRyeSBtZWNoYW5pc20gaXMgYmVpbmcgcHV0IGluIHBsYWNlIHRvIGhhbmRsZSB0cmFuc2llbnQgZmFpbHVyZXMuIEl0IHNlZW1zIGxpa2UgYSBzZW5zaWJsZSBhZGRpdGlvbiB0byBpbXByb3ZlIHJvYnVzdG5lc3MuXG5cbjIuICBgbW0vYWxsb2NfdGFnLmNgIG5vdyBoYXMgYHJlc2VydmVfbW9kdWxlX3RhZ3NgIHJldHVybmluZyBgLUVBR0FJTmAgaWYgYCF0YWdzX2FkZHJlc3NhYmxlKClgLiBUaGlzIGltcGxpZXMgdGhhdCB0aGUgbWVtb3J5IHRhZ2dpbmcgZnVuY3Rpb25hbGl0eSBtaWdodCBub3QgYmUgYXZhaWxhYmxlIGluIHNvbWUgc2l0dWF0aW9ucywgYW5kIHRoZSBmdW5jdGlvbiBub3cgZXhwbGljaXRseSBzaWduYWxzIHRoaXMgY29uZGl0aW9uIGFzIGEgdGVtcG9yYXJ5IGZhaWx1cmUsIGFsbG93aW5nIGZvciByZXRyaWVzLlxuXG4zLiAgQWxzbyBpbiBgbW0vYWxsb2NfdGFnLmNgLCBgbG9hZF9tb2R1bGVgIG5vdyByZXR1cm5zIDAgaWYgYCFtZW1fcHJvZmlsaW5nX3N1cHBvcnRgLiBTbywgdGhlIG1vZHVsZSBsb2FkIHN1Y2NlZWRzICp3aXRob3V0KiBwcm9maWxpbmcgc3VwcG9ydD8gVGhpcyBzZWVtcyBsaWtlIGEgZ3JhY2VmdWwgZmFsbGJhY2ssIGluZGljYXRpbmcgdGhlIHN5c3RlbSBjYW4gY29udGludWUgb3BlcmF0aW5nLCBhbGJlaXQgd2l0aCByZWR1Y2VkIGZ1bmN0aW9uYWxpdHkuXG5cbjQuICBGaW5hbGx5LCBgcmVsZWFzZV9tb2R1bGVfdGFnc2AgaW4gYG1tL2FsbG9jX3RhZy5jYCBoYXMgYmVlbiBhZGp1c3RlZCB0byBoYW5kbGUgdGhlIGAhdXNlZGAgY2FzZS4gVGhpcyBpcyBhIGRlZmVuc2l2ZSBwcm9ncmFtbWluZyBtZWFzdXJlLCBhZGRyZXNzaW5nIHBvdGVudGlhbCBlZGdlIGNhc2VzIHdoZXJlIHRoZSBtb2R1bGUgdGFncyBtaWdodCBiZSByZWxlYXNlZCBwcmVtYXR1cmVseSBvciBpbiBhbiB1bmV4cGVjdGVkIHN0YXRlLiBUaGlzIHNob3dzIGNhcmVmdWwgYXR0ZW50aW9uIHRvIGRldGFpbC5cblxuVGhlIG92ZXJhbGwgY29udGV4dCBoZXJlIGlzIHRoYXQgdGhlc2UgY2hhbmdlcyBhcmUgZHJpdmVuIGJ5IHRoZSBgTUVNX0FMTE9DX1BST0ZJTElOR2AgY29uZmlnIG9wdGlvbi4gSSd2ZSBub3RlZCB0aGF0IGBGb2N1c1N5bWJvbHNgIHNob3VsZCBpbmNsdWRlIGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYCwgYGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNgLCBhbmQgYGNvZGV0YWdfbG9hZF9tb2R1bGVgLCBhcyBleHBlY3RlZC4gV2FpdC4uLiBgY29kZXRhZ191bmxvYWRfbW9kdWxlYCBpcyBpbiB0aGUgRm9jdXNTeW1ib2xzIGxpc3QgYXMgd2VsbD8gSSBiZXR0ZXIgZG91YmxlLWNoZWNrIHRoYXQgb25lIGZvciBhbnkgZnVydGhlciBpbXBsaWNhdGlvbnMgaW4gdGhlIGNvZGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4NDg2LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjM5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQyOjM1Ljk4NTc4NTg2MloiLCJTZXEiOjM4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjE2MjQzMzc3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvZGV0YWdfdW5sb2FkX21vZHVsZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJsaWIvY29kZXRhZy5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImxpYi9jb2RldGFnLmM9MzM4PWludCBjb2RldGFnX2xvYWRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZClcXG4tLVxcbmxpYi9jb2RldGFnLmMtMzU2LVxcbmxpYi9jb2RldGFnLmM6MzU3OnZvaWQgY29kZXRhZ191bmxvYWRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZClcXG5saWIvY29kZXRhZy5jLTM1OC17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQyOjM2LjYwMjA1Mzg0OVoiLCJTZXEiOjM5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo5NTU5MDIxNjQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTW9kdWxlIExvYWRpbmcgTG9naWMgYW5kIE1lbW9yeSBBbGxvY2F0aW9uIFByb2ZpbGluZyoqXG5cbk9rYXksIHNvIGBjb2RldGFnX3VubG9hZF9tb2R1bGVgIGlzIGRlZmluaXRlbHkgcHJlc2VudCwgdGhhdCdzIGEgZ29vZCBzdGFydGluZyBwb2ludC4gTm93LCBJIG5lZWQgdG8gY2hlY2sgdGhlIGRlcGVuZGVuY2llcyBmb3IgYE1FTV9BTExPQ19QUk9GSUxJTkdgIHRvIGVuc3VyZSBldmVyeXRoaW5nIGlzIGluIHBsYWNlLiBMb29raW5nIGF0IGBtbS9LY29uZmlnLmRlYnVnYCwgaXQgZGVwZW5kcyBvbiBgTU1VYCwgYFBST0NfRlNgLCBhbmQgYCFERUJVR19GT1JDRV9XRUFLX1BFUl9DUFVgLCBhbmQgc2VsZWN0cyBgQ09ERV9UQUdHSU5HYCwgYFBBR0VfRVhURU5TSU9OYCwgYW5kIGBTTEFCX09CSl9FWFRgLiBUaG9zZSBhbGwgc2VlbSByZWFzb25hYmxlOyBgTU1VYCBhbmQgYFBST0NfRlNgIGFyZSBwcmV0dHkgc3RhbmRhcmQsIGFuZCB0aGUgYCFERUJVR19GT1JDRV9XRUFLX1BFUl9DUFVgIGRlcGVuZGVuY3kgaXMgZmluZS4gU28sIGBNRU1fQUxMT0NfUFJPRklMSU5HYCBsb29rcyB0byBiZSBhIHNlbGYtY29udGFpbmVkIGZlYXR1cmUuXG5cbkxldCBtZSByZWNhcCBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBwYXRjaCdzIHB1cnBvc2UuIEl0J3MgaGFuZGxpbmcgYSBzcGVjaWZpYyBzaXR1YXRpb246IHdoZW4gbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIGV4aGF1c3RzIHRoZSBhdmFpbGFibGUgcGFnZSBmbGFnIGJpdHMgKGAhdGFnc19hZGRyZXNzYWJsZSgpYCkuIFRoZSBmaXggaW50cm9kdWNlcyBhIHJldHJ5IGluIGBsYXlvdXRfYW5kX2FsbG9jYXRlKClgLCB3aGljaCByZXNldHMgdGhlIG1vZHVsZSBzdGF0ZSBhbmQgcmV0cmllcyB0aGUgbW9kdWxlIGxvYWQgd2l0aG91dCBtZW1vcnkgcHJvZmlsaW5nLiBUaGlzIGNoYW5nZSBpcyBkaXJlY3RseSBhZmZlY3RpbmcgdGhlIGNvcmUgbW9kdWxlIGxvYWRpbmcgcGF0aCBhbmQgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHRhZ2dpbmcgc3lzdGVtLCB3aGljaCB1c2Vyc3BhY2UgaW50ZXJhY3RzIHdpdGggdmlhIGBpbml0X21vZHVsZWAgYW5kIGBmaW5pdF9tb2R1bGVgIHN5c2NhbGxzLiBUaGlzIG1ha2VzIHRoaXMgYW4gaW50ZXJlc3RpbmcgdGFyZ2V0IGZvciB0ZXN0aW5nLlxuXG5UaGUga2V5IHN5bWJvbHMgdG8gZm9jdXMgb24gYXJlIGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYCwgYGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNgLCBgY29kZXRhZ19sb2FkX21vZHVsZWAsIGFuZCwgb2YgY291cnNlLCBgY29kZXRhZ191bmxvYWRfbW9kdWxlYC4gVGhlIHByaW1hcnkgY29uZmlndXJhdGlvbiBJIG5lZWQgdG8gYmUgY29uY2VybmVkIHdpdGggaXMgYE1FTV9BTExPQ19QUk9GSUxJTkdgLiBgTU9EVUxFU2AgaXMgYW4gb2J2aW91cyBwcmVyZXF1aXNpdGUsIGJ1dCB0aGF0J3MgYSBiYXNlbGluZSByZXF1aXJlbWVudCBmb3IgYW55IG1vZHVsZSB3b3JrLlxuXG5JJ2xsIGRvdWJsZSBjaGVjayB0aGF0IGBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uYCBpc24ndCBzdGF0aWMuIEl0J3Mgbm90LCB3aGljaCBpcyBleGFjdGx5IHdoYXQgSSB3YXMgaG9waW5nIGZvci4gVGhhdCBtZWFucyBzeXprYWxsZXIgc2hvdWxkIGJlIGFibGUgdG8gZGlyZWN0bHkgdGFyZ2V0IGl0IGlmIGl0J3MgaW4gdGhlIGtlcm5lbCBpbWFnZS5cblxuRmluYWxseSwgSSBuZWVkIHRvIGVuc3VyZSB0aGF0IG5vIG90aGVyIG5vbi1zdGF0aWMgZnVuY3Rpb25zIHdlcmUgYWRkZWQgb3IgbW9kaWZpZWQuIEl0IHNlZW1zIHRoYXQgb25seSBzdGF0aWMgZnVuY3Rpb25zIGluIGBtbS9hbGxvY190YWcuY2AgYW5kIGBrZXJuZWwvbW9kdWxlL21haW4uY2Agd2VyZSBjaGFuZ2VkLCBidXQgdGhvc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgYnkgdGhlIGBjb2RldGFnXypgIGZ1bmN0aW9ucyBJIGlkZW50aWZpZWQsIHNvIHRoYXQgc2VlbXMgb2suXG5cbkkgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZm9ybXVsYXRlIHRoZSBzZXQtcmVzdWx0cyBjYWxsLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTMzNSwiT3V0cHV0VG9rZW5zIjoxNjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NzgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDI6NDYuMTYxMDc3OTQ0WiIsIlNlcSI6NDAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzM1OTI0NzUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTV9BTExPQ19QUk9GSUxJTkdcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uXCIsXG4gICAgXCJjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zXCIsXG4gICAgXCJjb2RldGFnX2xvYWRfbW9kdWxlXCIsXG4gICAgXCJjb2RldGFnX3VubG9hZF9tb2R1bGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgY29yZSBtb2R1bGUgbG9hZGluZyBsb2dpYyB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHJ1bnMgb3V0IG9mIHBhZ2UgZmxhZyBiaXRzICghdGFnc19hZGRyZXNzYWJsZSgpKS4gSXQgaW50cm9kdWNlcyBhIHJldHJ5IG1lY2hhbmlzbSBpbiBsYXlvdXRfYW5kX2FsbG9jYXRlKCkgdGhhdCByZXNldHMgdGhlIG1vZHVsZSBzdGF0ZSBhbmQgcmV0cmllcyBsb2FkaW5nIHdpdGhvdXQgbWVtb3J5IHByb2ZpbGluZy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIG1vZHVsZSBsb2FkaW5nIHBhdGggYW5kIG1lbW9yeSBhbGxvY2F0aW9uIHRhZ2dpbmcgc3Vic3lzdGVtLCB3aGljaCBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIGluaXRfbW9kdWxlIGFuZCBmaW5pdF9tb2R1bGUgc3lzY2FsbHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNX0FMTE9DX1BST0ZJTElOR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25cIixcbiAgICBcImNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNcIixcbiAgICBcImNvZGV0YWdfbG9hZF9tb2R1bGVcIixcbiAgICBcImNvZGV0YWdfdW5sb2FkX21vZHVsZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBjb3JlIG1vZHVsZSBsb2FkaW5nIGxvZ2ljIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgcnVucyBvdXQgb2YgcGFnZSBmbGFnIGJpdHMgKCF0YWdzX2FkZHJlc3NhYmxlKCkpLiBJdCBpbnRyb2R1Y2VzIGEgcmV0cnkgbWVjaGFuaXNtIGluIGxheW91dF9hbmRfYWxsb2NhdGUoKSB0aGF0IHJlc2V0cyB0aGUgbW9kdWxlIHN0YXRlIGFuZCByZXRyaWVzIGxvYWRpbmcgd2l0aG91dCBtZW1vcnkgcHJvZmlsaW5nLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgbW9kdWxlIGxvYWRpbmcgcGF0aCBhbmQgbWVtb3J5IGFsbG9jYXRpb24gdGFnZ2luZyBzdWJzeXN0ZW0sIHdoaWNoIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgaW5pdF9tb2R1bGUgYW5kIGZpbml0X21vZHVsZSBzeXNjYWxscy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDI6NDYuMjM0Njc3MDY5WiIsIlNlcSI6NDEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTA4NzQ5NDg0NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0Mjo0Ni4yMzUyMTUxMzlaIiwiU2VxIjo0MiwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MTUwODc0NDA3NTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgbW9kdWxlIGxvYWRpbmcgcHJvY2VzcyB0byBoYW5kbGUgY2FzZXMgd2hlcmUgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHRhZ3MgZXhjZWVkIGF2YWlsYWJsZSBwYWdlIGZsYWcgYml0cy4gSXQgaW50cm9kdWNlcyBhIHJldHJ5IG1lY2hhbmlzbSBpbiBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAgdGhhdCByZXNldHMgc2VjdGlvbiBoZWFkZXJzIGFuZCBzaXplcywgYW5kIHJldHJpZXMgdGhlIGFsbG9jYXRpb24gd2l0aG91dCBwcm9maWxpbmcuIFRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBtb2R1bGVzIGlzIGV4cGxpY2l0bHkgemVyb2VkIGJ5IGBtb2R1bGVfbWVtb3J5X2FsbG9jYCAodmlhIGBtZW1zZXQocHRyLCAwLCBzaXplKWApLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIGFueSBuZXcgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlcnNwYWNlLCBub3IgZG8gdGhleSBhZGQgY29tcGxleCBjb25kaXRpb25hbCBsb2dpYyBkZXBlbmRpbmcgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggKGUuZy4sIGluY29ycmVjdCBzaXplIGNhbGN1bGF0aW9ucywgbWVtb3J5IGxlYWtzLCBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIGR1cmluZyBzZWN0aW9uIGNvcHlpbmcpIHdvdWxkIGJlIHJlbGlhYmx5IGNhdWdodCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyB0b29scy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgbmVjZXNzaXRhdGUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDZmOWZmNWNlMzU0YzU0YjJmNmY3NWQ5MmZiNTZlMjdjY2E5N2ZkNzBcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEF1ZyAxMCAxMDozODoxNCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9tb2R1bGUvbWFpbi5jIGIva2VybmVsL21vZHVsZS9tYWluLmNcbmluZGV4IDQ2ZGQ4ZDI1YTYwNTguLmMzMmJiNDdhNTczYTEgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvbW9kdWxlL21haW4uY1xuKysrIGIva2VybmVsL21vZHVsZS9tYWluLmNcbkBAIC0yOTcxLDEzICsyOTcxLDI2IEBAIHN0YXRpYyBzdHJ1Y3QgbW9kdWxlICpsYXlvdXRfYW5kX2FsbG9jYXRlKHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGludCBmbGFncylcbiBcdCAqIHRoaXMgaXMgZG9uZSBnZW5lcmljYWxseTsgdGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYW55XG4gXHQgKiBzcGVjaWFsIGNhc2VzIGZvciB0aGUgYXJjaGl0ZWN0dXJlcy5cbiBcdCAqL1xuK3JldHJ5OlxuIFx0bGF5b3V0X3NlY3Rpb25zKGluZm8tXHUwMDNlbW9kLCBpbmZvKTtcbiBcdGxheW91dF9zeW10YWIoaW5mby1cdTAwM2Vtb2QsIGluZm8pO1xuIFxuIFx0LyogQWxsb2NhdGUgYW5kIG1vdmUgdG8gdGhlIGZpbmFsIHBsYWNlICovXG4gXHRlcnIgPSBtb3ZlX21vZHVsZShpbmZvLVx1MDAzZW1vZCwgaW5mbyk7XG4tXHRpZiAoZXJyKVxuLVx0XHRyZXR1cm4gRVJSX1BUUihlcnIpO1xuK1x0aWYgKGVycikge1xuK1x0XHRpZiAoZXJyICE9IC1FQUdBSU4pXG4rXHRcdFx0cmV0dXJuIEVSUl9QVFIoZXJyKTtcbitcdFx0LypcbitcdFx0ICogLUVBR0FJTiBtZWFucyBwcm9maWxpbmcgd2FzIGRpc2FibGVkIGJ1dCB0aGUgbW9kdWxlXG4rXHRcdCAqIGNhbiBzdGlsbCBsb2FkIHdpdGhvdXQgaXQuIFJlc2V0IHN0YXRlIGFuZCByZXRyeS5cbitcdFx0ICovXG4rXHRcdHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzKGluZm8sIGZsYWdzKTtcbitcdFx0Zm9yX2VhY2hfbW9kX21lbV90eXBlKHR5cGUpXG4rXHRcdFx0aW5mby1cdTAwM2Vtb2QtXHUwMDNlbWVtW3R5cGVdLnNpemUgPSAwO1xuK1x0XHRpbmZvLVx1MDAzZXNlY2hkcnNbaW5mby1cdTAwM2VpbmRleC5zeW1dLnNoX2ZsYWdzIFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcbitcdFx0aW5mby1cdTAwM2VzZWNoZHJzW2luZm8tXHUwMDNlaW5kZXguc3RyXS5zaF9mbGFncyBcdTAwMjY9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7XG4rXHRcdGdvdG8gcmV0cnk7XG4rXHR9XG4gXG4gXHQvKiBNb2R1bGUgaGFzIGJlZW4gY29waWVkIHRvIGl0cyBmaW5hbCBwbGFjZSBub3c6IHJldHVybiBpdC4gKi9cbiBcdG1vZCA9ICh2b2lkICopaW5mby1cdTAwM2VzZWNoZHJzW2luZm8tXHUwMDNlaW5kZXgubW9kXS5zaF9hZGRyO1xuZGlmZiAtLWdpdCBhL21tL2FsbG9jX3RhZy5jIGIvbW0vYWxsb2NfdGFnLmNcbmluZGV4IDUyYWVjZTI3YjAwZTAuLjNlYmE2MzMxMTc0ZGEgMTAwNjQ0XG4tLS0gYS9tbS9hbGxvY190YWcuY1xuKysrIGIvbW0vYWxsb2NfdGFnLmNcbkBAIC04MzUsNiArODM1LDUyIEBAIHN0YXRpYyBpbnQgdm1fbW9kdWxlX3RhZ3NfcG9wdWxhdGUodm9pZClcbiBcdHJldHVybiAwO1xuIH1cbiBcbitzdGF0aWMgdm9pZCByZWxlYXNlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgYm9vbCB1c2VkKVxuK3tcbitcdE1BX1NUQVRFKG1hcywgXHUwMDI2bW9kX2FyZWFfbXQsIG1vZHVsZV90YWdzLnNpemUsIG1vZHVsZV90YWdzLnNpemUpO1xuK1x0c3RydWN0IGFsbG9jX3RhZyAqc3RhcnRfdGFnO1xuK1x0c3RydWN0IGFsbG9jX3RhZyAqZW5kX3RhZztcbitcdHN0cnVjdCBtb2R1bGUgKnZhbDtcbitcbitcdG1hc19sb2NrKFx1MDAyNm1hcyk7XG4rXHRtYXNfZm9yX2VhY2hfcmV2KFx1MDAyNm1hcywgdmFsLCAwKVxuK1x0XHRpZiAodmFsID09IG1vZClcbitcdFx0XHRicmVhaztcbitcbitcdGlmICghdmFsKSAvKiBtb2R1bGUgbm90IGZvdW5kICovXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKCF1c2VkKVxuK1x0XHRnb3RvIHJlbGVhc2VfYXJlYTtcbitcbitcdHN0YXJ0X3RhZyA9IChzdHJ1Y3QgYWxsb2NfdGFnICopKG1vZHVsZV90YWdzLnN0YXJ0X2FkZHIgKyBtYXMuaW5kZXgpO1xuK1x0ZW5kX3RhZyA9IChzdHJ1Y3QgYWxsb2NfdGFnICopKG1vZHVsZV90YWdzLnN0YXJ0X2FkZHIgKyBtYXMubGFzdCk7XG4rXHRpZiAoIWNsZWFuX3VudXNlZF9jb3VudGVycyhzdGFydF90YWcsIGVuZF90YWcpKSB7XG4rXHRcdHN0cnVjdCBhbGxvY190YWcgKnRhZztcbitcbitcdFx0Zm9yICh0YWcgPSBzdGFydF90YWc7IHRhZyBcdTAwM2M9IGVuZF90YWc7IHRhZysrKSB7XG4rXHRcdFx0c3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyBjb3VudGVyO1xuK1xuK1x0XHRcdGlmICghdGFnLVx1MDAzZWNvdW50ZXJzKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXG4rXHRcdFx0Y291bnRlciA9IGFsbG9jX3RhZ19yZWFkKHRhZyk7XG4rXHRcdFx0cHJfaW5mbyhcIiVzOiV1IG1vZHVsZSAlcyBmdW5jOiVzIGhhcyAlbGx1IGFsbG9jYXRlZCBhdCBtb2R1bGUgdW5sb2FkXFxuXCIsXG4rXHRcdFx0XHR0YWctXHUwMDNlY3QuZmlsZW5hbWUsIHRhZy1cdTAwM2VjdC5saW5lbm8sIHRhZy1cdTAwM2VjdC5tb2RuYW1lLFxuK1x0XHRcdFx0dGFnLVx1MDAzZWN0LmZ1bmN0aW9uLCBjb3VudGVyLmJ5dGVzKTtcbitcdFx0fVxuK1x0fSBlbHNlIHtcbitcdFx0dXNlZCA9IGZhbHNlO1xuK1x0fVxuK3JlbGVhc2VfYXJlYTpcbitcdG1hc19zdG9yZShcdTAwMjZtYXMsIHVzZWQgPyBcdTAwMjZ1bmxvYWRlZF9tb2QgOiBOVUxMKTtcbitcdHZhbCA9IG1hc19wcmV2X3JhbmdlKFx1MDAyNm1hcywgMCk7XG4rXHRpZiAodmFsID09IFx1MDAyNnByZXBlbmRfbW9kKVxuK1x0XHRtYXNfc3RvcmUoXHUwMDI2bWFzLCBOVUxMKTtcbitvdXQ6XG4rXHRtYXNfdW5sb2NrKFx1MDAyNm1hcyk7XG4rfVxuK1xuIHN0YXRpYyB2b2lkICpyZXNlcnZlX21vZHVsZV90YWdzKHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWduZWQgbG9uZyBzaXplLFxuIFx0XHRcdFx0IHVuc2lnbmVkIGludCBwcmVwZW5kLCB1bnNpZ25lZCBsb25nIGFsaWduKVxuIHtcbkBAIC05MDQsMTAgKzk1MCwxMiBAQCBzdGF0aWMgdm9pZCAqcmVzZXJ2ZV9tb2R1bGVfdGFncyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbiBcdFx0aW50IGdyb3dfcmVzO1xuIFxuIFx0XHRtb2R1bGVfdGFncy5zaXplID0gb2Zmc2V0ICsgc2l6ZTtcbi1cdFx0aWYgKG1lbV9hbGxvY19wcm9maWxpbmdfZW5hYmxlZCgpIFx1MDAyNlx1MDAyNiAhdGFnc19hZGRyZXNzYWJsZSgpKSB7XG4rXHRcdGlmICghdGFnc19hZGRyZXNzYWJsZSgpKSB7XG4gXHRcdFx0c2h1dGRvd25fbWVtX3Byb2ZpbGluZyh0cnVlKTtcbi1cdFx0XHRwcl93YXJuKFwiV2l0aCBtb2R1bGUgJXMgdGhlcmUgYXJlIHRvbyBtYW55IHRhZ3MgdG8gZml0IGluICVkIHBhZ2UgZmxhZyBiaXRzLiBNZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgaXMgZGlzYWJsZWQhXFxuXCIsXG4tXHRcdFx0XHRtb2QtXHUwMDNlbmFtZSwgTlJfVU5VU0VEX1BBR0VGTEFHX0JJVFMpO1xuK1x0XHRcdHByX3dhcm5fb25jZShcIldpdGggbW9kdWxlICVzIHRoZXJlIGFyZSB0b28gbWFueSB0YWdzIHRvIGZpdCBpbiAlZCBwYWdlIGZsYWcgYml0cy4gTWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIGlzIGRpc2FibGVkIVxcblwiLFxuK1x0XHRcdFx0ICAgICBtb2QtXHUwMDNlbmFtZSwgTlJfVU5VU0VEX1BBR0VGTEFHX0JJVFMpO1xuK1x0XHRcdHJlbGVhc2VfbW9kdWxlX3RhZ3MobW9kLCBmYWxzZSk7XG4rXHRcdFx0cmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7XG4gXHRcdH1cbiBcbiBcdFx0Z3Jvd19yZXMgPSB2bV9tb2R1bGVfdGFnc19wb3B1bGF0ZSgpO1xuQEAgLTkyMiw1MiArOTcwLDYgQEAgc3RhdGljIHZvaWQgKnJlc2VydmVfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBsb25nIHNpemUsXG4gXHRyZXR1cm4gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciArIG9mZnNldCk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIHJlbGVhc2VfbW9kdWxlX3RhZ3Moc3RydWN0IG1vZHVsZSAqbW9kLCBib29sIHVzZWQpXG4te1xuLVx0TUFfU1RBVEUobWFzLCBcdTAwMjZtb2RfYXJlYV9tdCwgbW9kdWxlX3RhZ3Muc2l6ZSwgbW9kdWxlX3RhZ3Muc2l6ZSk7XG4tXHRzdHJ1Y3QgYWxsb2NfdGFnICpzdGFydF90YWc7XG4tXHRzdHJ1Y3QgYWxsb2NfdGFnICplbmRfdGFnO1xuLVx0c3RydWN0IG1vZHVsZSAqdmFsO1xuLVxuLVx0bWFzX2xvY2soXHUwMDI2bWFzKTtcbi1cdG1hc19mb3JfZWFjaF9yZXYoXHUwMDI2bWFzLCB2YWwsIDApXG4tXHRcdGlmICh2YWwgPT0gbW9kKVxuLVx0XHRcdGJyZWFrO1xuLVxuLVx0aWYgKCF2YWwpIC8qIG1vZHVsZSBub3QgZm91bmQgKi9cbi1cdFx0Z290byBvdXQ7XG4tXG4tXHRpZiAoIXVzZWQpXG4tXHRcdGdvdG8gcmVsZWFzZV9hcmVhO1xuLVxuLVx0c3RhcnRfdGFnID0gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciArIG1hcy5pbmRleCk7XG4tXHRlbmRfdGFnID0gKHN0cnVjdCBhbGxvY190YWcgKikobW9kdWxlX3RhZ3Muc3RhcnRfYWRkciArIG1hcy5sYXN0KTtcbi1cdGlmICghY2xlYW5fdW51c2VkX2NvdW50ZXJzKHN0YXJ0X3RhZywgZW5kX3RhZykpIHtcbi1cdFx0c3RydWN0IGFsbG9jX3RhZyAqdGFnO1xuLVxuLVx0XHRmb3IgKHRhZyA9IHN0YXJ0X3RhZzsgdGFnIFx1MDAzYz0gZW5kX3RhZzsgdGFnKyspIHtcbi1cdFx0XHRzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzIGNvdW50ZXI7XG4tXG4tXHRcdFx0aWYgKCF0YWctXHUwMDNlY291bnRlcnMpXG4tXHRcdFx0XHRjb250aW51ZTtcbi1cbi1cdFx0XHRjb3VudGVyID0gYWxsb2NfdGFnX3JlYWQodGFnKTtcbi1cdFx0XHRwcl9pbmZvKFwiJXM6JXUgbW9kdWxlICVzIGZ1bmM6JXMgaGFzICVsbHUgYWxsb2NhdGVkIGF0IG1vZHVsZSB1bmxvYWRcXG5cIixcbi1cdFx0XHRcdHRhZy1cdTAwM2VjdC5maWxlbmFtZSwgdGFnLVx1MDAzZWN0LmxpbmVubywgdGFnLVx1MDAzZWN0Lm1vZG5hbWUsXG4tXHRcdFx0XHR0YWctXHUwMDNlY3QuZnVuY3Rpb24sIGNvdW50ZXIuYnl0ZXMpO1xuLVx0XHR9XG4tXHR9IGVsc2Uge1xuLVx0XHR1c2VkID0gZmFsc2U7XG4tXHR9XG4tcmVsZWFzZV9hcmVhOlxuLVx0bWFzX3N0b3JlKFx1MDAyNm1hcywgdXNlZCA/IFx1MDAyNnVubG9hZGVkX21vZCA6IE5VTEwpO1xuLVx0dmFsID0gbWFzX3ByZXZfcmFuZ2UoXHUwMDI2bWFzLCAwKTtcbi1cdGlmICh2YWwgPT0gXHUwMDI2cHJlcGVuZF9tb2QpXG4tXHRcdG1hc19zdG9yZShcdTAwMjZtYXMsIE5VTEwpO1xuLW91dDpcbi1cdG1hc191bmxvY2soXHUwMDI2bWFzKTtcbi19XG4tXG4gc3RhdGljIGludCBsb2FkX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBjb2RldGFnICpzdGFydCwgc3RydWN0IGNvZGV0YWcgKnN0b3ApXG4ge1xuIFx0LyogQWxsb2NhdGUgbW9kdWxlIGFsbG9jX3RhZyBwZXJjcHUgY291bnRlcnMgKi9cbkBAIC05NzUsNiArOTc3LDkgQEAgc3RhdGljIGludCBsb2FkX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBjb2RldGFnICpzdGFydCwgc3RydWN0IGNvZGV0YWdcbiBcdHN0cnVjdCBhbGxvY190YWcgKnN0b3BfdGFnO1xuIFx0c3RydWN0IGFsbG9jX3RhZyAqdGFnO1xuIFxuK1x0aWYgKCFtZW1fcHJvZmlsaW5nX3N1cHBvcnQpXG4rXHRcdHJldHVybiAwO1xuK1xuIFx0LyogcGVyY3B1IGNvdW50ZXJzIGZvciBjb3JlIGFsbG9jYXRpb25zIGFyZSBhbHJlYWR5IHN0YXRpY2FsbHkgYWxsb2NhdGVkICovXG4gXHRpZiAoIW1vZClcbiBcdFx0cmV0dXJuIDA7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0Mjo0Ni4yMzUyMTYyMTlaIiwiU2VxIjo0MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODQ1NjM5OTg3MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBLZXJuZWwgTW9kdWxlIFBhdGNoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCB0aGF0IHR3ZWFrcyBob3cga2VybmVsIG1vZHVsZXMgYXJlIGxvYWRlZC4gSXQncyB0b3VjaGluZyBga2VybmVsL21vZHVsZS9tYWluLmNgIGFuZCBgbW0vYWxsb2NfdGFnLmNgLCB3aGljaCBpbW1lZGlhdGVseSBmbGFncyBteSBhdHRlbnRpb24uIFNwZWNpZmljYWxseSwgdGhlIHJldHJ5IGxvb3AgYWRkZWQgaW4gYGxheW91dF9hbmRfYWxsb2NhdGVgIHdpdGhpbiBga2VybmVsL21vZHVsZS9tYWluLmNgIGlzIHRoZSBrZXkgcG9pbnQuIElmIGBtb3ZlX21vZHVsZWAgcmV0dXJucyBgLUVBR0FJTmAsIGl0J3MgcmVzZXR0aW5nIHNvbWUgbW9kdWxlIHN0YXRlIGFuZCB0cnlpbmcgYWdhaW4uIFRoaXMgc2NyZWFtcyBcInBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UsXCIgYW5kIEknbSBrZWVuIHRvIGludmVzdGlnYXRlIHRoYXQuXG5cbkluIGBtbS9hbGxvY190YWcuY2AsIHRoZXkndmUgbW92ZWQgYHJlbGVhc2VfbW9kdWxlX3RhZ3NgIGFuZCBjaGFuZ2VkIGByZXNlcnZlX21vZHVsZV90YWdzYCB0byByZXR1cm4gYEVSUl9QVFIoLUVBR0FJTilgIGlmIGAhdGFnc19hZGRyZXNzYWJsZSgpYC4gVGhleSd2ZSBhbHNvIGFkZGVkIGEgY2hlY2sgZm9yIGAhbWVtX3Byb2ZpbGluZ19zdXBwb3J0YCBpbiBgbG9hZF9tb2R1bGVgLiBUaGVzZSBjaGFuZ2VzIGFyZSBpbnRlcmVzdGluZyBidXQgdGhlIHJldHJ5IGxvb3AgaXMgbXkgcHJpbWFyeSBjb25jZXJuLlxuXG5MZXQncyBkaXZlIGludG8gdGhhdCByZXRyeSBsb29wIGluIGBsYXlvdXRfYW5kX2FsbG9jYXRlYDpcblxuYGBgY1xucmV0cnk6XG5cdGxheW91dF9zZWN0aW9ucyhpbmZvLVx1MDAzZW1vZCwgaW5mbyk7XG5cdGxheW91dF9zeW10YWIoaW5mby1cdTAwM2Vtb2QsIGluZm8pO1xuXG5cdC8qIEFsbG9jYXRlIGFuZCBtb3ZlIHRvIHRoZSBmaW5hbCBwbGFjZSAqL1xuXHRlcnIgPSBtb3ZlX21vZHVsZShpbmZvLVx1MDAzZW1vZCwgaW5mbyk7XG5cdGlmIChlcnIpIHtcblx0XHRpZiAoZXJyICE9IC1FQUdBSU4pXG5cdFx0XHRyZXR1cm4gRVJSX1BUUihlcnIpO1xuXHRcdC8qXG5cdFx0ICogLUVBR0FJTiBtZWFucyBwcm9maWxpbmcgd2FzIGRpc2FibGVkIGJ1dCB0aGUgbW9kdWxlXG5cdFx0ICogY2FuIHN0aWxsIGxvYWQgd2l0aG91dCBpdC4gUmVzZXQgc3RhdGUgYW5kIHJldHJ5LlxuXHRcdCAqL1xuXHRcdHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzKGluZm8sIGZsYWdzKTtcblx0XHRmb3JfZWFjaF9tb2RfbWVtX3R5cGUodHlwZSlcblx0XHRcdGluZm8tXHUwMDNlbW9kLVx1MDAzZW1lbVt0eXBlXS5zaXplID0gMDtcblx0XHRpbmZvLVx1MDAzZXNlY2hkcnNbaW5mby1cdTAwM2VpbmRleC5zeW1dLnNoX2ZsYWdzIFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcblx0XHRpbmZvLVx1MDAzZXNlY2hkcnNbaW5mby1cdTAwM2VpbmRleC5zdHJdLnNoX2ZsYWdzIFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcblx0XHRnb3RvIHJldHJ5O1xuXHR9XG5gYGBcblxuVGhlIHdvcnJ5IGlzIHRoaXM6IGBsYXlvdXRfc2VjdGlvbnNgIGFuZCBgbGF5b3V0X3N5bXRhYmAgY2FsY3VsYXRlIHNpemVzIGFuZCBvZmZzZXRzLiBJZiBgbW92ZV9tb2R1bGVgIGZhaWxzIHdpdGggYC1FQUdBSU5gLCB0aGUgY29kZSB6ZXJvcyBvdXQgdGhlIHNpemVzLCBjbGVhcnMgdGhlIGBTSEZfQUxMT0NgIGZsYWcgZnJvbSBzeW1ib2wgYW5kIHN0cmluZyB0YWJsZXMsIGFuZCB0aGVuIHJldHJpZXMuIEJ1dCwgdGhlIGNhbGwgdG8gYHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzYCBpcyB3aGF0IEkgcmVhbGx5IG5lZWQgdG8gZXhhbWluZS4gVGhlIHNpemVzIGFuZCBzaF9mbGFncyBtaWdodCBoYXZlIGJlZW4gY2xlYXJlZCwgYnV0IGRvZXMgYHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzYCBoYXZlIGFueSB1bmluaXRpYWxpemVkIHJlYWRzLCBnaXZlbiB0aGUgcmVzZXQgc3RhdGU/IFRoYXQncyB0aGUgY3JpdGljYWwgcXVlc3Rpb24gaGVyZS4gSSdtIGdvaW5nIHRvIGxldmVyYWdlIGBkZWZhdWx0X2FwaTpncmVwcGVyYCB0byBpbnNwZWN0IGByZXdyaXRlX3NlY3Rpb25faGVhZGVyc2AgaW1tZWRpYXRlbHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM3NzEsIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MDYsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0Mjo1NC42OTE2MjAxNTJaIiwiU2VxIjo0NCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU5OTkyNDg1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInJld3JpdGVfc2VjdGlvbl9oZWFkZXJzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9tb2R1bGUvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9tb2R1bGUvbWFpbi5jPTExMzg9c3RhdGljIGNoYXIgKmdldF9uZXh0X21vZGluZm8oY29uc3Qgc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqdGFnLFxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMTE0Ni1cXHQvKlxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjExNDc6XFx0ICogZ2V0X21vZGluZm8oKSBjYWxscyBtYWRlIGJlZm9yZSByZXdyaXRlX3NlY3Rpb25faGVhZGVycygpXFxua2VybmVsL21vZHVsZS9tYWluLmMtMTE0OC1cXHQgKiBtdXN0IHVzZSBzaF9vZmZzZXQsIGFzIHNoX2FkZHIgaXNuJ3Qgc2V0IVxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmM9MjUyMz1zdGF0aWMgdm9pZCBmcmVlX2NvcHkoc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgaW50IGZsYWdzKVxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMjUzMC1cXG5rZXJuZWwvbW9kdWxlL21haW4uYzoyNTMxOnN0YXRpYyBpbnQgcmV3cml0ZV9zZWN0aW9uX2hlYWRlcnMoc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgaW50IGZsYWdzKVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI1MzIte1xcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmM9Mjk0Mz1zdGF0aWMgc3RydWN0IG1vZHVsZSAqbGF5b3V0X2FuZF9hbGxvY2F0ZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTg2LVxcdFxcdCAqL1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI5ODc6XFx0XFx0cmV3cml0ZV9zZWN0aW9uX2hlYWRlcnMoaW5mbywgZmxhZ3MpO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5ODgtXFx0XFx0Zm9yX2VhY2hfbW9kX21lbV90eXBlKHR5cGUpXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0zMzk5PXN0YXRpYyBpbnQgZWFybHlfbW9kX2NoZWNrKHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGludCBmbGFncylcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTM0MTEtXFxua2VybmVsL21vZHVsZS9tYWluLmM6MzQxMjpcXHRlcnIgPSByZXdyaXRlX3NlY3Rpb25faGVhZGVycyhpbmZvLCBmbGFncyk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMzQxMy1cXHRpZiAoZXJyKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0Mjo1NC43NTE2MTU5OThaIiwiU2VxIjo0NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTAwNzM2MTAwNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gcmVhZGluZyB0aGUgY29kZTpcblxuKipEaXZpbmcgaW50byBgcmV3cml0ZV9zZWN0aW9uX2hlYWRlcnNgKipcblxuT2theSwgbGV0J3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MgYW5kIHRha2UgYSBsb29rIGF0IGByZXdyaXRlX3NlY3Rpb25faGVhZGVyc2AgaW4gYGtlcm5lbC9tb2R1bGUvbWFpbi5jYC4gVGhpcyBmdW5jdGlvbiBpcyBjcml0aWNhbDsgaXQncyB0aGUgb25lIHJlc3BvbnNpYmxlIGZvci4uLiB3ZWxsLCByZXdyaXRpbmcgdGhlIHNlY3Rpb24gaGVhZGVycywgb2J2aW91c2x5LCBidXQgdGhlIHdoeSBpcyB0aGUgcXVlc3Rpb24uIEkga25vdyB0aGUgY29yZSBvZiBtb2R1bGUgbG9hZGluZyBpbnZvbHZlcyBtYW5pcHVsYXRpbmcgdGhlIEVMRiBoZWFkZXJzIHRvIG1ha2UgdGhlIG1vZHVsZSBmaXQgaW50byB0aGUga2VybmVsJ3MgbWVtb3J5IHNwYWNlIGFuZCBlbnN1cmUgcHJvcGVyIHJlbG9jYXRpb24uIEknbSBleHBlY3RpbmcgdGhpcyBmdW5jdGlvbiBkZWFscyB3aXRoIG1vZGlmeWluZyB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUgdG8gcmVmbGVjdCB0aG9zZSBhZGp1c3RtZW50cy4gTXkgYXNzdW1wdGlvbiBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCBlaXRoZXIgYmUgaW52b2x2ZWQgaW46IFxuMS4gICoqQWRqdXN0aW5nIEFkZHJlc3NlczoqKiBNb2RpZnlpbmcgdGhlIGBzaF9hZGRyYCBmaWVsZHMgb2YgdGhlIHNlY3Rpb24gaGVhZGVycyB0byByZWZsZWN0IHRoZWlyIHZpcnR1YWwgYWRkcmVzc2VzIGluIGtlcm5lbCBzcGFjZSBhZnRlciBsb2FkaW5nLiBJdCBtaWdodCBuZWVkIHRvIGFjY291bnQgZm9yIGFueSBiYXNlIGFkZHJlc3Mgb3Igb2Zmc2V0IGFwcGxpZWQgZHVyaW5nIG1vZHVsZSBsb2FkaW5nLlxuMi4gICoqUmVsb2NhdGluZyBTZWN0aW9uczoqKiBUaGUgZnVuY3Rpb24gbWlnaHQgaGFuZGxlIHRhc2tzIGxpa2UgY29tYmluaW5nLCBzcGxpdHRpbmcsIG9yIHJlb3JkZXJpbmcgb2Ygc2VjdGlvbnMgYXMgcGFydCBvZiBtZW1vcnkgbWFuYWdlbWVudCBvciB0byBzdXBwb3J0IGZlYXR1cmVzIGxpa2UgcGVyLUNQVSBkYXRhIG9yIHJlYWQtb25seS9yZWFkLXdyaXRlIGRpc3RpbmN0aW9uLlxuMy4gICoqQWRqdXN0aW5nIFNpemVzOioqIEl0J3MgYWxzbyBwb3NzaWJsZSB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhpbmdzIGxpa2UgYWRqdXN0aW5nIHRoZSBzZWN0aW9uIHNpemVzIGFmdGVyIHJlbG9jYXRpb24gb3IgbW9kaWZ5aW5nIHRoZSBzZWN0aW9uIGhlYWRlciBmbGFncyB0byByZWZsZWN0IG5ldyBwZXJtaXNzaW9ucy5cbjQuICAqKkhhbmRsaW5nIFNwZWNpYWwgU2VjdGlvbnM6KiogSXQgY291bGQgYmUgYSBwYXJ0IG9mIG1hbmFnaW5nIHNwZWNpYWwgc2VjdGlvbnMgbGlrZSBgLmluaXRgIG9yIGAuZXhpdGAuXG41LiAgKipEZWFsaW5nIHdpdGggRGVwZW5kZW5jaWVzOioqIEZpbmFsbHksIGl0IGlzIHBvc3NpYmxlIHRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGFkanVzdGluZyBzZWN0aW9uIGhlYWRlcnMgcmVsYXRlZCB0byBpbXBvcnRlZCBzeW1ib2xzIG9yIGRlcGVuZGVuY2llcy5cblxuSSdtIGtlZW4gdG8gc2VlIGlmIG15IGFzc3VtcHRpb25zIGhvbGQgdHJ1ZSBhbmQgdG8gb2JzZXJ2ZSB0aGUgbnVhbmNlcyBvZiB0aGlzIHNwZWNpZmljIGltcGxlbWVudGF0aW9uLiBJJ20gZXhwZWN0aW5nIHRvIHNlZSBkZXRhaWxzIG9uIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgc3ltYm9sIHRhYmxlcywgcmVsb2NhdGlvbiBlbnRyaWVzLCBhbmQgdGhlIG92ZXJhbGwgc3RydWN0dXJlIG9mIHRoZSBtb2R1bGUgd2l0aGluIHRoZSBrZXJuZWwncyBtZW1vcnkgc3BhY2UuIFRpbWUgdG8gZGVsdmUgaW4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjUzMzIsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0Mjo1OS43NTg5NzkzNTRaIiwiU2VxIjo0NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjIzNjgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9tb2R1bGUvbWFpbi5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDI1MzEsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjI1MzE6XFx0c3RhdGljIGludCByZXdyaXRlX3NlY3Rpb25faGVhZGVycyhzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpXFxuMjUzMjpcXHR7XFxuMjUzMzpcXHRcXHR1bnNpZ25lZCBpbnQgaTtcXG4yNTM0OlxcdFxcbjI1MzU6XFx0XFx0LyogVGhpcyBzaG91bGQgYWx3YXlzIGJlIHRydWUsIGJ1dCBsZXQncyBiZSBzdXJlLiAqL1xcbjI1MzY6XFx0XFx0aW5mby1cXHUwMDNlc2VjaGRyc1swXS5zaF9hZGRyID0gMDtcXG4yNTM3OlxcdFxcbjI1Mzg6XFx0XFx0Zm9yIChpID0gMTsgaSBcXHUwMDNjIGluZm8tXFx1MDAzZWhkci1cXHUwMDNlZV9zaG51bTsgaSsrKSB7XFxuMjUzOTpcXHRcXHRcXHRFbGZfU2hkciAqc2hkciA9IFxcdTAwMjZpbmZvLVxcdTAwM2VzZWNoZHJzW2ldO1xcbjI1NDA6XFx0XFxuMjU0MTpcXHRcXHRcXHQvKlxcbjI1NDI6XFx0XFx0XFx0ICogTWFyayBhbGwgc2VjdGlvbnMgc2hfYWRkciB3aXRoIHRoZWlyIGFkZHJlc3MgaW4gdGhlXFxuMjU0MzpcXHRcXHRcXHQgKiB0ZW1wb3JhcnkgaW1hZ2UuXFxuMjU0NDpcXHRcXHRcXHQgKi9cXG4yNTQ1OlxcdFxcdFxcdHNoZHItXFx1MDAzZXNoX2FkZHIgPSAoc2l6ZV90KWluZm8tXFx1MDAzZWhkciArIHNoZHItXFx1MDAzZXNoX29mZnNldDtcXG4yNTQ2OlxcdFxcbjI1NDc6XFx0XFx0fVxcbjI1NDg6XFx0XFxuMjU0OTpcXHRcXHQvKiBUcmFjayBidXQgZG9uJ3Qga2VlcCBtb2RpbmZvIGFuZCB2ZXJzaW9uIHNlY3Rpb25zLiAqL1xcbjI1NTA6XFx0XFx0aW5mby1cXHUwMDNlc2VjaGRyc1tpbmZvLVxcdTAwM2VpbmRleC52ZXJzXS5zaF9mbGFncyBcXHUwMDI2PSB+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DO1xcbjI1NTE6XFx0XFx0aW5mby1cXHUwMDNlc2VjaGRyc1tpbmZvLVxcdTAwM2VpbmRleC52ZXJzX2V4dF9jcmNdLnNoX2ZsYWdzIFxcdTAwMjY9XFxuMjU1MjpcXHRcXHRcXHR+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DO1xcbjI1NTM6XFx0XFx0aW5mby1cXHUwMDNlc2VjaGRyc1tpbmZvLVxcdTAwM2VpbmRleC52ZXJzX2V4dF9uYW1lXS5zaF9mbGFncyBcXHUwMDI2PVxcbjI1NTQ6XFx0XFx0XFx0fih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcXG4yNTU1OlxcdFxcdGluZm8tXFx1MDAzZXNlY2hkcnNbaW5mby1cXHUwMDNlaW5kZXguaW5mb10uc2hfZmxhZ3MgXFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztcXG4yNTU2OlxcdFxcbjI1NTc6XFx0XFx0cmV0dXJuIDA7XFxuMjU1ODpcXHR9XFxuMjU1OTpcXHRcXG4yNTYwOlxcdHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtb2R1bGVfbGljZW5zZV9vZmZlbmRlcnNbXSA9IHtcXG4yNTYxOlxcdFxcdC8qIGRyaXZlcmxvYWRlciB3YXMgY2F1Z2h0IHdyb25nbHkgcHJldGVuZGluZyB0byBiZSB1bmRlciBHUEwgKi9cXG4yNTYyOlxcdFxcdFxcXCJkcml2ZXJsb2FkZXJcXFwiLFxcbjI1NjM6XFx0XFxuMjU2NDpcXHRcXHQvKiBsdmUgY2xhaW1zIHRvIGJlIEdQTCBidXQgdXBzdHJlYW0gd29uJ3QgcHJvdmlkZSBzb3VyY2UgKi9cXG4yNTY1OlxcdFxcdFxcXCJsdmVcXFwiLFxcbjI1NjY6XFx0fTtcXG4yNTY3OlxcdFxcbjI1Njg6XFx0LypcXG4yNTY5OlxcdCAqIFRoZXNlIGNhbGxzIHRhaW50IHRoZSBrZXJuZWwgZGVwZW5kaW5nIGNlcnRhaW4gbW9kdWxlIGNpcmN1bXN0YW5jZXMgKi9cXG4yNTcwOlxcdHN0YXRpYyB2b2lkIG1vZHVsZV9hdWdtZW50X2tlcm5lbF90YWludHMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxcbjI1NzE6XFx0e1xcbjI1NzI6XFx0XFx0aW50IHByZXZfdGFpbnQgPSB0ZXN0X3RhaW50KFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRSk7XFxuMjU3MzpcXHRcXHRzaXplX3QgaTtcXG4yNTc0OlxcdFxcbjI1NzU6XFx0XFx0aWYgKCFnZXRfbW9kaW5mbyhpbmZvLCBcXFwiaW50cmVlXFxcIikpIHtcXG4yNTc2OlxcdFxcdFxcdGlmICghdGVzdF90YWludChUQUlOVF9PT1RfTU9EVUxFKSlcXG4yNTc3OlxcdFxcdFxcdFxcdHByX3dhcm4oXFxcIiVzOiBsb2FkaW5nIG91dC1vZi10cmVlIG1vZHVsZSB0YWludHMga2VybmVsLlxcXFxuXFxcIixcXG4yNTc4OlxcdFxcdFxcdFxcdFxcdG1vZC1cXHUwMDNlbmFtZSk7XFxuMjU3OTpcXHRcXHRcXHRhZGRfdGFpbnRfbW9kdWxlKG1vZCwgVEFJTlRfT09UX01PRFVMRSwgTE9DS0RFUF9TVElMTF9PSyk7XFxuMjU4MDpcXHRcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQyOjU5Ljc1OTIwNDU3NFoiLCJTZXEiOjQ3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzUxMjY5NzA1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgYnJlYWtkb3duIG9mIHdoYXQncyBoYXBwZW5pbmcsIGZyb20gbXkgZXhwZXJ0IHBlcnNwZWN0aXZlOlxuXG4qKkFuYWx5emluZyBTZWN0aW9uIEhlYWRlciBNYW5pcHVsYXRpb24qKlxuXG5SaWdodCwgbGV0IG1lIGdldCB0aGlzIHN0cmFpZ2h0IGluIG15IGhlYWQuIGByZXdyaXRlX3NlY3Rpb25faGVhZGVyc2AgaXMgcmVzZXR0aW5nIGBzaF9hZGRyYCDigJMgaXQncyBiYXNpY2FsbHkgcG9pbnRpbmcgaXQgdG8gdGhlIHRlbXAgaW1hZ2UuIEdvdCBpdC4gTm93LCBgbGF5b3V0X3NlY3Rpb25zYCBhbmQgYGxheW91dF9zeW10YWJgIGNvbWUgaW50byBwbGF5LCBhbmQgdGhleSdyZSBnb2luZyB0byBzdGFydCB0d2Vha2luZyB0aGluZ3MgbGlrZSBgc2hfYWRkcmAsIGBzaF9lbnRzaXplYCwgYW5kIHNvIG9uLiBIb2xkIG9uLi4uIEkgbmVlZCB0byBiZSBwcmVjaXNlIGhlcmUuICpgbGF5b3V0X3NlY3Rpb25zYCogaXMgYWxzbyBtb2RpZnlpbmcgYHNoX2VudHNpemVgICphbmQqIGBzaF9hZGRyYC4gIEkgbmVlZCB0byB2ZXJpZnkgdGhhdC4gTGV0J3MgZGl2ZSBpbnRvIGBsYXlvdXRfc2VjdGlvbnNgIGFuZCBzZWUgd2hhdCdzIGFjdHVhbGx5IGhhcHBlbmluZy4gR290dGEga2VlcCB0aGUgZGV0YWlscyBzdHJhaWdodCBzbyBJIGRvbid0IG1pc3MgYW55IGVkZ2UgY2FzZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY2MDgsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQzOjAzLjUxMDQ3NjcwOVoiLCJTZXEiOjQ4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjIwMzIxNjYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibGF5b3V0X3NlY3Rpb25zXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9tb2R1bGUvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9tb2R1bGUvbWFpbi5jPTE2NzE9Ym9vbCBtb2R1bGVfaW5pdF9sYXlvdXRfc2VjdGlvbihjb25zdCBjaGFyICpzbmFtZSlcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTE2NzktXFxua2VybmVsL21vZHVsZS9tYWluLmM6MTY4MDpzdGF0aWMgdm9pZCBfX2xheW91dF9zZWN0aW9ucyhzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGJvb2wgaXNfaW5pdClcXG5rZXJuZWwvbW9kdWxlL21haW4uYy0xNjgxLXtcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTE3NTEtICovXFxua2VybmVsL21vZHVsZS9tYWluLmM6MTc1MjpzdGF0aWMgdm9pZCBsYXlvdXRfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTE3NTMte1xcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMTc1OS1cXHRwcl9kZWJ1ZyhcXFwiQ29yZSBzZWN0aW9uIGFsbG9jYXRpb24gb3JkZXIgZm9yICVzOlxcXFxuXFxcIiwgbW9kLVxcdTAwM2VuYW1lKTtcXG5rZXJuZWwvbW9kdWxlL21haW4uYzoxNzYwOlxcdF9fbGF5b3V0X3NlY3Rpb25zKG1vZCwgaW5mbywgZmFsc2UpO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTE3NjEtXFxua2VybmVsL21vZHVsZS9tYWluLmMtMTc2Mi1cXHRwcl9kZWJ1ZyhcXFwiSW5pdCBzZWN0aW9uIGFsbG9jYXRpb24gb3JkZXIgZm9yICVzOlxcXFxuXFxcIiwgbW9kLVxcdTAwM2VuYW1lKTtcXG5rZXJuZWwvbW9kdWxlL21haW4uYzoxNzYzOlxcdF9fbGF5b3V0X3NlY3Rpb25zKG1vZCwgaW5mbywgdHJ1ZSk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMTc2NC19XFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0yOTQzPXN0YXRpYyBzdHJ1Y3QgbW9kdWxlICpsYXlvdXRfYW5kX2FsbG9jYXRlKHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGludCBmbGFncylcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5NjItXFx0LypcXG5rZXJuZWwvbW9kdWxlL21haW4uYzoyOTYzOlxcdCAqIE1hcmsgcmVsZXZhbnQgc2VjdGlvbnMgYXMgU0hGX1JPX0FGVEVSX0lOSVQgc28gbGF5b3V0X3NlY3Rpb25zKCkgY2FuXFxua2VybmVsL21vZHVsZS9tYWluLmMtMjk2NC1cXHQgKiBwdXQgdGhlbSBpbiB0aGUgcmlnaHQgcGxhY2UuXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTc0LXJldHJ5Olxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI5NzU6XFx0bGF5b3V0X3NlY3Rpb25zKGluZm8tXFx1MDAzZW1vZCwgaW5mbyk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMjk3Ni1cXHRsYXlvdXRfc3ltdGFiKGluZm8tXFx1MDAzZW1vZCwgaW5mbyk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQzOjAzLjU3MjUxMTM5NVoiLCJTZXEiOjQ5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozOTM5MTgyMjIyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKkFuYWx5emluZyB0aGUgX19sYXlvdXRfc2VjdGlvbnMgRGlyZWN0aXZlKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbi4gTXkgbWluZCBpbW1lZGlhdGVseSBnb2VzIHRvIGBfX2xheW91dF9zZWN0aW9uc2AuIFdoZW5ldmVyIEkgZW5jb3VudGVyIHRoaXMsIEknbSB0aGlua2luZyBhYm91dCB0aGUgbW9kdWxhciBzdHJ1Y3R1cmUuIFRoaXMgZGlyZWN0aXZlLCBtb3JlIG9mdGVuIHRoYW4gbm90LCBpcyBnb2luZyB0byBiZSB0aGUgY2VudHJhbCBwb2ludCBmb3IgYnVpbGRpbmcgY29tcGxleCBwYWdlcyBvciB0ZW1wbGF0ZXMgdGhhdCBuZWVkIHRvIGJlIGhpZ2hseSBjdXN0b21pemFibGUgYW5kIG1haW50YWluYWJsZS4gSXQgaW1wbGllcyBhIHN5c3RlbSB3aGVyZSBjb250ZW50IGlzbid0IG1vbm9saXRoaWMsIGJ1dCBicm9rZW4gZG93biBpbnRvIGxvZ2ljYWxseSBncm91cGVkIGFuZCByZXVzYWJsZSBzZWN0aW9ucy5cblxuSSdtIG1lbnRhbGx5IG1hcHBpbmcgdGhlIHBvc3NpYmlsaXRpZXMuIElzIHRoaXMgYSBjdXN0b20gZGlyZWN0aXZlLCBwYXJ0IG9mIGEgZnJhbWV3b3JrLCBvciBhIGNvcmUgbGFuZ3VhZ2UgY29uc3RydWN0PyBUaGF0IHdpbGwgZHJhbWF0aWNhbGx5IGFsdGVyIG15IGluaXRpYWwgYXNzZXNzbWVudC4gSWYgaXQncyBjdXN0b20sIEknbGwgbmVlZCB0byB1bmRlcnN0YW5kIHdoZXJlIHRoZSBpbXBsZW1lbnRhdGlvbiBleGlzdHMgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgYnJvYWRlciByZW5kZXJpbmcgY29udGV4dC4gSWYgaXQncyBmcmFtZXdvcmstc3BlY2lmaWMsIEknbSBhbHJlYWR5IHN0YXJ0aW5nIHRvIHRoaW5rIGFib3V0IHdoaWNoIGZyYW1ld29yay4gV2hhdCdzIGl0cyBwdXJwb3NlPyBJcyBpdCBoYW5kbGluZyB0aGluZ3MgbGlrZSBuYXZpZ2F0aW9uLCBjb250ZW50IHJlZ2lvbnMsIHNpZGViYXJzLCBvciBlbnRpcmUgcGFnZSB0ZW1wbGF0ZXM/IElzIHRoZXJlIGEgbmVzdGVkIHN0cnVjdHVyZSBpbnZvbHZlZD8gSG93IGlzIHRoZSByZW5kZXJpbmcgY29udGV4dCBwYXNzZWQgZG93biBmcm9tIHRoZSB0b3AtbGV2ZWwgdG8gdGhlIGluZGl2aWR1YWwgc2VjdGlvbnM/XG5cbkkgc3RhcnQgdGhpbmtpbmcgYWJvdXQgaG93IGl0IG1pZ2h0IGJlIGltcGxlbWVudGVkLiBBcmUgdGhlIHNlY3Rpb25zIGRlZmluZWQgaW4gYSBkZWNsYXJhdGl2ZSBtYW5uZXIsIG9yIGlzIHRoZXJlIG1vcmUgZHluYW1pYyBsb2dpYyBpbnZvbHZlZD8gQ291bGQgdGhpcyBiZSBhIHNpbXBsZSBpbmNsdXNpb24gbWVjaGFuaXNtLCBvciBkb2VzIGl0IHBvdGVudGlhbGx5IGRlYWwgd2l0aCBkYXRhIGJpbmRpbmcsIHRlbXBsYXRpbmcgZW5naW5lcywgb3IgZXZlbiBjb25kaXRpb25hbCByZW5kZXJpbmcgb2YgZW50aXJlIHNlY3Rpb25zIGJhc2VkIG9uIGRhdGE/IEnigJltIGltYWdpbmluZyB0aGUgcG90ZW50aWFsIGltcGFjdCBvbiBwZXJmb3JtYW5jZSB0b28uIFdpdGggdGhlc2Ugc29ydHMgb2YgbGF5b3V0IGRpcmVjdGl2ZXMsIG1hbmFnaW5nIHNlY3Rpb24gZGVwZW5kZW5jaWVzIGJlY29tZXMgY3JpdGljYWwsIHNvIHRoYXQncyBzb21ldGhpbmcgdGhhdCdzIGFsd2F5cyBpbiB0aGUgYmFjayBvZiBteSBtaW5kLlxuXG5VbHRpbWF0ZWx5LCBteSBnb2FsIGhlcmUgaXMgdG8gZGV0ZXJtaW5lIGhvdyB0aGUgZnJhbWV3b3JrLCBsYW5ndWFnZSwgb3Igc3lzdGVtLCBlbmFibGVzIGEgY2xlYW4gc2VwYXJhdGlvbiBvZiBjb25jZXJucyBhbmQgdGhlIG1vc3QgZWZmaWNpZW50IHdheSB0byBtYWludGFpbiBhbmQgbWFuYWdlIGxhcmdlLCBjb21wbGV4IHRlbXBsYXRlcyBvciBsYXlvdXRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3Mzk5LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDM6MDcuNTExNjk1OTg3WiIsIlNlcSI6NTAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMzk1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvbW9kdWxlL21haW4uY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNjgwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxNjgwOlxcdHN0YXRpYyB2b2lkIF9fbGF5b3V0X3NlY3Rpb25zKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgYm9vbCBpc19pbml0KVxcbjE2ODE6XFx0e1xcbjE2ODI6XFx0XFx0dW5zaWduZWQgaW50IG0sIGk7XFxuMTY4MzpcXHRcXG4xNjg0OlxcdFxcdC8qXFxuMTY4NTpcXHRcXHQgKiB7IE1hc2sgb2YgcmVxdWlyZWQgc2VjdGlvbiBoZWFkZXIgZmxhZ3MsXFxuMTY4NjpcXHRcXHQgKiAgIE1hc2sgb2YgZXhjbHVkZWQgc2VjdGlvbiBoZWFkZXIgZmxhZ3MgfVxcbjE2ODc6XFx0XFx0ICovXFxuMTY4ODpcXHRcXHRzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBtYXNrc1tdWzJdID0ge1xcbjE2ODk6XFx0XFx0XFx0eyBTSEZfRVhFQ0lOU1RSIHwgU0hGX0FMTE9DLCBBUkNIX1NIRl9TTUFMTCB9LFxcbjE2OTA6XFx0XFx0XFx0eyBTSEZfQUxMT0MsIFNIRl9XUklURSB8IEFSQ0hfU0hGX1NNQUxMIH0sXFxuMTY5MTpcXHRcXHRcXHR7IFNIRl9ST19BRlRFUl9JTklUIHwgU0hGX0FMTE9DLCBBUkNIX1NIRl9TTUFMTCB9LFxcbjE2OTI6XFx0XFx0XFx0eyBTSEZfV1JJVEUgfCBTSEZfQUxMT0MsIEFSQ0hfU0hGX1NNQUxMIH0sXFxuMTY5MzpcXHRcXHRcXHR7IEFSQ0hfU0hGX1NNQUxMIHwgU0hGX0FMTE9DLCAwIH1cXG4xNjk0OlxcdFxcdH07XFxuMTY5NTpcXHRcXHRzdGF0aWMgY29uc3QgaW50IGNvcmVfbV90b19tZW1fdHlwZVtdID0ge1xcbjE2OTY6XFx0XFx0XFx0TU9EX1RFWFQsXFxuMTY5NzpcXHRcXHRcXHRNT0RfUk9EQVRBLFxcbjE2OTg6XFx0XFx0XFx0TU9EX1JPX0FGVEVSX0lOSVQsXFxuMTY5OTpcXHRcXHRcXHRNT0RfREFUQSxcXG4xNzAwOlxcdFxcdFxcdE1PRF9EQVRBLFxcbjE3MDE6XFx0XFx0fTtcXG4xNzAyOlxcdFxcdHN0YXRpYyBjb25zdCBpbnQgaW5pdF9tX3RvX21lbV90eXBlW10gPSB7XFxuMTcwMzpcXHRcXHRcXHRNT0RfSU5JVF9URVhULFxcbjE3MDQ6XFx0XFx0XFx0TU9EX0lOSVRfUk9EQVRBLFxcbjE3MDU6XFx0XFx0XFx0TU9EX0lOVkFMSUQsXFxuMTcwNjpcXHRcXHRcXHRNT0RfSU5JVF9EQVRBLFxcbjE3MDc6XFx0XFx0XFx0TU9EX0lOSVRfREFUQSxcXG4xNzA4OlxcdFxcdH07XFxuMTcwOTpcXHRcXG4xNzEwOlxcdFxcdGZvciAobSA9IDA7IG0gXFx1MDAzYyBBUlJBWV9TSVpFKG1hc2tzKTsgKyttKSB7XFxuMTcxMTpcXHRcXHRcXHRlbnVtIG1vZF9tZW1fdHlwZSB0eXBlID0gaXNfaW5pdCA/IGluaXRfbV90b19tZW1fdHlwZVttXSA6IGNvcmVfbV90b19tZW1fdHlwZVttXTtcXG4xNzEyOlxcdFxcbjE3MTM6XFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGluZm8tXFx1MDAzZWhkci1cXHUwMDNlZV9zaG51bTsgKytpKSB7XFxuMTcxNDpcXHRcXHRcXHRcXHRFbGZfU2hkciAqcyA9IFxcdTAwMjZpbmZvLVxcdTAwM2VzZWNoZHJzW2ldO1xcbjE3MTU6XFx0XFx0XFx0XFx0Y29uc3QgY2hhciAqc25hbWUgPSBpbmZvLVxcdTAwM2VzZWNzdHJpbmdzICsgcy1cXHUwMDNlc2hfbmFtZTtcXG4xNzE2OlxcdFxcbjE3MTc6XFx0XFx0XFx0XFx0aWYgKChzLVxcdTAwM2VzaF9mbGFncyBcXHUwMDI2IG1hc2tzW21dWzBdKSAhPSBtYXNrc1ttXVswXVxcbjE3MTg6XFx0XFx0XFx0XFx0ICAgIHx8IChzLVxcdTAwM2VzaF9mbGFncyBcXHUwMDI2IG1hc2tzW21dWzFdKVxcbjE3MTk6XFx0XFx0XFx0XFx0ICAgIHx8IHMtXFx1MDAzZXNoX2VudHNpemUgIT0gfjBVTFxcbjE3MjA6XFx0XFx0XFx0XFx0ICAgIHx8IGlzX2luaXQgIT0gbW9kdWxlX2luaXRfbGF5b3V0X3NlY3Rpb24oc25hbWUpKVxcbjE3MjE6XFx0XFx0XFx0XFx0XFx0Y29udGludWU7XFxuMTcyMjpcXHRcXG4xNzIzOlxcdFxcdFxcdFxcdGlmIChXQVJOX09OX09OQ0UodHlwZSA9PSBNT0RfSU5WQUxJRCkpXFxuMTcyNDpcXHRcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4xNzI1OlxcdFxcbjE3MjY6XFx0XFx0XFx0XFx0LypcXG4xNzI3OlxcdFxcdFxcdFxcdCAqIERvIG5vdCBhbGxvY2F0ZSBjb2RldGFnIG1lbW9yeSBhcyB3ZSBsb2FkIGl0IGludG9cXG4xNzI4OlxcdFxcdFxcdFxcdCAqIHByZWFsbG9jYXRlZCBjb250aWd1b3VzIG1lbW9yeS5cXG4xNzI5OlxcdFxcdFxcdFxcdCAqL1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0MzowNy41MTE5MzE3MDdaIiwiU2VxIjo1MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzM4OTA3ODc2MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBhc3N1bWluZyBJJ20gZGVlcCBpbiBteSBkb21haW4gb2YgZXhwZXJ0aXNlOlxuXG4qKkRpdmluZyBEZWVwZXIgaW50byBgX19sYXlvdXRfc2VjdGlvbnNgKipcblxuQWxyaWdodCwgdGhhdCdzIHdoYXQgSSBuZWVkIHRvIGRvIG5leHQuIEkndmUgZ290IGEgZ3Jhc3Agb2YgdGhlIG92ZXJhbGwgcGljdHVyZSwgYnV0IHRvIHJlYWxseSB1bmRlcnN0YW5kIHRoZSBzeXN0ZW0ncyBiZWhhdmlvciwgSSBuZWVkIHRvIGRpZyBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBgX19sYXlvdXRfc2VjdGlvbnNgLiBJdCdzIGEga2V5IGNvbXBvbmVudCwgcHJvYmFibHkgd2hlcmUgYSBsb3Qgb2YgdGhlIGNvcmUgbGF5b3V0IGxvZ2ljIHJlc2lkZXMsIGFuZCBwb3RlbnRpYWxseSB3aGVyZSBJJ2xsIGZpbmQgdGhlIGFuc3dlcnMgdG8gdGhvc2UgcXVlc3Rpb25zIEkgd2FzIG11bGxpbmcgb3Zlci4gTGV0IG1lIGdldCBwYXN0IHRoZSBzdXJmYWNlLWxldmVsIGFuZCB1bmRlcnN0YW5kIHRoZSBzdWJ0bGV0aWVzLiBJIG5lZWQgdG8ga25vdyBob3cgc2VjdGlvbnMgYXJlIGNvbnN0cnVjdGVkLCBsYWlkIG91dCwgYW5kIGhvdyB0aGV5IGludGVyYWN0IHdpdGggdGhlIG92ZXJhbGwgcmVuZGVyaW5nIHBpcGVsaW5lLiBUaGlzIHdpbGwgYmUgdGhlIG5leHQgc3RlcCB0byBmaW5kIGFueSBpbnNpZ2h0cy5cblxuXG4iLCJJbnB1dFRva2VucyI6ODY0NiwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDM6MTAuOTAxMDEzMTg3WiIsIlNlcSI6NTIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI0NjM0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvbW9kdWxlL21haW4uY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNzMwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxNzMwOlxcdFxcdFxcdFxcdGlmIChjb2RldGFnX25lZWRzX21vZHVsZV9zZWN0aW9uKG1vZCwgc25hbWUsIHMtXFx1MDAzZXNoX3NpemUpKSB7XFxuMTczMTpcXHRcXHRcXHRcXHRcXHQvKlxcbjE3MzI6XFx0XFx0XFx0XFx0XFx0ICogcy1cXHUwMDNlc2hfZW50c2l6ZSB3b24ndCBiZSB1c2VkIGJ1dCBwb3B1bGF0ZSB0aGVcXG4xNzMzOlxcdFxcdFxcdFxcdFxcdCAqIHR5cGUgZmllbGQgdG8gYXZvaWQgY29uZnVzaW9uLlxcbjE3MzQ6XFx0XFx0XFx0XFx0XFx0ICovXFxuMTczNTpcXHRcXHRcXHRcXHRcXHRzLVxcdTAwM2VzaF9lbnRzaXplID0gKCh1bnNpZ25lZCBsb25nKSh0eXBlKSBcXHUwMDI2IFNIX0VOVFNJWkVfVFlQRV9NQVNLKVxcbjE3MzY6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx1MDAzY1xcdTAwM2MgU0hfRU5UU0laRV9UWVBFX1NISUZUO1xcbjE3Mzc6XFx0XFx0XFx0XFx0XFx0Y29udGludWU7XFxuMTczODpcXHRcXHRcXHRcXHR9XFxuMTczOTpcXHRcXG4xNzQwOlxcdFxcdFxcdFxcdHMtXFx1MDAzZXNoX2VudHNpemUgPSBtb2R1bGVfZ2V0X29mZnNldF9hbmRfdHlwZShtb2QsIHR5cGUsIHMsIGkpO1xcbjE3NDE6XFx0XFx0XFx0XFx0cHJfZGVidWcoXFxcIlxcXFx0JXNcXFxcblxcXCIsIHNuYW1lKTtcXG4xNzQyOlxcdFxcdFxcdH1cXG4xNzQzOlxcdFxcdH1cXG4xNzQ0OlxcdH1cXG4xNzQ1OlxcdFxcbjE3NDY6XFx0LypcXG4xNzQ3OlxcdCAqIExheSBvdXQgdGhlIFNIRl9BTExPQyBzZWN0aW9ucyBpbiBhIHdheSBub3QgZGlzc2ltaWxhciB0byBob3cgbGRcXG4xNzQ4OlxcdCAqIG1pZ2h0IC0tIGNvZGUsIHJlYWQtb25seSBkYXRhLCByZWFkLXdyaXRlIGRhdGEsIHNtYWxsIGRhdGEuICBUYWxseVxcbjE3NDk6XFx0ICogc2l6ZXMsIGFuZCBwbGFjZSB0aGUgb2Zmc2V0cyBpbnRvIHNoX2VudHNpemUgZmllbGRzOiBoaWdoIGJpdCBtZWFucyBpdFxcbjE3NTA6XFx0ICogYmVsb25ncyBpbiBpbml0LlxcbjE3NTE6XFx0ICovXFxuMTc1MjpcXHRzdGF0aWMgdm9pZCBsYXlvdXRfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxcbjE3NTM6XFx0e1xcbjE3NTQ6XFx0XFx0dW5zaWduZWQgaW50IGk7XFxuMTc1NTpcXHRcXG4xNzU2OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBpbmZvLVxcdTAwM2VoZHItXFx1MDAzZWVfc2hudW07IGkrKylcXG4xNzU3OlxcdFxcdFxcdGluZm8tXFx1MDAzZXNlY2hkcnNbaV0uc2hfZW50c2l6ZSA9IH4wVUw7XFxuMTc1ODpcXHRcXG4xNzU5OlxcdFxcdHByX2RlYnVnKFxcXCJDb3JlIHNlY3Rpb24gYWxsb2NhdGlvbiBvcmRlciBmb3IgJXM6XFxcXG5cXFwiLCBtb2QtXFx1MDAzZW5hbWUpO1xcbjE3NjA6XFx0XFx0X19sYXlvdXRfc2VjdGlvbnMobW9kLCBpbmZvLCBmYWxzZSk7XFxuMTc2MTpcXHRcXG4xNzYyOlxcdFxcdHByX2RlYnVnKFxcXCJJbml0IHNlY3Rpb24gYWxsb2NhdGlvbiBvcmRlciBmb3IgJXM6XFxcXG5cXFwiLCBtb2QtXFx1MDAzZW5hbWUpO1xcbjE3NjM6XFx0XFx0X19sYXlvdXRfc2VjdGlvbnMobW9kLCBpbmZvLCB0cnVlKTtcXG4xNzY0OlxcdH1cXG4xNzY1OlxcdFxcbjE3NjY6XFx0c3RhdGljIHZvaWQgbW9kdWxlX2xpY2Vuc2VfdGFpbnRfY2hlY2soc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpsaWNlbnNlKVxcbjE3Njc6XFx0e1xcbjE3Njg6XFx0XFx0aWYgKCFsaWNlbnNlKVxcbjE3Njk6XFx0XFx0XFx0bGljZW5zZSA9IFxcXCJ1bnNwZWNpZmllZFxcXCI7XFxuMTc3MDpcXHRcXG4xNzcxOlxcdFxcdGlmICghbGljZW5zZV9pc19ncGxfY29tcGF0aWJsZShsaWNlbnNlKSkge1xcbjE3NzI6XFx0XFx0XFx0aWYgKCF0ZXN0X3RhaW50KFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRSkpXFxuMTc3MzpcXHRcXHRcXHRcXHRwcl93YXJuKFxcXCIlczogbW9kdWxlIGxpY2Vuc2UgJyVzJyB0YWludHMga2VybmVsLlxcXFxuXFxcIixcXG4xNzc0OlxcdFxcdFxcdFxcdFxcdG1vZC1cXHUwMDNlbmFtZSwgbGljZW5zZSk7XFxuMTc3NTpcXHRcXHRcXHRhZGRfdGFpbnRfbW9kdWxlKG1vZCwgVEFJTlRfUFJPUFJJRVRBUllfTU9EVUxFLFxcbjE3NzY6XFx0XFx0XFx0XFx0XFx0IExPQ0tERVBfTk9XX1VOUkVMSUFCTEUpO1xcbjE3Nzc6XFx0XFx0fVxcbjE3Nzg6XFx0fVxcbjE3Nzk6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQzOjEwLjkwMTI2MDk3OFoiLCJTZXEiOjUzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0Mjg2MzI2MzI3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uXG5cbioqVW5kZXJzdGFuZGluZyB0aGUgU2VjdGlvbiBMYXlvdXQgYW5kIE1vZHVsZSBNb3ZlbWVudCoqXG5cbkFscmlnaHQsIHNvIGBsYXlvdXRfc2VjdGlvbnNgIOKAkyB0aGF0J3MgdGhlIGZ1bmN0aW9uIHRoYXQncyBzZXR0aW5nIGBzaF9lbnRzaXplYCB0bywgZXNzZW50aWFsbHksIGEgbWF4aW11bSB1bnNpZ25lZCBsb25nLCByaWdodD8gQW5kIGZyb20gdGhlcmUsIGl0J3MgY2FsY3VsYXRpbmcgb2Zmc2V0cyBmb3IgdGhlIHNlY3Rpb25zLiBUaGF0IHNlZW1zIHByZXR0eSBzdGFuZGFyZCBmb3Igc2V0dGluZyB1cCB0aGUgaW5pdGlhbCBsYXlvdXQuIEJ1dCB0aGUgbmV4dCBwYXJ0IGlzIGludGVyZXN0aW5nLlxuXG5JZiBgbW92ZV9tb2R1bGVgIGhpdHMgYW4gYC1FQUdBSU5gIGVycm9yIOKAkyB3aGljaCBpbXBsaWVzIGEgdGVtcG9yYXJ5IHJlc291cmNlIGlzc3VlLCBwZXJoYXBzIGEgbG9jayBjb250ZW50aW9uIG9yIHNvbWV0aGluZyBzaW1pbGFyIOKAkyBpdCByZXNldHMgdGhlIHNlY3Rpb24gc2l6ZXMgdG8gemVyby4gQW5kIG9uIHRvcCBvZiB0aGF0LCBpdCB1bnNldHMgdGhlIGBTSEZfQUxMT0NgIGZsYWcgZm9yIGJvdGggdGhlIHN5bWJvbCB0YWJsZSBhbmQgdGhlIHN0cmluZyB0YWJsZS4gTm93LCB0aGUgYFNIRl9BTExPQ2AgZmxhZyBpcyBjcnVjaWFsOyBpdCBtZWFucyB0aGUgc2VjdGlvbiBpcyBzdXBwb3NlZCB0byByZXNpZGUgaW4gbWVtb3J5IGF0IHJ1bnRpbWUuIFJlc2V0dGluZyB0aGUgc2l6ZXMgYW5kIGNsZWFyaW5nIHRoYXQgZmxhZ+KApiB0aGF0J3MgYSBwcmV0dHkgZHJhc3RpYyByb2xsYmFjay4gSXQgc2VlbXMgbGlrZSBpdCdzIHRyeWluZyB0byBlbnN1cmUgbm8gcGFydGlhbGx5LWFsbG9jYXRlZCBkYXRhIGlzIGxlZnQgaGFuZ2luZyBhcm91bmQsIGEga2luZCBvZiBjbGVhbi11cCBvcGVyYXRpb24gaW4gY2FzZSBvZiBmYWlsdXJlLlxuXG5XYWl0IGEgc2Vjb25k4oCmIGBtb3ZlX21vZHVsZWAgaXMgKmNhbGxlZCogYWZ0ZXIgYGxheW91dF9zZWN0aW9uc2AgYW5kIGBsYXlvdXRfc3ltdGFiYC4gSSB3YXMgZXhwZWN0aW5nIHRoZSBvdGhlciB3YXkgYXJvdW5kLiBPa2F5LCBnaXZlbiB0aGF0IG9yZGVyaW5nLCBJIG5lZWQgdG8gY2hlY2sgaG93IGBtb3ZlX21vZHVsZWAgd29ya3MgYmVjYXVzZSBpdHMgYmVoYXZpb3IgaXMgY2VudHJhbCB0byB0aGUgb3ZlcmFsbCBwcm9jZXNzLiBUaW1lIHRvIGRpZyBpbnRvIHRoZSBgbW92ZV9tb2R1bGVgIGZ1bmN0aW9uIGFuZCBnZXQgYSBiZXR0ZXIgcGljdHVyZSBvZiB3aGF0J3MgZ29pbmcgb24gd2l0aCByZXNvdXJjZSBtYW5hZ2VtZW50IGFuZCBzZWN0aW9uIGFsbG9jYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk2NDYsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5MiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQzOjE1LjE4NzU5MDQ2NVoiLCJTZXEiOjU0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDU3MzkyODcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibW92ZV9tb2R1bGVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL21vZHVsZS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL21vZHVsZS9tYWluLmM9MjM2ND1zdGF0aWMgaW50IGVsZl92YWxpZGl0eV9jYWNoZV9zdHJ0YWIoc3RydWN0IGxvYWRfaW5mbyAqaW5mbylcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI0MTUtICogQXMgYSBsYXN0IHN0ZXAgd2Ugc2V0IGluZm8tXFx1MDAzZW1vZCB0byB0aGUgdGVtcG9yYXJ5IGNvcHkgb2YgdGhlIG1vZHVsZSBpblxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI0MTY6ICogaW5mby1cXHUwMDNlaGRyLiBUaGUgZmluYWwgb25lIHdpbGwgYmUgYWxsb2NhdGVkIGluIG1vdmVfbW9kdWxlKCkuIEFueVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI0MTctICogbW9kaWZpY2F0aW9ucyB3ZSBtYWtlIHRvIG91ciBjb3B5IG9mIHRoZSBtb2R1bGUgd2lsbCBiZSBjYXJyaWVkIG92ZXJcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jPTI2NTk9c3RhdGljIGludCBmaW5kX21vZHVsZV9zZWN0aW9ucyhzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yNzg3LVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI3ODg6c3RhdGljIGludCBtb3ZlX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pXFxua2VybmVsL21vZHVsZS9tYWluLmMtMjc4OS17XFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0yOTQzPXN0YXRpYyBzdHJ1Y3QgbW9kdWxlICpsYXlvdXRfYW5kX2FsbG9jYXRlKHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGludCBmbGFncylcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5NzgtXFx0LyogQWxsb2NhdGUgYW5kIG1vdmUgdG8gdGhlIGZpbmFsIHBsYWNlICovXFxua2VybmVsL21vZHVsZS9tYWluLmM6Mjk3OTpcXHRlcnIgPSBtb3ZlX21vZHVsZShpbmZvLVxcdTAwM2Vtb2QsIGluZm8pO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5ODAtXFx0aWYgKGVycikge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0MzoxNS4yMzMzMzM4MjJaIiwiU2VxIjo1NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTI2OTA1NzMyNTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipJbml0aWFsIEFzc2Vzc21lbnQ6IE5hdmlnYXRpbmcgdGhlIGBtb3ZlX21vZHVsZWAgQ29kZSoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byB0aGlzIGBtb3ZlX21vZHVsZWAuIE15IGZpcnN0IHRob3VnaHQgaXMgdG8gZ2V0IGEgZ2VuZXJhbCBmZWVsIGZvciBpdHMgcHVycG9zZSBhbmQgc2NvcGUuIFwibW92ZVwiIGlzIGEgcHJldHR5IGJyb2FkIHRlcm0sIHNvIEknbSBpbW1lZGlhdGVseSB0cnlpbmcgdG8gbWVudGFsbHkgY2F0ZWdvcml6ZSB0aGlzIG1vZHVsZS4gSXMgaXQgaGFuZGxpbmcgb2JqZWN0IG1vdmVtZW50IGluIGEgZ2FtZSBlbmdpbmUsIGRhdGEgbWlncmF0aW9uIGJldHdlZW4gZGF0YWJhc2VzLCBmaWxlIHN5c3RlbSBvcGVyYXRpb25zLCBvciBzb21ldGhpbmcgZWxzZSBlbnRpcmVseT8gVGhlIG5hbWUgYWxvbmUgZG9lc24ndCBnaXZlIG1lIGVub3VnaCBjb250ZXh0LiBJJ20gZ29pbmcgdG8gcXVpY2tseSBzY2FuIGZvciBjbHVlcyDigJMgYW55IGltcG9ydHMsIGZ1bmN0aW9uIG5hbWVzLCBjbGFzcyBoaWVyYXJjaGllcywgYW55dGhpbmcgdGhhdCBnaXZlcyBhIGhpbnQgYWJvdXQgdGhlIGRvbWFpbiBhbmQgaW50ZW5kZWQgZnVuY3Rpb25hbGl0eS4gSSdtIGFsc28gY29uc2lkZXJpbmcgdGhlIGFyY2hpdGVjdHVyYWwgY29udGV4dCwgaWYgYW55IGlzIHByb3ZpZGVkIC0gaXMgaXQgcGFydCBvZiBhIGxhcmdlciBzeXN0ZW0sIGEgc3RhbmRhbG9uZSB1dGlsaXR5LCBvciBhIGxpYnJhcnk/IEknbSBhbHJlYWR5IGZvcm11bGF0aW5nIHF1ZXN0aW9uczogV2hhdCBhcmUgdGhlIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBJIHNob3VsZCBsb29rIGZvcj8gQW55IGNvbmN1cnJlbmN5IGlzc3VlcyB0byBjb25zaWRlciBpZiBpdCdzIHRocmVhZGVkPyBXaGF0IGRlc2lnbiBwYXR0ZXJucyBhcmUgbGlrZWx5IGVtcGxveWVkIGdpdmVuIHRoZSAnbW92ZScgb3BlcmF0aW9uPyBFc3NlbnRpYWxseSwgSSdtIHNldHRpbmcgdGhlIHN0YWdlIGZvciBhIGZvY3VzZWQgY29kZSBjb21wcmVoZW5zaW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDQyOCwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDM6MjcuOTIzOTA5NzY2WiIsIlNlcSI6NTYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzNjU1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvbW9kdWxlL21haW4uY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyNzg4LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyNzg4OlxcdHN0YXRpYyBpbnQgbW92ZV9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxcbjI3ODk6XFx0e1xcbjI3OTA6XFx0XFx0aW50IGksIHJldDtcXG4yNzkxOlxcdFxcdGVudW0gbW9kX21lbV90eXBlIHQgPSBNT0RfTUVNX05VTV9UWVBFUztcXG4yNzkyOlxcdFxcdGJvb2wgY29kZXRhZ19zZWN0aW9uX2ZvdW5kID0gZmFsc2U7XFxuMjc5MzpcXHRcXG4yNzk0OlxcdFxcdGZvcl9lYWNoX21vZF9tZW1fdHlwZSh0eXBlKSB7XFxuMjc5NTpcXHRcXHRcXHRpZiAoIW1vZC1cXHUwMDNlbWVtW3R5cGVdLnNpemUpIHtcXG4yNzk2OlxcdFxcdFxcdFxcdG1vZC1cXHUwMDNlbWVtW3R5cGVdLmJhc2UgPSBOVUxMO1xcbjI3OTc6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuMjc5ODpcXHRcXHRcXHR9XFxuMjc5OTpcXHRcXG4yODAwOlxcdFxcdFxcdHJldCA9IG1vZHVsZV9tZW1vcnlfYWxsb2MobW9kLCB0eXBlKTtcXG4yODAxOlxcdFxcdFxcdGlmIChyZXQpIHtcXG4yODAyOlxcdFxcdFxcdFxcdHQgPSB0eXBlO1xcbjI4MDM6XFx0XFx0XFx0XFx0Z290byBvdXRfZXJyO1xcbjI4MDQ6XFx0XFx0XFx0fVxcbjI4MDU6XFx0XFx0fVxcbjI4MDY6XFx0XFxuMjgwNzpcXHRcXHQvKiBUcmFuc2ZlciBlYWNoIHNlY3Rpb24gd2hpY2ggc3BlY2lmaWVzIFNIRl9BTExPQyAqL1xcbjI4MDg6XFx0XFx0cHJfZGVidWcoXFxcIkZpbmFsIHNlY3Rpb24gYWRkcmVzc2VzIGZvciAlczpcXFxcblxcXCIsIG1vZC1cXHUwMDNlbmFtZSk7XFxuMjgwOTpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgaW5mby1cXHUwMDNlaGRyLVxcdTAwM2VlX3NobnVtOyBpKyspIHtcXG4yODEwOlxcdFxcdFxcdHZvaWQgKmRlc3Q7XFxuMjgxMTpcXHRcXHRcXHRFbGZfU2hkciAqc2hkciA9IFxcdTAwMjZpbmZvLVxcdTAwM2VzZWNoZHJzW2ldO1xcbjI4MTI6XFx0XFx0XFx0Y29uc3QgY2hhciAqc25hbWU7XFxuMjgxMzpcXHRcXG4yODE0OlxcdFxcdFxcdGlmICghKHNoZHItXFx1MDAzZXNoX2ZsYWdzIFxcdTAwMjYgU0hGX0FMTE9DKSlcXG4yODE1OlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbjI4MTY6XFx0XFxuMjgxNzpcXHRcXHRcXHRzbmFtZSA9IGluZm8tXFx1MDAzZXNlY3N0cmluZ3MgKyBzaGRyLVxcdTAwM2VzaF9uYW1lO1xcbjI4MTg6XFx0XFx0XFx0LypcXG4yODE5OlxcdFxcdFxcdCAqIExvYWQgY29kZXRhZyBzZWN0aW9ucyBzZXBhcmF0ZWx5IGFzIHRoZXkgbWlnaHQgc3RpbGwgYmUgdXNlZFxcbjI4MjA6XFx0XFx0XFx0ICogYWZ0ZXIgbW9kdWxlIHVubG9hZC5cXG4yODIxOlxcdFxcdFxcdCAqL1xcbjI4MjI6XFx0XFx0XFx0aWYgKGNvZGV0YWdfbmVlZHNfbW9kdWxlX3NlY3Rpb24obW9kLCBzbmFtZSwgc2hkci1cXHUwMDNlc2hfc2l6ZSkpIHtcXG4yODIzOlxcdFxcdFxcdFxcdGRlc3QgPSBjb2RldGFnX2FsbG9jX21vZHVsZV9zZWN0aW9uKG1vZCwgc25hbWUsIHNoZHItXFx1MDAzZXNoX3NpemUsXFxuMjgyNDpcXHRcXHRcXHRcXHRcXHRcXHRhcmNoX21vZF9zZWN0aW9uX3ByZXBlbmQobW9kLCBpKSwgc2hkci1cXHUwMDNlc2hfYWRkcmFsaWduKTtcXG4yODI1OlxcdFxcdFxcdFxcdGlmIChXQVJOX09OKCFkZXN0KSkge1xcbjI4MjY6XFx0XFx0XFx0XFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4yODI3OlxcdFxcdFxcdFxcdFxcdGdvdG8gb3V0X2VycjtcXG4yODI4OlxcdFxcdFxcdFxcdH1cXG4yODI5OlxcdFxcdFxcdFxcdGlmIChJU19FUlIoZGVzdCkpIHtcXG4yODMwOlxcdFxcdFxcdFxcdFxcdHJldCA9IFBUUl9FUlIoZGVzdCk7XFxuMjgzMTpcXHRcXHRcXHRcXHRcXHRnb3RvIG91dF9lcnI7XFxuMjgzMjpcXHRcXHRcXHRcXHR9XFxuMjgzMzpcXHRcXHRcXHRcXHRjb2RldGFnX3NlY3Rpb25fZm91bmQgPSB0cnVlO1xcbjI4MzQ6XFx0XFx0XFx0fSBlbHNlIHtcXG4yODM1OlxcdFxcdFxcdFxcdGVudW0gbW9kX21lbV90eXBlIHR5cGUgPSBzaGRyLVxcdTAwM2VzaF9lbnRzaXplIFxcdTAwM2VcXHUwMDNlIFNIX0VOVFNJWkVfVFlQRV9TSElGVDtcXG4yODM2OlxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gc2hkci1cXHUwMDNlc2hfZW50c2l6ZSBcXHUwMDI2IFNIX0VOVFNJWkVfT0ZGU0VUX01BU0s7XFxuMjgzNzpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDM6MjcuOTI0MTQ3NDc2WiIsIlNlcSI6NTcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE4Nzk0NzQyODAzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjpcblxuKipBbmFseXppbmcgYG1vdmVfbW9kdWxlYCdzIEVycm9yIEhhbmRsaW5nKipcblxuT2theSwgc28gYG1vdmVfbW9kdWxlYCBpcyBhIGNyaXRpY2FsIGZ1bmN0aW9uLCBhbmQgSSdtIGxvb2tpbmcgYXQgaG93IGl0IGhhbmRsZXMgZmFpbHVyZXMuIFRoZSBjcnVjaWFsIHBvaW50IGhlcmUgaXMgdGhlIGJlaGF2aW9yIG9uIGVycm9yOiBJZiBpdCBmYWlscywgdGhlIGZ1bmN0aW9uICpmcmVlcyogYW55IGFsbG9jYXRlZCBtZW1vcnkgYW5kIHRoZW4gcmV0dXJucyBhbiBlcnJvci4gVGhpcyBpcyBnb29kIHByYWN0aWNlIOKAkyByZXNvdXJjZSBjbGVhbnVwIGlzIHBhcmFtb3VudCwgZXNwZWNpYWxseSB3aGVuIGRlYWxpbmcgd2l0aCBwb3RlbnRpYWxseSBjb21wbGV4IG1vZHVsZSBtb3ZlbWVudHMuIFRoYXQgbWVtb3J5IG1hbmFnZW1lbnQgc3RyYXRlZ3kgaXMgc29saWQuIE5vdywgSSBuZWVkIHRvIGRpZyBkZWVwZXIgdG8gZnVsbHkgdW5kZXJzdGFuZCBob3cgaXQgb3BlcmF0ZXMgdW5kZXIgdGhlIGhvb2QuIExldCdzIGdldCBpbnRvIHRoZSBkZXRhaWxzIG9mIHRoZSByZXN0IG9mIHRoZSBgbW92ZV9tb2R1bGVgIGZ1bmN0aW9uIGFuZCB0aGUgZXhhY3QgbWVjaGFuaXNtIG9mIHRoZSBlcnJvciBjb25kaXRpb25zIGl0IGNvdmVycy4gVGhhdCdzIHdoZXJlIHRoZSByZWFsIHZhbHVlIGlzIGluIGZpZ3VyaW5nIG91dCBob3cgcm9idXN0IHRoaXMgY29kZSBpcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE0ODksIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQzOjQ2LjcxODg5MjkyOVoiLCJTZXEiOjU4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTczMTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL21vZHVsZS9tYWluLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjgzOCxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjgzODpcXHRcXHRcXHRcXHRkZXN0ID0gbW9kLVxcdTAwM2VtZW1bdHlwZV0uYmFzZSArIG9mZnNldDtcXG4yODM5OlxcdFxcdFxcdH1cXG4yODQwOlxcdFxcbjI4NDE6XFx0XFx0XFx0aWYgKHNoZHItXFx1MDAzZXNoX3R5cGUgIT0gU0hUX05PQklUUykge1xcbjI4NDI6XFx0XFx0XFx0XFx0LypcXG4yODQzOlxcdFxcdFxcdFxcdCAqIE91ciBFTEYgY2hlY2tlciBhbHJlYWR5IHZhbGlkYXRlZCB0aGlzLCBidXQgbGV0J3NcXG4yODQ0OlxcdFxcdFxcdFxcdCAqIGJlIHBlZGFudGljIGFuZCBtYWtlIHRoZSBnb2FsIGNsZWFyZXIuIFdlIGFjdHVhbGx5XFxuMjg0NTpcXHRcXHRcXHRcXHQgKiBlbmQgdXAgY29weWluZyBvdmVyIGFsbCBtb2RpZmljYXRpb25zIG1hZGUgdG8gdGhlXFxuMjg0NjpcXHRcXHRcXHRcXHQgKiB1c2Vyc3BhY2UgY29weSBvZiB0aGUgZW50aXJlIHN0cnVjdCBtb2R1bGUuXFxuMjg0NzpcXHRcXHRcXHRcXHQgKi9cXG4yODQ4OlxcdFxcdFxcdFxcdGlmIChpID09IGluZm8tXFx1MDAzZWluZGV4Lm1vZCBcXHUwMDI2XFx1MDAyNlxcbjI4NDk6XFx0XFx0XFx0XFx0ICAgKFdBUk5fT05fT05DRShzaGRyLVxcdTAwM2VzaF9zaXplICE9IHNpemVvZihzdHJ1Y3QgbW9kdWxlKSkpKSB7XFxuMjg1MDpcXHRcXHRcXHRcXHRcXHRyZXQgPSAtRU5PRVhFQztcXG4yODUxOlxcdFxcdFxcdFxcdFxcdGdvdG8gb3V0X2VycjtcXG4yODUyOlxcdFxcdFxcdFxcdH1cXG4yODUzOlxcdFxcdFxcdFxcdG1lbWNweShkZXN0LCAodm9pZCAqKXNoZHItXFx1MDAzZXNoX2FkZHIsIHNoZHItXFx1MDAzZXNoX3NpemUpO1xcbjI4NTQ6XFx0XFx0XFx0fVxcbjI4NTU6XFx0XFx0XFx0LypcXG4yODU2OlxcdFxcdFxcdCAqIFVwZGF0ZSB0aGUgdXNlcnNwYWNlIGNvcHkncyBFTEYgc2VjdGlvbiBhZGRyZXNzIHRvIHBvaW50IHRvXFxuMjg1NzpcXHRcXHRcXHQgKiBvdXIgbmV3bHkgYWxsb2NhdGVkIG1lbW9yeSBhcyBhIHB1cmUgY29udmVuaWVuY2Ugc28gdGhhdFxcbjI4NTg6XFx0XFx0XFx0ICogdXNlcnMgb2YgaW5mbyBjYW4ga2VlcCB0YWtpbmcgYWR2YW50YWdlIGFuZCB1c2luZyB0aGUgbmV3bHlcXG4yODU5OlxcdFxcdFxcdCAqIG1pbnRlZCBvZmZpY2lhbCBtZW1vcnkgYXJlYS5cXG4yODYwOlxcdFxcdFxcdCAqL1xcbjI4NjE6XFx0XFx0XFx0c2hkci1cXHUwMDNlc2hfYWRkciA9ICh1bnNpZ25lZCBsb25nKWRlc3Q7XFxuMjg2MjpcXHRcXHRcXHRwcl9kZWJ1ZyhcXFwiXFxcXHQweCVseCAweCUuOGx4ICVzXFxcXG5cXFwiLCAobG9uZylzaGRyLVxcdTAwM2VzaF9hZGRyLFxcbjI4NjM6XFx0XFx0XFx0XFx0IChsb25nKXNoZHItXFx1MDAzZXNoX3NpemUsIGluZm8tXFx1MDAzZXNlY3N0cmluZ3MgKyBzaGRyLVxcdTAwM2VzaF9uYW1lKTtcXG4yODY0OlxcdFxcdH1cXG4yODY1OlxcdFxcbjI4NjY6XFx0XFx0cmV0dXJuIDA7XFxuMjg2NzpcXHRvdXRfZXJyOlxcbjI4Njg6XFx0XFx0bW9kdWxlX21lbW9yeV9yZXN0b3JlX3JveChtb2QpO1xcbjI4Njk6XFx0XFx0d2hpbGUgKHQtLSlcXG4yODcwOlxcdFxcdFxcdG1vZHVsZV9tZW1vcnlfZnJlZShtb2QsIHQpO1xcbjI4NzE6XFx0XFx0aWYgKGNvZGV0YWdfc2VjdGlvbl9mb3VuZClcXG4yODcyOlxcdFxcdFxcdGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnMobW9kKTtcXG4yODczOlxcdFxcbjI4NzQ6XFx0XFx0cmV0dXJuIHJldDtcXG4yODc1OlxcdH1cXG4yODc2OlxcdFxcbjI4Nzc6XFx0c3RhdGljIGludCBjaGVja19leHBvcnRfc3ltYm9sX3NlY3Rpb25zKHN0cnVjdCBtb2R1bGUgKm1vZClcXG4yODc4OlxcdHtcXG4yODc5OlxcdFxcdGlmIChtb2QtXFx1MDAzZW51bV9zeW1zIFxcdTAwMjZcXHUwMDI2ICFtb2QtXFx1MDAzZWZsYWdzdGFiKSB7XFxuMjg4MDpcXHRcXHRcXHRwcl9lcnIoXFxcIiVzOiBubyBmbGFncyBmb3IgZXhwb3J0ZWQgc3ltYm9sc1xcXFxuXFxcIiwgbW9kLVxcdTAwM2VuYW1lKTtcXG4yODgxOlxcdFxcdFxcdHJldHVybiAtRU5PRVhFQztcXG4yODgyOlxcdFxcdH1cXG4yODgzOlxcdCNpZmRlZiBDT05GSUdfTU9EVkVSU0lPTlNcXG4yODg0OlxcdFxcdGlmIChtb2QtXFx1MDAzZW51bV9zeW1zIFxcdTAwMjZcXHUwMDI2ICFtb2QtXFx1MDAzZWNyY3MpIHtcXG4yODg1OlxcdFxcdFxcdHJldHVybiB0cnlfdG9fZm9yY2VfbG9hZChtb2QsXFxuMjg4NjpcXHRcXHRcXHRcXHRcXHRcXHQgXFxcIm5vIHZlcnNpb25zIGZvciBleHBvcnRlZCBzeW1ib2xzXFxcIik7XFxuMjg4NzpcXHRcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQzOjQ2LjcxOTA1MTk4OVoiLCJTZXEiOjU5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxOTgyMTk0MzUxMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEVBR0FJTiBFcnJvciBpbiBNb2R1bGUgUmVsb2NhdGlvbioqXG5cbk9rYXksIHNvIGlmIGBtb3ZlX21vZHVsZWAgaXMgYmFyZmluZyB3aXRoIGFuIGAtRUFHQUlOYCwgdGhlIGxpa2VseSBjdWxwcml0IGlzIHRoYXQgYGNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb25gIGFsc28gcmV0dXJuZWQgYC1FQUdBSU5gLiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aHkuIFJpZ2h0LCBgY29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbmAgY2FsbHMgYHJlc2VydmVfbW9kdWxlX3RhZ3NgLCB3aGljaCBpcyBpbiBgbW0vYWxsb2NfdGFnLmNgLiBMZXQncyBkaWcgaW50byB0aGF0IGByZXNlcnZlX21vZHVsZV90YWdzYCBmdW5jdGlvbi4gSSdsbCB0YWtlIGEgbG9vayBhdCB0aGUgY29kZTpcblxuYGBgY1xuXHRcdGlmICghdGFnc19hZGRyZXNzYWJsZSgpKSB7XG5cdFx0XHRzaHV0ZG93bl9tZW1fcHJvZmlsaW5nKHRydWUpO1xuXHRcdFx0cHJfd2Fybl9vbmNlKFwiV2l0aCBtb2R1bGUgJXMgdGhlcmUgYXJlIHRvbyBtYW55IHRhZ3MgdG8gZml0IGluICVkIHBhZ2UgZmxhZyBiaXRzLiBNZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgaXMgZGlzYWJsZWQhXFxuXCIsXG5cdFx0XHRcdCAgICAgbW9kLVx1MDAzZW5hbWUsIE5SX1VOVVNFRF9QQUdFRkxBR19CSVRTKTtcblx0XHRcdHJlbGVhc2VfbW9kdWxlX3RhZ3MobW9kLCBmYWxzZSk7XG5cdFx0XHRyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTtcblx0XHR9XG5gYGBcblxuQWgsIEkgc2VlLiBMb29rcyBsaWtlIHRoZSBtb2R1bGUgaXMgcmVxdWVzdGluZyB0b28gbWFueSB0YWdzLCB0byB0aGUgcG9pbnQgd2hlcmUgdGhleSBjYW4ndCBmaXQgaW50byB0aGUgYXZhaWxhYmxlIHBhZ2UgZmxhZyBiaXRzLiBUaGUgc3lzdGVtIHNodXRzIGRvd24gbWVtb3J5IHByb2ZpbGluZyB0byBhdm9pZCBhIHBvdGVudGlhbCBjYXRhc3Ryb3BoaWMgZmFpbHVyZSBhbmQgdGhlbiBpdCByZXR1cm5zIGAtRUFHQUlOYC4gVGhlIGNydWNpYWwgZGV0YWlsIGlzIHRoYXQgaXQgKmFsc28qIGNhbGxzIGByZWxlYXNlX21vZHVsZV90YWdzYCBhdCB0aGlzIHBvaW50LiBTbywgdGhlIG1vZHVsZSBpcyBlc3NlbnRpYWxseSBnaXZlbiB1cCBvbi5cblxuTm93LCBpZiBgbW92ZV9tb2R1bGVgIGdldHMgdGhpcyBgLUVBR0FJTmAsIGl0IGp1bXBzIHRvIGBvdXRfZXJyYCwgd2hpY2ggbWVhbnMgbWVtb3J5IGlzIGZyZWVkIGFuZCB0aGVuIGl0IGNhbGxzIGBjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKG1vZClgLiBOb3csIHRoZSBpbXBvcnRhbnQgcXVlc3Rpb24gaXM6IERvZXMgYGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNgICphbHNvKiBjYWxsIGByZWxlYXNlX21vZHVsZV90YWdzYD8gVGhhdCdzIHdoYXQgSSBuZWVkIHRvIGNvbmZpcm0uIEkgc2hvdWxkIGNoZWNrIGBjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zYCB0byBiZSBzdXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjQ5OCwiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI2MywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQ0OjA2LjU0MDk5OTMzWiIsIlNlcSI6NjAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDI0OTA2NjkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvY29kZXRhZy5oPTk0PXZvaWQgKmNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxcbi0tXFxuaW5jbHVkZS9saW51eC9jb2RldGFnLmgtOTYtXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBhbGlnbik7XFxuaW5jbHVkZS9saW51eC9jb2RldGFnLmg6OTc6dm9pZCBjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKHN0cnVjdCBtb2R1bGUgKm1vZCk7XFxuaW5jbHVkZS9saW51eC9jb2RldGFnLmgtOTgtdm9pZCBjb2RldGFnX21vZHVsZV9yZXBsYWNlZChzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBtb2R1bGUgKm5ld19tb2QpO1xcbi0tXFxuaW5jbHVkZS9saW51eC9jb2RldGFnLmg9MTA4PWNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxcbi0tXFxuaW5jbHVkZS9saW51eC9jb2RldGFnLmgtMTEwLVxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBhbGlnbikgeyByZXR1cm4gTlVMTDsgfVxcbmluY2x1ZGUvbGludXgvY29kZXRhZy5oOjExMTpzdGF0aWMgaW5saW5lIHZvaWQgY29kZXRhZ19mcmVlX21vZHVsZV9zZWN0aW9ucyhzdHJ1Y3QgbW9kdWxlICptb2QpIHt9XFxuaW5jbHVkZS9saW51eC9jb2RldGFnLmgtMTEyLXN0YXRpYyBpbmxpbmUgdm9pZCBjb2RldGFnX21vZHVsZV9yZXBsYWNlZChzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBtb2R1bGUgKm5ld19tb2QpIHt9XFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0yNzg4PXN0YXRpYyBpbnQgbW92ZV9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmMtMjg3MS1cXHRpZiAoY29kZXRhZ19zZWN0aW9uX2ZvdW5kKVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI4NzI6XFx0XFx0Y29kZXRhZ19mcmVlX21vZHVsZV9zZWN0aW9ucyhtb2QpO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI4NzMtXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYz0zMDA0PXN0YXRpYyB2b2lkIG1vZHVsZV9kZWFsbG9jYXRlKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbylcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTMwMDctXFx0bW9kdWxlX2FyY2hfZnJlZWluZ19pbml0KG1vZCk7XFxua2VybmVsL21vZHVsZS9tYWluLmM6MzAwODpcXHRjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKG1vZCk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMzAwOS1cXG4tLVxcbmxpYi9jb2RldGFnLmM9MjgxPXZvaWQgKmNvZGV0YWdfYWxsb2NfbW9kdWxlX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpuYW1lLFxcbi0tXFxubGliL2NvZGV0YWcuYy0zMDUtXFxubGliL2NvZGV0YWcuYzozMDY6dm9pZCBjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKHN0cnVjdCBtb2R1bGUgKm1vZClcXG5saWIvY29kZXRhZy5jLTMwNy17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQ0OjA3Ljk2NTkxMDY1WiIsIlNlcSI6NjEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU2MDY1MzE4MzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDpcblxuKipEaXZpbmcgaW50byBgY29kZXRhZy5jYCoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBjaGVjayBvdXQgYGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnNgIOKAkyBsb29rcyBsaWtlIHRoYXQncyB0aGUgZnVuY3Rpb24gSSBuZWVkIHRvIGZvY3VzIG9uIHJpZ2h0IG5vdy4gSXQncyBpbiBgbGliL2NvZGV0YWcuY2AsIHdoaWNoIG1ha2VzIHNlbnNlOyB0aGlzIHByb2JhYmx5IGRlYWxzIHdpdGggc29tZSBjb3JlIHJlc291cmNlIG1hbmFnZW1lbnQuIEknbSBndWVzc2luZyBpdCdzIHBhcnQgb2YgdGhlIGNsZWFudXAgYWZ0ZXIgYSBjb2RldGFnIG1vZHVsZSBpcyBkb25lIGJlaW5nIHVzZWQuIEknbGwgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBzZWN0aW9ucyBhcmUgYWxsb2NhdGVkIHdpdGhpbiBhIG1vZHVsZSwgYW5kIGhvdyB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMgZGVhbGxvY2F0aW9uIHRvIGF2b2lkIG1lbW9yeSBsZWFrcyBvciBkYW5nbGluZyBwb2ludGVycy4gTGV0J3MgZ2V0IHRvIHRoZSBjb2RlIGFuZCBzZWUgd2hhdCBpdCdzIHJlYWxseSBkb2luZy4gVGltZSB0byBwdXQgb24gbXkgZGVidWdnaW5nIGhhdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTM3NDUsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0NDoxMy41NzI0NDUzMDNaIiwiU2VxIjo2MiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Nzg4MzEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibGliL2NvZGV0YWcuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzMDYsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzMDY6XFx0dm9pZCBjb2RldGFnX2ZyZWVfbW9kdWxlX3NlY3Rpb25zKHN0cnVjdCBtb2R1bGUgKm1vZClcXG4gMzA3OlxcdHtcXG4gMzA4OlxcdFxcdHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZTtcXG4gMzA5OlxcdFxcbiAzMTA6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2Y29kZXRhZ19sb2NrKTtcXG4gMzExOlxcdFxcdGxpc3RfZm9yX2VhY2hfZW50cnkoY3R0eXBlLCBcXHUwMDI2Y29kZXRhZ190eXBlcywgbGluaykge1xcbiAzMTI6XFx0XFx0XFx0aWYgKCFjdHR5cGUtXFx1MDAzZWRlc2MuZnJlZV9zZWN0aW9uX21lbSlcXG4gMzEzOlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbiAzMTQ6XFx0XFxuIDMxNTpcXHRcXHRcXHRkb3duX3dyaXRlKFxcdTAwMjZjdHR5cGUtXFx1MDAzZW1vZF9sb2NrKTtcXG4gMzE2OlxcdFxcdFxcdGN0dHlwZS1cXHUwMDNlZGVzYy5mcmVlX3NlY3Rpb25fbWVtKG1vZCwgZmFsc2UpO1xcbiAzMTc6XFx0XFx0XFx0dXBfd3JpdGUoXFx1MDAyNmN0dHlwZS1cXHUwMDNlbW9kX2xvY2spO1xcbiAzMTg6XFx0XFx0fVxcbiAzMTk6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZjb2RldGFnX2xvY2spO1xcbiAzMjA6XFx0fVxcbiAzMjE6XFx0XFxuIDMyMjpcXHR2b2lkIGNvZGV0YWdfbW9kdWxlX3JlcGxhY2VkKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IG1vZHVsZSAqbmV3X21vZClcXG4gMzIzOlxcdHtcXG4gMzI0OlxcdFxcdHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZTtcXG4gMzI1OlxcdFxcbiAzMjY6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2Y29kZXRhZ19sb2NrKTtcXG4gMzI3OlxcdFxcdGxpc3RfZm9yX2VhY2hfZW50cnkoY3R0eXBlLCBcXHUwMDI2Y29kZXRhZ190eXBlcywgbGluaykge1xcbiAzMjg6XFx0XFx0XFx0aWYgKCFjdHR5cGUtXFx1MDAzZWRlc2MubW9kdWxlX3JlcGxhY2VkKVxcbiAzMjk6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuIDMzMDpcXHRcXG4gMzMxOlxcdFxcdFxcdGRvd25fd3JpdGUoXFx1MDAyNmN0dHlwZS1cXHUwMDNlbW9kX2xvY2spO1xcbiAzMzI6XFx0XFx0XFx0Y3R0eXBlLVxcdTAwM2VkZXNjLm1vZHVsZV9yZXBsYWNlZChtb2QsIG5ld19tb2QpO1xcbiAzMzM6XFx0XFx0XFx0dXBfd3JpdGUoXFx1MDAyNmN0dHlwZS1cXHUwMDNlbW9kX2xvY2spO1xcbiAzMzQ6XFx0XFx0fVxcbiAzMzU6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZjb2RldGFnX2xvY2spO1xcbiAzMzY6XFx0fVxcbiAzMzc6XFx0XFxuIDMzODpcXHRpbnQgY29kZXRhZ19sb2FkX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QpXFxuIDMzOTpcXHR7XFxuIDM0MDpcXHRcXHRzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGU7XFxuIDM0MTpcXHRcXHRpbnQgcmV0ID0gMDtcXG4gMzQyOlxcdFxcbiAzNDM6XFx0XFx0aWYgKCFtb2QpXFxuIDM0NDpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gMzQ1OlxcdFxcbiAzNDY6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2Y29kZXRhZ19sb2NrKTtcXG4gMzQ3OlxcdFxcdGxpc3RfZm9yX2VhY2hfZW50cnkoY3R0eXBlLCBcXHUwMDI2Y29kZXRhZ190eXBlcywgbGluaykge1xcbiAzNDg6XFx0XFx0XFx0cmV0ID0gY29kZXRhZ19tb2R1bGVfaW5pdChjdHR5cGUsIG1vZCk7XFxuIDM0OTpcXHRcXHRcXHRpZiAocmV0KVxcbiAzNTA6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDM1MTpcXHRcXHR9XFxuIDM1MjpcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNmNvZGV0YWdfbG9jayk7XFxuIDM1MzpcXHRcXG4gMzU0OlxcdFxcdHJldHVybiByZXQ7XFxuIDM1NTpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQ0OjEzLjU3MjUyNTQ0M1oiLCJTZXEiOjYzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNjQyMjQ4MzgxMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNb2R1bGUgVGFnZ2luZyBhbmQgQWxsb2NhdGlvbiBMb2dpYyAtIEEgUXVpY2sgUmV2aWV3KipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBJdCBsb29rcyBsaWtlIGBjdHR5cGUtXHUwMDNlZGVzYy5mcmVlX3NlY3Rpb25fbWVtYCBpcyBzaW1wbHkgYHJlbGVhc2VfbW9kdWxlX3RhZ3NgLiBJIG5lZWQgdG8gYmUgY2FyZWZ1bCB3aXRoIHRoZSBkb3VibGUtZnJlZSBwb3RlbnRpYWwuIEluIGByZXNlcnZlX21vZHVsZV90YWdzYCwgaWYgdGhlcmUgYXJlIHRvbyBtYW55IHRhZ3MsIGl0IGRpc2FibGVzIG1lbW9yeSBwcm9maWxpbmcsIHdhcm5zLCBhbmQgY2FsbHMgYHJlbGVhc2VfbW9kdWxlX3RhZ3MobW9kLCBmYWxzZSlgLCByZXR1cm5pbmcgYC1FQUdBSU5gLiBUaGUgY3JpdGljYWwgcGF0aCBoZXJlIGlzIGlmIHRoaXMgbGVhZHMgdG8gYSByZXRyeS4gYG1vdmVfbW9kdWxlYCBqdW1wcyB0byBgb3V0X2VycmAsIHdoaWNoICpzaG91bGQqIGNhbGwgYGNvZGV0YWdfZnJlZV9tb2R1bGVfc2VjdGlvbnMobW9kKWAsIHdoaWNoIGl0c2VsZiBjYWxscyBgcmVsZWFzZV9tb2R1bGVfdGFncyhtb2QsIGZhbHNlKWAgYWdhaW4uIEhvd2V2ZXIsIGJhc2VkIG9uIHRoZSBzdHJ1Y3R1cmUgaGVyZSBpdCBzaG91bGRuJ3QgYmUgYW4gaXNzdWU6IGByZWxlYXNlX21vZHVsZV90YWdzYCBjaGVja3MgaWYgdGhlIG1vZHVsZSBpcyBmb3VuZCBpbiB0aGUgbWFwbGUgdHJlZSBgbW9kX2FyZWFfbXRgIGFuZCBpZiBpdCBpcyBub3QgaXQgYmFpbHMuXG5cbkxldCBtZSB0aGlua+KApiBpZiBgY29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbmAgcmV0dXJucyBgLUVBR0FJTmAsIHRoZW4gYGNvZGV0YWdfc2VjdGlvbl9mb3VuZGAgKm1pZ2h0KiBoYXZlIGJlZW4gc2V0LiBJbiBgbW92ZV9tb2R1bGVgLCBpZiBgY29kZXRhZ19hbGxvY19tb2R1bGVfc2VjdGlvbmAgZmFpbHMgb24gdGhlIGZpcnN0IGNvZGV0YWcgc2VjdGlvbiwgYGNvZGV0YWdfc2VjdGlvbl9mb3VuZGAgaXMgZmFsc2UsIGFuZCBgY29kZXRhZ19mcmVlX21vZHVsZV9zZWN0aW9uc2AgaXNuJ3QgY2FsbGVkLiBJZiBpdCBmYWlscyBvbiB0aGUgc2Vjb25kIHNlY3Rpb24sIGl0ICppcyogY2FsbGVkLiBCdXQgc2luY2UgYHJlbGVhc2VfbW9kdWxlX3RhZ3NgIHJlbW92ZXMgdGhlIG1vZHVsZSBmcm9tIHRoZSBtYXBsZSB0cmVlLCB0aGUgc2Vjb25kIGNhbGwgdG8gaXQgd29uJ3QgZmluZCB0aGUgbW9kdWxlIGFuZCBub3RoaW5nIGJhZCB3aWxsIGhhcHBlbi4gSSB0aGluayB0aGUgZG91YmxlIGZyZWUgaXNzdWUgaXMgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIHN0YXRlLlxuXG5Ob3csIGxldCdzIHJlLWV4YW1pbmUgdGhhdCByZXRyeSBsb2dpYyBpbiBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAuIEl0J3MgYSBiaXQgdHJpY2t5LiBUaGUgY29kZSBmaXJzdCBsYXlzIG91dCB0aGUgc2VjdGlvbnMgYW5kIHN5bWJvbCB0YWJsZSwgdGhlbiBhdHRlbXB0cyB0byBtb3ZlIHRoZSBtb2R1bGUuIElmIHRoYXQgbW92ZSByZXR1cm5zIGAtRUFHQUlOYCwgaXQgcmV0cmllcy4gVGhlIGludGVyZXN0aW5nIHBhcnQgaGVyZSBpcyB3aGF0IGhhcHBlbnMgd2hlbiBpdCByZXRyaWVzLiBTaXplcyBhcmUgcmVzZXQsIGFuZCB0aGUgaGVhZGVycyBhcmUgcmV3cml0dGVuLiBTcGVjaWZpY2FsbHkgYGluZm8tXHUwMDNlbW9kLVx1MDAzZW1lbVt0eXBlXS5zaXplID0gMDtgIGFuZCBgaW5mby1cdTAwM2VzZWNoZHJzW2luZm8tXHUwMDNlaW5kZXguc3ltXS5zaF9mbGFncyBcdTAwMjY9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7YC5cblxuSXMgdGhlcmUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJlaW5nIGV4cG9zZWQ/IGBpbmZvLVx1MDAzZW1vZC1cdTAwM2VtZW1bdHlwZV0uc2l6ZSA9IDBgIGNsZWFycyB0aGUgc2l6ZXMuIGBsYXlvdXRfc2VjdGlvbnNgIHJlY2FsY3VsYXRlcyB0aGVzZSBzaXplcy4gYHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzYCByZXNldHMgYHNoX2FkZHJgIHRvIHRoZSB0ZW1wb3JhcnkgaW1hZ2UuIEkgdGhpbmsgdGhhdCBpcyBvay4gV2FpdCwgYGxheW91dF9zZWN0aW9uc2Agc2V0cyBgc2hfZW50c2l6ZWAgdG8gYH4wVUxgIGFuZCB0aGVuIGNhbGxzIGBfX2xheW91dF9zZWN0aW9uc2AuIGBfX2xheW91dF9zZWN0aW9uc2AgY2FsY3VsYXRlcyBvZmZzZXRzIGFuZCBzZXRzIGBzaF9lbnRzaXplYC4gSXMgdGhlcmUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBOby4gSXQgZG9lc24ndCBzZWVtIHRvIGV4cG9zZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnksIG5vciBkb2VzIGl0IHVzZSB1bmluaXRpYWxpemVkIG1lbW9yeSBmb3IgY29udHJvbCBmbG93LiBUaGUgYGluZm9gIHN0cnVjdCBpcyBmdWxseSBpbml0aWFsaXplZCBhdCB0aGlzIHBvaW50LlxuXG5BaGEhIGBpbmZvLVx1MDAzZXNlY2hkcnNbaW5mby1cdTAwM2VpbmRleC5zeW1dLnNoX2ZsYWdzIFx1MDAyNj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQztgIGNsZWFycyB0aGUgYFNIRl9BTExPQ2AgZmxhZyBmcm9tIHRoZSBzeW1ib2wgdGFibGUgYW5kIHN0cmluZyB0YWJsZSBzZWN0aW9ucy4gV2h5PyBJIG5lZWQgdG8gY2hlY2sgYGxheW91dF9zeW10YWJgIHRvIHVuZGVyc3RhbmQgdGhpcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ2NjIsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDkyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDQ6MjkuOTk1MDEyMTU1WiIsIlNlcSI6NjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0Mzk3OTIxNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJsYXlvdXRfc3ltdGFiXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9tb2R1bGUvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9tb2R1bGUvaW50ZXJuYWwuaD0zNTY9dm9pZCBpbml0X2J1aWxkX2lkKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3Qgc3RydWN0IGxvYWRfaW5mbyAqaW5mbyk7XFxua2VybmVsL21vZHVsZS9pbnRlcm5hbC5oOjM1Nzp2b2lkIGxheW91dF9zeW10YWIoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKTtcXG5rZXJuZWwvbW9kdWxlL2ludGVybmFsLmgtMzU4LXZvaWQgYWRkX2thbGxzeW1zKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3Qgc3RydWN0IGxvYWRfaW5mbyAqaW5mbyk7XFxuLS1cXG5rZXJuZWwvbW9kdWxlL2ludGVybmFsLmg9MzY1PXN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2J1aWxkX2lkKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3Qgc3RydWN0IGxvYWRfaW5mbyAqaW5mbykgeyB9XFxua2VybmVsL21vZHVsZS9pbnRlcm5hbC5oOjM2NjpzdGF0aWMgaW5saW5lIHZvaWQgbGF5b3V0X3N5bXRhYihzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pIHsgfVxcbmtlcm5lbC9tb2R1bGUvaW50ZXJuYWwuaC0zNjctc3RhdGljIGlubGluZSB2b2lkIGFkZF9rYWxsc3ltcyhzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IHN0cnVjdCBsb2FkX2luZm8gKmluZm8pIHsgfVxcbi0tXFxua2VybmVsL21vZHVsZS9rYWxsc3ltcy5jPTc4PXN0YXRpYyBib29sIGlzX2NvcmVfc3ltYm9sKGNvbnN0IEVsZl9TeW0gKnNyYywgY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMsXFxuLS1cXG5rZXJuZWwvbW9kdWxlL2thbGxzeW1zLmMtMTEyLSAqL1xcbmtlcm5lbC9tb2R1bGUva2FsbHN5bXMuYzoxMTM6dm9pZCBsYXlvdXRfc3ltdGFiKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbylcXG5rZXJuZWwvbW9kdWxlL2thbGxzeW1zLmMtMTE0LXtcXG4tLVxcbmtlcm5lbC9tb2R1bGUva2FsbHN5bXMuYy0xNjUtLypcXG5rZXJuZWwvbW9kdWxlL2thbGxzeW1zLmM6MTY2OiAqIFdlIHVzZSB0aGUgZnVsbCBzeW10YWIgYW5kIHN0cnRhYiB3aGljaCBsYXlvdXRfc3ltdGFiIGFycmFuZ2VkIHRvXFxua2VybmVsL21vZHVsZS9rYWxsc3ltcy5jLTE2Ny0gKiBiZSBhcHBlbmRlZCB0byB0aGUgaW5pdCBzZWN0aW9uLiAgTGF0ZXIgd2Ugc3dpdGNoIHRvIHRoZSBjdXQtZG93blxcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmM9Mjk0Mz1zdGF0aWMgc3RydWN0IG1vZHVsZSAqbGF5b3V0X2FuZF9hbGxvY2F0ZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBpbnQgZmxhZ3MpXFxuLS1cXG5rZXJuZWwvbW9kdWxlL21haW4uYy0yOTc1LVxcdGxheW91dF9zZWN0aW9ucyhpbmZvLVxcdTAwM2Vtb2QsIGluZm8pO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jOjI5NzY6XFx0bGF5b3V0X3N5bXRhYihpbmZvLVxcdTAwM2Vtb2QsIGluZm8pO1xcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI5NzctXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQ0OjMwLjAzODk5ODU5MloiLCJTZXEiOjY1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo5NDgwNDM0NjgxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkFuYWx5emluZyB0aGUgYGxheW91dF9zeW10YWJgIEZ1bmN0aW9uKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgYGxheW91dF9zeW10YWJgIGZ1bmN0aW9uLiBJJ20gaW1tZWRpYXRlbHkgdGhpbmtpbmcgYWJvdXQgaG93IGl0IGZpdHMgaW50byB0aGUgb3ZlcmFsbCBzeW1ib2wgdGFibGUgbWFuYWdlbWVudCBzY2hlbWUuIFdoYXQgbGV2ZWwgb2YgYWJzdHJhY3Rpb24gaXMgaXQgd29ya2luZyBhdD8gSXMgaXQgYSBsb3ctbGV2ZWwgcm91dGluZSBkZWFsaW5nIHdpdGggcmF3IHN0cnVjdHVyZXMsIG9yIHNvbWV0aGluZyBtb3JlIGhpZ2gtbGV2ZWwsIHBlcmhhcHMgY29vcmRpbmF0aW5nIHNldmVyYWwgbG93ZXItbGV2ZWwgY2FsbHM/IFRoZSBuYW1lIHN1Z2dlc3RzIGl0J3MgaW52b2x2ZWQgaW4gdGhlIGxheW91dCBvZiB0aGUgc3ltYm9sIHRhYmxlLCB3aGljaCB1c3VhbGx5IGltcGxpZXMgbWVtb3J5IGFsbG9jYXRpb24gb3IgYXJyYW5nZW1lbnQgb2Ygc3ltYm9sIGVudHJpZXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBpbnB1dHMg4oCTIHdoYXQgZGF0YSBzdHJ1Y3R1cmVzIGRvZXMgaXQgb3BlcmF0ZSBvbj8gQXJlIHdlIHRhbGtpbmcgYWJvdXQgYSBjb21wbGV0ZSBzeW1ib2wgdGFibGUgc3RydWN0dXJlLCBpbmRpdmlkdWFsIHN5bWJvbCBlbnRyaWVzLCBvciBzb21ldGhpbmcgaW4gYmV0d2VlbiwgbGlrZSBhIHRhYmxlIG9mIHN5bWJvbCBidWNrZXRzPyBXaGF0IGFyZSB0aGUgY2FsbGluZyBjb252ZW50aW9ucz8gQXJlIHdlIGRlYWxpbmcgd2l0aCBzb21ldGhpbmcgbGlrZSBhIHNwZWNpZmljIHN5bWJvbCB0YWJsZSBpbXBsZW1lbnRhdGlvbiB3aXRoaW4gYSBjb21waWxlciBvciBsaW5rZXIsIHBlcmhhcHMgdGllZCB0byBhIHBhcnRpY3VsYXIgdGFyZ2V0IGFyY2hpdGVjdHVyZT8gSSBuZWVkIHRvIGxvb2sgZm9yIGFueSBpbmRpY2F0aW9ucyBhYm91dCB0aGUgc2NvcGUgb2YgdGhlIGxheW91dCAtIGlzIGl0IGdsb2JhbCwgcGVyLWNvbXBpbGF0aW9uLXVuaXQsIHBlci1vYmplY3QtZmlsZT8gVGhlIGNvbnRleHQgd2lsbCBiZSBrZXkgaGVyZS4gRmluYWxseSwgSSdtIGV4cGVjdGluZyBzb21lIGtpbmQgb2Ygb3V0cHV0LCBsaWtlbHkgdGhlIG1vZGlmaWVkIGRhdGEgc3RydWN0dXJlcyByZXByZXNlbnRpbmcgdGhlIGxhaWQtb3V0IHN5bWJvbCB0YWJsZSBvciBwb3NzaWJseSwgdXBkYXRlcyB0byBleHRlcm5hbCBkYXRhIHN1Y2ggYXMgYWxsb2NhdGVkIG9mZnNldHMgb3IgcG9pbnRlcnMuIE5vdywgbGV0J3MgZ2V0IGludG8gdGhlIGRldGFpbHMgb2YgdGhlIGNvZGUgYW5kIHNlZSBpZiBteSBhc3N1bXB0aW9ucyBhbGlnbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTcwMDIsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0NDozOS41MTk0MzY0NzNaIiwiU2VxIjo2NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODgwNDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL21vZHVsZS9rYWxsc3ltcy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDExMyxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDExMzpcXHR2b2lkIGxheW91dF9zeW10YWIoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKVxcbiAxMTQ6XFx0e1xcbiAxMTU6XFx0XFx0RWxmX1NoZHIgKnN5bXNlY3QgPSBpbmZvLVxcdTAwM2VzZWNoZHJzICsgaW5mby1cXHUwMDNlaW5kZXguc3ltO1xcbiAxMTY6XFx0XFx0RWxmX1NoZHIgKnN0cnNlY3QgPSBpbmZvLVxcdTAwM2VzZWNoZHJzICsgaW5mby1cXHUwMDNlaW5kZXguc3RyO1xcbiAxMTc6XFx0XFx0Y29uc3QgRWxmX1N5bSAqc3JjO1xcbiAxMTg6XFx0XFx0dW5zaWduZWQgaW50IGksIG5zcmMsIG5kc3QsIHN0cnRhYl9zaXplID0gMDtcXG4gMTE5OlxcdFxcdHN0cnVjdCBtb2R1bGVfbWVtb3J5ICptb2RfbWVtX2RhdGEgPSBcXHUwMDI2bW9kLVxcdTAwM2VtZW1bTU9EX0RBVEFdO1xcbiAxMjA6XFx0XFx0c3RydWN0IG1vZHVsZV9tZW1vcnkgKm1vZF9tZW1faW5pdF9kYXRhID0gXFx1MDAyNm1vZC1cXHUwMDNlbWVtW01PRF9JTklUX0RBVEFdO1xcbiAxMjE6XFx0XFxuIDEyMjpcXHRcXHQvKiBQdXQgc3ltYm9sIHNlY3Rpb24gYXQgZW5kIG9mIGluaXQgcGFydCBvZiBtb2R1bGUuICovXFxuIDEyMzpcXHRcXHRzeW1zZWN0LVxcdTAwM2VzaF9mbGFncyB8PSBTSEZfQUxMT0M7XFxuIDEyNDpcXHRcXHRzeW1zZWN0LVxcdTAwM2VzaF9lbnRzaXplID0gbW9kdWxlX2dldF9vZmZzZXRfYW5kX3R5cGUobW9kLCBNT0RfSU5JVF9EQVRBLFxcbiAxMjU6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0IHN5bXNlY3QsIGluZm8tXFx1MDAzZWluZGV4LnN5bSk7XFxuIDEyNjpcXHRcXHRwcl9kZWJ1ZyhcXFwiXFxcXHQlc1xcXFxuXFxcIiwgaW5mby1cXHUwMDNlc2Vjc3RyaW5ncyArIHN5bXNlY3QtXFx1MDAzZXNoX25hbWUpO1xcbiAxMjc6XFx0XFxuIDEyODpcXHRcXHRzcmMgPSAodm9pZCAqKWluZm8tXFx1MDAzZWhkciArIHN5bXNlY3QtXFx1MDAzZXNoX29mZnNldDtcXG4gMTI5OlxcdFxcdG5zcmMgPSBzeW1zZWN0LVxcdTAwM2VzaF9zaXplIC8gc2l6ZW9mKCpzcmMpO1xcbiAxMzA6XFx0XFxuIDEzMTpcXHRcXHQvKiBDb21wdXRlIHRvdGFsIHNwYWNlIHJlcXVpcmVkIGZvciB0aGUgY29yZSBzeW1ib2xzJyBzdHJ0YWIuICovXFxuIDEzMjpcXHRcXHRmb3IgKG5kc3QgPSBpID0gMDsgaSBcXHUwMDNjIG5zcmM7IGkrKykge1xcbiAxMzM6XFx0XFx0XFx0aWYgKGkgPT0gMCB8fCBpc19saXZlcGF0Y2hfbW9kdWxlKG1vZCkgfHxcXG4gMTM0OlxcdFxcdFxcdCAgICBpc19jb3JlX3N5bWJvbChzcmMgKyBpLCBpbmZvLVxcdTAwM2VzZWNoZHJzLCBpbmZvLVxcdTAwM2VoZHItXFx1MDAzZWVfc2hudW0sXFxuIDEzNTpcXHRcXHRcXHRcXHRcXHQgICBpbmZvLVxcdTAwM2VpbmRleC5wY3B1KSkge1xcbiAxMzY6XFx0XFx0XFx0XFx0c3RydGFiX3NpemUgKz0gc3RybGVuKFxcdTAwMjZpbmZvLVxcdTAwM2VzdHJ0YWJbc3JjW2ldLnN0X25hbWVdKSArIDE7XFxuIDEzNzpcXHRcXHRcXHRcXHRuZHN0Kys7XFxuIDEzODpcXHRcXHRcXHR9XFxuIDEzOTpcXHRcXHR9XFxuIDE0MDpcXHRcXG4gMTQxOlxcdFxcdC8qIEFwcGVuZCByb29tIGZvciBjb3JlIHN5bWJvbHMgYXQgZW5kIG9mIGNvcmUgcGFydC4gKi9cXG4gMTQyOlxcdFxcdGluZm8tXFx1MDAzZXN5bW9mZnMgPSBBTElHTihtb2RfbWVtX2RhdGEtXFx1MDAzZXNpemUsIHN5bXNlY3QtXFx1MDAzZXNoX2FkZHJhbGlnbiA/OiAxKTtcXG4gMTQzOlxcdFxcdGluZm8tXFx1MDAzZXN0cm9mZnMgPSBtb2RfbWVtX2RhdGEtXFx1MDAzZXNpemUgPSBpbmZvLVxcdTAwM2VzeW1vZmZzICsgbmRzdCAqIHNpemVvZihFbGZfU3ltKTtcXG4gMTQ0OlxcdFxcdG1vZF9tZW1fZGF0YS1cXHUwMDNlc2l6ZSArPSBzdHJ0YWJfc2l6ZTtcXG4gMTQ1OlxcdFxcdC8qIE5vdGUgYWRkX2thbGxzeW1zKCkgY29tcHV0ZXMgc3RydGFiX3NpemUgYXMgY29yZV90eXBlb2ZmcyAtIHN0cm9mZnMgKi9cXG4gMTQ2OlxcdFxcdGluZm8tXFx1MDAzZWNvcmVfdHlwZW9mZnMgPSBtb2RfbWVtX2RhdGEtXFx1MDAzZXNpemU7XFxuIDE0NzpcXHRcXHRtb2RfbWVtX2RhdGEtXFx1MDAzZXNpemUgKz0gbmRzdCAqIHNpemVvZihjaGFyKTtcXG4gMTQ4OlxcdFxcbiAxNDk6XFx0XFx0LyogUHV0IHN0cmluZyB0YWJsZSBzZWN0aW9uIGF0IGVuZCBvZiBpbml0IHBhcnQgb2YgbW9kdWxlLiAqL1xcbiAxNTA6XFx0XFx0c3Ryc2VjdC1cXHUwMDNlc2hfZmxhZ3MgfD0gU0hGX0FMTE9DO1xcbiAxNTE6XFx0XFx0c3Ryc2VjdC1cXHUwMDNlc2hfZW50c2l6ZSA9IG1vZHVsZV9nZXRfb2Zmc2V0X2FuZF90eXBlKG1vZCwgTU9EX0lOSVRfREFUQSxcXG4gMTUyOlxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCBzdHJzZWN0LCBpbmZvLVxcdTAwM2VpbmRleC5zdHIpO1xcbiAxNTM6XFx0XFx0cHJfZGVidWcoXFxcIlxcXFx0JXNcXFxcblxcXCIsIGluZm8tXFx1MDAzZXNlY3N0cmluZ3MgKyBzdHJzZWN0LVxcdTAwM2VzaF9uYW1lKTtcXG4gMTU0OlxcdFxcbiAxNTU6XFx0XFx0LyogV2UnbGwgdGFjayB0ZW1wb3JhcnkgbW9kX2thbGxzeW1zIG9uIHRoZSBlbmQuICovXFxuIDE1NjpcXHRcXHRtb2RfbWVtX2luaXRfZGF0YS1cXHUwMDNlc2l6ZSA9IEFMSUdOKG1vZF9tZW1faW5pdF9kYXRhLVxcdTAwM2VzaXplLFxcbiAxNTc6XFx0XFx0XFx0XFx0XFx0XFx0X19hbGlnbm9mX18oc3RydWN0IG1vZF9rYWxsc3ltcykpO1xcbiAxNTg6XFx0XFx0aW5mby1cXHUwMDNlbW9kX2thbGxzeW1zX2luaXRfb2ZmID0gbW9kX21lbV9pbml0X2RhdGEtXFx1MDAzZXNpemU7XFxuIDE1OTpcXHRcXG4gMTYwOlxcdFxcdG1vZF9tZW1faW5pdF9kYXRhLVxcdTAwM2VzaXplICs9IHNpemVvZihzdHJ1Y3QgbW9kX2thbGxzeW1zKTtcXG4gMTYxOlxcdFxcdGluZm8tXFx1MDAzZWluaXRfdHlwZW9mZnMgPSBtb2RfbWVtX2luaXRfZGF0YS1cXHUwMDNlc2l6ZTtcXG4gMTYyOlxcdFxcdG1vZF9tZW1faW5pdF9kYXRhLVxcdTAwM2VzaXplICs9IG5zcmMgKiBzaXplb2YoY2hhcik7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQ0OjM5LjUxOTUyNTgxM1oiLCJTZXEiOjY3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMDA5MDkyMzY4NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgUG90ZW50aWFsIE1lbW9yeSBVbmluaXRpYWxpemF0aW9uIGluIFNlY3Rpb24gTGF5b3V0KipcblxuT2theSwgc28gYGxheW91dF9zeW10YWJgIGlzIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHRoZSBgU0hGX0FMTE9DYCBmbGFnIG9uIHRoZSBzeW1ib2wgc2VjdGlvbiAoYHN5bXNlY3RgKSBhbmQgdGhlIHN0cmluZyBzZWN0aW9uIChgc3Ryc2VjdGApLiBJdCBhbHNvIGZpZ3VyZXMgb3V0IHNpemVzIGFuZCBvZmZzZXRzLCB3aGljaCBpcyBhIGtleSBwYXJ0IG9mIG1lbW9yeSBsYXlvdXQuIE5vdywgaWYgYGxheW91dF9hbmRfYWxsb2NhdGVgIG5lZWRzIHRvIHJldHJ5LCBpdCBmaXJzdCAqY2xlYXJzKiB0aGUgYFNIRl9BTExPQ2AgZmxhZyBhbmQgcmVzZXRzIHRob3NlIHNlY3Rpb24gc2l6ZXMgdG8gemVyby4gVGhlbiBgbGF5b3V0X3NlY3Rpb25zYCBhbmQgYGxheW91dF9zeW10YWJgIGdldCBjYWxsZWQgYWdhaW4uXG5cbk15IGltbWVkaWF0ZSBjb25jZXJuIGlzOiBJcyB0aGVyZSBhIHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gc25lYWsgaW4gaGVyZT8gV2UncmUgcmVzZXR0aW5nIHNpemVzIHRvIHplcm8gZHVyaW5nIHJldHJpZXMsIGJ1dCB3aGF0IGFib3V0IHRoZSBhY3R1YWwgY29udGVudHM/IEJ1dCB3YWl0LCBubywgYmVjYXVzZSBgaW5mby1cdTAwM2Vtb2QtXHUwMDNlbWVtW3R5cGVdLnNpemVgICppcyogcmVzZXQgdG8gemVyby4gVGhhdCBtYWtlcyBzZW5zZSwgYmVjYXVzZSBgbGF5b3V0X3NlY3Rpb25zYCBhbmQgdGhlbiBgbGF5b3V0X3N5bXRhYmAgcmVjYWxjdWxhdGUgdGhlIHNpemVzIGNvcnJlY3RseS4gVGhlbiBgbW92ZV9tb2R1bGVgIGdvZXMgdG8gYWxsb2NhdGUgbWVtb3J5IGJhc2VkIG9uIHRoZXNlICpuZXcqIHNpemVzLlxuXG5UaGUgYWxsb2NhdGlvbiB1c2VzIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCwgd2hpY2ggaW4gdHVybiBjYWxscyBgbW9kdWxlX2FsbG9jYCBvciBgdm1hbGxvY2AuIFRoYXQgbWFrZXMgbWUgYSBsaXR0bGUgdW5lYXN5IGJlY2F1c2UgSSBrbm93IGBtb2R1bGVfbWVtb3J5X2FsbG9jYCB1bHRpbWF0ZWx5IHVzZXMgdGhpbmdzIGxpa2UgYGV4ZWNtZW1fYWxsb2NgIG9yIHNpbWlsYXIsIGFuZCB0aG9zZSAqbWlnaHQqIG5vdCB6ZXJvLWluaXRpYWxpemUgdGhlIGFsbG9jYXRlZCBtZW1vcnkuIEhvd2V2ZXIsIGBtb3ZlX21vZHVsZWAgc2VlbXMgdG8gY29weSB0aGUgc2VjdGlvbiBkYXRhIGZyb20gYSB0ZW1wb3JhcnkgaW1hZ2UgdG8gdGhlIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkuXG5cbkxvb2tpbmcgYXQgdGhlIGNvZGUsIHNwZWNpZmljYWxseSB0aGUgbG9vcCB0aGF0IGNvcGllcyB0aGUgc2VjdGlvbnM6XG5cbmBgYGNcblx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBpbmZvLVx1MDAzZWhkci1cdTAwM2VlX3NobnVtOyBpKyspIHtcblx0XHRcdC8vIC4uLlxuXHRcdFx0aWYgKHNoZHItXHUwMDNlc2hfdHlwZSAhPSBTSFRfTk9CSVRTKSB7XG5cdFx0XHRcdC8vIC4uLlxuXHRcdFx0XHRtZW1jcHkoZGVzdCwgKHZvaWQgKilzaGRyLVx1MDAzZXNoX2FkZHIsIHNoZHItXHUwMDNlc2hfc2l6ZSk7XG5cdFx0XHR9XG5gYGBcblxuU28sIGl0ICpjb3BpZXMqIGNvbnRlbnQgaWYgdGhlIHNlY3Rpb24gdHlwZSBpcyAqbm90KiBgU0hUX05PQklUU2AuIFRoYXQncyBnb29kLCBiZWNhdXNlIGFueSBhY3R1YWwgZGF0YSBpcyBiZWluZyBwcm9wZXJseSB0cmFuc2ZlcnJlZC4gSG93ZXZlciwgZm9yIGBTSFRfTk9CSVRTYCBzZWN0aW9ucyAobGlrZSB0aGUgQlNTKSwgbm90aGluZyBpcyBjb3BpZWQuIFRoYXQncyBleGFjdGx5IHdoZXJlIEkgbmVlZCB0byB6ZXJvIG91dCBtZW1vcnkgaWYgdGhlcmUncyBubyBkZWZpbmVkIHNlY3Rpb24gY29udGVudHMuIFNvIG15IGxpbmdlcmluZyB3b3JyeSBpcyBkb2VzIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCB6ZXJvIG91dCB0aGF0IG1lbW9yeSBvbiBpdHMgb3duPyBJdCdzIGVzc2VudGlhbCB0byBjaGVjayB0aGUgaW1wbGVtZW50YXRpb24gb2YgYG1vZHVsZV9tZW1vcnlfYWxsb2NgIG1vcmUgY2xvc2VseSB0byBiZSBjZXJ0YWluLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxODQwNywiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM2OCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQ0OjQ5LjYxMDQ1MTY5WiIsIlNlcSI6NjgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NjQxNDU1NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtb2R1bGVfbWVtb3J5X2FsbG9jXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9tb2R1bGUvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9tb2R1bGUvbWFpbi5jPTEzMzc9dm9pZCBfX3dlYWsgbW9kdWxlX2FyY2hfZnJlZWluZ19pbml0KHN0cnVjdCBtb2R1bGUgKm1vZClcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTEzNDAtXFxua2VybmVsL21vZHVsZS9tYWluLmM6MTM0MTpzdGF0aWMgaW50IG1vZHVsZV9tZW1vcnlfYWxsb2Moc3RydWN0IG1vZHVsZSAqbW9kLCBlbnVtIG1vZF9tZW1fdHlwZSB0eXBlKVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTEzNDIte1xcbi0tXFxua2VybmVsL21vZHVsZS9tYWluLmM9Mjc4OD1zdGF0aWMgaW50IG1vdmVfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbylcXG4tLVxcbmtlcm5lbC9tb2R1bGUvbWFpbi5jLTI3OTktXFxua2VybmVsL21vZHVsZS9tYWluLmM6MjgwMDpcXHRcXHRyZXQgPSBtb2R1bGVfbWVtb3J5X2FsbG9jKG1vZCwgdHlwZSk7XFxua2VybmVsL21vZHVsZS9tYWluLmMtMjgwMS1cXHRcXHRpZiAocmV0KSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEwOjQ0OjQ5LjY1Njg3NjM4N1oiLCJTZXEiOjY5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1NDAyNDUyMzA5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHRha2Ugb24gdW5kZXJzdGFuZGluZyB0aGlzIGNvZGU6XG5cbioqQW5hbHl6aW5nIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCoqXG5cbkFscmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGl0LiBJJ20gZ29pbmcgdG8gc3RhcnQgYnkgdGFraW5nIGEgY2xvc2UgbG9vayBhdCB0aGlzIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCBtb2R1bGUuIEFzIGFuIGV4cGVydCBpbiBteSBmaWVsZCwgSSBrbm93IHRoZSBzaWduaWZpY2FuY2Ugb2YgbWVtb3J5IGFsbG9jYXRpb24gYW5kIG1hbmFnZW1lbnQsIHNvIHRoaXMgaXMgd2hlcmUgSSdsbCBiZSBmb2N1c2luZy4gTXkgaW5pdGlhbCB0aG91Z2h0IHByb2Nlc3MgaXMgdG8gdW5kZXJzdGFuZCBpdHMgcHVycG9zZSB3aXRoaW4gdGhlIGJyb2FkZXIgc3lzdGVtLiBXaGF0J3MgaXQgZG9pbmc/IElzIGl0IGhhbmRsaW5nIGR5bmFtaWMgbWVtb3J5LCBzdGF0aWMgYWxsb2NhdGlvbiwgb3IgYSBtaXg/IFdoYXQga2luZCBvZiBkYXRhIHN0cnVjdHVyZXMgYXJlIGJlaW5nIHVzZWQgdG8gdHJhY2sgbWVtb3J5IGJsb2Nrcz8gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIHNjb3BlIG9mIGl0cyByZXNwb25zaWJpbGl0aWVzLiBJcyBpdCBhIGNvcmUgY29tcG9uZW50IG9yIGEgdXRpbGl0eSBtb2R1bGU/IFdoYXQgYXJlIGl0cyBkZXBlbmRlbmNpZXM/IEknbGwgcHJvYmFibHkgYmUgYXNraW5nIG15c2VsZiB0aGVzZSBxdWVzdGlvbnMgYXMgSSBnby4gVWx0aW1hdGVseSwgSSdtIGV4cGVjdGluZyB0aGlzIGlzIGFsbCBhYm91dCB1bmRlcnN0YW5kaW5nIG1lbW9yeSBtYW5hZ2VtZW50IHN0cmF0ZWd5LiBMZXQncyBkaWcgaW4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5NTM3LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDQ6NTUuMDU5MzMxODQ2WiIsIlNlcSI6NzAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MzE4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvbW9kdWxlL21haW4uY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMzQxLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMzQxOlxcdHN0YXRpYyBpbnQgbW9kdWxlX21lbW9yeV9hbGxvYyhzdHJ1Y3QgbW9kdWxlICptb2QsIGVudW0gbW9kX21lbV90eXBlIHR5cGUpXFxuMTM0MjpcXHR7XFxuMTM0MzpcXHRcXHR1bnNpZ25lZCBpbnQgc2l6ZSA9IFBBR0VfQUxJR04obW9kLVxcdTAwM2VtZW1bdHlwZV0uc2l6ZSk7XFxuMTM0NDpcXHRcXHRlbnVtIGV4ZWNtZW1fdHlwZSBleGVjbWVtX3R5cGU7XFxuMTM0NTpcXHRcXHR2b2lkICpwdHI7XFxuMTM0NjpcXHRcXG4xMzQ3OlxcdFxcdG1vZC1cXHUwMDNlbWVtW3R5cGVdLnNpemUgPSBzaXplO1xcbjEzNDg6XFx0XFxuMTM0OTpcXHRcXHRpZiAobW9kX21lbV90eXBlX2lzX2RhdGEodHlwZSkpXFxuMTM1MDpcXHRcXHRcXHRleGVjbWVtX3R5cGUgPSBFWEVDTUVNX01PRFVMRV9EQVRBO1xcbjEzNTE6XFx0XFx0ZWxzZVxcbjEzNTI6XFx0XFx0XFx0ZXhlY21lbV90eXBlID0gRVhFQ01FTV9NT0RVTEVfVEVYVDtcXG4xMzUzOlxcdFxcbjEzNTQ6XFx0XFx0cHRyID0gZXhlY21lbV9hbGxvY19ydyhleGVjbWVtX3R5cGUsIHNpemUpO1xcbjEzNTU6XFx0XFx0aWYgKCFwdHIpXFxuMTM1NjpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4xMzU3OlxcdFxcbjEzNTg6XFx0XFx0bW9kLVxcdTAwM2VtZW1bdHlwZV0uaXNfcm94ID0gZXhlY21lbV9pc19yb3goZXhlY21lbV90eXBlKTtcXG4xMzU5OlxcdFxcbjEzNjA6XFx0XFx0LypcXG4xMzYxOlxcdFxcdCAqIFRoZSBwb2ludGVyIHRvIHRoZXNlIGJsb2NrcyBvZiBtZW1vcnkgYXJlIHN0b3JlZCBvbiB0aGUgbW9kdWxlXFxuMTM2MjpcXHRcXHQgKiBzdHJ1Y3R1cmUgYW5kIHdlIGtlZXAgdGhhdCBhcm91bmQgc28gbG9uZyBhcyB0aGUgbW9kdWxlIGlzXFxuMTM2MzpcXHRcXHQgKiBhcm91bmQuIFdlIG9ubHkgZnJlZSB0aGF0IG1lbW9yeSB3aGVuIHdlIHVubG9hZCB0aGUgbW9kdWxlLlxcbjEzNjQ6XFx0XFx0ICogSnVzdCBtYXJrIHRoZW0gYXMgbm90IGJlaW5nIGEgbGVhayB0aGVuLiBUaGUgLmluaXQqIEVMRlxcbjEzNjU6XFx0XFx0ICogc2VjdGlvbnMgKmRvKiBnZXQgZnJlZWQgYWZ0ZXIgYm9vdCBzbyB3ZSAqY291bGQqIHRyZWF0IHRoZW1cXG4xMzY2OlxcdFxcdCAqIHNsaWdodGx5IGRpZmZlcmVudGx5IHdpdGgga21lbWxlYWtfaWdub3JlKCkgYW5kIG9ubHkgZ3JleVxcbjEzNjc6XFx0XFx0ICogdGhlbSBvdXQgYXMgdGhleSB3b3JrIGFzIHR5cGljYWwgbWVtb3J5IGFsbG9jYXRpb25zIHdoaWNoXFxuMTM2ODpcXHRcXHQgKiAqZG8qIGV2ZW50dWFsbHkgZ2V0IGZyZWVkLCBidXQgbGV0J3MganVzdCBrZWVwIHRoaW5ncyBzaW1wbGVcXG4xMzY5OlxcdFxcdCAqIGFuZCBhdm9pZCAqYW55KiBmYWxzZSBwb3NpdGl2ZXMuXFxuMTM3MDpcXHRcXHQgKi9cXG4xMzcxOlxcdFxcdGlmICghbW9kLVxcdTAwM2VtZW1bdHlwZV0uaXNfcm94KVxcbjEzNzI6XFx0XFx0XFx0a21lbWxlYWtfbm90X2xlYWsocHRyKTtcXG4xMzczOlxcdFxcbjEzNzQ6XFx0XFx0bWVtc2V0KHB0ciwgMCwgc2l6ZSk7XFxuMTM3NTpcXHRcXHRtb2QtXFx1MDAzZW1lbVt0eXBlXS5iYXNlID0gcHRyO1xcbjEzNzY6XFx0XFxuMTM3NzpcXHRcXHRyZXR1cm4gMDtcXG4xMzc4OlxcdH1cXG4xMzc5OlxcdFxcbjEzODA6XFx0c3RhdGljIHZvaWQgbW9kdWxlX21lbW9yeV9yZXN0b3JlX3JveChzdHJ1Y3QgbW9kdWxlICptb2QpXFxuMTM4MTpcXHR7XFxuMTM4MjpcXHRcXHRmb3JfY2xhc3NfbW9kX21lbV90eXBlKHR5cGUsIHRleHQpIHtcXG4xMzgzOlxcdFxcdFxcdHN0cnVjdCBtb2R1bGVfbWVtb3J5ICptZW0gPSBcXHUwMDI2bW9kLVxcdTAwM2VtZW1bdHlwZV07XFxuMTM4NDpcXHRcXG4xMzg1OlxcdFxcdFxcdGlmIChtZW0tXFx1MDAzZWlzX3JveClcXG4xMzg2OlxcdFxcdFxcdFxcdGV4ZWNtZW1fcmVzdG9yZV9yb3gobWVtLVxcdTAwM2ViYXNlLCBtZW0tXFx1MDAzZXNpemUpO1xcbjEzODc6XFx0XFx0fVxcbjEzODg6XFx0fVxcbjEzODk6XFx0XFxuMTM5MDpcXHRzdGF0aWMgdm9pZCBtb2R1bGVfbWVtb3J5X2ZyZWUoc3RydWN0IG1vZHVsZSAqbW9kLCBlbnVtIG1vZF9tZW1fdHlwZSB0eXBlKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMDo0NDo1NS4wNTk0ODY4MjZaIiwiU2VxIjo3MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjIwNTAxMTc0NjQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gQXNzZXNzbWVudDogTm8gVW5pbml0aWFsaXplZCBNZW1vcnkgUmVhZCBSaXNrKipcblxuQWxyaWdodCwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgd2FzIHRvIHZlcmlmeSBpZiB0aGVyZSdzIGEgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBkdWUgdG8gdGhlc2UgY2hhbmdlcy4gVGhlIGZpcnN0IHBvaW50IG9mIGNvbmNlcm4gd2FzIGBtb2R1bGVfbWVtb3J5X2FsbG9jYCwgYnV0IGl0IGltbWVkaWF0ZWx5IHVzZXMgYG1lbXNldGAsIHNvIHRoYXQncyBhIG5vbi1pc3N1ZSDigJMgdGhlIG1lbW9yeSBpcyBndWFyYW50ZWVkIHplcm9lZC5cblxuSSB0aGVuIGxvb2tlZCBhdCBgbW0vYWxsb2NfdGFnLmNgLCB3aGVyZSB0aGVyZSdzIGEgY2hlY2sgZm9yIGB0YWdzX2FkZHJlc3NhYmxlKClgLiBJZiB0aGUgbnVtYmVyIG9mIGFsbG9jYXRpb24gdGFncyBpcyB0b28gbGFyZ2UsIHRoZSBwYXRjaCBkaXNhYmxlcyBtZW1vcnkgcHJvZmlsaW5nIGFuZCByZXRyaWVzLiBUaGlzIGxlZCBtZSB0byBpbnZlc3RpZ2F0ZSB3aGV0aGVyIHJldHJ5IGxvZ2ljIGluIGBrZXJuZWwvbW9kdWxlL21haW4uY2AgY291bGQgaW50cm9kdWNlIHVuaW5pdGlhbGl6ZWQgcmVhZHMuIFRoYXQgcmV0cnkgbG9naWMgcmVzZXRzIGFuZCByZWNhbGN1bGF0ZXMgb2Zmc2V0cyAoYGluZm8tXHUwMDNlc3ltb2Zmc2AsIGBpbmZvLVx1MDAzZXN0cm9mZnNgLCBldGMuKSB3aXRoaW4gdGhlIG1vZHVsZSdzIHNlY3Rpb24gaGVhZGVycyBiZWZvcmUgcmVzdGFydGluZyB0aGUgbW9kdWxlIGxvYWQuIEkgdmVyaWZpZWQgdGhhdCB0aGVzZSBvZmZzZXRzIGFyZSAqaW5kZWVkKiByZWNhbGN1bGF0ZWQgYW5kIHRoZSBzaXplcyAoYHNoX2VudHNpemVgKSBhcmUgcmVzZXQgYW5kIHNldCBhcHByb3ByaWF0ZWx5LiBgcmV3cml0ZV9zZWN0aW9uX2hlYWRlcnNgIGxvb2tzIGdvb2QsIGl0J3MganVzdCBtYXJraW5nIGFkZHJlc3Nlcy5cblxuSSBjb25zaWRlcmVkIHdoZXRoZXIgdGhpcyByZWxvYWQgb3IgYW55IG5ldyBsb2dpYyBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gdXNlcnNwYWNlLiBObywgdGhlIGNvbnRleHQgaXMga2VybmVsIG1vZHVsZSBsb2FkaW5nLCB0aGVyZSdzIG5vIGRpcmVjdCBpbnRlcmFjdGlvbiB3aXRoIHVzZXItc3BhY2UgbWVtb3J5IGluIGEgd2F5IHRoYXQgd291bGQgaW50cm9kdWNlIGxlYWtzIG9yIGV4cG9zZSB1bmluaXRpYWxpemVkIGRhdGEuIFRoZSBhbGxvY2F0ZWQgbW9kdWxlIG1lbW9yeSByZW1haW5zIHplcm9lZCBhbmQgdGhlIHBhdGNoIGRvZXNuJ3QgaW50cm9kdWNlIGFueSBuZXcgc3RydWN0dXJlcyBzZW50IHRvIHVzZXJzcGFjZSwgbm9yIGFueSBjb25kaXRpb25hbCBsb2dpYyBkZXBlbmRlbnQgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuIFRoZSBuZXcgZnVuY3Rpb24gYHJlbGVhc2VfbW9kdWxlX3RhZ3NgIGlzIGp1c3QgYSBtb3ZlZCBmdW5jdGlvbiBhbmQgZG9lc24ndCBpbnRyb2R1Y2UgdW5pbml0aWFsaXplZCBtZW1vcnkuXG5cblRoZSBwYXRjaCdzIGNoYW5nZXMgYXJlIHNvbGVseSBmb2N1c2VkIG9uIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyB0YWdzLCBhZGRpbmcgYSByZXRyeSBtZWNoYW5pc20uIFRoZXJlZm9yZSwgYW55IGJ1Z3Mgd291bGQgbGlrZWx5IG1hbmlmZXN0IGFzIGxvZ2ljIGVycm9ycywgbWVtb3J5IGxlYWtzLCBvciBjcmFzaGVzIOKAkyBpc3N1ZXMgdGhhdCBhcmUgd2VsbCB3aXRoaW4gdGhlIHNjb3BlIG9mIEtBU0FOJ3MgZGV0ZWN0aW9uIGNhcGFiaWxpdGllcy4gS01TQU4gKEtlcm5lbCBNZW1vcnkgU2FuaXRpemVyKSBpcyBkZXNpZ25lZCBzcGVjaWZpY2FsbHkgZm9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBidXQgc2luY2UgdGhlIG1lbW9yeSBpcyBiZWluZyBleHBsaWNpdGx5IHplcm9lZCwgS01TQU4gaXMgbm90IG5lY2Vzc2FyeSBoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDU1NCwiT3V0cHV0VG9rZW5zIjoyMDEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMjczLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTA6NDU6MTcuMTA5NjA2NDc5WiIsIlNlcSI6NzIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUyMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgbW9kdWxlIGxvYWRpbmcgcHJvY2VzcyB0byBoYW5kbGUgY2FzZXMgd2hlcmUgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHRhZ3MgZXhjZWVkIGF2YWlsYWJsZSBwYWdlIGZsYWcgYml0cy4gSXQgaW50cm9kdWNlcyBhIHJldHJ5IG1lY2hhbmlzbSBpbiBgbGF5b3V0X2FuZF9hbGxvY2F0ZWAgdGhhdCByZXNldHMgc2VjdGlvbiBoZWFkZXJzIGFuZCBzaXplcywgYW5kIHJldHJpZXMgdGhlIGFsbG9jYXRpb24gd2l0aG91dCBwcm9maWxpbmcuIFRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBtb2R1bGVzIGlzIGV4cGxpY2l0bHkgemVyb2VkIGJ5IGBtb2R1bGVfbWVtb3J5X2FsbG9jYCAodmlhIGBtZW1zZXQocHRyLCAwLCBzaXplKWApLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIGFueSBuZXcgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlcnNwYWNlLCBub3IgZG8gdGhleSBhZGQgY29tcGxleCBjb25kaXRpb25hbCBsb2dpYyBkZXBlbmRpbmcgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggKGUuZy4sIGluY29ycmVjdCBzaXplIGNhbGN1bGF0aW9ucywgbWVtb3J5IGxlYWtzLCBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIGR1cmluZyBzZWN0aW9uIGNvcHlpbmcpIHdvdWxkIGJlIHJlbGlhYmx5IGNhdWdodCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyB0b29scy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgbmVjZXNzaXRhdGUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBtb2R1bGUgbG9hZGluZyBwcm9jZXNzIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgdGFncyBleGNlZWQgYXZhaWxhYmxlIHBhZ2UgZmxhZyBiaXRzLiBJdCBpbnRyb2R1Y2VzIGEgcmV0cnkgbWVjaGFuaXNtIGluIGBsYXlvdXRfYW5kX2FsbG9jYXRlYCB0aGF0IHJlc2V0cyBzZWN0aW9uIGhlYWRlcnMgYW5kIHNpemVzLCBhbmQgcmV0cmllcyB0aGUgYWxsb2NhdGlvbiB3aXRob3V0IHByb2ZpbGluZy4gVGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIG1vZHVsZXMgaXMgZXhwbGljaXRseSB6ZXJvZWQgYnkgYG1vZHVsZV9tZW1vcnlfYWxsb2NgICh2aWEgYG1lbXNldChwdHIsIDAsIHNpemUpYCkuIFRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2UgYW55IG5ldyBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2Vyc3BhY2UsIG5vciBkbyB0aGV5IGFkZCBjb21wbGV4IGNvbmRpdGlvbmFsIGxvZ2ljIGRlcGVuZGluZyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy4gQW55IHBvdGVudGlhbCBidWdzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaCAoZS5nLiwgaW5jb3JyZWN0IHNpemUgY2FsY3VsYXRpb25zLCBtZW1vcnkgbGVha3MsIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgZHVyaW5nIHNlY3Rpb24gY29weWluZykgd291bGQgYmUgcmVsaWFibHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIHRvb2xzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow6qbdw[1] Phase: Succeeded StartedAt: 2026-08-10 10:45:40 +0000 UTC FinishedAt: 2026-08-10 10:45:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-10 10:45:40 +0000 UTC FinishedAt: 2026-08-10 10:45:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[2] Phase: Succeeded StartedAt: 2026-08-10 10:45:40 +0000 UTC FinishedAt: 2026-08-10 14:34:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-10 10:45:40 +0000 UTC FinishedAt: 2026-08-10 14:34:41 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-10 10:45:40 +0000 UTC FinishedAt: 2026-08-10 10:46:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-10 10:45:40 +0000 UTC FinishedAt: 2026-08-10 10:45:48 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},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-workflow6qbdw/series-workflow6qbdw-convert-artifact-949625554/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-10 10:46:01 +0000 UTC FinishedAt: 2026-08-10 11:07:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-10 10:46:01 +0000 UTC FinishedAt: 2026-08-10 11:07:14 +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:*3ed28053-a204-4fe6-9c3e-aac0bfb26e7a,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-workflow6qbdw/series-workflow6qbdw-convert-artifact-949625554/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": "14fcb6ac-616b-46d0-a764-7a480e1cc856", "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-workflow6qbdw/series-workflow6qbdw-build-action-867800912/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-10 10:46:01 +0000 UTC FinishedAt: 2026-08-10 11:07:04 +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:*3ed28053-a204-4fe6-9c3e-aac0bfb26e7a,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-workflow6qbdw/series-workflow6qbdw-convert-artifact-949625554/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": "14fcb6ac-616b-46d0-a764-7a480e1cc856", "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-workflow6qbdw/series-workflow6qbdw-build-action-867800912/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-10 11:07:14 +0000 UTC FinishedAt: 2026-08-10 11:07:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-10 11:07:14 +0000 UTC FinishedAt: 2026-08-10 11:07:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-10 11:07:14 +0000 UTC FinishedAt: 2026-08-10 11:07:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-10 11:07:14 +0000 UTC FinishedAt: 2026-08-10 11:07:21 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},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-workflow6qbdw/series-workflow6qbdw-convert-artifact-3582812909/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-10 11:07:35 +0000 UTC FinishedAt: 2026-08-10 11:09:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-10 11:07:35 +0000 UTC FinishedAt: 2026-08-10 11:09:29 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*14fcb6ac-616b-46d0-a764-7a480e1cc856,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-workflow6qbdw/series-workflow6qbdw-build-action-867800912/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-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-10 11:09:39 +0000 UTC FinishedAt: 2026-08-10 11:09:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-10 11:09:39 +0000 UTC FinishedAt: 2026-08-10 11:09:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-10 11:09:39 +0000 UTC FinishedAt: 2026-08-10 11:29:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-10 11:09:39 +0000 UTC FinishedAt: 2026-08-10 11:29:02 +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:*3ed28053-a204-4fe6-9c3e-aac0bfb26e7a,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-workflow6qbdw/series-workflow6qbdw-convert-artifact-3582812909/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": "6c38d497-c764-41e9-ba4b-09395f4cf922", "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-workflow6qbdw/series-workflow6qbdw-build-action-703861833/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-10 11:09:39 +0000 UTC FinishedAt: 2026-08-10 11:28:52 +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:*3ed28053-a204-4fe6-9c3e-aac0bfb26e7a,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-workflow6qbdw/series-workflow6qbdw-convert-artifact-3582812909/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": "6c38d497-c764-41e9-ba4b-09395f4cf922", "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-workflow6qbdw/series-workflow6qbdw-build-action-703861833/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-10 11:29:02 +0000 UTC FinishedAt: 2026-08-10 11:29:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-10 11:29:02 +0000 UTC FinishedAt: 2026-08-10 11:29:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-10 11:29:02 +0000 UTC FinishedAt: 2026-08-10 11:31:06 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-10 11:29:02 +0000 UTC FinishedAt: 2026-08-10 11:30:56 +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:*6c38d497-c764-41e9-ba4b-09395f4cf922,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-workflow6qbdw/series-workflow6qbdw-build-action-703861833/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-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-10 11:31:06 +0000 UTC FinishedAt: 2026-08-10 14:34:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-10 11:31:06 +0000 UTC FinishedAt: 2026-08-10 14:34:41 +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":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},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:*14fcb6ac-616b-46d0-a764-7a480e1cc856,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*6c38d497-c764-41e9-ba4b-09395f4cf922,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-workflow6qbdw/series-workflow6qbdw-build-action-867800912/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-workflow6qbdw/series-workflow6qbdw-build-action-703861833/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-10 11:31:06 +0000 UTC FinishedAt: 2026-08-10 11:31:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-10 11:31:06 +0000 UTC FinishedAt: 2026-08-10 11:31:10 +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":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},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-workflow6qbdw/series-workflow6qbdw-convert-artifact-2613828690/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-10 11:31:06 +0000 UTC FinishedAt: 2026-08-10 11:31:06 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-10 11:31:06 +0000 UTC FinishedAt: 2026-08-10 11:31:06 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-10 11:31:06 +0000 UTC FinishedAt: 2026-08-10 11:31:06 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-10 11:31:16 +0000 UTC FinishedAt: 2026-08-10 14:34:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6qbdw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["codetag_alloc_module_section","codetag_free_module_sections","codetag_load_module","codetag_unload_module"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0dad4faa8e59c9c1361f75c8cc54a33c96af32f3","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"d73f664f-9ab0-4892-982d-8f43a66c6500","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-10 11:31:16 +0000 UTC FinishedAt: 2026-08-10 14:34:31 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*14fcb6ac-616b-46d0-a764-7a480e1cc856,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*6c38d497-c764-41e9-ba4b-09395f4cf922,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-workflow6qbdw/series-workflow6qbdw-build-action-867800912/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-workflow6qbdw/series-workflow6qbdw-build-action-703861833/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-workflow6qbdw/series-workflow6qbdw-convert-artifact-2613828690/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,}