Name: series-workflowdxljz Phase: Failed StartedAt: 2026-09-10 17:31:56 +0000 UTC FinishedAt: 2026-09-10 17:50:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxljz[0] Phase: Succeeded StartedAt: 2026-09-10 17:31:56 +0000 UTC FinishedAt: 2026-09-10 17:50:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxljz[0].run-triage Phase: Succeeded StartedAt: 2026-09-10 17:31:56 +0000 UTC FinishedAt: 2026-09-10 17:50:42 +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+CgkJCTx0ZD4yMDI2LzA5LzEwIDE3OjUwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtBbGwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgc3RyaWN0bHkgY29uZmluZWQgdG8gdGhlIFJJU0MtViBhcmNoaXRlY3R1cmUgKGFyY2gvcmlzY3YvKSwgc3BlY2lmaWNhbGx5IHRoZSBSSVNDLVYgS1ZNIFN0YWdlLTIgVk1JRCBtYW5hZ2VtZW50LiBUaGV5IGNhbm5vdCBiZSBidWlsdCBvciBleGVjdXRlZCBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSAoYW1kNjQpLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAxNzo1MDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDVmYzM1Y2NjNWM3ZDlkNGM3MzQ5NGI1NDhjODhkZTg1ZmRlMzQ4YzRcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IFNlcCAxMCAxNzo1MDoyNCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9nc3RhZ2UuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oXG5pbmRleCBhYWYwODBiYTFiNzdhLi5jNjFhMWJiYjI3MmY0IDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oXG5AQCAtOCw3ICYjNDM7OCw3IEBAXG4gI2RlZmluZSBfX1JJU0NWX0tWTV9HU1RBR0VfSF9cbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rdm1fdHlwZXMuaFx1MDAzZVxuLVxuJiM0MzsjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX3ZtaWQuaFx1MDAzZVxuIHN0cnVjdCBrdm1fZ3N0YWdlIHtcbiBcdHN0cnVjdCBrdm0gKmt2bTtcbiBcdHVuc2lnbmVkIGxvbmcgZmxhZ3M7XG5AQCAtMTA4LDcgJiM0MzsxMDgsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV9pbml0KHN0cnVjdCBrdm1fZ3N0YWdlICpnc3RhZ2UsIHN0cnVjdCBrdm0gKlxuIHtcbiBcdGdzdGFnZS1cdTAwM2Vrdm0gPSBrdm07XG4gXHRnc3RhZ2UtXHUwMDNlZmxhZ3MgPSAwO1xuLVx0Z3N0YWdlLVx1MDAzZXZtaWQgPSBSRUFEX09OQ0Uoa3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbiYjNDM7XHRnc3RhZ2UtXHUwMDNldm1pZCA9XG4mIzQzO1x0XHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNmt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdGdzdGFnZS1cdTAwM2VwZ2QgPSBrdm0tXHUwMDNlYXJjaC5wZ2Q7XG4gXHRnc3RhZ2UtXHUwMDNlcGdkX2xldmVscyA9IGt2bS1cdTAwM2VhcmNoLnBnZF9sZXZlbHM7XG4gfVxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaFxuaW5kZXggZGI2MWIwNTI1YThkMC4uZGRkN2NjMTI1YzNmNiAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaFxuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fdm1pZC5oXG5AQCAtNiwyMSAmIzQzOzYsNDIgQEBcbiAjaWZuZGVmIF9fUklTQ1ZfS1ZNX1ZNSURfSF9cbiAjZGVmaW5lIF9fUklTQ1ZfS1ZNX1ZNSURfSF9cbiBcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYXRvbWljLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rdm1fdHlwZXMuaFx1MDAzZVxuIFxuIHN0cnVjdCBrdm1fdm1pZCB7XG4gXHQvKlxuLVx0ICogV3JpdGVzIHRvIHZtaWRfdmVyc2lvbiBhbmQgdm1pZCBoYXBwZW4gd2l0aCB2bWlkX2xvY2sgaGVsZFxuLVx0ICogd2hlcmVhcyByZWFkcyBoYXBwZW4gd2l0aG91dCBhbnkgbG9jayBoZWxkLlxuJiM0MztcdCAqIFNvZnR3YXJlIFZNSUQ6XG4mIzQzO1x0ICpcbiYjNDM7XHQgKiAgIFsgZ2VuZXJhdGlvbiB8IGhhcmR3YXJlIFZNSUQgXVxuJiM0MztcdCAqXG4mIzQzO1x0ICogS2VlcCB0aGUgaWRlbnRpdHkgNjQtYml0IG9uIFJWMzIgc28gdGhhdCB0aGUgZ2VuZXJhdGlvbiBkb2VzIG5vdFxuJiM0MztcdCAqIHdyYXAgYXQgdGhlIG5hdGl2ZSB3b3JkIHNpemUuICBaZXJvIGRlbm90ZXMgYW4gdW5hbGxvY2F0ZWQgVk1JRC5cbiYjNDM7XHQgKlxuJiM0MztcdCAqIE9ubHkgdGhlIGxvdyBoYXJkd2FyZSBWTUlEIGJpdHMgbWF5IGJlIHdyaXR0ZW4gdG8gSEdBVFBcbiYjNDM7XHQgKiBvciB1c2VkIGFzIGEgaGFyZHdhcmUgZmVuY2UgVk1JRC5cbiBcdCAqL1xuLVx0dW5zaWduZWQgbG9uZyB2bWlkX3ZlcnNpb247XG4tXHR1bnNpZ25lZCBsb25nIHZtaWQ7XG4mIzQzO1x0YXRvbWljNjRfdCBpZDtcbiB9O1xuIFxuIHZvaWQgX19pbml0IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9kZXRlY3Qodm9pZCk7XG4gdW5zaWduZWQgbG9uZyBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYml0cyh2b2lkKTtcbiYjNDM7XG4mIzQzO2ludCBfX2luaXQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2luaXQodm9pZCk7XG4mIzQzO3ZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2ZyZWUodm9pZCk7XG4mIzQzO1xuIGludCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaW5pdChzdHJ1Y3Qga3ZtICprdm0pO1xuJiM0MztcbiYjNDM7dW5zaWduZWQgbG9uZyBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh1NjQgdm1pZCk7XG4mIzQzO1xuIGJvb2wga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3Zlcl9jaGFuZ2VkKHN0cnVjdCBrdm1fdm1pZCAqdm1pZCk7XG4mIzQzO1xuIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpO1xuIFxuJiM0MzsvKlxuJiM0MzsgKiBJbnZhbGlkYXRlIHRoZSBjdXJyZW50IENQVSYjMzk7cyBmYXN0LXBhdGggVk1JRCBzdGF0ZSB3aGlsZSBwcmVzZXJ2aW5nXG4mIzQzOyAqIHRoZSBvbGQgaWRlbnRpdHkgY29uc2VydmF0aXZlbHkgaW4gcmVzZXJ2ZWRfdm1pZHMuXG4mIzQzOyAqL1xuJiM0Mzt2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9jcHVfaW52YWxpZGF0ZSh2b2lkKTtcbiYjNDM7XG4gI2VuZGlmXG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vbWFpbi5jIGIvYXJjaC9yaXNjdi9rdm0vbWFpbi5jXG5pbmRleCA4OTU2OGNjY2UwMWRlLi5kNmM2YmU0ZGY2MWIxIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vbWFpbi5jXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2t2bS9tYWluLmNcbkBAIC0xNiw3ICYjNDM7MTYsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fbmFjbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL3NiaS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV92Y3B1X3ZlY3Rvci5oXHUwMDNlXG4tXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fdm1pZC5oXHUwMDNlXG4gc3RhdGljIERFRklORV9QRVJfQ1BVKGJvb2wsIGt2bV9yaXNjdl92aXJ0dWFsaXphdGlvbl9lbmFibGVkKTtcbiBcbiBERUZJTkVfU1RBVElDX0tFWV9GQUxTRShrdm1fcmlzY3ZfdnNzdGFnZV90bGJfbm9fZ3BhKTtcbkBAIC04NCw2ICYjNDM7ODQsNyBAQCBpbnQga3ZtX2FyY2hfZW5hYmxlX3ZpcnR1YWxpemF0aW9uX2NwdSh2b2lkKVxuIFxuIHZvaWQga3ZtX2FyY2hfZGlzYWJsZV92aXJ0dWFsaXphdGlvbl9jcHUodm9pZClcbiB7XG4mIzQzO1x0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKCk7XG4gXHRrdm1fcmlzY3ZfYWlhX2Rpc2FibGUoKTtcbiBcdGt2bV9yaXNjdl9jc3JfY2xlYW51cCgpO1xuIFx0a3ZtX3Jpc2N2X25hY2xfZGlzYWJsZSgpO1xuQEAgLTExMiw2ICYjNDM7MTEzLDcgQEAgc3RhdGljIGludCBrdm1fcmlzY3ZfY3B1X3BtX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZ1xuIFx0XHQgKiBpcyBlbmFibGVkIG9uIHRoaXMgQ1BVLlxuIFx0XHQgKi9cbiBcdFx0aWYgKF9fdGhpc19jcHVfcmVhZChrdm1fcmlzY3ZfdmlydHVhbGl6YXRpb25fZW5hYmxlZCkpIHtcbiYjNDM7XHRcdFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKCk7XG4gXHRcdFx0a3ZtX3Jpc2N2X2FpYV9wbV9lbnRlcigpO1xuIFx0XHRcdGt2bV9yaXNjdl9jc3JfY2xlYW51cCgpO1xuIFx0XHR9XG5AQCAtMTMwLDYgJiM0MzsxMzIsNyBAQCBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGt2bV9yaXNjdl9jcHVfcG1fbmIgPSB7XG4gc3RhdGljIHZvaWQga3ZtX3Jpc2N2X3RlYXJkb3duKHZvaWQpXG4ge1xuIFx0a3ZtX3Jpc2N2X2FpYV9leGl0KCk7XG4mIzQzO1x0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2ZyZWUoKTtcbiBcdGt2bV9yaXNjdl9uYWNsX2V4aXQoKTtcbiBcdGt2bV9yaXNjdl92X2V4aXQoKTtcbiBcdGt2bV91bnJlZ2lzdGVyX3BlcmZfY2FsbGJhY2tzKCk7XG5AQCAtMTgxLDggJiM0MzsxODQsMTUgQEAgc3RhdGljIGludCBfX2luaXQgcmlzY3Zfa3ZtX2luaXQodm9pZClcbiBcbiBcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9kZXRlY3QoKTtcbiBcbiYjNDM7XHRyYyA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19pbml0KCk7XG4mIzQzO1x0aWYgKHJjKSB7XG4mIzQzO1x0XHRrdm1fcmlzY3ZfbmFjbF9leGl0KCk7XG4mIzQzO1x0XHRyZXR1cm4gcmM7XG4mIzQzO1x0fVxuJiM0MztcbiBcdHJjID0ga3ZtX3Jpc2N2X2FpYV9pbml0KCk7XG4gXHRpZiAocmMgXHUwMDI2XHUwMDI2IHJjICE9IC1FTk9ERVYpIHtcbiYjNDM7XHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKCk7XG4gXHRcdGt2bV9yaXNjdl9uYWNsX2V4aXQoKTtcbiBcdFx0cmV0dXJuIHJjO1xuIFx0fVxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL21tdS5jIGIvYXJjaC9yaXNjdi9rdm0vbW11LmNcbmluZGV4IDYwMzViNWVjOTUwMzkuLjNjOGZiNjAwOWMwYTUgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS9tbXUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9rdm0vbW11LmNcbkBAIC0xNSw3ICYjNDM7MTUsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkL3NpZ25hbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV9tbXUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fbmFjbC5oXHUwMDNlXG4tXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fdm1pZC5oXHUwMDNlXG4gc3RhdGljIGJvb2wgX19yZWFkX21vc3RseSBlYWdlcl9wYWdlX3NwbGl0ID0gdHJ1ZTtcbiBtb2R1bGVfcGFyYW0oZWFnZXJfcGFnZV9zcGxpdCwgYm9vbCwgMDY0NCk7XG4gXG5AQCAtNzk5LDEwICYjNDM7Nzk5LDExIEBAIHZvaWQga3ZtX3Jpc2N2X21tdV9mcmVlX3BnZChzdHJ1Y3Qga3ZtICprdm0pXG4gdm9pZCBrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4ge1xuIFx0c3RydWN0IGt2bV9hcmNoICprYSA9IFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2g7XG4mIzQzO1x0dTY0IHZtaWQgPSBhdG9taWM2NF9yZWFkKFx1MDAyNmthLVx1MDAzZXZtaWQuaWQpO1xuIFx0dW5zaWduZWQgbG9uZyBoZ2F0cCA9IGt2bV9yaXNjdl9nc3RhZ2VfbW9kZShrYS1cdTAwM2VwZ2RfbGV2ZWxzKVxuIFx0XHRcdCAgICAgIFx1MDAzY1x1MDAzYyBIR0FUUF9NT0RFX1NISUZUO1xuIFxuLVx0aGdhdHAgfD0gKFJFQURfT05DRShrYS1cdTAwM2V2bWlkLnZtaWQpIFx1MDAzY1x1MDAzYyBIR0FUUF9WTUlEX1NISUZUKSBcdTAwMjYgSEdBVFBfVk1JRDtcbiYjNDM7XHRoZ2F0cCB8PSAoa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCkgXHUwMDNjXHUwMDNjIEhHQVRQX1ZNSURfU0hJRlQpIFx1MDAyNiBIR0FUUF9WTUlEO1xuIFx0aGdhdHAgfD0gKGthLVx1MDAzZXBnZF9waHlzIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKSBcdTAwMjYgSEdBVFBfUFBOO1xuIFxuIFx0bmNzcl93cml0ZShDU1JfSEdBVFAsIGhnYXRwKTtcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS90bGIuYyBiL2FyY2gvcmlzY3Yva3ZtL3RsYi5jXG5pbmRleCAyYWUzNDYzMmNkY2IxLi5iODVlNWJhMjE5OGFhIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdGxiLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3Yva3ZtL3RsYi5jXG5AQCAtMjI0LDcgJiM0MzsyMjQsNyBAQCB2b2lkIGt2bV9yaXNjdl9sb2NhbF90bGJfc2FuaXRpemUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0ICogZW50cmllcyBieSBWTUlEIHdoZW5ldmVyIHVuZGVybHlpbmcgSG9zdCBDUFUgY2hhbmdlcyBmb3IgYSBWQ1BVLlxuIFx0ICovXG4gXG4tXHR2bWlkID0gUkVBRF9PTkNFKHZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbiYjNDM7XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV92bWlkX2FsbCh2bWlkKTtcbiBcbiBcdC8qXG5AQCAtMjQ0LDcgJiM0MzsyNDQsNyBAQCB2b2lkIGt2bV9yaXNjdl9mZW5jZV9pX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHZvaWQga3ZtX3Jpc2N2X3RsYl9mbHVzaF9wcm9jZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiB7XG4gXHRzdHJ1Y3Qga3ZtX3ZtaWQgKnYgPSBcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQ7XG4tXHR1bnNpZ25lZCBsb25nIHZtaWQgPSBSRUFEX09OQ0Uodi1cdTAwM2V2bWlkKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNnYtXHUwMDNlaWQpKTtcbiBcbiBcdGlmIChrdm1fcmlzY3ZfbmFjbF9hdmFpbGFibGUoKSlcbiBcdFx0bmFjbF9oZmVuY2VfZ3ZtYV92bWlkX2FsbChuYWNsX3NobWVtKCksIHZtaWQpO1xuQEAgLTI1NSw3ICYjNDM7MjU1LDcgQEAgdm9pZCBrdm1fcmlzY3ZfdGxiX2ZsdXNoX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHZvaWQga3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbF9wcm9jZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiB7XG4gXHRzdHJ1Y3Qga3ZtX3ZtaWQgKnYgPSBcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQ7XG4tXHR1bnNpZ25lZCBsb25nIHZtaWQgPSBSRUFEX09OQ0Uodi1cdTAwM2V2bWlkKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNnYtXHUwMDNlaWQpKTtcbiBcbiBcdGlmIChrdm1fcmlzY3ZfbmFjbF9hdmFpbGFibGUoKSlcbiBcdFx0bmFjbF9oZmVuY2VfdnZtYV9hbGwobmFjbF9zaG1lbSgpLCB2bWlkKTtcbkBAIC01MzEsOCAmIzQzOzUzMSwxMSBAQCB2b2lkIGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwoc3RydWN0IGt2bSAqa3ZtLFxuIFxuIGludCBrdm1fYXJjaF9mbHVzaF9yZW1vdGVfdGxic19yYW5nZShzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbiwgdTY0IG5yX3BhZ2VzKVxuIHtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHZtaWQgPVxuJiM0MztcdFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZrdm0tXHUwMDNlYXJjaC52bWlkLmlkKSk7XG4mIzQzO1xuIFx0a3ZtX3Jpc2N2X2hmZW5jZV9ndm1hX3ZtaWRfZ3BhKGt2bSwgLTFVTCwgMCxcbiBcdFx0XHRcdCAgICAgICBnZm4gXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQsIG5yX3BhZ2VzIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZULFxuLVx0XHRcdFx0ICAgICAgIFBBR0VfU0hJRlQsIFJFQURfT05DRShrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpKTtcbiYjNDM7XHRcdFx0XHQgICAgICAgUEFHRV9TSElGVCwgdm1pZCk7XG4gXHRyZXR1cm4gMDtcbiB9XG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdmNwdS5jIGIvYXJjaC9yaXNjdi9rdm0vdmNwdS5jXG5pbmRleCBlMDYyY2ExOWY5ZDhmLi44NTU0MmMxYTVlYzNmIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdmNwdS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1LmNcbkBAIC05NDMsMTQgJiM0Mzs5NDMsMTQgQEAgaW50IGt2bV9hcmNoX3ZjcHVfaW9jdGxfcnVuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdFx0XHRjb250aW51ZTtcbiBcdFx0cmV0ID0gMTtcbiBcbi1cdFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZSh2Y3B1KTtcbi1cbiBcdFx0cmV0ID0ga3ZtX3Jpc2N2X2NoZWNrX3ZjcHVfcmVxdWVzdHModmNwdSk7XG4gXHRcdGlmIChyZXQgXHUwMDNjPSAwKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuIFx0XHRwcmVlbXB0X2Rpc2FibGUoKTtcbiBcbiYjNDM7XHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUodmNwdSk7XG4mIzQzO1xuIFx0XHQvKiBVcGRhdGUgQUlBIEhXIHN0YXRlIGJlZm9yZSBlbnRlcmluZyBndWVzdCAqL1xuIFx0XHRyZXQgPSBrdm1fcmlzY3ZfdmNwdV9haWFfdXBkYXRlKHZjcHUpO1xuIFx0XHRpZiAocmV0IFx1MDAzYz0gMCkge1xuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY1xuaW5kZXggNTA2YTUxMGI2YmZmMy4uMWJlMzg2YTc4ZTI3ZiAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY1xuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfcmVwbGFjZS5jXG5AQCAtMTA0LDcgJiM0MzsxMDQsNyBAQCBzdGF0aWMgaW50IGt2bV9zYmlfZXh0X3JmZW5jZV9oYW5kbGVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1blxuIFx0XHRrdm1fcmlzY3ZfdmNwdV9wbXVfaW5jcl9mdyh2Y3B1LCBTQklfUE1VX0ZXX0ZFTkNFX0lfU0VOVCk7XG4gXHRcdGJyZWFrO1xuIFx0Y2FzZSBTQklfRVhUX1JGRU5DRV9SRU1PVEVfU0ZFTkNFX1ZNQTpcbi1cdFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZCk7XG4mIzQzO1x0XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdFx0aWYgKChjcC1cdTAwM2VhMiA9PSAwIFx1MDAyNlx1MDAyNiBjcC1cdTAwM2VhMyA9PSAwKSB8fCBjcC1cdTAwM2VhMyA9PSAtMVVMKVxuIFx0XHRcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwodmNwdS1cdTAwM2Vrdm0sIGhiYXNlLCBobWFzaywgdm1pZCk7XG4gXHRcdGVsc2VcbkBAIC0xMTMsNyAmIzQzOzExMyw3IEBAIHN0YXRpYyBpbnQga3ZtX3NiaV9leHRfcmZlbmNlX2hhbmRsZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuXG4gXHRcdGt2bV9yaXNjdl92Y3B1X3BtdV9pbmNyX2Z3KHZjcHUsIFNCSV9QTVVfRldfSEZFTkNFX1ZWTUFfU0VOVCk7XG4gXHRcdGJyZWFrO1xuIFx0Y2FzZSBTQklfRVhUX1JGRU5DRV9SRU1PVEVfU0ZFTkNFX1ZNQV9BU0lEOlxuLVx0XHR2bWlkID0gUkVBRF9PTkNFKHZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbiYjNDM7XHRcdHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC5pZCkpO1xuIFx0XHRpZiAoKGNwLVx1MDAzZWEyID09IDAgXHUwMDI2XHUwMDI2IGNwLVx1MDAzZWEzID09IDApIHx8IGNwLVx1MDAzZWEzID09IC0xVUwpXG4gXHRcdFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FzaWRfYWxsKHZjcHUtXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2ssXG4gXHRcdFx0XHRcdFx0ICAgICAgIGNwLVx1MDAzZWE0LCB2bWlkKTtcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jXG5pbmRleCBkZTU0NGVhM2YyOGRjLi5jYTNlZmU2M2MxY2YxIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfdjAxLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jXG5AQCAtODgsMTQgJiM0Mzs4OCwxNCBAQCBzdGF0aWMgaW50IGt2bV9zYmlfZXh0X3YwMV9oYW5kbGVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1bixcbiBcdFx0aWYgKGNwLVx1MDAzZWE3ID09IFNCSV9FWFRfMF8xX1JFTU9URV9GRU5DRV9JKVxuIFx0XHRcdGt2bV9yaXNjdl9mZW5jZV9pKHZjcHUtXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2spO1xuIFx0XHRlbHNlIGlmIChjcC1cdTAwM2VhNyA9PSBTQklfRVhUXzBfMV9SRU1PVEVfU0ZFTkNFX1ZNQSkge1xuLVx0XHRcdHZtaWQgPSBSRUFEX09OQ0UodmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpO1xuJiM0MztcdFx0XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdFx0XHRpZiAoY3AtXHUwMDNlYTEgPT0gMCBcdTAwMjZcdTAwMjYgY3AtXHUwMDNlYTIgPT0gMClcbiBcdFx0XHRcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwodmNwdS1cdTAwM2Vrdm0sIGhiYXNlLCBobWFzaywgdm1pZCk7XG4gXHRcdFx0ZWxzZVxuIFx0XHRcdFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2d2YSh2Y3B1LVx1MDAzZWt2bSwgaGJhc2UsIGhtYXNrLCBjcC1cdTAwM2VhMSxcbiBcdFx0XHRcdFx0XHRcdCAgY3AtXHUwMDNlYTIsIFBBR0VfU0hJRlQsIHZtaWQpO1xuIFx0XHR9IGVsc2Uge1xuLVx0XHRcdHZtaWQgPSBSRUFEX09OQ0UodmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpO1xuJiM0MztcdFx0XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdFx0XHRpZiAoY3AtXHUwMDNlYTEgPT0gMCBcdTAwMjZcdTAwMjYgY3AtXHUwMDNlYTIgPT0gMClcbiBcdFx0XHRcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hc2lkX2FsbCh2Y3B1LVx1MDAzZWt2bSwgaGJhc2UsIGhtYXNrLFxuIFx0XHRcdFx0XHRcdFx0ICAgICAgIGNwLVx1MDAzZWEzLCB2bWlkKTtcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92bWlkLmMgYi9hcmNoL3Jpc2N2L2t2bS92bWlkLmNcbmluZGV4IGMxNWJkYjFkZDhiZWYuLjdiODZhNmZiZTRhNjkgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS92bWlkLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuY1xuQEAgLTYsMTEgJiM0Mzs2LDE1IEBAXG4gICogICAgIEFudXAgUGF0ZWwgXHUwMDNjYW51cC5wYXRlbEB3ZGMuY29tXHUwMDNlXG4gICovXG4gXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpdG1hcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYml0b3BzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jcHVtYXNrLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9lcnJuby5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZXJyLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9wZXJjcHUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9wcmVlbXB0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc21wLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rdm1faG9zdC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2Nzci5oXHUwMDNlXG5AQCAtMTgsMjYgJiM0MzsyMiw1NCBAQFxuICNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fdGxiLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX3ZtaWQuaFx1MDAzZVxuIFxuLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZtaWRfdmVyc2lvbiA9IDE7XG4tc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF9uZXh0O1xuJiM0MztzdGF0aWMgYXRvbWljNjRfdCB2bWlkX2dlbmVyYXRpb247XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nICp2bWlkX21hcDtcbiBzdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX2JpdHMgX19yb19hZnRlcl9pbml0O1xuLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodm1pZF9sb2NrKTtcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF9jdXJfaWR4ID0gMTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKHZtaWRfbG9jayk7XG4mIzQzO1xuJiM0MztzdGF0aWMgREVGSU5FX1BFUl9DUFUoYXRvbWljNjRfdCwgYWN0aXZlX3ZtaWRzKTtcbiYjNDM7c3RhdGljIERFRklORV9QRVJfQ1BVKHU2NCwgcmVzZXJ2ZWRfdm1pZHMpO1xuJiM0MztcbiYjNDM7c3RhdGljIGNwdW1hc2tfdCB0bGJfZmx1c2hfcGVuZGluZztcbiYjNDM7XG4mIzQzOyNkZWZpbmUgVk1JRF9GSVJTVF9WRVJTSU9OXHRCSVRfVUxMKHZtaWRfYml0cylcbiYjNDM7I2RlZmluZSBOVU1fVk1JRFNcdFx0QklUKHZtaWRfYml0cylcbiYjNDM7I2RlZmluZSBWTUlEX0hXX01BU0tcdFx0KFZNSURfRklSU1RfVkVSU0lPTiAtIDEpXG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCB2bWlkX2dlbl9tYXRjaCh1NjQgdm1pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiAhKCh2bWlkIF4gYXRvbWljNjRfcmVhZChcdTAwMjZ2bWlkX2dlbmVyYXRpb24pKSBcdTAwM2VcdTAwM2Ugdm1pZF9iaXRzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dW5zaWduZWQgbG9uZyBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh1NjQgdm1pZClcbiYjNDM7e1xuJiM0MztcdGlmICghdm1pZF9iaXRzKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdHJldHVybiAodW5zaWduZWQgbG9uZykodm1pZCBcdTAwMjYgVk1JRF9IV19NQVNLKTtcbiYjNDM7fVxuIFxuIHZvaWQgX19pbml0IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9kZXRlY3Qodm9pZClcbiB7XG4tXHQvKiBGaWd1cmUtb3V0IG51bWJlciBvZiBWTUlEIGJpdHMgaW4gSFcgKi9cbiYjNDM7XHQvKiBGaWd1cmUgb3V0IHRoZSBudW1iZXIgb2YgVk1JRCBiaXRzIHN1cHBvcnRlZCBieSBoYXJkd2FyZS4gKi9cbiBcdGNzcl93cml0ZShDU1JfSEdBVFAsIChrdm1fcmlzY3ZfZ3N0YWdlX21vZGUoa3ZtX3Jpc2N2X2dzdGFnZV9tYXhfcGdkX2xldmVscykgXHUwMDNjXHUwMDNjXG4tXHRcdFx0ICAgICAgSEdBVFBfTU9ERV9TSElGVCkgfCBIR0FUUF9WTUlEKTtcbiYjNDM7XHRcdCAgIEhHQVRQX01PREVfU0hJRlQpIHwgSEdBVFBfVk1JRCk7XG4gXHR2bWlkX2JpdHMgPSBjc3JfcmVhZChDU1JfSEdBVFApO1xuIFx0dm1pZF9iaXRzID0gKHZtaWRfYml0cyBcdTAwMjYgSEdBVFBfVk1JRCkgXHUwMDNlXHUwMDNlIEhHQVRQX1ZNSURfU0hJRlQ7XG4gXHR2bWlkX2JpdHMgPSBmbHNfbG9uZyh2bWlkX2JpdHMpO1xuIFx0Y3NyX3dyaXRlKENTUl9IR0FUUCwgMCk7XG4gXG4tXHQvKiBXZSBwb2xsdXRlZCBsb2NhbCBUTEIgc28gZmx1c2ggYWxsIGd1ZXN0IFRMQiAqL1xuJiM0MztcdC8qIEZsdXNoIHRoZSBsb2NhbCBndWVzdCBUTEIgYWZ0ZXIgcHJvYmluZyBIR0FUUC4gKi9cbiBcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwoKTtcbiBcbi1cdC8qIFdlIGRvbiYjMzk7dCB1c2UgVk1JRCBiaXRzIGlmIHRoZXkgYXJlIG5vdCBzdWZmaWNpZW50ICovXG4tXHRpZiAoKDFVTCBcdTAwM2NcdTAwM2Mgdm1pZF9iaXRzKSBcdTAwM2MgbnVtX3Bvc3NpYmxlX2NwdXMoKSlcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFZNSUQgMCBpcyByZXNlcnZlZC4gIER1cmluZyByb2xsb3ZlciBldmVyeSBwb3NzaWJsZSBDUFUgbWF5XG4mIzQzO1x0ICogcmVzZXJ2ZSBvbmUgaGFyZHdhcmUgVk1JRCwgYW5kIHdlIHN0aWxsIG5lZWQgYXQgbGVhc3Qgb25lIFZNSURcbiYjNDM7XHQgKiBhdmFpbGFibGUgZm9yIGEgbmV3IGFsbG9jYXRpb24uXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHZtaWRfYml0cyBcdTAwMjZcdTAwMjYgTlVNX1ZNSURTIC0gMSBcdTAwM2M9IG51bV9wb3NzaWJsZV9jcHVzKCkpXG4gXHRcdHZtaWRfYml0cyA9IDA7XG4gfVxuIFxuQEAgLTQ2LDgwICYjNDM7NzgsMjk4IEBAIHVuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHModm9pZClcbiBcdHJldHVybiB2bWlkX2JpdHM7XG4gfVxuIFxuJiM0MztpbnQgX19pbml0IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19pbml0KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgY3B1O1xuJiM0MztcbiYjNDM7XHRpZiAoIXZtaWRfYml0cylcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHR2bWlkX21hcCA9IGJpdG1hcF96YWxsb2MoTlVNX1ZNSURTLCBHRlBfS0VSTkVMKTtcbiYjNDM7XHRpZiAoIXZtaWRfbWFwKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdHZtaWRfY3VyX2lkeCA9IDE7XG4mIzQzO1xuJiM0MztcdC8qIEhhcmR3YXJlIFZNSUQgMCBpcyByZXNlcnZlZC4gKi9cbiYjNDM7XHRfX3NldF9iaXQoMCwgdm1pZF9tYXApO1xuJiM0MztcbiYjNDM7XHRhdG9taWM2NF9zZXQoXHUwMDI2dm1pZF9nZW5lcmF0aW9uLCBWTUlEX0ZJUlNUX1ZFUlNJT04pO1xuJiM0MztcbiYjNDM7XHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4mIzQzO1x0XHRhdG9taWM2NF9zZXQoXHUwMDI2cGVyX2NwdShhY3RpdmVfdm1pZHMsIGNwdSksIDApO1xuJiM0MztcdFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IDA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEV2ZXJ5IENQVSBwZXJmb3JtcyBhbiBpbml0aWFsIGxvY2FsIGludmFsaWRhdGlvbiBiZWZvcmUgaXRzXG4mIzQzO1x0ICogZmlyc3QgVk1JRCBhY3RpdmF0aW9uLlxuJiM0MztcdCAqL1xuJiM0MztcdGNwdW1hc2tfY29weShcdTAwMjZ0bGJfZmx1c2hfcGVuZGluZywgY3B1X3Bvc3NpYmxlX21hc2spO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfZnJlZSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0Yml0bWFwX2ZyZWUodm1pZF9tYXApO1xuJiM0MztcdHZtaWRfbWFwID0gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiBpbnQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2luaXQoc3RydWN0IGt2bSAqa3ZtKVxuIHtcbi1cdC8qIE1hcmsgdGhlIGluaXRpYWwgVk1JRCBhbmQgVk1JRCB2ZXJzaW9uIGludmFsaWQgKi9cbi1cdGt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZF92ZXJzaW9uID0gMDtcbi1cdGt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZCA9IDA7XG4mIzQzO1x0YXRvbWljNjRfc2V0KFx1MDAyNmt2bS1cdTAwM2VhcmNoLnZtaWQuaWQsIDApO1xuIFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuIGJvb2wga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3Zlcl9jaGFuZ2VkKHN0cnVjdCBrdm1fdm1pZCAqdm1pZClcbiB7XG4mIzQzO1x0dTY0IGlkO1xuJiM0MztcbiBcdGlmICghdm1pZF9iaXRzKVxuIFx0XHRyZXR1cm4gZmFsc2U7XG4gXG4tXHRyZXR1cm4gdW5saWtlbHkoUkVBRF9PTkNFKHZtaWQtXHUwMDNldm1pZF92ZXJzaW9uKSAhPVxuLVx0XHRcdFJFQURfT05DRSh2bWlkX3ZlcnNpb24pKTtcbiYjNDM7XHRpZCA9IGF0b21pYzY0X3JlYWQoXHUwMDI2dm1pZC1cdTAwM2VpZCk7XG4mIzQzO1xuJiM0MztcdHJldHVybiB1bmxpa2VseSghdm1pZF9nZW5fbWF0Y2goaWQpKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgX19sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwodm9pZCAqaW5mbylcbiYjNDM7LypcbiYjNDM7ICogQ2FsbGVkIHdpdGggdm1pZF9sb2NrIGhlbGQgYWZ0ZXIgdm1pZF9nZW5lcmF0aW9uIGhhcyBhbHJlYWR5IGJlZW5cbiYjNDM7ICogYWR2YW5jZWQuXG4mIzQzOyAqXG4mIzQzOyAqIE5vIHJlbW90ZSBDUFUgaXMgaW50ZXJydXB0ZWQgaGVyZS4gIEluc3RlYWQsIHByZXNlcnZlIGV2ZXJ5IFZNSURcbiYjNDM7ICogd2hpY2ggbWF5IHN0aWxsIGJlIHVzZWQgYnkgYSBDUFUgYW5kIHF1ZXVlIGEgbG9jYWwgaW52YWxpZGF0aW9uIGZvclxuJiM0MzsgKiB0aGF0IENQVSYjMzk7cyBuZXh0IFZNSUQgYWN0aXZhdGlvbi5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIGZsdXNoX2NvbnRleHQodm9pZClcbiB7XG4tXHRrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfYWxsKCk7XG4mIzQzO1x0dTY0IHZtaWQ7XG4mIzQzO1x0aW50IGNwdTtcbiYjNDM7XG4mIzQzO1x0Yml0bWFwX3plcm8odm1pZF9tYXAsIE5VTV9WTUlEUyk7XG4mIzQzO1x0X19zZXRfYml0KDAsIHZtaWRfbWFwKTtcbiYjNDM7XG4mIzQzO1x0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xuJiM0MztcdFx0dm1pZCA9IGF0b21pYzY0X3hjaGcoXHUwMDI2cGVyX2NwdShhY3RpdmVfdm1pZHMsIGNwdSksIDApO1xuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBUaGUgQ1BVIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBjYXVnaHQgYnkgYW4gZWFybGllciByb2xsb3ZlclxuJiM0MztcdFx0ICogd2l0aG91dCBwZXJmb3JtaW5nIGFub3RoZXIgYWN0aXZhdGlvbiBzaW5jZSB0aGVuLiAgSW4gdGhhdFxuJiM0MztcdFx0ICogY2FzZSByZXNlcnZlZF92bWlkcyBpcyB0aGUgb25seSByZWNvcmQgb2YgdGhlIG9sZCBjb250ZXh0LlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoIXZtaWQpXG4mIzQzO1x0XHRcdHZtaWQgPSBwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpO1xuJiM0MztcbiYjNDM7XHRcdGlmICh2bWlkKVxuJiM0MztcdFx0XHRfX3NldF9iaXQoa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCksXG4mIzQzO1x0XHRcdFx0ICB2bWlkX21hcCk7XG4mIzQzO1xuJiM0MztcdFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IHZtaWQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRjcHVtYXNrX2NvcHkoXHUwMDI2dGxiX2ZsdXNoX3BlbmRpbmcsIGNwdV9wb3NzaWJsZV9tYXNrKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVXBkYXRlIGV2ZXJ5IHJlc2VydmVkIGNvcHkgb2YgYW4gb2xkIHNvZnR3YXJlIFZNSUQuXG4mIzQzOyAqXG4mIzQzOyAqIERvIG5vdCBzdG9wIGFmdGVyIHRoZSBmaXJzdCBtYXRjaDogdGhlIHNhbWUgVk0gbWF5IGhhdmUgYmVlbiBhY3RpdmVcbiYjNDM7ICogb24gbW9yZSB0aGFuIG9uZSBDUFUgd2hlbiByb2xsb3ZlciBvY2N1cnJlZC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBib29sIGNoZWNrX3VwZGF0ZV9yZXNlcnZlZF92bWlkKHU2NCBvbGRfdm1pZCwgdTY0IG5ld192bWlkKVxuJiM0Mzt7XG4mIzQzO1x0Ym9vbCBoaXQgPSBmYWxzZTtcbiYjNDM7XHRpbnQgY3B1O1xuJiM0MztcbiYjNDM7XHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4mIzQzO1x0XHRpZiAocGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9PSBvbGRfdm1pZCkge1xuJiM0MztcdFx0XHRwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID0gbmV3X3ZtaWQ7XG4mIzQzO1x0XHRcdGhpdCA9IHRydWU7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gaGl0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBBbGxvY2F0ZS9wcm9tb3RlIGEgc29mdHdhcmUgVk1JRC5cbiYjNDM7ICpcbiYjNDM7ICogdm1pZF9sb2NrIG11c3QgYmUgaGVsZCBieSB0aGUgY2FsbGVyLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHU2NCBuZXdfdm1pZF9sb2NrZWQoc3RydWN0IGt2bV92bWlkICprdm1fdm1pZClcbiYjNDM7e1xuJiM0MztcdHU2NCB2bWlkID0gYXRvbWljNjRfcmVhZChcdTAwMjZrdm1fdm1pZC1cdTAwM2VpZCk7XG4mIzQzO1x0dTY0IGdlbmVyYXRpb24gPSBhdG9taWM2NF9yZWFkKFx1MDAyNnZtaWRfZ2VuZXJhdGlvbik7XG4mIzQzO1x0dTY0IG5ld192bWlkO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgaWR4O1xuJiM0MztcbiYjNDM7XHRpZiAodm1pZCkge1xuJiM0MztcdFx0bmV3X3ZtaWQgPSBnZW5lcmF0aW9uIHxcbiYjNDM7XHRcdFx0ICAga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCk7XG4mIzQzO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIFRoZSBvbGQgVk1JRCBpcyBzdGlsbCBwcm90ZWN0ZWQgYnkgb25lIG9yIG1vcmUgQ1BVcy5cbiYjNDM7XHRcdCAqIEtlZXAgdGhlIHNhbWUgaGFyZHdhcmUgVk1JRCBhbmQgb25seSBwcm9tb3RlIGdlbmVyYXRpb24uXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGlmIChjaGVja191cGRhdGVfcmVzZXJ2ZWRfdm1pZCh2bWlkLCBuZXdfdm1pZCkpXG4mIzQzO1x0XHRcdHJldHVybiBuZXdfdm1pZDtcbiYjNDM7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogVGhlIFZNIGhhZCBhIFZNSUQgaW4gYW4gb2xkZXIgZ2VuZXJhdGlvbi4gIFJldXNlIHRoZSBzYW1lXG4mIzQzO1x0XHQgKiBoYXJkd2FyZSBudW1iZXIgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY2xhaW1lZC5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0aWR4ID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCk7XG4mIzQzO1x0XHRpZiAoIV9fdGVzdF9hbmRfc2V0X2JpdChpZHgsIHZtaWRfbWFwKSlcbiYjNDM7XHRcdFx0cmV0dXJuIG5ld192bWlkO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBGaW5kIGEgZnJlZSBWTUlEIGluIHRoZSBjdXJyZW50IGdlbmVyYXRpb24uXG4mIzQzO1x0ICovXG4mIzQzO1x0aWR4ID0gZmluZF9uZXh0X3plcm9fYml0KHZtaWRfbWFwLCBOVU1fVk1JRFMsIHZtaWRfY3VyX2lkeCk7XG4mIzQzO1x0aWYgKGlkeCAhPSBOVU1fVk1JRFMpXG4mIzQzO1x0XHRnb3RvIHNldF92bWlkO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIE5vIGZyZWUgVk1JRC4gIFN0YXJ0IGEgbmV3IGdlbmVyYXRpb24sIHByZXNlcnZlIGFsbCBDUFUtbG9jYWxcbiYjNDM7XHQgKiB1c2VycywgYW5kIGRlZmVyIGVhY2ggQ1BVJiMzOTtzIGZsdXNoIHVudGlsIGl0cyBuZXh0IGFjdGl2YXRpb24uXG4mIzQzO1x0ICovXG4mIzQzO1x0Z2VuZXJhdGlvbiAmIzQzOz0gVk1JRF9GSVJTVF9WRVJTSU9OO1xuJiM0MztcbiYjNDM7XHQvKiBTb2Z0d2FyZSBWTUlEIDAgaXMgcmVzZXJ2ZWQgYXMgdGhlIGludmFsaWQgaWRlbnRpZmllci4gKi9cbiYjNDM7XHRpZiAodW5saWtlbHkoIWdlbmVyYXRpb24pKVxuJiM0MztcdFx0Z2VuZXJhdGlvbiA9IFZNSURfRklSU1RfVkVSU0lPTjtcbiYjNDM7XG4mIzQzO1x0YXRvbWljNjRfeGNoZyhcdTAwMjZ2bWlkX2dlbmVyYXRpb24sIGdlbmVyYXRpb24pO1xuJiM0MztcdGZsdXNoX2NvbnRleHQoKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBOVU1fVk1JRFMgLSAxIFx1MDAzZSBudW1fcG9zc2libGVfY3B1cygpLCB0aGVyZWZvcmUgcm9sbG92ZXIgbXVzdFxuJiM0MztcdCAqIGxlYXZlIGF0IGxlYXN0IG9uZSBhbGxvY2F0YWJsZSBoYXJkd2FyZSBWTUlELlxuJiM0MztcdCAqL1xuJiM0MztcdGlkeCA9IGZpbmRfbmV4dF96ZXJvX2JpdCh2bWlkX21hcCwgTlVNX1ZNSURTLCAxKTtcbiYjNDM7XG4mIzQzO3NldF92bWlkOlxuJiM0MztcdF9fc2V0X2JpdChpZHgsIHZtaWRfbWFwKTtcbiYjNDM7XHR2bWlkX2N1cl9pZHggPSBpZHg7XG4mIzQzO1xuJiM0MztcdHJldHVybiBnZW5lcmF0aW9uIHwgaWR4O1xuIH1cbiBcbiB2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHtcbi1cdHVuc2lnbmVkIGxvbmcgaTtcbiYjNDM7XHRzdHJ1Y3Qga3ZtX3ZtaWQgKmt2bV92bWlkID0gXHUwMDI2dmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkO1xuJiM0MztcdGF0b21pYzY0X3QgKmFjdGl2ZTtcbiBcdHN0cnVjdCBrdm1fdmNwdSAqdjtcbi1cdHN0cnVjdCBrdm1fdm1pZCAqdm1pZCA9IFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGZsYWdzO1xuJiM0MztcdHU2NCB2bWlkO1xuJiM0MztcdHU2NCBvbGRfYWN0aXZlX3ZtaWQ7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBpO1xuJiM0MztcdHVuc2lnbmVkIGludCBjcHU7XG4mIzQzO1x0Ym9vbCB2bWlkX2NoYW5nZWQgPSBmYWxzZTtcbiBcbi1cdGlmICgha3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3Zlcl9jaGFuZ2VkKHZtaWQpKVxuJiM0MztcdGlmICghdm1pZF9iaXRzKVxuIFx0XHRyZXR1cm47XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2dm1pZF9sb2NrKTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIGFjdGl2ZV92bWlkcyBhbmQgdGxiX2ZsdXNoX3BlbmRpbmcgYXJlIHBlci1DUFUgYWRtaXNzaW9uIHN0YXRlLlxuJiM0MztcdCAqIFRoZXkgbXVzdCByZWZlciB0byB0aGUgc2FtZSBDUFUgZm9yIHRoZSBjb21wbGV0ZSBhY3RpdmF0aW9uLlxuJiM0MztcdCAqL1xuJiM0MztcdHByZWVtcHRfZGlzYWJsZSgpO1xuJiM0MztcbiYjNDM7XHRjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7XG4mIzQzO1x0YWN0aXZlID0gdGhpc19jcHVfcHRyKFx1MDAyNmFjdGl2ZV92bWlkcyk7XG4mIzQzO1xuJiM0MztcdHZtaWQgPSBhdG9taWM2NF9yZWFkKFx1MDAyNmt2bV92bWlkLVx1MDAzZWlkKTtcbiYjNDM7XHRvbGRfYWN0aXZlX3ZtaWQgPSBhdG9taWM2NF9yZWFkKGFjdGl2ZSk7XG4gXG4gXHQvKlxuLVx0ICogV2UgbmVlZCB0byByZS1jaGVjayB0aGUgdm1pZF92ZXJzaW9uIGhlcmUgdG8gZW5zdXJlIHRoYXQgaWZcbi1cdCAqIGFub3RoZXIgdmNwdSBhbHJlYWR5IGFsbG9jYXRlZCBhIHZhbGlkIHZtaWQgZm9yIHRoaXMgdm0uXG4mIzQzO1x0ICogRmFzdCBwYXRoLlxuJiM0MztcdCAqXG4mIzQzO1x0ICogVGhlIGNtcHhjaGcgcmFjZXMgd2l0aCBmbHVzaF9jb250ZXh0KCkmIzM5O3MgeGNoZyBvbiB0aGUgc2FtZVxuJiM0MztcdCAqIHBlci1DUFUgYXRvbWljLiAgRWl0aGVyIHRoaXMgYWN0aXZhdGlvbiBpcyBjYXB0dXJlZCBieSByb2xsb3ZlcixcbiYjNDM7XHQgKiBvciByb2xsb3ZlciBjbGVhcnMgYWN0aXZlIGZpcnN0IGFuZCB0aGUgY21weGNoZyBmYWlscy5cbiBcdCAqL1xuLVx0aWYgKCFrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQodm1pZCkpIHtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2dm1pZF9sb2NrKTtcbi1cdFx0cmV0dXJuO1xuJiM0MztcdGlmIChvbGRfYWN0aXZlX3ZtaWQgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIHZtaWRfZ2VuX21hdGNoKHZtaWQpIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBhdG9taWM2NF9jbXB4Y2hnKGFjdGl2ZSwgb2xkX2FjdGl2ZV92bWlkLCB2bWlkKSA9PVxuJiM0MztcdCAgICBvbGRfYWN0aXZlX3ZtaWQpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0cmF3X3NwaW5fbG9ja19pcnFzYXZlKFx1MDAyNnZtaWRfbG9jaywgZmxhZ3MpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFJlLXJlYWQgdW5kZXIgdGhlIGFsbG9jYXRvciBsb2NrIGJlY2F1c2UgYW5vdGhlciB2Q1BVIG9mIHRoaXMgVk1cbiYjNDM7XHQgKiBtYXkgYWxyZWFkeSBoYXZlIHByb21vdGVkIG9yIGFsbG9jYXRlZCB0aGUgc2hhcmVkIFZNSUQuXG4mIzQzO1x0ICovXG4mIzQzO1x0dm1pZCA9IGF0b21pYzY0X3JlYWQoXHUwMDI2a3ZtX3ZtaWQtXHUwMDNlaWQpO1xuJiM0MztcbiYjNDM7XHRpZiAoIXZtaWRfZ2VuX21hdGNoKHZtaWQpKSB7XG4mIzQzO1x0XHR2bWlkID0gbmV3X3ZtaWRfbG9ja2VkKGt2bV92bWlkKTtcbiYjNDM7XHRcdGF0b21pYzY0X3NldChcdTAwMjZrdm1fdm1pZC1cdTAwM2VpZCwgdm1pZCk7XG4mIzQzO1x0XHR2bWlkX2NoYW5nZWQgPSB0cnVlO1xuIFx0fVxuIFxuLVx0LyogRmlyc3QgdXNlciBvZiBhIG5ldyBWTUlEIHZlcnNpb24/ICovXG4tXHRpZiAodW5saWtlbHkodm1pZF9uZXh0ID09IDApKSB7XG4tXHRcdFdSSVRFX09OQ0Uodm1pZF92ZXJzaW9uLCBSRUFEX09OQ0Uodm1pZF92ZXJzaW9uKSAmIzQzOyAxKTtcbi1cdFx0dm1pZF9uZXh0ID0gMTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEV2ZW4gaWYgYW5vdGhlciB2Q1BVIGFscmVhZHkgdXBkYXRlZCB0aGUgc2hhcmVkIFZNSUQsIHRoaXMgQ1BVXG4mIzQzO1x0ICogbXVzdCBzdGlsbCBkaXNjaGFyZ2UgaXRzIG93biByb2xsb3ZlciBmbHVzaCBvYmxpZ2F0aW9uLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChjcHVtYXNrX3Rlc3RfYW5kX2NsZWFyX2NwdShjcHUsIFx1MDAyNnRsYl9mbHVzaF9wZW5kaW5nKSlcbiYjNDM7XHRcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwoKTtcbiBcbi1cdFx0Lypcbi1cdFx0ICogV2UgcmFuIG91dCBvZiBWTUlEcyBzbyB3ZSBpbmNyZW1lbnQgdm1pZF92ZXJzaW9uIGFuZFxuLVx0XHQgKiBzdGFydCBhc3NpZ25pbmcgVk1JRHMgZnJvbSAxLlxuLVx0XHQgKlxuLVx0XHQgKiBUaGlzIGFsc28gbWVhbnMgZXhpc3RpbmcgVk1JRHMgYXNzaWdubWVudCB0byBhbGwgR3Vlc3Rcbi1cdFx0ICogaW5zdGFuY2VzIGlzIGludmFsaWQgYW5kIHdlIGhhdmUgZm9yY2UgVk1JRCByZS1hc3NpZ25lbWVudFxuLVx0XHQgKiBmb3IgYWxsIEd1ZXN0IGluc3RhbmNlcy4gVGhlIEd1ZXN0IGluc3RhbmNlcyB0aGF0IHdlcmUgbm90XG4tXHRcdCAqIHJ1bm5pbmcgd2lsbCBhdXRvbWF0aWNhbGx5IHBpY2stdXAgbmV3IFZNSURzIGJlY2F1c2Ugd2lsbFxuLVx0XHQgKiBjYWxsIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoKSB3aGVuZXZlciB0aGV5IGVudGVyXG4tXHRcdCAqIGluLWtlcm5lbCBydW4gbG9vcC4gRm9yIEd1ZXN0IGluc3RhbmNlcyB0aGF0IGFyZSBhbHJlYWR5XG4tXHRcdCAqIHJ1bm5pbmcsIHdlIGZvcmNlIFZNIGV4aXRzIG9uIGFsbCBob3N0IENQVXMgdXNpbmcgSVBJIGFuZFxuLVx0XHQgKiBmbHVzaCBhbGwgR3Vlc3QgVExCcy5cbi1cdFx0ICovXG4tXHRcdG9uX2VhY2hfY3B1X21hc2soY3B1X29ubGluZV9tYXNrLCBfX2xvY2FsX2hmZW5jZV9ndm1hX2FsbCxcbi1cdFx0XHRcdCBOVUxMLCAxKTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFB1Ymxpc2ggdGhlIENQVS1sb2NhbCBhY3RpdmUgaWRlbnRpdHkgb25seSBhZnRlciB0aGUgcmVxdWlyZWRcbiYjNDM7XHQgKiBsb2NhbCBpbnZhbGlkYXRpb24gaXMgY29tcGxldGUuXG4mIzQzO1x0ICovXG4mIzQzO1x0YXRvbWljNjRfc2V0KGFjdGl2ZSwgdm1pZCk7XG4mIzQzO1xuJiM0MztcdHJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKFx1MDAyNnZtaWRfbG9jaywgZmxhZ3MpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEEgbmV3IHNvZnR3YXJlIFZNSUQgbWF5IGNvbnRhaW4gYSBkaWZmZXJlbnQgaGFyZHdhcmUgVk1JRCwgc29cbiYjNDM7XHQgKiByZXF1ZXN0IGFuIEhHQVRQIHVwZGF0ZSBmb3IgZXZlcnkgdkNQVSBpbiB0aGUgVk0uXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHZtaWRfY2hhbmdlZCkge1xuJiM0MztcdFx0a3ZtX2Zvcl9lYWNoX3ZjcHUoaSwgdiwgdmNwdS1cdTAwM2Vrdm0pXG4mIzQzO1x0XHRcdGt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9VUERBVEVfSEdBVFAsIHYpO1xuIFx0fVxuIFxuLVx0dm1pZC1cdTAwM2V2bWlkID0gdm1pZF9uZXh0O1xuLVx0dm1pZF9uZXh0JiM0MzsmIzQzOztcbi1cdHZtaWRfbmV4dCBcdTAwMjY9ICgxIFx1MDAzY1x1MDAzYyB2bWlkX2JpdHMpIC0gMTtcbiYjNDM7b3V0OlxuJiM0MztcdHByZWVtcHRfZW5hYmxlKCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIENQVSB2aXJ0dWFsaXphdGlvbi9DU1Igc3RhdGUgaXMgYmVpbmcgZGlzY2FyZGVkLlxuJiM0MzsgKlxuJiM0MzsgKiBXaXRoZHJhdyBmYXN0LXBhdGggZWxpZ2liaWxpdHksIGJ1dCBjb25zZXJ2YXRpdmVseSBwcmVzZXJ2ZSB0aGUgbGFzdFxuJiM0MzsgKiBpZGVudGl0eSBpbnN0ZWFkIG9mIG1ha2luZyBpdHMgaGFyZHdhcmUgVk1JRCBpbW1lZGlhdGVseSByZXVzYWJsZS5cbiYjNDM7ICovXG4mIzQzO3ZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGZsYWdzO1xuJiM0MztcdHU2NCB2bWlkO1xuJiM0MztcdHVuc2lnbmVkIGludCBjcHU7XG4gXG4tXHRXUklURV9PTkNFKHZtaWQtXHUwMDNldm1pZF92ZXJzaW9uLCBSRUFEX09OQ0Uodm1pZF92ZXJzaW9uKSk7XG4mIzQzO1x0aWYgKCF2bWlkX2JpdHMpXG4mIzQzO1x0XHRyZXR1cm47XG4gXG4tXHRzcGluX3VubG9jayhcdTAwMjZ2bWlkX2xvY2spO1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X3ByZWVtcHRpb25fZGlzYWJsZWQoKTtcbiYjNDM7XG4mIzQzO1x0Y3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpO1xuJiM0MztcbiYjNDM7XHRyYXdfc3Bpbl9sb2NrX2lycXNhdmUoXHUwMDI2dm1pZF9sb2NrLCBmbGFncyk7XG4mIzQzO1xuJiM0MztcdHZtaWQgPSBhdG9taWM2NF94Y2hnKHRoaXNfY3B1X3B0cihcdTAwMjZhY3RpdmVfdm1pZHMpLCAwKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHZtaWQpXG4mIzQzO1x0XHRwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID0gdm1pZDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBJZiBhY3RpdmUgd2FzIGFscmVhZHkgemVybywgcmV0YWluIHRoZSBvbGQgcmVzZXJ2ZWQgZW50cnkuXG4mIzQzO1x0ICovXG4mIzQzO1x0Y3B1bWFza19zZXRfY3B1KGNwdSwgXHUwMDI2dGxiX2ZsdXNoX3BlbmRpbmcpO1xuIFxuLVx0LyogUmVxdWVzdCBHLXN0YWdlIHBhZ2UgdGFibGUgdXBkYXRlIGZvciBhbGwgVkNQVXMgKi9cbi1cdGt2bV9mb3JfZWFjaF92Y3B1KGksIHYsIHZjcHUtXHUwMDNla3ZtKVxuLVx0XHRrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfVVBEQVRFX0hHQVRQLCB2KTtcbiYjNDM7XHRyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShcdTAwMjZ2bWlkX2xvY2ssIGZsYWdzKTtcbiB9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMTc6NTA8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtBbGwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgc3RyaWN0bHkgY29uZmluZWQgdG8gdGhlIFJJU0MtViBhcmNoaXRlY3R1cmUgKGFyY2gvcmlzY3YvKSwgc3BlY2lmaWNhbGx5IHRoZSBSSVNDLVYgS1ZNIFN0YWdlLTIgVk1JRCBtYW5hZ2VtZW50LiBUaGV5IGNhbm5vdCBiZSBidWlsdCBvciBleGVjdXRlZCBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSAoYW1kNjQpLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzCnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsCmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuCgotIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOgogIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQKICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLgogIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCwKICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuCgotIERPIE5PVCBCTElORExZIFRSVVNUICYjMzQ7Tk8gRlVOQ1RJT05BTCBDSEFOR0UmIzM0OyAoTkZDSSkgT1IgJiMzNDtSRUZBQ1RPUklORyYjMzQ7IENMQUlNUzoKICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzICYjMzQ7Y2xlYW51cHMmIzM0OywgJiMzNDtyZWZhY3RvcmluZ3MmIzM0Oywgb3Igc3RhdGUKICAmIzM0O05vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkJiMzNDsuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLgogIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudAogIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLgogIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuCgotIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOgogIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKiwKICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy4KICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyCiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczoKCi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczoKICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy4KICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKQogICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLgogICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHMKICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuCiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuCi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOgogICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6CiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmcKICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLgogICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOgotIENvcmUgU3Vic3lzdGVtczoKICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSwKICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy4KLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6CiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuCi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOgogICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLgotIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6CiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo0LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6CgotIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzoKICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1cwogIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0CiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuCiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzICYjMzQ7Zm9jdXNlZCYjMzQ7LAogIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy4KCi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOgogIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50cwogIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LgoKLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6CiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFjawogIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLgogIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlcgogIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZToKLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgotIENoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuCi0gU3RyaXAgYW55ICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDVmYzM1Y2NjNWM3ZDlkNGM3MzQ5NGI1NDhjODhkZTg1ZmRlMzQ4YzQKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVGh1IFNlcCAxMCAxNzo1MDoyNCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmgKaW5kZXggYWFmMDgwYmExYjc3YS4uYzYxYTFiYmIyNzJmNCAxMDA2NDQKLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmgKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmgKQEAgLTgsNyAmIzQzOzgsNyBAQAogI2RlZmluZSBfX1JJU0NWX0tWTV9HU1RBR0VfSF8KIAogI2luY2x1ZGUgJmx0O2xpbnV4L2t2bV90eXBlcy5oJmd0OwotCiYjNDM7I2luY2x1ZGUgJmx0O2FzbS9rdm1fdm1pZC5oJmd0Owogc3RydWN0IGt2bV9nc3RhZ2UgewogCXN0cnVjdCBrdm0gKmt2bTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTA4LDcgJiM0MzsxMDgsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV9pbml0KHN0cnVjdCBrdm1fZ3N0YWdlICpnc3RhZ2UsIHN0cnVjdCBrdm0gKgogewogCWdzdGFnZS0mZ3Q7a3ZtID0ga3ZtOwogCWdzdGFnZS0mZ3Q7ZmxhZ3MgPSAwOwotCWdzdGFnZS0mZ3Q7dm1pZCA9IFJFQURfT05DRShrdm0tJmd0O2FyY2gudm1pZC52bWlkKTsKJiM0MzsJZ3N0YWdlLSZndDt2bWlkID0KJiM0MzsJCWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoJmFtcDtrdm0tJmd0O2FyY2gudm1pZC5pZCkpOwogCWdzdGFnZS0mZ3Q7cGdkID0ga3ZtLSZndDthcmNoLnBnZDsKIAlnc3RhZ2UtJmd0O3BnZF9sZXZlbHMgPSBrdm0tJmd0O2FyY2gucGdkX2xldmVsczsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaAppbmRleCBkYjYxYjA1MjVhOGQwLi5kZGQ3Y2MxMjVjM2Y2IDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmgKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fdm1pZC5oCkBAIC02LDIxICYjNDM7Niw0MiBAQAogI2lmbmRlZiBfX1JJU0NWX0tWTV9WTUlEX0hfCiAjZGVmaW5lIF9fUklTQ1ZfS1ZNX1ZNSURfSF8KIAomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9hdG9taWMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9rdm1fdHlwZXMuaCZndDsKIAogc3RydWN0IGt2bV92bWlkIHsKIAkvKgotCSAqIFdyaXRlcyB0byB2bWlkX3ZlcnNpb24gYW5kIHZtaWQgaGFwcGVuIHdpdGggdm1pZF9sb2NrIGhlbGQKLQkgKiB3aGVyZWFzIHJlYWRzIGhhcHBlbiB3aXRob3V0IGFueSBsb2NrIGhlbGQuCiYjNDM7CSAqIFNvZnR3YXJlIFZNSUQ6CiYjNDM7CSAqCiYjNDM7CSAqICAgWyBnZW5lcmF0aW9uIHwgaGFyZHdhcmUgVk1JRCBdCiYjNDM7CSAqCiYjNDM7CSAqIEtlZXAgdGhlIGlkZW50aXR5IDY0LWJpdCBvbiBSVjMyIHNvIHRoYXQgdGhlIGdlbmVyYXRpb24gZG9lcyBub3QKJiM0MzsJICogd3JhcCBhdCB0aGUgbmF0aXZlIHdvcmQgc2l6ZS4gIFplcm8gZGVub3RlcyBhbiB1bmFsbG9jYXRlZCBWTUlELgomIzQzOwkgKgomIzQzOwkgKiBPbmx5IHRoZSBsb3cgaGFyZHdhcmUgVk1JRCBiaXRzIG1heSBiZSB3cml0dGVuIHRvIEhHQVRQCiYjNDM7CSAqIG9yIHVzZWQgYXMgYSBoYXJkd2FyZSBmZW5jZSBWTUlELgogCSAqLwotCXVuc2lnbmVkIGxvbmcgdm1pZF92ZXJzaW9uOwotCXVuc2lnbmVkIGxvbmcgdm1pZDsKJiM0MzsJYXRvbWljNjRfdCBpZDsKIH07CiAKIHZvaWQgX19pbml0IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9kZXRlY3Qodm9pZCk7CiB1bnNpZ25lZCBsb25nIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9iaXRzKHZvaWQpOwomIzQzOwomIzQzO2ludCBfX2luaXQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2luaXQodm9pZCk7CiYjNDM7dm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfZnJlZSh2b2lkKTsKJiM0MzsKIGludCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaW5pdChzdHJ1Y3Qga3ZtICprdm0pOwomIzQzOwomIzQzO3Vuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodTY0IHZtaWQpOwomIzQzOwogYm9vbCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQoc3RydWN0IGt2bV92bWlkICp2bWlkKTsKJiM0MzsKIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCiYjNDM7LyoKJiM0MzsgKiBJbnZhbGlkYXRlIHRoZSBjdXJyZW50IENQVSYjMzk7cyBmYXN0LXBhdGggVk1JRCBzdGF0ZSB3aGlsZSBwcmVzZXJ2aW5nCiYjNDM7ICogdGhlIG9sZCBpZGVudGl0eSBjb25zZXJ2YXRpdmVseSBpbiByZXNlcnZlZF92bWlkcy4KJiM0MzsgKi8KJiM0Mzt2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9jcHVfaW52YWxpZGF0ZSh2b2lkKTsKJiM0MzsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vbWFpbi5jIGIvYXJjaC9yaXNjdi9rdm0vbWFpbi5jCmluZGV4IDg5NTY4Y2NjZTAxZGUuLmQ2YzZiZTRkZjYxYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcmlzY3Yva3ZtL21haW4uYwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2t2bS9tYWluLmMKQEAgLTE2LDcgJiM0MzsxNiw3IEBACiAjaW5jbHVkZSAmbHQ7YXNtL2t2bV9uYWNsLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7YXNtL3NiaS5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS9rdm1fdmNwdV92ZWN0b3IuaCZndDsKLQomIzQzOyNpbmNsdWRlICZsdDthc20va3ZtX3ZtaWQuaCZndDsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShib29sLCBrdm1fcmlzY3ZfdmlydHVhbGl6YXRpb25fZW5hYmxlZCk7CiAKIERFRklORV9TVEFUSUNfS0VZX0ZBTFNFKGt2bV9yaXNjdl92c3N0YWdlX3RsYl9ub19ncGEpOwpAQCAtODQsNiAmIzQzOzg0LDcgQEAgaW50IGt2bV9hcmNoX2VuYWJsZV92aXJ0dWFsaXphdGlvbl9jcHUodm9pZCkKIAogdm9pZCBrdm1fYXJjaF9kaXNhYmxlX3ZpcnR1YWxpemF0aW9uX2NwdSh2b2lkKQogewomIzQzOwlrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfY3B1X2ludmFsaWRhdGUoKTsKIAlrdm1fcmlzY3ZfYWlhX2Rpc2FibGUoKTsKIAlrdm1fcmlzY3ZfY3NyX2NsZWFudXAoKTsKIAlrdm1fcmlzY3ZfbmFjbF9kaXNhYmxlKCk7CkBAIC0xMTIsNiAmIzQzOzExMyw3IEBAIHN0YXRpYyBpbnQga3ZtX3Jpc2N2X2NwdV9wbV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcKIAkJICogaXMgZW5hYmxlZCBvbiB0aGlzIENQVS4KIAkJICovCiAJCWlmIChfX3RoaXNfY3B1X3JlYWQoa3ZtX3Jpc2N2X3ZpcnR1YWxpemF0aW9uX2VuYWJsZWQpKSB7CiYjNDM7CQkJa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKCk7CiAJCQlrdm1fcmlzY3ZfYWlhX3BtX2VudGVyKCk7CiAJCQlrdm1fcmlzY3ZfY3NyX2NsZWFudXAoKTsKIAkJfQpAQCAtMTMwLDYgJiM0MzsxMzIsNyBAQCBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGt2bV9yaXNjdl9jcHVfcG1fbmIgPSB7CiBzdGF0aWMgdm9pZCBrdm1fcmlzY3ZfdGVhcmRvd24odm9pZCkKIHsKIAlrdm1fcmlzY3ZfYWlhX2V4aXQoKTsKJiM0MzsJa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2ZyZWUoKTsKIAlrdm1fcmlzY3ZfbmFjbF9leGl0KCk7CiAJa3ZtX3Jpc2N2X3ZfZXhpdCgpOwogCWt2bV91bnJlZ2lzdGVyX3BlcmZfY2FsbGJhY2tzKCk7CkBAIC0xODEsOCAmIzQzOzE4NCwxNSBAQCBzdGF0aWMgaW50IF9faW5pdCByaXNjdl9rdm1faW5pdCh2b2lkKQogCiAJa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2RldGVjdCgpOwogCiYjNDM7CXJjID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2luaXQoKTsKJiM0MzsJaWYgKHJjKSB7CiYjNDM7CQlrdm1fcmlzY3ZfbmFjbF9leGl0KCk7CiYjNDM7CQlyZXR1cm4gcmM7CiYjNDM7CX0KJiM0MzsKIAlyYyA9IGt2bV9yaXNjdl9haWFfaW5pdCgpOwogCWlmIChyYyAmYW1wOyZhbXA7IHJjICE9IC1FTk9ERVYpIHsKJiM0MzsJCWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKCk7CiAJCWt2bV9yaXNjdl9uYWNsX2V4aXQoKTsKIAkJcmV0dXJuIHJjOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL21tdS5jIGIvYXJjaC9yaXNjdi9rdm0vbW11LmMKaW5kZXggNjAzNWI1ZWM5NTAzOS4uM2M4ZmI2MDA5YzBhNSAxMDA2NDQKLS0tIGEvYXJjaC9yaXNjdi9rdm0vbW11LmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9rdm0vbW11LmMKQEAgLTE1LDcgJiM0MzsxNSw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvc2NoZWQvc2lnbmFsLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7YXNtL2t2bV9tbXUuaCZndDsKICNpbmNsdWRlICZsdDthc20va3ZtX25hY2wuaCZndDsKLQomIzQzOyNpbmNsdWRlICZsdDthc20va3ZtX3ZtaWQuaCZndDsKIHN0YXRpYyBib29sIF9fcmVhZF9tb3N0bHkgZWFnZXJfcGFnZV9zcGxpdCA9IHRydWU7CiBtb2R1bGVfcGFyYW0oZWFnZXJfcGFnZV9zcGxpdCwgYm9vbCwgMDY0NCk7CiAKQEAgLTc5OSwxMCAmIzQzOzc5OSwxMSBAQCB2b2lkIGt2bV9yaXNjdl9tbXVfZnJlZV9wZ2Qoc3RydWN0IGt2bSAqa3ZtKQogdm9pZCBrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJc3RydWN0IGt2bV9hcmNoICprYSA9ICZhbXA7dmNwdS0mZ3Q7a3ZtLSZndDthcmNoOwomIzQzOwl1NjQgdm1pZCA9IGF0b21pYzY0X3JlYWQoJmFtcDtrYS0mZ3Q7dm1pZC5pZCk7CiAJdW5zaWduZWQgbG9uZyBoZ2F0cCA9IGt2bV9yaXNjdl9nc3RhZ2VfbW9kZShrYS0mZ3Q7cGdkX2xldmVscykKIAkJCSAgICAgICZsdDsmbHQ7IEhHQVRQX01PREVfU0hJRlQ7CiAKLQloZ2F0cCB8PSAoUkVBRF9PTkNFKGthLSZndDt2bWlkLnZtaWQpICZsdDsmbHQ7IEhHQVRQX1ZNSURfU0hJRlQpICZhbXA7IEhHQVRQX1ZNSUQ7CiYjNDM7CWhnYXRwIHw9IChrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh2bWlkKSAmbHQ7Jmx0OyBIR0FUUF9WTUlEX1NISUZUKSAmYW1wOyBIR0FUUF9WTUlEOwogCWhnYXRwIHw9IChrYS0mZ3Q7cGdkX3BoeXMgJmd0OyZndDsgUEFHRV9TSElGVCkgJmFtcDsgSEdBVFBfUFBOOwogCiAJbmNzcl93cml0ZShDU1JfSEdBVFAsIGhnYXRwKTsKZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3RsYi5jIGIvYXJjaC9yaXNjdi9rdm0vdGxiLmMKaW5kZXggMmFlMzQ2MzJjZGNiMS4uYjg1ZTViYTIxOThhYSAxMDA2NDQKLS0tIGEvYXJjaC9yaXNjdi9rdm0vdGxiLmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9rdm0vdGxiLmMKQEAgLTIyNCw3ICYjNDM7MjI0LDcgQEAgdm9pZCBrdm1fcmlzY3ZfbG9jYWxfdGxiX3Nhbml0aXplKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIAkgKiBlbnRyaWVzIGJ5IFZNSUQgd2hlbmV2ZXIgdW5kZXJseWluZyBIb3N0IENQVSBjaGFuZ2VzIGZvciBhIFZDUFUuCiAJICovCiAKLQl2bWlkID0gUkVBRF9PTkNFKHZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkLnZtaWQpOwomIzQzOwl2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZCgmYW1wO3ZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkLmlkKSk7CiAJa3ZtX3Jpc2N2X2xvY2FsX2hmZW5jZV9ndm1hX3ZtaWRfYWxsKHZtaWQpOwogCiAJLyoKQEAgLTI0NCw3ICYjNDM7MjQ0LDcgQEAgdm9pZCBrdm1fcmlzY3ZfZmVuY2VfaV9wcm9jZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHZvaWQga3ZtX3Jpc2N2X3RsYl9mbHVzaF9wcm9jZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlzdHJ1Y3Qga3ZtX3ZtaWQgKnYgPSAmYW1wO3ZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkOwotCXVuc2lnbmVkIGxvbmcgdm1pZCA9IFJFQURfT05DRSh2LSZndDt2bWlkKTsKJiM0MzsJdW5zaWduZWQgbG9uZyB2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZCgmYW1wO3YtJmd0O2lkKSk7CiAKIAlpZiAoa3ZtX3Jpc2N2X25hY2xfYXZhaWxhYmxlKCkpCiAJCW5hY2xfaGZlbmNlX2d2bWFfdm1pZF9hbGwobmFjbF9zaG1lbSgpLCB2bWlkKTsKQEAgLTI1NSw3ICYjNDM7MjU1LDcgQEAgdm9pZCBrdm1fcmlzY3ZfdGxiX2ZsdXNoX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogdm9pZCBrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYWxsX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXN0cnVjdCBrdm1fdm1pZCAqdiA9ICZhbXA7dmNwdS0mZ3Q7a3ZtLSZndDthcmNoLnZtaWQ7Ci0JdW5zaWduZWQgbG9uZyB2bWlkID0gUkVBRF9PTkNFKHYtJmd0O3ZtaWQpOwomIzQzOwl1bnNpZ25lZCBsb25nIHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKCZhbXA7di0mZ3Q7aWQpKTsKIAogCWlmIChrdm1fcmlzY3ZfbmFjbF9hdmFpbGFibGUoKSkKIAkJbmFjbF9oZmVuY2VfdnZtYV9hbGwobmFjbF9zaG1lbSgpLCB2bWlkKTsKQEAgLTUzMSw4ICYjNDM7NTMxLDExIEBAIHZvaWQga3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbChzdHJ1Y3Qga3ZtICprdm0sCiAKIGludCBrdm1fYXJjaF9mbHVzaF9yZW1vdGVfdGxic19yYW5nZShzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbiwgdTY0IG5yX3BhZ2VzKQogewomIzQzOwl1bnNpZ25lZCBsb25nIHZtaWQgPQomIzQzOwkJa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZCgmYW1wO2t2bS0mZ3Q7YXJjaC52bWlkLmlkKSk7CiYjNDM7CiAJa3ZtX3Jpc2N2X2hmZW5jZV9ndm1hX3ZtaWRfZ3BhKGt2bSwgLTFVTCwgMCwKIAkJCQkgICAgICAgZ2ZuICZsdDsmbHQ7IFBBR0VfU0hJRlQsIG5yX3BhZ2VzICZsdDsmbHQ7IFBBR0VfU0hJRlQsCi0JCQkJICAgICAgIFBBR0VfU0hJRlQsIFJFQURfT05DRShrdm0tJmd0O2FyY2gudm1pZC52bWlkKSk7CiYjNDM7CQkJCSAgICAgICBQQUdFX1NISUZULCB2bWlkKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHUuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHUuYwppbmRleCBlMDYyY2ExOWY5ZDhmLi44NTU0MmMxYTVlYzNmIDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L2t2bS92Y3B1LmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9rdm0vdmNwdS5jCkBAIC05NDMsMTQgJiM0Mzs5NDMsMTQgQEAgaW50IGt2bV9hcmNoX3ZjcHVfaW9jdGxfcnVuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIAkJCWNvbnRpbnVlOwogCQlyZXQgPSAxOwogCi0JCWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUodmNwdSk7Ci0KIAkJcmV0ID0ga3ZtX3Jpc2N2X2NoZWNrX3ZjcHVfcmVxdWVzdHModmNwdSk7CiAJCWlmIChyZXQgJmx0Oz0gMCkKIAkJCWNvbnRpbnVlOwogCiAJCXByZWVtcHRfZGlzYWJsZSgpOwogCiYjNDM7CQlrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHZjcHUpOwomIzQzOwogCQkvKiBVcGRhdGUgQUlBIEhXIHN0YXRlIGJlZm9yZSBlbnRlcmluZyBndWVzdCAqLwogCQlyZXQgPSBrdm1fcmlzY3ZfdmNwdV9haWFfdXBkYXRlKHZjcHUpOwogCQlpZiAocmV0ICZsdDs9IDApIHsKZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuYwppbmRleCA1MDZhNTEwYjZiZmYzLi4xYmUzODZhNzhlMjdmIDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV9yZXBsYWNlLmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfcmVwbGFjZS5jCkBAIC0xMDQsNyAmIzQzOzEwNCw3IEBAIHN0YXRpYyBpbnQga3ZtX3NiaV9leHRfcmZlbmNlX2hhbmRsZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuCiAJCWt2bV9yaXNjdl92Y3B1X3BtdV9pbmNyX2Z3KHZjcHUsIFNCSV9QTVVfRldfRkVOQ0VfSV9TRU5UKTsKIAkJYnJlYWs7CiAJY2FzZSBTQklfRVhUX1JGRU5DRV9SRU1PVEVfU0ZFTkNFX1ZNQToKLQkJdm1pZCA9IFJFQURfT05DRSh2Y3B1LSZndDtrdm0tJmd0O2FyY2gudm1pZC52bWlkKTsKJiM0MzsJCXZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKCZhbXA7dmNwdS0mZ3Q7a3ZtLSZndDthcmNoLnZtaWQuaWQpKTsKIAkJaWYgKChjcC0mZ3Q7YTIgPT0gMCAmYW1wOyZhbXA7IGNwLSZndDthMyA9PSAwKSB8fCBjcC0mZ3Q7YTMgPT0gLTFVTCkKIAkJCWt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwodmNwdS0mZ3Q7a3ZtLCBoYmFzZSwgaG1hc2ssIHZtaWQpOwogCQllbHNlCkBAIC0xMTMsNyAmIzQzOzExMyw3IEBAIHN0YXRpYyBpbnQga3ZtX3NiaV9leHRfcmZlbmNlX2hhbmRsZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuCiAJCWt2bV9yaXNjdl92Y3B1X3BtdV9pbmNyX2Z3KHZjcHUsIFNCSV9QTVVfRldfSEZFTkNFX1ZWTUFfU0VOVCk7CiAJCWJyZWFrOwogCWNhc2UgU0JJX0VYVF9SRkVOQ0VfUkVNT1RFX1NGRU5DRV9WTUFfQVNJRDoKLQkJdm1pZCA9IFJFQURfT05DRSh2Y3B1LSZndDtrdm0tJmd0O2FyY2gudm1pZC52bWlkKTsKJiM0MzsJCXZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKCZhbXA7dmNwdS0mZ3Q7a3ZtLSZndDthcmNoLnZtaWQuaWQpKTsKIAkJaWYgKChjcC0mZ3Q7YTIgPT0gMCAmYW1wOyZhbXA7IGNwLSZndDthMyA9PSAwKSB8fCBjcC0mZ3Q7YTMgPT0gLTFVTCkKIAkJCWt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hc2lkX2FsbCh2Y3B1LSZndDtrdm0sIGhiYXNlLCBobWFzaywKIAkJCQkJCSAgICAgICBjcC0mZ3Q7YTQsIHZtaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfdjAxLmMgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuYwppbmRleCBkZTU0NGVhM2YyOGRjLi5jYTNlZmU2M2MxY2YxIDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuYwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuYwpAQCAtODgsMTQgJiM0Mzs4OCwxNCBAQCBzdGF0aWMgaW50IGt2bV9zYmlfZXh0X3YwMV9oYW5kbGVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1biwKIAkJaWYgKGNwLSZndDthNyA9PSBTQklfRVhUXzBfMV9SRU1PVEVfRkVOQ0VfSSkKIAkJCWt2bV9yaXNjdl9mZW5jZV9pKHZjcHUtJmd0O2t2bSwgaGJhc2UsIGhtYXNrKTsKIAkJZWxzZSBpZiAoY3AtJmd0O2E3ID09IFNCSV9FWFRfMF8xX1JFTU9URV9TRkVOQ0VfVk1BKSB7Ci0JCQl2bWlkID0gUkVBRF9PTkNFKHZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkLnZtaWQpOwomIzQzOwkJCXZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKCZhbXA7dmNwdS0mZ3Q7a3ZtLSZndDthcmNoLnZtaWQuaWQpKTsKIAkJCWlmIChjcC0mZ3Q7YTEgPT0gMCAmYW1wOyZhbXA7IGNwLSZndDthMiA9PSAwKQogCQkJCWt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwodmNwdS0mZ3Q7a3ZtLCBoYmFzZSwgaG1hc2ssIHZtaWQpOwogCQkJZWxzZQogCQkJCWt2bV9yaXNjdl9oZmVuY2VfdnZtYV9ndmEodmNwdS0mZ3Q7a3ZtLCBoYmFzZSwgaG1hc2ssIGNwLSZndDthMSwKIAkJCQkJCQkgIGNwLSZndDthMiwgUEFHRV9TSElGVCwgdm1pZCk7CiAJCX0gZWxzZSB7Ci0JCQl2bWlkID0gUkVBRF9PTkNFKHZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkLnZtaWQpOwomIzQzOwkJCXZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKCZhbXA7dmNwdS0mZ3Q7a3ZtLSZndDthcmNoLnZtaWQuaWQpKTsKIAkJCWlmIChjcC0mZ3Q7YTEgPT0gMCAmYW1wOyZhbXA7IGNwLSZndDthMiA9PSAwKQogCQkJCWt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hc2lkX2FsbCh2Y3B1LSZndDtrdm0sIGhiYXNlLCBobWFzaywKIAkJCQkJCQkgICAgICAgY3AtJmd0O2EzLCB2bWlkKTsKZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuYwppbmRleCBjMTViZGIxZGQ4YmVmLi43Yjg2YTZmYmU0YTY5IDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L2t2bS92bWlkLmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9rdm0vdm1pZC5jCkBAIC02LDExICYjNDM7NiwxNSBAQAogICogICAgIEFudXAgUGF0ZWwgJmx0O2FudXAucGF0ZWxAd2RjLmNvbSZndDsKICAqLwogCiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2JpdG1hcC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2JpdG9wcy5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2NwdW1hc2suaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9lcnJuby5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2Vyci5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L21vZHVsZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9wZXJjcHUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcHJlZW1wdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zbGFiLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvc21wLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgva3ZtX2hvc3QuaCZndDsKICNpbmNsdWRlICZsdDthc20vY3NyLmgmZ3Q7CkBAIC0xOCwyNiAmIzQzOzIyLDU0IEBACiAjaW5jbHVkZSAmbHQ7YXNtL2t2bV90bGIuaCZndDsKICNpbmNsdWRlICZsdDthc20va3ZtX3ZtaWQuaCZndDsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF92ZXJzaW9uID0gMTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZtaWRfbmV4dDsKJiM0MztzdGF0aWMgYXRvbWljNjRfdCB2bWlkX2dlbmVyYXRpb247CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgKnZtaWRfbWFwOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF9iaXRzIF9fcm9fYWZ0ZXJfaW5pdDsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodm1pZF9sb2NrKTsKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX2N1cl9pZHggPSAxOwomIzQzOwomIzQzO3N0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKHZtaWRfbG9jayk7CiYjNDM7CiYjNDM7c3RhdGljIERFRklORV9QRVJfQ1BVKGF0b21pYzY0X3QsIGFjdGl2ZV92bWlkcyk7CiYjNDM7c3RhdGljIERFRklORV9QRVJfQ1BVKHU2NCwgcmVzZXJ2ZWRfdm1pZHMpOwomIzQzOwomIzQzO3N0YXRpYyBjcHVtYXNrX3QgdGxiX2ZsdXNoX3BlbmRpbmc7CiYjNDM7CiYjNDM7I2RlZmluZSBWTUlEX0ZJUlNUX1ZFUlNJT04JQklUX1VMTCh2bWlkX2JpdHMpCiYjNDM7I2RlZmluZSBOVU1fVk1JRFMJCUJJVCh2bWlkX2JpdHMpCiYjNDM7I2RlZmluZSBWTUlEX0hXX01BU0sJCShWTUlEX0ZJUlNUX1ZFUlNJT04gLSAxKQomIzQzOwomIzQzO3N0YXRpYyBib29sIHZtaWRfZ2VuX21hdGNoKHU2NCB2bWlkKQomIzQzO3sKJiM0MzsJcmV0dXJuICEoKHZtaWQgXiBhdG9taWM2NF9yZWFkKCZhbXA7dm1pZF9nZW5lcmF0aW9uKSkgJmd0OyZndDsgdm1pZF9iaXRzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dW5zaWduZWQgbG9uZyBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh1NjQgdm1pZCkKJiM0Mzt7CiYjNDM7CWlmICghdm1pZF9iaXRzKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXJldHVybiAodW5zaWduZWQgbG9uZykodm1pZCAmYW1wOyBWTUlEX0hXX01BU0spOwomIzQzO30KIAogdm9pZCBfX2luaXQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2RldGVjdCh2b2lkKQogewotCS8qIEZpZ3VyZS1vdXQgbnVtYmVyIG9mIFZNSUQgYml0cyBpbiBIVyAqLwomIzQzOwkvKiBGaWd1cmUgb3V0IHRoZSBudW1iZXIgb2YgVk1JRCBiaXRzIHN1cHBvcnRlZCBieSBoYXJkd2FyZS4gKi8KIAljc3Jfd3JpdGUoQ1NSX0hHQVRQLCAoa3ZtX3Jpc2N2X2dzdGFnZV9tb2RlKGt2bV9yaXNjdl9nc3RhZ2VfbWF4X3BnZF9sZXZlbHMpICZsdDsmbHQ7Ci0JCQkgICAgICBIR0FUUF9NT0RFX1NISUZUKSB8IEhHQVRQX1ZNSUQpOwomIzQzOwkJICAgSEdBVFBfTU9ERV9TSElGVCkgfCBIR0FUUF9WTUlEKTsKIAl2bWlkX2JpdHMgPSBjc3JfcmVhZChDU1JfSEdBVFApOwogCXZtaWRfYml0cyA9ICh2bWlkX2JpdHMgJmFtcDsgSEdBVFBfVk1JRCkgJmd0OyZndDsgSEdBVFBfVk1JRF9TSElGVDsKIAl2bWlkX2JpdHMgPSBmbHNfbG9uZyh2bWlkX2JpdHMpOwogCWNzcl93cml0ZShDU1JfSEdBVFAsIDApOwogCi0JLyogV2UgcG9sbHV0ZWQgbG9jYWwgVExCIHNvIGZsdXNoIGFsbCBndWVzdCBUTEIgKi8KJiM0MzsJLyogRmx1c2ggdGhlIGxvY2FsIGd1ZXN0IFRMQiBhZnRlciBwcm9iaW5nIEhHQVRQLiAqLwogCWt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwoKTsKIAotCS8qIFdlIGRvbiYjMzk7dCB1c2UgVk1JRCBiaXRzIGlmIHRoZXkgYXJlIG5vdCBzdWZmaWNpZW50ICovCi0JaWYgKCgxVUwgJmx0OyZsdDsgdm1pZF9iaXRzKSAmbHQ7IG51bV9wb3NzaWJsZV9jcHVzKCkpCiYjNDM7CS8qCiYjNDM7CSAqIFZNSUQgMCBpcyByZXNlcnZlZC4gIER1cmluZyByb2xsb3ZlciBldmVyeSBwb3NzaWJsZSBDUFUgbWF5CiYjNDM7CSAqIHJlc2VydmUgb25lIGhhcmR3YXJlIFZNSUQsIGFuZCB3ZSBzdGlsbCBuZWVkIGF0IGxlYXN0IG9uZSBWTUlECiYjNDM7CSAqIGF2YWlsYWJsZSBmb3IgYSBuZXcgYWxsb2NhdGlvbi4KJiM0MzsJICovCiYjNDM7CWlmICh2bWlkX2JpdHMgJmFtcDsmYW1wOyBOVU1fVk1JRFMgLSAxICZsdDs9IG51bV9wb3NzaWJsZV9jcHVzKCkpCiAJCXZtaWRfYml0cyA9IDA7CiB9CiAKQEAgLTQ2LDgwICYjNDM7NzgsMjk4IEBAIHVuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHModm9pZCkKIAlyZXR1cm4gdm1pZF9iaXRzOwogfQogCiYjNDM7aW50IF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfaW5pdCh2b2lkKQomIzQzO3sKJiM0MzsJaW50IGNwdTsKJiM0MzsKJiM0MzsJaWYgKCF2bWlkX2JpdHMpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJdm1pZF9tYXAgPSBiaXRtYXBfemFsbG9jKE5VTV9WTUlEUywgR0ZQX0tFUk5FTCk7CiYjNDM7CWlmICghdm1pZF9tYXApCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJdm1pZF9jdXJfaWR4ID0gMTsKJiM0MzsKJiM0MzsJLyogSGFyZHdhcmUgVk1JRCAwIGlzIHJlc2VydmVkLiAqLwomIzQzOwlfX3NldF9iaXQoMCwgdm1pZF9tYXApOwomIzQzOwomIzQzOwlhdG9taWM2NF9zZXQoJmFtcDt2bWlkX2dlbmVyYXRpb24sIFZNSURfRklSU1RfVkVSU0lPTik7CiYjNDM7CiYjNDM7CWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKJiM0MzsJCWF0b21pYzY0X3NldCgmYW1wO3Blcl9jcHUoYWN0aXZlX3ZtaWRzLCBjcHUpLCAwKTsKJiM0MzsJCXBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSkgPSAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEV2ZXJ5IENQVSBwZXJmb3JtcyBhbiBpbml0aWFsIGxvY2FsIGludmFsaWRhdGlvbiBiZWZvcmUgaXRzCiYjNDM7CSAqIGZpcnN0IFZNSUQgYWN0aXZhdGlvbi4KJiM0MzsJICovCiYjNDM7CWNwdW1hc2tfY29weSgmYW1wO3RsYl9mbHVzaF9wZW5kaW5nLCBjcHVfcG9zc2libGVfbWFzayk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKHZvaWQpCiYjNDM7ewomIzQzOwliaXRtYXBfZnJlZSh2bWlkX21hcCk7CiYjNDM7CXZtaWRfbWFwID0gTlVMTDsKJiM0Mzt9CiYjNDM7CiBpbnQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2luaXQoc3RydWN0IGt2bSAqa3ZtKQogewotCS8qIE1hcmsgdGhlIGluaXRpYWwgVk1JRCBhbmQgVk1JRCB2ZXJzaW9uIGludmFsaWQgKi8KLQlrdm0tJmd0O2FyY2gudm1pZC52bWlkX3ZlcnNpb24gPSAwOwotCWt2bS0mZ3Q7YXJjaC52bWlkLnZtaWQgPSAwOwomIzQzOwlhdG9taWM2NF9zZXQoJmFtcDtrdm0tJmd0O2FyY2gudm1pZC5pZCwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogYm9vbCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQoc3RydWN0IGt2bV92bWlkICp2bWlkKQogewomIzQzOwl1NjQgaWQ7CiYjNDM7CiAJaWYgKCF2bWlkX2JpdHMpCiAJCXJldHVybiBmYWxzZTsKIAotCXJldHVybiB1bmxpa2VseShSRUFEX09OQ0Uodm1pZC0mZ3Q7dm1pZF92ZXJzaW9uKSAhPQotCQkJUkVBRF9PTkNFKHZtaWRfdmVyc2lvbikpOwomIzQzOwlpZCA9IGF0b21pYzY0X3JlYWQoJmFtcDt2bWlkLSZndDtpZCk7CiYjNDM7CiYjNDM7CXJldHVybiB1bmxpa2VseSghdm1pZF9nZW5fbWF0Y2goaWQpKTsKIH0KIAotc3RhdGljIHZvaWQgX19sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwodm9pZCAqaW5mbykKJiM0MzsvKgomIzQzOyAqIENhbGxlZCB3aXRoIHZtaWRfbG9jayBoZWxkIGFmdGVyIHZtaWRfZ2VuZXJhdGlvbiBoYXMgYWxyZWFkeSBiZWVuCiYjNDM7ICogYWR2YW5jZWQuCiYjNDM7ICoKJiM0MzsgKiBObyByZW1vdGUgQ1BVIGlzIGludGVycnVwdGVkIGhlcmUuICBJbnN0ZWFkLCBwcmVzZXJ2ZSBldmVyeSBWTUlECiYjNDM7ICogd2hpY2ggbWF5IHN0aWxsIGJlIHVzZWQgYnkgYSBDUFUgYW5kIHF1ZXVlIGEgbG9jYWwgaW52YWxpZGF0aW9uIGZvcgomIzQzOyAqIHRoYXQgQ1BVJiMzOTtzIG5leHQgVk1JRCBhY3RpdmF0aW9uLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIGZsdXNoX2NvbnRleHQodm9pZCkKIHsKLQlrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfYWxsKCk7CiYjNDM7CXU2NCB2bWlkOwomIzQzOwlpbnQgY3B1OwomIzQzOwomIzQzOwliaXRtYXBfemVybyh2bWlkX21hcCwgTlVNX1ZNSURTKTsKJiM0MzsJX19zZXRfYml0KDAsIHZtaWRfbWFwKTsKJiM0MzsKJiM0MzsJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewomIzQzOwkJdm1pZCA9IGF0b21pYzY0X3hjaGcoJmFtcDtwZXJfY3B1KGFjdGl2ZV92bWlkcywgY3B1KSwgMCk7CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogVGhlIENQVSBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gY2F1Z2h0IGJ5IGFuIGVhcmxpZXIgcm9sbG92ZXIKJiM0MzsJCSAqIHdpdGhvdXQgcGVyZm9ybWluZyBhbm90aGVyIGFjdGl2YXRpb24gc2luY2UgdGhlbi4gIEluIHRoYXQKJiM0MzsJCSAqIGNhc2UgcmVzZXJ2ZWRfdm1pZHMgaXMgdGhlIG9ubHkgcmVjb3JkIG9mIHRoZSBvbGQgY29udGV4dC4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKCF2bWlkKQomIzQzOwkJCXZtaWQgPSBwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpOwomIzQzOwomIzQzOwkJaWYgKHZtaWQpCiYjNDM7CQkJX19zZXRfYml0KGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHZtaWQpLAomIzQzOwkJCQkgIHZtaWRfbWFwKTsKJiM0MzsKJiM0MzsJCXBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSkgPSB2bWlkOwomIzQzOwl9CiYjNDM7CiYjNDM7CWNwdW1hc2tfY29weSgmYW1wO3RsYl9mbHVzaF9wZW5kaW5nLCBjcHVfcG9zc2libGVfbWFzayk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVXBkYXRlIGV2ZXJ5IHJlc2VydmVkIGNvcHkgb2YgYW4gb2xkIHNvZnR3YXJlIFZNSUQuCiYjNDM7ICoKJiM0MzsgKiBEbyBub3Qgc3RvcCBhZnRlciB0aGUgZmlyc3QgbWF0Y2g6IHRoZSBzYW1lIFZNIG1heSBoYXZlIGJlZW4gYWN0aXZlCiYjNDM7ICogb24gbW9yZSB0aGFuIG9uZSBDUFUgd2hlbiByb2xsb3ZlciBvY2N1cnJlZC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBjaGVja191cGRhdGVfcmVzZXJ2ZWRfdm1pZCh1NjQgb2xkX3ZtaWQsIHU2NCBuZXdfdm1pZCkKJiM0Mzt7CiYjNDM7CWJvb2wgaGl0ID0gZmFsc2U7CiYjNDM7CWludCBjcHU7CiYjNDM7CiYjNDM7CWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKJiM0MzsJCWlmIChwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID09IG9sZF92bWlkKSB7CiYjNDM7CQkJcGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IG5ld192bWlkOwomIzQzOwkJCWhpdCA9IHRydWU7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIGhpdDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBBbGxvY2F0ZS9wcm9tb3RlIGEgc29mdHdhcmUgVk1JRC4KJiM0MzsgKgomIzQzOyAqIHZtaWRfbG9jayBtdXN0IGJlIGhlbGQgYnkgdGhlIGNhbGxlci4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdTY0IG5ld192bWlkX2xvY2tlZChzdHJ1Y3Qga3ZtX3ZtaWQgKmt2bV92bWlkKQomIzQzO3sKJiM0MzsJdTY0IHZtaWQgPSBhdG9taWM2NF9yZWFkKCZhbXA7a3ZtX3ZtaWQtJmd0O2lkKTsKJiM0MzsJdTY0IGdlbmVyYXRpb24gPSBhdG9taWM2NF9yZWFkKCZhbXA7dm1pZF9nZW5lcmF0aW9uKTsKJiM0MzsJdTY0IG5ld192bWlkOwomIzQzOwl1bnNpZ25lZCBsb25nIGlkeDsKJiM0MzsKJiM0MzsJaWYgKHZtaWQpIHsKJiM0MzsJCW5ld192bWlkID0gZ2VuZXJhdGlvbiB8CiYjNDM7CQkJICAga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCk7CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogVGhlIG9sZCBWTUlEIGlzIHN0aWxsIHByb3RlY3RlZCBieSBvbmUgb3IgbW9yZSBDUFVzLgomIzQzOwkJICogS2VlcCB0aGUgc2FtZSBoYXJkd2FyZSBWTUlEIGFuZCBvbmx5IHByb21vdGUgZ2VuZXJhdGlvbi4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKGNoZWNrX3VwZGF0ZV9yZXNlcnZlZF92bWlkKHZtaWQsIG5ld192bWlkKSkKJiM0MzsJCQlyZXR1cm4gbmV3X3ZtaWQ7CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogVGhlIFZNIGhhZCBhIFZNSUQgaW4gYW4gb2xkZXIgZ2VuZXJhdGlvbi4gIFJldXNlIHRoZSBzYW1lCiYjNDM7CQkgKiBoYXJkd2FyZSBudW1iZXIgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY2xhaW1lZC4KJiM0MzsJCSAqLwomIzQzOwkJaWR4ID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCk7CiYjNDM7CQlpZiAoIV9fdGVzdF9hbmRfc2V0X2JpdChpZHgsIHZtaWRfbWFwKSkKJiM0MzsJCQlyZXR1cm4gbmV3X3ZtaWQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogRmluZCBhIGZyZWUgVk1JRCBpbiB0aGUgY3VycmVudCBnZW5lcmF0aW9uLgomIzQzOwkgKi8KJiM0MzsJaWR4ID0gZmluZF9uZXh0X3plcm9fYml0KHZtaWRfbWFwLCBOVU1fVk1JRFMsIHZtaWRfY3VyX2lkeCk7CiYjNDM7CWlmIChpZHggIT0gTlVNX1ZNSURTKQomIzQzOwkJZ290byBzZXRfdm1pZDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogTm8gZnJlZSBWTUlELiAgU3RhcnQgYSBuZXcgZ2VuZXJhdGlvbiwgcHJlc2VydmUgYWxsIENQVS1sb2NhbAomIzQzOwkgKiB1c2VycywgYW5kIGRlZmVyIGVhY2ggQ1BVJiMzOTtzIGZsdXNoIHVudGlsIGl0cyBuZXh0IGFjdGl2YXRpb24uCiYjNDM7CSAqLwomIzQzOwlnZW5lcmF0aW9uICYjNDM7PSBWTUlEX0ZJUlNUX1ZFUlNJT047CiYjNDM7CiYjNDM7CS8qIFNvZnR3YXJlIFZNSUQgMCBpcyByZXNlcnZlZCBhcyB0aGUgaW52YWxpZCBpZGVudGlmaWVyLiAqLwomIzQzOwlpZiAodW5saWtlbHkoIWdlbmVyYXRpb24pKQomIzQzOwkJZ2VuZXJhdGlvbiA9IFZNSURfRklSU1RfVkVSU0lPTjsKJiM0MzsKJiM0MzsJYXRvbWljNjRfeGNoZygmYW1wO3ZtaWRfZ2VuZXJhdGlvbiwgZ2VuZXJhdGlvbik7CiYjNDM7CWZsdXNoX2NvbnRleHQoKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogTlVNX1ZNSURTIC0gMSAmZ3Q7IG51bV9wb3NzaWJsZV9jcHVzKCksIHRoZXJlZm9yZSByb2xsb3ZlciBtdXN0CiYjNDM7CSAqIGxlYXZlIGF0IGxlYXN0IG9uZSBhbGxvY2F0YWJsZSBoYXJkd2FyZSBWTUlELgomIzQzOwkgKi8KJiM0MzsJaWR4ID0gZmluZF9uZXh0X3plcm9fYml0KHZtaWRfbWFwLCBOVU1fVk1JRFMsIDEpOwomIzQzOwomIzQzO3NldF92bWlkOgomIzQzOwlfX3NldF9iaXQoaWR4LCB2bWlkX21hcCk7CiYjNDM7CXZtaWRfY3VyX2lkeCA9IGlkeDsKJiM0MzsKJiM0MzsJcmV0dXJuIGdlbmVyYXRpb24gfCBpZHg7CiB9CiAKIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JdW5zaWduZWQgbG9uZyBpOwomIzQzOwlzdHJ1Y3Qga3ZtX3ZtaWQgKmt2bV92bWlkID0gJmFtcDt2Y3B1LSZndDtrdm0tJmd0O2FyY2gudm1pZDsKJiM0MzsJYXRvbWljNjRfdCAqYWN0aXZlOwogCXN0cnVjdCBrdm1fdmNwdSAqdjsKLQlzdHJ1Y3Qga3ZtX3ZtaWQgKnZtaWQgPSAmYW1wO3ZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkOwomIzQzOwl1bnNpZ25lZCBsb25nIGZsYWdzOwomIzQzOwl1NjQgdm1pZDsKJiM0MzsJdTY0IG9sZF9hY3RpdmVfdm1pZDsKJiM0MzsJdW5zaWduZWQgbG9uZyBpOwomIzQzOwl1bnNpZ25lZCBpbnQgY3B1OwomIzQzOwlib29sIHZtaWRfY2hhbmdlZCA9IGZhbHNlOwogCi0JaWYgKCFrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQodm1pZCkpCiYjNDM7CWlmICghdm1pZF9iaXRzKQogCQlyZXR1cm47CiAKLQlzcGluX2xvY2soJmFtcDt2bWlkX2xvY2spOwomIzQzOwkvKgomIzQzOwkgKiBhY3RpdmVfdm1pZHMgYW5kIHRsYl9mbHVzaF9wZW5kaW5nIGFyZSBwZXItQ1BVIGFkbWlzc2lvbiBzdGF0ZS4KJiM0MzsJICogVGhleSBtdXN0IHJlZmVyIHRvIHRoZSBzYW1lIENQVSBmb3IgdGhlIGNvbXBsZXRlIGFjdGl2YXRpb24uCiYjNDM7CSAqLwomIzQzOwlwcmVlbXB0X2Rpc2FibGUoKTsKJiM0MzsKJiM0MzsJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwomIzQzOwlhY3RpdmUgPSB0aGlzX2NwdV9wdHIoJmFtcDthY3RpdmVfdm1pZHMpOwomIzQzOwomIzQzOwl2bWlkID0gYXRvbWljNjRfcmVhZCgmYW1wO2t2bV92bWlkLSZndDtpZCk7CiYjNDM7CW9sZF9hY3RpdmVfdm1pZCA9IGF0b21pYzY0X3JlYWQoYWN0aXZlKTsKIAogCS8qCi0JICogV2UgbmVlZCB0byByZS1jaGVjayB0aGUgdm1pZF92ZXJzaW9uIGhlcmUgdG8gZW5zdXJlIHRoYXQgaWYKLQkgKiBhbm90aGVyIHZjcHUgYWxyZWFkeSBhbGxvY2F0ZWQgYSB2YWxpZCB2bWlkIGZvciB0aGlzIHZtLgomIzQzOwkgKiBGYXN0IHBhdGguCiYjNDM7CSAqCiYjNDM7CSAqIFRoZSBjbXB4Y2hnIHJhY2VzIHdpdGggZmx1c2hfY29udGV4dCgpJiMzOTtzIHhjaGcgb24gdGhlIHNhbWUKJiM0MzsJICogcGVyLUNQVSBhdG9taWMuICBFaXRoZXIgdGhpcyBhY3RpdmF0aW9uIGlzIGNhcHR1cmVkIGJ5IHJvbGxvdmVyLAomIzQzOwkgKiBvciByb2xsb3ZlciBjbGVhcnMgYWN0aXZlIGZpcnN0IGFuZCB0aGUgY21weGNoZyBmYWlscy4KIAkgKi8KLQlpZiAoIWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF92ZXJfY2hhbmdlZCh2bWlkKSkgewotCQlzcGluX3VubG9jaygmYW1wO3ZtaWRfbG9jayk7Ci0JCXJldHVybjsKJiM0MzsJaWYgKG9sZF9hY3RpdmVfdm1pZCAmYW1wOyZhbXA7CiYjNDM7CSAgICB2bWlkX2dlbl9tYXRjaCh2bWlkKSAmYW1wOyZhbXA7CiYjNDM7CSAgICBhdG9taWM2NF9jbXB4Y2hnKGFjdGl2ZSwgb2xkX2FjdGl2ZV92bWlkLCB2bWlkKSA9PQomIzQzOwkgICAgb2xkX2FjdGl2ZV92bWlkKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmYW1wO3ZtaWRfbG9jaywgZmxhZ3MpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBSZS1yZWFkIHVuZGVyIHRoZSBhbGxvY2F0b3IgbG9jayBiZWNhdXNlIGFub3RoZXIgdkNQVSBvZiB0aGlzIFZNCiYjNDM7CSAqIG1heSBhbHJlYWR5IGhhdmUgcHJvbW90ZWQgb3IgYWxsb2NhdGVkIHRoZSBzaGFyZWQgVk1JRC4KJiM0MzsJICovCiYjNDM7CXZtaWQgPSBhdG9taWM2NF9yZWFkKCZhbXA7a3ZtX3ZtaWQtJmd0O2lkKTsKJiM0MzsKJiM0MzsJaWYgKCF2bWlkX2dlbl9tYXRjaCh2bWlkKSkgewomIzQzOwkJdm1pZCA9IG5ld192bWlkX2xvY2tlZChrdm1fdm1pZCk7CiYjNDM7CQlhdG9taWM2NF9zZXQoJmFtcDtrdm1fdm1pZC0mZ3Q7aWQsIHZtaWQpOwomIzQzOwkJdm1pZF9jaGFuZ2VkID0gdHJ1ZTsKIAl9CiAKLQkvKiBGaXJzdCB1c2VyIG9mIGEgbmV3IFZNSUQgdmVyc2lvbj8gKi8KLQlpZiAodW5saWtlbHkodm1pZF9uZXh0ID09IDApKSB7Ci0JCVdSSVRFX09OQ0Uodm1pZF92ZXJzaW9uLCBSRUFEX09OQ0Uodm1pZF92ZXJzaW9uKSAmIzQzOyAxKTsKLQkJdm1pZF9uZXh0ID0gMTsKJiM0MzsJLyoKJiM0MzsJICogRXZlbiBpZiBhbm90aGVyIHZDUFUgYWxyZWFkeSB1cGRhdGVkIHRoZSBzaGFyZWQgVk1JRCwgdGhpcyBDUFUKJiM0MzsJICogbXVzdCBzdGlsbCBkaXNjaGFyZ2UgaXRzIG93biByb2xsb3ZlciBmbHVzaCBvYmxpZ2F0aW9uLgomIzQzOwkgKi8KJiM0MzsJaWYgKGNwdW1hc2tfdGVzdF9hbmRfY2xlYXJfY3B1KGNwdSwgJmFtcDt0bGJfZmx1c2hfcGVuZGluZykpCiYjNDM7CQlrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfYWxsKCk7CiAKLQkJLyoKLQkJICogV2UgcmFuIG91dCBvZiBWTUlEcyBzbyB3ZSBpbmNyZW1lbnQgdm1pZF92ZXJzaW9uIGFuZAotCQkgKiBzdGFydCBhc3NpZ25pbmcgVk1JRHMgZnJvbSAxLgotCQkgKgotCQkgKiBUaGlzIGFsc28gbWVhbnMgZXhpc3RpbmcgVk1JRHMgYXNzaWdubWVudCB0byBhbGwgR3Vlc3QKLQkJICogaW5zdGFuY2VzIGlzIGludmFsaWQgYW5kIHdlIGhhdmUgZm9yY2UgVk1JRCByZS1hc3NpZ25lbWVudAotCQkgKiBmb3IgYWxsIEd1ZXN0IGluc3RhbmNlcy4gVGhlIEd1ZXN0IGluc3RhbmNlcyB0aGF0IHdlcmUgbm90Ci0JCSAqIHJ1bm5pbmcgd2lsbCBhdXRvbWF0aWNhbGx5IHBpY2stdXAgbmV3IFZNSURzIGJlY2F1c2Ugd2lsbAotCQkgKiBjYWxsIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoKSB3aGVuZXZlciB0aGV5IGVudGVyCi0JCSAqIGluLWtlcm5lbCBydW4gbG9vcC4gRm9yIEd1ZXN0IGluc3RhbmNlcyB0aGF0IGFyZSBhbHJlYWR5Ci0JCSAqIHJ1bm5pbmcsIHdlIGZvcmNlIFZNIGV4aXRzIG9uIGFsbCBob3N0IENQVXMgdXNpbmcgSVBJIGFuZAotCQkgKiBmbHVzaCBhbGwgR3Vlc3QgVExCcy4KLQkJICovCi0JCW9uX2VhY2hfY3B1X21hc2soY3B1X29ubGluZV9tYXNrLCBfX2xvY2FsX2hmZW5jZV9ndm1hX2FsbCwKLQkJCQkgTlVMTCwgMSk7CiYjNDM7CS8qCiYjNDM7CSAqIFB1Ymxpc2ggdGhlIENQVS1sb2NhbCBhY3RpdmUgaWRlbnRpdHkgb25seSBhZnRlciB0aGUgcmVxdWlyZWQKJiM0MzsJICogbG9jYWwgaW52YWxpZGF0aW9uIGlzIGNvbXBsZXRlLgomIzQzOwkgKi8KJiM0MzsJYXRvbWljNjRfc2V0KGFjdGl2ZSwgdm1pZCk7CiYjNDM7CiYjNDM7CXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZhbXA7dm1pZF9sb2NrLCBmbGFncyk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEEgbmV3IHNvZnR3YXJlIFZNSUQgbWF5IGNvbnRhaW4gYSBkaWZmZXJlbnQgaGFyZHdhcmUgVk1JRCwgc28KJiM0MzsJICogcmVxdWVzdCBhbiBIR0FUUCB1cGRhdGUgZm9yIGV2ZXJ5IHZDUFUgaW4gdGhlIFZNLgomIzQzOwkgKi8KJiM0MzsJaWYgKHZtaWRfY2hhbmdlZCkgewomIzQzOwkJa3ZtX2Zvcl9lYWNoX3ZjcHUoaSwgdiwgdmNwdS0mZ3Q7a3ZtKQomIzQzOwkJCWt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9VUERBVEVfSEdBVFAsIHYpOwogCX0KIAotCXZtaWQtJmd0O3ZtaWQgPSB2bWlkX25leHQ7Ci0Jdm1pZF9uZXh0JiM0MzsmIzQzOzsKLQl2bWlkX25leHQgJmFtcDs9ICgxICZsdDsmbHQ7IHZtaWRfYml0cykgLSAxOwomIzQzO291dDoKJiM0MzsJcHJlZW1wdF9lbmFibGUoKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBDUFUgdmlydHVhbGl6YXRpb24vQ1NSIHN0YXRlIGlzIGJlaW5nIGRpc2NhcmRlZC4KJiM0MzsgKgomIzQzOyAqIFdpdGhkcmF3IGZhc3QtcGF0aCBlbGlnaWJpbGl0eSwgYnV0IGNvbnNlcnZhdGl2ZWx5IHByZXNlcnZlIHRoZSBsYXN0CiYjNDM7ICogaWRlbnRpdHkgaW5zdGVhZCBvZiBtYWtpbmcgaXRzIGhhcmR3YXJlIFZNSUQgaW1tZWRpYXRlbHkgcmV1c2FibGUuCiYjNDM7ICovCiYjNDM7dm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfY3B1X2ludmFsaWRhdGUodm9pZCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiYjNDM7CXU2NCB2bWlkOwomIzQzOwl1bnNpZ25lZCBpbnQgY3B1OwogCi0JV1JJVEVfT05DRSh2bWlkLSZndDt2bWlkX3ZlcnNpb24sIFJFQURfT05DRSh2bWlkX3ZlcnNpb24pKTsKJiM0MzsJaWYgKCF2bWlkX2JpdHMpCiYjNDM7CQlyZXR1cm47CiAKLQlzcGluX3VubG9jaygmYW1wO3ZtaWRfbG9jayk7CiYjNDM7CWxvY2tkZXBfYXNzZXJ0X3ByZWVtcHRpb25fZGlzYWJsZWQoKTsKJiM0MzsKJiM0MzsJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwomIzQzOwomIzQzOwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmFtcDt2bWlkX2xvY2ssIGZsYWdzKTsKJiM0MzsKJiM0MzsJdm1pZCA9IGF0b21pYzY0X3hjaGcodGhpc19jcHVfcHRyKCZhbXA7YWN0aXZlX3ZtaWRzKSwgMCk7CiYjNDM7CiYjNDM7CWlmICh2bWlkKQomIzQzOwkJcGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IHZtaWQ7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIElmIGFjdGl2ZSB3YXMgYWxyZWFkeSB6ZXJvLCByZXRhaW4gdGhlIG9sZCByZXNlcnZlZCBlbnRyeS4KJiM0MzsJICovCiYjNDM7CWNwdW1hc2tfc2V0X2NwdShjcHUsICZhbXA7dGxiX2ZsdXNoX3BlbmRpbmcpOwogCi0JLyogUmVxdWVzdCBHLXN0YWdlIHBhZ2UgdGFibGUgdXBkYXRlIGZvciBhbGwgVkNQVXMgKi8KLQlrdm1fZm9yX2VhY2hfdmNwdShpLCB2LCB2Y3B1LSZndDtrdm0pCi0JCWt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9VUERBVEVfSEdBVFAsIHYpOwomIzQzOwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYW1wO3ZtaWRfbG9jaywgZmxhZ3MpOwogfQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAxNzo1MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTgyMQoJCQkJCQkJb3V0cHV0OiA4MwoJCQkJCQkJdGhvdWdodHM6IDY0OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiBQYXRjaCBBcHBsaWNhYmlsaXR5IGZvciBGdXp6aW5nKioKCk9rYXksIGxldCYjMzk7cyBzZWUuIEZpcnN0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMgcGF0Y2ggdG91Y2hlcyBhbmQgd2hldGhlciBpdCYjMzk7cyByZWxldmFudCBmb3IgZnV6emluZyBvbiBvdXIgdGFyZ2V0IGFyY2hpdGVjdHVyZSwgd2hpY2ggaXMgYGFtZDY0YC4gSSBzZWUgdGhhdCB0aGUgcGF0Y2ggbW9kaWZpZXMgZmlsZXMgZXhjbHVzaXZlbHkgd2l0aGluIHRoZSBgYXJjaC9yaXNjdi9gIGRpcmVjdG9yeS4gU3BlY2lmaWNhbGx5LCBpdCBpbnZvbHZlcyBjaGFuZ2VzIHRvIGBrdm1fZ3N0YWdlLmhgLCBga3ZtX3ZtaWQuaGAsIGBtYWluLmNgLCBgbW11LmNgLCBgdGxiLmNgLCBgdmNwdS5jYCwgYHZjcHVfc2JpX3JlcGxhY2UuY2AsIGB2Y3B1X3NiaV92MDEuY2AsIGFuZCBgdm1pZC5jYCDigJMgYWxsIFJJU0MtViBLVk0gaW1wbGVtZW50YXRpb24gZGV0YWlscy4KCk5vdywgSSByZWNhbGwgdGhlIHJ1bGVzLiBXZSBvbmx5ICpkb24mIzM5O3QqIGZ1enogaWYgdGhlIGNoYW5nZXMgZmFsbCBpbnRvIGNlcnRhaW4gY2F0ZWdvcmllcy4gVGhlIHJlbGV2YW50IHJ1bGUgaGVyZSBpcyBhYm91dCB1bnJlYWNoYWJsZSBjb2RlIHBhdGhzLCBzcGVjaWZpY2FsbHkgY29kZSBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIG91ciB0YXJnZXQuIEFuZCB0aGF0JiMzOTtzIHByZWNpc2VseSB3aGF0IHdlIGhhdmUuIFRoZXNlIFJJU0MtViBzcGVjaWZpYyBmaWxlcyBhcmUgZGVmaW5pdGVseSBub3QgZ29pbmcgdG8gYmUgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gYGFtZDY0YC4gVGhleSYjMzk7cmUgY29tcGxldGVseSBpc29sYXRlZCB0byB0aGUgUklTQy1WIGFyY2hpdGVjdHVyZS4gSSYjMzk7bSBnb2luZyB0byBkb3VibGUtY2hlY2sgdGhhdCBieSBsaXN0aW5nIGFsbCB0aGUgZmlsZXM6CgoxLiAgYGFyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oYAoyLiAgYGFyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaGAKMy4gIGBhcmNoL3Jpc2N2L2t2bS9tYWluLmNgCjQuICBgYXJjaC9yaXNjdi9rdm0vbW11LmNgCjUuICBgYXJjaC9yaXNjdi9rdm0vdGxiLmNgCjYuICBgYXJjaC9yaXNjdi9rdm0vdmNwdS5jYAo3LiAgYGFyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY2AKOC4gIGBhcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuY2AKOS4gIGBhcmNoL3Jpc2N2L2t2bS92bWlkLmNgCgpZZXMsIGFsbCBuaW5lIGZpbGVzIGFyZSB1bmRlbmlhYmx5IHdpdGhpbiBgYXJjaC9yaXNjdi9gLiBPbiBgYW1kNjRgLCB0aGVzZSBmaWxlcyB3aWxsIHJlbWFpbiB1bnRvdWNoZWQsIG5vdCBidWlsdCwgYW5kIGNvbXBsZXRlbHkgdW5yZWFjaGFibGUuCgpUaGVyZWZvcmUsIHRoZSB2ZXJkaWN0IGlzIGNsZWFyLiBUaGlzIHBhdGNoIGlzIGlycmVsZXZhbnQgZm9yIGZ1enppbmcgb24gYGFtZDY0YC4gYFdvcnRoRnV6emluZ2AgaXMgYGZhbHNlYC4gVGhlcmUgYXJlIG5vIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIHRvIGVuYWJsZSwgbm9yIGFueSBzcGVjaWZpYyBzeW1ib2xzIHRoYXQgYXJlIHVzZWZ1bCwgc28gYEVuYWJsZUNvbmZpZ3NgIGFuZCBgRm9jdXNTeW1ib2xzYCBhcmUgZW1wdHkuIFRoZSByZWFzb25pbmcgaXMgc29saWQ6IHRoZSBjaGFuZ2VzIGFyZSBSSVNDLVYgc3BlY2lmaWMsIGFuZCB0aGF0JiMzOTtzIG5vdCBvdXIgdGFyZ2V0LgoKSSYjMzk7bSBjb21mb3J0YWJsZSB3aXRoIHRoaXMuIEl0JiMzOTtzIGEgc3RyYWlnaHRmb3J3YXJkIGNhc2UuIExldCYjMzk7cyBkbyBhIHF1aWNrIGZpbmFsIGNoZWNrLi4uIHllcCwgZXZlcnl0aGluZyBsb29rcyBnb29kLiBOb3csIGxldCYjMzk7cyBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMTc6NTA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O0FsbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBzdHJpY3RseSBjb25maW5lZCB0byB0aGUgUklTQy1WIGFyY2hpdGVjdHVyZSAoYXJjaC9yaXNjdi8pLCBzcGVjaWZpY2FsbHkgdGhlIFJJU0MtViBLVk0gU3RhZ2UtMiBWTUlEIG1hbmFnZW1lbnQuIFRoZXkgY2Fubm90IGJlIGJ1aWx0IG9yIGV4ZWN1dGVkIG9uIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIChhbWQ2NCkuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O0FsbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBzdHJpY3RseSBjb25maW5lZCB0byB0aGUgUklTQy1WIGFyY2hpdGVjdHVyZSAoYXJjaC9yaXNjdi8pLCBzcGVjaWZpY2FsbHkgdGhlIFJJU0MtViBLVk0gU3RhZ2UtMiBWTUlEIG1hbmFnZW1lbnQuIFRoZXkgY2Fubm90IGJlIGJ1aWx0IG9yIGV4ZWN1dGVkIG9uIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIChhbWQ2NCkuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDE3OjUwPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0xMFQxNzo1MDoyNS4xMDIyNzI0NzJaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2NTU2NTEyMzg2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJBbGwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgc3RyaWN0bHkgY29uZmluZWQgdG8gdGhlIFJJU0MtViBhcmNoaXRlY3R1cmUgKGFyY2gvcmlzY3YvKSwgc3BlY2lmaWNhbGx5IHRoZSBSSVNDLVYgS1ZNIFN0YWdlLTIgVk1JRCBtYW5hZ2VtZW50LiBUaGV5IGNhbm5vdCBiZSBidWlsdCBvciBleGVjdXRlZCBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSAoYW1kNjQpLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMTc6NTA6MjUuMTAyMjc2OTQxWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MzgwMjMwOTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA1ZmMzNWNjYzVjN2Q5ZDRjNzM0OTRiNTQ4Yzg4ZGU4NWZkZTM0OGM0XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUaHUgU2VwIDEwIDE3OjUwOjI0IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmhcXG5pbmRleCBhYWYwODBiYTFiNzdhLi5jNjFhMWJiYjI3MmY0IDEwMDY0NFxcbi0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oXFxuKysrIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmhcXG5AQCAtOCw3ICs4LDcgQEBcXG4gI2RlZmluZSBfX1JJU0NWX0tWTV9HU1RBR0VfSF9cXG4gXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9rdm1fdHlwZXMuaFxcdTAwM2VcXG4tXFxuKyNpbmNsdWRlIFxcdTAwM2Nhc20va3ZtX3ZtaWQuaFxcdTAwM2VcXG4gc3RydWN0IGt2bV9nc3RhZ2Uge1xcbiBcXHRzdHJ1Y3Qga3ZtICprdm07XFxuIFxcdHVuc2lnbmVkIGxvbmcgZmxhZ3M7XFxuQEAgLTEwOCw3ICsxMDgsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV9pbml0KHN0cnVjdCBrdm1fZ3N0YWdlICpnc3RhZ2UsIHN0cnVjdCBrdm0gKlxcbiB7XFxuIFxcdGdzdGFnZS1cXHUwMDNla3ZtID0ga3ZtO1xcbiBcXHRnc3RhZ2UtXFx1MDAzZWZsYWdzID0gMDtcXG4tXFx0Z3N0YWdlLVxcdTAwM2V2bWlkID0gUkVBRF9PTkNFKGt2bS1cXHUwMDNlYXJjaC52bWlkLnZtaWQpO1xcbitcXHRnc3RhZ2UtXFx1MDAzZXZtaWQgPVxcbitcXHRcXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFxcdTAwMjZrdm0tXFx1MDAzZWFyY2gudm1pZC5pZCkpO1xcbiBcXHRnc3RhZ2UtXFx1MDAzZXBnZCA9IGt2bS1cXHUwMDNlYXJjaC5wZ2Q7XFxuIFxcdGdzdGFnZS1cXHUwMDNlcGdkX2xldmVscyA9IGt2bS1cXHUwMDNlYXJjaC5wZ2RfbGV2ZWxzO1xcbiB9XFxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaFxcbmluZGV4IGRiNjFiMDUyNWE4ZDAuLmRkZDdjYzEyNWMzZjYgMTAwNjQ0XFxuLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fdm1pZC5oXFxuKysrIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fdm1pZC5oXFxuQEAgLTYsMjEgKzYsNDIgQEBcXG4gI2lmbmRlZiBfX1JJU0NWX0tWTV9WTUlEX0hfXFxuICNkZWZpbmUgX19SSVNDVl9LVk1fVk1JRF9IX1xcbiBcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2F0b21pYy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgva3ZtX3R5cGVzLmhcXHUwMDNlXFxuIFxcbiBzdHJ1Y3Qga3ZtX3ZtaWQge1xcbiBcXHQvKlxcbi1cXHQgKiBXcml0ZXMgdG8gdm1pZF92ZXJzaW9uIGFuZCB2bWlkIGhhcHBlbiB3aXRoIHZtaWRfbG9jayBoZWxkXFxuLVxcdCAqIHdoZXJlYXMgcmVhZHMgaGFwcGVuIHdpdGhvdXQgYW55IGxvY2sgaGVsZC5cXG4rXFx0ICogU29mdHdhcmUgVk1JRDpcXG4rXFx0ICpcXG4rXFx0ICogICBbIGdlbmVyYXRpb24gfCBoYXJkd2FyZSBWTUlEIF1cXG4rXFx0ICpcXG4rXFx0ICogS2VlcCB0aGUgaWRlbnRpdHkgNjQtYml0IG9uIFJWMzIgc28gdGhhdCB0aGUgZ2VuZXJhdGlvbiBkb2VzIG5vdFxcbitcXHQgKiB3cmFwIGF0IHRoZSBuYXRpdmUgd29yZCBzaXplLiAgWmVybyBkZW5vdGVzIGFuIHVuYWxsb2NhdGVkIFZNSUQuXFxuK1xcdCAqXFxuK1xcdCAqIE9ubHkgdGhlIGxvdyBoYXJkd2FyZSBWTUlEIGJpdHMgbWF5IGJlIHdyaXR0ZW4gdG8gSEdBVFBcXG4rXFx0ICogb3IgdXNlZCBhcyBhIGhhcmR3YXJlIGZlbmNlIFZNSUQuXFxuIFxcdCAqL1xcbi1cXHR1bnNpZ25lZCBsb25nIHZtaWRfdmVyc2lvbjtcXG4tXFx0dW5zaWduZWQgbG9uZyB2bWlkO1xcbitcXHRhdG9taWM2NF90IGlkO1xcbiB9O1xcbiBcXG4gdm9pZCBfX2luaXQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2RldGVjdCh2b2lkKTtcXG4gdW5zaWduZWQgbG9uZyBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYml0cyh2b2lkKTtcXG4rXFxuK2ludCBfX2luaXQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2luaXQodm9pZCk7XFxuK3ZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2ZyZWUodm9pZCk7XFxuK1xcbiBpbnQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2luaXQoc3RydWN0IGt2bSAqa3ZtKTtcXG4rXFxuK3Vuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodTY0IHZtaWQpO1xcbitcXG4gYm9vbCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQoc3RydWN0IGt2bV92bWlkICp2bWlkKTtcXG4rXFxuIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpO1xcbiBcXG4rLypcXG4rICogSW52YWxpZGF0ZSB0aGUgY3VycmVudCBDUFUncyBmYXN0LXBhdGggVk1JRCBzdGF0ZSB3aGlsZSBwcmVzZXJ2aW5nXFxuKyAqIHRoZSBvbGQgaWRlbnRpdHkgY29uc2VydmF0aXZlbHkgaW4gcmVzZXJ2ZWRfdm1pZHMuXFxuKyAqL1xcbit2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9jcHVfaW52YWxpZGF0ZSh2b2lkKTtcXG4rXFxuICNlbmRpZlxcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS9tYWluLmMgYi9hcmNoL3Jpc2N2L2t2bS9tYWluLmNcXG5pbmRleCA4OTU2OGNjY2UwMWRlLi5kNmM2YmU0ZGY2MWIxIDEwMDY0NFxcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL21haW4uY1xcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL21haW4uY1xcbkBAIC0xNiw3ICsxNiw3IEBAXFxuICNpbmNsdWRlIFxcdTAwM2Nhc20va3ZtX25hY2wuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2FzbS9zYmkuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2FzbS9rdm1fdmNwdV92ZWN0b3IuaFxcdTAwM2VcXG4tXFxuKyNpbmNsdWRlIFxcdTAwM2Nhc20va3ZtX3ZtaWQuaFxcdTAwM2VcXG4gc3RhdGljIERFRklORV9QRVJfQ1BVKGJvb2wsIGt2bV9yaXNjdl92aXJ0dWFsaXphdGlvbl9lbmFibGVkKTtcXG4gXFxuIERFRklORV9TVEFUSUNfS0VZX0ZBTFNFKGt2bV9yaXNjdl92c3N0YWdlX3RsYl9ub19ncGEpO1xcbkBAIC04NCw2ICs4NCw3IEBAIGludCBrdm1fYXJjaF9lbmFibGVfdmlydHVhbGl6YXRpb25fY3B1KHZvaWQpXFxuIFxcbiB2b2lkIGt2bV9hcmNoX2Rpc2FibGVfdmlydHVhbGl6YXRpb25fY3B1KHZvaWQpXFxuIHtcXG4rXFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKCk7XFxuIFxcdGt2bV9yaXNjdl9haWFfZGlzYWJsZSgpO1xcbiBcXHRrdm1fcmlzY3ZfY3NyX2NsZWFudXAoKTtcXG4gXFx0a3ZtX3Jpc2N2X25hY2xfZGlzYWJsZSgpO1xcbkBAIC0xMTIsNiArMTEzLDcgQEAgc3RhdGljIGludCBrdm1fcmlzY3ZfY3B1X3BtX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZ1xcbiBcXHRcXHQgKiBpcyBlbmFibGVkIG9uIHRoaXMgQ1BVLlxcbiBcXHRcXHQgKi9cXG4gXFx0XFx0aWYgKF9fdGhpc19jcHVfcmVhZChrdm1fcmlzY3ZfdmlydHVhbGl6YXRpb25fZW5hYmxlZCkpIHtcXG4rXFx0XFx0XFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKCk7XFxuIFxcdFxcdFxcdGt2bV9yaXNjdl9haWFfcG1fZW50ZXIoKTtcXG4gXFx0XFx0XFx0a3ZtX3Jpc2N2X2Nzcl9jbGVhbnVwKCk7XFxuIFxcdFxcdH1cXG5AQCAtMTMwLDYgKzEzMiw3IEBAIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sga3ZtX3Jpc2N2X2NwdV9wbV9uYiA9IHtcXG4gc3RhdGljIHZvaWQga3ZtX3Jpc2N2X3RlYXJkb3duKHZvaWQpXFxuIHtcXG4gXFx0a3ZtX3Jpc2N2X2FpYV9leGl0KCk7XFxuK1xcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKCk7XFxuIFxcdGt2bV9yaXNjdl9uYWNsX2V4aXQoKTtcXG4gXFx0a3ZtX3Jpc2N2X3ZfZXhpdCgpO1xcbiBcXHRrdm1fdW5yZWdpc3Rlcl9wZXJmX2NhbGxiYWNrcygpO1xcbkBAIC0xODEsOCArMTg0LDE1IEBAIHN0YXRpYyBpbnQgX19pbml0IHJpc2N2X2t2bV9pbml0KHZvaWQpXFxuIFxcbiBcXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KCk7XFxuIFxcbitcXHRyYyA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19pbml0KCk7XFxuK1xcdGlmIChyYykge1xcbitcXHRcXHRrdm1fcmlzY3ZfbmFjbF9leGl0KCk7XFxuK1xcdFxcdHJldHVybiByYztcXG4rXFx0fVxcbitcXG4gXFx0cmMgPSBrdm1fcmlzY3ZfYWlhX2luaXQoKTtcXG4gXFx0aWYgKHJjIFxcdTAwMjZcXHUwMDI2IHJjICE9IC1FTk9ERVYpIHtcXG4rXFx0XFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2ZyZWUoKTtcXG4gXFx0XFx0a3ZtX3Jpc2N2X25hY2xfZXhpdCgpO1xcbiBcXHRcXHRyZXR1cm4gcmM7XFxuIFxcdH1cXG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vbW11LmMgYi9hcmNoL3Jpc2N2L2t2bS9tbXUuY1xcbmluZGV4IDYwMzViNWVjOTUwMzkuLjNjOGZiNjAwOWMwYTUgMTAwNjQ0XFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vbW11LmNcXG4rKysgYi9hcmNoL3Jpc2N2L2t2bS9tbXUuY1xcbkBAIC0xNSw3ICsxNSw3IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9zY2hlZC9zaWduYWwuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2FzbS9rdm1fbW11LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2Nhc20va3ZtX25hY2wuaFxcdTAwM2VcXG4tXFxuKyNpbmNsdWRlIFxcdTAwM2Nhc20va3ZtX3ZtaWQuaFxcdTAwM2VcXG4gc3RhdGljIGJvb2wgX19yZWFkX21vc3RseSBlYWdlcl9wYWdlX3NwbGl0ID0gdHJ1ZTtcXG4gbW9kdWxlX3BhcmFtKGVhZ2VyX3BhZ2Vfc3BsaXQsIGJvb2wsIDA2NDQpO1xcbiBcXG5AQCAtNzk5LDEwICs3OTksMTEgQEAgdm9pZCBrdm1fcmlzY3ZfbW11X2ZyZWVfcGdkKHN0cnVjdCBrdm0gKmt2bSlcXG4gdm9pZCBrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIHtcXG4gXFx0c3RydWN0IGt2bV9hcmNoICprYSA9IFxcdTAwMjZ2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2g7XFxuK1xcdHU2NCB2bWlkID0gYXRvbWljNjRfcmVhZChcXHUwMDI2a2EtXFx1MDAzZXZtaWQuaWQpO1xcbiBcXHR1bnNpZ25lZCBsb25nIGhnYXRwID0ga3ZtX3Jpc2N2X2dzdGFnZV9tb2RlKGthLVxcdTAwM2VwZ2RfbGV2ZWxzKVxcbiBcXHRcXHRcXHQgICAgICBcXHUwMDNjXFx1MDAzYyBIR0FUUF9NT0RFX1NISUZUO1xcbiBcXG4tXFx0aGdhdHAgfD0gKFJFQURfT05DRShrYS1cXHUwMDNldm1pZC52bWlkKSBcXHUwMDNjXFx1MDAzYyBIR0FUUF9WTUlEX1NISUZUKSBcXHUwMDI2IEhHQVRQX1ZNSUQ7XFxuK1xcdGhnYXRwIHw9IChrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh2bWlkKSBcXHUwMDNjXFx1MDAzYyBIR0FUUF9WTUlEX1NISUZUKSBcXHUwMDI2IEhHQVRQX1ZNSUQ7XFxuIFxcdGhnYXRwIHw9IChrYS1cXHUwMDNlcGdkX3BoeXMgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCkgXFx1MDAyNiBIR0FUUF9QUE47XFxuIFxcbiBcXHRuY3NyX3dyaXRlKENTUl9IR0FUUCwgaGdhdHApO1xcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS90bGIuYyBiL2FyY2gvcmlzY3Yva3ZtL3RsYi5jXFxuaW5kZXggMmFlMzQ2MzJjZGNiMS4uYjg1ZTViYTIxOThhYSAxMDA2NDRcXG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS90bGIuY1xcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL3RsYi5jXFxuQEAgLTIyNCw3ICsyMjQsNyBAQCB2b2lkIGt2bV9yaXNjdl9sb2NhbF90bGJfc2FuaXRpemUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiBcXHQgKiBlbnRyaWVzIGJ5IFZNSUQgd2hlbmV2ZXIgdW5kZXJseWluZyBIb3N0IENQVSBjaGFuZ2VzIGZvciBhIFZDUFUuXFxuIFxcdCAqL1xcbiBcXG4tXFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkKTtcXG4rXFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkLmlkKSk7XFxuIFxcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV92bWlkX2FsbCh2bWlkKTtcXG4gXFxuIFxcdC8qXFxuQEAgLTI0NCw3ICsyNDQsNyBAQCB2b2lkIGt2bV9yaXNjdl9mZW5jZV9pX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiB2b2lkIGt2bV9yaXNjdl90bGJfZmx1c2hfcHJvY2VzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIHtcXG4gXFx0c3RydWN0IGt2bV92bWlkICp2ID0gXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkO1xcbi1cXHR1bnNpZ25lZCBsb25nIHZtaWQgPSBSRUFEX09OQ0Uodi1cXHUwMDNldm1pZCk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXFx1MDAyNnYtXFx1MDAzZWlkKSk7XFxuIFxcbiBcXHRpZiAoa3ZtX3Jpc2N2X25hY2xfYXZhaWxhYmxlKCkpXFxuIFxcdFxcdG5hY2xfaGZlbmNlX2d2bWFfdm1pZF9hbGwobmFjbF9zaG1lbSgpLCB2bWlkKTtcXG5AQCAtMjU1LDcgKzI1NSw3IEBAIHZvaWQga3ZtX3Jpc2N2X3RsYl9mbHVzaF9wcm9jZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4gdm9pZCBrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYWxsX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiB7XFxuIFxcdHN0cnVjdCBrdm1fdm1pZCAqdiA9IFxcdTAwMjZ2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZDtcXG4tXFx0dW5zaWduZWQgbG9uZyB2bWlkID0gUkVBRF9PTkNFKHYtXFx1MDAzZXZtaWQpO1xcbitcXHR1bnNpZ25lZCBsb25nIHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFxcdTAwMjZ2LVxcdTAwM2VpZCkpO1xcbiBcXG4gXFx0aWYgKGt2bV9yaXNjdl9uYWNsX2F2YWlsYWJsZSgpKVxcbiBcXHRcXHRuYWNsX2hmZW5jZV92dm1hX2FsbChuYWNsX3NobWVtKCksIHZtaWQpO1xcbkBAIC01MzEsOCArNTMxLDExIEBAIHZvaWQga3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbChzdHJ1Y3Qga3ZtICprdm0sXFxuIFxcbiBpbnQga3ZtX2FyY2hfZmx1c2hfcmVtb3RlX3RsYnNfcmFuZ2Uoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4sIHU2NCBucl9wYWdlcylcXG4ge1xcbitcXHR1bnNpZ25lZCBsb25nIHZtaWQgPVxcbitcXHRcXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFxcdTAwMjZrdm0tXFx1MDAzZWFyY2gudm1pZC5pZCkpO1xcbitcXG4gXFx0a3ZtX3Jpc2N2X2hmZW5jZV9ndm1hX3ZtaWRfZ3BhKGt2bSwgLTFVTCwgMCxcXG4gXFx0XFx0XFx0XFx0ICAgICAgIGdmbiBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZULCBucl9wYWdlcyBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZULFxcbi1cXHRcXHRcXHRcXHQgICAgICAgUEFHRV9TSElGVCwgUkVBRF9PTkNFKGt2bS1cXHUwMDNlYXJjaC52bWlkLnZtaWQpKTtcXG4rXFx0XFx0XFx0XFx0ICAgICAgIFBBR0VfU0hJRlQsIHZtaWQpO1xcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92Y3B1LmMgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1LmNcXG5pbmRleCBlMDYyY2ExOWY5ZDhmLi44NTU0MmMxYTVlYzNmIDEwMDY0NFxcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHUuY1xcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHUuY1xcbkBAIC05NDMsMTQgKzk0MywxNCBAQCBpbnQga3ZtX2FyY2hfdmNwdV9pb2N0bF9ydW4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4gXFx0XFx0cmV0ID0gMTtcXG4gXFxuLVxcdFxcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUodmNwdSk7XFxuLVxcbiBcXHRcXHRyZXQgPSBrdm1fcmlzY3ZfY2hlY2tfdmNwdV9yZXF1ZXN0cyh2Y3B1KTtcXG4gXFx0XFx0aWYgKHJldCBcXHUwMDNjPSAwKVxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4gXFxuIFxcdFxcdHByZWVtcHRfZGlzYWJsZSgpO1xcbiBcXG4rXFx0XFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZSh2Y3B1KTtcXG4rXFxuIFxcdFxcdC8qIFVwZGF0ZSBBSUEgSFcgc3RhdGUgYmVmb3JlIGVudGVyaW5nIGd1ZXN0ICovXFxuIFxcdFxcdHJldCA9IGt2bV9yaXNjdl92Y3B1X2FpYV91cGRhdGUodmNwdSk7XFxuIFxcdFxcdGlmIChyZXQgXFx1MDAzYz0gMCkge1xcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV9yZXBsYWNlLmMgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV9yZXBsYWNlLmNcXG5pbmRleCA1MDZhNTEwYjZiZmYzLi4xYmUzODZhNzhlMjdmIDEwMDY0NFxcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY1xcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY1xcbkBAIC0xMDQsNyArMTA0LDcgQEAgc3RhdGljIGludCBrdm1fc2JpX2V4dF9yZmVuY2VfaGFuZGxlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW5cXG4gXFx0XFx0a3ZtX3Jpc2N2X3ZjcHVfcG11X2luY3JfZncodmNwdSwgU0JJX1BNVV9GV19GRU5DRV9JX1NFTlQpO1xcbiBcXHRcXHRicmVhaztcXG4gXFx0Y2FzZSBTQklfRVhUX1JGRU5DRV9SRU1PVEVfU0ZFTkNFX1ZNQTpcXG4tXFx0XFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkKTtcXG4rXFx0XFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkLmlkKSk7XFxuIFxcdFxcdGlmICgoY3AtXFx1MDAzZWEyID09IDAgXFx1MDAyNlxcdTAwMjYgY3AtXFx1MDAzZWEzID09IDApIHx8IGNwLVxcdTAwM2VhMyA9PSAtMVVMKVxcbiBcXHRcXHRcXHRrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYWxsKHZjcHUtXFx1MDAzZWt2bSwgaGJhc2UsIGhtYXNrLCB2bWlkKTtcXG4gXFx0XFx0ZWxzZVxcbkBAIC0xMTMsNyArMTEzLDcgQEAgc3RhdGljIGludCBrdm1fc2JpX2V4dF9yZmVuY2VfaGFuZGxlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW5cXG4gXFx0XFx0a3ZtX3Jpc2N2X3ZjcHVfcG11X2luY3JfZncodmNwdSwgU0JJX1BNVV9GV19IRkVOQ0VfVlZNQV9TRU5UKTtcXG4gXFx0XFx0YnJlYWs7XFxuIFxcdGNhc2UgU0JJX0VYVF9SRkVOQ0VfUkVNT1RFX1NGRU5DRV9WTUFfQVNJRDpcXG4tXFx0XFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkKTtcXG4rXFx0XFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkLmlkKSk7XFxuIFxcdFxcdGlmICgoY3AtXFx1MDAzZWEyID09IDAgXFx1MDAyNlxcdTAwMjYgY3AtXFx1MDAzZWEzID09IDApIHx8IGNwLVxcdTAwM2VhMyA9PSAtMVVMKVxcbiBcXHRcXHRcXHRrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYXNpZF9hbGwodmNwdS1cXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2ssXFxuIFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgICBjcC1cXHUwMDNlYTQsIHZtaWQpO1xcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jXFxuaW5kZXggZGU1NDRlYTNmMjhkYy4uY2EzZWZlNjNjMWNmMSAxMDA2NDRcXG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuY1xcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jXFxuQEAgLTg4LDE0ICs4OCwxNCBAQCBzdGF0aWMgaW50IGt2bV9zYmlfZXh0X3YwMV9oYW5kbGVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1bixcXG4gXFx0XFx0aWYgKGNwLVxcdTAwM2VhNyA9PSBTQklfRVhUXzBfMV9SRU1PVEVfRkVOQ0VfSSlcXG4gXFx0XFx0XFx0a3ZtX3Jpc2N2X2ZlbmNlX2kodmNwdS1cXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2spO1xcbiBcXHRcXHRlbHNlIGlmIChjcC1cXHUwMDNlYTcgPT0gU0JJX0VYVF8wXzFfUkVNT1RFX1NGRU5DRV9WTUEpIHtcXG4tXFx0XFx0XFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkKTtcXG4rXFx0XFx0XFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkLmlkKSk7XFxuIFxcdFxcdFxcdGlmIChjcC1cXHUwMDNlYTEgPT0gMCBcXHUwMDI2XFx1MDAyNiBjcC1cXHUwMDNlYTIgPT0gMClcXG4gXFx0XFx0XFx0XFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbCh2Y3B1LVxcdTAwM2Vrdm0sIGhiYXNlLCBobWFzaywgdm1pZCk7XFxuIFxcdFxcdFxcdGVsc2VcXG4gXFx0XFx0XFx0XFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2d2YSh2Y3B1LVxcdTAwM2Vrdm0sIGhiYXNlLCBobWFzaywgY3AtXFx1MDAzZWExLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHRcXHQgIGNwLVxcdTAwM2VhMiwgUEFHRV9TSElGVCwgdm1pZCk7XFxuIFxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdHZtaWQgPSBSRUFEX09OQ0UodmNwdS1cXHUwMDNla3ZtLVxcdTAwM2VhcmNoLnZtaWQudm1pZCk7XFxuK1xcdFxcdFxcdHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFxcdTAwMjZ2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZC5pZCkpO1xcbiBcXHRcXHRcXHRpZiAoY3AtXFx1MDAzZWExID09IDAgXFx1MDAyNlxcdTAwMjYgY3AtXFx1MDAzZWEyID09IDApXFxuIFxcdFxcdFxcdFxcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hc2lkX2FsbCh2Y3B1LVxcdTAwM2Vrdm0sIGhiYXNlLCBobWFzayxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIGNwLVxcdTAwM2VhMywgdm1pZCk7XFxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuY1xcbmluZGV4IGMxNWJkYjFkZDhiZWYuLjdiODZhNmZiZTRhNjkgMTAwNjQ0XFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdm1pZC5jXFxuKysrIGIvYXJjaC9yaXNjdi9rdm0vdm1pZC5jXFxuQEAgLTYsMTEgKzYsMTUgQEBcXG4gICogICAgIEFudXAgUGF0ZWwgXFx1MDAzY2FudXAucGF0ZWxAd2RjLmNvbVxcdTAwM2VcXG4gICovXFxuIFxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYml0bWFwLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9iaXRvcHMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NwdW1hc2suaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2Vycm5vLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9lcnIuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vZHVsZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvcGVyY3B1LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9wcmVlbXB0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbGFiLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbXAuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2t2bV9ob3N0LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2Nhc20vY3NyLmhcXHUwMDNlXFxuQEAgLTE4LDI2ICsyMiw1NCBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjYXNtL2t2bV90bGIuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2FzbS9rdm1fdm1pZC5oXFx1MDAzZVxcbiBcXG4tc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF92ZXJzaW9uID0gMTtcXG4tc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF9uZXh0O1xcbitzdGF0aWMgYXRvbWljNjRfdCB2bWlkX2dlbmVyYXRpb247XFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nICp2bWlkX21hcDtcXG4gc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF9iaXRzIF9fcm9fYWZ0ZXJfaW5pdDtcXG4tc3RhdGljIERFRklORV9TUElOTE9DSyh2bWlkX2xvY2spO1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX2N1cl9pZHggPSAxO1xcbitcXG4rc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0sodm1pZF9sb2NrKTtcXG4rXFxuK3N0YXRpYyBERUZJTkVfUEVSX0NQVShhdG9taWM2NF90LCBhY3RpdmVfdm1pZHMpO1xcbitzdGF0aWMgREVGSU5FX1BFUl9DUFUodTY0LCByZXNlcnZlZF92bWlkcyk7XFxuK1xcbitzdGF0aWMgY3B1bWFza190IHRsYl9mbHVzaF9wZW5kaW5nO1xcbitcXG4rI2RlZmluZSBWTUlEX0ZJUlNUX1ZFUlNJT05cXHRCSVRfVUxMKHZtaWRfYml0cylcXG4rI2RlZmluZSBOVU1fVk1JRFNcXHRcXHRCSVQodm1pZF9iaXRzKVxcbisjZGVmaW5lIFZNSURfSFdfTUFTS1xcdFxcdChWTUlEX0ZJUlNUX1ZFUlNJT04gLSAxKVxcbitcXG4rc3RhdGljIGJvb2wgdm1pZF9nZW5fbWF0Y2godTY0IHZtaWQpXFxuK3tcXG4rXFx0cmV0dXJuICEoKHZtaWQgXiBhdG9taWM2NF9yZWFkKFxcdTAwMjZ2bWlkX2dlbmVyYXRpb24pKSBcXHUwMDNlXFx1MDAzZSB2bWlkX2JpdHMpO1xcbit9XFxuK1xcbit1bnNpZ25lZCBsb25nIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHU2NCB2bWlkKVxcbit7XFxuK1xcdGlmICghdm1pZF9iaXRzKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdHJldHVybiAodW5zaWduZWQgbG9uZykodm1pZCBcXHUwMDI2IFZNSURfSFdfTUFTSyk7XFxuK31cXG4gXFxuIHZvaWQgX19pbml0IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9kZXRlY3Qodm9pZClcXG4ge1xcbi1cXHQvKiBGaWd1cmUtb3V0IG51bWJlciBvZiBWTUlEIGJpdHMgaW4gSFcgKi9cXG4rXFx0LyogRmlndXJlIG91dCB0aGUgbnVtYmVyIG9mIFZNSUQgYml0cyBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUuICovXFxuIFxcdGNzcl93cml0ZShDU1JfSEdBVFAsIChrdm1fcmlzY3ZfZ3N0YWdlX21vZGUoa3ZtX3Jpc2N2X2dzdGFnZV9tYXhfcGdkX2xldmVscykgXFx1MDAzY1xcdTAwM2NcXG4tXFx0XFx0XFx0ICAgICAgSEdBVFBfTU9ERV9TSElGVCkgfCBIR0FUUF9WTUlEKTtcXG4rXFx0XFx0ICAgSEdBVFBfTU9ERV9TSElGVCkgfCBIR0FUUF9WTUlEKTtcXG4gXFx0dm1pZF9iaXRzID0gY3NyX3JlYWQoQ1NSX0hHQVRQKTtcXG4gXFx0dm1pZF9iaXRzID0gKHZtaWRfYml0cyBcXHUwMDI2IEhHQVRQX1ZNSUQpIFxcdTAwM2VcXHUwMDNlIEhHQVRQX1ZNSURfU0hJRlQ7XFxuIFxcdHZtaWRfYml0cyA9IGZsc19sb25nKHZtaWRfYml0cyk7XFxuIFxcdGNzcl93cml0ZShDU1JfSEdBVFAsIDApO1xcbiBcXG4tXFx0LyogV2UgcG9sbHV0ZWQgbG9jYWwgVExCIHNvIGZsdXNoIGFsbCBndWVzdCBUTEIgKi9cXG4rXFx0LyogRmx1c2ggdGhlIGxvY2FsIGd1ZXN0IFRMQiBhZnRlciBwcm9iaW5nIEhHQVRQLiAqL1xcbiBcXHRrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfYWxsKCk7XFxuIFxcbi1cXHQvKiBXZSBkb24ndCB1c2UgVk1JRCBiaXRzIGlmIHRoZXkgYXJlIG5vdCBzdWZmaWNpZW50ICovXFxuLVxcdGlmICgoMVVMIFxcdTAwM2NcXHUwMDNjIHZtaWRfYml0cykgXFx1MDAzYyBudW1fcG9zc2libGVfY3B1cygpKVxcbitcXHQvKlxcbitcXHQgKiBWTUlEIDAgaXMgcmVzZXJ2ZWQuICBEdXJpbmcgcm9sbG92ZXIgZXZlcnkgcG9zc2libGUgQ1BVIG1heVxcbitcXHQgKiByZXNlcnZlIG9uZSBoYXJkd2FyZSBWTUlELCBhbmQgd2Ugc3RpbGwgbmVlZCBhdCBsZWFzdCBvbmUgVk1JRFxcbitcXHQgKiBhdmFpbGFibGUgZm9yIGEgbmV3IGFsbG9jYXRpb24uXFxuK1xcdCAqL1xcbitcXHRpZiAodm1pZF9iaXRzIFxcdTAwMjZcXHUwMDI2IE5VTV9WTUlEUyAtIDEgXFx1MDAzYz0gbnVtX3Bvc3NpYmxlX2NwdXMoKSlcXG4gXFx0XFx0dm1pZF9iaXRzID0gMDtcXG4gfVxcbiBcXG5AQCAtNDYsODAgKzc4LDI5OCBAQCB1bnNpZ25lZCBsb25nIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9iaXRzKHZvaWQpXFxuIFxcdHJldHVybiB2bWlkX2JpdHM7XFxuIH1cXG4gXFxuK2ludCBfX2luaXQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2luaXQodm9pZClcXG4re1xcbitcXHRpbnQgY3B1O1xcbitcXG4rXFx0aWYgKCF2bWlkX2JpdHMpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0dm1pZF9tYXAgPSBiaXRtYXBfemFsbG9jKE5VTV9WTUlEUywgR0ZQX0tFUk5FTCk7XFxuK1xcdGlmICghdm1pZF9tYXApXFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXG4rXFx0dm1pZF9jdXJfaWR4ID0gMTtcXG4rXFxuK1xcdC8qIEhhcmR3YXJlIFZNSUQgMCBpcyByZXNlcnZlZC4gKi9cXG4rXFx0X19zZXRfYml0KDAsIHZtaWRfbWFwKTtcXG4rXFxuK1xcdGF0b21pYzY0X3NldChcXHUwMDI2dm1pZF9nZW5lcmF0aW9uLCBWTUlEX0ZJUlNUX1ZFUlNJT04pO1xcbitcXG4rXFx0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xcbitcXHRcXHRhdG9taWM2NF9zZXQoXFx1MDAyNnBlcl9jcHUoYWN0aXZlX3ZtaWRzLCBjcHUpLCAwKTtcXG4rXFx0XFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IDA7XFxuK1xcdH1cXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEV2ZXJ5IENQVSBwZXJmb3JtcyBhbiBpbml0aWFsIGxvY2FsIGludmFsaWRhdGlvbiBiZWZvcmUgaXRzXFxuK1xcdCAqIGZpcnN0IFZNSUQgYWN0aXZhdGlvbi5cXG4rXFx0ICovXFxuK1xcdGNwdW1hc2tfY29weShcXHUwMDI2dGxiX2ZsdXNoX3BlbmRpbmcsIGNwdV9wb3NzaWJsZV9tYXNrKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbit2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKHZvaWQpXFxuK3tcXG4rXFx0Yml0bWFwX2ZyZWUodm1pZF9tYXApO1xcbitcXHR2bWlkX21hcCA9IE5VTEw7XFxuK31cXG4rXFxuIGludCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaW5pdChzdHJ1Y3Qga3ZtICprdm0pXFxuIHtcXG4tXFx0LyogTWFyayB0aGUgaW5pdGlhbCBWTUlEIGFuZCBWTUlEIHZlcnNpb24gaW52YWxpZCAqL1xcbi1cXHRrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkX3ZlcnNpb24gPSAwO1xcbi1cXHRrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkID0gMDtcXG4rXFx0YXRvbWljNjRfc2V0KFxcdTAwMjZrdm0tXFx1MDAzZWFyY2gudm1pZC5pZCwgMCk7XFxuIFxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4gYm9vbCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQoc3RydWN0IGt2bV92bWlkICp2bWlkKVxcbiB7XFxuK1xcdHU2NCBpZDtcXG4rXFxuIFxcdGlmICghdm1pZF9iaXRzKVxcbiBcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIFxcbi1cXHRyZXR1cm4gdW5saWtlbHkoUkVBRF9PTkNFKHZtaWQtXFx1MDAzZXZtaWRfdmVyc2lvbikgIT1cXG4tXFx0XFx0XFx0UkVBRF9PTkNFKHZtaWRfdmVyc2lvbikpO1xcbitcXHRpZCA9IGF0b21pYzY0X3JlYWQoXFx1MDAyNnZtaWQtXFx1MDAzZWlkKTtcXG4rXFxuK1xcdHJldHVybiB1bmxpa2VseSghdm1pZF9nZW5fbWF0Y2goaWQpKTtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgX19sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwodm9pZCAqaW5mbylcXG4rLypcXG4rICogQ2FsbGVkIHdpdGggdm1pZF9sb2NrIGhlbGQgYWZ0ZXIgdm1pZF9nZW5lcmF0aW9uIGhhcyBhbHJlYWR5IGJlZW5cXG4rICogYWR2YW5jZWQuXFxuKyAqXFxuKyAqIE5vIHJlbW90ZSBDUFUgaXMgaW50ZXJydXB0ZWQgaGVyZS4gIEluc3RlYWQsIHByZXNlcnZlIGV2ZXJ5IFZNSURcXG4rICogd2hpY2ggbWF5IHN0aWxsIGJlIHVzZWQgYnkgYSBDUFUgYW5kIHF1ZXVlIGEgbG9jYWwgaW52YWxpZGF0aW9uIGZvclxcbisgKiB0aGF0IENQVSdzIG5leHQgVk1JRCBhY3RpdmF0aW9uLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgZmx1c2hfY29udGV4dCh2b2lkKVxcbiB7XFxuLVxcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwoKTtcXG4rXFx0dTY0IHZtaWQ7XFxuK1xcdGludCBjcHU7XFxuK1xcbitcXHRiaXRtYXBfemVybyh2bWlkX21hcCwgTlVNX1ZNSURTKTtcXG4rXFx0X19zZXRfYml0KDAsIHZtaWRfbWFwKTtcXG4rXFxuK1xcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHtcXG4rXFx0XFx0dm1pZCA9IGF0b21pYzY0X3hjaGcoXFx1MDAyNnBlcl9jcHUoYWN0aXZlX3ZtaWRzLCBjcHUpLCAwKTtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIFRoZSBDUFUgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGNhdWdodCBieSBhbiBlYXJsaWVyIHJvbGxvdmVyXFxuK1xcdFxcdCAqIHdpdGhvdXQgcGVyZm9ybWluZyBhbm90aGVyIGFjdGl2YXRpb24gc2luY2UgdGhlbi4gIEluIHRoYXRcXG4rXFx0XFx0ICogY2FzZSByZXNlcnZlZF92bWlkcyBpcyB0aGUgb25seSByZWNvcmQgb2YgdGhlIG9sZCBjb250ZXh0LlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKCF2bWlkKVxcbitcXHRcXHRcXHR2bWlkID0gcGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KTtcXG4rXFxuK1xcdFxcdGlmICh2bWlkKVxcbitcXHRcXHRcXHRfX3NldF9iaXQoa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCksXFxuK1xcdFxcdFxcdFxcdCAgdm1pZF9tYXApO1xcbitcXG4rXFx0XFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IHZtaWQ7XFxuK1xcdH1cXG4rXFxuK1xcdGNwdW1hc2tfY29weShcXHUwMDI2dGxiX2ZsdXNoX3BlbmRpbmcsIGNwdV9wb3NzaWJsZV9tYXNrKTtcXG4rfVxcbitcXG4rLypcXG4rICogVXBkYXRlIGV2ZXJ5IHJlc2VydmVkIGNvcHkgb2YgYW4gb2xkIHNvZnR3YXJlIFZNSUQuXFxuKyAqXFxuKyAqIERvIG5vdCBzdG9wIGFmdGVyIHRoZSBmaXJzdCBtYXRjaDogdGhlIHNhbWUgVk0gbWF5IGhhdmUgYmVlbiBhY3RpdmVcXG4rICogb24gbW9yZSB0aGFuIG9uZSBDUFUgd2hlbiByb2xsb3ZlciBvY2N1cnJlZC5cXG4rICovXFxuK3N0YXRpYyBib29sIGNoZWNrX3VwZGF0ZV9yZXNlcnZlZF92bWlkKHU2NCBvbGRfdm1pZCwgdTY0IG5ld192bWlkKVxcbit7XFxuK1xcdGJvb2wgaGl0ID0gZmFsc2U7XFxuK1xcdGludCBjcHU7XFxuK1xcbitcXHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XFxuK1xcdFxcdGlmIChwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID09IG9sZF92bWlkKSB7XFxuK1xcdFxcdFxcdHBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSkgPSBuZXdfdm1pZDtcXG4rXFx0XFx0XFx0aGl0ID0gdHJ1ZTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gaGl0O1xcbit9XFxuK1xcbisvKlxcbisgKiBBbGxvY2F0ZS9wcm9tb3RlIGEgc29mdHdhcmUgVk1JRC5cXG4rICpcXG4rICogdm1pZF9sb2NrIG11c3QgYmUgaGVsZCBieSB0aGUgY2FsbGVyLlxcbisgKi9cXG4rc3RhdGljIHU2NCBuZXdfdm1pZF9sb2NrZWQoc3RydWN0IGt2bV92bWlkICprdm1fdm1pZClcXG4re1xcbitcXHR1NjQgdm1pZCA9IGF0b21pYzY0X3JlYWQoXFx1MDAyNmt2bV92bWlkLVxcdTAwM2VpZCk7XFxuK1xcdHU2NCBnZW5lcmF0aW9uID0gYXRvbWljNjRfcmVhZChcXHUwMDI2dm1pZF9nZW5lcmF0aW9uKTtcXG4rXFx0dTY0IG5ld192bWlkO1xcbitcXHR1bnNpZ25lZCBsb25nIGlkeDtcXG4rXFxuK1xcdGlmICh2bWlkKSB7XFxuK1xcdFxcdG5ld192bWlkID0gZ2VuZXJhdGlvbiB8XFxuK1xcdFxcdFxcdCAgIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHZtaWQpO1xcbitcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVGhlIG9sZCBWTUlEIGlzIHN0aWxsIHByb3RlY3RlZCBieSBvbmUgb3IgbW9yZSBDUFVzLlxcbitcXHRcXHQgKiBLZWVwIHRoZSBzYW1lIGhhcmR3YXJlIFZNSUQgYW5kIG9ubHkgcHJvbW90ZSBnZW5lcmF0aW9uLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKGNoZWNrX3VwZGF0ZV9yZXNlcnZlZF92bWlkKHZtaWQsIG5ld192bWlkKSlcXG4rXFx0XFx0XFx0cmV0dXJuIG5ld192bWlkO1xcbitcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVGhlIFZNIGhhZCBhIFZNSUQgaW4gYW4gb2xkZXIgZ2VuZXJhdGlvbi4gIFJldXNlIHRoZSBzYW1lXFxuK1xcdFxcdCAqIGhhcmR3YXJlIG51bWJlciBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBjbGFpbWVkLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWR4ID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCk7XFxuK1xcdFxcdGlmICghX190ZXN0X2FuZF9zZXRfYml0KGlkeCwgdm1pZF9tYXApKVxcbitcXHRcXHRcXHRyZXR1cm4gbmV3X3ZtaWQ7XFxuK1xcdH1cXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEZpbmQgYSBmcmVlIFZNSUQgaW4gdGhlIGN1cnJlbnQgZ2VuZXJhdGlvbi5cXG4rXFx0ICovXFxuK1xcdGlkeCA9IGZpbmRfbmV4dF96ZXJvX2JpdCh2bWlkX21hcCwgTlVNX1ZNSURTLCB2bWlkX2N1cl9pZHgpO1xcbitcXHRpZiAoaWR4ICE9IE5VTV9WTUlEUylcXG4rXFx0XFx0Z290byBzZXRfdm1pZDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIE5vIGZyZWUgVk1JRC4gIFN0YXJ0IGEgbmV3IGdlbmVyYXRpb24sIHByZXNlcnZlIGFsbCBDUFUtbG9jYWxcXG4rXFx0ICogdXNlcnMsIGFuZCBkZWZlciBlYWNoIENQVSdzIGZsdXNoIHVudGlsIGl0cyBuZXh0IGFjdGl2YXRpb24uXFxuK1xcdCAqL1xcbitcXHRnZW5lcmF0aW9uICs9IFZNSURfRklSU1RfVkVSU0lPTjtcXG4rXFxuK1xcdC8qIFNvZnR3YXJlIFZNSUQgMCBpcyByZXNlcnZlZCBhcyB0aGUgaW52YWxpZCBpZGVudGlmaWVyLiAqL1xcbitcXHRpZiAodW5saWtlbHkoIWdlbmVyYXRpb24pKVxcbitcXHRcXHRnZW5lcmF0aW9uID0gVk1JRF9GSVJTVF9WRVJTSU9OO1xcbitcXG4rXFx0YXRvbWljNjRfeGNoZyhcXHUwMDI2dm1pZF9nZW5lcmF0aW9uLCBnZW5lcmF0aW9uKTtcXG4rXFx0Zmx1c2hfY29udGV4dCgpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogTlVNX1ZNSURTIC0gMSBcXHUwMDNlIG51bV9wb3NzaWJsZV9jcHVzKCksIHRoZXJlZm9yZSByb2xsb3ZlciBtdXN0XFxuK1xcdCAqIGxlYXZlIGF0IGxlYXN0IG9uZSBhbGxvY2F0YWJsZSBoYXJkd2FyZSBWTUlELlxcbitcXHQgKi9cXG4rXFx0aWR4ID0gZmluZF9uZXh0X3plcm9fYml0KHZtaWRfbWFwLCBOVU1fVk1JRFMsIDEpO1xcbitcXG4rc2V0X3ZtaWQ6XFxuK1xcdF9fc2V0X2JpdChpZHgsIHZtaWRfbWFwKTtcXG4rXFx0dm1pZF9jdXJfaWR4ID0gaWR4O1xcbitcXG4rXFx0cmV0dXJuIGdlbmVyYXRpb24gfCBpZHg7XFxuIH1cXG4gXFxuIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIHtcXG4tXFx0dW5zaWduZWQgbG9uZyBpO1xcbitcXHRzdHJ1Y3Qga3ZtX3ZtaWQgKmt2bV92bWlkID0gXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkO1xcbitcXHRhdG9taWM2NF90ICphY3RpdmU7XFxuIFxcdHN0cnVjdCBrdm1fdmNwdSAqdjtcXG4tXFx0c3RydWN0IGt2bV92bWlkICp2bWlkID0gXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkO1xcbitcXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xcbitcXHR1NjQgdm1pZDtcXG4rXFx0dTY0IG9sZF9hY3RpdmVfdm1pZDtcXG4rXFx0dW5zaWduZWQgbG9uZyBpO1xcbitcXHR1bnNpZ25lZCBpbnQgY3B1O1xcbitcXHRib29sIHZtaWRfY2hhbmdlZCA9IGZhbHNlO1xcbiBcXG4tXFx0aWYgKCFrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQodm1pZCkpXFxuK1xcdGlmICghdm1pZF9iaXRzKVxcbiBcXHRcXHRyZXR1cm47XFxuIFxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnZtaWRfbG9jayk7XFxuK1xcdC8qXFxuK1xcdCAqIGFjdGl2ZV92bWlkcyBhbmQgdGxiX2ZsdXNoX3BlbmRpbmcgYXJlIHBlci1DUFUgYWRtaXNzaW9uIHN0YXRlLlxcbitcXHQgKiBUaGV5IG11c3QgcmVmZXIgdG8gdGhlIHNhbWUgQ1BVIGZvciB0aGUgY29tcGxldGUgYWN0aXZhdGlvbi5cXG4rXFx0ICovXFxuK1xcdHByZWVtcHRfZGlzYWJsZSgpO1xcbitcXG4rXFx0Y3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpO1xcbitcXHRhY3RpdmUgPSB0aGlzX2NwdV9wdHIoXFx1MDAyNmFjdGl2ZV92bWlkcyk7XFxuK1xcbitcXHR2bWlkID0gYXRvbWljNjRfcmVhZChcXHUwMDI2a3ZtX3ZtaWQtXFx1MDAzZWlkKTtcXG4rXFx0b2xkX2FjdGl2ZV92bWlkID0gYXRvbWljNjRfcmVhZChhY3RpdmUpO1xcbiBcXG4gXFx0LypcXG4tXFx0ICogV2UgbmVlZCB0byByZS1jaGVjayB0aGUgdm1pZF92ZXJzaW9uIGhlcmUgdG8gZW5zdXJlIHRoYXQgaWZcXG4tXFx0ICogYW5vdGhlciB2Y3B1IGFscmVhZHkgYWxsb2NhdGVkIGEgdmFsaWQgdm1pZCBmb3IgdGhpcyB2bS5cXG4rXFx0ICogRmFzdCBwYXRoLlxcbitcXHQgKlxcbitcXHQgKiBUaGUgY21weGNoZyByYWNlcyB3aXRoIGZsdXNoX2NvbnRleHQoKSdzIHhjaGcgb24gdGhlIHNhbWVcXG4rXFx0ICogcGVyLUNQVSBhdG9taWMuICBFaXRoZXIgdGhpcyBhY3RpdmF0aW9uIGlzIGNhcHR1cmVkIGJ5IHJvbGxvdmVyLFxcbitcXHQgKiBvciByb2xsb3ZlciBjbGVhcnMgYWN0aXZlIGZpcnN0IGFuZCB0aGUgY21weGNoZyBmYWlscy5cXG4gXFx0ICovXFxuLVxcdGlmICgha3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3Zlcl9jaGFuZ2VkKHZtaWQpKSB7XFxuLVxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZ2bWlkX2xvY2spO1xcbi1cXHRcXHRyZXR1cm47XFxuK1xcdGlmIChvbGRfYWN0aXZlX3ZtaWQgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIHZtaWRfZ2VuX21hdGNoKHZtaWQpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBhdG9taWM2NF9jbXB4Y2hnKGFjdGl2ZSwgb2xkX2FjdGl2ZV92bWlkLCB2bWlkKSA9PVxcbitcXHQgICAgb2xkX2FjdGl2ZV92bWlkKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdHJhd19zcGluX2xvY2tfaXJxc2F2ZShcXHUwMDI2dm1pZF9sb2NrLCBmbGFncyk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBSZS1yZWFkIHVuZGVyIHRoZSBhbGxvY2F0b3IgbG9jayBiZWNhdXNlIGFub3RoZXIgdkNQVSBvZiB0aGlzIFZNXFxuK1xcdCAqIG1heSBhbHJlYWR5IGhhdmUgcHJvbW90ZWQgb3IgYWxsb2NhdGVkIHRoZSBzaGFyZWQgVk1JRC5cXG4rXFx0ICovXFxuK1xcdHZtaWQgPSBhdG9taWM2NF9yZWFkKFxcdTAwMjZrdm1fdm1pZC1cXHUwMDNlaWQpO1xcbitcXG4rXFx0aWYgKCF2bWlkX2dlbl9tYXRjaCh2bWlkKSkge1xcbitcXHRcXHR2bWlkID0gbmV3X3ZtaWRfbG9ja2VkKGt2bV92bWlkKTtcXG4rXFx0XFx0YXRvbWljNjRfc2V0KFxcdTAwMjZrdm1fdm1pZC1cXHUwMDNlaWQsIHZtaWQpO1xcbitcXHRcXHR2bWlkX2NoYW5nZWQgPSB0cnVlO1xcbiBcXHR9XFxuIFxcbi1cXHQvKiBGaXJzdCB1c2VyIG9mIGEgbmV3IFZNSUQgdmVyc2lvbj8gKi9cXG4tXFx0aWYgKHVubGlrZWx5KHZtaWRfbmV4dCA9PSAwKSkge1xcbi1cXHRcXHRXUklURV9PTkNFKHZtaWRfdmVyc2lvbiwgUkVBRF9PTkNFKHZtaWRfdmVyc2lvbikgKyAxKTtcXG4tXFx0XFx0dm1pZF9uZXh0ID0gMTtcXG4rXFx0LypcXG4rXFx0ICogRXZlbiBpZiBhbm90aGVyIHZDUFUgYWxyZWFkeSB1cGRhdGVkIHRoZSBzaGFyZWQgVk1JRCwgdGhpcyBDUFVcXG4rXFx0ICogbXVzdCBzdGlsbCBkaXNjaGFyZ2UgaXRzIG93biByb2xsb3ZlciBmbHVzaCBvYmxpZ2F0aW9uLlxcbitcXHQgKi9cXG4rXFx0aWYgKGNwdW1hc2tfdGVzdF9hbmRfY2xlYXJfY3B1KGNwdSwgXFx1MDAyNnRsYl9mbHVzaF9wZW5kaW5nKSlcXG4rXFx0XFx0a3ZtX3Jpc2N2X2xvY2FsX2hmZW5jZV9ndm1hX2FsbCgpO1xcbiBcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogV2UgcmFuIG91dCBvZiBWTUlEcyBzbyB3ZSBpbmNyZW1lbnQgdm1pZF92ZXJzaW9uIGFuZFxcbi1cXHRcXHQgKiBzdGFydCBhc3NpZ25pbmcgVk1JRHMgZnJvbSAxLlxcbi1cXHRcXHQgKlxcbi1cXHRcXHQgKiBUaGlzIGFsc28gbWVhbnMgZXhpc3RpbmcgVk1JRHMgYXNzaWdubWVudCB0byBhbGwgR3Vlc3RcXG4tXFx0XFx0ICogaW5zdGFuY2VzIGlzIGludmFsaWQgYW5kIHdlIGhhdmUgZm9yY2UgVk1JRCByZS1hc3NpZ25lbWVudFxcbi1cXHRcXHQgKiBmb3IgYWxsIEd1ZXN0IGluc3RhbmNlcy4gVGhlIEd1ZXN0IGluc3RhbmNlcyB0aGF0IHdlcmUgbm90XFxuLVxcdFxcdCAqIHJ1bm5pbmcgd2lsbCBhdXRvbWF0aWNhbGx5IHBpY2stdXAgbmV3IFZNSURzIGJlY2F1c2Ugd2lsbFxcbi1cXHRcXHQgKiBjYWxsIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoKSB3aGVuZXZlciB0aGV5IGVudGVyXFxuLVxcdFxcdCAqIGluLWtlcm5lbCBydW4gbG9vcC4gRm9yIEd1ZXN0IGluc3RhbmNlcyB0aGF0IGFyZSBhbHJlYWR5XFxuLVxcdFxcdCAqIHJ1bm5pbmcsIHdlIGZvcmNlIFZNIGV4aXRzIG9uIGFsbCBob3N0IENQVXMgdXNpbmcgSVBJIGFuZFxcbi1cXHRcXHQgKiBmbHVzaCBhbGwgR3Vlc3QgVExCcy5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdG9uX2VhY2hfY3B1X21hc2soY3B1X29ubGluZV9tYXNrLCBfX2xvY2FsX2hmZW5jZV9ndm1hX2FsbCxcXG4tXFx0XFx0XFx0XFx0IE5VTEwsIDEpO1xcbitcXHQvKlxcbitcXHQgKiBQdWJsaXNoIHRoZSBDUFUtbG9jYWwgYWN0aXZlIGlkZW50aXR5IG9ubHkgYWZ0ZXIgdGhlIHJlcXVpcmVkXFxuK1xcdCAqIGxvY2FsIGludmFsaWRhdGlvbiBpcyBjb21wbGV0ZS5cXG4rXFx0ICovXFxuK1xcdGF0b21pYzY0X3NldChhY3RpdmUsIHZtaWQpO1xcbitcXG4rXFx0cmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoXFx1MDAyNnZtaWRfbG9jaywgZmxhZ3MpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogQSBuZXcgc29mdHdhcmUgVk1JRCBtYXkgY29udGFpbiBhIGRpZmZlcmVudCBoYXJkd2FyZSBWTUlELCBzb1xcbitcXHQgKiByZXF1ZXN0IGFuIEhHQVRQIHVwZGF0ZSBmb3IgZXZlcnkgdkNQVSBpbiB0aGUgVk0uXFxuK1xcdCAqL1xcbitcXHRpZiAodm1pZF9jaGFuZ2VkKSB7XFxuK1xcdFxcdGt2bV9mb3JfZWFjaF92Y3B1KGksIHYsIHZjcHUtXFx1MDAzZWt2bSlcXG4rXFx0XFx0XFx0a3ZtX21ha2VfcmVxdWVzdChLVk1fUkVRX1VQREFURV9IR0FUUCwgdik7XFxuIFxcdH1cXG4gXFxuLVxcdHZtaWQtXFx1MDAzZXZtaWQgPSB2bWlkX25leHQ7XFxuLVxcdHZtaWRfbmV4dCsrO1xcbi1cXHR2bWlkX25leHQgXFx1MDAyNj0gKDEgXFx1MDAzY1xcdTAwM2Mgdm1pZF9iaXRzKSAtIDE7XFxuK291dDpcXG4rXFx0cHJlZW1wdF9lbmFibGUoKTtcXG4rfVxcbitcXG4rLypcXG4rICogQ1BVIHZpcnR1YWxpemF0aW9uL0NTUiBzdGF0ZSBpcyBiZWluZyBkaXNjYXJkZWQuXFxuKyAqXFxuKyAqIFdpdGhkcmF3IGZhc3QtcGF0aCBlbGlnaWJpbGl0eSwgYnV0IGNvbnNlcnZhdGl2ZWx5IHByZXNlcnZlIHRoZSBsYXN0XFxuKyAqIGlkZW50aXR5IGluc3RlYWQgb2YgbWFraW5nIGl0cyBoYXJkd2FyZSBWTUlEIGltbWVkaWF0ZWx5IHJldXNhYmxlLlxcbisgKi9cXG4rdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfY3B1X2ludmFsaWRhdGUodm9pZClcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xcbitcXHR1NjQgdm1pZDtcXG4rXFx0dW5zaWduZWQgaW50IGNwdTtcXG4gXFxuLVxcdFdSSVRFX09OQ0Uodm1pZC1cXHUwMDNldm1pZF92ZXJzaW9uLCBSRUFEX09OQ0Uodm1pZF92ZXJzaW9uKSk7XFxuK1xcdGlmICghdm1pZF9iaXRzKVxcbitcXHRcXHRyZXR1cm47XFxuIFxcbi1cXHRzcGluX3VubG9jayhcXHUwMDI2dm1pZF9sb2NrKTtcXG4rXFx0bG9ja2RlcF9hc3NlcnRfcHJlZW1wdGlvbl9kaXNhYmxlZCgpO1xcbitcXG4rXFx0Y3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpO1xcbitcXG4rXFx0cmF3X3NwaW5fbG9ja19pcnFzYXZlKFxcdTAwMjZ2bWlkX2xvY2ssIGZsYWdzKTtcXG4rXFxuK1xcdHZtaWQgPSBhdG9taWM2NF94Y2hnKHRoaXNfY3B1X3B0cihcXHUwMDI2YWN0aXZlX3ZtaWRzKSwgMCk7XFxuK1xcbitcXHRpZiAodm1pZClcXG4rXFx0XFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IHZtaWQ7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBJZiBhY3RpdmUgd2FzIGFscmVhZHkgemVybywgcmV0YWluIHRoZSBvbGQgcmVzZXJ2ZWQgZW50cnkuXFxuK1xcdCAqL1xcbitcXHRjcHVtYXNrX3NldF9jcHUoY3B1LCBcXHUwMDI2dGxiX2ZsdXNoX3BlbmRpbmcpO1xcbiBcXG4tXFx0LyogUmVxdWVzdCBHLXN0YWdlIHBhZ2UgdGFibGUgdXBkYXRlIGZvciBhbGwgVkNQVXMgKi9cXG4tXFx0a3ZtX2Zvcl9lYWNoX3ZjcHUoaSwgdiwgdmNwdS1cXHUwMDNla3ZtKVxcbi1cXHRcXHRrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfVVBEQVRFX0hHQVRQLCB2KTtcXG4rXFx0cmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoXFx1MDAyNnZtaWRfbG9jaywgZmxhZ3MpO1xcbiB9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDE3OjUwOjI1LjY0MTAwMzUwM1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6NjAxNzc3MDU0NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJBbGwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgc3RyaWN0bHkgY29uZmluZWQgdG8gdGhlIFJJU0MtViBhcmNoaXRlY3R1cmUgKGFyY2gvcmlzY3YvKSwgc3BlY2lmaWNhbGx5IHRoZSBSSVNDLVYgS1ZNIFN0YWdlLTIgVk1JRCBtYW5hZ2VtZW50LiBUaGV5IGNhbm5vdCBiZSBidWlsdCBvciBleGVjdXRlZCBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSAoYW1kNjQpLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA1ZmMzNWNjYzVjN2Q5ZDRjNzM0OTRiNTQ4Yzg4ZGU4NWZkZTM0OGM0XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMTAgMTc6NTA6MjQgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9nc3RhZ2UuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oXG5pbmRleCBhYWYwODBiYTFiNzdhLi5jNjFhMWJiYjI3MmY0IDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmhcbisrKyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oXG5AQCAtOCw3ICs4LDcgQEBcbiAjZGVmaW5lIF9fUklTQ1ZfS1ZNX0dTVEFHRV9IX1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2t2bV90eXBlcy5oXHUwMDNlXG4tXG4rI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV92bWlkLmhcdTAwM2VcbiBzdHJ1Y3Qga3ZtX2dzdGFnZSB7XG4gXHRzdHJ1Y3Qga3ZtICprdm07XG4gXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xuQEAgLTEwOCw3ICsxMDgsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV9pbml0KHN0cnVjdCBrdm1fZ3N0YWdlICpnc3RhZ2UsIHN0cnVjdCBrdm0gKlxuIHtcbiBcdGdzdGFnZS1cdTAwM2Vrdm0gPSBrdm07XG4gXHRnc3RhZ2UtXHUwMDNlZmxhZ3MgPSAwO1xuLVx0Z3N0YWdlLVx1MDAzZXZtaWQgPSBSRUFEX09OQ0Uoa3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbitcdGdzdGFnZS1cdTAwM2V2bWlkID1cbitcdFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZrdm0tXHUwMDNlYXJjaC52bWlkLmlkKSk7XG4gXHRnc3RhZ2UtXHUwMDNlcGdkID0ga3ZtLVx1MDAzZWFyY2gucGdkO1xuIFx0Z3N0YWdlLVx1MDAzZXBnZF9sZXZlbHMgPSBrdm0tXHUwMDNlYXJjaC5wZ2RfbGV2ZWxzO1xuIH1cbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmhcbmluZGV4IGRiNjFiMDUyNWE4ZDAuLmRkZDdjYzEyNWMzZjYgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmhcbisrKyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaFxuQEAgLTYsMjEgKzYsNDIgQEBcbiAjaWZuZGVmIF9fUklTQ1ZfS1ZNX1ZNSURfSF9cbiAjZGVmaW5lIF9fUklTQ1ZfS1ZNX1ZNSURfSF9cbiBcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9hdG9taWMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2t2bV90eXBlcy5oXHUwMDNlXG4gXG4gc3RydWN0IGt2bV92bWlkIHtcbiBcdC8qXG4tXHQgKiBXcml0ZXMgdG8gdm1pZF92ZXJzaW9uIGFuZCB2bWlkIGhhcHBlbiB3aXRoIHZtaWRfbG9jayBoZWxkXG4tXHQgKiB3aGVyZWFzIHJlYWRzIGhhcHBlbiB3aXRob3V0IGFueSBsb2NrIGhlbGQuXG4rXHQgKiBTb2Z0d2FyZSBWTUlEOlxuK1x0ICpcbitcdCAqICAgWyBnZW5lcmF0aW9uIHwgaGFyZHdhcmUgVk1JRCBdXG4rXHQgKlxuK1x0ICogS2VlcCB0aGUgaWRlbnRpdHkgNjQtYml0IG9uIFJWMzIgc28gdGhhdCB0aGUgZ2VuZXJhdGlvbiBkb2VzIG5vdFxuK1x0ICogd3JhcCBhdCB0aGUgbmF0aXZlIHdvcmQgc2l6ZS4gIFplcm8gZGVub3RlcyBhbiB1bmFsbG9jYXRlZCBWTUlELlxuK1x0ICpcbitcdCAqIE9ubHkgdGhlIGxvdyBoYXJkd2FyZSBWTUlEIGJpdHMgbWF5IGJlIHdyaXR0ZW4gdG8gSEdBVFBcbitcdCAqIG9yIHVzZWQgYXMgYSBoYXJkd2FyZSBmZW5jZSBWTUlELlxuIFx0ICovXG4tXHR1bnNpZ25lZCBsb25nIHZtaWRfdmVyc2lvbjtcbi1cdHVuc2lnbmVkIGxvbmcgdm1pZDtcbitcdGF0b21pYzY0X3QgaWQ7XG4gfTtcbiBcbiB2b2lkIF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KHZvaWQpO1xuIHVuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHModm9pZCk7XG4rXG4raW50IF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfaW5pdCh2b2lkKTtcbit2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKHZvaWQpO1xuK1xuIGludCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaW5pdChzdHJ1Y3Qga3ZtICprdm0pO1xuK1xuK3Vuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodTY0IHZtaWQpO1xuK1xuIGJvb2wga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3Zlcl9jaGFuZ2VkKHN0cnVjdCBrdm1fdm1pZCAqdm1pZCk7XG4rXG4gdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7XG4gXG4rLypcbisgKiBJbnZhbGlkYXRlIHRoZSBjdXJyZW50IENQVSdzIGZhc3QtcGF0aCBWTUlEIHN0YXRlIHdoaWxlIHByZXNlcnZpbmdcbisgKiB0aGUgb2xkIGlkZW50aXR5IGNvbnNlcnZhdGl2ZWx5IGluIHJlc2VydmVkX3ZtaWRzLlxuKyAqL1xuK3ZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKHZvaWQpO1xuK1xuICNlbmRpZlxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL21haW4uYyBiL2FyY2gvcmlzY3Yva3ZtL21haW4uY1xuaW5kZXggODk1NjhjY2NlMDFkZS4uZDZjNmJlNGRmNjFiMSAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL21haW4uY1xuKysrIGIvYXJjaC9yaXNjdi9rdm0vbWFpbi5jXG5AQCAtMTYsNyArMTYsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fbmFjbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL3NiaS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV92Y3B1X3ZlY3Rvci5oXHUwMDNlXG4tXG4rI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV92bWlkLmhcdTAwM2VcbiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoYm9vbCwga3ZtX3Jpc2N2X3ZpcnR1YWxpemF0aW9uX2VuYWJsZWQpO1xuIFxuIERFRklORV9TVEFUSUNfS0VZX0ZBTFNFKGt2bV9yaXNjdl92c3N0YWdlX3RsYl9ub19ncGEpO1xuQEAgLTg0LDYgKzg0LDcgQEAgaW50IGt2bV9hcmNoX2VuYWJsZV92aXJ0dWFsaXphdGlvbl9jcHUodm9pZClcbiBcbiB2b2lkIGt2bV9hcmNoX2Rpc2FibGVfdmlydHVhbGl6YXRpb25fY3B1KHZvaWQpXG4ge1xuK1x0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKCk7XG4gXHRrdm1fcmlzY3ZfYWlhX2Rpc2FibGUoKTtcbiBcdGt2bV9yaXNjdl9jc3JfY2xlYW51cCgpO1xuIFx0a3ZtX3Jpc2N2X25hY2xfZGlzYWJsZSgpO1xuQEAgLTExMiw2ICsxMTMsNyBAQCBzdGF0aWMgaW50IGt2bV9yaXNjdl9jcHVfcG1fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nXG4gXHRcdCAqIGlzIGVuYWJsZWQgb24gdGhpcyBDUFUuXG4gXHRcdCAqL1xuIFx0XHRpZiAoX190aGlzX2NwdV9yZWFkKGt2bV9yaXNjdl92aXJ0dWFsaXphdGlvbl9lbmFibGVkKSkge1xuK1x0XHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9jcHVfaW52YWxpZGF0ZSgpO1xuIFx0XHRcdGt2bV9yaXNjdl9haWFfcG1fZW50ZXIoKTtcbiBcdFx0XHRrdm1fcmlzY3ZfY3NyX2NsZWFudXAoKTtcbiBcdFx0fVxuQEAgLTEzMCw2ICsxMzIsNyBAQCBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGt2bV9yaXNjdl9jcHVfcG1fbmIgPSB7XG4gc3RhdGljIHZvaWQga3ZtX3Jpc2N2X3RlYXJkb3duKHZvaWQpXG4ge1xuIFx0a3ZtX3Jpc2N2X2FpYV9leGl0KCk7XG4rXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfZnJlZSgpO1xuIFx0a3ZtX3Jpc2N2X25hY2xfZXhpdCgpO1xuIFx0a3ZtX3Jpc2N2X3ZfZXhpdCgpO1xuIFx0a3ZtX3VucmVnaXN0ZXJfcGVyZl9jYWxsYmFja3MoKTtcbkBAIC0xODEsOCArMTg0LDE1IEBAIHN0YXRpYyBpbnQgX19pbml0IHJpc2N2X2t2bV9pbml0KHZvaWQpXG4gXG4gXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KCk7XG4gXG4rXHRyYyA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19pbml0KCk7XG4rXHRpZiAocmMpIHtcbitcdFx0a3ZtX3Jpc2N2X25hY2xfZXhpdCgpO1xuK1x0XHRyZXR1cm4gcmM7XG4rXHR9XG4rXG4gXHRyYyA9IGt2bV9yaXNjdl9haWFfaW5pdCgpO1xuIFx0aWYgKHJjIFx1MDAyNlx1MDAyNiByYyAhPSAtRU5PREVWKSB7XG4rXHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKCk7XG4gXHRcdGt2bV9yaXNjdl9uYWNsX2V4aXQoKTtcbiBcdFx0cmV0dXJuIHJjO1xuIFx0fVxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL21tdS5jIGIvYXJjaC9yaXNjdi9rdm0vbW11LmNcbmluZGV4IDYwMzViNWVjOTUwMzkuLjNjOGZiNjAwOWMwYTUgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS9tbXUuY1xuKysrIGIvYXJjaC9yaXNjdi9rdm0vbW11LmNcbkBAIC0xNSw3ICsxNSw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQvc2lnbmFsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX21tdS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV9uYWNsLmhcdTAwM2Vcbi1cbisjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX3ZtaWQuaFx1MDAzZVxuIHN0YXRpYyBib29sIF9fcmVhZF9tb3N0bHkgZWFnZXJfcGFnZV9zcGxpdCA9IHRydWU7XG4gbW9kdWxlX3BhcmFtKGVhZ2VyX3BhZ2Vfc3BsaXQsIGJvb2wsIDA2NDQpO1xuIFxuQEAgLTc5OSwxMCArNzk5LDExIEBAIHZvaWQga3ZtX3Jpc2N2X21tdV9mcmVlX3BnZChzdHJ1Y3Qga3ZtICprdm0pXG4gdm9pZCBrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4ge1xuIFx0c3RydWN0IGt2bV9hcmNoICprYSA9IFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2g7XG4rXHR1NjQgdm1pZCA9IGF0b21pYzY0X3JlYWQoXHUwMDI2a2EtXHUwMDNldm1pZC5pZCk7XG4gXHR1bnNpZ25lZCBsb25nIGhnYXRwID0ga3ZtX3Jpc2N2X2dzdGFnZV9tb2RlKGthLVx1MDAzZXBnZF9sZXZlbHMpXG4gXHRcdFx0ICAgICAgXHUwMDNjXHUwMDNjIEhHQVRQX01PREVfU0hJRlQ7XG4gXG4tXHRoZ2F0cCB8PSAoUkVBRF9PTkNFKGthLVx1MDAzZXZtaWQudm1pZCkgXHUwMDNjXHUwMDNjIEhHQVRQX1ZNSURfU0hJRlQpIFx1MDAyNiBIR0FUUF9WTUlEO1xuK1x0aGdhdHAgfD0gKGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHZtaWQpIFx1MDAzY1x1MDAzYyBIR0FUUF9WTUlEX1NISUZUKSBcdTAwMjYgSEdBVFBfVk1JRDtcbiBcdGhnYXRwIHw9IChrYS1cdTAwM2VwZ2RfcGh5cyBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCkgXHUwMDI2IEhHQVRQX1BQTjtcbiBcbiBcdG5jc3Jfd3JpdGUoQ1NSX0hHQVRQLCBoZ2F0cCk7XG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdGxiLmMgYi9hcmNoL3Jpc2N2L2t2bS90bGIuY1xuaW5kZXggMmFlMzQ2MzJjZGNiMS4uYjg1ZTViYTIxOThhYSAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL3RsYi5jXG4rKysgYi9hcmNoL3Jpc2N2L2t2bS90bGIuY1xuQEAgLTIyNCw3ICsyMjQsNyBAQCB2b2lkIGt2bV9yaXNjdl9sb2NhbF90bGJfc2FuaXRpemUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0ICogZW50cmllcyBieSBWTUlEIHdoZW5ldmVyIHVuZGVybHlpbmcgSG9zdCBDUFUgY2hhbmdlcyBmb3IgYSBWQ1BVLlxuIFx0ICovXG4gXG4tXHR2bWlkID0gUkVBRF9PTkNFKHZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbitcdHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC5pZCkpO1xuIFx0a3ZtX3Jpc2N2X2xvY2FsX2hmZW5jZV9ndm1hX3ZtaWRfYWxsKHZtaWQpO1xuIFxuIFx0LypcbkBAIC0yNDQsNyArMjQ0LDcgQEAgdm9pZCBrdm1fcmlzY3ZfZmVuY2VfaV9wcm9jZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiB2b2lkIGt2bV9yaXNjdl90bGJfZmx1c2hfcHJvY2VzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4ge1xuIFx0c3RydWN0IGt2bV92bWlkICp2ID0gXHUwMDI2dmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkO1xuLVx0dW5zaWduZWQgbG9uZyB2bWlkID0gUkVBRF9PTkNFKHYtXHUwMDNldm1pZCk7XG4rXHR1bnNpZ25lZCBsb25nIHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNnYtXHUwMDNlaWQpKTtcbiBcbiBcdGlmIChrdm1fcmlzY3ZfbmFjbF9hdmFpbGFibGUoKSlcbiBcdFx0bmFjbF9oZmVuY2VfZ3ZtYV92bWlkX2FsbChuYWNsX3NobWVtKCksIHZtaWQpO1xuQEAgLTI1NSw3ICsyNTUsNyBAQCB2b2lkIGt2bV9yaXNjdl90bGJfZmx1c2hfcHJvY2VzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gdm9pZCBrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYWxsX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHtcbiBcdHN0cnVjdCBrdm1fdm1pZCAqdiA9IFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZDtcbi1cdHVuc2lnbmVkIGxvbmcgdm1pZCA9IFJFQURfT05DRSh2LVx1MDAzZXZtaWQpO1xuK1x0dW5zaWduZWQgbG9uZyB2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2LVx1MDAzZWlkKSk7XG4gXG4gXHRpZiAoa3ZtX3Jpc2N2X25hY2xfYXZhaWxhYmxlKCkpXG4gXHRcdG5hY2xfaGZlbmNlX3Z2bWFfYWxsKG5hY2xfc2htZW0oKSwgdm1pZCk7XG5AQCAtNTMxLDggKzUzMSwxMSBAQCB2b2lkIGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwoc3RydWN0IGt2bSAqa3ZtLFxuIFxuIGludCBrdm1fYXJjaF9mbHVzaF9yZW1vdGVfdGxic19yYW5nZShzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbiwgdTY0IG5yX3BhZ2VzKVxuIHtcbitcdHVuc2lnbmVkIGxvbmcgdm1pZCA9XG4rXHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXHUwMDI2a3ZtLVx1MDAzZWFyY2gudm1pZC5pZCkpO1xuK1xuIFx0a3ZtX3Jpc2N2X2hmZW5jZV9ndm1hX3ZtaWRfZ3BhKGt2bSwgLTFVTCwgMCxcbiBcdFx0XHRcdCAgICAgICBnZm4gXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQsIG5yX3BhZ2VzIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZULFxuLVx0XHRcdFx0ICAgICAgIFBBR0VfU0hJRlQsIFJFQURfT05DRShrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpKTtcbitcdFx0XHRcdCAgICAgICBQQUdFX1NISUZULCB2bWlkKTtcbiBcdHJldHVybiAwO1xuIH1cbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92Y3B1LmMgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1LmNcbmluZGV4IGUwNjJjYTE5ZjlkOGYuLjg1NTQyYzFhNWVjM2YgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS92Y3B1LmNcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHUuY1xuQEAgLTk0MywxNCArOTQzLDE0IEBAIGludCBrdm1fYXJjaF92Y3B1X2lvY3RsX3J1bihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gXHRcdFx0Y29udGludWU7XG4gXHRcdHJldCA9IDE7XG4gXG4tXHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUodmNwdSk7XG4tXG4gXHRcdHJldCA9IGt2bV9yaXNjdl9jaGVja192Y3B1X3JlcXVlc3RzKHZjcHUpO1xuIFx0XHRpZiAocmV0IFx1MDAzYz0gMClcbiBcdFx0XHRjb250aW51ZTtcbiBcbiBcdFx0cHJlZW1wdF9kaXNhYmxlKCk7XG4gXG4rXHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUodmNwdSk7XG4rXG4gXHRcdC8qIFVwZGF0ZSBBSUEgSFcgc3RhdGUgYmVmb3JlIGVudGVyaW5nIGd1ZXN0ICovXG4gXHRcdHJldCA9IGt2bV9yaXNjdl92Y3B1X2FpYV91cGRhdGUodmNwdSk7XG4gXHRcdGlmIChyZXQgXHUwMDNjPSAwKSB7XG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfcmVwbGFjZS5jIGIvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfcmVwbGFjZS5jXG5pbmRleCA1MDZhNTEwYjZiZmYzLi4xYmUzODZhNzhlMjdmIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfcmVwbGFjZS5jXG4rKysgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV9yZXBsYWNlLmNcbkBAIC0xMDQsNyArMTA0LDcgQEAgc3RhdGljIGludCBrdm1fc2JpX2V4dF9yZmVuY2VfaGFuZGxlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW5cbiBcdFx0a3ZtX3Jpc2N2X3ZjcHVfcG11X2luY3JfZncodmNwdSwgU0JJX1BNVV9GV19GRU5DRV9JX1NFTlQpO1xuIFx0XHRicmVhaztcbiBcdGNhc2UgU0JJX0VYVF9SRkVOQ0VfUkVNT1RFX1NGRU5DRV9WTUE6XG4tXHRcdHZtaWQgPSBSRUFEX09OQ0UodmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpO1xuK1x0XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdFx0aWYgKChjcC1cdTAwM2VhMiA9PSAwIFx1MDAyNlx1MDAyNiBjcC1cdTAwM2VhMyA9PSAwKSB8fCBjcC1cdTAwM2VhMyA9PSAtMVVMKVxuIFx0XHRcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwodmNwdS1cdTAwM2Vrdm0sIGhiYXNlLCBobWFzaywgdm1pZCk7XG4gXHRcdGVsc2VcbkBAIC0xMTMsNyArMTEzLDcgQEAgc3RhdGljIGludCBrdm1fc2JpX2V4dF9yZmVuY2VfaGFuZGxlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW5cbiBcdFx0a3ZtX3Jpc2N2X3ZjcHVfcG11X2luY3JfZncodmNwdSwgU0JJX1BNVV9GV19IRkVOQ0VfVlZNQV9TRU5UKTtcbiBcdFx0YnJlYWs7XG4gXHRjYXNlIFNCSV9FWFRfUkZFTkNFX1JFTU9URV9TRkVOQ0VfVk1BX0FTSUQ6XG4tXHRcdHZtaWQgPSBSRUFEX09OQ0UodmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpO1xuK1x0XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdFx0aWYgKChjcC1cdTAwM2VhMiA9PSAwIFx1MDAyNlx1MDAyNiBjcC1cdTAwM2VhMyA9PSAwKSB8fCBjcC1cdTAwM2VhMyA9PSAtMVVMKVxuIFx0XHRcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hc2lkX2FsbCh2Y3B1LVx1MDAzZWt2bSwgaGJhc2UsIGhtYXNrLFxuIFx0XHRcdFx0XHRcdCAgICAgICBjcC1cdTAwM2VhNCwgdm1pZCk7XG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfdjAxLmMgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuY1xuaW5kZXggZGU1NDRlYTNmMjhkYy4uY2EzZWZlNjNjMWNmMSAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jXG4rKysgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuY1xuQEAgLTg4LDE0ICs4OCwxNCBAQCBzdGF0aWMgaW50IGt2bV9zYmlfZXh0X3YwMV9oYW5kbGVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1bixcbiBcdFx0aWYgKGNwLVx1MDAzZWE3ID09IFNCSV9FWFRfMF8xX1JFTU9URV9GRU5DRV9JKVxuIFx0XHRcdGt2bV9yaXNjdl9mZW5jZV9pKHZjcHUtXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2spO1xuIFx0XHRlbHNlIGlmIChjcC1cdTAwM2VhNyA9PSBTQklfRVhUXzBfMV9SRU1PVEVfU0ZFTkNFX1ZNQSkge1xuLVx0XHRcdHZtaWQgPSBSRUFEX09OQ0UodmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpO1xuK1x0XHRcdHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC5pZCkpO1xuIFx0XHRcdGlmIChjcC1cdTAwM2VhMSA9PSAwIFx1MDAyNlx1MDAyNiBjcC1cdTAwM2VhMiA9PSAwKVxuIFx0XHRcdFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbCh2Y3B1LVx1MDAzZWt2bSwgaGJhc2UsIGhtYXNrLCB2bWlkKTtcbiBcdFx0XHRlbHNlXG4gXHRcdFx0XHRrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfZ3ZhKHZjcHUtXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2ssIGNwLVx1MDAzZWExLFxuIFx0XHRcdFx0XHRcdFx0ICBjcC1cdTAwM2VhMiwgUEFHRV9TSElGVCwgdm1pZCk7XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZCk7XG4rXHRcdFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXHUwMDI2dmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLmlkKSk7XG4gXHRcdFx0aWYgKGNwLVx1MDAzZWExID09IDAgXHUwMDI2XHUwMDI2IGNwLVx1MDAzZWEyID09IDApXG4gXHRcdFx0XHRrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYXNpZF9hbGwodmNwdS1cdTAwM2Vrdm0sIGhiYXNlLCBobWFzayxcbiBcdFx0XHRcdFx0XHRcdCAgICAgICBjcC1cdTAwM2VhMywgdm1pZCk7XG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdm1pZC5jIGIvYXJjaC9yaXNjdi9rdm0vdm1pZC5jXG5pbmRleCBjMTViZGIxZGQ4YmVmLi43Yjg2YTZmYmU0YTY5IDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdm1pZC5jXG4rKysgYi9hcmNoL3Jpc2N2L2t2bS92bWlkLmNcbkBAIC02LDExICs2LDE1IEBAXG4gICogICAgIEFudXAgUGF0ZWwgXHUwMDNjYW51cC5wYXRlbEB3ZGMuY29tXHUwMDNlXG4gICovXG4gXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYml0bWFwLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRvcHMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2NwdW1hc2suaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2Vycm5vLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9lcnIuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvcGVyY3B1LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9wcmVlbXB0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zbXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2t2bV9ob3N0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20vY3NyLmhcdTAwM2VcbkBAIC0xOCwyNiArMjIsNTQgQEBcbiAjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX3RsYi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV92bWlkLmhcdTAwM2VcbiBcbi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX3ZlcnNpb24gPSAxO1xuLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZtaWRfbmV4dDtcbitzdGF0aWMgYXRvbWljNjRfdCB2bWlkX2dlbmVyYXRpb247XG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgKnZtaWRfbWFwO1xuIHN0YXRpYyB1bnNpZ25lZCBsb25nIHZtaWRfYml0cyBfX3JvX2FmdGVyX2luaXQ7XG4tc3RhdGljIERFRklORV9TUElOTE9DSyh2bWlkX2xvY2spO1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nIHZtaWRfY3VyX2lkeCA9IDE7XG4rXG4rc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0sodm1pZF9sb2NrKTtcbitcbitzdGF0aWMgREVGSU5FX1BFUl9DUFUoYXRvbWljNjRfdCwgYWN0aXZlX3ZtaWRzKTtcbitzdGF0aWMgREVGSU5FX1BFUl9DUFUodTY0LCByZXNlcnZlZF92bWlkcyk7XG4rXG4rc3RhdGljIGNwdW1hc2tfdCB0bGJfZmx1c2hfcGVuZGluZztcbitcbisjZGVmaW5lIFZNSURfRklSU1RfVkVSU0lPTlx0QklUX1VMTCh2bWlkX2JpdHMpXG4rI2RlZmluZSBOVU1fVk1JRFNcdFx0QklUKHZtaWRfYml0cylcbisjZGVmaW5lIFZNSURfSFdfTUFTS1x0XHQoVk1JRF9GSVJTVF9WRVJTSU9OIC0gMSlcbitcbitzdGF0aWMgYm9vbCB2bWlkX2dlbl9tYXRjaCh1NjQgdm1pZClcbit7XG4rXHRyZXR1cm4gISgodm1pZCBeIGF0b21pYzY0X3JlYWQoXHUwMDI2dm1pZF9nZW5lcmF0aW9uKSkgXHUwMDNlXHUwMDNlIHZtaWRfYml0cyk7XG4rfVxuK1xuK3Vuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodTY0IHZtaWQpXG4re1xuK1x0aWYgKCF2bWlkX2JpdHMpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuICh1bnNpZ25lZCBsb25nKSh2bWlkIFx1MDAyNiBWTUlEX0hXX01BU0spO1xuK31cbiBcbiB2b2lkIF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KHZvaWQpXG4ge1xuLVx0LyogRmlndXJlLW91dCBudW1iZXIgb2YgVk1JRCBiaXRzIGluIEhXICovXG4rXHQvKiBGaWd1cmUgb3V0IHRoZSBudW1iZXIgb2YgVk1JRCBiaXRzIHN1cHBvcnRlZCBieSBoYXJkd2FyZS4gKi9cbiBcdGNzcl93cml0ZShDU1JfSEdBVFAsIChrdm1fcmlzY3ZfZ3N0YWdlX21vZGUoa3ZtX3Jpc2N2X2dzdGFnZV9tYXhfcGdkX2xldmVscykgXHUwMDNjXHUwMDNjXG4tXHRcdFx0ICAgICAgSEdBVFBfTU9ERV9TSElGVCkgfCBIR0FUUF9WTUlEKTtcbitcdFx0ICAgSEdBVFBfTU9ERV9TSElGVCkgfCBIR0FUUF9WTUlEKTtcbiBcdHZtaWRfYml0cyA9IGNzcl9yZWFkKENTUl9IR0FUUCk7XG4gXHR2bWlkX2JpdHMgPSAodm1pZF9iaXRzIFx1MDAyNiBIR0FUUF9WTUlEKSBcdTAwM2VcdTAwM2UgSEdBVFBfVk1JRF9TSElGVDtcbiBcdHZtaWRfYml0cyA9IGZsc19sb25nKHZtaWRfYml0cyk7XG4gXHRjc3Jfd3JpdGUoQ1NSX0hHQVRQLCAwKTtcbiBcbi1cdC8qIFdlIHBvbGx1dGVkIGxvY2FsIFRMQiBzbyBmbHVzaCBhbGwgZ3Vlc3QgVExCICovXG4rXHQvKiBGbHVzaCB0aGUgbG9jYWwgZ3Vlc3QgVExCIGFmdGVyIHByb2JpbmcgSEdBVFAuICovXG4gXHRrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfYWxsKCk7XG4gXG4tXHQvKiBXZSBkb24ndCB1c2UgVk1JRCBiaXRzIGlmIHRoZXkgYXJlIG5vdCBzdWZmaWNpZW50ICovXG4tXHRpZiAoKDFVTCBcdTAwM2NcdTAwM2Mgdm1pZF9iaXRzKSBcdTAwM2MgbnVtX3Bvc3NpYmxlX2NwdXMoKSlcbitcdC8qXG4rXHQgKiBWTUlEIDAgaXMgcmVzZXJ2ZWQuICBEdXJpbmcgcm9sbG92ZXIgZXZlcnkgcG9zc2libGUgQ1BVIG1heVxuK1x0ICogcmVzZXJ2ZSBvbmUgaGFyZHdhcmUgVk1JRCwgYW5kIHdlIHN0aWxsIG5lZWQgYXQgbGVhc3Qgb25lIFZNSURcbitcdCAqIGF2YWlsYWJsZSBmb3IgYSBuZXcgYWxsb2NhdGlvbi5cbitcdCAqL1xuK1x0aWYgKHZtaWRfYml0cyBcdTAwMjZcdTAwMjYgTlVNX1ZNSURTIC0gMSBcdTAwM2M9IG51bV9wb3NzaWJsZV9jcHVzKCkpXG4gXHRcdHZtaWRfYml0cyA9IDA7XG4gfVxuIFxuQEAgLTQ2LDgwICs3OCwyOTggQEAgdW5zaWduZWQgbG9uZyBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYml0cyh2b2lkKVxuIFx0cmV0dXJuIHZtaWRfYml0cztcbiB9XG4gXG4raW50IF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfaW5pdCh2b2lkKVxuK3tcbitcdGludCBjcHU7XG4rXG4rXHRpZiAoIXZtaWRfYml0cylcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHR2bWlkX21hcCA9IGJpdG1hcF96YWxsb2MoTlVNX1ZNSURTLCBHRlBfS0VSTkVMKTtcbitcdGlmICghdm1pZF9tYXApXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0dm1pZF9jdXJfaWR4ID0gMTtcbitcbitcdC8qIEhhcmR3YXJlIFZNSUQgMCBpcyByZXNlcnZlZC4gKi9cbitcdF9fc2V0X2JpdCgwLCB2bWlkX21hcCk7XG4rXG4rXHRhdG9taWM2NF9zZXQoXHUwMDI2dm1pZF9nZW5lcmF0aW9uLCBWTUlEX0ZJUlNUX1ZFUlNJT04pO1xuK1xuK1x0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xuK1x0XHRhdG9taWM2NF9zZXQoXHUwMDI2cGVyX2NwdShhY3RpdmVfdm1pZHMsIGNwdSksIDApO1xuK1x0XHRwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID0gMDtcbitcdH1cbitcbitcdC8qXG4rXHQgKiBFdmVyeSBDUFUgcGVyZm9ybXMgYW4gaW5pdGlhbCBsb2NhbCBpbnZhbGlkYXRpb24gYmVmb3JlIGl0c1xuK1x0ICogZmlyc3QgVk1JRCBhY3RpdmF0aW9uLlxuK1x0ICovXG4rXHRjcHVtYXNrX2NvcHkoXHUwMDI2dGxiX2ZsdXNoX3BlbmRpbmcsIGNwdV9wb3NzaWJsZV9tYXNrKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbit2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKHZvaWQpXG4re1xuK1x0Yml0bWFwX2ZyZWUodm1pZF9tYXApO1xuK1x0dm1pZF9tYXAgPSBOVUxMO1xuK31cbitcbiBpbnQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2luaXQoc3RydWN0IGt2bSAqa3ZtKVxuIHtcbi1cdC8qIE1hcmsgdGhlIGluaXRpYWwgVk1JRCBhbmQgVk1JRCB2ZXJzaW9uIGludmFsaWQgKi9cbi1cdGt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZF92ZXJzaW9uID0gMDtcbi1cdGt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZCA9IDA7XG4rXHRhdG9taWM2NF9zZXQoXHUwMDI2a3ZtLVx1MDAzZWFyY2gudm1pZC5pZCwgMCk7XG4gXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4gYm9vbCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQoc3RydWN0IGt2bV92bWlkICp2bWlkKVxuIHtcbitcdHU2NCBpZDtcbitcbiBcdGlmICghdm1pZF9iaXRzKVxuIFx0XHRyZXR1cm4gZmFsc2U7XG4gXG4tXHRyZXR1cm4gdW5saWtlbHkoUkVBRF9PTkNFKHZtaWQtXHUwMDNldm1pZF92ZXJzaW9uKSAhPVxuLVx0XHRcdFJFQURfT05DRSh2bWlkX3ZlcnNpb24pKTtcbitcdGlkID0gYXRvbWljNjRfcmVhZChcdTAwMjZ2bWlkLVx1MDAzZWlkKTtcbitcbitcdHJldHVybiB1bmxpa2VseSghdm1pZF9nZW5fbWF0Y2goaWQpKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgX19sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwodm9pZCAqaW5mbylcbisvKlxuKyAqIENhbGxlZCB3aXRoIHZtaWRfbG9jayBoZWxkIGFmdGVyIHZtaWRfZ2VuZXJhdGlvbiBoYXMgYWxyZWFkeSBiZWVuXG4rICogYWR2YW5jZWQuXG4rICpcbisgKiBObyByZW1vdGUgQ1BVIGlzIGludGVycnVwdGVkIGhlcmUuICBJbnN0ZWFkLCBwcmVzZXJ2ZSBldmVyeSBWTUlEXG4rICogd2hpY2ggbWF5IHN0aWxsIGJlIHVzZWQgYnkgYSBDUFUgYW5kIHF1ZXVlIGEgbG9jYWwgaW52YWxpZGF0aW9uIGZvclxuKyAqIHRoYXQgQ1BVJ3MgbmV4dCBWTUlEIGFjdGl2YXRpb24uXG4rICovXG4rc3RhdGljIHZvaWQgZmx1c2hfY29udGV4dCh2b2lkKVxuIHtcbi1cdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwoKTtcbitcdHU2NCB2bWlkO1xuK1x0aW50IGNwdTtcbitcbitcdGJpdG1hcF96ZXJvKHZtaWRfbWFwLCBOVU1fVk1JRFMpO1xuK1x0X19zZXRfYml0KDAsIHZtaWRfbWFwKTtcbitcbitcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHtcbitcdFx0dm1pZCA9IGF0b21pYzY0X3hjaGcoXHUwMDI2cGVyX2NwdShhY3RpdmVfdm1pZHMsIGNwdSksIDApO1xuK1xuK1x0XHQvKlxuK1x0XHQgKiBUaGUgQ1BVIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBjYXVnaHQgYnkgYW4gZWFybGllciByb2xsb3ZlclxuK1x0XHQgKiB3aXRob3V0IHBlcmZvcm1pbmcgYW5vdGhlciBhY3RpdmF0aW9uIHNpbmNlIHRoZW4uICBJbiB0aGF0XG4rXHRcdCAqIGNhc2UgcmVzZXJ2ZWRfdm1pZHMgaXMgdGhlIG9ubHkgcmVjb3JkIG9mIHRoZSBvbGQgY29udGV4dC5cbitcdFx0ICovXG4rXHRcdGlmICghdm1pZClcbitcdFx0XHR2bWlkID0gcGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KTtcbitcbitcdFx0aWYgKHZtaWQpXG4rXHRcdFx0X19zZXRfYml0KGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHZtaWQpLFxuK1x0XHRcdFx0ICB2bWlkX21hcCk7XG4rXG4rXHRcdHBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSkgPSB2bWlkO1xuK1x0fVxuK1xuK1x0Y3B1bWFza19jb3B5KFx1MDAyNnRsYl9mbHVzaF9wZW5kaW5nLCBjcHVfcG9zc2libGVfbWFzayk7XG4rfVxuK1xuKy8qXG4rICogVXBkYXRlIGV2ZXJ5IHJlc2VydmVkIGNvcHkgb2YgYW4gb2xkIHNvZnR3YXJlIFZNSUQuXG4rICpcbisgKiBEbyBub3Qgc3RvcCBhZnRlciB0aGUgZmlyc3QgbWF0Y2g6IHRoZSBzYW1lIFZNIG1heSBoYXZlIGJlZW4gYWN0aXZlXG4rICogb24gbW9yZSB0aGFuIG9uZSBDUFUgd2hlbiByb2xsb3ZlciBvY2N1cnJlZC5cbisgKi9cbitzdGF0aWMgYm9vbCBjaGVja191cGRhdGVfcmVzZXJ2ZWRfdm1pZCh1NjQgb2xkX3ZtaWQsIHU2NCBuZXdfdm1pZClcbit7XG4rXHRib29sIGhpdCA9IGZhbHNlO1xuK1x0aW50IGNwdTtcbitcbitcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHtcbitcdFx0aWYgKHBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSkgPT0gb2xkX3ZtaWQpIHtcbitcdFx0XHRwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID0gbmV3X3ZtaWQ7XG4rXHRcdFx0aGl0ID0gdHJ1ZTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0cmV0dXJuIGhpdDtcbit9XG4rXG4rLypcbisgKiBBbGxvY2F0ZS9wcm9tb3RlIGEgc29mdHdhcmUgVk1JRC5cbisgKlxuKyAqIHZtaWRfbG9jayBtdXN0IGJlIGhlbGQgYnkgdGhlIGNhbGxlci5cbisgKi9cbitzdGF0aWMgdTY0IG5ld192bWlkX2xvY2tlZChzdHJ1Y3Qga3ZtX3ZtaWQgKmt2bV92bWlkKVxuK3tcbitcdHU2NCB2bWlkID0gYXRvbWljNjRfcmVhZChcdTAwMjZrdm1fdm1pZC1cdTAwM2VpZCk7XG4rXHR1NjQgZ2VuZXJhdGlvbiA9IGF0b21pYzY0X3JlYWQoXHUwMDI2dm1pZF9nZW5lcmF0aW9uKTtcbitcdHU2NCBuZXdfdm1pZDtcbitcdHVuc2lnbmVkIGxvbmcgaWR4O1xuK1xuK1x0aWYgKHZtaWQpIHtcbitcdFx0bmV3X3ZtaWQgPSBnZW5lcmF0aW9uIHxcbitcdFx0XHQgICBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh2bWlkKTtcbitcbitcdFx0LypcbitcdFx0ICogVGhlIG9sZCBWTUlEIGlzIHN0aWxsIHByb3RlY3RlZCBieSBvbmUgb3IgbW9yZSBDUFVzLlxuK1x0XHQgKiBLZWVwIHRoZSBzYW1lIGhhcmR3YXJlIFZNSUQgYW5kIG9ubHkgcHJvbW90ZSBnZW5lcmF0aW9uLlxuK1x0XHQgKi9cbitcdFx0aWYgKGNoZWNrX3VwZGF0ZV9yZXNlcnZlZF92bWlkKHZtaWQsIG5ld192bWlkKSlcbitcdFx0XHRyZXR1cm4gbmV3X3ZtaWQ7XG4rXG4rXHRcdC8qXG4rXHRcdCAqIFRoZSBWTSBoYWQgYSBWTUlEIGluIGFuIG9sZGVyIGdlbmVyYXRpb24uICBSZXVzZSB0aGUgc2FtZVxuK1x0XHQgKiBoYXJkd2FyZSBudW1iZXIgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY2xhaW1lZC5cbitcdFx0ICovXG4rXHRcdGlkeCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHZtaWQpO1xuK1x0XHRpZiAoIV9fdGVzdF9hbmRfc2V0X2JpdChpZHgsIHZtaWRfbWFwKSlcbitcdFx0XHRyZXR1cm4gbmV3X3ZtaWQ7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogRmluZCBhIGZyZWUgVk1JRCBpbiB0aGUgY3VycmVudCBnZW5lcmF0aW9uLlxuK1x0ICovXG4rXHRpZHggPSBmaW5kX25leHRfemVyb19iaXQodm1pZF9tYXAsIE5VTV9WTUlEUywgdm1pZF9jdXJfaWR4KTtcbitcdGlmIChpZHggIT0gTlVNX1ZNSURTKVxuK1x0XHRnb3RvIHNldF92bWlkO1xuK1xuK1x0LypcbitcdCAqIE5vIGZyZWUgVk1JRC4gIFN0YXJ0IGEgbmV3IGdlbmVyYXRpb24sIHByZXNlcnZlIGFsbCBDUFUtbG9jYWxcbitcdCAqIHVzZXJzLCBhbmQgZGVmZXIgZWFjaCBDUFUncyBmbHVzaCB1bnRpbCBpdHMgbmV4dCBhY3RpdmF0aW9uLlxuK1x0ICovXG4rXHRnZW5lcmF0aW9uICs9IFZNSURfRklSU1RfVkVSU0lPTjtcbitcbitcdC8qIFNvZnR3YXJlIFZNSUQgMCBpcyByZXNlcnZlZCBhcyB0aGUgaW52YWxpZCBpZGVudGlmaWVyLiAqL1xuK1x0aWYgKHVubGlrZWx5KCFnZW5lcmF0aW9uKSlcbitcdFx0Z2VuZXJhdGlvbiA9IFZNSURfRklSU1RfVkVSU0lPTjtcbitcbitcdGF0b21pYzY0X3hjaGcoXHUwMDI2dm1pZF9nZW5lcmF0aW9uLCBnZW5lcmF0aW9uKTtcbitcdGZsdXNoX2NvbnRleHQoKTtcbitcbitcdC8qXG4rXHQgKiBOVU1fVk1JRFMgLSAxIFx1MDAzZSBudW1fcG9zc2libGVfY3B1cygpLCB0aGVyZWZvcmUgcm9sbG92ZXIgbXVzdFxuK1x0ICogbGVhdmUgYXQgbGVhc3Qgb25lIGFsbG9jYXRhYmxlIGhhcmR3YXJlIFZNSUQuXG4rXHQgKi9cbitcdGlkeCA9IGZpbmRfbmV4dF96ZXJvX2JpdCh2bWlkX21hcCwgTlVNX1ZNSURTLCAxKTtcbitcbitzZXRfdm1pZDpcbitcdF9fc2V0X2JpdChpZHgsIHZtaWRfbWFwKTtcbitcdHZtaWRfY3VyX2lkeCA9IGlkeDtcbitcbitcdHJldHVybiBnZW5lcmF0aW9uIHwgaWR4O1xuIH1cbiBcbiB2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHtcbi1cdHVuc2lnbmVkIGxvbmcgaTtcbitcdHN0cnVjdCBrdm1fdm1pZCAqa3ZtX3ZtaWQgPSBcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQ7XG4rXHRhdG9taWM2NF90ICphY3RpdmU7XG4gXHRzdHJ1Y3Qga3ZtX3ZjcHUgKnY7XG4tXHRzdHJ1Y3Qga3ZtX3ZtaWQgKnZtaWQgPSBcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQ7XG4rXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xuK1x0dTY0IHZtaWQ7XG4rXHR1NjQgb2xkX2FjdGl2ZV92bWlkO1xuK1x0dW5zaWduZWQgbG9uZyBpO1xuK1x0dW5zaWduZWQgaW50IGNwdTtcbitcdGJvb2wgdm1pZF9jaGFuZ2VkID0gZmFsc2U7XG4gXG4tXHRpZiAoIWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF92ZXJfY2hhbmdlZCh2bWlkKSlcbitcdGlmICghdm1pZF9iaXRzKVxuIFx0XHRyZXR1cm47XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2dm1pZF9sb2NrKTtcbitcdC8qXG4rXHQgKiBhY3RpdmVfdm1pZHMgYW5kIHRsYl9mbHVzaF9wZW5kaW5nIGFyZSBwZXItQ1BVIGFkbWlzc2lvbiBzdGF0ZS5cbitcdCAqIFRoZXkgbXVzdCByZWZlciB0byB0aGUgc2FtZSBDUFUgZm9yIHRoZSBjb21wbGV0ZSBhY3RpdmF0aW9uLlxuK1x0ICovXG4rXHRwcmVlbXB0X2Rpc2FibGUoKTtcbitcbitcdGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTtcbitcdGFjdGl2ZSA9IHRoaXNfY3B1X3B0cihcdTAwMjZhY3RpdmVfdm1pZHMpO1xuK1xuK1x0dm1pZCA9IGF0b21pYzY0X3JlYWQoXHUwMDI2a3ZtX3ZtaWQtXHUwMDNlaWQpO1xuK1x0b2xkX2FjdGl2ZV92bWlkID0gYXRvbWljNjRfcmVhZChhY3RpdmUpO1xuIFxuIFx0Lypcbi1cdCAqIFdlIG5lZWQgdG8gcmUtY2hlY2sgdGhlIHZtaWRfdmVyc2lvbiBoZXJlIHRvIGVuc3VyZSB0aGF0IGlmXG4tXHQgKiBhbm90aGVyIHZjcHUgYWxyZWFkeSBhbGxvY2F0ZWQgYSB2YWxpZCB2bWlkIGZvciB0aGlzIHZtLlxuK1x0ICogRmFzdCBwYXRoLlxuK1x0ICpcbitcdCAqIFRoZSBjbXB4Y2hnIHJhY2VzIHdpdGggZmx1c2hfY29udGV4dCgpJ3MgeGNoZyBvbiB0aGUgc2FtZVxuK1x0ICogcGVyLUNQVSBhdG9taWMuICBFaXRoZXIgdGhpcyBhY3RpdmF0aW9uIGlzIGNhcHR1cmVkIGJ5IHJvbGxvdmVyLFxuK1x0ICogb3Igcm9sbG92ZXIgY2xlYXJzIGFjdGl2ZSBmaXJzdCBhbmQgdGhlIGNtcHhjaGcgZmFpbHMuXG4gXHQgKi9cbi1cdGlmICgha3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3Zlcl9jaGFuZ2VkKHZtaWQpKSB7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnZtaWRfbG9jayk7XG4tXHRcdHJldHVybjtcbitcdGlmIChvbGRfYWN0aXZlX3ZtaWQgXHUwMDI2XHUwMDI2XG4rXHQgICAgdm1pZF9nZW5fbWF0Y2godm1pZCkgXHUwMDI2XHUwMDI2XG4rXHQgICAgYXRvbWljNjRfY21weGNoZyhhY3RpdmUsIG9sZF9hY3RpdmVfdm1pZCwgdm1pZCkgPT1cbitcdCAgICBvbGRfYWN0aXZlX3ZtaWQpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0cmF3X3NwaW5fbG9ja19pcnFzYXZlKFx1MDAyNnZtaWRfbG9jaywgZmxhZ3MpO1xuK1xuK1x0LypcbitcdCAqIFJlLXJlYWQgdW5kZXIgdGhlIGFsbG9jYXRvciBsb2NrIGJlY2F1c2UgYW5vdGhlciB2Q1BVIG9mIHRoaXMgVk1cbitcdCAqIG1heSBhbHJlYWR5IGhhdmUgcHJvbW90ZWQgb3IgYWxsb2NhdGVkIHRoZSBzaGFyZWQgVk1JRC5cbitcdCAqL1xuK1x0dm1pZCA9IGF0b21pYzY0X3JlYWQoXHUwMDI2a3ZtX3ZtaWQtXHUwMDNlaWQpO1xuK1xuK1x0aWYgKCF2bWlkX2dlbl9tYXRjaCh2bWlkKSkge1xuK1x0XHR2bWlkID0gbmV3X3ZtaWRfbG9ja2VkKGt2bV92bWlkKTtcbitcdFx0YXRvbWljNjRfc2V0KFx1MDAyNmt2bV92bWlkLVx1MDAzZWlkLCB2bWlkKTtcbitcdFx0dm1pZF9jaGFuZ2VkID0gdHJ1ZTtcbiBcdH1cbiBcbi1cdC8qIEZpcnN0IHVzZXIgb2YgYSBuZXcgVk1JRCB2ZXJzaW9uPyAqL1xuLVx0aWYgKHVubGlrZWx5KHZtaWRfbmV4dCA9PSAwKSkge1xuLVx0XHRXUklURV9PTkNFKHZtaWRfdmVyc2lvbiwgUkVBRF9PTkNFKHZtaWRfdmVyc2lvbikgKyAxKTtcbi1cdFx0dm1pZF9uZXh0ID0gMTtcbitcdC8qXG4rXHQgKiBFdmVuIGlmIGFub3RoZXIgdkNQVSBhbHJlYWR5IHVwZGF0ZWQgdGhlIHNoYXJlZCBWTUlELCB0aGlzIENQVVxuK1x0ICogbXVzdCBzdGlsbCBkaXNjaGFyZ2UgaXRzIG93biByb2xsb3ZlciBmbHVzaCBvYmxpZ2F0aW9uLlxuK1x0ICovXG4rXHRpZiAoY3B1bWFza190ZXN0X2FuZF9jbGVhcl9jcHUoY3B1LCBcdTAwMjZ0bGJfZmx1c2hfcGVuZGluZykpXG4rXHRcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwoKTtcbiBcbi1cdFx0Lypcbi1cdFx0ICogV2UgcmFuIG91dCBvZiBWTUlEcyBzbyB3ZSBpbmNyZW1lbnQgdm1pZF92ZXJzaW9uIGFuZFxuLVx0XHQgKiBzdGFydCBhc3NpZ25pbmcgVk1JRHMgZnJvbSAxLlxuLVx0XHQgKlxuLVx0XHQgKiBUaGlzIGFsc28gbWVhbnMgZXhpc3RpbmcgVk1JRHMgYXNzaWdubWVudCB0byBhbGwgR3Vlc3Rcbi1cdFx0ICogaW5zdGFuY2VzIGlzIGludmFsaWQgYW5kIHdlIGhhdmUgZm9yY2UgVk1JRCByZS1hc3NpZ25lbWVudFxuLVx0XHQgKiBmb3IgYWxsIEd1ZXN0IGluc3RhbmNlcy4gVGhlIEd1ZXN0IGluc3RhbmNlcyB0aGF0IHdlcmUgbm90XG4tXHRcdCAqIHJ1bm5pbmcgd2lsbCBhdXRvbWF0aWNhbGx5IHBpY2stdXAgbmV3IFZNSURzIGJlY2F1c2Ugd2lsbFxuLVx0XHQgKiBjYWxsIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoKSB3aGVuZXZlciB0aGV5IGVudGVyXG4tXHRcdCAqIGluLWtlcm5lbCBydW4gbG9vcC4gRm9yIEd1ZXN0IGluc3RhbmNlcyB0aGF0IGFyZSBhbHJlYWR5XG4tXHRcdCAqIHJ1bm5pbmcsIHdlIGZvcmNlIFZNIGV4aXRzIG9uIGFsbCBob3N0IENQVXMgdXNpbmcgSVBJIGFuZFxuLVx0XHQgKiBmbHVzaCBhbGwgR3Vlc3QgVExCcy5cbi1cdFx0ICovXG4tXHRcdG9uX2VhY2hfY3B1X21hc2soY3B1X29ubGluZV9tYXNrLCBfX2xvY2FsX2hmZW5jZV9ndm1hX2FsbCxcbi1cdFx0XHRcdCBOVUxMLCAxKTtcbitcdC8qXG4rXHQgKiBQdWJsaXNoIHRoZSBDUFUtbG9jYWwgYWN0aXZlIGlkZW50aXR5IG9ubHkgYWZ0ZXIgdGhlIHJlcXVpcmVkXG4rXHQgKiBsb2NhbCBpbnZhbGlkYXRpb24gaXMgY29tcGxldGUuXG4rXHQgKi9cbitcdGF0b21pYzY0X3NldChhY3RpdmUsIHZtaWQpO1xuK1xuK1x0cmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoXHUwMDI2dm1pZF9sb2NrLCBmbGFncyk7XG4rXG4rXHQvKlxuK1x0ICogQSBuZXcgc29mdHdhcmUgVk1JRCBtYXkgY29udGFpbiBhIGRpZmZlcmVudCBoYXJkd2FyZSBWTUlELCBzb1xuK1x0ICogcmVxdWVzdCBhbiBIR0FUUCB1cGRhdGUgZm9yIGV2ZXJ5IHZDUFUgaW4gdGhlIFZNLlxuK1x0ICovXG4rXHRpZiAodm1pZF9jaGFuZ2VkKSB7XG4rXHRcdGt2bV9mb3JfZWFjaF92Y3B1KGksIHYsIHZjcHUtXHUwMDNla3ZtKVxuK1x0XHRcdGt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9VUERBVEVfSEdBVFAsIHYpO1xuIFx0fVxuIFxuLVx0dm1pZC1cdTAwM2V2bWlkID0gdm1pZF9uZXh0O1xuLVx0dm1pZF9uZXh0Kys7XG4tXHR2bWlkX25leHQgXHUwMDI2PSAoMSBcdTAwM2NcdTAwM2Mgdm1pZF9iaXRzKSAtIDE7XG4rb3V0OlxuK1x0cHJlZW1wdF9lbmFibGUoKTtcbit9XG4rXG4rLypcbisgKiBDUFUgdmlydHVhbGl6YXRpb24vQ1NSIHN0YXRlIGlzIGJlaW5nIGRpc2NhcmRlZC5cbisgKlxuKyAqIFdpdGhkcmF3IGZhc3QtcGF0aCBlbGlnaWJpbGl0eSwgYnV0IGNvbnNlcnZhdGl2ZWx5IHByZXNlcnZlIHRoZSBsYXN0XG4rICogaWRlbnRpdHkgaW5zdGVhZCBvZiBtYWtpbmcgaXRzIGhhcmR3YXJlIFZNSUQgaW1tZWRpYXRlbHkgcmV1c2FibGUuXG4rICovXG4rdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfY3B1X2ludmFsaWRhdGUodm9pZClcbit7XG4rXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xuK1x0dTY0IHZtaWQ7XG4rXHR1bnNpZ25lZCBpbnQgY3B1O1xuIFxuLVx0V1JJVEVfT05DRSh2bWlkLVx1MDAzZXZtaWRfdmVyc2lvbiwgUkVBRF9PTkNFKHZtaWRfdmVyc2lvbikpO1xuK1x0aWYgKCF2bWlkX2JpdHMpXG4rXHRcdHJldHVybjtcbiBcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnZtaWRfbG9jayk7XG4rXHRsb2NrZGVwX2Fzc2VydF9wcmVlbXB0aW9uX2Rpc2FibGVkKCk7XG4rXG4rXHRjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7XG4rXG4rXHRyYXdfc3Bpbl9sb2NrX2lycXNhdmUoXHUwMDI2dm1pZF9sb2NrLCBmbGFncyk7XG4rXG4rXHR2bWlkID0gYXRvbWljNjRfeGNoZyh0aGlzX2NwdV9wdHIoXHUwMDI2YWN0aXZlX3ZtaWRzKSwgMCk7XG4rXG4rXHRpZiAodm1pZClcbitcdFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IHZtaWQ7XG4rXG4rXHQvKlxuK1x0ICogSWYgYWN0aXZlIHdhcyBhbHJlYWR5IHplcm8sIHJldGFpbiB0aGUgb2xkIHJlc2VydmVkIGVudHJ5LlxuK1x0ICovXG4rXHRjcHVtYXNrX3NldF9jcHUoY3B1LCBcdTAwMjZ0bGJfZmx1c2hfcGVuZGluZyk7XG4gXG4tXHQvKiBSZXF1ZXN0IEctc3RhZ2UgcGFnZSB0YWJsZSB1cGRhdGUgZm9yIGFsbCBWQ1BVcyAqL1xuLVx0a3ZtX2Zvcl9lYWNoX3ZjcHUoaSwgdiwgdmNwdS1cdTAwM2Vrdm0pXG4tXHRcdGt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9VUERBVEVfSEdBVFAsIHYpO1xuK1x0cmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoXHUwMDI2dm1pZF9sb2NrLCBmbGFncyk7XG4gfVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMTc6NTA6MjUuNjQxMDA1NTYzWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjAxNzc0NjkxNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiBQYXRjaCBBcHBsaWNhYmlsaXR5IGZvciBGdXp6aW5nKipcblxuT2theSwgbGV0J3Mgc2VlLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIHBhdGNoIHRvdWNoZXMgYW5kIHdoZXRoZXIgaXQncyByZWxldmFudCBmb3IgZnV6emluZyBvbiBvdXIgdGFyZ2V0IGFyY2hpdGVjdHVyZSwgd2hpY2ggaXMgYGFtZDY0YC4gSSBzZWUgdGhhdCB0aGUgcGF0Y2ggbW9kaWZpZXMgZmlsZXMgZXhjbHVzaXZlbHkgd2l0aGluIHRoZSBgYXJjaC9yaXNjdi9gIGRpcmVjdG9yeS4gU3BlY2lmaWNhbGx5LCBpdCBpbnZvbHZlcyBjaGFuZ2VzIHRvIGBrdm1fZ3N0YWdlLmhgLCBga3ZtX3ZtaWQuaGAsIGBtYWluLmNgLCBgbW11LmNgLCBgdGxiLmNgLCBgdmNwdS5jYCwgYHZjcHVfc2JpX3JlcGxhY2UuY2AsIGB2Y3B1X3NiaV92MDEuY2AsIGFuZCBgdm1pZC5jYCDigJMgYWxsIFJJU0MtViBLVk0gaW1wbGVtZW50YXRpb24gZGV0YWlscy5cblxuTm93LCBJIHJlY2FsbCB0aGUgcnVsZXMuIFdlIG9ubHkgKmRvbid0KiBmdXp6IGlmIHRoZSBjaGFuZ2VzIGZhbGwgaW50byBjZXJ0YWluIGNhdGVnb3JpZXMuIFRoZSByZWxldmFudCBydWxlIGhlcmUgaXMgYWJvdXQgdW5yZWFjaGFibGUgY29kZSBwYXRocywgc3BlY2lmaWNhbGx5IGNvZGUgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiBvdXIgdGFyZ2V0LiBBbmQgdGhhdCdzIHByZWNpc2VseSB3aGF0IHdlIGhhdmUuIFRoZXNlIFJJU0MtViBzcGVjaWZpYyBmaWxlcyBhcmUgZGVmaW5pdGVseSBub3QgZ29pbmcgdG8gYmUgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gYGFtZDY0YC4gVGhleSdyZSBjb21wbGV0ZWx5IGlzb2xhdGVkIHRvIHRoZSBSSVNDLVYgYXJjaGl0ZWN0dXJlLiBJJ20gZ29pbmcgdG8gZG91YmxlLWNoZWNrIHRoYXQgYnkgbGlzdGluZyBhbGwgdGhlIGZpbGVzOlxuXG4xLiAgYGFyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oYFxuMi4gIGBhcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmhgXG4zLiAgYGFyY2gvcmlzY3Yva3ZtL21haW4uY2BcbjQuICBgYXJjaC9yaXNjdi9rdm0vbW11LmNgXG41LiAgYGFyY2gvcmlzY3Yva3ZtL3RsYi5jYFxuNi4gIGBhcmNoL3Jpc2N2L2t2bS92Y3B1LmNgXG43LiAgYGFyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY2BcbjguICBgYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfdjAxLmNgXG45LiAgYGFyY2gvcmlzY3Yva3ZtL3ZtaWQuY2BcblxuWWVzLCBhbGwgbmluZSBmaWxlcyBhcmUgdW5kZW5pYWJseSB3aXRoaW4gYGFyY2gvcmlzY3YvYC4gT24gYGFtZDY0YCwgdGhlc2UgZmlsZXMgd2lsbCByZW1haW4gdW50b3VjaGVkLCBub3QgYnVpbHQsIGFuZCBjb21wbGV0ZWx5IHVucmVhY2hhYmxlLlxuXG5UaGVyZWZvcmUsIHRoZSB2ZXJkaWN0IGlzIGNsZWFyLiBUaGlzIHBhdGNoIGlzIGlycmVsZXZhbnQgZm9yIGZ1enppbmcgb24gYGFtZDY0YC4gYFdvcnRoRnV6emluZ2AgaXMgYGZhbHNlYC4gVGhlcmUgYXJlIG5vIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIHRvIGVuYWJsZSwgbm9yIGFueSBzcGVjaWZpYyBzeW1ib2xzIHRoYXQgYXJlIHVzZWZ1bCwgc28gYEVuYWJsZUNvbmZpZ3NgIGFuZCBgRm9jdXNTeW1ib2xzYCBhcmUgZW1wdHkuIFRoZSByZWFzb25pbmcgaXMgc29saWQ6IHRoZSBjaGFuZ2VzIGFyZSBSSVNDLVYgc3BlY2lmaWMsIGFuZCB0aGF0J3Mgbm90IG91ciB0YXJnZXQuXG5cbkknbSBjb21mb3J0YWJsZSB3aXRoIHRoaXMuIEl0J3MgYSBzdHJhaWdodGZvcndhcmQgY2FzZS4gTGV0J3MgZG8gYSBxdWljayBmaW5hbCBjaGVjay4uLiB5ZXAsIGV2ZXJ5dGhpbmcgbG9va3MgZ29vZC4gTm93LCBsZXQncyBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExODIxLCJPdXRwdXRUb2tlbnMiOjgzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjQ5LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMTc6NTA6MzEuNjU4NzU1NDk3WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjkzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW10sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIkFsbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBzdHJpY3RseSBjb25maW5lZCB0byB0aGUgUklTQy1WIGFyY2hpdGVjdHVyZSAoYXJjaC9yaXNjdi8pLCBzcGVjaWZpY2FsbHkgdGhlIFJJU0MtViBLVk0gU3RhZ2UtMiBWTUlEIG1hbmFnZW1lbnQuIFRoZXkgY2Fubm90IGJlIGJ1aWx0IG9yIGV4ZWN1dGVkIG9uIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIChhbWQ2NCkuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIkFsbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBzdHJpY3RseSBjb25maW5lZCB0byB0aGUgUklTQy1WIGFyY2hpdGVjdHVyZSAoYXJjaC9yaXNjdi8pLCBzcGVjaWZpY2FsbHkgdGhlIFJJU0MtViBLVk0gU3RhZ2UtMiBWTUlEIG1hbmFnZW1lbnQuIFRoZXkgY2Fubm90IGJlIGJ1aWx0IG9yIGV4ZWN1dGVkIG9uIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIChhbWQ2NCkuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQxNzo1MDozMS42NTg3NzYwNDdaIiwiU2VxIjo1LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjM3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },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-workflowdxljz[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-10 17:31:56 +0000 UTC FinishedAt: 2026-09-10 17:50:32 +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+CgkJCTx0ZD4yMDI2LzA5LzEwIDE3OjUwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtBbGwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgc3RyaWN0bHkgY29uZmluZWQgdG8gdGhlIFJJU0MtViBhcmNoaXRlY3R1cmUgKGFyY2gvcmlzY3YvKSwgc3BlY2lmaWNhbGx5IHRoZSBSSVNDLVYgS1ZNIFN0YWdlLTIgVk1JRCBtYW5hZ2VtZW50LiBUaGV5IGNhbm5vdCBiZSBidWlsdCBvciBleGVjdXRlZCBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSAoYW1kNjQpLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAxNzo1MDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDVmYzM1Y2NjNWM3ZDlkNGM3MzQ5NGI1NDhjODhkZTg1ZmRlMzQ4YzRcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IFNlcCAxMCAxNzo1MDoyNCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9nc3RhZ2UuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oXG5pbmRleCBhYWYwODBiYTFiNzdhLi5jNjFhMWJiYjI3MmY0IDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oXG5AQCAtOCw3ICYjNDM7OCw3IEBAXG4gI2RlZmluZSBfX1JJU0NWX0tWTV9HU1RBR0VfSF9cbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rdm1fdHlwZXMuaFx1MDAzZVxuLVxuJiM0MzsjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX3ZtaWQuaFx1MDAzZVxuIHN0cnVjdCBrdm1fZ3N0YWdlIHtcbiBcdHN0cnVjdCBrdm0gKmt2bTtcbiBcdHVuc2lnbmVkIGxvbmcgZmxhZ3M7XG5AQCAtMTA4LDcgJiM0MzsxMDgsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV9pbml0KHN0cnVjdCBrdm1fZ3N0YWdlICpnc3RhZ2UsIHN0cnVjdCBrdm0gKlxuIHtcbiBcdGdzdGFnZS1cdTAwM2Vrdm0gPSBrdm07XG4gXHRnc3RhZ2UtXHUwMDNlZmxhZ3MgPSAwO1xuLVx0Z3N0YWdlLVx1MDAzZXZtaWQgPSBSRUFEX09OQ0Uoa3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbiYjNDM7XHRnc3RhZ2UtXHUwMDNldm1pZCA9XG4mIzQzO1x0XHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNmt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdGdzdGFnZS1cdTAwM2VwZ2QgPSBrdm0tXHUwMDNlYXJjaC5wZ2Q7XG4gXHRnc3RhZ2UtXHUwMDNlcGdkX2xldmVscyA9IGt2bS1cdTAwM2VhcmNoLnBnZF9sZXZlbHM7XG4gfVxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaFxuaW5kZXggZGI2MWIwNTI1YThkMC4uZGRkN2NjMTI1YzNmNiAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaFxuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fdm1pZC5oXG5AQCAtNiwyMSAmIzQzOzYsNDIgQEBcbiAjaWZuZGVmIF9fUklTQ1ZfS1ZNX1ZNSURfSF9cbiAjZGVmaW5lIF9fUklTQ1ZfS1ZNX1ZNSURfSF9cbiBcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYXRvbWljLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rdm1fdHlwZXMuaFx1MDAzZVxuIFxuIHN0cnVjdCBrdm1fdm1pZCB7XG4gXHQvKlxuLVx0ICogV3JpdGVzIHRvIHZtaWRfdmVyc2lvbiBhbmQgdm1pZCBoYXBwZW4gd2l0aCB2bWlkX2xvY2sgaGVsZFxuLVx0ICogd2hlcmVhcyByZWFkcyBoYXBwZW4gd2l0aG91dCBhbnkgbG9jayBoZWxkLlxuJiM0MztcdCAqIFNvZnR3YXJlIFZNSUQ6XG4mIzQzO1x0ICpcbiYjNDM7XHQgKiAgIFsgZ2VuZXJhdGlvbiB8IGhhcmR3YXJlIFZNSUQgXVxuJiM0MztcdCAqXG4mIzQzO1x0ICogS2VlcCB0aGUgaWRlbnRpdHkgNjQtYml0IG9uIFJWMzIgc28gdGhhdCB0aGUgZ2VuZXJhdGlvbiBkb2VzIG5vdFxuJiM0MztcdCAqIHdyYXAgYXQgdGhlIG5hdGl2ZSB3b3JkIHNpemUuICBaZXJvIGRlbm90ZXMgYW4gdW5hbGxvY2F0ZWQgVk1JRC5cbiYjNDM7XHQgKlxuJiM0MztcdCAqIE9ubHkgdGhlIGxvdyBoYXJkd2FyZSBWTUlEIGJpdHMgbWF5IGJlIHdyaXR0ZW4gdG8gSEdBVFBcbiYjNDM7XHQgKiBvciB1c2VkIGFzIGEgaGFyZHdhcmUgZmVuY2UgVk1JRC5cbiBcdCAqL1xuLVx0dW5zaWduZWQgbG9uZyB2bWlkX3ZlcnNpb247XG4tXHR1bnNpZ25lZCBsb25nIHZtaWQ7XG4mIzQzO1x0YXRvbWljNjRfdCBpZDtcbiB9O1xuIFxuIHZvaWQgX19pbml0IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9kZXRlY3Qodm9pZCk7XG4gdW5zaWduZWQgbG9uZyBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYml0cyh2b2lkKTtcbiYjNDM7XG4mIzQzO2ludCBfX2luaXQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2luaXQodm9pZCk7XG4mIzQzO3ZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2ZyZWUodm9pZCk7XG4mIzQzO1xuIGludCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaW5pdChzdHJ1Y3Qga3ZtICprdm0pO1xuJiM0MztcbiYjNDM7dW5zaWduZWQgbG9uZyBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh1NjQgdm1pZCk7XG4mIzQzO1xuIGJvb2wga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3Zlcl9jaGFuZ2VkKHN0cnVjdCBrdm1fdm1pZCAqdm1pZCk7XG4mIzQzO1xuIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpO1xuIFxuJiM0MzsvKlxuJiM0MzsgKiBJbnZhbGlkYXRlIHRoZSBjdXJyZW50IENQVSYjMzk7cyBmYXN0LXBhdGggVk1JRCBzdGF0ZSB3aGlsZSBwcmVzZXJ2aW5nXG4mIzQzOyAqIHRoZSBvbGQgaWRlbnRpdHkgY29uc2VydmF0aXZlbHkgaW4gcmVzZXJ2ZWRfdm1pZHMuXG4mIzQzOyAqL1xuJiM0Mzt2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9jcHVfaW52YWxpZGF0ZSh2b2lkKTtcbiYjNDM7XG4gI2VuZGlmXG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vbWFpbi5jIGIvYXJjaC9yaXNjdi9rdm0vbWFpbi5jXG5pbmRleCA4OTU2OGNjY2UwMWRlLi5kNmM2YmU0ZGY2MWIxIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vbWFpbi5jXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2t2bS9tYWluLmNcbkBAIC0xNiw3ICYjNDM7MTYsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fbmFjbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL3NiaS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV92Y3B1X3ZlY3Rvci5oXHUwMDNlXG4tXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fdm1pZC5oXHUwMDNlXG4gc3RhdGljIERFRklORV9QRVJfQ1BVKGJvb2wsIGt2bV9yaXNjdl92aXJ0dWFsaXphdGlvbl9lbmFibGVkKTtcbiBcbiBERUZJTkVfU1RBVElDX0tFWV9GQUxTRShrdm1fcmlzY3ZfdnNzdGFnZV90bGJfbm9fZ3BhKTtcbkBAIC04NCw2ICYjNDM7ODQsNyBAQCBpbnQga3ZtX2FyY2hfZW5hYmxlX3ZpcnR1YWxpemF0aW9uX2NwdSh2b2lkKVxuIFxuIHZvaWQga3ZtX2FyY2hfZGlzYWJsZV92aXJ0dWFsaXphdGlvbl9jcHUodm9pZClcbiB7XG4mIzQzO1x0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKCk7XG4gXHRrdm1fcmlzY3ZfYWlhX2Rpc2FibGUoKTtcbiBcdGt2bV9yaXNjdl9jc3JfY2xlYW51cCgpO1xuIFx0a3ZtX3Jpc2N2X25hY2xfZGlzYWJsZSgpO1xuQEAgLTExMiw2ICYjNDM7MTEzLDcgQEAgc3RhdGljIGludCBrdm1fcmlzY3ZfY3B1X3BtX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZ1xuIFx0XHQgKiBpcyBlbmFibGVkIG9uIHRoaXMgQ1BVLlxuIFx0XHQgKi9cbiBcdFx0aWYgKF9fdGhpc19jcHVfcmVhZChrdm1fcmlzY3ZfdmlydHVhbGl6YXRpb25fZW5hYmxlZCkpIHtcbiYjNDM7XHRcdFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKCk7XG4gXHRcdFx0a3ZtX3Jpc2N2X2FpYV9wbV9lbnRlcigpO1xuIFx0XHRcdGt2bV9yaXNjdl9jc3JfY2xlYW51cCgpO1xuIFx0XHR9XG5AQCAtMTMwLDYgJiM0MzsxMzIsNyBAQCBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGt2bV9yaXNjdl9jcHVfcG1fbmIgPSB7XG4gc3RhdGljIHZvaWQga3ZtX3Jpc2N2X3RlYXJkb3duKHZvaWQpXG4ge1xuIFx0a3ZtX3Jpc2N2X2FpYV9leGl0KCk7XG4mIzQzO1x0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2ZyZWUoKTtcbiBcdGt2bV9yaXNjdl9uYWNsX2V4aXQoKTtcbiBcdGt2bV9yaXNjdl92X2V4aXQoKTtcbiBcdGt2bV91bnJlZ2lzdGVyX3BlcmZfY2FsbGJhY2tzKCk7XG5AQCAtMTgxLDggJiM0MzsxODQsMTUgQEAgc3RhdGljIGludCBfX2luaXQgcmlzY3Zfa3ZtX2luaXQodm9pZClcbiBcbiBcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9kZXRlY3QoKTtcbiBcbiYjNDM7XHRyYyA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19pbml0KCk7XG4mIzQzO1x0aWYgKHJjKSB7XG4mIzQzO1x0XHRrdm1fcmlzY3ZfbmFjbF9leGl0KCk7XG4mIzQzO1x0XHRyZXR1cm4gcmM7XG4mIzQzO1x0fVxuJiM0MztcbiBcdHJjID0ga3ZtX3Jpc2N2X2FpYV9pbml0KCk7XG4gXHRpZiAocmMgXHUwMDI2XHUwMDI2IHJjICE9IC1FTk9ERVYpIHtcbiYjNDM7XHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKCk7XG4gXHRcdGt2bV9yaXNjdl9uYWNsX2V4aXQoKTtcbiBcdFx0cmV0dXJuIHJjO1xuIFx0fVxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL21tdS5jIGIvYXJjaC9yaXNjdi9rdm0vbW11LmNcbmluZGV4IDYwMzViNWVjOTUwMzkuLjNjOGZiNjAwOWMwYTUgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS9tbXUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9rdm0vbW11LmNcbkBAIC0xNSw3ICYjNDM7MTUsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkL3NpZ25hbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV9tbXUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fbmFjbC5oXHUwMDNlXG4tXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fdm1pZC5oXHUwMDNlXG4gc3RhdGljIGJvb2wgX19yZWFkX21vc3RseSBlYWdlcl9wYWdlX3NwbGl0ID0gdHJ1ZTtcbiBtb2R1bGVfcGFyYW0oZWFnZXJfcGFnZV9zcGxpdCwgYm9vbCwgMDY0NCk7XG4gXG5AQCAtNzk5LDEwICYjNDM7Nzk5LDExIEBAIHZvaWQga3ZtX3Jpc2N2X21tdV9mcmVlX3BnZChzdHJ1Y3Qga3ZtICprdm0pXG4gdm9pZCBrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4ge1xuIFx0c3RydWN0IGt2bV9hcmNoICprYSA9IFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2g7XG4mIzQzO1x0dTY0IHZtaWQgPSBhdG9taWM2NF9yZWFkKFx1MDAyNmthLVx1MDAzZXZtaWQuaWQpO1xuIFx0dW5zaWduZWQgbG9uZyBoZ2F0cCA9IGt2bV9yaXNjdl9nc3RhZ2VfbW9kZShrYS1cdTAwM2VwZ2RfbGV2ZWxzKVxuIFx0XHRcdCAgICAgIFx1MDAzY1x1MDAzYyBIR0FUUF9NT0RFX1NISUZUO1xuIFxuLVx0aGdhdHAgfD0gKFJFQURfT05DRShrYS1cdTAwM2V2bWlkLnZtaWQpIFx1MDAzY1x1MDAzYyBIR0FUUF9WTUlEX1NISUZUKSBcdTAwMjYgSEdBVFBfVk1JRDtcbiYjNDM7XHRoZ2F0cCB8PSAoa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCkgXHUwMDNjXHUwMDNjIEhHQVRQX1ZNSURfU0hJRlQpIFx1MDAyNiBIR0FUUF9WTUlEO1xuIFx0aGdhdHAgfD0gKGthLVx1MDAzZXBnZF9waHlzIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKSBcdTAwMjYgSEdBVFBfUFBOO1xuIFxuIFx0bmNzcl93cml0ZShDU1JfSEdBVFAsIGhnYXRwKTtcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS90bGIuYyBiL2FyY2gvcmlzY3Yva3ZtL3RsYi5jXG5pbmRleCAyYWUzNDYzMmNkY2IxLi5iODVlNWJhMjE5OGFhIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdGxiLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3Yva3ZtL3RsYi5jXG5AQCAtMjI0LDcgJiM0MzsyMjQsNyBAQCB2b2lkIGt2bV9yaXNjdl9sb2NhbF90bGJfc2FuaXRpemUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0ICogZW50cmllcyBieSBWTUlEIHdoZW5ldmVyIHVuZGVybHlpbmcgSG9zdCBDUFUgY2hhbmdlcyBmb3IgYSBWQ1BVLlxuIFx0ICovXG4gXG4tXHR2bWlkID0gUkVBRF9PTkNFKHZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbiYjNDM7XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV92bWlkX2FsbCh2bWlkKTtcbiBcbiBcdC8qXG5AQCAtMjQ0LDcgJiM0MzsyNDQsNyBAQCB2b2lkIGt2bV9yaXNjdl9mZW5jZV9pX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHZvaWQga3ZtX3Jpc2N2X3RsYl9mbHVzaF9wcm9jZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiB7XG4gXHRzdHJ1Y3Qga3ZtX3ZtaWQgKnYgPSBcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQ7XG4tXHR1bnNpZ25lZCBsb25nIHZtaWQgPSBSRUFEX09OQ0Uodi1cdTAwM2V2bWlkKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNnYtXHUwMDNlaWQpKTtcbiBcbiBcdGlmIChrdm1fcmlzY3ZfbmFjbF9hdmFpbGFibGUoKSlcbiBcdFx0bmFjbF9oZmVuY2VfZ3ZtYV92bWlkX2FsbChuYWNsX3NobWVtKCksIHZtaWQpO1xuQEAgLTI1NSw3ICYjNDM7MjU1LDcgQEAgdm9pZCBrdm1fcmlzY3ZfdGxiX2ZsdXNoX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHZvaWQga3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbF9wcm9jZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiB7XG4gXHRzdHJ1Y3Qga3ZtX3ZtaWQgKnYgPSBcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQ7XG4tXHR1bnNpZ25lZCBsb25nIHZtaWQgPSBSRUFEX09OQ0Uodi1cdTAwM2V2bWlkKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNnYtXHUwMDNlaWQpKTtcbiBcbiBcdGlmIChrdm1fcmlzY3ZfbmFjbF9hdmFpbGFibGUoKSlcbiBcdFx0bmFjbF9oZmVuY2VfdnZtYV9hbGwobmFjbF9zaG1lbSgpLCB2bWlkKTtcbkBAIC01MzEsOCAmIzQzOzUzMSwxMSBAQCB2b2lkIGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwoc3RydWN0IGt2bSAqa3ZtLFxuIFxuIGludCBrdm1fYXJjaF9mbHVzaF9yZW1vdGVfdGxic19yYW5nZShzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbiwgdTY0IG5yX3BhZ2VzKVxuIHtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHZtaWQgPVxuJiM0MztcdFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZrdm0tXHUwMDNlYXJjaC52bWlkLmlkKSk7XG4mIzQzO1xuIFx0a3ZtX3Jpc2N2X2hmZW5jZV9ndm1hX3ZtaWRfZ3BhKGt2bSwgLTFVTCwgMCxcbiBcdFx0XHRcdCAgICAgICBnZm4gXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQsIG5yX3BhZ2VzIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZULFxuLVx0XHRcdFx0ICAgICAgIFBBR0VfU0hJRlQsIFJFQURfT05DRShrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpKTtcbiYjNDM7XHRcdFx0XHQgICAgICAgUEFHRV9TSElGVCwgdm1pZCk7XG4gXHRyZXR1cm4gMDtcbiB9XG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdmNwdS5jIGIvYXJjaC9yaXNjdi9rdm0vdmNwdS5jXG5pbmRleCBlMDYyY2ExOWY5ZDhmLi44NTU0MmMxYTVlYzNmIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdmNwdS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1LmNcbkBAIC05NDMsMTQgJiM0Mzs5NDMsMTQgQEAgaW50IGt2bV9hcmNoX3ZjcHVfaW9jdGxfcnVuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdFx0XHRjb250aW51ZTtcbiBcdFx0cmV0ID0gMTtcbiBcbi1cdFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZSh2Y3B1KTtcbi1cbiBcdFx0cmV0ID0ga3ZtX3Jpc2N2X2NoZWNrX3ZjcHVfcmVxdWVzdHModmNwdSk7XG4gXHRcdGlmIChyZXQgXHUwMDNjPSAwKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuIFx0XHRwcmVlbXB0X2Rpc2FibGUoKTtcbiBcbiYjNDM7XHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUodmNwdSk7XG4mIzQzO1xuIFx0XHQvKiBVcGRhdGUgQUlBIEhXIHN0YXRlIGJlZm9yZSBlbnRlcmluZyBndWVzdCAqL1xuIFx0XHRyZXQgPSBrdm1fcmlzY3ZfdmNwdV9haWFfdXBkYXRlKHZjcHUpO1xuIFx0XHRpZiAocmV0IFx1MDAzYz0gMCkge1xuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY1xuaW5kZXggNTA2YTUxMGI2YmZmMy4uMWJlMzg2YTc4ZTI3ZiAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY1xuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfcmVwbGFjZS5jXG5AQCAtMTA0LDcgJiM0MzsxMDQsNyBAQCBzdGF0aWMgaW50IGt2bV9zYmlfZXh0X3JmZW5jZV9oYW5kbGVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1blxuIFx0XHRrdm1fcmlzY3ZfdmNwdV9wbXVfaW5jcl9mdyh2Y3B1LCBTQklfUE1VX0ZXX0ZFTkNFX0lfU0VOVCk7XG4gXHRcdGJyZWFrO1xuIFx0Y2FzZSBTQklfRVhUX1JGRU5DRV9SRU1PVEVfU0ZFTkNFX1ZNQTpcbi1cdFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZCk7XG4mIzQzO1x0XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdFx0aWYgKChjcC1cdTAwM2VhMiA9PSAwIFx1MDAyNlx1MDAyNiBjcC1cdTAwM2VhMyA9PSAwKSB8fCBjcC1cdTAwM2VhMyA9PSAtMVVMKVxuIFx0XHRcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwodmNwdS1cdTAwM2Vrdm0sIGhiYXNlLCBobWFzaywgdm1pZCk7XG4gXHRcdGVsc2VcbkBAIC0xMTMsNyAmIzQzOzExMyw3IEBAIHN0YXRpYyBpbnQga3ZtX3NiaV9leHRfcmZlbmNlX2hhbmRsZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuXG4gXHRcdGt2bV9yaXNjdl92Y3B1X3BtdV9pbmNyX2Z3KHZjcHUsIFNCSV9QTVVfRldfSEZFTkNFX1ZWTUFfU0VOVCk7XG4gXHRcdGJyZWFrO1xuIFx0Y2FzZSBTQklfRVhUX1JGRU5DRV9SRU1PVEVfU0ZFTkNFX1ZNQV9BU0lEOlxuLVx0XHR2bWlkID0gUkVBRF9PTkNFKHZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbiYjNDM7XHRcdHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC5pZCkpO1xuIFx0XHRpZiAoKGNwLVx1MDAzZWEyID09IDAgXHUwMDI2XHUwMDI2IGNwLVx1MDAzZWEzID09IDApIHx8IGNwLVx1MDAzZWEzID09IC0xVUwpXG4gXHRcdFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FzaWRfYWxsKHZjcHUtXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2ssXG4gXHRcdFx0XHRcdFx0ICAgICAgIGNwLVx1MDAzZWE0LCB2bWlkKTtcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jXG5pbmRleCBkZTU0NGVhM2YyOGRjLi5jYTNlZmU2M2MxY2YxIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfdjAxLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jXG5AQCAtODgsMTQgJiM0Mzs4OCwxNCBAQCBzdGF0aWMgaW50IGt2bV9zYmlfZXh0X3YwMV9oYW5kbGVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1bixcbiBcdFx0aWYgKGNwLVx1MDAzZWE3ID09IFNCSV9FWFRfMF8xX1JFTU9URV9GRU5DRV9JKVxuIFx0XHRcdGt2bV9yaXNjdl9mZW5jZV9pKHZjcHUtXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2spO1xuIFx0XHRlbHNlIGlmIChjcC1cdTAwM2VhNyA9PSBTQklfRVhUXzBfMV9SRU1PVEVfU0ZFTkNFX1ZNQSkge1xuLVx0XHRcdHZtaWQgPSBSRUFEX09OQ0UodmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpO1xuJiM0MztcdFx0XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdFx0XHRpZiAoY3AtXHUwMDNlYTEgPT0gMCBcdTAwMjZcdTAwMjYgY3AtXHUwMDNlYTIgPT0gMClcbiBcdFx0XHRcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwodmNwdS1cdTAwM2Vrdm0sIGhiYXNlLCBobWFzaywgdm1pZCk7XG4gXHRcdFx0ZWxzZVxuIFx0XHRcdFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2d2YSh2Y3B1LVx1MDAzZWt2bSwgaGJhc2UsIGhtYXNrLCBjcC1cdTAwM2VhMSxcbiBcdFx0XHRcdFx0XHRcdCAgY3AtXHUwMDNlYTIsIFBBR0VfU0hJRlQsIHZtaWQpO1xuIFx0XHR9IGVsc2Uge1xuLVx0XHRcdHZtaWQgPSBSRUFEX09OQ0UodmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpO1xuJiM0MztcdFx0XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdFx0XHRpZiAoY3AtXHUwMDNlYTEgPT0gMCBcdTAwMjZcdTAwMjYgY3AtXHUwMDNlYTIgPT0gMClcbiBcdFx0XHRcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hc2lkX2FsbCh2Y3B1LVx1MDAzZWt2bSwgaGJhc2UsIGhtYXNrLFxuIFx0XHRcdFx0XHRcdFx0ICAgICAgIGNwLVx1MDAzZWEzLCB2bWlkKTtcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92bWlkLmMgYi9hcmNoL3Jpc2N2L2t2bS92bWlkLmNcbmluZGV4IGMxNWJkYjFkZDhiZWYuLjdiODZhNmZiZTRhNjkgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS92bWlkLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuY1xuQEAgLTYsMTEgJiM0Mzs2LDE1IEBAXG4gICogICAgIEFudXAgUGF0ZWwgXHUwMDNjYW51cC5wYXRlbEB3ZGMuY29tXHUwMDNlXG4gICovXG4gXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpdG1hcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYml0b3BzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jcHVtYXNrLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9lcnJuby5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZXJyLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9wZXJjcHUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9wcmVlbXB0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc21wLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rdm1faG9zdC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2Nzci5oXHUwMDNlXG5AQCAtMTgsMjYgJiM0MzsyMiw1NCBAQFxuICNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fdGxiLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX3ZtaWQuaFx1MDAzZVxuIFxuLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZtaWRfdmVyc2lvbiA9IDE7XG4tc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF9uZXh0O1xuJiM0MztzdGF0aWMgYXRvbWljNjRfdCB2bWlkX2dlbmVyYXRpb247XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nICp2bWlkX21hcDtcbiBzdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX2JpdHMgX19yb19hZnRlcl9pbml0O1xuLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodm1pZF9sb2NrKTtcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF9jdXJfaWR4ID0gMTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKHZtaWRfbG9jayk7XG4mIzQzO1xuJiM0MztzdGF0aWMgREVGSU5FX1BFUl9DUFUoYXRvbWljNjRfdCwgYWN0aXZlX3ZtaWRzKTtcbiYjNDM7c3RhdGljIERFRklORV9QRVJfQ1BVKHU2NCwgcmVzZXJ2ZWRfdm1pZHMpO1xuJiM0MztcbiYjNDM7c3RhdGljIGNwdW1hc2tfdCB0bGJfZmx1c2hfcGVuZGluZztcbiYjNDM7XG4mIzQzOyNkZWZpbmUgVk1JRF9GSVJTVF9WRVJTSU9OXHRCSVRfVUxMKHZtaWRfYml0cylcbiYjNDM7I2RlZmluZSBOVU1fVk1JRFNcdFx0QklUKHZtaWRfYml0cylcbiYjNDM7I2RlZmluZSBWTUlEX0hXX01BU0tcdFx0KFZNSURfRklSU1RfVkVSU0lPTiAtIDEpXG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCB2bWlkX2dlbl9tYXRjaCh1NjQgdm1pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiAhKCh2bWlkIF4gYXRvbWljNjRfcmVhZChcdTAwMjZ2bWlkX2dlbmVyYXRpb24pKSBcdTAwM2VcdTAwM2Ugdm1pZF9iaXRzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dW5zaWduZWQgbG9uZyBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh1NjQgdm1pZClcbiYjNDM7e1xuJiM0MztcdGlmICghdm1pZF9iaXRzKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdHJldHVybiAodW5zaWduZWQgbG9uZykodm1pZCBcdTAwMjYgVk1JRF9IV19NQVNLKTtcbiYjNDM7fVxuIFxuIHZvaWQgX19pbml0IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9kZXRlY3Qodm9pZClcbiB7XG4tXHQvKiBGaWd1cmUtb3V0IG51bWJlciBvZiBWTUlEIGJpdHMgaW4gSFcgKi9cbiYjNDM7XHQvKiBGaWd1cmUgb3V0IHRoZSBudW1iZXIgb2YgVk1JRCBiaXRzIHN1cHBvcnRlZCBieSBoYXJkd2FyZS4gKi9cbiBcdGNzcl93cml0ZShDU1JfSEdBVFAsIChrdm1fcmlzY3ZfZ3N0YWdlX21vZGUoa3ZtX3Jpc2N2X2dzdGFnZV9tYXhfcGdkX2xldmVscykgXHUwMDNjXHUwMDNjXG4tXHRcdFx0ICAgICAgSEdBVFBfTU9ERV9TSElGVCkgfCBIR0FUUF9WTUlEKTtcbiYjNDM7XHRcdCAgIEhHQVRQX01PREVfU0hJRlQpIHwgSEdBVFBfVk1JRCk7XG4gXHR2bWlkX2JpdHMgPSBjc3JfcmVhZChDU1JfSEdBVFApO1xuIFx0dm1pZF9iaXRzID0gKHZtaWRfYml0cyBcdTAwMjYgSEdBVFBfVk1JRCkgXHUwMDNlXHUwMDNlIEhHQVRQX1ZNSURfU0hJRlQ7XG4gXHR2bWlkX2JpdHMgPSBmbHNfbG9uZyh2bWlkX2JpdHMpO1xuIFx0Y3NyX3dyaXRlKENTUl9IR0FUUCwgMCk7XG4gXG4tXHQvKiBXZSBwb2xsdXRlZCBsb2NhbCBUTEIgc28gZmx1c2ggYWxsIGd1ZXN0IFRMQiAqL1xuJiM0MztcdC8qIEZsdXNoIHRoZSBsb2NhbCBndWVzdCBUTEIgYWZ0ZXIgcHJvYmluZyBIR0FUUC4gKi9cbiBcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwoKTtcbiBcbi1cdC8qIFdlIGRvbiYjMzk7dCB1c2UgVk1JRCBiaXRzIGlmIHRoZXkgYXJlIG5vdCBzdWZmaWNpZW50ICovXG4tXHRpZiAoKDFVTCBcdTAwM2NcdTAwM2Mgdm1pZF9iaXRzKSBcdTAwM2MgbnVtX3Bvc3NpYmxlX2NwdXMoKSlcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFZNSUQgMCBpcyByZXNlcnZlZC4gIER1cmluZyByb2xsb3ZlciBldmVyeSBwb3NzaWJsZSBDUFUgbWF5XG4mIzQzO1x0ICogcmVzZXJ2ZSBvbmUgaGFyZHdhcmUgVk1JRCwgYW5kIHdlIHN0aWxsIG5lZWQgYXQgbGVhc3Qgb25lIFZNSURcbiYjNDM7XHQgKiBhdmFpbGFibGUgZm9yIGEgbmV3IGFsbG9jYXRpb24uXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHZtaWRfYml0cyBcdTAwMjZcdTAwMjYgTlVNX1ZNSURTIC0gMSBcdTAwM2M9IG51bV9wb3NzaWJsZV9jcHVzKCkpXG4gXHRcdHZtaWRfYml0cyA9IDA7XG4gfVxuIFxuQEAgLTQ2LDgwICYjNDM7NzgsMjk4IEBAIHVuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHModm9pZClcbiBcdHJldHVybiB2bWlkX2JpdHM7XG4gfVxuIFxuJiM0MztpbnQgX19pbml0IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19pbml0KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgY3B1O1xuJiM0MztcbiYjNDM7XHRpZiAoIXZtaWRfYml0cylcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHR2bWlkX21hcCA9IGJpdG1hcF96YWxsb2MoTlVNX1ZNSURTLCBHRlBfS0VSTkVMKTtcbiYjNDM7XHRpZiAoIXZtaWRfbWFwKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdHZtaWRfY3VyX2lkeCA9IDE7XG4mIzQzO1xuJiM0MztcdC8qIEhhcmR3YXJlIFZNSUQgMCBpcyByZXNlcnZlZC4gKi9cbiYjNDM7XHRfX3NldF9iaXQoMCwgdm1pZF9tYXApO1xuJiM0MztcbiYjNDM7XHRhdG9taWM2NF9zZXQoXHUwMDI2dm1pZF9nZW5lcmF0aW9uLCBWTUlEX0ZJUlNUX1ZFUlNJT04pO1xuJiM0MztcbiYjNDM7XHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4mIzQzO1x0XHRhdG9taWM2NF9zZXQoXHUwMDI2cGVyX2NwdShhY3RpdmVfdm1pZHMsIGNwdSksIDApO1xuJiM0MztcdFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IDA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEV2ZXJ5IENQVSBwZXJmb3JtcyBhbiBpbml0aWFsIGxvY2FsIGludmFsaWRhdGlvbiBiZWZvcmUgaXRzXG4mIzQzO1x0ICogZmlyc3QgVk1JRCBhY3RpdmF0aW9uLlxuJiM0MztcdCAqL1xuJiM0MztcdGNwdW1hc2tfY29weShcdTAwMjZ0bGJfZmx1c2hfcGVuZGluZywgY3B1X3Bvc3NpYmxlX21hc2spO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfZnJlZSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0Yml0bWFwX2ZyZWUodm1pZF9tYXApO1xuJiM0MztcdHZtaWRfbWFwID0gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiBpbnQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2luaXQoc3RydWN0IGt2bSAqa3ZtKVxuIHtcbi1cdC8qIE1hcmsgdGhlIGluaXRpYWwgVk1JRCBhbmQgVk1JRCB2ZXJzaW9uIGludmFsaWQgKi9cbi1cdGt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZF92ZXJzaW9uID0gMDtcbi1cdGt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZCA9IDA7XG4mIzQzO1x0YXRvbWljNjRfc2V0KFx1MDAyNmt2bS1cdTAwM2VhcmNoLnZtaWQuaWQsIDApO1xuIFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuIGJvb2wga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3Zlcl9jaGFuZ2VkKHN0cnVjdCBrdm1fdm1pZCAqdm1pZClcbiB7XG4mIzQzO1x0dTY0IGlkO1xuJiM0MztcbiBcdGlmICghdm1pZF9iaXRzKVxuIFx0XHRyZXR1cm4gZmFsc2U7XG4gXG4tXHRyZXR1cm4gdW5saWtlbHkoUkVBRF9PTkNFKHZtaWQtXHUwMDNldm1pZF92ZXJzaW9uKSAhPVxuLVx0XHRcdFJFQURfT05DRSh2bWlkX3ZlcnNpb24pKTtcbiYjNDM7XHRpZCA9IGF0b21pYzY0X3JlYWQoXHUwMDI2dm1pZC1cdTAwM2VpZCk7XG4mIzQzO1xuJiM0MztcdHJldHVybiB1bmxpa2VseSghdm1pZF9nZW5fbWF0Y2goaWQpKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgX19sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwodm9pZCAqaW5mbylcbiYjNDM7LypcbiYjNDM7ICogQ2FsbGVkIHdpdGggdm1pZF9sb2NrIGhlbGQgYWZ0ZXIgdm1pZF9nZW5lcmF0aW9uIGhhcyBhbHJlYWR5IGJlZW5cbiYjNDM7ICogYWR2YW5jZWQuXG4mIzQzOyAqXG4mIzQzOyAqIE5vIHJlbW90ZSBDUFUgaXMgaW50ZXJydXB0ZWQgaGVyZS4gIEluc3RlYWQsIHByZXNlcnZlIGV2ZXJ5IFZNSURcbiYjNDM7ICogd2hpY2ggbWF5IHN0aWxsIGJlIHVzZWQgYnkgYSBDUFUgYW5kIHF1ZXVlIGEgbG9jYWwgaW52YWxpZGF0aW9uIGZvclxuJiM0MzsgKiB0aGF0IENQVSYjMzk7cyBuZXh0IFZNSUQgYWN0aXZhdGlvbi5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIGZsdXNoX2NvbnRleHQodm9pZClcbiB7XG4tXHRrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfYWxsKCk7XG4mIzQzO1x0dTY0IHZtaWQ7XG4mIzQzO1x0aW50IGNwdTtcbiYjNDM7XG4mIzQzO1x0Yml0bWFwX3plcm8odm1pZF9tYXAsIE5VTV9WTUlEUyk7XG4mIzQzO1x0X19zZXRfYml0KDAsIHZtaWRfbWFwKTtcbiYjNDM7XG4mIzQzO1x0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xuJiM0MztcdFx0dm1pZCA9IGF0b21pYzY0X3hjaGcoXHUwMDI2cGVyX2NwdShhY3RpdmVfdm1pZHMsIGNwdSksIDApO1xuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBUaGUgQ1BVIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBjYXVnaHQgYnkgYW4gZWFybGllciByb2xsb3ZlclxuJiM0MztcdFx0ICogd2l0aG91dCBwZXJmb3JtaW5nIGFub3RoZXIgYWN0aXZhdGlvbiBzaW5jZSB0aGVuLiAgSW4gdGhhdFxuJiM0MztcdFx0ICogY2FzZSByZXNlcnZlZF92bWlkcyBpcyB0aGUgb25seSByZWNvcmQgb2YgdGhlIG9sZCBjb250ZXh0LlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoIXZtaWQpXG4mIzQzO1x0XHRcdHZtaWQgPSBwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpO1xuJiM0MztcbiYjNDM7XHRcdGlmICh2bWlkKVxuJiM0MztcdFx0XHRfX3NldF9iaXQoa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCksXG4mIzQzO1x0XHRcdFx0ICB2bWlkX21hcCk7XG4mIzQzO1xuJiM0MztcdFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IHZtaWQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRjcHVtYXNrX2NvcHkoXHUwMDI2dGxiX2ZsdXNoX3BlbmRpbmcsIGNwdV9wb3NzaWJsZV9tYXNrKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVXBkYXRlIGV2ZXJ5IHJlc2VydmVkIGNvcHkgb2YgYW4gb2xkIHNvZnR3YXJlIFZNSUQuXG4mIzQzOyAqXG4mIzQzOyAqIERvIG5vdCBzdG9wIGFmdGVyIHRoZSBmaXJzdCBtYXRjaDogdGhlIHNhbWUgVk0gbWF5IGhhdmUgYmVlbiBhY3RpdmVcbiYjNDM7ICogb24gbW9yZSB0aGFuIG9uZSBDUFUgd2hlbiByb2xsb3ZlciBvY2N1cnJlZC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBib29sIGNoZWNrX3VwZGF0ZV9yZXNlcnZlZF92bWlkKHU2NCBvbGRfdm1pZCwgdTY0IG5ld192bWlkKVxuJiM0Mzt7XG4mIzQzO1x0Ym9vbCBoaXQgPSBmYWxzZTtcbiYjNDM7XHRpbnQgY3B1O1xuJiM0MztcbiYjNDM7XHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4mIzQzO1x0XHRpZiAocGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9PSBvbGRfdm1pZCkge1xuJiM0MztcdFx0XHRwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID0gbmV3X3ZtaWQ7XG4mIzQzO1x0XHRcdGhpdCA9IHRydWU7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gaGl0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBBbGxvY2F0ZS9wcm9tb3RlIGEgc29mdHdhcmUgVk1JRC5cbiYjNDM7ICpcbiYjNDM7ICogdm1pZF9sb2NrIG11c3QgYmUgaGVsZCBieSB0aGUgY2FsbGVyLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHU2NCBuZXdfdm1pZF9sb2NrZWQoc3RydWN0IGt2bV92bWlkICprdm1fdm1pZClcbiYjNDM7e1xuJiM0MztcdHU2NCB2bWlkID0gYXRvbWljNjRfcmVhZChcdTAwMjZrdm1fdm1pZC1cdTAwM2VpZCk7XG4mIzQzO1x0dTY0IGdlbmVyYXRpb24gPSBhdG9taWM2NF9yZWFkKFx1MDAyNnZtaWRfZ2VuZXJhdGlvbik7XG4mIzQzO1x0dTY0IG5ld192bWlkO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgaWR4O1xuJiM0MztcbiYjNDM7XHRpZiAodm1pZCkge1xuJiM0MztcdFx0bmV3X3ZtaWQgPSBnZW5lcmF0aW9uIHxcbiYjNDM7XHRcdFx0ICAga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCk7XG4mIzQzO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIFRoZSBvbGQgVk1JRCBpcyBzdGlsbCBwcm90ZWN0ZWQgYnkgb25lIG9yIG1vcmUgQ1BVcy5cbiYjNDM7XHRcdCAqIEtlZXAgdGhlIHNhbWUgaGFyZHdhcmUgVk1JRCBhbmQgb25seSBwcm9tb3RlIGdlbmVyYXRpb24uXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGlmIChjaGVja191cGRhdGVfcmVzZXJ2ZWRfdm1pZCh2bWlkLCBuZXdfdm1pZCkpXG4mIzQzO1x0XHRcdHJldHVybiBuZXdfdm1pZDtcbiYjNDM7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogVGhlIFZNIGhhZCBhIFZNSUQgaW4gYW4gb2xkZXIgZ2VuZXJhdGlvbi4gIFJldXNlIHRoZSBzYW1lXG4mIzQzO1x0XHQgKiBoYXJkd2FyZSBudW1iZXIgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY2xhaW1lZC5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0aWR4ID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCk7XG4mIzQzO1x0XHRpZiAoIV9fdGVzdF9hbmRfc2V0X2JpdChpZHgsIHZtaWRfbWFwKSlcbiYjNDM7XHRcdFx0cmV0dXJuIG5ld192bWlkO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBGaW5kIGEgZnJlZSBWTUlEIGluIHRoZSBjdXJyZW50IGdlbmVyYXRpb24uXG4mIzQzO1x0ICovXG4mIzQzO1x0aWR4ID0gZmluZF9uZXh0X3plcm9fYml0KHZtaWRfbWFwLCBOVU1fVk1JRFMsIHZtaWRfY3VyX2lkeCk7XG4mIzQzO1x0aWYgKGlkeCAhPSBOVU1fVk1JRFMpXG4mIzQzO1x0XHRnb3RvIHNldF92bWlkO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIE5vIGZyZWUgVk1JRC4gIFN0YXJ0IGEgbmV3IGdlbmVyYXRpb24sIHByZXNlcnZlIGFsbCBDUFUtbG9jYWxcbiYjNDM7XHQgKiB1c2VycywgYW5kIGRlZmVyIGVhY2ggQ1BVJiMzOTtzIGZsdXNoIHVudGlsIGl0cyBuZXh0IGFjdGl2YXRpb24uXG4mIzQzO1x0ICovXG4mIzQzO1x0Z2VuZXJhdGlvbiAmIzQzOz0gVk1JRF9GSVJTVF9WRVJTSU9OO1xuJiM0MztcbiYjNDM7XHQvKiBTb2Z0d2FyZSBWTUlEIDAgaXMgcmVzZXJ2ZWQgYXMgdGhlIGludmFsaWQgaWRlbnRpZmllci4gKi9cbiYjNDM7XHRpZiAodW5saWtlbHkoIWdlbmVyYXRpb24pKVxuJiM0MztcdFx0Z2VuZXJhdGlvbiA9IFZNSURfRklSU1RfVkVSU0lPTjtcbiYjNDM7XG4mIzQzO1x0YXRvbWljNjRfeGNoZyhcdTAwMjZ2bWlkX2dlbmVyYXRpb24sIGdlbmVyYXRpb24pO1xuJiM0MztcdGZsdXNoX2NvbnRleHQoKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBOVU1fVk1JRFMgLSAxIFx1MDAzZSBudW1fcG9zc2libGVfY3B1cygpLCB0aGVyZWZvcmUgcm9sbG92ZXIgbXVzdFxuJiM0MztcdCAqIGxlYXZlIGF0IGxlYXN0IG9uZSBhbGxvY2F0YWJsZSBoYXJkd2FyZSBWTUlELlxuJiM0MztcdCAqL1xuJiM0MztcdGlkeCA9IGZpbmRfbmV4dF96ZXJvX2JpdCh2bWlkX21hcCwgTlVNX1ZNSURTLCAxKTtcbiYjNDM7XG4mIzQzO3NldF92bWlkOlxuJiM0MztcdF9fc2V0X2JpdChpZHgsIHZtaWRfbWFwKTtcbiYjNDM7XHR2bWlkX2N1cl9pZHggPSBpZHg7XG4mIzQzO1xuJiM0MztcdHJldHVybiBnZW5lcmF0aW9uIHwgaWR4O1xuIH1cbiBcbiB2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHtcbi1cdHVuc2lnbmVkIGxvbmcgaTtcbiYjNDM7XHRzdHJ1Y3Qga3ZtX3ZtaWQgKmt2bV92bWlkID0gXHUwMDI2dmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkO1xuJiM0MztcdGF0b21pYzY0X3QgKmFjdGl2ZTtcbiBcdHN0cnVjdCBrdm1fdmNwdSAqdjtcbi1cdHN0cnVjdCBrdm1fdm1pZCAqdm1pZCA9IFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGZsYWdzO1xuJiM0MztcdHU2NCB2bWlkO1xuJiM0MztcdHU2NCBvbGRfYWN0aXZlX3ZtaWQ7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBpO1xuJiM0MztcdHVuc2lnbmVkIGludCBjcHU7XG4mIzQzO1x0Ym9vbCB2bWlkX2NoYW5nZWQgPSBmYWxzZTtcbiBcbi1cdGlmICgha3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3Zlcl9jaGFuZ2VkKHZtaWQpKVxuJiM0MztcdGlmICghdm1pZF9iaXRzKVxuIFx0XHRyZXR1cm47XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2dm1pZF9sb2NrKTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIGFjdGl2ZV92bWlkcyBhbmQgdGxiX2ZsdXNoX3BlbmRpbmcgYXJlIHBlci1DUFUgYWRtaXNzaW9uIHN0YXRlLlxuJiM0MztcdCAqIFRoZXkgbXVzdCByZWZlciB0byB0aGUgc2FtZSBDUFUgZm9yIHRoZSBjb21wbGV0ZSBhY3RpdmF0aW9uLlxuJiM0MztcdCAqL1xuJiM0MztcdHByZWVtcHRfZGlzYWJsZSgpO1xuJiM0MztcbiYjNDM7XHRjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7XG4mIzQzO1x0YWN0aXZlID0gdGhpc19jcHVfcHRyKFx1MDAyNmFjdGl2ZV92bWlkcyk7XG4mIzQzO1xuJiM0MztcdHZtaWQgPSBhdG9taWM2NF9yZWFkKFx1MDAyNmt2bV92bWlkLVx1MDAzZWlkKTtcbiYjNDM7XHRvbGRfYWN0aXZlX3ZtaWQgPSBhdG9taWM2NF9yZWFkKGFjdGl2ZSk7XG4gXG4gXHQvKlxuLVx0ICogV2UgbmVlZCB0byByZS1jaGVjayB0aGUgdm1pZF92ZXJzaW9uIGhlcmUgdG8gZW5zdXJlIHRoYXQgaWZcbi1cdCAqIGFub3RoZXIgdmNwdSBhbHJlYWR5IGFsbG9jYXRlZCBhIHZhbGlkIHZtaWQgZm9yIHRoaXMgdm0uXG4mIzQzO1x0ICogRmFzdCBwYXRoLlxuJiM0MztcdCAqXG4mIzQzO1x0ICogVGhlIGNtcHhjaGcgcmFjZXMgd2l0aCBmbHVzaF9jb250ZXh0KCkmIzM5O3MgeGNoZyBvbiB0aGUgc2FtZVxuJiM0MztcdCAqIHBlci1DUFUgYXRvbWljLiAgRWl0aGVyIHRoaXMgYWN0aXZhdGlvbiBpcyBjYXB0dXJlZCBieSByb2xsb3ZlcixcbiYjNDM7XHQgKiBvciByb2xsb3ZlciBjbGVhcnMgYWN0aXZlIGZpcnN0IGFuZCB0aGUgY21weGNoZyBmYWlscy5cbiBcdCAqL1xuLVx0aWYgKCFrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQodm1pZCkpIHtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2dm1pZF9sb2NrKTtcbi1cdFx0cmV0dXJuO1xuJiM0MztcdGlmIChvbGRfYWN0aXZlX3ZtaWQgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIHZtaWRfZ2VuX21hdGNoKHZtaWQpIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBhdG9taWM2NF9jbXB4Y2hnKGFjdGl2ZSwgb2xkX2FjdGl2ZV92bWlkLCB2bWlkKSA9PVxuJiM0MztcdCAgICBvbGRfYWN0aXZlX3ZtaWQpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0cmF3X3NwaW5fbG9ja19pcnFzYXZlKFx1MDAyNnZtaWRfbG9jaywgZmxhZ3MpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFJlLXJlYWQgdW5kZXIgdGhlIGFsbG9jYXRvciBsb2NrIGJlY2F1c2UgYW5vdGhlciB2Q1BVIG9mIHRoaXMgVk1cbiYjNDM7XHQgKiBtYXkgYWxyZWFkeSBoYXZlIHByb21vdGVkIG9yIGFsbG9jYXRlZCB0aGUgc2hhcmVkIFZNSUQuXG4mIzQzO1x0ICovXG4mIzQzO1x0dm1pZCA9IGF0b21pYzY0X3JlYWQoXHUwMDI2a3ZtX3ZtaWQtXHUwMDNlaWQpO1xuJiM0MztcbiYjNDM7XHRpZiAoIXZtaWRfZ2VuX21hdGNoKHZtaWQpKSB7XG4mIzQzO1x0XHR2bWlkID0gbmV3X3ZtaWRfbG9ja2VkKGt2bV92bWlkKTtcbiYjNDM7XHRcdGF0b21pYzY0X3NldChcdTAwMjZrdm1fdm1pZC1cdTAwM2VpZCwgdm1pZCk7XG4mIzQzO1x0XHR2bWlkX2NoYW5nZWQgPSB0cnVlO1xuIFx0fVxuIFxuLVx0LyogRmlyc3QgdXNlciBvZiBhIG5ldyBWTUlEIHZlcnNpb24/ICovXG4tXHRpZiAodW5saWtlbHkodm1pZF9uZXh0ID09IDApKSB7XG4tXHRcdFdSSVRFX09OQ0Uodm1pZF92ZXJzaW9uLCBSRUFEX09OQ0Uodm1pZF92ZXJzaW9uKSAmIzQzOyAxKTtcbi1cdFx0dm1pZF9uZXh0ID0gMTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEV2ZW4gaWYgYW5vdGhlciB2Q1BVIGFscmVhZHkgdXBkYXRlZCB0aGUgc2hhcmVkIFZNSUQsIHRoaXMgQ1BVXG4mIzQzO1x0ICogbXVzdCBzdGlsbCBkaXNjaGFyZ2UgaXRzIG93biByb2xsb3ZlciBmbHVzaCBvYmxpZ2F0aW9uLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChjcHVtYXNrX3Rlc3RfYW5kX2NsZWFyX2NwdShjcHUsIFx1MDAyNnRsYl9mbHVzaF9wZW5kaW5nKSlcbiYjNDM7XHRcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwoKTtcbiBcbi1cdFx0Lypcbi1cdFx0ICogV2UgcmFuIG91dCBvZiBWTUlEcyBzbyB3ZSBpbmNyZW1lbnQgdm1pZF92ZXJzaW9uIGFuZFxuLVx0XHQgKiBzdGFydCBhc3NpZ25pbmcgVk1JRHMgZnJvbSAxLlxuLVx0XHQgKlxuLVx0XHQgKiBUaGlzIGFsc28gbWVhbnMgZXhpc3RpbmcgVk1JRHMgYXNzaWdubWVudCB0byBhbGwgR3Vlc3Rcbi1cdFx0ICogaW5zdGFuY2VzIGlzIGludmFsaWQgYW5kIHdlIGhhdmUgZm9yY2UgVk1JRCByZS1hc3NpZ25lbWVudFxuLVx0XHQgKiBmb3IgYWxsIEd1ZXN0IGluc3RhbmNlcy4gVGhlIEd1ZXN0IGluc3RhbmNlcyB0aGF0IHdlcmUgbm90XG4tXHRcdCAqIHJ1bm5pbmcgd2lsbCBhdXRvbWF0aWNhbGx5IHBpY2stdXAgbmV3IFZNSURzIGJlY2F1c2Ugd2lsbFxuLVx0XHQgKiBjYWxsIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoKSB3aGVuZXZlciB0aGV5IGVudGVyXG4tXHRcdCAqIGluLWtlcm5lbCBydW4gbG9vcC4gRm9yIEd1ZXN0IGluc3RhbmNlcyB0aGF0IGFyZSBhbHJlYWR5XG4tXHRcdCAqIHJ1bm5pbmcsIHdlIGZvcmNlIFZNIGV4aXRzIG9uIGFsbCBob3N0IENQVXMgdXNpbmcgSVBJIGFuZFxuLVx0XHQgKiBmbHVzaCBhbGwgR3Vlc3QgVExCcy5cbi1cdFx0ICovXG4tXHRcdG9uX2VhY2hfY3B1X21hc2soY3B1X29ubGluZV9tYXNrLCBfX2xvY2FsX2hmZW5jZV9ndm1hX2FsbCxcbi1cdFx0XHRcdCBOVUxMLCAxKTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFB1Ymxpc2ggdGhlIENQVS1sb2NhbCBhY3RpdmUgaWRlbnRpdHkgb25seSBhZnRlciB0aGUgcmVxdWlyZWRcbiYjNDM7XHQgKiBsb2NhbCBpbnZhbGlkYXRpb24gaXMgY29tcGxldGUuXG4mIzQzO1x0ICovXG4mIzQzO1x0YXRvbWljNjRfc2V0KGFjdGl2ZSwgdm1pZCk7XG4mIzQzO1xuJiM0MztcdHJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKFx1MDAyNnZtaWRfbG9jaywgZmxhZ3MpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEEgbmV3IHNvZnR3YXJlIFZNSUQgbWF5IGNvbnRhaW4gYSBkaWZmZXJlbnQgaGFyZHdhcmUgVk1JRCwgc29cbiYjNDM7XHQgKiByZXF1ZXN0IGFuIEhHQVRQIHVwZGF0ZSBmb3IgZXZlcnkgdkNQVSBpbiB0aGUgVk0uXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHZtaWRfY2hhbmdlZCkge1xuJiM0MztcdFx0a3ZtX2Zvcl9lYWNoX3ZjcHUoaSwgdiwgdmNwdS1cdTAwM2Vrdm0pXG4mIzQzO1x0XHRcdGt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9VUERBVEVfSEdBVFAsIHYpO1xuIFx0fVxuIFxuLVx0dm1pZC1cdTAwM2V2bWlkID0gdm1pZF9uZXh0O1xuLVx0dm1pZF9uZXh0JiM0MzsmIzQzOztcbi1cdHZtaWRfbmV4dCBcdTAwMjY9ICgxIFx1MDAzY1x1MDAzYyB2bWlkX2JpdHMpIC0gMTtcbiYjNDM7b3V0OlxuJiM0MztcdHByZWVtcHRfZW5hYmxlKCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIENQVSB2aXJ0dWFsaXphdGlvbi9DU1Igc3RhdGUgaXMgYmVpbmcgZGlzY2FyZGVkLlxuJiM0MzsgKlxuJiM0MzsgKiBXaXRoZHJhdyBmYXN0LXBhdGggZWxpZ2liaWxpdHksIGJ1dCBjb25zZXJ2YXRpdmVseSBwcmVzZXJ2ZSB0aGUgbGFzdFxuJiM0MzsgKiBpZGVudGl0eSBpbnN0ZWFkIG9mIG1ha2luZyBpdHMgaGFyZHdhcmUgVk1JRCBpbW1lZGlhdGVseSByZXVzYWJsZS5cbiYjNDM7ICovXG4mIzQzO3ZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGZsYWdzO1xuJiM0MztcdHU2NCB2bWlkO1xuJiM0MztcdHVuc2lnbmVkIGludCBjcHU7XG4gXG4tXHRXUklURV9PTkNFKHZtaWQtXHUwMDNldm1pZF92ZXJzaW9uLCBSRUFEX09OQ0Uodm1pZF92ZXJzaW9uKSk7XG4mIzQzO1x0aWYgKCF2bWlkX2JpdHMpXG4mIzQzO1x0XHRyZXR1cm47XG4gXG4tXHRzcGluX3VubG9jayhcdTAwMjZ2bWlkX2xvY2spO1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X3ByZWVtcHRpb25fZGlzYWJsZWQoKTtcbiYjNDM7XG4mIzQzO1x0Y3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpO1xuJiM0MztcbiYjNDM7XHRyYXdfc3Bpbl9sb2NrX2lycXNhdmUoXHUwMDI2dm1pZF9sb2NrLCBmbGFncyk7XG4mIzQzO1xuJiM0MztcdHZtaWQgPSBhdG9taWM2NF94Y2hnKHRoaXNfY3B1X3B0cihcdTAwMjZhY3RpdmVfdm1pZHMpLCAwKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHZtaWQpXG4mIzQzO1x0XHRwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID0gdm1pZDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBJZiBhY3RpdmUgd2FzIGFscmVhZHkgemVybywgcmV0YWluIHRoZSBvbGQgcmVzZXJ2ZWQgZW50cnkuXG4mIzQzO1x0ICovXG4mIzQzO1x0Y3B1bWFza19zZXRfY3B1KGNwdSwgXHUwMDI2dGxiX2ZsdXNoX3BlbmRpbmcpO1xuIFxuLVx0LyogUmVxdWVzdCBHLXN0YWdlIHBhZ2UgdGFibGUgdXBkYXRlIGZvciBhbGwgVkNQVXMgKi9cbi1cdGt2bV9mb3JfZWFjaF92Y3B1KGksIHYsIHZjcHUtXHUwMDNla3ZtKVxuLVx0XHRrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfVVBEQVRFX0hHQVRQLCB2KTtcbiYjNDM7XHRyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShcdTAwMjZ2bWlkX2xvY2ssIGZsYWdzKTtcbiB9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMTc6NTA8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtBbGwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgc3RyaWN0bHkgY29uZmluZWQgdG8gdGhlIFJJU0MtViBhcmNoaXRlY3R1cmUgKGFyY2gvcmlzY3YvKSwgc3BlY2lmaWNhbGx5IHRoZSBSSVNDLVYgS1ZNIFN0YWdlLTIgVk1JRCBtYW5hZ2VtZW50LiBUaGV5IGNhbm5vdCBiZSBidWlsdCBvciBleGVjdXRlZCBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSAoYW1kNjQpLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzCnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsCmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuCgotIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOgogIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQKICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLgogIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCwKICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuCgotIERPIE5PVCBCTElORExZIFRSVVNUICYjMzQ7Tk8gRlVOQ1RJT05BTCBDSEFOR0UmIzM0OyAoTkZDSSkgT1IgJiMzNDtSRUZBQ1RPUklORyYjMzQ7IENMQUlNUzoKICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzICYjMzQ7Y2xlYW51cHMmIzM0OywgJiMzNDtyZWZhY3RvcmluZ3MmIzM0Oywgb3Igc3RhdGUKICAmIzM0O05vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkJiMzNDsuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLgogIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudAogIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLgogIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuCgotIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOgogIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKiwKICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy4KICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyCiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczoKCi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczoKICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy4KICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKQogICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLgogICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHMKICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuCiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuCi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOgogICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6CiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmcKICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLgogICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOgotIENvcmUgU3Vic3lzdGVtczoKICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSwKICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy4KLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6CiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuCi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOgogICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLgotIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6CiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo0LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6CgotIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzoKICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1cwogIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0CiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuCiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzICYjMzQ7Zm9jdXNlZCYjMzQ7LAogIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy4KCi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOgogIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50cwogIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LgoKLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6CiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFjawogIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLgogIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlcgogIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZToKLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgotIENoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuCi0gU3RyaXAgYW55ICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDVmYzM1Y2NjNWM3ZDlkNGM3MzQ5NGI1NDhjODhkZTg1ZmRlMzQ4YzQKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVGh1IFNlcCAxMCAxNzo1MDoyNCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmgKaW5kZXggYWFmMDgwYmExYjc3YS4uYzYxYTFiYmIyNzJmNCAxMDA2NDQKLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmgKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmgKQEAgLTgsNyAmIzQzOzgsNyBAQAogI2RlZmluZSBfX1JJU0NWX0tWTV9HU1RBR0VfSF8KIAogI2luY2x1ZGUgJmx0O2xpbnV4L2t2bV90eXBlcy5oJmd0OwotCiYjNDM7I2luY2x1ZGUgJmx0O2FzbS9rdm1fdm1pZC5oJmd0Owogc3RydWN0IGt2bV9nc3RhZ2UgewogCXN0cnVjdCBrdm0gKmt2bTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTA4LDcgJiM0MzsxMDgsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV9pbml0KHN0cnVjdCBrdm1fZ3N0YWdlICpnc3RhZ2UsIHN0cnVjdCBrdm0gKgogewogCWdzdGFnZS0mZ3Q7a3ZtID0ga3ZtOwogCWdzdGFnZS0mZ3Q7ZmxhZ3MgPSAwOwotCWdzdGFnZS0mZ3Q7dm1pZCA9IFJFQURfT05DRShrdm0tJmd0O2FyY2gudm1pZC52bWlkKTsKJiM0MzsJZ3N0YWdlLSZndDt2bWlkID0KJiM0MzsJCWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoJmFtcDtrdm0tJmd0O2FyY2gudm1pZC5pZCkpOwogCWdzdGFnZS0mZ3Q7cGdkID0ga3ZtLSZndDthcmNoLnBnZDsKIAlnc3RhZ2UtJmd0O3BnZF9sZXZlbHMgPSBrdm0tJmd0O2FyY2gucGdkX2xldmVsczsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaAppbmRleCBkYjYxYjA1MjVhOGQwLi5kZGQ3Y2MxMjVjM2Y2IDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmgKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fdm1pZC5oCkBAIC02LDIxICYjNDM7Niw0MiBAQAogI2lmbmRlZiBfX1JJU0NWX0tWTV9WTUlEX0hfCiAjZGVmaW5lIF9fUklTQ1ZfS1ZNX1ZNSURfSF8KIAomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9hdG9taWMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9rdm1fdHlwZXMuaCZndDsKIAogc3RydWN0IGt2bV92bWlkIHsKIAkvKgotCSAqIFdyaXRlcyB0byB2bWlkX3ZlcnNpb24gYW5kIHZtaWQgaGFwcGVuIHdpdGggdm1pZF9sb2NrIGhlbGQKLQkgKiB3aGVyZWFzIHJlYWRzIGhhcHBlbiB3aXRob3V0IGFueSBsb2NrIGhlbGQuCiYjNDM7CSAqIFNvZnR3YXJlIFZNSUQ6CiYjNDM7CSAqCiYjNDM7CSAqICAgWyBnZW5lcmF0aW9uIHwgaGFyZHdhcmUgVk1JRCBdCiYjNDM7CSAqCiYjNDM7CSAqIEtlZXAgdGhlIGlkZW50aXR5IDY0LWJpdCBvbiBSVjMyIHNvIHRoYXQgdGhlIGdlbmVyYXRpb24gZG9lcyBub3QKJiM0MzsJICogd3JhcCBhdCB0aGUgbmF0aXZlIHdvcmQgc2l6ZS4gIFplcm8gZGVub3RlcyBhbiB1bmFsbG9jYXRlZCBWTUlELgomIzQzOwkgKgomIzQzOwkgKiBPbmx5IHRoZSBsb3cgaGFyZHdhcmUgVk1JRCBiaXRzIG1heSBiZSB3cml0dGVuIHRvIEhHQVRQCiYjNDM7CSAqIG9yIHVzZWQgYXMgYSBoYXJkd2FyZSBmZW5jZSBWTUlELgogCSAqLwotCXVuc2lnbmVkIGxvbmcgdm1pZF92ZXJzaW9uOwotCXVuc2lnbmVkIGxvbmcgdm1pZDsKJiM0MzsJYXRvbWljNjRfdCBpZDsKIH07CiAKIHZvaWQgX19pbml0IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9kZXRlY3Qodm9pZCk7CiB1bnNpZ25lZCBsb25nIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9iaXRzKHZvaWQpOwomIzQzOwomIzQzO2ludCBfX2luaXQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2luaXQodm9pZCk7CiYjNDM7dm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfZnJlZSh2b2lkKTsKJiM0MzsKIGludCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaW5pdChzdHJ1Y3Qga3ZtICprdm0pOwomIzQzOwomIzQzO3Vuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodTY0IHZtaWQpOwomIzQzOwogYm9vbCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQoc3RydWN0IGt2bV92bWlkICp2bWlkKTsKJiM0MzsKIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCiYjNDM7LyoKJiM0MzsgKiBJbnZhbGlkYXRlIHRoZSBjdXJyZW50IENQVSYjMzk7cyBmYXN0LXBhdGggVk1JRCBzdGF0ZSB3aGlsZSBwcmVzZXJ2aW5nCiYjNDM7ICogdGhlIG9sZCBpZGVudGl0eSBjb25zZXJ2YXRpdmVseSBpbiByZXNlcnZlZF92bWlkcy4KJiM0MzsgKi8KJiM0Mzt2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9jcHVfaW52YWxpZGF0ZSh2b2lkKTsKJiM0MzsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vbWFpbi5jIGIvYXJjaC9yaXNjdi9rdm0vbWFpbi5jCmluZGV4IDg5NTY4Y2NjZTAxZGUuLmQ2YzZiZTRkZjYxYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcmlzY3Yva3ZtL21haW4uYwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2t2bS9tYWluLmMKQEAgLTE2LDcgJiM0MzsxNiw3IEBACiAjaW5jbHVkZSAmbHQ7YXNtL2t2bV9uYWNsLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7YXNtL3NiaS5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS9rdm1fdmNwdV92ZWN0b3IuaCZndDsKLQomIzQzOyNpbmNsdWRlICZsdDthc20va3ZtX3ZtaWQuaCZndDsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShib29sLCBrdm1fcmlzY3ZfdmlydHVhbGl6YXRpb25fZW5hYmxlZCk7CiAKIERFRklORV9TVEFUSUNfS0VZX0ZBTFNFKGt2bV9yaXNjdl92c3N0YWdlX3RsYl9ub19ncGEpOwpAQCAtODQsNiAmIzQzOzg0LDcgQEAgaW50IGt2bV9hcmNoX2VuYWJsZV92aXJ0dWFsaXphdGlvbl9jcHUodm9pZCkKIAogdm9pZCBrdm1fYXJjaF9kaXNhYmxlX3ZpcnR1YWxpemF0aW9uX2NwdSh2b2lkKQogewomIzQzOwlrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfY3B1X2ludmFsaWRhdGUoKTsKIAlrdm1fcmlzY3ZfYWlhX2Rpc2FibGUoKTsKIAlrdm1fcmlzY3ZfY3NyX2NsZWFudXAoKTsKIAlrdm1fcmlzY3ZfbmFjbF9kaXNhYmxlKCk7CkBAIC0xMTIsNiAmIzQzOzExMyw3IEBAIHN0YXRpYyBpbnQga3ZtX3Jpc2N2X2NwdV9wbV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcKIAkJICogaXMgZW5hYmxlZCBvbiB0aGlzIENQVS4KIAkJICovCiAJCWlmIChfX3RoaXNfY3B1X3JlYWQoa3ZtX3Jpc2N2X3ZpcnR1YWxpemF0aW9uX2VuYWJsZWQpKSB7CiYjNDM7CQkJa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKCk7CiAJCQlrdm1fcmlzY3ZfYWlhX3BtX2VudGVyKCk7CiAJCQlrdm1fcmlzY3ZfY3NyX2NsZWFudXAoKTsKIAkJfQpAQCAtMTMwLDYgJiM0MzsxMzIsNyBAQCBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGt2bV9yaXNjdl9jcHVfcG1fbmIgPSB7CiBzdGF0aWMgdm9pZCBrdm1fcmlzY3ZfdGVhcmRvd24odm9pZCkKIHsKIAlrdm1fcmlzY3ZfYWlhX2V4aXQoKTsKJiM0MzsJa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2ZyZWUoKTsKIAlrdm1fcmlzY3ZfbmFjbF9leGl0KCk7CiAJa3ZtX3Jpc2N2X3ZfZXhpdCgpOwogCWt2bV91bnJlZ2lzdGVyX3BlcmZfY2FsbGJhY2tzKCk7CkBAIC0xODEsOCAmIzQzOzE4NCwxNSBAQCBzdGF0aWMgaW50IF9faW5pdCByaXNjdl9rdm1faW5pdCh2b2lkKQogCiAJa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2RldGVjdCgpOwogCiYjNDM7CXJjID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2luaXQoKTsKJiM0MzsJaWYgKHJjKSB7CiYjNDM7CQlrdm1fcmlzY3ZfbmFjbF9leGl0KCk7CiYjNDM7CQlyZXR1cm4gcmM7CiYjNDM7CX0KJiM0MzsKIAlyYyA9IGt2bV9yaXNjdl9haWFfaW5pdCgpOwogCWlmIChyYyAmYW1wOyZhbXA7IHJjICE9IC1FTk9ERVYpIHsKJiM0MzsJCWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKCk7CiAJCWt2bV9yaXNjdl9uYWNsX2V4aXQoKTsKIAkJcmV0dXJuIHJjOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL21tdS5jIGIvYXJjaC9yaXNjdi9rdm0vbW11LmMKaW5kZXggNjAzNWI1ZWM5NTAzOS4uM2M4ZmI2MDA5YzBhNSAxMDA2NDQKLS0tIGEvYXJjaC9yaXNjdi9rdm0vbW11LmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9rdm0vbW11LmMKQEAgLTE1LDcgJiM0MzsxNSw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvc2NoZWQvc2lnbmFsLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7YXNtL2t2bV9tbXUuaCZndDsKICNpbmNsdWRlICZsdDthc20va3ZtX25hY2wuaCZndDsKLQomIzQzOyNpbmNsdWRlICZsdDthc20va3ZtX3ZtaWQuaCZndDsKIHN0YXRpYyBib29sIF9fcmVhZF9tb3N0bHkgZWFnZXJfcGFnZV9zcGxpdCA9IHRydWU7CiBtb2R1bGVfcGFyYW0oZWFnZXJfcGFnZV9zcGxpdCwgYm9vbCwgMDY0NCk7CiAKQEAgLTc5OSwxMCAmIzQzOzc5OSwxMSBAQCB2b2lkIGt2bV9yaXNjdl9tbXVfZnJlZV9wZ2Qoc3RydWN0IGt2bSAqa3ZtKQogdm9pZCBrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJc3RydWN0IGt2bV9hcmNoICprYSA9ICZhbXA7dmNwdS0mZ3Q7a3ZtLSZndDthcmNoOwomIzQzOwl1NjQgdm1pZCA9IGF0b21pYzY0X3JlYWQoJmFtcDtrYS0mZ3Q7dm1pZC5pZCk7CiAJdW5zaWduZWQgbG9uZyBoZ2F0cCA9IGt2bV9yaXNjdl9nc3RhZ2VfbW9kZShrYS0mZ3Q7cGdkX2xldmVscykKIAkJCSAgICAgICZsdDsmbHQ7IEhHQVRQX01PREVfU0hJRlQ7CiAKLQloZ2F0cCB8PSAoUkVBRF9PTkNFKGthLSZndDt2bWlkLnZtaWQpICZsdDsmbHQ7IEhHQVRQX1ZNSURfU0hJRlQpICZhbXA7IEhHQVRQX1ZNSUQ7CiYjNDM7CWhnYXRwIHw9IChrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh2bWlkKSAmbHQ7Jmx0OyBIR0FUUF9WTUlEX1NISUZUKSAmYW1wOyBIR0FUUF9WTUlEOwogCWhnYXRwIHw9IChrYS0mZ3Q7cGdkX3BoeXMgJmd0OyZndDsgUEFHRV9TSElGVCkgJmFtcDsgSEdBVFBfUFBOOwogCiAJbmNzcl93cml0ZShDU1JfSEdBVFAsIGhnYXRwKTsKZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3RsYi5jIGIvYXJjaC9yaXNjdi9rdm0vdGxiLmMKaW5kZXggMmFlMzQ2MzJjZGNiMS4uYjg1ZTViYTIxOThhYSAxMDA2NDQKLS0tIGEvYXJjaC9yaXNjdi9rdm0vdGxiLmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9rdm0vdGxiLmMKQEAgLTIyNCw3ICYjNDM7MjI0LDcgQEAgdm9pZCBrdm1fcmlzY3ZfbG9jYWxfdGxiX3Nhbml0aXplKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIAkgKiBlbnRyaWVzIGJ5IFZNSUQgd2hlbmV2ZXIgdW5kZXJseWluZyBIb3N0IENQVSBjaGFuZ2VzIGZvciBhIFZDUFUuCiAJICovCiAKLQl2bWlkID0gUkVBRF9PTkNFKHZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkLnZtaWQpOwomIzQzOwl2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZCgmYW1wO3ZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkLmlkKSk7CiAJa3ZtX3Jpc2N2X2xvY2FsX2hmZW5jZV9ndm1hX3ZtaWRfYWxsKHZtaWQpOwogCiAJLyoKQEAgLTI0NCw3ICYjNDM7MjQ0LDcgQEAgdm9pZCBrdm1fcmlzY3ZfZmVuY2VfaV9wcm9jZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHZvaWQga3ZtX3Jpc2N2X3RsYl9mbHVzaF9wcm9jZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlzdHJ1Y3Qga3ZtX3ZtaWQgKnYgPSAmYW1wO3ZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkOwotCXVuc2lnbmVkIGxvbmcgdm1pZCA9IFJFQURfT05DRSh2LSZndDt2bWlkKTsKJiM0MzsJdW5zaWduZWQgbG9uZyB2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZCgmYW1wO3YtJmd0O2lkKSk7CiAKIAlpZiAoa3ZtX3Jpc2N2X25hY2xfYXZhaWxhYmxlKCkpCiAJCW5hY2xfaGZlbmNlX2d2bWFfdm1pZF9hbGwobmFjbF9zaG1lbSgpLCB2bWlkKTsKQEAgLTI1NSw3ICYjNDM7MjU1LDcgQEAgdm9pZCBrdm1fcmlzY3ZfdGxiX2ZsdXNoX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogdm9pZCBrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYWxsX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXN0cnVjdCBrdm1fdm1pZCAqdiA9ICZhbXA7dmNwdS0mZ3Q7a3ZtLSZndDthcmNoLnZtaWQ7Ci0JdW5zaWduZWQgbG9uZyB2bWlkID0gUkVBRF9PTkNFKHYtJmd0O3ZtaWQpOwomIzQzOwl1bnNpZ25lZCBsb25nIHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKCZhbXA7di0mZ3Q7aWQpKTsKIAogCWlmIChrdm1fcmlzY3ZfbmFjbF9hdmFpbGFibGUoKSkKIAkJbmFjbF9oZmVuY2VfdnZtYV9hbGwobmFjbF9zaG1lbSgpLCB2bWlkKTsKQEAgLTUzMSw4ICYjNDM7NTMxLDExIEBAIHZvaWQga3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbChzdHJ1Y3Qga3ZtICprdm0sCiAKIGludCBrdm1fYXJjaF9mbHVzaF9yZW1vdGVfdGxic19yYW5nZShzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbiwgdTY0IG5yX3BhZ2VzKQogewomIzQzOwl1bnNpZ25lZCBsb25nIHZtaWQgPQomIzQzOwkJa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZCgmYW1wO2t2bS0mZ3Q7YXJjaC52bWlkLmlkKSk7CiYjNDM7CiAJa3ZtX3Jpc2N2X2hmZW5jZV9ndm1hX3ZtaWRfZ3BhKGt2bSwgLTFVTCwgMCwKIAkJCQkgICAgICAgZ2ZuICZsdDsmbHQ7IFBBR0VfU0hJRlQsIG5yX3BhZ2VzICZsdDsmbHQ7IFBBR0VfU0hJRlQsCi0JCQkJICAgICAgIFBBR0VfU0hJRlQsIFJFQURfT05DRShrdm0tJmd0O2FyY2gudm1pZC52bWlkKSk7CiYjNDM7CQkJCSAgICAgICBQQUdFX1NISUZULCB2bWlkKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHUuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHUuYwppbmRleCBlMDYyY2ExOWY5ZDhmLi44NTU0MmMxYTVlYzNmIDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L2t2bS92Y3B1LmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9rdm0vdmNwdS5jCkBAIC05NDMsMTQgJiM0Mzs5NDMsMTQgQEAgaW50IGt2bV9hcmNoX3ZjcHVfaW9jdGxfcnVuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIAkJCWNvbnRpbnVlOwogCQlyZXQgPSAxOwogCi0JCWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUodmNwdSk7Ci0KIAkJcmV0ID0ga3ZtX3Jpc2N2X2NoZWNrX3ZjcHVfcmVxdWVzdHModmNwdSk7CiAJCWlmIChyZXQgJmx0Oz0gMCkKIAkJCWNvbnRpbnVlOwogCiAJCXByZWVtcHRfZGlzYWJsZSgpOwogCiYjNDM7CQlrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHZjcHUpOwomIzQzOwogCQkvKiBVcGRhdGUgQUlBIEhXIHN0YXRlIGJlZm9yZSBlbnRlcmluZyBndWVzdCAqLwogCQlyZXQgPSBrdm1fcmlzY3ZfdmNwdV9haWFfdXBkYXRlKHZjcHUpOwogCQlpZiAocmV0ICZsdDs9IDApIHsKZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuYwppbmRleCA1MDZhNTEwYjZiZmYzLi4xYmUzODZhNzhlMjdmIDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV9yZXBsYWNlLmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfcmVwbGFjZS5jCkBAIC0xMDQsNyAmIzQzOzEwNCw3IEBAIHN0YXRpYyBpbnQga3ZtX3NiaV9leHRfcmZlbmNlX2hhbmRsZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuCiAJCWt2bV9yaXNjdl92Y3B1X3BtdV9pbmNyX2Z3KHZjcHUsIFNCSV9QTVVfRldfRkVOQ0VfSV9TRU5UKTsKIAkJYnJlYWs7CiAJY2FzZSBTQklfRVhUX1JGRU5DRV9SRU1PVEVfU0ZFTkNFX1ZNQToKLQkJdm1pZCA9IFJFQURfT05DRSh2Y3B1LSZndDtrdm0tJmd0O2FyY2gudm1pZC52bWlkKTsKJiM0MzsJCXZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKCZhbXA7dmNwdS0mZ3Q7a3ZtLSZndDthcmNoLnZtaWQuaWQpKTsKIAkJaWYgKChjcC0mZ3Q7YTIgPT0gMCAmYW1wOyZhbXA7IGNwLSZndDthMyA9PSAwKSB8fCBjcC0mZ3Q7YTMgPT0gLTFVTCkKIAkJCWt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwodmNwdS0mZ3Q7a3ZtLCBoYmFzZSwgaG1hc2ssIHZtaWQpOwogCQllbHNlCkBAIC0xMTMsNyAmIzQzOzExMyw3IEBAIHN0YXRpYyBpbnQga3ZtX3NiaV9leHRfcmZlbmNlX2hhbmRsZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuCiAJCWt2bV9yaXNjdl92Y3B1X3BtdV9pbmNyX2Z3KHZjcHUsIFNCSV9QTVVfRldfSEZFTkNFX1ZWTUFfU0VOVCk7CiAJCWJyZWFrOwogCWNhc2UgU0JJX0VYVF9SRkVOQ0VfUkVNT1RFX1NGRU5DRV9WTUFfQVNJRDoKLQkJdm1pZCA9IFJFQURfT05DRSh2Y3B1LSZndDtrdm0tJmd0O2FyY2gudm1pZC52bWlkKTsKJiM0MzsJCXZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKCZhbXA7dmNwdS0mZ3Q7a3ZtLSZndDthcmNoLnZtaWQuaWQpKTsKIAkJaWYgKChjcC0mZ3Q7YTIgPT0gMCAmYW1wOyZhbXA7IGNwLSZndDthMyA9PSAwKSB8fCBjcC0mZ3Q7YTMgPT0gLTFVTCkKIAkJCWt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hc2lkX2FsbCh2Y3B1LSZndDtrdm0sIGhiYXNlLCBobWFzaywKIAkJCQkJCSAgICAgICBjcC0mZ3Q7YTQsIHZtaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfdjAxLmMgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuYwppbmRleCBkZTU0NGVhM2YyOGRjLi5jYTNlZmU2M2MxY2YxIDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuYwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuYwpAQCAtODgsMTQgJiM0Mzs4OCwxNCBAQCBzdGF0aWMgaW50IGt2bV9zYmlfZXh0X3YwMV9oYW5kbGVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1biwKIAkJaWYgKGNwLSZndDthNyA9PSBTQklfRVhUXzBfMV9SRU1PVEVfRkVOQ0VfSSkKIAkJCWt2bV9yaXNjdl9mZW5jZV9pKHZjcHUtJmd0O2t2bSwgaGJhc2UsIGhtYXNrKTsKIAkJZWxzZSBpZiAoY3AtJmd0O2E3ID09IFNCSV9FWFRfMF8xX1JFTU9URV9TRkVOQ0VfVk1BKSB7Ci0JCQl2bWlkID0gUkVBRF9PTkNFKHZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkLnZtaWQpOwomIzQzOwkJCXZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKCZhbXA7dmNwdS0mZ3Q7a3ZtLSZndDthcmNoLnZtaWQuaWQpKTsKIAkJCWlmIChjcC0mZ3Q7YTEgPT0gMCAmYW1wOyZhbXA7IGNwLSZndDthMiA9PSAwKQogCQkJCWt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwodmNwdS0mZ3Q7a3ZtLCBoYmFzZSwgaG1hc2ssIHZtaWQpOwogCQkJZWxzZQogCQkJCWt2bV9yaXNjdl9oZmVuY2VfdnZtYV9ndmEodmNwdS0mZ3Q7a3ZtLCBoYmFzZSwgaG1hc2ssIGNwLSZndDthMSwKIAkJCQkJCQkgIGNwLSZndDthMiwgUEFHRV9TSElGVCwgdm1pZCk7CiAJCX0gZWxzZSB7Ci0JCQl2bWlkID0gUkVBRF9PTkNFKHZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkLnZtaWQpOwomIzQzOwkJCXZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKCZhbXA7dmNwdS0mZ3Q7a3ZtLSZndDthcmNoLnZtaWQuaWQpKTsKIAkJCWlmIChjcC0mZ3Q7YTEgPT0gMCAmYW1wOyZhbXA7IGNwLSZndDthMiA9PSAwKQogCQkJCWt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hc2lkX2FsbCh2Y3B1LSZndDtrdm0sIGhiYXNlLCBobWFzaywKIAkJCQkJCQkgICAgICAgY3AtJmd0O2EzLCB2bWlkKTsKZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuYwppbmRleCBjMTViZGIxZGQ4YmVmLi43Yjg2YTZmYmU0YTY5IDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L2t2bS92bWlkLmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9rdm0vdm1pZC5jCkBAIC02LDExICYjNDM7NiwxNSBAQAogICogICAgIEFudXAgUGF0ZWwgJmx0O2FudXAucGF0ZWxAd2RjLmNvbSZndDsKICAqLwogCiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2JpdG1hcC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2JpdG9wcy5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2NwdW1hc2suaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9lcnJuby5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2Vyci5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L21vZHVsZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9wZXJjcHUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcHJlZW1wdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zbGFiLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvc21wLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgva3ZtX2hvc3QuaCZndDsKICNpbmNsdWRlICZsdDthc20vY3NyLmgmZ3Q7CkBAIC0xOCwyNiAmIzQzOzIyLDU0IEBACiAjaW5jbHVkZSAmbHQ7YXNtL2t2bV90bGIuaCZndDsKICNpbmNsdWRlICZsdDthc20va3ZtX3ZtaWQuaCZndDsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF92ZXJzaW9uID0gMTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZtaWRfbmV4dDsKJiM0MztzdGF0aWMgYXRvbWljNjRfdCB2bWlkX2dlbmVyYXRpb247CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgKnZtaWRfbWFwOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF9iaXRzIF9fcm9fYWZ0ZXJfaW5pdDsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodm1pZF9sb2NrKTsKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX2N1cl9pZHggPSAxOwomIzQzOwomIzQzO3N0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKHZtaWRfbG9jayk7CiYjNDM7CiYjNDM7c3RhdGljIERFRklORV9QRVJfQ1BVKGF0b21pYzY0X3QsIGFjdGl2ZV92bWlkcyk7CiYjNDM7c3RhdGljIERFRklORV9QRVJfQ1BVKHU2NCwgcmVzZXJ2ZWRfdm1pZHMpOwomIzQzOwomIzQzO3N0YXRpYyBjcHVtYXNrX3QgdGxiX2ZsdXNoX3BlbmRpbmc7CiYjNDM7CiYjNDM7I2RlZmluZSBWTUlEX0ZJUlNUX1ZFUlNJT04JQklUX1VMTCh2bWlkX2JpdHMpCiYjNDM7I2RlZmluZSBOVU1fVk1JRFMJCUJJVCh2bWlkX2JpdHMpCiYjNDM7I2RlZmluZSBWTUlEX0hXX01BU0sJCShWTUlEX0ZJUlNUX1ZFUlNJT04gLSAxKQomIzQzOwomIzQzO3N0YXRpYyBib29sIHZtaWRfZ2VuX21hdGNoKHU2NCB2bWlkKQomIzQzO3sKJiM0MzsJcmV0dXJuICEoKHZtaWQgXiBhdG9taWM2NF9yZWFkKCZhbXA7dm1pZF9nZW5lcmF0aW9uKSkgJmd0OyZndDsgdm1pZF9iaXRzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dW5zaWduZWQgbG9uZyBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh1NjQgdm1pZCkKJiM0Mzt7CiYjNDM7CWlmICghdm1pZF9iaXRzKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXJldHVybiAodW5zaWduZWQgbG9uZykodm1pZCAmYW1wOyBWTUlEX0hXX01BU0spOwomIzQzO30KIAogdm9pZCBfX2luaXQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2RldGVjdCh2b2lkKQogewotCS8qIEZpZ3VyZS1vdXQgbnVtYmVyIG9mIFZNSUQgYml0cyBpbiBIVyAqLwomIzQzOwkvKiBGaWd1cmUgb3V0IHRoZSBudW1iZXIgb2YgVk1JRCBiaXRzIHN1cHBvcnRlZCBieSBoYXJkd2FyZS4gKi8KIAljc3Jfd3JpdGUoQ1NSX0hHQVRQLCAoa3ZtX3Jpc2N2X2dzdGFnZV9tb2RlKGt2bV9yaXNjdl9nc3RhZ2VfbWF4X3BnZF9sZXZlbHMpICZsdDsmbHQ7Ci0JCQkgICAgICBIR0FUUF9NT0RFX1NISUZUKSB8IEhHQVRQX1ZNSUQpOwomIzQzOwkJICAgSEdBVFBfTU9ERV9TSElGVCkgfCBIR0FUUF9WTUlEKTsKIAl2bWlkX2JpdHMgPSBjc3JfcmVhZChDU1JfSEdBVFApOwogCXZtaWRfYml0cyA9ICh2bWlkX2JpdHMgJmFtcDsgSEdBVFBfVk1JRCkgJmd0OyZndDsgSEdBVFBfVk1JRF9TSElGVDsKIAl2bWlkX2JpdHMgPSBmbHNfbG9uZyh2bWlkX2JpdHMpOwogCWNzcl93cml0ZShDU1JfSEdBVFAsIDApOwogCi0JLyogV2UgcG9sbHV0ZWQgbG9jYWwgVExCIHNvIGZsdXNoIGFsbCBndWVzdCBUTEIgKi8KJiM0MzsJLyogRmx1c2ggdGhlIGxvY2FsIGd1ZXN0IFRMQiBhZnRlciBwcm9iaW5nIEhHQVRQLiAqLwogCWt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwoKTsKIAotCS8qIFdlIGRvbiYjMzk7dCB1c2UgVk1JRCBiaXRzIGlmIHRoZXkgYXJlIG5vdCBzdWZmaWNpZW50ICovCi0JaWYgKCgxVUwgJmx0OyZsdDsgdm1pZF9iaXRzKSAmbHQ7IG51bV9wb3NzaWJsZV9jcHVzKCkpCiYjNDM7CS8qCiYjNDM7CSAqIFZNSUQgMCBpcyByZXNlcnZlZC4gIER1cmluZyByb2xsb3ZlciBldmVyeSBwb3NzaWJsZSBDUFUgbWF5CiYjNDM7CSAqIHJlc2VydmUgb25lIGhhcmR3YXJlIFZNSUQsIGFuZCB3ZSBzdGlsbCBuZWVkIGF0IGxlYXN0IG9uZSBWTUlECiYjNDM7CSAqIGF2YWlsYWJsZSBmb3IgYSBuZXcgYWxsb2NhdGlvbi4KJiM0MzsJICovCiYjNDM7CWlmICh2bWlkX2JpdHMgJmFtcDsmYW1wOyBOVU1fVk1JRFMgLSAxICZsdDs9IG51bV9wb3NzaWJsZV9jcHVzKCkpCiAJCXZtaWRfYml0cyA9IDA7CiB9CiAKQEAgLTQ2LDgwICYjNDM7NzgsMjk4IEBAIHVuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHModm9pZCkKIAlyZXR1cm4gdm1pZF9iaXRzOwogfQogCiYjNDM7aW50IF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfaW5pdCh2b2lkKQomIzQzO3sKJiM0MzsJaW50IGNwdTsKJiM0MzsKJiM0MzsJaWYgKCF2bWlkX2JpdHMpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJdm1pZF9tYXAgPSBiaXRtYXBfemFsbG9jKE5VTV9WTUlEUywgR0ZQX0tFUk5FTCk7CiYjNDM7CWlmICghdm1pZF9tYXApCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJdm1pZF9jdXJfaWR4ID0gMTsKJiM0MzsKJiM0MzsJLyogSGFyZHdhcmUgVk1JRCAwIGlzIHJlc2VydmVkLiAqLwomIzQzOwlfX3NldF9iaXQoMCwgdm1pZF9tYXApOwomIzQzOwomIzQzOwlhdG9taWM2NF9zZXQoJmFtcDt2bWlkX2dlbmVyYXRpb24sIFZNSURfRklSU1RfVkVSU0lPTik7CiYjNDM7CiYjNDM7CWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKJiM0MzsJCWF0b21pYzY0X3NldCgmYW1wO3Blcl9jcHUoYWN0aXZlX3ZtaWRzLCBjcHUpLCAwKTsKJiM0MzsJCXBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSkgPSAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEV2ZXJ5IENQVSBwZXJmb3JtcyBhbiBpbml0aWFsIGxvY2FsIGludmFsaWRhdGlvbiBiZWZvcmUgaXRzCiYjNDM7CSAqIGZpcnN0IFZNSUQgYWN0aXZhdGlvbi4KJiM0MzsJICovCiYjNDM7CWNwdW1hc2tfY29weSgmYW1wO3RsYl9mbHVzaF9wZW5kaW5nLCBjcHVfcG9zc2libGVfbWFzayk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKHZvaWQpCiYjNDM7ewomIzQzOwliaXRtYXBfZnJlZSh2bWlkX21hcCk7CiYjNDM7CXZtaWRfbWFwID0gTlVMTDsKJiM0Mzt9CiYjNDM7CiBpbnQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2luaXQoc3RydWN0IGt2bSAqa3ZtKQogewotCS8qIE1hcmsgdGhlIGluaXRpYWwgVk1JRCBhbmQgVk1JRCB2ZXJzaW9uIGludmFsaWQgKi8KLQlrdm0tJmd0O2FyY2gudm1pZC52bWlkX3ZlcnNpb24gPSAwOwotCWt2bS0mZ3Q7YXJjaC52bWlkLnZtaWQgPSAwOwomIzQzOwlhdG9taWM2NF9zZXQoJmFtcDtrdm0tJmd0O2FyY2gudm1pZC5pZCwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogYm9vbCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQoc3RydWN0IGt2bV92bWlkICp2bWlkKQogewomIzQzOwl1NjQgaWQ7CiYjNDM7CiAJaWYgKCF2bWlkX2JpdHMpCiAJCXJldHVybiBmYWxzZTsKIAotCXJldHVybiB1bmxpa2VseShSRUFEX09OQ0Uodm1pZC0mZ3Q7dm1pZF92ZXJzaW9uKSAhPQotCQkJUkVBRF9PTkNFKHZtaWRfdmVyc2lvbikpOwomIzQzOwlpZCA9IGF0b21pYzY0X3JlYWQoJmFtcDt2bWlkLSZndDtpZCk7CiYjNDM7CiYjNDM7CXJldHVybiB1bmxpa2VseSghdm1pZF9nZW5fbWF0Y2goaWQpKTsKIH0KIAotc3RhdGljIHZvaWQgX19sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwodm9pZCAqaW5mbykKJiM0MzsvKgomIzQzOyAqIENhbGxlZCB3aXRoIHZtaWRfbG9jayBoZWxkIGFmdGVyIHZtaWRfZ2VuZXJhdGlvbiBoYXMgYWxyZWFkeSBiZWVuCiYjNDM7ICogYWR2YW5jZWQuCiYjNDM7ICoKJiM0MzsgKiBObyByZW1vdGUgQ1BVIGlzIGludGVycnVwdGVkIGhlcmUuICBJbnN0ZWFkLCBwcmVzZXJ2ZSBldmVyeSBWTUlECiYjNDM7ICogd2hpY2ggbWF5IHN0aWxsIGJlIHVzZWQgYnkgYSBDUFUgYW5kIHF1ZXVlIGEgbG9jYWwgaW52YWxpZGF0aW9uIGZvcgomIzQzOyAqIHRoYXQgQ1BVJiMzOTtzIG5leHQgVk1JRCBhY3RpdmF0aW9uLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIGZsdXNoX2NvbnRleHQodm9pZCkKIHsKLQlrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfYWxsKCk7CiYjNDM7CXU2NCB2bWlkOwomIzQzOwlpbnQgY3B1OwomIzQzOwomIzQzOwliaXRtYXBfemVybyh2bWlkX21hcCwgTlVNX1ZNSURTKTsKJiM0MzsJX19zZXRfYml0KDAsIHZtaWRfbWFwKTsKJiM0MzsKJiM0MzsJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewomIzQzOwkJdm1pZCA9IGF0b21pYzY0X3hjaGcoJmFtcDtwZXJfY3B1KGFjdGl2ZV92bWlkcywgY3B1KSwgMCk7CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogVGhlIENQVSBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gY2F1Z2h0IGJ5IGFuIGVhcmxpZXIgcm9sbG92ZXIKJiM0MzsJCSAqIHdpdGhvdXQgcGVyZm9ybWluZyBhbm90aGVyIGFjdGl2YXRpb24gc2luY2UgdGhlbi4gIEluIHRoYXQKJiM0MzsJCSAqIGNhc2UgcmVzZXJ2ZWRfdm1pZHMgaXMgdGhlIG9ubHkgcmVjb3JkIG9mIHRoZSBvbGQgY29udGV4dC4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKCF2bWlkKQomIzQzOwkJCXZtaWQgPSBwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpOwomIzQzOwomIzQzOwkJaWYgKHZtaWQpCiYjNDM7CQkJX19zZXRfYml0KGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHZtaWQpLAomIzQzOwkJCQkgIHZtaWRfbWFwKTsKJiM0MzsKJiM0MzsJCXBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSkgPSB2bWlkOwomIzQzOwl9CiYjNDM7CiYjNDM7CWNwdW1hc2tfY29weSgmYW1wO3RsYl9mbHVzaF9wZW5kaW5nLCBjcHVfcG9zc2libGVfbWFzayk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVXBkYXRlIGV2ZXJ5IHJlc2VydmVkIGNvcHkgb2YgYW4gb2xkIHNvZnR3YXJlIFZNSUQuCiYjNDM7ICoKJiM0MzsgKiBEbyBub3Qgc3RvcCBhZnRlciB0aGUgZmlyc3QgbWF0Y2g6IHRoZSBzYW1lIFZNIG1heSBoYXZlIGJlZW4gYWN0aXZlCiYjNDM7ICogb24gbW9yZSB0aGFuIG9uZSBDUFUgd2hlbiByb2xsb3ZlciBvY2N1cnJlZC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBjaGVja191cGRhdGVfcmVzZXJ2ZWRfdm1pZCh1NjQgb2xkX3ZtaWQsIHU2NCBuZXdfdm1pZCkKJiM0Mzt7CiYjNDM7CWJvb2wgaGl0ID0gZmFsc2U7CiYjNDM7CWludCBjcHU7CiYjNDM7CiYjNDM7CWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKJiM0MzsJCWlmIChwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID09IG9sZF92bWlkKSB7CiYjNDM7CQkJcGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IG5ld192bWlkOwomIzQzOwkJCWhpdCA9IHRydWU7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIGhpdDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBBbGxvY2F0ZS9wcm9tb3RlIGEgc29mdHdhcmUgVk1JRC4KJiM0MzsgKgomIzQzOyAqIHZtaWRfbG9jayBtdXN0IGJlIGhlbGQgYnkgdGhlIGNhbGxlci4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdTY0IG5ld192bWlkX2xvY2tlZChzdHJ1Y3Qga3ZtX3ZtaWQgKmt2bV92bWlkKQomIzQzO3sKJiM0MzsJdTY0IHZtaWQgPSBhdG9taWM2NF9yZWFkKCZhbXA7a3ZtX3ZtaWQtJmd0O2lkKTsKJiM0MzsJdTY0IGdlbmVyYXRpb24gPSBhdG9taWM2NF9yZWFkKCZhbXA7dm1pZF9nZW5lcmF0aW9uKTsKJiM0MzsJdTY0IG5ld192bWlkOwomIzQzOwl1bnNpZ25lZCBsb25nIGlkeDsKJiM0MzsKJiM0MzsJaWYgKHZtaWQpIHsKJiM0MzsJCW5ld192bWlkID0gZ2VuZXJhdGlvbiB8CiYjNDM7CQkJICAga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCk7CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogVGhlIG9sZCBWTUlEIGlzIHN0aWxsIHByb3RlY3RlZCBieSBvbmUgb3IgbW9yZSBDUFVzLgomIzQzOwkJICogS2VlcCB0aGUgc2FtZSBoYXJkd2FyZSBWTUlEIGFuZCBvbmx5IHByb21vdGUgZ2VuZXJhdGlvbi4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKGNoZWNrX3VwZGF0ZV9yZXNlcnZlZF92bWlkKHZtaWQsIG5ld192bWlkKSkKJiM0MzsJCQlyZXR1cm4gbmV3X3ZtaWQ7CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogVGhlIFZNIGhhZCBhIFZNSUQgaW4gYW4gb2xkZXIgZ2VuZXJhdGlvbi4gIFJldXNlIHRoZSBzYW1lCiYjNDM7CQkgKiBoYXJkd2FyZSBudW1iZXIgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY2xhaW1lZC4KJiM0MzsJCSAqLwomIzQzOwkJaWR4ID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCk7CiYjNDM7CQlpZiAoIV9fdGVzdF9hbmRfc2V0X2JpdChpZHgsIHZtaWRfbWFwKSkKJiM0MzsJCQlyZXR1cm4gbmV3X3ZtaWQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogRmluZCBhIGZyZWUgVk1JRCBpbiB0aGUgY3VycmVudCBnZW5lcmF0aW9uLgomIzQzOwkgKi8KJiM0MzsJaWR4ID0gZmluZF9uZXh0X3plcm9fYml0KHZtaWRfbWFwLCBOVU1fVk1JRFMsIHZtaWRfY3VyX2lkeCk7CiYjNDM7CWlmIChpZHggIT0gTlVNX1ZNSURTKQomIzQzOwkJZ290byBzZXRfdm1pZDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogTm8gZnJlZSBWTUlELiAgU3RhcnQgYSBuZXcgZ2VuZXJhdGlvbiwgcHJlc2VydmUgYWxsIENQVS1sb2NhbAomIzQzOwkgKiB1c2VycywgYW5kIGRlZmVyIGVhY2ggQ1BVJiMzOTtzIGZsdXNoIHVudGlsIGl0cyBuZXh0IGFjdGl2YXRpb24uCiYjNDM7CSAqLwomIzQzOwlnZW5lcmF0aW9uICYjNDM7PSBWTUlEX0ZJUlNUX1ZFUlNJT047CiYjNDM7CiYjNDM7CS8qIFNvZnR3YXJlIFZNSUQgMCBpcyByZXNlcnZlZCBhcyB0aGUgaW52YWxpZCBpZGVudGlmaWVyLiAqLwomIzQzOwlpZiAodW5saWtlbHkoIWdlbmVyYXRpb24pKQomIzQzOwkJZ2VuZXJhdGlvbiA9IFZNSURfRklSU1RfVkVSU0lPTjsKJiM0MzsKJiM0MzsJYXRvbWljNjRfeGNoZygmYW1wO3ZtaWRfZ2VuZXJhdGlvbiwgZ2VuZXJhdGlvbik7CiYjNDM7CWZsdXNoX2NvbnRleHQoKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogTlVNX1ZNSURTIC0gMSAmZ3Q7IG51bV9wb3NzaWJsZV9jcHVzKCksIHRoZXJlZm9yZSByb2xsb3ZlciBtdXN0CiYjNDM7CSAqIGxlYXZlIGF0IGxlYXN0IG9uZSBhbGxvY2F0YWJsZSBoYXJkd2FyZSBWTUlELgomIzQzOwkgKi8KJiM0MzsJaWR4ID0gZmluZF9uZXh0X3plcm9fYml0KHZtaWRfbWFwLCBOVU1fVk1JRFMsIDEpOwomIzQzOwomIzQzO3NldF92bWlkOgomIzQzOwlfX3NldF9iaXQoaWR4LCB2bWlkX21hcCk7CiYjNDM7CXZtaWRfY3VyX2lkeCA9IGlkeDsKJiM0MzsKJiM0MzsJcmV0dXJuIGdlbmVyYXRpb24gfCBpZHg7CiB9CiAKIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JdW5zaWduZWQgbG9uZyBpOwomIzQzOwlzdHJ1Y3Qga3ZtX3ZtaWQgKmt2bV92bWlkID0gJmFtcDt2Y3B1LSZndDtrdm0tJmd0O2FyY2gudm1pZDsKJiM0MzsJYXRvbWljNjRfdCAqYWN0aXZlOwogCXN0cnVjdCBrdm1fdmNwdSAqdjsKLQlzdHJ1Y3Qga3ZtX3ZtaWQgKnZtaWQgPSAmYW1wO3ZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkOwomIzQzOwl1bnNpZ25lZCBsb25nIGZsYWdzOwomIzQzOwl1NjQgdm1pZDsKJiM0MzsJdTY0IG9sZF9hY3RpdmVfdm1pZDsKJiM0MzsJdW5zaWduZWQgbG9uZyBpOwomIzQzOwl1bnNpZ25lZCBpbnQgY3B1OwomIzQzOwlib29sIHZtaWRfY2hhbmdlZCA9IGZhbHNlOwogCi0JaWYgKCFrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQodm1pZCkpCiYjNDM7CWlmICghdm1pZF9iaXRzKQogCQlyZXR1cm47CiAKLQlzcGluX2xvY2soJmFtcDt2bWlkX2xvY2spOwomIzQzOwkvKgomIzQzOwkgKiBhY3RpdmVfdm1pZHMgYW5kIHRsYl9mbHVzaF9wZW5kaW5nIGFyZSBwZXItQ1BVIGFkbWlzc2lvbiBzdGF0ZS4KJiM0MzsJICogVGhleSBtdXN0IHJlZmVyIHRvIHRoZSBzYW1lIENQVSBmb3IgdGhlIGNvbXBsZXRlIGFjdGl2YXRpb24uCiYjNDM7CSAqLwomIzQzOwlwcmVlbXB0X2Rpc2FibGUoKTsKJiM0MzsKJiM0MzsJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwomIzQzOwlhY3RpdmUgPSB0aGlzX2NwdV9wdHIoJmFtcDthY3RpdmVfdm1pZHMpOwomIzQzOwomIzQzOwl2bWlkID0gYXRvbWljNjRfcmVhZCgmYW1wO2t2bV92bWlkLSZndDtpZCk7CiYjNDM7CW9sZF9hY3RpdmVfdm1pZCA9IGF0b21pYzY0X3JlYWQoYWN0aXZlKTsKIAogCS8qCi0JICogV2UgbmVlZCB0byByZS1jaGVjayB0aGUgdm1pZF92ZXJzaW9uIGhlcmUgdG8gZW5zdXJlIHRoYXQgaWYKLQkgKiBhbm90aGVyIHZjcHUgYWxyZWFkeSBhbGxvY2F0ZWQgYSB2YWxpZCB2bWlkIGZvciB0aGlzIHZtLgomIzQzOwkgKiBGYXN0IHBhdGguCiYjNDM7CSAqCiYjNDM7CSAqIFRoZSBjbXB4Y2hnIHJhY2VzIHdpdGggZmx1c2hfY29udGV4dCgpJiMzOTtzIHhjaGcgb24gdGhlIHNhbWUKJiM0MzsJICogcGVyLUNQVSBhdG9taWMuICBFaXRoZXIgdGhpcyBhY3RpdmF0aW9uIGlzIGNhcHR1cmVkIGJ5IHJvbGxvdmVyLAomIzQzOwkgKiBvciByb2xsb3ZlciBjbGVhcnMgYWN0aXZlIGZpcnN0IGFuZCB0aGUgY21weGNoZyBmYWlscy4KIAkgKi8KLQlpZiAoIWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF92ZXJfY2hhbmdlZCh2bWlkKSkgewotCQlzcGluX3VubG9jaygmYW1wO3ZtaWRfbG9jayk7Ci0JCXJldHVybjsKJiM0MzsJaWYgKG9sZF9hY3RpdmVfdm1pZCAmYW1wOyZhbXA7CiYjNDM7CSAgICB2bWlkX2dlbl9tYXRjaCh2bWlkKSAmYW1wOyZhbXA7CiYjNDM7CSAgICBhdG9taWM2NF9jbXB4Y2hnKGFjdGl2ZSwgb2xkX2FjdGl2ZV92bWlkLCB2bWlkKSA9PQomIzQzOwkgICAgb2xkX2FjdGl2ZV92bWlkKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmYW1wO3ZtaWRfbG9jaywgZmxhZ3MpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBSZS1yZWFkIHVuZGVyIHRoZSBhbGxvY2F0b3IgbG9jayBiZWNhdXNlIGFub3RoZXIgdkNQVSBvZiB0aGlzIFZNCiYjNDM7CSAqIG1heSBhbHJlYWR5IGhhdmUgcHJvbW90ZWQgb3IgYWxsb2NhdGVkIHRoZSBzaGFyZWQgVk1JRC4KJiM0MzsJICovCiYjNDM7CXZtaWQgPSBhdG9taWM2NF9yZWFkKCZhbXA7a3ZtX3ZtaWQtJmd0O2lkKTsKJiM0MzsKJiM0MzsJaWYgKCF2bWlkX2dlbl9tYXRjaCh2bWlkKSkgewomIzQzOwkJdm1pZCA9IG5ld192bWlkX2xvY2tlZChrdm1fdm1pZCk7CiYjNDM7CQlhdG9taWM2NF9zZXQoJmFtcDtrdm1fdm1pZC0mZ3Q7aWQsIHZtaWQpOwomIzQzOwkJdm1pZF9jaGFuZ2VkID0gdHJ1ZTsKIAl9CiAKLQkvKiBGaXJzdCB1c2VyIG9mIGEgbmV3IFZNSUQgdmVyc2lvbj8gKi8KLQlpZiAodW5saWtlbHkodm1pZF9uZXh0ID09IDApKSB7Ci0JCVdSSVRFX09OQ0Uodm1pZF92ZXJzaW9uLCBSRUFEX09OQ0Uodm1pZF92ZXJzaW9uKSAmIzQzOyAxKTsKLQkJdm1pZF9uZXh0ID0gMTsKJiM0MzsJLyoKJiM0MzsJICogRXZlbiBpZiBhbm90aGVyIHZDUFUgYWxyZWFkeSB1cGRhdGVkIHRoZSBzaGFyZWQgVk1JRCwgdGhpcyBDUFUKJiM0MzsJICogbXVzdCBzdGlsbCBkaXNjaGFyZ2UgaXRzIG93biByb2xsb3ZlciBmbHVzaCBvYmxpZ2F0aW9uLgomIzQzOwkgKi8KJiM0MzsJaWYgKGNwdW1hc2tfdGVzdF9hbmRfY2xlYXJfY3B1KGNwdSwgJmFtcDt0bGJfZmx1c2hfcGVuZGluZykpCiYjNDM7CQlrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfYWxsKCk7CiAKLQkJLyoKLQkJICogV2UgcmFuIG91dCBvZiBWTUlEcyBzbyB3ZSBpbmNyZW1lbnQgdm1pZF92ZXJzaW9uIGFuZAotCQkgKiBzdGFydCBhc3NpZ25pbmcgVk1JRHMgZnJvbSAxLgotCQkgKgotCQkgKiBUaGlzIGFsc28gbWVhbnMgZXhpc3RpbmcgVk1JRHMgYXNzaWdubWVudCB0byBhbGwgR3Vlc3QKLQkJICogaW5zdGFuY2VzIGlzIGludmFsaWQgYW5kIHdlIGhhdmUgZm9yY2UgVk1JRCByZS1hc3NpZ25lbWVudAotCQkgKiBmb3IgYWxsIEd1ZXN0IGluc3RhbmNlcy4gVGhlIEd1ZXN0IGluc3RhbmNlcyB0aGF0IHdlcmUgbm90Ci0JCSAqIHJ1bm5pbmcgd2lsbCBhdXRvbWF0aWNhbGx5IHBpY2stdXAgbmV3IFZNSURzIGJlY2F1c2Ugd2lsbAotCQkgKiBjYWxsIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoKSB3aGVuZXZlciB0aGV5IGVudGVyCi0JCSAqIGluLWtlcm5lbCBydW4gbG9vcC4gRm9yIEd1ZXN0IGluc3RhbmNlcyB0aGF0IGFyZSBhbHJlYWR5Ci0JCSAqIHJ1bm5pbmcsIHdlIGZvcmNlIFZNIGV4aXRzIG9uIGFsbCBob3N0IENQVXMgdXNpbmcgSVBJIGFuZAotCQkgKiBmbHVzaCBhbGwgR3Vlc3QgVExCcy4KLQkJICovCi0JCW9uX2VhY2hfY3B1X21hc2soY3B1X29ubGluZV9tYXNrLCBfX2xvY2FsX2hmZW5jZV9ndm1hX2FsbCwKLQkJCQkgTlVMTCwgMSk7CiYjNDM7CS8qCiYjNDM7CSAqIFB1Ymxpc2ggdGhlIENQVS1sb2NhbCBhY3RpdmUgaWRlbnRpdHkgb25seSBhZnRlciB0aGUgcmVxdWlyZWQKJiM0MzsJICogbG9jYWwgaW52YWxpZGF0aW9uIGlzIGNvbXBsZXRlLgomIzQzOwkgKi8KJiM0MzsJYXRvbWljNjRfc2V0KGFjdGl2ZSwgdm1pZCk7CiYjNDM7CiYjNDM7CXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZhbXA7dm1pZF9sb2NrLCBmbGFncyk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEEgbmV3IHNvZnR3YXJlIFZNSUQgbWF5IGNvbnRhaW4gYSBkaWZmZXJlbnQgaGFyZHdhcmUgVk1JRCwgc28KJiM0MzsJICogcmVxdWVzdCBhbiBIR0FUUCB1cGRhdGUgZm9yIGV2ZXJ5IHZDUFUgaW4gdGhlIFZNLgomIzQzOwkgKi8KJiM0MzsJaWYgKHZtaWRfY2hhbmdlZCkgewomIzQzOwkJa3ZtX2Zvcl9lYWNoX3ZjcHUoaSwgdiwgdmNwdS0mZ3Q7a3ZtKQomIzQzOwkJCWt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9VUERBVEVfSEdBVFAsIHYpOwogCX0KIAotCXZtaWQtJmd0O3ZtaWQgPSB2bWlkX25leHQ7Ci0Jdm1pZF9uZXh0JiM0MzsmIzQzOzsKLQl2bWlkX25leHQgJmFtcDs9ICgxICZsdDsmbHQ7IHZtaWRfYml0cykgLSAxOwomIzQzO291dDoKJiM0MzsJcHJlZW1wdF9lbmFibGUoKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBDUFUgdmlydHVhbGl6YXRpb24vQ1NSIHN0YXRlIGlzIGJlaW5nIGRpc2NhcmRlZC4KJiM0MzsgKgomIzQzOyAqIFdpdGhkcmF3IGZhc3QtcGF0aCBlbGlnaWJpbGl0eSwgYnV0IGNvbnNlcnZhdGl2ZWx5IHByZXNlcnZlIHRoZSBsYXN0CiYjNDM7ICogaWRlbnRpdHkgaW5zdGVhZCBvZiBtYWtpbmcgaXRzIGhhcmR3YXJlIFZNSUQgaW1tZWRpYXRlbHkgcmV1c2FibGUuCiYjNDM7ICovCiYjNDM7dm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfY3B1X2ludmFsaWRhdGUodm9pZCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiYjNDM7CXU2NCB2bWlkOwomIzQzOwl1bnNpZ25lZCBpbnQgY3B1OwogCi0JV1JJVEVfT05DRSh2bWlkLSZndDt2bWlkX3ZlcnNpb24sIFJFQURfT05DRSh2bWlkX3ZlcnNpb24pKTsKJiM0MzsJaWYgKCF2bWlkX2JpdHMpCiYjNDM7CQlyZXR1cm47CiAKLQlzcGluX3VubG9jaygmYW1wO3ZtaWRfbG9jayk7CiYjNDM7CWxvY2tkZXBfYXNzZXJ0X3ByZWVtcHRpb25fZGlzYWJsZWQoKTsKJiM0MzsKJiM0MzsJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwomIzQzOwomIzQzOwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmFtcDt2bWlkX2xvY2ssIGZsYWdzKTsKJiM0MzsKJiM0MzsJdm1pZCA9IGF0b21pYzY0X3hjaGcodGhpc19jcHVfcHRyKCZhbXA7YWN0aXZlX3ZtaWRzKSwgMCk7CiYjNDM7CiYjNDM7CWlmICh2bWlkKQomIzQzOwkJcGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IHZtaWQ7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIElmIGFjdGl2ZSB3YXMgYWxyZWFkeSB6ZXJvLCByZXRhaW4gdGhlIG9sZCByZXNlcnZlZCBlbnRyeS4KJiM0MzsJICovCiYjNDM7CWNwdW1hc2tfc2V0X2NwdShjcHUsICZhbXA7dGxiX2ZsdXNoX3BlbmRpbmcpOwogCi0JLyogUmVxdWVzdCBHLXN0YWdlIHBhZ2UgdGFibGUgdXBkYXRlIGZvciBhbGwgVkNQVXMgKi8KLQlrdm1fZm9yX2VhY2hfdmNwdShpLCB2LCB2Y3B1LSZndDtrdm0pCi0JCWt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9VUERBVEVfSEdBVFAsIHYpOwomIzQzOwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYW1wO3ZtaWRfbG9jaywgZmxhZ3MpOwogfQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAxNzo1MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTgyMQoJCQkJCQkJb3V0cHV0OiA4MwoJCQkJCQkJdGhvdWdodHM6IDY0OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiBQYXRjaCBBcHBsaWNhYmlsaXR5IGZvciBGdXp6aW5nKioKCk9rYXksIGxldCYjMzk7cyBzZWUuIEZpcnN0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMgcGF0Y2ggdG91Y2hlcyBhbmQgd2hldGhlciBpdCYjMzk7cyByZWxldmFudCBmb3IgZnV6emluZyBvbiBvdXIgdGFyZ2V0IGFyY2hpdGVjdHVyZSwgd2hpY2ggaXMgYGFtZDY0YC4gSSBzZWUgdGhhdCB0aGUgcGF0Y2ggbW9kaWZpZXMgZmlsZXMgZXhjbHVzaXZlbHkgd2l0aGluIHRoZSBgYXJjaC9yaXNjdi9gIGRpcmVjdG9yeS4gU3BlY2lmaWNhbGx5LCBpdCBpbnZvbHZlcyBjaGFuZ2VzIHRvIGBrdm1fZ3N0YWdlLmhgLCBga3ZtX3ZtaWQuaGAsIGBtYWluLmNgLCBgbW11LmNgLCBgdGxiLmNgLCBgdmNwdS5jYCwgYHZjcHVfc2JpX3JlcGxhY2UuY2AsIGB2Y3B1X3NiaV92MDEuY2AsIGFuZCBgdm1pZC5jYCDigJMgYWxsIFJJU0MtViBLVk0gaW1wbGVtZW50YXRpb24gZGV0YWlscy4KCk5vdywgSSByZWNhbGwgdGhlIHJ1bGVzLiBXZSBvbmx5ICpkb24mIzM5O3QqIGZ1enogaWYgdGhlIGNoYW5nZXMgZmFsbCBpbnRvIGNlcnRhaW4gY2F0ZWdvcmllcy4gVGhlIHJlbGV2YW50IHJ1bGUgaGVyZSBpcyBhYm91dCB1bnJlYWNoYWJsZSBjb2RlIHBhdGhzLCBzcGVjaWZpY2FsbHkgY29kZSBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIG91ciB0YXJnZXQuIEFuZCB0aGF0JiMzOTtzIHByZWNpc2VseSB3aGF0IHdlIGhhdmUuIFRoZXNlIFJJU0MtViBzcGVjaWZpYyBmaWxlcyBhcmUgZGVmaW5pdGVseSBub3QgZ29pbmcgdG8gYmUgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gYGFtZDY0YC4gVGhleSYjMzk7cmUgY29tcGxldGVseSBpc29sYXRlZCB0byB0aGUgUklTQy1WIGFyY2hpdGVjdHVyZS4gSSYjMzk7bSBnb2luZyB0byBkb3VibGUtY2hlY2sgdGhhdCBieSBsaXN0aW5nIGFsbCB0aGUgZmlsZXM6CgoxLiAgYGFyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oYAoyLiAgYGFyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaGAKMy4gIGBhcmNoL3Jpc2N2L2t2bS9tYWluLmNgCjQuICBgYXJjaC9yaXNjdi9rdm0vbW11LmNgCjUuICBgYXJjaC9yaXNjdi9rdm0vdGxiLmNgCjYuICBgYXJjaC9yaXNjdi9rdm0vdmNwdS5jYAo3LiAgYGFyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY2AKOC4gIGBhcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuY2AKOS4gIGBhcmNoL3Jpc2N2L2t2bS92bWlkLmNgCgpZZXMsIGFsbCBuaW5lIGZpbGVzIGFyZSB1bmRlbmlhYmx5IHdpdGhpbiBgYXJjaC9yaXNjdi9gLiBPbiBgYW1kNjRgLCB0aGVzZSBmaWxlcyB3aWxsIHJlbWFpbiB1bnRvdWNoZWQsIG5vdCBidWlsdCwgYW5kIGNvbXBsZXRlbHkgdW5yZWFjaGFibGUuCgpUaGVyZWZvcmUsIHRoZSB2ZXJkaWN0IGlzIGNsZWFyLiBUaGlzIHBhdGNoIGlzIGlycmVsZXZhbnQgZm9yIGZ1enppbmcgb24gYGFtZDY0YC4gYFdvcnRoRnV6emluZ2AgaXMgYGZhbHNlYC4gVGhlcmUgYXJlIG5vIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIHRvIGVuYWJsZSwgbm9yIGFueSBzcGVjaWZpYyBzeW1ib2xzIHRoYXQgYXJlIHVzZWZ1bCwgc28gYEVuYWJsZUNvbmZpZ3NgIGFuZCBgRm9jdXNTeW1ib2xzYCBhcmUgZW1wdHkuIFRoZSByZWFzb25pbmcgaXMgc29saWQ6IHRoZSBjaGFuZ2VzIGFyZSBSSVNDLVYgc3BlY2lmaWMsIGFuZCB0aGF0JiMzOTtzIG5vdCBvdXIgdGFyZ2V0LgoKSSYjMzk7bSBjb21mb3J0YWJsZSB3aXRoIHRoaXMuIEl0JiMzOTtzIGEgc3RyYWlnaHRmb3J3YXJkIGNhc2UuIExldCYjMzk7cyBkbyBhIHF1aWNrIGZpbmFsIGNoZWNrLi4uIHllcCwgZXZlcnl0aGluZyBsb29rcyBnb29kLiBOb3csIGxldCYjMzk7cyBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMTc6NTA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O0FsbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBzdHJpY3RseSBjb25maW5lZCB0byB0aGUgUklTQy1WIGFyY2hpdGVjdHVyZSAoYXJjaC9yaXNjdi8pLCBzcGVjaWZpY2FsbHkgdGhlIFJJU0MtViBLVk0gU3RhZ2UtMiBWTUlEIG1hbmFnZW1lbnQuIFRoZXkgY2Fubm90IGJlIGJ1aWx0IG9yIGV4ZWN1dGVkIG9uIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIChhbWQ2NCkuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O0FsbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBzdHJpY3RseSBjb25maW5lZCB0byB0aGUgUklTQy1WIGFyY2hpdGVjdHVyZSAoYXJjaC9yaXNjdi8pLCBzcGVjaWZpY2FsbHkgdGhlIFJJU0MtViBLVk0gU3RhZ2UtMiBWTUlEIG1hbmFnZW1lbnQuIFRoZXkgY2Fubm90IGJlIGJ1aWx0IG9yIGV4ZWN1dGVkIG9uIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIChhbWQ2NCkuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDE3OjUwPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0xMFQxNzo1MDoyNS4xMDIyNzI0NzJaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2NTU2NTEyMzg2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJBbGwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgc3RyaWN0bHkgY29uZmluZWQgdG8gdGhlIFJJU0MtViBhcmNoaXRlY3R1cmUgKGFyY2gvcmlzY3YvKSwgc3BlY2lmaWNhbGx5IHRoZSBSSVNDLVYgS1ZNIFN0YWdlLTIgVk1JRCBtYW5hZ2VtZW50LiBUaGV5IGNhbm5vdCBiZSBidWlsdCBvciBleGVjdXRlZCBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSAoYW1kNjQpLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMTc6NTA6MjUuMTAyMjc2OTQxWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MzgwMjMwOTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA1ZmMzNWNjYzVjN2Q5ZDRjNzM0OTRiNTQ4Yzg4ZGU4NWZkZTM0OGM0XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUaHUgU2VwIDEwIDE3OjUwOjI0IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmhcXG5pbmRleCBhYWYwODBiYTFiNzdhLi5jNjFhMWJiYjI3MmY0IDEwMDY0NFxcbi0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oXFxuKysrIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmhcXG5AQCAtOCw3ICs4LDcgQEBcXG4gI2RlZmluZSBfX1JJU0NWX0tWTV9HU1RBR0VfSF9cXG4gXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9rdm1fdHlwZXMuaFxcdTAwM2VcXG4tXFxuKyNpbmNsdWRlIFxcdTAwM2Nhc20va3ZtX3ZtaWQuaFxcdTAwM2VcXG4gc3RydWN0IGt2bV9nc3RhZ2Uge1xcbiBcXHRzdHJ1Y3Qga3ZtICprdm07XFxuIFxcdHVuc2lnbmVkIGxvbmcgZmxhZ3M7XFxuQEAgLTEwOCw3ICsxMDgsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV9pbml0KHN0cnVjdCBrdm1fZ3N0YWdlICpnc3RhZ2UsIHN0cnVjdCBrdm0gKlxcbiB7XFxuIFxcdGdzdGFnZS1cXHUwMDNla3ZtID0ga3ZtO1xcbiBcXHRnc3RhZ2UtXFx1MDAzZWZsYWdzID0gMDtcXG4tXFx0Z3N0YWdlLVxcdTAwM2V2bWlkID0gUkVBRF9PTkNFKGt2bS1cXHUwMDNlYXJjaC52bWlkLnZtaWQpO1xcbitcXHRnc3RhZ2UtXFx1MDAzZXZtaWQgPVxcbitcXHRcXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFxcdTAwMjZrdm0tXFx1MDAzZWFyY2gudm1pZC5pZCkpO1xcbiBcXHRnc3RhZ2UtXFx1MDAzZXBnZCA9IGt2bS1cXHUwMDNlYXJjaC5wZ2Q7XFxuIFxcdGdzdGFnZS1cXHUwMDNlcGdkX2xldmVscyA9IGt2bS1cXHUwMDNlYXJjaC5wZ2RfbGV2ZWxzO1xcbiB9XFxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaFxcbmluZGV4IGRiNjFiMDUyNWE4ZDAuLmRkZDdjYzEyNWMzZjYgMTAwNjQ0XFxuLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fdm1pZC5oXFxuKysrIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fdm1pZC5oXFxuQEAgLTYsMjEgKzYsNDIgQEBcXG4gI2lmbmRlZiBfX1JJU0NWX0tWTV9WTUlEX0hfXFxuICNkZWZpbmUgX19SSVNDVl9LVk1fVk1JRF9IX1xcbiBcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2F0b21pYy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgva3ZtX3R5cGVzLmhcXHUwMDNlXFxuIFxcbiBzdHJ1Y3Qga3ZtX3ZtaWQge1xcbiBcXHQvKlxcbi1cXHQgKiBXcml0ZXMgdG8gdm1pZF92ZXJzaW9uIGFuZCB2bWlkIGhhcHBlbiB3aXRoIHZtaWRfbG9jayBoZWxkXFxuLVxcdCAqIHdoZXJlYXMgcmVhZHMgaGFwcGVuIHdpdGhvdXQgYW55IGxvY2sgaGVsZC5cXG4rXFx0ICogU29mdHdhcmUgVk1JRDpcXG4rXFx0ICpcXG4rXFx0ICogICBbIGdlbmVyYXRpb24gfCBoYXJkd2FyZSBWTUlEIF1cXG4rXFx0ICpcXG4rXFx0ICogS2VlcCB0aGUgaWRlbnRpdHkgNjQtYml0IG9uIFJWMzIgc28gdGhhdCB0aGUgZ2VuZXJhdGlvbiBkb2VzIG5vdFxcbitcXHQgKiB3cmFwIGF0IHRoZSBuYXRpdmUgd29yZCBzaXplLiAgWmVybyBkZW5vdGVzIGFuIHVuYWxsb2NhdGVkIFZNSUQuXFxuK1xcdCAqXFxuK1xcdCAqIE9ubHkgdGhlIGxvdyBoYXJkd2FyZSBWTUlEIGJpdHMgbWF5IGJlIHdyaXR0ZW4gdG8gSEdBVFBcXG4rXFx0ICogb3IgdXNlZCBhcyBhIGhhcmR3YXJlIGZlbmNlIFZNSUQuXFxuIFxcdCAqL1xcbi1cXHR1bnNpZ25lZCBsb25nIHZtaWRfdmVyc2lvbjtcXG4tXFx0dW5zaWduZWQgbG9uZyB2bWlkO1xcbitcXHRhdG9taWM2NF90IGlkO1xcbiB9O1xcbiBcXG4gdm9pZCBfX2luaXQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2RldGVjdCh2b2lkKTtcXG4gdW5zaWduZWQgbG9uZyBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYml0cyh2b2lkKTtcXG4rXFxuK2ludCBfX2luaXQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2luaXQodm9pZCk7XFxuK3ZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2ZyZWUodm9pZCk7XFxuK1xcbiBpbnQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2luaXQoc3RydWN0IGt2bSAqa3ZtKTtcXG4rXFxuK3Vuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodTY0IHZtaWQpO1xcbitcXG4gYm9vbCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQoc3RydWN0IGt2bV92bWlkICp2bWlkKTtcXG4rXFxuIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpO1xcbiBcXG4rLypcXG4rICogSW52YWxpZGF0ZSB0aGUgY3VycmVudCBDUFUncyBmYXN0LXBhdGggVk1JRCBzdGF0ZSB3aGlsZSBwcmVzZXJ2aW5nXFxuKyAqIHRoZSBvbGQgaWRlbnRpdHkgY29uc2VydmF0aXZlbHkgaW4gcmVzZXJ2ZWRfdm1pZHMuXFxuKyAqL1xcbit2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9jcHVfaW52YWxpZGF0ZSh2b2lkKTtcXG4rXFxuICNlbmRpZlxcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS9tYWluLmMgYi9hcmNoL3Jpc2N2L2t2bS9tYWluLmNcXG5pbmRleCA4OTU2OGNjY2UwMWRlLi5kNmM2YmU0ZGY2MWIxIDEwMDY0NFxcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL21haW4uY1xcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL21haW4uY1xcbkBAIC0xNiw3ICsxNiw3IEBAXFxuICNpbmNsdWRlIFxcdTAwM2Nhc20va3ZtX25hY2wuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2FzbS9zYmkuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2FzbS9rdm1fdmNwdV92ZWN0b3IuaFxcdTAwM2VcXG4tXFxuKyNpbmNsdWRlIFxcdTAwM2Nhc20va3ZtX3ZtaWQuaFxcdTAwM2VcXG4gc3RhdGljIERFRklORV9QRVJfQ1BVKGJvb2wsIGt2bV9yaXNjdl92aXJ0dWFsaXphdGlvbl9lbmFibGVkKTtcXG4gXFxuIERFRklORV9TVEFUSUNfS0VZX0ZBTFNFKGt2bV9yaXNjdl92c3N0YWdlX3RsYl9ub19ncGEpO1xcbkBAIC04NCw2ICs4NCw3IEBAIGludCBrdm1fYXJjaF9lbmFibGVfdmlydHVhbGl6YXRpb25fY3B1KHZvaWQpXFxuIFxcbiB2b2lkIGt2bV9hcmNoX2Rpc2FibGVfdmlydHVhbGl6YXRpb25fY3B1KHZvaWQpXFxuIHtcXG4rXFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKCk7XFxuIFxcdGt2bV9yaXNjdl9haWFfZGlzYWJsZSgpO1xcbiBcXHRrdm1fcmlzY3ZfY3NyX2NsZWFudXAoKTtcXG4gXFx0a3ZtX3Jpc2N2X25hY2xfZGlzYWJsZSgpO1xcbkBAIC0xMTIsNiArMTEzLDcgQEAgc3RhdGljIGludCBrdm1fcmlzY3ZfY3B1X3BtX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZ1xcbiBcXHRcXHQgKiBpcyBlbmFibGVkIG9uIHRoaXMgQ1BVLlxcbiBcXHRcXHQgKi9cXG4gXFx0XFx0aWYgKF9fdGhpc19jcHVfcmVhZChrdm1fcmlzY3ZfdmlydHVhbGl6YXRpb25fZW5hYmxlZCkpIHtcXG4rXFx0XFx0XFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKCk7XFxuIFxcdFxcdFxcdGt2bV9yaXNjdl9haWFfcG1fZW50ZXIoKTtcXG4gXFx0XFx0XFx0a3ZtX3Jpc2N2X2Nzcl9jbGVhbnVwKCk7XFxuIFxcdFxcdH1cXG5AQCAtMTMwLDYgKzEzMiw3IEBAIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sga3ZtX3Jpc2N2X2NwdV9wbV9uYiA9IHtcXG4gc3RhdGljIHZvaWQga3ZtX3Jpc2N2X3RlYXJkb3duKHZvaWQpXFxuIHtcXG4gXFx0a3ZtX3Jpc2N2X2FpYV9leGl0KCk7XFxuK1xcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKCk7XFxuIFxcdGt2bV9yaXNjdl9uYWNsX2V4aXQoKTtcXG4gXFx0a3ZtX3Jpc2N2X3ZfZXhpdCgpO1xcbiBcXHRrdm1fdW5yZWdpc3Rlcl9wZXJmX2NhbGxiYWNrcygpO1xcbkBAIC0xODEsOCArMTg0LDE1IEBAIHN0YXRpYyBpbnQgX19pbml0IHJpc2N2X2t2bV9pbml0KHZvaWQpXFxuIFxcbiBcXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KCk7XFxuIFxcbitcXHRyYyA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19pbml0KCk7XFxuK1xcdGlmIChyYykge1xcbitcXHRcXHRrdm1fcmlzY3ZfbmFjbF9leGl0KCk7XFxuK1xcdFxcdHJldHVybiByYztcXG4rXFx0fVxcbitcXG4gXFx0cmMgPSBrdm1fcmlzY3ZfYWlhX2luaXQoKTtcXG4gXFx0aWYgKHJjIFxcdTAwMjZcXHUwMDI2IHJjICE9IC1FTk9ERVYpIHtcXG4rXFx0XFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2ZyZWUoKTtcXG4gXFx0XFx0a3ZtX3Jpc2N2X25hY2xfZXhpdCgpO1xcbiBcXHRcXHRyZXR1cm4gcmM7XFxuIFxcdH1cXG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vbW11LmMgYi9hcmNoL3Jpc2N2L2t2bS9tbXUuY1xcbmluZGV4IDYwMzViNWVjOTUwMzkuLjNjOGZiNjAwOWMwYTUgMTAwNjQ0XFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vbW11LmNcXG4rKysgYi9hcmNoL3Jpc2N2L2t2bS9tbXUuY1xcbkBAIC0xNSw3ICsxNSw3IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9zY2hlZC9zaWduYWwuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2FzbS9rdm1fbW11LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2Nhc20va3ZtX25hY2wuaFxcdTAwM2VcXG4tXFxuKyNpbmNsdWRlIFxcdTAwM2Nhc20va3ZtX3ZtaWQuaFxcdTAwM2VcXG4gc3RhdGljIGJvb2wgX19yZWFkX21vc3RseSBlYWdlcl9wYWdlX3NwbGl0ID0gdHJ1ZTtcXG4gbW9kdWxlX3BhcmFtKGVhZ2VyX3BhZ2Vfc3BsaXQsIGJvb2wsIDA2NDQpO1xcbiBcXG5AQCAtNzk5LDEwICs3OTksMTEgQEAgdm9pZCBrdm1fcmlzY3ZfbW11X2ZyZWVfcGdkKHN0cnVjdCBrdm0gKmt2bSlcXG4gdm9pZCBrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIHtcXG4gXFx0c3RydWN0IGt2bV9hcmNoICprYSA9IFxcdTAwMjZ2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2g7XFxuK1xcdHU2NCB2bWlkID0gYXRvbWljNjRfcmVhZChcXHUwMDI2a2EtXFx1MDAzZXZtaWQuaWQpO1xcbiBcXHR1bnNpZ25lZCBsb25nIGhnYXRwID0ga3ZtX3Jpc2N2X2dzdGFnZV9tb2RlKGthLVxcdTAwM2VwZ2RfbGV2ZWxzKVxcbiBcXHRcXHRcXHQgICAgICBcXHUwMDNjXFx1MDAzYyBIR0FUUF9NT0RFX1NISUZUO1xcbiBcXG4tXFx0aGdhdHAgfD0gKFJFQURfT05DRShrYS1cXHUwMDNldm1pZC52bWlkKSBcXHUwMDNjXFx1MDAzYyBIR0FUUF9WTUlEX1NISUZUKSBcXHUwMDI2IEhHQVRQX1ZNSUQ7XFxuK1xcdGhnYXRwIHw9IChrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh2bWlkKSBcXHUwMDNjXFx1MDAzYyBIR0FUUF9WTUlEX1NISUZUKSBcXHUwMDI2IEhHQVRQX1ZNSUQ7XFxuIFxcdGhnYXRwIHw9IChrYS1cXHUwMDNlcGdkX3BoeXMgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCkgXFx1MDAyNiBIR0FUUF9QUE47XFxuIFxcbiBcXHRuY3NyX3dyaXRlKENTUl9IR0FUUCwgaGdhdHApO1xcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS90bGIuYyBiL2FyY2gvcmlzY3Yva3ZtL3RsYi5jXFxuaW5kZXggMmFlMzQ2MzJjZGNiMS4uYjg1ZTViYTIxOThhYSAxMDA2NDRcXG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS90bGIuY1xcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL3RsYi5jXFxuQEAgLTIyNCw3ICsyMjQsNyBAQCB2b2lkIGt2bV9yaXNjdl9sb2NhbF90bGJfc2FuaXRpemUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiBcXHQgKiBlbnRyaWVzIGJ5IFZNSUQgd2hlbmV2ZXIgdW5kZXJseWluZyBIb3N0IENQVSBjaGFuZ2VzIGZvciBhIFZDUFUuXFxuIFxcdCAqL1xcbiBcXG4tXFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkKTtcXG4rXFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkLmlkKSk7XFxuIFxcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV92bWlkX2FsbCh2bWlkKTtcXG4gXFxuIFxcdC8qXFxuQEAgLTI0NCw3ICsyNDQsNyBAQCB2b2lkIGt2bV9yaXNjdl9mZW5jZV9pX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiB2b2lkIGt2bV9yaXNjdl90bGJfZmx1c2hfcHJvY2VzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIHtcXG4gXFx0c3RydWN0IGt2bV92bWlkICp2ID0gXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkO1xcbi1cXHR1bnNpZ25lZCBsb25nIHZtaWQgPSBSRUFEX09OQ0Uodi1cXHUwMDNldm1pZCk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXFx1MDAyNnYtXFx1MDAzZWlkKSk7XFxuIFxcbiBcXHRpZiAoa3ZtX3Jpc2N2X25hY2xfYXZhaWxhYmxlKCkpXFxuIFxcdFxcdG5hY2xfaGZlbmNlX2d2bWFfdm1pZF9hbGwobmFjbF9zaG1lbSgpLCB2bWlkKTtcXG5AQCAtMjU1LDcgKzI1NSw3IEBAIHZvaWQga3ZtX3Jpc2N2X3RsYl9mbHVzaF9wcm9jZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4gdm9pZCBrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYWxsX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiB7XFxuIFxcdHN0cnVjdCBrdm1fdm1pZCAqdiA9IFxcdTAwMjZ2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZDtcXG4tXFx0dW5zaWduZWQgbG9uZyB2bWlkID0gUkVBRF9PTkNFKHYtXFx1MDAzZXZtaWQpO1xcbitcXHR1bnNpZ25lZCBsb25nIHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFxcdTAwMjZ2LVxcdTAwM2VpZCkpO1xcbiBcXG4gXFx0aWYgKGt2bV9yaXNjdl9uYWNsX2F2YWlsYWJsZSgpKVxcbiBcXHRcXHRuYWNsX2hmZW5jZV92dm1hX2FsbChuYWNsX3NobWVtKCksIHZtaWQpO1xcbkBAIC01MzEsOCArNTMxLDExIEBAIHZvaWQga3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbChzdHJ1Y3Qga3ZtICprdm0sXFxuIFxcbiBpbnQga3ZtX2FyY2hfZmx1c2hfcmVtb3RlX3RsYnNfcmFuZ2Uoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4sIHU2NCBucl9wYWdlcylcXG4ge1xcbitcXHR1bnNpZ25lZCBsb25nIHZtaWQgPVxcbitcXHRcXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFxcdTAwMjZrdm0tXFx1MDAzZWFyY2gudm1pZC5pZCkpO1xcbitcXG4gXFx0a3ZtX3Jpc2N2X2hmZW5jZV9ndm1hX3ZtaWRfZ3BhKGt2bSwgLTFVTCwgMCxcXG4gXFx0XFx0XFx0XFx0ICAgICAgIGdmbiBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZULCBucl9wYWdlcyBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZULFxcbi1cXHRcXHRcXHRcXHQgICAgICAgUEFHRV9TSElGVCwgUkVBRF9PTkNFKGt2bS1cXHUwMDNlYXJjaC52bWlkLnZtaWQpKTtcXG4rXFx0XFx0XFx0XFx0ICAgICAgIFBBR0VfU0hJRlQsIHZtaWQpO1xcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92Y3B1LmMgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1LmNcXG5pbmRleCBlMDYyY2ExOWY5ZDhmLi44NTU0MmMxYTVlYzNmIDEwMDY0NFxcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHUuY1xcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHUuY1xcbkBAIC05NDMsMTQgKzk0MywxNCBAQCBpbnQga3ZtX2FyY2hfdmNwdV9pb2N0bF9ydW4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4gXFx0XFx0cmV0ID0gMTtcXG4gXFxuLVxcdFxcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUodmNwdSk7XFxuLVxcbiBcXHRcXHRyZXQgPSBrdm1fcmlzY3ZfY2hlY2tfdmNwdV9yZXF1ZXN0cyh2Y3B1KTtcXG4gXFx0XFx0aWYgKHJldCBcXHUwMDNjPSAwKVxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4gXFxuIFxcdFxcdHByZWVtcHRfZGlzYWJsZSgpO1xcbiBcXG4rXFx0XFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZSh2Y3B1KTtcXG4rXFxuIFxcdFxcdC8qIFVwZGF0ZSBBSUEgSFcgc3RhdGUgYmVmb3JlIGVudGVyaW5nIGd1ZXN0ICovXFxuIFxcdFxcdHJldCA9IGt2bV9yaXNjdl92Y3B1X2FpYV91cGRhdGUodmNwdSk7XFxuIFxcdFxcdGlmIChyZXQgXFx1MDAzYz0gMCkge1xcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV9yZXBsYWNlLmMgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV9yZXBsYWNlLmNcXG5pbmRleCA1MDZhNTEwYjZiZmYzLi4xYmUzODZhNzhlMjdmIDEwMDY0NFxcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY1xcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY1xcbkBAIC0xMDQsNyArMTA0LDcgQEAgc3RhdGljIGludCBrdm1fc2JpX2V4dF9yZmVuY2VfaGFuZGxlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW5cXG4gXFx0XFx0a3ZtX3Jpc2N2X3ZjcHVfcG11X2luY3JfZncodmNwdSwgU0JJX1BNVV9GV19GRU5DRV9JX1NFTlQpO1xcbiBcXHRcXHRicmVhaztcXG4gXFx0Y2FzZSBTQklfRVhUX1JGRU5DRV9SRU1PVEVfU0ZFTkNFX1ZNQTpcXG4tXFx0XFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkKTtcXG4rXFx0XFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkLmlkKSk7XFxuIFxcdFxcdGlmICgoY3AtXFx1MDAzZWEyID09IDAgXFx1MDAyNlxcdTAwMjYgY3AtXFx1MDAzZWEzID09IDApIHx8IGNwLVxcdTAwM2VhMyA9PSAtMVVMKVxcbiBcXHRcXHRcXHRrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYWxsKHZjcHUtXFx1MDAzZWt2bSwgaGJhc2UsIGhtYXNrLCB2bWlkKTtcXG4gXFx0XFx0ZWxzZVxcbkBAIC0xMTMsNyArMTEzLDcgQEAgc3RhdGljIGludCBrdm1fc2JpX2V4dF9yZmVuY2VfaGFuZGxlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW5cXG4gXFx0XFx0a3ZtX3Jpc2N2X3ZjcHVfcG11X2luY3JfZncodmNwdSwgU0JJX1BNVV9GV19IRkVOQ0VfVlZNQV9TRU5UKTtcXG4gXFx0XFx0YnJlYWs7XFxuIFxcdGNhc2UgU0JJX0VYVF9SRkVOQ0VfUkVNT1RFX1NGRU5DRV9WTUFfQVNJRDpcXG4tXFx0XFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkKTtcXG4rXFx0XFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkLmlkKSk7XFxuIFxcdFxcdGlmICgoY3AtXFx1MDAzZWEyID09IDAgXFx1MDAyNlxcdTAwMjYgY3AtXFx1MDAzZWEzID09IDApIHx8IGNwLVxcdTAwM2VhMyA9PSAtMVVMKVxcbiBcXHRcXHRcXHRrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYXNpZF9hbGwodmNwdS1cXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2ssXFxuIFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgICBjcC1cXHUwMDNlYTQsIHZtaWQpO1xcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jXFxuaW5kZXggZGU1NDRlYTNmMjhkYy4uY2EzZWZlNjNjMWNmMSAxMDA2NDRcXG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuY1xcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jXFxuQEAgLTg4LDE0ICs4OCwxNCBAQCBzdGF0aWMgaW50IGt2bV9zYmlfZXh0X3YwMV9oYW5kbGVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1bixcXG4gXFx0XFx0aWYgKGNwLVxcdTAwM2VhNyA9PSBTQklfRVhUXzBfMV9SRU1PVEVfRkVOQ0VfSSlcXG4gXFx0XFx0XFx0a3ZtX3Jpc2N2X2ZlbmNlX2kodmNwdS1cXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2spO1xcbiBcXHRcXHRlbHNlIGlmIChjcC1cXHUwMDNlYTcgPT0gU0JJX0VYVF8wXzFfUkVNT1RFX1NGRU5DRV9WTUEpIHtcXG4tXFx0XFx0XFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkKTtcXG4rXFx0XFx0XFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkLmlkKSk7XFxuIFxcdFxcdFxcdGlmIChjcC1cXHUwMDNlYTEgPT0gMCBcXHUwMDI2XFx1MDAyNiBjcC1cXHUwMDNlYTIgPT0gMClcXG4gXFx0XFx0XFx0XFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbCh2Y3B1LVxcdTAwM2Vrdm0sIGhiYXNlLCBobWFzaywgdm1pZCk7XFxuIFxcdFxcdFxcdGVsc2VcXG4gXFx0XFx0XFx0XFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2d2YSh2Y3B1LVxcdTAwM2Vrdm0sIGhiYXNlLCBobWFzaywgY3AtXFx1MDAzZWExLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHRcXHQgIGNwLVxcdTAwM2VhMiwgUEFHRV9TSElGVCwgdm1pZCk7XFxuIFxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdHZtaWQgPSBSRUFEX09OQ0UodmNwdS1cXHUwMDNla3ZtLVxcdTAwM2VhcmNoLnZtaWQudm1pZCk7XFxuK1xcdFxcdFxcdHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFxcdTAwMjZ2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZC5pZCkpO1xcbiBcXHRcXHRcXHRpZiAoY3AtXFx1MDAzZWExID09IDAgXFx1MDAyNlxcdTAwMjYgY3AtXFx1MDAzZWEyID09IDApXFxuIFxcdFxcdFxcdFxcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hc2lkX2FsbCh2Y3B1LVxcdTAwM2Vrdm0sIGhiYXNlLCBobWFzayxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIGNwLVxcdTAwM2VhMywgdm1pZCk7XFxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuY1xcbmluZGV4IGMxNWJkYjFkZDhiZWYuLjdiODZhNmZiZTRhNjkgMTAwNjQ0XFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdm1pZC5jXFxuKysrIGIvYXJjaC9yaXNjdi9rdm0vdm1pZC5jXFxuQEAgLTYsMTEgKzYsMTUgQEBcXG4gICogICAgIEFudXAgUGF0ZWwgXFx1MDAzY2FudXAucGF0ZWxAd2RjLmNvbVxcdTAwM2VcXG4gICovXFxuIFxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYml0bWFwLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9iaXRvcHMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NwdW1hc2suaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2Vycm5vLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9lcnIuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vZHVsZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvcGVyY3B1LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9wcmVlbXB0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbGFiLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbXAuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2t2bV9ob3N0LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2Nhc20vY3NyLmhcXHUwMDNlXFxuQEAgLTE4LDI2ICsyMiw1NCBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjYXNtL2t2bV90bGIuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2FzbS9rdm1fdm1pZC5oXFx1MDAzZVxcbiBcXG4tc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF92ZXJzaW9uID0gMTtcXG4tc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF9uZXh0O1xcbitzdGF0aWMgYXRvbWljNjRfdCB2bWlkX2dlbmVyYXRpb247XFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nICp2bWlkX21hcDtcXG4gc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF9iaXRzIF9fcm9fYWZ0ZXJfaW5pdDtcXG4tc3RhdGljIERFRklORV9TUElOTE9DSyh2bWlkX2xvY2spO1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX2N1cl9pZHggPSAxO1xcbitcXG4rc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0sodm1pZF9sb2NrKTtcXG4rXFxuK3N0YXRpYyBERUZJTkVfUEVSX0NQVShhdG9taWM2NF90LCBhY3RpdmVfdm1pZHMpO1xcbitzdGF0aWMgREVGSU5FX1BFUl9DUFUodTY0LCByZXNlcnZlZF92bWlkcyk7XFxuK1xcbitzdGF0aWMgY3B1bWFza190IHRsYl9mbHVzaF9wZW5kaW5nO1xcbitcXG4rI2RlZmluZSBWTUlEX0ZJUlNUX1ZFUlNJT05cXHRCSVRfVUxMKHZtaWRfYml0cylcXG4rI2RlZmluZSBOVU1fVk1JRFNcXHRcXHRCSVQodm1pZF9iaXRzKVxcbisjZGVmaW5lIFZNSURfSFdfTUFTS1xcdFxcdChWTUlEX0ZJUlNUX1ZFUlNJT04gLSAxKVxcbitcXG4rc3RhdGljIGJvb2wgdm1pZF9nZW5fbWF0Y2godTY0IHZtaWQpXFxuK3tcXG4rXFx0cmV0dXJuICEoKHZtaWQgXiBhdG9taWM2NF9yZWFkKFxcdTAwMjZ2bWlkX2dlbmVyYXRpb24pKSBcXHUwMDNlXFx1MDAzZSB2bWlkX2JpdHMpO1xcbit9XFxuK1xcbit1bnNpZ25lZCBsb25nIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHU2NCB2bWlkKVxcbit7XFxuK1xcdGlmICghdm1pZF9iaXRzKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdHJldHVybiAodW5zaWduZWQgbG9uZykodm1pZCBcXHUwMDI2IFZNSURfSFdfTUFTSyk7XFxuK31cXG4gXFxuIHZvaWQgX19pbml0IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9kZXRlY3Qodm9pZClcXG4ge1xcbi1cXHQvKiBGaWd1cmUtb3V0IG51bWJlciBvZiBWTUlEIGJpdHMgaW4gSFcgKi9cXG4rXFx0LyogRmlndXJlIG91dCB0aGUgbnVtYmVyIG9mIFZNSUQgYml0cyBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUuICovXFxuIFxcdGNzcl93cml0ZShDU1JfSEdBVFAsIChrdm1fcmlzY3ZfZ3N0YWdlX21vZGUoa3ZtX3Jpc2N2X2dzdGFnZV9tYXhfcGdkX2xldmVscykgXFx1MDAzY1xcdTAwM2NcXG4tXFx0XFx0XFx0ICAgICAgSEdBVFBfTU9ERV9TSElGVCkgfCBIR0FUUF9WTUlEKTtcXG4rXFx0XFx0ICAgSEdBVFBfTU9ERV9TSElGVCkgfCBIR0FUUF9WTUlEKTtcXG4gXFx0dm1pZF9iaXRzID0gY3NyX3JlYWQoQ1NSX0hHQVRQKTtcXG4gXFx0dm1pZF9iaXRzID0gKHZtaWRfYml0cyBcXHUwMDI2IEhHQVRQX1ZNSUQpIFxcdTAwM2VcXHUwMDNlIEhHQVRQX1ZNSURfU0hJRlQ7XFxuIFxcdHZtaWRfYml0cyA9IGZsc19sb25nKHZtaWRfYml0cyk7XFxuIFxcdGNzcl93cml0ZShDU1JfSEdBVFAsIDApO1xcbiBcXG4tXFx0LyogV2UgcG9sbHV0ZWQgbG9jYWwgVExCIHNvIGZsdXNoIGFsbCBndWVzdCBUTEIgKi9cXG4rXFx0LyogRmx1c2ggdGhlIGxvY2FsIGd1ZXN0IFRMQiBhZnRlciBwcm9iaW5nIEhHQVRQLiAqL1xcbiBcXHRrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfYWxsKCk7XFxuIFxcbi1cXHQvKiBXZSBkb24ndCB1c2UgVk1JRCBiaXRzIGlmIHRoZXkgYXJlIG5vdCBzdWZmaWNpZW50ICovXFxuLVxcdGlmICgoMVVMIFxcdTAwM2NcXHUwMDNjIHZtaWRfYml0cykgXFx1MDAzYyBudW1fcG9zc2libGVfY3B1cygpKVxcbitcXHQvKlxcbitcXHQgKiBWTUlEIDAgaXMgcmVzZXJ2ZWQuICBEdXJpbmcgcm9sbG92ZXIgZXZlcnkgcG9zc2libGUgQ1BVIG1heVxcbitcXHQgKiByZXNlcnZlIG9uZSBoYXJkd2FyZSBWTUlELCBhbmQgd2Ugc3RpbGwgbmVlZCBhdCBsZWFzdCBvbmUgVk1JRFxcbitcXHQgKiBhdmFpbGFibGUgZm9yIGEgbmV3IGFsbG9jYXRpb24uXFxuK1xcdCAqL1xcbitcXHRpZiAodm1pZF9iaXRzIFxcdTAwMjZcXHUwMDI2IE5VTV9WTUlEUyAtIDEgXFx1MDAzYz0gbnVtX3Bvc3NpYmxlX2NwdXMoKSlcXG4gXFx0XFx0dm1pZF9iaXRzID0gMDtcXG4gfVxcbiBcXG5AQCAtNDYsODAgKzc4LDI5OCBAQCB1bnNpZ25lZCBsb25nIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9iaXRzKHZvaWQpXFxuIFxcdHJldHVybiB2bWlkX2JpdHM7XFxuIH1cXG4gXFxuK2ludCBfX2luaXQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2luaXQodm9pZClcXG4re1xcbitcXHRpbnQgY3B1O1xcbitcXG4rXFx0aWYgKCF2bWlkX2JpdHMpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0dm1pZF9tYXAgPSBiaXRtYXBfemFsbG9jKE5VTV9WTUlEUywgR0ZQX0tFUk5FTCk7XFxuK1xcdGlmICghdm1pZF9tYXApXFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXG4rXFx0dm1pZF9jdXJfaWR4ID0gMTtcXG4rXFxuK1xcdC8qIEhhcmR3YXJlIFZNSUQgMCBpcyByZXNlcnZlZC4gKi9cXG4rXFx0X19zZXRfYml0KDAsIHZtaWRfbWFwKTtcXG4rXFxuK1xcdGF0b21pYzY0X3NldChcXHUwMDI2dm1pZF9nZW5lcmF0aW9uLCBWTUlEX0ZJUlNUX1ZFUlNJT04pO1xcbitcXG4rXFx0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xcbitcXHRcXHRhdG9taWM2NF9zZXQoXFx1MDAyNnBlcl9jcHUoYWN0aXZlX3ZtaWRzLCBjcHUpLCAwKTtcXG4rXFx0XFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IDA7XFxuK1xcdH1cXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEV2ZXJ5IENQVSBwZXJmb3JtcyBhbiBpbml0aWFsIGxvY2FsIGludmFsaWRhdGlvbiBiZWZvcmUgaXRzXFxuK1xcdCAqIGZpcnN0IFZNSUQgYWN0aXZhdGlvbi5cXG4rXFx0ICovXFxuK1xcdGNwdW1hc2tfY29weShcXHUwMDI2dGxiX2ZsdXNoX3BlbmRpbmcsIGNwdV9wb3NzaWJsZV9tYXNrKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbit2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKHZvaWQpXFxuK3tcXG4rXFx0Yml0bWFwX2ZyZWUodm1pZF9tYXApO1xcbitcXHR2bWlkX21hcCA9IE5VTEw7XFxuK31cXG4rXFxuIGludCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaW5pdChzdHJ1Y3Qga3ZtICprdm0pXFxuIHtcXG4tXFx0LyogTWFyayB0aGUgaW5pdGlhbCBWTUlEIGFuZCBWTUlEIHZlcnNpb24gaW52YWxpZCAqL1xcbi1cXHRrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkX3ZlcnNpb24gPSAwO1xcbi1cXHRrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkID0gMDtcXG4rXFx0YXRvbWljNjRfc2V0KFxcdTAwMjZrdm0tXFx1MDAzZWFyY2gudm1pZC5pZCwgMCk7XFxuIFxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4gYm9vbCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQoc3RydWN0IGt2bV92bWlkICp2bWlkKVxcbiB7XFxuK1xcdHU2NCBpZDtcXG4rXFxuIFxcdGlmICghdm1pZF9iaXRzKVxcbiBcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIFxcbi1cXHRyZXR1cm4gdW5saWtlbHkoUkVBRF9PTkNFKHZtaWQtXFx1MDAzZXZtaWRfdmVyc2lvbikgIT1cXG4tXFx0XFx0XFx0UkVBRF9PTkNFKHZtaWRfdmVyc2lvbikpO1xcbitcXHRpZCA9IGF0b21pYzY0X3JlYWQoXFx1MDAyNnZtaWQtXFx1MDAzZWlkKTtcXG4rXFxuK1xcdHJldHVybiB1bmxpa2VseSghdm1pZF9nZW5fbWF0Y2goaWQpKTtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgX19sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwodm9pZCAqaW5mbylcXG4rLypcXG4rICogQ2FsbGVkIHdpdGggdm1pZF9sb2NrIGhlbGQgYWZ0ZXIgdm1pZF9nZW5lcmF0aW9uIGhhcyBhbHJlYWR5IGJlZW5cXG4rICogYWR2YW5jZWQuXFxuKyAqXFxuKyAqIE5vIHJlbW90ZSBDUFUgaXMgaW50ZXJydXB0ZWQgaGVyZS4gIEluc3RlYWQsIHByZXNlcnZlIGV2ZXJ5IFZNSURcXG4rICogd2hpY2ggbWF5IHN0aWxsIGJlIHVzZWQgYnkgYSBDUFUgYW5kIHF1ZXVlIGEgbG9jYWwgaW52YWxpZGF0aW9uIGZvclxcbisgKiB0aGF0IENQVSdzIG5leHQgVk1JRCBhY3RpdmF0aW9uLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgZmx1c2hfY29udGV4dCh2b2lkKVxcbiB7XFxuLVxcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwoKTtcXG4rXFx0dTY0IHZtaWQ7XFxuK1xcdGludCBjcHU7XFxuK1xcbitcXHRiaXRtYXBfemVybyh2bWlkX21hcCwgTlVNX1ZNSURTKTtcXG4rXFx0X19zZXRfYml0KDAsIHZtaWRfbWFwKTtcXG4rXFxuK1xcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHtcXG4rXFx0XFx0dm1pZCA9IGF0b21pYzY0X3hjaGcoXFx1MDAyNnBlcl9jcHUoYWN0aXZlX3ZtaWRzLCBjcHUpLCAwKTtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIFRoZSBDUFUgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGNhdWdodCBieSBhbiBlYXJsaWVyIHJvbGxvdmVyXFxuK1xcdFxcdCAqIHdpdGhvdXQgcGVyZm9ybWluZyBhbm90aGVyIGFjdGl2YXRpb24gc2luY2UgdGhlbi4gIEluIHRoYXRcXG4rXFx0XFx0ICogY2FzZSByZXNlcnZlZF92bWlkcyBpcyB0aGUgb25seSByZWNvcmQgb2YgdGhlIG9sZCBjb250ZXh0LlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKCF2bWlkKVxcbitcXHRcXHRcXHR2bWlkID0gcGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KTtcXG4rXFxuK1xcdFxcdGlmICh2bWlkKVxcbitcXHRcXHRcXHRfX3NldF9iaXQoa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCksXFxuK1xcdFxcdFxcdFxcdCAgdm1pZF9tYXApO1xcbitcXG4rXFx0XFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IHZtaWQ7XFxuK1xcdH1cXG4rXFxuK1xcdGNwdW1hc2tfY29weShcXHUwMDI2dGxiX2ZsdXNoX3BlbmRpbmcsIGNwdV9wb3NzaWJsZV9tYXNrKTtcXG4rfVxcbitcXG4rLypcXG4rICogVXBkYXRlIGV2ZXJ5IHJlc2VydmVkIGNvcHkgb2YgYW4gb2xkIHNvZnR3YXJlIFZNSUQuXFxuKyAqXFxuKyAqIERvIG5vdCBzdG9wIGFmdGVyIHRoZSBmaXJzdCBtYXRjaDogdGhlIHNhbWUgVk0gbWF5IGhhdmUgYmVlbiBhY3RpdmVcXG4rICogb24gbW9yZSB0aGFuIG9uZSBDUFUgd2hlbiByb2xsb3ZlciBvY2N1cnJlZC5cXG4rICovXFxuK3N0YXRpYyBib29sIGNoZWNrX3VwZGF0ZV9yZXNlcnZlZF92bWlkKHU2NCBvbGRfdm1pZCwgdTY0IG5ld192bWlkKVxcbit7XFxuK1xcdGJvb2wgaGl0ID0gZmFsc2U7XFxuK1xcdGludCBjcHU7XFxuK1xcbitcXHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XFxuK1xcdFxcdGlmIChwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID09IG9sZF92bWlkKSB7XFxuK1xcdFxcdFxcdHBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSkgPSBuZXdfdm1pZDtcXG4rXFx0XFx0XFx0aGl0ID0gdHJ1ZTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gaGl0O1xcbit9XFxuK1xcbisvKlxcbisgKiBBbGxvY2F0ZS9wcm9tb3RlIGEgc29mdHdhcmUgVk1JRC5cXG4rICpcXG4rICogdm1pZF9sb2NrIG11c3QgYmUgaGVsZCBieSB0aGUgY2FsbGVyLlxcbisgKi9cXG4rc3RhdGljIHU2NCBuZXdfdm1pZF9sb2NrZWQoc3RydWN0IGt2bV92bWlkICprdm1fdm1pZClcXG4re1xcbitcXHR1NjQgdm1pZCA9IGF0b21pYzY0X3JlYWQoXFx1MDAyNmt2bV92bWlkLVxcdTAwM2VpZCk7XFxuK1xcdHU2NCBnZW5lcmF0aW9uID0gYXRvbWljNjRfcmVhZChcXHUwMDI2dm1pZF9nZW5lcmF0aW9uKTtcXG4rXFx0dTY0IG5ld192bWlkO1xcbitcXHR1bnNpZ25lZCBsb25nIGlkeDtcXG4rXFxuK1xcdGlmICh2bWlkKSB7XFxuK1xcdFxcdG5ld192bWlkID0gZ2VuZXJhdGlvbiB8XFxuK1xcdFxcdFxcdCAgIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHZtaWQpO1xcbitcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVGhlIG9sZCBWTUlEIGlzIHN0aWxsIHByb3RlY3RlZCBieSBvbmUgb3IgbW9yZSBDUFVzLlxcbitcXHRcXHQgKiBLZWVwIHRoZSBzYW1lIGhhcmR3YXJlIFZNSUQgYW5kIG9ubHkgcHJvbW90ZSBnZW5lcmF0aW9uLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKGNoZWNrX3VwZGF0ZV9yZXNlcnZlZF92bWlkKHZtaWQsIG5ld192bWlkKSlcXG4rXFx0XFx0XFx0cmV0dXJuIG5ld192bWlkO1xcbitcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVGhlIFZNIGhhZCBhIFZNSUQgaW4gYW4gb2xkZXIgZ2VuZXJhdGlvbi4gIFJldXNlIHRoZSBzYW1lXFxuK1xcdFxcdCAqIGhhcmR3YXJlIG51bWJlciBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBjbGFpbWVkLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWR4ID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCk7XFxuK1xcdFxcdGlmICghX190ZXN0X2FuZF9zZXRfYml0KGlkeCwgdm1pZF9tYXApKVxcbitcXHRcXHRcXHRyZXR1cm4gbmV3X3ZtaWQ7XFxuK1xcdH1cXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEZpbmQgYSBmcmVlIFZNSUQgaW4gdGhlIGN1cnJlbnQgZ2VuZXJhdGlvbi5cXG4rXFx0ICovXFxuK1xcdGlkeCA9IGZpbmRfbmV4dF96ZXJvX2JpdCh2bWlkX21hcCwgTlVNX1ZNSURTLCB2bWlkX2N1cl9pZHgpO1xcbitcXHRpZiAoaWR4ICE9IE5VTV9WTUlEUylcXG4rXFx0XFx0Z290byBzZXRfdm1pZDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIE5vIGZyZWUgVk1JRC4gIFN0YXJ0IGEgbmV3IGdlbmVyYXRpb24sIHByZXNlcnZlIGFsbCBDUFUtbG9jYWxcXG4rXFx0ICogdXNlcnMsIGFuZCBkZWZlciBlYWNoIENQVSdzIGZsdXNoIHVudGlsIGl0cyBuZXh0IGFjdGl2YXRpb24uXFxuK1xcdCAqL1xcbitcXHRnZW5lcmF0aW9uICs9IFZNSURfRklSU1RfVkVSU0lPTjtcXG4rXFxuK1xcdC8qIFNvZnR3YXJlIFZNSUQgMCBpcyByZXNlcnZlZCBhcyB0aGUgaW52YWxpZCBpZGVudGlmaWVyLiAqL1xcbitcXHRpZiAodW5saWtlbHkoIWdlbmVyYXRpb24pKVxcbitcXHRcXHRnZW5lcmF0aW9uID0gVk1JRF9GSVJTVF9WRVJTSU9OO1xcbitcXG4rXFx0YXRvbWljNjRfeGNoZyhcXHUwMDI2dm1pZF9nZW5lcmF0aW9uLCBnZW5lcmF0aW9uKTtcXG4rXFx0Zmx1c2hfY29udGV4dCgpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogTlVNX1ZNSURTIC0gMSBcXHUwMDNlIG51bV9wb3NzaWJsZV9jcHVzKCksIHRoZXJlZm9yZSByb2xsb3ZlciBtdXN0XFxuK1xcdCAqIGxlYXZlIGF0IGxlYXN0IG9uZSBhbGxvY2F0YWJsZSBoYXJkd2FyZSBWTUlELlxcbitcXHQgKi9cXG4rXFx0aWR4ID0gZmluZF9uZXh0X3plcm9fYml0KHZtaWRfbWFwLCBOVU1fVk1JRFMsIDEpO1xcbitcXG4rc2V0X3ZtaWQ6XFxuK1xcdF9fc2V0X2JpdChpZHgsIHZtaWRfbWFwKTtcXG4rXFx0dm1pZF9jdXJfaWR4ID0gaWR4O1xcbitcXG4rXFx0cmV0dXJuIGdlbmVyYXRpb24gfCBpZHg7XFxuIH1cXG4gXFxuIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIHtcXG4tXFx0dW5zaWduZWQgbG9uZyBpO1xcbitcXHRzdHJ1Y3Qga3ZtX3ZtaWQgKmt2bV92bWlkID0gXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkO1xcbitcXHRhdG9taWM2NF90ICphY3RpdmU7XFxuIFxcdHN0cnVjdCBrdm1fdmNwdSAqdjtcXG4tXFx0c3RydWN0IGt2bV92bWlkICp2bWlkID0gXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkO1xcbitcXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xcbitcXHR1NjQgdm1pZDtcXG4rXFx0dTY0IG9sZF9hY3RpdmVfdm1pZDtcXG4rXFx0dW5zaWduZWQgbG9uZyBpO1xcbitcXHR1bnNpZ25lZCBpbnQgY3B1O1xcbitcXHRib29sIHZtaWRfY2hhbmdlZCA9IGZhbHNlO1xcbiBcXG4tXFx0aWYgKCFrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQodm1pZCkpXFxuK1xcdGlmICghdm1pZF9iaXRzKVxcbiBcXHRcXHRyZXR1cm47XFxuIFxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnZtaWRfbG9jayk7XFxuK1xcdC8qXFxuK1xcdCAqIGFjdGl2ZV92bWlkcyBhbmQgdGxiX2ZsdXNoX3BlbmRpbmcgYXJlIHBlci1DUFUgYWRtaXNzaW9uIHN0YXRlLlxcbitcXHQgKiBUaGV5IG11c3QgcmVmZXIgdG8gdGhlIHNhbWUgQ1BVIGZvciB0aGUgY29tcGxldGUgYWN0aXZhdGlvbi5cXG4rXFx0ICovXFxuK1xcdHByZWVtcHRfZGlzYWJsZSgpO1xcbitcXG4rXFx0Y3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpO1xcbitcXHRhY3RpdmUgPSB0aGlzX2NwdV9wdHIoXFx1MDAyNmFjdGl2ZV92bWlkcyk7XFxuK1xcbitcXHR2bWlkID0gYXRvbWljNjRfcmVhZChcXHUwMDI2a3ZtX3ZtaWQtXFx1MDAzZWlkKTtcXG4rXFx0b2xkX2FjdGl2ZV92bWlkID0gYXRvbWljNjRfcmVhZChhY3RpdmUpO1xcbiBcXG4gXFx0LypcXG4tXFx0ICogV2UgbmVlZCB0byByZS1jaGVjayB0aGUgdm1pZF92ZXJzaW9uIGhlcmUgdG8gZW5zdXJlIHRoYXQgaWZcXG4tXFx0ICogYW5vdGhlciB2Y3B1IGFscmVhZHkgYWxsb2NhdGVkIGEgdmFsaWQgdm1pZCBmb3IgdGhpcyB2bS5cXG4rXFx0ICogRmFzdCBwYXRoLlxcbitcXHQgKlxcbitcXHQgKiBUaGUgY21weGNoZyByYWNlcyB3aXRoIGZsdXNoX2NvbnRleHQoKSdzIHhjaGcgb24gdGhlIHNhbWVcXG4rXFx0ICogcGVyLUNQVSBhdG9taWMuICBFaXRoZXIgdGhpcyBhY3RpdmF0aW9uIGlzIGNhcHR1cmVkIGJ5IHJvbGxvdmVyLFxcbitcXHQgKiBvciByb2xsb3ZlciBjbGVhcnMgYWN0aXZlIGZpcnN0IGFuZCB0aGUgY21weGNoZyBmYWlscy5cXG4gXFx0ICovXFxuLVxcdGlmICgha3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3Zlcl9jaGFuZ2VkKHZtaWQpKSB7XFxuLVxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZ2bWlkX2xvY2spO1xcbi1cXHRcXHRyZXR1cm47XFxuK1xcdGlmIChvbGRfYWN0aXZlX3ZtaWQgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIHZtaWRfZ2VuX21hdGNoKHZtaWQpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBhdG9taWM2NF9jbXB4Y2hnKGFjdGl2ZSwgb2xkX2FjdGl2ZV92bWlkLCB2bWlkKSA9PVxcbitcXHQgICAgb2xkX2FjdGl2ZV92bWlkKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdHJhd19zcGluX2xvY2tfaXJxc2F2ZShcXHUwMDI2dm1pZF9sb2NrLCBmbGFncyk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBSZS1yZWFkIHVuZGVyIHRoZSBhbGxvY2F0b3IgbG9jayBiZWNhdXNlIGFub3RoZXIgdkNQVSBvZiB0aGlzIFZNXFxuK1xcdCAqIG1heSBhbHJlYWR5IGhhdmUgcHJvbW90ZWQgb3IgYWxsb2NhdGVkIHRoZSBzaGFyZWQgVk1JRC5cXG4rXFx0ICovXFxuK1xcdHZtaWQgPSBhdG9taWM2NF9yZWFkKFxcdTAwMjZrdm1fdm1pZC1cXHUwMDNlaWQpO1xcbitcXG4rXFx0aWYgKCF2bWlkX2dlbl9tYXRjaCh2bWlkKSkge1xcbitcXHRcXHR2bWlkID0gbmV3X3ZtaWRfbG9ja2VkKGt2bV92bWlkKTtcXG4rXFx0XFx0YXRvbWljNjRfc2V0KFxcdTAwMjZrdm1fdm1pZC1cXHUwMDNlaWQsIHZtaWQpO1xcbitcXHRcXHR2bWlkX2NoYW5nZWQgPSB0cnVlO1xcbiBcXHR9XFxuIFxcbi1cXHQvKiBGaXJzdCB1c2VyIG9mIGEgbmV3IFZNSUQgdmVyc2lvbj8gKi9cXG4tXFx0aWYgKHVubGlrZWx5KHZtaWRfbmV4dCA9PSAwKSkge1xcbi1cXHRcXHRXUklURV9PTkNFKHZtaWRfdmVyc2lvbiwgUkVBRF9PTkNFKHZtaWRfdmVyc2lvbikgKyAxKTtcXG4tXFx0XFx0dm1pZF9uZXh0ID0gMTtcXG4rXFx0LypcXG4rXFx0ICogRXZlbiBpZiBhbm90aGVyIHZDUFUgYWxyZWFkeSB1cGRhdGVkIHRoZSBzaGFyZWQgVk1JRCwgdGhpcyBDUFVcXG4rXFx0ICogbXVzdCBzdGlsbCBkaXNjaGFyZ2UgaXRzIG93biByb2xsb3ZlciBmbHVzaCBvYmxpZ2F0aW9uLlxcbitcXHQgKi9cXG4rXFx0aWYgKGNwdW1hc2tfdGVzdF9hbmRfY2xlYXJfY3B1KGNwdSwgXFx1MDAyNnRsYl9mbHVzaF9wZW5kaW5nKSlcXG4rXFx0XFx0a3ZtX3Jpc2N2X2xvY2FsX2hmZW5jZV9ndm1hX2FsbCgpO1xcbiBcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogV2UgcmFuIG91dCBvZiBWTUlEcyBzbyB3ZSBpbmNyZW1lbnQgdm1pZF92ZXJzaW9uIGFuZFxcbi1cXHRcXHQgKiBzdGFydCBhc3NpZ25pbmcgVk1JRHMgZnJvbSAxLlxcbi1cXHRcXHQgKlxcbi1cXHRcXHQgKiBUaGlzIGFsc28gbWVhbnMgZXhpc3RpbmcgVk1JRHMgYXNzaWdubWVudCB0byBhbGwgR3Vlc3RcXG4tXFx0XFx0ICogaW5zdGFuY2VzIGlzIGludmFsaWQgYW5kIHdlIGhhdmUgZm9yY2UgVk1JRCByZS1hc3NpZ25lbWVudFxcbi1cXHRcXHQgKiBmb3IgYWxsIEd1ZXN0IGluc3RhbmNlcy4gVGhlIEd1ZXN0IGluc3RhbmNlcyB0aGF0IHdlcmUgbm90XFxuLVxcdFxcdCAqIHJ1bm5pbmcgd2lsbCBhdXRvbWF0aWNhbGx5IHBpY2stdXAgbmV3IFZNSURzIGJlY2F1c2Ugd2lsbFxcbi1cXHRcXHQgKiBjYWxsIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoKSB3aGVuZXZlciB0aGV5IGVudGVyXFxuLVxcdFxcdCAqIGluLWtlcm5lbCBydW4gbG9vcC4gRm9yIEd1ZXN0IGluc3RhbmNlcyB0aGF0IGFyZSBhbHJlYWR5XFxuLVxcdFxcdCAqIHJ1bm5pbmcsIHdlIGZvcmNlIFZNIGV4aXRzIG9uIGFsbCBob3N0IENQVXMgdXNpbmcgSVBJIGFuZFxcbi1cXHRcXHQgKiBmbHVzaCBhbGwgR3Vlc3QgVExCcy5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdG9uX2VhY2hfY3B1X21hc2soY3B1X29ubGluZV9tYXNrLCBfX2xvY2FsX2hmZW5jZV9ndm1hX2FsbCxcXG4tXFx0XFx0XFx0XFx0IE5VTEwsIDEpO1xcbitcXHQvKlxcbitcXHQgKiBQdWJsaXNoIHRoZSBDUFUtbG9jYWwgYWN0aXZlIGlkZW50aXR5IG9ubHkgYWZ0ZXIgdGhlIHJlcXVpcmVkXFxuK1xcdCAqIGxvY2FsIGludmFsaWRhdGlvbiBpcyBjb21wbGV0ZS5cXG4rXFx0ICovXFxuK1xcdGF0b21pYzY0X3NldChhY3RpdmUsIHZtaWQpO1xcbitcXG4rXFx0cmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoXFx1MDAyNnZtaWRfbG9jaywgZmxhZ3MpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogQSBuZXcgc29mdHdhcmUgVk1JRCBtYXkgY29udGFpbiBhIGRpZmZlcmVudCBoYXJkd2FyZSBWTUlELCBzb1xcbitcXHQgKiByZXF1ZXN0IGFuIEhHQVRQIHVwZGF0ZSBmb3IgZXZlcnkgdkNQVSBpbiB0aGUgVk0uXFxuK1xcdCAqL1xcbitcXHRpZiAodm1pZF9jaGFuZ2VkKSB7XFxuK1xcdFxcdGt2bV9mb3JfZWFjaF92Y3B1KGksIHYsIHZjcHUtXFx1MDAzZWt2bSlcXG4rXFx0XFx0XFx0a3ZtX21ha2VfcmVxdWVzdChLVk1fUkVRX1VQREFURV9IR0FUUCwgdik7XFxuIFxcdH1cXG4gXFxuLVxcdHZtaWQtXFx1MDAzZXZtaWQgPSB2bWlkX25leHQ7XFxuLVxcdHZtaWRfbmV4dCsrO1xcbi1cXHR2bWlkX25leHQgXFx1MDAyNj0gKDEgXFx1MDAzY1xcdTAwM2Mgdm1pZF9iaXRzKSAtIDE7XFxuK291dDpcXG4rXFx0cHJlZW1wdF9lbmFibGUoKTtcXG4rfVxcbitcXG4rLypcXG4rICogQ1BVIHZpcnR1YWxpemF0aW9uL0NTUiBzdGF0ZSBpcyBiZWluZyBkaXNjYXJkZWQuXFxuKyAqXFxuKyAqIFdpdGhkcmF3IGZhc3QtcGF0aCBlbGlnaWJpbGl0eSwgYnV0IGNvbnNlcnZhdGl2ZWx5IHByZXNlcnZlIHRoZSBsYXN0XFxuKyAqIGlkZW50aXR5IGluc3RlYWQgb2YgbWFraW5nIGl0cyBoYXJkd2FyZSBWTUlEIGltbWVkaWF0ZWx5IHJldXNhYmxlLlxcbisgKi9cXG4rdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfY3B1X2ludmFsaWRhdGUodm9pZClcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xcbitcXHR1NjQgdm1pZDtcXG4rXFx0dW5zaWduZWQgaW50IGNwdTtcXG4gXFxuLVxcdFdSSVRFX09OQ0Uodm1pZC1cXHUwMDNldm1pZF92ZXJzaW9uLCBSRUFEX09OQ0Uodm1pZF92ZXJzaW9uKSk7XFxuK1xcdGlmICghdm1pZF9iaXRzKVxcbitcXHRcXHRyZXR1cm47XFxuIFxcbi1cXHRzcGluX3VubG9jayhcXHUwMDI2dm1pZF9sb2NrKTtcXG4rXFx0bG9ja2RlcF9hc3NlcnRfcHJlZW1wdGlvbl9kaXNhYmxlZCgpO1xcbitcXG4rXFx0Y3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpO1xcbitcXG4rXFx0cmF3X3NwaW5fbG9ja19pcnFzYXZlKFxcdTAwMjZ2bWlkX2xvY2ssIGZsYWdzKTtcXG4rXFxuK1xcdHZtaWQgPSBhdG9taWM2NF94Y2hnKHRoaXNfY3B1X3B0cihcXHUwMDI2YWN0aXZlX3ZtaWRzKSwgMCk7XFxuK1xcbitcXHRpZiAodm1pZClcXG4rXFx0XFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IHZtaWQ7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBJZiBhY3RpdmUgd2FzIGFscmVhZHkgemVybywgcmV0YWluIHRoZSBvbGQgcmVzZXJ2ZWQgZW50cnkuXFxuK1xcdCAqL1xcbitcXHRjcHVtYXNrX3NldF9jcHUoY3B1LCBcXHUwMDI2dGxiX2ZsdXNoX3BlbmRpbmcpO1xcbiBcXG4tXFx0LyogUmVxdWVzdCBHLXN0YWdlIHBhZ2UgdGFibGUgdXBkYXRlIGZvciBhbGwgVkNQVXMgKi9cXG4tXFx0a3ZtX2Zvcl9lYWNoX3ZjcHUoaSwgdiwgdmNwdS1cXHUwMDNla3ZtKVxcbi1cXHRcXHRrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfVVBEQVRFX0hHQVRQLCB2KTtcXG4rXFx0cmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoXFx1MDAyNnZtaWRfbG9jaywgZmxhZ3MpO1xcbiB9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDE3OjUwOjI1LjY0MTAwMzUwM1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6NjAxNzc3MDU0NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJBbGwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgc3RyaWN0bHkgY29uZmluZWQgdG8gdGhlIFJJU0MtViBhcmNoaXRlY3R1cmUgKGFyY2gvcmlzY3YvKSwgc3BlY2lmaWNhbGx5IHRoZSBSSVNDLVYgS1ZNIFN0YWdlLTIgVk1JRCBtYW5hZ2VtZW50LiBUaGV5IGNhbm5vdCBiZSBidWlsdCBvciBleGVjdXRlZCBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSAoYW1kNjQpLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA1ZmMzNWNjYzVjN2Q5ZDRjNzM0OTRiNTQ4Yzg4ZGU4NWZkZTM0OGM0XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMTAgMTc6NTA6MjQgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9nc3RhZ2UuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oXG5pbmRleCBhYWYwODBiYTFiNzdhLi5jNjFhMWJiYjI3MmY0IDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmhcbisrKyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oXG5AQCAtOCw3ICs4LDcgQEBcbiAjZGVmaW5lIF9fUklTQ1ZfS1ZNX0dTVEFHRV9IX1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2t2bV90eXBlcy5oXHUwMDNlXG4tXG4rI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV92bWlkLmhcdTAwM2VcbiBzdHJ1Y3Qga3ZtX2dzdGFnZSB7XG4gXHRzdHJ1Y3Qga3ZtICprdm07XG4gXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xuQEAgLTEwOCw3ICsxMDgsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV9pbml0KHN0cnVjdCBrdm1fZ3N0YWdlICpnc3RhZ2UsIHN0cnVjdCBrdm0gKlxuIHtcbiBcdGdzdGFnZS1cdTAwM2Vrdm0gPSBrdm07XG4gXHRnc3RhZ2UtXHUwMDNlZmxhZ3MgPSAwO1xuLVx0Z3N0YWdlLVx1MDAzZXZtaWQgPSBSRUFEX09OQ0Uoa3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbitcdGdzdGFnZS1cdTAwM2V2bWlkID1cbitcdFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZrdm0tXHUwMDNlYXJjaC52bWlkLmlkKSk7XG4gXHRnc3RhZ2UtXHUwMDNlcGdkID0ga3ZtLVx1MDAzZWFyY2gucGdkO1xuIFx0Z3N0YWdlLVx1MDAzZXBnZF9sZXZlbHMgPSBrdm0tXHUwMDNlYXJjaC5wZ2RfbGV2ZWxzO1xuIH1cbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmhcbmluZGV4IGRiNjFiMDUyNWE4ZDAuLmRkZDdjYzEyNWMzZjYgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmhcbisrKyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaFxuQEAgLTYsMjEgKzYsNDIgQEBcbiAjaWZuZGVmIF9fUklTQ1ZfS1ZNX1ZNSURfSF9cbiAjZGVmaW5lIF9fUklTQ1ZfS1ZNX1ZNSURfSF9cbiBcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9hdG9taWMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2t2bV90eXBlcy5oXHUwMDNlXG4gXG4gc3RydWN0IGt2bV92bWlkIHtcbiBcdC8qXG4tXHQgKiBXcml0ZXMgdG8gdm1pZF92ZXJzaW9uIGFuZCB2bWlkIGhhcHBlbiB3aXRoIHZtaWRfbG9jayBoZWxkXG4tXHQgKiB3aGVyZWFzIHJlYWRzIGhhcHBlbiB3aXRob3V0IGFueSBsb2NrIGhlbGQuXG4rXHQgKiBTb2Z0d2FyZSBWTUlEOlxuK1x0ICpcbitcdCAqICAgWyBnZW5lcmF0aW9uIHwgaGFyZHdhcmUgVk1JRCBdXG4rXHQgKlxuK1x0ICogS2VlcCB0aGUgaWRlbnRpdHkgNjQtYml0IG9uIFJWMzIgc28gdGhhdCB0aGUgZ2VuZXJhdGlvbiBkb2VzIG5vdFxuK1x0ICogd3JhcCBhdCB0aGUgbmF0aXZlIHdvcmQgc2l6ZS4gIFplcm8gZGVub3RlcyBhbiB1bmFsbG9jYXRlZCBWTUlELlxuK1x0ICpcbitcdCAqIE9ubHkgdGhlIGxvdyBoYXJkd2FyZSBWTUlEIGJpdHMgbWF5IGJlIHdyaXR0ZW4gdG8gSEdBVFBcbitcdCAqIG9yIHVzZWQgYXMgYSBoYXJkd2FyZSBmZW5jZSBWTUlELlxuIFx0ICovXG4tXHR1bnNpZ25lZCBsb25nIHZtaWRfdmVyc2lvbjtcbi1cdHVuc2lnbmVkIGxvbmcgdm1pZDtcbitcdGF0b21pYzY0X3QgaWQ7XG4gfTtcbiBcbiB2b2lkIF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KHZvaWQpO1xuIHVuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHModm9pZCk7XG4rXG4raW50IF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfaW5pdCh2b2lkKTtcbit2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKHZvaWQpO1xuK1xuIGludCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaW5pdChzdHJ1Y3Qga3ZtICprdm0pO1xuK1xuK3Vuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodTY0IHZtaWQpO1xuK1xuIGJvb2wga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3Zlcl9jaGFuZ2VkKHN0cnVjdCBrdm1fdm1pZCAqdm1pZCk7XG4rXG4gdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7XG4gXG4rLypcbisgKiBJbnZhbGlkYXRlIHRoZSBjdXJyZW50IENQVSdzIGZhc3QtcGF0aCBWTUlEIHN0YXRlIHdoaWxlIHByZXNlcnZpbmdcbisgKiB0aGUgb2xkIGlkZW50aXR5IGNvbnNlcnZhdGl2ZWx5IGluIHJlc2VydmVkX3ZtaWRzLlxuKyAqL1xuK3ZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKHZvaWQpO1xuK1xuICNlbmRpZlxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL21haW4uYyBiL2FyY2gvcmlzY3Yva3ZtL21haW4uY1xuaW5kZXggODk1NjhjY2NlMDFkZS4uZDZjNmJlNGRmNjFiMSAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL21haW4uY1xuKysrIGIvYXJjaC9yaXNjdi9rdm0vbWFpbi5jXG5AQCAtMTYsNyArMTYsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fbmFjbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL3NiaS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV92Y3B1X3ZlY3Rvci5oXHUwMDNlXG4tXG4rI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV92bWlkLmhcdTAwM2VcbiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoYm9vbCwga3ZtX3Jpc2N2X3ZpcnR1YWxpemF0aW9uX2VuYWJsZWQpO1xuIFxuIERFRklORV9TVEFUSUNfS0VZX0ZBTFNFKGt2bV9yaXNjdl92c3N0YWdlX3RsYl9ub19ncGEpO1xuQEAgLTg0LDYgKzg0LDcgQEAgaW50IGt2bV9hcmNoX2VuYWJsZV92aXJ0dWFsaXphdGlvbl9jcHUodm9pZClcbiBcbiB2b2lkIGt2bV9hcmNoX2Rpc2FibGVfdmlydHVhbGl6YXRpb25fY3B1KHZvaWQpXG4ge1xuK1x0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKCk7XG4gXHRrdm1fcmlzY3ZfYWlhX2Rpc2FibGUoKTtcbiBcdGt2bV9yaXNjdl9jc3JfY2xlYW51cCgpO1xuIFx0a3ZtX3Jpc2N2X25hY2xfZGlzYWJsZSgpO1xuQEAgLTExMiw2ICsxMTMsNyBAQCBzdGF0aWMgaW50IGt2bV9yaXNjdl9jcHVfcG1fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nXG4gXHRcdCAqIGlzIGVuYWJsZWQgb24gdGhpcyBDUFUuXG4gXHRcdCAqL1xuIFx0XHRpZiAoX190aGlzX2NwdV9yZWFkKGt2bV9yaXNjdl92aXJ0dWFsaXphdGlvbl9lbmFibGVkKSkge1xuK1x0XHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9jcHVfaW52YWxpZGF0ZSgpO1xuIFx0XHRcdGt2bV9yaXNjdl9haWFfcG1fZW50ZXIoKTtcbiBcdFx0XHRrdm1fcmlzY3ZfY3NyX2NsZWFudXAoKTtcbiBcdFx0fVxuQEAgLTEzMCw2ICsxMzIsNyBAQCBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGt2bV9yaXNjdl9jcHVfcG1fbmIgPSB7XG4gc3RhdGljIHZvaWQga3ZtX3Jpc2N2X3RlYXJkb3duKHZvaWQpXG4ge1xuIFx0a3ZtX3Jpc2N2X2FpYV9leGl0KCk7XG4rXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfZnJlZSgpO1xuIFx0a3ZtX3Jpc2N2X25hY2xfZXhpdCgpO1xuIFx0a3ZtX3Jpc2N2X3ZfZXhpdCgpO1xuIFx0a3ZtX3VucmVnaXN0ZXJfcGVyZl9jYWxsYmFja3MoKTtcbkBAIC0xODEsOCArMTg0LDE1IEBAIHN0YXRpYyBpbnQgX19pbml0IHJpc2N2X2t2bV9pbml0KHZvaWQpXG4gXG4gXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KCk7XG4gXG4rXHRyYyA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19pbml0KCk7XG4rXHRpZiAocmMpIHtcbitcdFx0a3ZtX3Jpc2N2X25hY2xfZXhpdCgpO1xuK1x0XHRyZXR1cm4gcmM7XG4rXHR9XG4rXG4gXHRyYyA9IGt2bV9yaXNjdl9haWFfaW5pdCgpO1xuIFx0aWYgKHJjIFx1MDAyNlx1MDAyNiByYyAhPSAtRU5PREVWKSB7XG4rXHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKCk7XG4gXHRcdGt2bV9yaXNjdl9uYWNsX2V4aXQoKTtcbiBcdFx0cmV0dXJuIHJjO1xuIFx0fVxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL21tdS5jIGIvYXJjaC9yaXNjdi9rdm0vbW11LmNcbmluZGV4IDYwMzViNWVjOTUwMzkuLjNjOGZiNjAwOWMwYTUgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS9tbXUuY1xuKysrIGIvYXJjaC9yaXNjdi9rdm0vbW11LmNcbkBAIC0xNSw3ICsxNSw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQvc2lnbmFsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX21tdS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV9uYWNsLmhcdTAwM2Vcbi1cbisjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX3ZtaWQuaFx1MDAzZVxuIHN0YXRpYyBib29sIF9fcmVhZF9tb3N0bHkgZWFnZXJfcGFnZV9zcGxpdCA9IHRydWU7XG4gbW9kdWxlX3BhcmFtKGVhZ2VyX3BhZ2Vfc3BsaXQsIGJvb2wsIDA2NDQpO1xuIFxuQEAgLTc5OSwxMCArNzk5LDExIEBAIHZvaWQga3ZtX3Jpc2N2X21tdV9mcmVlX3BnZChzdHJ1Y3Qga3ZtICprdm0pXG4gdm9pZCBrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4ge1xuIFx0c3RydWN0IGt2bV9hcmNoICprYSA9IFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2g7XG4rXHR1NjQgdm1pZCA9IGF0b21pYzY0X3JlYWQoXHUwMDI2a2EtXHUwMDNldm1pZC5pZCk7XG4gXHR1bnNpZ25lZCBsb25nIGhnYXRwID0ga3ZtX3Jpc2N2X2dzdGFnZV9tb2RlKGthLVx1MDAzZXBnZF9sZXZlbHMpXG4gXHRcdFx0ICAgICAgXHUwMDNjXHUwMDNjIEhHQVRQX01PREVfU0hJRlQ7XG4gXG4tXHRoZ2F0cCB8PSAoUkVBRF9PTkNFKGthLVx1MDAzZXZtaWQudm1pZCkgXHUwMDNjXHUwMDNjIEhHQVRQX1ZNSURfU0hJRlQpIFx1MDAyNiBIR0FUUF9WTUlEO1xuK1x0aGdhdHAgfD0gKGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHZtaWQpIFx1MDAzY1x1MDAzYyBIR0FUUF9WTUlEX1NISUZUKSBcdTAwMjYgSEdBVFBfVk1JRDtcbiBcdGhnYXRwIHw9IChrYS1cdTAwM2VwZ2RfcGh5cyBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCkgXHUwMDI2IEhHQVRQX1BQTjtcbiBcbiBcdG5jc3Jfd3JpdGUoQ1NSX0hHQVRQLCBoZ2F0cCk7XG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdGxiLmMgYi9hcmNoL3Jpc2N2L2t2bS90bGIuY1xuaW5kZXggMmFlMzQ2MzJjZGNiMS4uYjg1ZTViYTIxOThhYSAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL3RsYi5jXG4rKysgYi9hcmNoL3Jpc2N2L2t2bS90bGIuY1xuQEAgLTIyNCw3ICsyMjQsNyBAQCB2b2lkIGt2bV9yaXNjdl9sb2NhbF90bGJfc2FuaXRpemUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0ICogZW50cmllcyBieSBWTUlEIHdoZW5ldmVyIHVuZGVybHlpbmcgSG9zdCBDUFUgY2hhbmdlcyBmb3IgYSBWQ1BVLlxuIFx0ICovXG4gXG4tXHR2bWlkID0gUkVBRF9PTkNFKHZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbitcdHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC5pZCkpO1xuIFx0a3ZtX3Jpc2N2X2xvY2FsX2hmZW5jZV9ndm1hX3ZtaWRfYWxsKHZtaWQpO1xuIFxuIFx0LypcbkBAIC0yNDQsNyArMjQ0LDcgQEAgdm9pZCBrdm1fcmlzY3ZfZmVuY2VfaV9wcm9jZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiB2b2lkIGt2bV9yaXNjdl90bGJfZmx1c2hfcHJvY2VzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4ge1xuIFx0c3RydWN0IGt2bV92bWlkICp2ID0gXHUwMDI2dmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkO1xuLVx0dW5zaWduZWQgbG9uZyB2bWlkID0gUkVBRF9PTkNFKHYtXHUwMDNldm1pZCk7XG4rXHR1bnNpZ25lZCBsb25nIHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNnYtXHUwMDNlaWQpKTtcbiBcbiBcdGlmIChrdm1fcmlzY3ZfbmFjbF9hdmFpbGFibGUoKSlcbiBcdFx0bmFjbF9oZmVuY2VfZ3ZtYV92bWlkX2FsbChuYWNsX3NobWVtKCksIHZtaWQpO1xuQEAgLTI1NSw3ICsyNTUsNyBAQCB2b2lkIGt2bV9yaXNjdl90bGJfZmx1c2hfcHJvY2VzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gdm9pZCBrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYWxsX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHtcbiBcdHN0cnVjdCBrdm1fdm1pZCAqdiA9IFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZDtcbi1cdHVuc2lnbmVkIGxvbmcgdm1pZCA9IFJFQURfT05DRSh2LVx1MDAzZXZtaWQpO1xuK1x0dW5zaWduZWQgbG9uZyB2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2LVx1MDAzZWlkKSk7XG4gXG4gXHRpZiAoa3ZtX3Jpc2N2X25hY2xfYXZhaWxhYmxlKCkpXG4gXHRcdG5hY2xfaGZlbmNlX3Z2bWFfYWxsKG5hY2xfc2htZW0oKSwgdm1pZCk7XG5AQCAtNTMxLDggKzUzMSwxMSBAQCB2b2lkIGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwoc3RydWN0IGt2bSAqa3ZtLFxuIFxuIGludCBrdm1fYXJjaF9mbHVzaF9yZW1vdGVfdGxic19yYW5nZShzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbiwgdTY0IG5yX3BhZ2VzKVxuIHtcbitcdHVuc2lnbmVkIGxvbmcgdm1pZCA9XG4rXHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXHUwMDI2a3ZtLVx1MDAzZWFyY2gudm1pZC5pZCkpO1xuK1xuIFx0a3ZtX3Jpc2N2X2hmZW5jZV9ndm1hX3ZtaWRfZ3BhKGt2bSwgLTFVTCwgMCxcbiBcdFx0XHRcdCAgICAgICBnZm4gXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQsIG5yX3BhZ2VzIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZULFxuLVx0XHRcdFx0ICAgICAgIFBBR0VfU0hJRlQsIFJFQURfT05DRShrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpKTtcbitcdFx0XHRcdCAgICAgICBQQUdFX1NISUZULCB2bWlkKTtcbiBcdHJldHVybiAwO1xuIH1cbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92Y3B1LmMgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1LmNcbmluZGV4IGUwNjJjYTE5ZjlkOGYuLjg1NTQyYzFhNWVjM2YgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS92Y3B1LmNcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHUuY1xuQEAgLTk0MywxNCArOTQzLDE0IEBAIGludCBrdm1fYXJjaF92Y3B1X2lvY3RsX3J1bihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gXHRcdFx0Y29udGludWU7XG4gXHRcdHJldCA9IDE7XG4gXG4tXHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUodmNwdSk7XG4tXG4gXHRcdHJldCA9IGt2bV9yaXNjdl9jaGVja192Y3B1X3JlcXVlc3RzKHZjcHUpO1xuIFx0XHRpZiAocmV0IFx1MDAzYz0gMClcbiBcdFx0XHRjb250aW51ZTtcbiBcbiBcdFx0cHJlZW1wdF9kaXNhYmxlKCk7XG4gXG4rXHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUodmNwdSk7XG4rXG4gXHRcdC8qIFVwZGF0ZSBBSUEgSFcgc3RhdGUgYmVmb3JlIGVudGVyaW5nIGd1ZXN0ICovXG4gXHRcdHJldCA9IGt2bV9yaXNjdl92Y3B1X2FpYV91cGRhdGUodmNwdSk7XG4gXHRcdGlmIChyZXQgXHUwMDNjPSAwKSB7XG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfcmVwbGFjZS5jIGIvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfcmVwbGFjZS5jXG5pbmRleCA1MDZhNTEwYjZiZmYzLi4xYmUzODZhNzhlMjdmIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfcmVwbGFjZS5jXG4rKysgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV9yZXBsYWNlLmNcbkBAIC0xMDQsNyArMTA0LDcgQEAgc3RhdGljIGludCBrdm1fc2JpX2V4dF9yZmVuY2VfaGFuZGxlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW5cbiBcdFx0a3ZtX3Jpc2N2X3ZjcHVfcG11X2luY3JfZncodmNwdSwgU0JJX1BNVV9GV19GRU5DRV9JX1NFTlQpO1xuIFx0XHRicmVhaztcbiBcdGNhc2UgU0JJX0VYVF9SRkVOQ0VfUkVNT1RFX1NGRU5DRV9WTUE6XG4tXHRcdHZtaWQgPSBSRUFEX09OQ0UodmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpO1xuK1x0XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdFx0aWYgKChjcC1cdTAwM2VhMiA9PSAwIFx1MDAyNlx1MDAyNiBjcC1cdTAwM2VhMyA9PSAwKSB8fCBjcC1cdTAwM2VhMyA9PSAtMVVMKVxuIFx0XHRcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwodmNwdS1cdTAwM2Vrdm0sIGhiYXNlLCBobWFzaywgdm1pZCk7XG4gXHRcdGVsc2VcbkBAIC0xMTMsNyArMTEzLDcgQEAgc3RhdGljIGludCBrdm1fc2JpX2V4dF9yZmVuY2VfaGFuZGxlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW5cbiBcdFx0a3ZtX3Jpc2N2X3ZjcHVfcG11X2luY3JfZncodmNwdSwgU0JJX1BNVV9GV19IRkVOQ0VfVlZNQV9TRU5UKTtcbiBcdFx0YnJlYWs7XG4gXHRjYXNlIFNCSV9FWFRfUkZFTkNFX1JFTU9URV9TRkVOQ0VfVk1BX0FTSUQ6XG4tXHRcdHZtaWQgPSBSRUFEX09OQ0UodmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpO1xuK1x0XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdFx0aWYgKChjcC1cdTAwM2VhMiA9PSAwIFx1MDAyNlx1MDAyNiBjcC1cdTAwM2VhMyA9PSAwKSB8fCBjcC1cdTAwM2VhMyA9PSAtMVVMKVxuIFx0XHRcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hc2lkX2FsbCh2Y3B1LVx1MDAzZWt2bSwgaGJhc2UsIGhtYXNrLFxuIFx0XHRcdFx0XHRcdCAgICAgICBjcC1cdTAwM2VhNCwgdm1pZCk7XG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfdjAxLmMgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuY1xuaW5kZXggZGU1NDRlYTNmMjhkYy4uY2EzZWZlNjNjMWNmMSAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jXG4rKysgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuY1xuQEAgLTg4LDE0ICs4OCwxNCBAQCBzdGF0aWMgaW50IGt2bV9zYmlfZXh0X3YwMV9oYW5kbGVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1bixcbiBcdFx0aWYgKGNwLVx1MDAzZWE3ID09IFNCSV9FWFRfMF8xX1JFTU9URV9GRU5DRV9JKVxuIFx0XHRcdGt2bV9yaXNjdl9mZW5jZV9pKHZjcHUtXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2spO1xuIFx0XHRlbHNlIGlmIChjcC1cdTAwM2VhNyA9PSBTQklfRVhUXzBfMV9SRU1PVEVfU0ZFTkNFX1ZNQSkge1xuLVx0XHRcdHZtaWQgPSBSRUFEX09OQ0UodmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpO1xuK1x0XHRcdHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC5pZCkpO1xuIFx0XHRcdGlmIChjcC1cdTAwM2VhMSA9PSAwIFx1MDAyNlx1MDAyNiBjcC1cdTAwM2VhMiA9PSAwKVxuIFx0XHRcdFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbCh2Y3B1LVx1MDAzZWt2bSwgaGJhc2UsIGhtYXNrLCB2bWlkKTtcbiBcdFx0XHRlbHNlXG4gXHRcdFx0XHRrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfZ3ZhKHZjcHUtXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2ssIGNwLVx1MDAzZWExLFxuIFx0XHRcdFx0XHRcdFx0ICBjcC1cdTAwM2VhMiwgUEFHRV9TSElGVCwgdm1pZCk7XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZCk7XG4rXHRcdFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXHUwMDI2dmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLmlkKSk7XG4gXHRcdFx0aWYgKGNwLVx1MDAzZWExID09IDAgXHUwMDI2XHUwMDI2IGNwLVx1MDAzZWEyID09IDApXG4gXHRcdFx0XHRrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYXNpZF9hbGwodmNwdS1cdTAwM2Vrdm0sIGhiYXNlLCBobWFzayxcbiBcdFx0XHRcdFx0XHRcdCAgICAgICBjcC1cdTAwM2VhMywgdm1pZCk7XG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdm1pZC5jIGIvYXJjaC9yaXNjdi9rdm0vdm1pZC5jXG5pbmRleCBjMTViZGIxZGQ4YmVmLi43Yjg2YTZmYmU0YTY5IDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdm1pZC5jXG4rKysgYi9hcmNoL3Jpc2N2L2t2bS92bWlkLmNcbkBAIC02LDExICs2LDE1IEBAXG4gICogICAgIEFudXAgUGF0ZWwgXHUwMDNjYW51cC5wYXRlbEB3ZGMuY29tXHUwMDNlXG4gICovXG4gXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYml0bWFwLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRvcHMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2NwdW1hc2suaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2Vycm5vLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9lcnIuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvcGVyY3B1LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9wcmVlbXB0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zbXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2t2bV9ob3N0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20vY3NyLmhcdTAwM2VcbkBAIC0xOCwyNiArMjIsNTQgQEBcbiAjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX3RsYi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV92bWlkLmhcdTAwM2VcbiBcbi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX3ZlcnNpb24gPSAxO1xuLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZtaWRfbmV4dDtcbitzdGF0aWMgYXRvbWljNjRfdCB2bWlkX2dlbmVyYXRpb247XG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgKnZtaWRfbWFwO1xuIHN0YXRpYyB1bnNpZ25lZCBsb25nIHZtaWRfYml0cyBfX3JvX2FmdGVyX2luaXQ7XG4tc3RhdGljIERFRklORV9TUElOTE9DSyh2bWlkX2xvY2spO1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nIHZtaWRfY3VyX2lkeCA9IDE7XG4rXG4rc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0sodm1pZF9sb2NrKTtcbitcbitzdGF0aWMgREVGSU5FX1BFUl9DUFUoYXRvbWljNjRfdCwgYWN0aXZlX3ZtaWRzKTtcbitzdGF0aWMgREVGSU5FX1BFUl9DUFUodTY0LCByZXNlcnZlZF92bWlkcyk7XG4rXG4rc3RhdGljIGNwdW1hc2tfdCB0bGJfZmx1c2hfcGVuZGluZztcbitcbisjZGVmaW5lIFZNSURfRklSU1RfVkVSU0lPTlx0QklUX1VMTCh2bWlkX2JpdHMpXG4rI2RlZmluZSBOVU1fVk1JRFNcdFx0QklUKHZtaWRfYml0cylcbisjZGVmaW5lIFZNSURfSFdfTUFTS1x0XHQoVk1JRF9GSVJTVF9WRVJTSU9OIC0gMSlcbitcbitzdGF0aWMgYm9vbCB2bWlkX2dlbl9tYXRjaCh1NjQgdm1pZClcbit7XG4rXHRyZXR1cm4gISgodm1pZCBeIGF0b21pYzY0X3JlYWQoXHUwMDI2dm1pZF9nZW5lcmF0aW9uKSkgXHUwMDNlXHUwMDNlIHZtaWRfYml0cyk7XG4rfVxuK1xuK3Vuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodTY0IHZtaWQpXG4re1xuK1x0aWYgKCF2bWlkX2JpdHMpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuICh1bnNpZ25lZCBsb25nKSh2bWlkIFx1MDAyNiBWTUlEX0hXX01BU0spO1xuK31cbiBcbiB2b2lkIF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KHZvaWQpXG4ge1xuLVx0LyogRmlndXJlLW91dCBudW1iZXIgb2YgVk1JRCBiaXRzIGluIEhXICovXG4rXHQvKiBGaWd1cmUgb3V0IHRoZSBudW1iZXIgb2YgVk1JRCBiaXRzIHN1cHBvcnRlZCBieSBoYXJkd2FyZS4gKi9cbiBcdGNzcl93cml0ZShDU1JfSEdBVFAsIChrdm1fcmlzY3ZfZ3N0YWdlX21vZGUoa3ZtX3Jpc2N2X2dzdGFnZV9tYXhfcGdkX2xldmVscykgXHUwMDNjXHUwMDNjXG4tXHRcdFx0ICAgICAgSEdBVFBfTU9ERV9TSElGVCkgfCBIR0FUUF9WTUlEKTtcbitcdFx0ICAgSEdBVFBfTU9ERV9TSElGVCkgfCBIR0FUUF9WTUlEKTtcbiBcdHZtaWRfYml0cyA9IGNzcl9yZWFkKENTUl9IR0FUUCk7XG4gXHR2bWlkX2JpdHMgPSAodm1pZF9iaXRzIFx1MDAyNiBIR0FUUF9WTUlEKSBcdTAwM2VcdTAwM2UgSEdBVFBfVk1JRF9TSElGVDtcbiBcdHZtaWRfYml0cyA9IGZsc19sb25nKHZtaWRfYml0cyk7XG4gXHRjc3Jfd3JpdGUoQ1NSX0hHQVRQLCAwKTtcbiBcbi1cdC8qIFdlIHBvbGx1dGVkIGxvY2FsIFRMQiBzbyBmbHVzaCBhbGwgZ3Vlc3QgVExCICovXG4rXHQvKiBGbHVzaCB0aGUgbG9jYWwgZ3Vlc3QgVExCIGFmdGVyIHByb2JpbmcgSEdBVFAuICovXG4gXHRrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfYWxsKCk7XG4gXG4tXHQvKiBXZSBkb24ndCB1c2UgVk1JRCBiaXRzIGlmIHRoZXkgYXJlIG5vdCBzdWZmaWNpZW50ICovXG4tXHRpZiAoKDFVTCBcdTAwM2NcdTAwM2Mgdm1pZF9iaXRzKSBcdTAwM2MgbnVtX3Bvc3NpYmxlX2NwdXMoKSlcbitcdC8qXG4rXHQgKiBWTUlEIDAgaXMgcmVzZXJ2ZWQuICBEdXJpbmcgcm9sbG92ZXIgZXZlcnkgcG9zc2libGUgQ1BVIG1heVxuK1x0ICogcmVzZXJ2ZSBvbmUgaGFyZHdhcmUgVk1JRCwgYW5kIHdlIHN0aWxsIG5lZWQgYXQgbGVhc3Qgb25lIFZNSURcbitcdCAqIGF2YWlsYWJsZSBmb3IgYSBuZXcgYWxsb2NhdGlvbi5cbitcdCAqL1xuK1x0aWYgKHZtaWRfYml0cyBcdTAwMjZcdTAwMjYgTlVNX1ZNSURTIC0gMSBcdTAwM2M9IG51bV9wb3NzaWJsZV9jcHVzKCkpXG4gXHRcdHZtaWRfYml0cyA9IDA7XG4gfVxuIFxuQEAgLTQ2LDgwICs3OCwyOTggQEAgdW5zaWduZWQgbG9uZyBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYml0cyh2b2lkKVxuIFx0cmV0dXJuIHZtaWRfYml0cztcbiB9XG4gXG4raW50IF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfaW5pdCh2b2lkKVxuK3tcbitcdGludCBjcHU7XG4rXG4rXHRpZiAoIXZtaWRfYml0cylcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHR2bWlkX21hcCA9IGJpdG1hcF96YWxsb2MoTlVNX1ZNSURTLCBHRlBfS0VSTkVMKTtcbitcdGlmICghdm1pZF9tYXApXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0dm1pZF9jdXJfaWR4ID0gMTtcbitcbitcdC8qIEhhcmR3YXJlIFZNSUQgMCBpcyByZXNlcnZlZC4gKi9cbitcdF9fc2V0X2JpdCgwLCB2bWlkX21hcCk7XG4rXG4rXHRhdG9taWM2NF9zZXQoXHUwMDI2dm1pZF9nZW5lcmF0aW9uLCBWTUlEX0ZJUlNUX1ZFUlNJT04pO1xuK1xuK1x0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xuK1x0XHRhdG9taWM2NF9zZXQoXHUwMDI2cGVyX2NwdShhY3RpdmVfdm1pZHMsIGNwdSksIDApO1xuK1x0XHRwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID0gMDtcbitcdH1cbitcbitcdC8qXG4rXHQgKiBFdmVyeSBDUFUgcGVyZm9ybXMgYW4gaW5pdGlhbCBsb2NhbCBpbnZhbGlkYXRpb24gYmVmb3JlIGl0c1xuK1x0ICogZmlyc3QgVk1JRCBhY3RpdmF0aW9uLlxuK1x0ICovXG4rXHRjcHVtYXNrX2NvcHkoXHUwMDI2dGxiX2ZsdXNoX3BlbmRpbmcsIGNwdV9wb3NzaWJsZV9tYXNrKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbit2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKHZvaWQpXG4re1xuK1x0Yml0bWFwX2ZyZWUodm1pZF9tYXApO1xuK1x0dm1pZF9tYXAgPSBOVUxMO1xuK31cbitcbiBpbnQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2luaXQoc3RydWN0IGt2bSAqa3ZtKVxuIHtcbi1cdC8qIE1hcmsgdGhlIGluaXRpYWwgVk1JRCBhbmQgVk1JRCB2ZXJzaW9uIGludmFsaWQgKi9cbi1cdGt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZF92ZXJzaW9uID0gMDtcbi1cdGt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZCA9IDA7XG4rXHRhdG9taWM2NF9zZXQoXHUwMDI2a3ZtLVx1MDAzZWFyY2gudm1pZC5pZCwgMCk7XG4gXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4gYm9vbCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQoc3RydWN0IGt2bV92bWlkICp2bWlkKVxuIHtcbitcdHU2NCBpZDtcbitcbiBcdGlmICghdm1pZF9iaXRzKVxuIFx0XHRyZXR1cm4gZmFsc2U7XG4gXG4tXHRyZXR1cm4gdW5saWtlbHkoUkVBRF9PTkNFKHZtaWQtXHUwMDNldm1pZF92ZXJzaW9uKSAhPVxuLVx0XHRcdFJFQURfT05DRSh2bWlkX3ZlcnNpb24pKTtcbitcdGlkID0gYXRvbWljNjRfcmVhZChcdTAwMjZ2bWlkLVx1MDAzZWlkKTtcbitcbitcdHJldHVybiB1bmxpa2VseSghdm1pZF9nZW5fbWF0Y2goaWQpKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgX19sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwodm9pZCAqaW5mbylcbisvKlxuKyAqIENhbGxlZCB3aXRoIHZtaWRfbG9jayBoZWxkIGFmdGVyIHZtaWRfZ2VuZXJhdGlvbiBoYXMgYWxyZWFkeSBiZWVuXG4rICogYWR2YW5jZWQuXG4rICpcbisgKiBObyByZW1vdGUgQ1BVIGlzIGludGVycnVwdGVkIGhlcmUuICBJbnN0ZWFkLCBwcmVzZXJ2ZSBldmVyeSBWTUlEXG4rICogd2hpY2ggbWF5IHN0aWxsIGJlIHVzZWQgYnkgYSBDUFUgYW5kIHF1ZXVlIGEgbG9jYWwgaW52YWxpZGF0aW9uIGZvclxuKyAqIHRoYXQgQ1BVJ3MgbmV4dCBWTUlEIGFjdGl2YXRpb24uXG4rICovXG4rc3RhdGljIHZvaWQgZmx1c2hfY29udGV4dCh2b2lkKVxuIHtcbi1cdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwoKTtcbitcdHU2NCB2bWlkO1xuK1x0aW50IGNwdTtcbitcbitcdGJpdG1hcF96ZXJvKHZtaWRfbWFwLCBOVU1fVk1JRFMpO1xuK1x0X19zZXRfYml0KDAsIHZtaWRfbWFwKTtcbitcbitcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHtcbitcdFx0dm1pZCA9IGF0b21pYzY0X3hjaGcoXHUwMDI2cGVyX2NwdShhY3RpdmVfdm1pZHMsIGNwdSksIDApO1xuK1xuK1x0XHQvKlxuK1x0XHQgKiBUaGUgQ1BVIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBjYXVnaHQgYnkgYW4gZWFybGllciByb2xsb3ZlclxuK1x0XHQgKiB3aXRob3V0IHBlcmZvcm1pbmcgYW5vdGhlciBhY3RpdmF0aW9uIHNpbmNlIHRoZW4uICBJbiB0aGF0XG4rXHRcdCAqIGNhc2UgcmVzZXJ2ZWRfdm1pZHMgaXMgdGhlIG9ubHkgcmVjb3JkIG9mIHRoZSBvbGQgY29udGV4dC5cbitcdFx0ICovXG4rXHRcdGlmICghdm1pZClcbitcdFx0XHR2bWlkID0gcGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KTtcbitcbitcdFx0aWYgKHZtaWQpXG4rXHRcdFx0X19zZXRfYml0KGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHZtaWQpLFxuK1x0XHRcdFx0ICB2bWlkX21hcCk7XG4rXG4rXHRcdHBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSkgPSB2bWlkO1xuK1x0fVxuK1xuK1x0Y3B1bWFza19jb3B5KFx1MDAyNnRsYl9mbHVzaF9wZW5kaW5nLCBjcHVfcG9zc2libGVfbWFzayk7XG4rfVxuK1xuKy8qXG4rICogVXBkYXRlIGV2ZXJ5IHJlc2VydmVkIGNvcHkgb2YgYW4gb2xkIHNvZnR3YXJlIFZNSUQuXG4rICpcbisgKiBEbyBub3Qgc3RvcCBhZnRlciB0aGUgZmlyc3QgbWF0Y2g6IHRoZSBzYW1lIFZNIG1heSBoYXZlIGJlZW4gYWN0aXZlXG4rICogb24gbW9yZSB0aGFuIG9uZSBDUFUgd2hlbiByb2xsb3ZlciBvY2N1cnJlZC5cbisgKi9cbitzdGF0aWMgYm9vbCBjaGVja191cGRhdGVfcmVzZXJ2ZWRfdm1pZCh1NjQgb2xkX3ZtaWQsIHU2NCBuZXdfdm1pZClcbit7XG4rXHRib29sIGhpdCA9IGZhbHNlO1xuK1x0aW50IGNwdTtcbitcbitcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHtcbitcdFx0aWYgKHBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSkgPT0gb2xkX3ZtaWQpIHtcbitcdFx0XHRwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID0gbmV3X3ZtaWQ7XG4rXHRcdFx0aGl0ID0gdHJ1ZTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0cmV0dXJuIGhpdDtcbit9XG4rXG4rLypcbisgKiBBbGxvY2F0ZS9wcm9tb3RlIGEgc29mdHdhcmUgVk1JRC5cbisgKlxuKyAqIHZtaWRfbG9jayBtdXN0IGJlIGhlbGQgYnkgdGhlIGNhbGxlci5cbisgKi9cbitzdGF0aWMgdTY0IG5ld192bWlkX2xvY2tlZChzdHJ1Y3Qga3ZtX3ZtaWQgKmt2bV92bWlkKVxuK3tcbitcdHU2NCB2bWlkID0gYXRvbWljNjRfcmVhZChcdTAwMjZrdm1fdm1pZC1cdTAwM2VpZCk7XG4rXHR1NjQgZ2VuZXJhdGlvbiA9IGF0b21pYzY0X3JlYWQoXHUwMDI2dm1pZF9nZW5lcmF0aW9uKTtcbitcdHU2NCBuZXdfdm1pZDtcbitcdHVuc2lnbmVkIGxvbmcgaWR4O1xuK1xuK1x0aWYgKHZtaWQpIHtcbitcdFx0bmV3X3ZtaWQgPSBnZW5lcmF0aW9uIHxcbitcdFx0XHQgICBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh2bWlkKTtcbitcbitcdFx0LypcbitcdFx0ICogVGhlIG9sZCBWTUlEIGlzIHN0aWxsIHByb3RlY3RlZCBieSBvbmUgb3IgbW9yZSBDUFVzLlxuK1x0XHQgKiBLZWVwIHRoZSBzYW1lIGhhcmR3YXJlIFZNSUQgYW5kIG9ubHkgcHJvbW90ZSBnZW5lcmF0aW9uLlxuK1x0XHQgKi9cbitcdFx0aWYgKGNoZWNrX3VwZGF0ZV9yZXNlcnZlZF92bWlkKHZtaWQsIG5ld192bWlkKSlcbitcdFx0XHRyZXR1cm4gbmV3X3ZtaWQ7XG4rXG4rXHRcdC8qXG4rXHRcdCAqIFRoZSBWTSBoYWQgYSBWTUlEIGluIGFuIG9sZGVyIGdlbmVyYXRpb24uICBSZXVzZSB0aGUgc2FtZVxuK1x0XHQgKiBoYXJkd2FyZSBudW1iZXIgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY2xhaW1lZC5cbitcdFx0ICovXG4rXHRcdGlkeCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHZtaWQpO1xuK1x0XHRpZiAoIV9fdGVzdF9hbmRfc2V0X2JpdChpZHgsIHZtaWRfbWFwKSlcbitcdFx0XHRyZXR1cm4gbmV3X3ZtaWQ7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogRmluZCBhIGZyZWUgVk1JRCBpbiB0aGUgY3VycmVudCBnZW5lcmF0aW9uLlxuK1x0ICovXG4rXHRpZHggPSBmaW5kX25leHRfemVyb19iaXQodm1pZF9tYXAsIE5VTV9WTUlEUywgdm1pZF9jdXJfaWR4KTtcbitcdGlmIChpZHggIT0gTlVNX1ZNSURTKVxuK1x0XHRnb3RvIHNldF92bWlkO1xuK1xuK1x0LypcbitcdCAqIE5vIGZyZWUgVk1JRC4gIFN0YXJ0IGEgbmV3IGdlbmVyYXRpb24sIHByZXNlcnZlIGFsbCBDUFUtbG9jYWxcbitcdCAqIHVzZXJzLCBhbmQgZGVmZXIgZWFjaCBDUFUncyBmbHVzaCB1bnRpbCBpdHMgbmV4dCBhY3RpdmF0aW9uLlxuK1x0ICovXG4rXHRnZW5lcmF0aW9uICs9IFZNSURfRklSU1RfVkVSU0lPTjtcbitcbitcdC8qIFNvZnR3YXJlIFZNSUQgMCBpcyByZXNlcnZlZCBhcyB0aGUgaW52YWxpZCBpZGVudGlmaWVyLiAqL1xuK1x0aWYgKHVubGlrZWx5KCFnZW5lcmF0aW9uKSlcbitcdFx0Z2VuZXJhdGlvbiA9IFZNSURfRklSU1RfVkVSU0lPTjtcbitcbitcdGF0b21pYzY0X3hjaGcoXHUwMDI2dm1pZF9nZW5lcmF0aW9uLCBnZW5lcmF0aW9uKTtcbitcdGZsdXNoX2NvbnRleHQoKTtcbitcbitcdC8qXG4rXHQgKiBOVU1fVk1JRFMgLSAxIFx1MDAzZSBudW1fcG9zc2libGVfY3B1cygpLCB0aGVyZWZvcmUgcm9sbG92ZXIgbXVzdFxuK1x0ICogbGVhdmUgYXQgbGVhc3Qgb25lIGFsbG9jYXRhYmxlIGhhcmR3YXJlIFZNSUQuXG4rXHQgKi9cbitcdGlkeCA9IGZpbmRfbmV4dF96ZXJvX2JpdCh2bWlkX21hcCwgTlVNX1ZNSURTLCAxKTtcbitcbitzZXRfdm1pZDpcbitcdF9fc2V0X2JpdChpZHgsIHZtaWRfbWFwKTtcbitcdHZtaWRfY3VyX2lkeCA9IGlkeDtcbitcbitcdHJldHVybiBnZW5lcmF0aW9uIHwgaWR4O1xuIH1cbiBcbiB2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHtcbi1cdHVuc2lnbmVkIGxvbmcgaTtcbitcdHN0cnVjdCBrdm1fdm1pZCAqa3ZtX3ZtaWQgPSBcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQ7XG4rXHRhdG9taWM2NF90ICphY3RpdmU7XG4gXHRzdHJ1Y3Qga3ZtX3ZjcHUgKnY7XG4tXHRzdHJ1Y3Qga3ZtX3ZtaWQgKnZtaWQgPSBcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQ7XG4rXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xuK1x0dTY0IHZtaWQ7XG4rXHR1NjQgb2xkX2FjdGl2ZV92bWlkO1xuK1x0dW5zaWduZWQgbG9uZyBpO1xuK1x0dW5zaWduZWQgaW50IGNwdTtcbitcdGJvb2wgdm1pZF9jaGFuZ2VkID0gZmFsc2U7XG4gXG4tXHRpZiAoIWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF92ZXJfY2hhbmdlZCh2bWlkKSlcbitcdGlmICghdm1pZF9iaXRzKVxuIFx0XHRyZXR1cm47XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2dm1pZF9sb2NrKTtcbitcdC8qXG4rXHQgKiBhY3RpdmVfdm1pZHMgYW5kIHRsYl9mbHVzaF9wZW5kaW5nIGFyZSBwZXItQ1BVIGFkbWlzc2lvbiBzdGF0ZS5cbitcdCAqIFRoZXkgbXVzdCByZWZlciB0byB0aGUgc2FtZSBDUFUgZm9yIHRoZSBjb21wbGV0ZSBhY3RpdmF0aW9uLlxuK1x0ICovXG4rXHRwcmVlbXB0X2Rpc2FibGUoKTtcbitcbitcdGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTtcbitcdGFjdGl2ZSA9IHRoaXNfY3B1X3B0cihcdTAwMjZhY3RpdmVfdm1pZHMpO1xuK1xuK1x0dm1pZCA9IGF0b21pYzY0X3JlYWQoXHUwMDI2a3ZtX3ZtaWQtXHUwMDNlaWQpO1xuK1x0b2xkX2FjdGl2ZV92bWlkID0gYXRvbWljNjRfcmVhZChhY3RpdmUpO1xuIFxuIFx0Lypcbi1cdCAqIFdlIG5lZWQgdG8gcmUtY2hlY2sgdGhlIHZtaWRfdmVyc2lvbiBoZXJlIHRvIGVuc3VyZSB0aGF0IGlmXG4tXHQgKiBhbm90aGVyIHZjcHUgYWxyZWFkeSBhbGxvY2F0ZWQgYSB2YWxpZCB2bWlkIGZvciB0aGlzIHZtLlxuK1x0ICogRmFzdCBwYXRoLlxuK1x0ICpcbitcdCAqIFRoZSBjbXB4Y2hnIHJhY2VzIHdpdGggZmx1c2hfY29udGV4dCgpJ3MgeGNoZyBvbiB0aGUgc2FtZVxuK1x0ICogcGVyLUNQVSBhdG9taWMuICBFaXRoZXIgdGhpcyBhY3RpdmF0aW9uIGlzIGNhcHR1cmVkIGJ5IHJvbGxvdmVyLFxuK1x0ICogb3Igcm9sbG92ZXIgY2xlYXJzIGFjdGl2ZSBmaXJzdCBhbmQgdGhlIGNtcHhjaGcgZmFpbHMuXG4gXHQgKi9cbi1cdGlmICgha3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3Zlcl9jaGFuZ2VkKHZtaWQpKSB7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnZtaWRfbG9jayk7XG4tXHRcdHJldHVybjtcbitcdGlmIChvbGRfYWN0aXZlX3ZtaWQgXHUwMDI2XHUwMDI2XG4rXHQgICAgdm1pZF9nZW5fbWF0Y2godm1pZCkgXHUwMDI2XHUwMDI2XG4rXHQgICAgYXRvbWljNjRfY21weGNoZyhhY3RpdmUsIG9sZF9hY3RpdmVfdm1pZCwgdm1pZCkgPT1cbitcdCAgICBvbGRfYWN0aXZlX3ZtaWQpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0cmF3X3NwaW5fbG9ja19pcnFzYXZlKFx1MDAyNnZtaWRfbG9jaywgZmxhZ3MpO1xuK1xuK1x0LypcbitcdCAqIFJlLXJlYWQgdW5kZXIgdGhlIGFsbG9jYXRvciBsb2NrIGJlY2F1c2UgYW5vdGhlciB2Q1BVIG9mIHRoaXMgVk1cbitcdCAqIG1heSBhbHJlYWR5IGhhdmUgcHJvbW90ZWQgb3IgYWxsb2NhdGVkIHRoZSBzaGFyZWQgVk1JRC5cbitcdCAqL1xuK1x0dm1pZCA9IGF0b21pYzY0X3JlYWQoXHUwMDI2a3ZtX3ZtaWQtXHUwMDNlaWQpO1xuK1xuK1x0aWYgKCF2bWlkX2dlbl9tYXRjaCh2bWlkKSkge1xuK1x0XHR2bWlkID0gbmV3X3ZtaWRfbG9ja2VkKGt2bV92bWlkKTtcbitcdFx0YXRvbWljNjRfc2V0KFx1MDAyNmt2bV92bWlkLVx1MDAzZWlkLCB2bWlkKTtcbitcdFx0dm1pZF9jaGFuZ2VkID0gdHJ1ZTtcbiBcdH1cbiBcbi1cdC8qIEZpcnN0IHVzZXIgb2YgYSBuZXcgVk1JRCB2ZXJzaW9uPyAqL1xuLVx0aWYgKHVubGlrZWx5KHZtaWRfbmV4dCA9PSAwKSkge1xuLVx0XHRXUklURV9PTkNFKHZtaWRfdmVyc2lvbiwgUkVBRF9PTkNFKHZtaWRfdmVyc2lvbikgKyAxKTtcbi1cdFx0dm1pZF9uZXh0ID0gMTtcbitcdC8qXG4rXHQgKiBFdmVuIGlmIGFub3RoZXIgdkNQVSBhbHJlYWR5IHVwZGF0ZWQgdGhlIHNoYXJlZCBWTUlELCB0aGlzIENQVVxuK1x0ICogbXVzdCBzdGlsbCBkaXNjaGFyZ2UgaXRzIG93biByb2xsb3ZlciBmbHVzaCBvYmxpZ2F0aW9uLlxuK1x0ICovXG4rXHRpZiAoY3B1bWFza190ZXN0X2FuZF9jbGVhcl9jcHUoY3B1LCBcdTAwMjZ0bGJfZmx1c2hfcGVuZGluZykpXG4rXHRcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwoKTtcbiBcbi1cdFx0Lypcbi1cdFx0ICogV2UgcmFuIG91dCBvZiBWTUlEcyBzbyB3ZSBpbmNyZW1lbnQgdm1pZF92ZXJzaW9uIGFuZFxuLVx0XHQgKiBzdGFydCBhc3NpZ25pbmcgVk1JRHMgZnJvbSAxLlxuLVx0XHQgKlxuLVx0XHQgKiBUaGlzIGFsc28gbWVhbnMgZXhpc3RpbmcgVk1JRHMgYXNzaWdubWVudCB0byBhbGwgR3Vlc3Rcbi1cdFx0ICogaW5zdGFuY2VzIGlzIGludmFsaWQgYW5kIHdlIGhhdmUgZm9yY2UgVk1JRCByZS1hc3NpZ25lbWVudFxuLVx0XHQgKiBmb3IgYWxsIEd1ZXN0IGluc3RhbmNlcy4gVGhlIEd1ZXN0IGluc3RhbmNlcyB0aGF0IHdlcmUgbm90XG4tXHRcdCAqIHJ1bm5pbmcgd2lsbCBhdXRvbWF0aWNhbGx5IHBpY2stdXAgbmV3IFZNSURzIGJlY2F1c2Ugd2lsbFxuLVx0XHQgKiBjYWxsIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoKSB3aGVuZXZlciB0aGV5IGVudGVyXG4tXHRcdCAqIGluLWtlcm5lbCBydW4gbG9vcC4gRm9yIEd1ZXN0IGluc3RhbmNlcyB0aGF0IGFyZSBhbHJlYWR5XG4tXHRcdCAqIHJ1bm5pbmcsIHdlIGZvcmNlIFZNIGV4aXRzIG9uIGFsbCBob3N0IENQVXMgdXNpbmcgSVBJIGFuZFxuLVx0XHQgKiBmbHVzaCBhbGwgR3Vlc3QgVExCcy5cbi1cdFx0ICovXG4tXHRcdG9uX2VhY2hfY3B1X21hc2soY3B1X29ubGluZV9tYXNrLCBfX2xvY2FsX2hmZW5jZV9ndm1hX2FsbCxcbi1cdFx0XHRcdCBOVUxMLCAxKTtcbitcdC8qXG4rXHQgKiBQdWJsaXNoIHRoZSBDUFUtbG9jYWwgYWN0aXZlIGlkZW50aXR5IG9ubHkgYWZ0ZXIgdGhlIHJlcXVpcmVkXG4rXHQgKiBsb2NhbCBpbnZhbGlkYXRpb24gaXMgY29tcGxldGUuXG4rXHQgKi9cbitcdGF0b21pYzY0X3NldChhY3RpdmUsIHZtaWQpO1xuK1xuK1x0cmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoXHUwMDI2dm1pZF9sb2NrLCBmbGFncyk7XG4rXG4rXHQvKlxuK1x0ICogQSBuZXcgc29mdHdhcmUgVk1JRCBtYXkgY29udGFpbiBhIGRpZmZlcmVudCBoYXJkd2FyZSBWTUlELCBzb1xuK1x0ICogcmVxdWVzdCBhbiBIR0FUUCB1cGRhdGUgZm9yIGV2ZXJ5IHZDUFUgaW4gdGhlIFZNLlxuK1x0ICovXG4rXHRpZiAodm1pZF9jaGFuZ2VkKSB7XG4rXHRcdGt2bV9mb3JfZWFjaF92Y3B1KGksIHYsIHZjcHUtXHUwMDNla3ZtKVxuK1x0XHRcdGt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9VUERBVEVfSEdBVFAsIHYpO1xuIFx0fVxuIFxuLVx0dm1pZC1cdTAwM2V2bWlkID0gdm1pZF9uZXh0O1xuLVx0dm1pZF9uZXh0Kys7XG4tXHR2bWlkX25leHQgXHUwMDI2PSAoMSBcdTAwM2NcdTAwM2Mgdm1pZF9iaXRzKSAtIDE7XG4rb3V0OlxuK1x0cHJlZW1wdF9lbmFibGUoKTtcbit9XG4rXG4rLypcbisgKiBDUFUgdmlydHVhbGl6YXRpb24vQ1NSIHN0YXRlIGlzIGJlaW5nIGRpc2NhcmRlZC5cbisgKlxuKyAqIFdpdGhkcmF3IGZhc3QtcGF0aCBlbGlnaWJpbGl0eSwgYnV0IGNvbnNlcnZhdGl2ZWx5IHByZXNlcnZlIHRoZSBsYXN0XG4rICogaWRlbnRpdHkgaW5zdGVhZCBvZiBtYWtpbmcgaXRzIGhhcmR3YXJlIFZNSUQgaW1tZWRpYXRlbHkgcmV1c2FibGUuXG4rICovXG4rdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfY3B1X2ludmFsaWRhdGUodm9pZClcbit7XG4rXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xuK1x0dTY0IHZtaWQ7XG4rXHR1bnNpZ25lZCBpbnQgY3B1O1xuIFxuLVx0V1JJVEVfT05DRSh2bWlkLVx1MDAzZXZtaWRfdmVyc2lvbiwgUkVBRF9PTkNFKHZtaWRfdmVyc2lvbikpO1xuK1x0aWYgKCF2bWlkX2JpdHMpXG4rXHRcdHJldHVybjtcbiBcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnZtaWRfbG9jayk7XG4rXHRsb2NrZGVwX2Fzc2VydF9wcmVlbXB0aW9uX2Rpc2FibGVkKCk7XG4rXG4rXHRjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7XG4rXG4rXHRyYXdfc3Bpbl9sb2NrX2lycXNhdmUoXHUwMDI2dm1pZF9sb2NrLCBmbGFncyk7XG4rXG4rXHR2bWlkID0gYXRvbWljNjRfeGNoZyh0aGlzX2NwdV9wdHIoXHUwMDI2YWN0aXZlX3ZtaWRzKSwgMCk7XG4rXG4rXHRpZiAodm1pZClcbitcdFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IHZtaWQ7XG4rXG4rXHQvKlxuK1x0ICogSWYgYWN0aXZlIHdhcyBhbHJlYWR5IHplcm8sIHJldGFpbiB0aGUgb2xkIHJlc2VydmVkIGVudHJ5LlxuK1x0ICovXG4rXHRjcHVtYXNrX3NldF9jcHUoY3B1LCBcdTAwMjZ0bGJfZmx1c2hfcGVuZGluZyk7XG4gXG4tXHQvKiBSZXF1ZXN0IEctc3RhZ2UgcGFnZSB0YWJsZSB1cGRhdGUgZm9yIGFsbCBWQ1BVcyAqL1xuLVx0a3ZtX2Zvcl9lYWNoX3ZjcHUoaSwgdiwgdmNwdS1cdTAwM2Vrdm0pXG4tXHRcdGt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9VUERBVEVfSEdBVFAsIHYpO1xuK1x0cmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoXHUwMDI2dm1pZF9sb2NrLCBmbGFncyk7XG4gfVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMTc6NTA6MjUuNjQxMDA1NTYzWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjAxNzc0NjkxNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiBQYXRjaCBBcHBsaWNhYmlsaXR5IGZvciBGdXp6aW5nKipcblxuT2theSwgbGV0J3Mgc2VlLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIHBhdGNoIHRvdWNoZXMgYW5kIHdoZXRoZXIgaXQncyByZWxldmFudCBmb3IgZnV6emluZyBvbiBvdXIgdGFyZ2V0IGFyY2hpdGVjdHVyZSwgd2hpY2ggaXMgYGFtZDY0YC4gSSBzZWUgdGhhdCB0aGUgcGF0Y2ggbW9kaWZpZXMgZmlsZXMgZXhjbHVzaXZlbHkgd2l0aGluIHRoZSBgYXJjaC9yaXNjdi9gIGRpcmVjdG9yeS4gU3BlY2lmaWNhbGx5LCBpdCBpbnZvbHZlcyBjaGFuZ2VzIHRvIGBrdm1fZ3N0YWdlLmhgLCBga3ZtX3ZtaWQuaGAsIGBtYWluLmNgLCBgbW11LmNgLCBgdGxiLmNgLCBgdmNwdS5jYCwgYHZjcHVfc2JpX3JlcGxhY2UuY2AsIGB2Y3B1X3NiaV92MDEuY2AsIGFuZCBgdm1pZC5jYCDigJMgYWxsIFJJU0MtViBLVk0gaW1wbGVtZW50YXRpb24gZGV0YWlscy5cblxuTm93LCBJIHJlY2FsbCB0aGUgcnVsZXMuIFdlIG9ubHkgKmRvbid0KiBmdXp6IGlmIHRoZSBjaGFuZ2VzIGZhbGwgaW50byBjZXJ0YWluIGNhdGVnb3JpZXMuIFRoZSByZWxldmFudCBydWxlIGhlcmUgaXMgYWJvdXQgdW5yZWFjaGFibGUgY29kZSBwYXRocywgc3BlY2lmaWNhbGx5IGNvZGUgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiBvdXIgdGFyZ2V0LiBBbmQgdGhhdCdzIHByZWNpc2VseSB3aGF0IHdlIGhhdmUuIFRoZXNlIFJJU0MtViBzcGVjaWZpYyBmaWxlcyBhcmUgZGVmaW5pdGVseSBub3QgZ29pbmcgdG8gYmUgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gYGFtZDY0YC4gVGhleSdyZSBjb21wbGV0ZWx5IGlzb2xhdGVkIHRvIHRoZSBSSVNDLVYgYXJjaGl0ZWN0dXJlLiBJJ20gZ29pbmcgdG8gZG91YmxlLWNoZWNrIHRoYXQgYnkgbGlzdGluZyBhbGwgdGhlIGZpbGVzOlxuXG4xLiAgYGFyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oYFxuMi4gIGBhcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmhgXG4zLiAgYGFyY2gvcmlzY3Yva3ZtL21haW4uY2BcbjQuICBgYXJjaC9yaXNjdi9rdm0vbW11LmNgXG41LiAgYGFyY2gvcmlzY3Yva3ZtL3RsYi5jYFxuNi4gIGBhcmNoL3Jpc2N2L2t2bS92Y3B1LmNgXG43LiAgYGFyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY2BcbjguICBgYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfdjAxLmNgXG45LiAgYGFyY2gvcmlzY3Yva3ZtL3ZtaWQuY2BcblxuWWVzLCBhbGwgbmluZSBmaWxlcyBhcmUgdW5kZW5pYWJseSB3aXRoaW4gYGFyY2gvcmlzY3YvYC4gT24gYGFtZDY0YCwgdGhlc2UgZmlsZXMgd2lsbCByZW1haW4gdW50b3VjaGVkLCBub3QgYnVpbHQsIGFuZCBjb21wbGV0ZWx5IHVucmVhY2hhYmxlLlxuXG5UaGVyZWZvcmUsIHRoZSB2ZXJkaWN0IGlzIGNsZWFyLiBUaGlzIHBhdGNoIGlzIGlycmVsZXZhbnQgZm9yIGZ1enppbmcgb24gYGFtZDY0YC4gYFdvcnRoRnV6emluZ2AgaXMgYGZhbHNlYC4gVGhlcmUgYXJlIG5vIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIHRvIGVuYWJsZSwgbm9yIGFueSBzcGVjaWZpYyBzeW1ib2xzIHRoYXQgYXJlIHVzZWZ1bCwgc28gYEVuYWJsZUNvbmZpZ3NgIGFuZCBgRm9jdXNTeW1ib2xzYCBhcmUgZW1wdHkuIFRoZSByZWFzb25pbmcgaXMgc29saWQ6IHRoZSBjaGFuZ2VzIGFyZSBSSVNDLVYgc3BlY2lmaWMsIGFuZCB0aGF0J3Mgbm90IG91ciB0YXJnZXQuXG5cbkknbSBjb21mb3J0YWJsZSB3aXRoIHRoaXMuIEl0J3MgYSBzdHJhaWdodGZvcndhcmQgY2FzZS4gTGV0J3MgZG8gYSBxdWljayBmaW5hbCBjaGVjay4uLiB5ZXAsIGV2ZXJ5dGhpbmcgbG9va3MgZ29vZC4gTm93LCBsZXQncyBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExODIxLCJPdXRwdXRUb2tlbnMiOjgzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjQ5LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMTc6NTA6MzEuNjU4NzU1NDk3WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjkzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW10sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIkFsbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBzdHJpY3RseSBjb25maW5lZCB0byB0aGUgUklTQy1WIGFyY2hpdGVjdHVyZSAoYXJjaC9yaXNjdi8pLCBzcGVjaWZpY2FsbHkgdGhlIFJJU0MtViBLVk0gU3RhZ2UtMiBWTUlEIG1hbmFnZW1lbnQuIFRoZXkgY2Fubm90IGJlIGJ1aWx0IG9yIGV4ZWN1dGVkIG9uIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIChhbWQ2NCkuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIkFsbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBzdHJpY3RseSBjb25maW5lZCB0byB0aGUgUklTQy1WIGFyY2hpdGVjdHVyZSAoYXJjaC9yaXNjdi8pLCBzcGVjaWZpY2FsbHkgdGhlIFJJU0MtViBLVk0gU3RhZ2UtMiBWTUlEIG1hbmFnZW1lbnQuIFRoZXkgY2Fubm90IGJlIGJ1aWx0IG9yIGV4ZWN1dGVkIG9uIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIChhbWQ2NCkuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQxNzo1MDozMS42NTg3NzYwNDdaIiwiU2VxIjo1LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjM3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },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-workflowdxljz[1] Phase: Running StartedAt: 2026-09-10 17:50:42 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxljz[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-09-10 17:50:42 +0000 UTC FinishedAt: 2026-09-10 17:50:46 +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,}