Name: series-workflowgxx9r Phase: Failed StartedAt: 2026-08-03 00:48:27 +0000 UTC FinishedAt: 2026-08-03 01:03:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgxx9r[0] Phase: Succeeded StartedAt: 2026-08-03 00:48:27 +0000 UTC FinishedAt: 2026-08-03 01:03:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgxx9r[0].run-triage Phase: Succeeded StartedAt: 2026-08-03 00:48:27 +0000 UTC FinishedAt: 2026-08-03 01:03:35 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzAzIDAxOjAzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlcnNwYWNlIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vKikgYW5kIGRvZXMgbm90IG1ha2UgYW55IGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIGl0c2VsZi4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDMgMDE6MDM8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCAzZmE0MDMyNGM5MTFjZGQ5ZjQzNTI2NmQzZWNlZWE2YjUyZWY3MWM2XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBBdWcgMyAwMTowMzoxMyAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8uZ2l0aWdub3JlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLmdpdGlnbm9yZVxuaW5kZXggOWNjZDllMTQ0N2U2Ni4uNjE2MDQzYTBmY2QyMiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy5naXRpZ25vcmVcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy5naXRpZ25vcmVcbkBAIC02NiwzICYjNDM7NjYsNiBAQCBtZXJnZVxuIHByY3RsX3RocF9kaXNhYmxlXG4gcm1hcFxuIGZvbGlvX3NwbGl0X3JhY2VfdGVzdFxuJiM0Mztmb2xpb19vcmRlcl9jaGVja1xuJiM0MztraHVnZXBhZ2VkX3N5bmNfY2hlY2tcbiYjNDM7a2h1Z2VwYWdlZF9yYWNlXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuaW5kZXggMjVkMTBjZWQzYjNiOS4uMDI2ZDRiNjE0MTRkNCAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuQEAgLTEwNCw2ICYjNDM7MTA0LDkgQEAgVEVTVF9HRU5fRklMRVMgJiM0Mzs9IGd1YXJkLXJlZ2lvbnNcbiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gbWVyZ2VcbiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gcm1hcFxuIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBmb2xpb19zcGxpdF9yYWNlX3Rlc3RcbiYjNDM7VEVTVF9HRU5fRklMRVMgJiM0Mzs9IGZvbGlvX29yZGVyX2NoZWNrXG4mIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBraHVnZXBhZ2VkX3N5bmNfY2hlY2tcbiYjNDM7VEVTVF9HRU5fRklMRVMgJiM0Mzs9IGtodWdlcGFnZWRfcmFjZVxuIFxuIGlmbmVxICgkKEFSQ0gpLGFybTY0KVxuIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBzb2Z0LWRpcnR5XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5mNzBkNzY2ZmYzZWIzXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jXG5AQCAtMCwwICYjNDM7MSwxMzggQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LypcbiYjNDM7ICogU2VsZi1jaGVjayBmb3IgdGhlIHZtX3V0aWwgZm9saW8tb3JkZXIgZGV0ZWN0aW9uIGhlbHBlcnMsXG4mIzQzOyAqIGlzX2JhY2tlZF9ieV9mb2xpbygpIGFuZCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKCkuXG4mIzQzOyAqXG4mIzQzOyAqIEZvciBldmVyeSBhbm9uIFRIUCBvcmRlciB0aGUga2VybmVsIHN1cHBvcnRzLCBmYXVsdCBtZW1vcnkgaW4gd2l0aCBvbmx5XG4mIzQzOyAqIHRoYXQgb3JkZXIgZW5hYmxlZCBhbmQgdmVyaWZ5IHRoZSBoZWxwZXJzIHJlcG9ydCBleGFjdGx5IHRoYXQgb3JkZXI6XG4mIzQzOyAqIG5vdCBhIG5laWdoYm91cmluZyBvcmRlciwgYW5kIHBsYWluIDRLIG1lbW9yeSBhcyBvcmRlciAwLiBUaGUgaGVscGVyc1xuJiM0MzsgKiBhcmUgd2hhdCB0aGUga2h1Z2VwYWdlZCBtVEhQIHRlc3RzIHVzZSB0byBkZXRlY3QgY29sbGFwc2UgcmVzdWx0cywgc29cbiYjNDM7ICogdGhleSBtdXN0IGFncmVlIHdpdGggdGhlIGtlcm5lbCYjMzk7cyBvd24gaWRlYSBvZiB0aGUgYmFja2luZyBiZWZvcmUgYW55XG4mIzQzOyAqIGNvbGxhcHNlIHRlc3QgcmVsaWVzIG9uIHRoZW0uXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtrc2VsZnRlc3QuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt2bV91dGlsLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7aHVnZXBhZ2Vfc2V0dGluZ3MuaFwmIzM0O1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBwYWdlbWFwX2ZkO1xuJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQ7XG4mIzQzO1xuJiM0MzsvKiBtbWFwIGFuIGFub24gVk1BIG9mIGV4YWN0bHkgQHNpemUgYnl0ZXMgYXQgYSBAc2l6ZS1hbGlnbmVkIGFkZHJlc3MuICovXG4mIzQzO3N0YXRpYyBjaGFyICphbGxvY19hbGlnbmVkKHNpemVfdCBzaXplKVxuJiM0Mzt7XG4mIzQzO1x0c2l6ZV90IGxlbiA9IHNpemUgKiAyO1xuJiM0MztcdHVpbnRwdHJfdCBhbGlnbmVkO1xuJiM0MztcdGNoYXIgKnA7XG4mIzQzO1xuJiM0MztcdHAgPSBtbWFwKE5VTEwsIGxlbiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbiYjNDM7XHRcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTtcbiYjNDM7XHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21tYXAoKVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGFsaWduZWQgPSAoKHVpbnRwdHJfdClwICYjNDM7IHNpemUgLSAxKSBcdTAwMjYgfihzaXplIC0gMSk7XG4mIzQzO1x0aWYgKGFsaWduZWQgIT0gKHVpbnRwdHJfdClwKVxuJiM0MztcdFx0bXVubWFwKHAsIGFsaWduZWQgLSAodWludHB0cl90KXApO1xuJiM0MztcdGlmIChhbGlnbmVkICYjNDM7IHNpemUgIT0gKHVpbnRwdHJfdClwICYjNDM7IGxlbilcbiYjNDM7XHRcdG11bm1hcCgoY2hhciAqKWFsaWduZWQgJiM0Mzsgc2l6ZSxcbiYjNDM7XHRcdCAgICAgICAodWludHB0cl90KXAgJiM0MzsgbGVuIC0gYWxpZ25lZCAtIHNpemUpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gKGNoYXIgKilhbGlnbmVkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBFbmFibGUgb25seSBAb3JkZXIgKG9yZGVyIDA6IG5vdGhpbmcpLCBmYXVsdCBvbmUgYWxpZ25lZCB3aW5kb3cgaW4gYW5kXG4mIzQzOyAqIGNoZWNrIHRoZSBoZWxwZXJzIHNlZSBleGFjdGx5IEBvcmRlci5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIGNoZWNrX29yZGVyKGludCBvcmRlcilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbiYjNDM7XHRzaXplX3Qgc2l6ZSA9IHBzaXplKCkgXHUwMDNjXHUwMDNjIG9yZGVyO1xuJiM0MztcdGJvb2wgb2sgPSB0cnVlO1xuJiM0MztcdGNoYXIgKnA7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5SX09SREVSUzsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9ORVZFUjtcbiYjNDM7XHRpZiAob3JkZXIpXG4mIzQzO1x0XHRzZXR0aW5ncy5odWdlcGFnZXNbb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTO1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0cCA9IGFsbG9jX2FsaWduZWQoc2l6ZSk7XG4mIzQzO1x0KnAgPSAxO1xuJiM0MztcbiYjNDM7XHRpZiAoIWlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgb3JkZXIsXG4mIzQzO1x0XHRcdFx0XHQgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtvcmRlciAlZCBub3QgZGV0ZWN0ZWQgYWZ0ZXIgZmF1bHRcXG5cJiMzNDssIG9yZGVyKTtcbiYjNDM7XHRcdG9rID0gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBBIGxvd2VyIG9yZGVyIG11c3QgYmUgcmVqZWN0ZWQ6IHRoZSBmb2xpbyBpcyBsYXJnZXIuICovXG4mIzQzO1x0aWYgKG9yZGVyIFx1MDAyNlx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIG9yZGVyIC0gMSxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICBwYWdlbWFwX2ZkLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgIGtwYWdlZmxhZ3NfZmQpKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyICVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgICAgb3JkZXIsIG9yZGVyIC0gMSk7XG4mIzQzO1x0XHRvayA9IGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogT3JkZXIgMCBwYWdlcyBtdXN0IG5vdCBsb29rIGxpa2UgYW55IGxhcmdlIGZvbGlvLCBhbmQgdmljZSB2ZXJzYS4gKi9cbiYjNDM7XHRpZiAob3JkZXIgXHUwMDI2XHUwMDI2IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgMCxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICBwYWdlbWFwX2ZkLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgIGtwYWdlZmxhZ3NfZmQpKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyIDBcXG5cJiMzNDssIG9yZGVyKTtcbiYjNDM7XHRcdG9rID0gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRtdW5tYXAocCwgc2l6ZSk7XG4mIzQzO1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3Rlc3RfcmVzdWx0KG9rLCBcJiMzNDtvcmRlciAlZCBjbGFzc2lmaWVkXFxuXCYjMzQ7LCBvcmRlcik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBtYWluKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgb3JkZXJzO1xuJiM0MztcdGludCBvcmRlcjtcbiYjNDM7XG4mIzQzO1x0a3NmdF9wcmludF9oZWFkZXIoKTtcbiYjNDM7XG4mIzQzO1x0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHBhZ2VtYXBfZmQgPSBvcGVuKFwmIzM0Oy9wcm9jL3NlbGYvcGFnZW1hcFwmIzM0OywgT19SRE9OTFkpO1xuJiM0MztcdGlmIChwYWdlbWFwX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O29wZW4oXFxcJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXBcXFwmIzM0OylcJiMzNDspO1xuJiM0MztcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwmIzM0Oy9wcm9jL2twYWdlZmxhZ3NcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRpZiAoa3BhZ2VmbGFnc19mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O29wZW4oXFxcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXFxcJiMzNDspIHJlcXVpcmVzIHJvb3RcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpO1xuJiM0MztcdGlmICghb3JkZXJzKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7Tm8gc3VwcG9ydGVkIFRIUCBvcmRlcnNcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3NldF9wbGFuKF9fYnVpbHRpbl9wb3Bjb3VudGwob3JkZXJzKSAmIzQzOyAxKTtcbiYjNDM7XG4mIzQzO1x0dGhwX3NhdmVfc2V0dGluZ3MoKTtcbiYjNDM7XHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1x0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqL1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0Y2hlY2tfb3JkZXIoMCk7XG4mIzQzO1x0Zm9yIChvcmRlciA9IDE7IG9yZGVyIFx1MDAzYyBOUl9PUkRFUlM7IG9yZGVyJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKCEob3JkZXJzIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBvcmRlcikpKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdGNoZWNrX29yZGVyKG9yZGVyKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHRocF9yZXN0b3JlX3NldHRpbmdzKCk7XG4mIzQzO1xuJiM0MztcdGtzZnRfZmluaXNoZWQoKTtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jXG5pbmRleCBkNzkxN2RjZTNhYmFjLi5hMjZhMGNmZmE5YzViIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuQEAgLTE4Myw2ICYjNDM7MTgzLDE3IEBAIHZvaWQgdGhwX3JlYWRfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHR9XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBXcml0ZSBvbmx5IG9uIGNoYW5nZTogYW55IHN0b3JlIHRvIGEga2h1Z2VwYWdlZCBzeXNmcyBrbm9iIHdha2VzIHRoZVxuJiM0MzsgKiBkYWVtb24sIGFuZCBzZXR0aW5ncyBwdXNoZXMvcG9wcyBtdXN0IG5vdCBzdGFydCBzY2FuIHBhc3NlcyBub2JvZHlcbiYjNDM7ICogYXNrZWQgZm9yIOKAlCBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIGlzIHRoZSBvbmx5IHNhbmN0aW9uZWQgd2FrZS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIHRocF91cGRhdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHRocF9yZWFkX251bShuYW1lKSAhPSBudW0pXG4mIzQzO1x0XHR0aHBfd3JpdGVfbnVtKG5hbWUsIG51bSk7XG4mIzQzO31cbiYjNDM7XG4gdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4ge1xuIFx0c3RydWN0IGtodWdlcGFnZWRfc2V0dGluZ3MgKmtodWdlcGFnZWQgPSBcdTAwMjZzZXR0aW5ncy1cdTAwM2VraHVnZXBhZ2VkO1xuQEAgLTE5OCwxNSAmIzQzOzIwOSwxNSBAQCB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcbiBcdFx0XHRzaG1lbV9lbmFibGVkX3N0cmluZ3Nbc2V0dGluZ3MtXHUwMDNlc2htZW1fZW5hYmxlZF0pO1xuIFx0dGhwX3dyaXRlX251bShcJiMzNDt1c2VfemVyb19wYWdlXCYjMzQ7LCBzZXR0aW5ncy1cdTAwM2V1c2VfemVyb19wYWdlKTtcbiBcbi1cdHRocF93cml0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9kZWZyYWdcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlZGVmcmFnKTtcbi1cdHRocF93cml0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9hbGxvY19zbGVlcF9taWxsaXNlY3NcJiMzNDssXG4tXHRcdFx0a2h1Z2VwYWdlZC1cdTAwM2VhbGxvY19zbGVlcF9taWxsaXNlY3MpO1xuLVx0dGhwX3dyaXRlX251bShcJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXCYjMzQ7LFxuLVx0XHRcdGtodWdlcGFnZWQtXHUwMDNlc2Nhbl9zbGVlcF9taWxsaXNlY3MpO1xuLVx0dGhwX3dyaXRlX251bShcJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX25vbmVcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfbm9uZSk7XG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfc3dhcFwmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19zd2FwKTtcbi1cdHRocF93cml0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zaGFyZWRcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc2hhcmVkKTtcbi1cdHRocF93cml0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9wYWdlc190b19zY2FuXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZXBhZ2VzX3RvX3NjYW4pO1xuJiM0MztcdHRocF91cGRhdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvZGVmcmFnXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZWRlZnJhZyk7XG4mIzQzO1x0dGhwX3VwZGF0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9hbGxvY19zbGVlcF9taWxsaXNlY3NcJiMzNDssXG4mIzQzO1x0XHQgICAgICAga2h1Z2VwYWdlZC1cdTAwM2VhbGxvY19zbGVlcF9taWxsaXNlY3MpO1xuJiM0MztcdHRocF91cGRhdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcJiMzNDssXG4mIzQzO1x0XHQgICAgICAga2h1Z2VwYWdlZC1cdTAwM2VzY2FuX3NsZWVwX21pbGxpc2Vjcyk7XG4mIzQzO1x0dGhwX3VwZGF0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX25vbmUpO1xuJiM0MztcdHRocF91cGRhdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfc3dhcFwmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19zd2FwKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3NoYXJlZFwmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19zaGFyZWQpO1xuJiM0MztcdHRocF91cGRhdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvcGFnZXNfdG9fc2NhblwmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VwYWdlc190b19zY2FuKTtcbiBcbiBcdGlmIChkZXZfcXVldWVfcmVhZF9haGVhZF9wYXRoWzBdKVxuIFx0XHR3cml0ZV9udW0oZGV2X3F1ZXVlX3JlYWRfYWhlYWRfcGF0aCwgc2V0dGluZ3MtXHUwMDNlcmVhZF9haGVhZF9rYik7XG5AQCAtMjMwLDYgJiM0MzsyNDEsNDMgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHR9XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBDb21wbGV0aW9uIGJhcnJpZXIgZm9yIGtodWdlcGFnZWQ6IHdhaXQgdW50aWwgYSBmdWxsIHNjYW4gcGFzcyB0aGF0XG4mIzQzOyAqIHN0YXJ0ZWQgYWZ0ZXIgdGhpcyBjYWxsIGhhcyBmaW5pc2hlZC4gZnVsbF9zY2FucyBtdXN0IGFkdmFuY2UgYnkgdHdvO1xuJiM0MzsgKiBhICYjNDM7MSBzdGVwIG1heSBjb21wbGV0ZSBhIHBhc3MgdGhhdCBleGFtaW5lZCB0aGlzIG1tIGJlZm9yZSB0aGVcbiYjNDM7ICogY2FsbGVyJiMzOTtzIHNldHVwIHdhcyBpbiBwbGFjZS5cbiYjNDM7ICpcbiYjNDM7ICogQW55IHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIHNvIHRoZSBiYXJyaWVyXG4mIzQzOyAqIHdvcmtzIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbmZpZ3VyZWQgc2NhbiBjYWRlbmNlLiBJdCB3YWtlcyBleGFjdGx5XG4mIzQzOyAqIG9uY2UgcGVyIG1pc3NpbmcgcGFzcyDigJQgb3Zlci13YWtpbmcgd291bGQgcXVldWUgYSBzdHJhZ2dsZXIgcGFzc1xuJiM0MzsgKiBiZWhpbmQgdGhlIGJhcnJpZXIsIHBlcnR1cmJpbmcgd2hhdGV2ZXIgdGhlIGNhbGxlciBzZXRzIHVwIG5leHQuXG4mIzQzOyAqIE9uZSB3YWtlIGNvbXBsZXRlcyBvbmUgZnVsbCBwYXNzIG9ubHkgaWYgdGhlIHdob2xlIG1tIGxpc3QgZml0cyBpblxuJiM0MzsgKiBvbmUgc2NhbiBiYXRjaCwgc28gY2FsbGVycyBtdXN0IHBhaXIgdGhpcyB3aXRoIGEgbGFyZ2VcbiYjNDM7ICogcGFnZXNfdG9fc2Nhbi5cbiYjNDM7ICovXG4mIzQzO2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZGVhZGxpbmVfbXMgPSB0aW1lb3V0X3MgKiAxMDAwVUw7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzbGVlcF9tcyA9XG4mIzQzO1x0XHR0aHBfcmVhZF9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1wmIzM0Oyk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBlbGFwc2VkX21zID0gMDtcbiYjNDM7XHRpbnQgcGFzcztcbiYjNDM7XG4mIzQzO1x0Zm9yIChwYXNzID0gMDsgcGFzcyBcdTAwM2MgMjsgcGFzcyYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgdGFyZ2V0ID1cbiYjNDM7XHRcdFx0dGhwX3JlYWRfbnVtKFwmIzM0O2todWdlcGFnZWQvZnVsbF9zY2Fuc1wmIzM0OykgJiM0MzsgMTtcbiYjNDM7XG4mIzQzO1x0XHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcJiMzNDssIHNsZWVwX21zKTtcbiYjNDM7XHRcdHdoaWxlICh0aHBfcmVhZF9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9mdWxsX3NjYW5zXCYjMzQ7KSBcdTAwM2MgdGFyZ2V0KSB7XG4mIzQzO1x0XHRcdGlmIChlbGFwc2VkX21zIFx1MDAzZT0gZGVhZGxpbmVfbXMpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0XHR1c2xlZXAoMTAgKiAxMDAwKTtcbiYjNDM7XHRcdFx0ZWxhcHNlZF9tcyAmIzQzOz0gMTA7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuIHN0cnVjdCB0aHBfc2V0dGluZ3MgKnRocF9jdXJyZW50X3NldHRpbmdzKHZvaWQpXG4ge1xuIFx0aWYgKCFzZXR0aW5nc19pbmRleCkge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXG5pbmRleCA3MjZjNzNjNDNjMDViLi44ZGU0NDZhZmZlZWNkIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxuQEAgLTgzLDYgJiM0Mzs4Myw4IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCB0aHBfc2F2ZV9zZXR0aW5ncyh2b2lkKVxuIFx0aHVnZXBhZ2Vfc2F2ZV9zZXR0aW5ncygvKiB0aHAgPSAqLyB0cnVlLCAvKiBodWdldGxiID0gKi8gZmFsc2UpO1xuIH1cbiBcbiYjNDM7Ym9vbCBraHVnZXBhZ2VkX2Z1bGxfcGFzcyh1bnNpZ25lZCBpbnQgdGltZW91dF9zKTtcbiYjNDM7XG4gdm9pZCB0aHBfc2V0X3JlYWRfYWhlYWRfcGF0aChjaGFyICpwYXRoKTtcbiB1bnNpZ25lZCBsb25nIHRocF9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpO1xuIHVuc2lnbmVkIGxvbmcgdGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG5pbmRleCAxMGU4ZGVkY2IwODdkLi5jNWEzYzM5MjI1ODE5IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmNcbkBAIC0yNiw5ICYjNDM7MjYsMTMgQEBcbiBcbiAjZGVmaW5lIEJBU0VfQUREUiAoKHZvaWQgKikoMVVMIFx1MDAzY1x1MDAzYyAzMCkpXG4gc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XG4mIzQzO3N0YXRpYyBpbnQgaHBhZ2VfcG1kX29yZGVyO1xuIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTtcbiBzdGF0aWMgaW50IGhwYWdlX3BtZF9ucjtcbiBzdGF0aWMgaW50IGFub25fb3JkZXI7XG4mIzQzO3N0YXRpYyBpbnQgYW5vbl90YXJnZXRfb3JkZXI7XG4mIzQzO3N0YXRpYyBpbnQgcGFnZW1hcF9mZCA9IC0xO1xuJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQgPSAtMTtcbiBcbiAjZGVmaW5lIFBJRF9TTUFQUyBcJiMzNDsvcHJvYy9zZWxmL3NtYXBzXCYjMzQ7XG4gI2RlZmluZSBURVNUX0ZJTEUgXCYjMzQ7Y29sbGFwc2VfdGVzdF9maWxlXCYjMzQ7XG5AQCAtMTc3LDYgJiM0MzsxODEsMjEgQEAgc3RhdGljIHZvaWQgZ2V0X2ZpbmZvKGNvbnN0IGNoYXIgKmRpcilcbiBcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDslczogQ291bGQgbm90IHJlYWQ6ICVzXFxuXCYjMzQ7LCBfX2Z1bmNfXywgcGF0aCk7XG4gfVxuIFxuJiM0MztzdGF0aWMgYm9vbCBoYXNfc3dhcCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0RklMRSAqZnAgPSBmb3BlbihcJiMzNDsvcHJvYy9zd2Fwc1wmIzM0OywgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO1x0Y2hhciBsaW5lW01BWF9MSU5FX0xFTkdUSF07XG4mIzQzO1x0Ym9vbCByZXQgPSBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFmcClcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHQvKiBGaXJzdCBsaW5lIGlzIHRoZSBoZWFkZXI7IGFueSBmb2xsb3dpbmcgbGluZSBpcyBhIHN3YXAgYXJlYS4gKi9cbiYjNDM7XHRpZiAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkgXHUwMDI2XHUwMDI2IGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKVxuJiM0MztcdFx0cmV0ID0gdHJ1ZTtcbiYjNDM7XHRmY2xvc2UoZnApO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIGJvb2wgY2hlY2tfc3dhcCh2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpXG4ge1xuIFx0Ym9vbCBzd2FwID0gZmFsc2U7XG5AQCAtNTU0LDggJiM0Mzs1NzMsMTcgQEAgc3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsXG4gc3RhdGljIGJvb2wgd2FpdF9mb3Jfc2Nhbihjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsXG4gXHRcdFx0ICBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuIHtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSBidWRnZXQgaGFzIHRvIGNvdmVyIGtodWdlcGFnZWQgY29weWluZyBucl9ocGFnZXMgKlxuJiM0MztcdCAqIGhwYWdlX3BtZF9zaXplLCBwbHVzIHR3byBvZiBpdHMgcGFzc2VzIG92ZXIgdGhlIG1tLiBUaHJlZSBzZWNvbmRzXG4mIzQzO1x0ICogZG9lcyB0aGF0IGF0IGEgMk0gUE1ELCBidXQgdGhlIHNhbWUgdGVzdCBtb3ZlcyAyRyBhdCBhIDUxMk0gUE1EXG4mIzQzO1x0ICogKGFybTY0IHdpdGggNjRLIGJhc2UgcGFnZXMpIGFuZCAzcyBpcyB0aGVuIG1hcmdpbmFsOiBpdCBmYWlscyBvbiBhXG4mIzQzO1x0ICogY29sbGFwc2UgdGhhdCBjb21wbGV0ZXMgY29ycmVjdGx5LCBqdXN0IG5vdCBpbnNpZGUgdGhlIGJ1ZGdldC5cbiYjNDM7XHQgKiBBbGxvdyBhIGZ1cnRoZXIgc2Vjb25kIHBlciA2NE0gdG8gY29sbGFwc2UuXG4mIzQzO1x0ICovXG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBieXRlcyA9ICh1bnNpZ25lZCBsb25nKW5yX2hwYWdlcyAqIGhwYWdlX3BtZF9zaXplO1xuJiM0MztcdGludCB0aW1lb3V0ID0gNiAmIzQzOyAyICogKGJ5dGVzIC8gKDY0VUwgXHUwMDNjXHUwMDNjIDIwKSk7XG4gXHRpbnQgZnVsbF9zY2Fucztcbi1cdGludCB0aW1lb3V0ID0gNjsgLyogMyBzZWNvbmRzICovXG4gXG4gXHQvKiBTYW5pdHkgY2hlY2sgKi9cbiBcdGlmICghb3BzLVx1MDAzZWNoZWNrX2h1Z2UocCwgMCkpXG5AQCAtNzM1LDYgJiM0Mzs3NjMsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2Vfc3dhcGluX3NpbmdsZV9wdGUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BcbiBcdHZvaWQgKnA7XG4gXG4gXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4mIzQzO1x0aWYgKCFoYXNfc3dhcCgpKSB7XG4mIzQzO1x0XHRza2lwKFwmIzM0O1NraXAgKG5vIHN3YXAgY29uZmlndXJlZClcJiMzNDspO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuIFx0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiBcbiBcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1N3YXBvdXQgb25lIHBhZ2UuLi5cJiMzNDspO1xuQEAgLTc2MSw2ICYjNDM7NzkzLDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3N3YXAoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvXG4gXHR2b2lkICpwO1xuIFxuIFx0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdGlmICghaGFzX3N3YXAoKSkge1xuJiM0MztcdFx0c2tpcChcJiMzNDtTa2lwIChubyBzd2FwIGNvbmZpZ3VyZWQpXCYjMzQ7KTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiBcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4gXG4gXHRrc2Z0X3ByaW50X21zZyhcJiMzNDtTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uXCYjMzQ7LCBtYXhfcHRlc19zd2FwICYjNDM7IDEsIGhwYWdlX3BtZF9ucik7XG5AQCAtODUzLDYgJiM0Mzs4ODksMjEgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfY29tcG91bmRfZXh0cmVtZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHNcbiBcdHZvaWQgKnA7XG4gXHRpbnQgaTtcbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEJ1aWxkcyBhIFBNRCYjMzk7cyB3b3J0aCBvZiBkaXN0aW5jdCBQVEUtbWFwcGVkIGNvbXBvdW5kIHBhZ2VzIGJ5IGN5Y2xpbmdcbiYjNDM7XHQgKiBocGFnZV9wbWRfbnIgZmF1bHQtdGltZSBUSFBzIHRocm91Z2ggbXJlbWFwLiBGYXVsdC10aW1lIFRIUCBhbGxvY2F0aW9uXG4mIzQzO1x0ICogaXMgYmVzdC1lZmZvcnQsIGFuZCB0aGlzIG5lZWRzIGhwYWdlX3BtZF9uciBQTUQtb3JkZXIgcGFnZXMgaW4gYSByb3c6XG4mIzQzO1x0ICogZmluZSBhdCBhIDJNICg0SyBiYXNlKSBvciAzMk0gKDE2SyBiYXNlKSBQTUQsIGJ1dCBhIDUxMk0gUE1EIChhcm02NC82NEspXG4mIzQzO1x0ICogaXMgYW4gb3JkZXItMTMgYWxsb2NhdGlvbiB0aGUgYWxsb2NhdG9yIGNhbm5vdCByZWxpYWJseSBoYW5kIG91dCBldmVuXG4mIzQzO1x0ICogb25jZSwgbGV0IGFsb25lIDgxOTIgdGltZXMuIENhcCBhdCBhIDMyTSBQTUQ7IE1BRFZfQ09MTEFQU0UtZHJpdmVuIGNhc2VzXG4mIzQzO1x0ICogc3RpbGwgY292ZXIgUE1ELW9yZGVyIGNvbGxhcHNlIG9uIHRoZSBsYXJnZXIgY29uZmlncy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoaHBhZ2VfcG1kX3NpemUgXHUwMDNlICgzMlVMIFx1MDAzY1x1MDAzYyAyMCkpIHtcbiYjNDM7XHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcJiMzNDslczogUE1EIHRvbyBsYXJnZSBmb3IgZmF1bHQtdGltZSBUSFAgY29uc3RydWN0aW9uXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgIF9fZnVuY19fKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuIFx0a3NmdF9wcmludF9tc2coXCYjMzQ7Q29uc3RydWN0IFBURSBwYWdlIHRhYmxlIGZ1bGwgb2YgZGlmZmVyZW50IFBURS1tYXBwZWQgY29tcG91bmQgcGFnZXNcXG5cJiMzNDspO1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgaHBhZ2VfcG1kX25yOyBpJiM0MzsmIzQzOykge1xuQEAgLTEwNDMsNiAmIzQzOzEwOTQsNjEgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wc1xuIFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBDb250ZW50IHN0YXlzIGlzb2xhdGVkIHdoaWxlIGEgY28tc2hhcmVyIHdyaXRlcyBjb25jdXJyZW50bHkuIEEgc2hhcmVkXG4mIzQzOyAqIHNvdXJjZSBpcyBjb3BpZWQgbGl2ZSAobm90IGZyb3plbiksIHJlbHlpbmcgb24gaXQgYmVpbmcgQ29XIC0gaW1tdXRhYmxlXG4mIzQzOyAqIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGNvcHk7IGEgY28tc2hhcmVyJiMzOTtzIHdyaXRlIGdvZXMgdG8gYSBDb1cgY29weS4gVGhlXG4mIzQzOyAqIGNvbGxhcHNpbmcgY2hpbGQgbXVzdCBzZWUgdGhlIHByZS1mb3JrIGNvbnRlbnQsIHRoZSB3cml0aW5nIHBhcmVudCBvbmx5XG4mIzQzOyAqIGl0cyBvd24gd3JpdGVzLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2VfZm9ya19jb3dfcmFjZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9wcylcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHVuc2lnbmVkIGxvbmcgc2hhcmVkID0gNjQgKiBwYWdlX3NpemU7XG4mIzQzO1x0Y29uc3QgaW50IHN0cmlkZSA9IHBhZ2Vfc2l6ZSAvIHNpemVvZihpbnQpO1xuJiM0MztcdGludCB3c3RhdHVzLCBpLCBuID0gc2hhcmVkIC8gcGFnZV9zaXplO1xuJiM0MztcdGludCAqaXA7XG4mIzQzO1x0dm9pZCAqcDtcbiYjNDM7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdGlwID0gcDtcbiYjNDM7XHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgc2hhcmVkKTtcdFx0Lyogc2hhcmVkIHByZWZpeCwgcHJlLWZvcmsgcGF0dGVybiAqL1xuJiM0MztcbiYjNDM7XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtGb3JrLCBjb2xsYXBzZSBpbiB0aGUgY2hpbGQgd2hpbGUgdGhlIHBhcmVudCByZXdyaXRlcy4uLlwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFmb3JrKCkpIHtcbiYjNDM7XHRcdG9wcy1cdTAwM2VmYXVsdChwLCBzaGFyZWQsIGhwYWdlX3BtZF9zaXplKTtcdC8qIHByaXZhdGUgcmVtYWluZGVyICovXG4mIzQzO1x0XHRjLVx1MDAzZWNvbGxhcHNlKFwmIzM0O0NvbGxhcHNlIGEgcmFuZ2Ugc2hhcmVkIHdpdGggYSB3cml0aW5nIGNvLXNoYXJlclwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgIHAsIDEsIG9wcywgdHJ1ZSk7XG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgJiM0MzsgMHhkZWFkMDAwMCkge1xuJiM0MztcdFx0XHRcdGZhaWwoXCYjMzQ7RmFpbDogY2hpbGQgY29udGVudFwmIzM0Oyk7XG4mIzQzO1x0XHRcdFx0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0XHRcdFx0X2V4aXQoZXhpdF9zdGF0dXMpO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRzdWNjZXNzKFwmIzM0O09LXCYjMzQ7KTtcbiYjNDM7XHRcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdFx0X2V4aXQoZXhpdF9zdGF0dXMpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogSGFtbWVyIHRoZSBwYXJlbnQmIzM5O3Mgb3duIHdyaXRlcyBvdmVyIHRoZSBzaGFyZWQgcHJlZml4LiAqL1xuJiM0MztcdGZvciAoaW50IGl0ID0gMDsgaXQgXHUwMDNjIDIwMDAwMDsgaXQmIzQzOyYjNDM7KVxuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbjsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdGlwW2kgKiBzdHJpZGVdID0gaSAmIzQzOyAweGJlZWYwMDAwO1xuJiM0MztcbiYjNDM7XHR3YWl0KFx1MDAyNndzdGF0dXMpO1xuJiM0MztcdGV4aXRfc3RhdHVzID0gV0VYSVRTVEFUVVMod3N0YXR1cyk7XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NoZWNrIHRoZSBwYXJlbnQgc2VlcyBvbmx5IGl0cyBvd24gd3JpdGVzLi4uXCYjMzQ7KTtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdGlmIChpcFtpICogc3RyaWRlXSAhPSBpICYjNDM7IDB4YmVlZjAwMDApXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdGlmIChpID09IG4pXG4mIzQzO1x0XHRzdWNjZXNzKFwmIzM0O09LXCYjMzQ7KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRmYWlsKFwmIzM0O0ZhaWw6IHBhcmVudCBjb250ZW50XCYjMzQ7KTtcbiYjNDM7XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCYjMzQ7JXNcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgdm9pZCBtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4gXHRcdFx0XHRcdCAgIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4ge1xuQEAgLTEwODgsNiAmIzQzOzExOTQsMjIyIEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfcmV0cmFjdGVkX3BhZ2VfdGFibGVzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuIFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBPcmRlci1wYXJhbWV0ZXJpemVkIGNvbGxhcHNlIGNhc2VzICgtbyBcdTAwM2NvcmRlclx1MDAzZSk6IGtodWdlcGFnZWQgY29sbGFwc2VzXG4mIzQzOyAqIDRLLWZhdWx0ZWQgbWVtb3J5IGludG8gZm9saW9zIG9mIHRoZSBnaXZlbiBzdWItUE1EIG9yZGVyLiBEZXRlY3Rpb24gaXNcbiYjNDM7ICogZm9saW8tYmFzZWQgKHZtX3V0aWwpLCBub3Qgc21hcHM6IEFub25IdWdlUGFnZXMgb25seSBhY2NvdW50cyBQTURcbiYjNDM7ICogbWFwcGluZ3MuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSByZWdpb24gaXMgZmF1bHRlZCBiZWZvcmUgTUFEVl9IVUdFUEFHRSBhbmQgdGhlIHRhcmdldCBvcmRlciBpc1xuJiM0MzsgKiBjb25maWd1cmVkIFwmIzM0O2luaGVyaXRcJiMzNDsgdW5kZXIgZW5hYmxlZD1tYWR2aXNlLCBzbyBmYXVsdHMgYXJlIGFsd2F5c1xuJiM0MzsgKiBvcmRlciAwIGFuZCB0aGUgY29sbGFwc2UgcHJvZHVjdCBjYW4gb25seSBjb21lIGZyb20ga2h1Z2VwYWdlZC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBzaXplX3QgYW5vbl9vcmRlcl9zaXplKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcGFnZV9zaXplIFx1MDAzY1x1MDAzYyBhbm9uX3RhcmdldF9vcmRlcjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgcmFuZ2VfY29sbGFwc2VkKHZvaWQgKnAsIHNpemVfdCBsZW4pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBsZW4sIGFub25fdGFyZ2V0X29yZGVyLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBObyBhbGlnbmVkIHdpbmRvdyBpbiBbcCwgcCAmIzQzOyBsZW4pIGlzIGJhY2tlZCBhdCB0aGUgdGFyZ2V0IG9yZGVyLiAqL1xuJiM0MztzdGF0aWMgYm9vbCByYW5nZV9ub3RfY29sbGFwc2VkKHZvaWQgKnAsIHNpemVfdCBsZW4pXG4mIzQzO3tcbiYjNDM7XHRzaXplX3Qgd2luZG93ID0gYW5vbl9vcmRlcl9zaXplKCk7XG4mIzQzO1x0Y2hhciAqYWRkciA9IHA7XG4mIzQzO1xuJiM0MztcdGZvciAoOyBsZW4gXHUwMDNlPSB3aW5kb3c7IGFkZHIgJiM0Mzs9IHdpbmRvdywgbGVuIC09IHdpbmRvdykge1xuJiM0MztcdFx0aWYgKHJhbmdlX2NvbGxhcHNlZChhZGRyLCB3aW5kb3cpKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHQvKiBXYWl0IHVwIHRvIDMwIHNlY29uZHMgZm9yIHRoZSBwYXNzIHRvIGNvbXBsZXRlLiAqL1xuJiM0MztcdHJldHVybiBraHVnZXBhZ2VkX2Z1bGxfcGFzcygzMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIENhc2VzIHdob3NlIGdlb21ldHJ5IG5lZWRzIGEgd2luZG93IHN0cmljdGx5IGJlbG93IHRoZSBQTUQgc2tpcCBhdFxuJiM0MzsgKiAtbyBcdTAwM2NQTUQgb3JkZXJcdTAwM2U7IHRoZSByZXN0IHJ1biB0aGVyZSB1bmNoYW5nZWQsIGJhc2VsaW5pbmcgdGhlIGxlZ2FjeVxuJiM0MzsgKiBQTUQgZW5naW5lIHdpdGggdGhlIHNhbWUgdGVzdCB0ZXh0IHVzZWQgZm9yIHRoZSBtVEhQIG9yZGVycy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBib29sIHNraXBfYXRfcG1kX29yZGVyKGNvbnN0IGNoYXIgKm5hbWUpXG4mIzQzO3tcbiYjNDM7XHRpZiAoYW5vbl90YXJnZXRfb3JkZXIgXHUwMDNjIGhwYWdlX3BtZF9vcmRlcilcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCYjMzQ7JXM6IG5lZWRzIGEgd2luZG93IGJlbG93IHRoZSBQTURcXG5cJiMzNDssIG5hbWUpO1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9mdWxsKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuJiM0Mzt7XG4mIzQzO1x0dm9pZCAqcDtcbiYjNDM7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0aWYgKCFyYW5nZV9ub3RfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7Q29sbGFwc2UgZnVsbHkgcG9wdWxhdGVkIFBURSB0YWJsZSB0byB0YXJnZXQgb3JkZXIuLi5cJiMzNDspO1xuJiM0MztcdGlmICgha2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcygpKVxuJiM0MztcdFx0ZmFpbChcJiMzNDtUaW1lb3V0XCYjMzQ7KTtcbiYjNDM7XHRlbHNlIGlmIChyYW5nZV9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxuJiM0MztcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCYjMzQ7JXNcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbiYjNDM7XHRcdFx0XHRcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuJiM0Mzt7XG4mIzQzO1x0c2l6ZV90IHdpbmRvdyA9IGFub25fb3JkZXJfc2l6ZSgpO1xuJiM0MztcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdGlmIChza2lwX2F0X3BtZF9vcmRlcihfX2Z1bmNfXykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbiYjNDM7XHRvcHMtXHUwMDNlZmF1bHQocCwgd2luZG93LCAyICogd2luZG93KTtcbiYjNDM7XHRpZiAoIXJhbmdlX25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1VuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbiYjNDM7XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtDb2xsYXBzZSBvbmUgZnVsbHkgcG9wdWxhdGVkIHdpbmRvdy4uLlwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXG4mIzQzO1x0XHRmYWlsKFwmIzM0O1RpbWVvdXRcJiMzNDspO1xuJiM0MztcdGVsc2UgaWYgKHJhbmdlX2NvbGxhcHNlZChwICYjNDM7IHdpbmRvdywgd2luZG93KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCByYW5nZV9ub3RfY29sbGFwc2VkKHAsIHdpbmRvdykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgcmFuZ2Vfbm90X2NvbGxhcHNlZChwICYjNDM7IDIgKiB3aW5kb3csXG4mIzQzO1x0XHRcdFx0ICAgICBocGFnZV9wbWRfc2l6ZSAtIDIgKiB3aW5kb3cpKVxuJiM0MztcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0dmFsaWRhdGVfbWVtb3J5KHAsIHdpbmRvdywgMiAqIHdpbmRvdyk7XG4mIzQzO1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX3BhcnRpYWxfd2luZG93KHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuJiM0MztcdFx0XHRcdFx0ICBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuJiM0Mzt7XG4mIzQzO1x0dm9pZCAqcDtcbiYjNDM7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBwYWdlX3NpemUpO1xuJiM0MztcdGlmICghcmFuZ2Vfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7VW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NvbGxhcHNlIHdpbmRvdyB3aXRoIHNpbmdsZSBQVEUgZW50cnkgcHJlc2VudC4uLlwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXG4mIzQzO1x0XHRmYWlsKFwmIzM0O1RpbWVvdXRcJiMzNDspO1xuJiM0MztcdGVsc2UgaWYgKHJhbmdlX2NvbGxhcHNlZChwLCBhbm9uX29yZGVyX3NpemUoKSkpXG4mIzQzO1x0XHRzdWNjZXNzKFwmIzM0O09LXCYjMzQ7KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRmYWlsKFwmIzM0O0ZhaWxcJiMzNDspO1xuJiM0MztcbiYjNDM7XHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgcGFnZV9zaXplKTtcbiYjNDM7XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCYjMzQ7JXNcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbiYjNDM7XHRcdFx0XHRcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuJiM0MztcdHNpemVfdCB3aW5kb3cgPSBhbm9uX29yZGVyX3NpemUoKTtcbiYjNDM7XHR2b2lkICpwO1xuJiM0MztcbiYjNDM7XHRpZiAoc2tpcF9hdF9wbWRfb3JkZXIoX19mdW5jX18pKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSAwO1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTtcbiYjNDM7XHRpZiAoIXJhbmdlX25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1VuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbiYjNDM7XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtDb2xsYXBzZSBmdWxsIHdpbmRvdywgbm90IHRoZSBvbmUgbWlzc2luZyBhIHBhZ2UuLi5cJiMzNDspO1xuJiM0MztcdGlmICgha2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcygpKVxuJiM0MztcdFx0ZmFpbChcJiMzNDtUaW1lb3V0XCYjMzQ7KTtcbiYjNDM7XHRlbHNlIGlmIChyYW5nZV9jb2xsYXBzZWQocCwgd2luZG93KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCByYW5nZV9ub3RfY29sbGFwc2VkKHAgJiM0Mzsgd2luZG93LCB3aW5kb3cpKVxuJiM0MztcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIDIgKiB3aW5kb3cgLSBwYWdlX3NpemUpO1xuJiM0MztcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbiYjNDM7XHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCYjMzQ7JXNcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogU21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCB3aWxsIGNvbnNpZGVyIGZvciBtVEhQIGNvbGxhcHNlLiAqL1xuJiM0MzsjZGVmaW5lIE1JTl9NVEhQX09SREVSIDJcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEEgcmVnaW9uIGJhY2tlZCBieSBsYXJnZSBmb2xpb3Mgb2YgYSBzbWFsbGVyIG9yZGVyIGlzIGEgdmFsaWQgc291cmNlXG4mIzQzOyAqIGZvciBjb2xsYXBzZSB0byB0aGUgdGFyZ2V0IG9yZGVyOlxuJiM0MzsgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKCkgYWNjZXB0cyBhbnkgc291cmNlIGZvbGlvIG9mIGFuIG9yZGVyXG4mIzQzOyAqIHN0cmljdGx5IGJlbG93IHRoZSBjYW5kaWRhdGUmIzM5O3MuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuJiM0MztcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XG4mIzQzO1x0aW50IHNvdXJjZV9vcmRlciA9IGFub25fb3JkZXIgPyBhbm9uX29yZGVyIDogTUlOX01USFBfT1JERVI7XG4mIzQzO1x0dm9pZCAqcDtcbiYjNDM7XG4mIzQzO1x0LyogU291cmNlcyBtdXN0IGJlIGEgc3VwcG9ydGVkIG1USFAgb3JkZXIgc3RyaWN0bHkgYmVsb3cgdGhlIHRhcmdldC4gKi9cbiYjNDM7XHRpZiAoc291cmNlX29yZGVyIFx1MDAzZT0gYW5vbl90YXJnZXRfb3JkZXIgfHxcbiYjNDM7XHQgICAgISh0aHBfc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBzb3VyY2Vfb3JkZXIpKSkge1xuJiM0MztcdFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFwmIzM0OyVzOiBubyBzb3VyY2Ugb3JkZXIgYmVsb3cgdGFyZ2V0XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgIF9fZnVuY19fKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEZhdWx0IHRoZSB3aG9sZSByZWdpb24gYXMgb3JkZXItQHNvdXJjZV9vcmRlciBmb2xpb3MuICovXG4mIzQzO1x0c2V0dGluZ3MuaHVnZXBhZ2VzW3NvdXJjZV9vcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7XG4mIzQzO1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbiYjNDM7XHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIGhwYWdlX3BtZF9zaXplLCBzb3VyY2Vfb3JkZXIsXG4mIzQzO1x0XHRcdFx0XHQgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1JlZ2lvbiBub3QgYmFja2VkIGJ5IG9yZGVyLSVkIGZvbGlvcyBhZnRlciBmYXVsdFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICBzb3VyY2Vfb3JkZXIpO1xuJiM0MztcbiYjNDM7XHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbiYjNDM7XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtDb2xsYXBzZSByZWdpb24gYmFja2VkIGJ5IG9yZGVyLSVkIHNvdXJjZXMuLi5cJiMzNDssXG4mIzQzO1x0XHQgICAgICAgc291cmNlX29yZGVyKTtcbiYjNDM7XHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7VGltZW91dFwmIzM0Oyk7XG4mIzQzO1x0ZWxzZSBpZiAocmFuZ2VfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbiYjNDM7XHRcdHN1Y2Nlc3MoXCYjMzQ7T0tcJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHZhbGlkYXRlX21lbW9yeShwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcbiB7XG4gXHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7XFxuVXNhZ2U6IC4va2h1Z2VwYWdlZCBbT1BUSU9OU10gXHUwMDNjdGVzdCB0eXBlXHUwMDNlIFtkaXJdXFxuXFxuXCYjMzQ7KTtcbkBAIC0xMTAzLDYgJiM0MzsxNDI1LDExIEBAIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXG4gXHRmcHJpbnRmKHN0ZGVycixcdFwmIzM0O1xcdFxcdC1oOiBUaGlzIGhlbHAgbWVzc2FnZS5cXG5cJiMzNDspO1xuIFx0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQtczogbVRIUCBzaXplLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXG5cJiMzNDspO1xuIFx0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQgICAgRGVmYXVsdHMgdG8gMC4gVXNlIHRoaXMgc2l6ZSBmb3IgYW5vbiBvciBzaG1lbSBhbGxvY2F0aW9ucy5cXG5cJiMzNDspO1xuJiM0MztcdGZwcmludGYoc3RkZXJyLFx0XCYjMzQ7XFx0XFx0LW86IGNvbGxhcHNlIHRhcmdldCBvcmRlciBmb3Iga2h1Z2VwYWdlZDphbm9uLlxcblwmIzM0Oyk7XG4mIzQzO1x0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQgICAgUnVucyB0aGUgb3JkZXItcGFyYW1ldGVyaXplZCBjb2xsYXBzZSBjYXNlcyBpbnN0ZWFkXFxuXCYjMzQ7KTtcbiYjNDM7XHRmcHJpbnRmKHN0ZGVycixcdFwmIzM0O1xcdFxcdCAgICBvZiB0aGUgUE1EIGNhc2VzLlxcblwmIzM0Oyk7XG4mIzQzO1x0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQgICAgV2l0aCAtcywgLXMgbmFtZXMgdGhlIG1USFAgc291cmNlIG9yZGVyIGZvciB0aGVcXG5cJiMzNDspO1xuJiM0MztcdGZwcmludGYoc3RkZXJyLFx0XCYjMzQ7XFx0XFx0ICAgIG1peGVkLXNvdXJjZSBjYXNlIChzb3VyY2Ugb3JkZXIgYmVsb3cgdGhlIHRhcmdldCkuXFxuXCYjMzQ7KTtcbiBcdGV4aXQoMSk7XG4gfVxuIFxuQEAgLTExMTIsMTcgJiM0MzsxNDM5LDMxIEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRjaGFyICpidWY7XG4gXHRjb25zdCBjaGFyICp0b2tlbjtcbiBcbi1cdHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIFwmIzM0O3M6aFwmIzM0OykpICE9IC0xKSB7XG4mIzQzO1x0d2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgXCYjMzQ7czpvOmhcJiMzNDspKSAhPSAtMSkge1xuIFx0XHRzd2l0Y2ggKG9wdCkge1xuIFx0XHRjYXNlICYjMzk7cyYjMzk7OlxuIFx0XHRcdGFub25fb3JkZXIgPSBhdG9pKG9wdGFyZyk7XG4gXHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlICYjMzk7byYjMzk7OlxuJiM0MztcdFx0XHRhbm9uX3RhcmdldF9vcmRlciA9IGF0b2kob3B0YXJnKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJiMzOTtoJiMzOTs6XG4gXHRcdGRlZmF1bHQ6XG4gXHRcdFx0dXNhZ2UoKTtcbiBcdFx0fVxuIFx0fVxuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogLXMgYW5kIC1vIGNvbXBvc2U6IC1zIHRoZW4gbmFtZXMgdGhlIG1USFAgc291cmNlIG9yZGVyIGZvciB0aGVcbiYjNDM7XHQgKiBtaXhlZC1zb3VyY2UgY2FzZSwgd2hpY2ggbmVlZHMgYSBzb3VyY2Ugc3RyaWN0bHkgYmVsb3cgdGhlXG4mIzQzO1x0ICogdGFyZ2V0IChhbmQgYXQgb3IgYWJvdmUgdGhlIHNtYWxsZXN0IG1USFAgb3JkZXIpLiBBbG9uZSwgLXMgaXNcbiYjNDM7XHQgKiB0aGUgc291cmNlIG9yZGVyIGZvciB0aGUgZGVmYXVsdCBQTUQgc3VpdGU7IGFsb25lLCAtbyBpcyB0aGVcbiYjNDM7XHQgKiBjb2xsYXBzZSB0YXJnZXQgZm9yIHRoZSBvcmRlci1wYXJhbWV0ZXJpemVkIHN1aXRlLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChhbm9uX3RhcmdldF9vcmRlciBcdTAwMjZcdTAwMjYgYW5vbl9vcmRlciBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgKGFub25fb3JkZXIgXHUwMDNjIE1JTl9NVEhQX09SREVSIHx8IGFub25fb3JkZXIgXHUwMDNlPSBhbm9uX3RhcmdldF9vcmRlcikpXG4mIzQzO1x0XHR1c2FnZSgpO1xuJiM0MztcbiBcdGFyZ3YgJiM0Mzs9IG9wdGluZDtcbiBcdGFyZ2MgLT0gb3B0aW5kO1xuIFxuQEAgLTEyMDcsNyAmIzQzOzE1NDgsNiBAQCBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7XG4gXG4gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIHtcbi1cdGludCBocGFnZV9wbWRfb3JkZXI7XG4gXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIGRlZmF1bHRfc2V0dGluZ3MgPSB7XG4gXHRcdC50aHBfZW5hYmxlZCA9IFRIUF9NQURWSVNFLFxuIFx0XHQudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTLFxuQEAgLTEyNDQsMTggJiM0MzsxNTg0LDk0IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGhwYWdlX3BtZF9uciA9IGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplO1xuIFx0aHBhZ2VfcG1kX29yZGVyID0gX19idWlsdGluX2N0eihocGFnZV9wbWRfbnIpO1xuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIHBhZ2UgY2FjaGUgY2FwcyBmb2xpbyBvcmRlciBhdCBNQVhfUEFHRUNBQ0hFX09SREVSLCB3aGljaFxuJiM0MztcdCAqIHhhc19zcGxpdF9hbGxvYygpIHB1dHMgYmVsb3cgdGhlIFBNRCBvcmRlciBvbiBhcm02NCB3aXRoIDY0SyBwYWdlcy5cbiYjNDM7XHQgKiBBIFBNRC1zaXplZCBwYWdlIGNhY2hlIGZvbGlvIGlzIHRoZW4gaW1wb3NzaWJsZSwgc28gdGhlIGtlcm5lbFxuJiM0MztcdCAqIHJlZnVzZXMgdGhlc2UgY29sbGFwc2VzIGJ5IGRlc2lnbiBhbmQgdGhlcmUgaXMgbm90aGluZyB0byB0ZXN0LlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghKHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGhwYWdlX3BtZF9vcmRlcikpKSB7XG4mIzQzO1x0XHRpZiAoc2htZW1fb3BzKSB7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O25vIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvOiBza2lwcGluZyBzaG1lbVxcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdHNobWVtX29wcyA9IE5VTEw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAoZmluZm8udHlwZSA9PSBWTUFfU0hNRU0gXHUwMDI2XHUwMDI2IHJlYWRfb25seV9maWxlX29wcykge1xuJiM0MztcdFx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgdG1wZnMgZmlsZVxcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdHJlYWRfb25seV9maWxlX29wcyA9IE5VTEw7XG4mIzQzO1x0XHRcdHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9IE5VTEw7XG4mIzQzO1x0XHRcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSBOVUxMO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKCFhbm9uX29wcyBcdTAwMjZcdTAwMjYgIXNobWVtX29wcyBcdTAwMjZcdTAwMjYgIXJlYWRfb25seV9maWxlX29wcylcbiYjNDM7XHRcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7Tm90aGluZyBsZWZ0IHRvIGNvbGxhcHNlIGludG9cXG5cJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGFub25fdGFyZ2V0X29yZGVyIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAhKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGFub25fdGFyZ2V0X29yZGVyKSkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgICBhbm9uX3RhcmdldF9vcmRlcik7XG4mIzQzO1x0aWYgKGFub25fdGFyZ2V0X29yZGVyIFx1MDAzZSBocGFnZV9wbWRfb3JkZXIpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7LW8gdGFrZXMgYXQgbW9zdCB0aGUgUE1EIG9yZGVyXFxuXCYjMzQ7KTtcbiYjNDM7XG4gXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IGhwYWdlX3BtZF9uciAtIDE7XG4gXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfc3dhcCA9IGhwYWdlX3BtZF9uciAvIDg7XG4gXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfc2hhcmVkID0gaHBhZ2VfcG1kX25yIC8gMjtcbiBcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID0gaHBhZ2VfcG1kX25yICogODtcbiBcdGRlZmF1bHRfc2V0dGluZ3MuaHVnZXBhZ2VzW2hwYWdlX3BtZF9vcmRlcl0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xuLVx0ZGVmYXVsdF9zZXR0aW5ncy5odWdlcGFnZXNbYW5vbl9vcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7XG4gXHRkZWZhdWx0X3NldHRpbmdzLnNobWVtX2h1Z2VwYWdlc1tocGFnZV9wbWRfb3JkZXJdLmVuYWJsZWQgPSBTSE1FTV9JTkhFUklUO1xuLVx0ZGVmYXVsdF9zZXR0aW5ncy5zaG1lbV9odWdlcGFnZXNbYW5vbl9vcmRlcl0uZW5hYmxlZCA9IFNITUVNX0FMV0FZUztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFVuZGVyIC1vIHRoZSBvcmRlci1wYXJhbWV0ZXJpemVkIGNhc2VzIHdhbnQgb3JkZXItMCBzb3VyY2VzIGJ5XG4mIzQzO1x0ICogZGVmYXVsdDsgdGhlIG1peGVkLXNvdXJjZSBjYXNlIGVuYWJsZXMgaXRzIG93biAocG9zc2libHkgLXNcbiYjNDM7XHQgKiBzZWxlY3RlZCkgc291cmNlIG9yZGVyIGxvY2FsbHkuIEVuYWJsaW5nIGl0IGdsb2JhbGx5IGhlcmUgd291bGRcbiYjNDM7XHQgKiBtYWtlIGV2ZXJ5IGNhc2UgZmF1bHQgdGhhdCBvcmRlci5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIWFub25fdGFyZ2V0X29yZGVyKSB7XG4mIzQzO1x0XHRkZWZhdWx0X3NldHRpbmdzLmh1Z2VwYWdlc1thbm9uX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcbiYjNDM7XHRcdGRlZmF1bHRfc2V0dGluZ3Muc2htZW1faHVnZXBhZ2VzW2Fub25fb3JkZXJdLmVuYWJsZWQgPSBTSE1FTV9BTFdBWVM7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoYW5vbl90YXJnZXRfb3JkZXIpIHtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBPbmx5IHRoZSB0YXJnZXQgb3JkZXIgbWF5IHByb2R1Y2UgbGFyZ2UgZm9saW9zLCBhbmQgb25seVxuJiM0MztcdFx0ICogZnJvbSBraHVnZXBhZ2VkOiBcJiMzNDtpbmhlcml0XCYjMzQ7IHVuZGVyIGVuYWJsZWQ9bWFkdmlzZSBrZWVwc1xuJiM0MztcdFx0ICogcHJlLU1BRFZfSFVHRVBBR0UgZmF1bHRzIGF0IG9yZGVyIDAuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGRlZmF1bHRfc2V0dGluZ3MuaHVnZXBhZ2VzW2hwYWdlX3BtZF9vcmRlcl0uZW5hYmxlZCA9IFRIUF9ORVZFUjtcbiYjNDM7XHRcdGRlZmF1bHRfc2V0dGluZ3MuaHVnZXBhZ2VzW2Fub25fdGFyZ2V0X29yZGVyXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogT3JkZXItcGFyYW1ldGVyaXplZCBjYXNlcyBhcmUgZHJpdmVuIHN0cmljdGx5IGJ5IHRoZVxuJiM0MztcdFx0ICoga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSBiYXJyaWVyLCB3aGljaCB3YWtlcyB0aGUgZGFlbW9uXG4mIzQzO1x0XHQgKiBpdHNlbGYuIEEgbG9uZyBzY2FuX3NsZWVwIGtlZXBzIGtodWdlcGFnZWQgZnJvbVxuJiM0MztcdFx0ICogZnJlZS1ydW5uaW5nIGJldHdlZW4gYmFycmllciBzdGVwcywgYW5kIGEgcGFnZXNfdG9fc2NhblxuJiM0MztcdFx0ICogY292ZXJpbmcgZXZlcnl0aGluZyBtYWtlcyBvbmUgd2FrZSBjb21wbGV0ZSBvbmUgZnVsbFxuJiM0MztcdFx0ICogcGFzcyAodGhlIGJhcnJpZXImIzM5O3MgY29udHJhY3QpLCBzbyBhIHJ1biBwZXJmb3JtcyBhXG4mIzQzO1x0XHQgKiBkZXRlcm1pbmlzdGljIG51bWJlciBvZiBwYXNzZXMg4oCUIHdoYXQgdGhlIHN0YWdlIEEvQlxuJiM0MztcdFx0ICogdHJhY2UgY29tcGFyaXNvbnMgcmVseSBvbi5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7XG4mIzQzO1x0XHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQucGFnZXNfdG9fc2NhbiA9IDFVTCBcdTAwM2NcdTAwM2MgMjQ7XG4mIzQzO1xuJiM0MztcdFx0cGFnZW1hcF9mZCA9IG9wZW4oXCYjMzQ7L3Byb2Mvc2VsZi9wYWdlbWFwXCYjMzQ7LCBPX1JET05MWSk7XG4mIzQzO1x0XHRpZiAocGFnZW1hcF9mZCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O29wZW4oXFxcJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXBcXFwmIzM0OylcJiMzNDspO1xuJiM0MztcdFx0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXCYjMzQ7L3Byb2Mva3BhZ2VmbGFnc1wmIzM0OywgT19SRE9OTFkpO1xuJiM0MztcdFx0aWYgKGtwYWdlZmxhZ3NfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O29wZW4oXFxcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXFxcJiMzNDspIHJlcXVpcmVzIHJvb3RcXG5cJiMzNDspO1xuJiM0MztcdH1cbiBcbiBcdHNhdmVfc2V0dGluZ3MoKTtcbiBcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNmRlZmF1bHRfc2V0dGluZ3MpO1xuIFxuJiM0MztcdGlmIChhbm9uX3RhcmdldF9vcmRlcikge1xuJiM0MztcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdywga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX3BhcnRpYWxfd2luZG93LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMsIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcbiYjNDM7XHRcdGtzZnRfc2V0X3BsYW4obnJfdGVzdF9jYXNlcyk7XG4mIzQzO1x0XHRnb3RvIHJ1bjtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG5AQCAtMTMyNCw2ICYjNDM7MTc0MCw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcbiBcbiYjNDM7XHRURVNUKGNvbGxhcHNlX2ZvcmtfY293X3JhY2UsIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdFRFU1QoY29sbGFwc2VfZm9ya19jb3dfcmFjZSwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG5AQCAtMTMzNiw2ICYjNDM7MTc1NSw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGtzZnRfc2V0X3BsYW4obnJfdGVzdF9jYXNlcyAmIzQzOyAxKTtcbiBcbiBcdGFsbG9jX2F0X2ZhdWx0KCk7XG4mIzQzO3J1bjpcbiBcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBucl90ZXN0X2Nhc2VzOyBpJiM0MzsmIzQzOykge1xuIFx0XHRzdHJ1Y3QgdGVzdF9jYXNlICp0ID0gXHUwMDI2dGVzdF9jYXNlc1tpXTtcbiBcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMmFhNDVjOWU4YTc3ZlxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmNcbkBAIC0wLDAgJiM0MzsxLDQ4MyBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKlxuJiM0MzsgKiBraHVnZXBhZ2VkIHJhY2UgaGFybmVzcy5cbiYjNDM7ICpcbiYjNDM7ICogUnVucyBjb2xsYXBzZSBhZ2FpbnN0IGNvbmN1cnJlbnQgZmF1bHRzLCB0cmFuc2llbnQgR1VQIHBpbnNcbiYjNDM7ICogKGd1cF90ZXN0KSwgZm9yaywgbXJlbWFwIGFuZCBNQURWX0RPTlRORUVEIG92ZXIgdGhlIHNhbWUgcmFuZ2VzLCBpblxuJiM0MzsgKiBvbmUgb2YgdGhyZWUgZHJpdmVyIG1vZGVzOlxuJiM0MzsgKlxuJiM0MzsgKiAgIHN0ZXBwZWRcdGtodWdlcGFnZWQsIGRyaXZlbiBzeW5jaHJvbm91c2x5IG9uZSBmdWxsIHBhc3MgYXQgYSB0aW1lXG4mIzQzOyAqXHRcdHRocm91Z2gga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSDigJQgdGhlIHByaW1hcnkgZHJpdmVyOiB0aGVcbiYjNDM7ICpcdFx0ZnVsbCBzY2FuJiM0Mztjb2xsYXBzZSBwYXRoIHdpdGggYSBkZXRlcm1pbmlzdGljIGV4dGVudCBwZXJcbiYjNDM7ICpcdFx0c3RlcDtcbiYjNDM7ICogICBmcmVlXHRmcmVlLXJ1bm5pbmcga2h1Z2VwYWdlZCAoc2Nhbl9zbGVlcF9taWxsaXNlY3M9MCkg4oCUIHRoZVxuJiM0MzsgKlx0XHRzb2FrO1xuJiM0MzsgKiAgIG1hZHZpc2VcdE1BRFZfQ09MTEFQU0UgaW4gYSBsb29wIOKAlCB0aGUgbGVnYWN5LVBNRCByZWdyZXNzaW9uXG4mIzQzOyAqXHRcdGF4aXMuXG4mIzQzOyAqXG4mIzQzOyAqIEFsbCBhbm9uIFRIUCBvcmRlcnMgYXJlIGVuYWJsZWQgKGluaGVyaXQpLiBtYXhfcHRlc19ub25lIGlzIDAgYnlcbiYjNDM7ICogZGVmYXVsdCDigJQgcmFjaW5nIE1BRFZfRE9OVE5FRUQgdGhlbiBzdGVlcnMgc2VsZWN0aW9uIGFjcm9zcyBvcmRlcnMg4oCUXG4mIzQzOyAqIG9yIHRoZSBwZXJtaXNzaXZlIGxpbWl0IHdpdGggLXosIHdoaWNoIGZsb29kcyB0aGUgYmF0Y2ggZW5naW5lIHdpdGhcbiYjNDM7ICogaG9sZSBhbmQgemVyb3BhZ2Ugc2xvdHMgc28gdGhlIHBvcHVsYXRpb24gcGF0aHMgKHBhcmstdGltZSB6ZXJvcGFnZVxuJiM0MzsgKiBjbGVhciwgemVyby1maWxsZWQgY29weSwgaW5zdGFsbC10aW1lIHB0ZV9ub25lKCkgdmVyaWZ5IGFuZCBhYm9ydClcbiYjNDM7ICogcmFjZSB0aGUgZmF1bHRlcnMgZGlyZWN0bHkuXG4mIzQzOyAqXG4mIzQzOyAqIC1wIGFkZHMgbWVtb3J5IHByZXNzdXJlIHRvIGFueSBvZiB0aGUgYWJvdmU6IE1BRFZfUEFHRU9VVCBjeWNsaW5nXG4mIzQzOyAqIG9uIGEgZGVkaWNhdGVkIG5laWdoYm9yIHJlZ2lvbiAoc3dhcCB0cmFmZmljIGFuZCBMUlUgY2h1cm47IHNraXBwZWRcbiYjNDM7ICogd2l0aCBhIG5vdGUgd2hlbiB0aGUgaG9zdCBoYXMgbm8gc3dhcCkgYW5kIGEgY29tcGFjdF9tZW1vcnkgdHJpZ2dlclxuJiM0MzsgKiBsb29wIChjb21wYWN0aW9uIG1pZ3JhdGVzIHNvdXJjZSBmb2xpb3MsIHJhY2luZyBjb2xsYXBzZSYjMzk7cyBmcmVlemVcbiYjNDM7ICogd2l0aCByZWZjb3VudCBlbGV2YXRpb24gYW5kIG1pZ3JhdGlvbiBlbnRyaWVzIG9mIGl0cyBvd24pLlxuJiM0MzsgKlxuJiM0MzsgKiBDb3JyZWN0bmVzcyBzaWduYWxzOiBldmVyeSByYWNpbmcgcGFnZSBtdXN0IHJlYWQgYXMgaXRzIHBhdHRlcm4gb3JcbiYjNDM7ICogemVybyAoTUFEVl9ET05UTkVFRCksIG5ldmVyIGFueXRoaW5nIGVsc2Ug4oCUIGNoZWNrZWQgY29udGludW91c2x5IGJ5XG4mIzQzOyAqIHRoZSBmYXVsdGVycyBhbmQgdGhlIGZvcmsgY2hpbGRyZW4gYW5kIG9uY2UgYXQgdGhlIGVuZCDigJQgcGx1c1xuJiM0MzsgKiB3aGF0ZXZlciBERUJVR19WTSAvIHBhZ2VfdGFibGVfY2hlY2sgLyBLQVNBTiAvIGxvY2tkZXAgcmVwb3J0IGluXG4mIzQzOyAqIGRtZXNnLCB3aGljaCB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGluc3BlY3QuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2Vycm5vLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NwdGhyZWFkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy90aW1lLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7a3NlbGZ0ZXN0LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7dm1fdXRpbC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2h1Z2VwYWdlX3NldHRpbmdzLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Li4vLi4vLi4vLi4vbW0vZ3VwX3Rlc3QuaFwmIzM0O1xuJiM0MztcbiYjNDM7I2RlZmluZSBCQVNFX0FERFJcdCgodm9pZCAqKSgxVUwgXHUwMDNjXHUwMDNjIDMwKSlcbiYjNDM7LypcbiYjNDM7ICogU2hhcmVkIHBsYXlncm91bmQgZm9yIGZhdWx0cy9waW5zL2ZvcmsvZG9udG5lZWQ6IHNldmVyYWwgUE1ELXNpemVkXG4mIzQzOyAqIGFyZWFzIHRoZSByYWNpbmcgdGhyZWFkcyBzcHJlYWQgYWNyb3NzLCBwbHVzIG9uZSBhcmVhIG93bmVkIGJ5IHRoZVxuJiM0MzsgKiBtcmVtYXAgdGhyZWFkLiBNb3JlIGFyZWFzIG1lYW5zIG1vcmUgaW5kZXBlbmRlbnQgcmVnaW9ucyBjb2xsYXBzaW5nXG4mIzQzOyAqIGF0IG9uY2U7IHRoZSBkZWZhdWx0IHN1aXRzIGEgbm9ybWFsIG1hY2hpbmUuIE9uIGEgbWVtb3J5LWNvbnN0cmFpbmVkXG4mIzQzOyAqIGhvc3QgLS0gb3IgdW5kZXIgZW11bGF0aW9uLCB3aGVyZSBhIDUxMk0gUE1EIChhcm02NC82NEspIG1ha2VzIHRoZVxuJiM0MzsgKiBkZWZhdWx0IHBsYXlncm91bmQgbXVsdGktZ2lnYWJ5dGUgLS0gcGFzcyAtYSB0byBzaHJpbmsgaXQuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIERFRkFVTFRfU0hBUkVEX0FSRUFTXHQzXG4mIzQzO3N0YXRpYyBpbnQgbnJfc2hhcmVkX2FyZWFzO1xuJiM0MztzdGF0aWMgaW50IG5yX2FyZWFzO1xuJiM0MztcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTtcbiYjNDM7c3RhdGljIGNoYXIgKnJlZ2lvbjtcdFx0LyogTlJfQVJFQVMgKiBocGFnZV9wbWRfc2l6ZSAqL1xuJiM0MztzdGF0aWMgY2hhciAqbXJlbWFwX2FyZWE7XHQvKiByZWdpb24gJiM0MzsgTlJfU0hBUkVEX0FSRUFTIGFyZWFzICovXG4mIzQzO3N0YXRpYyBjaGFyICptcmVtYXBfc2NyYXRjaDtcdC8qIHdlbGwgYWJvdmUgdGhlIHJlZ2lvbiAqL1xuJiM0MztzdGF0aWMgY2hhciAqcGFnZW91dF9hcmVhO1x0LyogLXA6IGRlZGljYXRlZCBwcmVzc3VyZSByZWdpb24gKi9cbiYjNDM7c3RhdGljIHNpemVfdCBwYWdlb3V0X3NpemU7XG4mIzQzO3N0YXRpYyBpbnQgZ3VwX2ZkID0gLTE7XG4mIzQzO3N0YXRpYyB2b2xhdGlsZSBpbnQgc3RvcDtcbiYjNDM7c3RhdGljIHZvbGF0aWxlIGludCBjb3JydXB0ZWQ7XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgaW50IHBhdHRlcm4odW5zaWduZWQgbG9uZyBwYWdlX2lkeClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCB2YWwgPSAodW5zaWduZWQgaW50KXBhZ2VfaWR4ICogMjY1NDQzNTc2MVU7XG4mIzQzO1xuJiM0MztcdHJldHVybiB2YWwgPyB2YWwgOiAxO1x0LyogbmV2ZXIgY29sbGlkZXMgd2l0aCB0aGUgemVyby1maWxsICovXG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNoZWNrX3BhZ2UodW5zaWduZWQgbG9uZyBwYWdlX2lkeClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCB2YWwgPSAqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUpO1xuJiM0MztcbiYjNDM7XHRpZiAodmFsIFx1MDAyNlx1MDAyNiB2YWwgIT0gcGF0dGVybihwYWdlX2lkeCkpIHtcbiYjNDM7XHRcdGNvcnJ1cHRlZCA9IDE7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtDb3JydXB0aW9uIGF0IHBhZ2UgJWx1OiAlI3ggIT0gJSN4XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgICAgcGFnZV9pZHgsIHZhbCwgcGF0dGVybihwYWdlX2lkeCkpO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZF9wYWdlKHVuc2lnbmVkIGludCAqc2VlZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiAodW5zaWduZWQgbG9uZylyYW5kX3Ioc2VlZCkgJVxuJiM0MztcdCAgICAgICAobnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCAqZmF1bHRlcl9mbih2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKCFzdG9wKSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFx1MDAyNnNlZWQpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChyYW5kX3IoXHUwMDI2c2VlZCkgXHUwMDI2IDEpXG4mIzQzO1x0XHRcdCoodW5zaWduZWQgaW50ICopKHJlZ2lvbiAmIzQzOyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSkgPVxuJiM0MztcdFx0XHRcdHBhdHRlcm4ocGFnZV9pZHgpO1xuJiM0MztcdFx0ZWxzZVxuJiM0MztcdFx0XHRjaGVja19wYWdlKHBhZ2VfaWR4KTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkICpkb250bmVlZF9mbih2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKCFzdG9wKSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFx1MDAyNnNlZWQpO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBuciA9IDFVTCBcdTAwM2NcdTAwM2MgKHJhbmRfcihcdTAwMjZzZWVkKSAlIDYpO1x0LyogMS4uMzIgcGFnZXMgKi9cbiYjNDM7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogT25jZSBpbiBhIHdoaWxlIHphcCBhIHdob2xlIFBNRC1hbGlnbmVkIGFyZWE6IG9ubHkgYVxuJiM0MztcdFx0ICogemFwIHNwYW5uaW5nIHRoZSBmdWxsIHRhYmxlIHRyaWdnZXJzIHRoZSBlbXB0eS10YWJsZVxuJiM0MztcdFx0ICogcmVjbGFpbSAoQ09ORklHX1BUX1JFQ0xBSU0pLCB3aGljaCBjYW4gZnJlZSBhIHRhYmxlXG4mIzQzO1x0XHQgKiBvdXQgZnJvbSB1bmRlciBhIHBhcmtlZCBjb2xsYXBzZSDigJQgc3ViLXRhYmxlIHphcHNcbiYjNDM7XHRcdCAqIG5ldmVyIHJlYWNoIHRoYXQgcGF0aC5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0aWYgKCEocmFuZF9yKFx1MDAyNnNlZWQpICUgNjQpKSB7XG4mIzQzO1x0XHRcdHVuc2lnbmVkIGxvbmcgYXJlYSA9IHBhZ2VfaWR4IC9cbiYjNDM7XHRcdFx0XHRcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSk7XG4mIzQzO1xuJiM0MztcdFx0XHRtYWR2aXNlKHJlZ2lvbiAmIzQzOyBhcmVhICogaHBhZ2VfcG1kX3NpemUsXG4mIzQzO1x0XHRcdFx0aHBhZ2VfcG1kX3NpemUsIE1BRFZfRE9OVE5FRUQpO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0bWFkdmlzZShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUsXG4mIzQzO1x0XHRcdFx0bnIgKiBwYWdlX3NpemUsIE1BRFZfRE9OVE5FRUQpO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDUwMCk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCAqcGlubmVyX2ZuKHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoIXN0b3ApIHtcbiYjNDM7XHRcdHN0cnVjdCBndXBfdGVzdCBndXAgPSB7fTtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXHUwMDI2c2VlZCk7XG4mIzQzO1xuJiM0MztcdFx0Z3VwLmFkZHIgPSAodW5zaWduZWQgbG9uZykocmVnaW9uICYjNDM7IHBhZ2VfaWR4ICogcGFnZV9zaXplKTtcbiYjNDM7XHRcdGd1cC5zaXplID0gMTYgKiBwYWdlX3NpemU7XG4mIzQzO1x0XHRndXAubnJfcGFnZXNfcGVyX2NhbGwgPSAxNjtcbiYjNDM7XHRcdGd1cC5ndXBfZmxhZ3MgPSAxO1x0LyogRk9MTF9XUklURSAqL1xuJiM0MztcdFx0LyogUmFjaW5nIE1BRFZfRE9OVE5FRUQgbWFrZXMgdHJhbnNpZW50IGZhaWx1cmVzIGV4cGVjdGVkLiAqL1xuJiM0MztcdFx0aW9jdGwoZ3VwX2ZkLCBQSU5fRkFTVF9CRU5DSE1BUkssIFx1MDAyNmd1cCk7XG4mIzQzO1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkICpmb3JrZXJfZm4odm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4mIzQzO1xuJiM0MztcdHdoaWxlICghc3RvcCkge1xuJiM0MztcdFx0cGlkX3QgcGlkID0gZm9yaygpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChwaWQgPT0gMCkge1xuJiM0MztcdFx0XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgMTY7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRcdGNoZWNrX3BhZ2UocmFuZF9wYWdlKFx1MDAyNnNlZWQpKTtcbiYjNDM7XHRcdFx0X2V4aXQoY29ycnVwdGVkKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChwaWQgXHUwMDNlIDApIHtcbiYjNDM7XHRcdFx0aW50IHdzdGF0dXM7XG4mIzQzO1xuJiM0MztcdFx0XHR3YWl0cGlkKHBpZCwgXHUwMDI2d3N0YXR1cywgMCk7XG4mIzQzO1x0XHRcdGlmIChXSUZFWElURUQod3N0YXR1cykgXHUwMDI2XHUwMDI2IFdFWElUU1RBVFVTKHdzdGF0dXMpKVxuJiM0MztcdFx0XHRcdGNvcnJ1cHRlZCA9IDE7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwMCk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCAqbXJlbWFwcGVyX2ZuKHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoIXN0b3ApIHtcbiYjNDM7XHRcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdFx0cCA9IG1yZW1hcChtcmVtYXBfYXJlYSwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxuJiM0MztcdFx0XHQgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX3NjcmF0Y2gpO1xuJiM0MztcdFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcbiYjNDM7XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21yZW1hcCgpIGF3YXlcJiMzNDspO1xuJiM0MztcdFx0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIDg7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRtcmVtYXBfc2NyYXRjaFsocmFuZF9yKFx1MDAyNnNlZWQpICVcbiYjNDM7XHRcdFx0XHQoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpKSAqIHBhZ2Vfc2l6ZV0gPSAxO1xuJiM0MztcdFx0cCA9IG1yZW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxuJiM0MztcdFx0XHQgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX2FyZWEpO1xuJiM0MztcdFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcbiYjNDM7XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21yZW1hcCgpIGJhY2tcJiMzNDspO1xuJiM0MztcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDIwMDApO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogLXA6IHN3YXAgdHJhZmZpYyBhbmQgTFJVIGNodXJuIG9uIGEgcmVnaW9uIG9mIG91ciBvd24uIFRoZSBjb250ZW50XG4mIzQzOyAqIGNoZWNrIGlzIGV4YWN0IOKAlCBhIHBhZ2Ugb3V0IGFuZCBiYWNrIHRocm91Z2ggc3dhcCBtdXN0IHByZXNlcnZlIHRoZVxuJiM0MzsgKiBwYXR0ZXJuLCBhbmQgbm90aGluZyBlbHNlIGV2ZXIgd3JpdGVzIGhlcmUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCAqcGFnZW91dF9mbih2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG5yID0gcGFnZW91dF9zaXplIC8gcGFnZV9zaXplO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnI7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0Kih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICYjNDM7IGkgKiBwYWdlX3NpemUpID0gcGF0dGVybihpKTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKCFzdG9wKSB7XG4mIzQzO1x0XHRtYWR2aXNlKHBhZ2VvdXRfYXJlYSwgcGFnZW91dF9zaXplLCBNQURWX1BBR0VPVVQpO1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnIgXHUwMDI2XHUwMDI2ICFzdG9wOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHR1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICYjNDM7XG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgICBpICogcGFnZV9zaXplKTtcbiYjNDM7XG4mIzQzO1x0XHRcdGlmICh2YWwgIT0gcGF0dGVybihpKSkge1xuJiM0MztcdFx0XHRcdGNvcnJ1cHRlZCA9IDE7XG4mIzQzO1x0XHRcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7UGFnZW91dCBjb3JydXB0aW9uIGF0IHBhZ2UgJWx1OiAlI3ggIT0gJSN4XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIC1wOiBjb21wYWN0aW9uIG1pZ3JhdGVzIHRoZSBjb2xsYXBzZSBzb3VyY2VzIG91dCBmcm9tIHVuZGVyIHVzLiAqL1xuJiM0MztzdGF0aWMgdm9pZCAqY29tcGFjdG9yX2ZuKHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuJiM0MztcdGludCBmZCA9IG9wZW4oXCYjMzQ7L3Byb2Mvc3lzL3ZtL2NvbXBhY3RfbWVtb3J5XCYjMzQ7LCBPX1dST05MWSk7XG4mIzQzO1xuJiM0MztcdGlmIChmZCBcdTAwM2MgMCkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7Tm8gY29tcGFjdF9tZW1vcnk7IGNvbXBhY3RvciBpZGxlXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdH1cbiYjNDM7XHR3aGlsZSAoIXN0b3ApIHtcbiYjNDM7XHRcdGlmICh3cml0ZShmZCwgXCYjMzQ7MVwmIzM0OywgMSkgXHUwMDNjIDApXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0dXNsZWVwKDEwMDAwICYjNDM7IHJhbmRfcihcdTAwMjZzZWVkKSAlIDEwMDAwMCk7XG4mIzQzO1x0fVxuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgc3dhcF9hdmFpbGFibGUodm9pZClcbiYjNDM7e1xuJiM0MztcdGNoYXIgbGluZVsyNTZdO1xuJiM0MztcdGludCBsaW5lcyA9IDA7XG4mIzQzO1x0RklMRSAqZnAgPSBmb3BlbihcJiMzNDsvcHJvYy9zd2Fwc1wmIzM0OywgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKVxuJiM0MztcdFx0bGluZXMmIzQzOyYjNDM7O1xuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO1x0cmV0dXJuIGxpbmVzIFx1MDAzZSAxO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBub3dfbXModm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aW1ldmFsIHR2O1xuJiM0MztcbiYjNDM7XHRnZXR0aW1lb2ZkYXkoXHUwMDI2dHYsIE5VTEwpO1xuJiM0MztcdHJldHVybiB0di50dl9zZWMgKiAxMDAwVUwgJiM0MzsgdHYudHZfdXNlYyAvIDEwMDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRmcHJpbnRmKHN0ZGVycixcbiYjNDM7XHRcdFwmIzM0O1VzYWdlOiBraHVnZXBhZ2VkX3JhY2UgWy1kIHNlY29uZHNdIFstbSBzdGVwcGVkfGZyZWV8bWFkdmlzZV0gWy16XSBbLXBdIFstYSBhcmVhc11cXG5cJiMzNDtcbiYjNDM7XHRcdFwmIzM0O1xcdC16OiBwZXJtaXNzaXZlIG1heF9wdGVzX25vbmUgKGhvbGUtaGVhdnkgd2luZG93cylcXG5cJiMzNDtcbiYjNDM7XHRcdFwmIzM0O1xcdC1wOiBtZW1vcnkgcHJlc3N1cmUgKHBhZ2VvdXQgJiM0MzsgY29tcGFjdGlvbikgdGhyZWFkc1xcblwmIzM0O1xuJiM0MztcdFx0XCYjMzQ7XFx0LWE6IG51bWJlciBvZiBzaGFyZWQgUE1ELXNpemVkIHBsYXlncm91bmQgYXJlYXMgKGRlZmF1bHQgMylcXG5cJiMzNDspO1xuJiM0MztcdGV4aXQoMSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiYjNDM7e1xuJiM0MztcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGhyZWFkX25hbWVzW10gPSB7XG4mIzQzO1x0XHRcJiMzNDtmYXVsdGVyXCYjMzQ7LCBcJiMzNDtmYXVsdGVyMlwmIzM0OywgXCYjMzQ7ZG9udG5lZWRcJiMzNDssIFwmIzM0O3Bpbm5lclwmIzM0OywgXCYjMzQ7Zm9ya2VyXCYjMzQ7LFxuJiM0MztcdFx0XCYjMzQ7bXJlbWFwcGVyXCYjMzQ7LCBcJiMzNDtwYWdlb3V0XCYjMzQ7LCBcJiMzNDtjb21wYWN0b3JcJiMzNDssXG4mIzQzO1x0fTtcbiYjNDM7XHR2b2lkICooKmNvbnN0IHRocmVhZF9mbnNbXSkodm9pZCAqKSA9IHtcbiYjNDM7XHRcdGZhdWx0ZXJfZm4sIGZhdWx0ZXJfZm4sIGRvbnRuZWVkX2ZuLCBwaW5uZXJfZm4sIGZvcmtlcl9mbixcbiYjNDM7XHRcdG1yZW1hcHBlcl9mbiwgcGFnZW91dF9mbiwgY29tcGFjdG9yX2ZuLFxuJiM0MztcdH07XG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBwYWdlb3V0X2JpdCA9IDFVTCBcdTAwM2NcdTAwM2MgNiwgY29tcGFjdG9yX2JpdCA9IDFVTCBcdTAwM2NcdTAwM2MgNztcbiYjNDM7XHRjb25zdCBpbnQgbnJfdGhyZWFkcyA9IEFSUkFZX1NJWkUodGhyZWFkX25hbWVzKTtcbiYjNDM7XHRwdGhyZWFkX3QgdGhyZWFkc1tBUlJBWV9TSVpFKHRocmVhZF9uYW1lcyldO1xuJiM0MztcdGNvbnN0IGNoYXIgKm1vZGUgPSBcJiMzNDtzdGVwcGVkXCYjMzQ7O1xuJiM0MztcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBlbmRfbXM7XG4mIzQzO1x0aW50IGR1cmF0aW9uX3MgPSAxMDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHRocmVhZF9tYXNrID0gfjBVTDtcbiYjNDM7XHRpbnQgbnJfYXJlYXNfYXJnID0gMDtcbiYjNDM7XHRib29sIHBlcm1pc3NpdmVfbm9uZSA9IGZhbHNlO1xuJiM0MztcdGJvb2wgcHJlc3N1cmUgPSBmYWxzZTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGk7XG4mIzQzO1x0aW50IHN0ZXBzID0gMDtcbiYjNDM7XHRpbnQgb3B0O1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCBcJiMzNDthOmQ6bTp0OnpwaFwmIzM0OykpICE9IC0xKSB7XG4mIzQzO1x0XHRzd2l0Y2ggKG9wdCkge1xuJiM0MztcdFx0Y2FzZSAmIzM5O2EmIzM5OzpcbiYjNDM7XHRcdFx0bnJfYXJlYXNfYXJnID0gYXRvaShvcHRhcmcpO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTtkJiMzOTs6XG4mIzQzO1x0XHRcdGR1cmF0aW9uX3MgPSBhdG9pKG9wdGFyZyk7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0Y2FzZSAmIzM5O20mIzM5OzpcbiYjNDM7XHRcdFx0bW9kZSA9IG9wdGFyZztcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlICYjMzk7dCYjMzk7OlxuJiM0MztcdFx0XHQvKiBkZWJ1ZzogYml0bWFzayBvZiByYWNpbmcgdGhyZWFkcyB0byBzdGFydCAqL1xuJiM0MztcdFx0XHR0aHJlYWRfbWFzayA9IHN0cnRvdWwob3B0YXJnLCBOVUxMLCAwKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlICYjMzk7eiYjMzk7OlxuJiM0MztcdFx0XHRwZXJtaXNzaXZlX25vbmUgPSB0cnVlO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTtwJiMzOTs6XG4mIzQzO1x0XHRcdHByZXNzdXJlID0gdHJ1ZTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRkZWZhdWx0OlxuJiM0MztcdFx0XHR1c2FnZSgpO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRpZiAoc3RyY21wKG1vZGUsIFwmIzM0O3N0ZXBwZWRcJiMzNDspIFx1MDAyNlx1MDAyNiBzdHJjbXAobW9kZSwgXCYjMzQ7ZnJlZVwmIzM0OykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIHN0cmNtcChtb2RlLCBcJiMzNDttYWR2aXNlXCYjMzQ7KSlcbiYjNDM7XHRcdHVzYWdlKCk7XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4mIzQzO1x0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7XG4mIzQzO1x0aHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpO1xuJiM0MztcdGlmICghaHBhZ2VfcG1kX3NpemUpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7UmVhZGluZyBQTUQgcGFnZXNpemUgZmFpbGVkXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0Z3VwX2ZkID0gb3BlbihcJiMzNDsvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdFwmIzM0OywgT19SRFdSKTtcbiYjNDM7XHRpZiAoZ3VwX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7L3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgcmVxdWlyZXMgQ09ORklHX0dVUF9URVNUIGFuZCByb290XFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0bnJfc2hhcmVkX2FyZWFzID0gbnJfYXJlYXNfYXJnIFx1MDAzZSAwID8gbnJfYXJlYXNfYXJnIDogREVGQVVMVF9TSEFSRURfQVJFQVM7XG4mIzQzO1x0bnJfYXJlYXMgPSBucl9zaGFyZWRfYXJlYXMgJiM0MzsgMTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFwcmVzc3VyZSkge1xuJiM0MztcdFx0dGhyZWFkX21hc2sgXHUwMDI2PSB+KHBhZ2VvdXRfYml0IHwgY29tcGFjdG9yX2JpdCk7XG4mIzQzO1x0fSBlbHNlIGlmICghc3dhcF9hdmFpbGFibGUoKSkge1xuJiM0MztcdFx0LyogTm8gc3dhcCwgbm8gYW5vbiByZWNsYWltOiBjb21wYWN0aW9uLW9ubHkgcHJlc3N1cmUuICovXG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDstcCB3aXRob3V0IHN3YXA6IHBhZ2VvdXQgdGhyZWFkIGRpc2FibGVkXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHRocmVhZF9tYXNrIFx1MDAyNj0gfnBhZ2VvdXRfYml0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0a3NmdF9zZXRfcGxhbigxKTtcbiYjNDM7XG4mIzQzO1x0dGhwX3NhdmVfc2V0dGluZ3MoKTtcbiYjNDM7XHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1x0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTUFEVklTRTtcbiYjNDM7XHRzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7XG4mIzQzO1x0c2V0dGluZ3Muc2htZW1fZW5hYmxlZCA9IFNITUVNX05FVkVSO1xuJiM0MztcdHNldHRpbmdzLmtodWdlcGFnZWQuZGVmcmFnID0gMTtcbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID1cbiYjNDM7XHRcdHN0cmNtcChtb2RlLCBcJiMzNDtmcmVlXCYjMzQ7KSA/IDEwMDAgOiAwO1xuJiM0MztcdHNldHRpbmdzLmtodWdlcGFnZWQuYWxsb2Nfc2xlZXBfbWlsbGlzZWNzID0gMTA7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBtVEhQIGNvbGxhcHNlIG9ubHkgc3VwcG9ydHMgdGhlIHR3byBlbmRzIG9mIHRoZSBvY2N1cGFuY3lcbiYjNDM7XHQgKiBzY2FsZTogMCBvciBIUEFHRV9QTURfTlIgLSAxIChhbnl0aGluZyBlbHNlIGNvZXJjZXMgdG8gMCkuXG4mIzQzO1x0ICogU3RyaWN0IGlzIHRoZSBkZWZhdWx0IOKAlCBpdCBhbHNvIGtlZXBzIGtodWdlcGFnZWQgZnJvbSBidXJuaW5nXG4mIzQzO1x0ICogdGhlIHdob2xlIHN0ZXAgaW4gZG9vbWVkIFBNRC1zaXplZCBhbGxvY2F0aW9ucyBvbiA1MTJNLVBNRFxuJiM0MztcdCAqIGNvbmZpZ3MsIHdoZXJlIGEgZnVsbHkgcG9wdWxhdGVkIGFyZWEgaXMgcmFyZSB1bmRlciByYWNpbmdcbiYjNDM7XHQgKiBNQURWX0RPTlRORUVELiAteiBzZWxlY3RzIHRoZSBwZXJtaXNzaXZlIGVuZDogc2VsZWN0aW9uIHRoZW5cbiYjNDM7XHQgKiBlbWl0cyBob2xlLWhlYXZ5IHdpbmRvd3MgYW5kIHRoZSBlbmdpbmUmIzM5O3MgcG9wdWxhdGlvbiBwYXRoc1xuJiM0MztcdCAqIHRha2UgdGhlIGJydW50IG9mIHRoZSByYWNpbmcgZmF1bHRzIGFuZCB6YXBzLlxuJiM0MztcdCAqL1xuJiM0MztcdHNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IHBlcm1pc3NpdmVfbm9uZSA/XG4mIzQzO1x0XHQoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpIC0gMSA6IDA7XG4mIzQzO1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID1cbiYjNDM7XHRcdG5yX2FyZWFzICogKGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSAqIDg7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGkpKVxuJiM0MztcdFx0XHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xuJiM0MztcdH1cbiYjNDM7XHQvKiBCYXNlIG9mIHRoZSBzZXR0aW5ncyBzdGFjazsgdGhlIGJvdHRvbSBlbnRyeSBpcyBuZXZlciBwb3BwZWQuICovXG4mIzQzO1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcbiYjNDM7XHRyZWdpb24gPSBtbWFwKEJBU0VfQUREUiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcbiYjNDM7XHRcdCAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSxcbiYjNDM7XHRcdCAgICAgIC0xLCAwKTtcbiYjNDM7XHRpZiAocmVnaW9uICE9IEJBU0VfQUREUilcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtGYWlsZWQgdG8gYWxsb2NhdGUgVk1BIGF0ICVwXFxuXCYjMzQ7LCBCQVNFX0FERFIpO1xuJiM0MztcdG1yZW1hcF9hcmVhID0gcmVnaW9uICYjNDM7IG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplO1xuJiM0MztcdG1yZW1hcF9zY3JhdGNoID0gKGNoYXIgKilCQVNFX0FERFIgJiM0MzsgMiAqIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemU7XG4mIzQzO1xuJiM0MztcdGlmICh0aHJlYWRfbWFzayBcdTAwMjYgcGFnZW91dF9iaXQpIHtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBCaWcgZW5vdWdoIHRvIGN5Y2xlIHJlYWwgcmVjbGFpbSwgc21hbGwgZW5vdWdoIG5vdCB0b1xuJiM0MztcdFx0ICogZG9taW5hdGUgYSBUQ0cgZ3Vlc3Q6IDQgUE1EIGFyZWFzLCBjbGFtcGVkIHRvIFsxNk0sIDY0TV0uXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdHBhZ2VvdXRfc2l6ZSA9IDQgKiBocGFnZV9wbWRfc2l6ZTtcbiYjNDM7XHRcdHBhZ2VvdXRfc2l6ZSA9IHBhZ2VvdXRfc2l6ZSBcdTAwM2MgKDE2VUwgXHUwMDNjXHUwMDNjIDIwKSA/ICgxNlVMIFx1MDAzY1x1MDAzYyAyMCkgOlxuJiM0MztcdFx0XHQgICAgICAgcGFnZW91dF9zaXplIFx1MDAzZSAoNjRVTCBcdTAwM2NcdTAwM2MgMjApID8gKDY0VUwgXHUwMDNjXHUwMDNjIDIwKSA6XG4mIzQzO1x0XHRcdCAgICAgICBwYWdlb3V0X3NpemU7XG4mIzQzO1x0XHRwYWdlb3V0X2FyZWEgPSBtbWFwKE5VTEwsIHBhZ2VvdXRfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbiYjNDM7XHRcdFx0XHQgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XG4mIzQzO1x0XHRpZiAocGFnZW91dF9hcmVhID09IE1BUF9GQUlMRUQpXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttbWFwKCkgcGFnZW91dCBhcmVhXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFBvcHVsYXRlIHNvIHRoZSBmaXJzdCBwYXNzIGhhcyBzb21ldGhpbmcgdG8gY29sbGFwc2UuICovXG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0Kih1bnNpZ25lZCBpbnQgKikocmVnaW9uICYjNDM7IGkgKiBwYWdlX3NpemUpID0gcGF0dGVybihpKTtcbiYjNDM7XHRtZW1zZXQobXJlbWFwX2FyZWEsIDEsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRtYWR2aXNlKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3RocmVhZHM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAoISh0aHJlYWRfbWFzayBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgaSkpKSB7XG4mIzQzO1x0XHRcdHRocmVhZHNbaV0gPSAwO1xuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChwdGhyZWFkX2NyZWF0ZShcdTAwMjZ0aHJlYWRzW2ldLCBOVUxMLCB0aHJlYWRfZm5zW2ldLFxuJiM0MztcdFx0XHRcdCAgICh2b2lkICopKGkgJiM0MzsgMSkpKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7cHRocmVhZF9jcmVhdGUoKVwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRlbmRfbXMgPSBub3dfbXMoKSAmIzQzOyBkdXJhdGlvbl9zICogMTAwMFVMO1xuJiM0MztcdGlmICghc3RyY21wKG1vZGUsIFwmIzM0O3N0ZXBwZWRcJiMzNDspKSB7XG4mIzQzO1x0XHR3aGlsZSAobm93X21zKCkgXHUwMDNjIGVuZF9tcyBcdTAwMjZcdTAwMjYgIWNvcnJ1cHRlZCkge1xuJiM0MztcdFx0XHRpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKDYwMCkpXG4mIzQzO1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O2todWdlcGFnZWQgcGFzcyB0aW1lZCBvdXRcXG5cJiMzNDspO1xuJiM0MztcdFx0XHRzdGVwcyYjNDM7JiM0Mzs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fSBlbHNlIGlmICghc3RyY21wKG1vZGUsIFwmIzM0O2ZyZWVcJiMzNDspKSB7XG4mIzQzO1x0XHR3aGlsZSAobm93X21zKCkgXHUwMDNjIGVuZF9tcyBcdTAwMjZcdTAwMjYgIWNvcnJ1cHRlZClcbiYjNDM7XHRcdFx0dXNsZWVwKDEwMCAqIDEwMDApO1xuJiM0MztcdH0gZWxzZSB7XHQvKiBtYWR2aXNlICovXG4mIzQzO1x0XHR3aGlsZSAobm93X21zKCkgXHUwMDNjIGVuZF9tcyBcdTAwMjZcdTAwMjYgIWNvcnJ1cHRlZCkge1xuJiM0MztcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9zaGFyZWRfYXJlYXM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdFx0bWFkdmlzZShyZWdpb24gJiM0MzsgaSAqIGhwYWdlX3BtZF9zaXplLFxuJiM0MztcdFx0XHRcdFx0aHBhZ2VfcG1kX3NpemUsIE1BRFZfQ09MTEFQU0UpO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdG1hZHZpc2UocmVnaW9uLCBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcbiYjNDM7XHRcdFx0XHRNQURWX0RPTlRORUVEKTtcbiYjNDM7XHRcdFx0c3RlcHMmIzQzOyYjNDM7O1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0c3RvcCA9IDE7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfdGhyZWFkczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmICh0aHJlYWRzW2ldKVxuJiM0MztcdFx0XHRwdGhyZWFkX2pvaW4odGhyZWFkc1tpXSwgTlVMTCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBGaW5hbCBpbnRlZ3JpdHkgc3dlZXAuICovXG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0Y2hlY2tfcGFnZShpKTtcbiYjNDM7XG4mIzQzO1x0dGhwX3Jlc3RvcmVfc2V0dGluZ3MoKTtcbiYjNDM7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdCghY29ycnVwdGVkLCBcJiMzNDslczogJWRzLCAlZCBzdGVwcywgbm8gY29ycnVwdGlvblxcblwmIzM0OyxcbiYjNDM7XHRcdFx0IG1vZGUsIGR1cmF0aW9uX3MsIHN0ZXBzKTtcbiYjNDM7XHRrc2Z0X2ZpbmlzaGVkKCk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMTMyMTVjYjM3MGNlYlxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmNcbkBAIC0wLDAgJiM0MzsxLDE5OCBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKlxuJiM0MzsgKiBTeW5jaHJvbm91cyBraHVnZXBhZ2VkIGRyaXZpbmcgY2hlY2suXG4mIzQzOyAqXG4mIzQzOyAqIFJhY2UgdGVzdHMgZHJpdmUga2h1Z2VwYWdlZCB0aHJvdWdoIHRoZSBleGlzdGluZyBzeXNmcyBjb250cm9sczogYVxuJiM0MzsgKiBzdG9yZSB0byBzY2FuX3NsZWVwX21pbGxpc2VjcyB3YWtlcyB0aGUgZGFlbW9uLCBhbmQgZnVsbF9zY2Fuc1xuJiM0MzsgKiBhZHZhbmNpbmcgYnkgdHdvIGlzIGEgY29tcGxldGlvbiBiYXJyaWVyIGZvciBvbmUgZnVsbCBwYXNzIHRoYXRcbiYjNDM7ICogc3RhcnRlZCBhZnRlciBzZXR1cCAoa2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSkuIFZlcmlmeSB0aGUgcGFpciBnaXZlc1xuJiM0MzsgKiBkZXRlcm1pbmlzdGljLCBhdHRyaWJ1dGFibGUgcmVzdWx0czogb25lIGJhcnJpZXIgc3RlcCBvdmVyIG9uZVxuJiM0MzsgKiBwcmVwYXJlZCB3aW5kb3cgcHJvZHVjZXMgZXhhY3RseSBvbmUgY29sbGFwc2UgYXR0ZW1wdCBvbiB0aGF0XG4mIzQzOyAqIHdpbmRvdyYjMzk7cyBzb3VyY2UgcGFnZXMg4oCUIG1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlIGV2ZW50c1xuJiM0MzsgKiBmaWx0ZXJlZCBieSBzb3VyY2UgUEZOIGFuZCBvcmRlciDigJQgYW5kIHRoZSB3aW5kb3cgaXMgY29sbGFwc2VkXG4mIzQzOyAqIGFmdGVyd2FyZHMsIHJlcGVhdGFibHkuXG4mIzQzOyAqXG4mIzQzOyAqIHNjYW5fc2xlZXBfbWlsbGlzZWNzIGlzIHNldCB0byA2MHMgdG8gcHJvdmUgdGhlIHdha2UgcGF0aDogd2l0aG91dFxuJiM0MzsgKiB0aGUgd2FrZSwgb25lIGJhcnJpZXIgc3RlcCB3b3VsZCBzbGVlcCBtdWx0aXBsZXMgb2YgdGhhdCBhbmQgYmxvd1xuJiM0MzsgKiB0aGUgdGltZW91dC4gSXQgYWxzbyBrZWVwcyB0aGUgZGFlbW9uIGZyb20gZnJlZS1ydW5uaW5nIGJldHdlZW5cbiYjNDM7ICogc3RlcHMsIHBlciB0aGUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSBkaXNjaXBsaW5lLlxuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7a3NlbGZ0ZXN0LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7dm1fdXRpbC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2h1Z2VwYWdlX3NldHRpbmdzLmhcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQkFTRV9BRERSICgodm9pZCAqKSgxVUwgXHUwMDNjXHUwMDNjIDMwKSlcbiYjNDM7I2RlZmluZSBUQVJHRVRfT1JERVIgMlx0Lyogc21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCBjb25zaWRlcnMgKi9cbiYjNDM7I2RlZmluZSBOUl9JVEVSQVRJT05TIDVcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcGFnZW1hcF9mZDtcbiYjNDM7c3RhdGljIGludCBrcGFnZWZsYWdzX2ZkO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIENvdW50IGNvbGxhcHNlIGF0dGVtcHRzIGF0dHJpYnV0YWJsZSB0byBvdXIgd2luZG93OiBsZWdhY3ktZW5naW5lXG4mIzQzOyAqIGlzb2xhdGUgZXZlbnRzIHdob3NlIHNjYW5fcGZuIGlzIG9uZSBvZiB0aGUgd2luZG93JiMzOTtzIHNvdXJjZSBQRk5zLFxuJiM0MzsgKiBwbHVzIGJhdGNoLWVuZ2luZSBwZXItY2FuZGlkYXRlIGluc3RhbGwgZXZlbnRzIGF0IHRoZSB3aW5kb3cmIzM5O3NcbiYjNDM7ICogYWRkcmVzcy4gRWl0aGVyIGVuZ2luZSByZXBvcnRzIGV4YWN0bHkgb25jZSBwZXIgYXR0ZW1wdC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgY291bnRfYXR0cmlidXRlZCh1bnNpZ25lZCBsb25nICpwZm5zLCBpbnQgbnJfcGZucyxcbiYjNDM7XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgaW50IG9yZGVyKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBsaW5lWzEwMjRdO1xuJiM0MztcdGludCBjb3VudCA9IDA7XG4mIzQzO1x0RklMRSAqZnA7XG4mIzQzO1xuJiM0MztcdGZwID0gdHJhY2luZ19vcGVuX3RyYWNlKCk7XG4mIzQzO1x0aWYgKCFmcClcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtDYW5ub3Qgb3BlbiB0cmFjZSBidWZmZXJcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpIHtcbiYjNDM7XHRcdGNoYXIgKnM7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHZhbDtcbiYjNDM7XHRcdHVuc2lnbmVkIGludCBvcmQ7XG4mIzQzO1x0XHRjaGFyICpvO1xuJiM0MztcdFx0aW50IGk7XG4mIzQzO1xuJiM0MztcdFx0cyA9IHN0cnN0cihsaW5lLCBcJiMzNDttbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTpcJiMzNDspO1xuJiM0MztcdFx0aWYgKHMpIHtcbiYjNDM7XHRcdFx0aWYgKHNzY2FuZihzLCBcJiMzNDttbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTogc2Nhbl9wZm49MHglbHhcJiMzNDssXG4mIzQzO1x0XHRcdFx0ICAgXHUwMDI2dmFsKSAhPSAxKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHRvID0gc3Ryc3RyKHMsIFwmIzM0O29yZGVyPVwmIzM0Oyk7XG4mIzQzO1x0XHRcdGlmICghbyB8fCBzc2NhbmYobywgXCYjMzQ7b3JkZXI9JXVcJiMzNDssIFx1MDAyNm9yZCkgIT0gMSB8fFxuJiM0MztcdFx0XHQgICAgb3JkICE9IG9yZGVyKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wZm5zOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRcdGlmICh2YWwgPT0gcGZuc1tpXSkge1xuJiM0MztcdFx0XHRcdFx0Y291bnQmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRcdFx0fVxuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdHMgPSBzdHJzdHIobGluZSwgXCYjMzQ7bW1fY29sbGFwc2VfY2FuZGlkYXRlOlwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAocykge1xuJiM0MztcdFx0XHRpZiAoIXN0cnN0cihzLCBcJiMzNDtwYXNzPWluc3RhbGxcJiMzNDspIHx8XG4mIzQzO1x0XHRcdCAgICAhc3Ryc3RyKHMsIFwmIzM0O3Jlc3VsdD1zdWNjZWVkZWRcJiMzNDspKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHRvID0gc3Ryc3RyKHMsIFwmIzM0O2FkZHI9XCYjMzQ7KTtcbiYjNDM7XHRcdFx0aWYgKCFvIHx8IHNzY2FuZihvLCBcJiMzNDthZGRyPTB4JWx4XCYjMzQ7LCBcdTAwMjZ2YWwpICE9IDEgfHxcbiYjNDM7XHRcdFx0ICAgIHZhbCAhPSBhZGRyKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHRvID0gc3Ryc3RyKHMsIFwmIzM0O29yZGVyPVwmIzM0Oyk7XG4mIzQzO1x0XHRcdGlmICghbyB8fCBzc2NhbmYobywgXCYjMzQ7b3JkZXI9JXVcJiMzNDssIFx1MDAyNm9yZCkgIT0gMSB8fFxuJiM0MztcdFx0XHQgICAgb3JkICE9IG9yZGVyKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHRjb3VudCYjNDM7JiM0Mzs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO1x0cmV0dXJuIGNvdW50O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBvbmVfc3RlcChpbnQgaXRlcmF0aW9uKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3Qgc2l6ZV90IHdpbmRvdyA9IGdldHBhZ2VzaXplKCkgXHUwMDNjXHUwMDNjIFRBUkdFVF9PUkRFUjtcbiYjNDM7XHRjb25zdCBpbnQgbnJfcGFnZXMgPSAxIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVI7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwZm5zWzEgXHUwMDNjXHUwMDNjIFRBUkdFVF9PUkRFUl07XG4mIzQzO1x0Ym9vbCBjb2xsYXBzZWQ7XG4mIzQzO1x0aW50IGF0dHJpYnV0ZWQ7XG4mIzQzO1x0Y2hhciAqcDtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0cCA9IG1tYXAoQkFTRV9BRERSLCBocGFnZV9wbWRfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbiYjNDM7XHRcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTtcbiYjNDM7XHRpZiAocCAhPSBCQVNFX0FERFIpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7RmFpbGVkIHRvIGFsbG9jYXRlIFZNQSBhdCAlcFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICBCQVNFX0FERFIpO1xuJiM0MztcbiYjNDM7XHQvKiBQcmVwYXJlIG9uZSB3aW5kb3c7IHJlY29yZCBpdHMgc291cmNlIFBGTnMuICovXG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRwW2kgKiBnZXRwYWdlc2l6ZSgpXSA9IGkgJiM0MzsgMTtcbiYjNDM7XHRcdHBmbnNbaV0gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcCAmIzQzOyBpICogZ2V0cGFnZXNpemUoKSk7XG4mIzQzO1x0XHRpZiAocGZuc1tpXSA9PSAtMVVMKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7U291cmNlIHBhZ2Ugbm90IHByZXNlbnRcXG5cJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHRyYWNpbmdfZXZlbnRzX3N0YXJ0KFwmIzM0O2h1Z2VfbWVtb3J5XCYjMzQ7KSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtDYW5ub3QgZW5hYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuJiM0MztcdC8qIFdhaXQgdXAgdG8gMTIwIHNlY29uZHMgZm9yIHRoZSBwYXNzIHRvIGNvbXBsZXRlLiAqL1xuJiM0MztcdGlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoMTIwKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtraHVnZXBhZ2VkIGRpZCBub3QgY29tcGxldGUgYSBmdWxsIHBhc3NcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHR0cmFjaW5nX2V2ZW50c19zdG9wKFwmIzM0O2h1Z2VfbWVtb3J5XCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0Y29sbGFwc2VkID0gaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCB3aW5kb3csIFRBUkdFVF9PUkRFUixcbiYjNDM7XHRcdFx0XHRcdFx0ICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpO1xuJiM0MztcdGF0dHJpYnV0ZWQgPSBjb3VudF9hdHRyaWJ1dGVkKHBmbnMsIG5yX3BhZ2VzLCAodW5zaWduZWQgbG9uZylwLFxuJiM0MztcdFx0XHRcdCAgICAgIFRBUkdFVF9PUkRFUik7XG4mIzQzO1xuJiM0MztcdGtzZnRfdGVzdF9yZXN1bHQoY29sbGFwc2VkIFx1MDAyNlx1MDAyNiBhdHRyaWJ1dGVkID09IDEsXG4mIzQzO1x0XHRcdCBcJiMzNDtzdGVwICVkOiB3aW5kb3cgY29sbGFwc2VkLCAlZCBhdHRyaWJ1dGVkIHJlc3VsdChzKVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0IGl0ZXJhdGlvbiwgYXR0cmlidXRlZCk7XG4mIzQzO1xuJiM0MztcdG11bm1hcChwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBtYWluKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3ByaW50X2hlYWRlcigpO1xuJiM0MztcbiYjNDM7XHRpZiAoIXRocF9hdmFpbGFibGUoKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxuXCYjMzQ7KTtcbiYjNDM7XHRpZiAoISh0aHBfc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVIpKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O09yZGVyICVkIGlzIG5vdCBhIHN1cHBvcnRlZCBhbm9uIFRIUCBvcmRlclxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgIFRBUkdFVF9PUkRFUik7XG4mIzQzO1xuJiM0MztcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcbiYjNDM7XHRpZiAoIWhwYWdlX3BtZF9zaXplKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1JlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxcblwmIzM0Oyk7XG4mIzQzO1x0cGFnZW1hcF9mZCA9IG9wZW4oXCYjMzQ7L3Byb2Mvc2VsZi9wYWdlbWFwXCYjMzQ7LCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKHBhZ2VtYXBfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7b3BlbihcXFwmIzM0Oy9wcm9jL3NlbGYvcGFnZW1hcFxcXCYjMzQ7KVwmIzM0Oyk7XG4mIzQzO1x0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXCYjMzQ7L3Byb2Mva3BhZ2VmbGFnc1wmIzM0OywgT19SRE9OTFkpO1xuJiM0MztcdGlmIChrcGFnZWZsYWdzX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7b3BlbihcXFwmIzM0Oy9wcm9jL2twYWdlZmxhZ3NcXFwmIzM0OykgcmVxdWlyZXMgcm9vdFxcblwmIzM0Oyk7XG4mIzQzO1x0aWYgKHRyYWNpbmdfZXZlbnRzX3N0YXJ0KFwmIzM0O2h1Z2VfbWVtb3J5XCYjMzQ7KSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O3RyYWNlZnMgdW5hdmFpbGFibGVcXG5cJiMzNDspO1xuJiM0MztcdHRyYWNpbmdfZXZlbnRzX3N0b3AoXCYjMzQ7aHVnZV9tZW1vcnlcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3NldF9wbGFuKE5SX0lURVJBVElPTlMpO1xuJiM0MztcbiYjNDM7XHR0aHBfc2F2ZV9zZXR0aW5ncygpO1xuJiM0MztcdHRocF9yZWFkX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9NQURWSVNFO1xuJiM0MztcdHNldHRpbmdzLnRocF9kZWZyYWcgPSBUSFBfREVGUkFHX0FMV0FZUztcbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7XG4mIzQzO1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5zY2FuX3NsZWVwX21pbGxpc2VjcyA9IDYwMDAwO1xuJiM0MztcdHNldHRpbmdzLmtodWdlcGFnZWQuYWxsb2Nfc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7XG4mIzQzO1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gKGhwYWdlX3BtZF9zaXplIC8gZ2V0cGFnZXNpemUoKSkgLSAxO1xuJiM0MztcdC8qIE9uZSB3YWtlIG11c3QgY29tcGxldGUgb25lIGZ1bGwgcGFzczsgc2VlIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkuICovXG4mIzQzO1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID0gMVVMIFx1MDAzY1x1MDAzYyAyNDtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XG4mIzQzO1x0c2V0dGluZ3MuaHVnZXBhZ2VzW1RBUkdFVF9PUkRFUl0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xuJiM0MztcdC8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZC4gKi9cbiYjNDM7XHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5SX0lURVJBVElPTlM7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0b25lX3N0ZXAoaSk7XG4mIzQzO1xuJiM0MztcdHRocF9yZXN0b3JlX3NldHRpbmdzKCk7XG4mIzQzO1xuJiM0MztcdGtzZnRfZmluaXNoZWQoKTtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcbmluZGV4IDY4N2QxMTVlM2JkODAuLmY4MjZjZjk0MGMzZDQgMTAwNzU1XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcbkBAIC00MDIsMTAgJiM0Mzs0MDIsMjcgQEAgQ0FURUdPUlk9XCYjMzQ7cGZubWFwXCYjMzQ7IHJ1bl90ZXN0IC4vcGZubWFwXG4gIyBDT1cgdGVzdHNcbiBDQVRFR09SWT1cJiMzNDtjb3dcJiMzNDsgcnVuX3Rlc3QgLi9jb3dcbiBcbiYjNDM7Q0FURUdPUlk9XCYjMzQ7dGhwXCYjMzQ7IHJ1bl90ZXN0IC4vZm9saW9fb3JkZXJfY2hlY2tcbiYjNDM7XG4mIzQzO1xuJiM0MztDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3N5bmNfY2hlY2tcbiYjNDM7XG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIHN0ZXBwZWRcbiYjNDM7XG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIGZyZWVcbiYjNDM7XG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIG1hZHZpc2VcbiYjNDM7XG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIHN0ZXBwZWQgLXpcbiYjNDM7XG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIHN0ZXBwZWQgLXBcbiYjNDM7XG4gQ0FURUdPUlk9XCYjMzQ7dGhwXCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZFxuIFxuIENBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgMlxuIFxuJiM0MztDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1vIDIga2h1Z2VwYWdlZDphbm9uXG4mIzQzO1xuIENBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgYWxsOnNobWVtXG4gXG4gQ0FURUdPUlk9XCYjMzQ7dGhwXCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyA0IGFsbDpzaG1lbVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXG5pbmRleCAzMmI5OTE0NzJmNzQ0Li45YjM4ODViZDAwMWJlIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuQEAgLTQyLDY4ICYjNDM7NDIsNiBAQCBjb25zdCBjaGFyICprcGFnZWZsYWdzX3Byb2MgPSBcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXCYjMzQ7O1xuIGludCBwYWdlbWFwX2ZkO1xuIGludCBrcGFnZWZsYWdzX2ZkO1xuIFxuLXN0YXRpYyBib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbi1cdFx0aW50IGtwYWdlZmxhZ3NfZmQpXG4te1xuLVx0Y29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDtcbi1cdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XG4tXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbi1cdHVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7XG4tXHR1aW50NjRfdCBwZm5fZmxhZ3M7XG4tXHR1bnNpZ25lZCBsb25nIHBmbjtcbi1cdHVuc2lnbmVkIGxvbmcgaTtcbi1cbi1cdHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XG4tXG4tXHQvKiBub24gcHJlc2VudCBwYWdlICovXG4tXHRpZiAocGZuID09IC0xVUwpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbi1cdFx0Z290byBmYWlsO1xuLVxuLVx0LyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi9cbi1cdGlmICghb3JkZXIpIHtcbi1cdFx0aWYgKHBmbl9mbGFncyBcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcbi1cdFx0XHRyZXR1cm4gZmFsc2U7XG4tXHRcdHJldHVybiB0cnVlO1xuLVx0fVxuLVxuLVx0Lyogbm9uIFRIUCBmb2xpbyAqL1xuLVx0aWYgKCEocGZuX2ZsYWdzIFx1MDAyNiBLUEZfVEhQKSlcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVxuLVx0cGZuX2hlYWQgPSBwZm4gXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcbi1cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuLVx0XHRnb3RvIGZhaWw7XG4tXG4tXHQvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqL1xuLVx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xuLVx0Zm9yIChpID0gMTsgaSBcdTAwM2MgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7XG4tXHRcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IGksIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdFx0Z290byBmYWlsO1xuLVx0XHRpZiAoKHBmbl9mbGFncyBcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncylcbi1cdFx0XHRyZXR1cm4gZmFsc2U7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcbi1cdCAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXJcbi1cdCAqL1xuLVx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdHJldHVybiB0cnVlO1xuLVxuLVx0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuLVx0cmV0dXJuIChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7XG4tZmFpbDpcbi1cdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXG5cJiMzNDspO1xuLVx0cmV0dXJuIGZhbHNlO1xuLX1cbi1cbiBzdGF0aWMgaW50IHZhZGRyX3BhZ2VmbGFnc19nZXQoY2hhciAqdmFkZHIsIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCxcbiBcdFx0dWludDY0X3QgKmZsYWdzKVxuIHtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmNcbmluZGV4IGVmMWVhMTE5ODFhNzQuLjg4NmZiM2RlOWMwMTEgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xuQEAgLTMwMyw2ICYjNDM7MzAzLDE2MyBAQCBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncylcbiBcdHJldHVybiAwO1xuIH1cbiBcbiYjNDM7Ym9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsXG4mIzQzO1x0XHRcdGludCBrcGFnZWZsYWdzX2ZkKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDtcbiYjNDM7XHRjb25zdCB1aW50NjRfdCBmb2xpb190YWlsX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9UQUlMO1xuJiM0MztcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXHUwMDNjXHUwMDNjIG9yZGVyO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7XG4mIzQzO1x0dWludDY0X3QgcGZuX2ZsYWdzO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgcGZuO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgaTtcbiYjNDM7XG4mIzQzO1x0cGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTtcbiYjNDM7XG4mIzQzO1x0Lyogbm9uIHByZXNlbnQgcGFnZSAqL1xuJiM0MztcdGlmIChwZm4gPT0gLTFVTClcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcbiYjNDM7XHQvKiBjaGVjayBmb3Igb3JkZXItMCBwYWdlcyAqL1xuJiM0MztcdGlmICghb3JkZXIpIHtcbiYjNDM7XHRcdGlmIChwZm5fZmxhZ3MgXHUwMDI2IChmb2xpb19oZWFkX2ZsYWdzIHwgZm9saW9fdGFpbF9mbGFncykpXG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Lyogbm9uIFRIUCBmb2xpbyAqL1xuJiM0MztcdGlmICghKHBmbl9mbGFncyBcdTAwMjYgS1BGX1RIUCkpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdHBmbl9oZWFkID0gcGZuIFx1MDAyNiB+KG5yX3BhZ2VzIC0gMSk7XG4mIzQzO1xuJiM0MztcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcbiYjNDM7XHQvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqL1xuJiM0MztcdGlmICgocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb19oZWFkX2ZsYWdzKSAhPSBmb2xpb19oZWFkX2ZsYWdzKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHQvKiBjaGVjayBhbGwgdGFpbCBQRk4gZmxhZ3MgKi9cbiYjNDM7XHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IGksIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4mIzQzO1x0XHRcdGdvdG8gZmFpbDtcbiYjNDM7XHRcdGlmICgocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIGNoZWNrIHRoZSBQRk4gYWZ0ZXIgdGhpcyBmb2xpbywgYnV0IGlmIGl0cyBmbGFncyBjYW5ub3QgYmUgb2J0YWluZWQsXG4mIzQzO1x0ICogYXNzdW1lIHRoaXMgZm9saW8gaGFzIHRoZSBleHBlY3RlZCBvcmRlclxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IG5yX3BhZ2VzLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuJiM0MztcdFx0cmV0dXJuIHRydWU7XG4mIzQzO1xuJiM0MztcdC8qIElmIHdlIGZpbmQgYW5vdGhlciB0YWlsIHBhZ2UsIHRoZW4gdGhlIGZvbGlvIGlzIGxhcmdlci4gKi9cbiYjNDM7XHRyZXR1cm4gKHBmbl9mbGFncyBcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncztcbiYjNDM7ZmFpbDpcbiYjNDM7XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7RmFpbGVkIHRvIGdldCBmb2xpbyBpbmZvXFxuXCYjMzQ7KTtcbiYjNDM7XHRyZXR1cm4gZmFsc2U7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIENoZWNrIHdoZXRoZXIgdGhlIHJhbmdlIFtzdGFydCwgc3RhcnQgJiM0MzsgbGVuKSBpcyBiYWNrZWQgYnkgZm9saW9zIG9mXG4mIzQzOyAqIGV4YWN0bHkgQG9yZGVyLCBtYXBwZWQgYXQgdGhlaXIgbmF0dXJhbCBhbGlnbm1lbnQuXG4mIzQzOyAqXG4mIzQzOyAqIGlzX2JhY2tlZF9ieV9mb2xpbygpIGNsYXNzaWZpZXMgdGhlIGZvbGlvIGJhY2tpbmcgb25lIHBhZ2U7IGhlcmUgd2VcbiYjNDM7ICogYWRkaXRpb25hbGx5IHJlcXVpcmUgdGhhdCBlYWNoIG9yZGVyLWFsaWduZWQgd2luZG93IG9mIHRoZSByYW5nZSBtYXBzXG4mIzQzOyAqIG9uZSBzdWNoIGZvbGlvIGhlYWQtdG8tdGFpbDogdGhlIFZBIHJhbmdlIG11c3QgYmUgbmF0dXJhbGx5IGFsaWduZWQsXG4mIzQzOyAqIGVhY2ggd2luZG93JiMzOTtzIFBGTiBydW4gbXVzdCBiZSBjb250aWd1b3VzLCBhbmQgdGhlIGZpcnN0IFBGTiBtdXN0IGJlXG4mIzQzOyAqIHRoZSAobmF0dXJhbGx5IGFsaWduZWQpIGZvbGlvIGhlYWQuXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgaXMgdGhlIGNoZWNrIFwmIzM0O2RpZCB0aGlzIHJhbmdlIGNvbGxhcHNlIGludG8gb3JkZXItQG9yZGVyIGZvbGlvc1wmIzM0OzpcbiYjNDM7ICogYSB3aW5kb3cgYXNzZW1ibGVkIGZyb20gcGFydHMgb2Ygc2V2ZXJhbCBmb2xpb3MsIG9yIG1hcHBpbmcgYSBmb2xpb1xuJiM0MzsgKiBzaGlmdGVkIGZyb20gaXRzIG5hdHVyYWwgcG9zaXRpb24sIGZhaWxzLlxuJiM0MzsgKi9cbiYjNDM7Ym9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsXG4mIzQzO1x0XHRcdFx0ICAgICBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbiYjNDM7XHRjb25zdCBzaXplX3Qgd2luZG93ID0gbnJfcGFnZXMgKiBwc2l6ZSgpO1xuJiM0MztcdGNoYXIgKnZhZGRyO1xuJiM0MztcbiYjNDM7XHRpZiAoKHVpbnRwdHJfdClzdGFydCAlIHdpbmRvdyB8fCBsZW4gJSB3aW5kb3cpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdGZvciAodmFkZHIgPSBzdGFydDsgdmFkZHIgXHUwMDNjIHN0YXJ0ICYjNDM7IGxlbjsgdmFkZHIgJiM0Mzs9IHdpbmRvdykge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBpO1xuJiM0MztcbiYjNDM7XHRcdC8qIE5vdCBwcmVzZW50LCBvciBub3QgbWFwcGluZyB0aGUgZm9saW8gaGVhZC4gKi9cbiYjNDM7XHRcdGlmIChwZm4gPT0gLTFVTCB8fCBwZm4gJSBucl9wYWdlcylcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHRcdGZvciAoaSA9IDE7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRpZiAocGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyICYjNDM7IGkgKiBwc2l6ZSgpKSAhPVxuJiM0MztcdFx0XHQgICAgcGZuICYjNDM7IGkpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGlmICghaXNfYmFja2VkX2J5X2ZvbGlvKHZhZGRyLCBvcmRlciwgcGFnZW1hcF9mZCxcbiYjNDM7XHRcdFx0XHRcdGtwYWdlZmxhZ3NfZmQpKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2RlZmluZSBUUkFDRUZTX1JPT1QgXCYjMzQ7L3N5cy9rZXJuZWwvdHJhY2luZ1wmIzM0O1xuJiM0MztcbiYjNDM7c3RhdGljIGludCB0cmFjaW5nX2V2ZW50c193cml0ZShjb25zdCBjaGFyICpzdWJzeXMsIGNvbnN0IGNoYXIgKnZhbClcbiYjNDM7e1xuJiM0MztcdGNoYXIgcGF0aFsyNTZdO1xuJiM0MztcdGludCBmZDtcbiYjNDM7XG4mIzQzO1x0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBUUkFDRUZTX1JPT1QgXCYjMzQ7L2V2ZW50cy8lcy9lbmFibGVcJiMzNDssXG4mIzQzO1x0XHQgc3Vic3lzKTtcbiYjNDM7XHRmZCA9IG9wZW4ocGF0aCwgT19XUk9OTFkpO1xuJiM0MztcdGlmIChmZCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRpZiAod3JpdGUoZmQsIHZhbCwgMSkgIT0gMSkge1xuJiM0MztcdFx0Y2xvc2UoZmQpO1xuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdH1cbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEVuYWJsZSBvbmUgZnRyYWNlIGV2ZW50IHN1YnN5c3RlbSAoZS5nLiBcJiMzNDtodWdlX21lbW9yeVwmIzM0OykgYW5kIGNsZWFyIHRoZVxuJiM0MzsgKiB0cmFjZSBidWZmZXIuIFJldHVybnMgLTEgaWYgdHJhY2VmcyBpcyB1bmF2YWlsYWJsZTsgcGFyc2UgdGhlIHJlc3VsdHNcbiYjNDM7ICogdmlhIHRyYWNpbmdfb3Blbl90cmFjZSgpIGFmdGVyIHRyYWNpbmdfZXZlbnRzX3N0b3AoKS5cbiYjNDM7ICovXG4mIzQzO2ludCB0cmFjaW5nX2V2ZW50c19zdGFydChjb25zdCBjaGFyICpzdWJzeXMpXG4mIzQzO3tcbiYjNDM7XHRpbnQgZmQ7XG4mIzQzO1xuJiM0MztcdGlmICh0cmFjaW5nX2V2ZW50c193cml0ZShzdWJzeXMsIFwmIzM0OzFcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRmZCA9IG9wZW4oVFJBQ0VGU19ST09UIFwmIzM0Oy90cmFjZVwmIzM0OywgT19XUk9OTFkgfCBPX1RSVU5DKTtcbiYjNDM7XHRpZiAoZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztpbnQgdHJhY2luZ19ldmVudHNfc3RvcChjb25zdCBjaGFyICpzdWJzeXMpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gdHJhY2luZ19ldmVudHNfd3JpdGUoc3Vic3lzLCBcJiMzNDswXCYjMzQ7KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7RklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gZm9wZW4oVFJBQ0VGU19ST09UIFwmIzM0Oy90cmFjZVwmIzM0OywgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO31cbiYjNDM7XG4gLyogSWYgYGlvY3RscyYjMzk7IG5vbi1OVUxMLCB0aGUgYWxsb3dlZCBpb2N0bHMgd2lsbCBiZSByZXR1cm5lZCBpbnRvIHRoZSB2YXIgKi9cbiBpbnQgdWZmZF9yZWdpc3Rlcl93aXRoX2lvY3RscyhpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLFxuIFx0XHRcdCAgICAgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vciwgdWludDY0X3QgKmlvY3RscylcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcbmluZGV4IDc3OTkxNTRiNjdlZWQuLjRmZjVhMWM1YWI4ZWQgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaFxuQEAgLTk1LDYgJiM0Mzs5NSwxMCBAQCBib29sIGNoZWNrX2h1Z2VfZmlsZSh2b2lkICphZGRyLCBpbnQgbnJfaHBhZ2VzLCB1aW50NjRfdCBocGFnZV9zaXplKTtcbiBib29sIGNoZWNrX2h1Z2Vfc2htZW0odm9pZCAqYWRkciwgaW50IG5yX2hwYWdlcywgdWludDY0X3QgaHBhZ2Vfc2l6ZSk7XG4gaW50NjRfdCBhbGxvY2F0ZV90cmFuc2h1Z2Uodm9pZCAqcHRyLCBpbnQgcGFnZW1hcF9mZCk7XG4gaW50IHBhZ2VmbGFnc19nZXQodW5zaWduZWQgbG9uZyBwZm4sIGludCBrcGFnZWZsYWdzX2ZkLCB1aW50NjRfdCAqZmxhZ3MpO1xuJiM0Mztib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbiYjNDM7XHRcdFx0aW50IGtwYWdlZmxhZ3NfZmQpO1xuJiM0Mztib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMoY2hhciAqc3RhcnQsIHNpemVfdCBsZW4sIGludCBvcmRlcixcbiYjNDM7XHRcdFx0XHQgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCk7XG4gXG4gaW50IHVmZmRfcmVnaXN0ZXIoaW50IHVmZmQsIHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbixcbiBcdFx0ICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IpO1xuQEAgLTExMSw2ICYjNDM7MTE1LDkgQEAgaW50IGNsb3NlX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXApO1xuIGludCB3cml0ZV9zeXNmcyhjb25zdCBjaGFyICpmaWxlX3BhdGgsIHVuc2lnbmVkIGxvbmcgdmFsKTtcbiBpbnQgcmVhZF9zeXNmcyhjb25zdCBjaGFyICpmaWxlX3BhdGgsIHVuc2lnbmVkIGxvbmcgKnZhbCk7XG4gYm9vbCBzb2Z0ZGlydHlfc3VwcG9ydGVkKHZvaWQpO1xuJiM0MztpbnQgdHJhY2luZ19ldmVudHNfc3RhcnQoY29uc3QgY2hhciAqc3Vic3lzKTtcbiYjNDM7aW50IHRyYWNpbmdfZXZlbnRzX3N0b3AoY29uc3QgY2hhciAqc3Vic3lzKTtcbiYjNDM7RklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpO1xuIFxuIHN0YXRpYyBpbmxpbmUgaW50IG9wZW5fc2VsZl9wcm9jbWFwKHN0cnVjdCBwcm9jbWFwX2ZkICpwcm9jbWFwX291dClcbiB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDMgMDE6MDM8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlcnNwYWNlIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vKikgYW5kIGRvZXMgbm90IG1ha2UgYW55IGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIGl0c2VsZi4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAzZmE0MDMyNGM5MTFjZGQ5ZjQzNTI2NmQzZWNlZWE2YjUyZWY3MWM2CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBBdWcgMyAwMTowMzoxMyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy5naXRpZ25vcmUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8uZ2l0aWdub3JlCmluZGV4IDljY2Q5ZTE0NDdlNjYuLjYxNjA0M2EwZmNkMjIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy5naXRpZ25vcmUKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLmdpdGlnbm9yZQpAQCAtNjYsMyAmIzQzOzY2LDYgQEAgbWVyZ2UKIHByY3RsX3RocF9kaXNhYmxlCiBybWFwCiBmb2xpb19zcGxpdF9yYWNlX3Rlc3QKJiM0Mztmb2xpb19vcmRlcl9jaGVjawomIzQzO2todWdlcGFnZWRfc3luY19jaGVjawomIzQzO2todWdlcGFnZWRfcmFjZQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZQppbmRleCAyNWQxMGNlZDNiM2I5Li4wMjZkNGI2MTQxNGQ0IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZQpAQCAtMTA0LDYgJiM0MzsxMDQsOSBAQCBURVNUX0dFTl9GSUxFUyAmIzQzOz0gZ3VhcmQtcmVnaW9ucwogVEVTVF9HRU5fRklMRVMgJiM0Mzs9IG1lcmdlCiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gcm1hcAogVEVTVF9HRU5fRklMRVMgJiM0Mzs9IGZvbGlvX3NwbGl0X3JhY2VfdGVzdAomIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBmb2xpb19vcmRlcl9jaGVjawomIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBraHVnZXBhZ2VkX3N5bmNfY2hlY2sKJiM0MztURVNUX0dFTl9GSUxFUyAmIzQzOz0ga2h1Z2VwYWdlZF9yYWNlCiAKIGlmbmVxICgkKEFSQ0gpLGFybTY0KQogVEVTVF9HRU5fRklMRVMgJiM0Mzs9IHNvZnQtZGlydHkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmY3MGQ3NjZmZjNlYjMKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jCkBAIC0wLDAgJiM0MzsxLDEzOCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBTZWxmLWNoZWNrIGZvciB0aGUgdm1fdXRpbCBmb2xpby1vcmRlciBkZXRlY3Rpb24gaGVscGVycywKJiM0MzsgKiBpc19iYWNrZWRfYnlfZm9saW8oKSBhbmQgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycygpLgomIzQzOyAqCiYjNDM7ICogRm9yIGV2ZXJ5IGFub24gVEhQIG9yZGVyIHRoZSBrZXJuZWwgc3VwcG9ydHMsIGZhdWx0IG1lbW9yeSBpbiB3aXRoIG9ubHkKJiM0MzsgKiB0aGF0IG9yZGVyIGVuYWJsZWQgYW5kIHZlcmlmeSB0aGUgaGVscGVycyByZXBvcnQgZXhhY3RseSB0aGF0IG9yZGVyOgomIzQzOyAqIG5vdCBhIG5laWdoYm91cmluZyBvcmRlciwgYW5kIHBsYWluIDRLIG1lbW9yeSBhcyBvcmRlciAwLiBUaGUgaGVscGVycwomIzQzOyAqIGFyZSB3aGF0IHRoZSBraHVnZXBhZ2VkIG1USFAgdGVzdHMgdXNlIHRvIGRldGVjdCBjb2xsYXBzZSByZXN1bHRzLCBzbwomIzQzOyAqIHRoZXkgbXVzdCBhZ3JlZSB3aXRoIHRoZSBrZXJuZWwmIzM5O3Mgb3duIGlkZWEgb2YgdGhlIGJhY2tpbmcgYmVmb3JlIGFueQomIzQzOyAqIGNvbGxhcHNlIHRlc3QgcmVsaWVzIG9uIHRoZW0uCiYjNDM7ICovCiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRQomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL21tYW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtrc2VsZnRlc3QuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bV91dGlsLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7aHVnZXBhZ2Vfc2V0dGluZ3MuaCYjMzQ7CiYjNDM7CiYjNDM7c3RhdGljIGludCBwYWdlbWFwX2ZkOwomIzQzO3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDsKJiM0MzsKJiM0MzsvKiBtbWFwIGFuIGFub24gVk1BIG9mIGV4YWN0bHkgQHNpemUgYnl0ZXMgYXQgYSBAc2l6ZS1hbGlnbmVkIGFkZHJlc3MuICovCiYjNDM7c3RhdGljIGNoYXIgKmFsbG9jX2FsaWduZWQoc2l6ZV90IHNpemUpCiYjNDM7ewomIzQzOwlzaXplX3QgbGVuID0gc2l6ZSAqIDI7CiYjNDM7CXVpbnRwdHJfdCBhbGlnbmVkOwomIzQzOwljaGFyICpwOwomIzQzOwomIzQzOwlwID0gbW1hcChOVUxMLCBsZW4sIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7CiYjNDM7CWlmIChwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttbWFwKCkmIzM0Oyk7CiYjNDM7CiYjNDM7CWFsaWduZWQgPSAoKHVpbnRwdHJfdClwICYjNDM7IHNpemUgLSAxKSAmYW1wOyB+KHNpemUgLSAxKTsKJiM0MzsJaWYgKGFsaWduZWQgIT0gKHVpbnRwdHJfdClwKQomIzQzOwkJbXVubWFwKHAsIGFsaWduZWQgLSAodWludHB0cl90KXApOwomIzQzOwlpZiAoYWxpZ25lZCAmIzQzOyBzaXplICE9ICh1aW50cHRyX3QpcCAmIzQzOyBsZW4pCiYjNDM7CQltdW5tYXAoKGNoYXIgKilhbGlnbmVkICYjNDM7IHNpemUsCiYjNDM7CQkgICAgICAgKHVpbnRwdHJfdClwICYjNDM7IGxlbiAtIGFsaWduZWQgLSBzaXplKTsKJiM0MzsKJiM0MzsJcmV0dXJuIChjaGFyICopYWxpZ25lZDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBFbmFibGUgb25seSBAb3JkZXIgKG9yZGVyIDA6IG5vdGhpbmcpLCBmYXVsdCBvbmUgYWxpZ25lZCB3aW5kb3cgaW4gYW5kCiYjNDM7ICogY2hlY2sgdGhlIGhlbHBlcnMgc2VlIGV4YWN0bHkgQG9yZGVyLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIGNoZWNrX29yZGVyKGludCBvcmRlcikKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTsKJiM0MzsJc2l6ZV90IHNpemUgPSBwc2l6ZSgpICZsdDsmbHQ7IG9yZGVyOwomIzQzOwlib29sIG9rID0gdHJ1ZTsKJiM0MzsJY2hhciAqcDsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBOUl9PUkRFUlM7IGkmIzQzOyYjNDM7KQomIzQzOwkJc2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7CiYjNDM7CWlmIChvcmRlcikKJiM0MzsJCXNldHRpbmdzLmh1Z2VwYWdlc1tvcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7CiYjNDM7CXRocF9wdXNoX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzOwomIzQzOwlwID0gYWxsb2NfYWxpZ25lZChzaXplKTsKJiM0MzsJKnAgPSAxOwomIzQzOwomIzQzOwlpZiAoIWlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgb3JkZXIsCiYjNDM7CQkJCQkgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O29yZGVyICVkIG5vdCBkZXRlY3RlZCBhZnRlciBmYXVsdFxuJiMzNDssIG9yZGVyKTsKJiM0MzsJCW9rID0gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogQSBsb3dlciBvcmRlciBtdXN0IGJlIHJlamVjdGVkOiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqLwomIzQzOwlpZiAob3JkZXIgJmFtcDsmYW1wOyBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIG9yZGVyIC0gMSwKJiM0MzsJCQkJCQkgICAgIHBhZ2VtYXBfZmQsCiYjNDM7CQkJCQkJICAgICBrcGFnZWZsYWdzX2ZkKSkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyICVkXG4mIzM0OywKJiM0MzsJCQkgICAgICAgb3JkZXIsIG9yZGVyIC0gMSk7CiYjNDM7CQlvayA9IGZhbHNlOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIE9yZGVyIDAgcGFnZXMgbXVzdCBub3QgbG9vayBsaWtlIGFueSBsYXJnZSBmb2xpbywgYW5kIHZpY2UgdmVyc2EuICovCiYjNDM7CWlmIChvcmRlciAmYW1wOyZhbXA7IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgMCwKJiM0MzsJCQkJCQkgICAgIHBhZ2VtYXBfZmQsCiYjNDM7CQkJCQkJICAgICBrcGFnZWZsYWdzX2ZkKSkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyIDBcbiYjMzQ7LCBvcmRlcik7CiYjNDM7CQlvayA9IGZhbHNlOwomIzQzOwl9CiYjNDM7CiYjNDM7CW11bm1hcChwLCBzaXplKTsKJiM0MzsJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0KG9rLCAmIzM0O29yZGVyICVkIGNsYXNzaWZpZWRcbiYjMzQ7LCBvcmRlcik7CiYjNDM7fQomIzQzOwomIzQzO2ludCBtYWluKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzOwomIzQzOwl1bnNpZ25lZCBsb25nIG9yZGVyczsKJiM0MzsJaW50IG9yZGVyOwomIzQzOwomIzQzOwlrc2Z0X3ByaW50X2hlYWRlcigpOwomIzQzOwomIzQzOwlpZiAoIXRocF9hdmFpbGFibGUoKSkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJcGFnZW1hcF9mZCA9IG9wZW4oJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXAmIzM0OywgT19SRE9OTFkpOwomIzQzOwlpZiAocGFnZW1hcF9mZCAmbHQ7IDApCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDtvcGVuKFwmIzM0Oy9wcm9jL3NlbGYvcGFnZW1hcFwmIzM0OykmIzM0Oyk7CiYjNDM7CWtwYWdlZmxhZ3NfZmQgPSBvcGVuKCYjMzQ7L3Byb2Mva3BhZ2VmbGFncyYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CWlmIChrcGFnZWZsYWdzX2ZkICZsdDsgMCkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7b3BlbihcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXCYjMzQ7KSByZXF1aXJlcyByb290XG4mIzM0Oyk7CiYjNDM7CiYjNDM7CW9yZGVycyA9IHRocF9zdXBwb3J0ZWRfb3JkZXJzKCk7CiYjNDM7CWlmICghb3JkZXJzKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDtObyBzdXBwb3J0ZWQgVEhQIG9yZGVyc1xuJiMzNDspOwomIzQzOwomIzQzOwlrc2Z0X3NldF9wbGFuKF9fYnVpbHRpbl9wb3Bjb3VudGwob3JkZXJzKSAmIzQzOyAxKTsKJiM0MzsKJiM0MzsJdGhwX3NhdmVfc2V0dGluZ3MoKTsKJiM0MzsJdGhwX3JlYWRfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CS8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZC4gKi8KJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CWNoZWNrX29yZGVyKDApOwomIzQzOwlmb3IgKG9yZGVyID0gMTsgb3JkZXIgJmx0OyBOUl9PUkRFUlM7IG9yZGVyJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKCEob3JkZXJzICZhbXA7ICgxVUwgJmx0OyZsdDsgb3JkZXIpKSkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWNoZWNrX29yZGVyKG9yZGVyKTsKJiM0MzsJfQomIzQzOwomIzQzOwl0aHBfcmVzdG9yZV9zZXR0aW5ncygpOwomIzQzOwomIzQzOwlrc2Z0X2ZpbmlzaGVkKCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmMKaW5kZXggZDc5MTdkY2UzYWJhYy4uYTI2YTBjZmZhOWM1YiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jCkBAIC0xODMsNiAmIzQzOzE4MywxNyBAQCB2b2lkIHRocF9yZWFkX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKQogCX0KIH0KIAomIzQzOy8qCiYjNDM7ICogV3JpdGUgb25seSBvbiBjaGFuZ2U6IGFueSBzdG9yZSB0byBhIGtodWdlcGFnZWQgc3lzZnMga25vYiB3YWtlcyB0aGUKJiM0MzsgKiBkYWVtb24sIGFuZCBzZXR0aW5ncyBwdXNoZXMvcG9wcyBtdXN0IG5vdCBzdGFydCBzY2FuIHBhc3NlcyBub2JvZHkKJiM0MzsgKiBhc2tlZCBmb3Ig4oCUIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgaXMgdGhlIG9ubHkgc2FuY3Rpb25lZCB3YWtlLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIHRocF91cGRhdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKQomIzQzO3sKJiM0MzsJaWYgKHRocF9yZWFkX251bShuYW1lKSAhPSBudW0pCiYjNDM7CQl0aHBfd3JpdGVfbnVtKG5hbWUsIG51bSk7CiYjNDM7fQomIzQzOwogdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpCiB7CiAJc3RydWN0IGtodWdlcGFnZWRfc2V0dGluZ3MgKmtodWdlcGFnZWQgPSAmYW1wO3NldHRpbmdzLSZndDtraHVnZXBhZ2VkOwpAQCAtMTk4LDE1ICYjNDM7MjA5LDE1IEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKQogCQkJc2htZW1fZW5hYmxlZF9zdHJpbmdzW3NldHRpbmdzLSZndDtzaG1lbV9lbmFibGVkXSk7CiAJdGhwX3dyaXRlX251bSgmIzM0O3VzZV96ZXJvX3BhZ2UmIzM0Oywgc2V0dGluZ3MtJmd0O3VzZV96ZXJvX3BhZ2UpOwogCi0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvZGVmcmFnJiMzNDssIGtodWdlcGFnZWQtJmd0O2RlZnJhZyk7Ci0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzJiMzNDssCi0JCQlraHVnZXBhZ2VkLSZndDthbGxvY19zbGVlcF9taWxsaXNlY3MpOwotCXRocF93cml0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzJiMzNDssCi0JCQlraHVnZXBhZ2VkLSZndDtzY2FuX3NsZWVwX21pbGxpc2Vjcyk7Ci0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfbm9uZSYjMzQ7LCBraHVnZXBhZ2VkLSZndDttYXhfcHRlc19ub25lKTsKLQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwJiMzNDssIGtodWdlcGFnZWQtJmd0O21heF9wdGVzX3N3YXApOwotCXRocF93cml0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3NoYXJlZCYjMzQ7LCBraHVnZXBhZ2VkLSZndDttYXhfcHRlc19zaGFyZWQpOwotCXRocF93cml0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW4mIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7cGFnZXNfdG9fc2Nhbik7CiYjNDM7CXRocF91cGRhdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9kZWZyYWcmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7ZGVmcmFnKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL2FsbG9jX3NsZWVwX21pbGxpc2VjcyYjMzQ7LAomIzQzOwkJICAgICAgIGtodWdlcGFnZWQtJmd0O2FsbG9jX3NsZWVwX21pbGxpc2Vjcyk7CiYjNDM7CXRocF91cGRhdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2VjcyYjMzQ7LAomIzQzOwkJICAgICAgIGtodWdlcGFnZWQtJmd0O3NjYW5fc2xlZXBfbWlsbGlzZWNzKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX25vbmUmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7bWF4X3B0ZXNfbm9uZSk7CiYjNDM7CXRocF91cGRhdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwJiMzNDssIGtodWdlcGFnZWQtJmd0O21heF9wdGVzX3N3YXApOwomIzQzOwl0aHBfdXBkYXRlX251bSgmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkJiMzNDssIGtodWdlcGFnZWQtJmd0O21heF9wdGVzX3NoYXJlZCk7CiYjNDM7CXRocF91cGRhdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9wYWdlc190b19zY2FuJiMzNDssIGtodWdlcGFnZWQtJmd0O3BhZ2VzX3RvX3NjYW4pOwogCiAJaWYgKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGhbMF0pCiAJCXdyaXRlX251bShkZXZfcXVldWVfcmVhZF9haGVhZF9wYXRoLCBzZXR0aW5ncy0mZ3Q7cmVhZF9haGVhZF9rYik7CkBAIC0yMzAsNiAmIzQzOzI0MSw0MyBAQCB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncykKIAl9CiB9CiAKJiM0MzsvKgomIzQzOyAqIENvbXBsZXRpb24gYmFycmllciBmb3Iga2h1Z2VwYWdlZDogd2FpdCB1bnRpbCBhIGZ1bGwgc2NhbiBwYXNzIHRoYXQKJiM0MzsgKiBzdGFydGVkIGFmdGVyIHRoaXMgY2FsbCBoYXMgZmluaXNoZWQuIGZ1bGxfc2NhbnMgbXVzdCBhZHZhbmNlIGJ5IHR3bzsKJiM0MzsgKiBhICYjNDM7MSBzdGVwIG1heSBjb21wbGV0ZSBhIHBhc3MgdGhhdCBleGFtaW5lZCB0aGlzIG1tIGJlZm9yZSB0aGUKJiM0MzsgKiBjYWxsZXImIzM5O3Mgc2V0dXAgd2FzIGluIHBsYWNlLgomIzQzOyAqCiYjNDM7ICogQW55IHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIHNvIHRoZSBiYXJyaWVyCiYjNDM7ICogd29ya3MgcmVnYXJkbGVzcyBvZiB0aGUgY29uZmlndXJlZCBzY2FuIGNhZGVuY2UuIEl0IHdha2VzIGV4YWN0bHkKJiM0MzsgKiBvbmNlIHBlciBtaXNzaW5nIHBhc3Mg4oCUIG92ZXItd2FraW5nIHdvdWxkIHF1ZXVlIGEgc3RyYWdnbGVyIHBhc3MKJiM0MzsgKiBiZWhpbmQgdGhlIGJhcnJpZXIsIHBlcnR1cmJpbmcgd2hhdGV2ZXIgdGhlIGNhbGxlciBzZXRzIHVwIG5leHQuCiYjNDM7ICogT25lIHdha2UgY29tcGxldGVzIG9uZSBmdWxsIHBhc3Mgb25seSBpZiB0aGUgd2hvbGUgbW0gbGlzdCBmaXRzIGluCiYjNDM7ICogb25lIHNjYW4gYmF0Y2gsIHNvIGNhbGxlcnMgbXVzdCBwYWlyIHRoaXMgd2l0aCBhIGxhcmdlCiYjNDM7ICogcGFnZXNfdG9fc2Nhbi4KJiM0MzsgKi8KJiM0Mztib29sIGtodWdlcGFnZWRfZnVsbF9wYXNzKHVuc2lnbmVkIGludCB0aW1lb3V0X3MpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIGRlYWRsaW5lX21zID0gdGltZW91dF9zICogMTAwMFVMOwomIzQzOwl1bnNpZ25lZCBsb25nIHNsZWVwX21zID0KJiM0MzsJCXRocF9yZWFkX251bSgmIzM0O2todWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3MmIzM0Oyk7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZWxhcHNlZF9tcyA9IDA7CiYjNDM7CWludCBwYXNzOwomIzQzOwomIzQzOwlmb3IgKHBhc3MgPSAwOyBwYXNzICZsdDsgMjsgcGFzcyYjNDM7JiM0MzspIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgdGFyZ2V0ID0KJiM0MzsJCQl0aHBfcmVhZF9udW0oJiMzNDtraHVnZXBhZ2VkL2Z1bGxfc2NhbnMmIzM0OykgJiM0MzsgMTsKJiM0MzsKJiM0MzsJCXRocF93cml0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzJiMzNDssIHNsZWVwX21zKTsKJiM0MzsJCXdoaWxlICh0aHBfcmVhZF9udW0oJiMzNDtraHVnZXBhZ2VkL2Z1bGxfc2NhbnMmIzM0OykgJmx0OyB0YXJnZXQpIHsKJiM0MzsJCQlpZiAoZWxhcHNlZF9tcyAmZ3Q7PSBkZWFkbGluZV9tcykKJiM0MzsJCQkJcmV0dXJuIGZhbHNlOwomIzQzOwkJCXVzbGVlcCgxMCAqIDEwMDApOwomIzQzOwkJCWVsYXBzZWRfbXMgJiM0Mzs9IDEwOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKIHN0cnVjdCB0aHBfc2V0dGluZ3MgKnRocF9jdXJyZW50X3NldHRpbmdzKHZvaWQpCiB7CiAJaWYgKCFzZXR0aW5nc19pbmRleCkgewpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmgKaW5kZXggNzI2YzczYzQzYzA1Yi4uOGRlNDQ2YWZmZWVjZCAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oCkBAIC04Myw2ICYjNDM7ODMsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgdGhwX3NhdmVfc2V0dGluZ3Modm9pZCkKIAlodWdlcGFnZV9zYXZlX3NldHRpbmdzKC8qIHRocCA9ICovIHRydWUsIC8qIGh1Z2V0bGIgPSAqLyBmYWxzZSk7CiB9CiAKJiM0Mztib29sIGtodWdlcGFnZWRfZnVsbF9wYXNzKHVuc2lnbmVkIGludCB0aW1lb3V0X3MpOwomIzQzOwogdm9pZCB0aHBfc2V0X3JlYWRfYWhlYWRfcGF0aChjaGFyICpwYXRoKTsKIHVuc2lnbmVkIGxvbmcgdGhwX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7CiB1bnNpZ25lZCBsb25nIHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jCmluZGV4IDEwZThkZWRjYjA4N2QuLmM1YTNjMzkyMjU4MTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMKQEAgLTI2LDkgJiM0MzsyNiwxMyBAQAogCiAjZGVmaW5lIEJBU0VfQUREUiAoKHZvaWQgKikoMVVMICZsdDsmbHQ7IDMwKSkKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGhwYWdlX3BtZF9zaXplOwomIzQzO3N0YXRpYyBpbnQgaHBhZ2VfcG1kX29yZGVyOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplOwogc3RhdGljIGludCBocGFnZV9wbWRfbnI7CiBzdGF0aWMgaW50IGFub25fb3JkZXI7CiYjNDM7c3RhdGljIGludCBhbm9uX3RhcmdldF9vcmRlcjsKJiM0MztzdGF0aWMgaW50IHBhZ2VtYXBfZmQgPSAtMTsKJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQgPSAtMTsKIAogI2RlZmluZSBQSURfU01BUFMgJiMzNDsvcHJvYy9zZWxmL3NtYXBzJiMzNDsKICNkZWZpbmUgVEVTVF9GSUxFICYjMzQ7Y29sbGFwc2VfdGVzdF9maWxlJiMzNDsKQEAgLTE3Nyw2ICYjNDM7MTgxLDIxIEBAIHN0YXRpYyB2b2lkIGdldF9maW5mbyhjb25zdCBjaGFyICpkaXIpCiAJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7JXM6IENvdWxkIG5vdCByZWFkOiAlc1xuJiMzNDssIF9fZnVuY19fLCBwYXRoKTsKIH0KIAomIzQzO3N0YXRpYyBib29sIGhhc19zd2FwKHZvaWQpCiYjNDM7ewomIzQzOwlGSUxFICpmcCA9IGZvcGVuKCYjMzQ7L3Byb2Mvc3dhcHMmIzM0OywgJiMzNDtyJiMzNDspOwomIzQzOwljaGFyIGxpbmVbTUFYX0xJTkVfTEVOR1RIXTsKJiM0MzsJYm9vbCByZXQgPSBmYWxzZTsKJiM0MzsKJiM0MzsJaWYgKCFmcCkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJLyogRmlyc3QgbGluZSBpcyB0aGUgaGVhZGVyOyBhbnkgZm9sbG93aW5nIGxpbmUgaXMgYSBzd2FwIGFyZWEuICovCiYjNDM7CWlmIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSAmYW1wOyZhbXA7IGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKQomIzQzOwkJcmV0ID0gdHJ1ZTsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgYm9vbCBjaGVja19zd2FwKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlib29sIHN3YXAgPSBmYWxzZTsKQEAgLTU1NCw4ICYjNDM7NTczLDE3IEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfY29sbGFwc2UoY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBpbnQgbnJfaHBhZ2VzLAogc3RhdGljIGJvb2wgd2FpdF9mb3Jfc2Nhbihjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsCiAJCQkgIHN0cnVjdCBtZW1fb3BzICpvcHMpCiB7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBidWRnZXQgaGFzIHRvIGNvdmVyIGtodWdlcGFnZWQgY29weWluZyBucl9ocGFnZXMgKgomIzQzOwkgKiBocGFnZV9wbWRfc2l6ZSwgcGx1cyB0d28gb2YgaXRzIHBhc3NlcyBvdmVyIHRoZSBtbS4gVGhyZWUgc2Vjb25kcwomIzQzOwkgKiBkb2VzIHRoYXQgYXQgYSAyTSBQTUQsIGJ1dCB0aGUgc2FtZSB0ZXN0IG1vdmVzIDJHIGF0IGEgNTEyTSBQTUQKJiM0MzsJICogKGFybTY0IHdpdGggNjRLIGJhc2UgcGFnZXMpIGFuZCAzcyBpcyB0aGVuIG1hcmdpbmFsOiBpdCBmYWlscyBvbiBhCiYjNDM7CSAqIGNvbGxhcHNlIHRoYXQgY29tcGxldGVzIGNvcnJlY3RseSwganVzdCBub3QgaW5zaWRlIHRoZSBidWRnZXQuCiYjNDM7CSAqIEFsbG93IGEgZnVydGhlciBzZWNvbmQgcGVyIDY0TSB0byBjb2xsYXBzZS4KJiM0MzsJICovCiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgYnl0ZXMgPSAodW5zaWduZWQgbG9uZylucl9ocGFnZXMgKiBocGFnZV9wbWRfc2l6ZTsKJiM0MzsJaW50IHRpbWVvdXQgPSA2ICYjNDM7IDIgKiAoYnl0ZXMgLyAoNjRVTCAmbHQ7Jmx0OyAyMCkpOwogCWludCBmdWxsX3NjYW5zOwotCWludCB0aW1lb3V0ID0gNjsgLyogMyBzZWNvbmRzICovCiAKIAkvKiBTYW5pdHkgY2hlY2sgKi8KIAlpZiAoIW9wcy0mZ3Q7Y2hlY2tfaHVnZShwLCAwKSkKQEAgLTczNSw2ICYjNDM7NzYzLDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX3N3YXBpbl9zaW5nbGVfcHRlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wCiAJdm9pZCAqcDsKIAogCXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiYjNDM7CWlmICghaGFzX3N3YXAoKSkgewomIzQzOwkJc2tpcCgmIzM0O1NraXAgKG5vIHN3YXAgY29uZmlndXJlZCkmIzM0Oyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQogCW9wcy0mZ3Q7ZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpOwogCiAJa3NmdF9wcmludF9tc2coJiMzNDtTd2Fwb3V0IG9uZSBwYWdlLi4uJiMzNDspOwpAQCAtNzYxLDYgJiM0Mzs3OTMsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm8KIAl2b2lkICpwOwogCiAJcCA9IG9wcy0mZ3Q7c2V0dXBfYXJlYSgxKTsKJiM0MzsJaWYgKCFoYXNfc3dhcCgpKSB7CiYjNDM7CQlza2lwKCYjMzQ7U2tpcCAobm8gc3dhcCBjb25maWd1cmVkKSYjMzQ7KTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiAJb3BzLSZndDtmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7CiAKIAlrc2Z0X3ByaW50X21zZygmIzM0O1N3YXBvdXQgJWQgb2YgJWQgcGFnZXMuLi4mIzM0OywgbWF4X3B0ZXNfc3dhcCAmIzQzOyAxLCBocGFnZV9wbWRfbnIpOwpAQCAtODUzLDYgJiM0Mzs4ODksMjEgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfY29tcG91bmRfZXh0cmVtZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMKIAl2b2lkICpwOwogCWludCBpOwogCiYjNDM7CS8qCiYjNDM7CSAqIEJ1aWxkcyBhIFBNRCYjMzk7cyB3b3J0aCBvZiBkaXN0aW5jdCBQVEUtbWFwcGVkIGNvbXBvdW5kIHBhZ2VzIGJ5IGN5Y2xpbmcKJiM0MzsJICogaHBhZ2VfcG1kX25yIGZhdWx0LXRpbWUgVEhQcyB0aHJvdWdoIG1yZW1hcC4gRmF1bHQtdGltZSBUSFAgYWxsb2NhdGlvbgomIzQzOwkgKiBpcyBiZXN0LWVmZm9ydCwgYW5kIHRoaXMgbmVlZHMgaHBhZ2VfcG1kX25yIFBNRC1vcmRlciBwYWdlcyBpbiBhIHJvdzoKJiM0MzsJICogZmluZSBhdCBhIDJNICg0SyBiYXNlKSBvciAzMk0gKDE2SyBiYXNlKSBQTUQsIGJ1dCBhIDUxMk0gUE1EIChhcm02NC82NEspCiYjNDM7CSAqIGlzIGFuIG9yZGVyLTEzIGFsbG9jYXRpb24gdGhlIGFsbG9jYXRvciBjYW5ub3QgcmVsaWFibHkgaGFuZCBvdXQgZXZlbgomIzQzOwkgKiBvbmNlLCBsZXQgYWxvbmUgODE5MiB0aW1lcy4gQ2FwIGF0IGEgMzJNIFBNRDsgTUFEVl9DT0xMQVBTRS1kcml2ZW4gY2FzZXMKJiM0MzsJICogc3RpbGwgY292ZXIgUE1ELW9yZGVyIGNvbGxhcHNlIG9uIHRoZSBsYXJnZXIgY29uZmlncy4KJiM0MzsJICovCiYjNDM7CWlmIChocGFnZV9wbWRfc2l6ZSAmZ3Q7ICgzMlVMICZsdDsmbHQ7IDIwKSkgewomIzQzOwkJa3NmdF90ZXN0X3Jlc3VsdF9za2lwKCYjMzQ7JXM6IFBNRCB0b28gbGFyZ2UgZm9yIGZhdWx0LXRpbWUgVEhQIGNvbnN0cnVjdGlvblxuJiMzNDssCiYjNDM7CQkJCSAgICAgIF9fZnVuY19fKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwogCXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiAJa3NmdF9wcmludF9tc2coJiMzNDtDb25zdHJ1Y3QgUFRFIHBhZ2UgdGFibGUgZnVsbCBvZiBkaWZmZXJlbnQgUFRFLW1hcHBlZCBjb21wb3VuZCBwYWdlc1xuJiMzNDspOwogCWZvciAoaSA9IDA7IGkgJmx0OyBocGFnZV9wbWRfbnI7IGkmIzQzOyYjNDM7KSB7CkBAIC0xMDQzLDYgJiM0MzsxMDk0LDYxIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMKIAlrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgJiMzNDslc1xuJiMzNDssIF9fZnVuY19fKTsKIH0KIAomIzQzOy8qCiYjNDM7ICogQ29udGVudCBzdGF5cyBpc29sYXRlZCB3aGlsZSBhIGNvLXNoYXJlciB3cml0ZXMgY29uY3VycmVudGx5LiBBIHNoYXJlZAomIzQzOyAqIHNvdXJjZSBpcyBjb3BpZWQgbGl2ZSAobm90IGZyb3plbiksIHJlbHlpbmcgb24gaXQgYmVpbmcgQ29XIC0gaW1tdXRhYmxlCiYjNDM7ICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29weTsgYSBjby1zaGFyZXImIzM5O3Mgd3JpdGUgZ29lcyB0byBhIENvVyBjb3B5LiBUaGUKJiM0MzsgKiBjb2xsYXBzaW5nIGNoaWxkIG11c3Qgc2VlIHRoZSBwcmUtZm9yayBjb250ZW50LCB0aGUgd3JpdGluZyBwYXJlbnQgb25seQomIzQzOyAqIGl0cyBvd24gd3JpdGVzLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX2ZvcmtfY293X3JhY2Uoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvcHMpCiYjNDM7ewomIzQzOwljb25zdCB1bnNpZ25lZCBsb25nIHNoYXJlZCA9IDY0ICogcGFnZV9zaXplOwomIzQzOwljb25zdCBpbnQgc3RyaWRlID0gcGFnZV9zaXplIC8gc2l6ZW9mKGludCk7CiYjNDM7CWludCB3c3RhdHVzLCBpLCBuID0gc2hhcmVkIC8gcGFnZV9zaXplOwomIzQzOwlpbnQgKmlwOwomIzQzOwl2b2lkICpwOwomIzQzOwomIzQzOwlwID0gb3BzLSZndDtzZXR1cF9hcmVhKDEpOwomIzQzOwlpcCA9IHA7CiYjNDM7CW9wcy0mZ3Q7ZmF1bHQocCwgMCwgc2hhcmVkKTsJCS8qIHNoYXJlZCBwcmVmaXgsIHByZS1mb3JrIHBhdHRlcm4gKi8KJiM0MzsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtGb3JrLCBjb2xsYXBzZSBpbiB0aGUgY2hpbGQgd2hpbGUgdGhlIHBhcmVudCByZXdyaXRlcy4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFmb3JrKCkpIHsKJiM0MzsJCW9wcy0mZ3Q7ZmF1bHQocCwgc2hhcmVkLCBocGFnZV9wbWRfc2l6ZSk7CS8qIHByaXZhdGUgcmVtYWluZGVyICovCiYjNDM7CQljLSZndDtjb2xsYXBzZSgmIzM0O0NvbGxhcHNlIGEgcmFuZ2Ugc2hhcmVkIHdpdGggYSB3cml0aW5nIGNvLXNoYXJlciYjMzQ7LAomIzQzOwkJCSAgICBwLCAxLCBvcHMsIHRydWUpOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG47IGkmIzQzOyYjNDM7KQomIzQzOwkJCWlmIChpcFtpICogc3RyaWRlXSAhPSBpICYjNDM7IDB4ZGVhZDAwMDApIHsKJiM0MzsJCQkJZmFpbCgmIzM0O0ZhaWw6IGNoaWxkIGNvbnRlbnQmIzM0Oyk7CiYjNDM7CQkJCW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJCQkJX2V4aXQoZXhpdF9zdGF0dXMpOwomIzQzOwkJCX0KJiM0MzsJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKJiM0MzsJCW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJCV9leGl0KGV4aXRfc3RhdHVzKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBIYW1tZXIgdGhlIHBhcmVudCYjMzk7cyBvd24gd3JpdGVzIG92ZXIgdGhlIHNoYXJlZCBwcmVmaXguICovCiYjNDM7CWZvciAoaW50IGl0ID0gMDsgaXQgJmx0OyAyMDAwMDA7IGl0JiM0MzsmIzQzOykKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBuOyBpJiM0MzsmIzQzOykKJiM0MzsJCQlpcFtpICogc3RyaWRlXSA9IGkgJiM0MzsgMHhiZWVmMDAwMDsKJiM0MzsKJiM0MzsJd2FpdCgmYW1wO3dzdGF0dXMpOwomIzQzOwlleGl0X3N0YXR1cyA9IFdFWElUU1RBVFVTKHdzdGF0dXMpOwomIzQzOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0NoZWNrIHRoZSBwYXJlbnQgc2VlcyBvbmx5IGl0cyBvd24gd3JpdGVzLi4uJiMzNDspOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbjsgaSYjNDM7JiM0MzspCiYjNDM7CQlpZiAoaXBbaSAqIHN0cmlkZV0gIT0gaSAmIzQzOyAweGJlZWYwMDAwKQomIzQzOwkJCWJyZWFrOwomIzQzOwlpZiAoaSA9PSBuKQomIzQzOwkJc3VjY2VzcygmIzM0O09LJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlmYWlsKCYjMzQ7RmFpbDogcGFyZW50IGNvbnRlbnQmIzM0Oyk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7fQomIzQzOwogc3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLAogCQkJCQkgICBzdHJ1Y3QgbWVtX29wcyAqb3BzKQogewpAQCAtMTA4OCw2ICYjNDM7MTE5NCwyMjIgQEAgc3RhdGljIHZvaWQgbWFkdmlzZV9yZXRyYWN0ZWRfcGFnZV90YWJsZXMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsCiAJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiB9CiAKJiM0MzsvKgomIzQzOyAqIE9yZGVyLXBhcmFtZXRlcml6ZWQgY29sbGFwc2UgY2FzZXMgKC1vICZsdDtvcmRlciZndDspOiBraHVnZXBhZ2VkIGNvbGxhcHNlcwomIzQzOyAqIDRLLWZhdWx0ZWQgbWVtb3J5IGludG8gZm9saW9zIG9mIHRoZSBnaXZlbiBzdWItUE1EIG9yZGVyLiBEZXRlY3Rpb24gaXMKJiM0MzsgKiBmb2xpby1iYXNlZCAodm1fdXRpbCksIG5vdCBzbWFwczogQW5vbkh1Z2VQYWdlcyBvbmx5IGFjY291bnRzIFBNRAomIzQzOyAqIG1hcHBpbmdzLgomIzQzOyAqCiYjNDM7ICogVGhlIHJlZ2lvbiBpcyBmYXVsdGVkIGJlZm9yZSBNQURWX0hVR0VQQUdFIGFuZCB0aGUgdGFyZ2V0IG9yZGVyIGlzCiYjNDM7ICogY29uZmlndXJlZCAmIzM0O2luaGVyaXQmIzM0OyB1bmRlciBlbmFibGVkPW1hZHZpc2UsIHNvIGZhdWx0cyBhcmUgYWx3YXlzCiYjNDM7ICogb3JkZXIgMCBhbmQgdGhlIGNvbGxhcHNlIHByb2R1Y3QgY2FuIG9ubHkgY29tZSBmcm9tIGtodWdlcGFnZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIHNpemVfdCBhbm9uX29yZGVyX3NpemUodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBwYWdlX3NpemUgJmx0OyZsdDsgYW5vbl90YXJnZXRfb3JkZXI7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIHJhbmdlX2NvbGxhcHNlZCh2b2lkICpwLCBzaXplX3QgbGVuKQomIzQzO3sKJiM0MzsJcmV0dXJuIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgbGVuLCBhbm9uX3RhcmdldF9vcmRlciwKJiM0MzsJCQkJCSAgICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogTm8gYWxpZ25lZCB3aW5kb3cgaW4gW3AsIHAgJiM0MzsgbGVuKSBpcyBiYWNrZWQgYXQgdGhlIHRhcmdldCBvcmRlci4gKi8KJiM0MztzdGF0aWMgYm9vbCByYW5nZV9ub3RfY29sbGFwc2VkKHZvaWQgKnAsIHNpemVfdCBsZW4pCiYjNDM7ewomIzQzOwlzaXplX3Qgd2luZG93ID0gYW5vbl9vcmRlcl9zaXplKCk7CiYjNDM7CWNoYXIgKmFkZHIgPSBwOwomIzQzOwomIzQzOwlmb3IgKDsgbGVuICZndDs9IHdpbmRvdzsgYWRkciAmIzQzOz0gd2luZG93LCBsZW4gLT0gd2luZG93KSB7CiYjNDM7CQlpZiAocmFuZ2VfY29sbGFwc2VkKGFkZHIsIHdpbmRvdykpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKHZvaWQpCiYjNDM7ewomIzQzOwkvKiBXYWl0IHVwIHRvIDMwIHNlY29uZHMgZm9yIHRoZSBwYXNzIHRvIGNvbXBsZXRlLiAqLwomIzQzOwlyZXR1cm4ga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoMzApOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIENhc2VzIHdob3NlIGdlb21ldHJ5IG5lZWRzIGEgd2luZG93IHN0cmljdGx5IGJlbG93IHRoZSBQTUQgc2tpcCBhdAomIzQzOyAqIC1vICZsdDtQTUQgb3JkZXImZ3Q7OyB0aGUgcmVzdCBydW4gdGhlcmUgdW5jaGFuZ2VkLCBiYXNlbGluaW5nIHRoZSBsZWdhY3kKJiM0MzsgKiBQTUQgZW5naW5lIHdpdGggdGhlIHNhbWUgdGVzdCB0ZXh0IHVzZWQgZm9yIHRoZSBtVEhQIG9yZGVycy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBza2lwX2F0X3BtZF9vcmRlcihjb25zdCBjaGFyICpuYW1lKQomIzQzO3sKJiM0MzsJaWYgKGFub25fdGFyZ2V0X29yZGVyICZsdDsgaHBhZ2VfcG1kX29yZGVyKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoJiMzNDslczogbmVlZHMgYSB3aW5kb3cgYmVsb3cgdGhlIFBNRFxuJiMzNDssIG5hbWUpOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfZnVsbChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9wcykKJiM0Mzt7CiYjNDM7CXZvaWQgKnA7CiYjNDM7CiYjNDM7CXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiYjNDM7CW9wcy0mZ3Q7ZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwlpZiAoIXJhbmdlX25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7VW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxuJiMzNDspOwomIzQzOwomIzQzOwltYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtDb2xsYXBzZSBmdWxseSBwb3B1bGF0ZWQgUFRFIHRhYmxlIHRvIHRhcmdldCBvcmRlci4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAocmFuZ2VfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSkKJiM0MzsJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJZmFpbCgmIzM0O0ZhaWwmIzM0Oyk7CiYjNDM7CiYjNDM7CXZhbGlkYXRlX21lbW9yeShwLCAwLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX3NpbmdsZV93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsCiYjNDM7CQkJCQkgc3RydWN0IG1lbV9vcHMgKm9wcykKJiM0Mzt7CiYjNDM7CXNpemVfdCB3aW5kb3cgPSBhbm9uX29yZGVyX3NpemUoKTsKJiM0MzsJdm9pZCAqcDsKJiM0MzsKJiM0MzsJaWYgKHNraXBfYXRfcG1kX29yZGVyKF9fZnVuY19fKSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJcCA9IG9wcy0mZ3Q7c2V0dXBfYXJlYSgxKTsKJiM0MzsJb3BzLSZndDtmYXVsdChwLCB3aW5kb3csIDIgKiB3aW5kb3cpOwomIzQzOwlpZiAoIXJhbmdlX25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7VW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxuJiMzNDspOwomIzQzOwomIzQzOwltYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtDb2xsYXBzZSBvbmUgZnVsbHkgcG9wdWxhdGVkIHdpbmRvdy4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAocmFuZ2VfY29sbGFwc2VkKHAgJiM0Mzsgd2luZG93LCB3aW5kb3cpICZhbXA7JmFtcDsKJiM0MzsJCSByYW5nZV9ub3RfY29sbGFwc2VkKHAsIHdpbmRvdykgJmFtcDsmYW1wOwomIzQzOwkJIHJhbmdlX25vdF9jb2xsYXBzZWQocCAmIzQzOyAyICogd2luZG93LAomIzQzOwkJCQkgICAgIGhwYWdlX3BtZF9zaXplIC0gMiAqIHdpbmRvdykpCiYjNDM7CQlzdWNjZXNzKCYjMzQ7T0smIzM0Oyk7CiYjNDM7CWVsc2UKJiM0MzsJCWZhaWwoJiMzNDtGYWlsJiMzNDspOwomIzQzOwomIzQzOwl2YWxpZGF0ZV9tZW1vcnkocCwgd2luZG93LCAyICogd2luZG93KTsKJiM0MzsJb3BzLSZndDtjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgJiMzNDslc1xuJiMzNDssIF9fZnVuY19fKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsCiYjNDM7CQkJCQkgIHN0cnVjdCBtZW1fb3BzICpvcHMpCiYjNDM7ewomIzQzOwl2b2lkICpwOwomIzQzOwomIzQzOwlwID0gb3BzLSZndDtzZXR1cF9hcmVhKDEpOwomIzQzOwlvcHMtJmd0O2ZhdWx0KHAsIDAsIHBhZ2Vfc2l6ZSk7CiYjNDM7CWlmICghcmFuZ2Vfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XG4mIzM0Oyk7CiYjNDM7CiYjNDM7CW1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0NvbGxhcHNlIHdpbmRvdyB3aXRoIHNpbmdsZSBQVEUgZW50cnkgcHJlc2VudC4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAocmFuZ2VfY29sbGFwc2VkKHAsIGFub25fb3JkZXJfc2l6ZSgpKSkKJiM0MzsJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJZmFpbCgmIzM0O0ZhaWwmIzM0Oyk7CiYjNDM7CiYjNDM7CXZhbGlkYXRlX21lbW9yeShwLCAwLCBwYWdlX3NpemUpOwomIzQzOwlvcHMtJmd0O2NsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CWtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCAmIzM0OyVzXG4mIzM0OywgX19mdW5jX18pOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9tYXhfcHRlc19ub25lKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLAomIzQzOwkJCQkJIHN0cnVjdCBtZW1fb3BzICpvcHMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7CiYjNDM7CXNpemVfdCB3aW5kb3cgPSBhbm9uX29yZGVyX3NpemUoKTsKJiM0MzsJdm9pZCAqcDsKJiM0MzsKJiM0MzsJaWYgKHNraXBfYXRfcG1kX29yZGVyKF9fZnVuY19fKSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gMDsKJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiYjNDM7CW9wcy0mZ3Q7ZmF1bHQocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7CiYjNDM7CWlmICghcmFuZ2Vfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XG4mIzM0Oyk7CiYjNDM7CiYjNDM7CW1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0NvbGxhcHNlIGZ1bGwgd2luZG93LCBub3QgdGhlIG9uZSBtaXNzaW5nIGEgcGFnZS4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAocmFuZ2VfY29sbGFwc2VkKHAsIHdpbmRvdykgJmFtcDsmYW1wOwomIzQzOwkJIHJhbmdlX25vdF9jb2xsYXBzZWQocCAmIzQzOyB3aW5kb3csIHdpbmRvdykpCiYjNDM7CQlzdWNjZXNzKCYjMzQ7T0smIzM0Oyk7CiYjNDM7CWVsc2UKJiM0MzsJCWZhaWwoJiMzNDtGYWlsJiMzNDspOwomIzQzOwomIzQzOwl2YWxpZGF0ZV9tZW1vcnkocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgJiMzNDslc1xuJiMzNDssIF9fZnVuY19fKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogU21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCB3aWxsIGNvbnNpZGVyIGZvciBtVEhQIGNvbGxhcHNlLiAqLwomIzQzOyNkZWZpbmUgTUlOX01USFBfT1JERVIgMgomIzQzOwomIzQzOy8qCiYjNDM7ICogQSByZWdpb24gYmFja2VkIGJ5IGxhcmdlIGZvbGlvcyBvZiBhIHNtYWxsZXIgb3JkZXIgaXMgYSB2YWxpZCBzb3VyY2UKJiM0MzsgKiBmb3IgY29sbGFwc2UgdG8gdGhlIHRhcmdldCBvcmRlcjoKJiM0MzsgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKCkgYWNjZXB0cyBhbnkgc291cmNlIGZvbGlvIG9mIGFuIG9yZGVyCiYjNDM7ICogc3RyaWN0bHkgYmVsb3cgdGhlIGNhbmRpZGF0ZSYjMzk7cy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLAomIzQzOwkJCQkJIHN0cnVjdCBtZW1fb3BzICpvcHMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7CiYjNDM7CWludCBzb3VyY2Vfb3JkZXIgPSBhbm9uX29yZGVyID8gYW5vbl9vcmRlciA6IE1JTl9NVEhQX09SREVSOwomIzQzOwl2b2lkICpwOwomIzQzOwomIzQzOwkvKiBTb3VyY2VzIG11c3QgYmUgYSBzdXBwb3J0ZWQgbVRIUCBvcmRlciBzdHJpY3RseSBiZWxvdyB0aGUgdGFyZ2V0LiAqLwomIzQzOwlpZiAoc291cmNlX29yZGVyICZndDs9IGFub25fdGFyZ2V0X29yZGVyIHx8CiYjNDM7CSAgICAhKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgJmFtcDsgKDFVTCAmbHQ7Jmx0OyBzb3VyY2Vfb3JkZXIpKSkgewomIzQzOwkJa3NmdF90ZXN0X3Jlc3VsdF9za2lwKCYjMzQ7JXM6IG5vIHNvdXJjZSBvcmRlciBiZWxvdyB0YXJnZXRcbiYjMzQ7LAomIzQzOwkJCQkgICAgICBfX2Z1bmNfXyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogRmF1bHQgdGhlIHdob2xlIHJlZ2lvbiBhcyBvcmRlci1Ac291cmNlX29yZGVyIGZvbGlvcy4gKi8KJiM0MzsJc2V0dGluZ3MuaHVnZXBhZ2VzW3NvdXJjZV9vcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7CiYjNDM7CXRocF9wdXNoX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzOwlwID0gb3BzLSZndDtzZXR1cF9hcmVhKDEpOwomIzQzOwlvcHMtJmd0O2ZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwomIzQzOwlpZiAoIWlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgaHBhZ2VfcG1kX3NpemUsIHNvdXJjZV9vcmRlciwKJiM0MzsJCQkJCSAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtSZWdpb24gbm90IGJhY2tlZCBieSBvcmRlci0lZCBmb2xpb3MgYWZ0ZXIgZmF1bHRcbiYjMzQ7LAomIzQzOwkJCQkgICBzb3VyY2Vfb3JkZXIpOwomIzQzOwomIzQzOwltYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtDb2xsYXBzZSByZWdpb24gYmFja2VkIGJ5IG9yZGVyLSVkIHNvdXJjZXMuLi4mIzM0OywKJiM0MzsJCSAgICAgICBzb3VyY2Vfb3JkZXIpOwomIzQzOwlpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSkKJiM0MzsJCWZhaWwoJiMzNDtUaW1lb3V0JiMzNDspOwomIzQzOwllbHNlIGlmIChyYW5nZV9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKQomIzQzOwkJc3VjY2VzcygmIzM0O09LJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlmYWlsKCYjMzQ7RmFpbCYjMzQ7KTsKJiM0MzsKJiM0MzsJdmFsaWRhdGVfbWVtb3J5KHAsIDAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJb3BzLSZndDtjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgJiMzNDslc1xuJiMzNDssIF9fZnVuY19fKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQogewogCWZwcmludGYoc3RkZXJyLCAmIzM0O1xuVXNhZ2U6IC4va2h1Z2VwYWdlZCBbT1BUSU9OU10gJmx0O3Rlc3QgdHlwZSZndDsgW2Rpcl1cblxuJiMzNDspOwpAQCAtMTEwMyw2ICYjNDM7MTQyNSwxMSBAQCBzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQogCWZwcmludGYoc3RkZXJyLAkmIzM0O1x0XHQtaDogVGhpcyBoZWxwIG1lc3NhZ2UuXG4mIzM0Oyk7CiAJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdC1zOiBtVEhQIHNpemUsIGV4cHJlc3NlZCBhcyBwYWdlIG9yZGVyLlxuJiMzNDspOwogCWZwcmludGYoc3RkZXJyLAkmIzM0O1x0XHQgICAgRGVmYXVsdHMgdG8gMC4gVXNlIHRoaXMgc2l6ZSBmb3IgYW5vbiBvciBzaG1lbSBhbGxvY2F0aW9ucy5cbiYjMzQ7KTsKJiM0MzsJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdC1vOiBjb2xsYXBzZSB0YXJnZXQgb3JkZXIgZm9yIGtodWdlcGFnZWQ6YW5vbi5cbiYjMzQ7KTsKJiM0MzsJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdCAgICBSdW5zIHRoZSBvcmRlci1wYXJhbWV0ZXJpemVkIGNvbGxhcHNlIGNhc2VzIGluc3RlYWRcbiYjMzQ7KTsKJiM0MzsJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdCAgICBvZiB0aGUgUE1EIGNhc2VzLlxuJiMzNDspOwomIzQzOwlmcHJpbnRmKHN0ZGVyciwJJiMzNDtcdFx0ICAgIFdpdGggLXMsIC1zIG5hbWVzIHRoZSBtVEhQIHNvdXJjZSBvcmRlciBmb3IgdGhlXG4mIzM0Oyk7CiYjNDM7CWZwcmludGYoc3RkZXJyLAkmIzM0O1x0XHQgICAgbWl4ZWQtc291cmNlIGNhc2UgKHNvdXJjZSBvcmRlciBiZWxvdyB0aGUgdGFyZ2V0KS5cbiYjMzQ7KTsKIAlleGl0KDEpOwogfQogCkBAIC0xMTEyLDE3ICYjNDM7MTQzOSwzMSBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCWNoYXIgKmJ1ZjsKIAljb25zdCBjaGFyICp0b2tlbjsKIAotCXdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICYjMzQ7czpoJiMzNDspKSAhPSAtMSkgewomIzQzOwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAmIzM0O3M6bzpoJiMzNDspKSAhPSAtMSkgewogCQlzd2l0Y2ggKG9wdCkgewogCQljYXNlICYjMzk7cyYjMzk7OgogCQkJYW5vbl9vcmRlciA9IGF0b2kob3B0YXJnKTsKIAkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O28mIzM5OzoKJiM0MzsJCQlhbm9uX3RhcmdldF9vcmRlciA9IGF0b2kob3B0YXJnKTsKJiM0MzsJCQlicmVhazsKIAkJY2FzZSAmIzM5O2gmIzM5OzoKIAkJZGVmYXVsdDoKIAkJCXVzYWdlKCk7CiAJCX0KIAl9CiAKJiM0MzsJLyoKJiM0MzsJICogLXMgYW5kIC1vIGNvbXBvc2U6IC1zIHRoZW4gbmFtZXMgdGhlIG1USFAgc291cmNlIG9yZGVyIGZvciB0aGUKJiM0MzsJICogbWl4ZWQtc291cmNlIGNhc2UsIHdoaWNoIG5lZWRzIGEgc291cmNlIHN0cmljdGx5IGJlbG93IHRoZQomIzQzOwkgKiB0YXJnZXQgKGFuZCBhdCBvciBhYm92ZSB0aGUgc21hbGxlc3QgbVRIUCBvcmRlcikuIEFsb25lLCAtcyBpcwomIzQzOwkgKiB0aGUgc291cmNlIG9yZGVyIGZvciB0aGUgZGVmYXVsdCBQTUQgc3VpdGU7IGFsb25lLCAtbyBpcyB0aGUKJiM0MzsJICogY29sbGFwc2UgdGFyZ2V0IGZvciB0aGUgb3JkZXItcGFyYW1ldGVyaXplZCBzdWl0ZS4KJiM0MzsJICovCiYjNDM7CWlmIChhbm9uX3RhcmdldF9vcmRlciAmYW1wOyZhbXA7IGFub25fb3JkZXIgJmFtcDsmYW1wOwomIzQzOwkgICAgKGFub25fb3JkZXIgJmx0OyBNSU5fTVRIUF9PUkRFUiB8fCBhbm9uX29yZGVyICZndDs9IGFub25fdGFyZ2V0X29yZGVyKSkKJiM0MzsJCXVzYWdlKCk7CiYjNDM7CiAJYXJndiAmIzQzOz0gb3B0aW5kOwogCWFyZ2MgLT0gb3B0aW5kOwogCkBAIC0xMjA3LDcgJiM0MzsxNTQ4LDYgQEAgc3RhdGljIGludCBucl90ZXN0X2Nhc2VzOwogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7Ci0JaW50IGhwYWdlX3BtZF9vcmRlcjsKIAlzdHJ1Y3QgdGhwX3NldHRpbmdzIGRlZmF1bHRfc2V0dGluZ3MgPSB7CiAJCS50aHBfZW5hYmxlZCA9IFRIUF9NQURWSVNFLAogCQkudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTLApAQCAtMTI0NCwxOCAmIzQzOzE1ODQsOTQgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCWhwYWdlX3BtZF9uciA9IGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOwogCWhwYWdlX3BtZF9vcmRlciA9IF9fYnVpbHRpbl9jdHooaHBhZ2VfcG1kX25yKTsKIAomIzQzOwkvKgomIzQzOwkgKiBUaGUgcGFnZSBjYWNoZSBjYXBzIGZvbGlvIG9yZGVyIGF0IE1BWF9QQUdFQ0FDSEVfT1JERVIsIHdoaWNoCiYjNDM7CSAqIHhhc19zcGxpdF9hbGxvYygpIHB1dHMgYmVsb3cgdGhlIFBNRCBvcmRlciBvbiBhcm02NCB3aXRoIDY0SyBwYWdlcy4KJiM0MzsJICogQSBQTUQtc2l6ZWQgcGFnZSBjYWNoZSBmb2xpbyBpcyB0aGVuIGltcG9zc2libGUsIHNvIHRoZSBrZXJuZWwKJiM0MzsJICogcmVmdXNlcyB0aGVzZSBjb2xsYXBzZXMgYnkgZGVzaWduIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIHRlc3QuCiYjNDM7CSAqLwomIzQzOwlpZiAoISh0aHBfc2htZW1fc3VwcG9ydGVkX29yZGVycygpICZhbXA7ICgxVUwgJmx0OyZsdDsgaHBhZ2VfcG1kX29yZGVyKSkpIHsKJiM0MzsJCWlmIChzaG1lbV9vcHMpIHsKJiM0MzsJCQlrc2Z0X3ByaW50X21zZygmIzM0O25vIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvOiBza2lwcGluZyBzaG1lbVxuJiMzNDspOwomIzQzOwkJCXNobWVtX29wcyA9IE5VTEw7CiYjNDM7CQl9CiYjNDM7CQlpZiAoZmluZm8udHlwZSA9PSBWTUFfU0hNRU0gJmFtcDsmYW1wOyByZWFkX29ubHlfZmlsZV9vcHMpIHsKJiM0MzsJCQlrc2Z0X3ByaW50X21zZygmIzM0O25vIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvOiBza2lwcGluZyB0bXBmcyBmaWxlXG4mIzM0Oyk7CiYjNDM7CQkJcmVhZF9vbmx5X2ZpbGVfb3BzID0gTlVMTDsKJiM0MzsJCQlyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSBOVUxMOwomIzQzOwkJCXJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSBOVUxMOwomIzQzOwkJfQomIzQzOwkJaWYgKCFhbm9uX29wcyAmYW1wOyZhbXA7ICFzaG1lbV9vcHMgJmFtcDsmYW1wOyAhcmVhZF9vbmx5X2ZpbGVfb3BzKQomIzQzOwkJCWtzZnRfZXhpdF9za2lwKCYjMzQ7Tm90aGluZyBsZWZ0IHRvIGNvbGxhcHNlIGludG9cbiYjMzQ7KTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoYW5vbl90YXJnZXRfb3JkZXIgJmFtcDsmYW1wOwomIzQzOwkgICAgISh0aHBfc3VwcG9ydGVkX29yZGVycygpICZhbXA7ICgxVUwgJmx0OyZsdDsgYW5vbl90YXJnZXRfb3JkZXIpKSkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7T3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXG4mIzM0OywKJiM0MzsJCQkgICAgICAgYW5vbl90YXJnZXRfb3JkZXIpOwomIzQzOwlpZiAoYW5vbl90YXJnZXRfb3JkZXIgJmd0OyBocGFnZV9wbWRfb3JkZXIpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDstbyB0YWtlcyBhdCBtb3N0IHRoZSBQTUQgb3JkZXJcbiYjMzQ7KTsKJiM0MzsKIAlkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IGhwYWdlX3BtZF9uciAtIDE7CiAJZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX3N3YXAgPSBocGFnZV9wbWRfbnIgLyA4OwogCWRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zaGFyZWQgPSBocGFnZV9wbWRfbnIgLyAyOwogCWRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID0gaHBhZ2VfcG1kX25yICogODsKIAlkZWZhdWx0X3NldHRpbmdzLmh1Z2VwYWdlc1tocGFnZV9wbWRfb3JkZXJdLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDsKLQlkZWZhdWx0X3NldHRpbmdzLmh1Z2VwYWdlc1thbm9uX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUzsKIAlkZWZhdWx0X3NldHRpbmdzLnNobWVtX2h1Z2VwYWdlc1tocGFnZV9wbWRfb3JkZXJdLmVuYWJsZWQgPSBTSE1FTV9JTkhFUklUOwotCWRlZmF1bHRfc2V0dGluZ3Muc2htZW1faHVnZXBhZ2VzW2Fub25fb3JkZXJdLmVuYWJsZWQgPSBTSE1FTV9BTFdBWVM7CiYjNDM7CS8qCiYjNDM7CSAqIFVuZGVyIC1vIHRoZSBvcmRlci1wYXJhbWV0ZXJpemVkIGNhc2VzIHdhbnQgb3JkZXItMCBzb3VyY2VzIGJ5CiYjNDM7CSAqIGRlZmF1bHQ7IHRoZSBtaXhlZC1zb3VyY2UgY2FzZSBlbmFibGVzIGl0cyBvd24gKHBvc3NpYmx5IC1zCiYjNDM7CSAqIHNlbGVjdGVkKSBzb3VyY2Ugb3JkZXIgbG9jYWxseS4gRW5hYmxpbmcgaXQgZ2xvYmFsbHkgaGVyZSB3b3VsZAomIzQzOwkgKiBtYWtlIGV2ZXJ5IGNhc2UgZmF1bHQgdGhhdCBvcmRlci4KJiM0MzsJICovCiYjNDM7CWlmICghYW5vbl90YXJnZXRfb3JkZXIpIHsKJiM0MzsJCWRlZmF1bHRfc2V0dGluZ3MuaHVnZXBhZ2VzW2Fub25fb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTOwomIzQzOwkJZGVmYXVsdF9zZXR0aW5ncy5zaG1lbV9odWdlcGFnZXNbYW5vbl9vcmRlcl0uZW5hYmxlZCA9IFNITUVNX0FMV0FZUzsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoYW5vbl90YXJnZXRfb3JkZXIpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBPbmx5IHRoZSB0YXJnZXQgb3JkZXIgbWF5IHByb2R1Y2UgbGFyZ2UgZm9saW9zLCBhbmQgb25seQomIzQzOwkJICogZnJvbSBraHVnZXBhZ2VkOiAmIzM0O2luaGVyaXQmIzM0OyB1bmRlciBlbmFibGVkPW1hZHZpc2Uga2VlcHMKJiM0MzsJCSAqIHByZS1NQURWX0hVR0VQQUdFIGZhdWx0cyBhdCBvcmRlciAwLgomIzQzOwkJICovCiYjNDM7CQlkZWZhdWx0X3NldHRpbmdzLmh1Z2VwYWdlc1tocGFnZV9wbWRfb3JkZXJdLmVuYWJsZWQgPSBUSFBfTkVWRVI7CiYjNDM7CQlkZWZhdWx0X3NldHRpbmdzLmh1Z2VwYWdlc1thbm9uX3RhcmdldF9vcmRlcl0uZW5hYmxlZCA9IFRIUF9JTkhFUklUOwomIzQzOwkJLyoKJiM0MzsJCSAqIE9yZGVyLXBhcmFtZXRlcml6ZWQgY2FzZXMgYXJlIGRyaXZlbiBzdHJpY3RseSBieSB0aGUKJiM0MzsJCSAqIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgYmFycmllciwgd2hpY2ggd2FrZXMgdGhlIGRhZW1vbgomIzQzOwkJICogaXRzZWxmLiBBIGxvbmcgc2Nhbl9zbGVlcCBrZWVwcyBraHVnZXBhZ2VkIGZyb20KJiM0MzsJCSAqIGZyZWUtcnVubmluZyBiZXR3ZWVuIGJhcnJpZXIgc3RlcHMsIGFuZCBhIHBhZ2VzX3RvX3NjYW4KJiM0MzsJCSAqIGNvdmVyaW5nIGV2ZXJ5dGhpbmcgbWFrZXMgb25lIHdha2UgY29tcGxldGUgb25lIGZ1bGwKJiM0MzsJCSAqIHBhc3MgKHRoZSBiYXJyaWVyJiMzOTtzIGNvbnRyYWN0KSwgc28gYSBydW4gcGVyZm9ybXMgYQomIzQzOwkJICogZGV0ZXJtaW5pc3RpYyBudW1iZXIgb2YgcGFzc2VzIOKAlCB3aGF0IHRoZSBzdGFnZSBBL0IKJiM0MzsJCSAqIHRyYWNlIGNvbXBhcmlzb25zIHJlbHkgb24uCiYjNDM7CQkgKi8KJiM0MzsJCWRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5zY2FuX3NsZWVwX21pbGxpc2VjcyA9IDYwMDAwOwomIzQzOwkJZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSAxVUwgJmx0OyZsdDsgMjQ7CiYjNDM7CiYjNDM7CQlwYWdlbWFwX2ZkID0gb3BlbigmIzM0Oy9wcm9jL3NlbGYvcGFnZW1hcCYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CQlpZiAocGFnZW1hcF9mZCAmbHQ7IDApCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7b3BlbihcJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXBcJiMzNDspJiMzNDspOwomIzQzOwkJa3BhZ2VmbGFnc19mZCA9IG9wZW4oJiMzNDsvcHJvYy9rcGFnZWZsYWdzJiMzNDssIE9fUkRPTkxZKTsKJiM0MzsJCWlmIChrcGFnZWZsYWdzX2ZkICZsdDsgMCkKJiM0MzsJCQlrc2Z0X2V4aXRfc2tpcCgmIzM0O29wZW4oXCYjMzQ7L3Byb2Mva3BhZ2VmbGFnc1wmIzM0OykgcmVxdWlyZXMgcm9vdFxuJiMzNDspOwomIzQzOwl9CiAKIAlzYXZlX3NldHRpbmdzKCk7CiAJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtkZWZhdWx0X3NldHRpbmdzKTsKIAomIzQzOwlpZiAoYW5vbl90YXJnZXRfb3JkZXIpIHsKJiM0MzsJCVRFU1QoY29sbGFwc2Vfb3JkZXJfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX29yZGVyX3NpbmdsZV93aW5kb3csIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpOwomIzQzOwkJVEVTVChjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdywga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUsIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpOwomIzQzOwkJVEVTVChjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsKJiM0MzsJCWtzZnRfc2V0X3BsYW4obnJfdGVzdF9jYXNlcyk7CiYjNDM7CQlnb3RvIHJ1bjsKJiM0MzsJfQomIzQzOwogCVRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiAJVEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7CiAJVEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7CkBAIC0xMzI0LDYgJiM0MzsxNzQwLDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCVRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKIAlURVNUKGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7CiAKJiM0MzsJVEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsJVEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsKIAlURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7CiAJVEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTsKIAlURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpOwpAQCAtMTMzNiw2ICYjNDM7MTc1NSw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIAlrc2Z0X3NldF9wbGFuKG5yX3Rlc3RfY2FzZXMgJiM0MzsgMSk7CiAKIAlhbGxvY19hdF9mYXVsdCgpOwomIzQzO3J1bjoKIAlmb3IgKGludCBpID0gMDsgaSAmbHQ7IG5yX3Rlc3RfY2FzZXM7IGkmIzQzOyYjNDM7KSB7CiAJCXN0cnVjdCB0ZXN0X2Nhc2UgKnQgPSAmYW1wO3Rlc3RfY2FzZXNbaV07CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uMmFhNDVjOWU4YTc3ZgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jCkBAIC0wLDAgJiM0MzsxLDQ4MyBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBraHVnZXBhZ2VkIHJhY2UgaGFybmVzcy4KJiM0MzsgKgomIzQzOyAqIFJ1bnMgY29sbGFwc2UgYWdhaW5zdCBjb25jdXJyZW50IGZhdWx0cywgdHJhbnNpZW50IEdVUCBwaW5zCiYjNDM7ICogKGd1cF90ZXN0KSwgZm9yaywgbXJlbWFwIGFuZCBNQURWX0RPTlRORUVEIG92ZXIgdGhlIHNhbWUgcmFuZ2VzLCBpbgomIzQzOyAqIG9uZSBvZiB0aHJlZSBkcml2ZXIgbW9kZXM6CiYjNDM7ICoKJiM0MzsgKiAgIHN0ZXBwZWQJa2h1Z2VwYWdlZCwgZHJpdmVuIHN5bmNocm9ub3VzbHkgb25lIGZ1bGwgcGFzcyBhdCBhIHRpbWUKJiM0MzsgKgkJdGhyb3VnaCBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIOKAlCB0aGUgcHJpbWFyeSBkcml2ZXI6IHRoZQomIzQzOyAqCQlmdWxsIHNjYW4mIzQzO2NvbGxhcHNlIHBhdGggd2l0aCBhIGRldGVybWluaXN0aWMgZXh0ZW50IHBlcgomIzQzOyAqCQlzdGVwOwomIzQzOyAqICAgZnJlZQlmcmVlLXJ1bm5pbmcga2h1Z2VwYWdlZCAoc2Nhbl9zbGVlcF9taWxsaXNlY3M9MCkg4oCUIHRoZQomIzQzOyAqCQlzb2FrOwomIzQzOyAqICAgbWFkdmlzZQlNQURWX0NPTExBUFNFIGluIGEgbG9vcCDigJQgdGhlIGxlZ2FjeS1QTUQgcmVncmVzc2lvbgomIzQzOyAqCQlheGlzLgomIzQzOyAqCiYjNDM7ICogQWxsIGFub24gVEhQIG9yZGVycyBhcmUgZW5hYmxlZCAoaW5oZXJpdCkuIG1heF9wdGVzX25vbmUgaXMgMCBieQomIzQzOyAqIGRlZmF1bHQg4oCUIHJhY2luZyBNQURWX0RPTlRORUVEIHRoZW4gc3RlZXJzIHNlbGVjdGlvbiBhY3Jvc3Mgb3JkZXJzIOKAlAomIzQzOyAqIG9yIHRoZSBwZXJtaXNzaXZlIGxpbWl0IHdpdGggLXosIHdoaWNoIGZsb29kcyB0aGUgYmF0Y2ggZW5naW5lIHdpdGgKJiM0MzsgKiBob2xlIGFuZCB6ZXJvcGFnZSBzbG90cyBzbyB0aGUgcG9wdWxhdGlvbiBwYXRocyAocGFyay10aW1lIHplcm9wYWdlCiYjNDM7ICogY2xlYXIsIHplcm8tZmlsbGVkIGNvcHksIGluc3RhbGwtdGltZSBwdGVfbm9uZSgpIHZlcmlmeSBhbmQgYWJvcnQpCiYjNDM7ICogcmFjZSB0aGUgZmF1bHRlcnMgZGlyZWN0bHkuCiYjNDM7ICoKJiM0MzsgKiAtcCBhZGRzIG1lbW9yeSBwcmVzc3VyZSB0byBhbnkgb2YgdGhlIGFib3ZlOiBNQURWX1BBR0VPVVQgY3ljbGluZwomIzQzOyAqIG9uIGEgZGVkaWNhdGVkIG5laWdoYm9yIHJlZ2lvbiAoc3dhcCB0cmFmZmljIGFuZCBMUlUgY2h1cm47IHNraXBwZWQKJiM0MzsgKiB3aXRoIGEgbm90ZSB3aGVuIHRoZSBob3N0IGhhcyBubyBzd2FwKSBhbmQgYSBjb21wYWN0X21lbW9yeSB0cmlnZ2VyCiYjNDM7ICogbG9vcCAoY29tcGFjdGlvbiBtaWdyYXRlcyBzb3VyY2UgZm9saW9zLCByYWNpbmcgY29sbGFwc2UmIzM5O3MgZnJlZXplCiYjNDM7ICogd2l0aCByZWZjb3VudCBlbGV2YXRpb24gYW5kIG1pZ3JhdGlvbiBlbnRyaWVzIG9mIGl0cyBvd24pLgomIzQzOyAqCiYjNDM7ICogQ29ycmVjdG5lc3Mgc2lnbmFsczogZXZlcnkgcmFjaW5nIHBhZ2UgbXVzdCByZWFkIGFzIGl0cyBwYXR0ZXJuIG9yCiYjNDM7ICogemVybyAoTUFEVl9ET05UTkVFRCksIG5ldmVyIGFueXRoaW5nIGVsc2Ug4oCUIGNoZWNrZWQgY29udGludW91c2x5IGJ5CiYjNDM7ICogdGhlIGZhdWx0ZXJzIGFuZCB0aGUgZm9yayBjaGlsZHJlbiBhbmQgb25jZSBhdCB0aGUgZW5kIOKAlCBwbHVzCiYjNDM7ICogd2hhdGV2ZXIgREVCVUdfVk0gLyBwYWdlX3RhYmxlX2NoZWNrIC8gS0FTQU4gLyBsb2NrZGVwIHJlcG9ydCBpbgomIzQzOyAqIGRtZXNnLCB3aGljaCB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGluc3BlY3QuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRQomIzQzOyNpbmNsdWRlICZsdDtlcnJuby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtwdGhyZWFkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL2lvY3RsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy90aW1lLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy93YWl0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3VuaXN0ZC5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7a3NlbGZ0ZXN0LmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7dm1fdXRpbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2h1Z2VwYWdlX3NldHRpbmdzLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Li4vLi4vLi4vLi4vbW0vZ3VwX3Rlc3QuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBCQVNFX0FERFIJKCh2b2lkICopKDFVTCAmbHQ7Jmx0OyAzMCkpCiYjNDM7LyoKJiM0MzsgKiBTaGFyZWQgcGxheWdyb3VuZCBmb3IgZmF1bHRzL3BpbnMvZm9yay9kb250bmVlZDogc2V2ZXJhbCBQTUQtc2l6ZWQKJiM0MzsgKiBhcmVhcyB0aGUgcmFjaW5nIHRocmVhZHMgc3ByZWFkIGFjcm9zcywgcGx1cyBvbmUgYXJlYSBvd25lZCBieSB0aGUKJiM0MzsgKiBtcmVtYXAgdGhyZWFkLiBNb3JlIGFyZWFzIG1lYW5zIG1vcmUgaW5kZXBlbmRlbnQgcmVnaW9ucyBjb2xsYXBzaW5nCiYjNDM7ICogYXQgb25jZTsgdGhlIGRlZmF1bHQgc3VpdHMgYSBub3JtYWwgbWFjaGluZS4gT24gYSBtZW1vcnktY29uc3RyYWluZWQKJiM0MzsgKiBob3N0IC0tIG9yIHVuZGVyIGVtdWxhdGlvbiwgd2hlcmUgYSA1MTJNIFBNRCAoYXJtNjQvNjRLKSBtYWtlcyB0aGUKJiM0MzsgKiBkZWZhdWx0IHBsYXlncm91bmQgbXVsdGktZ2lnYWJ5dGUgLS0gcGFzcyAtYSB0byBzaHJpbmsgaXQuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBERUZBVUxUX1NIQVJFRF9BUkVBUwkzCiYjNDM7c3RhdGljIGludCBucl9zaGFyZWRfYXJlYXM7CiYjNDM7c3RhdGljIGludCBucl9hcmVhczsKJiM0MzsKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTsKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7CiYjNDM7c3RhdGljIGNoYXIgKnJlZ2lvbjsJCS8qIE5SX0FSRUFTICogaHBhZ2VfcG1kX3NpemUgKi8KJiM0MztzdGF0aWMgY2hhciAqbXJlbWFwX2FyZWE7CS8qIHJlZ2lvbiAmIzQzOyBOUl9TSEFSRURfQVJFQVMgYXJlYXMgKi8KJiM0MztzdGF0aWMgY2hhciAqbXJlbWFwX3NjcmF0Y2g7CS8qIHdlbGwgYWJvdmUgdGhlIHJlZ2lvbiAqLwomIzQzO3N0YXRpYyBjaGFyICpwYWdlb3V0X2FyZWE7CS8qIC1wOiBkZWRpY2F0ZWQgcHJlc3N1cmUgcmVnaW9uICovCiYjNDM7c3RhdGljIHNpemVfdCBwYWdlb3V0X3NpemU7CiYjNDM7c3RhdGljIGludCBndXBfZmQgPSAtMTsKJiM0MztzdGF0aWMgdm9sYXRpbGUgaW50IHN0b3A7CiYjNDM7c3RhdGljIHZvbGF0aWxlIGludCBjb3JydXB0ZWQ7CiYjNDM7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGludCBwYXR0ZXJuKHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgdmFsID0gKHVuc2lnbmVkIGludClwYWdlX2lkeCAqIDI2NTQ0MzU3NjFVOwomIzQzOwomIzQzOwlyZXR1cm4gdmFsID8gdmFsIDogMTsJLyogbmV2ZXIgY29sbGlkZXMgd2l0aCB0aGUgemVyby1maWxsICovCiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNoZWNrX3BhZ2UodW5zaWduZWQgbG9uZyBwYWdlX2lkeCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCB2YWwgPSAqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUpOwomIzQzOwomIzQzOwlpZiAodmFsICZhbXA7JmFtcDsgdmFsICE9IHBhdHRlcm4ocGFnZV9pZHgpKSB7CiYjNDM7CQljb3JydXB0ZWQgPSAxOwomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtDb3JydXB0aW9uIGF0IHBhZ2UgJWx1OiAlI3ggIT0gJSN4XG4mIzM0OywKJiM0MzsJCQkgICAgICAgcGFnZV9pZHgsIHZhbCwgcGF0dGVybihwYWdlX2lkeCkpOwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHJhbmRfcGFnZSh1bnNpZ25lZCBpbnQgKnNlZWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcmFuZF9yKHNlZWQpICUKJiM0MzsJICAgICAgIChucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICpmYXVsdGVyX2ZuKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnOwomIzQzOwomIzQzOwl3aGlsZSAoIXN0b3ApIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoJmFtcDtzZWVkKTsKJiM0MzsKJiM0MzsJCWlmIChyYW5kX3IoJmFtcDtzZWVkKSAmYW1wOyAxKQomIzQzOwkJCSoodW5zaWduZWQgaW50ICopKHJlZ2lvbiAmIzQzOyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSkgPQomIzQzOwkJCQlwYXR0ZXJuKHBhZ2VfaWR4KTsKJiM0MzsJCWVsc2UKJiM0MzsJCQljaGVja19wYWdlKHBhZ2VfaWR4KTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKmRvbnRuZWVkX2ZuKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnOwomIzQzOwomIzQzOwl3aGlsZSAoIXN0b3ApIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoJmFtcDtzZWVkKTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgbnIgPSAxVUwgJmx0OyZsdDsgKHJhbmRfcigmYW1wO3NlZWQpICUgNik7CS8qIDEuLjMyIHBhZ2VzICovCiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogT25jZSBpbiBhIHdoaWxlIHphcCBhIHdob2xlIFBNRC1hbGlnbmVkIGFyZWE6IG9ubHkgYQomIzQzOwkJICogemFwIHNwYW5uaW5nIHRoZSBmdWxsIHRhYmxlIHRyaWdnZXJzIHRoZSBlbXB0eS10YWJsZQomIzQzOwkJICogcmVjbGFpbSAoQ09ORklHX1BUX1JFQ0xBSU0pLCB3aGljaCBjYW4gZnJlZSBhIHRhYmxlCiYjNDM7CQkgKiBvdXQgZnJvbSB1bmRlciBhIHBhcmtlZCBjb2xsYXBzZSDigJQgc3ViLXRhYmxlIHphcHMKJiM0MzsJCSAqIG5ldmVyIHJlYWNoIHRoYXQgcGF0aC4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKCEocmFuZF9yKCZhbXA7c2VlZCkgJSA2NCkpIHsKJiM0MzsJCQl1bnNpZ25lZCBsb25nIGFyZWEgPSBwYWdlX2lkeCAvCiYjNDM7CQkJCQkoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpOwomIzQzOwomIzQzOwkJCW1hZHZpc2UocmVnaW9uICYjNDM7IGFyZWEgKiBocGFnZV9wbWRfc2l6ZSwKJiM0MzsJCQkJaHBhZ2VfcG1kX3NpemUsIE1BRFZfRE9OVE5FRUQpOwomIzQzOwkJfSBlbHNlIHsKJiM0MzsJCQltYWR2aXNlKHJlZ2lvbiAmIzQzOyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSwKJiM0MzsJCQkJbnIgKiBwYWdlX3NpemUsIE1BRFZfRE9OVE5FRUQpOwomIzQzOwkJfQomIzQzOwkJdXNsZWVwKHJhbmRfcigmYW1wO3NlZWQpICUgNTAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKnBpbm5lcl9mbih2b2lkICphcmcpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZzsKJiM0MzsKJiM0MzsJd2hpbGUgKCFzdG9wKSB7CiYjNDM7CQlzdHJ1Y3QgZ3VwX3Rlc3QgZ3VwID0ge307CiYjNDM7CQl1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKCZhbXA7c2VlZCk7CiYjNDM7CiYjNDM7CQlndXAuYWRkciA9ICh1bnNpZ25lZCBsb25nKShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUpOwomIzQzOwkJZ3VwLnNpemUgPSAxNiAqIHBhZ2Vfc2l6ZTsKJiM0MzsJCWd1cC5ucl9wYWdlc19wZXJfY2FsbCA9IDE2OwomIzQzOwkJZ3VwLmd1cF9mbGFncyA9IDE7CS8qIEZPTExfV1JJVEUgKi8KJiM0MzsJCS8qIFJhY2luZyBNQURWX0RPTlRORUVEIG1ha2VzIHRyYW5zaWVudCBmYWlsdXJlcyBleHBlY3RlZC4gKi8KJiM0MzsJCWlvY3RsKGd1cF9mZCwgUElOX0ZBU1RfQkVOQ0hNQVJLLCAmYW1wO2d1cCk7CiYjNDM7CQl1c2xlZXAocmFuZF9yKCZhbXA7c2VlZCkgJSAyMDApOwomIzQzOwl9CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCAqZm9ya2VyX2ZuKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnOwomIzQzOwomIzQzOwl3aGlsZSAoIXN0b3ApIHsKJiM0MzsJCXBpZF90IHBpZCA9IGZvcmsoKTsKJiM0MzsKJiM0MzsJCWlmIChwaWQgPT0gMCkgewomIzQzOwkJCWZvciAoaW50IGkgPSAwOyBpICZsdDsgMTY7IGkmIzQzOyYjNDM7KQomIzQzOwkJCQljaGVja19wYWdlKHJhbmRfcGFnZSgmYW1wO3NlZWQpKTsKJiM0MzsJCQlfZXhpdChjb3JydXB0ZWQpOwomIzQzOwkJfQomIzQzOwkJaWYgKHBpZCAmZ3Q7IDApIHsKJiM0MzsJCQlpbnQgd3N0YXR1czsKJiM0MzsKJiM0MzsJCQl3YWl0cGlkKHBpZCwgJmFtcDt3c3RhdHVzLCAwKTsKJiM0MzsJCQlpZiAoV0lGRVhJVEVEKHdzdGF0dXMpICZhbXA7JmFtcDsgV0VYSVRTVEFUVVMod3N0YXR1cykpCiYjNDM7CQkJCWNvcnJ1cHRlZCA9IDE7CiYjNDM7CQl9CiYjNDM7CQl1c2xlZXAocmFuZF9yKCZhbXA7c2VlZCkgJSAyMDAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKm1yZW1hcHBlcl9mbih2b2lkICphcmcpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZzsKJiM0MzsKJiM0MzsJd2hpbGUgKCFzdG9wKSB7CiYjNDM7CQl2b2lkICpwOwomIzQzOwomIzQzOwkJcCA9IG1yZW1hcChtcmVtYXBfYXJlYSwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLAomIzQzOwkJCSAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfc2NyYXRjaCk7CiYjNDM7CQlpZiAocCA9PSBNQVBfRkFJTEVEKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21yZW1hcCgpIGF3YXkmIzM0Oyk7CiYjNDM7CQlmb3IgKGludCBpID0gMDsgaSAmbHQ7IDg7IGkmIzQzOyYjNDM7KQomIzQzOwkJCW1yZW1hcF9zY3JhdGNoWyhyYW5kX3IoJmFtcDtzZWVkKSAlCiYjNDM7CQkJCShocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkpICogcGFnZV9zaXplXSA9IDE7CiYjNDM7CQlwID0gbXJlbWFwKG1yZW1hcF9zY3JhdGNoLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsCiYjNDM7CQkJICAgTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQsIG1yZW1hcF9hcmVhKTsKJiM0MzsJCWlmIChwID09IE1BUF9GQUlMRUQpCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bXJlbWFwKCkgYmFjayYjMzQ7KTsKJiM0MzsJCXVzbGVlcChyYW5kX3IoJmFtcDtzZWVkKSAlIDIwMDApOwomIzQzOwl9CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIC1wOiBzd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybiBvbiBhIHJlZ2lvbiBvZiBvdXIgb3duLiBUaGUgY29udGVudAomIzQzOyAqIGNoZWNrIGlzIGV4YWN0IOKAlCBhIHBhZ2Ugb3V0IGFuZCBiYWNrIHRocm91Z2ggc3dhcCBtdXN0IHByZXNlcnZlIHRoZQomIzQzOyAqIHBhdHRlcm4sIGFuZCBub3RoaW5nIGVsc2UgZXZlciB3cml0ZXMgaGVyZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCAqcGFnZW91dF9mbih2b2lkICphcmcpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZzsKJiM0MzsJdW5zaWduZWQgbG9uZyBuciA9IHBhZ2VvdXRfc2l6ZSAvIHBhZ2Vfc2l6ZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnI7IGkmIzQzOyYjNDM7KQomIzQzOwkJKih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICYjNDM7IGkgKiBwYWdlX3NpemUpID0gcGF0dGVybihpKTsKJiM0MzsKJiM0MzsJd2hpbGUgKCFzdG9wKSB7CiYjNDM7CQltYWR2aXNlKHBhZ2VvdXRfYXJlYSwgcGFnZW91dF9zaXplLCBNQURWX1BBR0VPVVQpOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5yICZhbXA7JmFtcDsgIXN0b3A7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJdW5zaWduZWQgaW50IHZhbCA9ICoodW5zaWduZWQgaW50ICopKHBhZ2VvdXRfYXJlYSAmIzQzOwomIzQzOwkJCQkJCQkgICAgIGkgKiBwYWdlX3NpemUpOwomIzQzOwomIzQzOwkJCWlmICh2YWwgIT0gcGF0dGVybihpKSkgewomIzQzOwkJCQljb3JydXB0ZWQgPSAxOwomIzQzOwkJCQlrc2Z0X3ByaW50X21zZygmIzM0O1BhZ2VvdXQgY29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxuJiMzNDssCiYjNDM7CQkJCQkgICAgICAgaSwgdmFsLCBwYXR0ZXJuKGkpKTsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CQl1c2xlZXAocmFuZF9yKCZhbXA7c2VlZCkgJSAyMDAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLXA6IGNvbXBhY3Rpb24gbWlncmF0ZXMgdGhlIGNvbGxhcHNlIHNvdXJjZXMgb3V0IGZyb20gdW5kZXIgdXMuICovCiYjNDM7c3RhdGljIHZvaWQgKmNvbXBhY3Rvcl9mbih2b2lkICphcmcpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZzsKJiM0MzsJaW50IGZkID0gb3BlbigmIzM0Oy9wcm9jL3N5cy92bS9jb21wYWN0X21lbW9yeSYjMzQ7LCBPX1dST05MWSk7CiYjNDM7CiYjNDM7CWlmIChmZCAmbHQ7IDApIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7Tm8gY29tcGFjdF9tZW1vcnk7IGNvbXBhY3RvciBpZGxlXG4mIzM0Oyk7CiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJfQomIzQzOwl3aGlsZSAoIXN0b3ApIHsKJiM0MzsJCWlmICh3cml0ZShmZCwgJiMzNDsxJiMzNDssIDEpICZsdDsgMCkKJiM0MzsJCQlicmVhazsKJiM0MzsJCXVzbGVlcCgxMDAwMCAmIzQzOyByYW5kX3IoJmFtcDtzZWVkKSAlIDEwMDAwMCk7CiYjNDM7CX0KJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgc3dhcF9hdmFpbGFibGUodm9pZCkKJiM0Mzt7CiYjNDM7CWNoYXIgbGluZVsyNTZdOwomIzQzOwlpbnQgbGluZXMgPSAwOwomIzQzOwlGSUxFICpmcCA9IGZvcGVuKCYjMzQ7L3Byb2Mvc3dhcHMmIzM0OywgJiMzNDtyJiMzNDspOwomIzQzOwomIzQzOwlpZiAoIWZwKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpCiYjNDM7CQlsaW5lcyYjNDM7JiM0Mzs7CiYjNDM7CWZjbG9zZShmcCk7CiYjNDM7CXJldHVybiBsaW5lcyAmZ3Q7IDE7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIG5vd19tcyh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHRpbWV2YWwgdHY7CiYjNDM7CiYjNDM7CWdldHRpbWVvZmRheSgmYW1wO3R2LCBOVUxMKTsKJiM0MzsJcmV0dXJuIHR2LnR2X3NlYyAqIDEwMDBVTCAmIzQzOyB0di50dl91c2VjIC8gMTAwMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKJiM0Mzt7CiYjNDM7CWZwcmludGYoc3RkZXJyLAomIzQzOwkJJiMzNDtVc2FnZToga2h1Z2VwYWdlZF9yYWNlIFstZCBzZWNvbmRzXSBbLW0gc3RlcHBlZHxmcmVlfG1hZHZpc2VdIFstel0gWy1wXSBbLWEgYXJlYXNdXG4mIzM0OwomIzQzOwkJJiMzNDtcdC16OiBwZXJtaXNzaXZlIG1heF9wdGVzX25vbmUgKGhvbGUtaGVhdnkgd2luZG93cylcbiYjMzQ7CiYjNDM7CQkmIzM0O1x0LXA6IG1lbW9yeSBwcmVzc3VyZSAocGFnZW91dCAmIzQzOyBjb21wYWN0aW9uKSB0aHJlYWRzXG4mIzM0OwomIzQzOwkJJiMzNDtcdC1hOiBudW1iZXIgb2Ygc2hhcmVkIFBNRC1zaXplZCBwbGF5Z3JvdW5kIGFyZWFzIChkZWZhdWx0IDMpXG4mIzM0Oyk7CiYjNDM7CWV4aXQoMSk7CiYjNDM7fQomIzQzOwomIzQzO2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKJiM0Mzt7CiYjNDM7CXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGhyZWFkX25hbWVzW10gPSB7CiYjNDM7CQkmIzM0O2ZhdWx0ZXImIzM0OywgJiMzNDtmYXVsdGVyMiYjMzQ7LCAmIzM0O2RvbnRuZWVkJiMzNDssICYjMzQ7cGlubmVyJiMzNDssICYjMzQ7Zm9ya2VyJiMzNDssCiYjNDM7CQkmIzM0O21yZW1hcHBlciYjMzQ7LCAmIzM0O3BhZ2VvdXQmIzM0OywgJiMzNDtjb21wYWN0b3ImIzM0OywKJiM0MzsJfTsKJiM0MzsJdm9pZCAqKCpjb25zdCB0aHJlYWRfZm5zW10pKHZvaWQgKikgPSB7CiYjNDM7CQlmYXVsdGVyX2ZuLCBmYXVsdGVyX2ZuLCBkb250bmVlZF9mbiwgcGlubmVyX2ZuLCBmb3JrZXJfZm4sCiYjNDM7CQltcmVtYXBwZXJfZm4sIHBhZ2VvdXRfZm4sIGNvbXBhY3Rvcl9mbiwKJiM0MzsJfTsKJiM0MzsJY29uc3QgdW5zaWduZWQgbG9uZyBwYWdlb3V0X2JpdCA9IDFVTCAmbHQ7Jmx0OyA2LCBjb21wYWN0b3JfYml0ID0gMVVMICZsdDsmbHQ7IDc7CiYjNDM7CWNvbnN0IGludCBucl90aHJlYWRzID0gQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpOwomIzQzOwlwdGhyZWFkX3QgdGhyZWFkc1tBUlJBWV9TSVpFKHRocmVhZF9uYW1lcyldOwomIzQzOwljb25zdCBjaGFyICptb2RlID0gJiMzNDtzdGVwcGVkJiMzNDs7CiYjNDM7CXN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZW5kX21zOwomIzQzOwlpbnQgZHVyYXRpb25fcyA9IDEwOwomIzQzOwl1bnNpZ25lZCBsb25nIHRocmVhZF9tYXNrID0gfjBVTDsKJiM0MzsJaW50IG5yX2FyZWFzX2FyZyA9IDA7CiYjNDM7CWJvb2wgcGVybWlzc2l2ZV9ub25lID0gZmFsc2U7CiYjNDM7CWJvb2wgcHJlc3N1cmUgPSBmYWxzZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBpOwomIzQzOwlpbnQgc3RlcHMgPSAwOwomIzQzOwlpbnQgb3B0OwomIzQzOwomIzQzOwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAmIzM0O2E6ZDptOnQ6enBoJiMzNDspKSAhPSAtMSkgewomIzQzOwkJc3dpdGNoIChvcHQpIHsKJiM0MzsJCWNhc2UgJiMzOTthJiMzOTs6CiYjNDM7CQkJbnJfYXJlYXNfYXJnID0gYXRvaShvcHRhcmcpOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O2QmIzM5OzoKJiM0MzsJCQlkdXJhdGlvbl9zID0gYXRvaShvcHRhcmcpOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O20mIzM5OzoKJiM0MzsJCQltb2RlID0gb3B0YXJnOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O3QmIzM5OzoKJiM0MzsJCQkvKiBkZWJ1ZzogYml0bWFzayBvZiByYWNpbmcgdGhyZWFkcyB0byBzdGFydCAqLwomIzQzOwkJCXRocmVhZF9tYXNrID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDApOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O3omIzM5OzoKJiM0MzsJCQlwZXJtaXNzaXZlX25vbmUgPSB0cnVlOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O3AmIzM5OzoKJiM0MzsJCQlwcmVzc3VyZSA9IHRydWU7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlkZWZhdWx0OgomIzQzOwkJCXVzYWdlKCk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJaWYgKHN0cmNtcChtb2RlLCAmIzM0O3N0ZXBwZWQmIzM0OykgJmFtcDsmYW1wOyBzdHJjbXAobW9kZSwgJiMzNDtmcmVlJiMzNDspICZhbXA7JmFtcDsKJiM0MzsJICAgIHN0cmNtcChtb2RlLCAmIzM0O21hZHZpc2UmIzM0OykpCiYjNDM7CQl1c2FnZSgpOwomIzQzOwomIzQzOwlrc2Z0X3ByaW50X2hlYWRlcigpOwomIzQzOwlpZiAoIXRocF9hdmFpbGFibGUoKSkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKTsKJiM0MzsJaHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpOwomIzQzOwlpZiAoIWhwYWdlX3BtZF9zaXplKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7UmVhZGluZyBQTUQgcGFnZXNpemUgZmFpbGVkXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CWd1cF9mZCA9IG9wZW4oJiMzNDsvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdCYjMzQ7LCBPX1JEV1IpOwomIzQzOwlpZiAoZ3VwX2ZkICZsdDsgMCkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7L3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgcmVxdWlyZXMgQ09ORklHX0dVUF9URVNUIGFuZCByb290XG4mIzM0Oyk7CiYjNDM7CiYjNDM7CW5yX3NoYXJlZF9hcmVhcyA9IG5yX2FyZWFzX2FyZyAmZ3Q7IDAgPyBucl9hcmVhc19hcmcgOiBERUZBVUxUX1NIQVJFRF9BUkVBUzsKJiM0MzsJbnJfYXJlYXMgPSBucl9zaGFyZWRfYXJlYXMgJiM0MzsgMTsKJiM0MzsKJiM0MzsJaWYgKCFwcmVzc3VyZSkgewomIzQzOwkJdGhyZWFkX21hc2sgJmFtcDs9IH4ocGFnZW91dF9iaXQgfCBjb21wYWN0b3JfYml0KTsKJiM0MzsJfSBlbHNlIGlmICghc3dhcF9hdmFpbGFibGUoKSkgewomIzQzOwkJLyogTm8gc3dhcCwgbm8gYW5vbiByZWNsYWltOiBjb21wYWN0aW9uLW9ubHkgcHJlc3N1cmUuICovCiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0Oy1wIHdpdGhvdXQgc3dhcDogcGFnZW91dCB0aHJlYWQgZGlzYWJsZWRcbiYjMzQ7KTsKJiM0MzsJCXRocmVhZF9tYXNrICZhbXA7PSB+cGFnZW91dF9iaXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJa3NmdF9zZXRfcGxhbigxKTsKJiM0MzsKJiM0MzsJdGhwX3NhdmVfc2V0dGluZ3MoKTsKJiM0MzsJdGhwX3JlYWRfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CXNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7CiYjNDM7CXNldHRpbmdzLnRocF9kZWZyYWcgPSBUSFBfREVGUkFHX0FMV0FZUzsKJiM0MzsJc2V0dGluZ3Muc2htZW1fZW5hYmxlZCA9IFNITUVNX05FVkVSOwomIzQzOwlzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7CiYjNDM7CXNldHRpbmdzLmtodWdlcGFnZWQuc2Nhbl9zbGVlcF9taWxsaXNlY3MgPQomIzQzOwkJc3RyY21wKG1vZGUsICYjMzQ7ZnJlZSYjMzQ7KSA/IDEwMDAgOiAwOwomIzQzOwlzZXR0aW5ncy5raHVnZXBhZ2VkLmFsbG9jX3NsZWVwX21pbGxpc2VjcyA9IDEwOwomIzQzOwkvKgomIzQzOwkgKiBtVEhQIGNvbGxhcHNlIG9ubHkgc3VwcG9ydHMgdGhlIHR3byBlbmRzIG9mIHRoZSBvY2N1cGFuY3kKJiM0MzsJICogc2NhbGU6IDAgb3IgSFBBR0VfUE1EX05SIC0gMSAoYW55dGhpbmcgZWxzZSBjb2VyY2VzIHRvIDApLgomIzQzOwkgKiBTdHJpY3QgaXMgdGhlIGRlZmF1bHQg4oCUIGl0IGFsc28ga2VlcHMga2h1Z2VwYWdlZCBmcm9tIGJ1cm5pbmcKJiM0MzsJICogdGhlIHdob2xlIHN0ZXAgaW4gZG9vbWVkIFBNRC1zaXplZCBhbGxvY2F0aW9ucyBvbiA1MTJNLVBNRAomIzQzOwkgKiBjb25maWdzLCB3aGVyZSBhIGZ1bGx5IHBvcHVsYXRlZCBhcmVhIGlzIHJhcmUgdW5kZXIgcmFjaW5nCiYjNDM7CSAqIE1BRFZfRE9OVE5FRUQuIC16IHNlbGVjdHMgdGhlIHBlcm1pc3NpdmUgZW5kOiBzZWxlY3Rpb24gdGhlbgomIzQzOwkgKiBlbWl0cyBob2xlLWhlYXZ5IHdpbmRvd3MgYW5kIHRoZSBlbmdpbmUmIzM5O3MgcG9wdWxhdGlvbiBwYXRocwomIzQzOwkgKiB0YWtlIHRoZSBicnVudCBvZiB0aGUgcmFjaW5nIGZhdWx0cyBhbmQgemFwcy4KJiM0MzsJICovCiYjNDM7CXNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IHBlcm1pc3NpdmVfbm9uZSA/CiYjNDM7CQkoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpIC0gMSA6IDA7CiYjNDM7CXNldHRpbmdzLmtodWdlcGFnZWQucGFnZXNfdG9fc2NhbiA9CiYjNDM7CQlucl9hcmVhcyAqIChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgKiA4OwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgJmFtcDsgKDFVTCAmbHQ7Jmx0OyBpKSkKJiM0MzsJCQlzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9JTkhFUklUOwomIzQzOwl9CiYjNDM7CS8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZC4gKi8KJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CXJlZ2lvbiA9IG1tYXAoQkFTRV9BRERSLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLAomIzQzOwkJICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLAomIzQzOwkJICAgICAgLTEsIDApOwomIzQzOwlpZiAocmVnaW9uICE9IEJBU0VfQUREUikKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O0ZhaWxlZCB0byBhbGxvY2F0ZSBWTUEgYXQgJXBcbiYjMzQ7LCBCQVNFX0FERFIpOwomIzQzOwltcmVtYXBfYXJlYSA9IHJlZ2lvbiAmIzQzOyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTsKJiM0MzsJbXJlbWFwX3NjcmF0Y2ggPSAoY2hhciAqKUJBU0VfQUREUiAmIzQzOyAyICogbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTsKJiM0MzsKJiM0MzsJaWYgKHRocmVhZF9tYXNrICZhbXA7IHBhZ2VvdXRfYml0KSB7CiYjNDM7CQkvKgomIzQzOwkJICogQmlnIGVub3VnaCB0byBjeWNsZSByZWFsIHJlY2xhaW0sIHNtYWxsIGVub3VnaCBub3QgdG8KJiM0MzsJCSAqIGRvbWluYXRlIGEgVENHIGd1ZXN0OiA0IFBNRCBhcmVhcywgY2xhbXBlZCB0byBbMTZNLCA2NE1dLgomIzQzOwkJICovCiYjNDM7CQlwYWdlb3V0X3NpemUgPSA0ICogaHBhZ2VfcG1kX3NpemU7CiYjNDM7CQlwYWdlb3V0X3NpemUgPSBwYWdlb3V0X3NpemUgJmx0OyAoMTZVTCAmbHQ7Jmx0OyAyMCkgPyAoMTZVTCAmbHQ7Jmx0OyAyMCkgOgomIzQzOwkJCSAgICAgICBwYWdlb3V0X3NpemUgJmd0OyAoNjRVTCAmbHQ7Jmx0OyAyMCkgPyAoNjRVTCAmbHQ7Jmx0OyAyMCkgOgomIzQzOwkJCSAgICAgICBwYWdlb3V0X3NpemU7CiYjNDM7CQlwYWdlb3V0X2FyZWEgPSBtbWFwKE5VTEwsIHBhZ2VvdXRfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKJiM0MzsJCQkJICAgIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSwgLTEsIDApOwomIzQzOwkJaWYgKHBhZ2VvdXRfYXJlYSA9PSBNQVBfRkFJTEVEKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21tYXAoKSBwYWdlb3V0IGFyZWEmIzM0Oyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogUG9wdWxhdGUgc28gdGhlIGZpcnN0IHBhc3MgaGFzIHNvbWV0aGluZyB0byBjb2xsYXBzZS4gKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOyBpJiM0MzsmIzQzOykKJiM0MzsJCSoodW5zaWduZWQgaW50ICopKHJlZ2lvbiAmIzQzOyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7CiYjNDM7CW1lbXNldChtcmVtYXBfYXJlYSwgMSwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwltYWR2aXNlKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBucl90aHJlYWRzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKCEodGhyZWFkX21hc2sgJmFtcDsgKDFVTCAmbHQ7Jmx0OyBpKSkpIHsKJiM0MzsJCQl0aHJlYWRzW2ldID0gMDsKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCX0KJiM0MzsJCWlmIChwdGhyZWFkX2NyZWF0ZSgmYW1wO3RocmVhZHNbaV0sIE5VTEwsIHRocmVhZF9mbnNbaV0sCiYjNDM7CQkJCSAgICh2b2lkICopKGkgJiM0MzsgMSkpKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O3B0aHJlYWRfY3JlYXRlKCkmIzM0Oyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZW5kX21zID0gbm93X21zKCkgJiM0MzsgZHVyYXRpb25fcyAqIDEwMDBVTDsKJiM0MzsJaWYgKCFzdHJjbXAobW9kZSwgJiMzNDtzdGVwcGVkJiMzNDspKSB7CiYjNDM7CQl3aGlsZSAobm93X21zKCkgJmx0OyBlbmRfbXMgJmFtcDsmYW1wOyAhY29ycnVwdGVkKSB7CiYjNDM7CQkJaWYgKCFraHVnZXBhZ2VkX2Z1bGxfcGFzcyg2MDApKQomIzQzOwkJCQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtraHVnZXBhZ2VkIHBhc3MgdGltZWQgb3V0XG4mIzM0Oyk7CiYjNDM7CQkJc3RlcHMmIzQzOyYjNDM7OwomIzQzOwkJfQomIzQzOwl9IGVsc2UgaWYgKCFzdHJjbXAobW9kZSwgJiMzNDtmcmVlJiMzNDspKSB7CiYjNDM7CQl3aGlsZSAobm93X21zKCkgJmx0OyBlbmRfbXMgJmFtcDsmYW1wOyAhY29ycnVwdGVkKQomIzQzOwkJCXVzbGVlcCgxMDAgKiAxMDAwKTsKJiM0MzsJfSBlbHNlIHsJLyogbWFkdmlzZSAqLwomIzQzOwkJd2hpbGUgKG5vd19tcygpICZsdDsgZW5kX21zICZhbXA7JmFtcDsgIWNvcnJ1cHRlZCkgewomIzQzOwkJCWZvciAoaSA9IDA7IGkgJmx0OyBucl9zaGFyZWRfYXJlYXM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJCW1hZHZpc2UocmVnaW9uICYjNDM7IGkgKiBocGFnZV9wbWRfc2l6ZSwKJiM0MzsJCQkJCWhwYWdlX3BtZF9zaXplLCBNQURWX0NPTExBUFNFKTsKJiM0MzsJCQl9CiYjNDM7CQkJbWFkdmlzZShyZWdpb24sIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLAomIzQzOwkJCQlNQURWX0RPTlRORUVEKTsKJiM0MzsJCQlzdGVwcyYjNDM7JiM0Mzs7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJc3RvcCA9IDE7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBucl90aHJlYWRzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKHRocmVhZHNbaV0pCiYjNDM7CQkJcHRocmVhZF9qb2luKHRocmVhZHNbaV0sIE5VTEwpOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIEZpbmFsIGludGVncml0eSBzd2VlcC4gKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOyBpJiM0MzsmIzQzOykKJiM0MzsJCWNoZWNrX3BhZ2UoaSk7CiYjNDM7CiYjNDM7CXRocF9yZXN0b3JlX3NldHRpbmdzKCk7CiYjNDM7CiYjNDM7CWtzZnRfdGVzdF9yZXN1bHQoIWNvcnJ1cHRlZCwgJiMzNDslczogJWRzLCAlZCBzdGVwcywgbm8gY29ycnVwdGlvblxuJiMzNDssCiYjNDM7CQkJIG1vZGUsIGR1cmF0aW9uX3MsIHN0ZXBzKTsKJiM0MzsJa3NmdF9maW5pc2hlZCgpOwomIzQzO30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uMTMyMTVjYjM3MGNlYgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jCkBAIC0wLDAgJiM0MzsxLDE5OCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBTeW5jaHJvbm91cyBraHVnZXBhZ2VkIGRyaXZpbmcgY2hlY2suCiYjNDM7ICoKJiM0MzsgKiBSYWNlIHRlc3RzIGRyaXZlIGtodWdlcGFnZWQgdGhyb3VnaCB0aGUgZXhpc3Rpbmcgc3lzZnMgY29udHJvbHM6IGEKJiM0MzsgKiBzdG9yZSB0byBzY2FuX3NsZWVwX21pbGxpc2VjcyB3YWtlcyB0aGUgZGFlbW9uLCBhbmQgZnVsbF9zY2FucwomIzQzOyAqIGFkdmFuY2luZyBieSB0d28gaXMgYSBjb21wbGV0aW9uIGJhcnJpZXIgZm9yIG9uZSBmdWxsIHBhc3MgdGhhdAomIzQzOyAqIHN0YXJ0ZWQgYWZ0ZXIgc2V0dXAgKGtodWdlcGFnZWRfZnVsbF9wYXNzKCkpLiBWZXJpZnkgdGhlIHBhaXIgZ2l2ZXMKJiM0MzsgKiBkZXRlcm1pbmlzdGljLCBhdHRyaWJ1dGFibGUgcmVzdWx0czogb25lIGJhcnJpZXIgc3RlcCBvdmVyIG9uZQomIzQzOyAqIHByZXBhcmVkIHdpbmRvdyBwcm9kdWNlcyBleGFjdGx5IG9uZSBjb2xsYXBzZSBhdHRlbXB0IG9uIHRoYXQKJiM0MzsgKiB3aW5kb3cmIzM5O3Mgc291cmNlIHBhZ2VzIOKAlCBtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSBldmVudHMKJiM0MzsgKiBmaWx0ZXJlZCBieSBzb3VyY2UgUEZOIGFuZCBvcmRlciDigJQgYW5kIHRoZSB3aW5kb3cgaXMgY29sbGFwc2VkCiYjNDM7ICogYWZ0ZXJ3YXJkcywgcmVwZWF0YWJseS4KJiM0MzsgKgomIzQzOyAqIHNjYW5fc2xlZXBfbWlsbGlzZWNzIGlzIHNldCB0byA2MHMgdG8gcHJvdmUgdGhlIHdha2UgcGF0aDogd2l0aG91dAomIzQzOyAqIHRoZSB3YWtlLCBvbmUgYmFycmllciBzdGVwIHdvdWxkIHNsZWVwIG11bHRpcGxlcyBvZiB0aGF0IGFuZCBibG93CiYjNDM7ICogdGhlIHRpbWVvdXQuIEl0IGFsc28ga2VlcHMgdGhlIGRhZW1vbiBmcm9tIGZyZWUtcnVubmluZyBiZXR3ZWVuCiYjNDM7ICogc3RlcHMsIHBlciB0aGUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSBkaXNjaXBsaW5lLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0UKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvbW1hbi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O2tzZWxmdGVzdC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O3ZtX3V0aWwuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtodWdlcGFnZV9zZXR0aW5ncy5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIEJBU0VfQUREUiAoKHZvaWQgKikoMVVMICZsdDsmbHQ7IDMwKSkKJiM0MzsjZGVmaW5lIFRBUkdFVF9PUkRFUiAyCS8qIHNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgY29uc2lkZXJzICovCiYjNDM7I2RlZmluZSBOUl9JVEVSQVRJT05TIDUKJiM0MzsKJiM0MztzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7CiYjNDM7c3RhdGljIGludCBrcGFnZWZsYWdzX2ZkOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwYWdlX3BtZF9zaXplOwomIzQzOwomIzQzOy8qCiYjNDM7ICogQ291bnQgY29sbGFwc2UgYXR0ZW1wdHMgYXR0cmlidXRhYmxlIHRvIG91ciB3aW5kb3c6IGxlZ2FjeS1lbmdpbmUKJiM0MzsgKiBpc29sYXRlIGV2ZW50cyB3aG9zZSBzY2FuX3BmbiBpcyBvbmUgb2YgdGhlIHdpbmRvdyYjMzk7cyBzb3VyY2UgUEZOcywKJiM0MzsgKiBwbHVzIGJhdGNoLWVuZ2luZSBwZXItY2FuZGlkYXRlIGluc3RhbGwgZXZlbnRzIGF0IHRoZSB3aW5kb3cmIzM5O3MKJiM0MzsgKiBhZGRyZXNzLiBFaXRoZXIgZW5naW5lIHJlcG9ydHMgZXhhY3RseSBvbmNlIHBlciBhdHRlbXB0LgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgY291bnRfYXR0cmlidXRlZCh1bnNpZ25lZCBsb25nICpwZm5zLCBpbnQgbnJfcGZucywKJiM0MzsJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgb3JkZXIpCiYjNDM7ewomIzQzOwljaGFyIGxpbmVbMTAyNF07CiYjNDM7CWludCBjb3VudCA9IDA7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlmcCA9IHRyYWNpbmdfb3Blbl90cmFjZSgpOwomIzQzOwlpZiAoIWZwKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7Q2Fubm90IG9wZW4gdHJhY2UgYnVmZmVyXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgewomIzQzOwkJY2hhciAqczsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgdmFsOwomIzQzOwkJdW5zaWduZWQgaW50IG9yZDsKJiM0MzsJCWNoYXIgKm87CiYjNDM7CQlpbnQgaTsKJiM0MzsKJiM0MzsJCXMgPSBzdHJzdHIobGluZSwgJiMzNDttbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTomIzM0Oyk7CiYjNDM7CQlpZiAocykgewomIzQzOwkJCWlmIChzc2NhbmYocywgJiMzNDttbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTogc2Nhbl9wZm49MHglbHgmIzM0OywKJiM0MzsJCQkJICAgJmFtcDt2YWwpICE9IDEpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCW8gPSBzdHJzdHIocywgJiMzNDtvcmRlcj0mIzM0Oyk7CiYjNDM7CQkJaWYgKCFvIHx8IHNzY2FuZihvLCAmIzM0O29yZGVyPSV1JiMzNDssICZhbXA7b3JkKSAhPSAxIHx8CiYjNDM7CQkJICAgIG9yZCAhPSBvcmRlcikKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQkJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3BmbnM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJCWlmICh2YWwgPT0gcGZuc1tpXSkgewomIzQzOwkJCQkJY291bnQmIzQzOyYjNDM7OwomIzQzOwkJCQkJYnJlYWs7CiYjNDM7CQkJCX0KJiM0MzsJCQl9CiYjNDM7CQkJY29udGludWU7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlzID0gc3Ryc3RyKGxpbmUsICYjMzQ7bW1fY29sbGFwc2VfY2FuZGlkYXRlOiYjMzQ7KTsKJiM0MzsJCWlmIChzKSB7CiYjNDM7CQkJaWYgKCFzdHJzdHIocywgJiMzNDtwYXNzPWluc3RhbGwmIzM0OykgfHwKJiM0MzsJCQkgICAgIXN0cnN0cihzLCAmIzM0O3Jlc3VsdD1zdWNjZWVkZWQmIzM0OykpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCW8gPSBzdHJzdHIocywgJiMzNDthZGRyPSYjMzQ7KTsKJiM0MzsJCQlpZiAoIW8gfHwgc3NjYW5mKG8sICYjMzQ7YWRkcj0weCVseCYjMzQ7LCAmYW1wO3ZhbCkgIT0gMSB8fAomIzQzOwkJCSAgICB2YWwgIT0gYWRkcikKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQkJbyA9IHN0cnN0cihzLCAmIzM0O29yZGVyPSYjMzQ7KTsKJiM0MzsJCQlpZiAoIW8gfHwgc3NjYW5mKG8sICYjMzQ7b3JkZXI9JXUmIzM0OywgJmFtcDtvcmQpICE9IDEgfHwKJiM0MzsJCQkgICAgb3JkICE9IG9yZGVyKQomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQljb3VudCYjNDM7JiM0Mzs7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsJcmV0dXJuIGNvdW50OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBvbmVfc3RlcChpbnQgaXRlcmF0aW9uKQomIzQzO3sKJiM0MzsJY29uc3Qgc2l6ZV90IHdpbmRvdyA9IGdldHBhZ2VzaXplKCkgJmx0OyZsdDsgVEFSR0VUX09SREVSOwomIzQzOwljb25zdCBpbnQgbnJfcGFnZXMgPSAxICZsdDsmbHQ7IFRBUkdFVF9PUkRFUjsKJiM0MzsJdW5zaWduZWQgbG9uZyBwZm5zWzEgJmx0OyZsdDsgVEFSR0VUX09SREVSXTsKJiM0MzsJYm9vbCBjb2xsYXBzZWQ7CiYjNDM7CWludCBhdHRyaWJ1dGVkOwomIzQzOwljaGFyICpwOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJcCA9IG1tYXAoQkFTRV9BRERSLCBocGFnZV9wbWRfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKJiM0MzsJCSBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTsKJiM0MzsJaWYgKHAgIT0gQkFTRV9BRERSKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7RmFpbGVkIHRvIGFsbG9jYXRlIFZNQSBhdCAlcFxuJiMzNDssCiYjNDM7CQkJCSAgIEJBU0VfQUREUik7CiYjNDM7CiYjNDM7CS8qIFByZXBhcmUgb25lIHdpbmRvdzsgcmVjb3JkIGl0cyBzb3VyY2UgUEZOcy4gKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJcFtpICogZ2V0cGFnZXNpemUoKV0gPSBpICYjNDM7IDE7CiYjNDM7CQlwZm5zW2ldID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHAgJiM0MzsgaSAqIGdldHBhZ2VzaXplKCkpOwomIzQzOwkJaWYgKHBmbnNbaV0gPT0gLTFVTCkKJiM0MzsJCQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtTb3VyY2UgcGFnZSBub3QgcHJlc2VudFxuJiMzNDspOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICh0cmFjaW5nX2V2ZW50c19zdGFydCgmIzM0O2h1Z2VfbWVtb3J5JiMzNDspKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7Q2Fubm90IGVuYWJsZSBodWdlX21lbW9yeSBldmVudHNcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJbWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7CiYjNDM7CS8qIFdhaXQgdXAgdG8gMTIwIHNlY29uZHMgZm9yIHRoZSBwYXNzIHRvIGNvbXBsZXRlLiAqLwomIzQzOwlpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKDEyMCkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtraHVnZXBhZ2VkIGRpZCBub3QgY29tcGxldGUgYSBmdWxsIHBhc3NcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJdHJhY2luZ19ldmVudHNfc3RvcCgmIzM0O2h1Z2VfbWVtb3J5JiMzNDspOwomIzQzOwomIzQzOwljb2xsYXBzZWQgPSBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHdpbmRvdywgVEFSR0VUX09SREVSLAomIzQzOwkJCQkJCSAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTsKJiM0MzsJYXR0cmlidXRlZCA9IGNvdW50X2F0dHJpYnV0ZWQocGZucywgbnJfcGFnZXMsICh1bnNpZ25lZCBsb25nKXAsCiYjNDM7CQkJCSAgICAgIFRBUkdFVF9PUkRFUik7CiYjNDM7CiYjNDM7CWtzZnRfdGVzdF9yZXN1bHQoY29sbGFwc2VkICZhbXA7JmFtcDsgYXR0cmlidXRlZCA9PSAxLAomIzQzOwkJCSAmIzM0O3N0ZXAgJWQ6IHdpbmRvdyBjb2xsYXBzZWQsICVkIGF0dHJpYnV0ZWQgcmVzdWx0KHMpXG4mIzM0OywKJiM0MzsJCQkgaXRlcmF0aW9uLCBhdHRyaWJ1dGVkKTsKJiM0MzsKJiM0MzsJbXVubWFwKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IG1haW4odm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlrc2Z0X3ByaW50X2hlYWRlcigpOwomIzQzOwomIzQzOwlpZiAoIXRocF9hdmFpbGFibGUoKSkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcbiYjMzQ7KTsKJiM0MzsJaWYgKCEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSAmYW1wOyAoMVVMICZsdDsmbHQ7IFRBUkdFVF9PUkRFUikpKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDtPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcbiYjMzQ7LAomIzQzOwkJCSAgICAgICBUQVJHRVRfT1JERVIpOwomIzQzOwomIzQzOwlocGFnZV9wbWRfc2l6ZSA9IHJlYWRfcG1kX3BhZ2VzaXplKCk7CiYjNDM7CWlmICghaHBhZ2VfcG1kX3NpemUpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcbiYjMzQ7KTsKJiM0MzsJcGFnZW1hcF9mZCA9IG9wZW4oJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXAmIzM0OywgT19SRE9OTFkpOwomIzQzOwlpZiAocGFnZW1hcF9mZCAmbHQ7IDApCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDtvcGVuKFwmIzM0Oy9wcm9jL3NlbGYvcGFnZW1hcFwmIzM0OykmIzM0Oyk7CiYjNDM7CWtwYWdlZmxhZ3NfZmQgPSBvcGVuKCYjMzQ7L3Byb2Mva3BhZ2VmbGFncyYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CWlmIChrcGFnZWZsYWdzX2ZkICZsdDsgMCkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7b3BlbihcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXCYjMzQ7KSByZXF1aXJlcyByb290XG4mIzM0Oyk7CiYjNDM7CWlmICh0cmFjaW5nX2V2ZW50c19zdGFydCgmIzM0O2h1Z2VfbWVtb3J5JiMzNDspKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDt0cmFjZWZzIHVuYXZhaWxhYmxlXG4mIzM0Oyk7CiYjNDM7CXRyYWNpbmdfZXZlbnRzX3N0b3AoJiMzNDtodWdlX21lbW9yeSYjMzQ7KTsKJiM0MzsKJiM0MzsJa3NmdF9zZXRfcGxhbihOUl9JVEVSQVRJT05TKTsKJiM0MzsKJiM0MzsJdGhwX3NhdmVfc2V0dGluZ3MoKTsKJiM0MzsJdGhwX3JlYWRfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CXNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7CiYjNDM7CXNldHRpbmdzLnRocF9kZWZyYWcgPSBUSFBfREVGUkFHX0FMV0FZUzsKJiM0MzsJc2V0dGluZ3Mua2h1Z2VwYWdlZC5kZWZyYWcgPSAxOwomIzQzOwlzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7CiYjNDM7CXNldHRpbmdzLmtodWdlcGFnZWQuYWxsb2Nfc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7CiYjNDM7CXNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IChocGFnZV9wbWRfc2l6ZSAvIGdldHBhZ2VzaXplKCkpIC0gMTsKJiM0MzsJLyogT25lIHdha2UgbXVzdCBjb21wbGV0ZSBvbmUgZnVsbCBwYXNzOyBzZWUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKS4gKi8KJiM0MzsJc2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID0gMVVMICZsdDsmbHQ7IDI0OwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykKJiM0MzsJCXNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSOwomIzQzOwlzZXR0aW5ncy5odWdlcGFnZXNbVEFSR0VUX09SREVSXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7CiYjNDM7CS8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZC4gKi8KJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBOUl9JVEVSQVRJT05TOyBpJiM0MzsmIzQzOykKJiM0MzsJCW9uZV9zdGVwKGkpOwomIzQzOwomIzQzOwl0aHBfcmVzdG9yZV9zZXR0aW5ncygpOwomIzQzOwomIzQzOwlrc2Z0X2ZpbmlzaGVkKCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaAppbmRleCA2ODdkMTE1ZTNiZDgwLi5mODI2Y2Y5NDBjM2Q0IDEwMDc1NQotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaApAQCAtNDAyLDEwICYjNDM7NDAyLDI3IEBAIENBVEVHT1JZPSYjMzQ7cGZubWFwJiMzNDsgcnVuX3Rlc3QgLi9wZm5tYXAKICMgQ09XIHRlc3RzCiBDQVRFR09SWT0mIzM0O2NvdyYjMzQ7IHJ1bl90ZXN0IC4vY293CiAKJiM0MztDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4vZm9saW9fb3JkZXJfY2hlY2sKJiM0MzsKJiM0MzsKJiM0MztDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9zeW5jX2NoZWNrCiYjNDM7CiYjNDM7Q0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIHN0ZXBwZWQKJiM0MzsKJiM0MztDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9yYWNlIC1kIDUgLW0gZnJlZQomIzQzOwomIzQzO0NBVEVHT1JZPSYjMzQ7dGhwJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3JhY2UgLWQgNSAtbSBtYWR2aXNlCiYjNDM7CiYjNDM7Q0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIHN0ZXBwZWQgLXoKJiM0MzsKJiM0MztDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9yYWNlIC1kIDUgLW0gc3RlcHBlZCAtcAomIzQzOwogQ0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQKIAogQ0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgMgogCiYjNDM7Q0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgLW8gMiBraHVnZXBhZ2VkOmFub24KJiM0MzsKIENBVEVHT1JZPSYjMzQ7dGhwJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIGFsbDpzaG1lbQogCiBDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyA0IGFsbDpzaG1lbQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMKaW5kZXggMzJiOTkxNDcyZjc0NC4uOWIzODg1YmQwMDFiZSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jCkBAIC00Miw2OCAmIzQzOzQyLDYgQEAgY29uc3QgY2hhciAqa3BhZ2VmbGFnc19wcm9jID0gJiMzNDsvcHJvYy9rcGFnZWZsYWdzJiMzNDs7CiBpbnQgcGFnZW1hcF9mZDsKIGludCBrcGFnZWZsYWdzX2ZkOwogCi1zdGF0aWMgYm9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsCi0JCWludCBrcGFnZWZsYWdzX2ZkKQotewotCWNvbnN0IHVpbnQ2NF90IGZvbGlvX2hlYWRfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX0hFQUQ7Ci0JY29uc3QgdWludDY0X3QgZm9saW9fdGFpbF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfVEFJTDsKLQljb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMICZsdDsmbHQ7IG9yZGVyOwotCXVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7Ci0JdWludDY0X3QgcGZuX2ZsYWdzOwotCXVuc2lnbmVkIGxvbmcgcGZuOwotCXVuc2lnbmVkIGxvbmcgaTsKLQotCXBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7Ci0KLQkvKiBub24gcHJlc2VudCBwYWdlICovCi0JaWYgKHBmbiA9PSAtMVVMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKLQkJZ290byBmYWlsOwotCi0JLyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi8KLQlpZiAoIW9yZGVyKSB7Ci0JCWlmIChwZm5fZmxhZ3MgJmFtcDsgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogbm9uIFRIUCBmb2xpbyAqLwotCWlmICghKHBmbl9mbGFncyAmYW1wOyBLUEZfVEhQKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcGZuX2hlYWQgPSBwZm4gJmFtcDsgfihucl9wYWdlcyAtIDEpOwotCi0JaWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKLQkJZ290byBmYWlsOwotCi0JLyogaGVhZCBQRk4gaGFzIG5vIGNvbXBvdW5kX2hlYWQgZmxhZyBzZXQgKi8KLQlpZiAoKHBmbl9mbGFncyAmYW1wOyBmb2xpb19oZWFkX2ZsYWdzKSAhPSBmb2xpb19oZWFkX2ZsYWdzKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkvKiBjaGVjayBhbGwgdGFpbCBQRk4gZmxhZ3MgKi8KLQlmb3IgKGkgPSAxOyBpICZsdDsgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7Ci0JCWlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IGksIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKLQkJCWdvdG8gZmFpbDsKLQkJaWYgKChwZm5fZmxhZ3MgJmFtcDsgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncykKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIGNoZWNrIHRoZSBQRk4gYWZ0ZXIgdGhpcyBmb2xpbywgYnV0IGlmIGl0cyBmbGFncyBjYW5ub3QgYmUgb2J0YWluZWQsCi0JICogYXNzdW1lIHRoaXMgZm9saW8gaGFzIHRoZSBleHBlY3RlZCBvcmRlcgotCSAqLwotCWlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IG5yX3BhZ2VzLCBrcGFnZWZsYWdzX2ZkLCAmYW1wO3Bmbl9mbGFncykpCi0JCXJldHVybiB0cnVlOwotCi0JLyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqLwotCXJldHVybiAocGZuX2ZsYWdzICZhbXA7IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7Ci1mYWlsOgotCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O0ZhaWxlZCB0byBnZXQgZm9saW8gaW5mb1xuJiMzNDspOwotCXJldHVybiBmYWxzZTsKLX0KLQogc3RhdGljIGludCB2YWRkcl9wYWdlZmxhZ3NfZ2V0KGNoYXIgKnZhZGRyLCBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQsCiAJCXVpbnQ2NF90ICpmbGFncykKIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYwppbmRleCBlZjFlYTExOTgxYTc0Li44ODZmYjNkZTljMDExIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jCkBAIC0zMDMsNiAmIzQzOzMwMywxNjMgQEAgaW50IHBhZ2VmbGFnc19nZXQodW5zaWduZWQgbG9uZyBwZm4sIGludCBrcGFnZWZsYWdzX2ZkLCB1aW50NjRfdCAqZmxhZ3MpCiAJcmV0dXJuIDA7CiB9CiAKJiM0Mztib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCwKJiM0MzsJCQlpbnQga3BhZ2VmbGFnc19mZCkKJiM0Mzt7CiYjNDM7CWNvbnN0IHVpbnQ2NF90IGZvbGlvX2hlYWRfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX0hFQUQ7CiYjNDM7CWNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7CiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgJmx0OyZsdDsgb3JkZXI7CiYjNDM7CXVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7CiYjNDM7CXVpbnQ2NF90IHBmbl9mbGFnczsKJiM0MzsJdW5zaWduZWQgbG9uZyBwZm47CiYjNDM7CXVuc2lnbmVkIGxvbmcgaTsKJiM0MzsKJiM0MzsJcGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTsKJiM0MzsKJiM0MzsJLyogbm9uIHByZXNlbnQgcGFnZSAqLwomIzQzOwlpZiAocGZuID09IC0xVUwpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CWlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgJmFtcDtwZm5fZmxhZ3MpKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwkvKiBjaGVjayBmb3Igb3JkZXItMCBwYWdlcyAqLwomIzQzOwlpZiAoIW9yZGVyKSB7CiYjNDM7CQlpZiAocGZuX2ZsYWdzICZhbXA7IChmb2xpb19oZWFkX2ZsYWdzIHwgZm9saW9fdGFpbF9mbGFncykpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwkJcmV0dXJuIHRydWU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogbm9uIFRIUCBmb2xpbyAqLwomIzQzOwlpZiAoIShwZm5fZmxhZ3MgJmFtcDsgS1BGX1RIUCkpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CXBmbl9oZWFkID0gcGZuICZhbXA7IH4obnJfcGFnZXMgLSAxKTsKJiM0MzsKJiM0MzsJaWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsKJiM0MzsJLyogaGVhZCBQRk4gaGFzIG5vIGNvbXBvdW5kX2hlYWQgZmxhZyBzZXQgKi8KJiM0MzsJaWYgKChwZm5fZmxhZ3MgJmFtcDsgZm9saW9faGVhZF9mbGFncykgIT0gZm9saW9faGVhZF9mbGFncykKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJLyogY2hlY2sgYWxsIHRhaWwgUEZOIGZsYWdzICovCiYjNDM7CWZvciAoaSA9IDE7IGkgJmx0OyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IGksIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKJiM0MzsJCQlnb3RvIGZhaWw7CiYjNDM7CQlpZiAoKHBmbl9mbGFncyAmYW1wOyBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBjaGVjayB0aGUgUEZOIGFmdGVyIHRoaXMgZm9saW8sIGJ1dCBpZiBpdHMgZmxhZ3MgY2Fubm90IGJlIG9idGFpbmVkLAomIzQzOwkgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyCiYjNDM7CSAqLwomIzQzOwlpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCAmIzQzOyBucl9wYWdlcywga3BhZ2VmbGFnc19mZCwgJmFtcDtwZm5fZmxhZ3MpKQomIzQzOwkJcmV0dXJuIHRydWU7CiYjNDM7CiYjNDM7CS8qIElmIHdlIGZpbmQgYW5vdGhlciB0YWlsIHBhZ2UsIHRoZW4gdGhlIGZvbGlvIGlzIGxhcmdlci4gKi8KJiM0MzsJcmV0dXJuIChwZm5fZmxhZ3MgJmFtcDsgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFnczsKJiM0MztmYWlsOgomIzQzOwlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cbiYjMzQ7KTsKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIENoZWNrIHdoZXRoZXIgdGhlIHJhbmdlIFtzdGFydCwgc3RhcnQgJiM0MzsgbGVuKSBpcyBiYWNrZWQgYnkgZm9saW9zIG9mCiYjNDM7ICogZXhhY3RseSBAb3JkZXIsIG1hcHBlZCBhdCB0aGVpciBuYXR1cmFsIGFsaWdubWVudC4KJiM0MzsgKgomIzQzOyAqIGlzX2JhY2tlZF9ieV9mb2xpbygpIGNsYXNzaWZpZXMgdGhlIGZvbGlvIGJhY2tpbmcgb25lIHBhZ2U7IGhlcmUgd2UKJiM0MzsgKiBhZGRpdGlvbmFsbHkgcmVxdWlyZSB0aGF0IGVhY2ggb3JkZXItYWxpZ25lZCB3aW5kb3cgb2YgdGhlIHJhbmdlIG1hcHMKJiM0MzsgKiBvbmUgc3VjaCBmb2xpbyBoZWFkLXRvLXRhaWw6IHRoZSBWQSByYW5nZSBtdXN0IGJlIG5hdHVyYWxseSBhbGlnbmVkLAomIzQzOyAqIGVhY2ggd2luZG93JiMzOTtzIFBGTiBydW4gbXVzdCBiZSBjb250aWd1b3VzLCBhbmQgdGhlIGZpcnN0IFBGTiBtdXN0IGJlCiYjNDM7ICogdGhlIChuYXR1cmFsbHkgYWxpZ25lZCkgZm9saW8gaGVhZC4KJiM0MzsgKgomIzQzOyAqIFRoaXMgaXMgdGhlIGNoZWNrICYjMzQ7ZGlkIHRoaXMgcmFuZ2UgY29sbGFwc2UgaW50byBvcmRlci1Ab3JkZXIgZm9saW9zJiMzNDs6CiYjNDM7ICogYSB3aW5kb3cgYXNzZW1ibGVkIGZyb20gcGFydHMgb2Ygc2V2ZXJhbCBmb2xpb3MsIG9yIG1hcHBpbmcgYSBmb2xpbwomIzQzOyAqIHNoaWZ0ZWQgZnJvbSBpdHMgbmF0dXJhbCBwb3NpdGlvbiwgZmFpbHMuCiYjNDM7ICovCiYjNDM7Ym9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsCiYjNDM7CQkJCSAgICAgaW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkKQomIzQzO3sKJiM0MzsJY29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCAmbHQ7Jmx0OyBvcmRlcjsKJiM0MzsJY29uc3Qgc2l6ZV90IHdpbmRvdyA9IG5yX3BhZ2VzICogcHNpemUoKTsKJiM0MzsJY2hhciAqdmFkZHI7CiYjNDM7CiYjNDM7CWlmICgodWludHB0cl90KXN0YXJ0ICUgd2luZG93IHx8IGxlbiAlIHdpbmRvdykKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJZm9yICh2YWRkciA9IHN0YXJ0OyB2YWRkciAmbHQ7IHN0YXJ0ICYjNDM7IGxlbjsgdmFkZHIgJiM0Mzs9IHdpbmRvdykgewomIzQzOwkJdW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpOwomIzQzOwkJdW5zaWduZWQgbG9uZyBpOwomIzQzOwomIzQzOwkJLyogTm90IHByZXNlbnQsIG9yIG5vdCBtYXBwaW5nIHRoZSBmb2xpbyBoZWFkLiAqLwomIzQzOwkJaWYgKHBmbiA9PSAtMVVMIHx8IHBmbiAlIG5yX3BhZ2VzKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJCWZvciAoaSA9IDE7IGkgJmx0OyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlpZiAocGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyICYjNDM7IGkgKiBwc2l6ZSgpKSAhPQomIzQzOwkJCSAgICBwZm4gJiM0MzsgaSkKJiM0MzsJCQkJcmV0dXJuIGZhbHNlOwomIzQzOwkJfQomIzQzOwomIzQzOwkJaWYgKCFpc19iYWNrZWRfYnlfZm9saW8odmFkZHIsIG9yZGVyLCBwYWdlbWFwX2ZkLAomIzQzOwkJCQkJa3BhZ2VmbGFnc19mZCkpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MzsjZGVmaW5lIFRSQUNFRlNfUk9PVCAmIzM0Oy9zeXMva2VybmVsL3RyYWNpbmcmIzM0OwomIzQzOwomIzQzO3N0YXRpYyBpbnQgdHJhY2luZ19ldmVudHNfd3JpdGUoY29uc3QgY2hhciAqc3Vic3lzLCBjb25zdCBjaGFyICp2YWwpCiYjNDM7ewomIzQzOwljaGFyIHBhdGhbMjU2XTsKJiM0MzsJaW50IGZkOwomIzQzOwomIzQzOwlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFRSQUNFRlNfUk9PVCAmIzM0Oy9ldmVudHMvJXMvZW5hYmxlJiMzNDssCiYjNDM7CQkgc3Vic3lzKTsKJiM0MzsJZmQgPSBvcGVuKHBhdGgsIE9fV1JPTkxZKTsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJaWYgKHdyaXRlKGZkLCB2YWwsIDEpICE9IDEpIHsKJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEVuYWJsZSBvbmUgZnRyYWNlIGV2ZW50IHN1YnN5c3RlbSAoZS5nLiAmIzM0O2h1Z2VfbWVtb3J5JiMzNDspIGFuZCBjbGVhciB0aGUKJiM0MzsgKiB0cmFjZSBidWZmZXIuIFJldHVybnMgLTEgaWYgdHJhY2VmcyBpcyB1bmF2YWlsYWJsZTsgcGFyc2UgdGhlIHJlc3VsdHMKJiM0MzsgKiB2aWEgdHJhY2luZ19vcGVuX3RyYWNlKCkgYWZ0ZXIgdHJhY2luZ19ldmVudHNfc3RvcCgpLgomIzQzOyAqLwomIzQzO2ludCB0cmFjaW5nX2V2ZW50c19zdGFydChjb25zdCBjaGFyICpzdWJzeXMpCiYjNDM7ewomIzQzOwlpbnQgZmQ7CiYjNDM7CiYjNDM7CWlmICh0cmFjaW5nX2V2ZW50c193cml0ZShzdWJzeXMsICYjMzQ7MSYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJZmQgPSBvcGVuKFRSQUNFRlNfUk9PVCAmIzM0Oy90cmFjZSYjMzQ7LCBPX1dST05MWSB8IE9fVFJVTkMpOwomIzQzOwlpZiAoZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztpbnQgdHJhY2luZ19ldmVudHNfc3RvcChjb25zdCBjaGFyICpzdWJzeXMpCiYjNDM7ewomIzQzOwlyZXR1cm4gdHJhY2luZ19ldmVudHNfd3JpdGUoc3Vic3lzLCAmIzM0OzAmIzM0Oyk7CiYjNDM7fQomIzQzOwomIzQzO0ZJTEUgKnRyYWNpbmdfb3Blbl90cmFjZSh2b2lkKQomIzQzO3sKJiM0MzsJcmV0dXJuIGZvcGVuKFRSQUNFRlNfUk9PVCAmIzM0Oy90cmFjZSYjMzQ7LCAmIzM0O3ImIzM0Oyk7CiYjNDM7fQomIzQzOwogLyogSWYgYGlvY3RscyYjMzk7IG5vbi1OVUxMLCB0aGUgYWxsb3dlZCBpb2N0bHMgd2lsbCBiZSByZXR1cm5lZCBpbnRvIHRoZSB2YXIgKi8KIGludCB1ZmZkX3JlZ2lzdGVyX3dpdGhfaW9jdGxzKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sCiAJCQkgICAgICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IsIHVpbnQ2NF90ICppb2N0bHMpCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmgKaW5kZXggNzc5OTE1NGI2N2VlZC4uNGZmNWExYzVhYjhlZCAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaApAQCAtOTUsNiAmIzQzOzk1LDEwIEBAIGJvb2wgY2hlY2tfaHVnZV9maWxlKHZvaWQgKmFkZHIsIGludCBucl9ocGFnZXMsIHVpbnQ2NF90IGhwYWdlX3NpemUpOwogYm9vbCBjaGVja19odWdlX3NobWVtKHZvaWQgKmFkZHIsIGludCBucl9ocGFnZXMsIHVpbnQ2NF90IGhwYWdlX3NpemUpOwogaW50NjRfdCBhbGxvY2F0ZV90cmFuc2h1Z2Uodm9pZCAqcHRyLCBpbnQgcGFnZW1hcF9mZCk7CiBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncyk7CiYjNDM7Ym9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsCiYjNDM7CQkJaW50IGtwYWdlZmxhZ3NfZmQpOwomIzQzO2Jvb2wgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLAomIzQzOwkJCQkgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCk7CiAKIGludCB1ZmZkX3JlZ2lzdGVyKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sCiAJCSAgYm9vbCBtaXNzLCBib29sIHdwLCBib29sIG1pbm9yKTsKQEAgLTExMSw2ICYjNDM7MTE1LDkgQEAgaW50IGNsb3NlX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXApOwogaW50IHdyaXRlX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyB2YWwpOwogaW50IHJlYWRfc3lzZnMoY29uc3QgY2hhciAqZmlsZV9wYXRoLCB1bnNpZ25lZCBsb25nICp2YWwpOwogYm9vbCBzb2Z0ZGlydHlfc3VwcG9ydGVkKHZvaWQpOwomIzQzO2ludCB0cmFjaW5nX2V2ZW50c19zdGFydChjb25zdCBjaGFyICpzdWJzeXMpOwomIzQzO2ludCB0cmFjaW5nX2V2ZW50c19zdG9wKGNvbnN0IGNoYXIgKnN1YnN5cyk7CiYjNDM7RklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpOwogCiBzdGF0aWMgaW5saW5lIGludCBvcGVuX3NlbGZfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcF9vdXQpCiB7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzAzIDAxOjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI0ODM1CgkJCQkJCQlvdXRwdXQ6IDY0CgkJCQkJCQl0aG91Z2h0czogNjk5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKldvcnRoRnV6emluZz1mYWxzZTogQSBRdWljayBSZXZpZXcqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggc2VyaWVzLCBhbmQgaXQmIzM5O3MgYWxsIGFib3V0IG1vZGlmeWluZyBzdHVmZiB3aXRoaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2AuICBSaWdodCBvZmYgdGhlIGJhdCwgdGhhdCBzY3JlYW1zICpub3Qga2VybmVsIGNvZGUqIHRvIG1lLCBidXQgSSBuZWVkIHRvIGJlIHRob3JvdWdoLiBUaGVzZSBhcmUgdXNlcnNwYWNlIHRlc3RzLiBJIGFsd2F5cyB0cmlwbGUtY2hlY2suIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHByZXR0eSBjbGVhcjogbW9kaWZpY2F0aW9ucyB0byBzZWxmdGVzdHMgYWxvbmUgc2hvdWxkbiYjMzk7dCB0cmlnZ2VyIGZ1enppbmcuIFRoZSBxdWVzdGlvbiBpczogZG8gdGhlIGluc3RydWN0aW9ucyBjYXB0dXJlIHRoaXM/CgpMZXQgbWUgcXVpY2tseSBzY2FuIHRoZSBkaWZmIGFnYWluLiAgTm9wZSwganVzdCBkb3VibGUtY2hlY2tpbmcsIGl0JiMzOTtzIGp1c3QgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2AuIFRoZSBzcGVjaWZpYyBmaWxlcyBhcmU6IGAuZ2l0aWdub3JlYCwgYE1ha2VmaWxlYCwgYGZvbGlvX29yZGVyX2NoZWNrLmNgLCBgaHVnZXBhZ2Vfc2V0dGluZ3MuY2AgYW5kIGAuaGAsIGBraHVnZXBhZ2VkLmNgIGFuZCBgX3JhY2UuY2AgYW5kIGBfc3luY19jaGVjay5jYCwgYHJ1bl92bXRlc3RzLnNoYCwgYHNwbGl0X2h1Z2VfcGFnZV90ZXN0LmNgLCBgdm1fdXRpbC5jYCBhbmQgYC5oYC4gQWxsIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9gIGRpcmVjdG9yeS4KCk9rYXksIHNvIHRoZXJlJiMzOTtzIG5vIGtlcm5lbCBjb2RlIGJlaW5nIHRvdWNoZWQuICBObyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCwgcGVyaW9kLgoKVGhlIHByb21wdCBpcyBjcnlzdGFsIGNsZWFyOiBJJiMzOTttIHJldmlld2luZyBwYXRjaGVzIHRvIHNlZSBpZiB0aGV5IGZ1bmN0aW9uYWxseSBjaGFuZ2UgdGhlIGtlcm5lbCBpbiBhIHdheSB0aGF0IHdhcnJhbnRzIGZ1enppbmcuIFNpbmNlIHRoaXMgaXMgKm9ubHkqIG1vZGlmeWluZyB1c2Vyc3BhY2Ugc2VsZnRlc3RzLCB0aGUgYW5zd2VyIGlzIGEgcmVzb3VuZGluZyAqbm8qLiAgSSYjMzk7bSByZXR1cm5pbmcgYFdvcnRoRnV6emluZz1mYWxzZWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDMgMDE6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXJzcGFjZSBzZWxmdGVzdHMgKHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLyopIGFuZCBkb2VzIG5vdCBtYWtlIGFueSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCBpdHNlbGYuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXJzcGFjZSBzZWxmdGVzdHMgKHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLyopIGFuZCBkb2VzIG5vdCBtYWtlIGFueSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCBpdHNlbGYuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMDNUMDE6MDM6MTQuMjIwMTg0MDg2WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODk5MjIzMDgzMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2Vyc3BhY2Ugc2VsZnRlc3RzICh0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8qKSBhbmQgZG9lcyBub3QgbWFrZSBhbnkgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgaXRzZWxmLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDNUMDE6MDM6MTQuMjIwMTkwNjY2WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MjIxOTIyMjIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAzZmE0MDMyNGM5MTFjZGQ5ZjQzNTI2NmQzZWNlZWE2YjUyZWY3MWM2XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gQXVnIDMgMDE6MDM6MTMgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLmdpdGlnbm9yZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy5naXRpZ25vcmVcXG5pbmRleCA5Y2NkOWUxNDQ3ZTY2Li42MTYwNDNhMGZjZDIyIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy5naXRpZ25vcmVcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8uZ2l0aWdub3JlXFxuQEAgLTY2LDMgKzY2LDYgQEAgbWVyZ2VcXG4gcHJjdGxfdGhwX2Rpc2FibGVcXG4gcm1hcFxcbiBmb2xpb19zcGxpdF9yYWNlX3Rlc3RcXG4rZm9saW9fb3JkZXJfY2hlY2tcXG4ra2h1Z2VwYWdlZF9zeW5jX2NoZWNrXFxuK2todWdlcGFnZWRfcmFjZVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXFxuaW5kZXggMjVkMTBjZWQzYjNiOS4uMDI2ZDRiNjE0MTRkNCAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXFxuQEAgLTEwNCw2ICsxMDQsOSBAQCBURVNUX0dFTl9GSUxFUyArPSBndWFyZC1yZWdpb25zXFxuIFRFU1RfR0VOX0ZJTEVTICs9IG1lcmdlXFxuIFRFU1RfR0VOX0ZJTEVTICs9IHJtYXBcXG4gVEVTVF9HRU5fRklMRVMgKz0gZm9saW9fc3BsaXRfcmFjZV90ZXN0XFxuK1RFU1RfR0VOX0ZJTEVTICs9IGZvbGlvX29yZGVyX2NoZWNrXFxuK1RFU1RfR0VOX0ZJTEVTICs9IGtodWdlcGFnZWRfc3luY19jaGVja1xcbitURVNUX0dFTl9GSUxFUyArPSBraHVnZXBhZ2VkX3JhY2VcXG4gXFxuIGlmbmVxICgkKEFSQ0gpLGFybTY0KVxcbiBURVNUX0dFTl9GSUxFUyArPSBzb2Z0LWRpcnR5XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi5mNzBkNzY2ZmYzZWIzXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmNcXG5AQCAtMCwwICsxLDEzOCBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBTZWxmLWNoZWNrIGZvciB0aGUgdm1fdXRpbCBmb2xpby1vcmRlciBkZXRlY3Rpb24gaGVscGVycyxcXG4rICogaXNfYmFja2VkX2J5X2ZvbGlvKCkgYW5kIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMoKS5cXG4rICpcXG4rICogRm9yIGV2ZXJ5IGFub24gVEhQIG9yZGVyIHRoZSBrZXJuZWwgc3VwcG9ydHMsIGZhdWx0IG1lbW9yeSBpbiB3aXRoIG9ubHlcXG4rICogdGhhdCBvcmRlciBlbmFibGVkIGFuZCB2ZXJpZnkgdGhlIGhlbHBlcnMgcmVwb3J0IGV4YWN0bHkgdGhhdCBvcmRlcjpcXG4rICogbm90IGEgbmVpZ2hib3VyaW5nIG9yZGVyLCBhbmQgcGxhaW4gNEsgbWVtb3J5IGFzIG9yZGVyIDAuIFRoZSBoZWxwZXJzXFxuKyAqIGFyZSB3aGF0IHRoZSBraHVnZXBhZ2VkIG1USFAgdGVzdHMgdXNlIHRvIGRldGVjdCBjb2xsYXBzZSByZXN1bHRzLCBzb1xcbisgKiB0aGV5IG11c3QgYWdyZWUgd2l0aCB0aGUga2VybmVsJ3Mgb3duIGlkZWEgb2YgdGhlIGJhY2tpbmcgYmVmb3JlIGFueVxcbisgKiBjb2xsYXBzZSB0ZXN0IHJlbGllcyBvbiB0aGVtLlxcbisgKi9cXG4rI2RlZmluZSBfR05VX1NPVVJDRVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9tbWFuLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcXCJrc2VsZnRlc3QuaFxcXCJcXG4rI2luY2x1ZGUgXFxcInZtX3V0aWwuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImh1Z2VwYWdlX3NldHRpbmdzLmhcXFwiXFxuK1xcbitzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7XFxuK3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDtcXG4rXFxuKy8qIG1tYXAgYW4gYW5vbiBWTUEgb2YgZXhhY3RseSBAc2l6ZSBieXRlcyBhdCBhIEBzaXplLWFsaWduZWQgYWRkcmVzcy4gKi9cXG4rc3RhdGljIGNoYXIgKmFsbG9jX2FsaWduZWQoc2l6ZV90IHNpemUpXFxuK3tcXG4rXFx0c2l6ZV90IGxlbiA9IHNpemUgKiAyO1xcbitcXHR1aW50cHRyX3QgYWxpZ25lZDtcXG4rXFx0Y2hhciAqcDtcXG4rXFxuK1xcdHAgPSBtbWFwKE5VTEwsIGxlbiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcXG4rXFx0XFx0IE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSwgLTEsIDApO1xcbitcXHRpZiAocCA9PSBNQVBfRkFJTEVEKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1tYXAoKVxcXCIpO1xcbitcXG4rXFx0YWxpZ25lZCA9ICgodWludHB0cl90KXAgKyBzaXplIC0gMSkgXFx1MDAyNiB+KHNpemUgLSAxKTtcXG4rXFx0aWYgKGFsaWduZWQgIT0gKHVpbnRwdHJfdClwKVxcbitcXHRcXHRtdW5tYXAocCwgYWxpZ25lZCAtICh1aW50cHRyX3QpcCk7XFxuK1xcdGlmIChhbGlnbmVkICsgc2l6ZSAhPSAodWludHB0cl90KXAgKyBsZW4pXFxuK1xcdFxcdG11bm1hcCgoY2hhciAqKWFsaWduZWQgKyBzaXplLFxcbitcXHRcXHQgICAgICAgKHVpbnRwdHJfdClwICsgbGVuIC0gYWxpZ25lZCAtIHNpemUpO1xcbitcXG4rXFx0cmV0dXJuIChjaGFyICopYWxpZ25lZDtcXG4rfVxcbitcXG4rLypcXG4rICogRW5hYmxlIG9ubHkgQG9yZGVyIChvcmRlciAwOiBub3RoaW5nKSwgZmF1bHQgb25lIGFsaWduZWQgd2luZG93IGluIGFuZFxcbisgKiBjaGVjayB0aGUgaGVscGVycyBzZWUgZXhhY3RseSBAb3JkZXIuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCBjaGVja19vcmRlcihpbnQgb3JkZXIpXFxuK3tcXG4rXFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xcbitcXHRzaXplX3Qgc2l6ZSA9IHBzaXplKCkgXFx1MDAzY1xcdTAwM2Mgb3JkZXI7XFxuK1xcdGJvb2wgb2sgPSB0cnVlO1xcbitcXHRjaGFyICpwO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBOUl9PUkRFUlM7IGkrKylcXG4rXFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XFxuK1xcdGlmIChvcmRlcilcXG4rXFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcXG4rXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFxuK1xcdHAgPSBhbGxvY19hbGlnbmVkKHNpemUpO1xcbitcXHQqcCA9IDE7XFxuK1xcbitcXHRpZiAoIWlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgb3JkZXIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIm9yZGVyICVkIG5vdCBkZXRlY3RlZCBhZnRlciBmYXVsdFxcXFxuXFxcIiwgb3JkZXIpO1xcbitcXHRcXHRvayA9IGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHQvKiBBIGxvd2VyIG9yZGVyIG11c3QgYmUgcmVqZWN0ZWQ6IHRoZSBmb2xpbyBpcyBsYXJnZXIuICovXFxuK1xcdGlmIChvcmRlciBcXHUwMDI2XFx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIG9yZGVyIC0gMSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBwYWdlbWFwX2ZkLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgIGtwYWdlZmxhZ3NfZmQpKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICAgICAgb3JkZXIsIG9yZGVyIC0gMSk7XFxuK1xcdFxcdG9rID0gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIE9yZGVyIDAgcGFnZXMgbXVzdCBub3QgbG9vayBsaWtlIGFueSBsYXJnZSBmb2xpbywgYW5kIHZpY2UgdmVyc2EuICovXFxuK1xcdGlmIChvcmRlciBcXHUwMDI2XFx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIDAsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgcGFnZW1hcF9mZCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBrcGFnZWZsYWdzX2ZkKSkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwib3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAwXFxcXG5cXFwiLCBvcmRlcik7XFxuK1xcdFxcdG9rID0gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdG11bm1hcChwLCBzaXplKTtcXG4rXFx0dGhwX3BvcF9zZXR0aW5ncygpO1xcbitcXG4rXFx0a3NmdF90ZXN0X3Jlc3VsdChvaywgXFxcIm9yZGVyICVkIGNsYXNzaWZpZWRcXFxcblxcXCIsIG9yZGVyKTtcXG4rfVxcbitcXG4raW50IG1haW4odm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xcbitcXHR1bnNpZ25lZCBsb25nIG9yZGVycztcXG4rXFx0aW50IG9yZGVyO1xcbitcXG4rXFx0a3NmdF9wcmludF9oZWFkZXIoKTtcXG4rXFxuK1xcdGlmICghdGhwX2F2YWlsYWJsZSgpKVxcbitcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXFxcblxcXCIpO1xcbitcXG4rXFx0cGFnZW1hcF9mZCA9IG9wZW4oXFxcIi9wcm9jL3NlbGYvcGFnZW1hcFxcXCIsIE9fUkRPTkxZKTtcXG4rXFx0aWYgKHBhZ2VtYXBfZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm9wZW4oXFxcXFxcXCIvcHJvYy9zZWxmL3BhZ2VtYXBcXFxcXFxcIilcXFwiKTtcXG4rXFx0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXFxcIi9wcm9jL2twYWdlZmxhZ3NcXFwiLCBPX1JET05MWSk7XFxuK1xcdGlmIChrcGFnZWZsYWdzX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIm9wZW4oXFxcXFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcXFxcXCIpIHJlcXVpcmVzIHJvb3RcXFxcblxcXCIpO1xcbitcXG4rXFx0b3JkZXJzID0gdGhwX3N1cHBvcnRlZF9vcmRlcnMoKTtcXG4rXFx0aWYgKCFvcmRlcnMpXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJObyBzdXBwb3J0ZWQgVEhQIG9yZGVyc1xcXFxuXFxcIik7XFxuK1xcbitcXHRrc2Z0X3NldF9wbGFuKF9fYnVpbHRpbl9wb3Bjb3VudGwob3JkZXJzKSArIDEpO1xcbitcXG4rXFx0dGhwX3NhdmVfc2V0dGluZ3MoKTtcXG4rXFx0dGhwX3JlYWRfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFx0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqL1xcbitcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXG4rXFx0Y2hlY2tfb3JkZXIoMCk7XFxuK1xcdGZvciAob3JkZXIgPSAxOyBvcmRlciBcXHUwMDNjIE5SX09SREVSUzsgb3JkZXIrKykge1xcbitcXHRcXHRpZiAoIShvcmRlcnMgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIG9yZGVyKSkpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRjaGVja19vcmRlcihvcmRlcik7XFxuK1xcdH1cXG4rXFxuK1xcdHRocF9yZXN0b3JlX3NldHRpbmdzKCk7XFxuK1xcbitcXHRrc2Z0X2ZpbmlzaGVkKCk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcXG5pbmRleCBkNzkxN2RjZTNhYmFjLi5hMjZhMGNmZmE5YzViIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jXFxuQEAgLTE4Myw2ICsxODMsMTcgQEAgdm9pZCB0aHBfcmVhZF9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcXG4gXFx0fVxcbiB9XFxuIFxcbisvKlxcbisgKiBXcml0ZSBvbmx5IG9uIGNoYW5nZTogYW55IHN0b3JlIHRvIGEga2h1Z2VwYWdlZCBzeXNmcyBrbm9iIHdha2VzIHRoZVxcbisgKiBkYWVtb24sIGFuZCBzZXR0aW5ncyBwdXNoZXMvcG9wcyBtdXN0IG5vdCBzdGFydCBzY2FuIHBhc3NlcyBub2JvZHlcXG4rICogYXNrZWQgZm9yIOKAlCBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIGlzIHRoZSBvbmx5IHNhbmN0aW9uZWQgd2FrZS5cXG4rICovXFxuK3N0YXRpYyB2b2lkIHRocF91cGRhdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKVxcbit7XFxuK1xcdGlmICh0aHBfcmVhZF9udW0obmFtZSkgIT0gbnVtKVxcbitcXHRcXHR0aHBfd3JpdGVfbnVtKG5hbWUsIG51bSk7XFxuK31cXG4rXFxuIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxcbiB7XFxuIFxcdHN0cnVjdCBraHVnZXBhZ2VkX3NldHRpbmdzICpraHVnZXBhZ2VkID0gXFx1MDAyNnNldHRpbmdzLVxcdTAwM2VraHVnZXBhZ2VkO1xcbkBAIC0xOTgsMTUgKzIwOSwxNSBAQCB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcXG4gXFx0XFx0XFx0c2htZW1fZW5hYmxlZF9zdHJpbmdzW3NldHRpbmdzLVxcdTAwM2VzaG1lbV9lbmFibGVkXSk7XFxuIFxcdHRocF93cml0ZV9udW0oXFxcInVzZV96ZXJvX3BhZ2VcXFwiLCBzZXR0aW5ncy1cXHUwMDNldXNlX3plcm9fcGFnZSk7XFxuIFxcbi1cXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL2RlZnJhZ1xcXCIsIGtodWdlcGFnZWQtXFx1MDAzZWRlZnJhZyk7XFxuLVxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXFxcIixcXG4tXFx0XFx0XFx0a2h1Z2VwYWdlZC1cXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcXG4tXFx0dGhwX3dyaXRlX251bShcXFwia2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1xcXCIsXFxuLVxcdFxcdFxcdGtodWdlcGFnZWQtXFx1MDAzZXNjYW5fc2xlZXBfbWlsbGlzZWNzKTtcXG4tXFx0dGhwX3dyaXRlX251bShcXFwia2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXFxcIiwga2h1Z2VwYWdlZC1cXHUwMDNlbWF4X3B0ZXNfbm9uZSk7XFxuLVxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvbWF4X3B0ZXNfc3dhcFxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZW1heF9wdGVzX3N3YXApO1xcbi1cXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL21heF9wdGVzX3NoYXJlZFxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZW1heF9wdGVzX3NoYXJlZCk7XFxuLVxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvcGFnZXNfdG9fc2NhblxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZXBhZ2VzX3RvX3NjYW4pO1xcbitcXHR0aHBfdXBkYXRlX251bShcXFwia2h1Z2VwYWdlZC9kZWZyYWdcXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VkZWZyYWcpO1xcbitcXHR0aHBfdXBkYXRlX251bShcXFwia2h1Z2VwYWdlZC9hbGxvY19zbGVlcF9taWxsaXNlY3NcXFwiLFxcbitcXHRcXHQgICAgICAga2h1Z2VwYWdlZC1cXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcXFwiLFxcbitcXHRcXHQgICAgICAga2h1Z2VwYWdlZC1cXHUwMDNlc2Nhbl9zbGVlcF9taWxsaXNlY3MpO1xcbitcXHR0aHBfdXBkYXRlX251bShcXFwia2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXFxcIiwga2h1Z2VwYWdlZC1cXHUwMDNlbWF4X3B0ZXNfbm9uZSk7XFxuK1xcdHRocF91cGRhdGVfbnVtKFxcXCJraHVnZXBhZ2VkL21heF9wdGVzX3N3YXBcXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VtYXhfcHRlc19zd2FwKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkXFxcIiwga2h1Z2VwYWdlZC1cXHUwMDNlbWF4X3B0ZXNfc2hhcmVkKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvcGFnZXNfdG9fc2NhblxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZXBhZ2VzX3RvX3NjYW4pO1xcbiBcXG4gXFx0aWYgKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGhbMF0pXFxuIFxcdFxcdHdyaXRlX251bShkZXZfcXVldWVfcmVhZF9haGVhZF9wYXRoLCBzZXR0aW5ncy1cXHUwMDNlcmVhZF9haGVhZF9rYik7XFxuQEAgLTIzMCw2ICsyNDEsNDMgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXFxuIFxcdH1cXG4gfVxcbiBcXG4rLypcXG4rICogQ29tcGxldGlvbiBiYXJyaWVyIGZvciBraHVnZXBhZ2VkOiB3YWl0IHVudGlsIGEgZnVsbCBzY2FuIHBhc3MgdGhhdFxcbisgKiBzdGFydGVkIGFmdGVyIHRoaXMgY2FsbCBoYXMgZmluaXNoZWQuIGZ1bGxfc2NhbnMgbXVzdCBhZHZhbmNlIGJ5IHR3bztcXG4rICogYSArMSBzdGVwIG1heSBjb21wbGV0ZSBhIHBhc3MgdGhhdCBleGFtaW5lZCB0aGlzIG1tIGJlZm9yZSB0aGVcXG4rICogY2FsbGVyJ3Mgc2V0dXAgd2FzIGluIHBsYWNlLlxcbisgKlxcbisgKiBBbnkgc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgc28gdGhlIGJhcnJpZXJcXG4rICogd29ya3MgcmVnYXJkbGVzcyBvZiB0aGUgY29uZmlndXJlZCBzY2FuIGNhZGVuY2UuIEl0IHdha2VzIGV4YWN0bHlcXG4rICogb25jZSBwZXIgbWlzc2luZyBwYXNzIOKAlCBvdmVyLXdha2luZyB3b3VsZCBxdWV1ZSBhIHN0cmFnZ2xlciBwYXNzXFxuKyAqIGJlaGluZCB0aGUgYmFycmllciwgcGVydHVyYmluZyB3aGF0ZXZlciB0aGUgY2FsbGVyIHNldHMgdXAgbmV4dC5cXG4rICogT25lIHdha2UgY29tcGxldGVzIG9uZSBmdWxsIHBhc3Mgb25seSBpZiB0aGUgd2hvbGUgbW0gbGlzdCBmaXRzIGluXFxuKyAqIG9uZSBzY2FuIGJhdGNoLCBzbyBjYWxsZXJzIG11c3QgcGFpciB0aGlzIHdpdGggYSBsYXJnZVxcbisgKiBwYWdlc190b19zY2FuLlxcbisgKi9cXG4rYm9vbCBraHVnZXBhZ2VkX2Z1bGxfcGFzcyh1bnNpZ25lZCBpbnQgdGltZW91dF9zKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZGVhZGxpbmVfbXMgPSB0aW1lb3V0X3MgKiAxMDAwVUw7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc2xlZXBfbXMgPVxcbitcXHRcXHR0aHBfcmVhZF9udW0oXFxcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcXFwiKTtcXG4rXFx0dW5zaWduZWQgbG9uZyBlbGFwc2VkX21zID0gMDtcXG4rXFx0aW50IHBhc3M7XFxuK1xcbitcXHRmb3IgKHBhc3MgPSAwOyBwYXNzIFxcdTAwM2MgMjsgcGFzcysrKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgdGFyZ2V0ID1cXG4rXFx0XFx0XFx0dGhwX3JlYWRfbnVtKFxcXCJraHVnZXBhZ2VkL2Z1bGxfc2NhbnNcXFwiKSArIDE7XFxuK1xcbitcXHRcXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXFxcIiwgc2xlZXBfbXMpO1xcbitcXHRcXHR3aGlsZSAodGhwX3JlYWRfbnVtKFxcXCJraHVnZXBhZ2VkL2Z1bGxfc2NhbnNcXFwiKSBcXHUwMDNjIHRhcmdldCkge1xcbitcXHRcXHRcXHRpZiAoZWxhcHNlZF9tcyBcXHUwMDNlPSBkZWFkbGluZV9tcylcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHRcXHR1c2xlZXAoMTAgKiAxMDAwKTtcXG4rXFx0XFx0XFx0ZWxhcHNlZF9tcyArPSAxMDtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbiBzdHJ1Y3QgdGhwX3NldHRpbmdzICp0aHBfY3VycmVudF9zZXR0aW5ncyh2b2lkKVxcbiB7XFxuIFxcdGlmICghc2V0dGluZ3NfaW5kZXgpIHtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcXG5pbmRleCA3MjZjNzNjNDNjMDViLi44ZGU0NDZhZmZlZWNkIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXFxuQEAgLTgzLDYgKzgzLDggQEAgc3RhdGljIGlubGluZSB2b2lkIHRocF9zYXZlX3NldHRpbmdzKHZvaWQpXFxuIFxcdGh1Z2VwYWdlX3NhdmVfc2V0dGluZ3MoLyogdGhwID0gKi8gdHJ1ZSwgLyogaHVnZXRsYiA9ICovIGZhbHNlKTtcXG4gfVxcbiBcXG4rYm9vbCBraHVnZXBhZ2VkX2Z1bGxfcGFzcyh1bnNpZ25lZCBpbnQgdGltZW91dF9zKTtcXG4rXFxuIHZvaWQgdGhwX3NldF9yZWFkX2FoZWFkX3BhdGgoY2hhciAqcGF0aCk7XFxuIHVuc2lnbmVkIGxvbmcgdGhwX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7XFxuIHVuc2lnbmVkIGxvbmcgdGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xcbmluZGV4IDEwZThkZWRjYjA4N2QuLmM1YTNjMzkyMjU4MTkgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXFxuQEAgLTI2LDkgKzI2LDEzIEBAXFxuIFxcbiAjZGVmaW5lIEJBU0VfQUREUiAoKHZvaWQgKikoMVVMIFxcdTAwM2NcXHUwMDNjIDMwKSlcXG4gc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XFxuK3N0YXRpYyBpbnQgaHBhZ2VfcG1kX29yZGVyO1xcbiBzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7XFxuIHN0YXRpYyBpbnQgaHBhZ2VfcG1kX25yO1xcbiBzdGF0aWMgaW50IGFub25fb3JkZXI7XFxuK3N0YXRpYyBpbnQgYW5vbl90YXJnZXRfb3JkZXI7XFxuK3N0YXRpYyBpbnQgcGFnZW1hcF9mZCA9IC0xO1xcbitzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQgPSAtMTtcXG4gXFxuICNkZWZpbmUgUElEX1NNQVBTIFxcXCIvcHJvYy9zZWxmL3NtYXBzXFxcIlxcbiAjZGVmaW5lIFRFU1RfRklMRSBcXFwiY29sbGFwc2VfdGVzdF9maWxlXFxcIlxcbkBAIC0xNzcsNiArMTgxLDIxIEBAIHN0YXRpYyB2b2lkIGdldF9maW5mbyhjb25zdCBjaGFyICpkaXIpXFxuIFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiJXM6IENvdWxkIG5vdCByZWFkOiAlc1xcXFxuXFxcIiwgX19mdW5jX18sIHBhdGgpO1xcbiB9XFxuIFxcbitzdGF0aWMgYm9vbCBoYXNfc3dhcCh2b2lkKVxcbit7XFxuK1xcdEZJTEUgKmZwID0gZm9wZW4oXFxcIi9wcm9jL3N3YXBzXFxcIiwgXFxcInJcXFwiKTtcXG4rXFx0Y2hhciBsaW5lW01BWF9MSU5FX0xFTkdUSF07XFxuK1xcdGJvb2wgcmV0ID0gZmFsc2U7XFxuK1xcbitcXHRpZiAoIWZwKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdC8qIEZpcnN0IGxpbmUgaXMgdGhlIGhlYWRlcjsgYW55IGZvbGxvd2luZyBsaW5lIGlzIGEgc3dhcCBhcmVhLiAqL1xcbitcXHRpZiAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkgXFx1MDAyNlxcdTAwMjYgZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpXFxuK1xcdFxcdHJldCA9IHRydWU7XFxuK1xcdGZjbG9zZShmcCk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuIHN0YXRpYyBib29sIGNoZWNrX3N3YXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKVxcbiB7XFxuIFxcdGJvb2wgc3dhcCA9IGZhbHNlO1xcbkBAIC01NTQsOCArNTczLDE3IEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfY29sbGFwc2UoY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBpbnQgbnJfaHBhZ2VzLFxcbiBzdGF0aWMgYm9vbCB3YWl0X2Zvcl9zY2FuKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgaW50IG5yX2hwYWdlcyxcXG4gXFx0XFx0XFx0ICBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbiB7XFxuK1xcdC8qXFxuK1xcdCAqIFRoZSBidWRnZXQgaGFzIHRvIGNvdmVyIGtodWdlcGFnZWQgY29weWluZyBucl9ocGFnZXMgKlxcbitcXHQgKiBocGFnZV9wbWRfc2l6ZSwgcGx1cyB0d28gb2YgaXRzIHBhc3NlcyBvdmVyIHRoZSBtbS4gVGhyZWUgc2Vjb25kc1xcbitcXHQgKiBkb2VzIHRoYXQgYXQgYSAyTSBQTUQsIGJ1dCB0aGUgc2FtZSB0ZXN0IG1vdmVzIDJHIGF0IGEgNTEyTSBQTURcXG4rXFx0ICogKGFybTY0IHdpdGggNjRLIGJhc2UgcGFnZXMpIGFuZCAzcyBpcyB0aGVuIG1hcmdpbmFsOiBpdCBmYWlscyBvbiBhXFxuK1xcdCAqIGNvbGxhcHNlIHRoYXQgY29tcGxldGVzIGNvcnJlY3RseSwganVzdCBub3QgaW5zaWRlIHRoZSBidWRnZXQuXFxuK1xcdCAqIEFsbG93IGEgZnVydGhlciBzZWNvbmQgcGVyIDY0TSB0byBjb2xsYXBzZS5cXG4rXFx0ICovXFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgYnl0ZXMgPSAodW5zaWduZWQgbG9uZylucl9ocGFnZXMgKiBocGFnZV9wbWRfc2l6ZTtcXG4rXFx0aW50IHRpbWVvdXQgPSA2ICsgMiAqIChieXRlcyAvICg2NFVMIFxcdTAwM2NcXHUwMDNjIDIwKSk7XFxuIFxcdGludCBmdWxsX3NjYW5zO1xcbi1cXHRpbnQgdGltZW91dCA9IDY7IC8qIDMgc2Vjb25kcyAqL1xcbiBcXG4gXFx0LyogU2FuaXR5IGNoZWNrICovXFxuIFxcdGlmICghb3BzLVxcdTAwM2VjaGVja19odWdlKHAsIDApKVxcbkBAIC03MzUsNiArNzYzLDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX3N3YXBpbl9zaW5nbGVfcHRlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wXFxuIFxcdHZvaWQgKnA7XFxuIFxcbiBcXHRwID0gb3BzLVxcdTAwM2VzZXR1cF9hcmVhKDEpO1xcbitcXHRpZiAoIWhhc19zd2FwKCkpIHtcXG4rXFx0XFx0c2tpcChcXFwiU2tpcCAobm8gc3dhcCBjb25maWd1cmVkKVxcXCIpO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbiBcXHRvcHMtXFx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcXG4gXFxuIFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJTd2Fwb3V0IG9uZSBwYWdlLi4uXFxcIik7XFxuQEAgLTc2MSw2ICs3OTMsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9cXG4gXFx0dm9pZCAqcDtcXG4gXFxuIFxcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuK1xcdGlmICghaGFzX3N3YXAoKSkge1xcbitcXHRcXHRza2lwKFxcXCJTa2lwIChubyBzd2FwIGNvbmZpZ3VyZWQpXFxcIik7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuIFxcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xcbiBcXG4gXFx0a3NmdF9wcmludF9tc2coXFxcIlN3YXBvdXQgJWQgb2YgJWQgcGFnZXMuLi5cXFwiLCBtYXhfcHRlc19zd2FwICsgMSwgaHBhZ2VfcG1kX25yKTtcXG5AQCAtODUzLDYgKzg4OSwyMSBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb21wb3VuZF9leHRyZW1lKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wc1xcbiBcXHR2b2lkICpwO1xcbiBcXHRpbnQgaTtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIEJ1aWxkcyBhIFBNRCdzIHdvcnRoIG9mIGRpc3RpbmN0IFBURS1tYXBwZWQgY29tcG91bmQgcGFnZXMgYnkgY3ljbGluZ1xcbitcXHQgKiBocGFnZV9wbWRfbnIgZmF1bHQtdGltZSBUSFBzIHRocm91Z2ggbXJlbWFwLiBGYXVsdC10aW1lIFRIUCBhbGxvY2F0aW9uXFxuK1xcdCAqIGlzIGJlc3QtZWZmb3J0LCBhbmQgdGhpcyBuZWVkcyBocGFnZV9wbWRfbnIgUE1ELW9yZGVyIHBhZ2VzIGluIGEgcm93OlxcbitcXHQgKiBmaW5lIGF0IGEgMk0gKDRLIGJhc2UpIG9yIDMyTSAoMTZLIGJhc2UpIFBNRCwgYnV0IGEgNTEyTSBQTUQgKGFybTY0LzY0SylcXG4rXFx0ICogaXMgYW4gb3JkZXItMTMgYWxsb2NhdGlvbiB0aGUgYWxsb2NhdG9yIGNhbm5vdCByZWxpYWJseSBoYW5kIG91dCBldmVuXFxuK1xcdCAqIG9uY2UsIGxldCBhbG9uZSA4MTkyIHRpbWVzLiBDYXAgYXQgYSAzMk0gUE1EOyBNQURWX0NPTExBUFNFLWRyaXZlbiBjYXNlc1xcbitcXHQgKiBzdGlsbCBjb3ZlciBQTUQtb3JkZXIgY29sbGFwc2Ugb24gdGhlIGxhcmdlciBjb25maWdzLlxcbitcXHQgKi9cXG4rXFx0aWYgKGhwYWdlX3BtZF9zaXplIFxcdTAwM2UgKDMyVUwgXFx1MDAzY1xcdTAwM2MgMjApKSB7XFxuK1xcdFxcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcXFwiJXM6IFBNRCB0b28gbGFyZ2UgZm9yIGZhdWx0LXRpbWUgVEhQIGNvbnN0cnVjdGlvblxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0ICAgICAgX19mdW5jX18pO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuIFxcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuIFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJDb25zdHJ1Y3QgUFRFIHBhZ2UgdGFibGUgZnVsbCBvZiBkaWZmZXJlbnQgUFRFLW1hcHBlZCBjb21wb3VuZCBwYWdlc1xcXFxuXFxcIik7XFxuIFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBocGFnZV9wbWRfbnI7IGkrKykge1xcbkBAIC0xMDQzLDYgKzEwOTQsNjEgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wc1xcbiBcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuIH1cXG4gXFxuKy8qXFxuKyAqIENvbnRlbnQgc3RheXMgaXNvbGF0ZWQgd2hpbGUgYSBjby1zaGFyZXIgd3JpdGVzIGNvbmN1cnJlbnRseS4gQSBzaGFyZWRcXG4rICogc291cmNlIGlzIGNvcGllZCBsaXZlIChub3QgZnJvemVuKSwgcmVseWluZyBvbiBpdCBiZWluZyBDb1cgLSBpbW11dGFibGVcXG4rICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29weTsgYSBjby1zaGFyZXIncyB3cml0ZSBnb2VzIHRvIGEgQ29XIGNvcHkuIFRoZVxcbisgKiBjb2xsYXBzaW5nIGNoaWxkIG11c3Qgc2VlIHRoZSBwcmUtZm9yayBjb250ZW50LCB0aGUgd3JpdGluZyBwYXJlbnQgb25seVxcbisgKiBpdHMgb3duIHdyaXRlcy5cXG4rICovXFxuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX2ZvcmtfY293X3JhY2Uoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuK3tcXG4rXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBzaGFyZWQgPSA2NCAqIHBhZ2Vfc2l6ZTtcXG4rXFx0Y29uc3QgaW50IHN0cmlkZSA9IHBhZ2Vfc2l6ZSAvIHNpemVvZihpbnQpO1xcbitcXHRpbnQgd3N0YXR1cywgaSwgbiA9IHNoYXJlZCAvIHBhZ2Vfc2l6ZTtcXG4rXFx0aW50ICppcDtcXG4rXFx0dm9pZCAqcDtcXG4rXFxuK1xcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuK1xcdGlwID0gcDtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBzaGFyZWQpO1xcdFxcdC8qIHNoYXJlZCBwcmVmaXgsIHByZS1mb3JrIHBhdHRlcm4gKi9cXG4rXFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJGb3JrLCBjb2xsYXBzZSBpbiB0aGUgY2hpbGQgd2hpbGUgdGhlIHBhcmVudCByZXdyaXRlcy4uLlxcXCIpO1xcbitcXHRpZiAoIWZvcmsoKSkge1xcbitcXHRcXHRvcHMtXFx1MDAzZWZhdWx0KHAsIHNoYXJlZCwgaHBhZ2VfcG1kX3NpemUpO1xcdC8qIHByaXZhdGUgcmVtYWluZGVyICovXFxuK1xcdFxcdGMtXFx1MDAzZWNvbGxhcHNlKFxcXCJDb2xsYXBzZSBhIHJhbmdlIHNoYXJlZCB3aXRoIGEgd3JpdGluZyBjby1zaGFyZXJcXFwiLFxcbitcXHRcXHRcXHQgICAgcCwgMSwgb3BzLCB0cnVlKTtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG47IGkrKylcXG4rXFx0XFx0XFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgKyAweGRlYWQwMDAwKSB7XFxuK1xcdFxcdFxcdFxcdGZhaWwoXFxcIkZhaWw6IGNoaWxkIGNvbnRlbnRcXFwiKTtcXG4rXFx0XFx0XFx0XFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHRcXHRcXHRcXHRfZXhpdChleGl0X3N0YXR1cyk7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4rXFx0XFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHRcXHRfZXhpdChleGl0X3N0YXR1cyk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIEhhbW1lciB0aGUgcGFyZW50J3Mgb3duIHdyaXRlcyBvdmVyIHRoZSBzaGFyZWQgcHJlZml4LiAqL1xcbitcXHRmb3IgKGludCBpdCA9IDA7IGl0IFxcdTAwM2MgMjAwMDAwOyBpdCsrKVxcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbjsgaSsrKVxcbitcXHRcXHRcXHRpcFtpICogc3RyaWRlXSA9IGkgKyAweGJlZWYwMDAwO1xcbitcXG4rXFx0d2FpdChcXHUwMDI2d3N0YXR1cyk7XFxuK1xcdGV4aXRfc3RhdHVzID0gV0VYSVRTVEFUVVMod3N0YXR1cyk7XFxuK1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ2hlY2sgdGhlIHBhcmVudCBzZWVzIG9ubHkgaXRzIG93biB3cml0ZXMuLi5cXFwiKTtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG47IGkrKylcXG4rXFx0XFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgKyAweGJlZWYwMDAwKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0aWYgKGkgPT0gbilcXG4rXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRmYWlsKFxcXCJGYWlsOiBwYXJlbnQgY29udGVudFxcXCIpO1xcbitcXHRvcHMtXFx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rfVxcbitcXG4gc3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxcbiBcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbiB7XFxuQEAgLTEwODgsNiArMTE5NCwyMjIgQEAgc3RhdGljIHZvaWQgbWFkdmlzZV9yZXRyYWN0ZWRfcGFnZV90YWJsZXMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXFxuIFxcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4gfVxcbiBcXG4rLypcXG4rICogT3JkZXItcGFyYW1ldGVyaXplZCBjb2xsYXBzZSBjYXNlcyAoLW8gXFx1MDAzY29yZGVyXFx1MDAzZSk6IGtodWdlcGFnZWQgY29sbGFwc2VzXFxuKyAqIDRLLWZhdWx0ZWQgbWVtb3J5IGludG8gZm9saW9zIG9mIHRoZSBnaXZlbiBzdWItUE1EIG9yZGVyLiBEZXRlY3Rpb24gaXNcXG4rICogZm9saW8tYmFzZWQgKHZtX3V0aWwpLCBub3Qgc21hcHM6IEFub25IdWdlUGFnZXMgb25seSBhY2NvdW50cyBQTURcXG4rICogbWFwcGluZ3MuXFxuKyAqXFxuKyAqIFRoZSByZWdpb24gaXMgZmF1bHRlZCBiZWZvcmUgTUFEVl9IVUdFUEFHRSBhbmQgdGhlIHRhcmdldCBvcmRlciBpc1xcbisgKiBjb25maWd1cmVkIFxcXCJpbmhlcml0XFxcIiB1bmRlciBlbmFibGVkPW1hZHZpc2UsIHNvIGZhdWx0cyBhcmUgYWx3YXlzXFxuKyAqIG9yZGVyIDAgYW5kIHRoZSBjb2xsYXBzZSBwcm9kdWN0IGNhbiBvbmx5IGNvbWUgZnJvbSBraHVnZXBhZ2VkLlxcbisgKi9cXG4rc3RhdGljIHNpemVfdCBhbm9uX29yZGVyX3NpemUodm9pZClcXG4re1xcbitcXHRyZXR1cm4gcGFnZV9zaXplIFxcdTAwM2NcXHUwMDNjIGFub25fdGFyZ2V0X29yZGVyO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCByYW5nZV9jb2xsYXBzZWQodm9pZCAqcCwgc2l6ZV90IGxlbilcXG4re1xcbitcXHRyZXR1cm4gaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBsZW4sIGFub25fdGFyZ2V0X29yZGVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7XFxuK31cXG4rXFxuKy8qIE5vIGFsaWduZWQgd2luZG93IGluIFtwLCBwICsgbGVuKSBpcyBiYWNrZWQgYXQgdGhlIHRhcmdldCBvcmRlci4gKi9cXG4rc3RhdGljIGJvb2wgcmFuZ2Vfbm90X2NvbGxhcHNlZCh2b2lkICpwLCBzaXplX3QgbGVuKVxcbit7XFxuK1xcdHNpemVfdCB3aW5kb3cgPSBhbm9uX29yZGVyX3NpemUoKTtcXG4rXFx0Y2hhciAqYWRkciA9IHA7XFxuK1xcbitcXHRmb3IgKDsgbGVuIFxcdTAwM2U9IHdpbmRvdzsgYWRkciArPSB3aW5kb3csIGxlbiAtPSB3aW5kb3cpIHtcXG4rXFx0XFx0aWYgKHJhbmdlX2NvbGxhcHNlZChhZGRyLCB3aW5kb3cpKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3Modm9pZClcXG4re1xcbitcXHQvKiBXYWl0IHVwIHRvIDMwIHNlY29uZHMgZm9yIHRoZSBwYXNzIHRvIGNvbXBsZXRlLiAqL1xcbitcXHRyZXR1cm4ga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoMzApO1xcbit9XFxuK1xcbisvKlxcbisgKiBDYXNlcyB3aG9zZSBnZW9tZXRyeSBuZWVkcyBhIHdpbmRvdyBzdHJpY3RseSBiZWxvdyB0aGUgUE1EIHNraXAgYXRcXG4rICogLW8gXFx1MDAzY1BNRCBvcmRlclxcdTAwM2U7IHRoZSByZXN0IHJ1biB0aGVyZSB1bmNoYW5nZWQsIGJhc2VsaW5pbmcgdGhlIGxlZ2FjeVxcbisgKiBQTUQgZW5naW5lIHdpdGggdGhlIHNhbWUgdGVzdCB0ZXh0IHVzZWQgZm9yIHRoZSBtVEhQIG9yZGVycy5cXG4rICovXFxuK3N0YXRpYyBib29sIHNraXBfYXRfcG1kX29yZGVyKGNvbnN0IGNoYXIgKm5hbWUpXFxuK3tcXG4rXFx0aWYgKGFub25fdGFyZ2V0X29yZGVyIFxcdTAwM2MgaHBhZ2VfcG1kX29yZGVyKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcXFwiJXM6IG5lZWRzIGEgd2luZG93IGJlbG93IHRoZSBQTURcXFxcblxcXCIsIG5hbWUpO1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfZnVsbChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHR2b2lkICpwO1xcbitcXG4rXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdGlmICghcmFuZ2Vfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiVW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcXFxuXFxcIik7XFxuK1xcbitcXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcXG4rXFx0a3NmdF9wcmludF9tc2coXFxcIkNvbGxhcHNlIGZ1bGx5IHBvcHVsYXRlZCBQVEUgdGFibGUgdG8gdGFyZ2V0IG9yZGVyLi4uXFxcIik7XFxuK1xcdGlmICgha2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcygpKVxcbitcXHRcXHRmYWlsKFxcXCJUaW1lb3V0XFxcIik7XFxuK1xcdGVsc2UgaWYgKHJhbmdlX2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXFxuK1xcdFxcdHN1Y2Nlc3MoXFxcIk9LXFxcIik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0ZmFpbChcXFwiRmFpbFxcXCIpO1xcbitcXG4rXFx0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX3NpbmdsZV93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXFxuK1xcdFxcdFxcdFxcdFxcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbit7XFxuK1xcdHNpemVfdCB3aW5kb3cgPSBhbm9uX29yZGVyX3NpemUoKTtcXG4rXFx0dm9pZCAqcDtcXG4rXFxuK1xcdGlmIChza2lwX2F0X3BtZF9vcmRlcihfX2Z1bmNfXykpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuK1xcdG9wcy1cXHUwMDNlZmF1bHQocCwgd2luZG93LCAyICogd2luZG93KTtcXG4rXFx0aWYgKCFyYW5nZV9ub3RfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxcXG5cXFwiKTtcXG4rXFxuK1xcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ29sbGFwc2Ugb25lIGZ1bGx5IHBvcHVsYXRlZCB3aW5kb3cuLi5cXFwiKTtcXG4rXFx0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXFxuK1xcdFxcdGZhaWwoXFxcIlRpbWVvdXRcXFwiKTtcXG4rXFx0ZWxzZSBpZiAocmFuZ2VfY29sbGFwc2VkKHAgKyB3aW5kb3csIHdpbmRvdykgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0IHJhbmdlX25vdF9jb2xsYXBzZWQocCwgd2luZG93KSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgcmFuZ2Vfbm90X2NvbGxhcHNlZChwICsgMiAqIHdpbmRvdyxcXG4rXFx0XFx0XFx0XFx0ICAgICBocGFnZV9wbWRfc2l6ZSAtIDIgKiB3aW5kb3cpKVxcbitcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGZhaWwoXFxcIkZhaWxcXFwiKTtcXG4rXFxuK1xcdHZhbGlkYXRlX21lbW9yeShwLCB3aW5kb3csIDIgKiB3aW5kb3cpO1xcbitcXHRvcHMtXFx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXFxuK1xcdFxcdFxcdFxcdFxcdCAgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHR2b2lkICpwO1xcbitcXG4rXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBwYWdlX3NpemUpO1xcbitcXHRpZiAoIXJhbmdlX25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIlVuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXFxcblxcXCIpO1xcbitcXG4rXFx0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJDb2xsYXBzZSB3aW5kb3cgd2l0aCBzaW5nbGUgUFRFIGVudHJ5IHByZXNlbnQuLi5cXFwiKTtcXG4rXFx0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXFxuK1xcdFxcdGZhaWwoXFxcIlRpbWVvdXRcXFwiKTtcXG4rXFx0ZWxzZSBpZiAocmFuZ2VfY29sbGFwc2VkKHAsIGFub25fb3JkZXJfc2l6ZSgpKSlcXG4rXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRmYWlsKFxcXCJGYWlsXFxcIik7XFxuK1xcbitcXHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgcGFnZV9zaXplKTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXFxuK1xcdFxcdFxcdFxcdFxcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbit7XFxuK1xcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcXG4rXFx0c2l6ZV90IHdpbmRvdyA9IGFub25fb3JkZXJfc2l6ZSgpO1xcbitcXHR2b2lkICpwO1xcbitcXG4rXFx0aWYgKHNraXBfYXRfcG1kX29yZGVyKF9fZnVuY19fKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gMDtcXG4rXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFxuK1xcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuK1xcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7XFxuK1xcdGlmICghcmFuZ2Vfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiVW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcXFxuXFxcIik7XFxuK1xcbitcXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcXG4rXFx0a3NmdF9wcmludF9tc2coXFxcIkNvbGxhcHNlIGZ1bGwgd2luZG93LCBub3QgdGhlIG9uZSBtaXNzaW5nIGEgcGFnZS4uLlxcXCIpO1xcbitcXHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcXG4rXFx0XFx0ZmFpbChcXFwiVGltZW91dFxcXCIpO1xcbitcXHRlbHNlIGlmIChyYW5nZV9jb2xsYXBzZWQocCwgd2luZG93KSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgcmFuZ2Vfbm90X2NvbGxhcHNlZChwICsgd2luZG93LCB3aW5kb3cpKVxcbitcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGZhaWwoXFxcIkZhaWxcXFwiKTtcXG4rXFxuK1xcdHZhbGlkYXRlX21lbW9yeShwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rfVxcbitcXG4rLyogU21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCB3aWxsIGNvbnNpZGVyIGZvciBtVEhQIGNvbGxhcHNlLiAqL1xcbisjZGVmaW5lIE1JTl9NVEhQX09SREVSIDJcXG4rXFxuKy8qXFxuKyAqIEEgcmVnaW9uIGJhY2tlZCBieSBsYXJnZSBmb2xpb3Mgb2YgYSBzbWFsbGVyIG9yZGVyIGlzIGEgdmFsaWQgc291cmNlXFxuKyAqIGZvciBjb2xsYXBzZSB0byB0aGUgdGFyZ2V0IG9yZGVyOlxcbisgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKCkgYWNjZXB0cyBhbnkgc291cmNlIGZvbGlvIG9mIGFuIG9yZGVyXFxuKyAqIHN0cmljdGx5IGJlbG93IHRoZSBjYW5kaWRhdGUncy5cXG4rICovXFxuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXFxuK1xcdFxcdFxcdFxcdFxcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbit7XFxuK1xcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcXG4rXFx0aW50IHNvdXJjZV9vcmRlciA9IGFub25fb3JkZXIgPyBhbm9uX29yZGVyIDogTUlOX01USFBfT1JERVI7XFxuK1xcdHZvaWQgKnA7XFxuK1xcbitcXHQvKiBTb3VyY2VzIG11c3QgYmUgYSBzdXBwb3J0ZWQgbVRIUCBvcmRlciBzdHJpY3RseSBiZWxvdyB0aGUgdGFyZ2V0LiAqL1xcbitcXHRpZiAoc291cmNlX29yZGVyIFxcdTAwM2U9IGFub25fdGFyZ2V0X29yZGVyIHx8XFxuK1xcdCAgICAhKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIHNvdXJjZV9vcmRlcikpKSB7XFxuK1xcdFxcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcXFwiJXM6IG5vIHNvdXJjZSBvcmRlciBiZWxvdyB0YXJnZXRcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCAgICAgIF9fZnVuY19fKTtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcbitcXHQvKiBGYXVsdCB0aGUgd2hvbGUgcmVnaW9uIGFzIG9yZGVyLUBzb3VyY2Vfb3JkZXIgZm9saW9zLiAqL1xcbitcXHRzZXR0aW5ncy5odWdlcGFnZXNbc291cmNlX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcXG4rXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFxuK1xcdGlmICghaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBocGFnZV9wbWRfc2l6ZSwgc291cmNlX29yZGVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIlJlZ2lvbiBub3QgYmFja2VkIGJ5IG9yZGVyLSVkIGZvbGlvcyBhZnRlciBmYXVsdFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0ICAgc291cmNlX29yZGVyKTtcXG4rXFxuK1xcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ29sbGFwc2UgcmVnaW9uIGJhY2tlZCBieSBvcmRlci0lZCBzb3VyY2VzLi4uXFxcIixcXG4rXFx0XFx0ICAgICAgIHNvdXJjZV9vcmRlcik7XFxuK1xcdGlmICgha2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcygpKVxcbitcXHRcXHRmYWlsKFxcXCJUaW1lb3V0XFxcIik7XFxuK1xcdGVsc2UgaWYgKHJhbmdlX2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXFxuK1xcdFxcdHN1Y2Nlc3MoXFxcIk9LXFxcIik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0ZmFpbChcXFwiRmFpbFxcXCIpO1xcbitcXG4rXFx0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK31cXG4rXFxuIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXFxuIHtcXG4gXFx0ZnByaW50ZihzdGRlcnIsIFxcXCJcXFxcblVzYWdlOiAuL2todWdlcGFnZWQgW09QVElPTlNdIFxcdTAwM2N0ZXN0IHR5cGVcXHUwMDNlIFtkaXJdXFxcXG5cXFxcblxcXCIpO1xcbkBAIC0xMTAzLDYgKzE0MjUsMTEgQEAgc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcXG4gXFx0ZnByaW50ZihzdGRlcnIsXFx0XFxcIlxcXFx0XFxcXHQtaDogVGhpcyBoZWxwIG1lc3NhZ2UuXFxcXG5cXFwiKTtcXG4gXFx0ZnByaW50ZihzdGRlcnIsXFx0XFxcIlxcXFx0XFxcXHQtczogbVRIUCBzaXplLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXFxcblxcXCIpO1xcbiBcXHRmcHJpbnRmKHN0ZGVycixcXHRcXFwiXFxcXHRcXFxcdCAgICBEZWZhdWx0cyB0byAwLiBVc2UgdGhpcyBzaXplIGZvciBhbm9uIG9yIHNobWVtIGFsbG9jYXRpb25zLlxcXFxuXFxcIik7XFxuK1xcdGZwcmludGYoc3RkZXJyLFxcdFxcXCJcXFxcdFxcXFx0LW86IGNvbGxhcHNlIHRhcmdldCBvcmRlciBmb3Iga2h1Z2VwYWdlZDphbm9uLlxcXFxuXFxcIik7XFxuK1xcdGZwcmludGYoc3RkZXJyLFxcdFxcXCJcXFxcdFxcXFx0ICAgIFJ1bnMgdGhlIG9yZGVyLXBhcmFtZXRlcml6ZWQgY29sbGFwc2UgY2FzZXMgaW5zdGVhZFxcXFxuXFxcIik7XFxuK1xcdGZwcmludGYoc3RkZXJyLFxcdFxcXCJcXFxcdFxcXFx0ICAgIG9mIHRoZSBQTUQgY2FzZXMuXFxcXG5cXFwiKTtcXG4rXFx0ZnByaW50ZihzdGRlcnIsXFx0XFxcIlxcXFx0XFxcXHQgICAgV2l0aCAtcywgLXMgbmFtZXMgdGhlIG1USFAgc291cmNlIG9yZGVyIGZvciB0aGVcXFxcblxcXCIpO1xcbitcXHRmcHJpbnRmKHN0ZGVycixcXHRcXFwiXFxcXHRcXFxcdCAgICBtaXhlZC1zb3VyY2UgY2FzZSAoc291cmNlIG9yZGVyIGJlbG93IHRoZSB0YXJnZXQpLlxcXFxuXFxcIik7XFxuIFxcdGV4aXQoMSk7XFxuIH1cXG4gXFxuQEAgLTExMTIsMTcgKzE0MzksMzEgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0Y2hhciAqYnVmO1xcbiBcXHRjb25zdCBjaGFyICp0b2tlbjtcXG4gXFxuLVxcdHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIFxcXCJzOmhcXFwiKSkgIT0gLTEpIHtcXG4rXFx0d2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgXFxcInM6bzpoXFxcIikpICE9IC0xKSB7XFxuIFxcdFxcdHN3aXRjaCAob3B0KSB7XFxuIFxcdFxcdGNhc2UgJ3MnOlxcbiBcXHRcXHRcXHRhbm9uX29yZGVyID0gYXRvaShvcHRhcmcpO1xcbiBcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSAnbyc6XFxuK1xcdFxcdFxcdGFub25fdGFyZ2V0X29yZGVyID0gYXRvaShvcHRhcmcpO1xcbitcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0Y2FzZSAnaCc6XFxuIFxcdFxcdGRlZmF1bHQ6XFxuIFxcdFxcdFxcdHVzYWdlKCk7XFxuIFxcdFxcdH1cXG4gXFx0fVxcbiBcXG4rXFx0LypcXG4rXFx0ICogLXMgYW5kIC1vIGNvbXBvc2U6IC1zIHRoZW4gbmFtZXMgdGhlIG1USFAgc291cmNlIG9yZGVyIGZvciB0aGVcXG4rXFx0ICogbWl4ZWQtc291cmNlIGNhc2UsIHdoaWNoIG5lZWRzIGEgc291cmNlIHN0cmljdGx5IGJlbG93IHRoZVxcbitcXHQgKiB0YXJnZXQgKGFuZCBhdCBvciBhYm92ZSB0aGUgc21hbGxlc3QgbVRIUCBvcmRlcikuIEFsb25lLCAtcyBpc1xcbitcXHQgKiB0aGUgc291cmNlIG9yZGVyIGZvciB0aGUgZGVmYXVsdCBQTUQgc3VpdGU7IGFsb25lLCAtbyBpcyB0aGVcXG4rXFx0ICogY29sbGFwc2UgdGFyZ2V0IGZvciB0aGUgb3JkZXItcGFyYW1ldGVyaXplZCBzdWl0ZS5cXG4rXFx0ICovXFxuK1xcdGlmIChhbm9uX3RhcmdldF9vcmRlciBcXHUwMDI2XFx1MDAyNiBhbm9uX29yZGVyIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAoYW5vbl9vcmRlciBcXHUwMDNjIE1JTl9NVEhQX09SREVSIHx8IGFub25fb3JkZXIgXFx1MDAzZT0gYW5vbl90YXJnZXRfb3JkZXIpKVxcbitcXHRcXHR1c2FnZSgpO1xcbitcXG4gXFx0YXJndiArPSBvcHRpbmQ7XFxuIFxcdGFyZ2MgLT0gb3B0aW5kO1xcbiBcXG5AQCAtMTIwNyw3ICsxNTQ4LDYgQEAgc3RhdGljIGludCBucl90ZXN0X2Nhc2VzO1xcbiBcXG4gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiB7XFxuLVxcdGludCBocGFnZV9wbWRfb3JkZXI7XFxuIFxcdHN0cnVjdCB0aHBfc2V0dGluZ3MgZGVmYXVsdF9zZXR0aW5ncyA9IHtcXG4gXFx0XFx0LnRocF9lbmFibGVkID0gVEhQX01BRFZJU0UsXFxuIFxcdFxcdC50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVMsXFxuQEAgLTEyNDQsMTggKzE1ODQsOTQgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRocGFnZV9wbWRfbnIgPSBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTtcXG4gXFx0aHBhZ2VfcG1kX29yZGVyID0gX19idWlsdGluX2N0eihocGFnZV9wbWRfbnIpO1xcbiBcXG4rXFx0LypcXG4rXFx0ICogVGhlIHBhZ2UgY2FjaGUgY2FwcyBmb2xpbyBvcmRlciBhdCBNQVhfUEFHRUNBQ0hFX09SREVSLCB3aGljaFxcbitcXHQgKiB4YXNfc3BsaXRfYWxsb2MoKSBwdXRzIGJlbG93IHRoZSBQTUQgb3JkZXIgb24gYXJtNjQgd2l0aCA2NEsgcGFnZXMuXFxuK1xcdCAqIEEgUE1ELXNpemVkIHBhZ2UgY2FjaGUgZm9saW8gaXMgdGhlbiBpbXBvc3NpYmxlLCBzbyB0aGUga2VybmVsXFxuK1xcdCAqIHJlZnVzZXMgdGhlc2UgY29sbGFwc2VzIGJ5IGRlc2lnbiBhbmQgdGhlcmUgaXMgbm90aGluZyB0byB0ZXN0LlxcbitcXHQgKi9cXG4rXFx0aWYgKCEodGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnMoKSBcXHUwMDI2ICgxVUwgXFx1MDAzY1xcdTAwM2MgaHBhZ2VfcG1kX29yZGVyKSkpIHtcXG4rXFx0XFx0aWYgKHNobWVtX29wcykge1xcbitcXHRcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwibm8gUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW86IHNraXBwaW5nIHNobWVtXFxcXG5cXFwiKTtcXG4rXFx0XFx0XFx0c2htZW1fb3BzID0gTlVMTDtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAoZmluZm8udHlwZSA9PSBWTUFfU0hNRU0gXFx1MDAyNlxcdTAwMjYgcmVhZF9vbmx5X2ZpbGVfb3BzKSB7XFxuK1xcdFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgdG1wZnMgZmlsZVxcXFxuXFxcIik7XFxuK1xcdFxcdFxcdHJlYWRfb25seV9maWxlX29wcyA9IE5VTEw7XFxuK1xcdFxcdFxcdHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9IE5VTEw7XFxuK1xcdFxcdFxcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSBOVUxMO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmICghYW5vbl9vcHMgXFx1MDAyNlxcdTAwMjYgIXNobWVtX29wcyBcXHUwMDI2XFx1MDAyNiAhcmVhZF9vbmx5X2ZpbGVfb3BzKVxcbitcXHRcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiTm90aGluZyBsZWZ0IHRvIGNvbGxhcHNlIGludG9cXFxcblxcXCIpO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoYW5vbl90YXJnZXRfb3JkZXIgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcXHUwMDI2ICgxVUwgXFx1MDAzY1xcdTAwM2MgYW5vbl90YXJnZXRfb3JkZXIpKSlcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIk9yZGVyICVkIGlzIG5vdCBhIHN1cHBvcnRlZCBhbm9uIFRIUCBvcmRlclxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgIGFub25fdGFyZ2V0X29yZGVyKTtcXG4rXFx0aWYgKGFub25fdGFyZ2V0X29yZGVyIFxcdTAwM2UgaHBhZ2VfcG1kX29yZGVyKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIi1vIHRha2VzIGF0IG1vc3QgdGhlIFBNRCBvcmRlclxcXFxuXFxcIik7XFxuK1xcbiBcXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IGhwYWdlX3BtZF9uciAtIDE7XFxuIFxcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zd2FwID0gaHBhZ2VfcG1kX25yIC8gODtcXG4gXFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX3NoYXJlZCA9IGhwYWdlX3BtZF9uciAvIDI7XFxuIFxcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID0gaHBhZ2VfcG1kX25yICogODtcXG4gXFx0ZGVmYXVsdF9zZXR0aW5ncy5odWdlcGFnZXNbaHBhZ2VfcG1kX29yZGVyXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XFxuLVxcdGRlZmF1bHRfc2V0dGluZ3MuaHVnZXBhZ2VzW2Fub25fb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTO1xcbiBcXHRkZWZhdWx0X3NldHRpbmdzLnNobWVtX2h1Z2VwYWdlc1tocGFnZV9wbWRfb3JkZXJdLmVuYWJsZWQgPSBTSE1FTV9JTkhFUklUO1xcbi1cXHRkZWZhdWx0X3NldHRpbmdzLnNobWVtX2h1Z2VwYWdlc1thbm9uX29yZGVyXS5lbmFibGVkID0gU0hNRU1fQUxXQVlTO1xcbitcXHQvKlxcbitcXHQgKiBVbmRlciAtbyB0aGUgb3JkZXItcGFyYW1ldGVyaXplZCBjYXNlcyB3YW50IG9yZGVyLTAgc291cmNlcyBieVxcbitcXHQgKiBkZWZhdWx0OyB0aGUgbWl4ZWQtc291cmNlIGNhc2UgZW5hYmxlcyBpdHMgb3duIChwb3NzaWJseSAtc1xcbitcXHQgKiBzZWxlY3RlZCkgc291cmNlIG9yZGVyIGxvY2FsbHkuIEVuYWJsaW5nIGl0IGdsb2JhbGx5IGhlcmUgd291bGRcXG4rXFx0ICogbWFrZSBldmVyeSBjYXNlIGZhdWx0IHRoYXQgb3JkZXIuXFxuK1xcdCAqL1xcbitcXHRpZiAoIWFub25fdGFyZ2V0X29yZGVyKSB7XFxuK1xcdFxcdGRlZmF1bHRfc2V0dGluZ3MuaHVnZXBhZ2VzW2Fub25fb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTO1xcbitcXHRcXHRkZWZhdWx0X3NldHRpbmdzLnNobWVtX2h1Z2VwYWdlc1thbm9uX29yZGVyXS5lbmFibGVkID0gU0hNRU1fQUxXQVlTO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoYW5vbl90YXJnZXRfb3JkZXIpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogT25seSB0aGUgdGFyZ2V0IG9yZGVyIG1heSBwcm9kdWNlIGxhcmdlIGZvbGlvcywgYW5kIG9ubHlcXG4rXFx0XFx0ICogZnJvbSBraHVnZXBhZ2VkOiBcXFwiaW5oZXJpdFxcXCIgdW5kZXIgZW5hYmxlZD1tYWR2aXNlIGtlZXBzXFxuK1xcdFxcdCAqIHByZS1NQURWX0hVR0VQQUdFIGZhdWx0cyBhdCBvcmRlciAwLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0ZGVmYXVsdF9zZXR0aW5ncy5odWdlcGFnZXNbaHBhZ2VfcG1kX29yZGVyXS5lbmFibGVkID0gVEhQX05FVkVSO1xcbitcXHRcXHRkZWZhdWx0X3NldHRpbmdzLmh1Z2VwYWdlc1thbm9uX3RhcmdldF9vcmRlcl0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBPcmRlci1wYXJhbWV0ZXJpemVkIGNhc2VzIGFyZSBkcml2ZW4gc3RyaWN0bHkgYnkgdGhlXFxuK1xcdFxcdCAqIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgYmFycmllciwgd2hpY2ggd2FrZXMgdGhlIGRhZW1vblxcbitcXHRcXHQgKiBpdHNlbGYuIEEgbG9uZyBzY2FuX3NsZWVwIGtlZXBzIGtodWdlcGFnZWQgZnJvbVxcbitcXHRcXHQgKiBmcmVlLXJ1bm5pbmcgYmV0d2VlbiBiYXJyaWVyIHN0ZXBzLCBhbmQgYSBwYWdlc190b19zY2FuXFxuK1xcdFxcdCAqIGNvdmVyaW5nIGV2ZXJ5dGhpbmcgbWFrZXMgb25lIHdha2UgY29tcGxldGUgb25lIGZ1bGxcXG4rXFx0XFx0ICogcGFzcyAodGhlIGJhcnJpZXIncyBjb250cmFjdCksIHNvIGEgcnVuIHBlcmZvcm1zIGFcXG4rXFx0XFx0ICogZGV0ZXJtaW5pc3RpYyBudW1iZXIgb2YgcGFzc2VzIOKAlCB3aGF0IHRoZSBzdGFnZSBBL0JcXG4rXFx0XFx0ICogdHJhY2UgY29tcGFyaXNvbnMgcmVseSBvbi5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5zY2FuX3NsZWVwX21pbGxpc2VjcyA9IDYwMDAwO1xcbitcXHRcXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQucGFnZXNfdG9fc2NhbiA9IDFVTCBcXHUwMDNjXFx1MDAzYyAyNDtcXG4rXFxuK1xcdFxcdHBhZ2VtYXBfZmQgPSBvcGVuKFxcXCIvcHJvYy9zZWxmL3BhZ2VtYXBcXFwiLCBPX1JET05MWSk7XFxuK1xcdFxcdGlmIChwYWdlbWFwX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJvcGVuKFxcXFxcXFwiL3Byb2Mvc2VsZi9wYWdlbWFwXFxcXFxcXCIpXFxcIik7XFxuK1xcdFxcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcIiwgT19SRE9OTFkpO1xcbitcXHRcXHRpZiAoa3BhZ2VmbGFnc19mZCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJvcGVuKFxcXFxcXFwiL3Byb2Mva3BhZ2VmbGFnc1xcXFxcXFwiKSByZXF1aXJlcyByb290XFxcXG5cXFwiKTtcXG4rXFx0fVxcbiBcXG4gXFx0c2F2ZV9zZXR0aW5ncygpO1xcbiBcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2ZGVmYXVsdF9zZXR0aW5ncyk7XFxuIFxcbitcXHRpZiAoYW5vbl90YXJnZXRfb3JkZXIpIHtcXG4rXFx0XFx0VEVTVChjb2xsYXBzZV9vcmRlcl9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFx0XFx0VEVTVChjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFx0XFx0VEVTVChjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdywga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFxcdFRFU1QoY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFxcdFRFU1QoY29sbGFwc2Vfb3JkZXJfbWl4ZWRfc291cmNlcywga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcbitcXHRcXHRrc2Z0X3NldF9wbGFuKG5yX3Rlc3RfY2FzZXMpO1xcbitcXHRcXHRnb3RvIHJ1bjtcXG4rXFx0fVxcbitcXG4gXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XFxuIFxcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xcbkBAIC0xMzI0LDYgKzE3NDAsOSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xcbiBcXG4rXFx0VEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFx0VEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFxuIFxcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcXG4gXFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcXG4gXFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcXG5AQCAtMTMzNiw2ICsxNzU1LDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRrc2Z0X3NldF9wbGFuKG5yX3Rlc3RfY2FzZXMgKyAxKTtcXG4gXFxuIFxcdGFsbG9jX2F0X2ZhdWx0KCk7XFxuK3J1bjpcXG4gXFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyBucl90ZXN0X2Nhc2VzOyBpKyspIHtcXG4gXFx0XFx0c3RydWN0IHRlc3RfY2FzZSAqdCA9IFxcdTAwMjZ0ZXN0X2Nhc2VzW2ldO1xcbiBcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMmFhNDVjOWU4YTc3Zlxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuY1xcbkBAIC0wLDAgKzEsNDgzIEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKy8qXFxuKyAqIGtodWdlcGFnZWQgcmFjZSBoYXJuZXNzLlxcbisgKlxcbisgKiBSdW5zIGNvbGxhcHNlIGFnYWluc3QgY29uY3VycmVudCBmYXVsdHMsIHRyYW5zaWVudCBHVVAgcGluc1xcbisgKiAoZ3VwX3Rlc3QpLCBmb3JrLCBtcmVtYXAgYW5kIE1BRFZfRE9OVE5FRUQgb3ZlciB0aGUgc2FtZSByYW5nZXMsIGluXFxuKyAqIG9uZSBvZiB0aHJlZSBkcml2ZXIgbW9kZXM6XFxuKyAqXFxuKyAqICAgc3RlcHBlZFxcdGtodWdlcGFnZWQsIGRyaXZlbiBzeW5jaHJvbm91c2x5IG9uZSBmdWxsIHBhc3MgYXQgYSB0aW1lXFxuKyAqXFx0XFx0dGhyb3VnaCBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIOKAlCB0aGUgcHJpbWFyeSBkcml2ZXI6IHRoZVxcbisgKlxcdFxcdGZ1bGwgc2Nhbitjb2xsYXBzZSBwYXRoIHdpdGggYSBkZXRlcm1pbmlzdGljIGV4dGVudCBwZXJcXG4rICpcXHRcXHRzdGVwO1xcbisgKiAgIGZyZWVcXHRmcmVlLXJ1bm5pbmcga2h1Z2VwYWdlZCAoc2Nhbl9zbGVlcF9taWxsaXNlY3M9MCkg4oCUIHRoZVxcbisgKlxcdFxcdHNvYWs7XFxuKyAqICAgbWFkdmlzZVxcdE1BRFZfQ09MTEFQU0UgaW4gYSBsb29wIOKAlCB0aGUgbGVnYWN5LVBNRCByZWdyZXNzaW9uXFxuKyAqXFx0XFx0YXhpcy5cXG4rICpcXG4rICogQWxsIGFub24gVEhQIG9yZGVycyBhcmUgZW5hYmxlZCAoaW5oZXJpdCkuIG1heF9wdGVzX25vbmUgaXMgMCBieVxcbisgKiBkZWZhdWx0IOKAlCByYWNpbmcgTUFEVl9ET05UTkVFRCB0aGVuIHN0ZWVycyBzZWxlY3Rpb24gYWNyb3NzIG9yZGVycyDigJRcXG4rICogb3IgdGhlIHBlcm1pc3NpdmUgbGltaXQgd2l0aCAteiwgd2hpY2ggZmxvb2RzIHRoZSBiYXRjaCBlbmdpbmUgd2l0aFxcbisgKiBob2xlIGFuZCB6ZXJvcGFnZSBzbG90cyBzbyB0aGUgcG9wdWxhdGlvbiBwYXRocyAocGFyay10aW1lIHplcm9wYWdlXFxuKyAqIGNsZWFyLCB6ZXJvLWZpbGxlZCBjb3B5LCBpbnN0YWxsLXRpbWUgcHRlX25vbmUoKSB2ZXJpZnkgYW5kIGFib3J0KVxcbisgKiByYWNlIHRoZSBmYXVsdGVycyBkaXJlY3RseS5cXG4rICpcXG4rICogLXAgYWRkcyBtZW1vcnkgcHJlc3N1cmUgdG8gYW55IG9mIHRoZSBhYm92ZTogTUFEVl9QQUdFT1VUIGN5Y2xpbmdcXG4rICogb24gYSBkZWRpY2F0ZWQgbmVpZ2hib3IgcmVnaW9uIChzd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybjsgc2tpcHBlZFxcbisgKiB3aXRoIGEgbm90ZSB3aGVuIHRoZSBob3N0IGhhcyBubyBzd2FwKSBhbmQgYSBjb21wYWN0X21lbW9yeSB0cmlnZ2VyXFxuKyAqIGxvb3AgKGNvbXBhY3Rpb24gbWlncmF0ZXMgc291cmNlIGZvbGlvcywgcmFjaW5nIGNvbGxhcHNlJ3MgZnJlZXplXFxuKyAqIHdpdGggcmVmY291bnQgZWxldmF0aW9uIGFuZCBtaWdyYXRpb24gZW50cmllcyBvZiBpdHMgb3duKS5cXG4rICpcXG4rICogQ29ycmVjdG5lc3Mgc2lnbmFsczogZXZlcnkgcmFjaW5nIHBhZ2UgbXVzdCByZWFkIGFzIGl0cyBwYXR0ZXJuIG9yXFxuKyAqIHplcm8gKE1BRFZfRE9OVE5FRUQpLCBuZXZlciBhbnl0aGluZyBlbHNlIOKAlCBjaGVja2VkIGNvbnRpbnVvdXNseSBieVxcbisgKiB0aGUgZmF1bHRlcnMgYW5kIHRoZSBmb3JrIGNoaWxkcmVuIGFuZCBvbmNlIGF0IHRoZSBlbmQg4oCUIHBsdXNcXG4rICogd2hhdGV2ZXIgREVCVUdfVk0gLyBwYWdlX3RhYmxlX2NoZWNrIC8gS0FTQU4gLyBsb2NrZGVwIHJlcG9ydCBpblxcbisgKiBkbWVzZywgd2hpY2ggdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBpbnNwZWN0LlxcbisgKi9cXG4rI2RlZmluZSBfR05VX1NPVVJDRVxcbisjaW5jbHVkZSBcXHUwMDNjZXJybm8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2ZjbnRsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NwdGhyZWFkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRpby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkbGliLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdHJpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9pb2N0bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL21tYW4uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy90aW1lLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvd2FpdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdW5pc3RkLmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwia3NlbGZ0ZXN0LmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJ2bV91dGlsLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJodWdlcGFnZV9zZXR0aW5ncy5oXFxcIlxcbisjaW5jbHVkZSBcXFwiLi4vLi4vLi4vLi4vbW0vZ3VwX3Rlc3QuaFxcXCJcXG4rXFxuKyNkZWZpbmUgQkFTRV9BRERSXFx0KCh2b2lkICopKDFVTCBcXHUwMDNjXFx1MDAzYyAzMCkpXFxuKy8qXFxuKyAqIFNoYXJlZCBwbGF5Z3JvdW5kIGZvciBmYXVsdHMvcGlucy9mb3JrL2RvbnRuZWVkOiBzZXZlcmFsIFBNRC1zaXplZFxcbisgKiBhcmVhcyB0aGUgcmFjaW5nIHRocmVhZHMgc3ByZWFkIGFjcm9zcywgcGx1cyBvbmUgYXJlYSBvd25lZCBieSB0aGVcXG4rICogbXJlbWFwIHRocmVhZC4gTW9yZSBhcmVhcyBtZWFucyBtb3JlIGluZGVwZW5kZW50IHJlZ2lvbnMgY29sbGFwc2luZ1xcbisgKiBhdCBvbmNlOyB0aGUgZGVmYXVsdCBzdWl0cyBhIG5vcm1hbCBtYWNoaW5lLiBPbiBhIG1lbW9yeS1jb25zdHJhaW5lZFxcbisgKiBob3N0IC0tIG9yIHVuZGVyIGVtdWxhdGlvbiwgd2hlcmUgYSA1MTJNIFBNRCAoYXJtNjQvNjRLKSBtYWtlcyB0aGVcXG4rICogZGVmYXVsdCBwbGF5Z3JvdW5kIG11bHRpLWdpZ2FieXRlIC0tIHBhc3MgLWEgdG8gc2hyaW5rIGl0LlxcbisgKi9cXG4rI2RlZmluZSBERUZBVUxUX1NIQVJFRF9BUkVBU1xcdDNcXG4rc3RhdGljIGludCBucl9zaGFyZWRfYXJlYXM7XFxuK3N0YXRpYyBpbnQgbnJfYXJlYXM7XFxuK1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplO1xcbitzdGF0aWMgY2hhciAqcmVnaW9uO1xcdFxcdC8qIE5SX0FSRUFTICogaHBhZ2VfcG1kX3NpemUgKi9cXG4rc3RhdGljIGNoYXIgKm1yZW1hcF9hcmVhO1xcdC8qIHJlZ2lvbiArIE5SX1NIQVJFRF9BUkVBUyBhcmVhcyAqL1xcbitzdGF0aWMgY2hhciAqbXJlbWFwX3NjcmF0Y2g7XFx0Lyogd2VsbCBhYm92ZSB0aGUgcmVnaW9uICovXFxuK3N0YXRpYyBjaGFyICpwYWdlb3V0X2FyZWE7XFx0LyogLXA6IGRlZGljYXRlZCBwcmVzc3VyZSByZWdpb24gKi9cXG4rc3RhdGljIHNpemVfdCBwYWdlb3V0X3NpemU7XFxuK3N0YXRpYyBpbnQgZ3VwX2ZkID0gLTE7XFxuK3N0YXRpYyB2b2xhdGlsZSBpbnQgc3RvcDtcXG4rc3RhdGljIHZvbGF0aWxlIGludCBjb3JydXB0ZWQ7XFxuK1xcbitzdGF0aWMgdW5zaWduZWQgaW50IHBhdHRlcm4odW5zaWduZWQgbG9uZyBwYWdlX2lkeClcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgdmFsID0gKHVuc2lnbmVkIGludClwYWdlX2lkeCAqIDI2NTQ0MzU3NjFVO1xcbitcXG4rXFx0cmV0dXJuIHZhbCA/IHZhbCA6IDE7XFx0LyogbmV2ZXIgY29sbGlkZXMgd2l0aCB0aGUgemVyby1maWxsICovXFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNoZWNrX3BhZ2UodW5zaWduZWQgbG9uZyBwYWdlX2lkeClcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKikocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUpO1xcbitcXG4rXFx0aWYgKHZhbCBcXHUwMDI2XFx1MDAyNiB2YWwgIT0gcGF0dGVybihwYWdlX2lkeCkpIHtcXG4rXFx0XFx0Y29ycnVwdGVkID0gMTtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIkNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgICAgICBwYWdlX2lkeCwgdmFsLCBwYXR0ZXJuKHBhZ2VfaWR4KSk7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZF9wYWdlKHVuc2lnbmVkIGludCAqc2VlZClcXG4re1xcbitcXHRyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcmFuZF9yKHNlZWQpICVcXG4rXFx0ICAgICAgIChucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkICpmYXVsdGVyX2ZuKHZvaWQgKmFyZylcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcXG4rXFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFxcdTAwMjZzZWVkKTtcXG4rXFxuK1xcdFxcdGlmIChyYW5kX3IoXFx1MDAyNnNlZWQpIFxcdTAwMjYgMSlcXG4rXFx0XFx0XFx0Kih1bnNpZ25lZCBpbnQgKikocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUpID1cXG4rXFx0XFx0XFx0XFx0cGF0dGVybihwYWdlX2lkeCk7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0Y2hlY2tfcGFnZShwYWdlX2lkeCk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkICpkb250bmVlZF9mbih2b2lkICphcmcpXFxuK3tcXG4rXFx0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XFxuK1xcbitcXHR3aGlsZSAoIXN0b3ApIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcXHUwMDI2c2VlZCk7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgbnIgPSAxVUwgXFx1MDAzY1xcdTAwM2MgKHJhbmRfcihcXHUwMDI2c2VlZCkgJSA2KTtcXHQvKiAxLi4zMiBwYWdlcyAqL1xcbitcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogT25jZSBpbiBhIHdoaWxlIHphcCBhIHdob2xlIFBNRC1hbGlnbmVkIGFyZWE6IG9ubHkgYVxcbitcXHRcXHQgKiB6YXAgc3Bhbm5pbmcgdGhlIGZ1bGwgdGFibGUgdHJpZ2dlcnMgdGhlIGVtcHR5LXRhYmxlXFxuK1xcdFxcdCAqIHJlY2xhaW0gKENPTkZJR19QVF9SRUNMQUlNKSwgd2hpY2ggY2FuIGZyZWUgYSB0YWJsZVxcbitcXHRcXHQgKiBvdXQgZnJvbSB1bmRlciBhIHBhcmtlZCBjb2xsYXBzZSDigJQgc3ViLXRhYmxlIHphcHNcXG4rXFx0XFx0ICogbmV2ZXIgcmVhY2ggdGhhdCBwYXRoLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKCEocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDY0KSkge1xcbitcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGFyZWEgPSBwYWdlX2lkeCAvXFxuK1xcdFxcdFxcdFxcdFxcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSk7XFxuK1xcbitcXHRcXHRcXHRtYWR2aXNlKHJlZ2lvbiArIGFyZWEgKiBocGFnZV9wbWRfc2l6ZSxcXG4rXFx0XFx0XFx0XFx0aHBhZ2VfcG1kX3NpemUsIE1BRFZfRE9OVE5FRUQpO1xcbitcXHRcXHR9IGVsc2Uge1xcbitcXHRcXHRcXHRtYWR2aXNlKHJlZ2lvbiArIHBhZ2VfaWR4ICogcGFnZV9zaXplLFxcbitcXHRcXHRcXHRcXHRuciAqIHBhZ2Vfc2l6ZSwgTUFEVl9ET05UTkVFRCk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0dXNsZWVwKHJhbmRfcihcXHUwMDI2c2VlZCkgJSA1MDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCAqcGlubmVyX2ZuKHZvaWQgKmFyZylcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcXG4rXFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHRzdHJ1Y3QgZ3VwX3Rlc3QgZ3VwID0ge307XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXFx1MDAyNnNlZWQpO1xcbitcXG4rXFx0XFx0Z3VwLmFkZHIgPSAodW5zaWduZWQgbG9uZykocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUpO1xcbitcXHRcXHRndXAuc2l6ZSA9IDE2ICogcGFnZV9zaXplO1xcbitcXHRcXHRndXAubnJfcGFnZXNfcGVyX2NhbGwgPSAxNjtcXG4rXFx0XFx0Z3VwLmd1cF9mbGFncyA9IDE7XFx0LyogRk9MTF9XUklURSAqL1xcbitcXHRcXHQvKiBSYWNpbmcgTUFEVl9ET05UTkVFRCBtYWtlcyB0cmFuc2llbnQgZmFpbHVyZXMgZXhwZWN0ZWQuICovXFxuK1xcdFxcdGlvY3RsKGd1cF9mZCwgUElOX0ZBU1RfQkVOQ0hNQVJLLCBcXHUwMDI2Z3VwKTtcXG4rXFx0XFx0dXNsZWVwKHJhbmRfcihcXHUwMDI2c2VlZCkgJSAyMDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCAqZm9ya2VyX2ZuKHZvaWQgKmFyZylcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcXG4rXFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHRwaWRfdCBwaWQgPSBmb3JrKCk7XFxuK1xcbitcXHRcXHRpZiAocGlkID09IDApIHtcXG4rXFx0XFx0XFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyAxNjsgaSsrKVxcbitcXHRcXHRcXHRcXHRjaGVja19wYWdlKHJhbmRfcGFnZShcXHUwMDI2c2VlZCkpO1xcbitcXHRcXHRcXHRfZXhpdChjb3JydXB0ZWQpO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChwaWQgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdFxcdGludCB3c3RhdHVzO1xcbitcXG4rXFx0XFx0XFx0d2FpdHBpZChwaWQsIFxcdTAwMjZ3c3RhdHVzLCAwKTtcXG4rXFx0XFx0XFx0aWYgKFdJRkVYSVRFRCh3c3RhdHVzKSBcXHUwMDI2XFx1MDAyNiBXRVhJVFNUQVRVUyh3c3RhdHVzKSlcXG4rXFx0XFx0XFx0XFx0Y29ycnVwdGVkID0gMTtcXG4rXFx0XFx0fVxcbitcXHRcXHR1c2xlZXAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDIwMDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCAqbXJlbWFwcGVyX2ZuKHZvaWQgKmFyZylcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcXG4rXFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHR2b2lkICpwO1xcbitcXG4rXFx0XFx0cCA9IG1yZW1hcChtcmVtYXBfYXJlYSwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHRcXHQgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX3NjcmF0Y2gpO1xcbitcXHRcXHRpZiAocCA9PSBNQVBfRkFJTEVEKVxcbitcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1yZW1hcCgpIGF3YXlcXFwiKTtcXG4rXFx0XFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyA4OyBpKyspXFxuK1xcdFxcdFxcdG1yZW1hcF9zY3JhdGNoWyhyYW5kX3IoXFx1MDAyNnNlZWQpICVcXG4rXFx0XFx0XFx0XFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSkgKiBwYWdlX3NpemVdID0gMTtcXG4rXFx0XFx0cCA9IG1yZW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHRcXHQgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX2FyZWEpO1xcbitcXHRcXHRpZiAocCA9PSBNQVBfRkFJTEVEKVxcbitcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1yZW1hcCgpIGJhY2tcXFwiKTtcXG4rXFx0XFx0dXNsZWVwKHJhbmRfcihcXHUwMDI2c2VlZCkgJSAyMDAwKTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rLypcXG4rICogLXA6IHN3YXAgdHJhZmZpYyBhbmQgTFJVIGNodXJuIG9uIGEgcmVnaW9uIG9mIG91ciBvd24uIFRoZSBjb250ZW50XFxuKyAqIGNoZWNrIGlzIGV4YWN0IOKAlCBhIHBhZ2Ugb3V0IGFuZCBiYWNrIHRocm91Z2ggc3dhcCBtdXN0IHByZXNlcnZlIHRoZVxcbisgKiBwYXR0ZXJuLCBhbmQgbm90aGluZyBlbHNlIGV2ZXIgd3JpdGVzIGhlcmUuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCAqcGFnZW91dF9mbih2b2lkICphcmcpXFxuK3tcXG4rXFx0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XFxuK1xcdHVuc2lnbmVkIGxvbmcgbnIgPSBwYWdlb3V0X3NpemUgLyBwYWdlX3NpemU7XFxuK1xcdHVuc2lnbmVkIGxvbmcgaTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucjsgaSsrKVxcbitcXHRcXHQqKHVuc2lnbmVkIGludCAqKShwYWdlb3V0X2FyZWEgKyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XFxuK1xcbitcXHR3aGlsZSAoIXN0b3ApIHtcXG4rXFx0XFx0bWFkdmlzZShwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSwgTUFEVl9QQUdFT1VUKTtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yIFxcdTAwMjZcXHUwMDI2ICFzdG9wOyBpKyspIHtcXG4rXFx0XFx0XFx0dW5zaWduZWQgaW50IHZhbCA9ICoodW5zaWduZWQgaW50ICopKHBhZ2VvdXRfYXJlYSArXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgaSAqIHBhZ2Vfc2l6ZSk7XFxuK1xcbitcXHRcXHRcXHRpZiAodmFsICE9IHBhdHRlcm4oaSkpIHtcXG4rXFx0XFx0XFx0XFx0Y29ycnVwdGVkID0gMTtcXG4rXFx0XFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIlBhZ2VvdXQgY29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbitcXHRcXHR1c2xlZXAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDIwMDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbisvKiAtcDogY29tcGFjdGlvbiBtaWdyYXRlcyB0aGUgY29sbGFwc2Ugc291cmNlcyBvdXQgZnJvbSB1bmRlciB1cy4gKi9cXG4rc3RhdGljIHZvaWQgKmNvbXBhY3Rvcl9mbih2b2lkICphcmcpXFxuK3tcXG4rXFx0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XFxuK1xcdGludCBmZCA9IG9wZW4oXFxcIi9wcm9jL3N5cy92bS9jb21wYWN0X21lbW9yeVxcXCIsIE9fV1JPTkxZKTtcXG4rXFxuK1xcdGlmIChmZCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIk5vIGNvbXBhY3RfbWVtb3J5OyBjb21wYWN0b3IgaWRsZVxcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXHR9XFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHRpZiAod3JpdGUoZmQsIFxcXCIxXFxcIiwgMSkgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0dXNsZWVwKDEwMDAwICsgcmFuZF9yKFxcdTAwMjZzZWVkKSAlIDEwMDAwMCk7XFxuK1xcdH1cXG4rXFx0Y2xvc2UoZmQpO1xcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgc3dhcF9hdmFpbGFibGUodm9pZClcXG4re1xcbitcXHRjaGFyIGxpbmVbMjU2XTtcXG4rXFx0aW50IGxpbmVzID0gMDtcXG4rXFx0RklMRSAqZnAgPSBmb3BlbihcXFwiL3Byb2Mvc3dhcHNcXFwiLCBcXFwiclxcXCIpO1xcbitcXG4rXFx0aWYgKCFmcClcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpXFxuK1xcdFxcdGxpbmVzKys7XFxuK1xcdGZjbG9zZShmcCk7XFxuK1xcdHJldHVybiBsaW5lcyBcXHUwMDNlIDE7XFxuK31cXG4rXFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5vd19tcyh2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCB0aW1ldmFsIHR2O1xcbitcXG4rXFx0Z2V0dGltZW9mZGF5KFxcdTAwMjZ0diwgTlVMTCk7XFxuK1xcdHJldHVybiB0di50dl9zZWMgKiAxMDAwVUwgKyB0di50dl91c2VjIC8gMTAwMDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcXG4re1xcbitcXHRmcHJpbnRmKHN0ZGVycixcXG4rXFx0XFx0XFxcIlVzYWdlOiBraHVnZXBhZ2VkX3JhY2UgWy1kIHNlY29uZHNdIFstbSBzdGVwcGVkfGZyZWV8bWFkdmlzZV0gWy16XSBbLXBdIFstYSBhcmVhc11cXFxcblxcXCJcXG4rXFx0XFx0XFxcIlxcXFx0LXo6IHBlcm1pc3NpdmUgbWF4X3B0ZXNfbm9uZSAoaG9sZS1oZWF2eSB3aW5kb3dzKVxcXFxuXFxcIlxcbitcXHRcXHRcXFwiXFxcXHQtcDogbWVtb3J5IHByZXNzdXJlIChwYWdlb3V0ICsgY29tcGFjdGlvbikgdGhyZWFkc1xcXFxuXFxcIlxcbitcXHRcXHRcXFwiXFxcXHQtYTogbnVtYmVyIG9mIHNoYXJlZCBQTUQtc2l6ZWQgcGxheWdyb3VuZCBhcmVhcyAoZGVmYXVsdCAzKVxcXFxuXFxcIik7XFxuK1xcdGV4aXQoMSk7XFxuK31cXG4rXFxuK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4re1xcbitcXHRzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRocmVhZF9uYW1lc1tdID0ge1xcbitcXHRcXHRcXFwiZmF1bHRlclxcXCIsIFxcXCJmYXVsdGVyMlxcXCIsIFxcXCJkb250bmVlZFxcXCIsIFxcXCJwaW5uZXJcXFwiLCBcXFwiZm9ya2VyXFxcIixcXG4rXFx0XFx0XFxcIm1yZW1hcHBlclxcXCIsIFxcXCJwYWdlb3V0XFxcIiwgXFxcImNvbXBhY3RvclxcXCIsXFxuK1xcdH07XFxuK1xcdHZvaWQgKigqY29uc3QgdGhyZWFkX2Zuc1tdKSh2b2lkICopID0ge1xcbitcXHRcXHRmYXVsdGVyX2ZuLCBmYXVsdGVyX2ZuLCBkb250bmVlZF9mbiwgcGlubmVyX2ZuLCBmb3JrZXJfZm4sXFxuK1xcdFxcdG1yZW1hcHBlcl9mbiwgcGFnZW91dF9mbiwgY29tcGFjdG9yX2ZuLFxcbitcXHR9O1xcbitcXHRjb25zdCB1bnNpZ25lZCBsb25nIHBhZ2VvdXRfYml0ID0gMVVMIFxcdTAwM2NcXHUwMDNjIDYsIGNvbXBhY3Rvcl9iaXQgPSAxVUwgXFx1MDAzY1xcdTAwM2MgNztcXG4rXFx0Y29uc3QgaW50IG5yX3RocmVhZHMgPSBBUlJBWV9TSVpFKHRocmVhZF9uYW1lcyk7XFxuK1xcdHB0aHJlYWRfdCB0aHJlYWRzW0FSUkFZX1NJWkUodGhyZWFkX25hbWVzKV07XFxuK1xcdGNvbnN0IGNoYXIgKm1vZGUgPSBcXFwic3RlcHBlZFxcXCI7XFxuK1xcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZW5kX21zO1xcbitcXHRpbnQgZHVyYXRpb25fcyA9IDEwO1xcbitcXHR1bnNpZ25lZCBsb25nIHRocmVhZF9tYXNrID0gfjBVTDtcXG4rXFx0aW50IG5yX2FyZWFzX2FyZyA9IDA7XFxuK1xcdGJvb2wgcGVybWlzc2l2ZV9ub25lID0gZmFsc2U7XFxuK1xcdGJvb2wgcHJlc3N1cmUgPSBmYWxzZTtcXG4rXFx0dW5zaWduZWQgbG9uZyBpO1xcbitcXHRpbnQgc3RlcHMgPSAwO1xcbitcXHRpbnQgb3B0O1xcbitcXG4rXFx0d2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgXFxcImE6ZDptOnQ6enBoXFxcIikpICE9IC0xKSB7XFxuK1xcdFxcdHN3aXRjaCAob3B0KSB7XFxuK1xcdFxcdGNhc2UgJ2EnOlxcbitcXHRcXHRcXHRucl9hcmVhc19hcmcgPSBhdG9pKG9wdGFyZyk7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlICdkJzpcXG4rXFx0XFx0XFx0ZHVyYXRpb25fcyA9IGF0b2kob3B0YXJnKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgJ20nOlxcbitcXHRcXHRcXHRtb2RlID0gb3B0YXJnO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSAndCc6XFxuK1xcdFxcdFxcdC8qIGRlYnVnOiBiaXRtYXNrIG9mIHJhY2luZyB0aHJlYWRzIHRvIHN0YXJ0ICovXFxuK1xcdFxcdFxcdHRocmVhZF9tYXNrID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDApO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSAneic6XFxuK1xcdFxcdFxcdHBlcm1pc3NpdmVfbm9uZSA9IHRydWU7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlICdwJzpcXG4rXFx0XFx0XFx0cHJlc3N1cmUgPSB0cnVlO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0ZGVmYXVsdDpcXG4rXFx0XFx0XFx0dXNhZ2UoKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdGlmIChzdHJjbXAobW9kZSwgXFxcInN0ZXBwZWRcXFwiKSBcXHUwMDI2XFx1MDAyNiBzdHJjbXAobW9kZSwgXFxcImZyZWVcXFwiKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgc3RyY21wKG1vZGUsIFxcXCJtYWR2aXNlXFxcIikpXFxuK1xcdFxcdHVzYWdlKCk7XFxuK1xcbitcXHRrc2Z0X3ByaW50X2hlYWRlcigpO1xcbitcXHRpZiAoIXRocF9hdmFpbGFibGUoKSlcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxcXG5cXFwiKTtcXG4rXFxuK1xcdHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7XFxuK1xcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcXG4rXFx0aWYgKCFocGFnZV9wbWRfc2l6ZSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcXFxcblxcXCIpO1xcbitcXG4rXFx0Z3VwX2ZkID0gb3BlbihcXFwiL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3RcXFwiLCBPX1JEV1IpO1xcbitcXHRpZiAoZ3VwX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIi9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IHJlcXVpcmVzIENPTkZJR19HVVBfVEVTVCBhbmQgcm9vdFxcXFxuXFxcIik7XFxuK1xcbitcXHRucl9zaGFyZWRfYXJlYXMgPSBucl9hcmVhc19hcmcgXFx1MDAzZSAwID8gbnJfYXJlYXNfYXJnIDogREVGQVVMVF9TSEFSRURfQVJFQVM7XFxuK1xcdG5yX2FyZWFzID0gbnJfc2hhcmVkX2FyZWFzICsgMTtcXG4rXFxuK1xcdGlmICghcHJlc3N1cmUpIHtcXG4rXFx0XFx0dGhyZWFkX21hc2sgXFx1MDAyNj0gfihwYWdlb3V0X2JpdCB8IGNvbXBhY3Rvcl9iaXQpO1xcbitcXHR9IGVsc2UgaWYgKCFzd2FwX2F2YWlsYWJsZSgpKSB7XFxuK1xcdFxcdC8qIE5vIHN3YXAsIG5vIGFub24gcmVjbGFpbTogY29tcGFjdGlvbi1vbmx5IHByZXNzdXJlLiAqL1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiLXAgd2l0aG91dCBzd2FwOiBwYWdlb3V0IHRocmVhZCBkaXNhYmxlZFxcXFxuXFxcIik7XFxuK1xcdFxcdHRocmVhZF9tYXNrIFxcdTAwMjY9IH5wYWdlb3V0X2JpdDtcXG4rXFx0fVxcbitcXG4rXFx0a3NmdF9zZXRfcGxhbigxKTtcXG4rXFxuK1xcdHRocF9zYXZlX3NldHRpbmdzKCk7XFxuK1xcdHRocF9yZWFkX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK1xcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7XFxuK1xcdHNldHRpbmdzLnRocF9kZWZyYWcgPSBUSFBfREVGUkFHX0FMV0FZUztcXG4rXFx0c2V0dGluZ3Muc2htZW1fZW5hYmxlZCA9IFNITUVNX05FVkVSO1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7XFxuK1xcdHNldHRpbmdzLmtodWdlcGFnZWQuc2Nhbl9zbGVlcF9taWxsaXNlY3MgPVxcbitcXHRcXHRzdHJjbXAobW9kZSwgXFxcImZyZWVcXFwiKSA/IDEwMDAgOiAwO1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmFsbG9jX3NsZWVwX21pbGxpc2VjcyA9IDEwO1xcbitcXHQvKlxcbitcXHQgKiBtVEhQIGNvbGxhcHNlIG9ubHkgc3VwcG9ydHMgdGhlIHR3byBlbmRzIG9mIHRoZSBvY2N1cGFuY3lcXG4rXFx0ICogc2NhbGU6IDAgb3IgSFBBR0VfUE1EX05SIC0gMSAoYW55dGhpbmcgZWxzZSBjb2VyY2VzIHRvIDApLlxcbitcXHQgKiBTdHJpY3QgaXMgdGhlIGRlZmF1bHQg4oCUIGl0IGFsc28ga2VlcHMga2h1Z2VwYWdlZCBmcm9tIGJ1cm5pbmdcXG4rXFx0ICogdGhlIHdob2xlIHN0ZXAgaW4gZG9vbWVkIFBNRC1zaXplZCBhbGxvY2F0aW9ucyBvbiA1MTJNLVBNRFxcbitcXHQgKiBjb25maWdzLCB3aGVyZSBhIGZ1bGx5IHBvcHVsYXRlZCBhcmVhIGlzIHJhcmUgdW5kZXIgcmFjaW5nXFxuK1xcdCAqIE1BRFZfRE9OVE5FRUQuIC16IHNlbGVjdHMgdGhlIHBlcm1pc3NpdmUgZW5kOiBzZWxlY3Rpb24gdGhlblxcbitcXHQgKiBlbWl0cyBob2xlLWhlYXZ5IHdpbmRvd3MgYW5kIHRoZSBlbmdpbmUncyBwb3B1bGF0aW9uIHBhdGhzXFxuK1xcdCAqIHRha2UgdGhlIGJydW50IG9mIHRoZSByYWNpbmcgZmF1bHRzIGFuZCB6YXBzLlxcbitcXHQgKi9cXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gcGVybWlzc2l2ZV9ub25lID9cXG4rXFx0XFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSAtIDEgOiAwO1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPVxcbitcXHRcXHRucl9hcmVhcyAqIChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgKiA4O1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgTlJfT1JERVJTOyBpKyspIHtcXG4rXFx0XFx0aWYgKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIGkpKVxcbitcXHRcXHRcXHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xcbitcXHR9XFxuK1xcdC8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZC4gKi9cXG4rXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFxuK1xcdHJlZ2lvbiA9IG1tYXAoQkFTRV9BRERSLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHQgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsXFxuK1xcdFxcdCAgICAgIC0xLCAwKTtcXG4rXFx0aWYgKHJlZ2lvbiAhPSBCQVNFX0FERFIpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiRmFpbGVkIHRvIGFsbG9jYXRlIFZNQSBhdCAlcFxcXFxuXFxcIiwgQkFTRV9BRERSKTtcXG4rXFx0bXJlbWFwX2FyZWEgPSByZWdpb24gKyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTtcXG4rXFx0bXJlbWFwX3NjcmF0Y2ggPSAoY2hhciAqKUJBU0VfQUREUiArIDIgKiBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplO1xcbitcXG4rXFx0aWYgKHRocmVhZF9tYXNrIFxcdTAwMjYgcGFnZW91dF9iaXQpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogQmlnIGVub3VnaCB0byBjeWNsZSByZWFsIHJlY2xhaW0sIHNtYWxsIGVub3VnaCBub3QgdG9cXG4rXFx0XFx0ICogZG9taW5hdGUgYSBUQ0cgZ3Vlc3Q6IDQgUE1EIGFyZWFzLCBjbGFtcGVkIHRvIFsxNk0sIDY0TV0uXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRwYWdlb3V0X3NpemUgPSA0ICogaHBhZ2VfcG1kX3NpemU7XFxuK1xcdFxcdHBhZ2VvdXRfc2l6ZSA9IHBhZ2VvdXRfc2l6ZSBcXHUwMDNjICgxNlVMIFxcdTAwM2NcXHUwMDNjIDIwKSA/ICgxNlVMIFxcdTAwM2NcXHUwMDNjIDIwKSA6XFxuK1xcdFxcdFxcdCAgICAgICBwYWdlb3V0X3NpemUgXFx1MDAzZSAoNjRVTCBcXHUwMDNjXFx1MDAzYyAyMCkgPyAoNjRVTCBcXHUwMDNjXFx1MDAzYyAyMCkgOlxcbitcXHRcXHRcXHQgICAgICAgcGFnZW91dF9zaXplO1xcbitcXHRcXHRwYWdlb3V0X2FyZWEgPSBtbWFwKE5VTEwsIHBhZ2VvdXRfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcXG4rXFx0XFx0XFx0XFx0ICAgIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSwgLTEsIDApO1xcbitcXHRcXHRpZiAocGFnZW91dF9hcmVhID09IE1BUF9GQUlMRUQpXFxuK1xcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibW1hcCgpIHBhZ2VvdXQgYXJlYVxcXCIpO1xcbitcXHR9XFxuK1xcbitcXHQvKiBQb3B1bGF0ZSBzbyB0aGUgZmlyc3QgcGFzcyBoYXMgc29tZXRoaW5nIHRvIGNvbGxhcHNlLiAqL1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkrKylcXG4rXFx0XFx0Kih1bnNpZ25lZCBpbnQgKikocmVnaW9uICsgaSAqIHBhZ2Vfc2l6ZSkgPSBwYXR0ZXJuKGkpO1xcbitcXHRtZW1zZXQobXJlbWFwX2FyZWEsIDEsIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0bWFkdmlzZShyZWdpb24sIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX3RocmVhZHM7IGkrKykge1xcbitcXHRcXHRpZiAoISh0aHJlYWRfbWFzayBcXHUwMDI2ICgxVUwgXFx1MDAzY1xcdTAwM2MgaSkpKSB7XFxuK1xcdFxcdFxcdHRocmVhZHNbaV0gPSAwO1xcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAocHRocmVhZF9jcmVhdGUoXFx1MDAyNnRocmVhZHNbaV0sIE5VTEwsIHRocmVhZF9mbnNbaV0sXFxuK1xcdFxcdFxcdFxcdCAgICh2b2lkICopKGkgKyAxKSkpXFxuK1xcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwicHRocmVhZF9jcmVhdGUoKVxcXCIpO1xcbitcXHR9XFxuK1xcbitcXHRlbmRfbXMgPSBub3dfbXMoKSArIGR1cmF0aW9uX3MgKiAxMDAwVUw7XFxuK1xcdGlmICghc3RyY21wKG1vZGUsIFxcXCJzdGVwcGVkXFxcIikpIHtcXG4rXFx0XFx0d2hpbGUgKG5vd19tcygpIFxcdTAwM2MgZW5kX21zIFxcdTAwMjZcXHUwMDI2ICFjb3JydXB0ZWQpIHtcXG4rXFx0XFx0XFx0aWYgKCFraHVnZXBhZ2VkX2Z1bGxfcGFzcyg2MDApKVxcbitcXHRcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcImtodWdlcGFnZWQgcGFzcyB0aW1lZCBvdXRcXFxcblxcXCIpO1xcbitcXHRcXHRcXHRzdGVwcysrO1xcbitcXHRcXHR9XFxuK1xcdH0gZWxzZSBpZiAoIXN0cmNtcChtb2RlLCBcXFwiZnJlZVxcXCIpKSB7XFxuK1xcdFxcdHdoaWxlIChub3dfbXMoKSBcXHUwMDNjIGVuZF9tcyBcXHUwMDI2XFx1MDAyNiAhY29ycnVwdGVkKVxcbitcXHRcXHRcXHR1c2xlZXAoMTAwICogMTAwMCk7XFxuK1xcdH0gZWxzZSB7XFx0LyogbWFkdmlzZSAqL1xcbitcXHRcXHR3aGlsZSAobm93X21zKCkgXFx1MDAzYyBlbmRfbXMgXFx1MDAyNlxcdTAwMjYgIWNvcnJ1cHRlZCkge1xcbitcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfc2hhcmVkX2FyZWFzOyBpKyspIHtcXG4rXFx0XFx0XFx0XFx0bWFkdmlzZShyZWdpb24gKyBpICogaHBhZ2VfcG1kX3NpemUsXFxuK1xcdFxcdFxcdFxcdFxcdGhwYWdlX3BtZF9zaXplLCBNQURWX0NPTExBUFNFKTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRtYWR2aXNlKHJlZ2lvbiwgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsXFxuK1xcdFxcdFxcdFxcdE1BRFZfRE9OVE5FRUQpO1xcbitcXHRcXHRcXHRzdGVwcysrO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHN0b3AgPSAxO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfdGhyZWFkczsgaSsrKSB7XFxuK1xcdFxcdGlmICh0aHJlYWRzW2ldKVxcbitcXHRcXHRcXHRwdGhyZWFkX2pvaW4odGhyZWFkc1tpXSwgTlVMTCk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIEZpbmFsIGludGVncml0eSBzd2VlcC4gKi9cXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOyBpKyspXFxuK1xcdFxcdGNoZWNrX3BhZ2UoaSk7XFxuK1xcbitcXHR0aHBfcmVzdG9yZV9zZXR0aW5ncygpO1xcbitcXG4rXFx0a3NmdF90ZXN0X3Jlc3VsdCghY29ycnVwdGVkLCBcXFwiJXM6ICVkcywgJWQgc3RlcHMsIG5vIGNvcnJ1cHRpb25cXFxcblxcXCIsXFxuK1xcdFxcdFxcdCBtb2RlLCBkdXJhdGlvbl9zLCBzdGVwcyk7XFxuK1xcdGtzZnRfZmluaXNoZWQoKTtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi4xMzIxNWNiMzcwY2ViXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jXFxuQEAgLTAsMCArMSwxOTggQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLypcXG4rICogU3luY2hyb25vdXMga2h1Z2VwYWdlZCBkcml2aW5nIGNoZWNrLlxcbisgKlxcbisgKiBSYWNlIHRlc3RzIGRyaXZlIGtodWdlcGFnZWQgdGhyb3VnaCB0aGUgZXhpc3Rpbmcgc3lzZnMgY29udHJvbHM6IGFcXG4rICogc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgYW5kIGZ1bGxfc2NhbnNcXG4rICogYWR2YW5jaW5nIGJ5IHR3byBpcyBhIGNvbXBsZXRpb24gYmFycmllciBmb3Igb25lIGZ1bGwgcGFzcyB0aGF0XFxuKyAqIHN0YXJ0ZWQgYWZ0ZXIgc2V0dXAgKGtodWdlcGFnZWRfZnVsbF9wYXNzKCkpLiBWZXJpZnkgdGhlIHBhaXIgZ2l2ZXNcXG4rICogZGV0ZXJtaW5pc3RpYywgYXR0cmlidXRhYmxlIHJlc3VsdHM6IG9uZSBiYXJyaWVyIHN0ZXAgb3ZlciBvbmVcXG4rICogcHJlcGFyZWQgd2luZG93IHByb2R1Y2VzIGV4YWN0bHkgb25lIGNvbGxhcHNlIGF0dGVtcHQgb24gdGhhdFxcbisgKiB3aW5kb3cncyBzb3VyY2UgcGFnZXMg4oCUIG1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlIGV2ZW50c1xcbisgKiBmaWx0ZXJlZCBieSBzb3VyY2UgUEZOIGFuZCBvcmRlciDigJQgYW5kIHRoZSB3aW5kb3cgaXMgY29sbGFwc2VkXFxuKyAqIGFmdGVyd2FyZHMsIHJlcGVhdGFibHkuXFxuKyAqXFxuKyAqIHNjYW5fc2xlZXBfbWlsbGlzZWNzIGlzIHNldCB0byA2MHMgdG8gcHJvdmUgdGhlIHdha2UgcGF0aDogd2l0aG91dFxcbisgKiB0aGUgd2FrZSwgb25lIGJhcnJpZXIgc3RlcCB3b3VsZCBzbGVlcCBtdWx0aXBsZXMgb2YgdGhhdCBhbmQgYmxvd1xcbisgKiB0aGUgdGltZW91dC4gSXQgYWxzbyBrZWVwcyB0aGUgZGFlbW9uIGZyb20gZnJlZS1ydW5uaW5nIGJldHdlZW5cXG4rICogc3RlcHMsIHBlciB0aGUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSBkaXNjaXBsaW5lLlxcbisgKi9cXG4rI2RlZmluZSBfR05VX1NPVVJDRVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0cmluZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL21tYW4uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3VuaXN0ZC5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcImtzZWxmdGVzdC5oXFxcIlxcbisjaW5jbHVkZSBcXFwidm1fdXRpbC5oXFxcIlxcbisjaW5jbHVkZSBcXFwiaHVnZXBhZ2Vfc2V0dGluZ3MuaFxcXCJcXG4rXFxuKyNkZWZpbmUgQkFTRV9BRERSICgodm9pZCAqKSgxVUwgXFx1MDAzY1xcdTAwM2MgMzApKVxcbisjZGVmaW5lIFRBUkdFVF9PUkRFUiAyXFx0Lyogc21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCBjb25zaWRlcnMgKi9cXG4rI2RlZmluZSBOUl9JVEVSQVRJT05TIDVcXG4rXFxuK3N0YXRpYyBpbnQgcGFnZW1hcF9mZDtcXG4rc3RhdGljIGludCBrcGFnZWZsYWdzX2ZkO1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcXG4rXFxuKy8qXFxuKyAqIENvdW50IGNvbGxhcHNlIGF0dGVtcHRzIGF0dHJpYnV0YWJsZSB0byBvdXIgd2luZG93OiBsZWdhY3ktZW5naW5lXFxuKyAqIGlzb2xhdGUgZXZlbnRzIHdob3NlIHNjYW5fcGZuIGlzIG9uZSBvZiB0aGUgd2luZG93J3Mgc291cmNlIFBGTnMsXFxuKyAqIHBsdXMgYmF0Y2gtZW5naW5lIHBlci1jYW5kaWRhdGUgaW5zdGFsbCBldmVudHMgYXQgdGhlIHdpbmRvdydzXFxuKyAqIGFkZHJlc3MuIEVpdGhlciBlbmdpbmUgcmVwb3J0cyBleGFjdGx5IG9uY2UgcGVyIGF0dGVtcHQuXFxuKyAqL1xcbitzdGF0aWMgaW50IGNvdW50X2F0dHJpYnV0ZWQodW5zaWduZWQgbG9uZyAqcGZucywgaW50IG5yX3BmbnMsXFxuK1xcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBvcmRlcilcXG4re1xcbitcXHRjaGFyIGxpbmVbMTAyNF07XFxuK1xcdGludCBjb3VudCA9IDA7XFxuK1xcdEZJTEUgKmZwO1xcbitcXG4rXFx0ZnAgPSB0cmFjaW5nX29wZW5fdHJhY2UoKTtcXG4rXFx0aWYgKCFmcClcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJDYW5ub3Qgb3BlbiB0cmFjZSBidWZmZXJcXFxcblxcXCIpO1xcbitcXG4rXFx0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKSB7XFxuK1xcdFxcdGNoYXIgKnM7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgdmFsO1xcbitcXHRcXHR1bnNpZ25lZCBpbnQgb3JkO1xcbitcXHRcXHRjaGFyICpvO1xcbitcXHRcXHRpbnQgaTtcXG4rXFxuK1xcdFxcdHMgPSBzdHJzdHIobGluZSwgXFxcIm1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOlxcXCIpO1xcbitcXHRcXHRpZiAocykge1xcbitcXHRcXHRcXHRpZiAoc3NjYW5mKHMsIFxcXCJtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTogc2Nhbl9wZm49MHglbHhcXFwiLFxcbitcXHRcXHRcXHRcXHQgICBcXHUwMDI2dmFsKSAhPSAxKVxcbitcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0XFx0byA9IHN0cnN0cihzLCBcXFwib3JkZXI9XFxcIik7XFxuK1xcdFxcdFxcdGlmICghbyB8fCBzc2NhbmYobywgXFxcIm9yZGVyPSV1XFxcIiwgXFx1MDAyNm9yZCkgIT0gMSB8fFxcbitcXHRcXHRcXHQgICAgb3JkICE9IG9yZGVyKVxcbitcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX3BmbnM7IGkrKykge1xcbitcXHRcXHRcXHRcXHRpZiAodmFsID09IHBmbnNbaV0pIHtcXG4rXFx0XFx0XFx0XFx0XFx0Y291bnQrKztcXG4rXFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdFxcdH1cXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0cyA9IHN0cnN0cihsaW5lLCBcXFwibW1fY29sbGFwc2VfY2FuZGlkYXRlOlxcXCIpO1xcbitcXHRcXHRpZiAocykge1xcbitcXHRcXHRcXHRpZiAoIXN0cnN0cihzLCBcXFwicGFzcz1pbnN0YWxsXFxcIikgfHxcXG4rXFx0XFx0XFx0ICAgICFzdHJzdHIocywgXFxcInJlc3VsdD1zdWNjZWVkZWRcXFwiKSlcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdG8gPSBzdHJzdHIocywgXFxcImFkZHI9XFxcIik7XFxuK1xcdFxcdFxcdGlmICghbyB8fCBzc2NhbmYobywgXFxcImFkZHI9MHglbHhcXFwiLCBcXHUwMDI2dmFsKSAhPSAxIHx8XFxuK1xcdFxcdFxcdCAgICB2YWwgIT0gYWRkcilcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdG8gPSBzdHJzdHIocywgXFxcIm9yZGVyPVxcXCIpO1xcbitcXHRcXHRcXHRpZiAoIW8gfHwgc3NjYW5mKG8sIFxcXCJvcmRlcj0ldVxcXCIsIFxcdTAwMjZvcmQpICE9IDEgfHxcXG4rXFx0XFx0XFx0ICAgIG9yZCAhPSBvcmRlcilcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdGNvdW50Kys7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXHRmY2xvc2UoZnApO1xcbitcXHRyZXR1cm4gY291bnQ7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIG9uZV9zdGVwKGludCBpdGVyYXRpb24pXFxuK3tcXG4rXFx0Y29uc3Qgc2l6ZV90IHdpbmRvdyA9IGdldHBhZ2VzaXplKCkgXFx1MDAzY1xcdTAwM2MgVEFSR0VUX09SREVSO1xcbitcXHRjb25zdCBpbnQgbnJfcGFnZXMgPSAxIFxcdTAwM2NcXHUwMDNjIFRBUkdFVF9PUkRFUjtcXG4rXFx0dW5zaWduZWQgbG9uZyBwZm5zWzEgXFx1MDAzY1xcdTAwM2MgVEFSR0VUX09SREVSXTtcXG4rXFx0Ym9vbCBjb2xsYXBzZWQ7XFxuK1xcdGludCBhdHRyaWJ1dGVkO1xcbitcXHRjaGFyICpwO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdHAgPSBtbWFwKEJBU0VfQUREUiwgaHBhZ2VfcG1kX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXFxuK1xcdFxcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTtcXG4rXFx0aWYgKHAgIT0gQkFTRV9BRERSKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIkZhaWxlZCB0byBhbGxvY2F0ZSBWTUEgYXQgJXBcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCAgIEJBU0VfQUREUik7XFxuK1xcbitcXHQvKiBQcmVwYXJlIG9uZSB3aW5kb3c7IHJlY29yZCBpdHMgc291cmNlIFBGTnMuICovXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XFxuK1xcdFxcdHBbaSAqIGdldHBhZ2VzaXplKCldID0gaSArIDE7XFxuK1xcdFxcdHBmbnNbaV0gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcCArIGkgKiBnZXRwYWdlc2l6ZSgpKTtcXG4rXFx0XFx0aWYgKHBmbnNbaV0gPT0gLTFVTClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJTb3VyY2UgcGFnZSBub3QgcHJlc2VudFxcXFxuXFxcIik7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICh0cmFjaW5nX2V2ZW50c19zdGFydChcXFwiaHVnZV9tZW1vcnlcXFwiKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJDYW5ub3QgZW5hYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xcXFxuXFxcIik7XFxuK1xcbitcXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcXG4rXFx0LyogV2FpdCB1cCB0byAxMjAgc2Vjb25kcyBmb3IgdGhlIHBhc3MgdG8gY29tcGxldGUuICovXFxuK1xcdGlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoMTIwKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJraHVnZXBhZ2VkIGRpZCBub3QgY29tcGxldGUgYSBmdWxsIHBhc3NcXFxcblxcXCIpO1xcbitcXG4rXFx0dHJhY2luZ19ldmVudHNfc3RvcChcXFwiaHVnZV9tZW1vcnlcXFwiKTtcXG4rXFxuK1xcdGNvbGxhcHNlZCA9IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgd2luZG93LCBUQVJHRVRfT1JERVIsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTtcXG4rXFx0YXR0cmlidXRlZCA9IGNvdW50X2F0dHJpYnV0ZWQocGZucywgbnJfcGFnZXMsICh1bnNpZ25lZCBsb25nKXAsXFxuK1xcdFxcdFxcdFxcdCAgICAgIFRBUkdFVF9PUkRFUik7XFxuK1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0KGNvbGxhcHNlZCBcXHUwMDI2XFx1MDAyNiBhdHRyaWJ1dGVkID09IDEsXFxuK1xcdFxcdFxcdCBcXFwic3RlcCAlZDogd2luZG93IGNvbGxhcHNlZCwgJWQgYXR0cmlidXRlZCByZXN1bHQocylcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCBpdGVyYXRpb24sIGF0dHJpYnV0ZWQpO1xcbitcXG4rXFx0bXVubWFwKHAsIGhwYWdlX3BtZF9zaXplKTtcXG4rfVxcbitcXG4raW50IG1haW4odm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XFxuK1xcbitcXHRpZiAoIXRocF9hdmFpbGFibGUoKSlcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxcXG5cXFwiKTtcXG4rXFx0aWYgKCEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcXHUwMDI2ICgxVUwgXFx1MDAzY1xcdTAwM2MgVEFSR0VUX09SREVSKSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgICAgICBUQVJHRVRfT1JERVIpO1xcbitcXG4rXFx0aHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpO1xcbitcXHRpZiAoIWhwYWdlX3BtZF9zaXplKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIlJlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxcXFxuXFxcIik7XFxuK1xcdHBhZ2VtYXBfZmQgPSBvcGVuKFxcXCIvcHJvYy9zZWxmL3BhZ2VtYXBcXFwiLCBPX1JET05MWSk7XFxuK1xcdGlmIChwYWdlbWFwX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJvcGVuKFxcXFxcXFwiL3Byb2Mvc2VsZi9wYWdlbWFwXFxcXFxcXCIpXFxcIik7XFxuK1xcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcIiwgT19SRE9OTFkpO1xcbitcXHRpZiAoa3BhZ2VmbGFnc19mZCBcXHUwMDNjIDApXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJvcGVuKFxcXFxcXFwiL3Byb2Mva3BhZ2VmbGFnc1xcXFxcXFwiKSByZXF1aXJlcyByb290XFxcXG5cXFwiKTtcXG4rXFx0aWYgKHRyYWNpbmdfZXZlbnRzX3N0YXJ0KFxcXCJodWdlX21lbW9yeVxcXCIpKVxcbitcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwidHJhY2VmcyB1bmF2YWlsYWJsZVxcXFxuXFxcIik7XFxuK1xcdHRyYWNpbmdfZXZlbnRzX3N0b3AoXFxcImh1Z2VfbWVtb3J5XFxcIik7XFxuK1xcbitcXHRrc2Z0X3NldF9wbGFuKE5SX0lURVJBVElPTlMpO1xcbitcXG4rXFx0dGhwX3NhdmVfc2V0dGluZ3MoKTtcXG4rXFx0dGhwX3JlYWRfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFx0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTUFEVklTRTtcXG4rXFx0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7XFxuK1xcdHNldHRpbmdzLmtodWdlcGFnZWQuc2Nhbl9zbGVlcF9taWxsaXNlY3MgPSA2MDAwMDtcXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSA2MDAwMDtcXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gKGhwYWdlX3BtZF9zaXplIC8gZ2V0cGFnZXNpemUoKSkgLSAxO1xcbitcXHQvKiBPbmUgd2FrZSBtdXN0IGNvbXBsZXRlIG9uZSBmdWxsIHBhc3M7IHNlZSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpLiAqL1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSAxVUwgXFx1MDAzY1xcdTAwM2MgMjQ7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBOUl9PUkRFUlM7IGkrKylcXG4rXFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XFxuK1xcdHNldHRpbmdzLmh1Z2VwYWdlc1tUQVJHRVRfT1JERVJdLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcXG4rXFx0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqL1xcbitcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIE5SX0lURVJBVElPTlM7IGkrKylcXG4rXFx0XFx0b25lX3N0ZXAoaSk7XFxuK1xcbitcXHR0aHBfcmVzdG9yZV9zZXR0aW5ncygpO1xcbitcXG4rXFx0a3NmdF9maW5pc2hlZCgpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcXG5pbmRleCA2ODdkMTE1ZTNiZDgwLi5mODI2Y2Y5NDBjM2Q0IDEwMDc1NVxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcXG5AQCAtNDAyLDEwICs0MDIsMjcgQEAgQ0FURUdPUlk9XFxcInBmbm1hcFxcXCIgcnVuX3Rlc3QgLi9wZm5tYXBcXG4gIyBDT1cgdGVzdHNcXG4gQ0FURUdPUlk9XFxcImNvd1xcXCIgcnVuX3Rlc3QgLi9jb3dcXG4gXFxuK0NBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4vZm9saW9fb3JkZXJfY2hlY2tcXG4rXFxuK1xcbitDQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2todWdlcGFnZWRfc3luY19jaGVja1xcbitcXG4rQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3JhY2UgLWQgNSAtbSBzdGVwcGVkXFxuK1xcbitDQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIGZyZWVcXG4rXFxuK0NBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9yYWNlIC1kIDUgLW0gbWFkdmlzZVxcbitcXG4rQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3JhY2UgLWQgNSAtbSBzdGVwcGVkIC16XFxuK1xcbitDQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIHN0ZXBwZWQgLXBcXG4rXFxuIENBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZFxcbiBcXG4gQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1zIDJcXG4gXFxuK0NBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtbyAyIGtodWdlcGFnZWQ6YW5vblxcbitcXG4gQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIGFsbDpzaG1lbVxcbiBcXG4gQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1zIDQgYWxsOnNobWVtXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXFxuaW5kZXggMzJiOTkxNDcyZjc0NC4uOWIzODg1YmQwMDFiZSAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xcbkBAIC00Miw2OCArNDIsNiBAQCBjb25zdCBjaGFyICprcGFnZWZsYWdzX3Byb2MgPSBcXFwiL3Byb2Mva3BhZ2VmbGFnc1xcXCI7XFxuIGludCBwYWdlbWFwX2ZkO1xcbiBpbnQga3BhZ2VmbGFnc19mZDtcXG4gXFxuLXN0YXRpYyBib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcXG4tXFx0XFx0aW50IGtwYWdlZmxhZ3NfZmQpXFxuLXtcXG4tXFx0Y29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDtcXG4tXFx0Y29uc3QgdWludDY0X3QgZm9saW9fdGFpbF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfVEFJTDtcXG4tXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcXHUwMDNjXFx1MDAzYyBvcmRlcjtcXG4tXFx0dW5zaWduZWQgbG9uZyBwZm5faGVhZDtcXG4tXFx0dWludDY0X3QgcGZuX2ZsYWdzO1xcbi1cXHR1bnNpZ25lZCBsb25nIHBmbjtcXG4tXFx0dW5zaWduZWQgbG9uZyBpO1xcbi1cXG4tXFx0cGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTtcXG4tXFxuLVxcdC8qIG5vbiBwcmVzZW50IHBhZ2UgKi9cXG4tXFx0aWYgKHBmbiA9PSAtMVVMKVxcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcbi1cXHRpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsIFxcdTAwMjZwZm5fZmxhZ3MpKVxcbi1cXHRcXHRnb3RvIGZhaWw7XFxuLVxcbi1cXHQvKiBjaGVjayBmb3Igb3JkZXItMCBwYWdlcyAqL1xcbi1cXHRpZiAoIW9yZGVyKSB7XFxuLVxcdFxcdGlmIChwZm5fZmxhZ3MgXFx1MDAyNiAoZm9saW9faGVhZF9mbGFncyB8IGZvbGlvX3RhaWxfZmxhZ3MpKVxcbi1cXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcdFxcdHJldHVybiB0cnVlO1xcbi1cXHR9XFxuLVxcbi1cXHQvKiBub24gVEhQIGZvbGlvICovXFxuLVxcdGlmICghKHBmbl9mbGFncyBcXHUwMDI2IEtQRl9USFApKVxcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcbi1cXHRwZm5faGVhZCA9IHBmbiBcXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcXG4tXFxuLVxcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4tXFx0XFx0Z290byBmYWlsO1xcbi1cXG4tXFx0LyogaGVhZCBQRk4gaGFzIG5vIGNvbXBvdW5kX2hlYWQgZmxhZyBzZXQgKi9cXG4tXFx0aWYgKChwZm5fZmxhZ3MgXFx1MDAyNiBmb2xpb19oZWFkX2ZsYWdzKSAhPSBmb2xpb19oZWFkX2ZsYWdzKVxcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcbi1cXHQvKiBjaGVjayBhbGwgdGFpbCBQRk4gZmxhZ3MgKi9cXG4tXFx0Zm9yIChpID0gMTsgaSBcXHUwMDNjIG5yX3BhZ2VzOyBpKyspIHtcXG4tXFx0XFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBpLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4tXFx0XFx0XFx0Z290byBmYWlsO1xcbi1cXHRcXHRpZiAoKHBmbl9mbGFncyBcXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpXFxuLVxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4tXFx0fVxcbi1cXG4tXFx0LypcXG4tXFx0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcXG4tXFx0ICogYXNzdW1lIHRoaXMgZm9saW8gaGFzIHRoZSBleHBlY3RlZCBvcmRlclxcbi1cXHQgKi9cXG4tXFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBucl9wYWdlcywga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuLVxcdFxcdHJldHVybiB0cnVlO1xcbi1cXG4tXFx0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xcbi1cXHRyZXR1cm4gKHBmbl9mbGFncyBcXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7XFxuLWZhaWw6XFxuLVxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiRmFpbGVkIHRvIGdldCBmb2xpbyBpbmZvXFxcXG5cXFwiKTtcXG4tXFx0cmV0dXJuIGZhbHNlO1xcbi19XFxuLVxcbiBzdGF0aWMgaW50IHZhZGRyX3BhZ2VmbGFnc19nZXQoY2hhciAqdmFkZHIsIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCxcXG4gXFx0XFx0dWludDY0X3QgKmZsYWdzKVxcbiB7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xcbmluZGV4IGVmMWVhMTE5ODFhNzQuLjg4NmZiM2RlOWMwMTEgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXFxuQEAgLTMwMyw2ICszMDMsMTYzIEBAIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKVxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4rYm9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsXFxuK1xcdFxcdFxcdGludCBrcGFnZWZsYWdzX2ZkKVxcbit7XFxuK1xcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX2hlYWRfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX0hFQUQ7XFxuK1xcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXFx1MDAzY1xcdTAwM2Mgb3JkZXI7XFxuK1xcdHVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7XFxuK1xcdHVpbnQ2NF90IHBmbl9mbGFncztcXG4rXFx0dW5zaWduZWQgbG9uZyBwZm47XFxuK1xcdHVuc2lnbmVkIGxvbmcgaTtcXG4rXFxuK1xcdHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XFxuK1xcbitcXHQvKiBub24gcHJlc2VudCBwYWdlICovXFxuK1xcdGlmIChwZm4gPT0gLTFVTClcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXG4rXFx0LyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi9cXG4rXFx0aWYgKCFvcmRlcikge1xcbitcXHRcXHRpZiAocGZuX2ZsYWdzIFxcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0fVxcbitcXG4rXFx0Lyogbm9uIFRIUCBmb2xpbyAqL1xcbitcXHRpZiAoIShwZm5fZmxhZ3MgXFx1MDAyNiBLUEZfVEhQKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0cGZuX2hlYWQgPSBwZm4gXFx1MDAyNiB+KG5yX3BhZ2VzIC0gMSk7XFxuK1xcbitcXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCwga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFxuK1xcdC8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovXFxuK1xcdGlmICgocGZuX2ZsYWdzIFxcdTAwMjYgZm9saW9faGVhZF9mbGFncykgIT0gZm9saW9faGVhZF9mbGFncylcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0LyogY2hlY2sgYWxsIHRhaWwgUEZOIGZsYWdzICovXFxuK1xcdGZvciAoaSA9IDE7IGkgXFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XFxuK1xcdFxcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgaSwga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuK1xcdFxcdFxcdGdvdG8gZmFpbDtcXG4rXFx0XFx0aWYgKChwZm5fZmxhZ3MgXFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdC8qXFxuK1xcdCAqIGNoZWNrIHRoZSBQRk4gYWZ0ZXIgdGhpcyBmb2xpbywgYnV0IGlmIGl0cyBmbGFncyBjYW5ub3QgYmUgb2J0YWluZWQsXFxuK1xcdCAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXJcXG4rXFx0ICovXFxuK1xcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFxcdTAwMjZwZm5fZmxhZ3MpKVxcbitcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFxuK1xcdC8qIElmIHdlIGZpbmQgYW5vdGhlciB0YWlsIHBhZ2UsIHRoZW4gdGhlIGZvbGlvIGlzIGxhcmdlci4gKi9cXG4rXFx0cmV0dXJuIChwZm5fZmxhZ3MgXFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzO1xcbitmYWlsOlxcbitcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIkZhaWxlZCB0byBnZXQgZm9saW8gaW5mb1xcXFxuXFxcIik7XFxuK1xcdHJldHVybiBmYWxzZTtcXG4rfVxcbitcXG4rLypcXG4rICogQ2hlY2sgd2hldGhlciB0aGUgcmFuZ2UgW3N0YXJ0LCBzdGFydCArIGxlbikgaXMgYmFja2VkIGJ5IGZvbGlvcyBvZlxcbisgKiBleGFjdGx5IEBvcmRlciwgbWFwcGVkIGF0IHRoZWlyIG5hdHVyYWwgYWxpZ25tZW50LlxcbisgKlxcbisgKiBpc19iYWNrZWRfYnlfZm9saW8oKSBjbGFzc2lmaWVzIHRoZSBmb2xpbyBiYWNraW5nIG9uZSBwYWdlOyBoZXJlIHdlXFxuKyAqIGFkZGl0aW9uYWxseSByZXF1aXJlIHRoYXQgZWFjaCBvcmRlci1hbGlnbmVkIHdpbmRvdyBvZiB0aGUgcmFuZ2UgbWFwc1xcbisgKiBvbmUgc3VjaCBmb2xpbyBoZWFkLXRvLXRhaWw6IHRoZSBWQSByYW5nZSBtdXN0IGJlIG5hdHVyYWxseSBhbGlnbmVkLFxcbisgKiBlYWNoIHdpbmRvdydzIFBGTiBydW4gbXVzdCBiZSBjb250aWd1b3VzLCBhbmQgdGhlIGZpcnN0IFBGTiBtdXN0IGJlXFxuKyAqIHRoZSAobmF0dXJhbGx5IGFsaWduZWQpIGZvbGlvIGhlYWQuXFxuKyAqXFxuKyAqIFRoaXMgaXMgdGhlIGNoZWNrIFxcXCJkaWQgdGhpcyByYW5nZSBjb2xsYXBzZSBpbnRvIG9yZGVyLUBvcmRlciBmb2xpb3NcXFwiOlxcbisgKiBhIHdpbmRvdyBhc3NlbWJsZWQgZnJvbSBwYXJ0cyBvZiBzZXZlcmFsIGZvbGlvcywgb3IgbWFwcGluZyBhIGZvbGlvXFxuKyAqIHNoaWZ0ZWQgZnJvbSBpdHMgbmF0dXJhbCBwb3NpdGlvbiwgZmFpbHMuXFxuKyAqL1xcbitib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMoY2hhciAqc3RhcnQsIHNpemVfdCBsZW4sIGludCBvcmRlcixcXG4rXFx0XFx0XFx0XFx0ICAgICBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQpXFxuK3tcXG4rXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcXHUwMDNjXFx1MDAzYyBvcmRlcjtcXG4rXFx0Y29uc3Qgc2l6ZV90IHdpbmRvdyA9IG5yX3BhZ2VzICogcHNpemUoKTtcXG4rXFx0Y2hhciAqdmFkZHI7XFxuK1xcbitcXHRpZiAoKHVpbnRwdHJfdClzdGFydCAlIHdpbmRvdyB8fCBsZW4gJSB3aW5kb3cpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdGZvciAodmFkZHIgPSBzdGFydDsgdmFkZHIgXFx1MDAzYyBzdGFydCArIGxlbjsgdmFkZHIgKz0gd2luZG93KSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBpO1xcbitcXG4rXFx0XFx0LyogTm90IHByZXNlbnQsIG9yIG5vdCBtYXBwaW5nIHRoZSBmb2xpbyBoZWFkLiAqL1xcbitcXHRcXHRpZiAocGZuID09IC0xVUwgfHwgcGZuICUgbnJfcGFnZXMpXFxuK1xcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdFxcdGZvciAoaSA9IDE7IGkgXFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XFxuK1xcdFxcdFxcdGlmIChwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIgKyBpICogcHNpemUoKSkgIT1cXG4rXFx0XFx0XFx0ICAgIHBmbiArIGkpXFxuK1xcdFxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0aWYgKCFpc19iYWNrZWRfYnlfZm9saW8odmFkZHIsIG9yZGVyLCBwYWdlbWFwX2ZkLFxcbitcXHRcXHRcXHRcXHRcXHRrcGFnZWZsYWdzX2ZkKSlcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rI2RlZmluZSBUUkFDRUZTX1JPT1QgXFxcIi9zeXMva2VybmVsL3RyYWNpbmdcXFwiXFxuK1xcbitzdGF0aWMgaW50IHRyYWNpbmdfZXZlbnRzX3dyaXRlKGNvbnN0IGNoYXIgKnN1YnN5cywgY29uc3QgY2hhciAqdmFsKVxcbit7XFxuK1xcdGNoYXIgcGF0aFsyNTZdO1xcbitcXHRpbnQgZmQ7XFxuK1xcbitcXHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFRSQUNFRlNfUk9PVCBcXFwiL2V2ZW50cy8lcy9lbmFibGVcXFwiLFxcbitcXHRcXHQgc3Vic3lzKTtcXG4rXFx0ZmQgPSBvcGVuKHBhdGgsIE9fV1JPTkxZKTtcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRpZiAod3JpdGUoZmQsIHZhbCwgMSkgIT0gMSkge1xcbitcXHRcXHRjbG9zZShmZCk7XFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0fVxcbitcXHRjbG9zZShmZCk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKlxcbisgKiBFbmFibGUgb25lIGZ0cmFjZSBldmVudCBzdWJzeXN0ZW0gKGUuZy4gXFxcImh1Z2VfbWVtb3J5XFxcIikgYW5kIGNsZWFyIHRoZVxcbisgKiB0cmFjZSBidWZmZXIuIFJldHVybnMgLTEgaWYgdHJhY2VmcyBpcyB1bmF2YWlsYWJsZTsgcGFyc2UgdGhlIHJlc3VsdHNcXG4rICogdmlhIHRyYWNpbmdfb3Blbl90cmFjZSgpIGFmdGVyIHRyYWNpbmdfZXZlbnRzX3N0b3AoKS5cXG4rICovXFxuK2ludCB0cmFjaW5nX2V2ZW50c19zdGFydChjb25zdCBjaGFyICpzdWJzeXMpXFxuK3tcXG4rXFx0aW50IGZkO1xcbitcXG4rXFx0aWYgKHRyYWNpbmdfZXZlbnRzX3dyaXRlKHN1YnN5cywgXFxcIjFcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0ZmQgPSBvcGVuKFRSQUNFRlNfUk9PVCBcXFwiL3RyYWNlXFxcIiwgT19XUk9OTFkgfCBPX1RSVU5DKTtcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitpbnQgdHJhY2luZ19ldmVudHNfc3RvcChjb25zdCBjaGFyICpzdWJzeXMpXFxuK3tcXG4rXFx0cmV0dXJuIHRyYWNpbmdfZXZlbnRzX3dyaXRlKHN1YnN5cywgXFxcIjBcXFwiKTtcXG4rfVxcbitcXG4rRklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIGZvcGVuKFRSQUNFRlNfUk9PVCBcXFwiL3RyYWNlXFxcIiwgXFxcInJcXFwiKTtcXG4rfVxcbitcXG4gLyogSWYgYGlvY3Rscycgbm9uLU5VTEwsIHRoZSBhbGxvd2VkIGlvY3RscyB3aWxsIGJlIHJldHVybmVkIGludG8gdGhlIHZhciAqL1xcbiBpbnQgdWZmZF9yZWdpc3Rlcl93aXRoX2lvY3RscyhpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLFxcbiBcXHRcXHRcXHQgICAgICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IsIHVpbnQ2NF90ICppb2N0bHMpXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaFxcbmluZGV4IDc3OTkxNTRiNjdlZWQuLjRmZjVhMWM1YWI4ZWQgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXFxuQEAgLTk1LDYgKzk1LDEwIEBAIGJvb2wgY2hlY2tfaHVnZV9maWxlKHZvaWQgKmFkZHIsIGludCBucl9ocGFnZXMsIHVpbnQ2NF90IGhwYWdlX3NpemUpO1xcbiBib29sIGNoZWNrX2h1Z2Vfc2htZW0odm9pZCAqYWRkciwgaW50IG5yX2hwYWdlcywgdWludDY0X3QgaHBhZ2Vfc2l6ZSk7XFxuIGludDY0X3QgYWxsb2NhdGVfdHJhbnNodWdlKHZvaWQgKnB0ciwgaW50IHBhZ2VtYXBfZmQpO1xcbiBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncyk7XFxuK2Jvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLFxcbitcXHRcXHRcXHRpbnQga3BhZ2VmbGFnc19mZCk7XFxuK2Jvb2wgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLFxcbitcXHRcXHRcXHRcXHQgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCk7XFxuIFxcbiBpbnQgdWZmZF9yZWdpc3RlcihpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLFxcbiBcXHRcXHQgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vcik7XFxuQEAgLTExMSw2ICsxMTUsOSBAQCBpbnQgY2xvc2VfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcCk7XFxuIGludCB3cml0ZV9zeXNmcyhjb25zdCBjaGFyICpmaWxlX3BhdGgsIHVuc2lnbmVkIGxvbmcgdmFsKTtcXG4gaW50IHJlYWRfc3lzZnMoY29uc3QgY2hhciAqZmlsZV9wYXRoLCB1bnNpZ25lZCBsb25nICp2YWwpO1xcbiBib29sIHNvZnRkaXJ0eV9zdXBwb3J0ZWQodm9pZCk7XFxuK2ludCB0cmFjaW5nX2V2ZW50c19zdGFydChjb25zdCBjaGFyICpzdWJzeXMpO1xcbitpbnQgdHJhY2luZ19ldmVudHNfc3RvcChjb25zdCBjaGFyICpzdWJzeXMpO1xcbitGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZCk7XFxuIFxcbiBzdGF0aWMgaW5saW5lIGludCBvcGVuX3NlbGZfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcF9vdXQpXFxuIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDNUMDE6MDM6MTQuNzQzMzY0NDA4WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6ODQ2OTA0MjMyMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2Vyc3BhY2Ugc2VsZnRlc3RzICh0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8qKSBhbmQgZG9lcyBub3QgbWFrZSBhbnkgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgaXRzZWxmLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgM2ZhNDAzMjRjOTExY2RkOWY0MzUyNjZkM2VjZWVhNmI1MmVmNzFjNlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gQXVnIDMgMDE6MDM6MTMgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8uZ2l0aWdub3JlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLmdpdGlnbm9yZVxuaW5kZXggOWNjZDllMTQ0N2U2Ni4uNjE2MDQzYTBmY2QyMiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy5naXRpZ25vcmVcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy5naXRpZ25vcmVcbkBAIC02NiwzICs2Niw2IEBAIG1lcmdlXG4gcHJjdGxfdGhwX2Rpc2FibGVcbiBybWFwXG4gZm9saW9fc3BsaXRfcmFjZV90ZXN0XG4rZm9saW9fb3JkZXJfY2hlY2tcbitraHVnZXBhZ2VkX3N5bmNfY2hlY2tcbitraHVnZXBhZ2VkX3JhY2VcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXG5pbmRleCAyNWQxMGNlZDNiM2I5Li4wMjZkNGI2MTQxNGQ0IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXG5AQCAtMTA0LDYgKzEwNCw5IEBAIFRFU1RfR0VOX0ZJTEVTICs9IGd1YXJkLXJlZ2lvbnNcbiBURVNUX0dFTl9GSUxFUyArPSBtZXJnZVxuIFRFU1RfR0VOX0ZJTEVTICs9IHJtYXBcbiBURVNUX0dFTl9GSUxFUyArPSBmb2xpb19zcGxpdF9yYWNlX3Rlc3RcbitURVNUX0dFTl9GSUxFUyArPSBmb2xpb19vcmRlcl9jaGVja1xuK1RFU1RfR0VOX0ZJTEVTICs9IGtodWdlcGFnZWRfc3luY19jaGVja1xuK1RFU1RfR0VOX0ZJTEVTICs9IGtodWdlcGFnZWRfcmFjZVxuIFxuIGlmbmVxICgkKEFSQ0gpLGFybTY0KVxuIFRFU1RfR0VOX0ZJTEVTICs9IHNvZnQtZGlydHlcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmY3MGQ3NjZmZjNlYjNcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmNcbkBAIC0wLDAgKzEsMTM4IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIFNlbGYtY2hlY2sgZm9yIHRoZSB2bV91dGlsIGZvbGlvLW9yZGVyIGRldGVjdGlvbiBoZWxwZXJzLFxuKyAqIGlzX2JhY2tlZF9ieV9mb2xpbygpIGFuZCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKCkuXG4rICpcbisgKiBGb3IgZXZlcnkgYW5vbiBUSFAgb3JkZXIgdGhlIGtlcm5lbCBzdXBwb3J0cywgZmF1bHQgbWVtb3J5IGluIHdpdGggb25seVxuKyAqIHRoYXQgb3JkZXIgZW5hYmxlZCBhbmQgdmVyaWZ5IHRoZSBoZWxwZXJzIHJlcG9ydCBleGFjdGx5IHRoYXQgb3JkZXI6XG4rICogbm90IGEgbmVpZ2hib3VyaW5nIG9yZGVyLCBhbmQgcGxhaW4gNEsgbWVtb3J5IGFzIG9yZGVyIDAuIFRoZSBoZWxwZXJzXG4rICogYXJlIHdoYXQgdGhlIGtodWdlcGFnZWQgbVRIUCB0ZXN0cyB1c2UgdG8gZGV0ZWN0IGNvbGxhcHNlIHJlc3VsdHMsIHNvXG4rICogdGhleSBtdXN0IGFncmVlIHdpdGggdGhlIGtlcm5lbCdzIG93biBpZGVhIG9mIHRoZSBiYWNraW5nIGJlZm9yZSBhbnlcbisgKiBjb2xsYXBzZSB0ZXN0IHJlbGllcyBvbiB0aGVtLlxuKyAqL1xuKyNkZWZpbmUgX0dOVV9TT1VSQ0VcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXCJrc2VsZnRlc3QuaFwiXG4rI2luY2x1ZGUgXCJ2bV91dGlsLmhcIlxuKyNpbmNsdWRlIFwiaHVnZXBhZ2Vfc2V0dGluZ3MuaFwiXG4rXG4rc3RhdGljIGludCBwYWdlbWFwX2ZkO1xuK3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDtcbitcbisvKiBtbWFwIGFuIGFub24gVk1BIG9mIGV4YWN0bHkgQHNpemUgYnl0ZXMgYXQgYSBAc2l6ZS1hbGlnbmVkIGFkZHJlc3MuICovXG4rc3RhdGljIGNoYXIgKmFsbG9jX2FsaWduZWQoc2l6ZV90IHNpemUpXG4re1xuK1x0c2l6ZV90IGxlbiA9IHNpemUgKiAyO1xuK1x0dWludHB0cl90IGFsaWduZWQ7XG4rXHRjaGFyICpwO1xuK1xuK1x0cCA9IG1tYXAoTlVMTCwgbGVuLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuK1x0XHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XG4rXHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtbWFwKClcIik7XG4rXG4rXHRhbGlnbmVkID0gKCh1aW50cHRyX3QpcCArIHNpemUgLSAxKSBcdTAwMjYgfihzaXplIC0gMSk7XG4rXHRpZiAoYWxpZ25lZCAhPSAodWludHB0cl90KXApXG4rXHRcdG11bm1hcChwLCBhbGlnbmVkIC0gKHVpbnRwdHJfdClwKTtcbitcdGlmIChhbGlnbmVkICsgc2l6ZSAhPSAodWludHB0cl90KXAgKyBsZW4pXG4rXHRcdG11bm1hcCgoY2hhciAqKWFsaWduZWQgKyBzaXplLFxuK1x0XHQgICAgICAgKHVpbnRwdHJfdClwICsgbGVuIC0gYWxpZ25lZCAtIHNpemUpO1xuK1xuK1x0cmV0dXJuIChjaGFyICopYWxpZ25lZDtcbit9XG4rXG4rLypcbisgKiBFbmFibGUgb25seSBAb3JkZXIgKG9yZGVyIDA6IG5vdGhpbmcpLCBmYXVsdCBvbmUgYWxpZ25lZCB3aW5kb3cgaW4gYW5kXG4rICogY2hlY2sgdGhlIGhlbHBlcnMgc2VlIGV4YWN0bHkgQG9yZGVyLlxuKyAqL1xuK3N0YXRpYyB2b2lkIGNoZWNrX29yZGVyKGludCBvcmRlcilcbit7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XG4rXHRzaXplX3Qgc2l6ZSA9IHBzaXplKCkgXHUwMDNjXHUwMDNjIG9yZGVyO1xuK1x0Ym9vbCBvayA9IHRydWU7XG4rXHRjaGFyICpwO1xuK1x0aW50IGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkrKylcbitcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XG4rXHRpZiAob3JkZXIpXG4rXHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tvcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7XG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRwID0gYWxsb2NfYWxpZ25lZChzaXplKTtcbitcdCpwID0gMTtcbitcbitcdGlmICghaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBzaXplLCBvcmRlcixcbitcdFx0XHRcdFx0ICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIm9yZGVyICVkIG5vdCBkZXRlY3RlZCBhZnRlciBmYXVsdFxcblwiLCBvcmRlcik7XG4rXHRcdG9rID0gZmFsc2U7XG4rXHR9XG4rXG4rXHQvKiBBIGxvd2VyIG9yZGVyIG11c3QgYmUgcmVqZWN0ZWQ6IHRoZSBmb2xpbyBpcyBsYXJnZXIuICovXG4rXHRpZiAob3JkZXIgXHUwMDI2XHUwMDI2IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgb3JkZXIgLSAxLFxuK1x0XHRcdFx0XHRcdCAgICAgcGFnZW1hcF9mZCxcbitcdFx0XHRcdFx0XHQgICAgIGtwYWdlZmxhZ3NfZmQpKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwib3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAlZFxcblwiLFxuK1x0XHRcdCAgICAgICBvcmRlciwgb3JkZXIgLSAxKTtcbitcdFx0b2sgPSBmYWxzZTtcbitcdH1cbitcbitcdC8qIE9yZGVyIDAgcGFnZXMgbXVzdCBub3QgbG9vayBsaWtlIGFueSBsYXJnZSBmb2xpbywgYW5kIHZpY2UgdmVyc2EuICovXG4rXHRpZiAob3JkZXIgXHUwMDI2XHUwMDI2IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgMCxcbitcdFx0XHRcdFx0XHQgICAgIHBhZ2VtYXBfZmQsXG4rXHRcdFx0XHRcdFx0ICAgICBrcGFnZWZsYWdzX2ZkKSkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIm9yZGVyICVkIGFsc28gcmVwb3J0ZWQgYXMgb3JkZXIgMFxcblwiLCBvcmRlcik7XG4rXHRcdG9rID0gZmFsc2U7XG4rXHR9XG4rXG4rXHRtdW5tYXAocCwgc2l6ZSk7XG4rXHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXG4rXHRrc2Z0X3Rlc3RfcmVzdWx0KG9rLCBcIm9yZGVyICVkIGNsYXNzaWZpZWRcXG5cIiwgb3JkZXIpO1xuK31cbitcbitpbnQgbWFpbih2b2lkKVxuK3tcbitcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4rXHR1bnNpZ25lZCBsb25nIG9yZGVycztcbitcdGludCBvcmRlcjtcbitcbitcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4rXG4rXHRpZiAoIXRocF9hdmFpbGFibGUoKSlcbitcdFx0a3NmdF9leGl0X3NraXAoXCJUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcblwiKTtcbitcbitcdHBhZ2VtYXBfZmQgPSBvcGVuKFwiL3Byb2Mvc2VsZi9wYWdlbWFwXCIsIE9fUkRPTkxZKTtcbitcdGlmIChwYWdlbWFwX2ZkIFx1MDAzYyAwKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJvcGVuKFxcXCIvcHJvYy9zZWxmL3BhZ2VtYXBcXFwiKVwiKTtcbitcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwiL3Byb2Mva3BhZ2VmbGFnc1wiLCBPX1JET05MWSk7XG4rXHRpZiAoa3BhZ2VmbGFnc19mZCBcdTAwM2MgMClcbitcdFx0a3NmdF9leGl0X3NraXAoXCJvcGVuKFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcIikgcmVxdWlyZXMgcm9vdFxcblwiKTtcbitcbitcdG9yZGVycyA9IHRocF9zdXBwb3J0ZWRfb3JkZXJzKCk7XG4rXHRpZiAoIW9yZGVycylcbitcdFx0a3NmdF9leGl0X3NraXAoXCJObyBzdXBwb3J0ZWQgVEhQIG9yZGVyc1xcblwiKTtcbitcbitcdGtzZnRfc2V0X3BsYW4oX19idWlsdGluX3BvcGNvdW50bChvcmRlcnMpICsgMSk7XG4rXG4rXHR0aHBfc2F2ZV9zZXR0aW5ncygpO1xuK1x0dGhwX3JlYWRfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1x0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqL1xuK1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1xuK1x0Y2hlY2tfb3JkZXIoMCk7XG4rXHRmb3IgKG9yZGVyID0gMTsgb3JkZXIgXHUwMDNjIE5SX09SREVSUzsgb3JkZXIrKykge1xuK1x0XHRpZiAoIShvcmRlcnMgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIG9yZGVyKSkpXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdGNoZWNrX29yZGVyKG9yZGVyKTtcbitcdH1cbitcbitcdHRocF9yZXN0b3JlX3NldHRpbmdzKCk7XG4rXG4rXHRrc2Z0X2ZpbmlzaGVkKCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jXG5pbmRleCBkNzkxN2RjZTNhYmFjLi5hMjZhMGNmZmE5YzViIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuQEAgLTE4Myw2ICsxODMsMTcgQEAgdm9pZCB0aHBfcmVhZF9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcbiBcdH1cbiB9XG4gXG4rLypcbisgKiBXcml0ZSBvbmx5IG9uIGNoYW5nZTogYW55IHN0b3JlIHRvIGEga2h1Z2VwYWdlZCBzeXNmcyBrbm9iIHdha2VzIHRoZVxuKyAqIGRhZW1vbiwgYW5kIHNldHRpbmdzIHB1c2hlcy9wb3BzIG11c3Qgbm90IHN0YXJ0IHNjYW4gcGFzc2VzIG5vYm9keVxuKyAqIGFza2VkIGZvciDigJQga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSBpcyB0aGUgb25seSBzYW5jdGlvbmVkIHdha2UuXG4rICovXG4rc3RhdGljIHZvaWQgdGhwX3VwZGF0ZV9udW0oY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBudW0pXG4re1xuK1x0aWYgKHRocF9yZWFkX251bShuYW1lKSAhPSBudW0pXG4rXHRcdHRocF93cml0ZV9udW0obmFtZSwgbnVtKTtcbit9XG4rXG4gdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4ge1xuIFx0c3RydWN0IGtodWdlcGFnZWRfc2V0dGluZ3MgKmtodWdlcGFnZWQgPSBcdTAwMjZzZXR0aW5ncy1cdTAwM2VraHVnZXBhZ2VkO1xuQEAgLTE5OCwxNSArMjA5LDE1IEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxuIFx0XHRcdHNobWVtX2VuYWJsZWRfc3RyaW5nc1tzZXR0aW5ncy1cdTAwM2VzaG1lbV9lbmFibGVkXSk7XG4gXHR0aHBfd3JpdGVfbnVtKFwidXNlX3plcm9fcGFnZVwiLCBzZXR0aW5ncy1cdTAwM2V1c2VfemVyb19wYWdlKTtcbiBcbi1cdHRocF93cml0ZV9udW0oXCJraHVnZXBhZ2VkL2RlZnJhZ1wiLCBraHVnZXBhZ2VkLVx1MDAzZWRlZnJhZyk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9hbGxvY19zbGVlcF9taWxsaXNlY3NcIixcbi1cdFx0XHRraHVnZXBhZ2VkLVx1MDAzZWFsbG9jX3NsZWVwX21pbGxpc2Vjcyk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1wiLFxuLVx0XHRcdGtodWdlcGFnZWQtXHUwMDNlc2Nhbl9zbGVlcF9taWxsaXNlY3MpO1xuLVx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvbWF4X3B0ZXNfbm9uZVwiLCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX25vbmUpO1xuLVx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvbWF4X3B0ZXNfc3dhcFwiLCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX3N3YXApO1xuLVx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc2hhcmVkKTtcbi1cdHRocF93cml0ZV9udW0oXCJraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW5cIiwga2h1Z2VwYWdlZC1cdTAwM2VwYWdlc190b19zY2FuKTtcbitcdHRocF91cGRhdGVfbnVtKFwia2h1Z2VwYWdlZC9kZWZyYWdcIiwga2h1Z2VwYWdlZC1cdTAwM2VkZWZyYWcpO1xuK1x0dGhwX3VwZGF0ZV9udW0oXCJraHVnZXBhZ2VkL2FsbG9jX3NsZWVwX21pbGxpc2Vjc1wiLFxuK1x0XHQgICAgICAga2h1Z2VwYWdlZC1cdTAwM2VhbGxvY19zbGVlcF9taWxsaXNlY3MpO1xuK1x0dGhwX3VwZGF0ZV9udW0oXCJraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXCIsXG4rXHRcdCAgICAgICBraHVnZXBhZ2VkLVx1MDAzZXNjYW5fc2xlZXBfbWlsbGlzZWNzKTtcbitcdHRocF91cGRhdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfbm9uZSk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvbWF4X3B0ZXNfc3dhcFwiLCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX3N3YXApO1xuK1x0dGhwX3VwZGF0ZV9udW0oXCJraHVnZXBhZ2VkL21heF9wdGVzX3NoYXJlZFwiLCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX3NoYXJlZCk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvcGFnZXNfdG9fc2NhblwiLCBraHVnZXBhZ2VkLVx1MDAzZXBhZ2VzX3RvX3NjYW4pO1xuIFxuIFx0aWYgKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGhbMF0pXG4gXHRcdHdyaXRlX251bShkZXZfcXVldWVfcmVhZF9haGVhZF9wYXRoLCBzZXR0aW5ncy1cdTAwM2VyZWFkX2FoZWFkX2tiKTtcbkBAIC0yMzAsNiArMjQxLDQzIEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxuIFx0fVxuIH1cbiBcbisvKlxuKyAqIENvbXBsZXRpb24gYmFycmllciBmb3Iga2h1Z2VwYWdlZDogd2FpdCB1bnRpbCBhIGZ1bGwgc2NhbiBwYXNzIHRoYXRcbisgKiBzdGFydGVkIGFmdGVyIHRoaXMgY2FsbCBoYXMgZmluaXNoZWQuIGZ1bGxfc2NhbnMgbXVzdCBhZHZhbmNlIGJ5IHR3bztcbisgKiBhICsxIHN0ZXAgbWF5IGNvbXBsZXRlIGEgcGFzcyB0aGF0IGV4YW1pbmVkIHRoaXMgbW0gYmVmb3JlIHRoZVxuKyAqIGNhbGxlcidzIHNldHVwIHdhcyBpbiBwbGFjZS5cbisgKlxuKyAqIEFueSBzdG9yZSB0byBzY2FuX3NsZWVwX21pbGxpc2VjcyB3YWtlcyB0aGUgZGFlbW9uLCBzbyB0aGUgYmFycmllclxuKyAqIHdvcmtzIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbmZpZ3VyZWQgc2NhbiBjYWRlbmNlLiBJdCB3YWtlcyBleGFjdGx5XG4rICogb25jZSBwZXIgbWlzc2luZyBwYXNzIOKAlCBvdmVyLXdha2luZyB3b3VsZCBxdWV1ZSBhIHN0cmFnZ2xlciBwYXNzXG4rICogYmVoaW5kIHRoZSBiYXJyaWVyLCBwZXJ0dXJiaW5nIHdoYXRldmVyIHRoZSBjYWxsZXIgc2V0cyB1cCBuZXh0LlxuKyAqIE9uZSB3YWtlIGNvbXBsZXRlcyBvbmUgZnVsbCBwYXNzIG9ubHkgaWYgdGhlIHdob2xlIG1tIGxpc3QgZml0cyBpblxuKyAqIG9uZSBzY2FuIGJhdGNoLCBzbyBjYWxsZXJzIG11c3QgcGFpciB0aGlzIHdpdGggYSBsYXJnZVxuKyAqIHBhZ2VzX3RvX3NjYW4uXG4rICovXG4rYm9vbCBraHVnZXBhZ2VkX2Z1bGxfcGFzcyh1bnNpZ25lZCBpbnQgdGltZW91dF9zKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgZGVhZGxpbmVfbXMgPSB0aW1lb3V0X3MgKiAxMDAwVUw7XG4rXHR1bnNpZ25lZCBsb25nIHNsZWVwX21zID1cbitcdFx0dGhwX3JlYWRfbnVtKFwia2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1wiKTtcbitcdHVuc2lnbmVkIGxvbmcgZWxhcHNlZF9tcyA9IDA7XG4rXHRpbnQgcGFzcztcbitcbitcdGZvciAocGFzcyA9IDA7IHBhc3MgXHUwMDNjIDI7IHBhc3MrKykge1xuK1x0XHR1bnNpZ25lZCBsb25nIHRhcmdldCA9XG4rXHRcdFx0dGhwX3JlYWRfbnVtKFwia2h1Z2VwYWdlZC9mdWxsX3NjYW5zXCIpICsgMTtcbitcbitcdFx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcIiwgc2xlZXBfbXMpO1xuK1x0XHR3aGlsZSAodGhwX3JlYWRfbnVtKFwia2h1Z2VwYWdlZC9mdWxsX3NjYW5zXCIpIFx1MDAzYyB0YXJnZXQpIHtcbitcdFx0XHRpZiAoZWxhcHNlZF9tcyBcdTAwM2U9IGRlYWRsaW5lX21zKVxuK1x0XHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHRcdHVzbGVlcCgxMCAqIDEwMDApO1xuK1x0XHRcdGVsYXBzZWRfbXMgKz0gMTA7XG4rXHRcdH1cbitcdH1cbitcdHJldHVybiB0cnVlO1xuK31cbitcbiBzdHJ1Y3QgdGhwX3NldHRpbmdzICp0aHBfY3VycmVudF9zZXR0aW5ncyh2b2lkKVxuIHtcbiBcdGlmICghc2V0dGluZ3NfaW5kZXgpIHtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxuaW5kZXggNzI2YzczYzQzYzA1Yi4uOGRlNDQ2YWZmZWVjZCAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcbkBAIC04Myw2ICs4Myw4IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCB0aHBfc2F2ZV9zZXR0aW5ncyh2b2lkKVxuIFx0aHVnZXBhZ2Vfc2F2ZV9zZXR0aW5ncygvKiB0aHAgPSAqLyB0cnVlLCAvKiBodWdldGxiID0gKi8gZmFsc2UpO1xuIH1cbiBcbitib29sIGtodWdlcGFnZWRfZnVsbF9wYXNzKHVuc2lnbmVkIGludCB0aW1lb3V0X3MpO1xuK1xuIHZvaWQgdGhwX3NldF9yZWFkX2FoZWFkX3BhdGgoY2hhciAqcGF0aCk7XG4gdW5zaWduZWQgbG9uZyB0aHBfc3VwcG9ydGVkX29yZGVycyh2b2lkKTtcbiB1bnNpZ25lZCBsb25nIHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xuaW5kZXggMTBlOGRlZGNiMDg3ZC4uYzVhM2MzOTIyNTgxOSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG5AQCAtMjYsOSArMjYsMTMgQEBcbiBcbiAjZGVmaW5lIEJBU0VfQUREUiAoKHZvaWQgKikoMVVMIFx1MDAzY1x1MDAzYyAzMCkpXG4gc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XG4rc3RhdGljIGludCBocGFnZV9wbWRfb3JkZXI7XG4gc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplO1xuIHN0YXRpYyBpbnQgaHBhZ2VfcG1kX25yO1xuIHN0YXRpYyBpbnQgYW5vbl9vcmRlcjtcbitzdGF0aWMgaW50IGFub25fdGFyZ2V0X29yZGVyO1xuK3N0YXRpYyBpbnQgcGFnZW1hcF9mZCA9IC0xO1xuK3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZCA9IC0xO1xuIFxuICNkZWZpbmUgUElEX1NNQVBTIFwiL3Byb2Mvc2VsZi9zbWFwc1wiXG4gI2RlZmluZSBURVNUX0ZJTEUgXCJjb2xsYXBzZV90ZXN0X2ZpbGVcIlxuQEAgLTE3Nyw2ICsxODEsMjEgQEAgc3RhdGljIHZvaWQgZ2V0X2ZpbmZvKGNvbnN0IGNoYXIgKmRpcilcbiBcdGtzZnRfZXhpdF9mYWlsX21zZyhcIiVzOiBDb3VsZCBub3QgcmVhZDogJXNcXG5cIiwgX19mdW5jX18sIHBhdGgpO1xuIH1cbiBcbitzdGF0aWMgYm9vbCBoYXNfc3dhcCh2b2lkKVxuK3tcbitcdEZJTEUgKmZwID0gZm9wZW4oXCIvcHJvYy9zd2Fwc1wiLCBcInJcIik7XG4rXHRjaGFyIGxpbmVbTUFYX0xJTkVfTEVOR1RIXTtcbitcdGJvb2wgcmV0ID0gZmFsc2U7XG4rXG4rXHRpZiAoIWZwKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHQvKiBGaXJzdCBsaW5lIGlzIHRoZSBoZWFkZXI7IGFueSBmb2xsb3dpbmcgbGluZSBpcyBhIHN3YXAgYXJlYS4gKi9cbitcdGlmIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSBcdTAwMjZcdTAwMjYgZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpXG4rXHRcdHJldCA9IHRydWU7XG4rXHRmY2xvc2UoZnApO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4gc3RhdGljIGJvb2wgY2hlY2tfc3dhcCh2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpXG4ge1xuIFx0Ym9vbCBzd2FwID0gZmFsc2U7XG5AQCAtNTU0LDggKzU3MywxNyBAQCBzdGF0aWMgdm9pZCBtYWR2aXNlX2NvbGxhcHNlKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgaW50IG5yX2hwYWdlcyxcbiBzdGF0aWMgYm9vbCB3YWl0X2Zvcl9zY2FuKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgaW50IG5yX2hwYWdlcyxcbiBcdFx0XHQgIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4ge1xuK1x0LypcbitcdCAqIFRoZSBidWRnZXQgaGFzIHRvIGNvdmVyIGtodWdlcGFnZWQgY29weWluZyBucl9ocGFnZXMgKlxuK1x0ICogaHBhZ2VfcG1kX3NpemUsIHBsdXMgdHdvIG9mIGl0cyBwYXNzZXMgb3ZlciB0aGUgbW0uIFRocmVlIHNlY29uZHNcbitcdCAqIGRvZXMgdGhhdCBhdCBhIDJNIFBNRCwgYnV0IHRoZSBzYW1lIHRlc3QgbW92ZXMgMkcgYXQgYSA1MTJNIFBNRFxuK1x0ICogKGFybTY0IHdpdGggNjRLIGJhc2UgcGFnZXMpIGFuZCAzcyBpcyB0aGVuIG1hcmdpbmFsOiBpdCBmYWlscyBvbiBhXG4rXHQgKiBjb2xsYXBzZSB0aGF0IGNvbXBsZXRlcyBjb3JyZWN0bHksIGp1c3Qgbm90IGluc2lkZSB0aGUgYnVkZ2V0LlxuK1x0ICogQWxsb3cgYSBmdXJ0aGVyIHNlY29uZCBwZXIgNjRNIHRvIGNvbGxhcHNlLlxuK1x0ICovXG4rXHRjb25zdCB1bnNpZ25lZCBsb25nIGJ5dGVzID0gKHVuc2lnbmVkIGxvbmcpbnJfaHBhZ2VzICogaHBhZ2VfcG1kX3NpemU7XG4rXHRpbnQgdGltZW91dCA9IDYgKyAyICogKGJ5dGVzIC8gKDY0VUwgXHUwMDNjXHUwMDNjIDIwKSk7XG4gXHRpbnQgZnVsbF9zY2Fucztcbi1cdGludCB0aW1lb3V0ID0gNjsgLyogMyBzZWNvbmRzICovXG4gXG4gXHQvKiBTYW5pdHkgY2hlY2sgKi9cbiBcdGlmICghb3BzLVx1MDAzZWNoZWNrX2h1Z2UocCwgMCkpXG5AQCAtNzM1LDYgKzc2MywxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9zd2FwaW5fc2luZ2xlX3B0ZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcFxuIFx0dm9pZCAqcDtcbiBcbiBcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbitcdGlmICghaGFzX3N3YXAoKSkge1xuK1x0XHRza2lwKFwiU2tpcCAobm8gc3dhcCBjb25maWd1cmVkKVwiKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4gXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuIFxuIFx0a3NmdF9wcmludF9tc2coXCJTd2Fwb3V0IG9uZSBwYWdlLi4uXCIpO1xuQEAgLTc2MSw2ICs3OTMsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9cbiBcdHZvaWQgKnA7XG4gXG4gXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4rXHRpZiAoIWhhc19zd2FwKCkpIHtcbitcdFx0c2tpcChcIlNraXAgKG5vIHN3YXAgY29uZmlndXJlZClcIik7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuIFx0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiBcbiBcdGtzZnRfcHJpbnRfbXNnKFwiU3dhcG91dCAlZCBvZiAlZCBwYWdlcy4uLlwiLCBtYXhfcHRlc19zd2FwICsgMSwgaHBhZ2VfcG1kX25yKTtcbkBAIC04NTMsNiArODg5LDIxIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX2NvbXBvdW5kX2V4dHJlbWUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzXG4gXHR2b2lkICpwO1xuIFx0aW50IGk7XG4gXG4rXHQvKlxuK1x0ICogQnVpbGRzIGEgUE1EJ3Mgd29ydGggb2YgZGlzdGluY3QgUFRFLW1hcHBlZCBjb21wb3VuZCBwYWdlcyBieSBjeWNsaW5nXG4rXHQgKiBocGFnZV9wbWRfbnIgZmF1bHQtdGltZSBUSFBzIHRocm91Z2ggbXJlbWFwLiBGYXVsdC10aW1lIFRIUCBhbGxvY2F0aW9uXG4rXHQgKiBpcyBiZXN0LWVmZm9ydCwgYW5kIHRoaXMgbmVlZHMgaHBhZ2VfcG1kX25yIFBNRC1vcmRlciBwYWdlcyBpbiBhIHJvdzpcbitcdCAqIGZpbmUgYXQgYSAyTSAoNEsgYmFzZSkgb3IgMzJNICgxNksgYmFzZSkgUE1ELCBidXQgYSA1MTJNIFBNRCAoYXJtNjQvNjRLKVxuK1x0ICogaXMgYW4gb3JkZXItMTMgYWxsb2NhdGlvbiB0aGUgYWxsb2NhdG9yIGNhbm5vdCByZWxpYWJseSBoYW5kIG91dCBldmVuXG4rXHQgKiBvbmNlLCBsZXQgYWxvbmUgODE5MiB0aW1lcy4gQ2FwIGF0IGEgMzJNIFBNRDsgTUFEVl9DT0xMQVBTRS1kcml2ZW4gY2FzZXNcbitcdCAqIHN0aWxsIGNvdmVyIFBNRC1vcmRlciBjb2xsYXBzZSBvbiB0aGUgbGFyZ2VyIGNvbmZpZ3MuXG4rXHQgKi9cbitcdGlmIChocGFnZV9wbWRfc2l6ZSBcdTAwM2UgKDMyVUwgXHUwMDNjXHUwMDNjIDIwKSkge1xuK1x0XHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCIlczogUE1EIHRvbyBsYXJnZSBmb3IgZmF1bHQtdGltZSBUSFAgY29uc3RydWN0aW9uXFxuXCIsXG4rXHRcdFx0XHQgICAgICBfX2Z1bmNfXyk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbiBcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbiBcdGtzZnRfcHJpbnRfbXNnKFwiQ29uc3RydWN0IFBURSBwYWdlIHRhYmxlIGZ1bGwgb2YgZGlmZmVyZW50IFBURS1tYXBwZWQgY29tcG91bmQgcGFnZXNcXG5cIik7XG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBocGFnZV9wbWRfbnI7IGkrKykge1xuQEAgLTEwNDMsNiArMTA5NCw2MSBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzXG4gXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4gfVxuIFxuKy8qXG4rICogQ29udGVudCBzdGF5cyBpc29sYXRlZCB3aGlsZSBhIGNvLXNoYXJlciB3cml0ZXMgY29uY3VycmVudGx5LiBBIHNoYXJlZFxuKyAqIHNvdXJjZSBpcyBjb3BpZWQgbGl2ZSAobm90IGZyb3plbiksIHJlbHlpbmcgb24gaXQgYmVpbmcgQ29XIC0gaW1tdXRhYmxlXG4rICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29weTsgYSBjby1zaGFyZXIncyB3cml0ZSBnb2VzIHRvIGEgQ29XIGNvcHkuIFRoZVxuKyAqIGNvbGxhcHNpbmcgY2hpbGQgbXVzdCBzZWUgdGhlIHByZS1mb3JrIGNvbnRlbnQsIHRoZSB3cml0aW5nIHBhcmVudCBvbmx5XG4rICogaXRzIG93biB3cml0ZXMuXG4rICovXG4rc3RhdGljIHZvaWQgY29sbGFwc2VfZm9ya19jb3dfcmFjZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9wcylcbit7XG4rXHRjb25zdCB1bnNpZ25lZCBsb25nIHNoYXJlZCA9IDY0ICogcGFnZV9zaXplO1xuK1x0Y29uc3QgaW50IHN0cmlkZSA9IHBhZ2Vfc2l6ZSAvIHNpemVvZihpbnQpO1xuK1x0aW50IHdzdGF0dXMsIGksIG4gPSBzaGFyZWQgLyBwYWdlX3NpemU7XG4rXHRpbnQgKmlwO1xuK1x0dm9pZCAqcDtcbitcbitcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbitcdGlwID0gcDtcbitcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBzaGFyZWQpO1x0XHQvKiBzaGFyZWQgcHJlZml4LCBwcmUtZm9yayBwYXR0ZXJuICovXG4rXG4rXHRrc2Z0X3ByaW50X21zZyhcIkZvcmssIGNvbGxhcHNlIGluIHRoZSBjaGlsZCB3aGlsZSB0aGUgcGFyZW50IHJld3JpdGVzLi4uXCIpO1xuK1x0aWYgKCFmb3JrKCkpIHtcbitcdFx0b3BzLVx1MDAzZWZhdWx0KHAsIHNoYXJlZCwgaHBhZ2VfcG1kX3NpemUpO1x0LyogcHJpdmF0ZSByZW1haW5kZXIgKi9cbitcdFx0Yy1cdTAwM2Vjb2xsYXBzZShcIkNvbGxhcHNlIGEgcmFuZ2Ugc2hhcmVkIHdpdGggYSB3cml0aW5nIGNvLXNoYXJlclwiLFxuK1x0XHRcdCAgICBwLCAxLCBvcHMsIHRydWUpO1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuOyBpKyspXG4rXHRcdFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgKyAweGRlYWQwMDAwKSB7XG4rXHRcdFx0XHRmYWlsKFwiRmFpbDogY2hpbGQgY29udGVudFwiKTtcbitcdFx0XHRcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0XHRcdFx0X2V4aXQoZXhpdF9zdGF0dXMpO1xuK1x0XHRcdH1cbitcdFx0c3VjY2VzcyhcIk9LXCIpO1xuK1x0XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdFx0X2V4aXQoZXhpdF9zdGF0dXMpO1xuK1x0fVxuK1xuK1x0LyogSGFtbWVyIHRoZSBwYXJlbnQncyBvd24gd3JpdGVzIG92ZXIgdGhlIHNoYXJlZCBwcmVmaXguICovXG4rXHRmb3IgKGludCBpdCA9IDA7IGl0IFx1MDAzYyAyMDAwMDA7IGl0KyspXG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkrKylcbitcdFx0XHRpcFtpICogc3RyaWRlXSA9IGkgKyAweGJlZWYwMDAwO1xuK1xuK1x0d2FpdChcdTAwMjZ3c3RhdHVzKTtcbitcdGV4aXRfc3RhdHVzID0gV0VYSVRTVEFUVVMod3N0YXR1cyk7XG4rXG4rXHRrc2Z0X3ByaW50X21zZyhcIkNoZWNrIHRoZSBwYXJlbnQgc2VlcyBvbmx5IGl0cyBvd24gd3JpdGVzLi4uXCIpO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbjsgaSsrKVxuK1x0XHRpZiAoaXBbaSAqIHN0cmlkZV0gIT0gaSArIDB4YmVlZjAwMDApXG4rXHRcdFx0YnJlYWs7XG4rXHRpZiAoaSA9PSBuKVxuK1x0XHRzdWNjZXNzKFwiT0tcIik7XG4rXHRlbHNlXG4rXHRcdGZhaWwoXCJGYWlsOiBwYXJlbnQgY29udGVudFwiKTtcbitcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwiJXNcXG5cIiwgX19mdW5jX18pO1xuK31cbitcbiBzdGF0aWMgdm9pZCBtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4gXHRcdFx0XHRcdCAgIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4ge1xuQEAgLTEwODgsNiArMTE5NCwyMjIgQEAgc3RhdGljIHZvaWQgbWFkdmlzZV9yZXRyYWN0ZWRfcGFnZV90YWJsZXMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4gXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4gfVxuIFxuKy8qXG4rICogT3JkZXItcGFyYW1ldGVyaXplZCBjb2xsYXBzZSBjYXNlcyAoLW8gXHUwMDNjb3JkZXJcdTAwM2UpOiBraHVnZXBhZ2VkIGNvbGxhcHNlc1xuKyAqIDRLLWZhdWx0ZWQgbWVtb3J5IGludG8gZm9saW9zIG9mIHRoZSBnaXZlbiBzdWItUE1EIG9yZGVyLiBEZXRlY3Rpb24gaXNcbisgKiBmb2xpby1iYXNlZCAodm1fdXRpbCksIG5vdCBzbWFwczogQW5vbkh1Z2VQYWdlcyBvbmx5IGFjY291bnRzIFBNRFxuKyAqIG1hcHBpbmdzLlxuKyAqXG4rICogVGhlIHJlZ2lvbiBpcyBmYXVsdGVkIGJlZm9yZSBNQURWX0hVR0VQQUdFIGFuZCB0aGUgdGFyZ2V0IG9yZGVyIGlzXG4rICogY29uZmlndXJlZCBcImluaGVyaXRcIiB1bmRlciBlbmFibGVkPW1hZHZpc2UsIHNvIGZhdWx0cyBhcmUgYWx3YXlzXG4rICogb3JkZXIgMCBhbmQgdGhlIGNvbGxhcHNlIHByb2R1Y3QgY2FuIG9ubHkgY29tZSBmcm9tIGtodWdlcGFnZWQuXG4rICovXG4rc3RhdGljIHNpemVfdCBhbm9uX29yZGVyX3NpemUodm9pZClcbit7XG4rXHRyZXR1cm4gcGFnZV9zaXplIFx1MDAzY1x1MDAzYyBhbm9uX3RhcmdldF9vcmRlcjtcbit9XG4rXG4rc3RhdGljIGJvb2wgcmFuZ2VfY29sbGFwc2VkKHZvaWQgKnAsIHNpemVfdCBsZW4pXG4re1xuK1x0cmV0dXJuIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgbGVuLCBhbm9uX3RhcmdldF9vcmRlcixcbitcdFx0XHRcdFx0ICAgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpO1xuK31cbitcbisvKiBObyBhbGlnbmVkIHdpbmRvdyBpbiBbcCwgcCArIGxlbikgaXMgYmFja2VkIGF0IHRoZSB0YXJnZXQgb3JkZXIuICovXG4rc3RhdGljIGJvb2wgcmFuZ2Vfbm90X2NvbGxhcHNlZCh2b2lkICpwLCBzaXplX3QgbGVuKVxuK3tcbitcdHNpemVfdCB3aW5kb3cgPSBhbm9uX29yZGVyX3NpemUoKTtcbitcdGNoYXIgKmFkZHIgPSBwO1xuK1xuK1x0Zm9yICg7IGxlbiBcdTAwM2U9IHdpbmRvdzsgYWRkciArPSB3aW5kb3csIGxlbiAtPSB3aW5kb3cpIHtcbitcdFx0aWYgKHJhbmdlX2NvbGxhcHNlZChhZGRyLCB3aW5kb3cpKVxuK1x0XHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcdHJldHVybiB0cnVlO1xuK31cbitcbitzdGF0aWMgYm9vbCBraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKHZvaWQpXG4re1xuK1x0LyogV2FpdCB1cCB0byAzMCBzZWNvbmRzIGZvciB0aGUgcGFzcyB0byBjb21wbGV0ZS4gKi9cbitcdHJldHVybiBraHVnZXBhZ2VkX2Z1bGxfcGFzcygzMCk7XG4rfVxuK1xuKy8qXG4rICogQ2FzZXMgd2hvc2UgZ2VvbWV0cnkgbmVlZHMgYSB3aW5kb3cgc3RyaWN0bHkgYmVsb3cgdGhlIFBNRCBza2lwIGF0XG4rICogLW8gXHUwMDNjUE1EIG9yZGVyXHUwMDNlOyB0aGUgcmVzdCBydW4gdGhlcmUgdW5jaGFuZ2VkLCBiYXNlbGluaW5nIHRoZSBsZWdhY3lcbisgKiBQTUQgZW5naW5lIHdpdGggdGhlIHNhbWUgdGVzdCB0ZXh0IHVzZWQgZm9yIHRoZSBtVEhQIG9yZGVycy5cbisgKi9cbitzdGF0aWMgYm9vbCBza2lwX2F0X3BtZF9vcmRlcihjb25zdCBjaGFyICpuYW1lKVxuK3tcbitcdGlmIChhbm9uX3RhcmdldF9vcmRlciBcdTAwM2MgaHBhZ2VfcG1kX29yZGVyKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCIlczogbmVlZHMgYSB3aW5kb3cgYmVsb3cgdGhlIFBNRFxcblwiLCBuYW1lKTtcbitcdHJldHVybiB0cnVlO1xuK31cbitcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9mdWxsKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuK3tcbitcdHZvaWQgKnA7XG4rXG4rXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4rXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0aWYgKCFyYW5nZV9ub3RfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiVW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcblwiKTtcbitcbitcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuK1x0a3NmdF9wcmludF9tc2coXCJDb2xsYXBzZSBmdWxseSBwb3B1bGF0ZWQgUFRFIHRhYmxlIHRvIHRhcmdldCBvcmRlci4uLlwiKTtcbitcdGlmICgha2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcygpKVxuK1x0XHRmYWlsKFwiVGltZW91dFwiKTtcbitcdGVsc2UgaWYgKHJhbmdlX2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXG4rXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbitcdGVsc2VcbitcdFx0ZmFpbChcIkZhaWxcIik7XG4rXG4rXHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX3NpbmdsZV93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4rXHRcdFx0XHRcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuK3tcbitcdHNpemVfdCB3aW5kb3cgPSBhbm9uX29yZGVyX3NpemUoKTtcbitcdHZvaWQgKnA7XG4rXG4rXHRpZiAoc2tpcF9hdF9wbWRfb3JkZXIoX19mdW5jX18pKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4rXHRvcHMtXHUwMDNlZmF1bHQocCwgd2luZG93LCAyICogd2luZG93KTtcbitcdGlmICghcmFuZ2Vfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIlVuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXG5cIik7XG4rXG4rXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbitcdGtzZnRfcHJpbnRfbXNnKFwiQ29sbGFwc2Ugb25lIGZ1bGx5IHBvcHVsYXRlZCB3aW5kb3cuLi5cIik7XG4rXHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcbitcdFx0ZmFpbChcIlRpbWVvdXRcIik7XG4rXHRlbHNlIGlmIChyYW5nZV9jb2xsYXBzZWQocCArIHdpbmRvdywgd2luZG93KSBcdTAwMjZcdTAwMjZcbitcdFx0IHJhbmdlX25vdF9jb2xsYXBzZWQocCwgd2luZG93KSBcdTAwMjZcdTAwMjZcbitcdFx0IHJhbmdlX25vdF9jb2xsYXBzZWQocCArIDIgKiB3aW5kb3csXG4rXHRcdFx0XHQgICAgIGhwYWdlX3BtZF9zaXplIC0gMiAqIHdpbmRvdykpXG4rXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbitcdGVsc2VcbitcdFx0ZmFpbChcIkZhaWxcIik7XG4rXG4rXHR2YWxpZGF0ZV9tZW1vcnkocCwgd2luZG93LCAyICogd2luZG93KTtcbitcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwiJXNcXG5cIiwgX19mdW5jX18pO1xuK31cbitcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbitcdFx0XHRcdFx0ICBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuK3tcbitcdHZvaWQgKnA7XG4rXG4rXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4rXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgcGFnZV9zaXplKTtcbitcdGlmICghcmFuZ2Vfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIlVuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXG5cIik7XG4rXG4rXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbitcdGtzZnRfcHJpbnRfbXNnKFwiQ29sbGFwc2Ugd2luZG93IHdpdGggc2luZ2xlIFBURSBlbnRyeSBwcmVzZW50Li4uXCIpO1xuK1x0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXG4rXHRcdGZhaWwoXCJUaW1lb3V0XCIpO1xuK1x0ZWxzZSBpZiAocmFuZ2VfY29sbGFwc2VkKHAsIGFub25fb3JkZXJfc2l6ZSgpKSlcbitcdFx0c3VjY2VzcyhcIk9LXCIpO1xuK1x0ZWxzZVxuK1x0XHRmYWlsKFwiRmFpbFwiKTtcbitcbitcdHZhbGlkYXRlX21lbW9yeShwLCAwLCBwYWdlX3NpemUpO1xuK1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4rXHRcdFx0XHRcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuK3tcbitcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbitcdHNpemVfdCB3aW5kb3cgPSBhbm9uX29yZGVyX3NpemUoKTtcbitcdHZvaWQgKnA7XG4rXG4rXHRpZiAoc2tpcF9hdF9wbWRfb3JkZXIoX19mdW5jX18pKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSAwO1xuK1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1xuK1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuK1x0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIDIgKiB3aW5kb3cgLSBwYWdlX3NpemUpO1xuK1x0aWYgKCFyYW5nZV9ub3RfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiVW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcblwiKTtcbitcbitcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuK1x0a3NmdF9wcmludF9tc2coXCJDb2xsYXBzZSBmdWxsIHdpbmRvdywgbm90IHRoZSBvbmUgbWlzc2luZyBhIHBhZ2UuLi5cIik7XG4rXHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcbitcdFx0ZmFpbChcIlRpbWVvdXRcIik7XG4rXHRlbHNlIGlmIChyYW5nZV9jb2xsYXBzZWQocCwgd2luZG93KSBcdTAwMjZcdTAwMjZcbitcdFx0IHJhbmdlX25vdF9jb2xsYXBzZWQocCArIHdpbmRvdywgd2luZG93KSlcbitcdFx0c3VjY2VzcyhcIk9LXCIpO1xuK1x0ZWxzZVxuK1x0XHRmYWlsKFwiRmFpbFwiKTtcbitcbitcdHZhbGlkYXRlX21lbW9yeShwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTtcbitcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuK1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwiJXNcXG5cIiwgX19mdW5jX18pO1xuK31cbitcbisvKiBTbWFsbGVzdCBvcmRlciBraHVnZXBhZ2VkIHdpbGwgY29uc2lkZXIgZm9yIG1USFAgY29sbGFwc2UuICovXG4rI2RlZmluZSBNSU5fTVRIUF9PUkRFUiAyXG4rXG4rLypcbisgKiBBIHJlZ2lvbiBiYWNrZWQgYnkgbGFyZ2UgZm9saW9zIG9mIGEgc21hbGxlciBvcmRlciBpcyBhIHZhbGlkIHNvdXJjZVxuKyAqIGZvciBjb2xsYXBzZSB0byB0aGUgdGFyZ2V0IG9yZGVyOlxuKyAqIF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKSBhY2NlcHRzIGFueSBzb3VyY2UgZm9saW8gb2YgYW4gb3JkZXJcbisgKiBzdHJpY3RseSBiZWxvdyB0aGUgY2FuZGlkYXRlJ3MuXG4rICovXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWl4ZWRfc291cmNlcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbitcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4re1xuK1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuK1x0aW50IHNvdXJjZV9vcmRlciA9IGFub25fb3JkZXIgPyBhbm9uX29yZGVyIDogTUlOX01USFBfT1JERVI7XG4rXHR2b2lkICpwO1xuK1xuK1x0LyogU291cmNlcyBtdXN0IGJlIGEgc3VwcG9ydGVkIG1USFAgb3JkZXIgc3RyaWN0bHkgYmVsb3cgdGhlIHRhcmdldC4gKi9cbitcdGlmIChzb3VyY2Vfb3JkZXIgXHUwMDNlPSBhbm9uX3RhcmdldF9vcmRlciB8fFxuK1x0ICAgICEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2Mgc291cmNlX29yZGVyKSkpIHtcbitcdFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFwiJXM6IG5vIHNvdXJjZSBvcmRlciBiZWxvdyB0YXJnZXRcXG5cIixcbitcdFx0XHRcdCAgICAgIF9fZnVuY19fKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuK1x0LyogRmF1bHQgdGhlIHdob2xlIHJlZ2lvbiBhcyBvcmRlci1Ac291cmNlX29yZGVyIGZvbGlvcy4gKi9cbitcdHNldHRpbmdzLmh1Z2VwYWdlc1tzb3VyY2Vfb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTO1xuK1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuK1x0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcbitcdGlmICghaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBocGFnZV9wbWRfc2l6ZSwgc291cmNlX29yZGVyLFxuK1x0XHRcdFx0XHQgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJSZWdpb24gbm90IGJhY2tlZCBieSBvcmRlci0lZCBmb2xpb3MgYWZ0ZXIgZmF1bHRcXG5cIixcbitcdFx0XHRcdCAgIHNvdXJjZV9vcmRlcik7XG4rXG4rXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbitcdGtzZnRfcHJpbnRfbXNnKFwiQ29sbGFwc2UgcmVnaW9uIGJhY2tlZCBieSBvcmRlci0lZCBzb3VyY2VzLi4uXCIsXG4rXHRcdCAgICAgICBzb3VyY2Vfb3JkZXIpO1xuK1x0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXG4rXHRcdGZhaWwoXCJUaW1lb3V0XCIpO1xuK1x0ZWxzZSBpZiAocmFuZ2VfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbitcdFx0c3VjY2VzcyhcIk9LXCIpO1xuK1x0ZWxzZVxuK1x0XHRmYWlsKFwiRmFpbFwiKTtcbitcbitcdHZhbGlkYXRlX21lbW9yeShwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbit9XG4rXG4gc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcbiB7XG4gXHRmcHJpbnRmKHN0ZGVyciwgXCJcXG5Vc2FnZTogLi9raHVnZXBhZ2VkIFtPUFRJT05TXSBcdTAwM2N0ZXN0IHR5cGVcdTAwM2UgW2Rpcl1cXG5cXG5cIik7XG5AQCAtMTEwMyw2ICsxNDI1LDExIEBAIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXG4gXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0LWg6IFRoaXMgaGVscCBtZXNzYWdlLlxcblwiKTtcbiBcdGZwcmludGYoc3RkZXJyLFx0XCJcXHRcXHQtczogbVRIUCBzaXplLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXG5cIik7XG4gXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0ICAgIERlZmF1bHRzIHRvIDAuIFVzZSB0aGlzIHNpemUgZm9yIGFub24gb3Igc2htZW0gYWxsb2NhdGlvbnMuXFxuXCIpO1xuK1x0ZnByaW50ZihzdGRlcnIsXHRcIlxcdFxcdC1vOiBjb2xsYXBzZSB0YXJnZXQgb3JkZXIgZm9yIGtodWdlcGFnZWQ6YW5vbi5cXG5cIik7XG4rXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0ICAgIFJ1bnMgdGhlIG9yZGVyLXBhcmFtZXRlcml6ZWQgY29sbGFwc2UgY2FzZXMgaW5zdGVhZFxcblwiKTtcbitcdGZwcmludGYoc3RkZXJyLFx0XCJcXHRcXHQgICAgb2YgdGhlIFBNRCBjYXNlcy5cXG5cIik7XG4rXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0ICAgIFdpdGggLXMsIC1zIG5hbWVzIHRoZSBtVEhQIHNvdXJjZSBvcmRlciBmb3IgdGhlXFxuXCIpO1xuK1x0ZnByaW50ZihzdGRlcnIsXHRcIlxcdFxcdCAgICBtaXhlZC1zb3VyY2UgY2FzZSAoc291cmNlIG9yZGVyIGJlbG93IHRoZSB0YXJnZXQpLlxcblwiKTtcbiBcdGV4aXQoMSk7XG4gfVxuIFxuQEAgLTExMTIsMTcgKzE0MzksMzEgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGNoYXIgKmJ1ZjtcbiBcdGNvbnN0IGNoYXIgKnRva2VuO1xuIFxuLVx0d2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgXCJzOmhcIikpICE9IC0xKSB7XG4rXHR3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCBcInM6bzpoXCIpKSAhPSAtMSkge1xuIFx0XHRzd2l0Y2ggKG9wdCkge1xuIFx0XHRjYXNlICdzJzpcbiBcdFx0XHRhbm9uX29yZGVyID0gYXRvaShvcHRhcmcpO1xuIFx0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICdvJzpcbitcdFx0XHRhbm9uX3RhcmdldF9vcmRlciA9IGF0b2kob3B0YXJnKTtcbitcdFx0XHRicmVhaztcbiBcdFx0Y2FzZSAnaCc6XG4gXHRcdGRlZmF1bHQ6XG4gXHRcdFx0dXNhZ2UoKTtcbiBcdFx0fVxuIFx0fVxuIFxuK1x0LypcbitcdCAqIC1zIGFuZCAtbyBjb21wb3NlOiAtcyB0aGVuIG5hbWVzIHRoZSBtVEhQIHNvdXJjZSBvcmRlciBmb3IgdGhlXG4rXHQgKiBtaXhlZC1zb3VyY2UgY2FzZSwgd2hpY2ggbmVlZHMgYSBzb3VyY2Ugc3RyaWN0bHkgYmVsb3cgdGhlXG4rXHQgKiB0YXJnZXQgKGFuZCBhdCBvciBhYm92ZSB0aGUgc21hbGxlc3QgbVRIUCBvcmRlcikuIEFsb25lLCAtcyBpc1xuK1x0ICogdGhlIHNvdXJjZSBvcmRlciBmb3IgdGhlIGRlZmF1bHQgUE1EIHN1aXRlOyBhbG9uZSwgLW8gaXMgdGhlXG4rXHQgKiBjb2xsYXBzZSB0YXJnZXQgZm9yIHRoZSBvcmRlci1wYXJhbWV0ZXJpemVkIHN1aXRlLlxuK1x0ICovXG4rXHRpZiAoYW5vbl90YXJnZXRfb3JkZXIgXHUwMDI2XHUwMDI2IGFub25fb3JkZXIgXHUwMDI2XHUwMDI2XG4rXHQgICAgKGFub25fb3JkZXIgXHUwMDNjIE1JTl9NVEhQX09SREVSIHx8IGFub25fb3JkZXIgXHUwMDNlPSBhbm9uX3RhcmdldF9vcmRlcikpXG4rXHRcdHVzYWdlKCk7XG4rXG4gXHRhcmd2ICs9IG9wdGluZDtcbiBcdGFyZ2MgLT0gb3B0aW5kO1xuIFxuQEAgLTEyMDcsNyArMTU0OCw2IEBAIHN0YXRpYyBpbnQgbnJfdGVzdF9jYXNlcztcbiBcbiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4ge1xuLVx0aW50IGhwYWdlX3BtZF9vcmRlcjtcbiBcdHN0cnVjdCB0aHBfc2V0dGluZ3MgZGVmYXVsdF9zZXR0aW5ncyA9IHtcbiBcdFx0LnRocF9lbmFibGVkID0gVEhQX01BRFZJU0UsXG4gXHRcdC50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVMsXG5AQCAtMTI0NCwxOCArMTU4NCw5NCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRocGFnZV9wbWRfbnIgPSBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTtcbiBcdGhwYWdlX3BtZF9vcmRlciA9IF9fYnVpbHRpbl9jdHooaHBhZ2VfcG1kX25yKTtcbiBcbitcdC8qXG4rXHQgKiBUaGUgcGFnZSBjYWNoZSBjYXBzIGZvbGlvIG9yZGVyIGF0IE1BWF9QQUdFQ0FDSEVfT1JERVIsIHdoaWNoXG4rXHQgKiB4YXNfc3BsaXRfYWxsb2MoKSBwdXRzIGJlbG93IHRoZSBQTUQgb3JkZXIgb24gYXJtNjQgd2l0aCA2NEsgcGFnZXMuXG4rXHQgKiBBIFBNRC1zaXplZCBwYWdlIGNhY2hlIGZvbGlvIGlzIHRoZW4gaW1wb3NzaWJsZSwgc28gdGhlIGtlcm5lbFxuK1x0ICogcmVmdXNlcyB0aGVzZSBjb2xsYXBzZXMgYnkgZGVzaWduIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIHRlc3QuXG4rXHQgKi9cbitcdGlmICghKHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGhwYWdlX3BtZF9vcmRlcikpKSB7XG4rXHRcdGlmIChzaG1lbV9vcHMpIHtcbitcdFx0XHRrc2Z0X3ByaW50X21zZyhcIm5vIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvOiBza2lwcGluZyBzaG1lbVxcblwiKTtcbitcdFx0XHRzaG1lbV9vcHMgPSBOVUxMO1xuK1x0XHR9XG4rXHRcdGlmIChmaW5mby50eXBlID09IFZNQV9TSE1FTSBcdTAwMjZcdTAwMjYgcmVhZF9vbmx5X2ZpbGVfb3BzKSB7XG4rXHRcdFx0a3NmdF9wcmludF9tc2coXCJubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgdG1wZnMgZmlsZVxcblwiKTtcbitcdFx0XHRyZWFkX29ubHlfZmlsZV9vcHMgPSBOVUxMO1xuK1x0XHRcdHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9IE5VTEw7XG4rXHRcdFx0cmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9IE5VTEw7XG4rXHRcdH1cbitcdFx0aWYgKCFhbm9uX29wcyBcdTAwMjZcdTAwMjYgIXNobWVtX29wcyBcdTAwMjZcdTAwMjYgIXJlYWRfb25seV9maWxlX29wcylcbitcdFx0XHRrc2Z0X2V4aXRfc2tpcChcIk5vdGhpbmcgbGVmdCB0byBjb2xsYXBzZSBpbnRvXFxuXCIpO1xuK1x0fVxuK1xuK1x0aWYgKGFub25fdGFyZ2V0X29yZGVyIFx1MDAyNlx1MDAyNlxuK1x0ICAgICEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgYW5vbl90YXJnZXRfb3JkZXIpKSlcbitcdFx0a3NmdF9leGl0X3NraXAoXCJPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcXG5cIixcbitcdFx0XHQgICAgICAgYW5vbl90YXJnZXRfb3JkZXIpO1xuK1x0aWYgKGFub25fdGFyZ2V0X29yZGVyIFx1MDAzZSBocGFnZV9wbWRfb3JkZXIpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIi1vIHRha2VzIGF0IG1vc3QgdGhlIFBNRCBvcmRlclxcblwiKTtcbitcbiBcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gaHBhZ2VfcG1kX25yIC0gMTtcbiBcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zd2FwID0gaHBhZ2VfcG1kX25yIC8gODtcbiBcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zaGFyZWQgPSBocGFnZV9wbWRfbnIgLyAyO1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSBocGFnZV9wbWRfbnIgKiA4O1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5odWdlcGFnZXNbaHBhZ2VfcG1kX29yZGVyXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XG4tXHRkZWZhdWx0X3NldHRpbmdzLmh1Z2VwYWdlc1thbm9uX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcbiBcdGRlZmF1bHRfc2V0dGluZ3Muc2htZW1faHVnZXBhZ2VzW2hwYWdlX3BtZF9vcmRlcl0uZW5hYmxlZCA9IFNITUVNX0lOSEVSSVQ7XG4tXHRkZWZhdWx0X3NldHRpbmdzLnNobWVtX2h1Z2VwYWdlc1thbm9uX29yZGVyXS5lbmFibGVkID0gU0hNRU1fQUxXQVlTO1xuK1x0LypcbitcdCAqIFVuZGVyIC1vIHRoZSBvcmRlci1wYXJhbWV0ZXJpemVkIGNhc2VzIHdhbnQgb3JkZXItMCBzb3VyY2VzIGJ5XG4rXHQgKiBkZWZhdWx0OyB0aGUgbWl4ZWQtc291cmNlIGNhc2UgZW5hYmxlcyBpdHMgb3duIChwb3NzaWJseSAtc1xuK1x0ICogc2VsZWN0ZWQpIHNvdXJjZSBvcmRlciBsb2NhbGx5LiBFbmFibGluZyBpdCBnbG9iYWxseSBoZXJlIHdvdWxkXG4rXHQgKiBtYWtlIGV2ZXJ5IGNhc2UgZmF1bHQgdGhhdCBvcmRlci5cbitcdCAqL1xuK1x0aWYgKCFhbm9uX3RhcmdldF9vcmRlcikge1xuK1x0XHRkZWZhdWx0X3NldHRpbmdzLmh1Z2VwYWdlc1thbm9uX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcbitcdFx0ZGVmYXVsdF9zZXR0aW5ncy5zaG1lbV9odWdlcGFnZXNbYW5vbl9vcmRlcl0uZW5hYmxlZCA9IFNITUVNX0FMV0FZUztcbitcdH1cbitcbitcdGlmIChhbm9uX3RhcmdldF9vcmRlcikge1xuK1x0XHQvKlxuK1x0XHQgKiBPbmx5IHRoZSB0YXJnZXQgb3JkZXIgbWF5IHByb2R1Y2UgbGFyZ2UgZm9saW9zLCBhbmQgb25seVxuK1x0XHQgKiBmcm9tIGtodWdlcGFnZWQ6IFwiaW5oZXJpdFwiIHVuZGVyIGVuYWJsZWQ9bWFkdmlzZSBrZWVwc1xuK1x0XHQgKiBwcmUtTUFEVl9IVUdFUEFHRSBmYXVsdHMgYXQgb3JkZXIgMC5cbitcdFx0ICovXG4rXHRcdGRlZmF1bHRfc2V0dGluZ3MuaHVnZXBhZ2VzW2hwYWdlX3BtZF9vcmRlcl0uZW5hYmxlZCA9IFRIUF9ORVZFUjtcbitcdFx0ZGVmYXVsdF9zZXR0aW5ncy5odWdlcGFnZXNbYW5vbl90YXJnZXRfb3JkZXJdLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcbitcdFx0LypcbitcdFx0ICogT3JkZXItcGFyYW1ldGVyaXplZCBjYXNlcyBhcmUgZHJpdmVuIHN0cmljdGx5IGJ5IHRoZVxuK1x0XHQgKiBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIGJhcnJpZXIsIHdoaWNoIHdha2VzIHRoZSBkYWVtb25cbitcdFx0ICogaXRzZWxmLiBBIGxvbmcgc2Nhbl9zbGVlcCBrZWVwcyBraHVnZXBhZ2VkIGZyb21cbitcdFx0ICogZnJlZS1ydW5uaW5nIGJldHdlZW4gYmFycmllciBzdGVwcywgYW5kIGEgcGFnZXNfdG9fc2NhblxuK1x0XHQgKiBjb3ZlcmluZyBldmVyeXRoaW5nIG1ha2VzIG9uZSB3YWtlIGNvbXBsZXRlIG9uZSBmdWxsXG4rXHRcdCAqIHBhc3MgKHRoZSBiYXJyaWVyJ3MgY29udHJhY3QpLCBzbyBhIHJ1biBwZXJmb3JtcyBhXG4rXHRcdCAqIGRldGVybWluaXN0aWMgbnVtYmVyIG9mIHBhc3NlcyDigJQgd2hhdCB0aGUgc3RhZ2UgQS9CXG4rXHRcdCAqIHRyYWNlIGNvbXBhcmlzb25zIHJlbHkgb24uXG4rXHRcdCAqL1xuK1x0XHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQuc2Nhbl9zbGVlcF9taWxsaXNlY3MgPSA2MDAwMDtcbitcdFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSAxVUwgXHUwMDNjXHUwMDNjIDI0O1xuK1xuK1x0XHRwYWdlbWFwX2ZkID0gb3BlbihcIi9wcm9jL3NlbGYvcGFnZW1hcFwiLCBPX1JET05MWSk7XG4rXHRcdGlmIChwYWdlbWFwX2ZkIFx1MDAzYyAwKVxuK1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm9wZW4oXFxcIi9wcm9jL3NlbGYvcGFnZW1hcFxcXCIpXCIpO1xuK1x0XHRrcGFnZWZsYWdzX2ZkID0gb3BlbihcIi9wcm9jL2twYWdlZmxhZ3NcIiwgT19SRE9OTFkpO1xuK1x0XHRpZiAoa3BhZ2VmbGFnc19mZCBcdTAwM2MgMClcbitcdFx0XHRrc2Z0X2V4aXRfc2tpcChcIm9wZW4oXFxcIi9wcm9jL2twYWdlZmxhZ3NcXFwiKSByZXF1aXJlcyByb290XFxuXCIpO1xuK1x0fVxuIFxuIFx0c2F2ZV9zZXR0aW5ncygpO1xuIFx0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2ZGVmYXVsdF9zZXR0aW5ncyk7XG4gXG4rXHRpZiAoYW5vbl90YXJnZXRfb3JkZXIpIHtcbitcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdywga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfbWl4ZWRfc291cmNlcywga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXG4rXHRcdGtzZnRfc2V0X3BsYW4obnJfdGVzdF9jYXNlcyk7XG4rXHRcdGdvdG8gcnVuO1xuK1x0fVxuK1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG5AQCAtMTMyNCw2ICsxNzQwLDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0VEVTVChjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQsIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFxuK1x0VEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFRFU1QoY29sbGFwc2VfZm9ya19jb3dfcmFjZSwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4rXG4gXHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpO1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcbkBAIC0xMzM2LDYgKzE3NTUsNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRrc2Z0X3NldF9wbGFuKG5yX3Rlc3RfY2FzZXMgKyAxKTtcbiBcbiBcdGFsbG9jX2F0X2ZhdWx0KCk7XG4rcnVuOlxuIFx0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIG5yX3Rlc3RfY2FzZXM7IGkrKykge1xuIFx0XHRzdHJ1Y3QgdGVzdF9jYXNlICp0ID0gXHUwMDI2dGVzdF9jYXNlc1tpXTtcbiBcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMmFhNDVjOWU4YTc3ZlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmNcbkBAIC0wLDAgKzEsNDgzIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIGtodWdlcGFnZWQgcmFjZSBoYXJuZXNzLlxuKyAqXG4rICogUnVucyBjb2xsYXBzZSBhZ2FpbnN0IGNvbmN1cnJlbnQgZmF1bHRzLCB0cmFuc2llbnQgR1VQIHBpbnNcbisgKiAoZ3VwX3Rlc3QpLCBmb3JrLCBtcmVtYXAgYW5kIE1BRFZfRE9OVE5FRUQgb3ZlciB0aGUgc2FtZSByYW5nZXMsIGluXG4rICogb25lIG9mIHRocmVlIGRyaXZlciBtb2RlczpcbisgKlxuKyAqICAgc3RlcHBlZFx0a2h1Z2VwYWdlZCwgZHJpdmVuIHN5bmNocm9ub3VzbHkgb25lIGZ1bGwgcGFzcyBhdCBhIHRpbWVcbisgKlx0XHR0aHJvdWdoIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkg4oCUIHRoZSBwcmltYXJ5IGRyaXZlcjogdGhlXG4rICpcdFx0ZnVsbCBzY2FuK2NvbGxhcHNlIHBhdGggd2l0aCBhIGRldGVybWluaXN0aWMgZXh0ZW50IHBlclxuKyAqXHRcdHN0ZXA7XG4rICogICBmcmVlXHRmcmVlLXJ1bm5pbmcga2h1Z2VwYWdlZCAoc2Nhbl9zbGVlcF9taWxsaXNlY3M9MCkg4oCUIHRoZVxuKyAqXHRcdHNvYWs7XG4rICogICBtYWR2aXNlXHRNQURWX0NPTExBUFNFIGluIGEgbG9vcCDigJQgdGhlIGxlZ2FjeS1QTUQgcmVncmVzc2lvblxuKyAqXHRcdGF4aXMuXG4rICpcbisgKiBBbGwgYW5vbiBUSFAgb3JkZXJzIGFyZSBlbmFibGVkIChpbmhlcml0KS4gbWF4X3B0ZXNfbm9uZSBpcyAwIGJ5XG4rICogZGVmYXVsdCDigJQgcmFjaW5nIE1BRFZfRE9OVE5FRUQgdGhlbiBzdGVlcnMgc2VsZWN0aW9uIGFjcm9zcyBvcmRlcnMg4oCUXG4rICogb3IgdGhlIHBlcm1pc3NpdmUgbGltaXQgd2l0aCAteiwgd2hpY2ggZmxvb2RzIHRoZSBiYXRjaCBlbmdpbmUgd2l0aFxuKyAqIGhvbGUgYW5kIHplcm9wYWdlIHNsb3RzIHNvIHRoZSBwb3B1bGF0aW9uIHBhdGhzIChwYXJrLXRpbWUgemVyb3BhZ2VcbisgKiBjbGVhciwgemVyby1maWxsZWQgY29weSwgaW5zdGFsbC10aW1lIHB0ZV9ub25lKCkgdmVyaWZ5IGFuZCBhYm9ydClcbisgKiByYWNlIHRoZSBmYXVsdGVycyBkaXJlY3RseS5cbisgKlxuKyAqIC1wIGFkZHMgbWVtb3J5IHByZXNzdXJlIHRvIGFueSBvZiB0aGUgYWJvdmU6IE1BRFZfUEFHRU9VVCBjeWNsaW5nXG4rICogb24gYSBkZWRpY2F0ZWQgbmVpZ2hib3IgcmVnaW9uIChzd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybjsgc2tpcHBlZFxuKyAqIHdpdGggYSBub3RlIHdoZW4gdGhlIGhvc3QgaGFzIG5vIHN3YXApIGFuZCBhIGNvbXBhY3RfbWVtb3J5IHRyaWdnZXJcbisgKiBsb29wIChjb21wYWN0aW9uIG1pZ3JhdGVzIHNvdXJjZSBmb2xpb3MsIHJhY2luZyBjb2xsYXBzZSdzIGZyZWV6ZVxuKyAqIHdpdGggcmVmY291bnQgZWxldmF0aW9uIGFuZCBtaWdyYXRpb24gZW50cmllcyBvZiBpdHMgb3duKS5cbisgKlxuKyAqIENvcnJlY3RuZXNzIHNpZ25hbHM6IGV2ZXJ5IHJhY2luZyBwYWdlIG11c3QgcmVhZCBhcyBpdHMgcGF0dGVybiBvclxuKyAqIHplcm8gKE1BRFZfRE9OVE5FRUQpLCBuZXZlciBhbnl0aGluZyBlbHNlIOKAlCBjaGVja2VkIGNvbnRpbnVvdXNseSBieVxuKyAqIHRoZSBmYXVsdGVycyBhbmQgdGhlIGZvcmsgY2hpbGRyZW4gYW5kIG9uY2UgYXQgdGhlIGVuZCDigJQgcGx1c1xuKyAqIHdoYXRldmVyIERFQlVHX1ZNIC8gcGFnZV90YWJsZV9jaGVjayAvIEtBU0FOIC8gbG9ja2RlcCByZXBvcnQgaW5cbisgKiBkbWVzZywgd2hpY2ggdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBpbnNwZWN0LlxuKyAqL1xuKyNkZWZpbmUgX0dOVV9TT1VSQ0VcbisjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL2lvY3RsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwia3NlbGZ0ZXN0LmhcIlxuKyNpbmNsdWRlIFwidm1fdXRpbC5oXCJcbisjaW5jbHVkZSBcImh1Z2VwYWdlX3NldHRpbmdzLmhcIlxuKyNpbmNsdWRlIFwiLi4vLi4vLi4vLi4vbW0vZ3VwX3Rlc3QuaFwiXG4rXG4rI2RlZmluZSBCQVNFX0FERFJcdCgodm9pZCAqKSgxVUwgXHUwMDNjXHUwMDNjIDMwKSlcbisvKlxuKyAqIFNoYXJlZCBwbGF5Z3JvdW5kIGZvciBmYXVsdHMvcGlucy9mb3JrL2RvbnRuZWVkOiBzZXZlcmFsIFBNRC1zaXplZFxuKyAqIGFyZWFzIHRoZSByYWNpbmcgdGhyZWFkcyBzcHJlYWQgYWNyb3NzLCBwbHVzIG9uZSBhcmVhIG93bmVkIGJ5IHRoZVxuKyAqIG1yZW1hcCB0aHJlYWQuIE1vcmUgYXJlYXMgbWVhbnMgbW9yZSBpbmRlcGVuZGVudCByZWdpb25zIGNvbGxhcHNpbmdcbisgKiBhdCBvbmNlOyB0aGUgZGVmYXVsdCBzdWl0cyBhIG5vcm1hbCBtYWNoaW5lLiBPbiBhIG1lbW9yeS1jb25zdHJhaW5lZFxuKyAqIGhvc3QgLS0gb3IgdW5kZXIgZW11bGF0aW9uLCB3aGVyZSBhIDUxMk0gUE1EIChhcm02NC82NEspIG1ha2VzIHRoZVxuKyAqIGRlZmF1bHQgcGxheWdyb3VuZCBtdWx0aS1naWdhYnl0ZSAtLSBwYXNzIC1hIHRvIHNocmluayBpdC5cbisgKi9cbisjZGVmaW5lIERFRkFVTFRfU0hBUkVEX0FSRUFTXHQzXG4rc3RhdGljIGludCBucl9zaGFyZWRfYXJlYXM7XG4rc3RhdGljIGludCBucl9hcmVhcztcbitcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7XG4rc3RhdGljIGNoYXIgKnJlZ2lvbjtcdFx0LyogTlJfQVJFQVMgKiBocGFnZV9wbWRfc2l6ZSAqL1xuK3N0YXRpYyBjaGFyICptcmVtYXBfYXJlYTtcdC8qIHJlZ2lvbiArIE5SX1NIQVJFRF9BUkVBUyBhcmVhcyAqL1xuK3N0YXRpYyBjaGFyICptcmVtYXBfc2NyYXRjaDtcdC8qIHdlbGwgYWJvdmUgdGhlIHJlZ2lvbiAqL1xuK3N0YXRpYyBjaGFyICpwYWdlb3V0X2FyZWE7XHQvKiAtcDogZGVkaWNhdGVkIHByZXNzdXJlIHJlZ2lvbiAqL1xuK3N0YXRpYyBzaXplX3QgcGFnZW91dF9zaXplO1xuK3N0YXRpYyBpbnQgZ3VwX2ZkID0gLTE7XG4rc3RhdGljIHZvbGF0aWxlIGludCBzdG9wO1xuK3N0YXRpYyB2b2xhdGlsZSBpbnQgY29ycnVwdGVkO1xuK1xuK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGF0dGVybih1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxuK3tcbitcdHVuc2lnbmVkIGludCB2YWwgPSAodW5zaWduZWQgaW50KXBhZ2VfaWR4ICogMjY1NDQzNTc2MVU7XG4rXG4rXHRyZXR1cm4gdmFsID8gdmFsIDogMTtcdC8qIG5ldmVyIGNvbGxpZGVzIHdpdGggdGhlIHplcm8tZmlsbCAqL1xuK31cbitcbitzdGF0aWMgdm9pZCBjaGVja19wYWdlKHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgpXG4re1xuK1x0dW5zaWduZWQgaW50IHZhbCA9ICoodW5zaWduZWQgaW50ICopKHJlZ2lvbiArIHBhZ2VfaWR4ICogcGFnZV9zaXplKTtcbitcbitcdGlmICh2YWwgXHUwMDI2XHUwMDI2IHZhbCAhPSBwYXR0ZXJuKHBhZ2VfaWR4KSkge1xuK1x0XHRjb3JydXB0ZWQgPSAxO1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIkNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXG5cIixcbitcdFx0XHQgICAgICAgcGFnZV9pZHgsIHZhbCwgcGF0dGVybihwYWdlX2lkeCkpO1xuK1x0fVxuK31cbitcbitzdGF0aWMgdW5zaWduZWQgbG9uZyByYW5kX3BhZ2UodW5zaWduZWQgaW50ICpzZWVkKVxuK3tcbitcdHJldHVybiAodW5zaWduZWQgbG9uZylyYW5kX3Ioc2VlZCkgJVxuK1x0ICAgICAgIChucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkICpmYXVsdGVyX2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcbitcdHdoaWxlICghc3RvcCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFx1MDAyNnNlZWQpO1xuK1xuK1x0XHRpZiAocmFuZF9yKFx1MDAyNnNlZWQpIFx1MDAyNiAxKVxuK1x0XHRcdCoodW5zaWduZWQgaW50ICopKHJlZ2lvbiArIHBhZ2VfaWR4ICogcGFnZV9zaXplKSA9XG4rXHRcdFx0XHRwYXR0ZXJuKHBhZ2VfaWR4KTtcbitcdFx0ZWxzZVxuK1x0XHRcdGNoZWNrX3BhZ2UocGFnZV9pZHgpO1xuK1x0fVxuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuK3N0YXRpYyB2b2lkICpkb250bmVlZF9mbih2b2lkICphcmcpXG4re1xuK1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcdTAwMjZzZWVkKTtcbitcdFx0dW5zaWduZWQgbG9uZyBuciA9IDFVTCBcdTAwM2NcdTAwM2MgKHJhbmRfcihcdTAwMjZzZWVkKSAlIDYpO1x0LyogMS4uMzIgcGFnZXMgKi9cbitcbitcdFx0LypcbitcdFx0ICogT25jZSBpbiBhIHdoaWxlIHphcCBhIHdob2xlIFBNRC1hbGlnbmVkIGFyZWE6IG9ubHkgYVxuK1x0XHQgKiB6YXAgc3Bhbm5pbmcgdGhlIGZ1bGwgdGFibGUgdHJpZ2dlcnMgdGhlIGVtcHR5LXRhYmxlXG4rXHRcdCAqIHJlY2xhaW0gKENPTkZJR19QVF9SRUNMQUlNKSwgd2hpY2ggY2FuIGZyZWUgYSB0YWJsZVxuK1x0XHQgKiBvdXQgZnJvbSB1bmRlciBhIHBhcmtlZCBjb2xsYXBzZSDigJQgc3ViLXRhYmxlIHphcHNcbitcdFx0ICogbmV2ZXIgcmVhY2ggdGhhdCBwYXRoLlxuK1x0XHQgKi9cbitcdFx0aWYgKCEocmFuZF9yKFx1MDAyNnNlZWQpICUgNjQpKSB7XG4rXHRcdFx0dW5zaWduZWQgbG9uZyBhcmVhID0gcGFnZV9pZHggL1xuK1x0XHRcdFx0XHQoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpO1xuK1xuK1x0XHRcdG1hZHZpc2UocmVnaW9uICsgYXJlYSAqIGhwYWdlX3BtZF9zaXplLFxuK1x0XHRcdFx0aHBhZ2VfcG1kX3NpemUsIE1BRFZfRE9OVE5FRUQpO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdG1hZHZpc2UocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUsXG4rXHRcdFx0XHRuciAqIHBhZ2Vfc2l6ZSwgTUFEVl9ET05UTkVFRCk7XG4rXHRcdH1cbitcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDUwMCk7XG4rXHR9XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIHZvaWQgKnBpbm5lcl9mbih2b2lkICphcmcpXG4re1xuK1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0c3RydWN0IGd1cF90ZXN0IGd1cCA9IHt9O1xuK1x0XHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFx1MDAyNnNlZWQpO1xuK1xuK1x0XHRndXAuYWRkciA9ICh1bnNpZ25lZCBsb25nKShyZWdpb24gKyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSk7XG4rXHRcdGd1cC5zaXplID0gMTYgKiBwYWdlX3NpemU7XG4rXHRcdGd1cC5ucl9wYWdlc19wZXJfY2FsbCA9IDE2O1xuK1x0XHRndXAuZ3VwX2ZsYWdzID0gMTtcdC8qIEZPTExfV1JJVEUgKi9cbitcdFx0LyogUmFjaW5nIE1BRFZfRE9OVE5FRUQgbWFrZXMgdHJhbnNpZW50IGZhaWx1cmVzIGV4cGVjdGVkLiAqL1xuK1x0XHRpb2N0bChndXBfZmQsIFBJTl9GQVNUX0JFTkNITUFSSywgXHUwMDI2Z3VwKTtcbitcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDIwMCk7XG4rXHR9XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIHZvaWQgKmZvcmtlcl9mbih2b2lkICphcmcpXG4re1xuK1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0cGlkX3QgcGlkID0gZm9yaygpO1xuK1xuK1x0XHRpZiAocGlkID09IDApIHtcbitcdFx0XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgMTY7IGkrKylcbitcdFx0XHRcdGNoZWNrX3BhZ2UocmFuZF9wYWdlKFx1MDAyNnNlZWQpKTtcbitcdFx0XHRfZXhpdChjb3JydXB0ZWQpO1xuK1x0XHR9XG4rXHRcdGlmIChwaWQgXHUwMDNlIDApIHtcbitcdFx0XHRpbnQgd3N0YXR1cztcbitcbitcdFx0XHR3YWl0cGlkKHBpZCwgXHUwMDI2d3N0YXR1cywgMCk7XG4rXHRcdFx0aWYgKFdJRkVYSVRFRCh3c3RhdHVzKSBcdTAwMjZcdTAwMjYgV0VYSVRTVEFUVVMod3N0YXR1cykpXG4rXHRcdFx0XHRjb3JydXB0ZWQgPSAxO1xuK1x0XHR9XG4rXHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgdm9pZCAqbXJlbWFwcGVyX2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcbitcdHdoaWxlICghc3RvcCkge1xuK1x0XHR2b2lkICpwO1xuK1xuK1x0XHRwID0gbXJlbWFwKG1yZW1hcF9hcmVhLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsXG4rXHRcdFx0ICAgTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQsIG1yZW1hcF9zY3JhdGNoKTtcbitcdFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtcmVtYXAoKSBhd2F5XCIpO1xuK1x0XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgODsgaSsrKVxuK1x0XHRcdG1yZW1hcF9zY3JhdGNoWyhyYW5kX3IoXHUwMDI2c2VlZCkgJVxuK1x0XHRcdFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSkgKiBwYWdlX3NpemVdID0gMTtcbitcdFx0cCA9IG1yZW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxuK1x0XHRcdCAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfYXJlYSk7XG4rXHRcdGlmIChwID09IE1BUF9GQUlMRUQpXG4rXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibXJlbWFwKCkgYmFja1wiKTtcbitcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDIwMDApO1xuK1x0fVxuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuKy8qXG4rICogLXA6IHN3YXAgdHJhZmZpYyBhbmQgTFJVIGNodXJuIG9uIGEgcmVnaW9uIG9mIG91ciBvd24uIFRoZSBjb250ZW50XG4rICogY2hlY2sgaXMgZXhhY3Qg4oCUIGEgcGFnZSBvdXQgYW5kIGJhY2sgdGhyb3VnaCBzd2FwIG11c3QgcHJlc2VydmUgdGhlXG4rICogcGF0dGVybiwgYW5kIG5vdGhpbmcgZWxzZSBldmVyIHdyaXRlcyBoZXJlLlxuKyAqL1xuK3N0YXRpYyB2b2lkICpwYWdlb3V0X2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcdHVuc2lnbmVkIGxvbmcgbnIgPSBwYWdlb3V0X3NpemUgLyBwYWdlX3NpemU7XG4rXHR1bnNpZ25lZCBsb25nIGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucjsgaSsrKVxuK1x0XHQqKHVuc2lnbmVkIGludCAqKShwYWdlb3V0X2FyZWEgKyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0bWFkdmlzZShwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSwgTUFEVl9QQUdFT1VUKTtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnIgXHUwMDI2XHUwMDI2ICFzdG9wOyBpKyspIHtcbitcdFx0XHR1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICtcbitcdFx0XHRcdFx0XHRcdCAgICAgaSAqIHBhZ2Vfc2l6ZSk7XG4rXG4rXHRcdFx0aWYgKHZhbCAhPSBwYXR0ZXJuKGkpKSB7XG4rXHRcdFx0XHRjb3JydXB0ZWQgPSAxO1xuK1x0XHRcdFx0a3NmdF9wcmludF9tc2coXCJQYWdlb3V0IGNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXG5cIixcbitcdFx0XHRcdFx0ICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7XG4rXHRcdFx0fVxuK1x0XHR9XG4rXHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbisvKiAtcDogY29tcGFjdGlvbiBtaWdyYXRlcyB0aGUgY29sbGFwc2Ugc291cmNlcyBvdXQgZnJvbSB1bmRlciB1cy4gKi9cbitzdGF0aWMgdm9pZCAqY29tcGFjdG9yX2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcdGludCBmZCA9IG9wZW4oXCIvcHJvYy9zeXMvdm0vY29tcGFjdF9tZW1vcnlcIiwgT19XUk9OTFkpO1xuK1xuK1x0aWYgKGZkIFx1MDAzYyAwKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiTm8gY29tcGFjdF9tZW1vcnk7IGNvbXBhY3RvciBpZGxlXFxuXCIpO1xuK1x0XHRyZXR1cm4gTlVMTDtcbitcdH1cbitcdHdoaWxlICghc3RvcCkge1xuK1x0XHRpZiAod3JpdGUoZmQsIFwiMVwiLCAxKSBcdTAwM2MgMClcbitcdFx0XHRicmVhaztcbitcdFx0dXNsZWVwKDEwMDAwICsgcmFuZF9yKFx1MDAyNnNlZWQpICUgMTAwMDAwKTtcbitcdH1cbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgYm9vbCBzd2FwX2F2YWlsYWJsZSh2b2lkKVxuK3tcbitcdGNoYXIgbGluZVsyNTZdO1xuK1x0aW50IGxpbmVzID0gMDtcbitcdEZJTEUgKmZwID0gZm9wZW4oXCIvcHJvYy9zd2Fwc1wiLCBcInJcIik7XG4rXG4rXHRpZiAoIWZwKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpXG4rXHRcdGxpbmVzKys7XG4rXHRmY2xvc2UoZnApO1xuK1x0cmV0dXJuIGxpbmVzIFx1MDAzZSAxO1xuK31cbitcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBub3dfbXModm9pZClcbit7XG4rXHRzdHJ1Y3QgdGltZXZhbCB0djtcbitcbitcdGdldHRpbWVvZmRheShcdTAwMjZ0diwgTlVMTCk7XG4rXHRyZXR1cm4gdHYudHZfc2VjICogMTAwMFVMICsgdHYudHZfdXNlYyAvIDEwMDA7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXG4re1xuK1x0ZnByaW50ZihzdGRlcnIsXG4rXHRcdFwiVXNhZ2U6IGtodWdlcGFnZWRfcmFjZSBbLWQgc2Vjb25kc10gWy1tIHN0ZXBwZWR8ZnJlZXxtYWR2aXNlXSBbLXpdIFstcF0gWy1hIGFyZWFzXVxcblwiXG4rXHRcdFwiXFx0LXo6IHBlcm1pc3NpdmUgbWF4X3B0ZXNfbm9uZSAoaG9sZS1oZWF2eSB3aW5kb3dzKVxcblwiXG4rXHRcdFwiXFx0LXA6IG1lbW9yeSBwcmVzc3VyZSAocGFnZW91dCArIGNvbXBhY3Rpb24pIHRocmVhZHNcXG5cIlxuK1x0XHRcIlxcdC1hOiBudW1iZXIgb2Ygc2hhcmVkIFBNRC1zaXplZCBwbGF5Z3JvdW5kIGFyZWFzIChkZWZhdWx0IDMpXFxuXCIpO1xuK1x0ZXhpdCgxKTtcbit9XG4rXG4raW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuK3tcbitcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGhyZWFkX25hbWVzW10gPSB7XG4rXHRcdFwiZmF1bHRlclwiLCBcImZhdWx0ZXIyXCIsIFwiZG9udG5lZWRcIiwgXCJwaW5uZXJcIiwgXCJmb3JrZXJcIixcbitcdFx0XCJtcmVtYXBwZXJcIiwgXCJwYWdlb3V0XCIsIFwiY29tcGFjdG9yXCIsXG4rXHR9O1xuK1x0dm9pZCAqKCpjb25zdCB0aHJlYWRfZm5zW10pKHZvaWQgKikgPSB7XG4rXHRcdGZhdWx0ZXJfZm4sIGZhdWx0ZXJfZm4sIGRvbnRuZWVkX2ZuLCBwaW5uZXJfZm4sIGZvcmtlcl9mbixcbitcdFx0bXJlbWFwcGVyX2ZuLCBwYWdlb3V0X2ZuLCBjb21wYWN0b3JfZm4sXG4rXHR9O1xuK1x0Y29uc3QgdW5zaWduZWQgbG9uZyBwYWdlb3V0X2JpdCA9IDFVTCBcdTAwM2NcdTAwM2MgNiwgY29tcGFjdG9yX2JpdCA9IDFVTCBcdTAwM2NcdTAwM2MgNztcbitcdGNvbnN0IGludCBucl90aHJlYWRzID0gQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpO1xuK1x0cHRocmVhZF90IHRocmVhZHNbQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpXTtcbitcdGNvbnN0IGNoYXIgKm1vZGUgPSBcInN0ZXBwZWRcIjtcbitcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4rXHR1bnNpZ25lZCBsb25nIGVuZF9tcztcbitcdGludCBkdXJhdGlvbl9zID0gMTA7XG4rXHR1bnNpZ25lZCBsb25nIHRocmVhZF9tYXNrID0gfjBVTDtcbitcdGludCBucl9hcmVhc19hcmcgPSAwO1xuK1x0Ym9vbCBwZXJtaXNzaXZlX25vbmUgPSBmYWxzZTtcbitcdGJvb2wgcHJlc3N1cmUgPSBmYWxzZTtcbitcdHVuc2lnbmVkIGxvbmcgaTtcbitcdGludCBzdGVwcyA9IDA7XG4rXHRpbnQgb3B0O1xuK1xuK1x0d2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgXCJhOmQ6bTp0OnpwaFwiKSkgIT0gLTEpIHtcbitcdFx0c3dpdGNoIChvcHQpIHtcbitcdFx0Y2FzZSAnYSc6XG4rXHRcdFx0bnJfYXJlYXNfYXJnID0gYXRvaShvcHRhcmcpO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICdkJzpcbitcdFx0XHRkdXJhdGlvbl9zID0gYXRvaShvcHRhcmcpO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICdtJzpcbitcdFx0XHRtb2RlID0gb3B0YXJnO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICd0JzpcbitcdFx0XHQvKiBkZWJ1ZzogYml0bWFzayBvZiByYWNpbmcgdGhyZWFkcyB0byBzdGFydCAqL1xuK1x0XHRcdHRocmVhZF9tYXNrID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDApO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICd6JzpcbitcdFx0XHRwZXJtaXNzaXZlX25vbmUgPSB0cnVlO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICdwJzpcbitcdFx0XHRwcmVzc3VyZSA9IHRydWU7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGRlZmF1bHQ6XG4rXHRcdFx0dXNhZ2UoKTtcbitcdFx0fVxuK1x0fVxuK1x0aWYgKHN0cmNtcChtb2RlLCBcInN0ZXBwZWRcIikgXHUwMDI2XHUwMDI2IHN0cmNtcChtb2RlLCBcImZyZWVcIikgXHUwMDI2XHUwMDI2XG4rXHQgICAgc3RyY21wKG1vZGUsIFwibWFkdmlzZVwiKSlcbitcdFx0dXNhZ2UoKTtcbitcbitcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4rXHRpZiAoIXRocF9hdmFpbGFibGUoKSlcbitcdFx0a3NmdF9leGl0X3NraXAoXCJUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcblwiKTtcbitcbitcdHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7XG4rXHRocGFnZV9wbWRfc2l6ZSA9IHJlYWRfcG1kX3BhZ2VzaXplKCk7XG4rXHRpZiAoIWhwYWdlX3BtZF9zaXplKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcXG5cIik7XG4rXG4rXHRndXBfZmQgPSBvcGVuKFwiL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3RcIiwgT19SRFdSKTtcbitcdGlmIChndXBfZmQgXHUwMDNjIDApXG4rXHRcdGtzZnRfZXhpdF9za2lwKFwiL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgcmVxdWlyZXMgQ09ORklHX0dVUF9URVNUIGFuZCByb290XFxuXCIpO1xuK1xuK1x0bnJfc2hhcmVkX2FyZWFzID0gbnJfYXJlYXNfYXJnIFx1MDAzZSAwID8gbnJfYXJlYXNfYXJnIDogREVGQVVMVF9TSEFSRURfQVJFQVM7XG4rXHRucl9hcmVhcyA9IG5yX3NoYXJlZF9hcmVhcyArIDE7XG4rXG4rXHRpZiAoIXByZXNzdXJlKSB7XG4rXHRcdHRocmVhZF9tYXNrIFx1MDAyNj0gfihwYWdlb3V0X2JpdCB8IGNvbXBhY3Rvcl9iaXQpO1xuK1x0fSBlbHNlIGlmICghc3dhcF9hdmFpbGFibGUoKSkge1xuK1x0XHQvKiBObyBzd2FwLCBubyBhbm9uIHJlY2xhaW06IGNvbXBhY3Rpb24tb25seSBwcmVzc3VyZS4gKi9cbitcdFx0a3NmdF9wcmludF9tc2coXCItcCB3aXRob3V0IHN3YXA6IHBhZ2VvdXQgdGhyZWFkIGRpc2FibGVkXFxuXCIpO1xuK1x0XHR0aHJlYWRfbWFzayBcdTAwMjY9IH5wYWdlb3V0X2JpdDtcbitcdH1cbitcbitcdGtzZnRfc2V0X3BsYW4oMSk7XG4rXG4rXHR0aHBfc2F2ZV9zZXR0aW5ncygpO1xuK1x0dGhwX3JlYWRfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1x0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTUFEVklTRTtcbitcdHNldHRpbmdzLnRocF9kZWZyYWcgPSBUSFBfREVGUkFHX0FMV0FZUztcbitcdHNldHRpbmdzLnNobWVtX2VuYWJsZWQgPSBTSE1FTV9ORVZFUjtcbitcdHNldHRpbmdzLmtodWdlcGFnZWQuZGVmcmFnID0gMTtcbitcdHNldHRpbmdzLmtodWdlcGFnZWQuc2Nhbl9zbGVlcF9taWxsaXNlY3MgPVxuK1x0XHRzdHJjbXAobW9kZSwgXCJmcmVlXCIpID8gMTAwMCA6IDA7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmFsbG9jX3NsZWVwX21pbGxpc2VjcyA9IDEwO1xuK1x0LypcbitcdCAqIG1USFAgY29sbGFwc2Ugb25seSBzdXBwb3J0cyB0aGUgdHdvIGVuZHMgb2YgdGhlIG9jY3VwYW5jeVxuK1x0ICogc2NhbGU6IDAgb3IgSFBBR0VfUE1EX05SIC0gMSAoYW55dGhpbmcgZWxzZSBjb2VyY2VzIHRvIDApLlxuK1x0ICogU3RyaWN0IGlzIHRoZSBkZWZhdWx0IOKAlCBpdCBhbHNvIGtlZXBzIGtodWdlcGFnZWQgZnJvbSBidXJuaW5nXG4rXHQgKiB0aGUgd2hvbGUgc3RlcCBpbiBkb29tZWQgUE1ELXNpemVkIGFsbG9jYXRpb25zIG9uIDUxMk0tUE1EXG4rXHQgKiBjb25maWdzLCB3aGVyZSBhIGZ1bGx5IHBvcHVsYXRlZCBhcmVhIGlzIHJhcmUgdW5kZXIgcmFjaW5nXG4rXHQgKiBNQURWX0RPTlRORUVELiAteiBzZWxlY3RzIHRoZSBwZXJtaXNzaXZlIGVuZDogc2VsZWN0aW9uIHRoZW5cbitcdCAqIGVtaXRzIGhvbGUtaGVhdnkgd2luZG93cyBhbmQgdGhlIGVuZ2luZSdzIHBvcHVsYXRpb24gcGF0aHNcbitcdCAqIHRha2UgdGhlIGJydW50IG9mIHRoZSByYWNpbmcgZmF1bHRzIGFuZCB6YXBzLlxuK1x0ICovXG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBwZXJtaXNzaXZlX25vbmUgP1xuK1x0XHQoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpIC0gMSA6IDA7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPVxuK1x0XHRucl9hcmVhcyAqIChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgKiA4O1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpKyspIHtcbitcdFx0aWYgKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGkpKVxuK1x0XHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XG4rXHR9XG4rXHQvKiBCYXNlIG9mIHRoZSBzZXR0aW5ncyBzdGFjazsgdGhlIGJvdHRvbSBlbnRyeSBpcyBuZXZlciBwb3BwZWQuICovXG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRyZWdpb24gPSBtbWFwKEJBU0VfQUREUiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcbitcdFx0ICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLFxuK1x0XHQgICAgICAtMSwgMCk7XG4rXHRpZiAocmVnaW9uICE9IEJBU0VfQUREUilcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiRmFpbGVkIHRvIGFsbG9jYXRlIFZNQSBhdCAlcFxcblwiLCBCQVNFX0FERFIpO1xuK1x0bXJlbWFwX2FyZWEgPSByZWdpb24gKyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTtcbitcdG1yZW1hcF9zY3JhdGNoID0gKGNoYXIgKilCQVNFX0FERFIgKyAyICogbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTtcbitcbitcdGlmICh0aHJlYWRfbWFzayBcdTAwMjYgcGFnZW91dF9iaXQpIHtcbitcdFx0LypcbitcdFx0ICogQmlnIGVub3VnaCB0byBjeWNsZSByZWFsIHJlY2xhaW0sIHNtYWxsIGVub3VnaCBub3QgdG9cbitcdFx0ICogZG9taW5hdGUgYSBUQ0cgZ3Vlc3Q6IDQgUE1EIGFyZWFzLCBjbGFtcGVkIHRvIFsxNk0sIDY0TV0uXG4rXHRcdCAqL1xuK1x0XHRwYWdlb3V0X3NpemUgPSA0ICogaHBhZ2VfcG1kX3NpemU7XG4rXHRcdHBhZ2VvdXRfc2l6ZSA9IHBhZ2VvdXRfc2l6ZSBcdTAwM2MgKDE2VUwgXHUwMDNjXHUwMDNjIDIwKSA/ICgxNlVMIFx1MDAzY1x1MDAzYyAyMCkgOlxuK1x0XHRcdCAgICAgICBwYWdlb3V0X3NpemUgXHUwMDNlICg2NFVMIFx1MDAzY1x1MDAzYyAyMCkgPyAoNjRVTCBcdTAwM2NcdTAwM2MgMjApIDpcbitcdFx0XHQgICAgICAgcGFnZW91dF9zaXplO1xuK1x0XHRwYWdlb3V0X2FyZWEgPSBtbWFwKE5VTEwsIHBhZ2VvdXRfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbitcdFx0XHRcdCAgICBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTtcbitcdFx0aWYgKHBhZ2VvdXRfYXJlYSA9PSBNQVBfRkFJTEVEKVxuK1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1tYXAoKSBwYWdlb3V0IGFyZWFcIik7XG4rXHR9XG4rXG4rXHQvKiBQb3B1bGF0ZSBzbyB0aGUgZmlyc3QgcGFzcyBoYXMgc29tZXRoaW5nIHRvIGNvbGxhcHNlLiAqL1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkrKylcbitcdFx0Kih1bnNpZ25lZCBpbnQgKikocmVnaW9uICsgaSAqIHBhZ2Vfc2l6ZSkgPSBwYXR0ZXJuKGkpO1xuK1x0bWVtc2V0KG1yZW1hcF9hcmVhLCAxLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHRtYWR2aXNlKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl90aHJlYWRzOyBpKyspIHtcbitcdFx0aWYgKCEodGhyZWFkX21hc2sgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGkpKSkge1xuK1x0XHRcdHRocmVhZHNbaV0gPSAwO1xuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHR9XG4rXHRcdGlmIChwdGhyZWFkX2NyZWF0ZShcdTAwMjZ0aHJlYWRzW2ldLCBOVUxMLCB0aHJlYWRfZm5zW2ldLFxuK1x0XHRcdFx0ICAgKHZvaWQgKikoaSArIDEpKSlcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJwdGhyZWFkX2NyZWF0ZSgpXCIpO1xuK1x0fVxuK1xuK1x0ZW5kX21zID0gbm93X21zKCkgKyBkdXJhdGlvbl9zICogMTAwMFVMO1xuK1x0aWYgKCFzdHJjbXAobW9kZSwgXCJzdGVwcGVkXCIpKSB7XG4rXHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKSB7XG4rXHRcdFx0aWYgKCFraHVnZXBhZ2VkX2Z1bGxfcGFzcyg2MDApKVxuK1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwia2h1Z2VwYWdlZCBwYXNzIHRpbWVkIG91dFxcblwiKTtcbitcdFx0XHRzdGVwcysrO1xuK1x0XHR9XG4rXHR9IGVsc2UgaWYgKCFzdHJjbXAobW9kZSwgXCJmcmVlXCIpKSB7XG4rXHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKVxuK1x0XHRcdHVzbGVlcCgxMDAgKiAxMDAwKTtcbitcdH0gZWxzZSB7XHQvKiBtYWR2aXNlICovXG4rXHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKSB7XG4rXHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzOyBpKyspIHtcbitcdFx0XHRcdG1hZHZpc2UocmVnaW9uICsgaSAqIGhwYWdlX3BtZF9zaXplLFxuK1x0XHRcdFx0XHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9DT0xMQVBTRSk7XG4rXHRcdFx0fVxuK1x0XHRcdG1hZHZpc2UocmVnaW9uLCBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcbitcdFx0XHRcdE1BRFZfRE9OVE5FRUQpO1xuK1x0XHRcdHN0ZXBzKys7XG4rXHRcdH1cbitcdH1cbitcbitcdHN0b3AgPSAxO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfdGhyZWFkczsgaSsrKSB7XG4rXHRcdGlmICh0aHJlYWRzW2ldKVxuK1x0XHRcdHB0aHJlYWRfam9pbih0aHJlYWRzW2ldLCBOVUxMKTtcbitcdH1cbitcbitcdC8qIEZpbmFsIGludGVncml0eSBzd2VlcC4gKi9cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOyBpKyspXG4rXHRcdGNoZWNrX3BhZ2UoaSk7XG4rXG4rXHR0aHBfcmVzdG9yZV9zZXR0aW5ncygpO1xuK1xuK1x0a3NmdF90ZXN0X3Jlc3VsdCghY29ycnVwdGVkLCBcIiVzOiAlZHMsICVkIHN0ZXBzLCBubyBjb3JydXB0aW9uXFxuXCIsXG4rXHRcdFx0IG1vZGUsIGR1cmF0aW9uX3MsIHN0ZXBzKTtcbitcdGtzZnRfZmluaXNoZWQoKTtcbit9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjEzMjE1Y2IzNzBjZWJcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jXG5AQCAtMCwwICsxLDE5OCBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBTeW5jaHJvbm91cyBraHVnZXBhZ2VkIGRyaXZpbmcgY2hlY2suXG4rICpcbisgKiBSYWNlIHRlc3RzIGRyaXZlIGtodWdlcGFnZWQgdGhyb3VnaCB0aGUgZXhpc3Rpbmcgc3lzZnMgY29udHJvbHM6IGFcbisgKiBzdG9yZSB0byBzY2FuX3NsZWVwX21pbGxpc2VjcyB3YWtlcyB0aGUgZGFlbW9uLCBhbmQgZnVsbF9zY2Fuc1xuKyAqIGFkdmFuY2luZyBieSB0d28gaXMgYSBjb21wbGV0aW9uIGJhcnJpZXIgZm9yIG9uZSBmdWxsIHBhc3MgdGhhdFxuKyAqIHN0YXJ0ZWQgYWZ0ZXIgc2V0dXAgKGtodWdlcGFnZWRfZnVsbF9wYXNzKCkpLiBWZXJpZnkgdGhlIHBhaXIgZ2l2ZXNcbisgKiBkZXRlcm1pbmlzdGljLCBhdHRyaWJ1dGFibGUgcmVzdWx0czogb25lIGJhcnJpZXIgc3RlcCBvdmVyIG9uZVxuKyAqIHByZXBhcmVkIHdpbmRvdyBwcm9kdWNlcyBleGFjdGx5IG9uZSBjb2xsYXBzZSBhdHRlbXB0IG9uIHRoYXRcbisgKiB3aW5kb3cncyBzb3VyY2UgcGFnZXMg4oCUIG1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlIGV2ZW50c1xuKyAqIGZpbHRlcmVkIGJ5IHNvdXJjZSBQRk4gYW5kIG9yZGVyIOKAlCBhbmQgdGhlIHdpbmRvdyBpcyBjb2xsYXBzZWRcbisgKiBhZnRlcndhcmRzLCByZXBlYXRhYmx5LlxuKyAqXG4rICogc2Nhbl9zbGVlcF9taWxsaXNlY3MgaXMgc2V0IHRvIDYwcyB0byBwcm92ZSB0aGUgd2FrZSBwYXRoOiB3aXRob3V0XG4rICogdGhlIHdha2UsIG9uZSBiYXJyaWVyIHN0ZXAgd291bGQgc2xlZXAgbXVsdGlwbGVzIG9mIHRoYXQgYW5kIGJsb3dcbisgKiB0aGUgdGltZW91dC4gSXQgYWxzbyBrZWVwcyB0aGUgZGFlbW9uIGZyb20gZnJlZS1ydW5uaW5nIGJldHdlZW5cbisgKiBzdGVwcywgcGVyIHRoZSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIGRpc2NpcGxpbmUuXG4rICovXG4rI2RlZmluZSBfR05VX1NPVVJDRVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwia3NlbGZ0ZXN0LmhcIlxuKyNpbmNsdWRlIFwidm1fdXRpbC5oXCJcbisjaW5jbHVkZSBcImh1Z2VwYWdlX3NldHRpbmdzLmhcIlxuK1xuKyNkZWZpbmUgQkFTRV9BRERSICgodm9pZCAqKSgxVUwgXHUwMDNjXHUwMDNjIDMwKSlcbisjZGVmaW5lIFRBUkdFVF9PUkRFUiAyXHQvKiBzbWFsbGVzdCBvcmRlciBraHVnZXBhZ2VkIGNvbnNpZGVycyAqL1xuKyNkZWZpbmUgTlJfSVRFUkFUSU9OUyA1XG4rXG4rc3RhdGljIGludCBwYWdlbWFwX2ZkO1xuK3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDtcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcbitcbisvKlxuKyAqIENvdW50IGNvbGxhcHNlIGF0dGVtcHRzIGF0dHJpYnV0YWJsZSB0byBvdXIgd2luZG93OiBsZWdhY3ktZW5naW5lXG4rICogaXNvbGF0ZSBldmVudHMgd2hvc2Ugc2Nhbl9wZm4gaXMgb25lIG9mIHRoZSB3aW5kb3cncyBzb3VyY2UgUEZOcyxcbisgKiBwbHVzIGJhdGNoLWVuZ2luZSBwZXItY2FuZGlkYXRlIGluc3RhbGwgZXZlbnRzIGF0IHRoZSB3aW5kb3cnc1xuKyAqIGFkZHJlc3MuIEVpdGhlciBlbmdpbmUgcmVwb3J0cyBleGFjdGx5IG9uY2UgcGVyIGF0dGVtcHQuXG4rICovXG4rc3RhdGljIGludCBjb3VudF9hdHRyaWJ1dGVkKHVuc2lnbmVkIGxvbmcgKnBmbnMsIGludCBucl9wZm5zLFxuK1x0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBvcmRlcilcbit7XG4rXHRjaGFyIGxpbmVbMTAyNF07XG4rXHRpbnQgY291bnQgPSAwO1xuK1x0RklMRSAqZnA7XG4rXG4rXHRmcCA9IHRyYWNpbmdfb3Blbl90cmFjZSgpO1xuK1x0aWYgKCFmcClcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiQ2Fubm90IG9wZW4gdHJhY2UgYnVmZmVyXFxuXCIpO1xuK1xuK1x0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKSB7XG4rXHRcdGNoYXIgKnM7XG4rXHRcdHVuc2lnbmVkIGxvbmcgdmFsO1xuK1x0XHR1bnNpZ25lZCBpbnQgb3JkO1xuK1x0XHRjaGFyICpvO1xuK1x0XHRpbnQgaTtcbitcbitcdFx0cyA9IHN0cnN0cihsaW5lLCBcIm1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOlwiKTtcbitcdFx0aWYgKHMpIHtcbitcdFx0XHRpZiAoc3NjYW5mKHMsIFwibW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGU6IHNjYW5fcGZuPTB4JWx4XCIsXG4rXHRcdFx0XHQgICBcdTAwMjZ2YWwpICE9IDEpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHRvID0gc3Ryc3RyKHMsIFwib3JkZXI9XCIpO1xuK1x0XHRcdGlmICghbyB8fCBzc2NhbmYobywgXCJvcmRlcj0ldVwiLCBcdTAwMjZvcmQpICE9IDEgfHxcbitcdFx0XHQgICAgb3JkICE9IG9yZGVyKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfcGZuczsgaSsrKSB7XG4rXHRcdFx0XHRpZiAodmFsID09IHBmbnNbaV0pIHtcbitcdFx0XHRcdFx0Y291bnQrKztcbitcdFx0XHRcdFx0YnJlYWs7XG4rXHRcdFx0XHR9XG4rXHRcdFx0fVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHR9XG4rXG4rXHRcdHMgPSBzdHJzdHIobGluZSwgXCJtbV9jb2xsYXBzZV9jYW5kaWRhdGU6XCIpO1xuK1x0XHRpZiAocykge1xuK1x0XHRcdGlmICghc3Ryc3RyKHMsIFwicGFzcz1pbnN0YWxsXCIpIHx8XG4rXHRcdFx0ICAgICFzdHJzdHIocywgXCJyZXN1bHQ9c3VjY2VlZGVkXCIpKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0byA9IHN0cnN0cihzLCBcImFkZHI9XCIpO1xuK1x0XHRcdGlmICghbyB8fCBzc2NhbmYobywgXCJhZGRyPTB4JWx4XCIsIFx1MDAyNnZhbCkgIT0gMSB8fFxuK1x0XHRcdCAgICB2YWwgIT0gYWRkcilcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdG8gPSBzdHJzdHIocywgXCJvcmRlcj1cIik7XG4rXHRcdFx0aWYgKCFvIHx8IHNzY2FuZihvLCBcIm9yZGVyPSV1XCIsIFx1MDAyNm9yZCkgIT0gMSB8fFxuK1x0XHRcdCAgICBvcmQgIT0gb3JkZXIpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHRjb3VudCsrO1xuK1x0XHR9XG4rXHR9XG4rXHRmY2xvc2UoZnApO1xuK1x0cmV0dXJuIGNvdW50O1xuK31cbitcbitzdGF0aWMgdm9pZCBvbmVfc3RlcChpbnQgaXRlcmF0aW9uKVxuK3tcbitcdGNvbnN0IHNpemVfdCB3aW5kb3cgPSBnZXRwYWdlc2l6ZSgpIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVI7XG4rXHRjb25zdCBpbnQgbnJfcGFnZXMgPSAxIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVI7XG4rXHR1bnNpZ25lZCBsb25nIHBmbnNbMSBcdTAwM2NcdTAwM2MgVEFSR0VUX09SREVSXTtcbitcdGJvb2wgY29sbGFwc2VkO1xuK1x0aW50IGF0dHJpYnV0ZWQ7XG4rXHRjaGFyICpwO1xuK1x0aW50IGk7XG4rXG4rXHRwID0gbW1hcChCQVNFX0FERFIsIGhwYWdlX3BtZF9zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuK1x0XHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XG4rXHRpZiAocCAhPSBCQVNFX0FERFIpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIkZhaWxlZCB0byBhbGxvY2F0ZSBWTUEgYXQgJXBcXG5cIixcbitcdFx0XHRcdCAgIEJBU0VfQUREUik7XG4rXG4rXHQvKiBQcmVwYXJlIG9uZSB3aW5kb3c7IHJlY29yZCBpdHMgc291cmNlIFBGTnMuICovXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XG4rXHRcdHBbaSAqIGdldHBhZ2VzaXplKCldID0gaSArIDE7XG4rXHRcdHBmbnNbaV0gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcCArIGkgKiBnZXRwYWdlc2l6ZSgpKTtcbitcdFx0aWYgKHBmbnNbaV0gPT0gLTFVTClcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJTb3VyY2UgcGFnZSBub3QgcHJlc2VudFxcblwiKTtcbitcdH1cbitcbitcdGlmICh0cmFjaW5nX2V2ZW50c19zdGFydChcImh1Z2VfbWVtb3J5XCIpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJDYW5ub3QgZW5hYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xcblwiKTtcbitcbitcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuK1x0LyogV2FpdCB1cCB0byAxMjAgc2Vjb25kcyBmb3IgdGhlIHBhc3MgdG8gY29tcGxldGUuICovXG4rXHRpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKDEyMCkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcImtodWdlcGFnZWQgZGlkIG5vdCBjb21wbGV0ZSBhIGZ1bGwgcGFzc1xcblwiKTtcbitcbitcdHRyYWNpbmdfZXZlbnRzX3N0b3AoXCJodWdlX21lbW9yeVwiKTtcbitcbitcdGNvbGxhcHNlZCA9IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgd2luZG93LCBUQVJHRVRfT1JERVIsXG4rXHRcdFx0XHRcdFx0ICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpO1xuK1x0YXR0cmlidXRlZCA9IGNvdW50X2F0dHJpYnV0ZWQocGZucywgbnJfcGFnZXMsICh1bnNpZ25lZCBsb25nKXAsXG4rXHRcdFx0XHQgICAgICBUQVJHRVRfT1JERVIpO1xuK1xuK1x0a3NmdF90ZXN0X3Jlc3VsdChjb2xsYXBzZWQgXHUwMDI2XHUwMDI2IGF0dHJpYnV0ZWQgPT0gMSxcbitcdFx0XHQgXCJzdGVwICVkOiB3aW5kb3cgY29sbGFwc2VkLCAlZCBhdHRyaWJ1dGVkIHJlc3VsdChzKVxcblwiLFxuK1x0XHRcdCBpdGVyYXRpb24sIGF0dHJpYnV0ZWQpO1xuK1xuK1x0bXVubWFwKHAsIGhwYWdlX3BtZF9zaXplKTtcbit9XG4rXG4raW50IG1haW4odm9pZClcbit7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuK1x0aW50IGk7XG4rXG4rXHRrc2Z0X3ByaW50X2hlYWRlcigpO1xuK1xuK1x0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXG4rXHRcdGtzZnRfZXhpdF9za2lwKFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXG5cIik7XG4rXHRpZiAoISh0aHBfc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVIpKSlcbitcdFx0a3NmdF9leGl0X3NraXAoXCJPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcXG5cIixcbitcdFx0XHQgICAgICAgVEFSR0VUX09SREVSKTtcbitcbitcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcbitcdGlmICghaHBhZ2VfcG1kX3NpemUpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIlJlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxcblwiKTtcbitcdHBhZ2VtYXBfZmQgPSBvcGVuKFwiL3Byb2Mvc2VsZi9wYWdlbWFwXCIsIE9fUkRPTkxZKTtcbitcdGlmIChwYWdlbWFwX2ZkIFx1MDAzYyAwKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJvcGVuKFxcXCIvcHJvYy9zZWxmL3BhZ2VtYXBcXFwiKVwiKTtcbitcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwiL3Byb2Mva3BhZ2VmbGFnc1wiLCBPX1JET05MWSk7XG4rXHRpZiAoa3BhZ2VmbGFnc19mZCBcdTAwM2MgMClcbitcdFx0a3NmdF9leGl0X3NraXAoXCJvcGVuKFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcIikgcmVxdWlyZXMgcm9vdFxcblwiKTtcbitcdGlmICh0cmFjaW5nX2V2ZW50c19zdGFydChcImh1Z2VfbWVtb3J5XCIpKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcInRyYWNlZnMgdW5hdmFpbGFibGVcXG5cIik7XG4rXHR0cmFjaW5nX2V2ZW50c19zdG9wKFwiaHVnZV9tZW1vcnlcIik7XG4rXG4rXHRrc2Z0X3NldF9wbGFuKE5SX0lURVJBVElPTlMpO1xuK1xuK1x0dGhwX3NhdmVfc2V0dGluZ3MoKTtcbitcdHRocF9yZWFkX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7XG4rXHRzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmFsbG9jX3NsZWVwX21pbGxpc2VjcyA9IDYwMDAwO1xuK1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gKGhwYWdlX3BtZF9zaXplIC8gZ2V0cGFnZXNpemUoKSkgLSAxO1xuK1x0LyogT25lIHdha2UgbXVzdCBjb21wbGV0ZSBvbmUgZnVsbCBwYXNzOyBzZWUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKS4gKi9cbitcdHNldHRpbmdzLmtodWdlcGFnZWQucGFnZXNfdG9fc2NhbiA9IDFVTCBcdTAwM2NcdTAwM2MgMjQ7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkrKylcbitcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XG4rXHRzZXR0aW5ncy5odWdlcGFnZXNbVEFSR0VUX09SREVSXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XG4rXHQvKiBCYXNlIG9mIHRoZSBzZXR0aW5ncyBzdGFjazsgdGhlIGJvdHRvbSBlbnRyeSBpcyBuZXZlciBwb3BwZWQuICovXG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9JVEVSQVRJT05TOyBpKyspXG4rXHRcdG9uZV9zdGVwKGkpO1xuK1xuK1x0dGhwX3Jlc3RvcmVfc2V0dGluZ3MoKTtcbitcbitcdGtzZnRfZmluaXNoZWQoKTtcbit9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuaW5kZXggNjg3ZDExNWUzYmQ4MC4uZjgyNmNmOTQwYzNkNCAxMDA3NTVcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuQEAgLTQwMiwxMCArNDAyLDI3IEBAIENBVEVHT1JZPVwicGZubWFwXCIgcnVuX3Rlc3QgLi9wZm5tYXBcbiAjIENPVyB0ZXN0c1xuIENBVEVHT1JZPVwiY293XCIgcnVuX3Rlc3QgLi9jb3dcbiBcbitDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4vZm9saW9fb3JkZXJfY2hlY2tcbitcbitcbitDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9zeW5jX2NoZWNrXG4rXG4rQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIHN0ZXBwZWRcbitcbitDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9yYWNlIC1kIDUgLW0gZnJlZVxuK1xuK0NBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3JhY2UgLWQgNSAtbSBtYWR2aXNlXG4rXG4rQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIHN0ZXBwZWQgLXpcbitcbitDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9yYWNlIC1kIDUgLW0gc3RlcHBlZCAtcFxuK1xuIENBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkXG4gXG4gQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgMlxuIFxuK0NBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1vIDIga2h1Z2VwYWdlZDphbm9uXG4rXG4gQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgYWxsOnNobWVtXG4gXG4gQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgNCBhbGw6c2htZW1cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuaW5kZXggMzJiOTkxNDcyZjc0NC4uOWIzODg1YmQwMDFiZSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmNcbkBAIC00Miw2OCArNDIsNiBAQCBjb25zdCBjaGFyICprcGFnZWZsYWdzX3Byb2MgPSBcIi9wcm9jL2twYWdlZmxhZ3NcIjtcbiBpbnQgcGFnZW1hcF9mZDtcbiBpbnQga3BhZ2VmbGFnc19mZDtcbiBcbi1zdGF0aWMgYm9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsXG4tXHRcdGludCBrcGFnZWZsYWdzX2ZkKVxuLXtcbi1cdGNvbnN0IHVpbnQ2NF90IGZvbGlvX2hlYWRfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX0hFQUQ7XG4tXHRjb25zdCB1aW50NjRfdCBmb2xpb190YWlsX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9UQUlMO1xuLVx0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4tXHR1bnNpZ25lZCBsb25nIHBmbl9oZWFkO1xuLVx0dWludDY0X3QgcGZuX2ZsYWdzO1xuLVx0dW5zaWduZWQgbG9uZyBwZm47XG4tXHR1bnNpZ25lZCBsb25nIGk7XG4tXG4tXHRwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xuLVxuLVx0Lyogbm9uIHByZXNlbnQgcGFnZSAqL1xuLVx0aWYgKHBmbiA9PSAtMVVMKVxuLVx0XHRyZXR1cm4gZmFsc2U7XG4tXG4tXHRpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdGdvdG8gZmFpbDtcbi1cbi1cdC8qIGNoZWNrIGZvciBvcmRlci0wIHBhZ2VzICovXG4tXHRpZiAoIW9yZGVyKSB7XG4tXHRcdGlmIChwZm5fZmxhZ3MgXHUwMDI2IChmb2xpb19oZWFkX2ZsYWdzIHwgZm9saW9fdGFpbF9mbGFncykpXG4tXHRcdFx0cmV0dXJuIGZhbHNlO1xuLVx0XHRyZXR1cm4gdHJ1ZTtcbi1cdH1cbi1cbi1cdC8qIG5vbiBUSFAgZm9saW8gKi9cbi1cdGlmICghKHBmbl9mbGFncyBcdTAwMjYgS1BGX1RIUCkpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdHBmbl9oZWFkID0gcGZuIFx1MDAyNiB+KG5yX3BhZ2VzIC0gMSk7XG4tXG4tXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbi1cdFx0Z290byBmYWlsO1xuLVxuLVx0LyogaGVhZCBQRk4gaGFzIG5vIGNvbXBvdW5kX2hlYWQgZmxhZyBzZXQgKi9cbi1cdGlmICgocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb19oZWFkX2ZsYWdzKSAhPSBmb2xpb19oZWFkX2ZsYWdzKVxuLVx0XHRyZXR1cm4gZmFsc2U7XG4tXG4tXHQvKiBjaGVjayBhbGwgdGFpbCBQRk4gZmxhZ3MgKi9cbi1cdGZvciAoaSA9IDE7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpKyspIHtcbi1cdFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBpLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuLVx0XHRcdGdvdG8gZmFpbDtcbi1cdFx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpXG4tXHRcdFx0cmV0dXJuIGZhbHNlO1xuLVx0fVxuLVxuLVx0Lypcbi1cdCAqIGNoZWNrIHRoZSBQRk4gYWZ0ZXIgdGhpcyBmb2xpbywgYnV0IGlmIGl0cyBmbGFncyBjYW5ub3QgYmUgb2J0YWluZWQsXG4tXHQgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyXG4tXHQgKi9cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdHJldHVybiB0cnVlO1xuLVxuLVx0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuLVx0cmV0dXJuIChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7XG4tZmFpbDpcbi1cdGtzZnRfZXhpdF9mYWlsX21zZyhcIkZhaWxlZCB0byBnZXQgZm9saW8gaW5mb1xcblwiKTtcbi1cdHJldHVybiBmYWxzZTtcbi19XG4tXG4gc3RhdGljIGludCB2YWRkcl9wYWdlZmxhZ3NfZ2V0KGNoYXIgKnZhZGRyLCBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQsXG4gXHRcdHVpbnQ2NF90ICpmbGFncylcbiB7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXG5pbmRleCBlZjFlYTExOTgxYTc0Li44ODZmYjNkZTljMDExIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmNcbkBAIC0zMDMsNiArMzAzLDE2MyBAQCBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncylcbiBcdHJldHVybiAwO1xuIH1cbiBcbitib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbitcdFx0XHRpbnQga3BhZ2VmbGFnc19mZClcbit7XG4rXHRjb25zdCB1aW50NjRfdCBmb2xpb19oZWFkX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9IRUFEO1xuK1x0Y29uc3QgdWludDY0X3QgZm9saW9fdGFpbF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfVEFJTDtcbitcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXHUwMDNjXHUwMDNjIG9yZGVyO1xuK1x0dW5zaWduZWQgbG9uZyBwZm5faGVhZDtcbitcdHVpbnQ2NF90IHBmbl9mbGFncztcbitcdHVuc2lnbmVkIGxvbmcgcGZuO1xuK1x0dW5zaWduZWQgbG9uZyBpO1xuK1xuK1x0cGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTtcbitcbitcdC8qIG5vbiBwcmVzZW50IHBhZ2UgKi9cbitcdGlmIChwZm4gPT0gLTFVTClcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuK1x0XHRnb3RvIGZhaWw7XG4rXG4rXHQvKiBjaGVjayBmb3Igb3JkZXItMCBwYWdlcyAqL1xuK1x0aWYgKCFvcmRlcikge1xuK1x0XHRpZiAocGZuX2ZsYWdzIFx1MDAyNiAoZm9saW9faGVhZF9mbGFncyB8IGZvbGlvX3RhaWxfZmxhZ3MpKVxuK1x0XHRcdHJldHVybiBmYWxzZTtcbitcdFx0cmV0dXJuIHRydWU7XG4rXHR9XG4rXG4rXHQvKiBub24gVEhQIGZvbGlvICovXG4rXHRpZiAoIShwZm5fZmxhZ3MgXHUwMDI2IEtQRl9USFApKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRwZm5faGVhZCA9IHBmbiBcdTAwMjYgfihucl9wYWdlcyAtIDEpO1xuK1xuK1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4rXHRcdGdvdG8gZmFpbDtcbitcbitcdC8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovXG4rXHRpZiAoKHBmbl9mbGFncyBcdTAwMjYgZm9saW9faGVhZF9mbGFncykgIT0gZm9saW9faGVhZF9mbGFncylcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0LyogY2hlY2sgYWxsIHRhaWwgUEZOIGZsYWdzICovXG4rXHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XG4rXHRcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgaSwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbitcdFx0XHRnb3RvIGZhaWw7XG4rXHRcdGlmICgocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzKVxuK1x0XHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcbitcdC8qXG4rXHQgKiBjaGVjayB0aGUgUEZOIGFmdGVyIHRoaXMgZm9saW8sIGJ1dCBpZiBpdHMgZmxhZ3MgY2Fubm90IGJlIG9idGFpbmVkLFxuK1x0ICogYXNzdW1lIHRoaXMgZm9saW8gaGFzIHRoZSBleHBlY3RlZCBvcmRlclxuK1x0ICovXG4rXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCArIG5yX3BhZ2VzLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuK1x0XHRyZXR1cm4gdHJ1ZTtcbitcbitcdC8qIElmIHdlIGZpbmQgYW5vdGhlciB0YWlsIHBhZ2UsIHRoZW4gdGhlIGZvbGlvIGlzIGxhcmdlci4gKi9cbitcdHJldHVybiAocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzO1xuK2ZhaWw6XG4rXHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXG5cIik7XG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuK1xuKy8qXG4rICogQ2hlY2sgd2hldGhlciB0aGUgcmFuZ2UgW3N0YXJ0LCBzdGFydCArIGxlbikgaXMgYmFja2VkIGJ5IGZvbGlvcyBvZlxuKyAqIGV4YWN0bHkgQG9yZGVyLCBtYXBwZWQgYXQgdGhlaXIgbmF0dXJhbCBhbGlnbm1lbnQuXG4rICpcbisgKiBpc19iYWNrZWRfYnlfZm9saW8oKSBjbGFzc2lmaWVzIHRoZSBmb2xpbyBiYWNraW5nIG9uZSBwYWdlOyBoZXJlIHdlXG4rICogYWRkaXRpb25hbGx5IHJlcXVpcmUgdGhhdCBlYWNoIG9yZGVyLWFsaWduZWQgd2luZG93IG9mIHRoZSByYW5nZSBtYXBzXG4rICogb25lIHN1Y2ggZm9saW8gaGVhZC10by10YWlsOiB0aGUgVkEgcmFuZ2UgbXVzdCBiZSBuYXR1cmFsbHkgYWxpZ25lZCxcbisgKiBlYWNoIHdpbmRvdydzIFBGTiBydW4gbXVzdCBiZSBjb250aWd1b3VzLCBhbmQgdGhlIGZpcnN0IFBGTiBtdXN0IGJlXG4rICogdGhlIChuYXR1cmFsbHkgYWxpZ25lZCkgZm9saW8gaGVhZC5cbisgKlxuKyAqIFRoaXMgaXMgdGhlIGNoZWNrIFwiZGlkIHRoaXMgcmFuZ2UgY29sbGFwc2UgaW50byBvcmRlci1Ab3JkZXIgZm9saW9zXCI6XG4rICogYSB3aW5kb3cgYXNzZW1ibGVkIGZyb20gcGFydHMgb2Ygc2V2ZXJhbCBmb2xpb3MsIG9yIG1hcHBpbmcgYSBmb2xpb1xuKyAqIHNoaWZ0ZWQgZnJvbSBpdHMgbmF0dXJhbCBwb3NpdGlvbiwgZmFpbHMuXG4rICovXG4rYm9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsXG4rXHRcdFx0XHQgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZClcbit7XG4rXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbitcdGNvbnN0IHNpemVfdCB3aW5kb3cgPSBucl9wYWdlcyAqIHBzaXplKCk7XG4rXHRjaGFyICp2YWRkcjtcbitcbitcdGlmICgodWludHB0cl90KXN0YXJ0ICUgd2luZG93IHx8IGxlbiAlIHdpbmRvdylcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0Zm9yICh2YWRkciA9IHN0YXJ0OyB2YWRkciBcdTAwM2Mgc3RhcnQgKyBsZW47IHZhZGRyICs9IHdpbmRvdykge1xuK1x0XHR1bnNpZ25lZCBsb25nIHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XG4rXHRcdHVuc2lnbmVkIGxvbmcgaTtcbitcbitcdFx0LyogTm90IHByZXNlbnQsIG9yIG5vdCBtYXBwaW5nIHRoZSBmb2xpbyBoZWFkLiAqL1xuK1x0XHRpZiAocGZuID09IC0xVUwgfHwgcGZuICUgbnJfcGFnZXMpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0XHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XG4rXHRcdFx0aWYgKHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkciArIGkgKiBwc2l6ZSgpKSAhPVxuK1x0XHRcdCAgICBwZm4gKyBpKVxuK1x0XHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHR9XG4rXG4rXHRcdGlmICghaXNfYmFja2VkX2J5X2ZvbGlvKHZhZGRyLCBvcmRlciwgcGFnZW1hcF9mZCxcbitcdFx0XHRcdFx0a3BhZ2VmbGFnc19mZCkpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuKyNkZWZpbmUgVFJBQ0VGU19ST09UIFwiL3N5cy9rZXJuZWwvdHJhY2luZ1wiXG4rXG4rc3RhdGljIGludCB0cmFjaW5nX2V2ZW50c193cml0ZShjb25zdCBjaGFyICpzdWJzeXMsIGNvbnN0IGNoYXIgKnZhbClcbit7XG4rXHRjaGFyIHBhdGhbMjU2XTtcbitcdGludCBmZDtcbitcbitcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgVFJBQ0VGU19ST09UIFwiL2V2ZW50cy8lcy9lbmFibGVcIixcbitcdFx0IHN1YnN5cyk7XG4rXHRmZCA9IG9wZW4ocGF0aCwgT19XUk9OTFkpO1xuK1x0aWYgKGZkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRpZiAod3JpdGUoZmQsIHZhbCwgMSkgIT0gMSkge1xuK1x0XHRjbG9zZShmZCk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiAwO1xuK31cbitcbisvKlxuKyAqIEVuYWJsZSBvbmUgZnRyYWNlIGV2ZW50IHN1YnN5c3RlbSAoZS5nLiBcImh1Z2VfbWVtb3J5XCIpIGFuZCBjbGVhciB0aGVcbisgKiB0cmFjZSBidWZmZXIuIFJldHVybnMgLTEgaWYgdHJhY2VmcyBpcyB1bmF2YWlsYWJsZTsgcGFyc2UgdGhlIHJlc3VsdHNcbisgKiB2aWEgdHJhY2luZ19vcGVuX3RyYWNlKCkgYWZ0ZXIgdHJhY2luZ19ldmVudHNfc3RvcCgpLlxuKyAqL1xuK2ludCB0cmFjaW5nX2V2ZW50c19zdGFydChjb25zdCBjaGFyICpzdWJzeXMpXG4re1xuK1x0aW50IGZkO1xuK1xuK1x0aWYgKHRyYWNpbmdfZXZlbnRzX3dyaXRlKHN1YnN5cywgXCIxXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRmZCA9IG9wZW4oVFJBQ0VGU19ST09UIFwiL3RyYWNlXCIsIE9fV1JPTkxZIHwgT19UUlVOQyk7XG4rXHRpZiAoZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiAwO1xuK31cbitcbitpbnQgdHJhY2luZ19ldmVudHNfc3RvcChjb25zdCBjaGFyICpzdWJzeXMpXG4re1xuK1x0cmV0dXJuIHRyYWNpbmdfZXZlbnRzX3dyaXRlKHN1YnN5cywgXCIwXCIpO1xuK31cbitcbitGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZClcbit7XG4rXHRyZXR1cm4gZm9wZW4oVFJBQ0VGU19ST09UIFwiL3RyYWNlXCIsIFwiclwiKTtcbit9XG4rXG4gLyogSWYgYGlvY3Rscycgbm9uLU5VTEwsIHRoZSBhbGxvd2VkIGlvY3RscyB3aWxsIGJlIHJldHVybmVkIGludG8gdGhlIHZhciAqL1xuIGludCB1ZmZkX3JlZ2lzdGVyX3dpdGhfaW9jdGxzKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sXG4gXHRcdFx0ICAgICAgYm9vbCBtaXNzLCBib29sIHdwLCBib29sIG1pbm9yLCB1aW50NjRfdCAqaW9jdGxzKVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaFxuaW5kZXggNzc5OTE1NGI2N2VlZC4uNGZmNWExYzVhYjhlZCAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXG5AQCAtOTUsNiArOTUsMTAgQEAgYm9vbCBjaGVja19odWdlX2ZpbGUodm9pZCAqYWRkciwgaW50IG5yX2hwYWdlcywgdWludDY0X3QgaHBhZ2Vfc2l6ZSk7XG4gYm9vbCBjaGVja19odWdlX3NobWVtKHZvaWQgKmFkZHIsIGludCBucl9ocGFnZXMsIHVpbnQ2NF90IGhwYWdlX3NpemUpO1xuIGludDY0X3QgYWxsb2NhdGVfdHJhbnNodWdlKHZvaWQgKnB0ciwgaW50IHBhZ2VtYXBfZmQpO1xuIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKTtcbitib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbitcdFx0XHRpbnQga3BhZ2VmbGFnc19mZCk7XG4rYm9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsXG4rXHRcdFx0XHQgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCk7XG4gXG4gaW50IHVmZmRfcmVnaXN0ZXIoaW50IHVmZmQsIHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbixcbiBcdFx0ICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IpO1xuQEAgLTExMSw2ICsxMTUsOSBAQCBpbnQgY2xvc2VfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcCk7XG4gaW50IHdyaXRlX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyB2YWwpO1xuIGludCByZWFkX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyAqdmFsKTtcbiBib29sIHNvZnRkaXJ0eV9zdXBwb3J0ZWQodm9pZCk7XG4raW50IHRyYWNpbmdfZXZlbnRzX3N0YXJ0KGNvbnN0IGNoYXIgKnN1YnN5cyk7XG4raW50IHRyYWNpbmdfZXZlbnRzX3N0b3AoY29uc3QgY2hhciAqc3Vic3lzKTtcbitGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZCk7XG4gXG4gc3RhdGljIGlubGluZSBpbnQgb3Blbl9zZWxmX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXBfb3V0KVxuIHtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTAzVDAxOjAzOjE0Ljc0MzM2NzI1OFoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjg0NjkwMDc0NjIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqV29ydGhGdXp6aW5nPWZhbHNlOiBBIFF1aWNrIFJldmlldyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggc2VyaWVzLCBhbmQgaXQncyBhbGwgYWJvdXQgbW9kaWZ5aW5nIHN0dWZmIHdpdGhpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vYC4gIFJpZ2h0IG9mZiB0aGUgYmF0LCB0aGF0IHNjcmVhbXMgKm5vdCBrZXJuZWwgY29kZSogdG8gbWUsIGJ1dCBJIG5lZWQgdG8gYmUgdGhvcm91Z2guIFRoZXNlIGFyZSB1c2Vyc3BhY2UgdGVzdHMuIEkgYWx3YXlzIHRyaXBsZS1jaGVjay4gVGhlIGluc3RydWN0aW9ucyBhcmUgcHJldHR5IGNsZWFyOiBtb2RpZmljYXRpb25zIHRvIHNlbGZ0ZXN0cyBhbG9uZSBzaG91bGRuJ3QgdHJpZ2dlciBmdXp6aW5nLiBUaGUgcXVlc3Rpb24gaXM6IGRvIHRoZSBpbnN0cnVjdGlvbnMgY2FwdHVyZSB0aGlzP1xuXG5MZXQgbWUgcXVpY2tseSBzY2FuIHRoZSBkaWZmIGFnYWluLiAgTm9wZSwganVzdCBkb3VibGUtY2hlY2tpbmcsIGl0J3MganVzdCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vYC4gVGhlIHNwZWNpZmljIGZpbGVzIGFyZTogYC5naXRpZ25vcmVgLCBgTWFrZWZpbGVgLCBgZm9saW9fb3JkZXJfY2hlY2suY2AsIGBodWdlcGFnZV9zZXR0aW5ncy5jYCBhbmQgYC5oYCwgYGtodWdlcGFnZWQuY2AgYW5kIGBfcmFjZS5jYCBhbmQgYF9zeW5jX2NoZWNrLmNgLCBgcnVuX3ZtdGVzdHMuc2hgLCBgc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY2AsIGB2bV91dGlsLmNgIGFuZCBgLmhgLiBBbGwgY29udGFpbmVkIHdpdGhpbiB0aGUgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2AgZGlyZWN0b3J5LlxuXG5Pa2F5LCBzbyB0aGVyZSdzIG5vIGtlcm5lbCBjb2RlIGJlaW5nIHRvdWNoZWQuICBObyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCwgcGVyaW9kLlxuXG5UaGUgcHJvbXB0IGlzIGNyeXN0YWwgY2xlYXI6IEknbSByZXZpZXdpbmcgcGF0Y2hlcyB0byBzZWUgaWYgdGhleSBmdW5jdGlvbmFsbHkgY2hhbmdlIHRoZSBrZXJuZWwgaW4gYSB3YXkgdGhhdCB3YXJyYW50cyBmdXp6aW5nLiBTaW5jZSB0aGlzIGlzICpvbmx5KiBtb2RpZnlpbmcgdXNlcnNwYWNlIHNlbGZ0ZXN0cywgdGhlIGFuc3dlciBpcyBhIHJlc291bmRpbmcgKm5vKi4gIEknbSByZXR1cm5pbmcgYFdvcnRoRnV6emluZz1mYWxzZWAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI0ODM1LCJPdXRwdXRUb2tlbnMiOjY0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Njk5LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDNUMDE6MDM6MjMuMjEyMzc3NDFaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3NDYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlcnNwYWNlIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vKikgYW5kIGRvZXMgbm90IG1ha2UgYW55IGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIGl0c2VsZi5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlcnNwYWNlIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vKikgYW5kIGRvZXMgbm90IG1ha2UgYW55IGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIGl0c2VsZi5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowgxx9r[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-03 00:48:27 +0000 UTC FinishedAt: 2026-08-03 01:03:24 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzAzIDAxOjAzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlcnNwYWNlIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vKikgYW5kIGRvZXMgbm90IG1ha2UgYW55IGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIGl0c2VsZi4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDMgMDE6MDM8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCAzZmE0MDMyNGM5MTFjZGQ5ZjQzNTI2NmQzZWNlZWE2YjUyZWY3MWM2XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBBdWcgMyAwMTowMzoxMyAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8uZ2l0aWdub3JlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLmdpdGlnbm9yZVxuaW5kZXggOWNjZDllMTQ0N2U2Ni4uNjE2MDQzYTBmY2QyMiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy5naXRpZ25vcmVcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy5naXRpZ25vcmVcbkBAIC02NiwzICYjNDM7NjYsNiBAQCBtZXJnZVxuIHByY3RsX3RocF9kaXNhYmxlXG4gcm1hcFxuIGZvbGlvX3NwbGl0X3JhY2VfdGVzdFxuJiM0Mztmb2xpb19vcmRlcl9jaGVja1xuJiM0MztraHVnZXBhZ2VkX3N5bmNfY2hlY2tcbiYjNDM7a2h1Z2VwYWdlZF9yYWNlXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuaW5kZXggMjVkMTBjZWQzYjNiOS4uMDI2ZDRiNjE0MTRkNCAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuQEAgLTEwNCw2ICYjNDM7MTA0LDkgQEAgVEVTVF9HRU5fRklMRVMgJiM0Mzs9IGd1YXJkLXJlZ2lvbnNcbiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gbWVyZ2VcbiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gcm1hcFxuIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBmb2xpb19zcGxpdF9yYWNlX3Rlc3RcbiYjNDM7VEVTVF9HRU5fRklMRVMgJiM0Mzs9IGZvbGlvX29yZGVyX2NoZWNrXG4mIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBraHVnZXBhZ2VkX3N5bmNfY2hlY2tcbiYjNDM7VEVTVF9HRU5fRklMRVMgJiM0Mzs9IGtodWdlcGFnZWRfcmFjZVxuIFxuIGlmbmVxICgkKEFSQ0gpLGFybTY0KVxuIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBzb2Z0LWRpcnR5XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5mNzBkNzY2ZmYzZWIzXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jXG5AQCAtMCwwICYjNDM7MSwxMzggQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LypcbiYjNDM7ICogU2VsZi1jaGVjayBmb3IgdGhlIHZtX3V0aWwgZm9saW8tb3JkZXIgZGV0ZWN0aW9uIGhlbHBlcnMsXG4mIzQzOyAqIGlzX2JhY2tlZF9ieV9mb2xpbygpIGFuZCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKCkuXG4mIzQzOyAqXG4mIzQzOyAqIEZvciBldmVyeSBhbm9uIFRIUCBvcmRlciB0aGUga2VybmVsIHN1cHBvcnRzLCBmYXVsdCBtZW1vcnkgaW4gd2l0aCBvbmx5XG4mIzQzOyAqIHRoYXQgb3JkZXIgZW5hYmxlZCBhbmQgdmVyaWZ5IHRoZSBoZWxwZXJzIHJlcG9ydCBleGFjdGx5IHRoYXQgb3JkZXI6XG4mIzQzOyAqIG5vdCBhIG5laWdoYm91cmluZyBvcmRlciwgYW5kIHBsYWluIDRLIG1lbW9yeSBhcyBvcmRlciAwLiBUaGUgaGVscGVyc1xuJiM0MzsgKiBhcmUgd2hhdCB0aGUga2h1Z2VwYWdlZCBtVEhQIHRlc3RzIHVzZSB0byBkZXRlY3QgY29sbGFwc2UgcmVzdWx0cywgc29cbiYjNDM7ICogdGhleSBtdXN0IGFncmVlIHdpdGggdGhlIGtlcm5lbCYjMzk7cyBvd24gaWRlYSBvZiB0aGUgYmFja2luZyBiZWZvcmUgYW55XG4mIzQzOyAqIGNvbGxhcHNlIHRlc3QgcmVsaWVzIG9uIHRoZW0uXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtrc2VsZnRlc3QuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt2bV91dGlsLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7aHVnZXBhZ2Vfc2V0dGluZ3MuaFwmIzM0O1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBwYWdlbWFwX2ZkO1xuJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQ7XG4mIzQzO1xuJiM0MzsvKiBtbWFwIGFuIGFub24gVk1BIG9mIGV4YWN0bHkgQHNpemUgYnl0ZXMgYXQgYSBAc2l6ZS1hbGlnbmVkIGFkZHJlc3MuICovXG4mIzQzO3N0YXRpYyBjaGFyICphbGxvY19hbGlnbmVkKHNpemVfdCBzaXplKVxuJiM0Mzt7XG4mIzQzO1x0c2l6ZV90IGxlbiA9IHNpemUgKiAyO1xuJiM0MztcdHVpbnRwdHJfdCBhbGlnbmVkO1xuJiM0MztcdGNoYXIgKnA7XG4mIzQzO1xuJiM0MztcdHAgPSBtbWFwKE5VTEwsIGxlbiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbiYjNDM7XHRcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTtcbiYjNDM7XHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21tYXAoKVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGFsaWduZWQgPSAoKHVpbnRwdHJfdClwICYjNDM7IHNpemUgLSAxKSBcdTAwMjYgfihzaXplIC0gMSk7XG4mIzQzO1x0aWYgKGFsaWduZWQgIT0gKHVpbnRwdHJfdClwKVxuJiM0MztcdFx0bXVubWFwKHAsIGFsaWduZWQgLSAodWludHB0cl90KXApO1xuJiM0MztcdGlmIChhbGlnbmVkICYjNDM7IHNpemUgIT0gKHVpbnRwdHJfdClwICYjNDM7IGxlbilcbiYjNDM7XHRcdG11bm1hcCgoY2hhciAqKWFsaWduZWQgJiM0Mzsgc2l6ZSxcbiYjNDM7XHRcdCAgICAgICAodWludHB0cl90KXAgJiM0MzsgbGVuIC0gYWxpZ25lZCAtIHNpemUpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gKGNoYXIgKilhbGlnbmVkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBFbmFibGUgb25seSBAb3JkZXIgKG9yZGVyIDA6IG5vdGhpbmcpLCBmYXVsdCBvbmUgYWxpZ25lZCB3aW5kb3cgaW4gYW5kXG4mIzQzOyAqIGNoZWNrIHRoZSBoZWxwZXJzIHNlZSBleGFjdGx5IEBvcmRlci5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIGNoZWNrX29yZGVyKGludCBvcmRlcilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbiYjNDM7XHRzaXplX3Qgc2l6ZSA9IHBzaXplKCkgXHUwMDNjXHUwMDNjIG9yZGVyO1xuJiM0MztcdGJvb2wgb2sgPSB0cnVlO1xuJiM0MztcdGNoYXIgKnA7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5SX09SREVSUzsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9ORVZFUjtcbiYjNDM7XHRpZiAob3JkZXIpXG4mIzQzO1x0XHRzZXR0aW5ncy5odWdlcGFnZXNbb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTO1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0cCA9IGFsbG9jX2FsaWduZWQoc2l6ZSk7XG4mIzQzO1x0KnAgPSAxO1xuJiM0MztcbiYjNDM7XHRpZiAoIWlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgb3JkZXIsXG4mIzQzO1x0XHRcdFx0XHQgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtvcmRlciAlZCBub3QgZGV0ZWN0ZWQgYWZ0ZXIgZmF1bHRcXG5cJiMzNDssIG9yZGVyKTtcbiYjNDM7XHRcdG9rID0gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBBIGxvd2VyIG9yZGVyIG11c3QgYmUgcmVqZWN0ZWQ6IHRoZSBmb2xpbyBpcyBsYXJnZXIuICovXG4mIzQzO1x0aWYgKG9yZGVyIFx1MDAyNlx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIG9yZGVyIC0gMSxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICBwYWdlbWFwX2ZkLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgIGtwYWdlZmxhZ3NfZmQpKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyICVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgICAgb3JkZXIsIG9yZGVyIC0gMSk7XG4mIzQzO1x0XHRvayA9IGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogT3JkZXIgMCBwYWdlcyBtdXN0IG5vdCBsb29rIGxpa2UgYW55IGxhcmdlIGZvbGlvLCBhbmQgdmljZSB2ZXJzYS4gKi9cbiYjNDM7XHRpZiAob3JkZXIgXHUwMDI2XHUwMDI2IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgMCxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICBwYWdlbWFwX2ZkLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgIGtwYWdlZmxhZ3NfZmQpKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyIDBcXG5cJiMzNDssIG9yZGVyKTtcbiYjNDM7XHRcdG9rID0gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRtdW5tYXAocCwgc2l6ZSk7XG4mIzQzO1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3Rlc3RfcmVzdWx0KG9rLCBcJiMzNDtvcmRlciAlZCBjbGFzc2lmaWVkXFxuXCYjMzQ7LCBvcmRlcik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBtYWluKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgb3JkZXJzO1xuJiM0MztcdGludCBvcmRlcjtcbiYjNDM7XG4mIzQzO1x0a3NmdF9wcmludF9oZWFkZXIoKTtcbiYjNDM7XG4mIzQzO1x0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHBhZ2VtYXBfZmQgPSBvcGVuKFwmIzM0Oy9wcm9jL3NlbGYvcGFnZW1hcFwmIzM0OywgT19SRE9OTFkpO1xuJiM0MztcdGlmIChwYWdlbWFwX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O29wZW4oXFxcJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXBcXFwmIzM0OylcJiMzNDspO1xuJiM0MztcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwmIzM0Oy9wcm9jL2twYWdlZmxhZ3NcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRpZiAoa3BhZ2VmbGFnc19mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O29wZW4oXFxcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXFxcJiMzNDspIHJlcXVpcmVzIHJvb3RcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpO1xuJiM0MztcdGlmICghb3JkZXJzKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7Tm8gc3VwcG9ydGVkIFRIUCBvcmRlcnNcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3NldF9wbGFuKF9fYnVpbHRpbl9wb3Bjb3VudGwob3JkZXJzKSAmIzQzOyAxKTtcbiYjNDM7XG4mIzQzO1x0dGhwX3NhdmVfc2V0dGluZ3MoKTtcbiYjNDM7XHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1x0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqL1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0Y2hlY2tfb3JkZXIoMCk7XG4mIzQzO1x0Zm9yIChvcmRlciA9IDE7IG9yZGVyIFx1MDAzYyBOUl9PUkRFUlM7IG9yZGVyJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKCEob3JkZXJzIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBvcmRlcikpKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdGNoZWNrX29yZGVyKG9yZGVyKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHRocF9yZXN0b3JlX3NldHRpbmdzKCk7XG4mIzQzO1xuJiM0MztcdGtzZnRfZmluaXNoZWQoKTtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jXG5pbmRleCBkNzkxN2RjZTNhYmFjLi5hMjZhMGNmZmE5YzViIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuQEAgLTE4Myw2ICYjNDM7MTgzLDE3IEBAIHZvaWQgdGhwX3JlYWRfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHR9XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBXcml0ZSBvbmx5IG9uIGNoYW5nZTogYW55IHN0b3JlIHRvIGEga2h1Z2VwYWdlZCBzeXNmcyBrbm9iIHdha2VzIHRoZVxuJiM0MzsgKiBkYWVtb24sIGFuZCBzZXR0aW5ncyBwdXNoZXMvcG9wcyBtdXN0IG5vdCBzdGFydCBzY2FuIHBhc3NlcyBub2JvZHlcbiYjNDM7ICogYXNrZWQgZm9yIOKAlCBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIGlzIHRoZSBvbmx5IHNhbmN0aW9uZWQgd2FrZS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIHRocF91cGRhdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHRocF9yZWFkX251bShuYW1lKSAhPSBudW0pXG4mIzQzO1x0XHR0aHBfd3JpdGVfbnVtKG5hbWUsIG51bSk7XG4mIzQzO31cbiYjNDM7XG4gdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4ge1xuIFx0c3RydWN0IGtodWdlcGFnZWRfc2V0dGluZ3MgKmtodWdlcGFnZWQgPSBcdTAwMjZzZXR0aW5ncy1cdTAwM2VraHVnZXBhZ2VkO1xuQEAgLTE5OCwxNSAmIzQzOzIwOSwxNSBAQCB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcbiBcdFx0XHRzaG1lbV9lbmFibGVkX3N0cmluZ3Nbc2V0dGluZ3MtXHUwMDNlc2htZW1fZW5hYmxlZF0pO1xuIFx0dGhwX3dyaXRlX251bShcJiMzNDt1c2VfemVyb19wYWdlXCYjMzQ7LCBzZXR0aW5ncy1cdTAwM2V1c2VfemVyb19wYWdlKTtcbiBcbi1cdHRocF93cml0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9kZWZyYWdcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlZGVmcmFnKTtcbi1cdHRocF93cml0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9hbGxvY19zbGVlcF9taWxsaXNlY3NcJiMzNDssXG4tXHRcdFx0a2h1Z2VwYWdlZC1cdTAwM2VhbGxvY19zbGVlcF9taWxsaXNlY3MpO1xuLVx0dGhwX3dyaXRlX251bShcJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXCYjMzQ7LFxuLVx0XHRcdGtodWdlcGFnZWQtXHUwMDNlc2Nhbl9zbGVlcF9taWxsaXNlY3MpO1xuLVx0dGhwX3dyaXRlX251bShcJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX25vbmVcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfbm9uZSk7XG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfc3dhcFwmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19zd2FwKTtcbi1cdHRocF93cml0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zaGFyZWRcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc2hhcmVkKTtcbi1cdHRocF93cml0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9wYWdlc190b19zY2FuXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZXBhZ2VzX3RvX3NjYW4pO1xuJiM0MztcdHRocF91cGRhdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvZGVmcmFnXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZWRlZnJhZyk7XG4mIzQzO1x0dGhwX3VwZGF0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9hbGxvY19zbGVlcF9taWxsaXNlY3NcJiMzNDssXG4mIzQzO1x0XHQgICAgICAga2h1Z2VwYWdlZC1cdTAwM2VhbGxvY19zbGVlcF9taWxsaXNlY3MpO1xuJiM0MztcdHRocF91cGRhdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcJiMzNDssXG4mIzQzO1x0XHQgICAgICAga2h1Z2VwYWdlZC1cdTAwM2VzY2FuX3NsZWVwX21pbGxpc2Vjcyk7XG4mIzQzO1x0dGhwX3VwZGF0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX25vbmUpO1xuJiM0MztcdHRocF91cGRhdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfc3dhcFwmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19zd2FwKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3NoYXJlZFwmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19zaGFyZWQpO1xuJiM0MztcdHRocF91cGRhdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvcGFnZXNfdG9fc2NhblwmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VwYWdlc190b19zY2FuKTtcbiBcbiBcdGlmIChkZXZfcXVldWVfcmVhZF9haGVhZF9wYXRoWzBdKVxuIFx0XHR3cml0ZV9udW0oZGV2X3F1ZXVlX3JlYWRfYWhlYWRfcGF0aCwgc2V0dGluZ3MtXHUwMDNlcmVhZF9haGVhZF9rYik7XG5AQCAtMjMwLDYgJiM0MzsyNDEsNDMgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHR9XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBDb21wbGV0aW9uIGJhcnJpZXIgZm9yIGtodWdlcGFnZWQ6IHdhaXQgdW50aWwgYSBmdWxsIHNjYW4gcGFzcyB0aGF0XG4mIzQzOyAqIHN0YXJ0ZWQgYWZ0ZXIgdGhpcyBjYWxsIGhhcyBmaW5pc2hlZC4gZnVsbF9zY2FucyBtdXN0IGFkdmFuY2UgYnkgdHdvO1xuJiM0MzsgKiBhICYjNDM7MSBzdGVwIG1heSBjb21wbGV0ZSBhIHBhc3MgdGhhdCBleGFtaW5lZCB0aGlzIG1tIGJlZm9yZSB0aGVcbiYjNDM7ICogY2FsbGVyJiMzOTtzIHNldHVwIHdhcyBpbiBwbGFjZS5cbiYjNDM7ICpcbiYjNDM7ICogQW55IHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIHNvIHRoZSBiYXJyaWVyXG4mIzQzOyAqIHdvcmtzIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbmZpZ3VyZWQgc2NhbiBjYWRlbmNlLiBJdCB3YWtlcyBleGFjdGx5XG4mIzQzOyAqIG9uY2UgcGVyIG1pc3NpbmcgcGFzcyDigJQgb3Zlci13YWtpbmcgd291bGQgcXVldWUgYSBzdHJhZ2dsZXIgcGFzc1xuJiM0MzsgKiBiZWhpbmQgdGhlIGJhcnJpZXIsIHBlcnR1cmJpbmcgd2hhdGV2ZXIgdGhlIGNhbGxlciBzZXRzIHVwIG5leHQuXG4mIzQzOyAqIE9uZSB3YWtlIGNvbXBsZXRlcyBvbmUgZnVsbCBwYXNzIG9ubHkgaWYgdGhlIHdob2xlIG1tIGxpc3QgZml0cyBpblxuJiM0MzsgKiBvbmUgc2NhbiBiYXRjaCwgc28gY2FsbGVycyBtdXN0IHBhaXIgdGhpcyB3aXRoIGEgbGFyZ2VcbiYjNDM7ICogcGFnZXNfdG9fc2Nhbi5cbiYjNDM7ICovXG4mIzQzO2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZGVhZGxpbmVfbXMgPSB0aW1lb3V0X3MgKiAxMDAwVUw7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzbGVlcF9tcyA9XG4mIzQzO1x0XHR0aHBfcmVhZF9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1wmIzM0Oyk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBlbGFwc2VkX21zID0gMDtcbiYjNDM7XHRpbnQgcGFzcztcbiYjNDM7XG4mIzQzO1x0Zm9yIChwYXNzID0gMDsgcGFzcyBcdTAwM2MgMjsgcGFzcyYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgdGFyZ2V0ID1cbiYjNDM7XHRcdFx0dGhwX3JlYWRfbnVtKFwmIzM0O2todWdlcGFnZWQvZnVsbF9zY2Fuc1wmIzM0OykgJiM0MzsgMTtcbiYjNDM7XG4mIzQzO1x0XHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcJiMzNDssIHNsZWVwX21zKTtcbiYjNDM7XHRcdHdoaWxlICh0aHBfcmVhZF9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9mdWxsX3NjYW5zXCYjMzQ7KSBcdTAwM2MgdGFyZ2V0KSB7XG4mIzQzO1x0XHRcdGlmIChlbGFwc2VkX21zIFx1MDAzZT0gZGVhZGxpbmVfbXMpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0XHR1c2xlZXAoMTAgKiAxMDAwKTtcbiYjNDM7XHRcdFx0ZWxhcHNlZF9tcyAmIzQzOz0gMTA7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuIHN0cnVjdCB0aHBfc2V0dGluZ3MgKnRocF9jdXJyZW50X3NldHRpbmdzKHZvaWQpXG4ge1xuIFx0aWYgKCFzZXR0aW5nc19pbmRleCkge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXG5pbmRleCA3MjZjNzNjNDNjMDViLi44ZGU0NDZhZmZlZWNkIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxuQEAgLTgzLDYgJiM0Mzs4Myw4IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCB0aHBfc2F2ZV9zZXR0aW5ncyh2b2lkKVxuIFx0aHVnZXBhZ2Vfc2F2ZV9zZXR0aW5ncygvKiB0aHAgPSAqLyB0cnVlLCAvKiBodWdldGxiID0gKi8gZmFsc2UpO1xuIH1cbiBcbiYjNDM7Ym9vbCBraHVnZXBhZ2VkX2Z1bGxfcGFzcyh1bnNpZ25lZCBpbnQgdGltZW91dF9zKTtcbiYjNDM7XG4gdm9pZCB0aHBfc2V0X3JlYWRfYWhlYWRfcGF0aChjaGFyICpwYXRoKTtcbiB1bnNpZ25lZCBsb25nIHRocF9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpO1xuIHVuc2lnbmVkIGxvbmcgdGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG5pbmRleCAxMGU4ZGVkY2IwODdkLi5jNWEzYzM5MjI1ODE5IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmNcbkBAIC0yNiw5ICYjNDM7MjYsMTMgQEBcbiBcbiAjZGVmaW5lIEJBU0VfQUREUiAoKHZvaWQgKikoMVVMIFx1MDAzY1x1MDAzYyAzMCkpXG4gc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XG4mIzQzO3N0YXRpYyBpbnQgaHBhZ2VfcG1kX29yZGVyO1xuIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTtcbiBzdGF0aWMgaW50IGhwYWdlX3BtZF9ucjtcbiBzdGF0aWMgaW50IGFub25fb3JkZXI7XG4mIzQzO3N0YXRpYyBpbnQgYW5vbl90YXJnZXRfb3JkZXI7XG4mIzQzO3N0YXRpYyBpbnQgcGFnZW1hcF9mZCA9IC0xO1xuJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQgPSAtMTtcbiBcbiAjZGVmaW5lIFBJRF9TTUFQUyBcJiMzNDsvcHJvYy9zZWxmL3NtYXBzXCYjMzQ7XG4gI2RlZmluZSBURVNUX0ZJTEUgXCYjMzQ7Y29sbGFwc2VfdGVzdF9maWxlXCYjMzQ7XG5AQCAtMTc3LDYgJiM0MzsxODEsMjEgQEAgc3RhdGljIHZvaWQgZ2V0X2ZpbmZvKGNvbnN0IGNoYXIgKmRpcilcbiBcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDslczogQ291bGQgbm90IHJlYWQ6ICVzXFxuXCYjMzQ7LCBfX2Z1bmNfXywgcGF0aCk7XG4gfVxuIFxuJiM0MztzdGF0aWMgYm9vbCBoYXNfc3dhcCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0RklMRSAqZnAgPSBmb3BlbihcJiMzNDsvcHJvYy9zd2Fwc1wmIzM0OywgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO1x0Y2hhciBsaW5lW01BWF9MSU5FX0xFTkdUSF07XG4mIzQzO1x0Ym9vbCByZXQgPSBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFmcClcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHQvKiBGaXJzdCBsaW5lIGlzIHRoZSBoZWFkZXI7IGFueSBmb2xsb3dpbmcgbGluZSBpcyBhIHN3YXAgYXJlYS4gKi9cbiYjNDM7XHRpZiAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkgXHUwMDI2XHUwMDI2IGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKVxuJiM0MztcdFx0cmV0ID0gdHJ1ZTtcbiYjNDM7XHRmY2xvc2UoZnApO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIGJvb2wgY2hlY2tfc3dhcCh2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpXG4ge1xuIFx0Ym9vbCBzd2FwID0gZmFsc2U7XG5AQCAtNTU0LDggJiM0Mzs1NzMsMTcgQEAgc3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsXG4gc3RhdGljIGJvb2wgd2FpdF9mb3Jfc2Nhbihjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsXG4gXHRcdFx0ICBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuIHtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSBidWRnZXQgaGFzIHRvIGNvdmVyIGtodWdlcGFnZWQgY29weWluZyBucl9ocGFnZXMgKlxuJiM0MztcdCAqIGhwYWdlX3BtZF9zaXplLCBwbHVzIHR3byBvZiBpdHMgcGFzc2VzIG92ZXIgdGhlIG1tLiBUaHJlZSBzZWNvbmRzXG4mIzQzO1x0ICogZG9lcyB0aGF0IGF0IGEgMk0gUE1ELCBidXQgdGhlIHNhbWUgdGVzdCBtb3ZlcyAyRyBhdCBhIDUxMk0gUE1EXG4mIzQzO1x0ICogKGFybTY0IHdpdGggNjRLIGJhc2UgcGFnZXMpIGFuZCAzcyBpcyB0aGVuIG1hcmdpbmFsOiBpdCBmYWlscyBvbiBhXG4mIzQzO1x0ICogY29sbGFwc2UgdGhhdCBjb21wbGV0ZXMgY29ycmVjdGx5LCBqdXN0IG5vdCBpbnNpZGUgdGhlIGJ1ZGdldC5cbiYjNDM7XHQgKiBBbGxvdyBhIGZ1cnRoZXIgc2Vjb25kIHBlciA2NE0gdG8gY29sbGFwc2UuXG4mIzQzO1x0ICovXG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBieXRlcyA9ICh1bnNpZ25lZCBsb25nKW5yX2hwYWdlcyAqIGhwYWdlX3BtZF9zaXplO1xuJiM0MztcdGludCB0aW1lb3V0ID0gNiAmIzQzOyAyICogKGJ5dGVzIC8gKDY0VUwgXHUwMDNjXHUwMDNjIDIwKSk7XG4gXHRpbnQgZnVsbF9zY2Fucztcbi1cdGludCB0aW1lb3V0ID0gNjsgLyogMyBzZWNvbmRzICovXG4gXG4gXHQvKiBTYW5pdHkgY2hlY2sgKi9cbiBcdGlmICghb3BzLVx1MDAzZWNoZWNrX2h1Z2UocCwgMCkpXG5AQCAtNzM1LDYgJiM0Mzs3NjMsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2Vfc3dhcGluX3NpbmdsZV9wdGUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BcbiBcdHZvaWQgKnA7XG4gXG4gXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4mIzQzO1x0aWYgKCFoYXNfc3dhcCgpKSB7XG4mIzQzO1x0XHRza2lwKFwmIzM0O1NraXAgKG5vIHN3YXAgY29uZmlndXJlZClcJiMzNDspO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuIFx0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiBcbiBcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1N3YXBvdXQgb25lIHBhZ2UuLi5cJiMzNDspO1xuQEAgLTc2MSw2ICYjNDM7NzkzLDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3N3YXAoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvXG4gXHR2b2lkICpwO1xuIFxuIFx0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdGlmICghaGFzX3N3YXAoKSkge1xuJiM0MztcdFx0c2tpcChcJiMzNDtTa2lwIChubyBzd2FwIGNvbmZpZ3VyZWQpXCYjMzQ7KTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiBcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4gXG4gXHRrc2Z0X3ByaW50X21zZyhcJiMzNDtTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uXCYjMzQ7LCBtYXhfcHRlc19zd2FwICYjNDM7IDEsIGhwYWdlX3BtZF9ucik7XG5AQCAtODUzLDYgJiM0Mzs4ODksMjEgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfY29tcG91bmRfZXh0cmVtZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHNcbiBcdHZvaWQgKnA7XG4gXHRpbnQgaTtcbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEJ1aWxkcyBhIFBNRCYjMzk7cyB3b3J0aCBvZiBkaXN0aW5jdCBQVEUtbWFwcGVkIGNvbXBvdW5kIHBhZ2VzIGJ5IGN5Y2xpbmdcbiYjNDM7XHQgKiBocGFnZV9wbWRfbnIgZmF1bHQtdGltZSBUSFBzIHRocm91Z2ggbXJlbWFwLiBGYXVsdC10aW1lIFRIUCBhbGxvY2F0aW9uXG4mIzQzO1x0ICogaXMgYmVzdC1lZmZvcnQsIGFuZCB0aGlzIG5lZWRzIGhwYWdlX3BtZF9uciBQTUQtb3JkZXIgcGFnZXMgaW4gYSByb3c6XG4mIzQzO1x0ICogZmluZSBhdCBhIDJNICg0SyBiYXNlKSBvciAzMk0gKDE2SyBiYXNlKSBQTUQsIGJ1dCBhIDUxMk0gUE1EIChhcm02NC82NEspXG4mIzQzO1x0ICogaXMgYW4gb3JkZXItMTMgYWxsb2NhdGlvbiB0aGUgYWxsb2NhdG9yIGNhbm5vdCByZWxpYWJseSBoYW5kIG91dCBldmVuXG4mIzQzO1x0ICogb25jZSwgbGV0IGFsb25lIDgxOTIgdGltZXMuIENhcCBhdCBhIDMyTSBQTUQ7IE1BRFZfQ09MTEFQU0UtZHJpdmVuIGNhc2VzXG4mIzQzO1x0ICogc3RpbGwgY292ZXIgUE1ELW9yZGVyIGNvbGxhcHNlIG9uIHRoZSBsYXJnZXIgY29uZmlncy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoaHBhZ2VfcG1kX3NpemUgXHUwMDNlICgzMlVMIFx1MDAzY1x1MDAzYyAyMCkpIHtcbiYjNDM7XHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcJiMzNDslczogUE1EIHRvbyBsYXJnZSBmb3IgZmF1bHQtdGltZSBUSFAgY29uc3RydWN0aW9uXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgIF9fZnVuY19fKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuIFx0a3NmdF9wcmludF9tc2coXCYjMzQ7Q29uc3RydWN0IFBURSBwYWdlIHRhYmxlIGZ1bGwgb2YgZGlmZmVyZW50IFBURS1tYXBwZWQgY29tcG91bmQgcGFnZXNcXG5cJiMzNDspO1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgaHBhZ2VfcG1kX25yOyBpJiM0MzsmIzQzOykge1xuQEAgLTEwNDMsNiAmIzQzOzEwOTQsNjEgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wc1xuIFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBDb250ZW50IHN0YXlzIGlzb2xhdGVkIHdoaWxlIGEgY28tc2hhcmVyIHdyaXRlcyBjb25jdXJyZW50bHkuIEEgc2hhcmVkXG4mIzQzOyAqIHNvdXJjZSBpcyBjb3BpZWQgbGl2ZSAobm90IGZyb3plbiksIHJlbHlpbmcgb24gaXQgYmVpbmcgQ29XIC0gaW1tdXRhYmxlXG4mIzQzOyAqIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGNvcHk7IGEgY28tc2hhcmVyJiMzOTtzIHdyaXRlIGdvZXMgdG8gYSBDb1cgY29weS4gVGhlXG4mIzQzOyAqIGNvbGxhcHNpbmcgY2hpbGQgbXVzdCBzZWUgdGhlIHByZS1mb3JrIGNvbnRlbnQsIHRoZSB3cml0aW5nIHBhcmVudCBvbmx5XG4mIzQzOyAqIGl0cyBvd24gd3JpdGVzLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2VfZm9ya19jb3dfcmFjZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9wcylcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHVuc2lnbmVkIGxvbmcgc2hhcmVkID0gNjQgKiBwYWdlX3NpemU7XG4mIzQzO1x0Y29uc3QgaW50IHN0cmlkZSA9IHBhZ2Vfc2l6ZSAvIHNpemVvZihpbnQpO1xuJiM0MztcdGludCB3c3RhdHVzLCBpLCBuID0gc2hhcmVkIC8gcGFnZV9zaXplO1xuJiM0MztcdGludCAqaXA7XG4mIzQzO1x0dm9pZCAqcDtcbiYjNDM7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdGlwID0gcDtcbiYjNDM7XHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgc2hhcmVkKTtcdFx0Lyogc2hhcmVkIHByZWZpeCwgcHJlLWZvcmsgcGF0dGVybiAqL1xuJiM0MztcbiYjNDM7XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtGb3JrLCBjb2xsYXBzZSBpbiB0aGUgY2hpbGQgd2hpbGUgdGhlIHBhcmVudCByZXdyaXRlcy4uLlwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFmb3JrKCkpIHtcbiYjNDM7XHRcdG9wcy1cdTAwM2VmYXVsdChwLCBzaGFyZWQsIGhwYWdlX3BtZF9zaXplKTtcdC8qIHByaXZhdGUgcmVtYWluZGVyICovXG4mIzQzO1x0XHRjLVx1MDAzZWNvbGxhcHNlKFwmIzM0O0NvbGxhcHNlIGEgcmFuZ2Ugc2hhcmVkIHdpdGggYSB3cml0aW5nIGNvLXNoYXJlclwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgIHAsIDEsIG9wcywgdHJ1ZSk7XG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgJiM0MzsgMHhkZWFkMDAwMCkge1xuJiM0MztcdFx0XHRcdGZhaWwoXCYjMzQ7RmFpbDogY2hpbGQgY29udGVudFwmIzM0Oyk7XG4mIzQzO1x0XHRcdFx0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0XHRcdFx0X2V4aXQoZXhpdF9zdGF0dXMpO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRzdWNjZXNzKFwmIzM0O09LXCYjMzQ7KTtcbiYjNDM7XHRcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdFx0X2V4aXQoZXhpdF9zdGF0dXMpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogSGFtbWVyIHRoZSBwYXJlbnQmIzM5O3Mgb3duIHdyaXRlcyBvdmVyIHRoZSBzaGFyZWQgcHJlZml4LiAqL1xuJiM0MztcdGZvciAoaW50IGl0ID0gMDsgaXQgXHUwMDNjIDIwMDAwMDsgaXQmIzQzOyYjNDM7KVxuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbjsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdGlwW2kgKiBzdHJpZGVdID0gaSAmIzQzOyAweGJlZWYwMDAwO1xuJiM0MztcbiYjNDM7XHR3YWl0KFx1MDAyNndzdGF0dXMpO1xuJiM0MztcdGV4aXRfc3RhdHVzID0gV0VYSVRTVEFUVVMod3N0YXR1cyk7XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NoZWNrIHRoZSBwYXJlbnQgc2VlcyBvbmx5IGl0cyBvd24gd3JpdGVzLi4uXCYjMzQ7KTtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdGlmIChpcFtpICogc3RyaWRlXSAhPSBpICYjNDM7IDB4YmVlZjAwMDApXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdGlmIChpID09IG4pXG4mIzQzO1x0XHRzdWNjZXNzKFwmIzM0O09LXCYjMzQ7KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRmYWlsKFwmIzM0O0ZhaWw6IHBhcmVudCBjb250ZW50XCYjMzQ7KTtcbiYjNDM7XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCYjMzQ7JXNcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgdm9pZCBtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4gXHRcdFx0XHRcdCAgIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4ge1xuQEAgLTEwODgsNiAmIzQzOzExOTQsMjIyIEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfcmV0cmFjdGVkX3BhZ2VfdGFibGVzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuIFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBPcmRlci1wYXJhbWV0ZXJpemVkIGNvbGxhcHNlIGNhc2VzICgtbyBcdTAwM2NvcmRlclx1MDAzZSk6IGtodWdlcGFnZWQgY29sbGFwc2VzXG4mIzQzOyAqIDRLLWZhdWx0ZWQgbWVtb3J5IGludG8gZm9saW9zIG9mIHRoZSBnaXZlbiBzdWItUE1EIG9yZGVyLiBEZXRlY3Rpb24gaXNcbiYjNDM7ICogZm9saW8tYmFzZWQgKHZtX3V0aWwpLCBub3Qgc21hcHM6IEFub25IdWdlUGFnZXMgb25seSBhY2NvdW50cyBQTURcbiYjNDM7ICogbWFwcGluZ3MuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSByZWdpb24gaXMgZmF1bHRlZCBiZWZvcmUgTUFEVl9IVUdFUEFHRSBhbmQgdGhlIHRhcmdldCBvcmRlciBpc1xuJiM0MzsgKiBjb25maWd1cmVkIFwmIzM0O2luaGVyaXRcJiMzNDsgdW5kZXIgZW5hYmxlZD1tYWR2aXNlLCBzbyBmYXVsdHMgYXJlIGFsd2F5c1xuJiM0MzsgKiBvcmRlciAwIGFuZCB0aGUgY29sbGFwc2UgcHJvZHVjdCBjYW4gb25seSBjb21lIGZyb20ga2h1Z2VwYWdlZC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBzaXplX3QgYW5vbl9vcmRlcl9zaXplKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcGFnZV9zaXplIFx1MDAzY1x1MDAzYyBhbm9uX3RhcmdldF9vcmRlcjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgcmFuZ2VfY29sbGFwc2VkKHZvaWQgKnAsIHNpemVfdCBsZW4pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBsZW4sIGFub25fdGFyZ2V0X29yZGVyLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBObyBhbGlnbmVkIHdpbmRvdyBpbiBbcCwgcCAmIzQzOyBsZW4pIGlzIGJhY2tlZCBhdCB0aGUgdGFyZ2V0IG9yZGVyLiAqL1xuJiM0MztzdGF0aWMgYm9vbCByYW5nZV9ub3RfY29sbGFwc2VkKHZvaWQgKnAsIHNpemVfdCBsZW4pXG4mIzQzO3tcbiYjNDM7XHRzaXplX3Qgd2luZG93ID0gYW5vbl9vcmRlcl9zaXplKCk7XG4mIzQzO1x0Y2hhciAqYWRkciA9IHA7XG4mIzQzO1xuJiM0MztcdGZvciAoOyBsZW4gXHUwMDNlPSB3aW5kb3c7IGFkZHIgJiM0Mzs9IHdpbmRvdywgbGVuIC09IHdpbmRvdykge1xuJiM0MztcdFx0aWYgKHJhbmdlX2NvbGxhcHNlZChhZGRyLCB3aW5kb3cpKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHQvKiBXYWl0IHVwIHRvIDMwIHNlY29uZHMgZm9yIHRoZSBwYXNzIHRvIGNvbXBsZXRlLiAqL1xuJiM0MztcdHJldHVybiBraHVnZXBhZ2VkX2Z1bGxfcGFzcygzMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIENhc2VzIHdob3NlIGdlb21ldHJ5IG5lZWRzIGEgd2luZG93IHN0cmljdGx5IGJlbG93IHRoZSBQTUQgc2tpcCBhdFxuJiM0MzsgKiAtbyBcdTAwM2NQTUQgb3JkZXJcdTAwM2U7IHRoZSByZXN0IHJ1biB0aGVyZSB1bmNoYW5nZWQsIGJhc2VsaW5pbmcgdGhlIGxlZ2FjeVxuJiM0MzsgKiBQTUQgZW5naW5lIHdpdGggdGhlIHNhbWUgdGVzdCB0ZXh0IHVzZWQgZm9yIHRoZSBtVEhQIG9yZGVycy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBib29sIHNraXBfYXRfcG1kX29yZGVyKGNvbnN0IGNoYXIgKm5hbWUpXG4mIzQzO3tcbiYjNDM7XHRpZiAoYW5vbl90YXJnZXRfb3JkZXIgXHUwMDNjIGhwYWdlX3BtZF9vcmRlcilcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCYjMzQ7JXM6IG5lZWRzIGEgd2luZG93IGJlbG93IHRoZSBQTURcXG5cJiMzNDssIG5hbWUpO1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9mdWxsKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuJiM0Mzt7XG4mIzQzO1x0dm9pZCAqcDtcbiYjNDM7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0aWYgKCFyYW5nZV9ub3RfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7Q29sbGFwc2UgZnVsbHkgcG9wdWxhdGVkIFBURSB0YWJsZSB0byB0YXJnZXQgb3JkZXIuLi5cJiMzNDspO1xuJiM0MztcdGlmICgha2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcygpKVxuJiM0MztcdFx0ZmFpbChcJiMzNDtUaW1lb3V0XCYjMzQ7KTtcbiYjNDM7XHRlbHNlIGlmIChyYW5nZV9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxuJiM0MztcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCYjMzQ7JXNcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbiYjNDM7XHRcdFx0XHRcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuJiM0Mzt7XG4mIzQzO1x0c2l6ZV90IHdpbmRvdyA9IGFub25fb3JkZXJfc2l6ZSgpO1xuJiM0MztcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdGlmIChza2lwX2F0X3BtZF9vcmRlcihfX2Z1bmNfXykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbiYjNDM7XHRvcHMtXHUwMDNlZmF1bHQocCwgd2luZG93LCAyICogd2luZG93KTtcbiYjNDM7XHRpZiAoIXJhbmdlX25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1VuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbiYjNDM7XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtDb2xsYXBzZSBvbmUgZnVsbHkgcG9wdWxhdGVkIHdpbmRvdy4uLlwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXG4mIzQzO1x0XHRmYWlsKFwmIzM0O1RpbWVvdXRcJiMzNDspO1xuJiM0MztcdGVsc2UgaWYgKHJhbmdlX2NvbGxhcHNlZChwICYjNDM7IHdpbmRvdywgd2luZG93KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCByYW5nZV9ub3RfY29sbGFwc2VkKHAsIHdpbmRvdykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgcmFuZ2Vfbm90X2NvbGxhcHNlZChwICYjNDM7IDIgKiB3aW5kb3csXG4mIzQzO1x0XHRcdFx0ICAgICBocGFnZV9wbWRfc2l6ZSAtIDIgKiB3aW5kb3cpKVxuJiM0MztcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0dmFsaWRhdGVfbWVtb3J5KHAsIHdpbmRvdywgMiAqIHdpbmRvdyk7XG4mIzQzO1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX3BhcnRpYWxfd2luZG93KHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuJiM0MztcdFx0XHRcdFx0ICBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuJiM0Mzt7XG4mIzQzO1x0dm9pZCAqcDtcbiYjNDM7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBwYWdlX3NpemUpO1xuJiM0MztcdGlmICghcmFuZ2Vfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7VW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NvbGxhcHNlIHdpbmRvdyB3aXRoIHNpbmdsZSBQVEUgZW50cnkgcHJlc2VudC4uLlwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXG4mIzQzO1x0XHRmYWlsKFwmIzM0O1RpbWVvdXRcJiMzNDspO1xuJiM0MztcdGVsc2UgaWYgKHJhbmdlX2NvbGxhcHNlZChwLCBhbm9uX29yZGVyX3NpemUoKSkpXG4mIzQzO1x0XHRzdWNjZXNzKFwmIzM0O09LXCYjMzQ7KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRmYWlsKFwmIzM0O0ZhaWxcJiMzNDspO1xuJiM0MztcbiYjNDM7XHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgcGFnZV9zaXplKTtcbiYjNDM7XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCYjMzQ7JXNcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbiYjNDM7XHRcdFx0XHRcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuJiM0MztcdHNpemVfdCB3aW5kb3cgPSBhbm9uX29yZGVyX3NpemUoKTtcbiYjNDM7XHR2b2lkICpwO1xuJiM0MztcbiYjNDM7XHRpZiAoc2tpcF9hdF9wbWRfb3JkZXIoX19mdW5jX18pKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSAwO1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTtcbiYjNDM7XHRpZiAoIXJhbmdlX25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1VuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbiYjNDM7XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtDb2xsYXBzZSBmdWxsIHdpbmRvdywgbm90IHRoZSBvbmUgbWlzc2luZyBhIHBhZ2UuLi5cJiMzNDspO1xuJiM0MztcdGlmICgha2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcygpKVxuJiM0MztcdFx0ZmFpbChcJiMzNDtUaW1lb3V0XCYjMzQ7KTtcbiYjNDM7XHRlbHNlIGlmIChyYW5nZV9jb2xsYXBzZWQocCwgd2luZG93KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCByYW5nZV9ub3RfY29sbGFwc2VkKHAgJiM0Mzsgd2luZG93LCB3aW5kb3cpKVxuJiM0MztcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIDIgKiB3aW5kb3cgLSBwYWdlX3NpemUpO1xuJiM0MztcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbiYjNDM7XHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCYjMzQ7JXNcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogU21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCB3aWxsIGNvbnNpZGVyIGZvciBtVEhQIGNvbGxhcHNlLiAqL1xuJiM0MzsjZGVmaW5lIE1JTl9NVEhQX09SREVSIDJcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEEgcmVnaW9uIGJhY2tlZCBieSBsYXJnZSBmb2xpb3Mgb2YgYSBzbWFsbGVyIG9yZGVyIGlzIGEgdmFsaWQgc291cmNlXG4mIzQzOyAqIGZvciBjb2xsYXBzZSB0byB0aGUgdGFyZ2V0IG9yZGVyOlxuJiM0MzsgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKCkgYWNjZXB0cyBhbnkgc291cmNlIGZvbGlvIG9mIGFuIG9yZGVyXG4mIzQzOyAqIHN0cmljdGx5IGJlbG93IHRoZSBjYW5kaWRhdGUmIzM5O3MuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuJiM0MztcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XG4mIzQzO1x0aW50IHNvdXJjZV9vcmRlciA9IGFub25fb3JkZXIgPyBhbm9uX29yZGVyIDogTUlOX01USFBfT1JERVI7XG4mIzQzO1x0dm9pZCAqcDtcbiYjNDM7XG4mIzQzO1x0LyogU291cmNlcyBtdXN0IGJlIGEgc3VwcG9ydGVkIG1USFAgb3JkZXIgc3RyaWN0bHkgYmVsb3cgdGhlIHRhcmdldC4gKi9cbiYjNDM7XHRpZiAoc291cmNlX29yZGVyIFx1MDAzZT0gYW5vbl90YXJnZXRfb3JkZXIgfHxcbiYjNDM7XHQgICAgISh0aHBfc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBzb3VyY2Vfb3JkZXIpKSkge1xuJiM0MztcdFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFwmIzM0OyVzOiBubyBzb3VyY2Ugb3JkZXIgYmVsb3cgdGFyZ2V0XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgIF9fZnVuY19fKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEZhdWx0IHRoZSB3aG9sZSByZWdpb24gYXMgb3JkZXItQHNvdXJjZV9vcmRlciBmb2xpb3MuICovXG4mIzQzO1x0c2V0dGluZ3MuaHVnZXBhZ2VzW3NvdXJjZV9vcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7XG4mIzQzO1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbiYjNDM7XHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIGhwYWdlX3BtZF9zaXplLCBzb3VyY2Vfb3JkZXIsXG4mIzQzO1x0XHRcdFx0XHQgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1JlZ2lvbiBub3QgYmFja2VkIGJ5IG9yZGVyLSVkIGZvbGlvcyBhZnRlciBmYXVsdFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICBzb3VyY2Vfb3JkZXIpO1xuJiM0MztcbiYjNDM7XHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbiYjNDM7XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtDb2xsYXBzZSByZWdpb24gYmFja2VkIGJ5IG9yZGVyLSVkIHNvdXJjZXMuLi5cJiMzNDssXG4mIzQzO1x0XHQgICAgICAgc291cmNlX29yZGVyKTtcbiYjNDM7XHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7VGltZW91dFwmIzM0Oyk7XG4mIzQzO1x0ZWxzZSBpZiAocmFuZ2VfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbiYjNDM7XHRcdHN1Y2Nlc3MoXCYjMzQ7T0tcJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHZhbGlkYXRlX21lbW9yeShwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcbiB7XG4gXHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7XFxuVXNhZ2U6IC4va2h1Z2VwYWdlZCBbT1BUSU9OU10gXHUwMDNjdGVzdCB0eXBlXHUwMDNlIFtkaXJdXFxuXFxuXCYjMzQ7KTtcbkBAIC0xMTAzLDYgJiM0MzsxNDI1LDExIEBAIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXG4gXHRmcHJpbnRmKHN0ZGVycixcdFwmIzM0O1xcdFxcdC1oOiBUaGlzIGhlbHAgbWVzc2FnZS5cXG5cJiMzNDspO1xuIFx0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQtczogbVRIUCBzaXplLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXG5cJiMzNDspO1xuIFx0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQgICAgRGVmYXVsdHMgdG8gMC4gVXNlIHRoaXMgc2l6ZSBmb3IgYW5vbiBvciBzaG1lbSBhbGxvY2F0aW9ucy5cXG5cJiMzNDspO1xuJiM0MztcdGZwcmludGYoc3RkZXJyLFx0XCYjMzQ7XFx0XFx0LW86IGNvbGxhcHNlIHRhcmdldCBvcmRlciBmb3Iga2h1Z2VwYWdlZDphbm9uLlxcblwmIzM0Oyk7XG4mIzQzO1x0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQgICAgUnVucyB0aGUgb3JkZXItcGFyYW1ldGVyaXplZCBjb2xsYXBzZSBjYXNlcyBpbnN0ZWFkXFxuXCYjMzQ7KTtcbiYjNDM7XHRmcHJpbnRmKHN0ZGVycixcdFwmIzM0O1xcdFxcdCAgICBvZiB0aGUgUE1EIGNhc2VzLlxcblwmIzM0Oyk7XG4mIzQzO1x0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQgICAgV2l0aCAtcywgLXMgbmFtZXMgdGhlIG1USFAgc291cmNlIG9yZGVyIGZvciB0aGVcXG5cJiMzNDspO1xuJiM0MztcdGZwcmludGYoc3RkZXJyLFx0XCYjMzQ7XFx0XFx0ICAgIG1peGVkLXNvdXJjZSBjYXNlIChzb3VyY2Ugb3JkZXIgYmVsb3cgdGhlIHRhcmdldCkuXFxuXCYjMzQ7KTtcbiBcdGV4aXQoMSk7XG4gfVxuIFxuQEAgLTExMTIsMTcgJiM0MzsxNDM5LDMxIEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRjaGFyICpidWY7XG4gXHRjb25zdCBjaGFyICp0b2tlbjtcbiBcbi1cdHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIFwmIzM0O3M6aFwmIzM0OykpICE9IC0xKSB7XG4mIzQzO1x0d2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgXCYjMzQ7czpvOmhcJiMzNDspKSAhPSAtMSkge1xuIFx0XHRzd2l0Y2ggKG9wdCkge1xuIFx0XHRjYXNlICYjMzk7cyYjMzk7OlxuIFx0XHRcdGFub25fb3JkZXIgPSBhdG9pKG9wdGFyZyk7XG4gXHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlICYjMzk7byYjMzk7OlxuJiM0MztcdFx0XHRhbm9uX3RhcmdldF9vcmRlciA9IGF0b2kob3B0YXJnKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJiMzOTtoJiMzOTs6XG4gXHRcdGRlZmF1bHQ6XG4gXHRcdFx0dXNhZ2UoKTtcbiBcdFx0fVxuIFx0fVxuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogLXMgYW5kIC1vIGNvbXBvc2U6IC1zIHRoZW4gbmFtZXMgdGhlIG1USFAgc291cmNlIG9yZGVyIGZvciB0aGVcbiYjNDM7XHQgKiBtaXhlZC1zb3VyY2UgY2FzZSwgd2hpY2ggbmVlZHMgYSBzb3VyY2Ugc3RyaWN0bHkgYmVsb3cgdGhlXG4mIzQzO1x0ICogdGFyZ2V0IChhbmQgYXQgb3IgYWJvdmUgdGhlIHNtYWxsZXN0IG1USFAgb3JkZXIpLiBBbG9uZSwgLXMgaXNcbiYjNDM7XHQgKiB0aGUgc291cmNlIG9yZGVyIGZvciB0aGUgZGVmYXVsdCBQTUQgc3VpdGU7IGFsb25lLCAtbyBpcyB0aGVcbiYjNDM7XHQgKiBjb2xsYXBzZSB0YXJnZXQgZm9yIHRoZSBvcmRlci1wYXJhbWV0ZXJpemVkIHN1aXRlLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChhbm9uX3RhcmdldF9vcmRlciBcdTAwMjZcdTAwMjYgYW5vbl9vcmRlciBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgKGFub25fb3JkZXIgXHUwMDNjIE1JTl9NVEhQX09SREVSIHx8IGFub25fb3JkZXIgXHUwMDNlPSBhbm9uX3RhcmdldF9vcmRlcikpXG4mIzQzO1x0XHR1c2FnZSgpO1xuJiM0MztcbiBcdGFyZ3YgJiM0Mzs9IG9wdGluZDtcbiBcdGFyZ2MgLT0gb3B0aW5kO1xuIFxuQEAgLTEyMDcsNyAmIzQzOzE1NDgsNiBAQCBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7XG4gXG4gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIHtcbi1cdGludCBocGFnZV9wbWRfb3JkZXI7XG4gXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIGRlZmF1bHRfc2V0dGluZ3MgPSB7XG4gXHRcdC50aHBfZW5hYmxlZCA9IFRIUF9NQURWSVNFLFxuIFx0XHQudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTLFxuQEAgLTEyNDQsMTggJiM0MzsxNTg0LDk0IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGhwYWdlX3BtZF9uciA9IGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplO1xuIFx0aHBhZ2VfcG1kX29yZGVyID0gX19idWlsdGluX2N0eihocGFnZV9wbWRfbnIpO1xuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIHBhZ2UgY2FjaGUgY2FwcyBmb2xpbyBvcmRlciBhdCBNQVhfUEFHRUNBQ0hFX09SREVSLCB3aGljaFxuJiM0MztcdCAqIHhhc19zcGxpdF9hbGxvYygpIHB1dHMgYmVsb3cgdGhlIFBNRCBvcmRlciBvbiBhcm02NCB3aXRoIDY0SyBwYWdlcy5cbiYjNDM7XHQgKiBBIFBNRC1zaXplZCBwYWdlIGNhY2hlIGZvbGlvIGlzIHRoZW4gaW1wb3NzaWJsZSwgc28gdGhlIGtlcm5lbFxuJiM0MztcdCAqIHJlZnVzZXMgdGhlc2UgY29sbGFwc2VzIGJ5IGRlc2lnbiBhbmQgdGhlcmUgaXMgbm90aGluZyB0byB0ZXN0LlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghKHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGhwYWdlX3BtZF9vcmRlcikpKSB7XG4mIzQzO1x0XHRpZiAoc2htZW1fb3BzKSB7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O25vIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvOiBza2lwcGluZyBzaG1lbVxcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdHNobWVtX29wcyA9IE5VTEw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAoZmluZm8udHlwZSA9PSBWTUFfU0hNRU0gXHUwMDI2XHUwMDI2IHJlYWRfb25seV9maWxlX29wcykge1xuJiM0MztcdFx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgdG1wZnMgZmlsZVxcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdHJlYWRfb25seV9maWxlX29wcyA9IE5VTEw7XG4mIzQzO1x0XHRcdHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9IE5VTEw7XG4mIzQzO1x0XHRcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSBOVUxMO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKCFhbm9uX29wcyBcdTAwMjZcdTAwMjYgIXNobWVtX29wcyBcdTAwMjZcdTAwMjYgIXJlYWRfb25seV9maWxlX29wcylcbiYjNDM7XHRcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7Tm90aGluZyBsZWZ0IHRvIGNvbGxhcHNlIGludG9cXG5cJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGFub25fdGFyZ2V0X29yZGVyIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAhKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGFub25fdGFyZ2V0X29yZGVyKSkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgICBhbm9uX3RhcmdldF9vcmRlcik7XG4mIzQzO1x0aWYgKGFub25fdGFyZ2V0X29yZGVyIFx1MDAzZSBocGFnZV9wbWRfb3JkZXIpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7LW8gdGFrZXMgYXQgbW9zdCB0aGUgUE1EIG9yZGVyXFxuXCYjMzQ7KTtcbiYjNDM7XG4gXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IGhwYWdlX3BtZF9uciAtIDE7XG4gXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfc3dhcCA9IGhwYWdlX3BtZF9uciAvIDg7XG4gXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfc2hhcmVkID0gaHBhZ2VfcG1kX25yIC8gMjtcbiBcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID0gaHBhZ2VfcG1kX25yICogODtcbiBcdGRlZmF1bHRfc2V0dGluZ3MuaHVnZXBhZ2VzW2hwYWdlX3BtZF9vcmRlcl0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xuLVx0ZGVmYXVsdF9zZXR0aW5ncy5odWdlcGFnZXNbYW5vbl9vcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7XG4gXHRkZWZhdWx0X3NldHRpbmdzLnNobWVtX2h1Z2VwYWdlc1tocGFnZV9wbWRfb3JkZXJdLmVuYWJsZWQgPSBTSE1FTV9JTkhFUklUO1xuLVx0ZGVmYXVsdF9zZXR0aW5ncy5zaG1lbV9odWdlcGFnZXNbYW5vbl9vcmRlcl0uZW5hYmxlZCA9IFNITUVNX0FMV0FZUztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFVuZGVyIC1vIHRoZSBvcmRlci1wYXJhbWV0ZXJpemVkIGNhc2VzIHdhbnQgb3JkZXItMCBzb3VyY2VzIGJ5XG4mIzQzO1x0ICogZGVmYXVsdDsgdGhlIG1peGVkLXNvdXJjZSBjYXNlIGVuYWJsZXMgaXRzIG93biAocG9zc2libHkgLXNcbiYjNDM7XHQgKiBzZWxlY3RlZCkgc291cmNlIG9yZGVyIGxvY2FsbHkuIEVuYWJsaW5nIGl0IGdsb2JhbGx5IGhlcmUgd291bGRcbiYjNDM7XHQgKiBtYWtlIGV2ZXJ5IGNhc2UgZmF1bHQgdGhhdCBvcmRlci5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIWFub25fdGFyZ2V0X29yZGVyKSB7XG4mIzQzO1x0XHRkZWZhdWx0X3NldHRpbmdzLmh1Z2VwYWdlc1thbm9uX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcbiYjNDM7XHRcdGRlZmF1bHRfc2V0dGluZ3Muc2htZW1faHVnZXBhZ2VzW2Fub25fb3JkZXJdLmVuYWJsZWQgPSBTSE1FTV9BTFdBWVM7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoYW5vbl90YXJnZXRfb3JkZXIpIHtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBPbmx5IHRoZSB0YXJnZXQgb3JkZXIgbWF5IHByb2R1Y2UgbGFyZ2UgZm9saW9zLCBhbmQgb25seVxuJiM0MztcdFx0ICogZnJvbSBraHVnZXBhZ2VkOiBcJiMzNDtpbmhlcml0XCYjMzQ7IHVuZGVyIGVuYWJsZWQ9bWFkdmlzZSBrZWVwc1xuJiM0MztcdFx0ICogcHJlLU1BRFZfSFVHRVBBR0UgZmF1bHRzIGF0IG9yZGVyIDAuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGRlZmF1bHRfc2V0dGluZ3MuaHVnZXBhZ2VzW2hwYWdlX3BtZF9vcmRlcl0uZW5hYmxlZCA9IFRIUF9ORVZFUjtcbiYjNDM7XHRcdGRlZmF1bHRfc2V0dGluZ3MuaHVnZXBhZ2VzW2Fub25fdGFyZ2V0X29yZGVyXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogT3JkZXItcGFyYW1ldGVyaXplZCBjYXNlcyBhcmUgZHJpdmVuIHN0cmljdGx5IGJ5IHRoZVxuJiM0MztcdFx0ICoga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSBiYXJyaWVyLCB3aGljaCB3YWtlcyB0aGUgZGFlbW9uXG4mIzQzO1x0XHQgKiBpdHNlbGYuIEEgbG9uZyBzY2FuX3NsZWVwIGtlZXBzIGtodWdlcGFnZWQgZnJvbVxuJiM0MztcdFx0ICogZnJlZS1ydW5uaW5nIGJldHdlZW4gYmFycmllciBzdGVwcywgYW5kIGEgcGFnZXNfdG9fc2NhblxuJiM0MztcdFx0ICogY292ZXJpbmcgZXZlcnl0aGluZyBtYWtlcyBvbmUgd2FrZSBjb21wbGV0ZSBvbmUgZnVsbFxuJiM0MztcdFx0ICogcGFzcyAodGhlIGJhcnJpZXImIzM5O3MgY29udHJhY3QpLCBzbyBhIHJ1biBwZXJmb3JtcyBhXG4mIzQzO1x0XHQgKiBkZXRlcm1pbmlzdGljIG51bWJlciBvZiBwYXNzZXMg4oCUIHdoYXQgdGhlIHN0YWdlIEEvQlxuJiM0MztcdFx0ICogdHJhY2UgY29tcGFyaXNvbnMgcmVseSBvbi5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7XG4mIzQzO1x0XHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQucGFnZXNfdG9fc2NhbiA9IDFVTCBcdTAwM2NcdTAwM2MgMjQ7XG4mIzQzO1xuJiM0MztcdFx0cGFnZW1hcF9mZCA9IG9wZW4oXCYjMzQ7L3Byb2Mvc2VsZi9wYWdlbWFwXCYjMzQ7LCBPX1JET05MWSk7XG4mIzQzO1x0XHRpZiAocGFnZW1hcF9mZCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O29wZW4oXFxcJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXBcXFwmIzM0OylcJiMzNDspO1xuJiM0MztcdFx0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXCYjMzQ7L3Byb2Mva3BhZ2VmbGFnc1wmIzM0OywgT19SRE9OTFkpO1xuJiM0MztcdFx0aWYgKGtwYWdlZmxhZ3NfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O29wZW4oXFxcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXFxcJiMzNDspIHJlcXVpcmVzIHJvb3RcXG5cJiMzNDspO1xuJiM0MztcdH1cbiBcbiBcdHNhdmVfc2V0dGluZ3MoKTtcbiBcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNmRlZmF1bHRfc2V0dGluZ3MpO1xuIFxuJiM0MztcdGlmIChhbm9uX3RhcmdldF9vcmRlcikge1xuJiM0MztcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdywga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX3BhcnRpYWxfd2luZG93LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMsIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcbiYjNDM7XHRcdGtzZnRfc2V0X3BsYW4obnJfdGVzdF9jYXNlcyk7XG4mIzQzO1x0XHRnb3RvIHJ1bjtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG5AQCAtMTMyNCw2ICYjNDM7MTc0MCw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcbiBcbiYjNDM7XHRURVNUKGNvbGxhcHNlX2ZvcmtfY293X3JhY2UsIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdFRFU1QoY29sbGFwc2VfZm9ya19jb3dfcmFjZSwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG5AQCAtMTMzNiw2ICYjNDM7MTc1NSw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGtzZnRfc2V0X3BsYW4obnJfdGVzdF9jYXNlcyAmIzQzOyAxKTtcbiBcbiBcdGFsbG9jX2F0X2ZhdWx0KCk7XG4mIzQzO3J1bjpcbiBcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBucl90ZXN0X2Nhc2VzOyBpJiM0MzsmIzQzOykge1xuIFx0XHRzdHJ1Y3QgdGVzdF9jYXNlICp0ID0gXHUwMDI2dGVzdF9jYXNlc1tpXTtcbiBcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMmFhNDVjOWU4YTc3ZlxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmNcbkBAIC0wLDAgJiM0MzsxLDQ4MyBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKlxuJiM0MzsgKiBraHVnZXBhZ2VkIHJhY2UgaGFybmVzcy5cbiYjNDM7ICpcbiYjNDM7ICogUnVucyBjb2xsYXBzZSBhZ2FpbnN0IGNvbmN1cnJlbnQgZmF1bHRzLCB0cmFuc2llbnQgR1VQIHBpbnNcbiYjNDM7ICogKGd1cF90ZXN0KSwgZm9yaywgbXJlbWFwIGFuZCBNQURWX0RPTlRORUVEIG92ZXIgdGhlIHNhbWUgcmFuZ2VzLCBpblxuJiM0MzsgKiBvbmUgb2YgdGhyZWUgZHJpdmVyIG1vZGVzOlxuJiM0MzsgKlxuJiM0MzsgKiAgIHN0ZXBwZWRcdGtodWdlcGFnZWQsIGRyaXZlbiBzeW5jaHJvbm91c2x5IG9uZSBmdWxsIHBhc3MgYXQgYSB0aW1lXG4mIzQzOyAqXHRcdHRocm91Z2gga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSDigJQgdGhlIHByaW1hcnkgZHJpdmVyOiB0aGVcbiYjNDM7ICpcdFx0ZnVsbCBzY2FuJiM0Mztjb2xsYXBzZSBwYXRoIHdpdGggYSBkZXRlcm1pbmlzdGljIGV4dGVudCBwZXJcbiYjNDM7ICpcdFx0c3RlcDtcbiYjNDM7ICogICBmcmVlXHRmcmVlLXJ1bm5pbmcga2h1Z2VwYWdlZCAoc2Nhbl9zbGVlcF9taWxsaXNlY3M9MCkg4oCUIHRoZVxuJiM0MzsgKlx0XHRzb2FrO1xuJiM0MzsgKiAgIG1hZHZpc2VcdE1BRFZfQ09MTEFQU0UgaW4gYSBsb29wIOKAlCB0aGUgbGVnYWN5LVBNRCByZWdyZXNzaW9uXG4mIzQzOyAqXHRcdGF4aXMuXG4mIzQzOyAqXG4mIzQzOyAqIEFsbCBhbm9uIFRIUCBvcmRlcnMgYXJlIGVuYWJsZWQgKGluaGVyaXQpLiBtYXhfcHRlc19ub25lIGlzIDAgYnlcbiYjNDM7ICogZGVmYXVsdCDigJQgcmFjaW5nIE1BRFZfRE9OVE5FRUQgdGhlbiBzdGVlcnMgc2VsZWN0aW9uIGFjcm9zcyBvcmRlcnMg4oCUXG4mIzQzOyAqIG9yIHRoZSBwZXJtaXNzaXZlIGxpbWl0IHdpdGggLXosIHdoaWNoIGZsb29kcyB0aGUgYmF0Y2ggZW5naW5lIHdpdGhcbiYjNDM7ICogaG9sZSBhbmQgemVyb3BhZ2Ugc2xvdHMgc28gdGhlIHBvcHVsYXRpb24gcGF0aHMgKHBhcmstdGltZSB6ZXJvcGFnZVxuJiM0MzsgKiBjbGVhciwgemVyby1maWxsZWQgY29weSwgaW5zdGFsbC10aW1lIHB0ZV9ub25lKCkgdmVyaWZ5IGFuZCBhYm9ydClcbiYjNDM7ICogcmFjZSB0aGUgZmF1bHRlcnMgZGlyZWN0bHkuXG4mIzQzOyAqXG4mIzQzOyAqIC1wIGFkZHMgbWVtb3J5IHByZXNzdXJlIHRvIGFueSBvZiB0aGUgYWJvdmU6IE1BRFZfUEFHRU9VVCBjeWNsaW5nXG4mIzQzOyAqIG9uIGEgZGVkaWNhdGVkIG5laWdoYm9yIHJlZ2lvbiAoc3dhcCB0cmFmZmljIGFuZCBMUlUgY2h1cm47IHNraXBwZWRcbiYjNDM7ICogd2l0aCBhIG5vdGUgd2hlbiB0aGUgaG9zdCBoYXMgbm8gc3dhcCkgYW5kIGEgY29tcGFjdF9tZW1vcnkgdHJpZ2dlclxuJiM0MzsgKiBsb29wIChjb21wYWN0aW9uIG1pZ3JhdGVzIHNvdXJjZSBmb2xpb3MsIHJhY2luZyBjb2xsYXBzZSYjMzk7cyBmcmVlemVcbiYjNDM7ICogd2l0aCByZWZjb3VudCBlbGV2YXRpb24gYW5kIG1pZ3JhdGlvbiBlbnRyaWVzIG9mIGl0cyBvd24pLlxuJiM0MzsgKlxuJiM0MzsgKiBDb3JyZWN0bmVzcyBzaWduYWxzOiBldmVyeSByYWNpbmcgcGFnZSBtdXN0IHJlYWQgYXMgaXRzIHBhdHRlcm4gb3JcbiYjNDM7ICogemVybyAoTUFEVl9ET05UTkVFRCksIG5ldmVyIGFueXRoaW5nIGVsc2Ug4oCUIGNoZWNrZWQgY29udGludW91c2x5IGJ5XG4mIzQzOyAqIHRoZSBmYXVsdGVycyBhbmQgdGhlIGZvcmsgY2hpbGRyZW4gYW5kIG9uY2UgYXQgdGhlIGVuZCDigJQgcGx1c1xuJiM0MzsgKiB3aGF0ZXZlciBERUJVR19WTSAvIHBhZ2VfdGFibGVfY2hlY2sgLyBLQVNBTiAvIGxvY2tkZXAgcmVwb3J0IGluXG4mIzQzOyAqIGRtZXNnLCB3aGljaCB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGluc3BlY3QuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2Vycm5vLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NwdGhyZWFkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy90aW1lLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7a3NlbGZ0ZXN0LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7dm1fdXRpbC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2h1Z2VwYWdlX3NldHRpbmdzLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Li4vLi4vLi4vLi4vbW0vZ3VwX3Rlc3QuaFwmIzM0O1xuJiM0MztcbiYjNDM7I2RlZmluZSBCQVNFX0FERFJcdCgodm9pZCAqKSgxVUwgXHUwMDNjXHUwMDNjIDMwKSlcbiYjNDM7LypcbiYjNDM7ICogU2hhcmVkIHBsYXlncm91bmQgZm9yIGZhdWx0cy9waW5zL2ZvcmsvZG9udG5lZWQ6IHNldmVyYWwgUE1ELXNpemVkXG4mIzQzOyAqIGFyZWFzIHRoZSByYWNpbmcgdGhyZWFkcyBzcHJlYWQgYWNyb3NzLCBwbHVzIG9uZSBhcmVhIG93bmVkIGJ5IHRoZVxuJiM0MzsgKiBtcmVtYXAgdGhyZWFkLiBNb3JlIGFyZWFzIG1lYW5zIG1vcmUgaW5kZXBlbmRlbnQgcmVnaW9ucyBjb2xsYXBzaW5nXG4mIzQzOyAqIGF0IG9uY2U7IHRoZSBkZWZhdWx0IHN1aXRzIGEgbm9ybWFsIG1hY2hpbmUuIE9uIGEgbWVtb3J5LWNvbnN0cmFpbmVkXG4mIzQzOyAqIGhvc3QgLS0gb3IgdW5kZXIgZW11bGF0aW9uLCB3aGVyZSBhIDUxMk0gUE1EIChhcm02NC82NEspIG1ha2VzIHRoZVxuJiM0MzsgKiBkZWZhdWx0IHBsYXlncm91bmQgbXVsdGktZ2lnYWJ5dGUgLS0gcGFzcyAtYSB0byBzaHJpbmsgaXQuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIERFRkFVTFRfU0hBUkVEX0FSRUFTXHQzXG4mIzQzO3N0YXRpYyBpbnQgbnJfc2hhcmVkX2FyZWFzO1xuJiM0MztzdGF0aWMgaW50IG5yX2FyZWFzO1xuJiM0MztcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTtcbiYjNDM7c3RhdGljIGNoYXIgKnJlZ2lvbjtcdFx0LyogTlJfQVJFQVMgKiBocGFnZV9wbWRfc2l6ZSAqL1xuJiM0MztzdGF0aWMgY2hhciAqbXJlbWFwX2FyZWE7XHQvKiByZWdpb24gJiM0MzsgTlJfU0hBUkVEX0FSRUFTIGFyZWFzICovXG4mIzQzO3N0YXRpYyBjaGFyICptcmVtYXBfc2NyYXRjaDtcdC8qIHdlbGwgYWJvdmUgdGhlIHJlZ2lvbiAqL1xuJiM0MztzdGF0aWMgY2hhciAqcGFnZW91dF9hcmVhO1x0LyogLXA6IGRlZGljYXRlZCBwcmVzc3VyZSByZWdpb24gKi9cbiYjNDM7c3RhdGljIHNpemVfdCBwYWdlb3V0X3NpemU7XG4mIzQzO3N0YXRpYyBpbnQgZ3VwX2ZkID0gLTE7XG4mIzQzO3N0YXRpYyB2b2xhdGlsZSBpbnQgc3RvcDtcbiYjNDM7c3RhdGljIHZvbGF0aWxlIGludCBjb3JydXB0ZWQ7XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgaW50IHBhdHRlcm4odW5zaWduZWQgbG9uZyBwYWdlX2lkeClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCB2YWwgPSAodW5zaWduZWQgaW50KXBhZ2VfaWR4ICogMjY1NDQzNTc2MVU7XG4mIzQzO1xuJiM0MztcdHJldHVybiB2YWwgPyB2YWwgOiAxO1x0LyogbmV2ZXIgY29sbGlkZXMgd2l0aCB0aGUgemVyby1maWxsICovXG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNoZWNrX3BhZ2UodW5zaWduZWQgbG9uZyBwYWdlX2lkeClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCB2YWwgPSAqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUpO1xuJiM0MztcbiYjNDM7XHRpZiAodmFsIFx1MDAyNlx1MDAyNiB2YWwgIT0gcGF0dGVybihwYWdlX2lkeCkpIHtcbiYjNDM7XHRcdGNvcnJ1cHRlZCA9IDE7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtDb3JydXB0aW9uIGF0IHBhZ2UgJWx1OiAlI3ggIT0gJSN4XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgICAgcGFnZV9pZHgsIHZhbCwgcGF0dGVybihwYWdlX2lkeCkpO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZF9wYWdlKHVuc2lnbmVkIGludCAqc2VlZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiAodW5zaWduZWQgbG9uZylyYW5kX3Ioc2VlZCkgJVxuJiM0MztcdCAgICAgICAobnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCAqZmF1bHRlcl9mbih2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKCFzdG9wKSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFx1MDAyNnNlZWQpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChyYW5kX3IoXHUwMDI2c2VlZCkgXHUwMDI2IDEpXG4mIzQzO1x0XHRcdCoodW5zaWduZWQgaW50ICopKHJlZ2lvbiAmIzQzOyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSkgPVxuJiM0MztcdFx0XHRcdHBhdHRlcm4ocGFnZV9pZHgpO1xuJiM0MztcdFx0ZWxzZVxuJiM0MztcdFx0XHRjaGVja19wYWdlKHBhZ2VfaWR4KTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkICpkb250bmVlZF9mbih2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKCFzdG9wKSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFx1MDAyNnNlZWQpO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBuciA9IDFVTCBcdTAwM2NcdTAwM2MgKHJhbmRfcihcdTAwMjZzZWVkKSAlIDYpO1x0LyogMS4uMzIgcGFnZXMgKi9cbiYjNDM7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogT25jZSBpbiBhIHdoaWxlIHphcCBhIHdob2xlIFBNRC1hbGlnbmVkIGFyZWE6IG9ubHkgYVxuJiM0MztcdFx0ICogemFwIHNwYW5uaW5nIHRoZSBmdWxsIHRhYmxlIHRyaWdnZXJzIHRoZSBlbXB0eS10YWJsZVxuJiM0MztcdFx0ICogcmVjbGFpbSAoQ09ORklHX1BUX1JFQ0xBSU0pLCB3aGljaCBjYW4gZnJlZSBhIHRhYmxlXG4mIzQzO1x0XHQgKiBvdXQgZnJvbSB1bmRlciBhIHBhcmtlZCBjb2xsYXBzZSDigJQgc3ViLXRhYmxlIHphcHNcbiYjNDM7XHRcdCAqIG5ldmVyIHJlYWNoIHRoYXQgcGF0aC5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0aWYgKCEocmFuZF9yKFx1MDAyNnNlZWQpICUgNjQpKSB7XG4mIzQzO1x0XHRcdHVuc2lnbmVkIGxvbmcgYXJlYSA9IHBhZ2VfaWR4IC9cbiYjNDM7XHRcdFx0XHRcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSk7XG4mIzQzO1xuJiM0MztcdFx0XHRtYWR2aXNlKHJlZ2lvbiAmIzQzOyBhcmVhICogaHBhZ2VfcG1kX3NpemUsXG4mIzQzO1x0XHRcdFx0aHBhZ2VfcG1kX3NpemUsIE1BRFZfRE9OVE5FRUQpO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0bWFkdmlzZShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUsXG4mIzQzO1x0XHRcdFx0bnIgKiBwYWdlX3NpemUsIE1BRFZfRE9OVE5FRUQpO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDUwMCk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCAqcGlubmVyX2ZuKHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoIXN0b3ApIHtcbiYjNDM7XHRcdHN0cnVjdCBndXBfdGVzdCBndXAgPSB7fTtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXHUwMDI2c2VlZCk7XG4mIzQzO1xuJiM0MztcdFx0Z3VwLmFkZHIgPSAodW5zaWduZWQgbG9uZykocmVnaW9uICYjNDM7IHBhZ2VfaWR4ICogcGFnZV9zaXplKTtcbiYjNDM7XHRcdGd1cC5zaXplID0gMTYgKiBwYWdlX3NpemU7XG4mIzQzO1x0XHRndXAubnJfcGFnZXNfcGVyX2NhbGwgPSAxNjtcbiYjNDM7XHRcdGd1cC5ndXBfZmxhZ3MgPSAxO1x0LyogRk9MTF9XUklURSAqL1xuJiM0MztcdFx0LyogUmFjaW5nIE1BRFZfRE9OVE5FRUQgbWFrZXMgdHJhbnNpZW50IGZhaWx1cmVzIGV4cGVjdGVkLiAqL1xuJiM0MztcdFx0aW9jdGwoZ3VwX2ZkLCBQSU5fRkFTVF9CRU5DSE1BUkssIFx1MDAyNmd1cCk7XG4mIzQzO1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkICpmb3JrZXJfZm4odm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4mIzQzO1xuJiM0MztcdHdoaWxlICghc3RvcCkge1xuJiM0MztcdFx0cGlkX3QgcGlkID0gZm9yaygpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChwaWQgPT0gMCkge1xuJiM0MztcdFx0XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgMTY7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRcdGNoZWNrX3BhZ2UocmFuZF9wYWdlKFx1MDAyNnNlZWQpKTtcbiYjNDM7XHRcdFx0X2V4aXQoY29ycnVwdGVkKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChwaWQgXHUwMDNlIDApIHtcbiYjNDM7XHRcdFx0aW50IHdzdGF0dXM7XG4mIzQzO1xuJiM0MztcdFx0XHR3YWl0cGlkKHBpZCwgXHUwMDI2d3N0YXR1cywgMCk7XG4mIzQzO1x0XHRcdGlmIChXSUZFWElURUQod3N0YXR1cykgXHUwMDI2XHUwMDI2IFdFWElUU1RBVFVTKHdzdGF0dXMpKVxuJiM0MztcdFx0XHRcdGNvcnJ1cHRlZCA9IDE7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwMCk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCAqbXJlbWFwcGVyX2ZuKHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoIXN0b3ApIHtcbiYjNDM7XHRcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdFx0cCA9IG1yZW1hcChtcmVtYXBfYXJlYSwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxuJiM0MztcdFx0XHQgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX3NjcmF0Y2gpO1xuJiM0MztcdFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcbiYjNDM7XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21yZW1hcCgpIGF3YXlcJiMzNDspO1xuJiM0MztcdFx0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIDg7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRtcmVtYXBfc2NyYXRjaFsocmFuZF9yKFx1MDAyNnNlZWQpICVcbiYjNDM7XHRcdFx0XHQoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpKSAqIHBhZ2Vfc2l6ZV0gPSAxO1xuJiM0MztcdFx0cCA9IG1yZW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxuJiM0MztcdFx0XHQgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX2FyZWEpO1xuJiM0MztcdFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcbiYjNDM7XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21yZW1hcCgpIGJhY2tcJiMzNDspO1xuJiM0MztcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDIwMDApO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogLXA6IHN3YXAgdHJhZmZpYyBhbmQgTFJVIGNodXJuIG9uIGEgcmVnaW9uIG9mIG91ciBvd24uIFRoZSBjb250ZW50XG4mIzQzOyAqIGNoZWNrIGlzIGV4YWN0IOKAlCBhIHBhZ2Ugb3V0IGFuZCBiYWNrIHRocm91Z2ggc3dhcCBtdXN0IHByZXNlcnZlIHRoZVxuJiM0MzsgKiBwYXR0ZXJuLCBhbmQgbm90aGluZyBlbHNlIGV2ZXIgd3JpdGVzIGhlcmUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCAqcGFnZW91dF9mbih2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG5yID0gcGFnZW91dF9zaXplIC8gcGFnZV9zaXplO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnI7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0Kih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICYjNDM7IGkgKiBwYWdlX3NpemUpID0gcGF0dGVybihpKTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKCFzdG9wKSB7XG4mIzQzO1x0XHRtYWR2aXNlKHBhZ2VvdXRfYXJlYSwgcGFnZW91dF9zaXplLCBNQURWX1BBR0VPVVQpO1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnIgXHUwMDI2XHUwMDI2ICFzdG9wOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHR1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICYjNDM7XG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgICBpICogcGFnZV9zaXplKTtcbiYjNDM7XG4mIzQzO1x0XHRcdGlmICh2YWwgIT0gcGF0dGVybihpKSkge1xuJiM0MztcdFx0XHRcdGNvcnJ1cHRlZCA9IDE7XG4mIzQzO1x0XHRcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7UGFnZW91dCBjb3JydXB0aW9uIGF0IHBhZ2UgJWx1OiAlI3ggIT0gJSN4XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIC1wOiBjb21wYWN0aW9uIG1pZ3JhdGVzIHRoZSBjb2xsYXBzZSBzb3VyY2VzIG91dCBmcm9tIHVuZGVyIHVzLiAqL1xuJiM0MztzdGF0aWMgdm9pZCAqY29tcGFjdG9yX2ZuKHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuJiM0MztcdGludCBmZCA9IG9wZW4oXCYjMzQ7L3Byb2Mvc3lzL3ZtL2NvbXBhY3RfbWVtb3J5XCYjMzQ7LCBPX1dST05MWSk7XG4mIzQzO1xuJiM0MztcdGlmIChmZCBcdTAwM2MgMCkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7Tm8gY29tcGFjdF9tZW1vcnk7IGNvbXBhY3RvciBpZGxlXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdH1cbiYjNDM7XHR3aGlsZSAoIXN0b3ApIHtcbiYjNDM7XHRcdGlmICh3cml0ZShmZCwgXCYjMzQ7MVwmIzM0OywgMSkgXHUwMDNjIDApXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0dXNsZWVwKDEwMDAwICYjNDM7IHJhbmRfcihcdTAwMjZzZWVkKSAlIDEwMDAwMCk7XG4mIzQzO1x0fVxuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgc3dhcF9hdmFpbGFibGUodm9pZClcbiYjNDM7e1xuJiM0MztcdGNoYXIgbGluZVsyNTZdO1xuJiM0MztcdGludCBsaW5lcyA9IDA7XG4mIzQzO1x0RklMRSAqZnAgPSBmb3BlbihcJiMzNDsvcHJvYy9zd2Fwc1wmIzM0OywgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKVxuJiM0MztcdFx0bGluZXMmIzQzOyYjNDM7O1xuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO1x0cmV0dXJuIGxpbmVzIFx1MDAzZSAxO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBub3dfbXModm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aW1ldmFsIHR2O1xuJiM0MztcbiYjNDM7XHRnZXR0aW1lb2ZkYXkoXHUwMDI2dHYsIE5VTEwpO1xuJiM0MztcdHJldHVybiB0di50dl9zZWMgKiAxMDAwVUwgJiM0MzsgdHYudHZfdXNlYyAvIDEwMDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRmcHJpbnRmKHN0ZGVycixcbiYjNDM7XHRcdFwmIzM0O1VzYWdlOiBraHVnZXBhZ2VkX3JhY2UgWy1kIHNlY29uZHNdIFstbSBzdGVwcGVkfGZyZWV8bWFkdmlzZV0gWy16XSBbLXBdIFstYSBhcmVhc11cXG5cJiMzNDtcbiYjNDM7XHRcdFwmIzM0O1xcdC16OiBwZXJtaXNzaXZlIG1heF9wdGVzX25vbmUgKGhvbGUtaGVhdnkgd2luZG93cylcXG5cJiMzNDtcbiYjNDM7XHRcdFwmIzM0O1xcdC1wOiBtZW1vcnkgcHJlc3N1cmUgKHBhZ2VvdXQgJiM0MzsgY29tcGFjdGlvbikgdGhyZWFkc1xcblwmIzM0O1xuJiM0MztcdFx0XCYjMzQ7XFx0LWE6IG51bWJlciBvZiBzaGFyZWQgUE1ELXNpemVkIHBsYXlncm91bmQgYXJlYXMgKGRlZmF1bHQgMylcXG5cJiMzNDspO1xuJiM0MztcdGV4aXQoMSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiYjNDM7e1xuJiM0MztcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGhyZWFkX25hbWVzW10gPSB7XG4mIzQzO1x0XHRcJiMzNDtmYXVsdGVyXCYjMzQ7LCBcJiMzNDtmYXVsdGVyMlwmIzM0OywgXCYjMzQ7ZG9udG5lZWRcJiMzNDssIFwmIzM0O3Bpbm5lclwmIzM0OywgXCYjMzQ7Zm9ya2VyXCYjMzQ7LFxuJiM0MztcdFx0XCYjMzQ7bXJlbWFwcGVyXCYjMzQ7LCBcJiMzNDtwYWdlb3V0XCYjMzQ7LCBcJiMzNDtjb21wYWN0b3JcJiMzNDssXG4mIzQzO1x0fTtcbiYjNDM7XHR2b2lkICooKmNvbnN0IHRocmVhZF9mbnNbXSkodm9pZCAqKSA9IHtcbiYjNDM7XHRcdGZhdWx0ZXJfZm4sIGZhdWx0ZXJfZm4sIGRvbnRuZWVkX2ZuLCBwaW5uZXJfZm4sIGZvcmtlcl9mbixcbiYjNDM7XHRcdG1yZW1hcHBlcl9mbiwgcGFnZW91dF9mbiwgY29tcGFjdG9yX2ZuLFxuJiM0MztcdH07XG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBwYWdlb3V0X2JpdCA9IDFVTCBcdTAwM2NcdTAwM2MgNiwgY29tcGFjdG9yX2JpdCA9IDFVTCBcdTAwM2NcdTAwM2MgNztcbiYjNDM7XHRjb25zdCBpbnQgbnJfdGhyZWFkcyA9IEFSUkFZX1NJWkUodGhyZWFkX25hbWVzKTtcbiYjNDM7XHRwdGhyZWFkX3QgdGhyZWFkc1tBUlJBWV9TSVpFKHRocmVhZF9uYW1lcyldO1xuJiM0MztcdGNvbnN0IGNoYXIgKm1vZGUgPSBcJiMzNDtzdGVwcGVkXCYjMzQ7O1xuJiM0MztcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBlbmRfbXM7XG4mIzQzO1x0aW50IGR1cmF0aW9uX3MgPSAxMDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHRocmVhZF9tYXNrID0gfjBVTDtcbiYjNDM7XHRpbnQgbnJfYXJlYXNfYXJnID0gMDtcbiYjNDM7XHRib29sIHBlcm1pc3NpdmVfbm9uZSA9IGZhbHNlO1xuJiM0MztcdGJvb2wgcHJlc3N1cmUgPSBmYWxzZTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGk7XG4mIzQzO1x0aW50IHN0ZXBzID0gMDtcbiYjNDM7XHRpbnQgb3B0O1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCBcJiMzNDthOmQ6bTp0OnpwaFwmIzM0OykpICE9IC0xKSB7XG4mIzQzO1x0XHRzd2l0Y2ggKG9wdCkge1xuJiM0MztcdFx0Y2FzZSAmIzM5O2EmIzM5OzpcbiYjNDM7XHRcdFx0bnJfYXJlYXNfYXJnID0gYXRvaShvcHRhcmcpO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTtkJiMzOTs6XG4mIzQzO1x0XHRcdGR1cmF0aW9uX3MgPSBhdG9pKG9wdGFyZyk7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0Y2FzZSAmIzM5O20mIzM5OzpcbiYjNDM7XHRcdFx0bW9kZSA9IG9wdGFyZztcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlICYjMzk7dCYjMzk7OlxuJiM0MztcdFx0XHQvKiBkZWJ1ZzogYml0bWFzayBvZiByYWNpbmcgdGhyZWFkcyB0byBzdGFydCAqL1xuJiM0MztcdFx0XHR0aHJlYWRfbWFzayA9IHN0cnRvdWwob3B0YXJnLCBOVUxMLCAwKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlICYjMzk7eiYjMzk7OlxuJiM0MztcdFx0XHRwZXJtaXNzaXZlX25vbmUgPSB0cnVlO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTtwJiMzOTs6XG4mIzQzO1x0XHRcdHByZXNzdXJlID0gdHJ1ZTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRkZWZhdWx0OlxuJiM0MztcdFx0XHR1c2FnZSgpO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRpZiAoc3RyY21wKG1vZGUsIFwmIzM0O3N0ZXBwZWRcJiMzNDspIFx1MDAyNlx1MDAyNiBzdHJjbXAobW9kZSwgXCYjMzQ7ZnJlZVwmIzM0OykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIHN0cmNtcChtb2RlLCBcJiMzNDttYWR2aXNlXCYjMzQ7KSlcbiYjNDM7XHRcdHVzYWdlKCk7XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4mIzQzO1x0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7XG4mIzQzO1x0aHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpO1xuJiM0MztcdGlmICghaHBhZ2VfcG1kX3NpemUpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7UmVhZGluZyBQTUQgcGFnZXNpemUgZmFpbGVkXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0Z3VwX2ZkID0gb3BlbihcJiMzNDsvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdFwmIzM0OywgT19SRFdSKTtcbiYjNDM7XHRpZiAoZ3VwX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7L3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgcmVxdWlyZXMgQ09ORklHX0dVUF9URVNUIGFuZCByb290XFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0bnJfc2hhcmVkX2FyZWFzID0gbnJfYXJlYXNfYXJnIFx1MDAzZSAwID8gbnJfYXJlYXNfYXJnIDogREVGQVVMVF9TSEFSRURfQVJFQVM7XG4mIzQzO1x0bnJfYXJlYXMgPSBucl9zaGFyZWRfYXJlYXMgJiM0MzsgMTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFwcmVzc3VyZSkge1xuJiM0MztcdFx0dGhyZWFkX21hc2sgXHUwMDI2PSB+KHBhZ2VvdXRfYml0IHwgY29tcGFjdG9yX2JpdCk7XG4mIzQzO1x0fSBlbHNlIGlmICghc3dhcF9hdmFpbGFibGUoKSkge1xuJiM0MztcdFx0LyogTm8gc3dhcCwgbm8gYW5vbiByZWNsYWltOiBjb21wYWN0aW9uLW9ubHkgcHJlc3N1cmUuICovXG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDstcCB3aXRob3V0IHN3YXA6IHBhZ2VvdXQgdGhyZWFkIGRpc2FibGVkXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHRocmVhZF9tYXNrIFx1MDAyNj0gfnBhZ2VvdXRfYml0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0a3NmdF9zZXRfcGxhbigxKTtcbiYjNDM7XG4mIzQzO1x0dGhwX3NhdmVfc2V0dGluZ3MoKTtcbiYjNDM7XHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1x0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTUFEVklTRTtcbiYjNDM7XHRzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7XG4mIzQzO1x0c2V0dGluZ3Muc2htZW1fZW5hYmxlZCA9IFNITUVNX05FVkVSO1xuJiM0MztcdHNldHRpbmdzLmtodWdlcGFnZWQuZGVmcmFnID0gMTtcbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID1cbiYjNDM7XHRcdHN0cmNtcChtb2RlLCBcJiMzNDtmcmVlXCYjMzQ7KSA/IDEwMDAgOiAwO1xuJiM0MztcdHNldHRpbmdzLmtodWdlcGFnZWQuYWxsb2Nfc2xlZXBfbWlsbGlzZWNzID0gMTA7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBtVEhQIGNvbGxhcHNlIG9ubHkgc3VwcG9ydHMgdGhlIHR3byBlbmRzIG9mIHRoZSBvY2N1cGFuY3lcbiYjNDM7XHQgKiBzY2FsZTogMCBvciBIUEFHRV9QTURfTlIgLSAxIChhbnl0aGluZyBlbHNlIGNvZXJjZXMgdG8gMCkuXG4mIzQzO1x0ICogU3RyaWN0IGlzIHRoZSBkZWZhdWx0IOKAlCBpdCBhbHNvIGtlZXBzIGtodWdlcGFnZWQgZnJvbSBidXJuaW5nXG4mIzQzO1x0ICogdGhlIHdob2xlIHN0ZXAgaW4gZG9vbWVkIFBNRC1zaXplZCBhbGxvY2F0aW9ucyBvbiA1MTJNLVBNRFxuJiM0MztcdCAqIGNvbmZpZ3MsIHdoZXJlIGEgZnVsbHkgcG9wdWxhdGVkIGFyZWEgaXMgcmFyZSB1bmRlciByYWNpbmdcbiYjNDM7XHQgKiBNQURWX0RPTlRORUVELiAteiBzZWxlY3RzIHRoZSBwZXJtaXNzaXZlIGVuZDogc2VsZWN0aW9uIHRoZW5cbiYjNDM7XHQgKiBlbWl0cyBob2xlLWhlYXZ5IHdpbmRvd3MgYW5kIHRoZSBlbmdpbmUmIzM5O3MgcG9wdWxhdGlvbiBwYXRoc1xuJiM0MztcdCAqIHRha2UgdGhlIGJydW50IG9mIHRoZSByYWNpbmcgZmF1bHRzIGFuZCB6YXBzLlxuJiM0MztcdCAqL1xuJiM0MztcdHNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IHBlcm1pc3NpdmVfbm9uZSA/XG4mIzQzO1x0XHQoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpIC0gMSA6IDA7XG4mIzQzO1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID1cbiYjNDM7XHRcdG5yX2FyZWFzICogKGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSAqIDg7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGkpKVxuJiM0MztcdFx0XHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xuJiM0MztcdH1cbiYjNDM7XHQvKiBCYXNlIG9mIHRoZSBzZXR0aW5ncyBzdGFjazsgdGhlIGJvdHRvbSBlbnRyeSBpcyBuZXZlciBwb3BwZWQuICovXG4mIzQzO1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcbiYjNDM7XHRyZWdpb24gPSBtbWFwKEJBU0VfQUREUiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcbiYjNDM7XHRcdCAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSxcbiYjNDM7XHRcdCAgICAgIC0xLCAwKTtcbiYjNDM7XHRpZiAocmVnaW9uICE9IEJBU0VfQUREUilcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtGYWlsZWQgdG8gYWxsb2NhdGUgVk1BIGF0ICVwXFxuXCYjMzQ7LCBCQVNFX0FERFIpO1xuJiM0MztcdG1yZW1hcF9hcmVhID0gcmVnaW9uICYjNDM7IG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplO1xuJiM0MztcdG1yZW1hcF9zY3JhdGNoID0gKGNoYXIgKilCQVNFX0FERFIgJiM0MzsgMiAqIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemU7XG4mIzQzO1xuJiM0MztcdGlmICh0aHJlYWRfbWFzayBcdTAwMjYgcGFnZW91dF9iaXQpIHtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBCaWcgZW5vdWdoIHRvIGN5Y2xlIHJlYWwgcmVjbGFpbSwgc21hbGwgZW5vdWdoIG5vdCB0b1xuJiM0MztcdFx0ICogZG9taW5hdGUgYSBUQ0cgZ3Vlc3Q6IDQgUE1EIGFyZWFzLCBjbGFtcGVkIHRvIFsxNk0sIDY0TV0uXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdHBhZ2VvdXRfc2l6ZSA9IDQgKiBocGFnZV9wbWRfc2l6ZTtcbiYjNDM7XHRcdHBhZ2VvdXRfc2l6ZSA9IHBhZ2VvdXRfc2l6ZSBcdTAwM2MgKDE2VUwgXHUwMDNjXHUwMDNjIDIwKSA/ICgxNlVMIFx1MDAzY1x1MDAzYyAyMCkgOlxuJiM0MztcdFx0XHQgICAgICAgcGFnZW91dF9zaXplIFx1MDAzZSAoNjRVTCBcdTAwM2NcdTAwM2MgMjApID8gKDY0VUwgXHUwMDNjXHUwMDNjIDIwKSA6XG4mIzQzO1x0XHRcdCAgICAgICBwYWdlb3V0X3NpemU7XG4mIzQzO1x0XHRwYWdlb3V0X2FyZWEgPSBtbWFwKE5VTEwsIHBhZ2VvdXRfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbiYjNDM7XHRcdFx0XHQgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XG4mIzQzO1x0XHRpZiAocGFnZW91dF9hcmVhID09IE1BUF9GQUlMRUQpXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttbWFwKCkgcGFnZW91dCBhcmVhXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFBvcHVsYXRlIHNvIHRoZSBmaXJzdCBwYXNzIGhhcyBzb21ldGhpbmcgdG8gY29sbGFwc2UuICovXG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0Kih1bnNpZ25lZCBpbnQgKikocmVnaW9uICYjNDM7IGkgKiBwYWdlX3NpemUpID0gcGF0dGVybihpKTtcbiYjNDM7XHRtZW1zZXQobXJlbWFwX2FyZWEsIDEsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRtYWR2aXNlKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3RocmVhZHM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAoISh0aHJlYWRfbWFzayBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgaSkpKSB7XG4mIzQzO1x0XHRcdHRocmVhZHNbaV0gPSAwO1xuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChwdGhyZWFkX2NyZWF0ZShcdTAwMjZ0aHJlYWRzW2ldLCBOVUxMLCB0aHJlYWRfZm5zW2ldLFxuJiM0MztcdFx0XHRcdCAgICh2b2lkICopKGkgJiM0MzsgMSkpKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7cHRocmVhZF9jcmVhdGUoKVwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRlbmRfbXMgPSBub3dfbXMoKSAmIzQzOyBkdXJhdGlvbl9zICogMTAwMFVMO1xuJiM0MztcdGlmICghc3RyY21wKG1vZGUsIFwmIzM0O3N0ZXBwZWRcJiMzNDspKSB7XG4mIzQzO1x0XHR3aGlsZSAobm93X21zKCkgXHUwMDNjIGVuZF9tcyBcdTAwMjZcdTAwMjYgIWNvcnJ1cHRlZCkge1xuJiM0MztcdFx0XHRpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKDYwMCkpXG4mIzQzO1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O2todWdlcGFnZWQgcGFzcyB0aW1lZCBvdXRcXG5cJiMzNDspO1xuJiM0MztcdFx0XHRzdGVwcyYjNDM7JiM0Mzs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fSBlbHNlIGlmICghc3RyY21wKG1vZGUsIFwmIzM0O2ZyZWVcJiMzNDspKSB7XG4mIzQzO1x0XHR3aGlsZSAobm93X21zKCkgXHUwMDNjIGVuZF9tcyBcdTAwMjZcdTAwMjYgIWNvcnJ1cHRlZClcbiYjNDM7XHRcdFx0dXNsZWVwKDEwMCAqIDEwMDApO1xuJiM0MztcdH0gZWxzZSB7XHQvKiBtYWR2aXNlICovXG4mIzQzO1x0XHR3aGlsZSAobm93X21zKCkgXHUwMDNjIGVuZF9tcyBcdTAwMjZcdTAwMjYgIWNvcnJ1cHRlZCkge1xuJiM0MztcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9zaGFyZWRfYXJlYXM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdFx0bWFkdmlzZShyZWdpb24gJiM0MzsgaSAqIGhwYWdlX3BtZF9zaXplLFxuJiM0MztcdFx0XHRcdFx0aHBhZ2VfcG1kX3NpemUsIE1BRFZfQ09MTEFQU0UpO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdG1hZHZpc2UocmVnaW9uLCBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcbiYjNDM7XHRcdFx0XHRNQURWX0RPTlRORUVEKTtcbiYjNDM7XHRcdFx0c3RlcHMmIzQzOyYjNDM7O1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0c3RvcCA9IDE7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfdGhyZWFkczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmICh0aHJlYWRzW2ldKVxuJiM0MztcdFx0XHRwdGhyZWFkX2pvaW4odGhyZWFkc1tpXSwgTlVMTCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBGaW5hbCBpbnRlZ3JpdHkgc3dlZXAuICovXG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0Y2hlY2tfcGFnZShpKTtcbiYjNDM7XG4mIzQzO1x0dGhwX3Jlc3RvcmVfc2V0dGluZ3MoKTtcbiYjNDM7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdCghY29ycnVwdGVkLCBcJiMzNDslczogJWRzLCAlZCBzdGVwcywgbm8gY29ycnVwdGlvblxcblwmIzM0OyxcbiYjNDM7XHRcdFx0IG1vZGUsIGR1cmF0aW9uX3MsIHN0ZXBzKTtcbiYjNDM7XHRrc2Z0X2ZpbmlzaGVkKCk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMTMyMTVjYjM3MGNlYlxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmNcbkBAIC0wLDAgJiM0MzsxLDE5OCBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKlxuJiM0MzsgKiBTeW5jaHJvbm91cyBraHVnZXBhZ2VkIGRyaXZpbmcgY2hlY2suXG4mIzQzOyAqXG4mIzQzOyAqIFJhY2UgdGVzdHMgZHJpdmUga2h1Z2VwYWdlZCB0aHJvdWdoIHRoZSBleGlzdGluZyBzeXNmcyBjb250cm9sczogYVxuJiM0MzsgKiBzdG9yZSB0byBzY2FuX3NsZWVwX21pbGxpc2VjcyB3YWtlcyB0aGUgZGFlbW9uLCBhbmQgZnVsbF9zY2Fuc1xuJiM0MzsgKiBhZHZhbmNpbmcgYnkgdHdvIGlzIGEgY29tcGxldGlvbiBiYXJyaWVyIGZvciBvbmUgZnVsbCBwYXNzIHRoYXRcbiYjNDM7ICogc3RhcnRlZCBhZnRlciBzZXR1cCAoa2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSkuIFZlcmlmeSB0aGUgcGFpciBnaXZlc1xuJiM0MzsgKiBkZXRlcm1pbmlzdGljLCBhdHRyaWJ1dGFibGUgcmVzdWx0czogb25lIGJhcnJpZXIgc3RlcCBvdmVyIG9uZVxuJiM0MzsgKiBwcmVwYXJlZCB3aW5kb3cgcHJvZHVjZXMgZXhhY3RseSBvbmUgY29sbGFwc2UgYXR0ZW1wdCBvbiB0aGF0XG4mIzQzOyAqIHdpbmRvdyYjMzk7cyBzb3VyY2UgcGFnZXMg4oCUIG1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlIGV2ZW50c1xuJiM0MzsgKiBmaWx0ZXJlZCBieSBzb3VyY2UgUEZOIGFuZCBvcmRlciDigJQgYW5kIHRoZSB3aW5kb3cgaXMgY29sbGFwc2VkXG4mIzQzOyAqIGFmdGVyd2FyZHMsIHJlcGVhdGFibHkuXG4mIzQzOyAqXG4mIzQzOyAqIHNjYW5fc2xlZXBfbWlsbGlzZWNzIGlzIHNldCB0byA2MHMgdG8gcHJvdmUgdGhlIHdha2UgcGF0aDogd2l0aG91dFxuJiM0MzsgKiB0aGUgd2FrZSwgb25lIGJhcnJpZXIgc3RlcCB3b3VsZCBzbGVlcCBtdWx0aXBsZXMgb2YgdGhhdCBhbmQgYmxvd1xuJiM0MzsgKiB0aGUgdGltZW91dC4gSXQgYWxzbyBrZWVwcyB0aGUgZGFlbW9uIGZyb20gZnJlZS1ydW5uaW5nIGJldHdlZW5cbiYjNDM7ICogc3RlcHMsIHBlciB0aGUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSBkaXNjaXBsaW5lLlxuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7a3NlbGZ0ZXN0LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7dm1fdXRpbC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2h1Z2VwYWdlX3NldHRpbmdzLmhcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQkFTRV9BRERSICgodm9pZCAqKSgxVUwgXHUwMDNjXHUwMDNjIDMwKSlcbiYjNDM7I2RlZmluZSBUQVJHRVRfT1JERVIgMlx0Lyogc21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCBjb25zaWRlcnMgKi9cbiYjNDM7I2RlZmluZSBOUl9JVEVSQVRJT05TIDVcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcGFnZW1hcF9mZDtcbiYjNDM7c3RhdGljIGludCBrcGFnZWZsYWdzX2ZkO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIENvdW50IGNvbGxhcHNlIGF0dGVtcHRzIGF0dHJpYnV0YWJsZSB0byBvdXIgd2luZG93OiBsZWdhY3ktZW5naW5lXG4mIzQzOyAqIGlzb2xhdGUgZXZlbnRzIHdob3NlIHNjYW5fcGZuIGlzIG9uZSBvZiB0aGUgd2luZG93JiMzOTtzIHNvdXJjZSBQRk5zLFxuJiM0MzsgKiBwbHVzIGJhdGNoLWVuZ2luZSBwZXItY2FuZGlkYXRlIGluc3RhbGwgZXZlbnRzIGF0IHRoZSB3aW5kb3cmIzM5O3NcbiYjNDM7ICogYWRkcmVzcy4gRWl0aGVyIGVuZ2luZSByZXBvcnRzIGV4YWN0bHkgb25jZSBwZXIgYXR0ZW1wdC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgY291bnRfYXR0cmlidXRlZCh1bnNpZ25lZCBsb25nICpwZm5zLCBpbnQgbnJfcGZucyxcbiYjNDM7XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgaW50IG9yZGVyKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBsaW5lWzEwMjRdO1xuJiM0MztcdGludCBjb3VudCA9IDA7XG4mIzQzO1x0RklMRSAqZnA7XG4mIzQzO1xuJiM0MztcdGZwID0gdHJhY2luZ19vcGVuX3RyYWNlKCk7XG4mIzQzO1x0aWYgKCFmcClcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtDYW5ub3Qgb3BlbiB0cmFjZSBidWZmZXJcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpIHtcbiYjNDM7XHRcdGNoYXIgKnM7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHZhbDtcbiYjNDM7XHRcdHVuc2lnbmVkIGludCBvcmQ7XG4mIzQzO1x0XHRjaGFyICpvO1xuJiM0MztcdFx0aW50IGk7XG4mIzQzO1xuJiM0MztcdFx0cyA9IHN0cnN0cihsaW5lLCBcJiMzNDttbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTpcJiMzNDspO1xuJiM0MztcdFx0aWYgKHMpIHtcbiYjNDM7XHRcdFx0aWYgKHNzY2FuZihzLCBcJiMzNDttbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTogc2Nhbl9wZm49MHglbHhcJiMzNDssXG4mIzQzO1x0XHRcdFx0ICAgXHUwMDI2dmFsKSAhPSAxKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHRvID0gc3Ryc3RyKHMsIFwmIzM0O29yZGVyPVwmIzM0Oyk7XG4mIzQzO1x0XHRcdGlmICghbyB8fCBzc2NhbmYobywgXCYjMzQ7b3JkZXI9JXVcJiMzNDssIFx1MDAyNm9yZCkgIT0gMSB8fFxuJiM0MztcdFx0XHQgICAgb3JkICE9IG9yZGVyKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wZm5zOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRcdGlmICh2YWwgPT0gcGZuc1tpXSkge1xuJiM0MztcdFx0XHRcdFx0Y291bnQmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRcdFx0fVxuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdHMgPSBzdHJzdHIobGluZSwgXCYjMzQ7bW1fY29sbGFwc2VfY2FuZGlkYXRlOlwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAocykge1xuJiM0MztcdFx0XHRpZiAoIXN0cnN0cihzLCBcJiMzNDtwYXNzPWluc3RhbGxcJiMzNDspIHx8XG4mIzQzO1x0XHRcdCAgICAhc3Ryc3RyKHMsIFwmIzM0O3Jlc3VsdD1zdWNjZWVkZWRcJiMzNDspKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHRvID0gc3Ryc3RyKHMsIFwmIzM0O2FkZHI9XCYjMzQ7KTtcbiYjNDM7XHRcdFx0aWYgKCFvIHx8IHNzY2FuZihvLCBcJiMzNDthZGRyPTB4JWx4XCYjMzQ7LCBcdTAwMjZ2YWwpICE9IDEgfHxcbiYjNDM7XHRcdFx0ICAgIHZhbCAhPSBhZGRyKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHRvID0gc3Ryc3RyKHMsIFwmIzM0O29yZGVyPVwmIzM0Oyk7XG4mIzQzO1x0XHRcdGlmICghbyB8fCBzc2NhbmYobywgXCYjMzQ7b3JkZXI9JXVcJiMzNDssIFx1MDAyNm9yZCkgIT0gMSB8fFxuJiM0MztcdFx0XHQgICAgb3JkICE9IG9yZGVyKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHRjb3VudCYjNDM7JiM0Mzs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO1x0cmV0dXJuIGNvdW50O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBvbmVfc3RlcChpbnQgaXRlcmF0aW9uKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3Qgc2l6ZV90IHdpbmRvdyA9IGdldHBhZ2VzaXplKCkgXHUwMDNjXHUwMDNjIFRBUkdFVF9PUkRFUjtcbiYjNDM7XHRjb25zdCBpbnQgbnJfcGFnZXMgPSAxIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVI7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwZm5zWzEgXHUwMDNjXHUwMDNjIFRBUkdFVF9PUkRFUl07XG4mIzQzO1x0Ym9vbCBjb2xsYXBzZWQ7XG4mIzQzO1x0aW50IGF0dHJpYnV0ZWQ7XG4mIzQzO1x0Y2hhciAqcDtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0cCA9IG1tYXAoQkFTRV9BRERSLCBocGFnZV9wbWRfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbiYjNDM7XHRcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTtcbiYjNDM7XHRpZiAocCAhPSBCQVNFX0FERFIpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7RmFpbGVkIHRvIGFsbG9jYXRlIFZNQSBhdCAlcFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICBCQVNFX0FERFIpO1xuJiM0MztcbiYjNDM7XHQvKiBQcmVwYXJlIG9uZSB3aW5kb3c7IHJlY29yZCBpdHMgc291cmNlIFBGTnMuICovXG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRwW2kgKiBnZXRwYWdlc2l6ZSgpXSA9IGkgJiM0MzsgMTtcbiYjNDM7XHRcdHBmbnNbaV0gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcCAmIzQzOyBpICogZ2V0cGFnZXNpemUoKSk7XG4mIzQzO1x0XHRpZiAocGZuc1tpXSA9PSAtMVVMKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7U291cmNlIHBhZ2Ugbm90IHByZXNlbnRcXG5cJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHRyYWNpbmdfZXZlbnRzX3N0YXJ0KFwmIzM0O2h1Z2VfbWVtb3J5XCYjMzQ7KSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtDYW5ub3QgZW5hYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuJiM0MztcdC8qIFdhaXQgdXAgdG8gMTIwIHNlY29uZHMgZm9yIHRoZSBwYXNzIHRvIGNvbXBsZXRlLiAqL1xuJiM0MztcdGlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoMTIwKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtraHVnZXBhZ2VkIGRpZCBub3QgY29tcGxldGUgYSBmdWxsIHBhc3NcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHR0cmFjaW5nX2V2ZW50c19zdG9wKFwmIzM0O2h1Z2VfbWVtb3J5XCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0Y29sbGFwc2VkID0gaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCB3aW5kb3csIFRBUkdFVF9PUkRFUixcbiYjNDM7XHRcdFx0XHRcdFx0ICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpO1xuJiM0MztcdGF0dHJpYnV0ZWQgPSBjb3VudF9hdHRyaWJ1dGVkKHBmbnMsIG5yX3BhZ2VzLCAodW5zaWduZWQgbG9uZylwLFxuJiM0MztcdFx0XHRcdCAgICAgIFRBUkdFVF9PUkRFUik7XG4mIzQzO1xuJiM0MztcdGtzZnRfdGVzdF9yZXN1bHQoY29sbGFwc2VkIFx1MDAyNlx1MDAyNiBhdHRyaWJ1dGVkID09IDEsXG4mIzQzO1x0XHRcdCBcJiMzNDtzdGVwICVkOiB3aW5kb3cgY29sbGFwc2VkLCAlZCBhdHRyaWJ1dGVkIHJlc3VsdChzKVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0IGl0ZXJhdGlvbiwgYXR0cmlidXRlZCk7XG4mIzQzO1xuJiM0MztcdG11bm1hcChwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBtYWluKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3ByaW50X2hlYWRlcigpO1xuJiM0MztcbiYjNDM7XHRpZiAoIXRocF9hdmFpbGFibGUoKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxuXCYjMzQ7KTtcbiYjNDM7XHRpZiAoISh0aHBfc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVIpKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O09yZGVyICVkIGlzIG5vdCBhIHN1cHBvcnRlZCBhbm9uIFRIUCBvcmRlclxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgIFRBUkdFVF9PUkRFUik7XG4mIzQzO1xuJiM0MztcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcbiYjNDM7XHRpZiAoIWhwYWdlX3BtZF9zaXplKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1JlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxcblwmIzM0Oyk7XG4mIzQzO1x0cGFnZW1hcF9mZCA9IG9wZW4oXCYjMzQ7L3Byb2Mvc2VsZi9wYWdlbWFwXCYjMzQ7LCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKHBhZ2VtYXBfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7b3BlbihcXFwmIzM0Oy9wcm9jL3NlbGYvcGFnZW1hcFxcXCYjMzQ7KVwmIzM0Oyk7XG4mIzQzO1x0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXCYjMzQ7L3Byb2Mva3BhZ2VmbGFnc1wmIzM0OywgT19SRE9OTFkpO1xuJiM0MztcdGlmIChrcGFnZWZsYWdzX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7b3BlbihcXFwmIzM0Oy9wcm9jL2twYWdlZmxhZ3NcXFwmIzM0OykgcmVxdWlyZXMgcm9vdFxcblwmIzM0Oyk7XG4mIzQzO1x0aWYgKHRyYWNpbmdfZXZlbnRzX3N0YXJ0KFwmIzM0O2h1Z2VfbWVtb3J5XCYjMzQ7KSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O3RyYWNlZnMgdW5hdmFpbGFibGVcXG5cJiMzNDspO1xuJiM0MztcdHRyYWNpbmdfZXZlbnRzX3N0b3AoXCYjMzQ7aHVnZV9tZW1vcnlcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3NldF9wbGFuKE5SX0lURVJBVElPTlMpO1xuJiM0MztcbiYjNDM7XHR0aHBfc2F2ZV9zZXR0aW5ncygpO1xuJiM0MztcdHRocF9yZWFkX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9NQURWSVNFO1xuJiM0MztcdHNldHRpbmdzLnRocF9kZWZyYWcgPSBUSFBfREVGUkFHX0FMV0FZUztcbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7XG4mIzQzO1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5zY2FuX3NsZWVwX21pbGxpc2VjcyA9IDYwMDAwO1xuJiM0MztcdHNldHRpbmdzLmtodWdlcGFnZWQuYWxsb2Nfc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7XG4mIzQzO1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gKGhwYWdlX3BtZF9zaXplIC8gZ2V0cGFnZXNpemUoKSkgLSAxO1xuJiM0MztcdC8qIE9uZSB3YWtlIG11c3QgY29tcGxldGUgb25lIGZ1bGwgcGFzczsgc2VlIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkuICovXG4mIzQzO1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID0gMVVMIFx1MDAzY1x1MDAzYyAyNDtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XG4mIzQzO1x0c2V0dGluZ3MuaHVnZXBhZ2VzW1RBUkdFVF9PUkRFUl0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xuJiM0MztcdC8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZC4gKi9cbiYjNDM7XHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5SX0lURVJBVElPTlM7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0b25lX3N0ZXAoaSk7XG4mIzQzO1xuJiM0MztcdHRocF9yZXN0b3JlX3NldHRpbmdzKCk7XG4mIzQzO1xuJiM0MztcdGtzZnRfZmluaXNoZWQoKTtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcbmluZGV4IDY4N2QxMTVlM2JkODAuLmY4MjZjZjk0MGMzZDQgMTAwNzU1XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcbkBAIC00MDIsMTAgJiM0Mzs0MDIsMjcgQEAgQ0FURUdPUlk9XCYjMzQ7cGZubWFwXCYjMzQ7IHJ1bl90ZXN0IC4vcGZubWFwXG4gIyBDT1cgdGVzdHNcbiBDQVRFR09SWT1cJiMzNDtjb3dcJiMzNDsgcnVuX3Rlc3QgLi9jb3dcbiBcbiYjNDM7Q0FURUdPUlk9XCYjMzQ7dGhwXCYjMzQ7IHJ1bl90ZXN0IC4vZm9saW9fb3JkZXJfY2hlY2tcbiYjNDM7XG4mIzQzO1xuJiM0MztDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3N5bmNfY2hlY2tcbiYjNDM7XG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIHN0ZXBwZWRcbiYjNDM7XG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIGZyZWVcbiYjNDM7XG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIG1hZHZpc2VcbiYjNDM7XG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIHN0ZXBwZWQgLXpcbiYjNDM7XG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIHN0ZXBwZWQgLXBcbiYjNDM7XG4gQ0FURUdPUlk9XCYjMzQ7dGhwXCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZFxuIFxuIENBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgMlxuIFxuJiM0MztDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1vIDIga2h1Z2VwYWdlZDphbm9uXG4mIzQzO1xuIENBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgYWxsOnNobWVtXG4gXG4gQ0FURUdPUlk9XCYjMzQ7dGhwXCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyA0IGFsbDpzaG1lbVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXG5pbmRleCAzMmI5OTE0NzJmNzQ0Li45YjM4ODViZDAwMWJlIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuQEAgLTQyLDY4ICYjNDM7NDIsNiBAQCBjb25zdCBjaGFyICprcGFnZWZsYWdzX3Byb2MgPSBcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXCYjMzQ7O1xuIGludCBwYWdlbWFwX2ZkO1xuIGludCBrcGFnZWZsYWdzX2ZkO1xuIFxuLXN0YXRpYyBib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbi1cdFx0aW50IGtwYWdlZmxhZ3NfZmQpXG4te1xuLVx0Y29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDtcbi1cdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XG4tXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbi1cdHVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7XG4tXHR1aW50NjRfdCBwZm5fZmxhZ3M7XG4tXHR1bnNpZ25lZCBsb25nIHBmbjtcbi1cdHVuc2lnbmVkIGxvbmcgaTtcbi1cbi1cdHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XG4tXG4tXHQvKiBub24gcHJlc2VudCBwYWdlICovXG4tXHRpZiAocGZuID09IC0xVUwpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbi1cdFx0Z290byBmYWlsO1xuLVxuLVx0LyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi9cbi1cdGlmICghb3JkZXIpIHtcbi1cdFx0aWYgKHBmbl9mbGFncyBcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcbi1cdFx0XHRyZXR1cm4gZmFsc2U7XG4tXHRcdHJldHVybiB0cnVlO1xuLVx0fVxuLVxuLVx0Lyogbm9uIFRIUCBmb2xpbyAqL1xuLVx0aWYgKCEocGZuX2ZsYWdzIFx1MDAyNiBLUEZfVEhQKSlcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVxuLVx0cGZuX2hlYWQgPSBwZm4gXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcbi1cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuLVx0XHRnb3RvIGZhaWw7XG4tXG4tXHQvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqL1xuLVx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xuLVx0Zm9yIChpID0gMTsgaSBcdTAwM2MgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7XG4tXHRcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IGksIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdFx0Z290byBmYWlsO1xuLVx0XHRpZiAoKHBmbl9mbGFncyBcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncylcbi1cdFx0XHRyZXR1cm4gZmFsc2U7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcbi1cdCAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXJcbi1cdCAqL1xuLVx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdHJldHVybiB0cnVlO1xuLVxuLVx0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuLVx0cmV0dXJuIChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7XG4tZmFpbDpcbi1cdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXG5cJiMzNDspO1xuLVx0cmV0dXJuIGZhbHNlO1xuLX1cbi1cbiBzdGF0aWMgaW50IHZhZGRyX3BhZ2VmbGFnc19nZXQoY2hhciAqdmFkZHIsIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCxcbiBcdFx0dWludDY0X3QgKmZsYWdzKVxuIHtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmNcbmluZGV4IGVmMWVhMTE5ODFhNzQuLjg4NmZiM2RlOWMwMTEgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xuQEAgLTMwMyw2ICYjNDM7MzAzLDE2MyBAQCBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncylcbiBcdHJldHVybiAwO1xuIH1cbiBcbiYjNDM7Ym9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsXG4mIzQzO1x0XHRcdGludCBrcGFnZWZsYWdzX2ZkKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDtcbiYjNDM7XHRjb25zdCB1aW50NjRfdCBmb2xpb190YWlsX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9UQUlMO1xuJiM0MztcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXHUwMDNjXHUwMDNjIG9yZGVyO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7XG4mIzQzO1x0dWludDY0X3QgcGZuX2ZsYWdzO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgcGZuO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgaTtcbiYjNDM7XG4mIzQzO1x0cGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTtcbiYjNDM7XG4mIzQzO1x0Lyogbm9uIHByZXNlbnQgcGFnZSAqL1xuJiM0MztcdGlmIChwZm4gPT0gLTFVTClcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcbiYjNDM7XHQvKiBjaGVjayBmb3Igb3JkZXItMCBwYWdlcyAqL1xuJiM0MztcdGlmICghb3JkZXIpIHtcbiYjNDM7XHRcdGlmIChwZm5fZmxhZ3MgXHUwMDI2IChmb2xpb19oZWFkX2ZsYWdzIHwgZm9saW9fdGFpbF9mbGFncykpXG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Lyogbm9uIFRIUCBmb2xpbyAqL1xuJiM0MztcdGlmICghKHBmbl9mbGFncyBcdTAwMjYgS1BGX1RIUCkpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdHBmbl9oZWFkID0gcGZuIFx1MDAyNiB+KG5yX3BhZ2VzIC0gMSk7XG4mIzQzO1xuJiM0MztcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcbiYjNDM7XHQvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqL1xuJiM0MztcdGlmICgocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb19oZWFkX2ZsYWdzKSAhPSBmb2xpb19oZWFkX2ZsYWdzKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHQvKiBjaGVjayBhbGwgdGFpbCBQRk4gZmxhZ3MgKi9cbiYjNDM7XHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IGksIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4mIzQzO1x0XHRcdGdvdG8gZmFpbDtcbiYjNDM7XHRcdGlmICgocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIGNoZWNrIHRoZSBQRk4gYWZ0ZXIgdGhpcyBmb2xpbywgYnV0IGlmIGl0cyBmbGFncyBjYW5ub3QgYmUgb2J0YWluZWQsXG4mIzQzO1x0ICogYXNzdW1lIHRoaXMgZm9saW8gaGFzIHRoZSBleHBlY3RlZCBvcmRlclxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IG5yX3BhZ2VzLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuJiM0MztcdFx0cmV0dXJuIHRydWU7XG4mIzQzO1xuJiM0MztcdC8qIElmIHdlIGZpbmQgYW5vdGhlciB0YWlsIHBhZ2UsIHRoZW4gdGhlIGZvbGlvIGlzIGxhcmdlci4gKi9cbiYjNDM7XHRyZXR1cm4gKHBmbl9mbGFncyBcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncztcbiYjNDM7ZmFpbDpcbiYjNDM7XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7RmFpbGVkIHRvIGdldCBmb2xpbyBpbmZvXFxuXCYjMzQ7KTtcbiYjNDM7XHRyZXR1cm4gZmFsc2U7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIENoZWNrIHdoZXRoZXIgdGhlIHJhbmdlIFtzdGFydCwgc3RhcnQgJiM0MzsgbGVuKSBpcyBiYWNrZWQgYnkgZm9saW9zIG9mXG4mIzQzOyAqIGV4YWN0bHkgQG9yZGVyLCBtYXBwZWQgYXQgdGhlaXIgbmF0dXJhbCBhbGlnbm1lbnQuXG4mIzQzOyAqXG4mIzQzOyAqIGlzX2JhY2tlZF9ieV9mb2xpbygpIGNsYXNzaWZpZXMgdGhlIGZvbGlvIGJhY2tpbmcgb25lIHBhZ2U7IGhlcmUgd2VcbiYjNDM7ICogYWRkaXRpb25hbGx5IHJlcXVpcmUgdGhhdCBlYWNoIG9yZGVyLWFsaWduZWQgd2luZG93IG9mIHRoZSByYW5nZSBtYXBzXG4mIzQzOyAqIG9uZSBzdWNoIGZvbGlvIGhlYWQtdG8tdGFpbDogdGhlIFZBIHJhbmdlIG11c3QgYmUgbmF0dXJhbGx5IGFsaWduZWQsXG4mIzQzOyAqIGVhY2ggd2luZG93JiMzOTtzIFBGTiBydW4gbXVzdCBiZSBjb250aWd1b3VzLCBhbmQgdGhlIGZpcnN0IFBGTiBtdXN0IGJlXG4mIzQzOyAqIHRoZSAobmF0dXJhbGx5IGFsaWduZWQpIGZvbGlvIGhlYWQuXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgaXMgdGhlIGNoZWNrIFwmIzM0O2RpZCB0aGlzIHJhbmdlIGNvbGxhcHNlIGludG8gb3JkZXItQG9yZGVyIGZvbGlvc1wmIzM0OzpcbiYjNDM7ICogYSB3aW5kb3cgYXNzZW1ibGVkIGZyb20gcGFydHMgb2Ygc2V2ZXJhbCBmb2xpb3MsIG9yIG1hcHBpbmcgYSBmb2xpb1xuJiM0MzsgKiBzaGlmdGVkIGZyb20gaXRzIG5hdHVyYWwgcG9zaXRpb24sIGZhaWxzLlxuJiM0MzsgKi9cbiYjNDM7Ym9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsXG4mIzQzO1x0XHRcdFx0ICAgICBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbiYjNDM7XHRjb25zdCBzaXplX3Qgd2luZG93ID0gbnJfcGFnZXMgKiBwc2l6ZSgpO1xuJiM0MztcdGNoYXIgKnZhZGRyO1xuJiM0MztcbiYjNDM7XHRpZiAoKHVpbnRwdHJfdClzdGFydCAlIHdpbmRvdyB8fCBsZW4gJSB3aW5kb3cpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdGZvciAodmFkZHIgPSBzdGFydDsgdmFkZHIgXHUwMDNjIHN0YXJ0ICYjNDM7IGxlbjsgdmFkZHIgJiM0Mzs9IHdpbmRvdykge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBpO1xuJiM0MztcbiYjNDM7XHRcdC8qIE5vdCBwcmVzZW50LCBvciBub3QgbWFwcGluZyB0aGUgZm9saW8gaGVhZC4gKi9cbiYjNDM7XHRcdGlmIChwZm4gPT0gLTFVTCB8fCBwZm4gJSBucl9wYWdlcylcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHRcdGZvciAoaSA9IDE7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRpZiAocGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyICYjNDM7IGkgKiBwc2l6ZSgpKSAhPVxuJiM0MztcdFx0XHQgICAgcGZuICYjNDM7IGkpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGlmICghaXNfYmFja2VkX2J5X2ZvbGlvKHZhZGRyLCBvcmRlciwgcGFnZW1hcF9mZCxcbiYjNDM7XHRcdFx0XHRcdGtwYWdlZmxhZ3NfZmQpKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2RlZmluZSBUUkFDRUZTX1JPT1QgXCYjMzQ7L3N5cy9rZXJuZWwvdHJhY2luZ1wmIzM0O1xuJiM0MztcbiYjNDM7c3RhdGljIGludCB0cmFjaW5nX2V2ZW50c193cml0ZShjb25zdCBjaGFyICpzdWJzeXMsIGNvbnN0IGNoYXIgKnZhbClcbiYjNDM7e1xuJiM0MztcdGNoYXIgcGF0aFsyNTZdO1xuJiM0MztcdGludCBmZDtcbiYjNDM7XG4mIzQzO1x0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBUUkFDRUZTX1JPT1QgXCYjMzQ7L2V2ZW50cy8lcy9lbmFibGVcJiMzNDssXG4mIzQzO1x0XHQgc3Vic3lzKTtcbiYjNDM7XHRmZCA9IG9wZW4ocGF0aCwgT19XUk9OTFkpO1xuJiM0MztcdGlmIChmZCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRpZiAod3JpdGUoZmQsIHZhbCwgMSkgIT0gMSkge1xuJiM0MztcdFx0Y2xvc2UoZmQpO1xuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdH1cbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEVuYWJsZSBvbmUgZnRyYWNlIGV2ZW50IHN1YnN5c3RlbSAoZS5nLiBcJiMzNDtodWdlX21lbW9yeVwmIzM0OykgYW5kIGNsZWFyIHRoZVxuJiM0MzsgKiB0cmFjZSBidWZmZXIuIFJldHVybnMgLTEgaWYgdHJhY2VmcyBpcyB1bmF2YWlsYWJsZTsgcGFyc2UgdGhlIHJlc3VsdHNcbiYjNDM7ICogdmlhIHRyYWNpbmdfb3Blbl90cmFjZSgpIGFmdGVyIHRyYWNpbmdfZXZlbnRzX3N0b3AoKS5cbiYjNDM7ICovXG4mIzQzO2ludCB0cmFjaW5nX2V2ZW50c19zdGFydChjb25zdCBjaGFyICpzdWJzeXMpXG4mIzQzO3tcbiYjNDM7XHRpbnQgZmQ7XG4mIzQzO1xuJiM0MztcdGlmICh0cmFjaW5nX2V2ZW50c193cml0ZShzdWJzeXMsIFwmIzM0OzFcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRmZCA9IG9wZW4oVFJBQ0VGU19ST09UIFwmIzM0Oy90cmFjZVwmIzM0OywgT19XUk9OTFkgfCBPX1RSVU5DKTtcbiYjNDM7XHRpZiAoZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztpbnQgdHJhY2luZ19ldmVudHNfc3RvcChjb25zdCBjaGFyICpzdWJzeXMpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gdHJhY2luZ19ldmVudHNfd3JpdGUoc3Vic3lzLCBcJiMzNDswXCYjMzQ7KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7RklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gZm9wZW4oVFJBQ0VGU19ST09UIFwmIzM0Oy90cmFjZVwmIzM0OywgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO31cbiYjNDM7XG4gLyogSWYgYGlvY3RscyYjMzk7IG5vbi1OVUxMLCB0aGUgYWxsb3dlZCBpb2N0bHMgd2lsbCBiZSByZXR1cm5lZCBpbnRvIHRoZSB2YXIgKi9cbiBpbnQgdWZmZF9yZWdpc3Rlcl93aXRoX2lvY3RscyhpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLFxuIFx0XHRcdCAgICAgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vciwgdWludDY0X3QgKmlvY3RscylcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcbmluZGV4IDc3OTkxNTRiNjdlZWQuLjRmZjVhMWM1YWI4ZWQgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaFxuQEAgLTk1LDYgJiM0Mzs5NSwxMCBAQCBib29sIGNoZWNrX2h1Z2VfZmlsZSh2b2lkICphZGRyLCBpbnQgbnJfaHBhZ2VzLCB1aW50NjRfdCBocGFnZV9zaXplKTtcbiBib29sIGNoZWNrX2h1Z2Vfc2htZW0odm9pZCAqYWRkciwgaW50IG5yX2hwYWdlcywgdWludDY0X3QgaHBhZ2Vfc2l6ZSk7XG4gaW50NjRfdCBhbGxvY2F0ZV90cmFuc2h1Z2Uodm9pZCAqcHRyLCBpbnQgcGFnZW1hcF9mZCk7XG4gaW50IHBhZ2VmbGFnc19nZXQodW5zaWduZWQgbG9uZyBwZm4sIGludCBrcGFnZWZsYWdzX2ZkLCB1aW50NjRfdCAqZmxhZ3MpO1xuJiM0Mztib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbiYjNDM7XHRcdFx0aW50IGtwYWdlZmxhZ3NfZmQpO1xuJiM0Mztib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMoY2hhciAqc3RhcnQsIHNpemVfdCBsZW4sIGludCBvcmRlcixcbiYjNDM7XHRcdFx0XHQgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCk7XG4gXG4gaW50IHVmZmRfcmVnaXN0ZXIoaW50IHVmZmQsIHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbixcbiBcdFx0ICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IpO1xuQEAgLTExMSw2ICYjNDM7MTE1LDkgQEAgaW50IGNsb3NlX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXApO1xuIGludCB3cml0ZV9zeXNmcyhjb25zdCBjaGFyICpmaWxlX3BhdGgsIHVuc2lnbmVkIGxvbmcgdmFsKTtcbiBpbnQgcmVhZF9zeXNmcyhjb25zdCBjaGFyICpmaWxlX3BhdGgsIHVuc2lnbmVkIGxvbmcgKnZhbCk7XG4gYm9vbCBzb2Z0ZGlydHlfc3VwcG9ydGVkKHZvaWQpO1xuJiM0MztpbnQgdHJhY2luZ19ldmVudHNfc3RhcnQoY29uc3QgY2hhciAqc3Vic3lzKTtcbiYjNDM7aW50IHRyYWNpbmdfZXZlbnRzX3N0b3AoY29uc3QgY2hhciAqc3Vic3lzKTtcbiYjNDM7RklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpO1xuIFxuIHN0YXRpYyBpbmxpbmUgaW50IG9wZW5fc2VsZl9wcm9jbWFwKHN0cnVjdCBwcm9jbWFwX2ZkICpwcm9jbWFwX291dClcbiB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDMgMDE6MDM8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlcnNwYWNlIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vKikgYW5kIGRvZXMgbm90IG1ha2UgYW55IGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIGl0c2VsZi4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAzZmE0MDMyNGM5MTFjZGQ5ZjQzNTI2NmQzZWNlZWE2YjUyZWY3MWM2CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBBdWcgMyAwMTowMzoxMyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy5naXRpZ25vcmUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8uZ2l0aWdub3JlCmluZGV4IDljY2Q5ZTE0NDdlNjYuLjYxNjA0M2EwZmNkMjIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy5naXRpZ25vcmUKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLmdpdGlnbm9yZQpAQCAtNjYsMyAmIzQzOzY2LDYgQEAgbWVyZ2UKIHByY3RsX3RocF9kaXNhYmxlCiBybWFwCiBmb2xpb19zcGxpdF9yYWNlX3Rlc3QKJiM0Mztmb2xpb19vcmRlcl9jaGVjawomIzQzO2todWdlcGFnZWRfc3luY19jaGVjawomIzQzO2todWdlcGFnZWRfcmFjZQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZQppbmRleCAyNWQxMGNlZDNiM2I5Li4wMjZkNGI2MTQxNGQ0IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZQpAQCAtMTA0LDYgJiM0MzsxMDQsOSBAQCBURVNUX0dFTl9GSUxFUyAmIzQzOz0gZ3VhcmQtcmVnaW9ucwogVEVTVF9HRU5fRklMRVMgJiM0Mzs9IG1lcmdlCiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gcm1hcAogVEVTVF9HRU5fRklMRVMgJiM0Mzs9IGZvbGlvX3NwbGl0X3JhY2VfdGVzdAomIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBmb2xpb19vcmRlcl9jaGVjawomIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBraHVnZXBhZ2VkX3N5bmNfY2hlY2sKJiM0MztURVNUX0dFTl9GSUxFUyAmIzQzOz0ga2h1Z2VwYWdlZF9yYWNlCiAKIGlmbmVxICgkKEFSQ0gpLGFybTY0KQogVEVTVF9HRU5fRklMRVMgJiM0Mzs9IHNvZnQtZGlydHkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmY3MGQ3NjZmZjNlYjMKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jCkBAIC0wLDAgJiM0MzsxLDEzOCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBTZWxmLWNoZWNrIGZvciB0aGUgdm1fdXRpbCBmb2xpby1vcmRlciBkZXRlY3Rpb24gaGVscGVycywKJiM0MzsgKiBpc19iYWNrZWRfYnlfZm9saW8oKSBhbmQgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycygpLgomIzQzOyAqCiYjNDM7ICogRm9yIGV2ZXJ5IGFub24gVEhQIG9yZGVyIHRoZSBrZXJuZWwgc3VwcG9ydHMsIGZhdWx0IG1lbW9yeSBpbiB3aXRoIG9ubHkKJiM0MzsgKiB0aGF0IG9yZGVyIGVuYWJsZWQgYW5kIHZlcmlmeSB0aGUgaGVscGVycyByZXBvcnQgZXhhY3RseSB0aGF0IG9yZGVyOgomIzQzOyAqIG5vdCBhIG5laWdoYm91cmluZyBvcmRlciwgYW5kIHBsYWluIDRLIG1lbW9yeSBhcyBvcmRlciAwLiBUaGUgaGVscGVycwomIzQzOyAqIGFyZSB3aGF0IHRoZSBraHVnZXBhZ2VkIG1USFAgdGVzdHMgdXNlIHRvIGRldGVjdCBjb2xsYXBzZSByZXN1bHRzLCBzbwomIzQzOyAqIHRoZXkgbXVzdCBhZ3JlZSB3aXRoIHRoZSBrZXJuZWwmIzM5O3Mgb3duIGlkZWEgb2YgdGhlIGJhY2tpbmcgYmVmb3JlIGFueQomIzQzOyAqIGNvbGxhcHNlIHRlc3QgcmVsaWVzIG9uIHRoZW0uCiYjNDM7ICovCiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRQomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL21tYW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtrc2VsZnRlc3QuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bV91dGlsLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7aHVnZXBhZ2Vfc2V0dGluZ3MuaCYjMzQ7CiYjNDM7CiYjNDM7c3RhdGljIGludCBwYWdlbWFwX2ZkOwomIzQzO3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDsKJiM0MzsKJiM0MzsvKiBtbWFwIGFuIGFub24gVk1BIG9mIGV4YWN0bHkgQHNpemUgYnl0ZXMgYXQgYSBAc2l6ZS1hbGlnbmVkIGFkZHJlc3MuICovCiYjNDM7c3RhdGljIGNoYXIgKmFsbG9jX2FsaWduZWQoc2l6ZV90IHNpemUpCiYjNDM7ewomIzQzOwlzaXplX3QgbGVuID0gc2l6ZSAqIDI7CiYjNDM7CXVpbnRwdHJfdCBhbGlnbmVkOwomIzQzOwljaGFyICpwOwomIzQzOwomIzQzOwlwID0gbW1hcChOVUxMLCBsZW4sIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7CiYjNDM7CWlmIChwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttbWFwKCkmIzM0Oyk7CiYjNDM7CiYjNDM7CWFsaWduZWQgPSAoKHVpbnRwdHJfdClwICYjNDM7IHNpemUgLSAxKSAmYW1wOyB+KHNpemUgLSAxKTsKJiM0MzsJaWYgKGFsaWduZWQgIT0gKHVpbnRwdHJfdClwKQomIzQzOwkJbXVubWFwKHAsIGFsaWduZWQgLSAodWludHB0cl90KXApOwomIzQzOwlpZiAoYWxpZ25lZCAmIzQzOyBzaXplICE9ICh1aW50cHRyX3QpcCAmIzQzOyBsZW4pCiYjNDM7CQltdW5tYXAoKGNoYXIgKilhbGlnbmVkICYjNDM7IHNpemUsCiYjNDM7CQkgICAgICAgKHVpbnRwdHJfdClwICYjNDM7IGxlbiAtIGFsaWduZWQgLSBzaXplKTsKJiM0MzsKJiM0MzsJcmV0dXJuIChjaGFyICopYWxpZ25lZDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBFbmFibGUgb25seSBAb3JkZXIgKG9yZGVyIDA6IG5vdGhpbmcpLCBmYXVsdCBvbmUgYWxpZ25lZCB3aW5kb3cgaW4gYW5kCiYjNDM7ICogY2hlY2sgdGhlIGhlbHBlcnMgc2VlIGV4YWN0bHkgQG9yZGVyLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIGNoZWNrX29yZGVyKGludCBvcmRlcikKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTsKJiM0MzsJc2l6ZV90IHNpemUgPSBwc2l6ZSgpICZsdDsmbHQ7IG9yZGVyOwomIzQzOwlib29sIG9rID0gdHJ1ZTsKJiM0MzsJY2hhciAqcDsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBOUl9PUkRFUlM7IGkmIzQzOyYjNDM7KQomIzQzOwkJc2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7CiYjNDM7CWlmIChvcmRlcikKJiM0MzsJCXNldHRpbmdzLmh1Z2VwYWdlc1tvcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7CiYjNDM7CXRocF9wdXNoX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzOwomIzQzOwlwID0gYWxsb2NfYWxpZ25lZChzaXplKTsKJiM0MzsJKnAgPSAxOwomIzQzOwomIzQzOwlpZiAoIWlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgb3JkZXIsCiYjNDM7CQkJCQkgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O29yZGVyICVkIG5vdCBkZXRlY3RlZCBhZnRlciBmYXVsdFxuJiMzNDssIG9yZGVyKTsKJiM0MzsJCW9rID0gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogQSBsb3dlciBvcmRlciBtdXN0IGJlIHJlamVjdGVkOiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqLwomIzQzOwlpZiAob3JkZXIgJmFtcDsmYW1wOyBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIG9yZGVyIC0gMSwKJiM0MzsJCQkJCQkgICAgIHBhZ2VtYXBfZmQsCiYjNDM7CQkJCQkJICAgICBrcGFnZWZsYWdzX2ZkKSkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyICVkXG4mIzM0OywKJiM0MzsJCQkgICAgICAgb3JkZXIsIG9yZGVyIC0gMSk7CiYjNDM7CQlvayA9IGZhbHNlOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIE9yZGVyIDAgcGFnZXMgbXVzdCBub3QgbG9vayBsaWtlIGFueSBsYXJnZSBmb2xpbywgYW5kIHZpY2UgdmVyc2EuICovCiYjNDM7CWlmIChvcmRlciAmYW1wOyZhbXA7IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgMCwKJiM0MzsJCQkJCQkgICAgIHBhZ2VtYXBfZmQsCiYjNDM7CQkJCQkJICAgICBrcGFnZWZsYWdzX2ZkKSkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyIDBcbiYjMzQ7LCBvcmRlcik7CiYjNDM7CQlvayA9IGZhbHNlOwomIzQzOwl9CiYjNDM7CiYjNDM7CW11bm1hcChwLCBzaXplKTsKJiM0MzsJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0KG9rLCAmIzM0O29yZGVyICVkIGNsYXNzaWZpZWRcbiYjMzQ7LCBvcmRlcik7CiYjNDM7fQomIzQzOwomIzQzO2ludCBtYWluKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzOwomIzQzOwl1bnNpZ25lZCBsb25nIG9yZGVyczsKJiM0MzsJaW50IG9yZGVyOwomIzQzOwomIzQzOwlrc2Z0X3ByaW50X2hlYWRlcigpOwomIzQzOwomIzQzOwlpZiAoIXRocF9hdmFpbGFibGUoKSkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJcGFnZW1hcF9mZCA9IG9wZW4oJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXAmIzM0OywgT19SRE9OTFkpOwomIzQzOwlpZiAocGFnZW1hcF9mZCAmbHQ7IDApCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDtvcGVuKFwmIzM0Oy9wcm9jL3NlbGYvcGFnZW1hcFwmIzM0OykmIzM0Oyk7CiYjNDM7CWtwYWdlZmxhZ3NfZmQgPSBvcGVuKCYjMzQ7L3Byb2Mva3BhZ2VmbGFncyYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CWlmIChrcGFnZWZsYWdzX2ZkICZsdDsgMCkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7b3BlbihcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXCYjMzQ7KSByZXF1aXJlcyByb290XG4mIzM0Oyk7CiYjNDM7CiYjNDM7CW9yZGVycyA9IHRocF9zdXBwb3J0ZWRfb3JkZXJzKCk7CiYjNDM7CWlmICghb3JkZXJzKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDtObyBzdXBwb3J0ZWQgVEhQIG9yZGVyc1xuJiMzNDspOwomIzQzOwomIzQzOwlrc2Z0X3NldF9wbGFuKF9fYnVpbHRpbl9wb3Bjb3VudGwob3JkZXJzKSAmIzQzOyAxKTsKJiM0MzsKJiM0MzsJdGhwX3NhdmVfc2V0dGluZ3MoKTsKJiM0MzsJdGhwX3JlYWRfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CS8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZC4gKi8KJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CWNoZWNrX29yZGVyKDApOwomIzQzOwlmb3IgKG9yZGVyID0gMTsgb3JkZXIgJmx0OyBOUl9PUkRFUlM7IG9yZGVyJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKCEob3JkZXJzICZhbXA7ICgxVUwgJmx0OyZsdDsgb3JkZXIpKSkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWNoZWNrX29yZGVyKG9yZGVyKTsKJiM0MzsJfQomIzQzOwomIzQzOwl0aHBfcmVzdG9yZV9zZXR0aW5ncygpOwomIzQzOwomIzQzOwlrc2Z0X2ZpbmlzaGVkKCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmMKaW5kZXggZDc5MTdkY2UzYWJhYy4uYTI2YTBjZmZhOWM1YiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jCkBAIC0xODMsNiAmIzQzOzE4MywxNyBAQCB2b2lkIHRocF9yZWFkX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKQogCX0KIH0KIAomIzQzOy8qCiYjNDM7ICogV3JpdGUgb25seSBvbiBjaGFuZ2U6IGFueSBzdG9yZSB0byBhIGtodWdlcGFnZWQgc3lzZnMga25vYiB3YWtlcyB0aGUKJiM0MzsgKiBkYWVtb24sIGFuZCBzZXR0aW5ncyBwdXNoZXMvcG9wcyBtdXN0IG5vdCBzdGFydCBzY2FuIHBhc3NlcyBub2JvZHkKJiM0MzsgKiBhc2tlZCBmb3Ig4oCUIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgaXMgdGhlIG9ubHkgc2FuY3Rpb25lZCB3YWtlLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIHRocF91cGRhdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKQomIzQzO3sKJiM0MzsJaWYgKHRocF9yZWFkX251bShuYW1lKSAhPSBudW0pCiYjNDM7CQl0aHBfd3JpdGVfbnVtKG5hbWUsIG51bSk7CiYjNDM7fQomIzQzOwogdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpCiB7CiAJc3RydWN0IGtodWdlcGFnZWRfc2V0dGluZ3MgKmtodWdlcGFnZWQgPSAmYW1wO3NldHRpbmdzLSZndDtraHVnZXBhZ2VkOwpAQCAtMTk4LDE1ICYjNDM7MjA5LDE1IEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKQogCQkJc2htZW1fZW5hYmxlZF9zdHJpbmdzW3NldHRpbmdzLSZndDtzaG1lbV9lbmFibGVkXSk7CiAJdGhwX3dyaXRlX251bSgmIzM0O3VzZV96ZXJvX3BhZ2UmIzM0Oywgc2V0dGluZ3MtJmd0O3VzZV96ZXJvX3BhZ2UpOwogCi0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvZGVmcmFnJiMzNDssIGtodWdlcGFnZWQtJmd0O2RlZnJhZyk7Ci0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzJiMzNDssCi0JCQlraHVnZXBhZ2VkLSZndDthbGxvY19zbGVlcF9taWxsaXNlY3MpOwotCXRocF93cml0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzJiMzNDssCi0JCQlraHVnZXBhZ2VkLSZndDtzY2FuX3NsZWVwX21pbGxpc2Vjcyk7Ci0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfbm9uZSYjMzQ7LCBraHVnZXBhZ2VkLSZndDttYXhfcHRlc19ub25lKTsKLQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwJiMzNDssIGtodWdlcGFnZWQtJmd0O21heF9wdGVzX3N3YXApOwotCXRocF93cml0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3NoYXJlZCYjMzQ7LCBraHVnZXBhZ2VkLSZndDttYXhfcHRlc19zaGFyZWQpOwotCXRocF93cml0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW4mIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7cGFnZXNfdG9fc2Nhbik7CiYjNDM7CXRocF91cGRhdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9kZWZyYWcmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7ZGVmcmFnKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL2FsbG9jX3NsZWVwX21pbGxpc2VjcyYjMzQ7LAomIzQzOwkJICAgICAgIGtodWdlcGFnZWQtJmd0O2FsbG9jX3NsZWVwX21pbGxpc2Vjcyk7CiYjNDM7CXRocF91cGRhdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2VjcyYjMzQ7LAomIzQzOwkJICAgICAgIGtodWdlcGFnZWQtJmd0O3NjYW5fc2xlZXBfbWlsbGlzZWNzKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX25vbmUmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7bWF4X3B0ZXNfbm9uZSk7CiYjNDM7CXRocF91cGRhdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwJiMzNDssIGtodWdlcGFnZWQtJmd0O21heF9wdGVzX3N3YXApOwomIzQzOwl0aHBfdXBkYXRlX251bSgmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkJiMzNDssIGtodWdlcGFnZWQtJmd0O21heF9wdGVzX3NoYXJlZCk7CiYjNDM7CXRocF91cGRhdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9wYWdlc190b19zY2FuJiMzNDssIGtodWdlcGFnZWQtJmd0O3BhZ2VzX3RvX3NjYW4pOwogCiAJaWYgKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGhbMF0pCiAJCXdyaXRlX251bShkZXZfcXVldWVfcmVhZF9haGVhZF9wYXRoLCBzZXR0aW5ncy0mZ3Q7cmVhZF9haGVhZF9rYik7CkBAIC0yMzAsNiAmIzQzOzI0MSw0MyBAQCB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncykKIAl9CiB9CiAKJiM0MzsvKgomIzQzOyAqIENvbXBsZXRpb24gYmFycmllciBmb3Iga2h1Z2VwYWdlZDogd2FpdCB1bnRpbCBhIGZ1bGwgc2NhbiBwYXNzIHRoYXQKJiM0MzsgKiBzdGFydGVkIGFmdGVyIHRoaXMgY2FsbCBoYXMgZmluaXNoZWQuIGZ1bGxfc2NhbnMgbXVzdCBhZHZhbmNlIGJ5IHR3bzsKJiM0MzsgKiBhICYjNDM7MSBzdGVwIG1heSBjb21wbGV0ZSBhIHBhc3MgdGhhdCBleGFtaW5lZCB0aGlzIG1tIGJlZm9yZSB0aGUKJiM0MzsgKiBjYWxsZXImIzM5O3Mgc2V0dXAgd2FzIGluIHBsYWNlLgomIzQzOyAqCiYjNDM7ICogQW55IHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIHNvIHRoZSBiYXJyaWVyCiYjNDM7ICogd29ya3MgcmVnYXJkbGVzcyBvZiB0aGUgY29uZmlndXJlZCBzY2FuIGNhZGVuY2UuIEl0IHdha2VzIGV4YWN0bHkKJiM0MzsgKiBvbmNlIHBlciBtaXNzaW5nIHBhc3Mg4oCUIG92ZXItd2FraW5nIHdvdWxkIHF1ZXVlIGEgc3RyYWdnbGVyIHBhc3MKJiM0MzsgKiBiZWhpbmQgdGhlIGJhcnJpZXIsIHBlcnR1cmJpbmcgd2hhdGV2ZXIgdGhlIGNhbGxlciBzZXRzIHVwIG5leHQuCiYjNDM7ICogT25lIHdha2UgY29tcGxldGVzIG9uZSBmdWxsIHBhc3Mgb25seSBpZiB0aGUgd2hvbGUgbW0gbGlzdCBmaXRzIGluCiYjNDM7ICogb25lIHNjYW4gYmF0Y2gsIHNvIGNhbGxlcnMgbXVzdCBwYWlyIHRoaXMgd2l0aCBhIGxhcmdlCiYjNDM7ICogcGFnZXNfdG9fc2Nhbi4KJiM0MzsgKi8KJiM0Mztib29sIGtodWdlcGFnZWRfZnVsbF9wYXNzKHVuc2lnbmVkIGludCB0aW1lb3V0X3MpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIGRlYWRsaW5lX21zID0gdGltZW91dF9zICogMTAwMFVMOwomIzQzOwl1bnNpZ25lZCBsb25nIHNsZWVwX21zID0KJiM0MzsJCXRocF9yZWFkX251bSgmIzM0O2todWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3MmIzM0Oyk7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZWxhcHNlZF9tcyA9IDA7CiYjNDM7CWludCBwYXNzOwomIzQzOwomIzQzOwlmb3IgKHBhc3MgPSAwOyBwYXNzICZsdDsgMjsgcGFzcyYjNDM7JiM0MzspIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgdGFyZ2V0ID0KJiM0MzsJCQl0aHBfcmVhZF9udW0oJiMzNDtraHVnZXBhZ2VkL2Z1bGxfc2NhbnMmIzM0OykgJiM0MzsgMTsKJiM0MzsKJiM0MzsJCXRocF93cml0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzJiMzNDssIHNsZWVwX21zKTsKJiM0MzsJCXdoaWxlICh0aHBfcmVhZF9udW0oJiMzNDtraHVnZXBhZ2VkL2Z1bGxfc2NhbnMmIzM0OykgJmx0OyB0YXJnZXQpIHsKJiM0MzsJCQlpZiAoZWxhcHNlZF9tcyAmZ3Q7PSBkZWFkbGluZV9tcykKJiM0MzsJCQkJcmV0dXJuIGZhbHNlOwomIzQzOwkJCXVzbGVlcCgxMCAqIDEwMDApOwomIzQzOwkJCWVsYXBzZWRfbXMgJiM0Mzs9IDEwOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKIHN0cnVjdCB0aHBfc2V0dGluZ3MgKnRocF9jdXJyZW50X3NldHRpbmdzKHZvaWQpCiB7CiAJaWYgKCFzZXR0aW5nc19pbmRleCkgewpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmgKaW5kZXggNzI2YzczYzQzYzA1Yi4uOGRlNDQ2YWZmZWVjZCAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oCkBAIC04Myw2ICYjNDM7ODMsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgdGhwX3NhdmVfc2V0dGluZ3Modm9pZCkKIAlodWdlcGFnZV9zYXZlX3NldHRpbmdzKC8qIHRocCA9ICovIHRydWUsIC8qIGh1Z2V0bGIgPSAqLyBmYWxzZSk7CiB9CiAKJiM0Mztib29sIGtodWdlcGFnZWRfZnVsbF9wYXNzKHVuc2lnbmVkIGludCB0aW1lb3V0X3MpOwomIzQzOwogdm9pZCB0aHBfc2V0X3JlYWRfYWhlYWRfcGF0aChjaGFyICpwYXRoKTsKIHVuc2lnbmVkIGxvbmcgdGhwX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7CiB1bnNpZ25lZCBsb25nIHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jCmluZGV4IDEwZThkZWRjYjA4N2QuLmM1YTNjMzkyMjU4MTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMKQEAgLTI2LDkgJiM0MzsyNiwxMyBAQAogCiAjZGVmaW5lIEJBU0VfQUREUiAoKHZvaWQgKikoMVVMICZsdDsmbHQ7IDMwKSkKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGhwYWdlX3BtZF9zaXplOwomIzQzO3N0YXRpYyBpbnQgaHBhZ2VfcG1kX29yZGVyOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplOwogc3RhdGljIGludCBocGFnZV9wbWRfbnI7CiBzdGF0aWMgaW50IGFub25fb3JkZXI7CiYjNDM7c3RhdGljIGludCBhbm9uX3RhcmdldF9vcmRlcjsKJiM0MztzdGF0aWMgaW50IHBhZ2VtYXBfZmQgPSAtMTsKJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQgPSAtMTsKIAogI2RlZmluZSBQSURfU01BUFMgJiMzNDsvcHJvYy9zZWxmL3NtYXBzJiMzNDsKICNkZWZpbmUgVEVTVF9GSUxFICYjMzQ7Y29sbGFwc2VfdGVzdF9maWxlJiMzNDsKQEAgLTE3Nyw2ICYjNDM7MTgxLDIxIEBAIHN0YXRpYyB2b2lkIGdldF9maW5mbyhjb25zdCBjaGFyICpkaXIpCiAJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7JXM6IENvdWxkIG5vdCByZWFkOiAlc1xuJiMzNDssIF9fZnVuY19fLCBwYXRoKTsKIH0KIAomIzQzO3N0YXRpYyBib29sIGhhc19zd2FwKHZvaWQpCiYjNDM7ewomIzQzOwlGSUxFICpmcCA9IGZvcGVuKCYjMzQ7L3Byb2Mvc3dhcHMmIzM0OywgJiMzNDtyJiMzNDspOwomIzQzOwljaGFyIGxpbmVbTUFYX0xJTkVfTEVOR1RIXTsKJiM0MzsJYm9vbCByZXQgPSBmYWxzZTsKJiM0MzsKJiM0MzsJaWYgKCFmcCkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJLyogRmlyc3QgbGluZSBpcyB0aGUgaGVhZGVyOyBhbnkgZm9sbG93aW5nIGxpbmUgaXMgYSBzd2FwIGFyZWEuICovCiYjNDM7CWlmIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSAmYW1wOyZhbXA7IGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKQomIzQzOwkJcmV0ID0gdHJ1ZTsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgYm9vbCBjaGVja19zd2FwKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlib29sIHN3YXAgPSBmYWxzZTsKQEAgLTU1NCw4ICYjNDM7NTczLDE3IEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfY29sbGFwc2UoY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBpbnQgbnJfaHBhZ2VzLAogc3RhdGljIGJvb2wgd2FpdF9mb3Jfc2Nhbihjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsCiAJCQkgIHN0cnVjdCBtZW1fb3BzICpvcHMpCiB7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBidWRnZXQgaGFzIHRvIGNvdmVyIGtodWdlcGFnZWQgY29weWluZyBucl9ocGFnZXMgKgomIzQzOwkgKiBocGFnZV9wbWRfc2l6ZSwgcGx1cyB0d28gb2YgaXRzIHBhc3NlcyBvdmVyIHRoZSBtbS4gVGhyZWUgc2Vjb25kcwomIzQzOwkgKiBkb2VzIHRoYXQgYXQgYSAyTSBQTUQsIGJ1dCB0aGUgc2FtZSB0ZXN0IG1vdmVzIDJHIGF0IGEgNTEyTSBQTUQKJiM0MzsJICogKGFybTY0IHdpdGggNjRLIGJhc2UgcGFnZXMpIGFuZCAzcyBpcyB0aGVuIG1hcmdpbmFsOiBpdCBmYWlscyBvbiBhCiYjNDM7CSAqIGNvbGxhcHNlIHRoYXQgY29tcGxldGVzIGNvcnJlY3RseSwganVzdCBub3QgaW5zaWRlIHRoZSBidWRnZXQuCiYjNDM7CSAqIEFsbG93IGEgZnVydGhlciBzZWNvbmQgcGVyIDY0TSB0byBjb2xsYXBzZS4KJiM0MzsJICovCiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgYnl0ZXMgPSAodW5zaWduZWQgbG9uZylucl9ocGFnZXMgKiBocGFnZV9wbWRfc2l6ZTsKJiM0MzsJaW50IHRpbWVvdXQgPSA2ICYjNDM7IDIgKiAoYnl0ZXMgLyAoNjRVTCAmbHQ7Jmx0OyAyMCkpOwogCWludCBmdWxsX3NjYW5zOwotCWludCB0aW1lb3V0ID0gNjsgLyogMyBzZWNvbmRzICovCiAKIAkvKiBTYW5pdHkgY2hlY2sgKi8KIAlpZiAoIW9wcy0mZ3Q7Y2hlY2tfaHVnZShwLCAwKSkKQEAgLTczNSw2ICYjNDM7NzYzLDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX3N3YXBpbl9zaW5nbGVfcHRlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wCiAJdm9pZCAqcDsKIAogCXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiYjNDM7CWlmICghaGFzX3N3YXAoKSkgewomIzQzOwkJc2tpcCgmIzM0O1NraXAgKG5vIHN3YXAgY29uZmlndXJlZCkmIzM0Oyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQogCW9wcy0mZ3Q7ZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpOwogCiAJa3NmdF9wcmludF9tc2coJiMzNDtTd2Fwb3V0IG9uZSBwYWdlLi4uJiMzNDspOwpAQCAtNzYxLDYgJiM0Mzs3OTMsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm8KIAl2b2lkICpwOwogCiAJcCA9IG9wcy0mZ3Q7c2V0dXBfYXJlYSgxKTsKJiM0MzsJaWYgKCFoYXNfc3dhcCgpKSB7CiYjNDM7CQlza2lwKCYjMzQ7U2tpcCAobm8gc3dhcCBjb25maWd1cmVkKSYjMzQ7KTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiAJb3BzLSZndDtmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7CiAKIAlrc2Z0X3ByaW50X21zZygmIzM0O1N3YXBvdXQgJWQgb2YgJWQgcGFnZXMuLi4mIzM0OywgbWF4X3B0ZXNfc3dhcCAmIzQzOyAxLCBocGFnZV9wbWRfbnIpOwpAQCAtODUzLDYgJiM0Mzs4ODksMjEgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfY29tcG91bmRfZXh0cmVtZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMKIAl2b2lkICpwOwogCWludCBpOwogCiYjNDM7CS8qCiYjNDM7CSAqIEJ1aWxkcyBhIFBNRCYjMzk7cyB3b3J0aCBvZiBkaXN0aW5jdCBQVEUtbWFwcGVkIGNvbXBvdW5kIHBhZ2VzIGJ5IGN5Y2xpbmcKJiM0MzsJICogaHBhZ2VfcG1kX25yIGZhdWx0LXRpbWUgVEhQcyB0aHJvdWdoIG1yZW1hcC4gRmF1bHQtdGltZSBUSFAgYWxsb2NhdGlvbgomIzQzOwkgKiBpcyBiZXN0LWVmZm9ydCwgYW5kIHRoaXMgbmVlZHMgaHBhZ2VfcG1kX25yIFBNRC1vcmRlciBwYWdlcyBpbiBhIHJvdzoKJiM0MzsJICogZmluZSBhdCBhIDJNICg0SyBiYXNlKSBvciAzMk0gKDE2SyBiYXNlKSBQTUQsIGJ1dCBhIDUxMk0gUE1EIChhcm02NC82NEspCiYjNDM7CSAqIGlzIGFuIG9yZGVyLTEzIGFsbG9jYXRpb24gdGhlIGFsbG9jYXRvciBjYW5ub3QgcmVsaWFibHkgaGFuZCBvdXQgZXZlbgomIzQzOwkgKiBvbmNlLCBsZXQgYWxvbmUgODE5MiB0aW1lcy4gQ2FwIGF0IGEgMzJNIFBNRDsgTUFEVl9DT0xMQVBTRS1kcml2ZW4gY2FzZXMKJiM0MzsJICogc3RpbGwgY292ZXIgUE1ELW9yZGVyIGNvbGxhcHNlIG9uIHRoZSBsYXJnZXIgY29uZmlncy4KJiM0MzsJICovCiYjNDM7CWlmIChocGFnZV9wbWRfc2l6ZSAmZ3Q7ICgzMlVMICZsdDsmbHQ7IDIwKSkgewomIzQzOwkJa3NmdF90ZXN0X3Jlc3VsdF9za2lwKCYjMzQ7JXM6IFBNRCB0b28gbGFyZ2UgZm9yIGZhdWx0LXRpbWUgVEhQIGNvbnN0cnVjdGlvblxuJiMzNDssCiYjNDM7CQkJCSAgICAgIF9fZnVuY19fKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwogCXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiAJa3NmdF9wcmludF9tc2coJiMzNDtDb25zdHJ1Y3QgUFRFIHBhZ2UgdGFibGUgZnVsbCBvZiBkaWZmZXJlbnQgUFRFLW1hcHBlZCBjb21wb3VuZCBwYWdlc1xuJiMzNDspOwogCWZvciAoaSA9IDA7IGkgJmx0OyBocGFnZV9wbWRfbnI7IGkmIzQzOyYjNDM7KSB7CkBAIC0xMDQzLDYgJiM0MzsxMDk0LDYxIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMKIAlrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgJiMzNDslc1xuJiMzNDssIF9fZnVuY19fKTsKIH0KIAomIzQzOy8qCiYjNDM7ICogQ29udGVudCBzdGF5cyBpc29sYXRlZCB3aGlsZSBhIGNvLXNoYXJlciB3cml0ZXMgY29uY3VycmVudGx5LiBBIHNoYXJlZAomIzQzOyAqIHNvdXJjZSBpcyBjb3BpZWQgbGl2ZSAobm90IGZyb3plbiksIHJlbHlpbmcgb24gaXQgYmVpbmcgQ29XIC0gaW1tdXRhYmxlCiYjNDM7ICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29weTsgYSBjby1zaGFyZXImIzM5O3Mgd3JpdGUgZ29lcyB0byBhIENvVyBjb3B5LiBUaGUKJiM0MzsgKiBjb2xsYXBzaW5nIGNoaWxkIG11c3Qgc2VlIHRoZSBwcmUtZm9yayBjb250ZW50LCB0aGUgd3JpdGluZyBwYXJlbnQgb25seQomIzQzOyAqIGl0cyBvd24gd3JpdGVzLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX2ZvcmtfY293X3JhY2Uoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvcHMpCiYjNDM7ewomIzQzOwljb25zdCB1bnNpZ25lZCBsb25nIHNoYXJlZCA9IDY0ICogcGFnZV9zaXplOwomIzQzOwljb25zdCBpbnQgc3RyaWRlID0gcGFnZV9zaXplIC8gc2l6ZW9mKGludCk7CiYjNDM7CWludCB3c3RhdHVzLCBpLCBuID0gc2hhcmVkIC8gcGFnZV9zaXplOwomIzQzOwlpbnQgKmlwOwomIzQzOwl2b2lkICpwOwomIzQzOwomIzQzOwlwID0gb3BzLSZndDtzZXR1cF9hcmVhKDEpOwomIzQzOwlpcCA9IHA7CiYjNDM7CW9wcy0mZ3Q7ZmF1bHQocCwgMCwgc2hhcmVkKTsJCS8qIHNoYXJlZCBwcmVmaXgsIHByZS1mb3JrIHBhdHRlcm4gKi8KJiM0MzsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtGb3JrLCBjb2xsYXBzZSBpbiB0aGUgY2hpbGQgd2hpbGUgdGhlIHBhcmVudCByZXdyaXRlcy4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFmb3JrKCkpIHsKJiM0MzsJCW9wcy0mZ3Q7ZmF1bHQocCwgc2hhcmVkLCBocGFnZV9wbWRfc2l6ZSk7CS8qIHByaXZhdGUgcmVtYWluZGVyICovCiYjNDM7CQljLSZndDtjb2xsYXBzZSgmIzM0O0NvbGxhcHNlIGEgcmFuZ2Ugc2hhcmVkIHdpdGggYSB3cml0aW5nIGNvLXNoYXJlciYjMzQ7LAomIzQzOwkJCSAgICBwLCAxLCBvcHMsIHRydWUpOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG47IGkmIzQzOyYjNDM7KQomIzQzOwkJCWlmIChpcFtpICogc3RyaWRlXSAhPSBpICYjNDM7IDB4ZGVhZDAwMDApIHsKJiM0MzsJCQkJZmFpbCgmIzM0O0ZhaWw6IGNoaWxkIGNvbnRlbnQmIzM0Oyk7CiYjNDM7CQkJCW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJCQkJX2V4aXQoZXhpdF9zdGF0dXMpOwomIzQzOwkJCX0KJiM0MzsJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKJiM0MzsJCW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJCV9leGl0KGV4aXRfc3RhdHVzKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBIYW1tZXIgdGhlIHBhcmVudCYjMzk7cyBvd24gd3JpdGVzIG92ZXIgdGhlIHNoYXJlZCBwcmVmaXguICovCiYjNDM7CWZvciAoaW50IGl0ID0gMDsgaXQgJmx0OyAyMDAwMDA7IGl0JiM0MzsmIzQzOykKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBuOyBpJiM0MzsmIzQzOykKJiM0MzsJCQlpcFtpICogc3RyaWRlXSA9IGkgJiM0MzsgMHhiZWVmMDAwMDsKJiM0MzsKJiM0MzsJd2FpdCgmYW1wO3dzdGF0dXMpOwomIzQzOwlleGl0X3N0YXR1cyA9IFdFWElUU1RBVFVTKHdzdGF0dXMpOwomIzQzOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0NoZWNrIHRoZSBwYXJlbnQgc2VlcyBvbmx5IGl0cyBvd24gd3JpdGVzLi4uJiMzNDspOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbjsgaSYjNDM7JiM0MzspCiYjNDM7CQlpZiAoaXBbaSAqIHN0cmlkZV0gIT0gaSAmIzQzOyAweGJlZWYwMDAwKQomIzQzOwkJCWJyZWFrOwomIzQzOwlpZiAoaSA9PSBuKQomIzQzOwkJc3VjY2VzcygmIzM0O09LJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlmYWlsKCYjMzQ7RmFpbDogcGFyZW50IGNvbnRlbnQmIzM0Oyk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7fQomIzQzOwogc3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLAogCQkJCQkgICBzdHJ1Y3QgbWVtX29wcyAqb3BzKQogewpAQCAtMTA4OCw2ICYjNDM7MTE5NCwyMjIgQEAgc3RhdGljIHZvaWQgbWFkdmlzZV9yZXRyYWN0ZWRfcGFnZV90YWJsZXMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsCiAJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiB9CiAKJiM0MzsvKgomIzQzOyAqIE9yZGVyLXBhcmFtZXRlcml6ZWQgY29sbGFwc2UgY2FzZXMgKC1vICZsdDtvcmRlciZndDspOiBraHVnZXBhZ2VkIGNvbGxhcHNlcwomIzQzOyAqIDRLLWZhdWx0ZWQgbWVtb3J5IGludG8gZm9saW9zIG9mIHRoZSBnaXZlbiBzdWItUE1EIG9yZGVyLiBEZXRlY3Rpb24gaXMKJiM0MzsgKiBmb2xpby1iYXNlZCAodm1fdXRpbCksIG5vdCBzbWFwczogQW5vbkh1Z2VQYWdlcyBvbmx5IGFjY291bnRzIFBNRAomIzQzOyAqIG1hcHBpbmdzLgomIzQzOyAqCiYjNDM7ICogVGhlIHJlZ2lvbiBpcyBmYXVsdGVkIGJlZm9yZSBNQURWX0hVR0VQQUdFIGFuZCB0aGUgdGFyZ2V0IG9yZGVyIGlzCiYjNDM7ICogY29uZmlndXJlZCAmIzM0O2luaGVyaXQmIzM0OyB1bmRlciBlbmFibGVkPW1hZHZpc2UsIHNvIGZhdWx0cyBhcmUgYWx3YXlzCiYjNDM7ICogb3JkZXIgMCBhbmQgdGhlIGNvbGxhcHNlIHByb2R1Y3QgY2FuIG9ubHkgY29tZSBmcm9tIGtodWdlcGFnZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIHNpemVfdCBhbm9uX29yZGVyX3NpemUodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBwYWdlX3NpemUgJmx0OyZsdDsgYW5vbl90YXJnZXRfb3JkZXI7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIHJhbmdlX2NvbGxhcHNlZCh2b2lkICpwLCBzaXplX3QgbGVuKQomIzQzO3sKJiM0MzsJcmV0dXJuIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgbGVuLCBhbm9uX3RhcmdldF9vcmRlciwKJiM0MzsJCQkJCSAgICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogTm8gYWxpZ25lZCB3aW5kb3cgaW4gW3AsIHAgJiM0MzsgbGVuKSBpcyBiYWNrZWQgYXQgdGhlIHRhcmdldCBvcmRlci4gKi8KJiM0MztzdGF0aWMgYm9vbCByYW5nZV9ub3RfY29sbGFwc2VkKHZvaWQgKnAsIHNpemVfdCBsZW4pCiYjNDM7ewomIzQzOwlzaXplX3Qgd2luZG93ID0gYW5vbl9vcmRlcl9zaXplKCk7CiYjNDM7CWNoYXIgKmFkZHIgPSBwOwomIzQzOwomIzQzOwlmb3IgKDsgbGVuICZndDs9IHdpbmRvdzsgYWRkciAmIzQzOz0gd2luZG93LCBsZW4gLT0gd2luZG93KSB7CiYjNDM7CQlpZiAocmFuZ2VfY29sbGFwc2VkKGFkZHIsIHdpbmRvdykpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKHZvaWQpCiYjNDM7ewomIzQzOwkvKiBXYWl0IHVwIHRvIDMwIHNlY29uZHMgZm9yIHRoZSBwYXNzIHRvIGNvbXBsZXRlLiAqLwomIzQzOwlyZXR1cm4ga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoMzApOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIENhc2VzIHdob3NlIGdlb21ldHJ5IG5lZWRzIGEgd2luZG93IHN0cmljdGx5IGJlbG93IHRoZSBQTUQgc2tpcCBhdAomIzQzOyAqIC1vICZsdDtQTUQgb3JkZXImZ3Q7OyB0aGUgcmVzdCBydW4gdGhlcmUgdW5jaGFuZ2VkLCBiYXNlbGluaW5nIHRoZSBsZWdhY3kKJiM0MzsgKiBQTUQgZW5naW5lIHdpdGggdGhlIHNhbWUgdGVzdCB0ZXh0IHVzZWQgZm9yIHRoZSBtVEhQIG9yZGVycy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBza2lwX2F0X3BtZF9vcmRlcihjb25zdCBjaGFyICpuYW1lKQomIzQzO3sKJiM0MzsJaWYgKGFub25fdGFyZ2V0X29yZGVyICZsdDsgaHBhZ2VfcG1kX29yZGVyKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoJiMzNDslczogbmVlZHMgYSB3aW5kb3cgYmVsb3cgdGhlIFBNRFxuJiMzNDssIG5hbWUpOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfZnVsbChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9wcykKJiM0Mzt7CiYjNDM7CXZvaWQgKnA7CiYjNDM7CiYjNDM7CXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiYjNDM7CW9wcy0mZ3Q7ZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwlpZiAoIXJhbmdlX25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7VW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxuJiMzNDspOwomIzQzOwomIzQzOwltYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtDb2xsYXBzZSBmdWxseSBwb3B1bGF0ZWQgUFRFIHRhYmxlIHRvIHRhcmdldCBvcmRlci4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAocmFuZ2VfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSkKJiM0MzsJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJZmFpbCgmIzM0O0ZhaWwmIzM0Oyk7CiYjNDM7CiYjNDM7CXZhbGlkYXRlX21lbW9yeShwLCAwLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX3NpbmdsZV93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsCiYjNDM7CQkJCQkgc3RydWN0IG1lbV9vcHMgKm9wcykKJiM0Mzt7CiYjNDM7CXNpemVfdCB3aW5kb3cgPSBhbm9uX29yZGVyX3NpemUoKTsKJiM0MzsJdm9pZCAqcDsKJiM0MzsKJiM0MzsJaWYgKHNraXBfYXRfcG1kX29yZGVyKF9fZnVuY19fKSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJcCA9IG9wcy0mZ3Q7c2V0dXBfYXJlYSgxKTsKJiM0MzsJb3BzLSZndDtmYXVsdChwLCB3aW5kb3csIDIgKiB3aW5kb3cpOwomIzQzOwlpZiAoIXJhbmdlX25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7VW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxuJiMzNDspOwomIzQzOwomIzQzOwltYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtDb2xsYXBzZSBvbmUgZnVsbHkgcG9wdWxhdGVkIHdpbmRvdy4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAocmFuZ2VfY29sbGFwc2VkKHAgJiM0Mzsgd2luZG93LCB3aW5kb3cpICZhbXA7JmFtcDsKJiM0MzsJCSByYW5nZV9ub3RfY29sbGFwc2VkKHAsIHdpbmRvdykgJmFtcDsmYW1wOwomIzQzOwkJIHJhbmdlX25vdF9jb2xsYXBzZWQocCAmIzQzOyAyICogd2luZG93LAomIzQzOwkJCQkgICAgIGhwYWdlX3BtZF9zaXplIC0gMiAqIHdpbmRvdykpCiYjNDM7CQlzdWNjZXNzKCYjMzQ7T0smIzM0Oyk7CiYjNDM7CWVsc2UKJiM0MzsJCWZhaWwoJiMzNDtGYWlsJiMzNDspOwomIzQzOwomIzQzOwl2YWxpZGF0ZV9tZW1vcnkocCwgd2luZG93LCAyICogd2luZG93KTsKJiM0MzsJb3BzLSZndDtjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgJiMzNDslc1xuJiMzNDssIF9fZnVuY19fKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsCiYjNDM7CQkJCQkgIHN0cnVjdCBtZW1fb3BzICpvcHMpCiYjNDM7ewomIzQzOwl2b2lkICpwOwomIzQzOwomIzQzOwlwID0gb3BzLSZndDtzZXR1cF9hcmVhKDEpOwomIzQzOwlvcHMtJmd0O2ZhdWx0KHAsIDAsIHBhZ2Vfc2l6ZSk7CiYjNDM7CWlmICghcmFuZ2Vfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XG4mIzM0Oyk7CiYjNDM7CiYjNDM7CW1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0NvbGxhcHNlIHdpbmRvdyB3aXRoIHNpbmdsZSBQVEUgZW50cnkgcHJlc2VudC4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAocmFuZ2VfY29sbGFwc2VkKHAsIGFub25fb3JkZXJfc2l6ZSgpKSkKJiM0MzsJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJZmFpbCgmIzM0O0ZhaWwmIzM0Oyk7CiYjNDM7CiYjNDM7CXZhbGlkYXRlX21lbW9yeShwLCAwLCBwYWdlX3NpemUpOwomIzQzOwlvcHMtJmd0O2NsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CWtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCAmIzM0OyVzXG4mIzM0OywgX19mdW5jX18pOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9tYXhfcHRlc19ub25lKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLAomIzQzOwkJCQkJIHN0cnVjdCBtZW1fb3BzICpvcHMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7CiYjNDM7CXNpemVfdCB3aW5kb3cgPSBhbm9uX29yZGVyX3NpemUoKTsKJiM0MzsJdm9pZCAqcDsKJiM0MzsKJiM0MzsJaWYgKHNraXBfYXRfcG1kX29yZGVyKF9fZnVuY19fKSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gMDsKJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiYjNDM7CW9wcy0mZ3Q7ZmF1bHQocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7CiYjNDM7CWlmICghcmFuZ2Vfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XG4mIzM0Oyk7CiYjNDM7CiYjNDM7CW1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0NvbGxhcHNlIGZ1bGwgd2luZG93LCBub3QgdGhlIG9uZSBtaXNzaW5nIGEgcGFnZS4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAocmFuZ2VfY29sbGFwc2VkKHAsIHdpbmRvdykgJmFtcDsmYW1wOwomIzQzOwkJIHJhbmdlX25vdF9jb2xsYXBzZWQocCAmIzQzOyB3aW5kb3csIHdpbmRvdykpCiYjNDM7CQlzdWNjZXNzKCYjMzQ7T0smIzM0Oyk7CiYjNDM7CWVsc2UKJiM0MzsJCWZhaWwoJiMzNDtGYWlsJiMzNDspOwomIzQzOwomIzQzOwl2YWxpZGF0ZV9tZW1vcnkocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgJiMzNDslc1xuJiMzNDssIF9fZnVuY19fKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogU21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCB3aWxsIGNvbnNpZGVyIGZvciBtVEhQIGNvbGxhcHNlLiAqLwomIzQzOyNkZWZpbmUgTUlOX01USFBfT1JERVIgMgomIzQzOwomIzQzOy8qCiYjNDM7ICogQSByZWdpb24gYmFja2VkIGJ5IGxhcmdlIGZvbGlvcyBvZiBhIHNtYWxsZXIgb3JkZXIgaXMgYSB2YWxpZCBzb3VyY2UKJiM0MzsgKiBmb3IgY29sbGFwc2UgdG8gdGhlIHRhcmdldCBvcmRlcjoKJiM0MzsgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKCkgYWNjZXB0cyBhbnkgc291cmNlIGZvbGlvIG9mIGFuIG9yZGVyCiYjNDM7ICogc3RyaWN0bHkgYmVsb3cgdGhlIGNhbmRpZGF0ZSYjMzk7cy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLAomIzQzOwkJCQkJIHN0cnVjdCBtZW1fb3BzICpvcHMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7CiYjNDM7CWludCBzb3VyY2Vfb3JkZXIgPSBhbm9uX29yZGVyID8gYW5vbl9vcmRlciA6IE1JTl9NVEhQX09SREVSOwomIzQzOwl2b2lkICpwOwomIzQzOwomIzQzOwkvKiBTb3VyY2VzIG11c3QgYmUgYSBzdXBwb3J0ZWQgbVRIUCBvcmRlciBzdHJpY3RseSBiZWxvdyB0aGUgdGFyZ2V0LiAqLwomIzQzOwlpZiAoc291cmNlX29yZGVyICZndDs9IGFub25fdGFyZ2V0X29yZGVyIHx8CiYjNDM7CSAgICAhKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgJmFtcDsgKDFVTCAmbHQ7Jmx0OyBzb3VyY2Vfb3JkZXIpKSkgewomIzQzOwkJa3NmdF90ZXN0X3Jlc3VsdF9za2lwKCYjMzQ7JXM6IG5vIHNvdXJjZSBvcmRlciBiZWxvdyB0YXJnZXRcbiYjMzQ7LAomIzQzOwkJCQkgICAgICBfX2Z1bmNfXyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogRmF1bHQgdGhlIHdob2xlIHJlZ2lvbiBhcyBvcmRlci1Ac291cmNlX29yZGVyIGZvbGlvcy4gKi8KJiM0MzsJc2V0dGluZ3MuaHVnZXBhZ2VzW3NvdXJjZV9vcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7CiYjNDM7CXRocF9wdXNoX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzOwlwID0gb3BzLSZndDtzZXR1cF9hcmVhKDEpOwomIzQzOwlvcHMtJmd0O2ZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwomIzQzOwlpZiAoIWlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgaHBhZ2VfcG1kX3NpemUsIHNvdXJjZV9vcmRlciwKJiM0MzsJCQkJCSAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtSZWdpb24gbm90IGJhY2tlZCBieSBvcmRlci0lZCBmb2xpb3MgYWZ0ZXIgZmF1bHRcbiYjMzQ7LAomIzQzOwkJCQkgICBzb3VyY2Vfb3JkZXIpOwomIzQzOwomIzQzOwltYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtDb2xsYXBzZSByZWdpb24gYmFja2VkIGJ5IG9yZGVyLSVkIHNvdXJjZXMuLi4mIzM0OywKJiM0MzsJCSAgICAgICBzb3VyY2Vfb3JkZXIpOwomIzQzOwlpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSkKJiM0MzsJCWZhaWwoJiMzNDtUaW1lb3V0JiMzNDspOwomIzQzOwllbHNlIGlmIChyYW5nZV9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKQomIzQzOwkJc3VjY2VzcygmIzM0O09LJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlmYWlsKCYjMzQ7RmFpbCYjMzQ7KTsKJiM0MzsKJiM0MzsJdmFsaWRhdGVfbWVtb3J5KHAsIDAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJb3BzLSZndDtjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgJiMzNDslc1xuJiMzNDssIF9fZnVuY19fKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQogewogCWZwcmludGYoc3RkZXJyLCAmIzM0O1xuVXNhZ2U6IC4va2h1Z2VwYWdlZCBbT1BUSU9OU10gJmx0O3Rlc3QgdHlwZSZndDsgW2Rpcl1cblxuJiMzNDspOwpAQCAtMTEwMyw2ICYjNDM7MTQyNSwxMSBAQCBzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQogCWZwcmludGYoc3RkZXJyLAkmIzM0O1x0XHQtaDogVGhpcyBoZWxwIG1lc3NhZ2UuXG4mIzM0Oyk7CiAJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdC1zOiBtVEhQIHNpemUsIGV4cHJlc3NlZCBhcyBwYWdlIG9yZGVyLlxuJiMzNDspOwogCWZwcmludGYoc3RkZXJyLAkmIzM0O1x0XHQgICAgRGVmYXVsdHMgdG8gMC4gVXNlIHRoaXMgc2l6ZSBmb3IgYW5vbiBvciBzaG1lbSBhbGxvY2F0aW9ucy5cbiYjMzQ7KTsKJiM0MzsJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdC1vOiBjb2xsYXBzZSB0YXJnZXQgb3JkZXIgZm9yIGtodWdlcGFnZWQ6YW5vbi5cbiYjMzQ7KTsKJiM0MzsJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdCAgICBSdW5zIHRoZSBvcmRlci1wYXJhbWV0ZXJpemVkIGNvbGxhcHNlIGNhc2VzIGluc3RlYWRcbiYjMzQ7KTsKJiM0MzsJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdCAgICBvZiB0aGUgUE1EIGNhc2VzLlxuJiMzNDspOwomIzQzOwlmcHJpbnRmKHN0ZGVyciwJJiMzNDtcdFx0ICAgIFdpdGggLXMsIC1zIG5hbWVzIHRoZSBtVEhQIHNvdXJjZSBvcmRlciBmb3IgdGhlXG4mIzM0Oyk7CiYjNDM7CWZwcmludGYoc3RkZXJyLAkmIzM0O1x0XHQgICAgbWl4ZWQtc291cmNlIGNhc2UgKHNvdXJjZSBvcmRlciBiZWxvdyB0aGUgdGFyZ2V0KS5cbiYjMzQ7KTsKIAlleGl0KDEpOwogfQogCkBAIC0xMTEyLDE3ICYjNDM7MTQzOSwzMSBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCWNoYXIgKmJ1ZjsKIAljb25zdCBjaGFyICp0b2tlbjsKIAotCXdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICYjMzQ7czpoJiMzNDspKSAhPSAtMSkgewomIzQzOwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAmIzM0O3M6bzpoJiMzNDspKSAhPSAtMSkgewogCQlzd2l0Y2ggKG9wdCkgewogCQljYXNlICYjMzk7cyYjMzk7OgogCQkJYW5vbl9vcmRlciA9IGF0b2kob3B0YXJnKTsKIAkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O28mIzM5OzoKJiM0MzsJCQlhbm9uX3RhcmdldF9vcmRlciA9IGF0b2kob3B0YXJnKTsKJiM0MzsJCQlicmVhazsKIAkJY2FzZSAmIzM5O2gmIzM5OzoKIAkJZGVmYXVsdDoKIAkJCXVzYWdlKCk7CiAJCX0KIAl9CiAKJiM0MzsJLyoKJiM0MzsJICogLXMgYW5kIC1vIGNvbXBvc2U6IC1zIHRoZW4gbmFtZXMgdGhlIG1USFAgc291cmNlIG9yZGVyIGZvciB0aGUKJiM0MzsJICogbWl4ZWQtc291cmNlIGNhc2UsIHdoaWNoIG5lZWRzIGEgc291cmNlIHN0cmljdGx5IGJlbG93IHRoZQomIzQzOwkgKiB0YXJnZXQgKGFuZCBhdCBvciBhYm92ZSB0aGUgc21hbGxlc3QgbVRIUCBvcmRlcikuIEFsb25lLCAtcyBpcwomIzQzOwkgKiB0aGUgc291cmNlIG9yZGVyIGZvciB0aGUgZGVmYXVsdCBQTUQgc3VpdGU7IGFsb25lLCAtbyBpcyB0aGUKJiM0MzsJICogY29sbGFwc2UgdGFyZ2V0IGZvciB0aGUgb3JkZXItcGFyYW1ldGVyaXplZCBzdWl0ZS4KJiM0MzsJICovCiYjNDM7CWlmIChhbm9uX3RhcmdldF9vcmRlciAmYW1wOyZhbXA7IGFub25fb3JkZXIgJmFtcDsmYW1wOwomIzQzOwkgICAgKGFub25fb3JkZXIgJmx0OyBNSU5fTVRIUF9PUkRFUiB8fCBhbm9uX29yZGVyICZndDs9IGFub25fdGFyZ2V0X29yZGVyKSkKJiM0MzsJCXVzYWdlKCk7CiYjNDM7CiAJYXJndiAmIzQzOz0gb3B0aW5kOwogCWFyZ2MgLT0gb3B0aW5kOwogCkBAIC0xMjA3LDcgJiM0MzsxNTQ4LDYgQEAgc3RhdGljIGludCBucl90ZXN0X2Nhc2VzOwogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7Ci0JaW50IGhwYWdlX3BtZF9vcmRlcjsKIAlzdHJ1Y3QgdGhwX3NldHRpbmdzIGRlZmF1bHRfc2V0dGluZ3MgPSB7CiAJCS50aHBfZW5hYmxlZCA9IFRIUF9NQURWSVNFLAogCQkudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTLApAQCAtMTI0NCwxOCAmIzQzOzE1ODQsOTQgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCWhwYWdlX3BtZF9uciA9IGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOwogCWhwYWdlX3BtZF9vcmRlciA9IF9fYnVpbHRpbl9jdHooaHBhZ2VfcG1kX25yKTsKIAomIzQzOwkvKgomIzQzOwkgKiBUaGUgcGFnZSBjYWNoZSBjYXBzIGZvbGlvIG9yZGVyIGF0IE1BWF9QQUdFQ0FDSEVfT1JERVIsIHdoaWNoCiYjNDM7CSAqIHhhc19zcGxpdF9hbGxvYygpIHB1dHMgYmVsb3cgdGhlIFBNRCBvcmRlciBvbiBhcm02NCB3aXRoIDY0SyBwYWdlcy4KJiM0MzsJICogQSBQTUQtc2l6ZWQgcGFnZSBjYWNoZSBmb2xpbyBpcyB0aGVuIGltcG9zc2libGUsIHNvIHRoZSBrZXJuZWwKJiM0MzsJICogcmVmdXNlcyB0aGVzZSBjb2xsYXBzZXMgYnkgZGVzaWduIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIHRlc3QuCiYjNDM7CSAqLwomIzQzOwlpZiAoISh0aHBfc2htZW1fc3VwcG9ydGVkX29yZGVycygpICZhbXA7ICgxVUwgJmx0OyZsdDsgaHBhZ2VfcG1kX29yZGVyKSkpIHsKJiM0MzsJCWlmIChzaG1lbV9vcHMpIHsKJiM0MzsJCQlrc2Z0X3ByaW50X21zZygmIzM0O25vIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvOiBza2lwcGluZyBzaG1lbVxuJiMzNDspOwomIzQzOwkJCXNobWVtX29wcyA9IE5VTEw7CiYjNDM7CQl9CiYjNDM7CQlpZiAoZmluZm8udHlwZSA9PSBWTUFfU0hNRU0gJmFtcDsmYW1wOyByZWFkX29ubHlfZmlsZV9vcHMpIHsKJiM0MzsJCQlrc2Z0X3ByaW50X21zZygmIzM0O25vIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvOiBza2lwcGluZyB0bXBmcyBmaWxlXG4mIzM0Oyk7CiYjNDM7CQkJcmVhZF9vbmx5X2ZpbGVfb3BzID0gTlVMTDsKJiM0MzsJCQlyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSBOVUxMOwomIzQzOwkJCXJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSBOVUxMOwomIzQzOwkJfQomIzQzOwkJaWYgKCFhbm9uX29wcyAmYW1wOyZhbXA7ICFzaG1lbV9vcHMgJmFtcDsmYW1wOyAhcmVhZF9vbmx5X2ZpbGVfb3BzKQomIzQzOwkJCWtzZnRfZXhpdF9za2lwKCYjMzQ7Tm90aGluZyBsZWZ0IHRvIGNvbGxhcHNlIGludG9cbiYjMzQ7KTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoYW5vbl90YXJnZXRfb3JkZXIgJmFtcDsmYW1wOwomIzQzOwkgICAgISh0aHBfc3VwcG9ydGVkX29yZGVycygpICZhbXA7ICgxVUwgJmx0OyZsdDsgYW5vbl90YXJnZXRfb3JkZXIpKSkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7T3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXG4mIzM0OywKJiM0MzsJCQkgICAgICAgYW5vbl90YXJnZXRfb3JkZXIpOwomIzQzOwlpZiAoYW5vbl90YXJnZXRfb3JkZXIgJmd0OyBocGFnZV9wbWRfb3JkZXIpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDstbyB0YWtlcyBhdCBtb3N0IHRoZSBQTUQgb3JkZXJcbiYjMzQ7KTsKJiM0MzsKIAlkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IGhwYWdlX3BtZF9uciAtIDE7CiAJZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX3N3YXAgPSBocGFnZV9wbWRfbnIgLyA4OwogCWRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zaGFyZWQgPSBocGFnZV9wbWRfbnIgLyAyOwogCWRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID0gaHBhZ2VfcG1kX25yICogODsKIAlkZWZhdWx0X3NldHRpbmdzLmh1Z2VwYWdlc1tocGFnZV9wbWRfb3JkZXJdLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDsKLQlkZWZhdWx0X3NldHRpbmdzLmh1Z2VwYWdlc1thbm9uX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUzsKIAlkZWZhdWx0X3NldHRpbmdzLnNobWVtX2h1Z2VwYWdlc1tocGFnZV9wbWRfb3JkZXJdLmVuYWJsZWQgPSBTSE1FTV9JTkhFUklUOwotCWRlZmF1bHRfc2V0dGluZ3Muc2htZW1faHVnZXBhZ2VzW2Fub25fb3JkZXJdLmVuYWJsZWQgPSBTSE1FTV9BTFdBWVM7CiYjNDM7CS8qCiYjNDM7CSAqIFVuZGVyIC1vIHRoZSBvcmRlci1wYXJhbWV0ZXJpemVkIGNhc2VzIHdhbnQgb3JkZXItMCBzb3VyY2VzIGJ5CiYjNDM7CSAqIGRlZmF1bHQ7IHRoZSBtaXhlZC1zb3VyY2UgY2FzZSBlbmFibGVzIGl0cyBvd24gKHBvc3NpYmx5IC1zCiYjNDM7CSAqIHNlbGVjdGVkKSBzb3VyY2Ugb3JkZXIgbG9jYWxseS4gRW5hYmxpbmcgaXQgZ2xvYmFsbHkgaGVyZSB3b3VsZAomIzQzOwkgKiBtYWtlIGV2ZXJ5IGNhc2UgZmF1bHQgdGhhdCBvcmRlci4KJiM0MzsJICovCiYjNDM7CWlmICghYW5vbl90YXJnZXRfb3JkZXIpIHsKJiM0MzsJCWRlZmF1bHRfc2V0dGluZ3MuaHVnZXBhZ2VzW2Fub25fb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTOwomIzQzOwkJZGVmYXVsdF9zZXR0aW5ncy5zaG1lbV9odWdlcGFnZXNbYW5vbl9vcmRlcl0uZW5hYmxlZCA9IFNITUVNX0FMV0FZUzsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoYW5vbl90YXJnZXRfb3JkZXIpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBPbmx5IHRoZSB0YXJnZXQgb3JkZXIgbWF5IHByb2R1Y2UgbGFyZ2UgZm9saW9zLCBhbmQgb25seQomIzQzOwkJICogZnJvbSBraHVnZXBhZ2VkOiAmIzM0O2luaGVyaXQmIzM0OyB1bmRlciBlbmFibGVkPW1hZHZpc2Uga2VlcHMKJiM0MzsJCSAqIHByZS1NQURWX0hVR0VQQUdFIGZhdWx0cyBhdCBvcmRlciAwLgomIzQzOwkJICovCiYjNDM7CQlkZWZhdWx0X3NldHRpbmdzLmh1Z2VwYWdlc1tocGFnZV9wbWRfb3JkZXJdLmVuYWJsZWQgPSBUSFBfTkVWRVI7CiYjNDM7CQlkZWZhdWx0X3NldHRpbmdzLmh1Z2VwYWdlc1thbm9uX3RhcmdldF9vcmRlcl0uZW5hYmxlZCA9IFRIUF9JTkhFUklUOwomIzQzOwkJLyoKJiM0MzsJCSAqIE9yZGVyLXBhcmFtZXRlcml6ZWQgY2FzZXMgYXJlIGRyaXZlbiBzdHJpY3RseSBieSB0aGUKJiM0MzsJCSAqIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgYmFycmllciwgd2hpY2ggd2FrZXMgdGhlIGRhZW1vbgomIzQzOwkJICogaXRzZWxmLiBBIGxvbmcgc2Nhbl9zbGVlcCBrZWVwcyBraHVnZXBhZ2VkIGZyb20KJiM0MzsJCSAqIGZyZWUtcnVubmluZyBiZXR3ZWVuIGJhcnJpZXIgc3RlcHMsIGFuZCBhIHBhZ2VzX3RvX3NjYW4KJiM0MzsJCSAqIGNvdmVyaW5nIGV2ZXJ5dGhpbmcgbWFrZXMgb25lIHdha2UgY29tcGxldGUgb25lIGZ1bGwKJiM0MzsJCSAqIHBhc3MgKHRoZSBiYXJyaWVyJiMzOTtzIGNvbnRyYWN0KSwgc28gYSBydW4gcGVyZm9ybXMgYQomIzQzOwkJICogZGV0ZXJtaW5pc3RpYyBudW1iZXIgb2YgcGFzc2VzIOKAlCB3aGF0IHRoZSBzdGFnZSBBL0IKJiM0MzsJCSAqIHRyYWNlIGNvbXBhcmlzb25zIHJlbHkgb24uCiYjNDM7CQkgKi8KJiM0MzsJCWRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5zY2FuX3NsZWVwX21pbGxpc2VjcyA9IDYwMDAwOwomIzQzOwkJZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSAxVUwgJmx0OyZsdDsgMjQ7CiYjNDM7CiYjNDM7CQlwYWdlbWFwX2ZkID0gb3BlbigmIzM0Oy9wcm9jL3NlbGYvcGFnZW1hcCYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CQlpZiAocGFnZW1hcF9mZCAmbHQ7IDApCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7b3BlbihcJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXBcJiMzNDspJiMzNDspOwomIzQzOwkJa3BhZ2VmbGFnc19mZCA9IG9wZW4oJiMzNDsvcHJvYy9rcGFnZWZsYWdzJiMzNDssIE9fUkRPTkxZKTsKJiM0MzsJCWlmIChrcGFnZWZsYWdzX2ZkICZsdDsgMCkKJiM0MzsJCQlrc2Z0X2V4aXRfc2tpcCgmIzM0O29wZW4oXCYjMzQ7L3Byb2Mva3BhZ2VmbGFnc1wmIzM0OykgcmVxdWlyZXMgcm9vdFxuJiMzNDspOwomIzQzOwl9CiAKIAlzYXZlX3NldHRpbmdzKCk7CiAJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtkZWZhdWx0X3NldHRpbmdzKTsKIAomIzQzOwlpZiAoYW5vbl90YXJnZXRfb3JkZXIpIHsKJiM0MzsJCVRFU1QoY29sbGFwc2Vfb3JkZXJfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX29yZGVyX3NpbmdsZV93aW5kb3csIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpOwomIzQzOwkJVEVTVChjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdywga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUsIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpOwomIzQzOwkJVEVTVChjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsKJiM0MzsJCWtzZnRfc2V0X3BsYW4obnJfdGVzdF9jYXNlcyk7CiYjNDM7CQlnb3RvIHJ1bjsKJiM0MzsJfQomIzQzOwogCVRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiAJVEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7CiAJVEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7CkBAIC0xMzI0LDYgJiM0MzsxNzQwLDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCVRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKIAlURVNUKGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7CiAKJiM0MzsJVEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsJVEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsKIAlURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7CiAJVEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTsKIAlURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpOwpAQCAtMTMzNiw2ICYjNDM7MTc1NSw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIAlrc2Z0X3NldF9wbGFuKG5yX3Rlc3RfY2FzZXMgJiM0MzsgMSk7CiAKIAlhbGxvY19hdF9mYXVsdCgpOwomIzQzO3J1bjoKIAlmb3IgKGludCBpID0gMDsgaSAmbHQ7IG5yX3Rlc3RfY2FzZXM7IGkmIzQzOyYjNDM7KSB7CiAJCXN0cnVjdCB0ZXN0X2Nhc2UgKnQgPSAmYW1wO3Rlc3RfY2FzZXNbaV07CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uMmFhNDVjOWU4YTc3ZgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jCkBAIC0wLDAgJiM0MzsxLDQ4MyBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBraHVnZXBhZ2VkIHJhY2UgaGFybmVzcy4KJiM0MzsgKgomIzQzOyAqIFJ1bnMgY29sbGFwc2UgYWdhaW5zdCBjb25jdXJyZW50IGZhdWx0cywgdHJhbnNpZW50IEdVUCBwaW5zCiYjNDM7ICogKGd1cF90ZXN0KSwgZm9yaywgbXJlbWFwIGFuZCBNQURWX0RPTlRORUVEIG92ZXIgdGhlIHNhbWUgcmFuZ2VzLCBpbgomIzQzOyAqIG9uZSBvZiB0aHJlZSBkcml2ZXIgbW9kZXM6CiYjNDM7ICoKJiM0MzsgKiAgIHN0ZXBwZWQJa2h1Z2VwYWdlZCwgZHJpdmVuIHN5bmNocm9ub3VzbHkgb25lIGZ1bGwgcGFzcyBhdCBhIHRpbWUKJiM0MzsgKgkJdGhyb3VnaCBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIOKAlCB0aGUgcHJpbWFyeSBkcml2ZXI6IHRoZQomIzQzOyAqCQlmdWxsIHNjYW4mIzQzO2NvbGxhcHNlIHBhdGggd2l0aCBhIGRldGVybWluaXN0aWMgZXh0ZW50IHBlcgomIzQzOyAqCQlzdGVwOwomIzQzOyAqICAgZnJlZQlmcmVlLXJ1bm5pbmcga2h1Z2VwYWdlZCAoc2Nhbl9zbGVlcF9taWxsaXNlY3M9MCkg4oCUIHRoZQomIzQzOyAqCQlzb2FrOwomIzQzOyAqICAgbWFkdmlzZQlNQURWX0NPTExBUFNFIGluIGEgbG9vcCDigJQgdGhlIGxlZ2FjeS1QTUQgcmVncmVzc2lvbgomIzQzOyAqCQlheGlzLgomIzQzOyAqCiYjNDM7ICogQWxsIGFub24gVEhQIG9yZGVycyBhcmUgZW5hYmxlZCAoaW5oZXJpdCkuIG1heF9wdGVzX25vbmUgaXMgMCBieQomIzQzOyAqIGRlZmF1bHQg4oCUIHJhY2luZyBNQURWX0RPTlRORUVEIHRoZW4gc3RlZXJzIHNlbGVjdGlvbiBhY3Jvc3Mgb3JkZXJzIOKAlAomIzQzOyAqIG9yIHRoZSBwZXJtaXNzaXZlIGxpbWl0IHdpdGggLXosIHdoaWNoIGZsb29kcyB0aGUgYmF0Y2ggZW5naW5lIHdpdGgKJiM0MzsgKiBob2xlIGFuZCB6ZXJvcGFnZSBzbG90cyBzbyB0aGUgcG9wdWxhdGlvbiBwYXRocyAocGFyay10aW1lIHplcm9wYWdlCiYjNDM7ICogY2xlYXIsIHplcm8tZmlsbGVkIGNvcHksIGluc3RhbGwtdGltZSBwdGVfbm9uZSgpIHZlcmlmeSBhbmQgYWJvcnQpCiYjNDM7ICogcmFjZSB0aGUgZmF1bHRlcnMgZGlyZWN0bHkuCiYjNDM7ICoKJiM0MzsgKiAtcCBhZGRzIG1lbW9yeSBwcmVzc3VyZSB0byBhbnkgb2YgdGhlIGFib3ZlOiBNQURWX1BBR0VPVVQgY3ljbGluZwomIzQzOyAqIG9uIGEgZGVkaWNhdGVkIG5laWdoYm9yIHJlZ2lvbiAoc3dhcCB0cmFmZmljIGFuZCBMUlUgY2h1cm47IHNraXBwZWQKJiM0MzsgKiB3aXRoIGEgbm90ZSB3aGVuIHRoZSBob3N0IGhhcyBubyBzd2FwKSBhbmQgYSBjb21wYWN0X21lbW9yeSB0cmlnZ2VyCiYjNDM7ICogbG9vcCAoY29tcGFjdGlvbiBtaWdyYXRlcyBzb3VyY2UgZm9saW9zLCByYWNpbmcgY29sbGFwc2UmIzM5O3MgZnJlZXplCiYjNDM7ICogd2l0aCByZWZjb3VudCBlbGV2YXRpb24gYW5kIG1pZ3JhdGlvbiBlbnRyaWVzIG9mIGl0cyBvd24pLgomIzQzOyAqCiYjNDM7ICogQ29ycmVjdG5lc3Mgc2lnbmFsczogZXZlcnkgcmFjaW5nIHBhZ2UgbXVzdCByZWFkIGFzIGl0cyBwYXR0ZXJuIG9yCiYjNDM7ICogemVybyAoTUFEVl9ET05UTkVFRCksIG5ldmVyIGFueXRoaW5nIGVsc2Ug4oCUIGNoZWNrZWQgY29udGludW91c2x5IGJ5CiYjNDM7ICogdGhlIGZhdWx0ZXJzIGFuZCB0aGUgZm9yayBjaGlsZHJlbiBhbmQgb25jZSBhdCB0aGUgZW5kIOKAlCBwbHVzCiYjNDM7ICogd2hhdGV2ZXIgREVCVUdfVk0gLyBwYWdlX3RhYmxlX2NoZWNrIC8gS0FTQU4gLyBsb2NrZGVwIHJlcG9ydCBpbgomIzQzOyAqIGRtZXNnLCB3aGljaCB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGluc3BlY3QuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRQomIzQzOyNpbmNsdWRlICZsdDtlcnJuby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtwdGhyZWFkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL2lvY3RsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy90aW1lLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy93YWl0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3VuaXN0ZC5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7a3NlbGZ0ZXN0LmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7dm1fdXRpbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2h1Z2VwYWdlX3NldHRpbmdzLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Li4vLi4vLi4vLi4vbW0vZ3VwX3Rlc3QuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBCQVNFX0FERFIJKCh2b2lkICopKDFVTCAmbHQ7Jmx0OyAzMCkpCiYjNDM7LyoKJiM0MzsgKiBTaGFyZWQgcGxheWdyb3VuZCBmb3IgZmF1bHRzL3BpbnMvZm9yay9kb250bmVlZDogc2V2ZXJhbCBQTUQtc2l6ZWQKJiM0MzsgKiBhcmVhcyB0aGUgcmFjaW5nIHRocmVhZHMgc3ByZWFkIGFjcm9zcywgcGx1cyBvbmUgYXJlYSBvd25lZCBieSB0aGUKJiM0MzsgKiBtcmVtYXAgdGhyZWFkLiBNb3JlIGFyZWFzIG1lYW5zIG1vcmUgaW5kZXBlbmRlbnQgcmVnaW9ucyBjb2xsYXBzaW5nCiYjNDM7ICogYXQgb25jZTsgdGhlIGRlZmF1bHQgc3VpdHMgYSBub3JtYWwgbWFjaGluZS4gT24gYSBtZW1vcnktY29uc3RyYWluZWQKJiM0MzsgKiBob3N0IC0tIG9yIHVuZGVyIGVtdWxhdGlvbiwgd2hlcmUgYSA1MTJNIFBNRCAoYXJtNjQvNjRLKSBtYWtlcyB0aGUKJiM0MzsgKiBkZWZhdWx0IHBsYXlncm91bmQgbXVsdGktZ2lnYWJ5dGUgLS0gcGFzcyAtYSB0byBzaHJpbmsgaXQuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBERUZBVUxUX1NIQVJFRF9BUkVBUwkzCiYjNDM7c3RhdGljIGludCBucl9zaGFyZWRfYXJlYXM7CiYjNDM7c3RhdGljIGludCBucl9hcmVhczsKJiM0MzsKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTsKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7CiYjNDM7c3RhdGljIGNoYXIgKnJlZ2lvbjsJCS8qIE5SX0FSRUFTICogaHBhZ2VfcG1kX3NpemUgKi8KJiM0MztzdGF0aWMgY2hhciAqbXJlbWFwX2FyZWE7CS8qIHJlZ2lvbiAmIzQzOyBOUl9TSEFSRURfQVJFQVMgYXJlYXMgKi8KJiM0MztzdGF0aWMgY2hhciAqbXJlbWFwX3NjcmF0Y2g7CS8qIHdlbGwgYWJvdmUgdGhlIHJlZ2lvbiAqLwomIzQzO3N0YXRpYyBjaGFyICpwYWdlb3V0X2FyZWE7CS8qIC1wOiBkZWRpY2F0ZWQgcHJlc3N1cmUgcmVnaW9uICovCiYjNDM7c3RhdGljIHNpemVfdCBwYWdlb3V0X3NpemU7CiYjNDM7c3RhdGljIGludCBndXBfZmQgPSAtMTsKJiM0MztzdGF0aWMgdm9sYXRpbGUgaW50IHN0b3A7CiYjNDM7c3RhdGljIHZvbGF0aWxlIGludCBjb3JydXB0ZWQ7CiYjNDM7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGludCBwYXR0ZXJuKHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgdmFsID0gKHVuc2lnbmVkIGludClwYWdlX2lkeCAqIDI2NTQ0MzU3NjFVOwomIzQzOwomIzQzOwlyZXR1cm4gdmFsID8gdmFsIDogMTsJLyogbmV2ZXIgY29sbGlkZXMgd2l0aCB0aGUgemVyby1maWxsICovCiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNoZWNrX3BhZ2UodW5zaWduZWQgbG9uZyBwYWdlX2lkeCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCB2YWwgPSAqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUpOwomIzQzOwomIzQzOwlpZiAodmFsICZhbXA7JmFtcDsgdmFsICE9IHBhdHRlcm4ocGFnZV9pZHgpKSB7CiYjNDM7CQljb3JydXB0ZWQgPSAxOwomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtDb3JydXB0aW9uIGF0IHBhZ2UgJWx1OiAlI3ggIT0gJSN4XG4mIzM0OywKJiM0MzsJCQkgICAgICAgcGFnZV9pZHgsIHZhbCwgcGF0dGVybihwYWdlX2lkeCkpOwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHJhbmRfcGFnZSh1bnNpZ25lZCBpbnQgKnNlZWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcmFuZF9yKHNlZWQpICUKJiM0MzsJICAgICAgIChucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICpmYXVsdGVyX2ZuKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnOwomIzQzOwomIzQzOwl3aGlsZSAoIXN0b3ApIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoJmFtcDtzZWVkKTsKJiM0MzsKJiM0MzsJCWlmIChyYW5kX3IoJmFtcDtzZWVkKSAmYW1wOyAxKQomIzQzOwkJCSoodW5zaWduZWQgaW50ICopKHJlZ2lvbiAmIzQzOyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSkgPQomIzQzOwkJCQlwYXR0ZXJuKHBhZ2VfaWR4KTsKJiM0MzsJCWVsc2UKJiM0MzsJCQljaGVja19wYWdlKHBhZ2VfaWR4KTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKmRvbnRuZWVkX2ZuKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnOwomIzQzOwomIzQzOwl3aGlsZSAoIXN0b3ApIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoJmFtcDtzZWVkKTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgbnIgPSAxVUwgJmx0OyZsdDsgKHJhbmRfcigmYW1wO3NlZWQpICUgNik7CS8qIDEuLjMyIHBhZ2VzICovCiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogT25jZSBpbiBhIHdoaWxlIHphcCBhIHdob2xlIFBNRC1hbGlnbmVkIGFyZWE6IG9ubHkgYQomIzQzOwkJICogemFwIHNwYW5uaW5nIHRoZSBmdWxsIHRhYmxlIHRyaWdnZXJzIHRoZSBlbXB0eS10YWJsZQomIzQzOwkJICogcmVjbGFpbSAoQ09ORklHX1BUX1JFQ0xBSU0pLCB3aGljaCBjYW4gZnJlZSBhIHRhYmxlCiYjNDM7CQkgKiBvdXQgZnJvbSB1bmRlciBhIHBhcmtlZCBjb2xsYXBzZSDigJQgc3ViLXRhYmxlIHphcHMKJiM0MzsJCSAqIG5ldmVyIHJlYWNoIHRoYXQgcGF0aC4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKCEocmFuZF9yKCZhbXA7c2VlZCkgJSA2NCkpIHsKJiM0MzsJCQl1bnNpZ25lZCBsb25nIGFyZWEgPSBwYWdlX2lkeCAvCiYjNDM7CQkJCQkoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpOwomIzQzOwomIzQzOwkJCW1hZHZpc2UocmVnaW9uICYjNDM7IGFyZWEgKiBocGFnZV9wbWRfc2l6ZSwKJiM0MzsJCQkJaHBhZ2VfcG1kX3NpemUsIE1BRFZfRE9OVE5FRUQpOwomIzQzOwkJfSBlbHNlIHsKJiM0MzsJCQltYWR2aXNlKHJlZ2lvbiAmIzQzOyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSwKJiM0MzsJCQkJbnIgKiBwYWdlX3NpemUsIE1BRFZfRE9OVE5FRUQpOwomIzQzOwkJfQomIzQzOwkJdXNsZWVwKHJhbmRfcigmYW1wO3NlZWQpICUgNTAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKnBpbm5lcl9mbih2b2lkICphcmcpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZzsKJiM0MzsKJiM0MzsJd2hpbGUgKCFzdG9wKSB7CiYjNDM7CQlzdHJ1Y3QgZ3VwX3Rlc3QgZ3VwID0ge307CiYjNDM7CQl1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKCZhbXA7c2VlZCk7CiYjNDM7CiYjNDM7CQlndXAuYWRkciA9ICh1bnNpZ25lZCBsb25nKShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUpOwomIzQzOwkJZ3VwLnNpemUgPSAxNiAqIHBhZ2Vfc2l6ZTsKJiM0MzsJCWd1cC5ucl9wYWdlc19wZXJfY2FsbCA9IDE2OwomIzQzOwkJZ3VwLmd1cF9mbGFncyA9IDE7CS8qIEZPTExfV1JJVEUgKi8KJiM0MzsJCS8qIFJhY2luZyBNQURWX0RPTlRORUVEIG1ha2VzIHRyYW5zaWVudCBmYWlsdXJlcyBleHBlY3RlZC4gKi8KJiM0MzsJCWlvY3RsKGd1cF9mZCwgUElOX0ZBU1RfQkVOQ0hNQVJLLCAmYW1wO2d1cCk7CiYjNDM7CQl1c2xlZXAocmFuZF9yKCZhbXA7c2VlZCkgJSAyMDApOwomIzQzOwl9CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCAqZm9ya2VyX2ZuKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnOwomIzQzOwomIzQzOwl3aGlsZSAoIXN0b3ApIHsKJiM0MzsJCXBpZF90IHBpZCA9IGZvcmsoKTsKJiM0MzsKJiM0MzsJCWlmIChwaWQgPT0gMCkgewomIzQzOwkJCWZvciAoaW50IGkgPSAwOyBpICZsdDsgMTY7IGkmIzQzOyYjNDM7KQomIzQzOwkJCQljaGVja19wYWdlKHJhbmRfcGFnZSgmYW1wO3NlZWQpKTsKJiM0MzsJCQlfZXhpdChjb3JydXB0ZWQpOwomIzQzOwkJfQomIzQzOwkJaWYgKHBpZCAmZ3Q7IDApIHsKJiM0MzsJCQlpbnQgd3N0YXR1czsKJiM0MzsKJiM0MzsJCQl3YWl0cGlkKHBpZCwgJmFtcDt3c3RhdHVzLCAwKTsKJiM0MzsJCQlpZiAoV0lGRVhJVEVEKHdzdGF0dXMpICZhbXA7JmFtcDsgV0VYSVRTVEFUVVMod3N0YXR1cykpCiYjNDM7CQkJCWNvcnJ1cHRlZCA9IDE7CiYjNDM7CQl9CiYjNDM7CQl1c2xlZXAocmFuZF9yKCZhbXA7c2VlZCkgJSAyMDAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKm1yZW1hcHBlcl9mbih2b2lkICphcmcpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZzsKJiM0MzsKJiM0MzsJd2hpbGUgKCFzdG9wKSB7CiYjNDM7CQl2b2lkICpwOwomIzQzOwomIzQzOwkJcCA9IG1yZW1hcChtcmVtYXBfYXJlYSwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLAomIzQzOwkJCSAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfc2NyYXRjaCk7CiYjNDM7CQlpZiAocCA9PSBNQVBfRkFJTEVEKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21yZW1hcCgpIGF3YXkmIzM0Oyk7CiYjNDM7CQlmb3IgKGludCBpID0gMDsgaSAmbHQ7IDg7IGkmIzQzOyYjNDM7KQomIzQzOwkJCW1yZW1hcF9zY3JhdGNoWyhyYW5kX3IoJmFtcDtzZWVkKSAlCiYjNDM7CQkJCShocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkpICogcGFnZV9zaXplXSA9IDE7CiYjNDM7CQlwID0gbXJlbWFwKG1yZW1hcF9zY3JhdGNoLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsCiYjNDM7CQkJICAgTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQsIG1yZW1hcF9hcmVhKTsKJiM0MzsJCWlmIChwID09IE1BUF9GQUlMRUQpCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bXJlbWFwKCkgYmFjayYjMzQ7KTsKJiM0MzsJCXVzbGVlcChyYW5kX3IoJmFtcDtzZWVkKSAlIDIwMDApOwomIzQzOwl9CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIC1wOiBzd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybiBvbiBhIHJlZ2lvbiBvZiBvdXIgb3duLiBUaGUgY29udGVudAomIzQzOyAqIGNoZWNrIGlzIGV4YWN0IOKAlCBhIHBhZ2Ugb3V0IGFuZCBiYWNrIHRocm91Z2ggc3dhcCBtdXN0IHByZXNlcnZlIHRoZQomIzQzOyAqIHBhdHRlcm4sIGFuZCBub3RoaW5nIGVsc2UgZXZlciB3cml0ZXMgaGVyZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCAqcGFnZW91dF9mbih2b2lkICphcmcpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZzsKJiM0MzsJdW5zaWduZWQgbG9uZyBuciA9IHBhZ2VvdXRfc2l6ZSAvIHBhZ2Vfc2l6ZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnI7IGkmIzQzOyYjNDM7KQomIzQzOwkJKih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICYjNDM7IGkgKiBwYWdlX3NpemUpID0gcGF0dGVybihpKTsKJiM0MzsKJiM0MzsJd2hpbGUgKCFzdG9wKSB7CiYjNDM7CQltYWR2aXNlKHBhZ2VvdXRfYXJlYSwgcGFnZW91dF9zaXplLCBNQURWX1BBR0VPVVQpOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5yICZhbXA7JmFtcDsgIXN0b3A7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJdW5zaWduZWQgaW50IHZhbCA9ICoodW5zaWduZWQgaW50ICopKHBhZ2VvdXRfYXJlYSAmIzQzOwomIzQzOwkJCQkJCQkgICAgIGkgKiBwYWdlX3NpemUpOwomIzQzOwomIzQzOwkJCWlmICh2YWwgIT0gcGF0dGVybihpKSkgewomIzQzOwkJCQljb3JydXB0ZWQgPSAxOwomIzQzOwkJCQlrc2Z0X3ByaW50X21zZygmIzM0O1BhZ2VvdXQgY29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxuJiMzNDssCiYjNDM7CQkJCQkgICAgICAgaSwgdmFsLCBwYXR0ZXJuKGkpKTsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CQl1c2xlZXAocmFuZF9yKCZhbXA7c2VlZCkgJSAyMDAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLXA6IGNvbXBhY3Rpb24gbWlncmF0ZXMgdGhlIGNvbGxhcHNlIHNvdXJjZXMgb3V0IGZyb20gdW5kZXIgdXMuICovCiYjNDM7c3RhdGljIHZvaWQgKmNvbXBhY3Rvcl9mbih2b2lkICphcmcpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZzsKJiM0MzsJaW50IGZkID0gb3BlbigmIzM0Oy9wcm9jL3N5cy92bS9jb21wYWN0X21lbW9yeSYjMzQ7LCBPX1dST05MWSk7CiYjNDM7CiYjNDM7CWlmIChmZCAmbHQ7IDApIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7Tm8gY29tcGFjdF9tZW1vcnk7IGNvbXBhY3RvciBpZGxlXG4mIzM0Oyk7CiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJfQomIzQzOwl3aGlsZSAoIXN0b3ApIHsKJiM0MzsJCWlmICh3cml0ZShmZCwgJiMzNDsxJiMzNDssIDEpICZsdDsgMCkKJiM0MzsJCQlicmVhazsKJiM0MzsJCXVzbGVlcCgxMDAwMCAmIzQzOyByYW5kX3IoJmFtcDtzZWVkKSAlIDEwMDAwMCk7CiYjNDM7CX0KJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgc3dhcF9hdmFpbGFibGUodm9pZCkKJiM0Mzt7CiYjNDM7CWNoYXIgbGluZVsyNTZdOwomIzQzOwlpbnQgbGluZXMgPSAwOwomIzQzOwlGSUxFICpmcCA9IGZvcGVuKCYjMzQ7L3Byb2Mvc3dhcHMmIzM0OywgJiMzNDtyJiMzNDspOwomIzQzOwomIzQzOwlpZiAoIWZwKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpCiYjNDM7CQlsaW5lcyYjNDM7JiM0Mzs7CiYjNDM7CWZjbG9zZShmcCk7CiYjNDM7CXJldHVybiBsaW5lcyAmZ3Q7IDE7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIG5vd19tcyh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHRpbWV2YWwgdHY7CiYjNDM7CiYjNDM7CWdldHRpbWVvZmRheSgmYW1wO3R2LCBOVUxMKTsKJiM0MzsJcmV0dXJuIHR2LnR2X3NlYyAqIDEwMDBVTCAmIzQzOyB0di50dl91c2VjIC8gMTAwMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKJiM0Mzt7CiYjNDM7CWZwcmludGYoc3RkZXJyLAomIzQzOwkJJiMzNDtVc2FnZToga2h1Z2VwYWdlZF9yYWNlIFstZCBzZWNvbmRzXSBbLW0gc3RlcHBlZHxmcmVlfG1hZHZpc2VdIFstel0gWy1wXSBbLWEgYXJlYXNdXG4mIzM0OwomIzQzOwkJJiMzNDtcdC16OiBwZXJtaXNzaXZlIG1heF9wdGVzX25vbmUgKGhvbGUtaGVhdnkgd2luZG93cylcbiYjMzQ7CiYjNDM7CQkmIzM0O1x0LXA6IG1lbW9yeSBwcmVzc3VyZSAocGFnZW91dCAmIzQzOyBjb21wYWN0aW9uKSB0aHJlYWRzXG4mIzM0OwomIzQzOwkJJiMzNDtcdC1hOiBudW1iZXIgb2Ygc2hhcmVkIFBNRC1zaXplZCBwbGF5Z3JvdW5kIGFyZWFzIChkZWZhdWx0IDMpXG4mIzM0Oyk7CiYjNDM7CWV4aXQoMSk7CiYjNDM7fQomIzQzOwomIzQzO2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKJiM0Mzt7CiYjNDM7CXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGhyZWFkX25hbWVzW10gPSB7CiYjNDM7CQkmIzM0O2ZhdWx0ZXImIzM0OywgJiMzNDtmYXVsdGVyMiYjMzQ7LCAmIzM0O2RvbnRuZWVkJiMzNDssICYjMzQ7cGlubmVyJiMzNDssICYjMzQ7Zm9ya2VyJiMzNDssCiYjNDM7CQkmIzM0O21yZW1hcHBlciYjMzQ7LCAmIzM0O3BhZ2VvdXQmIzM0OywgJiMzNDtjb21wYWN0b3ImIzM0OywKJiM0MzsJfTsKJiM0MzsJdm9pZCAqKCpjb25zdCB0aHJlYWRfZm5zW10pKHZvaWQgKikgPSB7CiYjNDM7CQlmYXVsdGVyX2ZuLCBmYXVsdGVyX2ZuLCBkb250bmVlZF9mbiwgcGlubmVyX2ZuLCBmb3JrZXJfZm4sCiYjNDM7CQltcmVtYXBwZXJfZm4sIHBhZ2VvdXRfZm4sIGNvbXBhY3Rvcl9mbiwKJiM0MzsJfTsKJiM0MzsJY29uc3QgdW5zaWduZWQgbG9uZyBwYWdlb3V0X2JpdCA9IDFVTCAmbHQ7Jmx0OyA2LCBjb21wYWN0b3JfYml0ID0gMVVMICZsdDsmbHQ7IDc7CiYjNDM7CWNvbnN0IGludCBucl90aHJlYWRzID0gQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpOwomIzQzOwlwdGhyZWFkX3QgdGhyZWFkc1tBUlJBWV9TSVpFKHRocmVhZF9uYW1lcyldOwomIzQzOwljb25zdCBjaGFyICptb2RlID0gJiMzNDtzdGVwcGVkJiMzNDs7CiYjNDM7CXN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZW5kX21zOwomIzQzOwlpbnQgZHVyYXRpb25fcyA9IDEwOwomIzQzOwl1bnNpZ25lZCBsb25nIHRocmVhZF9tYXNrID0gfjBVTDsKJiM0MzsJaW50IG5yX2FyZWFzX2FyZyA9IDA7CiYjNDM7CWJvb2wgcGVybWlzc2l2ZV9ub25lID0gZmFsc2U7CiYjNDM7CWJvb2wgcHJlc3N1cmUgPSBmYWxzZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBpOwomIzQzOwlpbnQgc3RlcHMgPSAwOwomIzQzOwlpbnQgb3B0OwomIzQzOwomIzQzOwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAmIzM0O2E6ZDptOnQ6enBoJiMzNDspKSAhPSAtMSkgewomIzQzOwkJc3dpdGNoIChvcHQpIHsKJiM0MzsJCWNhc2UgJiMzOTthJiMzOTs6CiYjNDM7CQkJbnJfYXJlYXNfYXJnID0gYXRvaShvcHRhcmcpOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O2QmIzM5OzoKJiM0MzsJCQlkdXJhdGlvbl9zID0gYXRvaShvcHRhcmcpOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O20mIzM5OzoKJiM0MzsJCQltb2RlID0gb3B0YXJnOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O3QmIzM5OzoKJiM0MzsJCQkvKiBkZWJ1ZzogYml0bWFzayBvZiByYWNpbmcgdGhyZWFkcyB0byBzdGFydCAqLwomIzQzOwkJCXRocmVhZF9tYXNrID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDApOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O3omIzM5OzoKJiM0MzsJCQlwZXJtaXNzaXZlX25vbmUgPSB0cnVlOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O3AmIzM5OzoKJiM0MzsJCQlwcmVzc3VyZSA9IHRydWU7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlkZWZhdWx0OgomIzQzOwkJCXVzYWdlKCk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJaWYgKHN0cmNtcChtb2RlLCAmIzM0O3N0ZXBwZWQmIzM0OykgJmFtcDsmYW1wOyBzdHJjbXAobW9kZSwgJiMzNDtmcmVlJiMzNDspICZhbXA7JmFtcDsKJiM0MzsJICAgIHN0cmNtcChtb2RlLCAmIzM0O21hZHZpc2UmIzM0OykpCiYjNDM7CQl1c2FnZSgpOwomIzQzOwomIzQzOwlrc2Z0X3ByaW50X2hlYWRlcigpOwomIzQzOwlpZiAoIXRocF9hdmFpbGFibGUoKSkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKTsKJiM0MzsJaHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpOwomIzQzOwlpZiAoIWhwYWdlX3BtZF9zaXplKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7UmVhZGluZyBQTUQgcGFnZXNpemUgZmFpbGVkXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CWd1cF9mZCA9IG9wZW4oJiMzNDsvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdCYjMzQ7LCBPX1JEV1IpOwomIzQzOwlpZiAoZ3VwX2ZkICZsdDsgMCkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7L3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgcmVxdWlyZXMgQ09ORklHX0dVUF9URVNUIGFuZCByb290XG4mIzM0Oyk7CiYjNDM7CiYjNDM7CW5yX3NoYXJlZF9hcmVhcyA9IG5yX2FyZWFzX2FyZyAmZ3Q7IDAgPyBucl9hcmVhc19hcmcgOiBERUZBVUxUX1NIQVJFRF9BUkVBUzsKJiM0MzsJbnJfYXJlYXMgPSBucl9zaGFyZWRfYXJlYXMgJiM0MzsgMTsKJiM0MzsKJiM0MzsJaWYgKCFwcmVzc3VyZSkgewomIzQzOwkJdGhyZWFkX21hc2sgJmFtcDs9IH4ocGFnZW91dF9iaXQgfCBjb21wYWN0b3JfYml0KTsKJiM0MzsJfSBlbHNlIGlmICghc3dhcF9hdmFpbGFibGUoKSkgewomIzQzOwkJLyogTm8gc3dhcCwgbm8gYW5vbiByZWNsYWltOiBjb21wYWN0aW9uLW9ubHkgcHJlc3N1cmUuICovCiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0Oy1wIHdpdGhvdXQgc3dhcDogcGFnZW91dCB0aHJlYWQgZGlzYWJsZWRcbiYjMzQ7KTsKJiM0MzsJCXRocmVhZF9tYXNrICZhbXA7PSB+cGFnZW91dF9iaXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJa3NmdF9zZXRfcGxhbigxKTsKJiM0MzsKJiM0MzsJdGhwX3NhdmVfc2V0dGluZ3MoKTsKJiM0MzsJdGhwX3JlYWRfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CXNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7CiYjNDM7CXNldHRpbmdzLnRocF9kZWZyYWcgPSBUSFBfREVGUkFHX0FMV0FZUzsKJiM0MzsJc2V0dGluZ3Muc2htZW1fZW5hYmxlZCA9IFNITUVNX05FVkVSOwomIzQzOwlzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7CiYjNDM7CXNldHRpbmdzLmtodWdlcGFnZWQuc2Nhbl9zbGVlcF9taWxsaXNlY3MgPQomIzQzOwkJc3RyY21wKG1vZGUsICYjMzQ7ZnJlZSYjMzQ7KSA/IDEwMDAgOiAwOwomIzQzOwlzZXR0aW5ncy5raHVnZXBhZ2VkLmFsbG9jX3NsZWVwX21pbGxpc2VjcyA9IDEwOwomIzQzOwkvKgomIzQzOwkgKiBtVEhQIGNvbGxhcHNlIG9ubHkgc3VwcG9ydHMgdGhlIHR3byBlbmRzIG9mIHRoZSBvY2N1cGFuY3kKJiM0MzsJICogc2NhbGU6IDAgb3IgSFBBR0VfUE1EX05SIC0gMSAoYW55dGhpbmcgZWxzZSBjb2VyY2VzIHRvIDApLgomIzQzOwkgKiBTdHJpY3QgaXMgdGhlIGRlZmF1bHQg4oCUIGl0IGFsc28ga2VlcHMga2h1Z2VwYWdlZCBmcm9tIGJ1cm5pbmcKJiM0MzsJICogdGhlIHdob2xlIHN0ZXAgaW4gZG9vbWVkIFBNRC1zaXplZCBhbGxvY2F0aW9ucyBvbiA1MTJNLVBNRAomIzQzOwkgKiBjb25maWdzLCB3aGVyZSBhIGZ1bGx5IHBvcHVsYXRlZCBhcmVhIGlzIHJhcmUgdW5kZXIgcmFjaW5nCiYjNDM7CSAqIE1BRFZfRE9OVE5FRUQuIC16IHNlbGVjdHMgdGhlIHBlcm1pc3NpdmUgZW5kOiBzZWxlY3Rpb24gdGhlbgomIzQzOwkgKiBlbWl0cyBob2xlLWhlYXZ5IHdpbmRvd3MgYW5kIHRoZSBlbmdpbmUmIzM5O3MgcG9wdWxhdGlvbiBwYXRocwomIzQzOwkgKiB0YWtlIHRoZSBicnVudCBvZiB0aGUgcmFjaW5nIGZhdWx0cyBhbmQgemFwcy4KJiM0MzsJICovCiYjNDM7CXNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IHBlcm1pc3NpdmVfbm9uZSA/CiYjNDM7CQkoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpIC0gMSA6IDA7CiYjNDM7CXNldHRpbmdzLmtodWdlcGFnZWQucGFnZXNfdG9fc2NhbiA9CiYjNDM7CQlucl9hcmVhcyAqIChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgKiA4OwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgJmFtcDsgKDFVTCAmbHQ7Jmx0OyBpKSkKJiM0MzsJCQlzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9JTkhFUklUOwomIzQzOwl9CiYjNDM7CS8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZC4gKi8KJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CXJlZ2lvbiA9IG1tYXAoQkFTRV9BRERSLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLAomIzQzOwkJICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLAomIzQzOwkJICAgICAgLTEsIDApOwomIzQzOwlpZiAocmVnaW9uICE9IEJBU0VfQUREUikKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O0ZhaWxlZCB0byBhbGxvY2F0ZSBWTUEgYXQgJXBcbiYjMzQ7LCBCQVNFX0FERFIpOwomIzQzOwltcmVtYXBfYXJlYSA9IHJlZ2lvbiAmIzQzOyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTsKJiM0MzsJbXJlbWFwX3NjcmF0Y2ggPSAoY2hhciAqKUJBU0VfQUREUiAmIzQzOyAyICogbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTsKJiM0MzsKJiM0MzsJaWYgKHRocmVhZF9tYXNrICZhbXA7IHBhZ2VvdXRfYml0KSB7CiYjNDM7CQkvKgomIzQzOwkJICogQmlnIGVub3VnaCB0byBjeWNsZSByZWFsIHJlY2xhaW0sIHNtYWxsIGVub3VnaCBub3QgdG8KJiM0MzsJCSAqIGRvbWluYXRlIGEgVENHIGd1ZXN0OiA0IFBNRCBhcmVhcywgY2xhbXBlZCB0byBbMTZNLCA2NE1dLgomIzQzOwkJICovCiYjNDM7CQlwYWdlb3V0X3NpemUgPSA0ICogaHBhZ2VfcG1kX3NpemU7CiYjNDM7CQlwYWdlb3V0X3NpemUgPSBwYWdlb3V0X3NpemUgJmx0OyAoMTZVTCAmbHQ7Jmx0OyAyMCkgPyAoMTZVTCAmbHQ7Jmx0OyAyMCkgOgomIzQzOwkJCSAgICAgICBwYWdlb3V0X3NpemUgJmd0OyAoNjRVTCAmbHQ7Jmx0OyAyMCkgPyAoNjRVTCAmbHQ7Jmx0OyAyMCkgOgomIzQzOwkJCSAgICAgICBwYWdlb3V0X3NpemU7CiYjNDM7CQlwYWdlb3V0X2FyZWEgPSBtbWFwKE5VTEwsIHBhZ2VvdXRfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKJiM0MzsJCQkJICAgIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSwgLTEsIDApOwomIzQzOwkJaWYgKHBhZ2VvdXRfYXJlYSA9PSBNQVBfRkFJTEVEKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21tYXAoKSBwYWdlb3V0IGFyZWEmIzM0Oyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogUG9wdWxhdGUgc28gdGhlIGZpcnN0IHBhc3MgaGFzIHNvbWV0aGluZyB0byBjb2xsYXBzZS4gKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOyBpJiM0MzsmIzQzOykKJiM0MzsJCSoodW5zaWduZWQgaW50ICopKHJlZ2lvbiAmIzQzOyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7CiYjNDM7CW1lbXNldChtcmVtYXBfYXJlYSwgMSwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwltYWR2aXNlKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBucl90aHJlYWRzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKCEodGhyZWFkX21hc2sgJmFtcDsgKDFVTCAmbHQ7Jmx0OyBpKSkpIHsKJiM0MzsJCQl0aHJlYWRzW2ldID0gMDsKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCX0KJiM0MzsJCWlmIChwdGhyZWFkX2NyZWF0ZSgmYW1wO3RocmVhZHNbaV0sIE5VTEwsIHRocmVhZF9mbnNbaV0sCiYjNDM7CQkJCSAgICh2b2lkICopKGkgJiM0MzsgMSkpKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O3B0aHJlYWRfY3JlYXRlKCkmIzM0Oyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZW5kX21zID0gbm93X21zKCkgJiM0MzsgZHVyYXRpb25fcyAqIDEwMDBVTDsKJiM0MzsJaWYgKCFzdHJjbXAobW9kZSwgJiMzNDtzdGVwcGVkJiMzNDspKSB7CiYjNDM7CQl3aGlsZSAobm93X21zKCkgJmx0OyBlbmRfbXMgJmFtcDsmYW1wOyAhY29ycnVwdGVkKSB7CiYjNDM7CQkJaWYgKCFraHVnZXBhZ2VkX2Z1bGxfcGFzcyg2MDApKQomIzQzOwkJCQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtraHVnZXBhZ2VkIHBhc3MgdGltZWQgb3V0XG4mIzM0Oyk7CiYjNDM7CQkJc3RlcHMmIzQzOyYjNDM7OwomIzQzOwkJfQomIzQzOwl9IGVsc2UgaWYgKCFzdHJjbXAobW9kZSwgJiMzNDtmcmVlJiMzNDspKSB7CiYjNDM7CQl3aGlsZSAobm93X21zKCkgJmx0OyBlbmRfbXMgJmFtcDsmYW1wOyAhY29ycnVwdGVkKQomIzQzOwkJCXVzbGVlcCgxMDAgKiAxMDAwKTsKJiM0MzsJfSBlbHNlIHsJLyogbWFkdmlzZSAqLwomIzQzOwkJd2hpbGUgKG5vd19tcygpICZsdDsgZW5kX21zICZhbXA7JmFtcDsgIWNvcnJ1cHRlZCkgewomIzQzOwkJCWZvciAoaSA9IDA7IGkgJmx0OyBucl9zaGFyZWRfYXJlYXM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJCW1hZHZpc2UocmVnaW9uICYjNDM7IGkgKiBocGFnZV9wbWRfc2l6ZSwKJiM0MzsJCQkJCWhwYWdlX3BtZF9zaXplLCBNQURWX0NPTExBUFNFKTsKJiM0MzsJCQl9CiYjNDM7CQkJbWFkdmlzZShyZWdpb24sIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLAomIzQzOwkJCQlNQURWX0RPTlRORUVEKTsKJiM0MzsJCQlzdGVwcyYjNDM7JiM0Mzs7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJc3RvcCA9IDE7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBucl90aHJlYWRzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKHRocmVhZHNbaV0pCiYjNDM7CQkJcHRocmVhZF9qb2luKHRocmVhZHNbaV0sIE5VTEwpOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIEZpbmFsIGludGVncml0eSBzd2VlcC4gKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOyBpJiM0MzsmIzQzOykKJiM0MzsJCWNoZWNrX3BhZ2UoaSk7CiYjNDM7CiYjNDM7CXRocF9yZXN0b3JlX3NldHRpbmdzKCk7CiYjNDM7CiYjNDM7CWtzZnRfdGVzdF9yZXN1bHQoIWNvcnJ1cHRlZCwgJiMzNDslczogJWRzLCAlZCBzdGVwcywgbm8gY29ycnVwdGlvblxuJiMzNDssCiYjNDM7CQkJIG1vZGUsIGR1cmF0aW9uX3MsIHN0ZXBzKTsKJiM0MzsJa3NmdF9maW5pc2hlZCgpOwomIzQzO30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uMTMyMTVjYjM3MGNlYgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jCkBAIC0wLDAgJiM0MzsxLDE5OCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBTeW5jaHJvbm91cyBraHVnZXBhZ2VkIGRyaXZpbmcgY2hlY2suCiYjNDM7ICoKJiM0MzsgKiBSYWNlIHRlc3RzIGRyaXZlIGtodWdlcGFnZWQgdGhyb3VnaCB0aGUgZXhpc3Rpbmcgc3lzZnMgY29udHJvbHM6IGEKJiM0MzsgKiBzdG9yZSB0byBzY2FuX3NsZWVwX21pbGxpc2VjcyB3YWtlcyB0aGUgZGFlbW9uLCBhbmQgZnVsbF9zY2FucwomIzQzOyAqIGFkdmFuY2luZyBieSB0d28gaXMgYSBjb21wbGV0aW9uIGJhcnJpZXIgZm9yIG9uZSBmdWxsIHBhc3MgdGhhdAomIzQzOyAqIHN0YXJ0ZWQgYWZ0ZXIgc2V0dXAgKGtodWdlcGFnZWRfZnVsbF9wYXNzKCkpLiBWZXJpZnkgdGhlIHBhaXIgZ2l2ZXMKJiM0MzsgKiBkZXRlcm1pbmlzdGljLCBhdHRyaWJ1dGFibGUgcmVzdWx0czogb25lIGJhcnJpZXIgc3RlcCBvdmVyIG9uZQomIzQzOyAqIHByZXBhcmVkIHdpbmRvdyBwcm9kdWNlcyBleGFjdGx5IG9uZSBjb2xsYXBzZSBhdHRlbXB0IG9uIHRoYXQKJiM0MzsgKiB3aW5kb3cmIzM5O3Mgc291cmNlIHBhZ2VzIOKAlCBtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSBldmVudHMKJiM0MzsgKiBmaWx0ZXJlZCBieSBzb3VyY2UgUEZOIGFuZCBvcmRlciDigJQgYW5kIHRoZSB3aW5kb3cgaXMgY29sbGFwc2VkCiYjNDM7ICogYWZ0ZXJ3YXJkcywgcmVwZWF0YWJseS4KJiM0MzsgKgomIzQzOyAqIHNjYW5fc2xlZXBfbWlsbGlzZWNzIGlzIHNldCB0byA2MHMgdG8gcHJvdmUgdGhlIHdha2UgcGF0aDogd2l0aG91dAomIzQzOyAqIHRoZSB3YWtlLCBvbmUgYmFycmllciBzdGVwIHdvdWxkIHNsZWVwIG11bHRpcGxlcyBvZiB0aGF0IGFuZCBibG93CiYjNDM7ICogdGhlIHRpbWVvdXQuIEl0IGFsc28ga2VlcHMgdGhlIGRhZW1vbiBmcm9tIGZyZWUtcnVubmluZyBiZXR3ZWVuCiYjNDM7ICogc3RlcHMsIHBlciB0aGUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSBkaXNjaXBsaW5lLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0UKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvbW1hbi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O2tzZWxmdGVzdC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O3ZtX3V0aWwuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtodWdlcGFnZV9zZXR0aW5ncy5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIEJBU0VfQUREUiAoKHZvaWQgKikoMVVMICZsdDsmbHQ7IDMwKSkKJiM0MzsjZGVmaW5lIFRBUkdFVF9PUkRFUiAyCS8qIHNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgY29uc2lkZXJzICovCiYjNDM7I2RlZmluZSBOUl9JVEVSQVRJT05TIDUKJiM0MzsKJiM0MztzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7CiYjNDM7c3RhdGljIGludCBrcGFnZWZsYWdzX2ZkOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwYWdlX3BtZF9zaXplOwomIzQzOwomIzQzOy8qCiYjNDM7ICogQ291bnQgY29sbGFwc2UgYXR0ZW1wdHMgYXR0cmlidXRhYmxlIHRvIG91ciB3aW5kb3c6IGxlZ2FjeS1lbmdpbmUKJiM0MzsgKiBpc29sYXRlIGV2ZW50cyB3aG9zZSBzY2FuX3BmbiBpcyBvbmUgb2YgdGhlIHdpbmRvdyYjMzk7cyBzb3VyY2UgUEZOcywKJiM0MzsgKiBwbHVzIGJhdGNoLWVuZ2luZSBwZXItY2FuZGlkYXRlIGluc3RhbGwgZXZlbnRzIGF0IHRoZSB3aW5kb3cmIzM5O3MKJiM0MzsgKiBhZGRyZXNzLiBFaXRoZXIgZW5naW5lIHJlcG9ydHMgZXhhY3RseSBvbmNlIHBlciBhdHRlbXB0LgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgY291bnRfYXR0cmlidXRlZCh1bnNpZ25lZCBsb25nICpwZm5zLCBpbnQgbnJfcGZucywKJiM0MzsJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgb3JkZXIpCiYjNDM7ewomIzQzOwljaGFyIGxpbmVbMTAyNF07CiYjNDM7CWludCBjb3VudCA9IDA7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlmcCA9IHRyYWNpbmdfb3Blbl90cmFjZSgpOwomIzQzOwlpZiAoIWZwKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7Q2Fubm90IG9wZW4gdHJhY2UgYnVmZmVyXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgewomIzQzOwkJY2hhciAqczsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgdmFsOwomIzQzOwkJdW5zaWduZWQgaW50IG9yZDsKJiM0MzsJCWNoYXIgKm87CiYjNDM7CQlpbnQgaTsKJiM0MzsKJiM0MzsJCXMgPSBzdHJzdHIobGluZSwgJiMzNDttbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTomIzM0Oyk7CiYjNDM7CQlpZiAocykgewomIzQzOwkJCWlmIChzc2NhbmYocywgJiMzNDttbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTogc2Nhbl9wZm49MHglbHgmIzM0OywKJiM0MzsJCQkJICAgJmFtcDt2YWwpICE9IDEpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCW8gPSBzdHJzdHIocywgJiMzNDtvcmRlcj0mIzM0Oyk7CiYjNDM7CQkJaWYgKCFvIHx8IHNzY2FuZihvLCAmIzM0O29yZGVyPSV1JiMzNDssICZhbXA7b3JkKSAhPSAxIHx8CiYjNDM7CQkJICAgIG9yZCAhPSBvcmRlcikKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQkJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3BmbnM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJCWlmICh2YWwgPT0gcGZuc1tpXSkgewomIzQzOwkJCQkJY291bnQmIzQzOyYjNDM7OwomIzQzOwkJCQkJYnJlYWs7CiYjNDM7CQkJCX0KJiM0MzsJCQl9CiYjNDM7CQkJY29udGludWU7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlzID0gc3Ryc3RyKGxpbmUsICYjMzQ7bW1fY29sbGFwc2VfY2FuZGlkYXRlOiYjMzQ7KTsKJiM0MzsJCWlmIChzKSB7CiYjNDM7CQkJaWYgKCFzdHJzdHIocywgJiMzNDtwYXNzPWluc3RhbGwmIzM0OykgfHwKJiM0MzsJCQkgICAgIXN0cnN0cihzLCAmIzM0O3Jlc3VsdD1zdWNjZWVkZWQmIzM0OykpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCW8gPSBzdHJzdHIocywgJiMzNDthZGRyPSYjMzQ7KTsKJiM0MzsJCQlpZiAoIW8gfHwgc3NjYW5mKG8sICYjMzQ7YWRkcj0weCVseCYjMzQ7LCAmYW1wO3ZhbCkgIT0gMSB8fAomIzQzOwkJCSAgICB2YWwgIT0gYWRkcikKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQkJbyA9IHN0cnN0cihzLCAmIzM0O29yZGVyPSYjMzQ7KTsKJiM0MzsJCQlpZiAoIW8gfHwgc3NjYW5mKG8sICYjMzQ7b3JkZXI9JXUmIzM0OywgJmFtcDtvcmQpICE9IDEgfHwKJiM0MzsJCQkgICAgb3JkICE9IG9yZGVyKQomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQljb3VudCYjNDM7JiM0Mzs7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsJcmV0dXJuIGNvdW50OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBvbmVfc3RlcChpbnQgaXRlcmF0aW9uKQomIzQzO3sKJiM0MzsJY29uc3Qgc2l6ZV90IHdpbmRvdyA9IGdldHBhZ2VzaXplKCkgJmx0OyZsdDsgVEFSR0VUX09SREVSOwomIzQzOwljb25zdCBpbnQgbnJfcGFnZXMgPSAxICZsdDsmbHQ7IFRBUkdFVF9PUkRFUjsKJiM0MzsJdW5zaWduZWQgbG9uZyBwZm5zWzEgJmx0OyZsdDsgVEFSR0VUX09SREVSXTsKJiM0MzsJYm9vbCBjb2xsYXBzZWQ7CiYjNDM7CWludCBhdHRyaWJ1dGVkOwomIzQzOwljaGFyICpwOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJcCA9IG1tYXAoQkFTRV9BRERSLCBocGFnZV9wbWRfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKJiM0MzsJCSBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTsKJiM0MzsJaWYgKHAgIT0gQkFTRV9BRERSKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7RmFpbGVkIHRvIGFsbG9jYXRlIFZNQSBhdCAlcFxuJiMzNDssCiYjNDM7CQkJCSAgIEJBU0VfQUREUik7CiYjNDM7CiYjNDM7CS8qIFByZXBhcmUgb25lIHdpbmRvdzsgcmVjb3JkIGl0cyBzb3VyY2UgUEZOcy4gKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJcFtpICogZ2V0cGFnZXNpemUoKV0gPSBpICYjNDM7IDE7CiYjNDM7CQlwZm5zW2ldID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHAgJiM0MzsgaSAqIGdldHBhZ2VzaXplKCkpOwomIzQzOwkJaWYgKHBmbnNbaV0gPT0gLTFVTCkKJiM0MzsJCQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtTb3VyY2UgcGFnZSBub3QgcHJlc2VudFxuJiMzNDspOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICh0cmFjaW5nX2V2ZW50c19zdGFydCgmIzM0O2h1Z2VfbWVtb3J5JiMzNDspKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7Q2Fubm90IGVuYWJsZSBodWdlX21lbW9yeSBldmVudHNcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJbWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7CiYjNDM7CS8qIFdhaXQgdXAgdG8gMTIwIHNlY29uZHMgZm9yIHRoZSBwYXNzIHRvIGNvbXBsZXRlLiAqLwomIzQzOwlpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKDEyMCkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtraHVnZXBhZ2VkIGRpZCBub3QgY29tcGxldGUgYSBmdWxsIHBhc3NcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJdHJhY2luZ19ldmVudHNfc3RvcCgmIzM0O2h1Z2VfbWVtb3J5JiMzNDspOwomIzQzOwomIzQzOwljb2xsYXBzZWQgPSBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHdpbmRvdywgVEFSR0VUX09SREVSLAomIzQzOwkJCQkJCSAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTsKJiM0MzsJYXR0cmlidXRlZCA9IGNvdW50X2F0dHJpYnV0ZWQocGZucywgbnJfcGFnZXMsICh1bnNpZ25lZCBsb25nKXAsCiYjNDM7CQkJCSAgICAgIFRBUkdFVF9PUkRFUik7CiYjNDM7CiYjNDM7CWtzZnRfdGVzdF9yZXN1bHQoY29sbGFwc2VkICZhbXA7JmFtcDsgYXR0cmlidXRlZCA9PSAxLAomIzQzOwkJCSAmIzM0O3N0ZXAgJWQ6IHdpbmRvdyBjb2xsYXBzZWQsICVkIGF0dHJpYnV0ZWQgcmVzdWx0KHMpXG4mIzM0OywKJiM0MzsJCQkgaXRlcmF0aW9uLCBhdHRyaWJ1dGVkKTsKJiM0MzsKJiM0MzsJbXVubWFwKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IG1haW4odm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlrc2Z0X3ByaW50X2hlYWRlcigpOwomIzQzOwomIzQzOwlpZiAoIXRocF9hdmFpbGFibGUoKSkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcbiYjMzQ7KTsKJiM0MzsJaWYgKCEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSAmYW1wOyAoMVVMICZsdDsmbHQ7IFRBUkdFVF9PUkRFUikpKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDtPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcbiYjMzQ7LAomIzQzOwkJCSAgICAgICBUQVJHRVRfT1JERVIpOwomIzQzOwomIzQzOwlocGFnZV9wbWRfc2l6ZSA9IHJlYWRfcG1kX3BhZ2VzaXplKCk7CiYjNDM7CWlmICghaHBhZ2VfcG1kX3NpemUpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcbiYjMzQ7KTsKJiM0MzsJcGFnZW1hcF9mZCA9IG9wZW4oJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXAmIzM0OywgT19SRE9OTFkpOwomIzQzOwlpZiAocGFnZW1hcF9mZCAmbHQ7IDApCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDtvcGVuKFwmIzM0Oy9wcm9jL3NlbGYvcGFnZW1hcFwmIzM0OykmIzM0Oyk7CiYjNDM7CWtwYWdlZmxhZ3NfZmQgPSBvcGVuKCYjMzQ7L3Byb2Mva3BhZ2VmbGFncyYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CWlmIChrcGFnZWZsYWdzX2ZkICZsdDsgMCkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7b3BlbihcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXCYjMzQ7KSByZXF1aXJlcyByb290XG4mIzM0Oyk7CiYjNDM7CWlmICh0cmFjaW5nX2V2ZW50c19zdGFydCgmIzM0O2h1Z2VfbWVtb3J5JiMzNDspKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDt0cmFjZWZzIHVuYXZhaWxhYmxlXG4mIzM0Oyk7CiYjNDM7CXRyYWNpbmdfZXZlbnRzX3N0b3AoJiMzNDtodWdlX21lbW9yeSYjMzQ7KTsKJiM0MzsKJiM0MzsJa3NmdF9zZXRfcGxhbihOUl9JVEVSQVRJT05TKTsKJiM0MzsKJiM0MzsJdGhwX3NhdmVfc2V0dGluZ3MoKTsKJiM0MzsJdGhwX3JlYWRfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CXNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7CiYjNDM7CXNldHRpbmdzLnRocF9kZWZyYWcgPSBUSFBfREVGUkFHX0FMV0FZUzsKJiM0MzsJc2V0dGluZ3Mua2h1Z2VwYWdlZC5kZWZyYWcgPSAxOwomIzQzOwlzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7CiYjNDM7CXNldHRpbmdzLmtodWdlcGFnZWQuYWxsb2Nfc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7CiYjNDM7CXNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IChocGFnZV9wbWRfc2l6ZSAvIGdldHBhZ2VzaXplKCkpIC0gMTsKJiM0MzsJLyogT25lIHdha2UgbXVzdCBjb21wbGV0ZSBvbmUgZnVsbCBwYXNzOyBzZWUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKS4gKi8KJiM0MzsJc2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID0gMVVMICZsdDsmbHQ7IDI0OwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykKJiM0MzsJCXNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSOwomIzQzOwlzZXR0aW5ncy5odWdlcGFnZXNbVEFSR0VUX09SREVSXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7CiYjNDM7CS8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZC4gKi8KJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBOUl9JVEVSQVRJT05TOyBpJiM0MzsmIzQzOykKJiM0MzsJCW9uZV9zdGVwKGkpOwomIzQzOwomIzQzOwl0aHBfcmVzdG9yZV9zZXR0aW5ncygpOwomIzQzOwomIzQzOwlrc2Z0X2ZpbmlzaGVkKCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaAppbmRleCA2ODdkMTE1ZTNiZDgwLi5mODI2Y2Y5NDBjM2Q0IDEwMDc1NQotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaApAQCAtNDAyLDEwICYjNDM7NDAyLDI3IEBAIENBVEVHT1JZPSYjMzQ7cGZubWFwJiMzNDsgcnVuX3Rlc3QgLi9wZm5tYXAKICMgQ09XIHRlc3RzCiBDQVRFR09SWT0mIzM0O2NvdyYjMzQ7IHJ1bl90ZXN0IC4vY293CiAKJiM0MztDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4vZm9saW9fb3JkZXJfY2hlY2sKJiM0MzsKJiM0MzsKJiM0MztDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9zeW5jX2NoZWNrCiYjNDM7CiYjNDM7Q0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIHN0ZXBwZWQKJiM0MzsKJiM0MztDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9yYWNlIC1kIDUgLW0gZnJlZQomIzQzOwomIzQzO0NBVEVHT1JZPSYjMzQ7dGhwJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3JhY2UgLWQgNSAtbSBtYWR2aXNlCiYjNDM7CiYjNDM7Q0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIHN0ZXBwZWQgLXoKJiM0MzsKJiM0MztDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9yYWNlIC1kIDUgLW0gc3RlcHBlZCAtcAomIzQzOwogQ0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQKIAogQ0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgMgogCiYjNDM7Q0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgLW8gMiBraHVnZXBhZ2VkOmFub24KJiM0MzsKIENBVEVHT1JZPSYjMzQ7dGhwJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIGFsbDpzaG1lbQogCiBDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyA0IGFsbDpzaG1lbQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMKaW5kZXggMzJiOTkxNDcyZjc0NC4uOWIzODg1YmQwMDFiZSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jCkBAIC00Miw2OCAmIzQzOzQyLDYgQEAgY29uc3QgY2hhciAqa3BhZ2VmbGFnc19wcm9jID0gJiMzNDsvcHJvYy9rcGFnZWZsYWdzJiMzNDs7CiBpbnQgcGFnZW1hcF9mZDsKIGludCBrcGFnZWZsYWdzX2ZkOwogCi1zdGF0aWMgYm9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsCi0JCWludCBrcGFnZWZsYWdzX2ZkKQotewotCWNvbnN0IHVpbnQ2NF90IGZvbGlvX2hlYWRfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX0hFQUQ7Ci0JY29uc3QgdWludDY0X3QgZm9saW9fdGFpbF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfVEFJTDsKLQljb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMICZsdDsmbHQ7IG9yZGVyOwotCXVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7Ci0JdWludDY0X3QgcGZuX2ZsYWdzOwotCXVuc2lnbmVkIGxvbmcgcGZuOwotCXVuc2lnbmVkIGxvbmcgaTsKLQotCXBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7Ci0KLQkvKiBub24gcHJlc2VudCBwYWdlICovCi0JaWYgKHBmbiA9PSAtMVVMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKLQkJZ290byBmYWlsOwotCi0JLyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi8KLQlpZiAoIW9yZGVyKSB7Ci0JCWlmIChwZm5fZmxhZ3MgJmFtcDsgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogbm9uIFRIUCBmb2xpbyAqLwotCWlmICghKHBmbl9mbGFncyAmYW1wOyBLUEZfVEhQKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcGZuX2hlYWQgPSBwZm4gJmFtcDsgfihucl9wYWdlcyAtIDEpOwotCi0JaWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKLQkJZ290byBmYWlsOwotCi0JLyogaGVhZCBQRk4gaGFzIG5vIGNvbXBvdW5kX2hlYWQgZmxhZyBzZXQgKi8KLQlpZiAoKHBmbl9mbGFncyAmYW1wOyBmb2xpb19oZWFkX2ZsYWdzKSAhPSBmb2xpb19oZWFkX2ZsYWdzKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkvKiBjaGVjayBhbGwgdGFpbCBQRk4gZmxhZ3MgKi8KLQlmb3IgKGkgPSAxOyBpICZsdDsgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7Ci0JCWlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IGksIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKLQkJCWdvdG8gZmFpbDsKLQkJaWYgKChwZm5fZmxhZ3MgJmFtcDsgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncykKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIGNoZWNrIHRoZSBQRk4gYWZ0ZXIgdGhpcyBmb2xpbywgYnV0IGlmIGl0cyBmbGFncyBjYW5ub3QgYmUgb2J0YWluZWQsCi0JICogYXNzdW1lIHRoaXMgZm9saW8gaGFzIHRoZSBleHBlY3RlZCBvcmRlcgotCSAqLwotCWlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IG5yX3BhZ2VzLCBrcGFnZWZsYWdzX2ZkLCAmYW1wO3Bmbl9mbGFncykpCi0JCXJldHVybiB0cnVlOwotCi0JLyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqLwotCXJldHVybiAocGZuX2ZsYWdzICZhbXA7IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7Ci1mYWlsOgotCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O0ZhaWxlZCB0byBnZXQgZm9saW8gaW5mb1xuJiMzNDspOwotCXJldHVybiBmYWxzZTsKLX0KLQogc3RhdGljIGludCB2YWRkcl9wYWdlZmxhZ3NfZ2V0KGNoYXIgKnZhZGRyLCBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQsCiAJCXVpbnQ2NF90ICpmbGFncykKIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYwppbmRleCBlZjFlYTExOTgxYTc0Li44ODZmYjNkZTljMDExIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jCkBAIC0zMDMsNiAmIzQzOzMwMywxNjMgQEAgaW50IHBhZ2VmbGFnc19nZXQodW5zaWduZWQgbG9uZyBwZm4sIGludCBrcGFnZWZsYWdzX2ZkLCB1aW50NjRfdCAqZmxhZ3MpCiAJcmV0dXJuIDA7CiB9CiAKJiM0Mztib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCwKJiM0MzsJCQlpbnQga3BhZ2VmbGFnc19mZCkKJiM0Mzt7CiYjNDM7CWNvbnN0IHVpbnQ2NF90IGZvbGlvX2hlYWRfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX0hFQUQ7CiYjNDM7CWNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7CiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgJmx0OyZsdDsgb3JkZXI7CiYjNDM7CXVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7CiYjNDM7CXVpbnQ2NF90IHBmbl9mbGFnczsKJiM0MzsJdW5zaWduZWQgbG9uZyBwZm47CiYjNDM7CXVuc2lnbmVkIGxvbmcgaTsKJiM0MzsKJiM0MzsJcGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTsKJiM0MzsKJiM0MzsJLyogbm9uIHByZXNlbnQgcGFnZSAqLwomIzQzOwlpZiAocGZuID09IC0xVUwpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CWlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgJmFtcDtwZm5fZmxhZ3MpKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwkvKiBjaGVjayBmb3Igb3JkZXItMCBwYWdlcyAqLwomIzQzOwlpZiAoIW9yZGVyKSB7CiYjNDM7CQlpZiAocGZuX2ZsYWdzICZhbXA7IChmb2xpb19oZWFkX2ZsYWdzIHwgZm9saW9fdGFpbF9mbGFncykpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwkJcmV0dXJuIHRydWU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogbm9uIFRIUCBmb2xpbyAqLwomIzQzOwlpZiAoIShwZm5fZmxhZ3MgJmFtcDsgS1BGX1RIUCkpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CXBmbl9oZWFkID0gcGZuICZhbXA7IH4obnJfcGFnZXMgLSAxKTsKJiM0MzsKJiM0MzsJaWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsKJiM0MzsJLyogaGVhZCBQRk4gaGFzIG5vIGNvbXBvdW5kX2hlYWQgZmxhZyBzZXQgKi8KJiM0MzsJaWYgKChwZm5fZmxhZ3MgJmFtcDsgZm9saW9faGVhZF9mbGFncykgIT0gZm9saW9faGVhZF9mbGFncykKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJLyogY2hlY2sgYWxsIHRhaWwgUEZOIGZsYWdzICovCiYjNDM7CWZvciAoaSA9IDE7IGkgJmx0OyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IGksIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKJiM0MzsJCQlnb3RvIGZhaWw7CiYjNDM7CQlpZiAoKHBmbl9mbGFncyAmYW1wOyBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBjaGVjayB0aGUgUEZOIGFmdGVyIHRoaXMgZm9saW8sIGJ1dCBpZiBpdHMgZmxhZ3MgY2Fubm90IGJlIG9idGFpbmVkLAomIzQzOwkgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyCiYjNDM7CSAqLwomIzQzOwlpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCAmIzQzOyBucl9wYWdlcywga3BhZ2VmbGFnc19mZCwgJmFtcDtwZm5fZmxhZ3MpKQomIzQzOwkJcmV0dXJuIHRydWU7CiYjNDM7CiYjNDM7CS8qIElmIHdlIGZpbmQgYW5vdGhlciB0YWlsIHBhZ2UsIHRoZW4gdGhlIGZvbGlvIGlzIGxhcmdlci4gKi8KJiM0MzsJcmV0dXJuIChwZm5fZmxhZ3MgJmFtcDsgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFnczsKJiM0MztmYWlsOgomIzQzOwlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cbiYjMzQ7KTsKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIENoZWNrIHdoZXRoZXIgdGhlIHJhbmdlIFtzdGFydCwgc3RhcnQgJiM0MzsgbGVuKSBpcyBiYWNrZWQgYnkgZm9saW9zIG9mCiYjNDM7ICogZXhhY3RseSBAb3JkZXIsIG1hcHBlZCBhdCB0aGVpciBuYXR1cmFsIGFsaWdubWVudC4KJiM0MzsgKgomIzQzOyAqIGlzX2JhY2tlZF9ieV9mb2xpbygpIGNsYXNzaWZpZXMgdGhlIGZvbGlvIGJhY2tpbmcgb25lIHBhZ2U7IGhlcmUgd2UKJiM0MzsgKiBhZGRpdGlvbmFsbHkgcmVxdWlyZSB0aGF0IGVhY2ggb3JkZXItYWxpZ25lZCB3aW5kb3cgb2YgdGhlIHJhbmdlIG1hcHMKJiM0MzsgKiBvbmUgc3VjaCBmb2xpbyBoZWFkLXRvLXRhaWw6IHRoZSBWQSByYW5nZSBtdXN0IGJlIG5hdHVyYWxseSBhbGlnbmVkLAomIzQzOyAqIGVhY2ggd2luZG93JiMzOTtzIFBGTiBydW4gbXVzdCBiZSBjb250aWd1b3VzLCBhbmQgdGhlIGZpcnN0IFBGTiBtdXN0IGJlCiYjNDM7ICogdGhlIChuYXR1cmFsbHkgYWxpZ25lZCkgZm9saW8gaGVhZC4KJiM0MzsgKgomIzQzOyAqIFRoaXMgaXMgdGhlIGNoZWNrICYjMzQ7ZGlkIHRoaXMgcmFuZ2UgY29sbGFwc2UgaW50byBvcmRlci1Ab3JkZXIgZm9saW9zJiMzNDs6CiYjNDM7ICogYSB3aW5kb3cgYXNzZW1ibGVkIGZyb20gcGFydHMgb2Ygc2V2ZXJhbCBmb2xpb3MsIG9yIG1hcHBpbmcgYSBmb2xpbwomIzQzOyAqIHNoaWZ0ZWQgZnJvbSBpdHMgbmF0dXJhbCBwb3NpdGlvbiwgZmFpbHMuCiYjNDM7ICovCiYjNDM7Ym9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsCiYjNDM7CQkJCSAgICAgaW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkKQomIzQzO3sKJiM0MzsJY29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCAmbHQ7Jmx0OyBvcmRlcjsKJiM0MzsJY29uc3Qgc2l6ZV90IHdpbmRvdyA9IG5yX3BhZ2VzICogcHNpemUoKTsKJiM0MzsJY2hhciAqdmFkZHI7CiYjNDM7CiYjNDM7CWlmICgodWludHB0cl90KXN0YXJ0ICUgd2luZG93IHx8IGxlbiAlIHdpbmRvdykKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJZm9yICh2YWRkciA9IHN0YXJ0OyB2YWRkciAmbHQ7IHN0YXJ0ICYjNDM7IGxlbjsgdmFkZHIgJiM0Mzs9IHdpbmRvdykgewomIzQzOwkJdW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpOwomIzQzOwkJdW5zaWduZWQgbG9uZyBpOwomIzQzOwomIzQzOwkJLyogTm90IHByZXNlbnQsIG9yIG5vdCBtYXBwaW5nIHRoZSBmb2xpbyBoZWFkLiAqLwomIzQzOwkJaWYgKHBmbiA9PSAtMVVMIHx8IHBmbiAlIG5yX3BhZ2VzKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJCWZvciAoaSA9IDE7IGkgJmx0OyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlpZiAocGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyICYjNDM7IGkgKiBwc2l6ZSgpKSAhPQomIzQzOwkJCSAgICBwZm4gJiM0MzsgaSkKJiM0MzsJCQkJcmV0dXJuIGZhbHNlOwomIzQzOwkJfQomIzQzOwomIzQzOwkJaWYgKCFpc19iYWNrZWRfYnlfZm9saW8odmFkZHIsIG9yZGVyLCBwYWdlbWFwX2ZkLAomIzQzOwkJCQkJa3BhZ2VmbGFnc19mZCkpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MzsjZGVmaW5lIFRSQUNFRlNfUk9PVCAmIzM0Oy9zeXMva2VybmVsL3RyYWNpbmcmIzM0OwomIzQzOwomIzQzO3N0YXRpYyBpbnQgdHJhY2luZ19ldmVudHNfd3JpdGUoY29uc3QgY2hhciAqc3Vic3lzLCBjb25zdCBjaGFyICp2YWwpCiYjNDM7ewomIzQzOwljaGFyIHBhdGhbMjU2XTsKJiM0MzsJaW50IGZkOwomIzQzOwomIzQzOwlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFRSQUNFRlNfUk9PVCAmIzM0Oy9ldmVudHMvJXMvZW5hYmxlJiMzNDssCiYjNDM7CQkgc3Vic3lzKTsKJiM0MzsJZmQgPSBvcGVuKHBhdGgsIE9fV1JPTkxZKTsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJaWYgKHdyaXRlKGZkLCB2YWwsIDEpICE9IDEpIHsKJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEVuYWJsZSBvbmUgZnRyYWNlIGV2ZW50IHN1YnN5c3RlbSAoZS5nLiAmIzM0O2h1Z2VfbWVtb3J5JiMzNDspIGFuZCBjbGVhciB0aGUKJiM0MzsgKiB0cmFjZSBidWZmZXIuIFJldHVybnMgLTEgaWYgdHJhY2VmcyBpcyB1bmF2YWlsYWJsZTsgcGFyc2UgdGhlIHJlc3VsdHMKJiM0MzsgKiB2aWEgdHJhY2luZ19vcGVuX3RyYWNlKCkgYWZ0ZXIgdHJhY2luZ19ldmVudHNfc3RvcCgpLgomIzQzOyAqLwomIzQzO2ludCB0cmFjaW5nX2V2ZW50c19zdGFydChjb25zdCBjaGFyICpzdWJzeXMpCiYjNDM7ewomIzQzOwlpbnQgZmQ7CiYjNDM7CiYjNDM7CWlmICh0cmFjaW5nX2V2ZW50c193cml0ZShzdWJzeXMsICYjMzQ7MSYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJZmQgPSBvcGVuKFRSQUNFRlNfUk9PVCAmIzM0Oy90cmFjZSYjMzQ7LCBPX1dST05MWSB8IE9fVFJVTkMpOwomIzQzOwlpZiAoZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztpbnQgdHJhY2luZ19ldmVudHNfc3RvcChjb25zdCBjaGFyICpzdWJzeXMpCiYjNDM7ewomIzQzOwlyZXR1cm4gdHJhY2luZ19ldmVudHNfd3JpdGUoc3Vic3lzLCAmIzM0OzAmIzM0Oyk7CiYjNDM7fQomIzQzOwomIzQzO0ZJTEUgKnRyYWNpbmdfb3Blbl90cmFjZSh2b2lkKQomIzQzO3sKJiM0MzsJcmV0dXJuIGZvcGVuKFRSQUNFRlNfUk9PVCAmIzM0Oy90cmFjZSYjMzQ7LCAmIzM0O3ImIzM0Oyk7CiYjNDM7fQomIzQzOwogLyogSWYgYGlvY3RscyYjMzk7IG5vbi1OVUxMLCB0aGUgYWxsb3dlZCBpb2N0bHMgd2lsbCBiZSByZXR1cm5lZCBpbnRvIHRoZSB2YXIgKi8KIGludCB1ZmZkX3JlZ2lzdGVyX3dpdGhfaW9jdGxzKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sCiAJCQkgICAgICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IsIHVpbnQ2NF90ICppb2N0bHMpCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmgKaW5kZXggNzc5OTE1NGI2N2VlZC4uNGZmNWExYzVhYjhlZCAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaApAQCAtOTUsNiAmIzQzOzk1LDEwIEBAIGJvb2wgY2hlY2tfaHVnZV9maWxlKHZvaWQgKmFkZHIsIGludCBucl9ocGFnZXMsIHVpbnQ2NF90IGhwYWdlX3NpemUpOwogYm9vbCBjaGVja19odWdlX3NobWVtKHZvaWQgKmFkZHIsIGludCBucl9ocGFnZXMsIHVpbnQ2NF90IGhwYWdlX3NpemUpOwogaW50NjRfdCBhbGxvY2F0ZV90cmFuc2h1Z2Uodm9pZCAqcHRyLCBpbnQgcGFnZW1hcF9mZCk7CiBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncyk7CiYjNDM7Ym9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsCiYjNDM7CQkJaW50IGtwYWdlZmxhZ3NfZmQpOwomIzQzO2Jvb2wgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLAomIzQzOwkJCQkgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCk7CiAKIGludCB1ZmZkX3JlZ2lzdGVyKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sCiAJCSAgYm9vbCBtaXNzLCBib29sIHdwLCBib29sIG1pbm9yKTsKQEAgLTExMSw2ICYjNDM7MTE1LDkgQEAgaW50IGNsb3NlX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXApOwogaW50IHdyaXRlX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyB2YWwpOwogaW50IHJlYWRfc3lzZnMoY29uc3QgY2hhciAqZmlsZV9wYXRoLCB1bnNpZ25lZCBsb25nICp2YWwpOwogYm9vbCBzb2Z0ZGlydHlfc3VwcG9ydGVkKHZvaWQpOwomIzQzO2ludCB0cmFjaW5nX2V2ZW50c19zdGFydChjb25zdCBjaGFyICpzdWJzeXMpOwomIzQzO2ludCB0cmFjaW5nX2V2ZW50c19zdG9wKGNvbnN0IGNoYXIgKnN1YnN5cyk7CiYjNDM7RklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpOwogCiBzdGF0aWMgaW5saW5lIGludCBvcGVuX3NlbGZfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcF9vdXQpCiB7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzAzIDAxOjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI0ODM1CgkJCQkJCQlvdXRwdXQ6IDY0CgkJCQkJCQl0aG91Z2h0czogNjk5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKldvcnRoRnV6emluZz1mYWxzZTogQSBRdWljayBSZXZpZXcqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggc2VyaWVzLCBhbmQgaXQmIzM5O3MgYWxsIGFib3V0IG1vZGlmeWluZyBzdHVmZiB3aXRoaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2AuICBSaWdodCBvZmYgdGhlIGJhdCwgdGhhdCBzY3JlYW1zICpub3Qga2VybmVsIGNvZGUqIHRvIG1lLCBidXQgSSBuZWVkIHRvIGJlIHRob3JvdWdoLiBUaGVzZSBhcmUgdXNlcnNwYWNlIHRlc3RzLiBJIGFsd2F5cyB0cmlwbGUtY2hlY2suIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHByZXR0eSBjbGVhcjogbW9kaWZpY2F0aW9ucyB0byBzZWxmdGVzdHMgYWxvbmUgc2hvdWxkbiYjMzk7dCB0cmlnZ2VyIGZ1enppbmcuIFRoZSBxdWVzdGlvbiBpczogZG8gdGhlIGluc3RydWN0aW9ucyBjYXB0dXJlIHRoaXM/CgpMZXQgbWUgcXVpY2tseSBzY2FuIHRoZSBkaWZmIGFnYWluLiAgTm9wZSwganVzdCBkb3VibGUtY2hlY2tpbmcsIGl0JiMzOTtzIGp1c3QgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2AuIFRoZSBzcGVjaWZpYyBmaWxlcyBhcmU6IGAuZ2l0aWdub3JlYCwgYE1ha2VmaWxlYCwgYGZvbGlvX29yZGVyX2NoZWNrLmNgLCBgaHVnZXBhZ2Vfc2V0dGluZ3MuY2AgYW5kIGAuaGAsIGBraHVnZXBhZ2VkLmNgIGFuZCBgX3JhY2UuY2AgYW5kIGBfc3luY19jaGVjay5jYCwgYHJ1bl92bXRlc3RzLnNoYCwgYHNwbGl0X2h1Z2VfcGFnZV90ZXN0LmNgLCBgdm1fdXRpbC5jYCBhbmQgYC5oYC4gQWxsIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9gIGRpcmVjdG9yeS4KCk9rYXksIHNvIHRoZXJlJiMzOTtzIG5vIGtlcm5lbCBjb2RlIGJlaW5nIHRvdWNoZWQuICBObyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCwgcGVyaW9kLgoKVGhlIHByb21wdCBpcyBjcnlzdGFsIGNsZWFyOiBJJiMzOTttIHJldmlld2luZyBwYXRjaGVzIHRvIHNlZSBpZiB0aGV5IGZ1bmN0aW9uYWxseSBjaGFuZ2UgdGhlIGtlcm5lbCBpbiBhIHdheSB0aGF0IHdhcnJhbnRzIGZ1enppbmcuIFNpbmNlIHRoaXMgaXMgKm9ubHkqIG1vZGlmeWluZyB1c2Vyc3BhY2Ugc2VsZnRlc3RzLCB0aGUgYW5zd2VyIGlzIGEgcmVzb3VuZGluZyAqbm8qLiAgSSYjMzk7bSByZXR1cm5pbmcgYFdvcnRoRnV6emluZz1mYWxzZWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDMgMDE6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXJzcGFjZSBzZWxmdGVzdHMgKHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLyopIGFuZCBkb2VzIG5vdCBtYWtlIGFueSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCBpdHNlbGYuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXJzcGFjZSBzZWxmdGVzdHMgKHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLyopIGFuZCBkb2VzIG5vdCBtYWtlIGFueSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCBpdHNlbGYuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMDNUMDE6MDM6MTQuMjIwMTg0MDg2WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODk5MjIzMDgzMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2Vyc3BhY2Ugc2VsZnRlc3RzICh0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8qKSBhbmQgZG9lcyBub3QgbWFrZSBhbnkgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgaXRzZWxmLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDNUMDE6MDM6MTQuMjIwMTkwNjY2WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MjIxOTIyMjIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAzZmE0MDMyNGM5MTFjZGQ5ZjQzNTI2NmQzZWNlZWE2YjUyZWY3MWM2XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gQXVnIDMgMDE6MDM6MTMgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLmdpdGlnbm9yZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy5naXRpZ25vcmVcXG5pbmRleCA5Y2NkOWUxNDQ3ZTY2Li42MTYwNDNhMGZjZDIyIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy5naXRpZ25vcmVcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8uZ2l0aWdub3JlXFxuQEAgLTY2LDMgKzY2LDYgQEAgbWVyZ2VcXG4gcHJjdGxfdGhwX2Rpc2FibGVcXG4gcm1hcFxcbiBmb2xpb19zcGxpdF9yYWNlX3Rlc3RcXG4rZm9saW9fb3JkZXJfY2hlY2tcXG4ra2h1Z2VwYWdlZF9zeW5jX2NoZWNrXFxuK2todWdlcGFnZWRfcmFjZVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXFxuaW5kZXggMjVkMTBjZWQzYjNiOS4uMDI2ZDRiNjE0MTRkNCAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXFxuQEAgLTEwNCw2ICsxMDQsOSBAQCBURVNUX0dFTl9GSUxFUyArPSBndWFyZC1yZWdpb25zXFxuIFRFU1RfR0VOX0ZJTEVTICs9IG1lcmdlXFxuIFRFU1RfR0VOX0ZJTEVTICs9IHJtYXBcXG4gVEVTVF9HRU5fRklMRVMgKz0gZm9saW9fc3BsaXRfcmFjZV90ZXN0XFxuK1RFU1RfR0VOX0ZJTEVTICs9IGZvbGlvX29yZGVyX2NoZWNrXFxuK1RFU1RfR0VOX0ZJTEVTICs9IGtodWdlcGFnZWRfc3luY19jaGVja1xcbitURVNUX0dFTl9GSUxFUyArPSBraHVnZXBhZ2VkX3JhY2VcXG4gXFxuIGlmbmVxICgkKEFSQ0gpLGFybTY0KVxcbiBURVNUX0dFTl9GSUxFUyArPSBzb2Z0LWRpcnR5XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi5mNzBkNzY2ZmYzZWIzXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmNcXG5AQCAtMCwwICsxLDEzOCBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBTZWxmLWNoZWNrIGZvciB0aGUgdm1fdXRpbCBmb2xpby1vcmRlciBkZXRlY3Rpb24gaGVscGVycyxcXG4rICogaXNfYmFja2VkX2J5X2ZvbGlvKCkgYW5kIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMoKS5cXG4rICpcXG4rICogRm9yIGV2ZXJ5IGFub24gVEhQIG9yZGVyIHRoZSBrZXJuZWwgc3VwcG9ydHMsIGZhdWx0IG1lbW9yeSBpbiB3aXRoIG9ubHlcXG4rICogdGhhdCBvcmRlciBlbmFibGVkIGFuZCB2ZXJpZnkgdGhlIGhlbHBlcnMgcmVwb3J0IGV4YWN0bHkgdGhhdCBvcmRlcjpcXG4rICogbm90IGEgbmVpZ2hib3VyaW5nIG9yZGVyLCBhbmQgcGxhaW4gNEsgbWVtb3J5IGFzIG9yZGVyIDAuIFRoZSBoZWxwZXJzXFxuKyAqIGFyZSB3aGF0IHRoZSBraHVnZXBhZ2VkIG1USFAgdGVzdHMgdXNlIHRvIGRldGVjdCBjb2xsYXBzZSByZXN1bHRzLCBzb1xcbisgKiB0aGV5IG11c3QgYWdyZWUgd2l0aCB0aGUga2VybmVsJ3Mgb3duIGlkZWEgb2YgdGhlIGJhY2tpbmcgYmVmb3JlIGFueVxcbisgKiBjb2xsYXBzZSB0ZXN0IHJlbGllcyBvbiB0aGVtLlxcbisgKi9cXG4rI2RlZmluZSBfR05VX1NPVVJDRVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9tbWFuLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcXCJrc2VsZnRlc3QuaFxcXCJcXG4rI2luY2x1ZGUgXFxcInZtX3V0aWwuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImh1Z2VwYWdlX3NldHRpbmdzLmhcXFwiXFxuK1xcbitzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7XFxuK3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDtcXG4rXFxuKy8qIG1tYXAgYW4gYW5vbiBWTUEgb2YgZXhhY3RseSBAc2l6ZSBieXRlcyBhdCBhIEBzaXplLWFsaWduZWQgYWRkcmVzcy4gKi9cXG4rc3RhdGljIGNoYXIgKmFsbG9jX2FsaWduZWQoc2l6ZV90IHNpemUpXFxuK3tcXG4rXFx0c2l6ZV90IGxlbiA9IHNpemUgKiAyO1xcbitcXHR1aW50cHRyX3QgYWxpZ25lZDtcXG4rXFx0Y2hhciAqcDtcXG4rXFxuK1xcdHAgPSBtbWFwKE5VTEwsIGxlbiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcXG4rXFx0XFx0IE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSwgLTEsIDApO1xcbitcXHRpZiAocCA9PSBNQVBfRkFJTEVEKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1tYXAoKVxcXCIpO1xcbitcXG4rXFx0YWxpZ25lZCA9ICgodWludHB0cl90KXAgKyBzaXplIC0gMSkgXFx1MDAyNiB+KHNpemUgLSAxKTtcXG4rXFx0aWYgKGFsaWduZWQgIT0gKHVpbnRwdHJfdClwKVxcbitcXHRcXHRtdW5tYXAocCwgYWxpZ25lZCAtICh1aW50cHRyX3QpcCk7XFxuK1xcdGlmIChhbGlnbmVkICsgc2l6ZSAhPSAodWludHB0cl90KXAgKyBsZW4pXFxuK1xcdFxcdG11bm1hcCgoY2hhciAqKWFsaWduZWQgKyBzaXplLFxcbitcXHRcXHQgICAgICAgKHVpbnRwdHJfdClwICsgbGVuIC0gYWxpZ25lZCAtIHNpemUpO1xcbitcXG4rXFx0cmV0dXJuIChjaGFyICopYWxpZ25lZDtcXG4rfVxcbitcXG4rLypcXG4rICogRW5hYmxlIG9ubHkgQG9yZGVyIChvcmRlciAwOiBub3RoaW5nKSwgZmF1bHQgb25lIGFsaWduZWQgd2luZG93IGluIGFuZFxcbisgKiBjaGVjayB0aGUgaGVscGVycyBzZWUgZXhhY3RseSBAb3JkZXIuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCBjaGVja19vcmRlcihpbnQgb3JkZXIpXFxuK3tcXG4rXFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xcbitcXHRzaXplX3Qgc2l6ZSA9IHBzaXplKCkgXFx1MDAzY1xcdTAwM2Mgb3JkZXI7XFxuK1xcdGJvb2wgb2sgPSB0cnVlO1xcbitcXHRjaGFyICpwO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBOUl9PUkRFUlM7IGkrKylcXG4rXFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XFxuK1xcdGlmIChvcmRlcilcXG4rXFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcXG4rXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFxuK1xcdHAgPSBhbGxvY19hbGlnbmVkKHNpemUpO1xcbitcXHQqcCA9IDE7XFxuK1xcbitcXHRpZiAoIWlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgb3JkZXIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIm9yZGVyICVkIG5vdCBkZXRlY3RlZCBhZnRlciBmYXVsdFxcXFxuXFxcIiwgb3JkZXIpO1xcbitcXHRcXHRvayA9IGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHQvKiBBIGxvd2VyIG9yZGVyIG11c3QgYmUgcmVqZWN0ZWQ6IHRoZSBmb2xpbyBpcyBsYXJnZXIuICovXFxuK1xcdGlmIChvcmRlciBcXHUwMDI2XFx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIG9yZGVyIC0gMSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBwYWdlbWFwX2ZkLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgIGtwYWdlZmxhZ3NfZmQpKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICAgICAgb3JkZXIsIG9yZGVyIC0gMSk7XFxuK1xcdFxcdG9rID0gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIE9yZGVyIDAgcGFnZXMgbXVzdCBub3QgbG9vayBsaWtlIGFueSBsYXJnZSBmb2xpbywgYW5kIHZpY2UgdmVyc2EuICovXFxuK1xcdGlmIChvcmRlciBcXHUwMDI2XFx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIDAsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgcGFnZW1hcF9mZCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBrcGFnZWZsYWdzX2ZkKSkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwib3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAwXFxcXG5cXFwiLCBvcmRlcik7XFxuK1xcdFxcdG9rID0gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdG11bm1hcChwLCBzaXplKTtcXG4rXFx0dGhwX3BvcF9zZXR0aW5ncygpO1xcbitcXG4rXFx0a3NmdF90ZXN0X3Jlc3VsdChvaywgXFxcIm9yZGVyICVkIGNsYXNzaWZpZWRcXFxcblxcXCIsIG9yZGVyKTtcXG4rfVxcbitcXG4raW50IG1haW4odm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xcbitcXHR1bnNpZ25lZCBsb25nIG9yZGVycztcXG4rXFx0aW50IG9yZGVyO1xcbitcXG4rXFx0a3NmdF9wcmludF9oZWFkZXIoKTtcXG4rXFxuK1xcdGlmICghdGhwX2F2YWlsYWJsZSgpKVxcbitcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXFxcblxcXCIpO1xcbitcXG4rXFx0cGFnZW1hcF9mZCA9IG9wZW4oXFxcIi9wcm9jL3NlbGYvcGFnZW1hcFxcXCIsIE9fUkRPTkxZKTtcXG4rXFx0aWYgKHBhZ2VtYXBfZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm9wZW4oXFxcXFxcXCIvcHJvYy9zZWxmL3BhZ2VtYXBcXFxcXFxcIilcXFwiKTtcXG4rXFx0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXFxcIi9wcm9jL2twYWdlZmxhZ3NcXFwiLCBPX1JET05MWSk7XFxuK1xcdGlmIChrcGFnZWZsYWdzX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIm9wZW4oXFxcXFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcXFxcXCIpIHJlcXVpcmVzIHJvb3RcXFxcblxcXCIpO1xcbitcXG4rXFx0b3JkZXJzID0gdGhwX3N1cHBvcnRlZF9vcmRlcnMoKTtcXG4rXFx0aWYgKCFvcmRlcnMpXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJObyBzdXBwb3J0ZWQgVEhQIG9yZGVyc1xcXFxuXFxcIik7XFxuK1xcbitcXHRrc2Z0X3NldF9wbGFuKF9fYnVpbHRpbl9wb3Bjb3VudGwob3JkZXJzKSArIDEpO1xcbitcXG4rXFx0dGhwX3NhdmVfc2V0dGluZ3MoKTtcXG4rXFx0dGhwX3JlYWRfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFx0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqL1xcbitcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXG4rXFx0Y2hlY2tfb3JkZXIoMCk7XFxuK1xcdGZvciAob3JkZXIgPSAxOyBvcmRlciBcXHUwMDNjIE5SX09SREVSUzsgb3JkZXIrKykge1xcbitcXHRcXHRpZiAoIShvcmRlcnMgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIG9yZGVyKSkpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRjaGVja19vcmRlcihvcmRlcik7XFxuK1xcdH1cXG4rXFxuK1xcdHRocF9yZXN0b3JlX3NldHRpbmdzKCk7XFxuK1xcbitcXHRrc2Z0X2ZpbmlzaGVkKCk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcXG5pbmRleCBkNzkxN2RjZTNhYmFjLi5hMjZhMGNmZmE5YzViIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jXFxuQEAgLTE4Myw2ICsxODMsMTcgQEAgdm9pZCB0aHBfcmVhZF9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcXG4gXFx0fVxcbiB9XFxuIFxcbisvKlxcbisgKiBXcml0ZSBvbmx5IG9uIGNoYW5nZTogYW55IHN0b3JlIHRvIGEga2h1Z2VwYWdlZCBzeXNmcyBrbm9iIHdha2VzIHRoZVxcbisgKiBkYWVtb24sIGFuZCBzZXR0aW5ncyBwdXNoZXMvcG9wcyBtdXN0IG5vdCBzdGFydCBzY2FuIHBhc3NlcyBub2JvZHlcXG4rICogYXNrZWQgZm9yIOKAlCBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIGlzIHRoZSBvbmx5IHNhbmN0aW9uZWQgd2FrZS5cXG4rICovXFxuK3N0YXRpYyB2b2lkIHRocF91cGRhdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKVxcbit7XFxuK1xcdGlmICh0aHBfcmVhZF9udW0obmFtZSkgIT0gbnVtKVxcbitcXHRcXHR0aHBfd3JpdGVfbnVtKG5hbWUsIG51bSk7XFxuK31cXG4rXFxuIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxcbiB7XFxuIFxcdHN0cnVjdCBraHVnZXBhZ2VkX3NldHRpbmdzICpraHVnZXBhZ2VkID0gXFx1MDAyNnNldHRpbmdzLVxcdTAwM2VraHVnZXBhZ2VkO1xcbkBAIC0xOTgsMTUgKzIwOSwxNSBAQCB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcXG4gXFx0XFx0XFx0c2htZW1fZW5hYmxlZF9zdHJpbmdzW3NldHRpbmdzLVxcdTAwM2VzaG1lbV9lbmFibGVkXSk7XFxuIFxcdHRocF93cml0ZV9udW0oXFxcInVzZV96ZXJvX3BhZ2VcXFwiLCBzZXR0aW5ncy1cXHUwMDNldXNlX3plcm9fcGFnZSk7XFxuIFxcbi1cXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL2RlZnJhZ1xcXCIsIGtodWdlcGFnZWQtXFx1MDAzZWRlZnJhZyk7XFxuLVxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXFxcIixcXG4tXFx0XFx0XFx0a2h1Z2VwYWdlZC1cXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcXG4tXFx0dGhwX3dyaXRlX251bShcXFwia2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1xcXCIsXFxuLVxcdFxcdFxcdGtodWdlcGFnZWQtXFx1MDAzZXNjYW5fc2xlZXBfbWlsbGlzZWNzKTtcXG4tXFx0dGhwX3dyaXRlX251bShcXFwia2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXFxcIiwga2h1Z2VwYWdlZC1cXHUwMDNlbWF4X3B0ZXNfbm9uZSk7XFxuLVxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvbWF4X3B0ZXNfc3dhcFxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZW1heF9wdGVzX3N3YXApO1xcbi1cXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL21heF9wdGVzX3NoYXJlZFxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZW1heF9wdGVzX3NoYXJlZCk7XFxuLVxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvcGFnZXNfdG9fc2NhblxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZXBhZ2VzX3RvX3NjYW4pO1xcbitcXHR0aHBfdXBkYXRlX251bShcXFwia2h1Z2VwYWdlZC9kZWZyYWdcXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VkZWZyYWcpO1xcbitcXHR0aHBfdXBkYXRlX251bShcXFwia2h1Z2VwYWdlZC9hbGxvY19zbGVlcF9taWxsaXNlY3NcXFwiLFxcbitcXHRcXHQgICAgICAga2h1Z2VwYWdlZC1cXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcXFwiLFxcbitcXHRcXHQgICAgICAga2h1Z2VwYWdlZC1cXHUwMDNlc2Nhbl9zbGVlcF9taWxsaXNlY3MpO1xcbitcXHR0aHBfdXBkYXRlX251bShcXFwia2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXFxcIiwga2h1Z2VwYWdlZC1cXHUwMDNlbWF4X3B0ZXNfbm9uZSk7XFxuK1xcdHRocF91cGRhdGVfbnVtKFxcXCJraHVnZXBhZ2VkL21heF9wdGVzX3N3YXBcXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VtYXhfcHRlc19zd2FwKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkXFxcIiwga2h1Z2VwYWdlZC1cXHUwMDNlbWF4X3B0ZXNfc2hhcmVkKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvcGFnZXNfdG9fc2NhblxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZXBhZ2VzX3RvX3NjYW4pO1xcbiBcXG4gXFx0aWYgKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGhbMF0pXFxuIFxcdFxcdHdyaXRlX251bShkZXZfcXVldWVfcmVhZF9haGVhZF9wYXRoLCBzZXR0aW5ncy1cXHUwMDNlcmVhZF9haGVhZF9rYik7XFxuQEAgLTIzMCw2ICsyNDEsNDMgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXFxuIFxcdH1cXG4gfVxcbiBcXG4rLypcXG4rICogQ29tcGxldGlvbiBiYXJyaWVyIGZvciBraHVnZXBhZ2VkOiB3YWl0IHVudGlsIGEgZnVsbCBzY2FuIHBhc3MgdGhhdFxcbisgKiBzdGFydGVkIGFmdGVyIHRoaXMgY2FsbCBoYXMgZmluaXNoZWQuIGZ1bGxfc2NhbnMgbXVzdCBhZHZhbmNlIGJ5IHR3bztcXG4rICogYSArMSBzdGVwIG1heSBjb21wbGV0ZSBhIHBhc3MgdGhhdCBleGFtaW5lZCB0aGlzIG1tIGJlZm9yZSB0aGVcXG4rICogY2FsbGVyJ3Mgc2V0dXAgd2FzIGluIHBsYWNlLlxcbisgKlxcbisgKiBBbnkgc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgc28gdGhlIGJhcnJpZXJcXG4rICogd29ya3MgcmVnYXJkbGVzcyBvZiB0aGUgY29uZmlndXJlZCBzY2FuIGNhZGVuY2UuIEl0IHdha2VzIGV4YWN0bHlcXG4rICogb25jZSBwZXIgbWlzc2luZyBwYXNzIOKAlCBvdmVyLXdha2luZyB3b3VsZCBxdWV1ZSBhIHN0cmFnZ2xlciBwYXNzXFxuKyAqIGJlaGluZCB0aGUgYmFycmllciwgcGVydHVyYmluZyB3aGF0ZXZlciB0aGUgY2FsbGVyIHNldHMgdXAgbmV4dC5cXG4rICogT25lIHdha2UgY29tcGxldGVzIG9uZSBmdWxsIHBhc3Mgb25seSBpZiB0aGUgd2hvbGUgbW0gbGlzdCBmaXRzIGluXFxuKyAqIG9uZSBzY2FuIGJhdGNoLCBzbyBjYWxsZXJzIG11c3QgcGFpciB0aGlzIHdpdGggYSBsYXJnZVxcbisgKiBwYWdlc190b19zY2FuLlxcbisgKi9cXG4rYm9vbCBraHVnZXBhZ2VkX2Z1bGxfcGFzcyh1bnNpZ25lZCBpbnQgdGltZW91dF9zKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZGVhZGxpbmVfbXMgPSB0aW1lb3V0X3MgKiAxMDAwVUw7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc2xlZXBfbXMgPVxcbitcXHRcXHR0aHBfcmVhZF9udW0oXFxcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcXFwiKTtcXG4rXFx0dW5zaWduZWQgbG9uZyBlbGFwc2VkX21zID0gMDtcXG4rXFx0aW50IHBhc3M7XFxuK1xcbitcXHRmb3IgKHBhc3MgPSAwOyBwYXNzIFxcdTAwM2MgMjsgcGFzcysrKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgdGFyZ2V0ID1cXG4rXFx0XFx0XFx0dGhwX3JlYWRfbnVtKFxcXCJraHVnZXBhZ2VkL2Z1bGxfc2NhbnNcXFwiKSArIDE7XFxuK1xcbitcXHRcXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXFxcIiwgc2xlZXBfbXMpO1xcbitcXHRcXHR3aGlsZSAodGhwX3JlYWRfbnVtKFxcXCJraHVnZXBhZ2VkL2Z1bGxfc2NhbnNcXFwiKSBcXHUwMDNjIHRhcmdldCkge1xcbitcXHRcXHRcXHRpZiAoZWxhcHNlZF9tcyBcXHUwMDNlPSBkZWFkbGluZV9tcylcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHRcXHR1c2xlZXAoMTAgKiAxMDAwKTtcXG4rXFx0XFx0XFx0ZWxhcHNlZF9tcyArPSAxMDtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbiBzdHJ1Y3QgdGhwX3NldHRpbmdzICp0aHBfY3VycmVudF9zZXR0aW5ncyh2b2lkKVxcbiB7XFxuIFxcdGlmICghc2V0dGluZ3NfaW5kZXgpIHtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcXG5pbmRleCA3MjZjNzNjNDNjMDViLi44ZGU0NDZhZmZlZWNkIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXFxuQEAgLTgzLDYgKzgzLDggQEAgc3RhdGljIGlubGluZSB2b2lkIHRocF9zYXZlX3NldHRpbmdzKHZvaWQpXFxuIFxcdGh1Z2VwYWdlX3NhdmVfc2V0dGluZ3MoLyogdGhwID0gKi8gdHJ1ZSwgLyogaHVnZXRsYiA9ICovIGZhbHNlKTtcXG4gfVxcbiBcXG4rYm9vbCBraHVnZXBhZ2VkX2Z1bGxfcGFzcyh1bnNpZ25lZCBpbnQgdGltZW91dF9zKTtcXG4rXFxuIHZvaWQgdGhwX3NldF9yZWFkX2FoZWFkX3BhdGgoY2hhciAqcGF0aCk7XFxuIHVuc2lnbmVkIGxvbmcgdGhwX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7XFxuIHVuc2lnbmVkIGxvbmcgdGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xcbmluZGV4IDEwZThkZWRjYjA4N2QuLmM1YTNjMzkyMjU4MTkgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXFxuQEAgLTI2LDkgKzI2LDEzIEBAXFxuIFxcbiAjZGVmaW5lIEJBU0VfQUREUiAoKHZvaWQgKikoMVVMIFxcdTAwM2NcXHUwMDNjIDMwKSlcXG4gc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XFxuK3N0YXRpYyBpbnQgaHBhZ2VfcG1kX29yZGVyO1xcbiBzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7XFxuIHN0YXRpYyBpbnQgaHBhZ2VfcG1kX25yO1xcbiBzdGF0aWMgaW50IGFub25fb3JkZXI7XFxuK3N0YXRpYyBpbnQgYW5vbl90YXJnZXRfb3JkZXI7XFxuK3N0YXRpYyBpbnQgcGFnZW1hcF9mZCA9IC0xO1xcbitzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQgPSAtMTtcXG4gXFxuICNkZWZpbmUgUElEX1NNQVBTIFxcXCIvcHJvYy9zZWxmL3NtYXBzXFxcIlxcbiAjZGVmaW5lIFRFU1RfRklMRSBcXFwiY29sbGFwc2VfdGVzdF9maWxlXFxcIlxcbkBAIC0xNzcsNiArMTgxLDIxIEBAIHN0YXRpYyB2b2lkIGdldF9maW5mbyhjb25zdCBjaGFyICpkaXIpXFxuIFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiJXM6IENvdWxkIG5vdCByZWFkOiAlc1xcXFxuXFxcIiwgX19mdW5jX18sIHBhdGgpO1xcbiB9XFxuIFxcbitzdGF0aWMgYm9vbCBoYXNfc3dhcCh2b2lkKVxcbit7XFxuK1xcdEZJTEUgKmZwID0gZm9wZW4oXFxcIi9wcm9jL3N3YXBzXFxcIiwgXFxcInJcXFwiKTtcXG4rXFx0Y2hhciBsaW5lW01BWF9MSU5FX0xFTkdUSF07XFxuK1xcdGJvb2wgcmV0ID0gZmFsc2U7XFxuK1xcbitcXHRpZiAoIWZwKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdC8qIEZpcnN0IGxpbmUgaXMgdGhlIGhlYWRlcjsgYW55IGZvbGxvd2luZyBsaW5lIGlzIGEgc3dhcCBhcmVhLiAqL1xcbitcXHRpZiAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkgXFx1MDAyNlxcdTAwMjYgZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpXFxuK1xcdFxcdHJldCA9IHRydWU7XFxuK1xcdGZjbG9zZShmcCk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuIHN0YXRpYyBib29sIGNoZWNrX3N3YXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKVxcbiB7XFxuIFxcdGJvb2wgc3dhcCA9IGZhbHNlO1xcbkBAIC01NTQsOCArNTczLDE3IEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfY29sbGFwc2UoY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBpbnQgbnJfaHBhZ2VzLFxcbiBzdGF0aWMgYm9vbCB3YWl0X2Zvcl9zY2FuKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgaW50IG5yX2hwYWdlcyxcXG4gXFx0XFx0XFx0ICBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbiB7XFxuK1xcdC8qXFxuK1xcdCAqIFRoZSBidWRnZXQgaGFzIHRvIGNvdmVyIGtodWdlcGFnZWQgY29weWluZyBucl9ocGFnZXMgKlxcbitcXHQgKiBocGFnZV9wbWRfc2l6ZSwgcGx1cyB0d28gb2YgaXRzIHBhc3NlcyBvdmVyIHRoZSBtbS4gVGhyZWUgc2Vjb25kc1xcbitcXHQgKiBkb2VzIHRoYXQgYXQgYSAyTSBQTUQsIGJ1dCB0aGUgc2FtZSB0ZXN0IG1vdmVzIDJHIGF0IGEgNTEyTSBQTURcXG4rXFx0ICogKGFybTY0IHdpdGggNjRLIGJhc2UgcGFnZXMpIGFuZCAzcyBpcyB0aGVuIG1hcmdpbmFsOiBpdCBmYWlscyBvbiBhXFxuK1xcdCAqIGNvbGxhcHNlIHRoYXQgY29tcGxldGVzIGNvcnJlY3RseSwganVzdCBub3QgaW5zaWRlIHRoZSBidWRnZXQuXFxuK1xcdCAqIEFsbG93IGEgZnVydGhlciBzZWNvbmQgcGVyIDY0TSB0byBjb2xsYXBzZS5cXG4rXFx0ICovXFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgYnl0ZXMgPSAodW5zaWduZWQgbG9uZylucl9ocGFnZXMgKiBocGFnZV9wbWRfc2l6ZTtcXG4rXFx0aW50IHRpbWVvdXQgPSA2ICsgMiAqIChieXRlcyAvICg2NFVMIFxcdTAwM2NcXHUwMDNjIDIwKSk7XFxuIFxcdGludCBmdWxsX3NjYW5zO1xcbi1cXHRpbnQgdGltZW91dCA9IDY7IC8qIDMgc2Vjb25kcyAqL1xcbiBcXG4gXFx0LyogU2FuaXR5IGNoZWNrICovXFxuIFxcdGlmICghb3BzLVxcdTAwM2VjaGVja19odWdlKHAsIDApKVxcbkBAIC03MzUsNiArNzYzLDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX3N3YXBpbl9zaW5nbGVfcHRlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wXFxuIFxcdHZvaWQgKnA7XFxuIFxcbiBcXHRwID0gb3BzLVxcdTAwM2VzZXR1cF9hcmVhKDEpO1xcbitcXHRpZiAoIWhhc19zd2FwKCkpIHtcXG4rXFx0XFx0c2tpcChcXFwiU2tpcCAobm8gc3dhcCBjb25maWd1cmVkKVxcXCIpO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbiBcXHRvcHMtXFx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcXG4gXFxuIFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJTd2Fwb3V0IG9uZSBwYWdlLi4uXFxcIik7XFxuQEAgLTc2MSw2ICs3OTMsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9cXG4gXFx0dm9pZCAqcDtcXG4gXFxuIFxcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuK1xcdGlmICghaGFzX3N3YXAoKSkge1xcbitcXHRcXHRza2lwKFxcXCJTa2lwIChubyBzd2FwIGNvbmZpZ3VyZWQpXFxcIik7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuIFxcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xcbiBcXG4gXFx0a3NmdF9wcmludF9tc2coXFxcIlN3YXBvdXQgJWQgb2YgJWQgcGFnZXMuLi5cXFwiLCBtYXhfcHRlc19zd2FwICsgMSwgaHBhZ2VfcG1kX25yKTtcXG5AQCAtODUzLDYgKzg4OSwyMSBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb21wb3VuZF9leHRyZW1lKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wc1xcbiBcXHR2b2lkICpwO1xcbiBcXHRpbnQgaTtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIEJ1aWxkcyBhIFBNRCdzIHdvcnRoIG9mIGRpc3RpbmN0IFBURS1tYXBwZWQgY29tcG91bmQgcGFnZXMgYnkgY3ljbGluZ1xcbitcXHQgKiBocGFnZV9wbWRfbnIgZmF1bHQtdGltZSBUSFBzIHRocm91Z2ggbXJlbWFwLiBGYXVsdC10aW1lIFRIUCBhbGxvY2F0aW9uXFxuK1xcdCAqIGlzIGJlc3QtZWZmb3J0LCBhbmQgdGhpcyBuZWVkcyBocGFnZV9wbWRfbnIgUE1ELW9yZGVyIHBhZ2VzIGluIGEgcm93OlxcbitcXHQgKiBmaW5lIGF0IGEgMk0gKDRLIGJhc2UpIG9yIDMyTSAoMTZLIGJhc2UpIFBNRCwgYnV0IGEgNTEyTSBQTUQgKGFybTY0LzY0SylcXG4rXFx0ICogaXMgYW4gb3JkZXItMTMgYWxsb2NhdGlvbiB0aGUgYWxsb2NhdG9yIGNhbm5vdCByZWxpYWJseSBoYW5kIG91dCBldmVuXFxuK1xcdCAqIG9uY2UsIGxldCBhbG9uZSA4MTkyIHRpbWVzLiBDYXAgYXQgYSAzMk0gUE1EOyBNQURWX0NPTExBUFNFLWRyaXZlbiBjYXNlc1xcbitcXHQgKiBzdGlsbCBjb3ZlciBQTUQtb3JkZXIgY29sbGFwc2Ugb24gdGhlIGxhcmdlciBjb25maWdzLlxcbitcXHQgKi9cXG4rXFx0aWYgKGhwYWdlX3BtZF9zaXplIFxcdTAwM2UgKDMyVUwgXFx1MDAzY1xcdTAwM2MgMjApKSB7XFxuK1xcdFxcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcXFwiJXM6IFBNRCB0b28gbGFyZ2UgZm9yIGZhdWx0LXRpbWUgVEhQIGNvbnN0cnVjdGlvblxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0ICAgICAgX19mdW5jX18pO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuIFxcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuIFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJDb25zdHJ1Y3QgUFRFIHBhZ2UgdGFibGUgZnVsbCBvZiBkaWZmZXJlbnQgUFRFLW1hcHBlZCBjb21wb3VuZCBwYWdlc1xcXFxuXFxcIik7XFxuIFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBocGFnZV9wbWRfbnI7IGkrKykge1xcbkBAIC0xMDQzLDYgKzEwOTQsNjEgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wc1xcbiBcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuIH1cXG4gXFxuKy8qXFxuKyAqIENvbnRlbnQgc3RheXMgaXNvbGF0ZWQgd2hpbGUgYSBjby1zaGFyZXIgd3JpdGVzIGNvbmN1cnJlbnRseS4gQSBzaGFyZWRcXG4rICogc291cmNlIGlzIGNvcGllZCBsaXZlIChub3QgZnJvemVuKSwgcmVseWluZyBvbiBpdCBiZWluZyBDb1cgLSBpbW11dGFibGVcXG4rICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29weTsgYSBjby1zaGFyZXIncyB3cml0ZSBnb2VzIHRvIGEgQ29XIGNvcHkuIFRoZVxcbisgKiBjb2xsYXBzaW5nIGNoaWxkIG11c3Qgc2VlIHRoZSBwcmUtZm9yayBjb250ZW50LCB0aGUgd3JpdGluZyBwYXJlbnQgb25seVxcbisgKiBpdHMgb3duIHdyaXRlcy5cXG4rICovXFxuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX2ZvcmtfY293X3JhY2Uoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuK3tcXG4rXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBzaGFyZWQgPSA2NCAqIHBhZ2Vfc2l6ZTtcXG4rXFx0Y29uc3QgaW50IHN0cmlkZSA9IHBhZ2Vfc2l6ZSAvIHNpemVvZihpbnQpO1xcbitcXHRpbnQgd3N0YXR1cywgaSwgbiA9IHNoYXJlZCAvIHBhZ2Vfc2l6ZTtcXG4rXFx0aW50ICppcDtcXG4rXFx0dm9pZCAqcDtcXG4rXFxuK1xcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuK1xcdGlwID0gcDtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBzaGFyZWQpO1xcdFxcdC8qIHNoYXJlZCBwcmVmaXgsIHByZS1mb3JrIHBhdHRlcm4gKi9cXG4rXFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJGb3JrLCBjb2xsYXBzZSBpbiB0aGUgY2hpbGQgd2hpbGUgdGhlIHBhcmVudCByZXdyaXRlcy4uLlxcXCIpO1xcbitcXHRpZiAoIWZvcmsoKSkge1xcbitcXHRcXHRvcHMtXFx1MDAzZWZhdWx0KHAsIHNoYXJlZCwgaHBhZ2VfcG1kX3NpemUpO1xcdC8qIHByaXZhdGUgcmVtYWluZGVyICovXFxuK1xcdFxcdGMtXFx1MDAzZWNvbGxhcHNlKFxcXCJDb2xsYXBzZSBhIHJhbmdlIHNoYXJlZCB3aXRoIGEgd3JpdGluZyBjby1zaGFyZXJcXFwiLFxcbitcXHRcXHRcXHQgICAgcCwgMSwgb3BzLCB0cnVlKTtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG47IGkrKylcXG4rXFx0XFx0XFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgKyAweGRlYWQwMDAwKSB7XFxuK1xcdFxcdFxcdFxcdGZhaWwoXFxcIkZhaWw6IGNoaWxkIGNvbnRlbnRcXFwiKTtcXG4rXFx0XFx0XFx0XFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHRcXHRcXHRcXHRfZXhpdChleGl0X3N0YXR1cyk7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4rXFx0XFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHRcXHRfZXhpdChleGl0X3N0YXR1cyk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIEhhbW1lciB0aGUgcGFyZW50J3Mgb3duIHdyaXRlcyBvdmVyIHRoZSBzaGFyZWQgcHJlZml4LiAqL1xcbitcXHRmb3IgKGludCBpdCA9IDA7IGl0IFxcdTAwM2MgMjAwMDAwOyBpdCsrKVxcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbjsgaSsrKVxcbitcXHRcXHRcXHRpcFtpICogc3RyaWRlXSA9IGkgKyAweGJlZWYwMDAwO1xcbitcXG4rXFx0d2FpdChcXHUwMDI2d3N0YXR1cyk7XFxuK1xcdGV4aXRfc3RhdHVzID0gV0VYSVRTVEFUVVMod3N0YXR1cyk7XFxuK1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ2hlY2sgdGhlIHBhcmVudCBzZWVzIG9ubHkgaXRzIG93biB3cml0ZXMuLi5cXFwiKTtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG47IGkrKylcXG4rXFx0XFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgKyAweGJlZWYwMDAwKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0aWYgKGkgPT0gbilcXG4rXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRmYWlsKFxcXCJGYWlsOiBwYXJlbnQgY29udGVudFxcXCIpO1xcbitcXHRvcHMtXFx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rfVxcbitcXG4gc3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxcbiBcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbiB7XFxuQEAgLTEwODgsNiArMTE5NCwyMjIgQEAgc3RhdGljIHZvaWQgbWFkdmlzZV9yZXRyYWN0ZWRfcGFnZV90YWJsZXMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXFxuIFxcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4gfVxcbiBcXG4rLypcXG4rICogT3JkZXItcGFyYW1ldGVyaXplZCBjb2xsYXBzZSBjYXNlcyAoLW8gXFx1MDAzY29yZGVyXFx1MDAzZSk6IGtodWdlcGFnZWQgY29sbGFwc2VzXFxuKyAqIDRLLWZhdWx0ZWQgbWVtb3J5IGludG8gZm9saW9zIG9mIHRoZSBnaXZlbiBzdWItUE1EIG9yZGVyLiBEZXRlY3Rpb24gaXNcXG4rICogZm9saW8tYmFzZWQgKHZtX3V0aWwpLCBub3Qgc21hcHM6IEFub25IdWdlUGFnZXMgb25seSBhY2NvdW50cyBQTURcXG4rICogbWFwcGluZ3MuXFxuKyAqXFxuKyAqIFRoZSByZWdpb24gaXMgZmF1bHRlZCBiZWZvcmUgTUFEVl9IVUdFUEFHRSBhbmQgdGhlIHRhcmdldCBvcmRlciBpc1xcbisgKiBjb25maWd1cmVkIFxcXCJpbmhlcml0XFxcIiB1bmRlciBlbmFibGVkPW1hZHZpc2UsIHNvIGZhdWx0cyBhcmUgYWx3YXlzXFxuKyAqIG9yZGVyIDAgYW5kIHRoZSBjb2xsYXBzZSBwcm9kdWN0IGNhbiBvbmx5IGNvbWUgZnJvbSBraHVnZXBhZ2VkLlxcbisgKi9cXG4rc3RhdGljIHNpemVfdCBhbm9uX29yZGVyX3NpemUodm9pZClcXG4re1xcbitcXHRyZXR1cm4gcGFnZV9zaXplIFxcdTAwM2NcXHUwMDNjIGFub25fdGFyZ2V0X29yZGVyO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCByYW5nZV9jb2xsYXBzZWQodm9pZCAqcCwgc2l6ZV90IGxlbilcXG4re1xcbitcXHRyZXR1cm4gaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBsZW4sIGFub25fdGFyZ2V0X29yZGVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7XFxuK31cXG4rXFxuKy8qIE5vIGFsaWduZWQgd2luZG93IGluIFtwLCBwICsgbGVuKSBpcyBiYWNrZWQgYXQgdGhlIHRhcmdldCBvcmRlci4gKi9cXG4rc3RhdGljIGJvb2wgcmFuZ2Vfbm90X2NvbGxhcHNlZCh2b2lkICpwLCBzaXplX3QgbGVuKVxcbit7XFxuK1xcdHNpemVfdCB3aW5kb3cgPSBhbm9uX29yZGVyX3NpemUoKTtcXG4rXFx0Y2hhciAqYWRkciA9IHA7XFxuK1xcbitcXHRmb3IgKDsgbGVuIFxcdTAwM2U9IHdpbmRvdzsgYWRkciArPSB3aW5kb3csIGxlbiAtPSB3aW5kb3cpIHtcXG4rXFx0XFx0aWYgKHJhbmdlX2NvbGxhcHNlZChhZGRyLCB3aW5kb3cpKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3Modm9pZClcXG4re1xcbitcXHQvKiBXYWl0IHVwIHRvIDMwIHNlY29uZHMgZm9yIHRoZSBwYXNzIHRvIGNvbXBsZXRlLiAqL1xcbitcXHRyZXR1cm4ga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoMzApO1xcbit9XFxuK1xcbisvKlxcbisgKiBDYXNlcyB3aG9zZSBnZW9tZXRyeSBuZWVkcyBhIHdpbmRvdyBzdHJpY3RseSBiZWxvdyB0aGUgUE1EIHNraXAgYXRcXG4rICogLW8gXFx1MDAzY1BNRCBvcmRlclxcdTAwM2U7IHRoZSByZXN0IHJ1biB0aGVyZSB1bmNoYW5nZWQsIGJhc2VsaW5pbmcgdGhlIGxlZ2FjeVxcbisgKiBQTUQgZW5naW5lIHdpdGggdGhlIHNhbWUgdGVzdCB0ZXh0IHVzZWQgZm9yIHRoZSBtVEhQIG9yZGVycy5cXG4rICovXFxuK3N0YXRpYyBib29sIHNraXBfYXRfcG1kX29yZGVyKGNvbnN0IGNoYXIgKm5hbWUpXFxuK3tcXG4rXFx0aWYgKGFub25fdGFyZ2V0X29yZGVyIFxcdTAwM2MgaHBhZ2VfcG1kX29yZGVyKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcXFwiJXM6IG5lZWRzIGEgd2luZG93IGJlbG93IHRoZSBQTURcXFxcblxcXCIsIG5hbWUpO1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfZnVsbChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHR2b2lkICpwO1xcbitcXG4rXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdGlmICghcmFuZ2Vfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiVW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcXFxuXFxcIik7XFxuK1xcbitcXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcXG4rXFx0a3NmdF9wcmludF9tc2coXFxcIkNvbGxhcHNlIGZ1bGx5IHBvcHVsYXRlZCBQVEUgdGFibGUgdG8gdGFyZ2V0IG9yZGVyLi4uXFxcIik7XFxuK1xcdGlmICgha2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcygpKVxcbitcXHRcXHRmYWlsKFxcXCJUaW1lb3V0XFxcIik7XFxuK1xcdGVsc2UgaWYgKHJhbmdlX2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXFxuK1xcdFxcdHN1Y2Nlc3MoXFxcIk9LXFxcIik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0ZmFpbChcXFwiRmFpbFxcXCIpO1xcbitcXG4rXFx0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX3NpbmdsZV93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXFxuK1xcdFxcdFxcdFxcdFxcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbit7XFxuK1xcdHNpemVfdCB3aW5kb3cgPSBhbm9uX29yZGVyX3NpemUoKTtcXG4rXFx0dm9pZCAqcDtcXG4rXFxuK1xcdGlmIChza2lwX2F0X3BtZF9vcmRlcihfX2Z1bmNfXykpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuK1xcdG9wcy1cXHUwMDNlZmF1bHQocCwgd2luZG93LCAyICogd2luZG93KTtcXG4rXFx0aWYgKCFyYW5nZV9ub3RfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxcXG5cXFwiKTtcXG4rXFxuK1xcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ29sbGFwc2Ugb25lIGZ1bGx5IHBvcHVsYXRlZCB3aW5kb3cuLi5cXFwiKTtcXG4rXFx0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXFxuK1xcdFxcdGZhaWwoXFxcIlRpbWVvdXRcXFwiKTtcXG4rXFx0ZWxzZSBpZiAocmFuZ2VfY29sbGFwc2VkKHAgKyB3aW5kb3csIHdpbmRvdykgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0IHJhbmdlX25vdF9jb2xsYXBzZWQocCwgd2luZG93KSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgcmFuZ2Vfbm90X2NvbGxhcHNlZChwICsgMiAqIHdpbmRvdyxcXG4rXFx0XFx0XFx0XFx0ICAgICBocGFnZV9wbWRfc2l6ZSAtIDIgKiB3aW5kb3cpKVxcbitcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGZhaWwoXFxcIkZhaWxcXFwiKTtcXG4rXFxuK1xcdHZhbGlkYXRlX21lbW9yeShwLCB3aW5kb3csIDIgKiB3aW5kb3cpO1xcbitcXHRvcHMtXFx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXFxuK1xcdFxcdFxcdFxcdFxcdCAgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHR2b2lkICpwO1xcbitcXG4rXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBwYWdlX3NpemUpO1xcbitcXHRpZiAoIXJhbmdlX25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIlVuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXFxcblxcXCIpO1xcbitcXG4rXFx0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJDb2xsYXBzZSB3aW5kb3cgd2l0aCBzaW5nbGUgUFRFIGVudHJ5IHByZXNlbnQuLi5cXFwiKTtcXG4rXFx0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXFxuK1xcdFxcdGZhaWwoXFxcIlRpbWVvdXRcXFwiKTtcXG4rXFx0ZWxzZSBpZiAocmFuZ2VfY29sbGFwc2VkKHAsIGFub25fb3JkZXJfc2l6ZSgpKSlcXG4rXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRmYWlsKFxcXCJGYWlsXFxcIik7XFxuK1xcbitcXHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgcGFnZV9zaXplKTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXFxuK1xcdFxcdFxcdFxcdFxcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbit7XFxuK1xcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcXG4rXFx0c2l6ZV90IHdpbmRvdyA9IGFub25fb3JkZXJfc2l6ZSgpO1xcbitcXHR2b2lkICpwO1xcbitcXG4rXFx0aWYgKHNraXBfYXRfcG1kX29yZGVyKF9fZnVuY19fKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gMDtcXG4rXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFxuK1xcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuK1xcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7XFxuK1xcdGlmICghcmFuZ2Vfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiVW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcXFxuXFxcIik7XFxuK1xcbitcXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcXG4rXFx0a3NmdF9wcmludF9tc2coXFxcIkNvbGxhcHNlIGZ1bGwgd2luZG93LCBub3QgdGhlIG9uZSBtaXNzaW5nIGEgcGFnZS4uLlxcXCIpO1xcbitcXHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcXG4rXFx0XFx0ZmFpbChcXFwiVGltZW91dFxcXCIpO1xcbitcXHRlbHNlIGlmIChyYW5nZV9jb2xsYXBzZWQocCwgd2luZG93KSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgcmFuZ2Vfbm90X2NvbGxhcHNlZChwICsgd2luZG93LCB3aW5kb3cpKVxcbitcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGZhaWwoXFxcIkZhaWxcXFwiKTtcXG4rXFxuK1xcdHZhbGlkYXRlX21lbW9yeShwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rfVxcbitcXG4rLyogU21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCB3aWxsIGNvbnNpZGVyIGZvciBtVEhQIGNvbGxhcHNlLiAqL1xcbisjZGVmaW5lIE1JTl9NVEhQX09SREVSIDJcXG4rXFxuKy8qXFxuKyAqIEEgcmVnaW9uIGJhY2tlZCBieSBsYXJnZSBmb2xpb3Mgb2YgYSBzbWFsbGVyIG9yZGVyIGlzIGEgdmFsaWQgc291cmNlXFxuKyAqIGZvciBjb2xsYXBzZSB0byB0aGUgdGFyZ2V0IG9yZGVyOlxcbisgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKCkgYWNjZXB0cyBhbnkgc291cmNlIGZvbGlvIG9mIGFuIG9yZGVyXFxuKyAqIHN0cmljdGx5IGJlbG93IHRoZSBjYW5kaWRhdGUncy5cXG4rICovXFxuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXFxuK1xcdFxcdFxcdFxcdFxcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbit7XFxuK1xcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcXG4rXFx0aW50IHNvdXJjZV9vcmRlciA9IGFub25fb3JkZXIgPyBhbm9uX29yZGVyIDogTUlOX01USFBfT1JERVI7XFxuK1xcdHZvaWQgKnA7XFxuK1xcbitcXHQvKiBTb3VyY2VzIG11c3QgYmUgYSBzdXBwb3J0ZWQgbVRIUCBvcmRlciBzdHJpY3RseSBiZWxvdyB0aGUgdGFyZ2V0LiAqL1xcbitcXHRpZiAoc291cmNlX29yZGVyIFxcdTAwM2U9IGFub25fdGFyZ2V0X29yZGVyIHx8XFxuK1xcdCAgICAhKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIHNvdXJjZV9vcmRlcikpKSB7XFxuK1xcdFxcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcXFwiJXM6IG5vIHNvdXJjZSBvcmRlciBiZWxvdyB0YXJnZXRcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCAgICAgIF9fZnVuY19fKTtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcbitcXHQvKiBGYXVsdCB0aGUgd2hvbGUgcmVnaW9uIGFzIG9yZGVyLUBzb3VyY2Vfb3JkZXIgZm9saW9zLiAqL1xcbitcXHRzZXR0aW5ncy5odWdlcGFnZXNbc291cmNlX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcXG4rXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFxuK1xcdGlmICghaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBocGFnZV9wbWRfc2l6ZSwgc291cmNlX29yZGVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIlJlZ2lvbiBub3QgYmFja2VkIGJ5IG9yZGVyLSVkIGZvbGlvcyBhZnRlciBmYXVsdFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0ICAgc291cmNlX29yZGVyKTtcXG4rXFxuK1xcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ29sbGFwc2UgcmVnaW9uIGJhY2tlZCBieSBvcmRlci0lZCBzb3VyY2VzLi4uXFxcIixcXG4rXFx0XFx0ICAgICAgIHNvdXJjZV9vcmRlcik7XFxuK1xcdGlmICgha2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcygpKVxcbitcXHRcXHRmYWlsKFxcXCJUaW1lb3V0XFxcIik7XFxuK1xcdGVsc2UgaWYgKHJhbmdlX2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXFxuK1xcdFxcdHN1Y2Nlc3MoXFxcIk9LXFxcIik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0ZmFpbChcXFwiRmFpbFxcXCIpO1xcbitcXG4rXFx0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK31cXG4rXFxuIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXFxuIHtcXG4gXFx0ZnByaW50ZihzdGRlcnIsIFxcXCJcXFxcblVzYWdlOiAuL2todWdlcGFnZWQgW09QVElPTlNdIFxcdTAwM2N0ZXN0IHR5cGVcXHUwMDNlIFtkaXJdXFxcXG5cXFxcblxcXCIpO1xcbkBAIC0xMTAzLDYgKzE0MjUsMTEgQEAgc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcXG4gXFx0ZnByaW50ZihzdGRlcnIsXFx0XFxcIlxcXFx0XFxcXHQtaDogVGhpcyBoZWxwIG1lc3NhZ2UuXFxcXG5cXFwiKTtcXG4gXFx0ZnByaW50ZihzdGRlcnIsXFx0XFxcIlxcXFx0XFxcXHQtczogbVRIUCBzaXplLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXFxcblxcXCIpO1xcbiBcXHRmcHJpbnRmKHN0ZGVycixcXHRcXFwiXFxcXHRcXFxcdCAgICBEZWZhdWx0cyB0byAwLiBVc2UgdGhpcyBzaXplIGZvciBhbm9uIG9yIHNobWVtIGFsbG9jYXRpb25zLlxcXFxuXFxcIik7XFxuK1xcdGZwcmludGYoc3RkZXJyLFxcdFxcXCJcXFxcdFxcXFx0LW86IGNvbGxhcHNlIHRhcmdldCBvcmRlciBmb3Iga2h1Z2VwYWdlZDphbm9uLlxcXFxuXFxcIik7XFxuK1xcdGZwcmludGYoc3RkZXJyLFxcdFxcXCJcXFxcdFxcXFx0ICAgIFJ1bnMgdGhlIG9yZGVyLXBhcmFtZXRlcml6ZWQgY29sbGFwc2UgY2FzZXMgaW5zdGVhZFxcXFxuXFxcIik7XFxuK1xcdGZwcmludGYoc3RkZXJyLFxcdFxcXCJcXFxcdFxcXFx0ICAgIG9mIHRoZSBQTUQgY2FzZXMuXFxcXG5cXFwiKTtcXG4rXFx0ZnByaW50ZihzdGRlcnIsXFx0XFxcIlxcXFx0XFxcXHQgICAgV2l0aCAtcywgLXMgbmFtZXMgdGhlIG1USFAgc291cmNlIG9yZGVyIGZvciB0aGVcXFxcblxcXCIpO1xcbitcXHRmcHJpbnRmKHN0ZGVycixcXHRcXFwiXFxcXHRcXFxcdCAgICBtaXhlZC1zb3VyY2UgY2FzZSAoc291cmNlIG9yZGVyIGJlbG93IHRoZSB0YXJnZXQpLlxcXFxuXFxcIik7XFxuIFxcdGV4aXQoMSk7XFxuIH1cXG4gXFxuQEAgLTExMTIsMTcgKzE0MzksMzEgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0Y2hhciAqYnVmO1xcbiBcXHRjb25zdCBjaGFyICp0b2tlbjtcXG4gXFxuLVxcdHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIFxcXCJzOmhcXFwiKSkgIT0gLTEpIHtcXG4rXFx0d2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgXFxcInM6bzpoXFxcIikpICE9IC0xKSB7XFxuIFxcdFxcdHN3aXRjaCAob3B0KSB7XFxuIFxcdFxcdGNhc2UgJ3MnOlxcbiBcXHRcXHRcXHRhbm9uX29yZGVyID0gYXRvaShvcHRhcmcpO1xcbiBcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSAnbyc6XFxuK1xcdFxcdFxcdGFub25fdGFyZ2V0X29yZGVyID0gYXRvaShvcHRhcmcpO1xcbitcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0Y2FzZSAnaCc6XFxuIFxcdFxcdGRlZmF1bHQ6XFxuIFxcdFxcdFxcdHVzYWdlKCk7XFxuIFxcdFxcdH1cXG4gXFx0fVxcbiBcXG4rXFx0LypcXG4rXFx0ICogLXMgYW5kIC1vIGNvbXBvc2U6IC1zIHRoZW4gbmFtZXMgdGhlIG1USFAgc291cmNlIG9yZGVyIGZvciB0aGVcXG4rXFx0ICogbWl4ZWQtc291cmNlIGNhc2UsIHdoaWNoIG5lZWRzIGEgc291cmNlIHN0cmljdGx5IGJlbG93IHRoZVxcbitcXHQgKiB0YXJnZXQgKGFuZCBhdCBvciBhYm92ZSB0aGUgc21hbGxlc3QgbVRIUCBvcmRlcikuIEFsb25lLCAtcyBpc1xcbitcXHQgKiB0aGUgc291cmNlIG9yZGVyIGZvciB0aGUgZGVmYXVsdCBQTUQgc3VpdGU7IGFsb25lLCAtbyBpcyB0aGVcXG4rXFx0ICogY29sbGFwc2UgdGFyZ2V0IGZvciB0aGUgb3JkZXItcGFyYW1ldGVyaXplZCBzdWl0ZS5cXG4rXFx0ICovXFxuK1xcdGlmIChhbm9uX3RhcmdldF9vcmRlciBcXHUwMDI2XFx1MDAyNiBhbm9uX29yZGVyIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAoYW5vbl9vcmRlciBcXHUwMDNjIE1JTl9NVEhQX09SREVSIHx8IGFub25fb3JkZXIgXFx1MDAzZT0gYW5vbl90YXJnZXRfb3JkZXIpKVxcbitcXHRcXHR1c2FnZSgpO1xcbitcXG4gXFx0YXJndiArPSBvcHRpbmQ7XFxuIFxcdGFyZ2MgLT0gb3B0aW5kO1xcbiBcXG5AQCAtMTIwNyw3ICsxNTQ4LDYgQEAgc3RhdGljIGludCBucl90ZXN0X2Nhc2VzO1xcbiBcXG4gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiB7XFxuLVxcdGludCBocGFnZV9wbWRfb3JkZXI7XFxuIFxcdHN0cnVjdCB0aHBfc2V0dGluZ3MgZGVmYXVsdF9zZXR0aW5ncyA9IHtcXG4gXFx0XFx0LnRocF9lbmFibGVkID0gVEhQX01BRFZJU0UsXFxuIFxcdFxcdC50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVMsXFxuQEAgLTEyNDQsMTggKzE1ODQsOTQgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRocGFnZV9wbWRfbnIgPSBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTtcXG4gXFx0aHBhZ2VfcG1kX29yZGVyID0gX19idWlsdGluX2N0eihocGFnZV9wbWRfbnIpO1xcbiBcXG4rXFx0LypcXG4rXFx0ICogVGhlIHBhZ2UgY2FjaGUgY2FwcyBmb2xpbyBvcmRlciBhdCBNQVhfUEFHRUNBQ0hFX09SREVSLCB3aGljaFxcbitcXHQgKiB4YXNfc3BsaXRfYWxsb2MoKSBwdXRzIGJlbG93IHRoZSBQTUQgb3JkZXIgb24gYXJtNjQgd2l0aCA2NEsgcGFnZXMuXFxuK1xcdCAqIEEgUE1ELXNpemVkIHBhZ2UgY2FjaGUgZm9saW8gaXMgdGhlbiBpbXBvc3NpYmxlLCBzbyB0aGUga2VybmVsXFxuK1xcdCAqIHJlZnVzZXMgdGhlc2UgY29sbGFwc2VzIGJ5IGRlc2lnbiBhbmQgdGhlcmUgaXMgbm90aGluZyB0byB0ZXN0LlxcbitcXHQgKi9cXG4rXFx0aWYgKCEodGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnMoKSBcXHUwMDI2ICgxVUwgXFx1MDAzY1xcdTAwM2MgaHBhZ2VfcG1kX29yZGVyKSkpIHtcXG4rXFx0XFx0aWYgKHNobWVtX29wcykge1xcbitcXHRcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwibm8gUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW86IHNraXBwaW5nIHNobWVtXFxcXG5cXFwiKTtcXG4rXFx0XFx0XFx0c2htZW1fb3BzID0gTlVMTDtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAoZmluZm8udHlwZSA9PSBWTUFfU0hNRU0gXFx1MDAyNlxcdTAwMjYgcmVhZF9vbmx5X2ZpbGVfb3BzKSB7XFxuK1xcdFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgdG1wZnMgZmlsZVxcXFxuXFxcIik7XFxuK1xcdFxcdFxcdHJlYWRfb25seV9maWxlX29wcyA9IE5VTEw7XFxuK1xcdFxcdFxcdHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9IE5VTEw7XFxuK1xcdFxcdFxcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSBOVUxMO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmICghYW5vbl9vcHMgXFx1MDAyNlxcdTAwMjYgIXNobWVtX29wcyBcXHUwMDI2XFx1MDAyNiAhcmVhZF9vbmx5X2ZpbGVfb3BzKVxcbitcXHRcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiTm90aGluZyBsZWZ0IHRvIGNvbGxhcHNlIGludG9cXFxcblxcXCIpO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoYW5vbl90YXJnZXRfb3JkZXIgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcXHUwMDI2ICgxVUwgXFx1MDAzY1xcdTAwM2MgYW5vbl90YXJnZXRfb3JkZXIpKSlcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIk9yZGVyICVkIGlzIG5vdCBhIHN1cHBvcnRlZCBhbm9uIFRIUCBvcmRlclxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgIGFub25fdGFyZ2V0X29yZGVyKTtcXG4rXFx0aWYgKGFub25fdGFyZ2V0X29yZGVyIFxcdTAwM2UgaHBhZ2VfcG1kX29yZGVyKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIi1vIHRha2VzIGF0IG1vc3QgdGhlIFBNRCBvcmRlclxcXFxuXFxcIik7XFxuK1xcbiBcXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IGhwYWdlX3BtZF9uciAtIDE7XFxuIFxcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zd2FwID0gaHBhZ2VfcG1kX25yIC8gODtcXG4gXFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX3NoYXJlZCA9IGhwYWdlX3BtZF9uciAvIDI7XFxuIFxcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID0gaHBhZ2VfcG1kX25yICogODtcXG4gXFx0ZGVmYXVsdF9zZXR0aW5ncy5odWdlcGFnZXNbaHBhZ2VfcG1kX29yZGVyXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XFxuLVxcdGRlZmF1bHRfc2V0dGluZ3MuaHVnZXBhZ2VzW2Fub25fb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTO1xcbiBcXHRkZWZhdWx0X3NldHRpbmdzLnNobWVtX2h1Z2VwYWdlc1tocGFnZV9wbWRfb3JkZXJdLmVuYWJsZWQgPSBTSE1FTV9JTkhFUklUO1xcbi1cXHRkZWZhdWx0X3NldHRpbmdzLnNobWVtX2h1Z2VwYWdlc1thbm9uX29yZGVyXS5lbmFibGVkID0gU0hNRU1fQUxXQVlTO1xcbitcXHQvKlxcbitcXHQgKiBVbmRlciAtbyB0aGUgb3JkZXItcGFyYW1ldGVyaXplZCBjYXNlcyB3YW50IG9yZGVyLTAgc291cmNlcyBieVxcbitcXHQgKiBkZWZhdWx0OyB0aGUgbWl4ZWQtc291cmNlIGNhc2UgZW5hYmxlcyBpdHMgb3duIChwb3NzaWJseSAtc1xcbitcXHQgKiBzZWxlY3RlZCkgc291cmNlIG9yZGVyIGxvY2FsbHkuIEVuYWJsaW5nIGl0IGdsb2JhbGx5IGhlcmUgd291bGRcXG4rXFx0ICogbWFrZSBldmVyeSBjYXNlIGZhdWx0IHRoYXQgb3JkZXIuXFxuK1xcdCAqL1xcbitcXHRpZiAoIWFub25fdGFyZ2V0X29yZGVyKSB7XFxuK1xcdFxcdGRlZmF1bHRfc2V0dGluZ3MuaHVnZXBhZ2VzW2Fub25fb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTO1xcbitcXHRcXHRkZWZhdWx0X3NldHRpbmdzLnNobWVtX2h1Z2VwYWdlc1thbm9uX29yZGVyXS5lbmFibGVkID0gU0hNRU1fQUxXQVlTO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoYW5vbl90YXJnZXRfb3JkZXIpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogT25seSB0aGUgdGFyZ2V0IG9yZGVyIG1heSBwcm9kdWNlIGxhcmdlIGZvbGlvcywgYW5kIG9ubHlcXG4rXFx0XFx0ICogZnJvbSBraHVnZXBhZ2VkOiBcXFwiaW5oZXJpdFxcXCIgdW5kZXIgZW5hYmxlZD1tYWR2aXNlIGtlZXBzXFxuK1xcdFxcdCAqIHByZS1NQURWX0hVR0VQQUdFIGZhdWx0cyBhdCBvcmRlciAwLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0ZGVmYXVsdF9zZXR0aW5ncy5odWdlcGFnZXNbaHBhZ2VfcG1kX29yZGVyXS5lbmFibGVkID0gVEhQX05FVkVSO1xcbitcXHRcXHRkZWZhdWx0X3NldHRpbmdzLmh1Z2VwYWdlc1thbm9uX3RhcmdldF9vcmRlcl0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBPcmRlci1wYXJhbWV0ZXJpemVkIGNhc2VzIGFyZSBkcml2ZW4gc3RyaWN0bHkgYnkgdGhlXFxuK1xcdFxcdCAqIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgYmFycmllciwgd2hpY2ggd2FrZXMgdGhlIGRhZW1vblxcbitcXHRcXHQgKiBpdHNlbGYuIEEgbG9uZyBzY2FuX3NsZWVwIGtlZXBzIGtodWdlcGFnZWQgZnJvbVxcbitcXHRcXHQgKiBmcmVlLXJ1bm5pbmcgYmV0d2VlbiBiYXJyaWVyIHN0ZXBzLCBhbmQgYSBwYWdlc190b19zY2FuXFxuK1xcdFxcdCAqIGNvdmVyaW5nIGV2ZXJ5dGhpbmcgbWFrZXMgb25lIHdha2UgY29tcGxldGUgb25lIGZ1bGxcXG4rXFx0XFx0ICogcGFzcyAodGhlIGJhcnJpZXIncyBjb250cmFjdCksIHNvIGEgcnVuIHBlcmZvcm1zIGFcXG4rXFx0XFx0ICogZGV0ZXJtaW5pc3RpYyBudW1iZXIgb2YgcGFzc2VzIOKAlCB3aGF0IHRoZSBzdGFnZSBBL0JcXG4rXFx0XFx0ICogdHJhY2UgY29tcGFyaXNvbnMgcmVseSBvbi5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5zY2FuX3NsZWVwX21pbGxpc2VjcyA9IDYwMDAwO1xcbitcXHRcXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQucGFnZXNfdG9fc2NhbiA9IDFVTCBcXHUwMDNjXFx1MDAzYyAyNDtcXG4rXFxuK1xcdFxcdHBhZ2VtYXBfZmQgPSBvcGVuKFxcXCIvcHJvYy9zZWxmL3BhZ2VtYXBcXFwiLCBPX1JET05MWSk7XFxuK1xcdFxcdGlmIChwYWdlbWFwX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJvcGVuKFxcXFxcXFwiL3Byb2Mvc2VsZi9wYWdlbWFwXFxcXFxcXCIpXFxcIik7XFxuK1xcdFxcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcIiwgT19SRE9OTFkpO1xcbitcXHRcXHRpZiAoa3BhZ2VmbGFnc19mZCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJvcGVuKFxcXFxcXFwiL3Byb2Mva3BhZ2VmbGFnc1xcXFxcXFwiKSByZXF1aXJlcyByb290XFxcXG5cXFwiKTtcXG4rXFx0fVxcbiBcXG4gXFx0c2F2ZV9zZXR0aW5ncygpO1xcbiBcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2ZGVmYXVsdF9zZXR0aW5ncyk7XFxuIFxcbitcXHRpZiAoYW5vbl90YXJnZXRfb3JkZXIpIHtcXG4rXFx0XFx0VEVTVChjb2xsYXBzZV9vcmRlcl9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFx0XFx0VEVTVChjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFx0XFx0VEVTVChjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdywga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFxcdFRFU1QoY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFxcdFRFU1QoY29sbGFwc2Vfb3JkZXJfbWl4ZWRfc291cmNlcywga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcbitcXHRcXHRrc2Z0X3NldF9wbGFuKG5yX3Rlc3RfY2FzZXMpO1xcbitcXHRcXHRnb3RvIHJ1bjtcXG4rXFx0fVxcbitcXG4gXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XFxuIFxcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xcbkBAIC0xMzI0LDYgKzE3NDAsOSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xcbiBcXG4rXFx0VEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFx0VEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFxuIFxcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcXG4gXFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcXG4gXFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcXG5AQCAtMTMzNiw2ICsxNzU1LDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRrc2Z0X3NldF9wbGFuKG5yX3Rlc3RfY2FzZXMgKyAxKTtcXG4gXFxuIFxcdGFsbG9jX2F0X2ZhdWx0KCk7XFxuK3J1bjpcXG4gXFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyBucl90ZXN0X2Nhc2VzOyBpKyspIHtcXG4gXFx0XFx0c3RydWN0IHRlc3RfY2FzZSAqdCA9IFxcdTAwMjZ0ZXN0X2Nhc2VzW2ldO1xcbiBcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMmFhNDVjOWU4YTc3Zlxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuY1xcbkBAIC0wLDAgKzEsNDgzIEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKy8qXFxuKyAqIGtodWdlcGFnZWQgcmFjZSBoYXJuZXNzLlxcbisgKlxcbisgKiBSdW5zIGNvbGxhcHNlIGFnYWluc3QgY29uY3VycmVudCBmYXVsdHMsIHRyYW5zaWVudCBHVVAgcGluc1xcbisgKiAoZ3VwX3Rlc3QpLCBmb3JrLCBtcmVtYXAgYW5kIE1BRFZfRE9OVE5FRUQgb3ZlciB0aGUgc2FtZSByYW5nZXMsIGluXFxuKyAqIG9uZSBvZiB0aHJlZSBkcml2ZXIgbW9kZXM6XFxuKyAqXFxuKyAqICAgc3RlcHBlZFxcdGtodWdlcGFnZWQsIGRyaXZlbiBzeW5jaHJvbm91c2x5IG9uZSBmdWxsIHBhc3MgYXQgYSB0aW1lXFxuKyAqXFx0XFx0dGhyb3VnaCBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIOKAlCB0aGUgcHJpbWFyeSBkcml2ZXI6IHRoZVxcbisgKlxcdFxcdGZ1bGwgc2Nhbitjb2xsYXBzZSBwYXRoIHdpdGggYSBkZXRlcm1pbmlzdGljIGV4dGVudCBwZXJcXG4rICpcXHRcXHRzdGVwO1xcbisgKiAgIGZyZWVcXHRmcmVlLXJ1bm5pbmcga2h1Z2VwYWdlZCAoc2Nhbl9zbGVlcF9taWxsaXNlY3M9MCkg4oCUIHRoZVxcbisgKlxcdFxcdHNvYWs7XFxuKyAqICAgbWFkdmlzZVxcdE1BRFZfQ09MTEFQU0UgaW4gYSBsb29wIOKAlCB0aGUgbGVnYWN5LVBNRCByZWdyZXNzaW9uXFxuKyAqXFx0XFx0YXhpcy5cXG4rICpcXG4rICogQWxsIGFub24gVEhQIG9yZGVycyBhcmUgZW5hYmxlZCAoaW5oZXJpdCkuIG1heF9wdGVzX25vbmUgaXMgMCBieVxcbisgKiBkZWZhdWx0IOKAlCByYWNpbmcgTUFEVl9ET05UTkVFRCB0aGVuIHN0ZWVycyBzZWxlY3Rpb24gYWNyb3NzIG9yZGVycyDigJRcXG4rICogb3IgdGhlIHBlcm1pc3NpdmUgbGltaXQgd2l0aCAteiwgd2hpY2ggZmxvb2RzIHRoZSBiYXRjaCBlbmdpbmUgd2l0aFxcbisgKiBob2xlIGFuZCB6ZXJvcGFnZSBzbG90cyBzbyB0aGUgcG9wdWxhdGlvbiBwYXRocyAocGFyay10aW1lIHplcm9wYWdlXFxuKyAqIGNsZWFyLCB6ZXJvLWZpbGxlZCBjb3B5LCBpbnN0YWxsLXRpbWUgcHRlX25vbmUoKSB2ZXJpZnkgYW5kIGFib3J0KVxcbisgKiByYWNlIHRoZSBmYXVsdGVycyBkaXJlY3RseS5cXG4rICpcXG4rICogLXAgYWRkcyBtZW1vcnkgcHJlc3N1cmUgdG8gYW55IG9mIHRoZSBhYm92ZTogTUFEVl9QQUdFT1VUIGN5Y2xpbmdcXG4rICogb24gYSBkZWRpY2F0ZWQgbmVpZ2hib3IgcmVnaW9uIChzd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybjsgc2tpcHBlZFxcbisgKiB3aXRoIGEgbm90ZSB3aGVuIHRoZSBob3N0IGhhcyBubyBzd2FwKSBhbmQgYSBjb21wYWN0X21lbW9yeSB0cmlnZ2VyXFxuKyAqIGxvb3AgKGNvbXBhY3Rpb24gbWlncmF0ZXMgc291cmNlIGZvbGlvcywgcmFjaW5nIGNvbGxhcHNlJ3MgZnJlZXplXFxuKyAqIHdpdGggcmVmY291bnQgZWxldmF0aW9uIGFuZCBtaWdyYXRpb24gZW50cmllcyBvZiBpdHMgb3duKS5cXG4rICpcXG4rICogQ29ycmVjdG5lc3Mgc2lnbmFsczogZXZlcnkgcmFjaW5nIHBhZ2UgbXVzdCByZWFkIGFzIGl0cyBwYXR0ZXJuIG9yXFxuKyAqIHplcm8gKE1BRFZfRE9OVE5FRUQpLCBuZXZlciBhbnl0aGluZyBlbHNlIOKAlCBjaGVja2VkIGNvbnRpbnVvdXNseSBieVxcbisgKiB0aGUgZmF1bHRlcnMgYW5kIHRoZSBmb3JrIGNoaWxkcmVuIGFuZCBvbmNlIGF0IHRoZSBlbmQg4oCUIHBsdXNcXG4rICogd2hhdGV2ZXIgREVCVUdfVk0gLyBwYWdlX3RhYmxlX2NoZWNrIC8gS0FTQU4gLyBsb2NrZGVwIHJlcG9ydCBpblxcbisgKiBkbWVzZywgd2hpY2ggdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBpbnNwZWN0LlxcbisgKi9cXG4rI2RlZmluZSBfR05VX1NPVVJDRVxcbisjaW5jbHVkZSBcXHUwMDNjZXJybm8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2ZjbnRsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NwdGhyZWFkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRpby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkbGliLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdHJpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9pb2N0bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL21tYW4uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy90aW1lLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvd2FpdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdW5pc3RkLmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwia3NlbGZ0ZXN0LmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJ2bV91dGlsLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJodWdlcGFnZV9zZXR0aW5ncy5oXFxcIlxcbisjaW5jbHVkZSBcXFwiLi4vLi4vLi4vLi4vbW0vZ3VwX3Rlc3QuaFxcXCJcXG4rXFxuKyNkZWZpbmUgQkFTRV9BRERSXFx0KCh2b2lkICopKDFVTCBcXHUwMDNjXFx1MDAzYyAzMCkpXFxuKy8qXFxuKyAqIFNoYXJlZCBwbGF5Z3JvdW5kIGZvciBmYXVsdHMvcGlucy9mb3JrL2RvbnRuZWVkOiBzZXZlcmFsIFBNRC1zaXplZFxcbisgKiBhcmVhcyB0aGUgcmFjaW5nIHRocmVhZHMgc3ByZWFkIGFjcm9zcywgcGx1cyBvbmUgYXJlYSBvd25lZCBieSB0aGVcXG4rICogbXJlbWFwIHRocmVhZC4gTW9yZSBhcmVhcyBtZWFucyBtb3JlIGluZGVwZW5kZW50IHJlZ2lvbnMgY29sbGFwc2luZ1xcbisgKiBhdCBvbmNlOyB0aGUgZGVmYXVsdCBzdWl0cyBhIG5vcm1hbCBtYWNoaW5lLiBPbiBhIG1lbW9yeS1jb25zdHJhaW5lZFxcbisgKiBob3N0IC0tIG9yIHVuZGVyIGVtdWxhdGlvbiwgd2hlcmUgYSA1MTJNIFBNRCAoYXJtNjQvNjRLKSBtYWtlcyB0aGVcXG4rICogZGVmYXVsdCBwbGF5Z3JvdW5kIG11bHRpLWdpZ2FieXRlIC0tIHBhc3MgLWEgdG8gc2hyaW5rIGl0LlxcbisgKi9cXG4rI2RlZmluZSBERUZBVUxUX1NIQVJFRF9BUkVBU1xcdDNcXG4rc3RhdGljIGludCBucl9zaGFyZWRfYXJlYXM7XFxuK3N0YXRpYyBpbnQgbnJfYXJlYXM7XFxuK1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplO1xcbitzdGF0aWMgY2hhciAqcmVnaW9uO1xcdFxcdC8qIE5SX0FSRUFTICogaHBhZ2VfcG1kX3NpemUgKi9cXG4rc3RhdGljIGNoYXIgKm1yZW1hcF9hcmVhO1xcdC8qIHJlZ2lvbiArIE5SX1NIQVJFRF9BUkVBUyBhcmVhcyAqL1xcbitzdGF0aWMgY2hhciAqbXJlbWFwX3NjcmF0Y2g7XFx0Lyogd2VsbCBhYm92ZSB0aGUgcmVnaW9uICovXFxuK3N0YXRpYyBjaGFyICpwYWdlb3V0X2FyZWE7XFx0LyogLXA6IGRlZGljYXRlZCBwcmVzc3VyZSByZWdpb24gKi9cXG4rc3RhdGljIHNpemVfdCBwYWdlb3V0X3NpemU7XFxuK3N0YXRpYyBpbnQgZ3VwX2ZkID0gLTE7XFxuK3N0YXRpYyB2b2xhdGlsZSBpbnQgc3RvcDtcXG4rc3RhdGljIHZvbGF0aWxlIGludCBjb3JydXB0ZWQ7XFxuK1xcbitzdGF0aWMgdW5zaWduZWQgaW50IHBhdHRlcm4odW5zaWduZWQgbG9uZyBwYWdlX2lkeClcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgdmFsID0gKHVuc2lnbmVkIGludClwYWdlX2lkeCAqIDI2NTQ0MzU3NjFVO1xcbitcXG4rXFx0cmV0dXJuIHZhbCA/IHZhbCA6IDE7XFx0LyogbmV2ZXIgY29sbGlkZXMgd2l0aCB0aGUgemVyby1maWxsICovXFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNoZWNrX3BhZ2UodW5zaWduZWQgbG9uZyBwYWdlX2lkeClcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKikocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUpO1xcbitcXG4rXFx0aWYgKHZhbCBcXHUwMDI2XFx1MDAyNiB2YWwgIT0gcGF0dGVybihwYWdlX2lkeCkpIHtcXG4rXFx0XFx0Y29ycnVwdGVkID0gMTtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIkNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgICAgICBwYWdlX2lkeCwgdmFsLCBwYXR0ZXJuKHBhZ2VfaWR4KSk7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZF9wYWdlKHVuc2lnbmVkIGludCAqc2VlZClcXG4re1xcbitcXHRyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcmFuZF9yKHNlZWQpICVcXG4rXFx0ICAgICAgIChucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkICpmYXVsdGVyX2ZuKHZvaWQgKmFyZylcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcXG4rXFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFxcdTAwMjZzZWVkKTtcXG4rXFxuK1xcdFxcdGlmIChyYW5kX3IoXFx1MDAyNnNlZWQpIFxcdTAwMjYgMSlcXG4rXFx0XFx0XFx0Kih1bnNpZ25lZCBpbnQgKikocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUpID1cXG4rXFx0XFx0XFx0XFx0cGF0dGVybihwYWdlX2lkeCk7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0Y2hlY2tfcGFnZShwYWdlX2lkeCk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkICpkb250bmVlZF9mbih2b2lkICphcmcpXFxuK3tcXG4rXFx0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XFxuK1xcbitcXHR3aGlsZSAoIXN0b3ApIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcXHUwMDI2c2VlZCk7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgbnIgPSAxVUwgXFx1MDAzY1xcdTAwM2MgKHJhbmRfcihcXHUwMDI2c2VlZCkgJSA2KTtcXHQvKiAxLi4zMiBwYWdlcyAqL1xcbitcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogT25jZSBpbiBhIHdoaWxlIHphcCBhIHdob2xlIFBNRC1hbGlnbmVkIGFyZWE6IG9ubHkgYVxcbitcXHRcXHQgKiB6YXAgc3Bhbm5pbmcgdGhlIGZ1bGwgdGFibGUgdHJpZ2dlcnMgdGhlIGVtcHR5LXRhYmxlXFxuK1xcdFxcdCAqIHJlY2xhaW0gKENPTkZJR19QVF9SRUNMQUlNKSwgd2hpY2ggY2FuIGZyZWUgYSB0YWJsZVxcbitcXHRcXHQgKiBvdXQgZnJvbSB1bmRlciBhIHBhcmtlZCBjb2xsYXBzZSDigJQgc3ViLXRhYmxlIHphcHNcXG4rXFx0XFx0ICogbmV2ZXIgcmVhY2ggdGhhdCBwYXRoLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKCEocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDY0KSkge1xcbitcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGFyZWEgPSBwYWdlX2lkeCAvXFxuK1xcdFxcdFxcdFxcdFxcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSk7XFxuK1xcbitcXHRcXHRcXHRtYWR2aXNlKHJlZ2lvbiArIGFyZWEgKiBocGFnZV9wbWRfc2l6ZSxcXG4rXFx0XFx0XFx0XFx0aHBhZ2VfcG1kX3NpemUsIE1BRFZfRE9OVE5FRUQpO1xcbitcXHRcXHR9IGVsc2Uge1xcbitcXHRcXHRcXHRtYWR2aXNlKHJlZ2lvbiArIHBhZ2VfaWR4ICogcGFnZV9zaXplLFxcbitcXHRcXHRcXHRcXHRuciAqIHBhZ2Vfc2l6ZSwgTUFEVl9ET05UTkVFRCk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0dXNsZWVwKHJhbmRfcihcXHUwMDI2c2VlZCkgJSA1MDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCAqcGlubmVyX2ZuKHZvaWQgKmFyZylcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcXG4rXFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHRzdHJ1Y3QgZ3VwX3Rlc3QgZ3VwID0ge307XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXFx1MDAyNnNlZWQpO1xcbitcXG4rXFx0XFx0Z3VwLmFkZHIgPSAodW5zaWduZWQgbG9uZykocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUpO1xcbitcXHRcXHRndXAuc2l6ZSA9IDE2ICogcGFnZV9zaXplO1xcbitcXHRcXHRndXAubnJfcGFnZXNfcGVyX2NhbGwgPSAxNjtcXG4rXFx0XFx0Z3VwLmd1cF9mbGFncyA9IDE7XFx0LyogRk9MTF9XUklURSAqL1xcbitcXHRcXHQvKiBSYWNpbmcgTUFEVl9ET05UTkVFRCBtYWtlcyB0cmFuc2llbnQgZmFpbHVyZXMgZXhwZWN0ZWQuICovXFxuK1xcdFxcdGlvY3RsKGd1cF9mZCwgUElOX0ZBU1RfQkVOQ0hNQVJLLCBcXHUwMDI2Z3VwKTtcXG4rXFx0XFx0dXNsZWVwKHJhbmRfcihcXHUwMDI2c2VlZCkgJSAyMDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCAqZm9ya2VyX2ZuKHZvaWQgKmFyZylcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcXG4rXFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHRwaWRfdCBwaWQgPSBmb3JrKCk7XFxuK1xcbitcXHRcXHRpZiAocGlkID09IDApIHtcXG4rXFx0XFx0XFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyAxNjsgaSsrKVxcbitcXHRcXHRcXHRcXHRjaGVja19wYWdlKHJhbmRfcGFnZShcXHUwMDI2c2VlZCkpO1xcbitcXHRcXHRcXHRfZXhpdChjb3JydXB0ZWQpO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChwaWQgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdFxcdGludCB3c3RhdHVzO1xcbitcXG4rXFx0XFx0XFx0d2FpdHBpZChwaWQsIFxcdTAwMjZ3c3RhdHVzLCAwKTtcXG4rXFx0XFx0XFx0aWYgKFdJRkVYSVRFRCh3c3RhdHVzKSBcXHUwMDI2XFx1MDAyNiBXRVhJVFNUQVRVUyh3c3RhdHVzKSlcXG4rXFx0XFx0XFx0XFx0Y29ycnVwdGVkID0gMTtcXG4rXFx0XFx0fVxcbitcXHRcXHR1c2xlZXAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDIwMDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCAqbXJlbWFwcGVyX2ZuKHZvaWQgKmFyZylcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcXG4rXFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHR2b2lkICpwO1xcbitcXG4rXFx0XFx0cCA9IG1yZW1hcChtcmVtYXBfYXJlYSwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHRcXHQgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX3NjcmF0Y2gpO1xcbitcXHRcXHRpZiAocCA9PSBNQVBfRkFJTEVEKVxcbitcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1yZW1hcCgpIGF3YXlcXFwiKTtcXG4rXFx0XFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyA4OyBpKyspXFxuK1xcdFxcdFxcdG1yZW1hcF9zY3JhdGNoWyhyYW5kX3IoXFx1MDAyNnNlZWQpICVcXG4rXFx0XFx0XFx0XFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSkgKiBwYWdlX3NpemVdID0gMTtcXG4rXFx0XFx0cCA9IG1yZW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHRcXHQgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX2FyZWEpO1xcbitcXHRcXHRpZiAocCA9PSBNQVBfRkFJTEVEKVxcbitcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1yZW1hcCgpIGJhY2tcXFwiKTtcXG4rXFx0XFx0dXNsZWVwKHJhbmRfcihcXHUwMDI2c2VlZCkgJSAyMDAwKTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rLypcXG4rICogLXA6IHN3YXAgdHJhZmZpYyBhbmQgTFJVIGNodXJuIG9uIGEgcmVnaW9uIG9mIG91ciBvd24uIFRoZSBjb250ZW50XFxuKyAqIGNoZWNrIGlzIGV4YWN0IOKAlCBhIHBhZ2Ugb3V0IGFuZCBiYWNrIHRocm91Z2ggc3dhcCBtdXN0IHByZXNlcnZlIHRoZVxcbisgKiBwYXR0ZXJuLCBhbmQgbm90aGluZyBlbHNlIGV2ZXIgd3JpdGVzIGhlcmUuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCAqcGFnZW91dF9mbih2b2lkICphcmcpXFxuK3tcXG4rXFx0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XFxuK1xcdHVuc2lnbmVkIGxvbmcgbnIgPSBwYWdlb3V0X3NpemUgLyBwYWdlX3NpemU7XFxuK1xcdHVuc2lnbmVkIGxvbmcgaTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucjsgaSsrKVxcbitcXHRcXHQqKHVuc2lnbmVkIGludCAqKShwYWdlb3V0X2FyZWEgKyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XFxuK1xcbitcXHR3aGlsZSAoIXN0b3ApIHtcXG4rXFx0XFx0bWFkdmlzZShwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSwgTUFEVl9QQUdFT1VUKTtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yIFxcdTAwMjZcXHUwMDI2ICFzdG9wOyBpKyspIHtcXG4rXFx0XFx0XFx0dW5zaWduZWQgaW50IHZhbCA9ICoodW5zaWduZWQgaW50ICopKHBhZ2VvdXRfYXJlYSArXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgaSAqIHBhZ2Vfc2l6ZSk7XFxuK1xcbitcXHRcXHRcXHRpZiAodmFsICE9IHBhdHRlcm4oaSkpIHtcXG4rXFx0XFx0XFx0XFx0Y29ycnVwdGVkID0gMTtcXG4rXFx0XFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIlBhZ2VvdXQgY29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbitcXHRcXHR1c2xlZXAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDIwMDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbisvKiAtcDogY29tcGFjdGlvbiBtaWdyYXRlcyB0aGUgY29sbGFwc2Ugc291cmNlcyBvdXQgZnJvbSB1bmRlciB1cy4gKi9cXG4rc3RhdGljIHZvaWQgKmNvbXBhY3Rvcl9mbih2b2lkICphcmcpXFxuK3tcXG4rXFx0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XFxuK1xcdGludCBmZCA9IG9wZW4oXFxcIi9wcm9jL3N5cy92bS9jb21wYWN0X21lbW9yeVxcXCIsIE9fV1JPTkxZKTtcXG4rXFxuK1xcdGlmIChmZCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIk5vIGNvbXBhY3RfbWVtb3J5OyBjb21wYWN0b3IgaWRsZVxcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXHR9XFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHRpZiAod3JpdGUoZmQsIFxcXCIxXFxcIiwgMSkgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0dXNsZWVwKDEwMDAwICsgcmFuZF9yKFxcdTAwMjZzZWVkKSAlIDEwMDAwMCk7XFxuK1xcdH1cXG4rXFx0Y2xvc2UoZmQpO1xcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgc3dhcF9hdmFpbGFibGUodm9pZClcXG4re1xcbitcXHRjaGFyIGxpbmVbMjU2XTtcXG4rXFx0aW50IGxpbmVzID0gMDtcXG4rXFx0RklMRSAqZnAgPSBmb3BlbihcXFwiL3Byb2Mvc3dhcHNcXFwiLCBcXFwiclxcXCIpO1xcbitcXG4rXFx0aWYgKCFmcClcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpXFxuK1xcdFxcdGxpbmVzKys7XFxuK1xcdGZjbG9zZShmcCk7XFxuK1xcdHJldHVybiBsaW5lcyBcXHUwMDNlIDE7XFxuK31cXG4rXFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5vd19tcyh2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCB0aW1ldmFsIHR2O1xcbitcXG4rXFx0Z2V0dGltZW9mZGF5KFxcdTAwMjZ0diwgTlVMTCk7XFxuK1xcdHJldHVybiB0di50dl9zZWMgKiAxMDAwVUwgKyB0di50dl91c2VjIC8gMTAwMDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcXG4re1xcbitcXHRmcHJpbnRmKHN0ZGVycixcXG4rXFx0XFx0XFxcIlVzYWdlOiBraHVnZXBhZ2VkX3JhY2UgWy1kIHNlY29uZHNdIFstbSBzdGVwcGVkfGZyZWV8bWFkdmlzZV0gWy16XSBbLXBdIFstYSBhcmVhc11cXFxcblxcXCJcXG4rXFx0XFx0XFxcIlxcXFx0LXo6IHBlcm1pc3NpdmUgbWF4X3B0ZXNfbm9uZSAoaG9sZS1oZWF2eSB3aW5kb3dzKVxcXFxuXFxcIlxcbitcXHRcXHRcXFwiXFxcXHQtcDogbWVtb3J5IHByZXNzdXJlIChwYWdlb3V0ICsgY29tcGFjdGlvbikgdGhyZWFkc1xcXFxuXFxcIlxcbitcXHRcXHRcXFwiXFxcXHQtYTogbnVtYmVyIG9mIHNoYXJlZCBQTUQtc2l6ZWQgcGxheWdyb3VuZCBhcmVhcyAoZGVmYXVsdCAzKVxcXFxuXFxcIik7XFxuK1xcdGV4aXQoMSk7XFxuK31cXG4rXFxuK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4re1xcbitcXHRzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRocmVhZF9uYW1lc1tdID0ge1xcbitcXHRcXHRcXFwiZmF1bHRlclxcXCIsIFxcXCJmYXVsdGVyMlxcXCIsIFxcXCJkb250bmVlZFxcXCIsIFxcXCJwaW5uZXJcXFwiLCBcXFwiZm9ya2VyXFxcIixcXG4rXFx0XFx0XFxcIm1yZW1hcHBlclxcXCIsIFxcXCJwYWdlb3V0XFxcIiwgXFxcImNvbXBhY3RvclxcXCIsXFxuK1xcdH07XFxuK1xcdHZvaWQgKigqY29uc3QgdGhyZWFkX2Zuc1tdKSh2b2lkICopID0ge1xcbitcXHRcXHRmYXVsdGVyX2ZuLCBmYXVsdGVyX2ZuLCBkb250bmVlZF9mbiwgcGlubmVyX2ZuLCBmb3JrZXJfZm4sXFxuK1xcdFxcdG1yZW1hcHBlcl9mbiwgcGFnZW91dF9mbiwgY29tcGFjdG9yX2ZuLFxcbitcXHR9O1xcbitcXHRjb25zdCB1bnNpZ25lZCBsb25nIHBhZ2VvdXRfYml0ID0gMVVMIFxcdTAwM2NcXHUwMDNjIDYsIGNvbXBhY3Rvcl9iaXQgPSAxVUwgXFx1MDAzY1xcdTAwM2MgNztcXG4rXFx0Y29uc3QgaW50IG5yX3RocmVhZHMgPSBBUlJBWV9TSVpFKHRocmVhZF9uYW1lcyk7XFxuK1xcdHB0aHJlYWRfdCB0aHJlYWRzW0FSUkFZX1NJWkUodGhyZWFkX25hbWVzKV07XFxuK1xcdGNvbnN0IGNoYXIgKm1vZGUgPSBcXFwic3RlcHBlZFxcXCI7XFxuK1xcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZW5kX21zO1xcbitcXHRpbnQgZHVyYXRpb25fcyA9IDEwO1xcbitcXHR1bnNpZ25lZCBsb25nIHRocmVhZF9tYXNrID0gfjBVTDtcXG4rXFx0aW50IG5yX2FyZWFzX2FyZyA9IDA7XFxuK1xcdGJvb2wgcGVybWlzc2l2ZV9ub25lID0gZmFsc2U7XFxuK1xcdGJvb2wgcHJlc3N1cmUgPSBmYWxzZTtcXG4rXFx0dW5zaWduZWQgbG9uZyBpO1xcbitcXHRpbnQgc3RlcHMgPSAwO1xcbitcXHRpbnQgb3B0O1xcbitcXG4rXFx0d2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgXFxcImE6ZDptOnQ6enBoXFxcIikpICE9IC0xKSB7XFxuK1xcdFxcdHN3aXRjaCAob3B0KSB7XFxuK1xcdFxcdGNhc2UgJ2EnOlxcbitcXHRcXHRcXHRucl9hcmVhc19hcmcgPSBhdG9pKG9wdGFyZyk7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlICdkJzpcXG4rXFx0XFx0XFx0ZHVyYXRpb25fcyA9IGF0b2kob3B0YXJnKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgJ20nOlxcbitcXHRcXHRcXHRtb2RlID0gb3B0YXJnO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSAndCc6XFxuK1xcdFxcdFxcdC8qIGRlYnVnOiBiaXRtYXNrIG9mIHJhY2luZyB0aHJlYWRzIHRvIHN0YXJ0ICovXFxuK1xcdFxcdFxcdHRocmVhZF9tYXNrID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDApO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSAneic6XFxuK1xcdFxcdFxcdHBlcm1pc3NpdmVfbm9uZSA9IHRydWU7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlICdwJzpcXG4rXFx0XFx0XFx0cHJlc3N1cmUgPSB0cnVlO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0ZGVmYXVsdDpcXG4rXFx0XFx0XFx0dXNhZ2UoKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdGlmIChzdHJjbXAobW9kZSwgXFxcInN0ZXBwZWRcXFwiKSBcXHUwMDI2XFx1MDAyNiBzdHJjbXAobW9kZSwgXFxcImZyZWVcXFwiKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgc3RyY21wKG1vZGUsIFxcXCJtYWR2aXNlXFxcIikpXFxuK1xcdFxcdHVzYWdlKCk7XFxuK1xcbitcXHRrc2Z0X3ByaW50X2hlYWRlcigpO1xcbitcXHRpZiAoIXRocF9hdmFpbGFibGUoKSlcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxcXG5cXFwiKTtcXG4rXFxuK1xcdHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7XFxuK1xcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcXG4rXFx0aWYgKCFocGFnZV9wbWRfc2l6ZSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcXFxcblxcXCIpO1xcbitcXG4rXFx0Z3VwX2ZkID0gb3BlbihcXFwiL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3RcXFwiLCBPX1JEV1IpO1xcbitcXHRpZiAoZ3VwX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIi9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IHJlcXVpcmVzIENPTkZJR19HVVBfVEVTVCBhbmQgcm9vdFxcXFxuXFxcIik7XFxuK1xcbitcXHRucl9zaGFyZWRfYXJlYXMgPSBucl9hcmVhc19hcmcgXFx1MDAzZSAwID8gbnJfYXJlYXNfYXJnIDogREVGQVVMVF9TSEFSRURfQVJFQVM7XFxuK1xcdG5yX2FyZWFzID0gbnJfc2hhcmVkX2FyZWFzICsgMTtcXG4rXFxuK1xcdGlmICghcHJlc3N1cmUpIHtcXG4rXFx0XFx0dGhyZWFkX21hc2sgXFx1MDAyNj0gfihwYWdlb3V0X2JpdCB8IGNvbXBhY3Rvcl9iaXQpO1xcbitcXHR9IGVsc2UgaWYgKCFzd2FwX2F2YWlsYWJsZSgpKSB7XFxuK1xcdFxcdC8qIE5vIHN3YXAsIG5vIGFub24gcmVjbGFpbTogY29tcGFjdGlvbi1vbmx5IHByZXNzdXJlLiAqL1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiLXAgd2l0aG91dCBzd2FwOiBwYWdlb3V0IHRocmVhZCBkaXNhYmxlZFxcXFxuXFxcIik7XFxuK1xcdFxcdHRocmVhZF9tYXNrIFxcdTAwMjY9IH5wYWdlb3V0X2JpdDtcXG4rXFx0fVxcbitcXG4rXFx0a3NmdF9zZXRfcGxhbigxKTtcXG4rXFxuK1xcdHRocF9zYXZlX3NldHRpbmdzKCk7XFxuK1xcdHRocF9yZWFkX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK1xcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7XFxuK1xcdHNldHRpbmdzLnRocF9kZWZyYWcgPSBUSFBfREVGUkFHX0FMV0FZUztcXG4rXFx0c2V0dGluZ3Muc2htZW1fZW5hYmxlZCA9IFNITUVNX05FVkVSO1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7XFxuK1xcdHNldHRpbmdzLmtodWdlcGFnZWQuc2Nhbl9zbGVlcF9taWxsaXNlY3MgPVxcbitcXHRcXHRzdHJjbXAobW9kZSwgXFxcImZyZWVcXFwiKSA/IDEwMDAgOiAwO1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmFsbG9jX3NsZWVwX21pbGxpc2VjcyA9IDEwO1xcbitcXHQvKlxcbitcXHQgKiBtVEhQIGNvbGxhcHNlIG9ubHkgc3VwcG9ydHMgdGhlIHR3byBlbmRzIG9mIHRoZSBvY2N1cGFuY3lcXG4rXFx0ICogc2NhbGU6IDAgb3IgSFBBR0VfUE1EX05SIC0gMSAoYW55dGhpbmcgZWxzZSBjb2VyY2VzIHRvIDApLlxcbitcXHQgKiBTdHJpY3QgaXMgdGhlIGRlZmF1bHQg4oCUIGl0IGFsc28ga2VlcHMga2h1Z2VwYWdlZCBmcm9tIGJ1cm5pbmdcXG4rXFx0ICogdGhlIHdob2xlIHN0ZXAgaW4gZG9vbWVkIFBNRC1zaXplZCBhbGxvY2F0aW9ucyBvbiA1MTJNLVBNRFxcbitcXHQgKiBjb25maWdzLCB3aGVyZSBhIGZ1bGx5IHBvcHVsYXRlZCBhcmVhIGlzIHJhcmUgdW5kZXIgcmFjaW5nXFxuK1xcdCAqIE1BRFZfRE9OVE5FRUQuIC16IHNlbGVjdHMgdGhlIHBlcm1pc3NpdmUgZW5kOiBzZWxlY3Rpb24gdGhlblxcbitcXHQgKiBlbWl0cyBob2xlLWhlYXZ5IHdpbmRvd3MgYW5kIHRoZSBlbmdpbmUncyBwb3B1bGF0aW9uIHBhdGhzXFxuK1xcdCAqIHRha2UgdGhlIGJydW50IG9mIHRoZSByYWNpbmcgZmF1bHRzIGFuZCB6YXBzLlxcbitcXHQgKi9cXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gcGVybWlzc2l2ZV9ub25lID9cXG4rXFx0XFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSAtIDEgOiAwO1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPVxcbitcXHRcXHRucl9hcmVhcyAqIChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgKiA4O1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgTlJfT1JERVJTOyBpKyspIHtcXG4rXFx0XFx0aWYgKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIGkpKVxcbitcXHRcXHRcXHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xcbitcXHR9XFxuK1xcdC8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZC4gKi9cXG4rXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFxuK1xcdHJlZ2lvbiA9IG1tYXAoQkFTRV9BRERSLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHQgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsXFxuK1xcdFxcdCAgICAgIC0xLCAwKTtcXG4rXFx0aWYgKHJlZ2lvbiAhPSBCQVNFX0FERFIpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiRmFpbGVkIHRvIGFsbG9jYXRlIFZNQSBhdCAlcFxcXFxuXFxcIiwgQkFTRV9BRERSKTtcXG4rXFx0bXJlbWFwX2FyZWEgPSByZWdpb24gKyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTtcXG4rXFx0bXJlbWFwX3NjcmF0Y2ggPSAoY2hhciAqKUJBU0VfQUREUiArIDIgKiBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplO1xcbitcXG4rXFx0aWYgKHRocmVhZF9tYXNrIFxcdTAwMjYgcGFnZW91dF9iaXQpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogQmlnIGVub3VnaCB0byBjeWNsZSByZWFsIHJlY2xhaW0sIHNtYWxsIGVub3VnaCBub3QgdG9cXG4rXFx0XFx0ICogZG9taW5hdGUgYSBUQ0cgZ3Vlc3Q6IDQgUE1EIGFyZWFzLCBjbGFtcGVkIHRvIFsxNk0sIDY0TV0uXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRwYWdlb3V0X3NpemUgPSA0ICogaHBhZ2VfcG1kX3NpemU7XFxuK1xcdFxcdHBhZ2VvdXRfc2l6ZSA9IHBhZ2VvdXRfc2l6ZSBcXHUwMDNjICgxNlVMIFxcdTAwM2NcXHUwMDNjIDIwKSA/ICgxNlVMIFxcdTAwM2NcXHUwMDNjIDIwKSA6XFxuK1xcdFxcdFxcdCAgICAgICBwYWdlb3V0X3NpemUgXFx1MDAzZSAoNjRVTCBcXHUwMDNjXFx1MDAzYyAyMCkgPyAoNjRVTCBcXHUwMDNjXFx1MDAzYyAyMCkgOlxcbitcXHRcXHRcXHQgICAgICAgcGFnZW91dF9zaXplO1xcbitcXHRcXHRwYWdlb3V0X2FyZWEgPSBtbWFwKE5VTEwsIHBhZ2VvdXRfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcXG4rXFx0XFx0XFx0XFx0ICAgIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSwgLTEsIDApO1xcbitcXHRcXHRpZiAocGFnZW91dF9hcmVhID09IE1BUF9GQUlMRUQpXFxuK1xcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibW1hcCgpIHBhZ2VvdXQgYXJlYVxcXCIpO1xcbitcXHR9XFxuK1xcbitcXHQvKiBQb3B1bGF0ZSBzbyB0aGUgZmlyc3QgcGFzcyBoYXMgc29tZXRoaW5nIHRvIGNvbGxhcHNlLiAqL1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkrKylcXG4rXFx0XFx0Kih1bnNpZ25lZCBpbnQgKikocmVnaW9uICsgaSAqIHBhZ2Vfc2l6ZSkgPSBwYXR0ZXJuKGkpO1xcbitcXHRtZW1zZXQobXJlbWFwX2FyZWEsIDEsIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0bWFkdmlzZShyZWdpb24sIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX3RocmVhZHM7IGkrKykge1xcbitcXHRcXHRpZiAoISh0aHJlYWRfbWFzayBcXHUwMDI2ICgxVUwgXFx1MDAzY1xcdTAwM2MgaSkpKSB7XFxuK1xcdFxcdFxcdHRocmVhZHNbaV0gPSAwO1xcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAocHRocmVhZF9jcmVhdGUoXFx1MDAyNnRocmVhZHNbaV0sIE5VTEwsIHRocmVhZF9mbnNbaV0sXFxuK1xcdFxcdFxcdFxcdCAgICh2b2lkICopKGkgKyAxKSkpXFxuK1xcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwicHRocmVhZF9jcmVhdGUoKVxcXCIpO1xcbitcXHR9XFxuK1xcbitcXHRlbmRfbXMgPSBub3dfbXMoKSArIGR1cmF0aW9uX3MgKiAxMDAwVUw7XFxuK1xcdGlmICghc3RyY21wKG1vZGUsIFxcXCJzdGVwcGVkXFxcIikpIHtcXG4rXFx0XFx0d2hpbGUgKG5vd19tcygpIFxcdTAwM2MgZW5kX21zIFxcdTAwMjZcXHUwMDI2ICFjb3JydXB0ZWQpIHtcXG4rXFx0XFx0XFx0aWYgKCFraHVnZXBhZ2VkX2Z1bGxfcGFzcyg2MDApKVxcbitcXHRcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcImtodWdlcGFnZWQgcGFzcyB0aW1lZCBvdXRcXFxcblxcXCIpO1xcbitcXHRcXHRcXHRzdGVwcysrO1xcbitcXHRcXHR9XFxuK1xcdH0gZWxzZSBpZiAoIXN0cmNtcChtb2RlLCBcXFwiZnJlZVxcXCIpKSB7XFxuK1xcdFxcdHdoaWxlIChub3dfbXMoKSBcXHUwMDNjIGVuZF9tcyBcXHUwMDI2XFx1MDAyNiAhY29ycnVwdGVkKVxcbitcXHRcXHRcXHR1c2xlZXAoMTAwICogMTAwMCk7XFxuK1xcdH0gZWxzZSB7XFx0LyogbWFkdmlzZSAqL1xcbitcXHRcXHR3aGlsZSAobm93X21zKCkgXFx1MDAzYyBlbmRfbXMgXFx1MDAyNlxcdTAwMjYgIWNvcnJ1cHRlZCkge1xcbitcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfc2hhcmVkX2FyZWFzOyBpKyspIHtcXG4rXFx0XFx0XFx0XFx0bWFkdmlzZShyZWdpb24gKyBpICogaHBhZ2VfcG1kX3NpemUsXFxuK1xcdFxcdFxcdFxcdFxcdGhwYWdlX3BtZF9zaXplLCBNQURWX0NPTExBUFNFKTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRtYWR2aXNlKHJlZ2lvbiwgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsXFxuK1xcdFxcdFxcdFxcdE1BRFZfRE9OVE5FRUQpO1xcbitcXHRcXHRcXHRzdGVwcysrO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHN0b3AgPSAxO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfdGhyZWFkczsgaSsrKSB7XFxuK1xcdFxcdGlmICh0aHJlYWRzW2ldKVxcbitcXHRcXHRcXHRwdGhyZWFkX2pvaW4odGhyZWFkc1tpXSwgTlVMTCk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIEZpbmFsIGludGVncml0eSBzd2VlcC4gKi9cXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOyBpKyspXFxuK1xcdFxcdGNoZWNrX3BhZ2UoaSk7XFxuK1xcbitcXHR0aHBfcmVzdG9yZV9zZXR0aW5ncygpO1xcbitcXG4rXFx0a3NmdF90ZXN0X3Jlc3VsdCghY29ycnVwdGVkLCBcXFwiJXM6ICVkcywgJWQgc3RlcHMsIG5vIGNvcnJ1cHRpb25cXFxcblxcXCIsXFxuK1xcdFxcdFxcdCBtb2RlLCBkdXJhdGlvbl9zLCBzdGVwcyk7XFxuK1xcdGtzZnRfZmluaXNoZWQoKTtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi4xMzIxNWNiMzcwY2ViXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jXFxuQEAgLTAsMCArMSwxOTggQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLypcXG4rICogU3luY2hyb25vdXMga2h1Z2VwYWdlZCBkcml2aW5nIGNoZWNrLlxcbisgKlxcbisgKiBSYWNlIHRlc3RzIGRyaXZlIGtodWdlcGFnZWQgdGhyb3VnaCB0aGUgZXhpc3Rpbmcgc3lzZnMgY29udHJvbHM6IGFcXG4rICogc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgYW5kIGZ1bGxfc2NhbnNcXG4rICogYWR2YW5jaW5nIGJ5IHR3byBpcyBhIGNvbXBsZXRpb24gYmFycmllciBmb3Igb25lIGZ1bGwgcGFzcyB0aGF0XFxuKyAqIHN0YXJ0ZWQgYWZ0ZXIgc2V0dXAgKGtodWdlcGFnZWRfZnVsbF9wYXNzKCkpLiBWZXJpZnkgdGhlIHBhaXIgZ2l2ZXNcXG4rICogZGV0ZXJtaW5pc3RpYywgYXR0cmlidXRhYmxlIHJlc3VsdHM6IG9uZSBiYXJyaWVyIHN0ZXAgb3ZlciBvbmVcXG4rICogcHJlcGFyZWQgd2luZG93IHByb2R1Y2VzIGV4YWN0bHkgb25lIGNvbGxhcHNlIGF0dGVtcHQgb24gdGhhdFxcbisgKiB3aW5kb3cncyBzb3VyY2UgcGFnZXMg4oCUIG1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlIGV2ZW50c1xcbisgKiBmaWx0ZXJlZCBieSBzb3VyY2UgUEZOIGFuZCBvcmRlciDigJQgYW5kIHRoZSB3aW5kb3cgaXMgY29sbGFwc2VkXFxuKyAqIGFmdGVyd2FyZHMsIHJlcGVhdGFibHkuXFxuKyAqXFxuKyAqIHNjYW5fc2xlZXBfbWlsbGlzZWNzIGlzIHNldCB0byA2MHMgdG8gcHJvdmUgdGhlIHdha2UgcGF0aDogd2l0aG91dFxcbisgKiB0aGUgd2FrZSwgb25lIGJhcnJpZXIgc3RlcCB3b3VsZCBzbGVlcCBtdWx0aXBsZXMgb2YgdGhhdCBhbmQgYmxvd1xcbisgKiB0aGUgdGltZW91dC4gSXQgYWxzbyBrZWVwcyB0aGUgZGFlbW9uIGZyb20gZnJlZS1ydW5uaW5nIGJldHdlZW5cXG4rICogc3RlcHMsIHBlciB0aGUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSBkaXNjaXBsaW5lLlxcbisgKi9cXG4rI2RlZmluZSBfR05VX1NPVVJDRVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0cmluZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL21tYW4uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3VuaXN0ZC5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcImtzZWxmdGVzdC5oXFxcIlxcbisjaW5jbHVkZSBcXFwidm1fdXRpbC5oXFxcIlxcbisjaW5jbHVkZSBcXFwiaHVnZXBhZ2Vfc2V0dGluZ3MuaFxcXCJcXG4rXFxuKyNkZWZpbmUgQkFTRV9BRERSICgodm9pZCAqKSgxVUwgXFx1MDAzY1xcdTAwM2MgMzApKVxcbisjZGVmaW5lIFRBUkdFVF9PUkRFUiAyXFx0Lyogc21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCBjb25zaWRlcnMgKi9cXG4rI2RlZmluZSBOUl9JVEVSQVRJT05TIDVcXG4rXFxuK3N0YXRpYyBpbnQgcGFnZW1hcF9mZDtcXG4rc3RhdGljIGludCBrcGFnZWZsYWdzX2ZkO1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcXG4rXFxuKy8qXFxuKyAqIENvdW50IGNvbGxhcHNlIGF0dGVtcHRzIGF0dHJpYnV0YWJsZSB0byBvdXIgd2luZG93OiBsZWdhY3ktZW5naW5lXFxuKyAqIGlzb2xhdGUgZXZlbnRzIHdob3NlIHNjYW5fcGZuIGlzIG9uZSBvZiB0aGUgd2luZG93J3Mgc291cmNlIFBGTnMsXFxuKyAqIHBsdXMgYmF0Y2gtZW5naW5lIHBlci1jYW5kaWRhdGUgaW5zdGFsbCBldmVudHMgYXQgdGhlIHdpbmRvdydzXFxuKyAqIGFkZHJlc3MuIEVpdGhlciBlbmdpbmUgcmVwb3J0cyBleGFjdGx5IG9uY2UgcGVyIGF0dGVtcHQuXFxuKyAqL1xcbitzdGF0aWMgaW50IGNvdW50X2F0dHJpYnV0ZWQodW5zaWduZWQgbG9uZyAqcGZucywgaW50IG5yX3BmbnMsXFxuK1xcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBvcmRlcilcXG4re1xcbitcXHRjaGFyIGxpbmVbMTAyNF07XFxuK1xcdGludCBjb3VudCA9IDA7XFxuK1xcdEZJTEUgKmZwO1xcbitcXG4rXFx0ZnAgPSB0cmFjaW5nX29wZW5fdHJhY2UoKTtcXG4rXFx0aWYgKCFmcClcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJDYW5ub3Qgb3BlbiB0cmFjZSBidWZmZXJcXFxcblxcXCIpO1xcbitcXG4rXFx0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKSB7XFxuK1xcdFxcdGNoYXIgKnM7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgdmFsO1xcbitcXHRcXHR1bnNpZ25lZCBpbnQgb3JkO1xcbitcXHRcXHRjaGFyICpvO1xcbitcXHRcXHRpbnQgaTtcXG4rXFxuK1xcdFxcdHMgPSBzdHJzdHIobGluZSwgXFxcIm1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOlxcXCIpO1xcbitcXHRcXHRpZiAocykge1xcbitcXHRcXHRcXHRpZiAoc3NjYW5mKHMsIFxcXCJtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTogc2Nhbl9wZm49MHglbHhcXFwiLFxcbitcXHRcXHRcXHRcXHQgICBcXHUwMDI2dmFsKSAhPSAxKVxcbitcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0XFx0byA9IHN0cnN0cihzLCBcXFwib3JkZXI9XFxcIik7XFxuK1xcdFxcdFxcdGlmICghbyB8fCBzc2NhbmYobywgXFxcIm9yZGVyPSV1XFxcIiwgXFx1MDAyNm9yZCkgIT0gMSB8fFxcbitcXHRcXHRcXHQgICAgb3JkICE9IG9yZGVyKVxcbitcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX3BmbnM7IGkrKykge1xcbitcXHRcXHRcXHRcXHRpZiAodmFsID09IHBmbnNbaV0pIHtcXG4rXFx0XFx0XFx0XFx0XFx0Y291bnQrKztcXG4rXFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdFxcdH1cXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0cyA9IHN0cnN0cihsaW5lLCBcXFwibW1fY29sbGFwc2VfY2FuZGlkYXRlOlxcXCIpO1xcbitcXHRcXHRpZiAocykge1xcbitcXHRcXHRcXHRpZiAoIXN0cnN0cihzLCBcXFwicGFzcz1pbnN0YWxsXFxcIikgfHxcXG4rXFx0XFx0XFx0ICAgICFzdHJzdHIocywgXFxcInJlc3VsdD1zdWNjZWVkZWRcXFwiKSlcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdG8gPSBzdHJzdHIocywgXFxcImFkZHI9XFxcIik7XFxuK1xcdFxcdFxcdGlmICghbyB8fCBzc2NhbmYobywgXFxcImFkZHI9MHglbHhcXFwiLCBcXHUwMDI2dmFsKSAhPSAxIHx8XFxuK1xcdFxcdFxcdCAgICB2YWwgIT0gYWRkcilcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdG8gPSBzdHJzdHIocywgXFxcIm9yZGVyPVxcXCIpO1xcbitcXHRcXHRcXHRpZiAoIW8gfHwgc3NjYW5mKG8sIFxcXCJvcmRlcj0ldVxcXCIsIFxcdTAwMjZvcmQpICE9IDEgfHxcXG4rXFx0XFx0XFx0ICAgIG9yZCAhPSBvcmRlcilcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdGNvdW50Kys7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXHRmY2xvc2UoZnApO1xcbitcXHRyZXR1cm4gY291bnQ7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIG9uZV9zdGVwKGludCBpdGVyYXRpb24pXFxuK3tcXG4rXFx0Y29uc3Qgc2l6ZV90IHdpbmRvdyA9IGdldHBhZ2VzaXplKCkgXFx1MDAzY1xcdTAwM2MgVEFSR0VUX09SREVSO1xcbitcXHRjb25zdCBpbnQgbnJfcGFnZXMgPSAxIFxcdTAwM2NcXHUwMDNjIFRBUkdFVF9PUkRFUjtcXG4rXFx0dW5zaWduZWQgbG9uZyBwZm5zWzEgXFx1MDAzY1xcdTAwM2MgVEFSR0VUX09SREVSXTtcXG4rXFx0Ym9vbCBjb2xsYXBzZWQ7XFxuK1xcdGludCBhdHRyaWJ1dGVkO1xcbitcXHRjaGFyICpwO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdHAgPSBtbWFwKEJBU0VfQUREUiwgaHBhZ2VfcG1kX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXFxuK1xcdFxcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTtcXG4rXFx0aWYgKHAgIT0gQkFTRV9BRERSKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIkZhaWxlZCB0byBhbGxvY2F0ZSBWTUEgYXQgJXBcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCAgIEJBU0VfQUREUik7XFxuK1xcbitcXHQvKiBQcmVwYXJlIG9uZSB3aW5kb3c7IHJlY29yZCBpdHMgc291cmNlIFBGTnMuICovXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XFxuK1xcdFxcdHBbaSAqIGdldHBhZ2VzaXplKCldID0gaSArIDE7XFxuK1xcdFxcdHBmbnNbaV0gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcCArIGkgKiBnZXRwYWdlc2l6ZSgpKTtcXG4rXFx0XFx0aWYgKHBmbnNbaV0gPT0gLTFVTClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJTb3VyY2UgcGFnZSBub3QgcHJlc2VudFxcXFxuXFxcIik7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICh0cmFjaW5nX2V2ZW50c19zdGFydChcXFwiaHVnZV9tZW1vcnlcXFwiKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJDYW5ub3QgZW5hYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xcXFxuXFxcIik7XFxuK1xcbitcXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcXG4rXFx0LyogV2FpdCB1cCB0byAxMjAgc2Vjb25kcyBmb3IgdGhlIHBhc3MgdG8gY29tcGxldGUuICovXFxuK1xcdGlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoMTIwKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJraHVnZXBhZ2VkIGRpZCBub3QgY29tcGxldGUgYSBmdWxsIHBhc3NcXFxcblxcXCIpO1xcbitcXG4rXFx0dHJhY2luZ19ldmVudHNfc3RvcChcXFwiaHVnZV9tZW1vcnlcXFwiKTtcXG4rXFxuK1xcdGNvbGxhcHNlZCA9IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgd2luZG93LCBUQVJHRVRfT1JERVIsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTtcXG4rXFx0YXR0cmlidXRlZCA9IGNvdW50X2F0dHJpYnV0ZWQocGZucywgbnJfcGFnZXMsICh1bnNpZ25lZCBsb25nKXAsXFxuK1xcdFxcdFxcdFxcdCAgICAgIFRBUkdFVF9PUkRFUik7XFxuK1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0KGNvbGxhcHNlZCBcXHUwMDI2XFx1MDAyNiBhdHRyaWJ1dGVkID09IDEsXFxuK1xcdFxcdFxcdCBcXFwic3RlcCAlZDogd2luZG93IGNvbGxhcHNlZCwgJWQgYXR0cmlidXRlZCByZXN1bHQocylcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCBpdGVyYXRpb24sIGF0dHJpYnV0ZWQpO1xcbitcXG4rXFx0bXVubWFwKHAsIGhwYWdlX3BtZF9zaXplKTtcXG4rfVxcbitcXG4raW50IG1haW4odm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XFxuK1xcbitcXHRpZiAoIXRocF9hdmFpbGFibGUoKSlcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxcXG5cXFwiKTtcXG4rXFx0aWYgKCEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcXHUwMDI2ICgxVUwgXFx1MDAzY1xcdTAwM2MgVEFSR0VUX09SREVSKSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgICAgICBUQVJHRVRfT1JERVIpO1xcbitcXG4rXFx0aHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpO1xcbitcXHRpZiAoIWhwYWdlX3BtZF9zaXplKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIlJlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxcXFxuXFxcIik7XFxuK1xcdHBhZ2VtYXBfZmQgPSBvcGVuKFxcXCIvcHJvYy9zZWxmL3BhZ2VtYXBcXFwiLCBPX1JET05MWSk7XFxuK1xcdGlmIChwYWdlbWFwX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJvcGVuKFxcXFxcXFwiL3Byb2Mvc2VsZi9wYWdlbWFwXFxcXFxcXCIpXFxcIik7XFxuK1xcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcIiwgT19SRE9OTFkpO1xcbitcXHRpZiAoa3BhZ2VmbGFnc19mZCBcXHUwMDNjIDApXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJvcGVuKFxcXFxcXFwiL3Byb2Mva3BhZ2VmbGFnc1xcXFxcXFwiKSByZXF1aXJlcyByb290XFxcXG5cXFwiKTtcXG4rXFx0aWYgKHRyYWNpbmdfZXZlbnRzX3N0YXJ0KFxcXCJodWdlX21lbW9yeVxcXCIpKVxcbitcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwidHJhY2VmcyB1bmF2YWlsYWJsZVxcXFxuXFxcIik7XFxuK1xcdHRyYWNpbmdfZXZlbnRzX3N0b3AoXFxcImh1Z2VfbWVtb3J5XFxcIik7XFxuK1xcbitcXHRrc2Z0X3NldF9wbGFuKE5SX0lURVJBVElPTlMpO1xcbitcXG4rXFx0dGhwX3NhdmVfc2V0dGluZ3MoKTtcXG4rXFx0dGhwX3JlYWRfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFx0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTUFEVklTRTtcXG4rXFx0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7XFxuK1xcdHNldHRpbmdzLmtodWdlcGFnZWQuc2Nhbl9zbGVlcF9taWxsaXNlY3MgPSA2MDAwMDtcXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSA2MDAwMDtcXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gKGhwYWdlX3BtZF9zaXplIC8gZ2V0cGFnZXNpemUoKSkgLSAxO1xcbitcXHQvKiBPbmUgd2FrZSBtdXN0IGNvbXBsZXRlIG9uZSBmdWxsIHBhc3M7IHNlZSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpLiAqL1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSAxVUwgXFx1MDAzY1xcdTAwM2MgMjQ7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBOUl9PUkRFUlM7IGkrKylcXG4rXFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XFxuK1xcdHNldHRpbmdzLmh1Z2VwYWdlc1tUQVJHRVRfT1JERVJdLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcXG4rXFx0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqL1xcbitcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIE5SX0lURVJBVElPTlM7IGkrKylcXG4rXFx0XFx0b25lX3N0ZXAoaSk7XFxuK1xcbitcXHR0aHBfcmVzdG9yZV9zZXR0aW5ncygpO1xcbitcXG4rXFx0a3NmdF9maW5pc2hlZCgpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcXG5pbmRleCA2ODdkMTE1ZTNiZDgwLi5mODI2Y2Y5NDBjM2Q0IDEwMDc1NVxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcXG5AQCAtNDAyLDEwICs0MDIsMjcgQEAgQ0FURUdPUlk9XFxcInBmbm1hcFxcXCIgcnVuX3Rlc3QgLi9wZm5tYXBcXG4gIyBDT1cgdGVzdHNcXG4gQ0FURUdPUlk9XFxcImNvd1xcXCIgcnVuX3Rlc3QgLi9jb3dcXG4gXFxuK0NBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4vZm9saW9fb3JkZXJfY2hlY2tcXG4rXFxuK1xcbitDQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2todWdlcGFnZWRfc3luY19jaGVja1xcbitcXG4rQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3JhY2UgLWQgNSAtbSBzdGVwcGVkXFxuK1xcbitDQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIGZyZWVcXG4rXFxuK0NBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9yYWNlIC1kIDUgLW0gbWFkdmlzZVxcbitcXG4rQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3JhY2UgLWQgNSAtbSBzdGVwcGVkIC16XFxuK1xcbitDQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIHN0ZXBwZWQgLXBcXG4rXFxuIENBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZFxcbiBcXG4gQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1zIDJcXG4gXFxuK0NBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtbyAyIGtodWdlcGFnZWQ6YW5vblxcbitcXG4gQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIGFsbDpzaG1lbVxcbiBcXG4gQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1zIDQgYWxsOnNobWVtXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXFxuaW5kZXggMzJiOTkxNDcyZjc0NC4uOWIzODg1YmQwMDFiZSAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xcbkBAIC00Miw2OCArNDIsNiBAQCBjb25zdCBjaGFyICprcGFnZWZsYWdzX3Byb2MgPSBcXFwiL3Byb2Mva3BhZ2VmbGFnc1xcXCI7XFxuIGludCBwYWdlbWFwX2ZkO1xcbiBpbnQga3BhZ2VmbGFnc19mZDtcXG4gXFxuLXN0YXRpYyBib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcXG4tXFx0XFx0aW50IGtwYWdlZmxhZ3NfZmQpXFxuLXtcXG4tXFx0Y29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDtcXG4tXFx0Y29uc3QgdWludDY0X3QgZm9saW9fdGFpbF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfVEFJTDtcXG4tXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcXHUwMDNjXFx1MDAzYyBvcmRlcjtcXG4tXFx0dW5zaWduZWQgbG9uZyBwZm5faGVhZDtcXG4tXFx0dWludDY0X3QgcGZuX2ZsYWdzO1xcbi1cXHR1bnNpZ25lZCBsb25nIHBmbjtcXG4tXFx0dW5zaWduZWQgbG9uZyBpO1xcbi1cXG4tXFx0cGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTtcXG4tXFxuLVxcdC8qIG5vbiBwcmVzZW50IHBhZ2UgKi9cXG4tXFx0aWYgKHBmbiA9PSAtMVVMKVxcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcbi1cXHRpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsIFxcdTAwMjZwZm5fZmxhZ3MpKVxcbi1cXHRcXHRnb3RvIGZhaWw7XFxuLVxcbi1cXHQvKiBjaGVjayBmb3Igb3JkZXItMCBwYWdlcyAqL1xcbi1cXHRpZiAoIW9yZGVyKSB7XFxuLVxcdFxcdGlmIChwZm5fZmxhZ3MgXFx1MDAyNiAoZm9saW9faGVhZF9mbGFncyB8IGZvbGlvX3RhaWxfZmxhZ3MpKVxcbi1cXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcdFxcdHJldHVybiB0cnVlO1xcbi1cXHR9XFxuLVxcbi1cXHQvKiBub24gVEhQIGZvbGlvICovXFxuLVxcdGlmICghKHBmbl9mbGFncyBcXHUwMDI2IEtQRl9USFApKVxcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcbi1cXHRwZm5faGVhZCA9IHBmbiBcXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcXG4tXFxuLVxcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4tXFx0XFx0Z290byBmYWlsO1xcbi1cXG4tXFx0LyogaGVhZCBQRk4gaGFzIG5vIGNvbXBvdW5kX2hlYWQgZmxhZyBzZXQgKi9cXG4tXFx0aWYgKChwZm5fZmxhZ3MgXFx1MDAyNiBmb2xpb19oZWFkX2ZsYWdzKSAhPSBmb2xpb19oZWFkX2ZsYWdzKVxcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcbi1cXHQvKiBjaGVjayBhbGwgdGFpbCBQRk4gZmxhZ3MgKi9cXG4tXFx0Zm9yIChpID0gMTsgaSBcXHUwMDNjIG5yX3BhZ2VzOyBpKyspIHtcXG4tXFx0XFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBpLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4tXFx0XFx0XFx0Z290byBmYWlsO1xcbi1cXHRcXHRpZiAoKHBmbl9mbGFncyBcXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpXFxuLVxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4tXFx0fVxcbi1cXG4tXFx0LypcXG4tXFx0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcXG4tXFx0ICogYXNzdW1lIHRoaXMgZm9saW8gaGFzIHRoZSBleHBlY3RlZCBvcmRlclxcbi1cXHQgKi9cXG4tXFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBucl9wYWdlcywga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuLVxcdFxcdHJldHVybiB0cnVlO1xcbi1cXG4tXFx0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xcbi1cXHRyZXR1cm4gKHBmbl9mbGFncyBcXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7XFxuLWZhaWw6XFxuLVxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiRmFpbGVkIHRvIGdldCBmb2xpbyBpbmZvXFxcXG5cXFwiKTtcXG4tXFx0cmV0dXJuIGZhbHNlO1xcbi19XFxuLVxcbiBzdGF0aWMgaW50IHZhZGRyX3BhZ2VmbGFnc19nZXQoY2hhciAqdmFkZHIsIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCxcXG4gXFx0XFx0dWludDY0X3QgKmZsYWdzKVxcbiB7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xcbmluZGV4IGVmMWVhMTE5ODFhNzQuLjg4NmZiM2RlOWMwMTEgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXFxuQEAgLTMwMyw2ICszMDMsMTYzIEBAIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKVxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4rYm9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsXFxuK1xcdFxcdFxcdGludCBrcGFnZWZsYWdzX2ZkKVxcbit7XFxuK1xcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX2hlYWRfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX0hFQUQ7XFxuK1xcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXFx1MDAzY1xcdTAwM2Mgb3JkZXI7XFxuK1xcdHVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7XFxuK1xcdHVpbnQ2NF90IHBmbl9mbGFncztcXG4rXFx0dW5zaWduZWQgbG9uZyBwZm47XFxuK1xcdHVuc2lnbmVkIGxvbmcgaTtcXG4rXFxuK1xcdHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XFxuK1xcbitcXHQvKiBub24gcHJlc2VudCBwYWdlICovXFxuK1xcdGlmIChwZm4gPT0gLTFVTClcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXG4rXFx0LyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi9cXG4rXFx0aWYgKCFvcmRlcikge1xcbitcXHRcXHRpZiAocGZuX2ZsYWdzIFxcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0fVxcbitcXG4rXFx0Lyogbm9uIFRIUCBmb2xpbyAqL1xcbitcXHRpZiAoIShwZm5fZmxhZ3MgXFx1MDAyNiBLUEZfVEhQKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0cGZuX2hlYWQgPSBwZm4gXFx1MDAyNiB+KG5yX3BhZ2VzIC0gMSk7XFxuK1xcbitcXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCwga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFxuK1xcdC8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovXFxuK1xcdGlmICgocGZuX2ZsYWdzIFxcdTAwMjYgZm9saW9faGVhZF9mbGFncykgIT0gZm9saW9faGVhZF9mbGFncylcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0LyogY2hlY2sgYWxsIHRhaWwgUEZOIGZsYWdzICovXFxuK1xcdGZvciAoaSA9IDE7IGkgXFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XFxuK1xcdFxcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgaSwga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuK1xcdFxcdFxcdGdvdG8gZmFpbDtcXG4rXFx0XFx0aWYgKChwZm5fZmxhZ3MgXFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdC8qXFxuK1xcdCAqIGNoZWNrIHRoZSBQRk4gYWZ0ZXIgdGhpcyBmb2xpbywgYnV0IGlmIGl0cyBmbGFncyBjYW5ub3QgYmUgb2J0YWluZWQsXFxuK1xcdCAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXJcXG4rXFx0ICovXFxuK1xcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFxcdTAwMjZwZm5fZmxhZ3MpKVxcbitcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFxuK1xcdC8qIElmIHdlIGZpbmQgYW5vdGhlciB0YWlsIHBhZ2UsIHRoZW4gdGhlIGZvbGlvIGlzIGxhcmdlci4gKi9cXG4rXFx0cmV0dXJuIChwZm5fZmxhZ3MgXFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzO1xcbitmYWlsOlxcbitcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIkZhaWxlZCB0byBnZXQgZm9saW8gaW5mb1xcXFxuXFxcIik7XFxuK1xcdHJldHVybiBmYWxzZTtcXG4rfVxcbitcXG4rLypcXG4rICogQ2hlY2sgd2hldGhlciB0aGUgcmFuZ2UgW3N0YXJ0LCBzdGFydCArIGxlbikgaXMgYmFja2VkIGJ5IGZvbGlvcyBvZlxcbisgKiBleGFjdGx5IEBvcmRlciwgbWFwcGVkIGF0IHRoZWlyIG5hdHVyYWwgYWxpZ25tZW50LlxcbisgKlxcbisgKiBpc19iYWNrZWRfYnlfZm9saW8oKSBjbGFzc2lmaWVzIHRoZSBmb2xpbyBiYWNraW5nIG9uZSBwYWdlOyBoZXJlIHdlXFxuKyAqIGFkZGl0aW9uYWxseSByZXF1aXJlIHRoYXQgZWFjaCBvcmRlci1hbGlnbmVkIHdpbmRvdyBvZiB0aGUgcmFuZ2UgbWFwc1xcbisgKiBvbmUgc3VjaCBmb2xpbyBoZWFkLXRvLXRhaWw6IHRoZSBWQSByYW5nZSBtdXN0IGJlIG5hdHVyYWxseSBhbGlnbmVkLFxcbisgKiBlYWNoIHdpbmRvdydzIFBGTiBydW4gbXVzdCBiZSBjb250aWd1b3VzLCBhbmQgdGhlIGZpcnN0IFBGTiBtdXN0IGJlXFxuKyAqIHRoZSAobmF0dXJhbGx5IGFsaWduZWQpIGZvbGlvIGhlYWQuXFxuKyAqXFxuKyAqIFRoaXMgaXMgdGhlIGNoZWNrIFxcXCJkaWQgdGhpcyByYW5nZSBjb2xsYXBzZSBpbnRvIG9yZGVyLUBvcmRlciBmb2xpb3NcXFwiOlxcbisgKiBhIHdpbmRvdyBhc3NlbWJsZWQgZnJvbSBwYXJ0cyBvZiBzZXZlcmFsIGZvbGlvcywgb3IgbWFwcGluZyBhIGZvbGlvXFxuKyAqIHNoaWZ0ZWQgZnJvbSBpdHMgbmF0dXJhbCBwb3NpdGlvbiwgZmFpbHMuXFxuKyAqL1xcbitib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMoY2hhciAqc3RhcnQsIHNpemVfdCBsZW4sIGludCBvcmRlcixcXG4rXFx0XFx0XFx0XFx0ICAgICBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQpXFxuK3tcXG4rXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcXHUwMDNjXFx1MDAzYyBvcmRlcjtcXG4rXFx0Y29uc3Qgc2l6ZV90IHdpbmRvdyA9IG5yX3BhZ2VzICogcHNpemUoKTtcXG4rXFx0Y2hhciAqdmFkZHI7XFxuK1xcbitcXHRpZiAoKHVpbnRwdHJfdClzdGFydCAlIHdpbmRvdyB8fCBsZW4gJSB3aW5kb3cpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdGZvciAodmFkZHIgPSBzdGFydDsgdmFkZHIgXFx1MDAzYyBzdGFydCArIGxlbjsgdmFkZHIgKz0gd2luZG93KSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBpO1xcbitcXG4rXFx0XFx0LyogTm90IHByZXNlbnQsIG9yIG5vdCBtYXBwaW5nIHRoZSBmb2xpbyBoZWFkLiAqL1xcbitcXHRcXHRpZiAocGZuID09IC0xVUwgfHwgcGZuICUgbnJfcGFnZXMpXFxuK1xcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdFxcdGZvciAoaSA9IDE7IGkgXFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XFxuK1xcdFxcdFxcdGlmIChwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIgKyBpICogcHNpemUoKSkgIT1cXG4rXFx0XFx0XFx0ICAgIHBmbiArIGkpXFxuK1xcdFxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0aWYgKCFpc19iYWNrZWRfYnlfZm9saW8odmFkZHIsIG9yZGVyLCBwYWdlbWFwX2ZkLFxcbitcXHRcXHRcXHRcXHRcXHRrcGFnZWZsYWdzX2ZkKSlcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rI2RlZmluZSBUUkFDRUZTX1JPT1QgXFxcIi9zeXMva2VybmVsL3RyYWNpbmdcXFwiXFxuK1xcbitzdGF0aWMgaW50IHRyYWNpbmdfZXZlbnRzX3dyaXRlKGNvbnN0IGNoYXIgKnN1YnN5cywgY29uc3QgY2hhciAqdmFsKVxcbit7XFxuK1xcdGNoYXIgcGF0aFsyNTZdO1xcbitcXHRpbnQgZmQ7XFxuK1xcbitcXHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFRSQUNFRlNfUk9PVCBcXFwiL2V2ZW50cy8lcy9lbmFibGVcXFwiLFxcbitcXHRcXHQgc3Vic3lzKTtcXG4rXFx0ZmQgPSBvcGVuKHBhdGgsIE9fV1JPTkxZKTtcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRpZiAod3JpdGUoZmQsIHZhbCwgMSkgIT0gMSkge1xcbitcXHRcXHRjbG9zZShmZCk7XFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0fVxcbitcXHRjbG9zZShmZCk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKlxcbisgKiBFbmFibGUgb25lIGZ0cmFjZSBldmVudCBzdWJzeXN0ZW0gKGUuZy4gXFxcImh1Z2VfbWVtb3J5XFxcIikgYW5kIGNsZWFyIHRoZVxcbisgKiB0cmFjZSBidWZmZXIuIFJldHVybnMgLTEgaWYgdHJhY2VmcyBpcyB1bmF2YWlsYWJsZTsgcGFyc2UgdGhlIHJlc3VsdHNcXG4rICogdmlhIHRyYWNpbmdfb3Blbl90cmFjZSgpIGFmdGVyIHRyYWNpbmdfZXZlbnRzX3N0b3AoKS5cXG4rICovXFxuK2ludCB0cmFjaW5nX2V2ZW50c19zdGFydChjb25zdCBjaGFyICpzdWJzeXMpXFxuK3tcXG4rXFx0aW50IGZkO1xcbitcXG4rXFx0aWYgKHRyYWNpbmdfZXZlbnRzX3dyaXRlKHN1YnN5cywgXFxcIjFcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0ZmQgPSBvcGVuKFRSQUNFRlNfUk9PVCBcXFwiL3RyYWNlXFxcIiwgT19XUk9OTFkgfCBPX1RSVU5DKTtcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitpbnQgdHJhY2luZ19ldmVudHNfc3RvcChjb25zdCBjaGFyICpzdWJzeXMpXFxuK3tcXG4rXFx0cmV0dXJuIHRyYWNpbmdfZXZlbnRzX3dyaXRlKHN1YnN5cywgXFxcIjBcXFwiKTtcXG4rfVxcbitcXG4rRklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIGZvcGVuKFRSQUNFRlNfUk9PVCBcXFwiL3RyYWNlXFxcIiwgXFxcInJcXFwiKTtcXG4rfVxcbitcXG4gLyogSWYgYGlvY3Rscycgbm9uLU5VTEwsIHRoZSBhbGxvd2VkIGlvY3RscyB3aWxsIGJlIHJldHVybmVkIGludG8gdGhlIHZhciAqL1xcbiBpbnQgdWZmZF9yZWdpc3Rlcl93aXRoX2lvY3RscyhpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLFxcbiBcXHRcXHRcXHQgICAgICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IsIHVpbnQ2NF90ICppb2N0bHMpXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaFxcbmluZGV4IDc3OTkxNTRiNjdlZWQuLjRmZjVhMWM1YWI4ZWQgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXFxuQEAgLTk1LDYgKzk1LDEwIEBAIGJvb2wgY2hlY2tfaHVnZV9maWxlKHZvaWQgKmFkZHIsIGludCBucl9ocGFnZXMsIHVpbnQ2NF90IGhwYWdlX3NpemUpO1xcbiBib29sIGNoZWNrX2h1Z2Vfc2htZW0odm9pZCAqYWRkciwgaW50IG5yX2hwYWdlcywgdWludDY0X3QgaHBhZ2Vfc2l6ZSk7XFxuIGludDY0X3QgYWxsb2NhdGVfdHJhbnNodWdlKHZvaWQgKnB0ciwgaW50IHBhZ2VtYXBfZmQpO1xcbiBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncyk7XFxuK2Jvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLFxcbitcXHRcXHRcXHRpbnQga3BhZ2VmbGFnc19mZCk7XFxuK2Jvb2wgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLFxcbitcXHRcXHRcXHRcXHQgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCk7XFxuIFxcbiBpbnQgdWZmZF9yZWdpc3RlcihpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLFxcbiBcXHRcXHQgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vcik7XFxuQEAgLTExMSw2ICsxMTUsOSBAQCBpbnQgY2xvc2VfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcCk7XFxuIGludCB3cml0ZV9zeXNmcyhjb25zdCBjaGFyICpmaWxlX3BhdGgsIHVuc2lnbmVkIGxvbmcgdmFsKTtcXG4gaW50IHJlYWRfc3lzZnMoY29uc3QgY2hhciAqZmlsZV9wYXRoLCB1bnNpZ25lZCBsb25nICp2YWwpO1xcbiBib29sIHNvZnRkaXJ0eV9zdXBwb3J0ZWQodm9pZCk7XFxuK2ludCB0cmFjaW5nX2V2ZW50c19zdGFydChjb25zdCBjaGFyICpzdWJzeXMpO1xcbitpbnQgdHJhY2luZ19ldmVudHNfc3RvcChjb25zdCBjaGFyICpzdWJzeXMpO1xcbitGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZCk7XFxuIFxcbiBzdGF0aWMgaW5saW5lIGludCBvcGVuX3NlbGZfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcF9vdXQpXFxuIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDNUMDE6MDM6MTQuNzQzMzY0NDA4WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6ODQ2OTA0MjMyMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2Vyc3BhY2Ugc2VsZnRlc3RzICh0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8qKSBhbmQgZG9lcyBub3QgbWFrZSBhbnkgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgaXRzZWxmLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgM2ZhNDAzMjRjOTExY2RkOWY0MzUyNjZkM2VjZWVhNmI1MmVmNzFjNlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gQXVnIDMgMDE6MDM6MTMgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8uZ2l0aWdub3JlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLmdpdGlnbm9yZVxuaW5kZXggOWNjZDllMTQ0N2U2Ni4uNjE2MDQzYTBmY2QyMiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy5naXRpZ25vcmVcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy5naXRpZ25vcmVcbkBAIC02NiwzICs2Niw2IEBAIG1lcmdlXG4gcHJjdGxfdGhwX2Rpc2FibGVcbiBybWFwXG4gZm9saW9fc3BsaXRfcmFjZV90ZXN0XG4rZm9saW9fb3JkZXJfY2hlY2tcbitraHVnZXBhZ2VkX3N5bmNfY2hlY2tcbitraHVnZXBhZ2VkX3JhY2VcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXG5pbmRleCAyNWQxMGNlZDNiM2I5Li4wMjZkNGI2MTQxNGQ0IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXG5AQCAtMTA0LDYgKzEwNCw5IEBAIFRFU1RfR0VOX0ZJTEVTICs9IGd1YXJkLXJlZ2lvbnNcbiBURVNUX0dFTl9GSUxFUyArPSBtZXJnZVxuIFRFU1RfR0VOX0ZJTEVTICs9IHJtYXBcbiBURVNUX0dFTl9GSUxFUyArPSBmb2xpb19zcGxpdF9yYWNlX3Rlc3RcbitURVNUX0dFTl9GSUxFUyArPSBmb2xpb19vcmRlcl9jaGVja1xuK1RFU1RfR0VOX0ZJTEVTICs9IGtodWdlcGFnZWRfc3luY19jaGVja1xuK1RFU1RfR0VOX0ZJTEVTICs9IGtodWdlcGFnZWRfcmFjZVxuIFxuIGlmbmVxICgkKEFSQ0gpLGFybTY0KVxuIFRFU1RfR0VOX0ZJTEVTICs9IHNvZnQtZGlydHlcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmY3MGQ3NjZmZjNlYjNcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmNcbkBAIC0wLDAgKzEsMTM4IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIFNlbGYtY2hlY2sgZm9yIHRoZSB2bV91dGlsIGZvbGlvLW9yZGVyIGRldGVjdGlvbiBoZWxwZXJzLFxuKyAqIGlzX2JhY2tlZF9ieV9mb2xpbygpIGFuZCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKCkuXG4rICpcbisgKiBGb3IgZXZlcnkgYW5vbiBUSFAgb3JkZXIgdGhlIGtlcm5lbCBzdXBwb3J0cywgZmF1bHQgbWVtb3J5IGluIHdpdGggb25seVxuKyAqIHRoYXQgb3JkZXIgZW5hYmxlZCBhbmQgdmVyaWZ5IHRoZSBoZWxwZXJzIHJlcG9ydCBleGFjdGx5IHRoYXQgb3JkZXI6XG4rICogbm90IGEgbmVpZ2hib3VyaW5nIG9yZGVyLCBhbmQgcGxhaW4gNEsgbWVtb3J5IGFzIG9yZGVyIDAuIFRoZSBoZWxwZXJzXG4rICogYXJlIHdoYXQgdGhlIGtodWdlcGFnZWQgbVRIUCB0ZXN0cyB1c2UgdG8gZGV0ZWN0IGNvbGxhcHNlIHJlc3VsdHMsIHNvXG4rICogdGhleSBtdXN0IGFncmVlIHdpdGggdGhlIGtlcm5lbCdzIG93biBpZGVhIG9mIHRoZSBiYWNraW5nIGJlZm9yZSBhbnlcbisgKiBjb2xsYXBzZSB0ZXN0IHJlbGllcyBvbiB0aGVtLlxuKyAqL1xuKyNkZWZpbmUgX0dOVV9TT1VSQ0VcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXCJrc2VsZnRlc3QuaFwiXG4rI2luY2x1ZGUgXCJ2bV91dGlsLmhcIlxuKyNpbmNsdWRlIFwiaHVnZXBhZ2Vfc2V0dGluZ3MuaFwiXG4rXG4rc3RhdGljIGludCBwYWdlbWFwX2ZkO1xuK3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDtcbitcbisvKiBtbWFwIGFuIGFub24gVk1BIG9mIGV4YWN0bHkgQHNpemUgYnl0ZXMgYXQgYSBAc2l6ZS1hbGlnbmVkIGFkZHJlc3MuICovXG4rc3RhdGljIGNoYXIgKmFsbG9jX2FsaWduZWQoc2l6ZV90IHNpemUpXG4re1xuK1x0c2l6ZV90IGxlbiA9IHNpemUgKiAyO1xuK1x0dWludHB0cl90IGFsaWduZWQ7XG4rXHRjaGFyICpwO1xuK1xuK1x0cCA9IG1tYXAoTlVMTCwgbGVuLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuK1x0XHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XG4rXHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtbWFwKClcIik7XG4rXG4rXHRhbGlnbmVkID0gKCh1aW50cHRyX3QpcCArIHNpemUgLSAxKSBcdTAwMjYgfihzaXplIC0gMSk7XG4rXHRpZiAoYWxpZ25lZCAhPSAodWludHB0cl90KXApXG4rXHRcdG11bm1hcChwLCBhbGlnbmVkIC0gKHVpbnRwdHJfdClwKTtcbitcdGlmIChhbGlnbmVkICsgc2l6ZSAhPSAodWludHB0cl90KXAgKyBsZW4pXG4rXHRcdG11bm1hcCgoY2hhciAqKWFsaWduZWQgKyBzaXplLFxuK1x0XHQgICAgICAgKHVpbnRwdHJfdClwICsgbGVuIC0gYWxpZ25lZCAtIHNpemUpO1xuK1xuK1x0cmV0dXJuIChjaGFyICopYWxpZ25lZDtcbit9XG4rXG4rLypcbisgKiBFbmFibGUgb25seSBAb3JkZXIgKG9yZGVyIDA6IG5vdGhpbmcpLCBmYXVsdCBvbmUgYWxpZ25lZCB3aW5kb3cgaW4gYW5kXG4rICogY2hlY2sgdGhlIGhlbHBlcnMgc2VlIGV4YWN0bHkgQG9yZGVyLlxuKyAqL1xuK3N0YXRpYyB2b2lkIGNoZWNrX29yZGVyKGludCBvcmRlcilcbit7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XG4rXHRzaXplX3Qgc2l6ZSA9IHBzaXplKCkgXHUwMDNjXHUwMDNjIG9yZGVyO1xuK1x0Ym9vbCBvayA9IHRydWU7XG4rXHRjaGFyICpwO1xuK1x0aW50IGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkrKylcbitcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XG4rXHRpZiAob3JkZXIpXG4rXHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tvcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7XG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRwID0gYWxsb2NfYWxpZ25lZChzaXplKTtcbitcdCpwID0gMTtcbitcbitcdGlmICghaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBzaXplLCBvcmRlcixcbitcdFx0XHRcdFx0ICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIm9yZGVyICVkIG5vdCBkZXRlY3RlZCBhZnRlciBmYXVsdFxcblwiLCBvcmRlcik7XG4rXHRcdG9rID0gZmFsc2U7XG4rXHR9XG4rXG4rXHQvKiBBIGxvd2VyIG9yZGVyIG11c3QgYmUgcmVqZWN0ZWQ6IHRoZSBmb2xpbyBpcyBsYXJnZXIuICovXG4rXHRpZiAob3JkZXIgXHUwMDI2XHUwMDI2IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgb3JkZXIgLSAxLFxuK1x0XHRcdFx0XHRcdCAgICAgcGFnZW1hcF9mZCxcbitcdFx0XHRcdFx0XHQgICAgIGtwYWdlZmxhZ3NfZmQpKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwib3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAlZFxcblwiLFxuK1x0XHRcdCAgICAgICBvcmRlciwgb3JkZXIgLSAxKTtcbitcdFx0b2sgPSBmYWxzZTtcbitcdH1cbitcbitcdC8qIE9yZGVyIDAgcGFnZXMgbXVzdCBub3QgbG9vayBsaWtlIGFueSBsYXJnZSBmb2xpbywgYW5kIHZpY2UgdmVyc2EuICovXG4rXHRpZiAob3JkZXIgXHUwMDI2XHUwMDI2IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgMCxcbitcdFx0XHRcdFx0XHQgICAgIHBhZ2VtYXBfZmQsXG4rXHRcdFx0XHRcdFx0ICAgICBrcGFnZWZsYWdzX2ZkKSkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIm9yZGVyICVkIGFsc28gcmVwb3J0ZWQgYXMgb3JkZXIgMFxcblwiLCBvcmRlcik7XG4rXHRcdG9rID0gZmFsc2U7XG4rXHR9XG4rXG4rXHRtdW5tYXAocCwgc2l6ZSk7XG4rXHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXG4rXHRrc2Z0X3Rlc3RfcmVzdWx0KG9rLCBcIm9yZGVyICVkIGNsYXNzaWZpZWRcXG5cIiwgb3JkZXIpO1xuK31cbitcbitpbnQgbWFpbih2b2lkKVxuK3tcbitcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4rXHR1bnNpZ25lZCBsb25nIG9yZGVycztcbitcdGludCBvcmRlcjtcbitcbitcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4rXG4rXHRpZiAoIXRocF9hdmFpbGFibGUoKSlcbitcdFx0a3NmdF9leGl0X3NraXAoXCJUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcblwiKTtcbitcbitcdHBhZ2VtYXBfZmQgPSBvcGVuKFwiL3Byb2Mvc2VsZi9wYWdlbWFwXCIsIE9fUkRPTkxZKTtcbitcdGlmIChwYWdlbWFwX2ZkIFx1MDAzYyAwKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJvcGVuKFxcXCIvcHJvYy9zZWxmL3BhZ2VtYXBcXFwiKVwiKTtcbitcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwiL3Byb2Mva3BhZ2VmbGFnc1wiLCBPX1JET05MWSk7XG4rXHRpZiAoa3BhZ2VmbGFnc19mZCBcdTAwM2MgMClcbitcdFx0a3NmdF9leGl0X3NraXAoXCJvcGVuKFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcIikgcmVxdWlyZXMgcm9vdFxcblwiKTtcbitcbitcdG9yZGVycyA9IHRocF9zdXBwb3J0ZWRfb3JkZXJzKCk7XG4rXHRpZiAoIW9yZGVycylcbitcdFx0a3NmdF9leGl0X3NraXAoXCJObyBzdXBwb3J0ZWQgVEhQIG9yZGVyc1xcblwiKTtcbitcbitcdGtzZnRfc2V0X3BsYW4oX19idWlsdGluX3BvcGNvdW50bChvcmRlcnMpICsgMSk7XG4rXG4rXHR0aHBfc2F2ZV9zZXR0aW5ncygpO1xuK1x0dGhwX3JlYWRfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1x0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqL1xuK1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1xuK1x0Y2hlY2tfb3JkZXIoMCk7XG4rXHRmb3IgKG9yZGVyID0gMTsgb3JkZXIgXHUwMDNjIE5SX09SREVSUzsgb3JkZXIrKykge1xuK1x0XHRpZiAoIShvcmRlcnMgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIG9yZGVyKSkpXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdGNoZWNrX29yZGVyKG9yZGVyKTtcbitcdH1cbitcbitcdHRocF9yZXN0b3JlX3NldHRpbmdzKCk7XG4rXG4rXHRrc2Z0X2ZpbmlzaGVkKCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jXG5pbmRleCBkNzkxN2RjZTNhYmFjLi5hMjZhMGNmZmE5YzViIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuQEAgLTE4Myw2ICsxODMsMTcgQEAgdm9pZCB0aHBfcmVhZF9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcbiBcdH1cbiB9XG4gXG4rLypcbisgKiBXcml0ZSBvbmx5IG9uIGNoYW5nZTogYW55IHN0b3JlIHRvIGEga2h1Z2VwYWdlZCBzeXNmcyBrbm9iIHdha2VzIHRoZVxuKyAqIGRhZW1vbiwgYW5kIHNldHRpbmdzIHB1c2hlcy9wb3BzIG11c3Qgbm90IHN0YXJ0IHNjYW4gcGFzc2VzIG5vYm9keVxuKyAqIGFza2VkIGZvciDigJQga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSBpcyB0aGUgb25seSBzYW5jdGlvbmVkIHdha2UuXG4rICovXG4rc3RhdGljIHZvaWQgdGhwX3VwZGF0ZV9udW0oY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBudW0pXG4re1xuK1x0aWYgKHRocF9yZWFkX251bShuYW1lKSAhPSBudW0pXG4rXHRcdHRocF93cml0ZV9udW0obmFtZSwgbnVtKTtcbit9XG4rXG4gdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4ge1xuIFx0c3RydWN0IGtodWdlcGFnZWRfc2V0dGluZ3MgKmtodWdlcGFnZWQgPSBcdTAwMjZzZXR0aW5ncy1cdTAwM2VraHVnZXBhZ2VkO1xuQEAgLTE5OCwxNSArMjA5LDE1IEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxuIFx0XHRcdHNobWVtX2VuYWJsZWRfc3RyaW5nc1tzZXR0aW5ncy1cdTAwM2VzaG1lbV9lbmFibGVkXSk7XG4gXHR0aHBfd3JpdGVfbnVtKFwidXNlX3plcm9fcGFnZVwiLCBzZXR0aW5ncy1cdTAwM2V1c2VfemVyb19wYWdlKTtcbiBcbi1cdHRocF93cml0ZV9udW0oXCJraHVnZXBhZ2VkL2RlZnJhZ1wiLCBraHVnZXBhZ2VkLVx1MDAzZWRlZnJhZyk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9hbGxvY19zbGVlcF9taWxsaXNlY3NcIixcbi1cdFx0XHRraHVnZXBhZ2VkLVx1MDAzZWFsbG9jX3NsZWVwX21pbGxpc2Vjcyk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1wiLFxuLVx0XHRcdGtodWdlcGFnZWQtXHUwMDNlc2Nhbl9zbGVlcF9taWxsaXNlY3MpO1xuLVx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvbWF4X3B0ZXNfbm9uZVwiLCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX25vbmUpO1xuLVx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvbWF4X3B0ZXNfc3dhcFwiLCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX3N3YXApO1xuLVx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc2hhcmVkKTtcbi1cdHRocF93cml0ZV9udW0oXCJraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW5cIiwga2h1Z2VwYWdlZC1cdTAwM2VwYWdlc190b19zY2FuKTtcbitcdHRocF91cGRhdGVfbnVtKFwia2h1Z2VwYWdlZC9kZWZyYWdcIiwga2h1Z2VwYWdlZC1cdTAwM2VkZWZyYWcpO1xuK1x0dGhwX3VwZGF0ZV9udW0oXCJraHVnZXBhZ2VkL2FsbG9jX3NsZWVwX21pbGxpc2Vjc1wiLFxuK1x0XHQgICAgICAga2h1Z2VwYWdlZC1cdTAwM2VhbGxvY19zbGVlcF9taWxsaXNlY3MpO1xuK1x0dGhwX3VwZGF0ZV9udW0oXCJraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXCIsXG4rXHRcdCAgICAgICBraHVnZXBhZ2VkLVx1MDAzZXNjYW5fc2xlZXBfbWlsbGlzZWNzKTtcbitcdHRocF91cGRhdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfbm9uZSk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvbWF4X3B0ZXNfc3dhcFwiLCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX3N3YXApO1xuK1x0dGhwX3VwZGF0ZV9udW0oXCJraHVnZXBhZ2VkL21heF9wdGVzX3NoYXJlZFwiLCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX3NoYXJlZCk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvcGFnZXNfdG9fc2NhblwiLCBraHVnZXBhZ2VkLVx1MDAzZXBhZ2VzX3RvX3NjYW4pO1xuIFxuIFx0aWYgKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGhbMF0pXG4gXHRcdHdyaXRlX251bShkZXZfcXVldWVfcmVhZF9haGVhZF9wYXRoLCBzZXR0aW5ncy1cdTAwM2VyZWFkX2FoZWFkX2tiKTtcbkBAIC0yMzAsNiArMjQxLDQzIEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxuIFx0fVxuIH1cbiBcbisvKlxuKyAqIENvbXBsZXRpb24gYmFycmllciBmb3Iga2h1Z2VwYWdlZDogd2FpdCB1bnRpbCBhIGZ1bGwgc2NhbiBwYXNzIHRoYXRcbisgKiBzdGFydGVkIGFmdGVyIHRoaXMgY2FsbCBoYXMgZmluaXNoZWQuIGZ1bGxfc2NhbnMgbXVzdCBhZHZhbmNlIGJ5IHR3bztcbisgKiBhICsxIHN0ZXAgbWF5IGNvbXBsZXRlIGEgcGFzcyB0aGF0IGV4YW1pbmVkIHRoaXMgbW0gYmVmb3JlIHRoZVxuKyAqIGNhbGxlcidzIHNldHVwIHdhcyBpbiBwbGFjZS5cbisgKlxuKyAqIEFueSBzdG9yZSB0byBzY2FuX3NsZWVwX21pbGxpc2VjcyB3YWtlcyB0aGUgZGFlbW9uLCBzbyB0aGUgYmFycmllclxuKyAqIHdvcmtzIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbmZpZ3VyZWQgc2NhbiBjYWRlbmNlLiBJdCB3YWtlcyBleGFjdGx5XG4rICogb25jZSBwZXIgbWlzc2luZyBwYXNzIOKAlCBvdmVyLXdha2luZyB3b3VsZCBxdWV1ZSBhIHN0cmFnZ2xlciBwYXNzXG4rICogYmVoaW5kIHRoZSBiYXJyaWVyLCBwZXJ0dXJiaW5nIHdoYXRldmVyIHRoZSBjYWxsZXIgc2V0cyB1cCBuZXh0LlxuKyAqIE9uZSB3YWtlIGNvbXBsZXRlcyBvbmUgZnVsbCBwYXNzIG9ubHkgaWYgdGhlIHdob2xlIG1tIGxpc3QgZml0cyBpblxuKyAqIG9uZSBzY2FuIGJhdGNoLCBzbyBjYWxsZXJzIG11c3QgcGFpciB0aGlzIHdpdGggYSBsYXJnZVxuKyAqIHBhZ2VzX3RvX3NjYW4uXG4rICovXG4rYm9vbCBraHVnZXBhZ2VkX2Z1bGxfcGFzcyh1bnNpZ25lZCBpbnQgdGltZW91dF9zKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgZGVhZGxpbmVfbXMgPSB0aW1lb3V0X3MgKiAxMDAwVUw7XG4rXHR1bnNpZ25lZCBsb25nIHNsZWVwX21zID1cbitcdFx0dGhwX3JlYWRfbnVtKFwia2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1wiKTtcbitcdHVuc2lnbmVkIGxvbmcgZWxhcHNlZF9tcyA9IDA7XG4rXHRpbnQgcGFzcztcbitcbitcdGZvciAocGFzcyA9IDA7IHBhc3MgXHUwMDNjIDI7IHBhc3MrKykge1xuK1x0XHR1bnNpZ25lZCBsb25nIHRhcmdldCA9XG4rXHRcdFx0dGhwX3JlYWRfbnVtKFwia2h1Z2VwYWdlZC9mdWxsX3NjYW5zXCIpICsgMTtcbitcbitcdFx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcIiwgc2xlZXBfbXMpO1xuK1x0XHR3aGlsZSAodGhwX3JlYWRfbnVtKFwia2h1Z2VwYWdlZC9mdWxsX3NjYW5zXCIpIFx1MDAzYyB0YXJnZXQpIHtcbitcdFx0XHRpZiAoZWxhcHNlZF9tcyBcdTAwM2U9IGRlYWRsaW5lX21zKVxuK1x0XHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHRcdHVzbGVlcCgxMCAqIDEwMDApO1xuK1x0XHRcdGVsYXBzZWRfbXMgKz0gMTA7XG4rXHRcdH1cbitcdH1cbitcdHJldHVybiB0cnVlO1xuK31cbitcbiBzdHJ1Y3QgdGhwX3NldHRpbmdzICp0aHBfY3VycmVudF9zZXR0aW5ncyh2b2lkKVxuIHtcbiBcdGlmICghc2V0dGluZ3NfaW5kZXgpIHtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxuaW5kZXggNzI2YzczYzQzYzA1Yi4uOGRlNDQ2YWZmZWVjZCAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcbkBAIC04Myw2ICs4Myw4IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCB0aHBfc2F2ZV9zZXR0aW5ncyh2b2lkKVxuIFx0aHVnZXBhZ2Vfc2F2ZV9zZXR0aW5ncygvKiB0aHAgPSAqLyB0cnVlLCAvKiBodWdldGxiID0gKi8gZmFsc2UpO1xuIH1cbiBcbitib29sIGtodWdlcGFnZWRfZnVsbF9wYXNzKHVuc2lnbmVkIGludCB0aW1lb3V0X3MpO1xuK1xuIHZvaWQgdGhwX3NldF9yZWFkX2FoZWFkX3BhdGgoY2hhciAqcGF0aCk7XG4gdW5zaWduZWQgbG9uZyB0aHBfc3VwcG9ydGVkX29yZGVycyh2b2lkKTtcbiB1bnNpZ25lZCBsb25nIHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xuaW5kZXggMTBlOGRlZGNiMDg3ZC4uYzVhM2MzOTIyNTgxOSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG5AQCAtMjYsOSArMjYsMTMgQEBcbiBcbiAjZGVmaW5lIEJBU0VfQUREUiAoKHZvaWQgKikoMVVMIFx1MDAzY1x1MDAzYyAzMCkpXG4gc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XG4rc3RhdGljIGludCBocGFnZV9wbWRfb3JkZXI7XG4gc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplO1xuIHN0YXRpYyBpbnQgaHBhZ2VfcG1kX25yO1xuIHN0YXRpYyBpbnQgYW5vbl9vcmRlcjtcbitzdGF0aWMgaW50IGFub25fdGFyZ2V0X29yZGVyO1xuK3N0YXRpYyBpbnQgcGFnZW1hcF9mZCA9IC0xO1xuK3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZCA9IC0xO1xuIFxuICNkZWZpbmUgUElEX1NNQVBTIFwiL3Byb2Mvc2VsZi9zbWFwc1wiXG4gI2RlZmluZSBURVNUX0ZJTEUgXCJjb2xsYXBzZV90ZXN0X2ZpbGVcIlxuQEAgLTE3Nyw2ICsxODEsMjEgQEAgc3RhdGljIHZvaWQgZ2V0X2ZpbmZvKGNvbnN0IGNoYXIgKmRpcilcbiBcdGtzZnRfZXhpdF9mYWlsX21zZyhcIiVzOiBDb3VsZCBub3QgcmVhZDogJXNcXG5cIiwgX19mdW5jX18sIHBhdGgpO1xuIH1cbiBcbitzdGF0aWMgYm9vbCBoYXNfc3dhcCh2b2lkKVxuK3tcbitcdEZJTEUgKmZwID0gZm9wZW4oXCIvcHJvYy9zd2Fwc1wiLCBcInJcIik7XG4rXHRjaGFyIGxpbmVbTUFYX0xJTkVfTEVOR1RIXTtcbitcdGJvb2wgcmV0ID0gZmFsc2U7XG4rXG4rXHRpZiAoIWZwKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHQvKiBGaXJzdCBsaW5lIGlzIHRoZSBoZWFkZXI7IGFueSBmb2xsb3dpbmcgbGluZSBpcyBhIHN3YXAgYXJlYS4gKi9cbitcdGlmIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSBcdTAwMjZcdTAwMjYgZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpXG4rXHRcdHJldCA9IHRydWU7XG4rXHRmY2xvc2UoZnApO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4gc3RhdGljIGJvb2wgY2hlY2tfc3dhcCh2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpXG4ge1xuIFx0Ym9vbCBzd2FwID0gZmFsc2U7XG5AQCAtNTU0LDggKzU3MywxNyBAQCBzdGF0aWMgdm9pZCBtYWR2aXNlX2NvbGxhcHNlKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgaW50IG5yX2hwYWdlcyxcbiBzdGF0aWMgYm9vbCB3YWl0X2Zvcl9zY2FuKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgaW50IG5yX2hwYWdlcyxcbiBcdFx0XHQgIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4ge1xuK1x0LypcbitcdCAqIFRoZSBidWRnZXQgaGFzIHRvIGNvdmVyIGtodWdlcGFnZWQgY29weWluZyBucl9ocGFnZXMgKlxuK1x0ICogaHBhZ2VfcG1kX3NpemUsIHBsdXMgdHdvIG9mIGl0cyBwYXNzZXMgb3ZlciB0aGUgbW0uIFRocmVlIHNlY29uZHNcbitcdCAqIGRvZXMgdGhhdCBhdCBhIDJNIFBNRCwgYnV0IHRoZSBzYW1lIHRlc3QgbW92ZXMgMkcgYXQgYSA1MTJNIFBNRFxuK1x0ICogKGFybTY0IHdpdGggNjRLIGJhc2UgcGFnZXMpIGFuZCAzcyBpcyB0aGVuIG1hcmdpbmFsOiBpdCBmYWlscyBvbiBhXG4rXHQgKiBjb2xsYXBzZSB0aGF0IGNvbXBsZXRlcyBjb3JyZWN0bHksIGp1c3Qgbm90IGluc2lkZSB0aGUgYnVkZ2V0LlxuK1x0ICogQWxsb3cgYSBmdXJ0aGVyIHNlY29uZCBwZXIgNjRNIHRvIGNvbGxhcHNlLlxuK1x0ICovXG4rXHRjb25zdCB1bnNpZ25lZCBsb25nIGJ5dGVzID0gKHVuc2lnbmVkIGxvbmcpbnJfaHBhZ2VzICogaHBhZ2VfcG1kX3NpemU7XG4rXHRpbnQgdGltZW91dCA9IDYgKyAyICogKGJ5dGVzIC8gKDY0VUwgXHUwMDNjXHUwMDNjIDIwKSk7XG4gXHRpbnQgZnVsbF9zY2Fucztcbi1cdGludCB0aW1lb3V0ID0gNjsgLyogMyBzZWNvbmRzICovXG4gXG4gXHQvKiBTYW5pdHkgY2hlY2sgKi9cbiBcdGlmICghb3BzLVx1MDAzZWNoZWNrX2h1Z2UocCwgMCkpXG5AQCAtNzM1LDYgKzc2MywxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9zd2FwaW5fc2luZ2xlX3B0ZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcFxuIFx0dm9pZCAqcDtcbiBcbiBcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbitcdGlmICghaGFzX3N3YXAoKSkge1xuK1x0XHRza2lwKFwiU2tpcCAobm8gc3dhcCBjb25maWd1cmVkKVwiKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4gXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuIFxuIFx0a3NmdF9wcmludF9tc2coXCJTd2Fwb3V0IG9uZSBwYWdlLi4uXCIpO1xuQEAgLTc2MSw2ICs3OTMsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9cbiBcdHZvaWQgKnA7XG4gXG4gXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4rXHRpZiAoIWhhc19zd2FwKCkpIHtcbitcdFx0c2tpcChcIlNraXAgKG5vIHN3YXAgY29uZmlndXJlZClcIik7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuIFx0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiBcbiBcdGtzZnRfcHJpbnRfbXNnKFwiU3dhcG91dCAlZCBvZiAlZCBwYWdlcy4uLlwiLCBtYXhfcHRlc19zd2FwICsgMSwgaHBhZ2VfcG1kX25yKTtcbkBAIC04NTMsNiArODg5LDIxIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX2NvbXBvdW5kX2V4dHJlbWUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzXG4gXHR2b2lkICpwO1xuIFx0aW50IGk7XG4gXG4rXHQvKlxuK1x0ICogQnVpbGRzIGEgUE1EJ3Mgd29ydGggb2YgZGlzdGluY3QgUFRFLW1hcHBlZCBjb21wb3VuZCBwYWdlcyBieSBjeWNsaW5nXG4rXHQgKiBocGFnZV9wbWRfbnIgZmF1bHQtdGltZSBUSFBzIHRocm91Z2ggbXJlbWFwLiBGYXVsdC10aW1lIFRIUCBhbGxvY2F0aW9uXG4rXHQgKiBpcyBiZXN0LWVmZm9ydCwgYW5kIHRoaXMgbmVlZHMgaHBhZ2VfcG1kX25yIFBNRC1vcmRlciBwYWdlcyBpbiBhIHJvdzpcbitcdCAqIGZpbmUgYXQgYSAyTSAoNEsgYmFzZSkgb3IgMzJNICgxNksgYmFzZSkgUE1ELCBidXQgYSA1MTJNIFBNRCAoYXJtNjQvNjRLKVxuK1x0ICogaXMgYW4gb3JkZXItMTMgYWxsb2NhdGlvbiB0aGUgYWxsb2NhdG9yIGNhbm5vdCByZWxpYWJseSBoYW5kIG91dCBldmVuXG4rXHQgKiBvbmNlLCBsZXQgYWxvbmUgODE5MiB0aW1lcy4gQ2FwIGF0IGEgMzJNIFBNRDsgTUFEVl9DT0xMQVBTRS1kcml2ZW4gY2FzZXNcbitcdCAqIHN0aWxsIGNvdmVyIFBNRC1vcmRlciBjb2xsYXBzZSBvbiB0aGUgbGFyZ2VyIGNvbmZpZ3MuXG4rXHQgKi9cbitcdGlmIChocGFnZV9wbWRfc2l6ZSBcdTAwM2UgKDMyVUwgXHUwMDNjXHUwMDNjIDIwKSkge1xuK1x0XHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCIlczogUE1EIHRvbyBsYXJnZSBmb3IgZmF1bHQtdGltZSBUSFAgY29uc3RydWN0aW9uXFxuXCIsXG4rXHRcdFx0XHQgICAgICBfX2Z1bmNfXyk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbiBcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbiBcdGtzZnRfcHJpbnRfbXNnKFwiQ29uc3RydWN0IFBURSBwYWdlIHRhYmxlIGZ1bGwgb2YgZGlmZmVyZW50IFBURS1tYXBwZWQgY29tcG91bmQgcGFnZXNcXG5cIik7XG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBocGFnZV9wbWRfbnI7IGkrKykge1xuQEAgLTEwNDMsNiArMTA5NCw2MSBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzXG4gXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4gfVxuIFxuKy8qXG4rICogQ29udGVudCBzdGF5cyBpc29sYXRlZCB3aGlsZSBhIGNvLXNoYXJlciB3cml0ZXMgY29uY3VycmVudGx5LiBBIHNoYXJlZFxuKyAqIHNvdXJjZSBpcyBjb3BpZWQgbGl2ZSAobm90IGZyb3plbiksIHJlbHlpbmcgb24gaXQgYmVpbmcgQ29XIC0gaW1tdXRhYmxlXG4rICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29weTsgYSBjby1zaGFyZXIncyB3cml0ZSBnb2VzIHRvIGEgQ29XIGNvcHkuIFRoZVxuKyAqIGNvbGxhcHNpbmcgY2hpbGQgbXVzdCBzZWUgdGhlIHByZS1mb3JrIGNvbnRlbnQsIHRoZSB3cml0aW5nIHBhcmVudCBvbmx5XG4rICogaXRzIG93biB3cml0ZXMuXG4rICovXG4rc3RhdGljIHZvaWQgY29sbGFwc2VfZm9ya19jb3dfcmFjZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9wcylcbit7XG4rXHRjb25zdCB1bnNpZ25lZCBsb25nIHNoYXJlZCA9IDY0ICogcGFnZV9zaXplO1xuK1x0Y29uc3QgaW50IHN0cmlkZSA9IHBhZ2Vfc2l6ZSAvIHNpemVvZihpbnQpO1xuK1x0aW50IHdzdGF0dXMsIGksIG4gPSBzaGFyZWQgLyBwYWdlX3NpemU7XG4rXHRpbnQgKmlwO1xuK1x0dm9pZCAqcDtcbitcbitcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbitcdGlwID0gcDtcbitcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBzaGFyZWQpO1x0XHQvKiBzaGFyZWQgcHJlZml4LCBwcmUtZm9yayBwYXR0ZXJuICovXG4rXG4rXHRrc2Z0X3ByaW50X21zZyhcIkZvcmssIGNvbGxhcHNlIGluIHRoZSBjaGlsZCB3aGlsZSB0aGUgcGFyZW50IHJld3JpdGVzLi4uXCIpO1xuK1x0aWYgKCFmb3JrKCkpIHtcbitcdFx0b3BzLVx1MDAzZWZhdWx0KHAsIHNoYXJlZCwgaHBhZ2VfcG1kX3NpemUpO1x0LyogcHJpdmF0ZSByZW1haW5kZXIgKi9cbitcdFx0Yy1cdTAwM2Vjb2xsYXBzZShcIkNvbGxhcHNlIGEgcmFuZ2Ugc2hhcmVkIHdpdGggYSB3cml0aW5nIGNvLXNoYXJlclwiLFxuK1x0XHRcdCAgICBwLCAxLCBvcHMsIHRydWUpO1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuOyBpKyspXG4rXHRcdFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgKyAweGRlYWQwMDAwKSB7XG4rXHRcdFx0XHRmYWlsKFwiRmFpbDogY2hpbGQgY29udGVudFwiKTtcbitcdFx0XHRcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0XHRcdFx0X2V4aXQoZXhpdF9zdGF0dXMpO1xuK1x0XHRcdH1cbitcdFx0c3VjY2VzcyhcIk9LXCIpO1xuK1x0XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdFx0X2V4aXQoZXhpdF9zdGF0dXMpO1xuK1x0fVxuK1xuK1x0LyogSGFtbWVyIHRoZSBwYXJlbnQncyBvd24gd3JpdGVzIG92ZXIgdGhlIHNoYXJlZCBwcmVmaXguICovXG4rXHRmb3IgKGludCBpdCA9IDA7IGl0IFx1MDAzYyAyMDAwMDA7IGl0KyspXG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkrKylcbitcdFx0XHRpcFtpICogc3RyaWRlXSA9IGkgKyAweGJlZWYwMDAwO1xuK1xuK1x0d2FpdChcdTAwMjZ3c3RhdHVzKTtcbitcdGV4aXRfc3RhdHVzID0gV0VYSVRTVEFUVVMod3N0YXR1cyk7XG4rXG4rXHRrc2Z0X3ByaW50X21zZyhcIkNoZWNrIHRoZSBwYXJlbnQgc2VlcyBvbmx5IGl0cyBvd24gd3JpdGVzLi4uXCIpO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbjsgaSsrKVxuK1x0XHRpZiAoaXBbaSAqIHN0cmlkZV0gIT0gaSArIDB4YmVlZjAwMDApXG4rXHRcdFx0YnJlYWs7XG4rXHRpZiAoaSA9PSBuKVxuK1x0XHRzdWNjZXNzKFwiT0tcIik7XG4rXHRlbHNlXG4rXHRcdGZhaWwoXCJGYWlsOiBwYXJlbnQgY29udGVudFwiKTtcbitcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwiJXNcXG5cIiwgX19mdW5jX18pO1xuK31cbitcbiBzdGF0aWMgdm9pZCBtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4gXHRcdFx0XHRcdCAgIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4ge1xuQEAgLTEwODgsNiArMTE5NCwyMjIgQEAgc3RhdGljIHZvaWQgbWFkdmlzZV9yZXRyYWN0ZWRfcGFnZV90YWJsZXMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4gXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4gfVxuIFxuKy8qXG4rICogT3JkZXItcGFyYW1ldGVyaXplZCBjb2xsYXBzZSBjYXNlcyAoLW8gXHUwMDNjb3JkZXJcdTAwM2UpOiBraHVnZXBhZ2VkIGNvbGxhcHNlc1xuKyAqIDRLLWZhdWx0ZWQgbWVtb3J5IGludG8gZm9saW9zIG9mIHRoZSBnaXZlbiBzdWItUE1EIG9yZGVyLiBEZXRlY3Rpb24gaXNcbisgKiBmb2xpby1iYXNlZCAodm1fdXRpbCksIG5vdCBzbWFwczogQW5vbkh1Z2VQYWdlcyBvbmx5IGFjY291bnRzIFBNRFxuKyAqIG1hcHBpbmdzLlxuKyAqXG4rICogVGhlIHJlZ2lvbiBpcyBmYXVsdGVkIGJlZm9yZSBNQURWX0hVR0VQQUdFIGFuZCB0aGUgdGFyZ2V0IG9yZGVyIGlzXG4rICogY29uZmlndXJlZCBcImluaGVyaXRcIiB1bmRlciBlbmFibGVkPW1hZHZpc2UsIHNvIGZhdWx0cyBhcmUgYWx3YXlzXG4rICogb3JkZXIgMCBhbmQgdGhlIGNvbGxhcHNlIHByb2R1Y3QgY2FuIG9ubHkgY29tZSBmcm9tIGtodWdlcGFnZWQuXG4rICovXG4rc3RhdGljIHNpemVfdCBhbm9uX29yZGVyX3NpemUodm9pZClcbit7XG4rXHRyZXR1cm4gcGFnZV9zaXplIFx1MDAzY1x1MDAzYyBhbm9uX3RhcmdldF9vcmRlcjtcbit9XG4rXG4rc3RhdGljIGJvb2wgcmFuZ2VfY29sbGFwc2VkKHZvaWQgKnAsIHNpemVfdCBsZW4pXG4re1xuK1x0cmV0dXJuIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgbGVuLCBhbm9uX3RhcmdldF9vcmRlcixcbitcdFx0XHRcdFx0ICAgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpO1xuK31cbitcbisvKiBObyBhbGlnbmVkIHdpbmRvdyBpbiBbcCwgcCArIGxlbikgaXMgYmFja2VkIGF0IHRoZSB0YXJnZXQgb3JkZXIuICovXG4rc3RhdGljIGJvb2wgcmFuZ2Vfbm90X2NvbGxhcHNlZCh2b2lkICpwLCBzaXplX3QgbGVuKVxuK3tcbitcdHNpemVfdCB3aW5kb3cgPSBhbm9uX29yZGVyX3NpemUoKTtcbitcdGNoYXIgKmFkZHIgPSBwO1xuK1xuK1x0Zm9yICg7IGxlbiBcdTAwM2U9IHdpbmRvdzsgYWRkciArPSB3aW5kb3csIGxlbiAtPSB3aW5kb3cpIHtcbitcdFx0aWYgKHJhbmdlX2NvbGxhcHNlZChhZGRyLCB3aW5kb3cpKVxuK1x0XHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcdHJldHVybiB0cnVlO1xuK31cbitcbitzdGF0aWMgYm9vbCBraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKHZvaWQpXG4re1xuK1x0LyogV2FpdCB1cCB0byAzMCBzZWNvbmRzIGZvciB0aGUgcGFzcyB0byBjb21wbGV0ZS4gKi9cbitcdHJldHVybiBraHVnZXBhZ2VkX2Z1bGxfcGFzcygzMCk7XG4rfVxuK1xuKy8qXG4rICogQ2FzZXMgd2hvc2UgZ2VvbWV0cnkgbmVlZHMgYSB3aW5kb3cgc3RyaWN0bHkgYmVsb3cgdGhlIFBNRCBza2lwIGF0XG4rICogLW8gXHUwMDNjUE1EIG9yZGVyXHUwMDNlOyB0aGUgcmVzdCBydW4gdGhlcmUgdW5jaGFuZ2VkLCBiYXNlbGluaW5nIHRoZSBsZWdhY3lcbisgKiBQTUQgZW5naW5lIHdpdGggdGhlIHNhbWUgdGVzdCB0ZXh0IHVzZWQgZm9yIHRoZSBtVEhQIG9yZGVycy5cbisgKi9cbitzdGF0aWMgYm9vbCBza2lwX2F0X3BtZF9vcmRlcihjb25zdCBjaGFyICpuYW1lKVxuK3tcbitcdGlmIChhbm9uX3RhcmdldF9vcmRlciBcdTAwM2MgaHBhZ2VfcG1kX29yZGVyKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCIlczogbmVlZHMgYSB3aW5kb3cgYmVsb3cgdGhlIFBNRFxcblwiLCBuYW1lKTtcbitcdHJldHVybiB0cnVlO1xuK31cbitcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9mdWxsKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuK3tcbitcdHZvaWQgKnA7XG4rXG4rXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4rXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0aWYgKCFyYW5nZV9ub3RfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiVW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcblwiKTtcbitcbitcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuK1x0a3NmdF9wcmludF9tc2coXCJDb2xsYXBzZSBmdWxseSBwb3B1bGF0ZWQgUFRFIHRhYmxlIHRvIHRhcmdldCBvcmRlci4uLlwiKTtcbitcdGlmICgha2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcygpKVxuK1x0XHRmYWlsKFwiVGltZW91dFwiKTtcbitcdGVsc2UgaWYgKHJhbmdlX2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXG4rXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbitcdGVsc2VcbitcdFx0ZmFpbChcIkZhaWxcIik7XG4rXG4rXHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX3NpbmdsZV93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4rXHRcdFx0XHRcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuK3tcbitcdHNpemVfdCB3aW5kb3cgPSBhbm9uX29yZGVyX3NpemUoKTtcbitcdHZvaWQgKnA7XG4rXG4rXHRpZiAoc2tpcF9hdF9wbWRfb3JkZXIoX19mdW5jX18pKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4rXHRvcHMtXHUwMDNlZmF1bHQocCwgd2luZG93LCAyICogd2luZG93KTtcbitcdGlmICghcmFuZ2Vfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIlVuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXG5cIik7XG4rXG4rXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbitcdGtzZnRfcHJpbnRfbXNnKFwiQ29sbGFwc2Ugb25lIGZ1bGx5IHBvcHVsYXRlZCB3aW5kb3cuLi5cIik7XG4rXHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcbitcdFx0ZmFpbChcIlRpbWVvdXRcIik7XG4rXHRlbHNlIGlmIChyYW5nZV9jb2xsYXBzZWQocCArIHdpbmRvdywgd2luZG93KSBcdTAwMjZcdTAwMjZcbitcdFx0IHJhbmdlX25vdF9jb2xsYXBzZWQocCwgd2luZG93KSBcdTAwMjZcdTAwMjZcbitcdFx0IHJhbmdlX25vdF9jb2xsYXBzZWQocCArIDIgKiB3aW5kb3csXG4rXHRcdFx0XHQgICAgIGhwYWdlX3BtZF9zaXplIC0gMiAqIHdpbmRvdykpXG4rXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbitcdGVsc2VcbitcdFx0ZmFpbChcIkZhaWxcIik7XG4rXG4rXHR2YWxpZGF0ZV9tZW1vcnkocCwgd2luZG93LCAyICogd2luZG93KTtcbitcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwiJXNcXG5cIiwgX19mdW5jX18pO1xuK31cbitcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbitcdFx0XHRcdFx0ICBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuK3tcbitcdHZvaWQgKnA7XG4rXG4rXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4rXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgcGFnZV9zaXplKTtcbitcdGlmICghcmFuZ2Vfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIlVuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXG5cIik7XG4rXG4rXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbitcdGtzZnRfcHJpbnRfbXNnKFwiQ29sbGFwc2Ugd2luZG93IHdpdGggc2luZ2xlIFBURSBlbnRyeSBwcmVzZW50Li4uXCIpO1xuK1x0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXG4rXHRcdGZhaWwoXCJUaW1lb3V0XCIpO1xuK1x0ZWxzZSBpZiAocmFuZ2VfY29sbGFwc2VkKHAsIGFub25fb3JkZXJfc2l6ZSgpKSlcbitcdFx0c3VjY2VzcyhcIk9LXCIpO1xuK1x0ZWxzZVxuK1x0XHRmYWlsKFwiRmFpbFwiKTtcbitcbitcdHZhbGlkYXRlX21lbW9yeShwLCAwLCBwYWdlX3NpemUpO1xuK1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4rXHRcdFx0XHRcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuK3tcbitcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbitcdHNpemVfdCB3aW5kb3cgPSBhbm9uX29yZGVyX3NpemUoKTtcbitcdHZvaWQgKnA7XG4rXG4rXHRpZiAoc2tpcF9hdF9wbWRfb3JkZXIoX19mdW5jX18pKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSAwO1xuK1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1xuK1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuK1x0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIDIgKiB3aW5kb3cgLSBwYWdlX3NpemUpO1xuK1x0aWYgKCFyYW5nZV9ub3RfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiVW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcblwiKTtcbitcbitcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuK1x0a3NmdF9wcmludF9tc2coXCJDb2xsYXBzZSBmdWxsIHdpbmRvdywgbm90IHRoZSBvbmUgbWlzc2luZyBhIHBhZ2UuLi5cIik7XG4rXHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcbitcdFx0ZmFpbChcIlRpbWVvdXRcIik7XG4rXHRlbHNlIGlmIChyYW5nZV9jb2xsYXBzZWQocCwgd2luZG93KSBcdTAwMjZcdTAwMjZcbitcdFx0IHJhbmdlX25vdF9jb2xsYXBzZWQocCArIHdpbmRvdywgd2luZG93KSlcbitcdFx0c3VjY2VzcyhcIk9LXCIpO1xuK1x0ZWxzZVxuK1x0XHRmYWlsKFwiRmFpbFwiKTtcbitcbitcdHZhbGlkYXRlX21lbW9yeShwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTtcbitcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuK1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwiJXNcXG5cIiwgX19mdW5jX18pO1xuK31cbitcbisvKiBTbWFsbGVzdCBvcmRlciBraHVnZXBhZ2VkIHdpbGwgY29uc2lkZXIgZm9yIG1USFAgY29sbGFwc2UuICovXG4rI2RlZmluZSBNSU5fTVRIUF9PUkRFUiAyXG4rXG4rLypcbisgKiBBIHJlZ2lvbiBiYWNrZWQgYnkgbGFyZ2UgZm9saW9zIG9mIGEgc21hbGxlciBvcmRlciBpcyBhIHZhbGlkIHNvdXJjZVxuKyAqIGZvciBjb2xsYXBzZSB0byB0aGUgdGFyZ2V0IG9yZGVyOlxuKyAqIF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKSBhY2NlcHRzIGFueSBzb3VyY2UgZm9saW8gb2YgYW4gb3JkZXJcbisgKiBzdHJpY3RseSBiZWxvdyB0aGUgY2FuZGlkYXRlJ3MuXG4rICovXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWl4ZWRfc291cmNlcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbitcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4re1xuK1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuK1x0aW50IHNvdXJjZV9vcmRlciA9IGFub25fb3JkZXIgPyBhbm9uX29yZGVyIDogTUlOX01USFBfT1JERVI7XG4rXHR2b2lkICpwO1xuK1xuK1x0LyogU291cmNlcyBtdXN0IGJlIGEgc3VwcG9ydGVkIG1USFAgb3JkZXIgc3RyaWN0bHkgYmVsb3cgdGhlIHRhcmdldC4gKi9cbitcdGlmIChzb3VyY2Vfb3JkZXIgXHUwMDNlPSBhbm9uX3RhcmdldF9vcmRlciB8fFxuK1x0ICAgICEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2Mgc291cmNlX29yZGVyKSkpIHtcbitcdFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFwiJXM6IG5vIHNvdXJjZSBvcmRlciBiZWxvdyB0YXJnZXRcXG5cIixcbitcdFx0XHRcdCAgICAgIF9fZnVuY19fKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuK1x0LyogRmF1bHQgdGhlIHdob2xlIHJlZ2lvbiBhcyBvcmRlci1Ac291cmNlX29yZGVyIGZvbGlvcy4gKi9cbitcdHNldHRpbmdzLmh1Z2VwYWdlc1tzb3VyY2Vfb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTO1xuK1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuK1x0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcbitcdGlmICghaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBocGFnZV9wbWRfc2l6ZSwgc291cmNlX29yZGVyLFxuK1x0XHRcdFx0XHQgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJSZWdpb24gbm90IGJhY2tlZCBieSBvcmRlci0lZCBmb2xpb3MgYWZ0ZXIgZmF1bHRcXG5cIixcbitcdFx0XHRcdCAgIHNvdXJjZV9vcmRlcik7XG4rXG4rXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbitcdGtzZnRfcHJpbnRfbXNnKFwiQ29sbGFwc2UgcmVnaW9uIGJhY2tlZCBieSBvcmRlci0lZCBzb3VyY2VzLi4uXCIsXG4rXHRcdCAgICAgICBzb3VyY2Vfb3JkZXIpO1xuK1x0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXG4rXHRcdGZhaWwoXCJUaW1lb3V0XCIpO1xuK1x0ZWxzZSBpZiAocmFuZ2VfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbitcdFx0c3VjY2VzcyhcIk9LXCIpO1xuK1x0ZWxzZVxuK1x0XHRmYWlsKFwiRmFpbFwiKTtcbitcbitcdHZhbGlkYXRlX21lbW9yeShwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbit9XG4rXG4gc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcbiB7XG4gXHRmcHJpbnRmKHN0ZGVyciwgXCJcXG5Vc2FnZTogLi9raHVnZXBhZ2VkIFtPUFRJT05TXSBcdTAwM2N0ZXN0IHR5cGVcdTAwM2UgW2Rpcl1cXG5cXG5cIik7XG5AQCAtMTEwMyw2ICsxNDI1LDExIEBAIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXG4gXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0LWg6IFRoaXMgaGVscCBtZXNzYWdlLlxcblwiKTtcbiBcdGZwcmludGYoc3RkZXJyLFx0XCJcXHRcXHQtczogbVRIUCBzaXplLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXG5cIik7XG4gXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0ICAgIERlZmF1bHRzIHRvIDAuIFVzZSB0aGlzIHNpemUgZm9yIGFub24gb3Igc2htZW0gYWxsb2NhdGlvbnMuXFxuXCIpO1xuK1x0ZnByaW50ZihzdGRlcnIsXHRcIlxcdFxcdC1vOiBjb2xsYXBzZSB0YXJnZXQgb3JkZXIgZm9yIGtodWdlcGFnZWQ6YW5vbi5cXG5cIik7XG4rXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0ICAgIFJ1bnMgdGhlIG9yZGVyLXBhcmFtZXRlcml6ZWQgY29sbGFwc2UgY2FzZXMgaW5zdGVhZFxcblwiKTtcbitcdGZwcmludGYoc3RkZXJyLFx0XCJcXHRcXHQgICAgb2YgdGhlIFBNRCBjYXNlcy5cXG5cIik7XG4rXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0ICAgIFdpdGggLXMsIC1zIG5hbWVzIHRoZSBtVEhQIHNvdXJjZSBvcmRlciBmb3IgdGhlXFxuXCIpO1xuK1x0ZnByaW50ZihzdGRlcnIsXHRcIlxcdFxcdCAgICBtaXhlZC1zb3VyY2UgY2FzZSAoc291cmNlIG9yZGVyIGJlbG93IHRoZSB0YXJnZXQpLlxcblwiKTtcbiBcdGV4aXQoMSk7XG4gfVxuIFxuQEAgLTExMTIsMTcgKzE0MzksMzEgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGNoYXIgKmJ1ZjtcbiBcdGNvbnN0IGNoYXIgKnRva2VuO1xuIFxuLVx0d2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgXCJzOmhcIikpICE9IC0xKSB7XG4rXHR3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCBcInM6bzpoXCIpKSAhPSAtMSkge1xuIFx0XHRzd2l0Y2ggKG9wdCkge1xuIFx0XHRjYXNlICdzJzpcbiBcdFx0XHRhbm9uX29yZGVyID0gYXRvaShvcHRhcmcpO1xuIFx0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICdvJzpcbitcdFx0XHRhbm9uX3RhcmdldF9vcmRlciA9IGF0b2kob3B0YXJnKTtcbitcdFx0XHRicmVhaztcbiBcdFx0Y2FzZSAnaCc6XG4gXHRcdGRlZmF1bHQ6XG4gXHRcdFx0dXNhZ2UoKTtcbiBcdFx0fVxuIFx0fVxuIFxuK1x0LypcbitcdCAqIC1zIGFuZCAtbyBjb21wb3NlOiAtcyB0aGVuIG5hbWVzIHRoZSBtVEhQIHNvdXJjZSBvcmRlciBmb3IgdGhlXG4rXHQgKiBtaXhlZC1zb3VyY2UgY2FzZSwgd2hpY2ggbmVlZHMgYSBzb3VyY2Ugc3RyaWN0bHkgYmVsb3cgdGhlXG4rXHQgKiB0YXJnZXQgKGFuZCBhdCBvciBhYm92ZSB0aGUgc21hbGxlc3QgbVRIUCBvcmRlcikuIEFsb25lLCAtcyBpc1xuK1x0ICogdGhlIHNvdXJjZSBvcmRlciBmb3IgdGhlIGRlZmF1bHQgUE1EIHN1aXRlOyBhbG9uZSwgLW8gaXMgdGhlXG4rXHQgKiBjb2xsYXBzZSB0YXJnZXQgZm9yIHRoZSBvcmRlci1wYXJhbWV0ZXJpemVkIHN1aXRlLlxuK1x0ICovXG4rXHRpZiAoYW5vbl90YXJnZXRfb3JkZXIgXHUwMDI2XHUwMDI2IGFub25fb3JkZXIgXHUwMDI2XHUwMDI2XG4rXHQgICAgKGFub25fb3JkZXIgXHUwMDNjIE1JTl9NVEhQX09SREVSIHx8IGFub25fb3JkZXIgXHUwMDNlPSBhbm9uX3RhcmdldF9vcmRlcikpXG4rXHRcdHVzYWdlKCk7XG4rXG4gXHRhcmd2ICs9IG9wdGluZDtcbiBcdGFyZ2MgLT0gb3B0aW5kO1xuIFxuQEAgLTEyMDcsNyArMTU0OCw2IEBAIHN0YXRpYyBpbnQgbnJfdGVzdF9jYXNlcztcbiBcbiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4ge1xuLVx0aW50IGhwYWdlX3BtZF9vcmRlcjtcbiBcdHN0cnVjdCB0aHBfc2V0dGluZ3MgZGVmYXVsdF9zZXR0aW5ncyA9IHtcbiBcdFx0LnRocF9lbmFibGVkID0gVEhQX01BRFZJU0UsXG4gXHRcdC50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVMsXG5AQCAtMTI0NCwxOCArMTU4NCw5NCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRocGFnZV9wbWRfbnIgPSBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTtcbiBcdGhwYWdlX3BtZF9vcmRlciA9IF9fYnVpbHRpbl9jdHooaHBhZ2VfcG1kX25yKTtcbiBcbitcdC8qXG4rXHQgKiBUaGUgcGFnZSBjYWNoZSBjYXBzIGZvbGlvIG9yZGVyIGF0IE1BWF9QQUdFQ0FDSEVfT1JERVIsIHdoaWNoXG4rXHQgKiB4YXNfc3BsaXRfYWxsb2MoKSBwdXRzIGJlbG93IHRoZSBQTUQgb3JkZXIgb24gYXJtNjQgd2l0aCA2NEsgcGFnZXMuXG4rXHQgKiBBIFBNRC1zaXplZCBwYWdlIGNhY2hlIGZvbGlvIGlzIHRoZW4gaW1wb3NzaWJsZSwgc28gdGhlIGtlcm5lbFxuK1x0ICogcmVmdXNlcyB0aGVzZSBjb2xsYXBzZXMgYnkgZGVzaWduIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIHRlc3QuXG4rXHQgKi9cbitcdGlmICghKHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGhwYWdlX3BtZF9vcmRlcikpKSB7XG4rXHRcdGlmIChzaG1lbV9vcHMpIHtcbitcdFx0XHRrc2Z0X3ByaW50X21zZyhcIm5vIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvOiBza2lwcGluZyBzaG1lbVxcblwiKTtcbitcdFx0XHRzaG1lbV9vcHMgPSBOVUxMO1xuK1x0XHR9XG4rXHRcdGlmIChmaW5mby50eXBlID09IFZNQV9TSE1FTSBcdTAwMjZcdTAwMjYgcmVhZF9vbmx5X2ZpbGVfb3BzKSB7XG4rXHRcdFx0a3NmdF9wcmludF9tc2coXCJubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgdG1wZnMgZmlsZVxcblwiKTtcbitcdFx0XHRyZWFkX29ubHlfZmlsZV9vcHMgPSBOVUxMO1xuK1x0XHRcdHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9IE5VTEw7XG4rXHRcdFx0cmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9IE5VTEw7XG4rXHRcdH1cbitcdFx0aWYgKCFhbm9uX29wcyBcdTAwMjZcdTAwMjYgIXNobWVtX29wcyBcdTAwMjZcdTAwMjYgIXJlYWRfb25seV9maWxlX29wcylcbitcdFx0XHRrc2Z0X2V4aXRfc2tpcChcIk5vdGhpbmcgbGVmdCB0byBjb2xsYXBzZSBpbnRvXFxuXCIpO1xuK1x0fVxuK1xuK1x0aWYgKGFub25fdGFyZ2V0X29yZGVyIFx1MDAyNlx1MDAyNlxuK1x0ICAgICEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgYW5vbl90YXJnZXRfb3JkZXIpKSlcbitcdFx0a3NmdF9leGl0X3NraXAoXCJPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcXG5cIixcbitcdFx0XHQgICAgICAgYW5vbl90YXJnZXRfb3JkZXIpO1xuK1x0aWYgKGFub25fdGFyZ2V0X29yZGVyIFx1MDAzZSBocGFnZV9wbWRfb3JkZXIpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIi1vIHRha2VzIGF0IG1vc3QgdGhlIFBNRCBvcmRlclxcblwiKTtcbitcbiBcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gaHBhZ2VfcG1kX25yIC0gMTtcbiBcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zd2FwID0gaHBhZ2VfcG1kX25yIC8gODtcbiBcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zaGFyZWQgPSBocGFnZV9wbWRfbnIgLyAyO1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSBocGFnZV9wbWRfbnIgKiA4O1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5odWdlcGFnZXNbaHBhZ2VfcG1kX29yZGVyXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XG4tXHRkZWZhdWx0X3NldHRpbmdzLmh1Z2VwYWdlc1thbm9uX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcbiBcdGRlZmF1bHRfc2V0dGluZ3Muc2htZW1faHVnZXBhZ2VzW2hwYWdlX3BtZF9vcmRlcl0uZW5hYmxlZCA9IFNITUVNX0lOSEVSSVQ7XG4tXHRkZWZhdWx0X3NldHRpbmdzLnNobWVtX2h1Z2VwYWdlc1thbm9uX29yZGVyXS5lbmFibGVkID0gU0hNRU1fQUxXQVlTO1xuK1x0LypcbitcdCAqIFVuZGVyIC1vIHRoZSBvcmRlci1wYXJhbWV0ZXJpemVkIGNhc2VzIHdhbnQgb3JkZXItMCBzb3VyY2VzIGJ5XG4rXHQgKiBkZWZhdWx0OyB0aGUgbWl4ZWQtc291cmNlIGNhc2UgZW5hYmxlcyBpdHMgb3duIChwb3NzaWJseSAtc1xuK1x0ICogc2VsZWN0ZWQpIHNvdXJjZSBvcmRlciBsb2NhbGx5LiBFbmFibGluZyBpdCBnbG9iYWxseSBoZXJlIHdvdWxkXG4rXHQgKiBtYWtlIGV2ZXJ5IGNhc2UgZmF1bHQgdGhhdCBvcmRlci5cbitcdCAqL1xuK1x0aWYgKCFhbm9uX3RhcmdldF9vcmRlcikge1xuK1x0XHRkZWZhdWx0X3NldHRpbmdzLmh1Z2VwYWdlc1thbm9uX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcbitcdFx0ZGVmYXVsdF9zZXR0aW5ncy5zaG1lbV9odWdlcGFnZXNbYW5vbl9vcmRlcl0uZW5hYmxlZCA9IFNITUVNX0FMV0FZUztcbitcdH1cbitcbitcdGlmIChhbm9uX3RhcmdldF9vcmRlcikge1xuK1x0XHQvKlxuK1x0XHQgKiBPbmx5IHRoZSB0YXJnZXQgb3JkZXIgbWF5IHByb2R1Y2UgbGFyZ2UgZm9saW9zLCBhbmQgb25seVxuK1x0XHQgKiBmcm9tIGtodWdlcGFnZWQ6IFwiaW5oZXJpdFwiIHVuZGVyIGVuYWJsZWQ9bWFkdmlzZSBrZWVwc1xuK1x0XHQgKiBwcmUtTUFEVl9IVUdFUEFHRSBmYXVsdHMgYXQgb3JkZXIgMC5cbitcdFx0ICovXG4rXHRcdGRlZmF1bHRfc2V0dGluZ3MuaHVnZXBhZ2VzW2hwYWdlX3BtZF9vcmRlcl0uZW5hYmxlZCA9IFRIUF9ORVZFUjtcbitcdFx0ZGVmYXVsdF9zZXR0aW5ncy5odWdlcGFnZXNbYW5vbl90YXJnZXRfb3JkZXJdLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcbitcdFx0LypcbitcdFx0ICogT3JkZXItcGFyYW1ldGVyaXplZCBjYXNlcyBhcmUgZHJpdmVuIHN0cmljdGx5IGJ5IHRoZVxuK1x0XHQgKiBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIGJhcnJpZXIsIHdoaWNoIHdha2VzIHRoZSBkYWVtb25cbitcdFx0ICogaXRzZWxmLiBBIGxvbmcgc2Nhbl9zbGVlcCBrZWVwcyBraHVnZXBhZ2VkIGZyb21cbitcdFx0ICogZnJlZS1ydW5uaW5nIGJldHdlZW4gYmFycmllciBzdGVwcywgYW5kIGEgcGFnZXNfdG9fc2NhblxuK1x0XHQgKiBjb3ZlcmluZyBldmVyeXRoaW5nIG1ha2VzIG9uZSB3YWtlIGNvbXBsZXRlIG9uZSBmdWxsXG4rXHRcdCAqIHBhc3MgKHRoZSBiYXJyaWVyJ3MgY29udHJhY3QpLCBzbyBhIHJ1biBwZXJmb3JtcyBhXG4rXHRcdCAqIGRldGVybWluaXN0aWMgbnVtYmVyIG9mIHBhc3NlcyDigJQgd2hhdCB0aGUgc3RhZ2UgQS9CXG4rXHRcdCAqIHRyYWNlIGNvbXBhcmlzb25zIHJlbHkgb24uXG4rXHRcdCAqL1xuK1x0XHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQuc2Nhbl9zbGVlcF9taWxsaXNlY3MgPSA2MDAwMDtcbitcdFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSAxVUwgXHUwMDNjXHUwMDNjIDI0O1xuK1xuK1x0XHRwYWdlbWFwX2ZkID0gb3BlbihcIi9wcm9jL3NlbGYvcGFnZW1hcFwiLCBPX1JET05MWSk7XG4rXHRcdGlmIChwYWdlbWFwX2ZkIFx1MDAzYyAwKVxuK1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm9wZW4oXFxcIi9wcm9jL3NlbGYvcGFnZW1hcFxcXCIpXCIpO1xuK1x0XHRrcGFnZWZsYWdzX2ZkID0gb3BlbihcIi9wcm9jL2twYWdlZmxhZ3NcIiwgT19SRE9OTFkpO1xuK1x0XHRpZiAoa3BhZ2VmbGFnc19mZCBcdTAwM2MgMClcbitcdFx0XHRrc2Z0X2V4aXRfc2tpcChcIm9wZW4oXFxcIi9wcm9jL2twYWdlZmxhZ3NcXFwiKSByZXF1aXJlcyByb290XFxuXCIpO1xuK1x0fVxuIFxuIFx0c2F2ZV9zZXR0aW5ncygpO1xuIFx0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2ZGVmYXVsdF9zZXR0aW5ncyk7XG4gXG4rXHRpZiAoYW5vbl90YXJnZXRfb3JkZXIpIHtcbitcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdywga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfbWl4ZWRfc291cmNlcywga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXG4rXHRcdGtzZnRfc2V0X3BsYW4obnJfdGVzdF9jYXNlcyk7XG4rXHRcdGdvdG8gcnVuO1xuK1x0fVxuK1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG5AQCAtMTMyNCw2ICsxNzQwLDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0VEVTVChjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQsIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFxuK1x0VEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFRFU1QoY29sbGFwc2VfZm9ya19jb3dfcmFjZSwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4rXG4gXHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpO1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcbkBAIC0xMzM2LDYgKzE3NTUsNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRrc2Z0X3NldF9wbGFuKG5yX3Rlc3RfY2FzZXMgKyAxKTtcbiBcbiBcdGFsbG9jX2F0X2ZhdWx0KCk7XG4rcnVuOlxuIFx0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIG5yX3Rlc3RfY2FzZXM7IGkrKykge1xuIFx0XHRzdHJ1Y3QgdGVzdF9jYXNlICp0ID0gXHUwMDI2dGVzdF9jYXNlc1tpXTtcbiBcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMmFhNDVjOWU4YTc3ZlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmNcbkBAIC0wLDAgKzEsNDgzIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIGtodWdlcGFnZWQgcmFjZSBoYXJuZXNzLlxuKyAqXG4rICogUnVucyBjb2xsYXBzZSBhZ2FpbnN0IGNvbmN1cnJlbnQgZmF1bHRzLCB0cmFuc2llbnQgR1VQIHBpbnNcbisgKiAoZ3VwX3Rlc3QpLCBmb3JrLCBtcmVtYXAgYW5kIE1BRFZfRE9OVE5FRUQgb3ZlciB0aGUgc2FtZSByYW5nZXMsIGluXG4rICogb25lIG9mIHRocmVlIGRyaXZlciBtb2RlczpcbisgKlxuKyAqICAgc3RlcHBlZFx0a2h1Z2VwYWdlZCwgZHJpdmVuIHN5bmNocm9ub3VzbHkgb25lIGZ1bGwgcGFzcyBhdCBhIHRpbWVcbisgKlx0XHR0aHJvdWdoIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkg4oCUIHRoZSBwcmltYXJ5IGRyaXZlcjogdGhlXG4rICpcdFx0ZnVsbCBzY2FuK2NvbGxhcHNlIHBhdGggd2l0aCBhIGRldGVybWluaXN0aWMgZXh0ZW50IHBlclxuKyAqXHRcdHN0ZXA7XG4rICogICBmcmVlXHRmcmVlLXJ1bm5pbmcga2h1Z2VwYWdlZCAoc2Nhbl9zbGVlcF9taWxsaXNlY3M9MCkg4oCUIHRoZVxuKyAqXHRcdHNvYWs7XG4rICogICBtYWR2aXNlXHRNQURWX0NPTExBUFNFIGluIGEgbG9vcCDigJQgdGhlIGxlZ2FjeS1QTUQgcmVncmVzc2lvblxuKyAqXHRcdGF4aXMuXG4rICpcbisgKiBBbGwgYW5vbiBUSFAgb3JkZXJzIGFyZSBlbmFibGVkIChpbmhlcml0KS4gbWF4X3B0ZXNfbm9uZSBpcyAwIGJ5XG4rICogZGVmYXVsdCDigJQgcmFjaW5nIE1BRFZfRE9OVE5FRUQgdGhlbiBzdGVlcnMgc2VsZWN0aW9uIGFjcm9zcyBvcmRlcnMg4oCUXG4rICogb3IgdGhlIHBlcm1pc3NpdmUgbGltaXQgd2l0aCAteiwgd2hpY2ggZmxvb2RzIHRoZSBiYXRjaCBlbmdpbmUgd2l0aFxuKyAqIGhvbGUgYW5kIHplcm9wYWdlIHNsb3RzIHNvIHRoZSBwb3B1bGF0aW9uIHBhdGhzIChwYXJrLXRpbWUgemVyb3BhZ2VcbisgKiBjbGVhciwgemVyby1maWxsZWQgY29weSwgaW5zdGFsbC10aW1lIHB0ZV9ub25lKCkgdmVyaWZ5IGFuZCBhYm9ydClcbisgKiByYWNlIHRoZSBmYXVsdGVycyBkaXJlY3RseS5cbisgKlxuKyAqIC1wIGFkZHMgbWVtb3J5IHByZXNzdXJlIHRvIGFueSBvZiB0aGUgYWJvdmU6IE1BRFZfUEFHRU9VVCBjeWNsaW5nXG4rICogb24gYSBkZWRpY2F0ZWQgbmVpZ2hib3IgcmVnaW9uIChzd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybjsgc2tpcHBlZFxuKyAqIHdpdGggYSBub3RlIHdoZW4gdGhlIGhvc3QgaGFzIG5vIHN3YXApIGFuZCBhIGNvbXBhY3RfbWVtb3J5IHRyaWdnZXJcbisgKiBsb29wIChjb21wYWN0aW9uIG1pZ3JhdGVzIHNvdXJjZSBmb2xpb3MsIHJhY2luZyBjb2xsYXBzZSdzIGZyZWV6ZVxuKyAqIHdpdGggcmVmY291bnQgZWxldmF0aW9uIGFuZCBtaWdyYXRpb24gZW50cmllcyBvZiBpdHMgb3duKS5cbisgKlxuKyAqIENvcnJlY3RuZXNzIHNpZ25hbHM6IGV2ZXJ5IHJhY2luZyBwYWdlIG11c3QgcmVhZCBhcyBpdHMgcGF0dGVybiBvclxuKyAqIHplcm8gKE1BRFZfRE9OVE5FRUQpLCBuZXZlciBhbnl0aGluZyBlbHNlIOKAlCBjaGVja2VkIGNvbnRpbnVvdXNseSBieVxuKyAqIHRoZSBmYXVsdGVycyBhbmQgdGhlIGZvcmsgY2hpbGRyZW4gYW5kIG9uY2UgYXQgdGhlIGVuZCDigJQgcGx1c1xuKyAqIHdoYXRldmVyIERFQlVHX1ZNIC8gcGFnZV90YWJsZV9jaGVjayAvIEtBU0FOIC8gbG9ja2RlcCByZXBvcnQgaW5cbisgKiBkbWVzZywgd2hpY2ggdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBpbnNwZWN0LlxuKyAqL1xuKyNkZWZpbmUgX0dOVV9TT1VSQ0VcbisjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL2lvY3RsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwia3NlbGZ0ZXN0LmhcIlxuKyNpbmNsdWRlIFwidm1fdXRpbC5oXCJcbisjaW5jbHVkZSBcImh1Z2VwYWdlX3NldHRpbmdzLmhcIlxuKyNpbmNsdWRlIFwiLi4vLi4vLi4vLi4vbW0vZ3VwX3Rlc3QuaFwiXG4rXG4rI2RlZmluZSBCQVNFX0FERFJcdCgodm9pZCAqKSgxVUwgXHUwMDNjXHUwMDNjIDMwKSlcbisvKlxuKyAqIFNoYXJlZCBwbGF5Z3JvdW5kIGZvciBmYXVsdHMvcGlucy9mb3JrL2RvbnRuZWVkOiBzZXZlcmFsIFBNRC1zaXplZFxuKyAqIGFyZWFzIHRoZSByYWNpbmcgdGhyZWFkcyBzcHJlYWQgYWNyb3NzLCBwbHVzIG9uZSBhcmVhIG93bmVkIGJ5IHRoZVxuKyAqIG1yZW1hcCB0aHJlYWQuIE1vcmUgYXJlYXMgbWVhbnMgbW9yZSBpbmRlcGVuZGVudCByZWdpb25zIGNvbGxhcHNpbmdcbisgKiBhdCBvbmNlOyB0aGUgZGVmYXVsdCBzdWl0cyBhIG5vcm1hbCBtYWNoaW5lLiBPbiBhIG1lbW9yeS1jb25zdHJhaW5lZFxuKyAqIGhvc3QgLS0gb3IgdW5kZXIgZW11bGF0aW9uLCB3aGVyZSBhIDUxMk0gUE1EIChhcm02NC82NEspIG1ha2VzIHRoZVxuKyAqIGRlZmF1bHQgcGxheWdyb3VuZCBtdWx0aS1naWdhYnl0ZSAtLSBwYXNzIC1hIHRvIHNocmluayBpdC5cbisgKi9cbisjZGVmaW5lIERFRkFVTFRfU0hBUkVEX0FSRUFTXHQzXG4rc3RhdGljIGludCBucl9zaGFyZWRfYXJlYXM7XG4rc3RhdGljIGludCBucl9hcmVhcztcbitcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7XG4rc3RhdGljIGNoYXIgKnJlZ2lvbjtcdFx0LyogTlJfQVJFQVMgKiBocGFnZV9wbWRfc2l6ZSAqL1xuK3N0YXRpYyBjaGFyICptcmVtYXBfYXJlYTtcdC8qIHJlZ2lvbiArIE5SX1NIQVJFRF9BUkVBUyBhcmVhcyAqL1xuK3N0YXRpYyBjaGFyICptcmVtYXBfc2NyYXRjaDtcdC8qIHdlbGwgYWJvdmUgdGhlIHJlZ2lvbiAqL1xuK3N0YXRpYyBjaGFyICpwYWdlb3V0X2FyZWE7XHQvKiAtcDogZGVkaWNhdGVkIHByZXNzdXJlIHJlZ2lvbiAqL1xuK3N0YXRpYyBzaXplX3QgcGFnZW91dF9zaXplO1xuK3N0YXRpYyBpbnQgZ3VwX2ZkID0gLTE7XG4rc3RhdGljIHZvbGF0aWxlIGludCBzdG9wO1xuK3N0YXRpYyB2b2xhdGlsZSBpbnQgY29ycnVwdGVkO1xuK1xuK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGF0dGVybih1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxuK3tcbitcdHVuc2lnbmVkIGludCB2YWwgPSAodW5zaWduZWQgaW50KXBhZ2VfaWR4ICogMjY1NDQzNTc2MVU7XG4rXG4rXHRyZXR1cm4gdmFsID8gdmFsIDogMTtcdC8qIG5ldmVyIGNvbGxpZGVzIHdpdGggdGhlIHplcm8tZmlsbCAqL1xuK31cbitcbitzdGF0aWMgdm9pZCBjaGVja19wYWdlKHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgpXG4re1xuK1x0dW5zaWduZWQgaW50IHZhbCA9ICoodW5zaWduZWQgaW50ICopKHJlZ2lvbiArIHBhZ2VfaWR4ICogcGFnZV9zaXplKTtcbitcbitcdGlmICh2YWwgXHUwMDI2XHUwMDI2IHZhbCAhPSBwYXR0ZXJuKHBhZ2VfaWR4KSkge1xuK1x0XHRjb3JydXB0ZWQgPSAxO1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIkNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXG5cIixcbitcdFx0XHQgICAgICAgcGFnZV9pZHgsIHZhbCwgcGF0dGVybihwYWdlX2lkeCkpO1xuK1x0fVxuK31cbitcbitzdGF0aWMgdW5zaWduZWQgbG9uZyByYW5kX3BhZ2UodW5zaWduZWQgaW50ICpzZWVkKVxuK3tcbitcdHJldHVybiAodW5zaWduZWQgbG9uZylyYW5kX3Ioc2VlZCkgJVxuK1x0ICAgICAgIChucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkICpmYXVsdGVyX2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcbitcdHdoaWxlICghc3RvcCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFx1MDAyNnNlZWQpO1xuK1xuK1x0XHRpZiAocmFuZF9yKFx1MDAyNnNlZWQpIFx1MDAyNiAxKVxuK1x0XHRcdCoodW5zaWduZWQgaW50ICopKHJlZ2lvbiArIHBhZ2VfaWR4ICogcGFnZV9zaXplKSA9XG4rXHRcdFx0XHRwYXR0ZXJuKHBhZ2VfaWR4KTtcbitcdFx0ZWxzZVxuK1x0XHRcdGNoZWNrX3BhZ2UocGFnZV9pZHgpO1xuK1x0fVxuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuK3N0YXRpYyB2b2lkICpkb250bmVlZF9mbih2b2lkICphcmcpXG4re1xuK1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcdTAwMjZzZWVkKTtcbitcdFx0dW5zaWduZWQgbG9uZyBuciA9IDFVTCBcdTAwM2NcdTAwM2MgKHJhbmRfcihcdTAwMjZzZWVkKSAlIDYpO1x0LyogMS4uMzIgcGFnZXMgKi9cbitcbitcdFx0LypcbitcdFx0ICogT25jZSBpbiBhIHdoaWxlIHphcCBhIHdob2xlIFBNRC1hbGlnbmVkIGFyZWE6IG9ubHkgYVxuK1x0XHQgKiB6YXAgc3Bhbm5pbmcgdGhlIGZ1bGwgdGFibGUgdHJpZ2dlcnMgdGhlIGVtcHR5LXRhYmxlXG4rXHRcdCAqIHJlY2xhaW0gKENPTkZJR19QVF9SRUNMQUlNKSwgd2hpY2ggY2FuIGZyZWUgYSB0YWJsZVxuK1x0XHQgKiBvdXQgZnJvbSB1bmRlciBhIHBhcmtlZCBjb2xsYXBzZSDigJQgc3ViLXRhYmxlIHphcHNcbitcdFx0ICogbmV2ZXIgcmVhY2ggdGhhdCBwYXRoLlxuK1x0XHQgKi9cbitcdFx0aWYgKCEocmFuZF9yKFx1MDAyNnNlZWQpICUgNjQpKSB7XG4rXHRcdFx0dW5zaWduZWQgbG9uZyBhcmVhID0gcGFnZV9pZHggL1xuK1x0XHRcdFx0XHQoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpO1xuK1xuK1x0XHRcdG1hZHZpc2UocmVnaW9uICsgYXJlYSAqIGhwYWdlX3BtZF9zaXplLFxuK1x0XHRcdFx0aHBhZ2VfcG1kX3NpemUsIE1BRFZfRE9OVE5FRUQpO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdG1hZHZpc2UocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUsXG4rXHRcdFx0XHRuciAqIHBhZ2Vfc2l6ZSwgTUFEVl9ET05UTkVFRCk7XG4rXHRcdH1cbitcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDUwMCk7XG4rXHR9XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIHZvaWQgKnBpbm5lcl9mbih2b2lkICphcmcpXG4re1xuK1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0c3RydWN0IGd1cF90ZXN0IGd1cCA9IHt9O1xuK1x0XHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFx1MDAyNnNlZWQpO1xuK1xuK1x0XHRndXAuYWRkciA9ICh1bnNpZ25lZCBsb25nKShyZWdpb24gKyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSk7XG4rXHRcdGd1cC5zaXplID0gMTYgKiBwYWdlX3NpemU7XG4rXHRcdGd1cC5ucl9wYWdlc19wZXJfY2FsbCA9IDE2O1xuK1x0XHRndXAuZ3VwX2ZsYWdzID0gMTtcdC8qIEZPTExfV1JJVEUgKi9cbitcdFx0LyogUmFjaW5nIE1BRFZfRE9OVE5FRUQgbWFrZXMgdHJhbnNpZW50IGZhaWx1cmVzIGV4cGVjdGVkLiAqL1xuK1x0XHRpb2N0bChndXBfZmQsIFBJTl9GQVNUX0JFTkNITUFSSywgXHUwMDI2Z3VwKTtcbitcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDIwMCk7XG4rXHR9XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIHZvaWQgKmZvcmtlcl9mbih2b2lkICphcmcpXG4re1xuK1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0cGlkX3QgcGlkID0gZm9yaygpO1xuK1xuK1x0XHRpZiAocGlkID09IDApIHtcbitcdFx0XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgMTY7IGkrKylcbitcdFx0XHRcdGNoZWNrX3BhZ2UocmFuZF9wYWdlKFx1MDAyNnNlZWQpKTtcbitcdFx0XHRfZXhpdChjb3JydXB0ZWQpO1xuK1x0XHR9XG4rXHRcdGlmIChwaWQgXHUwMDNlIDApIHtcbitcdFx0XHRpbnQgd3N0YXR1cztcbitcbitcdFx0XHR3YWl0cGlkKHBpZCwgXHUwMDI2d3N0YXR1cywgMCk7XG4rXHRcdFx0aWYgKFdJRkVYSVRFRCh3c3RhdHVzKSBcdTAwMjZcdTAwMjYgV0VYSVRTVEFUVVMod3N0YXR1cykpXG4rXHRcdFx0XHRjb3JydXB0ZWQgPSAxO1xuK1x0XHR9XG4rXHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgdm9pZCAqbXJlbWFwcGVyX2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcbitcdHdoaWxlICghc3RvcCkge1xuK1x0XHR2b2lkICpwO1xuK1xuK1x0XHRwID0gbXJlbWFwKG1yZW1hcF9hcmVhLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsXG4rXHRcdFx0ICAgTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQsIG1yZW1hcF9zY3JhdGNoKTtcbitcdFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtcmVtYXAoKSBhd2F5XCIpO1xuK1x0XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgODsgaSsrKVxuK1x0XHRcdG1yZW1hcF9zY3JhdGNoWyhyYW5kX3IoXHUwMDI2c2VlZCkgJVxuK1x0XHRcdFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSkgKiBwYWdlX3NpemVdID0gMTtcbitcdFx0cCA9IG1yZW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxuK1x0XHRcdCAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfYXJlYSk7XG4rXHRcdGlmIChwID09IE1BUF9GQUlMRUQpXG4rXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibXJlbWFwKCkgYmFja1wiKTtcbitcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDIwMDApO1xuK1x0fVxuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuKy8qXG4rICogLXA6IHN3YXAgdHJhZmZpYyBhbmQgTFJVIGNodXJuIG9uIGEgcmVnaW9uIG9mIG91ciBvd24uIFRoZSBjb250ZW50XG4rICogY2hlY2sgaXMgZXhhY3Qg4oCUIGEgcGFnZSBvdXQgYW5kIGJhY2sgdGhyb3VnaCBzd2FwIG11c3QgcHJlc2VydmUgdGhlXG4rICogcGF0dGVybiwgYW5kIG5vdGhpbmcgZWxzZSBldmVyIHdyaXRlcyBoZXJlLlxuKyAqL1xuK3N0YXRpYyB2b2lkICpwYWdlb3V0X2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcdHVuc2lnbmVkIGxvbmcgbnIgPSBwYWdlb3V0X3NpemUgLyBwYWdlX3NpemU7XG4rXHR1bnNpZ25lZCBsb25nIGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucjsgaSsrKVxuK1x0XHQqKHVuc2lnbmVkIGludCAqKShwYWdlb3V0X2FyZWEgKyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0bWFkdmlzZShwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSwgTUFEVl9QQUdFT1VUKTtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnIgXHUwMDI2XHUwMDI2ICFzdG9wOyBpKyspIHtcbitcdFx0XHR1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICtcbitcdFx0XHRcdFx0XHRcdCAgICAgaSAqIHBhZ2Vfc2l6ZSk7XG4rXG4rXHRcdFx0aWYgKHZhbCAhPSBwYXR0ZXJuKGkpKSB7XG4rXHRcdFx0XHRjb3JydXB0ZWQgPSAxO1xuK1x0XHRcdFx0a3NmdF9wcmludF9tc2coXCJQYWdlb3V0IGNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXG5cIixcbitcdFx0XHRcdFx0ICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7XG4rXHRcdFx0fVxuK1x0XHR9XG4rXHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbisvKiAtcDogY29tcGFjdGlvbiBtaWdyYXRlcyB0aGUgY29sbGFwc2Ugc291cmNlcyBvdXQgZnJvbSB1bmRlciB1cy4gKi9cbitzdGF0aWMgdm9pZCAqY29tcGFjdG9yX2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcdGludCBmZCA9IG9wZW4oXCIvcHJvYy9zeXMvdm0vY29tcGFjdF9tZW1vcnlcIiwgT19XUk9OTFkpO1xuK1xuK1x0aWYgKGZkIFx1MDAzYyAwKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiTm8gY29tcGFjdF9tZW1vcnk7IGNvbXBhY3RvciBpZGxlXFxuXCIpO1xuK1x0XHRyZXR1cm4gTlVMTDtcbitcdH1cbitcdHdoaWxlICghc3RvcCkge1xuK1x0XHRpZiAod3JpdGUoZmQsIFwiMVwiLCAxKSBcdTAwM2MgMClcbitcdFx0XHRicmVhaztcbitcdFx0dXNsZWVwKDEwMDAwICsgcmFuZF9yKFx1MDAyNnNlZWQpICUgMTAwMDAwKTtcbitcdH1cbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgYm9vbCBzd2FwX2F2YWlsYWJsZSh2b2lkKVxuK3tcbitcdGNoYXIgbGluZVsyNTZdO1xuK1x0aW50IGxpbmVzID0gMDtcbitcdEZJTEUgKmZwID0gZm9wZW4oXCIvcHJvYy9zd2Fwc1wiLCBcInJcIik7XG4rXG4rXHRpZiAoIWZwKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpXG4rXHRcdGxpbmVzKys7XG4rXHRmY2xvc2UoZnApO1xuK1x0cmV0dXJuIGxpbmVzIFx1MDAzZSAxO1xuK31cbitcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBub3dfbXModm9pZClcbit7XG4rXHRzdHJ1Y3QgdGltZXZhbCB0djtcbitcbitcdGdldHRpbWVvZmRheShcdTAwMjZ0diwgTlVMTCk7XG4rXHRyZXR1cm4gdHYudHZfc2VjICogMTAwMFVMICsgdHYudHZfdXNlYyAvIDEwMDA7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXG4re1xuK1x0ZnByaW50ZihzdGRlcnIsXG4rXHRcdFwiVXNhZ2U6IGtodWdlcGFnZWRfcmFjZSBbLWQgc2Vjb25kc10gWy1tIHN0ZXBwZWR8ZnJlZXxtYWR2aXNlXSBbLXpdIFstcF0gWy1hIGFyZWFzXVxcblwiXG4rXHRcdFwiXFx0LXo6IHBlcm1pc3NpdmUgbWF4X3B0ZXNfbm9uZSAoaG9sZS1oZWF2eSB3aW5kb3dzKVxcblwiXG4rXHRcdFwiXFx0LXA6IG1lbW9yeSBwcmVzc3VyZSAocGFnZW91dCArIGNvbXBhY3Rpb24pIHRocmVhZHNcXG5cIlxuK1x0XHRcIlxcdC1hOiBudW1iZXIgb2Ygc2hhcmVkIFBNRC1zaXplZCBwbGF5Z3JvdW5kIGFyZWFzIChkZWZhdWx0IDMpXFxuXCIpO1xuK1x0ZXhpdCgxKTtcbit9XG4rXG4raW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuK3tcbitcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGhyZWFkX25hbWVzW10gPSB7XG4rXHRcdFwiZmF1bHRlclwiLCBcImZhdWx0ZXIyXCIsIFwiZG9udG5lZWRcIiwgXCJwaW5uZXJcIiwgXCJmb3JrZXJcIixcbitcdFx0XCJtcmVtYXBwZXJcIiwgXCJwYWdlb3V0XCIsIFwiY29tcGFjdG9yXCIsXG4rXHR9O1xuK1x0dm9pZCAqKCpjb25zdCB0aHJlYWRfZm5zW10pKHZvaWQgKikgPSB7XG4rXHRcdGZhdWx0ZXJfZm4sIGZhdWx0ZXJfZm4sIGRvbnRuZWVkX2ZuLCBwaW5uZXJfZm4sIGZvcmtlcl9mbixcbitcdFx0bXJlbWFwcGVyX2ZuLCBwYWdlb3V0X2ZuLCBjb21wYWN0b3JfZm4sXG4rXHR9O1xuK1x0Y29uc3QgdW5zaWduZWQgbG9uZyBwYWdlb3V0X2JpdCA9IDFVTCBcdTAwM2NcdTAwM2MgNiwgY29tcGFjdG9yX2JpdCA9IDFVTCBcdTAwM2NcdTAwM2MgNztcbitcdGNvbnN0IGludCBucl90aHJlYWRzID0gQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpO1xuK1x0cHRocmVhZF90IHRocmVhZHNbQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpXTtcbitcdGNvbnN0IGNoYXIgKm1vZGUgPSBcInN0ZXBwZWRcIjtcbitcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4rXHR1bnNpZ25lZCBsb25nIGVuZF9tcztcbitcdGludCBkdXJhdGlvbl9zID0gMTA7XG4rXHR1bnNpZ25lZCBsb25nIHRocmVhZF9tYXNrID0gfjBVTDtcbitcdGludCBucl9hcmVhc19hcmcgPSAwO1xuK1x0Ym9vbCBwZXJtaXNzaXZlX25vbmUgPSBmYWxzZTtcbitcdGJvb2wgcHJlc3N1cmUgPSBmYWxzZTtcbitcdHVuc2lnbmVkIGxvbmcgaTtcbitcdGludCBzdGVwcyA9IDA7XG4rXHRpbnQgb3B0O1xuK1xuK1x0d2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgXCJhOmQ6bTp0OnpwaFwiKSkgIT0gLTEpIHtcbitcdFx0c3dpdGNoIChvcHQpIHtcbitcdFx0Y2FzZSAnYSc6XG4rXHRcdFx0bnJfYXJlYXNfYXJnID0gYXRvaShvcHRhcmcpO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICdkJzpcbitcdFx0XHRkdXJhdGlvbl9zID0gYXRvaShvcHRhcmcpO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICdtJzpcbitcdFx0XHRtb2RlID0gb3B0YXJnO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICd0JzpcbitcdFx0XHQvKiBkZWJ1ZzogYml0bWFzayBvZiByYWNpbmcgdGhyZWFkcyB0byBzdGFydCAqL1xuK1x0XHRcdHRocmVhZF9tYXNrID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDApO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICd6JzpcbitcdFx0XHRwZXJtaXNzaXZlX25vbmUgPSB0cnVlO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICdwJzpcbitcdFx0XHRwcmVzc3VyZSA9IHRydWU7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGRlZmF1bHQ6XG4rXHRcdFx0dXNhZ2UoKTtcbitcdFx0fVxuK1x0fVxuK1x0aWYgKHN0cmNtcChtb2RlLCBcInN0ZXBwZWRcIikgXHUwMDI2XHUwMDI2IHN0cmNtcChtb2RlLCBcImZyZWVcIikgXHUwMDI2XHUwMDI2XG4rXHQgICAgc3RyY21wKG1vZGUsIFwibWFkdmlzZVwiKSlcbitcdFx0dXNhZ2UoKTtcbitcbitcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4rXHRpZiAoIXRocF9hdmFpbGFibGUoKSlcbitcdFx0a3NmdF9leGl0X3NraXAoXCJUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcblwiKTtcbitcbitcdHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7XG4rXHRocGFnZV9wbWRfc2l6ZSA9IHJlYWRfcG1kX3BhZ2VzaXplKCk7XG4rXHRpZiAoIWhwYWdlX3BtZF9zaXplKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcXG5cIik7XG4rXG4rXHRndXBfZmQgPSBvcGVuKFwiL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3RcIiwgT19SRFdSKTtcbitcdGlmIChndXBfZmQgXHUwMDNjIDApXG4rXHRcdGtzZnRfZXhpdF9za2lwKFwiL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgcmVxdWlyZXMgQ09ORklHX0dVUF9URVNUIGFuZCByb290XFxuXCIpO1xuK1xuK1x0bnJfc2hhcmVkX2FyZWFzID0gbnJfYXJlYXNfYXJnIFx1MDAzZSAwID8gbnJfYXJlYXNfYXJnIDogREVGQVVMVF9TSEFSRURfQVJFQVM7XG4rXHRucl9hcmVhcyA9IG5yX3NoYXJlZF9hcmVhcyArIDE7XG4rXG4rXHRpZiAoIXByZXNzdXJlKSB7XG4rXHRcdHRocmVhZF9tYXNrIFx1MDAyNj0gfihwYWdlb3V0X2JpdCB8IGNvbXBhY3Rvcl9iaXQpO1xuK1x0fSBlbHNlIGlmICghc3dhcF9hdmFpbGFibGUoKSkge1xuK1x0XHQvKiBObyBzd2FwLCBubyBhbm9uIHJlY2xhaW06IGNvbXBhY3Rpb24tb25seSBwcmVzc3VyZS4gKi9cbitcdFx0a3NmdF9wcmludF9tc2coXCItcCB3aXRob3V0IHN3YXA6IHBhZ2VvdXQgdGhyZWFkIGRpc2FibGVkXFxuXCIpO1xuK1x0XHR0aHJlYWRfbWFzayBcdTAwMjY9IH5wYWdlb3V0X2JpdDtcbitcdH1cbitcbitcdGtzZnRfc2V0X3BsYW4oMSk7XG4rXG4rXHR0aHBfc2F2ZV9zZXR0aW5ncygpO1xuK1x0dGhwX3JlYWRfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1x0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTUFEVklTRTtcbitcdHNldHRpbmdzLnRocF9kZWZyYWcgPSBUSFBfREVGUkFHX0FMV0FZUztcbitcdHNldHRpbmdzLnNobWVtX2VuYWJsZWQgPSBTSE1FTV9ORVZFUjtcbitcdHNldHRpbmdzLmtodWdlcGFnZWQuZGVmcmFnID0gMTtcbitcdHNldHRpbmdzLmtodWdlcGFnZWQuc2Nhbl9zbGVlcF9taWxsaXNlY3MgPVxuK1x0XHRzdHJjbXAobW9kZSwgXCJmcmVlXCIpID8gMTAwMCA6IDA7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmFsbG9jX3NsZWVwX21pbGxpc2VjcyA9IDEwO1xuK1x0LypcbitcdCAqIG1USFAgY29sbGFwc2Ugb25seSBzdXBwb3J0cyB0aGUgdHdvIGVuZHMgb2YgdGhlIG9jY3VwYW5jeVxuK1x0ICogc2NhbGU6IDAgb3IgSFBBR0VfUE1EX05SIC0gMSAoYW55dGhpbmcgZWxzZSBjb2VyY2VzIHRvIDApLlxuK1x0ICogU3RyaWN0IGlzIHRoZSBkZWZhdWx0IOKAlCBpdCBhbHNvIGtlZXBzIGtodWdlcGFnZWQgZnJvbSBidXJuaW5nXG4rXHQgKiB0aGUgd2hvbGUgc3RlcCBpbiBkb29tZWQgUE1ELXNpemVkIGFsbG9jYXRpb25zIG9uIDUxMk0tUE1EXG4rXHQgKiBjb25maWdzLCB3aGVyZSBhIGZ1bGx5IHBvcHVsYXRlZCBhcmVhIGlzIHJhcmUgdW5kZXIgcmFjaW5nXG4rXHQgKiBNQURWX0RPTlRORUVELiAteiBzZWxlY3RzIHRoZSBwZXJtaXNzaXZlIGVuZDogc2VsZWN0aW9uIHRoZW5cbitcdCAqIGVtaXRzIGhvbGUtaGVhdnkgd2luZG93cyBhbmQgdGhlIGVuZ2luZSdzIHBvcHVsYXRpb24gcGF0aHNcbitcdCAqIHRha2UgdGhlIGJydW50IG9mIHRoZSByYWNpbmcgZmF1bHRzIGFuZCB6YXBzLlxuK1x0ICovXG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBwZXJtaXNzaXZlX25vbmUgP1xuK1x0XHQoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpIC0gMSA6IDA7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPVxuK1x0XHRucl9hcmVhcyAqIChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgKiA4O1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpKyspIHtcbitcdFx0aWYgKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGkpKVxuK1x0XHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XG4rXHR9XG4rXHQvKiBCYXNlIG9mIHRoZSBzZXR0aW5ncyBzdGFjazsgdGhlIGJvdHRvbSBlbnRyeSBpcyBuZXZlciBwb3BwZWQuICovXG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRyZWdpb24gPSBtbWFwKEJBU0VfQUREUiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcbitcdFx0ICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLFxuK1x0XHQgICAgICAtMSwgMCk7XG4rXHRpZiAocmVnaW9uICE9IEJBU0VfQUREUilcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiRmFpbGVkIHRvIGFsbG9jYXRlIFZNQSBhdCAlcFxcblwiLCBCQVNFX0FERFIpO1xuK1x0bXJlbWFwX2FyZWEgPSByZWdpb24gKyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTtcbitcdG1yZW1hcF9zY3JhdGNoID0gKGNoYXIgKilCQVNFX0FERFIgKyAyICogbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTtcbitcbitcdGlmICh0aHJlYWRfbWFzayBcdTAwMjYgcGFnZW91dF9iaXQpIHtcbitcdFx0LypcbitcdFx0ICogQmlnIGVub3VnaCB0byBjeWNsZSByZWFsIHJlY2xhaW0sIHNtYWxsIGVub3VnaCBub3QgdG9cbitcdFx0ICogZG9taW5hdGUgYSBUQ0cgZ3Vlc3Q6IDQgUE1EIGFyZWFzLCBjbGFtcGVkIHRvIFsxNk0sIDY0TV0uXG4rXHRcdCAqL1xuK1x0XHRwYWdlb3V0X3NpemUgPSA0ICogaHBhZ2VfcG1kX3NpemU7XG4rXHRcdHBhZ2VvdXRfc2l6ZSA9IHBhZ2VvdXRfc2l6ZSBcdTAwM2MgKDE2VUwgXHUwMDNjXHUwMDNjIDIwKSA/ICgxNlVMIFx1MDAzY1x1MDAzYyAyMCkgOlxuK1x0XHRcdCAgICAgICBwYWdlb3V0X3NpemUgXHUwMDNlICg2NFVMIFx1MDAzY1x1MDAzYyAyMCkgPyAoNjRVTCBcdTAwM2NcdTAwM2MgMjApIDpcbitcdFx0XHQgICAgICAgcGFnZW91dF9zaXplO1xuK1x0XHRwYWdlb3V0X2FyZWEgPSBtbWFwKE5VTEwsIHBhZ2VvdXRfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbitcdFx0XHRcdCAgICBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTtcbitcdFx0aWYgKHBhZ2VvdXRfYXJlYSA9PSBNQVBfRkFJTEVEKVxuK1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1tYXAoKSBwYWdlb3V0IGFyZWFcIik7XG4rXHR9XG4rXG4rXHQvKiBQb3B1bGF0ZSBzbyB0aGUgZmlyc3QgcGFzcyBoYXMgc29tZXRoaW5nIHRvIGNvbGxhcHNlLiAqL1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkrKylcbitcdFx0Kih1bnNpZ25lZCBpbnQgKikocmVnaW9uICsgaSAqIHBhZ2Vfc2l6ZSkgPSBwYXR0ZXJuKGkpO1xuK1x0bWVtc2V0KG1yZW1hcF9hcmVhLCAxLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHRtYWR2aXNlKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl90aHJlYWRzOyBpKyspIHtcbitcdFx0aWYgKCEodGhyZWFkX21hc2sgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGkpKSkge1xuK1x0XHRcdHRocmVhZHNbaV0gPSAwO1xuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHR9XG4rXHRcdGlmIChwdGhyZWFkX2NyZWF0ZShcdTAwMjZ0aHJlYWRzW2ldLCBOVUxMLCB0aHJlYWRfZm5zW2ldLFxuK1x0XHRcdFx0ICAgKHZvaWQgKikoaSArIDEpKSlcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJwdGhyZWFkX2NyZWF0ZSgpXCIpO1xuK1x0fVxuK1xuK1x0ZW5kX21zID0gbm93X21zKCkgKyBkdXJhdGlvbl9zICogMTAwMFVMO1xuK1x0aWYgKCFzdHJjbXAobW9kZSwgXCJzdGVwcGVkXCIpKSB7XG4rXHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKSB7XG4rXHRcdFx0aWYgKCFraHVnZXBhZ2VkX2Z1bGxfcGFzcyg2MDApKVxuK1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwia2h1Z2VwYWdlZCBwYXNzIHRpbWVkIG91dFxcblwiKTtcbitcdFx0XHRzdGVwcysrO1xuK1x0XHR9XG4rXHR9IGVsc2UgaWYgKCFzdHJjbXAobW9kZSwgXCJmcmVlXCIpKSB7XG4rXHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKVxuK1x0XHRcdHVzbGVlcCgxMDAgKiAxMDAwKTtcbitcdH0gZWxzZSB7XHQvKiBtYWR2aXNlICovXG4rXHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKSB7XG4rXHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzOyBpKyspIHtcbitcdFx0XHRcdG1hZHZpc2UocmVnaW9uICsgaSAqIGhwYWdlX3BtZF9zaXplLFxuK1x0XHRcdFx0XHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9DT0xMQVBTRSk7XG4rXHRcdFx0fVxuK1x0XHRcdG1hZHZpc2UocmVnaW9uLCBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcbitcdFx0XHRcdE1BRFZfRE9OVE5FRUQpO1xuK1x0XHRcdHN0ZXBzKys7XG4rXHRcdH1cbitcdH1cbitcbitcdHN0b3AgPSAxO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfdGhyZWFkczsgaSsrKSB7XG4rXHRcdGlmICh0aHJlYWRzW2ldKVxuK1x0XHRcdHB0aHJlYWRfam9pbih0aHJlYWRzW2ldLCBOVUxMKTtcbitcdH1cbitcbitcdC8qIEZpbmFsIGludGVncml0eSBzd2VlcC4gKi9cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOyBpKyspXG4rXHRcdGNoZWNrX3BhZ2UoaSk7XG4rXG4rXHR0aHBfcmVzdG9yZV9zZXR0aW5ncygpO1xuK1xuK1x0a3NmdF90ZXN0X3Jlc3VsdCghY29ycnVwdGVkLCBcIiVzOiAlZHMsICVkIHN0ZXBzLCBubyBjb3JydXB0aW9uXFxuXCIsXG4rXHRcdFx0IG1vZGUsIGR1cmF0aW9uX3MsIHN0ZXBzKTtcbitcdGtzZnRfZmluaXNoZWQoKTtcbit9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjEzMjE1Y2IzNzBjZWJcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jXG5AQCAtMCwwICsxLDE5OCBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBTeW5jaHJvbm91cyBraHVnZXBhZ2VkIGRyaXZpbmcgY2hlY2suXG4rICpcbisgKiBSYWNlIHRlc3RzIGRyaXZlIGtodWdlcGFnZWQgdGhyb3VnaCB0aGUgZXhpc3Rpbmcgc3lzZnMgY29udHJvbHM6IGFcbisgKiBzdG9yZSB0byBzY2FuX3NsZWVwX21pbGxpc2VjcyB3YWtlcyB0aGUgZGFlbW9uLCBhbmQgZnVsbF9zY2Fuc1xuKyAqIGFkdmFuY2luZyBieSB0d28gaXMgYSBjb21wbGV0aW9uIGJhcnJpZXIgZm9yIG9uZSBmdWxsIHBhc3MgdGhhdFxuKyAqIHN0YXJ0ZWQgYWZ0ZXIgc2V0dXAgKGtodWdlcGFnZWRfZnVsbF9wYXNzKCkpLiBWZXJpZnkgdGhlIHBhaXIgZ2l2ZXNcbisgKiBkZXRlcm1pbmlzdGljLCBhdHRyaWJ1dGFibGUgcmVzdWx0czogb25lIGJhcnJpZXIgc3RlcCBvdmVyIG9uZVxuKyAqIHByZXBhcmVkIHdpbmRvdyBwcm9kdWNlcyBleGFjdGx5IG9uZSBjb2xsYXBzZSBhdHRlbXB0IG9uIHRoYXRcbisgKiB3aW5kb3cncyBzb3VyY2UgcGFnZXMg4oCUIG1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlIGV2ZW50c1xuKyAqIGZpbHRlcmVkIGJ5IHNvdXJjZSBQRk4gYW5kIG9yZGVyIOKAlCBhbmQgdGhlIHdpbmRvdyBpcyBjb2xsYXBzZWRcbisgKiBhZnRlcndhcmRzLCByZXBlYXRhYmx5LlxuKyAqXG4rICogc2Nhbl9zbGVlcF9taWxsaXNlY3MgaXMgc2V0IHRvIDYwcyB0byBwcm92ZSB0aGUgd2FrZSBwYXRoOiB3aXRob3V0XG4rICogdGhlIHdha2UsIG9uZSBiYXJyaWVyIHN0ZXAgd291bGQgc2xlZXAgbXVsdGlwbGVzIG9mIHRoYXQgYW5kIGJsb3dcbisgKiB0aGUgdGltZW91dC4gSXQgYWxzbyBrZWVwcyB0aGUgZGFlbW9uIGZyb20gZnJlZS1ydW5uaW5nIGJldHdlZW5cbisgKiBzdGVwcywgcGVyIHRoZSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIGRpc2NpcGxpbmUuXG4rICovXG4rI2RlZmluZSBfR05VX1NPVVJDRVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwia3NlbGZ0ZXN0LmhcIlxuKyNpbmNsdWRlIFwidm1fdXRpbC5oXCJcbisjaW5jbHVkZSBcImh1Z2VwYWdlX3NldHRpbmdzLmhcIlxuK1xuKyNkZWZpbmUgQkFTRV9BRERSICgodm9pZCAqKSgxVUwgXHUwMDNjXHUwMDNjIDMwKSlcbisjZGVmaW5lIFRBUkdFVF9PUkRFUiAyXHQvKiBzbWFsbGVzdCBvcmRlciBraHVnZXBhZ2VkIGNvbnNpZGVycyAqL1xuKyNkZWZpbmUgTlJfSVRFUkFUSU9OUyA1XG4rXG4rc3RhdGljIGludCBwYWdlbWFwX2ZkO1xuK3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDtcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcbitcbisvKlxuKyAqIENvdW50IGNvbGxhcHNlIGF0dGVtcHRzIGF0dHJpYnV0YWJsZSB0byBvdXIgd2luZG93OiBsZWdhY3ktZW5naW5lXG4rICogaXNvbGF0ZSBldmVudHMgd2hvc2Ugc2Nhbl9wZm4gaXMgb25lIG9mIHRoZSB3aW5kb3cncyBzb3VyY2UgUEZOcyxcbisgKiBwbHVzIGJhdGNoLWVuZ2luZSBwZXItY2FuZGlkYXRlIGluc3RhbGwgZXZlbnRzIGF0IHRoZSB3aW5kb3cnc1xuKyAqIGFkZHJlc3MuIEVpdGhlciBlbmdpbmUgcmVwb3J0cyBleGFjdGx5IG9uY2UgcGVyIGF0dGVtcHQuXG4rICovXG4rc3RhdGljIGludCBjb3VudF9hdHRyaWJ1dGVkKHVuc2lnbmVkIGxvbmcgKnBmbnMsIGludCBucl9wZm5zLFxuK1x0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBvcmRlcilcbit7XG4rXHRjaGFyIGxpbmVbMTAyNF07XG4rXHRpbnQgY291bnQgPSAwO1xuK1x0RklMRSAqZnA7XG4rXG4rXHRmcCA9IHRyYWNpbmdfb3Blbl90cmFjZSgpO1xuK1x0aWYgKCFmcClcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiQ2Fubm90IG9wZW4gdHJhY2UgYnVmZmVyXFxuXCIpO1xuK1xuK1x0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKSB7XG4rXHRcdGNoYXIgKnM7XG4rXHRcdHVuc2lnbmVkIGxvbmcgdmFsO1xuK1x0XHR1bnNpZ25lZCBpbnQgb3JkO1xuK1x0XHRjaGFyICpvO1xuK1x0XHRpbnQgaTtcbitcbitcdFx0cyA9IHN0cnN0cihsaW5lLCBcIm1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOlwiKTtcbitcdFx0aWYgKHMpIHtcbitcdFx0XHRpZiAoc3NjYW5mKHMsIFwibW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGU6IHNjYW5fcGZuPTB4JWx4XCIsXG4rXHRcdFx0XHQgICBcdTAwMjZ2YWwpICE9IDEpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHRvID0gc3Ryc3RyKHMsIFwib3JkZXI9XCIpO1xuK1x0XHRcdGlmICghbyB8fCBzc2NhbmYobywgXCJvcmRlcj0ldVwiLCBcdTAwMjZvcmQpICE9IDEgfHxcbitcdFx0XHQgICAgb3JkICE9IG9yZGVyKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfcGZuczsgaSsrKSB7XG4rXHRcdFx0XHRpZiAodmFsID09IHBmbnNbaV0pIHtcbitcdFx0XHRcdFx0Y291bnQrKztcbitcdFx0XHRcdFx0YnJlYWs7XG4rXHRcdFx0XHR9XG4rXHRcdFx0fVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHR9XG4rXG4rXHRcdHMgPSBzdHJzdHIobGluZSwgXCJtbV9jb2xsYXBzZV9jYW5kaWRhdGU6XCIpO1xuK1x0XHRpZiAocykge1xuK1x0XHRcdGlmICghc3Ryc3RyKHMsIFwicGFzcz1pbnN0YWxsXCIpIHx8XG4rXHRcdFx0ICAgICFzdHJzdHIocywgXCJyZXN1bHQ9c3VjY2VlZGVkXCIpKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0byA9IHN0cnN0cihzLCBcImFkZHI9XCIpO1xuK1x0XHRcdGlmICghbyB8fCBzc2NhbmYobywgXCJhZGRyPTB4JWx4XCIsIFx1MDAyNnZhbCkgIT0gMSB8fFxuK1x0XHRcdCAgICB2YWwgIT0gYWRkcilcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdG8gPSBzdHJzdHIocywgXCJvcmRlcj1cIik7XG4rXHRcdFx0aWYgKCFvIHx8IHNzY2FuZihvLCBcIm9yZGVyPSV1XCIsIFx1MDAyNm9yZCkgIT0gMSB8fFxuK1x0XHRcdCAgICBvcmQgIT0gb3JkZXIpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHRjb3VudCsrO1xuK1x0XHR9XG4rXHR9XG4rXHRmY2xvc2UoZnApO1xuK1x0cmV0dXJuIGNvdW50O1xuK31cbitcbitzdGF0aWMgdm9pZCBvbmVfc3RlcChpbnQgaXRlcmF0aW9uKVxuK3tcbitcdGNvbnN0IHNpemVfdCB3aW5kb3cgPSBnZXRwYWdlc2l6ZSgpIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVI7XG4rXHRjb25zdCBpbnQgbnJfcGFnZXMgPSAxIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVI7XG4rXHR1bnNpZ25lZCBsb25nIHBmbnNbMSBcdTAwM2NcdTAwM2MgVEFSR0VUX09SREVSXTtcbitcdGJvb2wgY29sbGFwc2VkO1xuK1x0aW50IGF0dHJpYnV0ZWQ7XG4rXHRjaGFyICpwO1xuK1x0aW50IGk7XG4rXG4rXHRwID0gbW1hcChCQVNFX0FERFIsIGhwYWdlX3BtZF9zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuK1x0XHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XG4rXHRpZiAocCAhPSBCQVNFX0FERFIpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIkZhaWxlZCB0byBhbGxvY2F0ZSBWTUEgYXQgJXBcXG5cIixcbitcdFx0XHRcdCAgIEJBU0VfQUREUik7XG4rXG4rXHQvKiBQcmVwYXJlIG9uZSB3aW5kb3c7IHJlY29yZCBpdHMgc291cmNlIFBGTnMuICovXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XG4rXHRcdHBbaSAqIGdldHBhZ2VzaXplKCldID0gaSArIDE7XG4rXHRcdHBmbnNbaV0gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcCArIGkgKiBnZXRwYWdlc2l6ZSgpKTtcbitcdFx0aWYgKHBmbnNbaV0gPT0gLTFVTClcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJTb3VyY2UgcGFnZSBub3QgcHJlc2VudFxcblwiKTtcbitcdH1cbitcbitcdGlmICh0cmFjaW5nX2V2ZW50c19zdGFydChcImh1Z2VfbWVtb3J5XCIpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJDYW5ub3QgZW5hYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xcblwiKTtcbitcbitcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuK1x0LyogV2FpdCB1cCB0byAxMjAgc2Vjb25kcyBmb3IgdGhlIHBhc3MgdG8gY29tcGxldGUuICovXG4rXHRpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKDEyMCkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcImtodWdlcGFnZWQgZGlkIG5vdCBjb21wbGV0ZSBhIGZ1bGwgcGFzc1xcblwiKTtcbitcbitcdHRyYWNpbmdfZXZlbnRzX3N0b3AoXCJodWdlX21lbW9yeVwiKTtcbitcbitcdGNvbGxhcHNlZCA9IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgd2luZG93LCBUQVJHRVRfT1JERVIsXG4rXHRcdFx0XHRcdFx0ICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpO1xuK1x0YXR0cmlidXRlZCA9IGNvdW50X2F0dHJpYnV0ZWQocGZucywgbnJfcGFnZXMsICh1bnNpZ25lZCBsb25nKXAsXG4rXHRcdFx0XHQgICAgICBUQVJHRVRfT1JERVIpO1xuK1xuK1x0a3NmdF90ZXN0X3Jlc3VsdChjb2xsYXBzZWQgXHUwMDI2XHUwMDI2IGF0dHJpYnV0ZWQgPT0gMSxcbitcdFx0XHQgXCJzdGVwICVkOiB3aW5kb3cgY29sbGFwc2VkLCAlZCBhdHRyaWJ1dGVkIHJlc3VsdChzKVxcblwiLFxuK1x0XHRcdCBpdGVyYXRpb24sIGF0dHJpYnV0ZWQpO1xuK1xuK1x0bXVubWFwKHAsIGhwYWdlX3BtZF9zaXplKTtcbit9XG4rXG4raW50IG1haW4odm9pZClcbit7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuK1x0aW50IGk7XG4rXG4rXHRrc2Z0X3ByaW50X2hlYWRlcigpO1xuK1xuK1x0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXG4rXHRcdGtzZnRfZXhpdF9za2lwKFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXG5cIik7XG4rXHRpZiAoISh0aHBfc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVIpKSlcbitcdFx0a3NmdF9leGl0X3NraXAoXCJPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcXG5cIixcbitcdFx0XHQgICAgICAgVEFSR0VUX09SREVSKTtcbitcbitcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcbitcdGlmICghaHBhZ2VfcG1kX3NpemUpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIlJlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxcblwiKTtcbitcdHBhZ2VtYXBfZmQgPSBvcGVuKFwiL3Byb2Mvc2VsZi9wYWdlbWFwXCIsIE9fUkRPTkxZKTtcbitcdGlmIChwYWdlbWFwX2ZkIFx1MDAzYyAwKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJvcGVuKFxcXCIvcHJvYy9zZWxmL3BhZ2VtYXBcXFwiKVwiKTtcbitcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwiL3Byb2Mva3BhZ2VmbGFnc1wiLCBPX1JET05MWSk7XG4rXHRpZiAoa3BhZ2VmbGFnc19mZCBcdTAwM2MgMClcbitcdFx0a3NmdF9leGl0X3NraXAoXCJvcGVuKFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcIikgcmVxdWlyZXMgcm9vdFxcblwiKTtcbitcdGlmICh0cmFjaW5nX2V2ZW50c19zdGFydChcImh1Z2VfbWVtb3J5XCIpKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcInRyYWNlZnMgdW5hdmFpbGFibGVcXG5cIik7XG4rXHR0cmFjaW5nX2V2ZW50c19zdG9wKFwiaHVnZV9tZW1vcnlcIik7XG4rXG4rXHRrc2Z0X3NldF9wbGFuKE5SX0lURVJBVElPTlMpO1xuK1xuK1x0dGhwX3NhdmVfc2V0dGluZ3MoKTtcbitcdHRocF9yZWFkX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7XG4rXHRzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmFsbG9jX3NsZWVwX21pbGxpc2VjcyA9IDYwMDAwO1xuK1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gKGhwYWdlX3BtZF9zaXplIC8gZ2V0cGFnZXNpemUoKSkgLSAxO1xuK1x0LyogT25lIHdha2UgbXVzdCBjb21wbGV0ZSBvbmUgZnVsbCBwYXNzOyBzZWUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKS4gKi9cbitcdHNldHRpbmdzLmtodWdlcGFnZWQucGFnZXNfdG9fc2NhbiA9IDFVTCBcdTAwM2NcdTAwM2MgMjQ7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkrKylcbitcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XG4rXHRzZXR0aW5ncy5odWdlcGFnZXNbVEFSR0VUX09SREVSXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XG4rXHQvKiBCYXNlIG9mIHRoZSBzZXR0aW5ncyBzdGFjazsgdGhlIGJvdHRvbSBlbnRyeSBpcyBuZXZlciBwb3BwZWQuICovXG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9JVEVSQVRJT05TOyBpKyspXG4rXHRcdG9uZV9zdGVwKGkpO1xuK1xuK1x0dGhwX3Jlc3RvcmVfc2V0dGluZ3MoKTtcbitcbitcdGtzZnRfZmluaXNoZWQoKTtcbit9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuaW5kZXggNjg3ZDExNWUzYmQ4MC4uZjgyNmNmOTQwYzNkNCAxMDA3NTVcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuQEAgLTQwMiwxMCArNDAyLDI3IEBAIENBVEVHT1JZPVwicGZubWFwXCIgcnVuX3Rlc3QgLi9wZm5tYXBcbiAjIENPVyB0ZXN0c1xuIENBVEVHT1JZPVwiY293XCIgcnVuX3Rlc3QgLi9jb3dcbiBcbitDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4vZm9saW9fb3JkZXJfY2hlY2tcbitcbitcbitDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9zeW5jX2NoZWNrXG4rXG4rQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIHN0ZXBwZWRcbitcbitDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9yYWNlIC1kIDUgLW0gZnJlZVxuK1xuK0NBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3JhY2UgLWQgNSAtbSBtYWR2aXNlXG4rXG4rQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZSAtZCA1IC1tIHN0ZXBwZWQgLXpcbitcbitDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9yYWNlIC1kIDUgLW0gc3RlcHBlZCAtcFxuK1xuIENBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkXG4gXG4gQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgMlxuIFxuK0NBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1vIDIga2h1Z2VwYWdlZDphbm9uXG4rXG4gQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgYWxsOnNobWVtXG4gXG4gQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgNCBhbGw6c2htZW1cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuaW5kZXggMzJiOTkxNDcyZjc0NC4uOWIzODg1YmQwMDFiZSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmNcbkBAIC00Miw2OCArNDIsNiBAQCBjb25zdCBjaGFyICprcGFnZWZsYWdzX3Byb2MgPSBcIi9wcm9jL2twYWdlZmxhZ3NcIjtcbiBpbnQgcGFnZW1hcF9mZDtcbiBpbnQga3BhZ2VmbGFnc19mZDtcbiBcbi1zdGF0aWMgYm9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsXG4tXHRcdGludCBrcGFnZWZsYWdzX2ZkKVxuLXtcbi1cdGNvbnN0IHVpbnQ2NF90IGZvbGlvX2hlYWRfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX0hFQUQ7XG4tXHRjb25zdCB1aW50NjRfdCBmb2xpb190YWlsX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9UQUlMO1xuLVx0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4tXHR1bnNpZ25lZCBsb25nIHBmbl9oZWFkO1xuLVx0dWludDY0X3QgcGZuX2ZsYWdzO1xuLVx0dW5zaWduZWQgbG9uZyBwZm47XG4tXHR1bnNpZ25lZCBsb25nIGk7XG4tXG4tXHRwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xuLVxuLVx0Lyogbm9uIHByZXNlbnQgcGFnZSAqL1xuLVx0aWYgKHBmbiA9PSAtMVVMKVxuLVx0XHRyZXR1cm4gZmFsc2U7XG4tXG4tXHRpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdGdvdG8gZmFpbDtcbi1cbi1cdC8qIGNoZWNrIGZvciBvcmRlci0wIHBhZ2VzICovXG4tXHRpZiAoIW9yZGVyKSB7XG4tXHRcdGlmIChwZm5fZmxhZ3MgXHUwMDI2IChmb2xpb19oZWFkX2ZsYWdzIHwgZm9saW9fdGFpbF9mbGFncykpXG4tXHRcdFx0cmV0dXJuIGZhbHNlO1xuLVx0XHRyZXR1cm4gdHJ1ZTtcbi1cdH1cbi1cbi1cdC8qIG5vbiBUSFAgZm9saW8gKi9cbi1cdGlmICghKHBmbl9mbGFncyBcdTAwMjYgS1BGX1RIUCkpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdHBmbl9oZWFkID0gcGZuIFx1MDAyNiB+KG5yX3BhZ2VzIC0gMSk7XG4tXG4tXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbi1cdFx0Z290byBmYWlsO1xuLVxuLVx0LyogaGVhZCBQRk4gaGFzIG5vIGNvbXBvdW5kX2hlYWQgZmxhZyBzZXQgKi9cbi1cdGlmICgocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb19oZWFkX2ZsYWdzKSAhPSBmb2xpb19oZWFkX2ZsYWdzKVxuLVx0XHRyZXR1cm4gZmFsc2U7XG4tXG4tXHQvKiBjaGVjayBhbGwgdGFpbCBQRk4gZmxhZ3MgKi9cbi1cdGZvciAoaSA9IDE7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpKyspIHtcbi1cdFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBpLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuLVx0XHRcdGdvdG8gZmFpbDtcbi1cdFx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpXG4tXHRcdFx0cmV0dXJuIGZhbHNlO1xuLVx0fVxuLVxuLVx0Lypcbi1cdCAqIGNoZWNrIHRoZSBQRk4gYWZ0ZXIgdGhpcyBmb2xpbywgYnV0IGlmIGl0cyBmbGFncyBjYW5ub3QgYmUgb2J0YWluZWQsXG4tXHQgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyXG4tXHQgKi9cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdHJldHVybiB0cnVlO1xuLVxuLVx0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuLVx0cmV0dXJuIChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7XG4tZmFpbDpcbi1cdGtzZnRfZXhpdF9mYWlsX21zZyhcIkZhaWxlZCB0byBnZXQgZm9saW8gaW5mb1xcblwiKTtcbi1cdHJldHVybiBmYWxzZTtcbi19XG4tXG4gc3RhdGljIGludCB2YWRkcl9wYWdlZmxhZ3NfZ2V0KGNoYXIgKnZhZGRyLCBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQsXG4gXHRcdHVpbnQ2NF90ICpmbGFncylcbiB7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXG5pbmRleCBlZjFlYTExOTgxYTc0Li44ODZmYjNkZTljMDExIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmNcbkBAIC0zMDMsNiArMzAzLDE2MyBAQCBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncylcbiBcdHJldHVybiAwO1xuIH1cbiBcbitib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbitcdFx0XHRpbnQga3BhZ2VmbGFnc19mZClcbit7XG4rXHRjb25zdCB1aW50NjRfdCBmb2xpb19oZWFkX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9IRUFEO1xuK1x0Y29uc3QgdWludDY0X3QgZm9saW9fdGFpbF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfVEFJTDtcbitcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXHUwMDNjXHUwMDNjIG9yZGVyO1xuK1x0dW5zaWduZWQgbG9uZyBwZm5faGVhZDtcbitcdHVpbnQ2NF90IHBmbl9mbGFncztcbitcdHVuc2lnbmVkIGxvbmcgcGZuO1xuK1x0dW5zaWduZWQgbG9uZyBpO1xuK1xuK1x0cGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTtcbitcbitcdC8qIG5vbiBwcmVzZW50IHBhZ2UgKi9cbitcdGlmIChwZm4gPT0gLTFVTClcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuK1x0XHRnb3RvIGZhaWw7XG4rXG4rXHQvKiBjaGVjayBmb3Igb3JkZXItMCBwYWdlcyAqL1xuK1x0aWYgKCFvcmRlcikge1xuK1x0XHRpZiAocGZuX2ZsYWdzIFx1MDAyNiAoZm9saW9faGVhZF9mbGFncyB8IGZvbGlvX3RhaWxfZmxhZ3MpKVxuK1x0XHRcdHJldHVybiBmYWxzZTtcbitcdFx0cmV0dXJuIHRydWU7XG4rXHR9XG4rXG4rXHQvKiBub24gVEhQIGZvbGlvICovXG4rXHRpZiAoIShwZm5fZmxhZ3MgXHUwMDI2IEtQRl9USFApKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRwZm5faGVhZCA9IHBmbiBcdTAwMjYgfihucl9wYWdlcyAtIDEpO1xuK1xuK1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4rXHRcdGdvdG8gZmFpbDtcbitcbitcdC8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovXG4rXHRpZiAoKHBmbl9mbGFncyBcdTAwMjYgZm9saW9faGVhZF9mbGFncykgIT0gZm9saW9faGVhZF9mbGFncylcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0LyogY2hlY2sgYWxsIHRhaWwgUEZOIGZsYWdzICovXG4rXHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XG4rXHRcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgaSwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbitcdFx0XHRnb3RvIGZhaWw7XG4rXHRcdGlmICgocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzKVxuK1x0XHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcbitcdC8qXG4rXHQgKiBjaGVjayB0aGUgUEZOIGFmdGVyIHRoaXMgZm9saW8sIGJ1dCBpZiBpdHMgZmxhZ3MgY2Fubm90IGJlIG9idGFpbmVkLFxuK1x0ICogYXNzdW1lIHRoaXMgZm9saW8gaGFzIHRoZSBleHBlY3RlZCBvcmRlclxuK1x0ICovXG4rXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCArIG5yX3BhZ2VzLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuK1x0XHRyZXR1cm4gdHJ1ZTtcbitcbitcdC8qIElmIHdlIGZpbmQgYW5vdGhlciB0YWlsIHBhZ2UsIHRoZW4gdGhlIGZvbGlvIGlzIGxhcmdlci4gKi9cbitcdHJldHVybiAocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzO1xuK2ZhaWw6XG4rXHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXG5cIik7XG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuK1xuKy8qXG4rICogQ2hlY2sgd2hldGhlciB0aGUgcmFuZ2UgW3N0YXJ0LCBzdGFydCArIGxlbikgaXMgYmFja2VkIGJ5IGZvbGlvcyBvZlxuKyAqIGV4YWN0bHkgQG9yZGVyLCBtYXBwZWQgYXQgdGhlaXIgbmF0dXJhbCBhbGlnbm1lbnQuXG4rICpcbisgKiBpc19iYWNrZWRfYnlfZm9saW8oKSBjbGFzc2lmaWVzIHRoZSBmb2xpbyBiYWNraW5nIG9uZSBwYWdlOyBoZXJlIHdlXG4rICogYWRkaXRpb25hbGx5IHJlcXVpcmUgdGhhdCBlYWNoIG9yZGVyLWFsaWduZWQgd2luZG93IG9mIHRoZSByYW5nZSBtYXBzXG4rICogb25lIHN1Y2ggZm9saW8gaGVhZC10by10YWlsOiB0aGUgVkEgcmFuZ2UgbXVzdCBiZSBuYXR1cmFsbHkgYWxpZ25lZCxcbisgKiBlYWNoIHdpbmRvdydzIFBGTiBydW4gbXVzdCBiZSBjb250aWd1b3VzLCBhbmQgdGhlIGZpcnN0IFBGTiBtdXN0IGJlXG4rICogdGhlIChuYXR1cmFsbHkgYWxpZ25lZCkgZm9saW8gaGVhZC5cbisgKlxuKyAqIFRoaXMgaXMgdGhlIGNoZWNrIFwiZGlkIHRoaXMgcmFuZ2UgY29sbGFwc2UgaW50byBvcmRlci1Ab3JkZXIgZm9saW9zXCI6XG4rICogYSB3aW5kb3cgYXNzZW1ibGVkIGZyb20gcGFydHMgb2Ygc2V2ZXJhbCBmb2xpb3MsIG9yIG1hcHBpbmcgYSBmb2xpb1xuKyAqIHNoaWZ0ZWQgZnJvbSBpdHMgbmF0dXJhbCBwb3NpdGlvbiwgZmFpbHMuXG4rICovXG4rYm9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsXG4rXHRcdFx0XHQgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZClcbit7XG4rXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbitcdGNvbnN0IHNpemVfdCB3aW5kb3cgPSBucl9wYWdlcyAqIHBzaXplKCk7XG4rXHRjaGFyICp2YWRkcjtcbitcbitcdGlmICgodWludHB0cl90KXN0YXJ0ICUgd2luZG93IHx8IGxlbiAlIHdpbmRvdylcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0Zm9yICh2YWRkciA9IHN0YXJ0OyB2YWRkciBcdTAwM2Mgc3RhcnQgKyBsZW47IHZhZGRyICs9IHdpbmRvdykge1xuK1x0XHR1bnNpZ25lZCBsb25nIHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XG4rXHRcdHVuc2lnbmVkIGxvbmcgaTtcbitcbitcdFx0LyogTm90IHByZXNlbnQsIG9yIG5vdCBtYXBwaW5nIHRoZSBmb2xpbyBoZWFkLiAqL1xuK1x0XHRpZiAocGZuID09IC0xVUwgfHwgcGZuICUgbnJfcGFnZXMpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0XHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XG4rXHRcdFx0aWYgKHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkciArIGkgKiBwc2l6ZSgpKSAhPVxuK1x0XHRcdCAgICBwZm4gKyBpKVxuK1x0XHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHR9XG4rXG4rXHRcdGlmICghaXNfYmFja2VkX2J5X2ZvbGlvKHZhZGRyLCBvcmRlciwgcGFnZW1hcF9mZCxcbitcdFx0XHRcdFx0a3BhZ2VmbGFnc19mZCkpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuKyNkZWZpbmUgVFJBQ0VGU19ST09UIFwiL3N5cy9rZXJuZWwvdHJhY2luZ1wiXG4rXG4rc3RhdGljIGludCB0cmFjaW5nX2V2ZW50c193cml0ZShjb25zdCBjaGFyICpzdWJzeXMsIGNvbnN0IGNoYXIgKnZhbClcbit7XG4rXHRjaGFyIHBhdGhbMjU2XTtcbitcdGludCBmZDtcbitcbitcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgVFJBQ0VGU19ST09UIFwiL2V2ZW50cy8lcy9lbmFibGVcIixcbitcdFx0IHN1YnN5cyk7XG4rXHRmZCA9IG9wZW4ocGF0aCwgT19XUk9OTFkpO1xuK1x0aWYgKGZkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRpZiAod3JpdGUoZmQsIHZhbCwgMSkgIT0gMSkge1xuK1x0XHRjbG9zZShmZCk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiAwO1xuK31cbitcbisvKlxuKyAqIEVuYWJsZSBvbmUgZnRyYWNlIGV2ZW50IHN1YnN5c3RlbSAoZS5nLiBcImh1Z2VfbWVtb3J5XCIpIGFuZCBjbGVhciB0aGVcbisgKiB0cmFjZSBidWZmZXIuIFJldHVybnMgLTEgaWYgdHJhY2VmcyBpcyB1bmF2YWlsYWJsZTsgcGFyc2UgdGhlIHJlc3VsdHNcbisgKiB2aWEgdHJhY2luZ19vcGVuX3RyYWNlKCkgYWZ0ZXIgdHJhY2luZ19ldmVudHNfc3RvcCgpLlxuKyAqL1xuK2ludCB0cmFjaW5nX2V2ZW50c19zdGFydChjb25zdCBjaGFyICpzdWJzeXMpXG4re1xuK1x0aW50IGZkO1xuK1xuK1x0aWYgKHRyYWNpbmdfZXZlbnRzX3dyaXRlKHN1YnN5cywgXCIxXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRmZCA9IG9wZW4oVFJBQ0VGU19ST09UIFwiL3RyYWNlXCIsIE9fV1JPTkxZIHwgT19UUlVOQyk7XG4rXHRpZiAoZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiAwO1xuK31cbitcbitpbnQgdHJhY2luZ19ldmVudHNfc3RvcChjb25zdCBjaGFyICpzdWJzeXMpXG4re1xuK1x0cmV0dXJuIHRyYWNpbmdfZXZlbnRzX3dyaXRlKHN1YnN5cywgXCIwXCIpO1xuK31cbitcbitGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZClcbit7XG4rXHRyZXR1cm4gZm9wZW4oVFJBQ0VGU19ST09UIFwiL3RyYWNlXCIsIFwiclwiKTtcbit9XG4rXG4gLyogSWYgYGlvY3Rscycgbm9uLU5VTEwsIHRoZSBhbGxvd2VkIGlvY3RscyB3aWxsIGJlIHJldHVybmVkIGludG8gdGhlIHZhciAqL1xuIGludCB1ZmZkX3JlZ2lzdGVyX3dpdGhfaW9jdGxzKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sXG4gXHRcdFx0ICAgICAgYm9vbCBtaXNzLCBib29sIHdwLCBib29sIG1pbm9yLCB1aW50NjRfdCAqaW9jdGxzKVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaFxuaW5kZXggNzc5OTE1NGI2N2VlZC4uNGZmNWExYzVhYjhlZCAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXG5AQCAtOTUsNiArOTUsMTAgQEAgYm9vbCBjaGVja19odWdlX2ZpbGUodm9pZCAqYWRkciwgaW50IG5yX2hwYWdlcywgdWludDY0X3QgaHBhZ2Vfc2l6ZSk7XG4gYm9vbCBjaGVja19odWdlX3NobWVtKHZvaWQgKmFkZHIsIGludCBucl9ocGFnZXMsIHVpbnQ2NF90IGhwYWdlX3NpemUpO1xuIGludDY0X3QgYWxsb2NhdGVfdHJhbnNodWdlKHZvaWQgKnB0ciwgaW50IHBhZ2VtYXBfZmQpO1xuIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKTtcbitib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbitcdFx0XHRpbnQga3BhZ2VmbGFnc19mZCk7XG4rYm9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsXG4rXHRcdFx0XHQgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCk7XG4gXG4gaW50IHVmZmRfcmVnaXN0ZXIoaW50IHVmZmQsIHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbixcbiBcdFx0ICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IpO1xuQEAgLTExMSw2ICsxMTUsOSBAQCBpbnQgY2xvc2VfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcCk7XG4gaW50IHdyaXRlX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyB2YWwpO1xuIGludCByZWFkX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyAqdmFsKTtcbiBib29sIHNvZnRkaXJ0eV9zdXBwb3J0ZWQodm9pZCk7XG4raW50IHRyYWNpbmdfZXZlbnRzX3N0YXJ0KGNvbnN0IGNoYXIgKnN1YnN5cyk7XG4raW50IHRyYWNpbmdfZXZlbnRzX3N0b3AoY29uc3QgY2hhciAqc3Vic3lzKTtcbitGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZCk7XG4gXG4gc3RhdGljIGlubGluZSBpbnQgb3Blbl9zZWxmX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXBfb3V0KVxuIHtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTAzVDAxOjAzOjE0Ljc0MzM2NzI1OFoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjg0NjkwMDc0NjIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqV29ydGhGdXp6aW5nPWZhbHNlOiBBIFF1aWNrIFJldmlldyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggc2VyaWVzLCBhbmQgaXQncyBhbGwgYWJvdXQgbW9kaWZ5aW5nIHN0dWZmIHdpdGhpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vYC4gIFJpZ2h0IG9mZiB0aGUgYmF0LCB0aGF0IHNjcmVhbXMgKm5vdCBrZXJuZWwgY29kZSogdG8gbWUsIGJ1dCBJIG5lZWQgdG8gYmUgdGhvcm91Z2guIFRoZXNlIGFyZSB1c2Vyc3BhY2UgdGVzdHMuIEkgYWx3YXlzIHRyaXBsZS1jaGVjay4gVGhlIGluc3RydWN0aW9ucyBhcmUgcHJldHR5IGNsZWFyOiBtb2RpZmljYXRpb25zIHRvIHNlbGZ0ZXN0cyBhbG9uZSBzaG91bGRuJ3QgdHJpZ2dlciBmdXp6aW5nLiBUaGUgcXVlc3Rpb24gaXM6IGRvIHRoZSBpbnN0cnVjdGlvbnMgY2FwdHVyZSB0aGlzP1xuXG5MZXQgbWUgcXVpY2tseSBzY2FuIHRoZSBkaWZmIGFnYWluLiAgTm9wZSwganVzdCBkb3VibGUtY2hlY2tpbmcsIGl0J3MganVzdCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vYC4gVGhlIHNwZWNpZmljIGZpbGVzIGFyZTogYC5naXRpZ25vcmVgLCBgTWFrZWZpbGVgLCBgZm9saW9fb3JkZXJfY2hlY2suY2AsIGBodWdlcGFnZV9zZXR0aW5ncy5jYCBhbmQgYC5oYCwgYGtodWdlcGFnZWQuY2AgYW5kIGBfcmFjZS5jYCBhbmQgYF9zeW5jX2NoZWNrLmNgLCBgcnVuX3ZtdGVzdHMuc2hgLCBgc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY2AsIGB2bV91dGlsLmNgIGFuZCBgLmhgLiBBbGwgY29udGFpbmVkIHdpdGhpbiB0aGUgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2AgZGlyZWN0b3J5LlxuXG5Pa2F5LCBzbyB0aGVyZSdzIG5vIGtlcm5lbCBjb2RlIGJlaW5nIHRvdWNoZWQuICBObyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCwgcGVyaW9kLlxuXG5UaGUgcHJvbXB0IGlzIGNyeXN0YWwgY2xlYXI6IEknbSByZXZpZXdpbmcgcGF0Y2hlcyB0byBzZWUgaWYgdGhleSBmdW5jdGlvbmFsbHkgY2hhbmdlIHRoZSBrZXJuZWwgaW4gYSB3YXkgdGhhdCB3YXJyYW50cyBmdXp6aW5nLiBTaW5jZSB0aGlzIGlzICpvbmx5KiBtb2RpZnlpbmcgdXNlcnNwYWNlIHNlbGZ0ZXN0cywgdGhlIGFuc3dlciBpcyBhIHJlc291bmRpbmcgKm5vKi4gIEknbSByZXR1cm5pbmcgYFdvcnRoRnV6emluZz1mYWxzZWAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI0ODM1LCJPdXRwdXRUb2tlbnMiOjY0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Njk5LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDNUMDE6MDM6MjMuMjEyMzc3NDFaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3NDYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlcnNwYWNlIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vKikgYW5kIGRvZXMgbm90IG1ha2UgYW55IGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIGl0c2VsZi5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlcnNwYWNlIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vKikgYW5kIGRvZXMgbm90IG1ha2UgYW55IGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIGl0c2VsZi5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowgxx9r[1] Phase: Running StartedAt: 2026-08-03 01:03:35 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgxx9r[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-08-03 01:03:35 +0000 UTC FinishedAt: 2026-08-03 01:03:40 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:code,Default:nil,Value:*1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*1,}