Name: series-workflowb677l Phase: Failed StartedAt: 2026-09-11 02:58:26 +0000 UTC FinishedAt: 2026-09-11 03:00:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb677l[0] Phase: Succeeded StartedAt: 2026-09-11 02:58:26 +0000 UTC FinishedAt: 2026-09-11 03:00:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb677l[0].run-triage Phase: Succeeded StartedAt: 2026-09-11 02:58:26 +0000 UTC FinishedAt: 2026-09-11 03:00:27 +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+CgkJCTx0ZD4yMDI2LzA5LzExIDAzOjAwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgY2hhbmdlcyBhcmUgc3RyaWN0bHkgbGltaXRlZCB0byB1c2VyLXNwYWNlIHV0aWxpdGllcyAoYnBmdG9vbCB1bmRlciB0b29scy9icGYvYnBmdG9vbC8pIGFuZCBzZWxmdGVzdHMgKHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi8pLiBObyBrZXJuZWwtc3BhY2UgY29kZSBvciBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgvbW9kdWxlcykgaXMgbW9kaWZpZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDAzOjAwPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZDNhZTNkOWUzNTVlYjg2MGRiNmRhN2VmMzNlMTQ3NTlmNmI2NThjN1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgU2VwIDExIDAzOjAwOjAxIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0IGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLmU0ZWQ3ZTcwMWM5ZTQgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbkBAIC0xMjAsNyAmIzQzOzEyMCw4IEBAIGJwZnRvb2wgbWFwIHBpbiAgICAgKk1BUCogICpGSUxFKlxuICAgICBjaGFyYWN0ZXIgKCYjMzk7LiYjMzk7KSwgd2hpY2ggaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHRlbnNpb25zIG9mICpicGZmcyouXG4gXG4gYnBmdG9vbCBtYXAgZXZlbnRfcGlwZSAqTUFQKiBbY3B1ICpOKiBpbmRleCAqTSpdXG4tICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogbWFwLlxuJiM0MzsgICAgUmVhZCBldmVudHMgZnJvbSBhICoqQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkqKiBvclxuJiM0MzsgICAgKipCUEZfTUFQX1RZUEVfUklOR0JVRioqIG1hcC5cbiBcbiAgICAgSW5zdGFsbCBwZXJmIHJpbmdzIGludG8gYSBwZXJmIGV2ZW50IGFycmF5IG1hcCBhbmQgZHVtcCBvdXRwdXQgb2YgYW55XG4gICAgICoqYnBmX3BlcmZfZXZlbnRfb3V0cHV0KipcXCAoKSBjYWxsIGluIHRoZSBrZXJuZWwuIEJ5IGRlZmF1bHQgcmVhZCB0aGVcbkBAIC0xMzQsNiAmIzQzOzEzNSwxNyBAQCBicGZ0b29sIG1hcCBldmVudF9waXBlICpNQVAqIFtjcHUgKk4qIGluZGV4ICpNKl1cbiAgICAgZXhpc3RpbmcgcmluZy4gIEFueSBvdGhlciBhcHBsaWNhdGlvbiB3aWxsIHN0b3AgcmVjZWl2aW5nIGV2ZW50cyBpZiBpdFxuICAgICBpbnN0YWxsZWQgaXRzIHJpbmdzIGVhcmxpZXIuXG4gXG4mIzQzOyAgICBGb3IgYSByaW5nIGJ1ZmZlciBtYXAsIGNvbnN1bWUgcmVjb3JkcyBzdWJtaXR0ZWQgYnkgQlBGIHByb2dyYW1zLCBpbmNsdWRpbmdcbiYjNDM7ICAgIHJlY29yZHMgYWxyZWFkeSBxdWV1ZWQgYmVmb3JlIHRoZSBjb21tYW5kIHN0YXJ0cy4gKipjcHUqKiBhbmQgKippbmRleCoqXG4mIzQzOyAgICBhcmUgbm90IHN1cHBvcnRlZC4gRWFjaCByZWNvcmQgaXMgcHJpbnRlZCBpbiBmdWxsLCBpbmNsdWRpbmcgZW1iZWRkZWQgemVyb1xuJiM0MzsgICAgYnl0ZXMuIFBsYWluIG91dHB1dCByZXBvcnRzIHRoZSByZWNvcmQgc2l6ZSBmb2xsb3dlZCBieSBoZXhhZGVjaW1hbFxuJiM0MzsgICAgYnl0ZXM7IEpTT04gb3V0cHV0IGNvbnRhaW5zICoqc2l6ZSoqIGFuZCAqKmRhdGEqKiBmaWVsZHMsIHdpdGggKipkYXRhKiogYW5cbiYjNDM7ICAgIGFycmF5IG9mIGJ5dGUgdmFsdWVzLiBSaW5nIGJ1ZmZlciByZWNvcmRzIGhhdmUgbm8gaW1wbGljaXQgQ1BVIG9yIHRpbWVzdGFtcC5cbiYjNDM7XG4mIzQzOyAgICBDb25zdW1pbmcgYSByaW5nIGJ1ZmZlciBhZHZhbmNlcyBpdHMgc2hhcmVkIGNvbnN1bWVyIHBvc2l0aW9uLCBzbyB0aGlzXG4mIzQzOyAgICBjb21tYW5kIG11c3Qgbm90IHJ1biBhbG9uZ3NpZGUgYW5vdGhlciBjb25zdW1lciBvZiB0aGUgc2FtZSBtYXAuXG4mIzQzOyAgICAqKkJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYqKiBtYXBzIGFyZSBub3Qgc3VwcG9ydGVkLlxuJiM0MztcbiBicGZ0b29sIG1hcCBwZWVrICAqTUFQKlxuICAgICBQZWVrIG5leHQgdmFsdWUgaW4gdGhlIHF1ZXVlIG9yIHN0YWNrLlxuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbmluZGV4IDc1Y2JjYjUxMmViYWUuLjE3NTBiNDg4YzllM2IgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbkBAIC04NzgsMTEgJiM0Mzs4NzgsMTEgQEAgX2JwZnRvb2woKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7O1xuICAgICAgICAgICAgICAgICAgICAgICAgIGlkKVxuLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX2lkc19mb3JfdHlwZSBwZXJmX2V2ZW50X2FycmF5XG4mIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX2lkc19mb3JfdHlwZSAmIzM5O1wmIzM0O3R5cGVcJiMzNDs6IFwmIzM0O1xcKHBlcmZfZXZlbnRfYXJyYXlcXHxyaW5nYnVmXFwpXCYjMzQ7JiMzOTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOztcbiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKVxuLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX25hbWVzX2Zvcl90eXBlIHBlcmZfZXZlbnRfYXJyYXlcbiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfbmFtZXNfZm9yX3R5cGUgJiMzOTtcJiMzNDt0eXBlXCYjMzQ7OiBcJiMzNDtcXChwZXJmX2V2ZW50X2FycmF5XFx8cmluZ2J1ZlxcKVwmIzM0OyYjMzk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgY3B1KVxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xuaW5kZXggYmNiNzY3ZTJkNjczMy4uN2Q1NTUzMzFmNDQzYSAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jXG5AQCAtMjcsNyAmIzQzOzI3LDcgQEBcbiBcbiAjZGVmaW5lIE1NQVBfUEFHRV9DTlRcdDE2XG4gXG4tc3RhdGljIHZvbGF0aWxlIGJvb2wgc3RvcDtcbiYjNDM7c3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBzdG9wO1xuIFxuIHN0cnVjdCBwZXJmX2V2ZW50X3NhbXBsZSB7XG4gXHRzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgaGVhZGVyO1xuQEAgLTQ0LDcgJiM0Mzs0NCw2IEBAIHN0cnVjdCBwZXJmX2V2ZW50X2xvc3Qge1xuIFxuIHN0YXRpYyB2b2lkIGludF9leGl0KGludCBzaWdubylcbiB7XG4tXHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7U3RvcHBpbmcuLi5cXG5cJiMzNDspO1xuIFx0c3RvcCA9IHRydWU7XG4gfVxuIFxuQEAgLTEwNyw2ICYjNDM7MTA2LDI3IEBAIHByaW50X2JwZl9vdXRwdXQodm9pZCAqcHJpdmF0ZV9kYXRhLCBpbnQgY3B1LCBzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgKmV2ZW50KVxuIFx0cmV0dXJuIExJQkJQRl9QRVJGX0VWRU5UX0NPTlQ7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW50IHByaW50X3JpbmdidWZfb3V0cHV0KHZvaWQgKmN0eCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpXG4mIzQzO3tcbiYjNDM7XHRpZiAoanNvbl9vdXRwdXQpIHtcbiYjNDM7XHRcdGpzb253X3N0YXJ0X29iamVjdChqc29uX3d0cik7XG4mIzQzO1x0XHRqc29ud191aW50X2ZpZWxkKGpzb25fd3RyLCBcJiMzNDtzaXplXCYjMzQ7LCBzaXplKTtcbiYjNDM7XHRcdGpzb253X25hbWUoanNvbl93dHIsIFwmIzM0O2RhdGFcJiMzNDspO1xuJiM0MztcdFx0cHJpbnRfZGF0YV9qc29uKGRhdGEsIHNpemUpO1xuJiM0MztcdFx0anNvbndfZW5kX29iamVjdChqc29uX3d0cik7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdHByaW50ZihcJiMzNDs9PSBzaXplOiAlenUgPT09PT1cXG5cJiMzNDssIHNpemUpO1xuJiM0MztcdFx0ZnByaW50X2hleChzdGRvdXQsIGRhdGEsIHNpemUsIFwmIzM0OyBcJiMzNDspO1xuJiM0MztcdFx0cHJpbnRmKFwmIzM0O1xcblwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZmZsdXNoKHN0ZG91dCkpXG4mIzQzO1x0XHRyZXR1cm4gZXJybm8gPyAtZXJybm8gOiAtRUlPO1xuJiM0MztcbiYjNDM7XHQvKiBBIHByb2R1Y2VyIGNhbiBrZWVwIHBvbGwoKSBidXN5IGV2ZW4gYWZ0ZXIgYSBzaWduYWwgYXJyaXZlcy4gKi9cbiYjNDM7XHRyZXR1cm4gc3RvcCA/IC1FSU5UUiA6IDA7XG4mIzQzO31cbiYjNDM7XG4gaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIHtcbiBcdHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgcGVyZl9hdHRyID0ge1xuQEAgLTEyMywxOCAmIzQzOzE0MywyNiBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdC5jcHUgPSAtMSxcbiBcdFx0LmlkeCA9IC0xLFxuIFx0fTtcbi1cdHN0cnVjdCBwZXJmX2J1ZmZlciAqcGI7XG4mIzQzO1x0c3RydWN0IHBlcmZfYnVmZmVyICpwYiA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IHJpbmdfYnVmZmVyICpyYiA9IE5VTEw7XG4gXHRfX3UzMiBtYXBfaW5mb19sZW47XG4gXHRpbnQgZXJyLCBtYXBfZmQ7XG4gXG4mIzQzO1x0c3RvcCA9IGZhbHNlO1xuIFx0bWFwX2luZm9fbGVuID0gc2l6ZW9mKG1hcF9pbmZvKTtcbiBcdG1hcF9mZCA9IG1hcF9wYXJzZV9mZF9hbmRfaW5mbyhcdTAwMjZhcmdjLCBcdTAwMjZhcmd2LCBcdTAwMjZtYXBfaW5mbywgXHUwMDI2bWFwX2luZm9fbGVuLFxuIFx0XHRcdFx0ICAgICAgIDApO1xuIFx0aWYgKG1hcF9mZCBcdTAwM2MgMClcbiBcdFx0cmV0dXJuIC0xO1xuIFxuLVx0aWYgKG1hcF9pbmZvLnR5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkpIHtcbi1cdFx0cF9lcnIoXCYjMzQ7bWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXlcJiMzNDspO1xuJiM0MztcdGlmIChtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9SSU5HQlVGKSB7XG4mIzQzO1x0XHRwX2VycihcJiMzNDttYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheSBvciByaW5nIGJ1ZmZlclwmIzM0Oyk7XG4mIzQzO1x0XHRnb3RvIGVycl9jbG9zZV9tYXA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAobWFwX2luZm8udHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRiBcdTAwMjZcdTAwMjYgYXJnYykge1xuJiM0MztcdFx0cF9lcnIoXCYjMzQ7cmluZyBidWZmZXIgbWFwcyBkbyBub3Qgc3VwcG9ydCBjcHUgb3IgaW5kZXggYXJndW1lbnRzXCYjMzQ7KTtcbiBcdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuIFx0fVxuIFxuQEAgLTE4NCwxNSAmIzQzOzIxMiwyNCBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdGN0eC5pZHggPSAwO1xuIFx0fVxuIFxuLVx0b3B0cy5jcHVfY250ID0gY3R4LmFsbF9jcHVzID8gMCA6IDE7XG4tXHRvcHRzLmNwdXMgPSBcdTAwMjZjdHguY3B1O1xuLVx0b3B0cy5tYXBfa2V5cyA9IFx1MDAyNmN0eC5pZHg7XG4tXHRwYiA9IHBlcmZfYnVmZmVyX19uZXdfcmF3KG1hcF9mZCwgTU1BUF9QQUdFX0NOVCwgXHUwMDI2cGVyZl9hdHRyLFxuLVx0XHRcdFx0ICBwcmludF9icGZfb3V0cHV0LCBcdTAwMjZjdHgsIFx1MDAyNm9wdHMpO1xuLVx0aWYgKCFwYikge1xuLVx0XHRwX2VycihcJiMzNDtmYWlsZWQgdG8gY3JlYXRlIHBlcmYgYnVmZmVyOiAlcyAoJWQpXCYjMzQ7LFxuLVx0XHQgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTtcbi1cdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuJiM0MztcdGlmIChtYXBfaW5mby50eXBlID09IEJQRl9NQVBfVFlQRV9SSU5HQlVGKSB7XG4mIzQzO1x0XHRyYiA9IHJpbmdfYnVmZmVyX19uZXcobWFwX2ZkLCBwcmludF9yaW5nYnVmX291dHB1dCwgTlVMTCwgTlVMTCk7XG4mIzQzO1x0XHRpZiAoIXJiKSB7XG4mIzQzO1x0XHRcdHBfZXJyKFwmIzM0O2ZhaWxlZCB0byBjcmVhdGUgcmluZyBidWZmZXI6ICVzICglZClcJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xuJiM0MztcdFx0XHRnb3RvIGVycl9jbG9zZV9tYXA7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdG9wdHMuY3B1X2NudCA9IGN0eC5hbGxfY3B1cyA/IDAgOiAxO1xuJiM0MztcdFx0b3B0cy5jcHVzID0gXHUwMDI2Y3R4LmNwdTtcbiYjNDM7XHRcdG9wdHMubWFwX2tleXMgPSBcdTAwMjZjdHguaWR4O1xuJiM0MztcdFx0cGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsIFx1MDAyNnBlcmZfYXR0cixcbiYjNDM7XHRcdFx0XHRcdCAgcHJpbnRfYnBmX291dHB1dCwgXHUwMDI2Y3R4LCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRcdGlmICghcGIpIHtcbiYjNDM7XHRcdFx0cF9lcnIoXCYjMzQ7ZmFpbGVkIHRvIGNyZWF0ZSBwZXJmIGJ1ZmZlcjogJXMgKCVkKVwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XG4mIzQzO1x0XHRcdGdvdG8gZXJyX2Nsb3NlX21hcDtcbiYjNDM7XHRcdH1cbiBcdH1cbiBcbiBcdHNpZ25hbChTSUdJTlQsIGludF9leGl0KTtcbkBAIC0yMDIsMjUgJiM0MzsyMzksMzMgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0aWYgKGpzb25fb3V0cHV0KVxuIFx0XHRqc29ud19zdGFydF9hcnJheShqc29uX3d0cik7XG4gXG4mIzQzO1x0ZXJyID0gMDtcbiBcdHdoaWxlICghc3RvcCkge1xuLVx0XHRlcnIgPSBwZXJmX2J1ZmZlcl9fcG9sbChwYiwgMjAwKTtcbiYjNDM7XHRcdGVyciA9IHJiID8gcmluZ19idWZmZXJfX3BvbGwocmIsIDIwMCkgOiBwZXJmX2J1ZmZlcl9fcG9sbChwYiwgMjAwKTtcbiBcdFx0aWYgKGVyciBcdTAwM2MgMCBcdTAwMjZcdTAwMjYgZXJyICE9IC1FSU5UUikge1xuLVx0XHRcdHBfZXJyKFwmIzM0O3BlcmYgYnVmZmVyIHBvbGxpbmcgZmFpbGVkOiAlcyAoJWQpXCYjMzQ7LFxuLVx0XHRcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xuLVx0XHRcdGdvdG8gZXJyX2Nsb3NlX3BiO1xuJiM0MztcdFx0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7RXJyb3I6ICVzIGJ1ZmZlciBwb2xsaW5nIGZhaWxlZDogJXMgKCVkKVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRyYiA/IFwmIzM0O3JpbmdcJiMzNDsgOiBcJiMzNDtwZXJmXCYjMzQ7LCBzdHJlcnJvcigtZXJyKSwgLWVycik7XG4mIzQzO1x0XHRcdGJyZWFrO1xuIFx0XHR9XG4mIzQzO1x0XHRlcnIgPSAwO1xuIFx0fVxuIFxuJiM0MztcdGlmIChzdG9wKVxuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0O1N0b3BwaW5nLi4uXFxuXCYjMzQ7KTtcbiBcdGlmIChqc29uX291dHB1dClcbiBcdFx0anNvbndfZW5kX2FycmF5KGpzb25fd3RyKTtcbiYjNDM7XHRpZiAoZmZsdXNoKHN0ZG91dCkpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtFcnJvcjogZmFpbGVkIHRvIHdyaXRlIGV2ZW50czogJXNcXG5cJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1x0XHRlcnIgPSAtMTtcbiYjNDM7XHR9XG4gXG4mIzQzO1x0cmluZ19idWZmZXJfX2ZyZWUocmIpO1xuIFx0cGVyZl9idWZmZXJfX2ZyZWUocGIpO1xuJiM0MztcdC8qIEJvdGggYnVmZmVyIG1hbmFnZXJzIGJvcnJvdyBtYXBfZmQuICovXG4gXHRjbG9zZShtYXBfZmQpO1xuIFxuLVx0cmV0dXJuIDA7XG4mIzQzO1x0cmV0dXJuIGVyciBcdTAwM2MgMCA/IC0xIDogMDtcbiBcbi1lcnJfY2xvc2VfcGI6XG4tXHRwZXJmX2J1ZmZlcl9fZnJlZShwYik7XG4gZXJyX2Nsb3NlX21hcDpcbiBcdGNsb3NlKG1hcF9mZCk7XG4gXHRyZXR1cm4gLTE7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjFhNGFlODhjMDVhMDdcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jXG5AQCAtMCwwICYjNDM7MSw0MjUgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7I2luY2x1ZGUgXHUwMDNjY3R5cGUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3BvbGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JwZnRvb2xfcmluZ2J1Zi5za2VsLmhcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgV0FJVF9TVEVQUyA1MDBcbiYjNDM7I2RlZmluZSBXQUlUX1VTIDEwMDAwXG4mIzQzO1xuJiM0MztzdHJ1Y3QgY29uc3VtZXIge1xuJiM0MztcdHBpZF90IHBpZDtcbiYjNDM7XHRpbnQgZmQ7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqYnBmdG9vbF9wYXRoKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBjaGFyICpwYXRoID0gZ2V0ZW52KFwmIzM0O0JQRlRPT0xcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRpZiAocGF0aClcbiYjNDM7XHRcdHJldHVybiBhY2Nlc3MocGF0aCwgWF9PSykgPyBOVUxMIDogcGF0aDtcbiYjNDM7XHRpZiAoIWFjY2VzcyhcJiMzNDsuL3Rvb2xzL3NiaW4vYnBmdG9vbFwmIzM0OywgWF9PSykpXG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7Li90b29scy9zYmluL2JwZnRvb2xcJiMzNDs7XG4mIzQzO1x0aWYgKCFhY2Nlc3MoXCYjMzQ7Li4vdG9vbHMvc2Jpbi9icGZ0b29sXCYjMzQ7LCBYX09LKSlcbiYjNDM7XHRcdHJldHVybiBcJiMzNDsuLi90b29scy9zYmluL2JwZnRvb2xcJiMzNDs7XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNvbnN1bWVyX2NsZWFudXAoc3RydWN0IGNvbnN1bWVyICpjaGlsZClcbiYjNDM7e1xuJiM0MztcdGlmIChjaGlsZC1cdTAwM2VwaWQgXHUwMDNlIDApIHtcbiYjNDM7XHRcdGtpbGwoY2hpbGQtXHUwMDNlcGlkLCBTSUdLSUxMKTtcbiYjNDM7XHRcdHdoaWxlICh3YWl0cGlkKGNoaWxkLVx1MDAzZXBpZCwgTlVMTCwgMCkgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vID09IEVJTlRSKVxuJiM0MztcdFx0XHQ7XG4mIzQzO1x0XHRjaGlsZC1cdTAwM2VwaWQgPSAtMTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKGNoaWxkLVx1MDAzZWZkIFx1MDAzZT0gMCkge1xuJiM0MztcdFx0Y2xvc2UoY2hpbGQtXHUwMDNlZmQpO1xuJiM0MztcdFx0Y2hpbGQtXHUwMDNlZmQgPSAtMTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGNvbnN1bWVyX3N0YXJ0KHN0cnVjdCBjb25zdW1lciAqY2hpbGQsIGludCBtYXBfZmQsIGNvbnN0IGNoYXIgKmZvcm1hdCxcbiYjNDM7XHRcdFx0ICAgY29uc3QgY2hhciAqcGluX3BhdGgsIGNvbnN0IGNoYXIgKm9wdGlvbixcbiYjNDM7XHRcdFx0ICAgYm9vbCBwYWlyLCBib29sIGNhcHR1cmVfZXJyb3JzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307XG4mIzQzO1x0X191MzIgbGVuID0gc2l6ZW9mKGluZm8pO1xuJiM0MztcdGNvbnN0IGNoYXIgKnBhdGggPSBicGZ0b29sX3BhdGgoKTtcbiYjNDM7XHRjaGFyICphcmd2WzEyXSwgaWRbMTZdO1xuJiM0MztcdGludCBvdXRbMl0sIHJlYWR5WzJdLCBuID0gMCwgZXJyLCBlcnJfZmQ7XG4mIzQzO1x0c3RydWN0IHBvbGxmZCBwZmQ7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihwYXRoLCBcJiMzNDticGZ0b29sIHBhdGggKHNldCBCUEZUT09MIHRvIG92ZXJyaWRlKVwmIzM0OykgfHxcbiYjNDM7XHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKG1hcF9mZCwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSwgXCYjMzQ7bWFwIGluZm9cJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdHNucHJpbnRmKGlkLCBzaXplb2YoaWQpLCBcJiMzNDsldVwmIzM0OywgaW5mby5pZCk7XG4mIzQzO1x0YXJndltuJiM0MzsmIzQzO10gPSAoY2hhciAqKXBhdGg7XG4mIzQzO1x0aWYgKGZvcm1hdClcbiYjNDM7XHRcdGFyZ3ZbbiYjNDM7JiM0MztdID0gKGNoYXIgKilmb3JtYXQ7XG4mIzQzO1x0YXJndltuJiM0MzsmIzQzO10gPSBcJiMzNDttYXBcJiMzNDs7XG4mIzQzO1x0YXJndltuJiM0MzsmIzQzO10gPSBcJiMzNDtldmVudF9waXBlXCYjMzQ7O1xuJiM0MztcdGFyZ3ZbbiYjNDM7JiM0MztdID0gcGluX3BhdGggPyBcJiMzNDtwaW5uZWRcJiMzNDsgOiBcJiMzNDtpZFwmIzM0OztcbiYjNDM7XHRhcmd2W24mIzQzOyYjNDM7XSA9IHBpbl9wYXRoID8gKGNoYXIgKilwaW5fcGF0aCA6IGlkO1xuJiM0MztcdGlmIChvcHRpb24pIHtcbiYjNDM7XHRcdGFyZ3ZbbiYjNDM7JiM0MztdID0gKGNoYXIgKilvcHRpb247XG4mIzQzO1x0XHRhcmd2W24mIzQzOyYjNDM7XSA9IFwmIzM0OzBcJiMzNDs7XG4mIzQzO1x0XHRpZiAocGFpcikge1xuJiM0MztcdFx0XHRhcmd2W24mIzQzOyYjNDM7XSA9IFwmIzM0O2luZGV4XCYjMzQ7O1xuJiM0MztcdFx0XHRhcmd2W24mIzQzOyYjNDM7XSA9IFwmIzM0OzBcJiMzNDs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdGFyZ3Zbbl0gPSBOVUxMO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHBpcGUyKG91dCwgT19DTE9FWEVDKSwgXCYjMzQ7b3V0cHV0IHBpcGVcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHBpcGUyKHJlYWR5LCBPX0NMT0VYRUMpLCBcJiMzNDtleGVjIHBpcGVcJiMzNDspKSB7XG4mIzQzO1x0XHRjbG9zZShvdXRbMF0pO1xuJiM0MztcdFx0Y2xvc2Uob3V0WzFdKTtcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1x0Y2hpbGQtXHUwMDNlcGlkID0gZm9yaygpO1xuJiM0MztcdGlmICghY2hpbGQtXHUwMDNlcGlkKSB7XG4mIzQzO1x0XHRjbG9zZShvdXRbMF0pO1xuJiM0MztcdFx0Y2xvc2UocmVhZHlbMF0pO1xuJiM0MztcdFx0ZXJyX2ZkID0gY2FwdHVyZV9lcnJvcnMgPyBvdXRbMV0gOiBvcGVuKFwmIzM0Oy9kZXYvbnVsbFwmIzM0OywgT19XUk9OTFkpO1xuJiM0MztcdFx0aWYgKGR1cDIob3V0WzFdLCBTVERPVVRfRklMRU5PKSBcdTAwM2MgMCB8fFxuJiM0MztcdFx0ICAgIGR1cDIoZXJyX2ZkLCBTVERFUlJfRklMRU5PKSBcdTAwM2MgMClcbiYjNDM7XHRcdFx0Z290byBleGVjX2ZhaWw7XG4mIzQzO1x0XHRpZiAoIWNhcHR1cmVfZXJyb3JzKVxuJiM0MztcdFx0XHRjbG9zZShlcnJfZmQpO1xuJiM0MztcdFx0Y2xvc2Uob3V0WzFdKTtcbiYjNDM7XHRcdGV4ZWN2KHBhdGgsIGFyZ3YpO1xuJiM0MztleGVjX2ZhaWw6XG4mIzQzO1x0XHRlcnIgPSBlcnJubztcbiYjNDM7XHRcdHdyaXRlKHJlYWR5WzFdLCBcdTAwMjZlcnIsIHNpemVvZihlcnIpKTtcbiYjNDM7XHRcdF9leGl0KDEyNyk7XG4mIzQzO1x0fVxuJiM0MztcdGNsb3NlKG91dFsxXSk7XG4mIzQzO1x0Y2xvc2UocmVhZHlbMV0pO1xuJiM0MztcdGNoaWxkLVx1MDAzZWZkID0gb3V0WzBdO1xuJiM0MztcdHBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IHJlYWR5WzBdLCAuZXZlbnRzID0gUE9MTElOIH07XG4mIzQzO1x0LyogRU9GIG9uIHRoZSBjbG9zZS1vbi1leGVjIHBpcGUgZGlzdGluZ3Vpc2hlcyBleGVjIGZyb20gaW5oZXJpdGVkIGhhbmRsZXJzLiAqL1xuJiM0MztcdGVyciA9IGNoaWxkLVx1MDAzZXBpZCBcdTAwM2UgMCA/IHBvbGwoXHUwMDI2cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApIDogLTE7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QoY2hpbGQtXHUwMDNlcGlkLCAwLCBcJiMzNDtmb3JrXCYjMzQ7KSB8fFxuJiM0MztcdCAgICAhQVNTRVJUX0dUKGVyciwgMCwgXCYjMzQ7ZXhlYyB0aW1lb3V0XCYjMzQ7KSB8fFxuJiM0MztcdCAgICAhQVNTRVJUX0VRKHJlYWQocmVhZHlbMF0sIFx1MDAyNmVyciwgc2l6ZW9mKGVycikpLCAwLCBcJiMzNDtleGVjXCYjMzQ7KSkge1xuJiM0MztcdFx0Y2xvc2UocmVhZHlbMF0pO1xuJiM0MztcdFx0Y29uc3VtZXJfY2xlYW51cChjaGlsZCk7XG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcdGNsb3NlKHJlYWR5WzBdKTtcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgY29uc3VtZXJfZmluaXNoKHN0cnVjdCBjb25zdW1lciAqY2hpbGQsIGludCBzaWdubywgYm9vbCBzdWNjZXNzLFxuJiM0MztcdFx0XHQgICAgY2hhciAqb3V0cHV0LCBzaXplX3Qgc2l6ZSlcbiYjNDM7e1xuJiM0MztcdGludCBzdGF0dXMgPSAwLCBpO1xuJiM0MztcdHBpZF90IHJldCA9IDA7XG4mIzQzO1x0c3NpemVfdCBuO1xuJiM0MztcdHNpemVfdCB1c2VkID0gMDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZmNudGwoY2hpbGQtXHUwMDNlZmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spLCBcJiMzNDtub25ibG9ja2luZyBvdXRwdXRcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdGlmIChzaWdubyBcdTAwMjZcdTAwMjYgIUFTU0VSVF9PSyhraWxsKGNoaWxkLVx1MDAzZXBpZCwgc2lnbm8pLCBcJiMzNDtzaWduYWwgY29uc3VtZXJcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFdBSVRfU1RFUFM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHR3aGlsZSAodXNlZCBcdTAwM2Mgc2l6ZSAtIDEgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgICAgKG4gPSByZWFkKGNoaWxkLVx1MDAzZWZkLCBvdXRwdXQgJiM0MzsgdXNlZCwgc2l6ZSAtIDEgLSB1c2VkKSkgXHUwMDNlIDApXG4mIzQzO1x0XHRcdHVzZWQgJiM0Mzs9IG47XG4mIzQzO1x0XHRyZXQgPSB3YWl0cGlkKGNoaWxkLVx1MDAzZXBpZCwgXHUwMDI2c3RhdHVzLCBXTk9IQU5HKTtcbiYjNDM7XHRcdGlmIChyZXQgPT0gY2hpbGQtXHUwMDNlcGlkKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGlmIChyZXQgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vICE9IEVJTlRSKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdHVzbGVlcChXQUlUX1VTKTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEocmV0LCBjaGlsZC1cdTAwM2VwaWQsIFwmIzM0O2JvdW5kZWQgY29uc3VtZXIgZXhpdFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0Y2hpbGQtXHUwMDNlcGlkID0gLTE7XG4mIzQzO1x0d2hpbGUgKHVzZWQgXHUwMDNjIHNpemUgLSAxIFx1MDAyNlx1MDAyNiAobiA9IHJlYWQoY2hpbGQtXHUwMDNlZmQsIG91dHB1dCAmIzQzOyB1c2VkLCBzaXplIC0gMSAtIHVzZWQpKSBcdTAwM2UgMClcbiYjNDM7XHRcdHVzZWQgJiM0Mzs9IG47XG4mIzQzO1x0b3V0cHV0W3VzZWRdID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRyZXR1cm4gQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwmIzM0O25vcm1hbCBleGl0XCYjMzQ7KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgICAgQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cykgPT0gMCwgc3VjY2VzcywgXCYjMzQ7ZXhpdCBzdGF0dXNcJiMzNDspO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBjb25zdW1lcl9yZWFkeShzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBsb25nIGNhdWdodDtcbiYjNDM7XHRjaGFyIHBhdGhbNjRdLCBsaW5lWzI1Nl07XG4mIzQzO1x0aW50IGk7XG4mIzQzO1x0RklMRSAqZjtcbiYjNDM7XG4mIzQzO1x0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBcJiMzNDsvcHJvYy8lZC9zdGF0dXNcJiMzNDssIGNoaWxkLVx1MDAzZXBpZCk7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgV0FJVF9TVEVQUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGYgPSBmb3BlbihwYXRoLCBcJiMzNDtyXCYjMzQ7KTtcbiYjNDM7XHRcdGlmICghZilcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmKSkge1xuJiM0MztcdFx0XHRpZiAoc3NjYW5mKGxpbmUsIFwmIzM0O1NpZ0NndDogJWxseFwmIzM0OywgXHUwMDI2Y2F1Z2h0KSA9PSAxIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0XHQgICAgKGNhdWdodCBcdTAwMjYgKDFVTEwgXHUwMDNjXHUwMDNjIChTSUdJTlQgLSAxKSkpIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0XHQgICAgKGNhdWdodCBcdTAwMjYgKDFVTEwgXHUwMDNjXHUwMDNjIChTSUdURVJNIC0gMSkpKSkge1xuJiM0MztcdFx0XHRcdGZjbG9zZShmKTtcbiYjNDM7XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fVxuJiM0MztcdFx0ZmNsb3NlKGYpO1xuJiM0MztcdFx0dXNsZWVwKFdBSVRfVVMpO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gQVNTRVJUX1RSVUUoZmFsc2UsIFwmIzM0O2NvbnN1bWVyIHNpZ25hbCBoYW5kbGVycyByZWFkeVwmIzM0Oyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGVtaXRfcmVjb3JkKHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWwsIGludCByZWNvcmQpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIHBhY2tldFs2NF0gPSB7fTtcbiYjNDM7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMsXG4mIzQzO1x0XHQgICAgLmRhdGFfaW4gPSBwYWNrZXQsXG4mIzQzO1x0XHQgICAgLmRhdGFfc2l6ZV9pbiA9IHNpemVvZihwYWNrZXQpLFxuJiM0MztcdCk7XG4mIzQzO1xuJiM0MztcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY29yZCA9IHJlY29yZDtcbiYjNDM7XHRyZXR1cm4gQVNTRVJUX09LKGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMoYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MucHJvZHVjZSksXG4mIzQzO1x0XHRcdFx0XHQgICAgICBcdTAwMjZvcHRzKSwgXCYjMzQ7cHJvZHVjZSByZWNvcmRcJiMzNDspIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAgICBBU1NFUlRfT0soc2tlbC1cdTAwM2Vic3MtXHUwMDNlb3V0cHV0X2VyciwgXCYjMzQ7cmluZ2J1ZiBvdXRwdXRcJiMzNDspO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBjb25zdW1lZCh1bnNpZ25lZCBsb25nICpwb3NpdGlvbiwgdW5zaWduZWQgbG9uZyBleHBlY3RlZClcbiYjNDM7e1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBXQUlUX1NURVBTOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKF9fYXRvbWljX2xvYWRfbihwb3NpdGlvbiwgX19BVE9NSUNfQUNRVUlSRSkgPT0gZXhwZWN0ZWQpXG4mIzQzO1x0XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdFx0dXNsZWVwKFdBSVRfVVMpO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gQVNTRVJUX0VRKCpwb3NpdGlvbiwgZXhwZWN0ZWQsIFwmIzM0O2NvbnN1bWVyIHBvc2l0aW9uXCYjMzQ7KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfanNvbihjaGFyICpvdXRwdXQsIGNvbnN0IGNoYXIgKmV4cGVjdGVkKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciAqc3JjID0gb3V0cHV0LCAqZHN0ID0gb3V0cHV0O1xuJiM0MztcdGJvb2wgcXVvdGVkID0gZmFsc2UsIGVzY2FwZWQgPSBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0LyogSWdub3JlIGZvcm1hdHRpbmcgd2hpdGVzcGFjZSB3aGlsZSBjaGVja2luZyB0aGUgZW50aXJlIEpTT04gZG9jdW1lbnQuICovXG4mIzQzO1x0d2hpbGUgKCpzcmMpIHtcbiYjNDM7XHRcdGlmIChxdW90ZWQgfHwgIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnNyYykpXG4mIzQzO1x0XHRcdCpkc3QmIzQzOyYjNDM7ID0gKnNyYztcbiYjNDM7XHRcdGlmICghZXNjYXBlZCBcdTAwMjZcdTAwMjYgKnNyYyA9PSAmIzM5O1wmIzM0OyYjMzk7KVxuJiM0MztcdFx0XHRxdW90ZWQgPSAhcXVvdGVkO1xuJiM0MztcdFx0ZXNjYXBlZCA9ICFlc2NhcGVkIFx1MDAyNlx1MDAyNiBxdW90ZWQgXHUwMDI2XHUwMDI2ICpzcmMgPT0gJiMzOTtcXFxcJiMzOTs7XG4mIzQzO1x0XHRzcmMmIzQzOyYjNDM7O1xuJiM0MztcdH1cbiYjNDM7XHQqZHN0ID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCYjMzQ7SlNPTiByZWNvcmRzXCYjMzQ7KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9jb25zdW1lcihjb25zdCBjaGFyICpmb3JtYXQsIGJvb2wgaWRsZSwgaW50IHNpZ25vLCBib29sIHBpbm5lZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9O1xuJiM0MztcdHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWw7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyAqcG9zaXRpb24gPSBNQVBfRkFJTEVEO1xuJiM0MztcdGludCBwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpLCBmZDtcbiYjNDM7XHRjaGFyIHBpbl9kaXJbXSA9IFwmIzM0Oy9zeXMvZnMvYnBmL2JwZnRvb2xfcmluZ2J1Zl9YWFhYWFhcJiMzNDs7XG4mIzQzO1x0Y2hhciBwaW5fcGF0aFtzaXplb2YocGluX2RpcikgJiM0Mzsgc2l6ZW9mKFwmIzM0Oy9tYXBcJiMzNDspXTtcbiYjNDM7XHRib29sIGRpcl9jcmVhdGVkID0gZmFsc2UsIG1hcF9waW5uZWQgPSBmYWxzZTtcbiYjNDM7XHRjaGFyIG91dHB1dFs0MDk2XTtcbiYjNDM7XHRzdHJ1Y3QgcG9sbGZkIHBmZDtcbiYjNDM7XG4mIzQzO1x0c2tlbCA9IGJwZnRvb2xfcmluZ2J1Zl9fb3BlbigpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcJiMzNDtvcGVuXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cdTAwM2VtYXBzLnJpbmdidWYsIHBhZ2Vfc2l6ZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soYnBmdG9vbF9yaW5nYnVmX19sb2FkKHNrZWwpLCBcJiMzNDtsb2FkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZkID0gYnBmX21hcF9fZmQoc2tlbC1cdTAwM2VtYXBzLnJpbmdidWYpO1xuJiM0MztcdGlmIChwaW5uZWQpIHtcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LX1BUUihta2R0ZW1wKHBpbl9kaXIpLCBcJiMzNDtjcmVhdGUgcGluIGRpcmVjdG9yeVwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0ZGlyX2NyZWF0ZWQgPSB0cnVlO1xuJiM0MztcdFx0c25wcmludGYocGluX3BhdGgsIHNpemVvZihwaW5fcGF0aCksIFwmIzM0OyVzL21hcFwmIzM0OywgcGluX2Rpcik7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfb2JqX3BpbihmZCwgcGluX3BhdGgpLCBcJiMzNDtwaW4gcmluZ2J1ZlwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0bWFwX3Bpbm5lZCA9IHRydWU7XG4mIzQzO1x0fVxuJiM0MztcdHBvc2l0aW9uID0gbW1hcChOVUxMLCBwYWdlX3NpemUsIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgZmQsIDApO1xuJiM0MztcdGlmICghQVNTRVJUX05FUShwb3NpdGlvbiwgTUFQX0ZBSUxFRCwgXCYjMzQ7Y29uc3VtZXIgbW1hcFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIWlkbGUgXHUwMDI2XHUwMDI2ICghZW1pdF9yZWNvcmQoc2tlbCwgMCkgfHwgIWVtaXRfcmVjb3JkKHNrZWwsIDEpKSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICghY29uc3VtZXJfc3RhcnQoXHUwMDI2Y2hpbGQsIGZkLCBmb3JtYXQsIHBpbm5lZCA/IHBpbl9wYXRoIDogTlVMTCxcbiYjNDM7XHRcdFx0ICAgIE5VTEwsIGZhbHNlLCBmYWxzZSkgfHxcbiYjNDM7XHQgICAgIWNvbnN1bWVyX3JlYWR5KFx1MDAyNmNoaWxkKSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICghaWRsZSkge1xuJiM0MztcdFx0LyogQm90aCBwcmVmaWxsZWQgcmVjb3JkcyBvY2N1cHkgMTYgYnl0ZXMgaW5jbHVkaW5nIHRoZWlyIGhlYWRlcnMuICovXG4mIzQzO1x0XHRpZiAoIWNvbnN1bWVkKHBvc2l0aW9uLCAzMikpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0cGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gY2hpbGQuZmQsIC5ldmVudHMgPSBQT0xMSU4gfTtcbiYjNDM7XHRcdGlmICghQVNTRVJUX0dUKHBvbGwoXHUwMDI2cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApLCAwLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cmVjb3JkcyBmbHVzaGVkIGJlZm9yZSBleGl0XCYjMzQ7KSB8fFxuJiM0MztcdFx0ICAgICFBU1NFUlRfVFJVRShwZmQucmV2ZW50cyBcdTAwMjYgUE9MTElOLCBcJiMzNDtyZWNvcmQgb3V0cHV0IHJlYWRhYmxlXCYjMzQ7KSB8fFxuJiM0MztcdFx0ICAgICFlbWl0X3JlY29yZChza2VsLCAyKSB8fCAhY29uc3VtZWQocG9zaXRpb24sIDY0KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcdGlmICghY29uc3VtZXJfZmluaXNoKFx1MDAyNmNoaWxkLCBzaWdubywgdHJ1ZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoZm9ybWF0IFx1MDAyNlx1MDAyNiAhc3RyY21wKGZvcm1hdCwgXCYjMzQ7LXBcJiMzNDspKVxuJiM0MztcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgaWRsZSA/IFwmIzM0O1tdXFxuXCYjMzQ7IDpcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDtbe1xcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0OyAgICAgICAgXFxcJiMzNDtzaXplXFxcJiMzNDs6IDIsXFxuXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7ICAgICAgICBcXFwmIzM0O2RhdGFcXFwmIzM0OzogWzAsMjU1XFxuXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7ICAgICAgICBdXFxuXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7ICAgIH0se1xcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0OyAgICAgICAgXFxcJiMzNDtzaXplXFxcJiMzNDs6IDUsXFxuXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7ICAgICAgICBcXFwmIzM0O2RhdGFcXFwmIzM0OzogWzEsMiwzLDQsNVxcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0OyAgICAgICAgXVxcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0OyAgICB9LHtcXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDsgICAgICAgIFxcXCYjMzQ7c2l6ZVxcXCYjMzQ7OiAxNyxcXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDsgICAgICAgIFxcXCYjMzQ7ZGF0YVxcXCYjMzQ7OiBbMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzJcXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDsgICAgICAgIF1cXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDsgICAgfVxcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0O11cXG5cJiMzNDssIFwmIzM0O3ByZXR0eSBKU09OIHJlY29yZHNcJiMzNDspO1xuJiM0MztcdGVsc2UgaWYgKGZvcm1hdClcbiYjNDM7XHRcdGNoZWNrX2pzb24ob3V0cHV0LCBpZGxlID8gXCYjMzQ7W11cJiMzNDsgOlxuJiM0MztcdFx0XHQgICBcJiMzNDtbe1xcXCYjMzQ7c2l6ZVxcXCYjMzQ7OjIsXFxcJiMzNDtkYXRhXFxcJiMzNDs6WzAsMjU1XX0sXCYjMzQ7XG4mIzQzO1x0XHRcdCAgIFwmIzM0O3tcXFwmIzM0O3NpemVcXFwmIzM0Ozo1LFxcXCYjMzQ7ZGF0YVxcXCYjMzQ7OlsxLDIsMyw0LDVdfSxcJiMzNDtcbiYjNDM7XHRcdFx0ICAgXCYjMzQ7e1xcXCYjMzQ7c2l6ZVxcXCYjMzQ7OjE3LFxcXCYjMzQ7ZGF0YVxcXCYjMzQ7OlsxNiwxNywxOCwxOSwyMCwyMSwyMiwyMyxcJiMzNDtcbiYjNDM7XHRcdFx0ICAgXCYjMzQ7MjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzJdfV1cJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGlkbGUgPyBcJiMzNDtcJiMzNDsgOlxuJiM0MztcdFx0XHQgICAgIFwmIzM0Oz09IHNpemU6IDIgPT09PT1cXG4wMCBmZlxcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0Oz09IHNpemU6IDUgPT09PT1cXG4wMSAwMiAwMyAwNCAwNVxcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0Oz09IHNpemU6IDE3ID09PT09XFxuMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgIFwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0OzE4IDE5IDFhIDFiIDFjIDFkIDFlIDFmXFxuMjBcXG5cJiMzNDssIFwmIzM0O3BsYWluIHJlY29yZHNcJiMzNDspO1xuJiM0MztvdXQ6XG4mIzQzO1x0Y29uc3VtZXJfY2xlYW51cChcdTAwMjZjaGlsZCk7XG4mIzQzO1x0aWYgKHBvc2l0aW9uICE9IE1BUF9GQUlMRUQpXG4mIzQzO1x0XHRtdW5tYXAocG9zaXRpb24sIHBhZ2Vfc2l6ZSk7XG4mIzQzO1x0aWYgKG1hcF9waW5uZWQpXG4mIzQzO1x0XHRBU1NFUlRfT0sodW5saW5rKHBpbl9wYXRoKSwgXCYjMzQ7dW5waW4gcmluZ2J1ZlwmIzM0Oyk7XG4mIzQzO1x0aWYgKGRpcl9jcmVhdGVkKVxuJiM0MztcdFx0QVNTRVJUX09LKHJtZGlyKHBpbl9kaXIpLCBcJiMzNDtyZW1vdmUgcGluIGRpcmVjdG9yeVwmIzM0Oyk7XG4mIzQzO1x0YnBmdG9vbF9yaW5nYnVmX19kZXN0cm95KHNrZWwpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3BlcmZfY29uc3VtZXIodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9O1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbG9uZyBzZWNvbmRzLCBuYW5vc2Vjb25kcztcbiYjNDM7XHRzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsO1xuJiM0MztcdGNoYXIgb3V0cHV0WzE2Mzg0XSwgZXhwZWN0ZWRbMTYzODRdO1xuJiM0MztcdGludCBucl9jcHVzLCBjcHUsIGluZGV4LCBvZmZzZXQgPSAwLCBpLCB1c2VkID0gMCwgZmllbGRzO1xuJiM0MztcdHN0cnVjdCBwb2xsZmQgcGZkO1xuJiM0MztcbiYjNDM7XHRucl9jcHVzID0gbGliYnBmX251bV9wb3NzaWJsZV9jcHVzKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QobnJfY3B1cywgMCwgXCYjMzQ7cG9zc2libGUgY3B1c1wmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0c2tlbCA9IGJwZnRvb2xfcmluZ2J1Zl9fb3BlbigpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcJiMzNDtvcGVuXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cdTAwM2VtYXBzLnJpbmdidWYsIGdldHBhZ2VzaXplKCkpO1xuJiM0MztcdGJwZl9tYXBfX3NldF9tYXhfZW50cmllcyhza2VsLVx1MDAzZW1hcHMucGVyZmJ1ZiwgbnJfY3B1cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soYnBmdG9vbF9yaW5nYnVmX19sb2FkKHNrZWwpLCBcJiMzNDtsb2FkXCYjMzQ7KSB8fFxuJiM0MztcdCAgICAhY29uc3VtZXJfc3RhcnQoXHUwMDI2Y2hpbGQsIGJwZl9tYXBfX2ZkKHNrZWwtXHUwMDNlbWFwcy5wZXJmYnVmKSwgTlVMTCxcbiYjNDM7XHRcdFx0ICAgIE5VTEwsIE5VTEwsIGZhbHNlLCBmYWxzZSkgfHwgIWNvbnN1bWVyX3JlYWR5KFx1MDAyNmNoaWxkKSB8fFxuJiM0MztcdCAgICAhZW1pdF9yZWNvcmQoc2tlbCwgMykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHQvKiBPbmUgbGFyZ2UgcmVjb3JkIGZsdXNoZXMgdGhlIGV4aXN0aW5nIGJ1ZmZlcmVkIHBlcmYgb3V0cHV0IGNhbGxiYWNrLiAqL1xuJiM0MztcdHBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IGNoaWxkLmZkLCAuZXZlbnRzID0gUE9MTElOIH07XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QocG9sbChcdTAwMjZwZmQsIDEsIFdBSVRfU1RFUFMgKiBXQUlUX1VTIC8gMTAwMCksIDAsXG4mIzQzO1x0XHQgICAgICAgXCYjMzQ7cGVyZiByZWNvcmQgb3V0cHV0XCYjMzQ7KSB8fFxuJiM0MztcdCAgICAhQVNTRVJUX1RSVUUocGZkLnJldmVudHMgXHUwMDI2IFBPTExJTiwgXCYjMzQ7cGVyZiBvdXRwdXQgcmVhZGFibGVcJiMzNDspIHx8XG4mIzQzO1x0ICAgICFjb25zdW1lcl9maW5pc2goXHUwMDI2Y2hpbGQsIFNJR0lOVCwgdHJ1ZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRmaWVsZHMgPSBzc2NhbmYob3V0cHV0LCBcJiMzNDs9PSBAJWxsdS4lbGx1IENQVTogJWQgaW5kZXg6ICVkID09PT09XFxuJW5cJiMzNDssXG4mIzQzO1x0XHRcdFx1MDAyNnNlY29uZHMsIFx1MDAyNm5hbm9zZWNvbmRzLCBcdTAwMjZjcHUsIFx1MDAyNmluZGV4LCBcdTAwMjZvZmZzZXQpO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKGZpZWxkcywgNCwgXCYjMzQ7cGVyZiBoZWFkZXJcJiMzNDspIHx8XG4mIzQzO1x0ICAgICFBU1NFUlRfR1Qob2Zmc2V0LCAwLCBcJiMzNDtwZXJmIHBheWxvYWQgb2Zmc2V0XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdEFTU0VSVF9HVChzZWNvbmRzICogMTAwMDAwMDAwMFVMTCAmIzQzOyBuYW5vc2Vjb25kcywgMCwgXCYjMzQ7cGVyZiB0aW1lc3RhbXBcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9MVChuYW5vc2Vjb25kcywgMTAwMDAwMDAwMFVMTCwgXCYjMzQ7cGVyZiB0aW1lc3RhbXAgbmFub3NlY29uZHNcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9HRShjcHUsIDAsIFwmIzM0O3BlcmYgY3B1XCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfTFQoY3B1LCBucl9jcHVzLCBcJiMzNDtwZXJmIGNwdSByYW5nZVwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0VRKGluZGV4LCBjcHUsIFwmIzM0O3BlcmYgaW5kZXhcJiMzNDspO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHNpemVvZihza2VsLVx1MDAzZXJvZGF0YS1cdTAwM2VwZXJmX3BheWxvYWQpOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0Y29uc3QgY2hhciAqc2VwYXJhdG9yID0gIWkgPyBcJiMzNDtcJiMzNDsgOiAhKGkgJSAxNikgPyBcJiMzNDtcXG5cJiMzNDsgOlxuJiM0MztcdFx0XHRcdFx0IShpICUgOCkgPyBcJiMzNDsgIFwmIzM0OyA6IFwmIzM0OyBcJiMzNDs7XG4mIzQzO1xuJiM0MztcdFx0dXNlZCAmIzQzOz0gc25wcmludGYoZXhwZWN0ZWQgJiM0MzsgdXNlZCwgc2l6ZW9mKGV4cGVjdGVkKSAtIHVzZWQsXG4mIzQzO1x0XHRcdFx0IFwmIzM0OyVzJTAyeFwmIzM0Oywgc2VwYXJhdG9yLCBpID09IDEgPyAweGZmIDogMCk7XG4mIzQzO1x0fVxuJiM0MztcdHNucHJpbnRmKGV4cGVjdGVkICYjNDM7IHVzZWQsIHNpemVvZihleHBlY3RlZCkgLSB1c2VkLCBcJiMzNDtcXG5cJiMzNDspO1xuJiM0MztcdEFTU0VSVF9TVFJFUShvdXRwdXQgJiM0Mzsgb2Zmc2V0LCBleHBlY3RlZCwgXCYjMzQ7cGVyZiBwYXlsb2FkXCYjMzQ7KTtcbiYjNDM7b3V0OlxuJiM0MztcdGNvbnN1bWVyX2NsZWFudXAoXHUwMDI2Y2hpbGQpO1xuJiM0MztcdGJwZnRvb2xfcmluZ2J1Zl9fZGVzdHJveShza2VsKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9yZWplY3QoZW51bSBicGZfbWFwX3R5cGUgdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uLCBib29sIHBhaXIsIGJvb2wganNvbilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9O1xuJiM0MztcdGJvb2wgcmluZyA9IHR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgfHwgdHlwZSA9PSBCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGO1xuJiM0MztcdGNvbnN0IGNoYXIgKmV4cGVjdGVkID0gb3B0aW9uID9cbiYjNDM7XHRcdFwmIzM0O3tcXFwmIzM0O2Vycm9yXFxcJiMzNDs6XFxcJiMzNDtyaW5nIGJ1ZmZlciBtYXBzIGRvIG5vdCBzdXBwb3J0IGNwdSBvciBpbmRleCBhcmd1bWVudHNcXFwmIzM0O31cJiMzNDsgOlxuJiM0MztcdFx0XCYjMzQ7e1xcXCYjMzQ7ZXJyb3JcXFwmIzM0OzpcXFwmIzM0O21hcCBpcyBub3QgYSBwZXJmIGV2ZW50IGFycmF5IG9yIHJpbmcgYnVmZmVyXFxcJiMzNDt9XCYjMzQ7O1xuJiM0MztcdGNoYXIgb3V0cHV0WzQwOTZdO1xuJiM0MztcdGludCBmZDtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBicGZfbWFwX2NyZWF0ZSh0eXBlLCBOVUxMLCByaW5nID8gMCA6IDQsIHJpbmcgPyAwIDogNCxcbiYjNDM7XHRcdFx0ICAgIHJpbmcgPyBnZXRwYWdlc2l6ZSgpIDogMSwgTlVMTCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwmIzM0O2NyZWF0ZSBtYXBcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGlmIChjb25zdW1lcl9zdGFydChcdTAwMjZjaGlsZCwgZmQsIGpzb24gPyBcJiMzNDstalwmIzM0OyA6IE5VTEwsIE5VTEwsIG9wdGlvbiwgcGFpciwgdHJ1ZSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIGNvbnN1bWVyX2ZpbmlzaChcdTAwMjZjaGlsZCwgMCwgZmFsc2UsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKSB7XG4mIzQzO1x0XHRpZiAoanNvbilcbiYjNDM7XHRcdFx0Y2hlY2tfanNvbihvdXRwdXQsIGV4cGVjdGVkKTtcbiYjNDM7XHRcdGVsc2VcbiYjNDM7XHRcdFx0QVNTRVJUX0dUKHN0cmxlbihvdXRwdXQpLCAwLCBcJiMzNDtlcnJvciBkaWFnbm9zdGljXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1x0Y29uc3VtZXJfY2xlYW51cChcdTAwMjZjaGlsZCk7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIHRlc3RfYnBmdG9vbF9yaW5nYnVmKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtwZXJmX2V2ZW50X2FycmF5XCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfcGVyZl9jb25zdW1lcigpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3BsYWluXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfY29uc3VtZXIoTlVMTCwgZmFsc2UsIFNJR0lOVCwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2pzb25cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9jb25zdW1lcihcJiMzNDstalwmIzM0OywgZmFsc2UsIFNJR1RFUk0sIGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtwcmV0dHlfanNvblwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2NvbnN1bWVyKFwmIzM0Oy1wXCYjMzQ7LCBmYWxzZSwgU0lHSU5ULCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cGlubmVkX3BsYWluXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfY29uc3VtZXIoTlVMTCwgZmFsc2UsIFNJR1RFUk0sIHRydWUpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3Bpbm5lZF9qc29uXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfY29uc3VtZXIoXCYjMzQ7LWpcJiMzNDssIGZhbHNlLCBTSUdJTlQsIHRydWUpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3Bpbm5lZF9wcmV0dHlfanNvblwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2NvbnN1bWVyKFwmIzM0Oy1wXCYjMzQ7LCBmYWxzZSwgU0lHVEVSTSwgdHJ1ZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7aWRsZV9zaWdpbnRcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9jb25zdW1lcihOVUxMLCB0cnVlLCBTSUdJTlQsIGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtpZGxlX3NpZ3Rlcm1fanNvblwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2NvbnN1bWVyKFwmIzM0Oy1qXCYjMzQ7LCB0cnVlLCBTSUdURVJNLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7aWRsZV9zaWdpbnRfcHJldHR5X2pzb25cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9jb25zdW1lcihcJiMzNDstcFwmIzM0OywgdHJ1ZSwgU0lHSU5ULCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmVqZWN0X2FycmF5XCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9BUlJBWSwgTlVMTCwgZmFsc2UsIGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtyZWplY3RfdXNlcl9yaW5nYnVmXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmVqZWN0X2NwdVwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXCYjMzQ7Y3B1XCYjMzQ7LCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3JlamVjdF9pbmRleFwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXCYjMzQ7aW5kZXhcJiMzNDssIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmVqZWN0X2NwdV9pbmRleFwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXCYjMzQ7Y3B1XCYjMzQ7LCB0cnVlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmVqZWN0X3VzZXJfcmluZ2J1Zl9qc29uXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCB0cnVlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtyZWplY3RfY3B1X2luZGV4X2pzb25cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFwmIzM0O2NwdVwmIzM0OywgdHJ1ZSwgdHJ1ZSk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5iYmJjOTNjMzBhODMzXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNcbkBAIC0wLDAgJiM0MzsxLDQ3IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4mIzQzO1xuJiM0MztzdHJ1Y3Qge1xuJiM0MztcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUklOR0JVRik7XG4mIzQzO30gcmluZ2J1ZiBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7c3RydWN0IHtcbiYjNDM7XHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkpO1xuJiM0MztcdF9fdWludChrZXlfc2l6ZSwgc2l6ZW9mKF9fdTMyKSk7XG4mIzQzO1x0X191aW50KHZhbHVlX3NpemUsIHNpemVvZihfX3UzMikpO1xuJiM0MztcdF9fdWludChtYXhfZW50cmllcywgMSk7XG4mIzQzO30gcGVyZmJ1ZiBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogSW5jbHVkZSB0aGUgdTMyIHJhdyBzaXplIGluIHBlcmYmIzM5O3MgOC1ieXRlIGFsaWdubWVudCB0byBhdm9pZCBwYWRkaW5nLlxuJiM0MzsgKiBLZWVwIHBsYWluIG91dHB1dCBsYXJnZSBlbm91Z2ggdG8gZmx1c2ggc3RkaW8gYmVmb3JlIHRoZSBjb25zdW1lciBleGl0cy5cbiYjNDM7ICovXG4mIzQzO2NvbnN0IHVuc2lnbmVkIGNoYXIgcGVyZl9wYXlsb2FkWzQwOTJdID0geyAweDAwLCAweGZmIH07XG4mIzQzO1xuJiM0MztpbnQgcmVjb3JkO1xuJiM0MztpbnQgb3V0cHV0X2VycjtcbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDtzb2NrZXRcJiMzNDspXG4mIzQzO2ludCBwcm9kdWNlKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYilcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGNoYXIgZmlyc3RbXSA9IHsgMHgwMCwgMHhmZiB9O1xuJiM0MztcdHVuc2lnbmVkIGNoYXIgc2Vjb25kW10gPSB7IDEsIDIsIDMsIDQsIDUgfTtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyIHRoaXJkW10gPSB7XG4mIzQzO1x0XHQweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LFxuJiM0MztcdFx0MHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCxcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRpZiAocmVjb3JkID09IDApXG4mIzQzO1x0XHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFx1MDAyNnJpbmdidWYsIGZpcnN0LCBzaXplb2YoZmlyc3QpLCAwKTtcbiYjNDM7XHRlbHNlIGlmIChyZWNvcmQgPT0gMSlcbiYjNDM7XHRcdG91dHB1dF9lcnIgPSBicGZfcmluZ2J1Zl9vdXRwdXQoXHUwMDI2cmluZ2J1Ziwgc2Vjb25kLCBzaXplb2Yoc2Vjb25kKSwgMCk7XG4mIzQzO1x0ZWxzZSBpZiAocmVjb3JkID09IDIpXG4mIzQzO1x0XHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFx1MDAyNnJpbmdidWYsIHRoaXJkLCBzaXplb2YodGhpcmQpLCAwKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRvdXRwdXRfZXJyID0gYnBmX3BlcmZfZXZlbnRfb3V0cHV0KHNrYiwgXHUwMDI2cGVyZmJ1ZiwgQlBGX0ZfQ1VSUkVOVF9DUFUsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICh2b2lkICopcGVyZl9wYXlsb2FkLCBzaXplb2YocGVyZl9wYXlsb2FkKSk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2NoYXIgTElDRU5TRVtdIFNFQyhcJiMzNDtsaWNlbnNlXCYjMzQ7KSA9IFwmIzM0O0dQTFwmIzM0OztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwMzowMDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBjaGFuZ2VzIGFyZSBzdHJpY3RseSBsaW1pdGVkIHRvIHVzZXItc3BhY2UgdXRpbGl0aWVzIChicGZ0b29sIHVuZGVyIHRvb2xzL2JwZi9icGZ0b29sLykgYW5kIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLykuIE5vIGtlcm5lbC1zcGFjZSBjb2RlIG9yIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eC9tb2R1bGVzKSBpcyBtb2RpZmllZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBkM2FlM2Q5ZTM1NWViODYwZGI2ZGE3ZWYzM2UxNDc1OWY2YjY1OGM3CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBTZXAgMTEgMDM6MDA6MDEgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdCBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0CmluZGV4IDVkYWYzZGU1Yzc0NDYuLmU0ZWQ3ZTcwMWM5ZTQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0CiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0CkBAIC0xMjAsNyAmIzQzOzEyMCw4IEBAIGJwZnRvb2wgbWFwIHBpbiAgICAgKk1BUCogICpGSUxFKgogICAgIGNoYXJhY3RlciAoJiMzOTsuJiMzOTspLCB3aGljaCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgb2YgKmJwZmZzKi4KIAogYnBmdG9vbCBtYXAgZXZlbnRfcGlwZSAqTUFQKiBbY3B1ICpOKiBpbmRleCAqTSpdCi0gICAgUmVhZCBldmVudHMgZnJvbSBhICoqQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkqKiBtYXAuCiYjNDM7ICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogb3IKJiM0MzsgICAgKipCUEZfTUFQX1RZUEVfUklOR0JVRioqIG1hcC4KIAogICAgIEluc3RhbGwgcGVyZiByaW5ncyBpbnRvIGEgcGVyZiBldmVudCBhcnJheSBtYXAgYW5kIGR1bXAgb3V0cHV0IG9mIGFueQogICAgICoqYnBmX3BlcmZfZXZlbnRfb3V0cHV0KipcICgpIGNhbGwgaW4gdGhlIGtlcm5lbC4gQnkgZGVmYXVsdCByZWFkIHRoZQpAQCAtMTM0LDYgJiM0MzsxMzUsMTcgQEAgYnBmdG9vbCBtYXAgZXZlbnRfcGlwZSAqTUFQKiBbY3B1ICpOKiBpbmRleCAqTSpdCiAgICAgZXhpc3RpbmcgcmluZy4gIEFueSBvdGhlciBhcHBsaWNhdGlvbiB3aWxsIHN0b3AgcmVjZWl2aW5nIGV2ZW50cyBpZiBpdAogICAgIGluc3RhbGxlZCBpdHMgcmluZ3MgZWFybGllci4KIAomIzQzOyAgICBGb3IgYSByaW5nIGJ1ZmZlciBtYXAsIGNvbnN1bWUgcmVjb3JkcyBzdWJtaXR0ZWQgYnkgQlBGIHByb2dyYW1zLCBpbmNsdWRpbmcKJiM0MzsgICAgcmVjb3JkcyBhbHJlYWR5IHF1ZXVlZCBiZWZvcmUgdGhlIGNvbW1hbmQgc3RhcnRzLiAqKmNwdSoqIGFuZCAqKmluZGV4KioKJiM0MzsgICAgYXJlIG5vdCBzdXBwb3J0ZWQuIEVhY2ggcmVjb3JkIGlzIHByaW50ZWQgaW4gZnVsbCwgaW5jbHVkaW5nIGVtYmVkZGVkIHplcm8KJiM0MzsgICAgYnl0ZXMuIFBsYWluIG91dHB1dCByZXBvcnRzIHRoZSByZWNvcmQgc2l6ZSBmb2xsb3dlZCBieSBoZXhhZGVjaW1hbAomIzQzOyAgICBieXRlczsgSlNPTiBvdXRwdXQgY29udGFpbnMgKipzaXplKiogYW5kICoqZGF0YSoqIGZpZWxkcywgd2l0aCAqKmRhdGEqKiBhbgomIzQzOyAgICBhcnJheSBvZiBieXRlIHZhbHVlcy4gUmluZyBidWZmZXIgcmVjb3JkcyBoYXZlIG5vIGltcGxpY2l0IENQVSBvciB0aW1lc3RhbXAuCiYjNDM7CiYjNDM7ICAgIENvbnN1bWluZyBhIHJpbmcgYnVmZmVyIGFkdmFuY2VzIGl0cyBzaGFyZWQgY29uc3VtZXIgcG9zaXRpb24sIHNvIHRoaXMKJiM0MzsgICAgY29tbWFuZCBtdXN0IG5vdCBydW4gYWxvbmdzaWRlIGFub3RoZXIgY29uc3VtZXIgb2YgdGhlIHNhbWUgbWFwLgomIzQzOyAgICAqKkJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYqKiBtYXBzIGFyZSBub3Qgc3VwcG9ydGVkLgomIzQzOwogYnBmdG9vbCBtYXAgcGVlayAgKk1BUCoKICAgICBQZWVrIG5leHQgdmFsdWUgaW4gdGhlIHF1ZXVlIG9yIHN0YWNrLgogCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sCmluZGV4IDc1Y2JjYjUxMmViYWUuLjE3NTBiNDg4YzllM2IgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sCkBAIC04NzgsMTEgJiM0Mzs4NzgsMTEgQEAgX2JwZnRvb2woKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgICAgICAgICAgICAgIGlkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfaWRzX2Zvcl90eXBlIHBlcmZfZXZlbnRfYXJyYXkKJiM0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9pZHNfZm9yX3R5cGUgJiMzOTsmIzM0O3R5cGUmIzM0OzogJiMzNDtcKHBlcmZfZXZlbnRfYXJyYXlcfHJpbmdidWZcKSYjMzQ7JiMzOTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfbmFtZXNfZm9yX3R5cGUgcGVyZl9ldmVudF9hcnJheQomIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX25hbWVzX2Zvcl90eXBlICYjMzk7JiMzNDt0eXBlJiMzNDs6ICYjMzQ7XChwZXJmX2V2ZW50X2FycmF5XHxyaW5nYnVmXCkmIzM0OyYjMzk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgICAgICAgICAgICAgICAgICAgY3B1KQpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jCmluZGV4IGJjYjc2N2UyZDY3MzMuLjdkNTU1MzMxZjQ0M2EgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMKQEAgLTI3LDcgJiM0MzsyNyw3IEBACiAKICNkZWZpbmUgTU1BUF9QQUdFX0NOVAkxNgogCi1zdGF0aWMgdm9sYXRpbGUgYm9vbCBzdG9wOwomIzQzO3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3Qgc3RvcDsKIAogc3RydWN0IHBlcmZfZXZlbnRfc2FtcGxlIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgaGVhZGVyOwpAQCAtNDQsNyAmIzQzOzQ0LDYgQEAgc3RydWN0IHBlcmZfZXZlbnRfbG9zdCB7CiAKIHN0YXRpYyB2b2lkIGludF9leGl0KGludCBzaWdubykKIHsKLQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtTdG9wcGluZy4uLlxuJiMzNDspOwogCXN0b3AgPSB0cnVlOwogfQogCkBAIC0xMDcsNiAmIzQzOzEwNiwyNyBAQCBwcmludF9icGZfb3V0cHV0KHZvaWQgKnByaXZhdGVfZGF0YSwgaW50IGNwdSwgc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyICpldmVudCkKIAlyZXR1cm4gTElCQlBGX1BFUkZfRVZFTlRfQ09OVDsKIH0KIAomIzQzO3N0YXRpYyBpbnQgcHJpbnRfcmluZ2J1Zl9vdXRwdXQodm9pZCAqY3R4LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkKJiM0Mzt7CiYjNDM7CWlmIChqc29uX291dHB1dCkgewomIzQzOwkJanNvbndfc3RhcnRfb2JqZWN0KGpzb25fd3RyKTsKJiM0MzsJCWpzb253X3VpbnRfZmllbGQoanNvbl93dHIsICYjMzQ7c2l6ZSYjMzQ7LCBzaXplKTsKJiM0MzsJCWpzb253X25hbWUoanNvbl93dHIsICYjMzQ7ZGF0YSYjMzQ7KTsKJiM0MzsJCXByaW50X2RhdGFfanNvbihkYXRhLCBzaXplKTsKJiM0MzsJCWpzb253X2VuZF9vYmplY3QoanNvbl93dHIpOwomIzQzOwl9IGVsc2UgewomIzQzOwkJcHJpbnRmKCYjMzQ7PT0gc2l6ZTogJXp1ID09PT09XG4mIzM0Oywgc2l6ZSk7CiYjNDM7CQlmcHJpbnRfaGV4KHN0ZG91dCwgZGF0YSwgc2l6ZSwgJiMzNDsgJiMzNDspOwomIzQzOwkJcHJpbnRmKCYjMzQ7XG4mIzM0Oyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGZmbHVzaChzdGRvdXQpKQomIzQzOwkJcmV0dXJuIGVycm5vID8gLWVycm5vIDogLUVJTzsKJiM0MzsKJiM0MzsJLyogQSBwcm9kdWNlciBjYW4ga2VlcCBwb2xsKCkgYnVzeSBldmVuIGFmdGVyIGEgc2lnbmFsIGFycml2ZXMuICovCiYjNDM7CXJldHVybiBzdG9wID8gLUVJTlRSIDogMDsKJiM0Mzt9CiYjNDM7CiBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7CiAJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBwZXJmX2F0dHIgPSB7CkBAIC0xMjMsMTggJiM0MzsxNDMsMjYgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCQkuY3B1ID0gLTEsCiAJCS5pZHggPSAtMSwKIAl9OwotCXN0cnVjdCBwZXJmX2J1ZmZlciAqcGI7CiYjNDM7CXN0cnVjdCBwZXJmX2J1ZmZlciAqcGIgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgcmluZ19idWZmZXIgKnJiID0gTlVMTDsKIAlfX3UzMiBtYXBfaW5mb19sZW47CiAJaW50IGVyciwgbWFwX2ZkOwogCiYjNDM7CXN0b3AgPSBmYWxzZTsKIAltYXBfaW5mb19sZW4gPSBzaXplb2YobWFwX2luZm8pOwogCW1hcF9mZCA9IG1hcF9wYXJzZV9mZF9hbmRfaW5mbygmYW1wO2FyZ2MsICZhbXA7YXJndiwgJmFtcDttYXBfaW5mbywgJmFtcDttYXBfaW5mb19sZW4sCiAJCQkJICAgICAgIDApOwogCWlmIChtYXBfZmQgJmx0OyAwKQogCQlyZXR1cm4gLTE7CiAKLQlpZiAobWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSkgewotCQlwX2VycigmIzM0O21hcCBpcyBub3QgYSBwZXJmIGV2ZW50IGFycmF5JiMzNDspOwomIzQzOwlpZiAobWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSAmYW1wOyZhbXA7CiYjNDM7CSAgICBtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9SSU5HQlVGKSB7CiYjNDM7CQlwX2VycigmIzM0O21hcCBpcyBub3QgYSBwZXJmIGV2ZW50IGFycmF5IG9yIHJpbmcgYnVmZmVyJiMzNDspOwomIzQzOwkJZ290byBlcnJfY2xvc2VfbWFwOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChtYXBfaW5mby50eXBlID09IEJQRl9NQVBfVFlQRV9SSU5HQlVGICZhbXA7JmFtcDsgYXJnYykgewomIzQzOwkJcF9lcnIoJiMzNDtyaW5nIGJ1ZmZlciBtYXBzIGRvIG5vdCBzdXBwb3J0IGNwdSBvciBpbmRleCBhcmd1bWVudHMmIzM0Oyk7CiAJCWdvdG8gZXJyX2Nsb3NlX21hcDsKIAl9CiAKQEAgLTE4NCwxNSAmIzQzOzIxMiwyNCBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCWN0eC5pZHggPSAwOwogCX0KIAotCW9wdHMuY3B1X2NudCA9IGN0eC5hbGxfY3B1cyA/IDAgOiAxOwotCW9wdHMuY3B1cyA9ICZhbXA7Y3R4LmNwdTsKLQlvcHRzLm1hcF9rZXlzID0gJmFtcDtjdHguaWR4OwotCXBiID0gcGVyZl9idWZmZXJfX25ld19yYXcobWFwX2ZkLCBNTUFQX1BBR0VfQ05ULCAmYW1wO3BlcmZfYXR0ciwKLQkJCQkgIHByaW50X2JwZl9vdXRwdXQsICZhbXA7Y3R4LCAmYW1wO29wdHMpOwotCWlmICghcGIpIHsKLQkJcF9lcnIoJiMzNDtmYWlsZWQgdG8gY3JlYXRlIHBlcmYgYnVmZmVyOiAlcyAoJWQpJiMzNDssCi0JCSAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pOwotCQlnb3RvIGVycl9jbG9zZV9tYXA7CiYjNDM7CWlmIChtYXBfaW5mby50eXBlID09IEJQRl9NQVBfVFlQRV9SSU5HQlVGKSB7CiYjNDM7CQlyYiA9IHJpbmdfYnVmZmVyX19uZXcobWFwX2ZkLCBwcmludF9yaW5nYnVmX291dHB1dCwgTlVMTCwgTlVMTCk7CiYjNDM7CQlpZiAoIXJiKSB7CiYjNDM7CQkJcF9lcnIoJiMzNDtmYWlsZWQgdG8gY3JlYXRlIHJpbmcgYnVmZmVyOiAlcyAoJWQpJiMzNDssCiYjNDM7CQkJICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7CiYjNDM7CQkJZ290byBlcnJfY2xvc2VfbWFwOwomIzQzOwkJfQomIzQzOwl9IGVsc2UgewomIzQzOwkJb3B0cy5jcHVfY250ID0gY3R4LmFsbF9jcHVzID8gMCA6IDE7CiYjNDM7CQlvcHRzLmNwdXMgPSAmYW1wO2N0eC5jcHU7CiYjNDM7CQlvcHRzLm1hcF9rZXlzID0gJmFtcDtjdHguaWR4OwomIzQzOwkJcGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsICZhbXA7cGVyZl9hdHRyLAomIzQzOwkJCQkJICBwcmludF9icGZfb3V0cHV0LCAmYW1wO2N0eCwgJmFtcDtvcHRzKTsKJiM0MzsJCWlmICghcGIpIHsKJiM0MzsJCQlwX2VycigmIzM0O2ZhaWxlZCB0byBjcmVhdGUgcGVyZiBidWZmZXI6ICVzICglZCkmIzM0OywKJiM0MzsJCQkgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTsKJiM0MzsJCQlnb3RvIGVycl9jbG9zZV9tYXA7CiYjNDM7CQl9CiAJfQogCiAJc2lnbmFsKFNJR0lOVCwgaW50X2V4aXQpOwpAQCAtMjAyLDI1ICYjNDM7MjM5LDMzIEBAIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIAlpZiAoanNvbl9vdXRwdXQpCiAJCWpzb253X3N0YXJ0X2FycmF5KGpzb25fd3RyKTsKIAomIzQzOwllcnIgPSAwOwogCXdoaWxlICghc3RvcCkgewotCQllcnIgPSBwZXJmX2J1ZmZlcl9fcG9sbChwYiwgMjAwKTsKJiM0MzsJCWVyciA9IHJiID8gcmluZ19idWZmZXJfX3BvbGwocmIsIDIwMCkgOiBwZXJmX2J1ZmZlcl9fcG9sbChwYiwgMjAwKTsKIAkJaWYgKGVyciAmbHQ7IDAgJmFtcDsmYW1wOyBlcnIgIT0gLUVJTlRSKSB7Ci0JCQlwX2VycigmIzM0O3BlcmYgYnVmZmVyIHBvbGxpbmcgZmFpbGVkOiAlcyAoJWQpJiMzNDssCi0JCQkgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTsKLQkJCWdvdG8gZXJyX2Nsb3NlX3BiOwomIzQzOwkJCWZwcmludGYoc3RkZXJyLCAmIzM0O0Vycm9yOiAlcyBidWZmZXIgcG9sbGluZyBmYWlsZWQ6ICVzICglZClcbiYjMzQ7LAomIzQzOwkJCQlyYiA/ICYjMzQ7cmluZyYjMzQ7IDogJiMzNDtwZXJmJiMzNDssIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKJiM0MzsJCQlicmVhazsKIAkJfQomIzQzOwkJZXJyID0gMDsKIAl9CiAKJiM0MzsJaWYgKHN0b3ApCiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtTdG9wcGluZy4uLlxuJiMzNDspOwogCWlmIChqc29uX291dHB1dCkKIAkJanNvbndfZW5kX2FycmF5KGpzb25fd3RyKTsKJiM0MzsJaWYgKGZmbHVzaChzdGRvdXQpKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtFcnJvcjogZmFpbGVkIHRvIHdyaXRlIGV2ZW50czogJXNcbiYjMzQ7LCBzdHJlcnJvcihlcnJubykpOwomIzQzOwkJZXJyID0gLTE7CiYjNDM7CX0KIAomIzQzOwlyaW5nX2J1ZmZlcl9fZnJlZShyYik7CiAJcGVyZl9idWZmZXJfX2ZyZWUocGIpOwomIzQzOwkvKiBCb3RoIGJ1ZmZlciBtYW5hZ2VycyBib3Jyb3cgbWFwX2ZkLiAqLwogCWNsb3NlKG1hcF9mZCk7CiAKLQlyZXR1cm4gMDsKJiM0MzsJcmV0dXJuIGVyciAmbHQ7IDAgPyAtMSA6IDA7CiAKLWVycl9jbG9zZV9wYjoKLQlwZXJmX2J1ZmZlcl9fZnJlZShwYik7CiBlcnJfY2xvc2VfbWFwOgogCWNsb3NlKG1hcF9mZCk7CiAJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4xYTRhZTg4YzA1YTA3Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmMKQEAgLTAsMCAmIzQzOzEsNDI1IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsjaW5jbHVkZSAmbHQ7Y3R5cGUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7cG9sbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzaWduYWwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL21tYW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dGVzdF9wcm9ncy5oJmd0OwomIzQzOyNpbmNsdWRlICYjMzQ7YnBmdG9vbF9yaW5nYnVmLnNrZWwuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBXQUlUX1NURVBTIDUwMAomIzQzOyNkZWZpbmUgV0FJVF9VUyAxMDAwMAomIzQzOwomIzQzO3N0cnVjdCBjb25zdW1lciB7CiYjNDM7CXBpZF90IHBpZDsKJiM0MzsJaW50IGZkOwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKmJwZnRvb2xfcGF0aCh2b2lkKQomIzQzO3sKJiM0MzsJY29uc3QgY2hhciAqcGF0aCA9IGdldGVudigmIzM0O0JQRlRPT0wmIzM0Oyk7CiYjNDM7CiYjNDM7CWlmIChwYXRoKQomIzQzOwkJcmV0dXJuIGFjY2VzcyhwYXRoLCBYX09LKSA/IE5VTEwgOiBwYXRoOwomIzQzOwlpZiAoIWFjY2VzcygmIzM0Oy4vdG9vbHMvc2Jpbi9icGZ0b29sJiMzNDssIFhfT0spKQomIzQzOwkJcmV0dXJuICYjMzQ7Li90b29scy9zYmluL2JwZnRvb2wmIzM0OzsKJiM0MzsJaWYgKCFhY2Nlc3MoJiMzNDsuLi90b29scy9zYmluL2JwZnRvb2wmIzM0OywgWF9PSykpCiYjNDM7CQlyZXR1cm4gJiMzNDsuLi90b29scy9zYmluL2JwZnRvb2wmIzM0OzsKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNvbnN1bWVyX2NsZWFudXAoc3RydWN0IGNvbnN1bWVyICpjaGlsZCkKJiM0Mzt7CiYjNDM7CWlmIChjaGlsZC0mZ3Q7cGlkICZndDsgMCkgewomIzQzOwkJa2lsbChjaGlsZC0mZ3Q7cGlkLCBTSUdLSUxMKTsKJiM0MzsJCXdoaWxlICh3YWl0cGlkKGNoaWxkLSZndDtwaWQsIE5VTEwsIDApICZsdDsgMCAmYW1wOyZhbXA7IGVycm5vID09IEVJTlRSKQomIzQzOwkJCTsKJiM0MzsJCWNoaWxkLSZndDtwaWQgPSAtMTsKJiM0MzsJfQomIzQzOwlpZiAoY2hpbGQtJmd0O2ZkICZndDs9IDApIHsKJiM0MzsJCWNsb3NlKGNoaWxkLSZndDtmZCk7CiYjNDM7CQljaGlsZC0mZ3Q7ZmQgPSAtMTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBjb25zdW1lcl9zdGFydChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkLCBpbnQgbWFwX2ZkLCBjb25zdCBjaGFyICpmb3JtYXQsCiYjNDM7CQkJICAgY29uc3QgY2hhciAqcGluX3BhdGgsIGNvbnN0IGNoYXIgKm9wdGlvbiwKJiM0MzsJCQkgICBib29sIHBhaXIsIGJvb2wgY2FwdHVyZV9lcnJvcnMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTsKJiM0MzsJX191MzIgbGVuID0gc2l6ZW9mKGluZm8pOwomIzQzOwljb25zdCBjaGFyICpwYXRoID0gYnBmdG9vbF9wYXRoKCk7CiYjNDM7CWNoYXIgKmFyZ3ZbMTJdLCBpZFsxNl07CiYjNDM7CWludCBvdXRbMl0sIHJlYWR5WzJdLCBuID0gMCwgZXJyLCBlcnJfZmQ7CiYjNDM7CXN0cnVjdCBwb2xsZmQgcGZkOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIocGF0aCwgJiMzNDticGZ0b29sIHBhdGggKHNldCBCUEZUT09MIHRvIG92ZXJyaWRlKSYjMzQ7KSB8fAomIzQzOwkgICAgIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKG1hcF9mZCwgJmFtcDtpbmZvLCAmYW1wO2xlbiksICYjMzQ7bWFwIGluZm8mIzM0OykpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CXNucHJpbnRmKGlkLCBzaXplb2YoaWQpLCAmIzM0OyV1JiMzNDssIGluZm8uaWQpOwomIzQzOwlhcmd2W24mIzQzOyYjNDM7XSA9IChjaGFyICopcGF0aDsKJiM0MzsJaWYgKGZvcm1hdCkKJiM0MzsJCWFyZ3ZbbiYjNDM7JiM0MztdID0gKGNoYXIgKilmb3JtYXQ7CiYjNDM7CWFyZ3ZbbiYjNDM7JiM0MztdID0gJiMzNDttYXAmIzM0OzsKJiM0MzsJYXJndltuJiM0MzsmIzQzO10gPSAmIzM0O2V2ZW50X3BpcGUmIzM0OzsKJiM0MzsJYXJndltuJiM0MzsmIzQzO10gPSBwaW5fcGF0aCA/ICYjMzQ7cGlubmVkJiMzNDsgOiAmIzM0O2lkJiMzNDs7CiYjNDM7CWFyZ3ZbbiYjNDM7JiM0MztdID0gcGluX3BhdGggPyAoY2hhciAqKXBpbl9wYXRoIDogaWQ7CiYjNDM7CWlmIChvcHRpb24pIHsKJiM0MzsJCWFyZ3ZbbiYjNDM7JiM0MztdID0gKGNoYXIgKilvcHRpb247CiYjNDM7CQlhcmd2W24mIzQzOyYjNDM7XSA9ICYjMzQ7MCYjMzQ7OwomIzQzOwkJaWYgKHBhaXIpIHsKJiM0MzsJCQlhcmd2W24mIzQzOyYjNDM7XSA9ICYjMzQ7aW5kZXgmIzM0OzsKJiM0MzsJCQlhcmd2W24mIzQzOyYjNDM7XSA9ICYjMzQ7MCYjMzQ7OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CWFyZ3Zbbl0gPSBOVUxMOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhwaXBlMihvdXQsIE9fQ0xPRVhFQyksICYjMzQ7b3V0cHV0IHBpcGUmIzM0OykpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CWlmICghQVNTRVJUX09LKHBpcGUyKHJlYWR5LCBPX0NMT0VYRUMpLCAmIzM0O2V4ZWMgcGlwZSYjMzQ7KSkgewomIzQzOwkJY2xvc2Uob3V0WzBdKTsKJiM0MzsJCWNsb3NlKG91dFsxXSk7CiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CX0KJiM0MzsJY2hpbGQtJmd0O3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFjaGlsZC0mZ3Q7cGlkKSB7CiYjNDM7CQljbG9zZShvdXRbMF0pOwomIzQzOwkJY2xvc2UocmVhZHlbMF0pOwomIzQzOwkJZXJyX2ZkID0gY2FwdHVyZV9lcnJvcnMgPyBvdXRbMV0gOiBvcGVuKCYjMzQ7L2Rldi9udWxsJiMzNDssIE9fV1JPTkxZKTsKJiM0MzsJCWlmIChkdXAyKG91dFsxXSwgU1RET1VUX0ZJTEVOTykgJmx0OyAwIHx8CiYjNDM7CQkgICAgZHVwMihlcnJfZmQsIFNUREVSUl9GSUxFTk8pICZsdDsgMCkKJiM0MzsJCQlnb3RvIGV4ZWNfZmFpbDsKJiM0MzsJCWlmICghY2FwdHVyZV9lcnJvcnMpCiYjNDM7CQkJY2xvc2UoZXJyX2ZkKTsKJiM0MzsJCWNsb3NlKG91dFsxXSk7CiYjNDM7CQlleGVjdihwYXRoLCBhcmd2KTsKJiM0MztleGVjX2ZhaWw6CiYjNDM7CQllcnIgPSBlcnJubzsKJiM0MzsJCXdyaXRlKHJlYWR5WzFdLCAmYW1wO2Vyciwgc2l6ZW9mKGVycikpOwomIzQzOwkJX2V4aXQoMTI3KTsKJiM0MzsJfQomIzQzOwljbG9zZShvdXRbMV0pOwomIzQzOwljbG9zZShyZWFkeVsxXSk7CiYjNDM7CWNoaWxkLSZndDtmZCA9IG91dFswXTsKJiM0MzsJcGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gcmVhZHlbMF0sIC5ldmVudHMgPSBQT0xMSU4gfTsKJiM0MzsJLyogRU9GIG9uIHRoZSBjbG9zZS1vbi1leGVjIHBpcGUgZGlzdGluZ3Vpc2hlcyBleGVjIGZyb20gaW5oZXJpdGVkIGhhbmRsZXJzLiAqLwomIzQzOwllcnIgPSBjaGlsZC0mZ3Q7cGlkICZndDsgMCA/IHBvbGwoJmFtcDtwZmQsIDEsIFdBSVRfU1RFUFMgKiBXQUlUX1VTIC8gMTAwMCkgOiAtMTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QoY2hpbGQtJmd0O3BpZCwgMCwgJiMzNDtmb3JrJiMzNDspIHx8CiYjNDM7CSAgICAhQVNTRVJUX0dUKGVyciwgMCwgJiMzNDtleGVjIHRpbWVvdXQmIzM0OykgfHwKJiM0MzsJICAgICFBU1NFUlRfRVEocmVhZChyZWFkeVswXSwgJmFtcDtlcnIsIHNpemVvZihlcnIpKSwgMCwgJiMzNDtleGVjJiMzNDspKSB7CiYjNDM7CQljbG9zZShyZWFkeVswXSk7CiYjNDM7CQljb25zdW1lcl9jbGVhbnVwKGNoaWxkKTsKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwljbG9zZShyZWFkeVswXSk7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBjb25zdW1lcl9maW5pc2goc3RydWN0IGNvbnN1bWVyICpjaGlsZCwgaW50IHNpZ25vLCBib29sIHN1Y2Nlc3MsCiYjNDM7CQkJICAgIGNoYXIgKm91dHB1dCwgc2l6ZV90IHNpemUpCiYjNDM7ewomIzQzOwlpbnQgc3RhdHVzID0gMCwgaTsKJiM0MzsJcGlkX3QgcmV0ID0gMDsKJiM0MzsJc3NpemVfdCBuOwomIzQzOwlzaXplX3QgdXNlZCA9IDA7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LKGZjbnRsKGNoaWxkLSZndDtmZCwgRl9TRVRGTCwgT19OT05CTE9DSyksICYjMzQ7bm9uYmxvY2tpbmcgb3V0cHV0JiMzNDspKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwlpZiAoc2lnbm8gJmFtcDsmYW1wOyAhQVNTRVJUX09LKGtpbGwoY2hpbGQtJmd0O3BpZCwgc2lnbm8pLCAmIzM0O3NpZ25hbCBjb25zdW1lciYjMzQ7KSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFdBSVRfU1RFUFM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQl3aGlsZSAodXNlZCAmbHQ7IHNpemUgLSAxICZhbXA7JmFtcDsKJiM0MzsJCSAgICAgICAobiA9IHJlYWQoY2hpbGQtJmd0O2ZkLCBvdXRwdXQgJiM0MzsgdXNlZCwgc2l6ZSAtIDEgLSB1c2VkKSkgJmd0OyAwKQomIzQzOwkJCXVzZWQgJiM0Mzs9IG47CiYjNDM7CQlyZXQgPSB3YWl0cGlkKGNoaWxkLSZndDtwaWQsICZhbXA7c3RhdHVzLCBXTk9IQU5HKTsKJiM0MzsJCWlmIChyZXQgPT0gY2hpbGQtJmd0O3BpZCkKJiM0MzsJCQlicmVhazsKJiM0MzsJCWlmIChyZXQgJmx0OyAwICZhbXA7JmFtcDsgZXJybm8gIT0gRUlOVFIpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl1c2xlZXAoV0FJVF9VUyk7CiYjNDM7CX0KJiM0MzsJaWYgKCFBU1NFUlRfRVEocmV0LCBjaGlsZC0mZ3Q7cGlkLCAmIzM0O2JvdW5kZWQgY29uc3VtZXIgZXhpdCYjMzQ7KSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJY2hpbGQtJmd0O3BpZCA9IC0xOwomIzQzOwl3aGlsZSAodXNlZCAmbHQ7IHNpemUgLSAxICZhbXA7JmFtcDsgKG4gPSByZWFkKGNoaWxkLSZndDtmZCwgb3V0cHV0ICYjNDM7IHVzZWQsIHNpemUgLSAxIC0gdXNlZCkpICZndDsgMCkKJiM0MzsJCXVzZWQgJiM0Mzs9IG47CiYjNDM7CW91dHB1dFt1c2VkXSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJcmV0dXJuIEFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCAmIzM0O25vcm1hbCBleGl0JiMzNDspICZhbXA7JmFtcDsKJiM0MzsJICAgICAgIEFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpID09IDAsIHN1Y2Nlc3MsICYjMzQ7ZXhpdCBzdGF0dXMmIzM0Oyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIGNvbnN1bWVyX3JlYWR5KHN0cnVjdCBjb25zdW1lciAqY2hpbGQpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIGxvbmcgY2F1Z2h0OwomIzQzOwljaGFyIHBhdGhbNjRdLCBsaW5lWzI1Nl07CiYjNDM7CWludCBpOwomIzQzOwlGSUxFICpmOwomIzQzOwomIzQzOwlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICYjMzQ7L3Byb2MvJWQvc3RhdHVzJiMzNDssIGNoaWxkLSZndDtwaWQpOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgV0FJVF9TVEVQUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWYgPSBmb3BlbihwYXRoLCAmIzM0O3ImIzM0Oyk7CiYjNDM7CQlpZiAoIWYpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmKSkgewomIzQzOwkJCWlmIChzc2NhbmYobGluZSwgJiMzNDtTaWdDZ3Q6ICVsbHgmIzM0OywgJmFtcDtjYXVnaHQpID09IDEgJmFtcDsmYW1wOwomIzQzOwkJCSAgICAoY2F1Z2h0ICZhbXA7ICgxVUxMICZsdDsmbHQ7IChTSUdJTlQgLSAxKSkpICZhbXA7JmFtcDsKJiM0MzsJCQkgICAgKGNhdWdodCAmYW1wOyAoMVVMTCAmbHQ7Jmx0OyAoU0lHVEVSTSAtIDEpKSkpIHsKJiM0MzsJCQkJZmNsb3NlKGYpOwomIzQzOwkJCQlyZXR1cm4gdHJ1ZTsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CQlmY2xvc2UoZik7CiYjNDM7CQl1c2xlZXAoV0FJVF9VUyk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIEFTU0VSVF9UUlVFKGZhbHNlLCAmIzM0O2NvbnN1bWVyIHNpZ25hbCBoYW5kbGVycyByZWFkeSYjMzQ7KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgZW1pdF9yZWNvcmQoc3RydWN0IGJwZnRvb2xfcmluZ2J1ZiAqc2tlbCwgaW50IHJlY29yZCkKJiM0Mzt7CiYjNDM7CWNoYXIgcGFja2V0WzY0XSA9IHt9OwomIzQzOwomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgb3B0cywKJiM0MzsJCSAgICAuZGF0YV9pbiA9IHBhY2tldCwKJiM0MzsJCSAgICAuZGF0YV9zaXplX2luID0gc2l6ZW9mKHBhY2tldCksCiYjNDM7CSk7CiYjNDM7CiYjNDM7CXNrZWwtJmd0O2Jzcy0mZ3Q7cmVjb3JkID0gcmVjb3JkOwomIzQzOwlyZXR1cm4gQVNTRVJUX09LKGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMoYnBmX3Byb2dyYW1fX2ZkKHNrZWwtJmd0O3Byb2dzLnByb2R1Y2UpLAomIzQzOwkJCQkJICAgICAgJmFtcDtvcHRzKSwgJiMzNDtwcm9kdWNlIHJlY29yZCYjMzQ7KSAmYW1wOyZhbXA7CiYjNDM7CSAgICAgICBBU1NFUlRfT0soc2tlbC0mZ3Q7YnNzLSZndDtvdXRwdXRfZXJyLCAmIzM0O3JpbmdidWYgb3V0cHV0JiMzNDspOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBjb25zdW1lZCh1bnNpZ25lZCBsb25nICpwb3NpdGlvbiwgdW5zaWduZWQgbG9uZyBleHBlY3RlZCkKJiM0Mzt7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgV0FJVF9TVEVQUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChfX2F0b21pY19sb2FkX24ocG9zaXRpb24sIF9fQVRPTUlDX0FDUVVJUkUpID09IGV4cGVjdGVkKQomIzQzOwkJCXJldHVybiB0cnVlOwomIzQzOwkJdXNsZWVwKFdBSVRfVVMpOwomIzQzOwl9CiYjNDM7CXJldHVybiBBU1NFUlRfRVEoKnBvc2l0aW9uLCBleHBlY3RlZCwgJiMzNDtjb25zdW1lciBwb3NpdGlvbiYjMzQ7KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfanNvbihjaGFyICpvdXRwdXQsIGNvbnN0IGNoYXIgKmV4cGVjdGVkKQomIzQzO3sKJiM0MzsJY2hhciAqc3JjID0gb3V0cHV0LCAqZHN0ID0gb3V0cHV0OwomIzQzOwlib29sIHF1b3RlZCA9IGZhbHNlLCBlc2NhcGVkID0gZmFsc2U7CiYjNDM7CiYjNDM7CS8qIElnbm9yZSBmb3JtYXR0aW5nIHdoaXRlc3BhY2Ugd2hpbGUgY2hlY2tpbmcgdGhlIGVudGlyZSBKU09OIGRvY3VtZW50LiAqLwomIzQzOwl3aGlsZSAoKnNyYykgewomIzQzOwkJaWYgKHF1b3RlZCB8fCAhaXNzcGFjZSgodW5zaWduZWQgY2hhcikqc3JjKSkKJiM0MzsJCQkqZHN0JiM0MzsmIzQzOyA9ICpzcmM7CiYjNDM7CQlpZiAoIWVzY2FwZWQgJmFtcDsmYW1wOyAqc3JjID09ICYjMzk7JiMzNDsmIzM5OykKJiM0MzsJCQlxdW90ZWQgPSAhcXVvdGVkOwomIzQzOwkJZXNjYXBlZCA9ICFlc2NhcGVkICZhbXA7JmFtcDsgcXVvdGVkICZhbXA7JmFtcDsgKnNyYyA9PSAmIzM5O1xcJiMzOTs7CiYjNDM7CQlzcmMmIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CSpkc3QgPSAmIzM5O1wwJiMzOTs7CiYjNDM7CUFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCAmIzM0O0pTT04gcmVjb3JkcyYjMzQ7KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9jb25zdW1lcihjb25zdCBjaGFyICpmb3JtYXQsIGJvb2wgaWRsZSwgaW50IHNpZ25vLCBib29sIHBpbm5lZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9OwomIzQzOwlzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsOwomIzQzOwl1bnNpZ25lZCBsb25nICpwb3NpdGlvbiA9IE1BUF9GQUlMRUQ7CiYjNDM7CWludCBwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpLCBmZDsKJiM0MzsJY2hhciBwaW5fZGlyW10gPSAmIzM0Oy9zeXMvZnMvYnBmL2JwZnRvb2xfcmluZ2J1Zl9YWFhYWFgmIzM0OzsKJiM0MzsJY2hhciBwaW5fcGF0aFtzaXplb2YocGluX2RpcikgJiM0Mzsgc2l6ZW9mKCYjMzQ7L21hcCYjMzQ7KV07CiYjNDM7CWJvb2wgZGlyX2NyZWF0ZWQgPSBmYWxzZSwgbWFwX3Bpbm5lZCA9IGZhbHNlOwomIzQzOwljaGFyIG91dHB1dFs0MDk2XTsKJiM0MzsJc3RydWN0IHBvbGxmZCBwZmQ7CiYjNDM7CiYjNDM7CXNrZWwgPSBicGZ0b29sX3JpbmdidWZfX29wZW4oKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsICYjMzQ7b3BlbiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJYnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtJmd0O21hcHMucmluZ2J1ZiwgcGFnZV9zaXplKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soYnBmdG9vbF9yaW5nYnVmX19sb2FkKHNrZWwpLCAmIzM0O2xvYWQmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZmQgPSBicGZfbWFwX19mZChza2VsLSZndDttYXBzLnJpbmdidWYpOwomIzQzOwlpZiAocGlubmVkKSB7CiYjNDM7CQlpZiAoIUFTU0VSVF9PS19QVFIobWtkdGVtcChwaW5fZGlyKSwgJiMzNDtjcmVhdGUgcGluIGRpcmVjdG9yeSYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCWRpcl9jcmVhdGVkID0gdHJ1ZTsKJiM0MzsJCXNucHJpbnRmKHBpbl9wYXRoLCBzaXplb2YocGluX3BhdGgpLCAmIzM0OyVzL21hcCYjMzQ7LCBwaW5fZGlyKTsKJiM0MzsJCWlmICghQVNTRVJUX09LKGJwZl9vYmpfcGluKGZkLCBwaW5fcGF0aCksICYjMzQ7cGluIHJpbmdidWYmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQltYXBfcGlubmVkID0gdHJ1ZTsKJiM0MzsJfQomIzQzOwlwb3NpdGlvbiA9IG1tYXAoTlVMTCwgcGFnZV9zaXplLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIGZkLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfTkVRKHBvc2l0aW9uLCBNQVBfRkFJTEVELCAmIzM0O2NvbnN1bWVyIG1tYXAmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKCFpZGxlICZhbXA7JmFtcDsgKCFlbWl0X3JlY29yZChza2VsLCAwKSB8fCAhZW1pdF9yZWNvcmQoc2tlbCwgMSkpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghY29uc3VtZXJfc3RhcnQoJmFtcDtjaGlsZCwgZmQsIGZvcm1hdCwgcGlubmVkID8gcGluX3BhdGggOiBOVUxMLAomIzQzOwkJCSAgICBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8CiYjNDM7CSAgICAhY29uc3VtZXJfcmVhZHkoJmFtcDtjaGlsZCkpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKCFpZGxlKSB7CiYjNDM7CQkvKiBCb3RoIHByZWZpbGxlZCByZWNvcmRzIG9jY3VweSAxNiBieXRlcyBpbmNsdWRpbmcgdGhlaXIgaGVhZGVycy4gKi8KJiM0MzsJCWlmICghY29uc3VtZWQocG9zaXRpb24sIDMyKSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCXBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IGNoaWxkLmZkLCAuZXZlbnRzID0gUE9MTElOIH07CiYjNDM7CQlpZiAoIUFTU0VSVF9HVChwb2xsKCZhbXA7cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApLCAwLAomIzQzOwkJCSAgICAgICAmIzM0O3JlY29yZHMgZmx1c2hlZCBiZWZvcmUgZXhpdCYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfVFJVRShwZmQucmV2ZW50cyAmYW1wOyBQT0xMSU4sICYjMzQ7cmVjb3JkIG91dHB1dCByZWFkYWJsZSYjMzQ7KSB8fAomIzQzOwkJICAgICFlbWl0X3JlY29yZChza2VsLCAyKSB8fCAhY29uc3VtZWQocG9zaXRpb24sIDY0KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlpZiAoIWNvbnN1bWVyX2ZpbmlzaCgmYW1wO2NoaWxkLCBzaWdubywgdHJ1ZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKGZvcm1hdCAmYW1wOyZhbXA7ICFzdHJjbXAoZm9ybWF0LCAmIzM0Oy1wJiMzNDspKQomIzQzOwkJQVNTRVJUX1NUUkVRKG91dHB1dCwgaWRsZSA/ICYjMzQ7W11cbiYjMzQ7IDoKJiM0MzsJCQkgICAgICYjMzQ7W3tcbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OyAgICAgICAgXCYjMzQ7c2l6ZVwmIzM0OzogMixcbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OyAgICAgICAgXCYjMzQ7ZGF0YVwmIzM0OzogWzAsMjU1XG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDsgICAgICAgIF1cbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OyAgICB9LHtcbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OyAgICAgICAgXCYjMzQ7c2l6ZVwmIzM0OzogNSxcbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OyAgICAgICAgXCYjMzQ7ZGF0YVwmIzM0OzogWzEsMiwzLDQsNVxuJiMzNDsKJiM0MzsJCQkgICAgICYjMzQ7ICAgICAgICBdXG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDsgICAgfSx7XG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDsgICAgICAgIFwmIzM0O3NpemVcJiMzNDs6IDE3LFxuJiMzNDsKJiM0MzsJCQkgICAgICYjMzQ7ICAgICAgICBcJiMzNDtkYXRhXCYjMzQ7OiBbMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzJcbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OyAgICAgICAgXVxuJiMzNDsKJiM0MzsJCQkgICAgICYjMzQ7ICAgIH1cbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0O11cbiYjMzQ7LCAmIzM0O3ByZXR0eSBKU09OIHJlY29yZHMmIzM0Oyk7CiYjNDM7CWVsc2UgaWYgKGZvcm1hdCkKJiM0MzsJCWNoZWNrX2pzb24ob3V0cHV0LCBpZGxlID8gJiMzNDtbXSYjMzQ7IDoKJiM0MzsJCQkgICAmIzM0O1t7XCYjMzQ7c2l6ZVwmIzM0OzoyLFwmIzM0O2RhdGFcJiMzNDs6WzAsMjU1XX0sJiMzNDsKJiM0MzsJCQkgICAmIzM0O3tcJiMzNDtzaXplXCYjMzQ7OjUsXCYjMzQ7ZGF0YVwmIzM0OzpbMSwyLDMsNCw1XX0sJiMzNDsKJiM0MzsJCQkgICAmIzM0O3tcJiMzNDtzaXplXCYjMzQ7OjE3LFwmIzM0O2RhdGFcJiMzNDs6WzE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLCYjMzQ7CiYjNDM7CQkJICAgJiMzNDsyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMl19XSYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJQVNTRVJUX1NUUkVRKG91dHB1dCwgaWRsZSA/ICYjMzQ7JiMzNDsgOgomIzQzOwkJCSAgICAgJiMzNDs9PSBzaXplOiAyID09PT09XG4wMCBmZlxuJiMzNDsKJiM0MzsJCQkgICAgICYjMzQ7PT0gc2l6ZTogNSA9PT09PVxuMDEgMDIgMDMgMDQgMDVcbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0Oz09IHNpemU6IDE3ID09PT09XG4xMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAgJiMzNDsKJiM0MzsJCQkgICAgICYjMzQ7MTggMTkgMWEgMWIgMWMgMWQgMWUgMWZcbjIwXG4mIzM0OywgJiMzNDtwbGFpbiByZWNvcmRzJiMzNDspOwomIzQzO291dDoKJiM0MzsJY29uc3VtZXJfY2xlYW51cCgmYW1wO2NoaWxkKTsKJiM0MzsJaWYgKHBvc2l0aW9uICE9IE1BUF9GQUlMRUQpCiYjNDM7CQltdW5tYXAocG9zaXRpb24sIHBhZ2Vfc2l6ZSk7CiYjNDM7CWlmIChtYXBfcGlubmVkKQomIzQzOwkJQVNTRVJUX09LKHVubGluayhwaW5fcGF0aCksICYjMzQ7dW5waW4gcmluZ2J1ZiYjMzQ7KTsKJiM0MzsJaWYgKGRpcl9jcmVhdGVkKQomIzQzOwkJQVNTRVJUX09LKHJtZGlyKHBpbl9kaXIpLCAmIzM0O3JlbW92ZSBwaW4gZGlyZWN0b3J5JiMzNDspOwomIzQzOwlicGZ0b29sX3JpbmdidWZfX2Rlc3Ryb3koc2tlbCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfcGVyZl9jb25zdW1lcih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGNvbnN1bWVyIGNoaWxkID0geyAucGlkID0gLTEsIC5mZCA9IC0xIH07CiYjNDM7CXVuc2lnbmVkIGxvbmcgbG9uZyBzZWNvbmRzLCBuYW5vc2Vjb25kczsKJiM0MzsJc3RydWN0IGJwZnRvb2xfcmluZ2J1ZiAqc2tlbDsKJiM0MzsJY2hhciBvdXRwdXRbMTYzODRdLCBleHBlY3RlZFsxNjM4NF07CiYjNDM7CWludCBucl9jcHVzLCBjcHUsIGluZGV4LCBvZmZzZXQgPSAwLCBpLCB1c2VkID0gMCwgZmllbGRzOwomIzQzOwlzdHJ1Y3QgcG9sbGZkIHBmZDsKJiM0MzsKJiM0MzsJbnJfY3B1cyA9IGxpYmJwZl9udW1fcG9zc2libGVfY3B1cygpOwomIzQzOwlpZiAoIUFTU0VSVF9HVChucl9jcHVzLCAwLCAmIzM0O3Bvc3NpYmxlIGNwdXMmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CXNrZWwgPSBicGZ0b29sX3JpbmdidWZfX29wZW4oKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsICYjMzQ7b3BlbiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJYnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtJmd0O21hcHMucmluZ2J1ZiwgZ2V0cGFnZXNpemUoKSk7CiYjNDM7CWJwZl9tYXBfX3NldF9tYXhfZW50cmllcyhza2VsLSZndDttYXBzLnBlcmZidWYsIG5yX2NwdXMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhicGZ0b29sX3JpbmdidWZfX2xvYWQoc2tlbCksICYjMzQ7bG9hZCYjMzQ7KSB8fAomIzQzOwkgICAgIWNvbnN1bWVyX3N0YXJ0KCZhbXA7Y2hpbGQsIGJwZl9tYXBfX2ZkKHNrZWwtJmd0O21hcHMucGVyZmJ1ZiksIE5VTEwsCiYjNDM7CQkJICAgIE5VTEwsIE5VTEwsIGZhbHNlLCBmYWxzZSkgfHwgIWNvbnN1bWVyX3JlYWR5KCZhbXA7Y2hpbGQpIHx8CiYjNDM7CSAgICAhZW1pdF9yZWNvcmQoc2tlbCwgMykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJLyogT25lIGxhcmdlIHJlY29yZCBmbHVzaGVzIHRoZSBleGlzdGluZyBidWZmZXJlZCBwZXJmIG91dHB1dCBjYWxsYmFjay4gKi8KJiM0MzsJcGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gY2hpbGQuZmQsIC5ldmVudHMgPSBQT0xMSU4gfTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QocG9sbCgmYW1wO3BmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSwgMCwKJiM0MzsJCSAgICAgICAmIzM0O3BlcmYgcmVjb3JkIG91dHB1dCYjMzQ7KSB8fAomIzQzOwkgICAgIUFTU0VSVF9UUlVFKHBmZC5yZXZlbnRzICZhbXA7IFBPTExJTiwgJiMzNDtwZXJmIG91dHB1dCByZWFkYWJsZSYjMzQ7KSB8fAomIzQzOwkgICAgIWNvbnN1bWVyX2ZpbmlzaCgmYW1wO2NoaWxkLCBTSUdJTlQsIHRydWUsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWZpZWxkcyA9IHNzY2FuZihvdXRwdXQsICYjMzQ7PT0gQCVsbHUuJWxsdSBDUFU6ICVkIGluZGV4OiAlZCA9PT09PVxuJW4mIzM0OywKJiM0MzsJCQkmYW1wO3NlY29uZHMsICZhbXA7bmFub3NlY29uZHMsICZhbXA7Y3B1LCAmYW1wO2luZGV4LCAmYW1wO29mZnNldCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGZpZWxkcywgNCwgJiMzNDtwZXJmIGhlYWRlciYjMzQ7KSB8fAomIzQzOwkgICAgIUFTU0VSVF9HVChvZmZzZXQsIDAsICYjMzQ7cGVyZiBwYXlsb2FkIG9mZnNldCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlBU1NFUlRfR1Qoc2Vjb25kcyAqIDEwMDAwMDAwMDBVTEwgJiM0MzsgbmFub3NlY29uZHMsIDAsICYjMzQ7cGVyZiB0aW1lc3RhbXAmIzM0Oyk7CiYjNDM7CUFTU0VSVF9MVChuYW5vc2Vjb25kcywgMTAwMDAwMDAwMFVMTCwgJiMzNDtwZXJmIHRpbWVzdGFtcCBuYW5vc2Vjb25kcyYjMzQ7KTsKJiM0MzsJQVNTRVJUX0dFKGNwdSwgMCwgJiMzNDtwZXJmIGNwdSYjMzQ7KTsKJiM0MzsJQVNTRVJUX0xUKGNwdSwgbnJfY3B1cywgJiMzNDtwZXJmIGNwdSByYW5nZSYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGluZGV4LCBjcHUsICYjMzQ7cGVyZiBpbmRleCYjMzQ7KTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IHNpemVvZihza2VsLSZndDtyb2RhdGEtJmd0O3BlcmZfcGF5bG9hZCk7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQljb25zdCBjaGFyICpzZXBhcmF0b3IgPSAhaSA/ICYjMzQ7JiMzNDsgOiAhKGkgJSAxNikgPyAmIzM0O1xuJiMzNDsgOgomIzQzOwkJCQkJIShpICUgOCkgPyAmIzM0OyAgJiMzNDsgOiAmIzM0OyAmIzM0OzsKJiM0MzsKJiM0MzsJCXVzZWQgJiM0Mzs9IHNucHJpbnRmKGV4cGVjdGVkICYjNDM7IHVzZWQsIHNpemVvZihleHBlY3RlZCkgLSB1c2VkLAomIzQzOwkJCQkgJiMzNDslcyUwMngmIzM0Oywgc2VwYXJhdG9yLCBpID09IDEgPyAweGZmIDogMCk7CiYjNDM7CX0KJiM0MzsJc25wcmludGYoZXhwZWN0ZWQgJiM0MzsgdXNlZCwgc2l6ZW9mKGV4cGVjdGVkKSAtIHVzZWQsICYjMzQ7XG4mIzM0Oyk7CiYjNDM7CUFTU0VSVF9TVFJFUShvdXRwdXQgJiM0Mzsgb2Zmc2V0LCBleHBlY3RlZCwgJiMzNDtwZXJmIHBheWxvYWQmIzM0Oyk7CiYjNDM7b3V0OgomIzQzOwljb25zdW1lcl9jbGVhbnVwKCZhbXA7Y2hpbGQpOwomIzQzOwlicGZ0b29sX3JpbmdidWZfX2Rlc3Ryb3koc2tlbCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfcmVqZWN0KGVudW0gYnBmX21hcF90eXBlIHR5cGUsIGNvbnN0IGNoYXIgKm9wdGlvbiwgYm9vbCBwYWlyLCBib29sIGpzb24pCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTsKJiM0MzsJYm9vbCByaW5nID0gdHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRiB8fCB0eXBlID09IEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUY7CiYjNDM7CWNvbnN0IGNoYXIgKmV4cGVjdGVkID0gb3B0aW9uID8KJiM0MzsJCSYjMzQ7e1wmIzM0O2Vycm9yXCYjMzQ7OlwmIzM0O3JpbmcgYnVmZmVyIG1hcHMgZG8gbm90IHN1cHBvcnQgY3B1IG9yIGluZGV4IGFyZ3VtZW50c1wmIzM0O30mIzM0OyA6CiYjNDM7CQkmIzM0O3tcJiMzNDtlcnJvclwmIzM0OzpcJiMzNDttYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheSBvciByaW5nIGJ1ZmZlclwmIzM0O30mIzM0OzsKJiM0MzsJY2hhciBvdXRwdXRbNDA5Nl07CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJZmQgPSBicGZfbWFwX2NyZWF0ZSh0eXBlLCBOVUxMLCByaW5nID8gMCA6IDQsIHJpbmcgPyAwIDogNCwKJiM0MzsJCQkgICAgcmluZyA/IGdldHBhZ2VzaXplKCkgOiAxLCBOVUxMKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7Y3JlYXRlIG1hcCYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJaWYgKGNvbnN1bWVyX3N0YXJ0KCZhbXA7Y2hpbGQsIGZkLCBqc29uID8gJiMzNDstaiYjMzQ7IDogTlVMTCwgTlVMTCwgb3B0aW9uLCBwYWlyLCB0cnVlKSAmYW1wOyZhbXA7CiYjNDM7CSAgICBjb25zdW1lcl9maW5pc2goJmFtcDtjaGlsZCwgMCwgZmFsc2UsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKSB7CiYjNDM7CQlpZiAoanNvbikKJiM0MzsJCQljaGVja19qc29uKG91dHB1dCwgZXhwZWN0ZWQpOwomIzQzOwkJZWxzZQomIzQzOwkJCUFTU0VSVF9HVChzdHJsZW4ob3V0cHV0KSwgMCwgJiMzNDtlcnJvciBkaWFnbm9zdGljJiMzNDspOwomIzQzOwl9CiYjNDM7CWNvbnN1bWVyX2NsZWFudXAoJmFtcDtjaGlsZCk7CiYjNDM7CWNsb3NlKGZkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X2JwZnRvb2xfcmluZ2J1Zih2b2lkKQomIzQzO3sKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtwZXJmX2V2ZW50X2FycmF5JiMzNDspKQomIzQzOwkJdGVzdF9wZXJmX2NvbnN1bWVyKCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cGxhaW4mIzM0OykpCiYjNDM7CQl0ZXN0X2NvbnN1bWVyKE5VTEwsIGZhbHNlLCBTSUdJTlQsIGZhbHNlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtqc29uJiMzNDspKQomIzQzOwkJdGVzdF9jb25zdW1lcigmIzM0Oy1qJiMzNDssIGZhbHNlLCBTSUdURVJNLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cHJldHR5X2pzb24mIzM0OykpCiYjNDM7CQl0ZXN0X2NvbnN1bWVyKCYjMzQ7LXAmIzM0OywgZmFsc2UsIFNJR0lOVCwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3Bpbm5lZF9wbGFpbiYjMzQ7KSkKJiM0MzsJCXRlc3RfY29uc3VtZXIoTlVMTCwgZmFsc2UsIFNJR1RFUk0sIHRydWUpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3Bpbm5lZF9qc29uJiMzNDspKQomIzQzOwkJdGVzdF9jb25zdW1lcigmIzM0Oy1qJiMzNDssIGZhbHNlLCBTSUdJTlQsIHRydWUpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3Bpbm5lZF9wcmV0dHlfanNvbiYjMzQ7KSkKJiM0MzsJCXRlc3RfY29uc3VtZXIoJiMzNDstcCYjMzQ7LCBmYWxzZSwgU0lHVEVSTSwgdHJ1ZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7aWRsZV9zaWdpbnQmIzM0OykpCiYjNDM7CQl0ZXN0X2NvbnN1bWVyKE5VTEwsIHRydWUsIFNJR0lOVCwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2lkbGVfc2lndGVybV9qc29uJiMzNDspKQomIzQzOwkJdGVzdF9jb25zdW1lcigmIzM0Oy1qJiMzNDssIHRydWUsIFNJR1RFUk0sIGZhbHNlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtpZGxlX3NpZ2ludF9wcmV0dHlfanNvbiYjMzQ7KSkKJiM0MzsJCXRlc3RfY29uc3VtZXIoJiMzNDstcCYjMzQ7LCB0cnVlLCBTSUdJTlQsIGZhbHNlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtyZWplY3RfYXJyYXkmIzM0OykpCiYjNDM7CQl0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfQVJSQVksIE5VTEwsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cmVqZWN0X3VzZXJfcmluZ2J1ZiYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cmVqZWN0X2NwdSYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCAmIzM0O2NwdSYjMzQ7LCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JlamVjdF9pbmRleCYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCAmIzM0O2luZGV4JiMzNDssIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cmVqZWN0X2NwdV9pbmRleCYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCAmIzM0O2NwdSYjMzQ7LCB0cnVlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cmVqZWN0X3VzZXJfcmluZ2J1Zl9qc29uJiMzNDspKQomIzQzOwkJdGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRiwgTlVMTCwgZmFsc2UsIHRydWUpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JlamVjdF9jcHVfaW5kZXhfanNvbiYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCAmIzM0O2NwdSYjMzQ7LCB0cnVlLCB0cnVlKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uYmJiYzkzYzMwYTgzMwotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9icGZ0b29sX3JpbmdidWYuYwpAQCAtMCwwICYjNDM7MSw0NyBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2JwZi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1JJTkdCVUYpOwomIzQzO30gcmluZ2J1ZiBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkpOwomIzQzOwlfX3VpbnQoa2V5X3NpemUsIHNpemVvZihfX3UzMikpOwomIzQzOwlfX3VpbnQodmFsdWVfc2l6ZSwgc2l6ZW9mKF9fdTMyKSk7CiYjNDM7CV9fdWludChtYXhfZW50cmllcywgMSk7CiYjNDM7fSBwZXJmYnVmIFNFQygmIzM0Oy5tYXBzJiMzNDspOwomIzQzOwomIzQzOy8qCiYjNDM7ICogSW5jbHVkZSB0aGUgdTMyIHJhdyBzaXplIGluIHBlcmYmIzM5O3MgOC1ieXRlIGFsaWdubWVudCB0byBhdm9pZCBwYWRkaW5nLgomIzQzOyAqIEtlZXAgcGxhaW4gb3V0cHV0IGxhcmdlIGVub3VnaCB0byBmbHVzaCBzdGRpbyBiZWZvcmUgdGhlIGNvbnN1bWVyIGV4aXRzLgomIzQzOyAqLwomIzQzO2NvbnN0IHVuc2lnbmVkIGNoYXIgcGVyZl9wYXlsb2FkWzQwOTJdID0geyAweDAwLCAweGZmIH07CiYjNDM7CiYjNDM7aW50IHJlY29yZDsKJiM0MztpbnQgb3V0cHV0X2VycjsKJiM0MzsKJiM0MztTRUMoJiMzNDtzb2NrZXQmIzM0OykKJiM0MztpbnQgcHJvZHVjZShzdHJ1Y3QgX19za19idWZmICpza2IpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBjaGFyIGZpcnN0W10gPSB7IDB4MDAsIDB4ZmYgfTsKJiM0MzsJdW5zaWduZWQgY2hhciBzZWNvbmRbXSA9IHsgMSwgMiwgMywgNCwgNSB9OwomIzQzOwl1bnNpZ25lZCBjaGFyIHRoaXJkW10gPSB7CiYjNDM7CQkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LAomIzQzOwkJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJaWYgKHJlY29yZCA9PSAwKQomIzQzOwkJb3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dCgmYW1wO3JpbmdidWYsIGZpcnN0LCBzaXplb2YoZmlyc3QpLCAwKTsKJiM0MzsJZWxzZSBpZiAocmVjb3JkID09IDEpCiYjNDM7CQlvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KCZhbXA7cmluZ2J1Ziwgc2Vjb25kLCBzaXplb2Yoc2Vjb25kKSwgMCk7CiYjNDM7CWVsc2UgaWYgKHJlY29yZCA9PSAyKQomIzQzOwkJb3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dCgmYW1wO3JpbmdidWYsIHRoaXJkLCBzaXplb2YodGhpcmQpLCAwKTsKJiM0MzsJZWxzZQomIzQzOwkJb3V0cHV0X2VyciA9IGJwZl9wZXJmX2V2ZW50X291dHB1dChza2IsICZhbXA7cGVyZmJ1ZiwgQlBGX0ZfQ1VSUkVOVF9DUFUsCiYjNDM7CQkJCQkJICAgKHZvaWQgKilwZXJmX3BheWxvYWQsIHNpemVvZihwZXJmX3BheWxvYWQpKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgTElDRU5TRVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwMzowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTkwNwoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDM3MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBQYXRjaCBTZXJpZXMqKgoKT2theSwgc28gdGhlIHVzZXIgd2FudHMgbWUgdG8gZXZhbHVhdGUgdGhpcyBwYXRjaCBzZXJpZXMgY29tbWl0dGVkIGF0IEhFQUQuIE15IGZpcnN0IHN0ZXAgaXMgdG8gcXVpY2tseSBhbmFseXplIHRoZSBjaGFuZ2VkIGZpbGVzIHVzaW5nIHRoZSBwcm92aWRlZCBgZ2l0IGRpZmZgLiBJIHNlZSBpdCB0b3VjaGVzIHRoZXNlIGZpbGVzOiBgdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RgLCBgdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xgLCBgdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jYCwgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jYCwgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNgLgoKTm93LCBhY2NvcmRpbmcgdG8gdGhlIGd1aWRlbGluZXMsIEkgbmVlZCB0byBkZXRlcm1pbmUgaWYgdGhpcyB3YXJyYW50cyBmdXJ0aGVyIGZ1enppbmcuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhpcyBkb2VzbiYjMzk7dCBmYWxsIGludG8gdGhlICYjMzQ7TmVnYXRpdmUgQ3JpdGVyaWEmIzM0Oy4gU3BlY2lmaWNhbGx5LCBpcyAqYWxsKiB0aGUgbW9kaWZpZWQgY29kZSBzdHJpY3RseSBjb25maW5lZCB0bzogZG9jdW1lbnRhdGlvbiwgY29tbWVudHMsIHNwZWxsaW5nIGZpeGVzLCB1c2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIHRoYXQgKmRvbiYjMzk7dCogaW1wYWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzPwoKQmFzZWQgb24gdGhlIGZpbGVzIGxpc3RlZCwgYWxsIG1vZGlmaWNhdGlvbnMgYXJlIHdpdGhpbiB0aGUgYHRvb2xzL2JwZi9icGZ0b29sL2AgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYCBkaXJlY3Rvcmllcy4gVGhpcyAqc2hvdWxkKiBtZWFuIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggdXNlci1zcGFjZSB0b29scyBhbmQgc2VsZi10ZXN0cy4gSSBuZWVkIHRvIGJlIGFic29sdXRlbHkgY2VydGFpbiB0aG91Z2guIEV2ZW4gdGhvdWdoIHRoZSBwcm92aWRlZCBkaWZmIGxvb2tzIGNvbXBsZXRlLCBJJiMzOTtsbCBxdWlja2x5IGRvdWJsZS1jaGVjayB0aGF0IGJ5IGNhbGxpbmcgYGdyZXBwZXJgIG9yIGNoZWNrIHRoZSBgZ2l0IHN0YXR1c2Agb3IgYGdpdCBkaWZmYCBhZ2Fpbi4gSnVzdCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG90aGVyIGNoYW5nZXMgbHVya2luZyB0aGF0IEkmIzM5O20gbWlzc2luZy4gQnV0IGJhc2VkIG9uIHRoaXMgcXVpY2sgc2NhbiwgdGhpcyAqc3Ryb25nbHkqIHBvaW50cyB0byB0aGUgcGF0Y2ggYmVpbmcgc2FmZSB0byBza2lwLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDAzOjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3ByaW50X3JpbmdidWZfb3V0cHV0JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYz01Nz1wcmludF9icGZfb3V0cHV0KHZvaWQgKnByaXZhdGVfZGF0YSwgaW50IGNwdSwgc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyICpldmVudClcbi0tXG50b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMtMTA4LVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jOjEwOTpzdGF0aWMgaW50IHByaW50X3JpbmdidWZfb3V0cHV0KHZvaWQgKmN0eCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpXG50b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMtMTEwLXtcbi0tXG50b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmM9MTMwPWludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbi0tXG50b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMtMjE1LVx0aWYgKG1hcF9pbmZvLnR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYzoyMTY6XHRcdHJiID0gcmluZ19idWZmZXJfX25ldyhtYXBfZmQsIHByaW50X3JpbmdidWZfb3V0cHV0LCBOVUxMLCBOVUxMKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYy0yMTctXHRcdGlmICghcmIpIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwMzowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjk4NgoJCQkJCQkJb3V0cHV0OiA5MAoJCQkJCQkJdGhvdWdodHM6IDE5MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBQYXRjaCYjMzk7cyBJbXBhY3QqKgoKT2theSwgc28gSSYjMzk7dmUgdGFrZW4gYSBsb29rIGF0IHRoaXMgcGF0Y2ggYW5kLCBiYXNlZCBvbiB0aGUgZmlsZSBwYXRocywgaXQmIzM5O3MgcHJldHR5IGNsZWFyIHdoZXJlIHRoZSBjaGFuZ2VzIGxpZS4gRXZlcnl0aGluZyYjMzk7cyBuZWF0bHkgdHVja2VkIHVuZGVyIHRoZSBgdG9vbHMvYCBkaXJlY3RvcnkuIFNlY3Rpb24gMiBvZiB0aGUgZG9jdW1lbnRhdGlvbiBleHBsaWNpdGx5IHN0YXRlcyB0aGF0IGFueXRoaW5nIGluIHRoYXQgc3BhY2UsIGxpa2UgdXNlci1zcGFjZSB1dGlsaXRpZXMsIHRlc3RzLCBvciBzY3JpcHRzLCB0aGF0IGRvZXNuJiMzOTt0IG1lc3Mgd2l0aCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlIChgdm1saW51eGApIG9yIGtlcm5lbCBtb2R1bGVzLCBpc24mIzM5O3Qgc29tZXRoaW5nIHdlIG5lZWQgdG8gZnV6ei4KClRoZXJlZm9yZSwgYFdvcnRoRnV6emluZ2AgaXMgZGVmaW5pdGVseSBzZXQgdG8gYGZhbHNlYCBoZXJlLiBUaGUgYEVuYWJsZUNvbmZpZ3NgIGFuZCBgRm9jdXNTeW1ib2xzYCBsaXN0cyBhcmUgYm90aCBlbXB0eSwgYXMgZXhwZWN0ZWQuIFRoZSByZWFzb25pbmcgZ2l2ZW4g4oCTIHRoYXQgdGhlIHBhdGNoIG9ubHkgYWZmZWN0cyB1c2VyLXNwYWNlIHRvb2xzIGxpa2UgYGJwZnRvb2xgIGFuZCBzb21lIEJQRiBzZWxmdGVzdHMg4oCTIGFuZCB0aGF0IG5vdGhpbmcgaW4gdGhlIGtlcm5lbCBzcGFjZSBpdHNlbGYgaXMgdG91Y2hlZCDigJMgZnVsbHkgc3VwcG9ydHMgdGhpcyBhc3Nlc3NtZW50LgoKSSYjMzk7dmUgYWxzbyBwZXJmb3JtZWQgYSBzYW5pdHkgY2hlY2sgb24gdGhlIHRvb2wgcGFyYW1ldGVycywganVzdCB0byBiZSB0aG9yb3VnaC4gVGhlIGBFbmFibGVDb25maWdzYCwgYEZvY3VzU3ltYm9sc2AgYW5kIHRoZSBgV29ydGhGdXp6aW5nYCBhcmUgY29uc2lzdGVudCwgYWdhaW4sIHJlaW5mb3JjaW5nIG15IHByZXZpb3VzIGFzc2Vzc21lbnQuCgpMb29rcyBsaWtlIGl0JiMzOTtzIHNhZmUgdG8gY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDAzOjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogW10sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgY2hhbmdlcyBhcmUgc3RyaWN0bHkgbGltaXRlZCB0byB1c2VyLXNwYWNlIHV0aWxpdGllcyAoYnBmdG9vbCB1bmRlciB0b29scy9icGYvYnBmdG9vbC8pIGFuZCBzZWxmdGVzdHMgKHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi8pLiBObyBrZXJuZWwtc3BhY2UgY29kZSBvciBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgvbW9kdWxlcykgaXMgbW9kaWZpZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBjaGFuZ2VzIGFyZSBzdHJpY3RseSBsaW1pdGVkIHRvIHVzZXItc3BhY2UgdXRpbGl0aWVzIChicGZ0b29sIHVuZGVyIHRvb2xzL2JwZi9icGZ0b29sLykgYW5kIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLykuIE5vIGtlcm5lbC1zcGFjZSBjb2RlIG9yIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eC9tb2R1bGVzKSBpcyBtb2RpZmllZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MDA8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDAzOjAwOjAyLjQ1MjI1MDM4M1oiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyODQwNjczMDc3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgY2hhbmdlcyBhcmUgc3RyaWN0bHkgbGltaXRlZCB0byB1c2VyLXNwYWNlIHV0aWxpdGllcyAoYnBmdG9vbCB1bmRlciB0b29scy9icGYvYnBmdG9vbC8pIGFuZCBzZWxmdGVzdHMgKHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi8pLiBObyBrZXJuZWwtc3BhY2UgY29kZSBvciBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgvbW9kdWxlcykgaXMgbW9kaWZpZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwMzowMDowMi40NTIyNTUyOTNaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQzMDg4Njg4OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGQzYWUzZDllMzU1ZWI4NjBkYjZkYTdlZjMzZTE0NzU5ZjZiNjU4YzdcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIEZyaSBTZXAgMTEgMDM6MDA6MDEgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLmU0ZWQ3ZTcwMWM5ZTQgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbkBAIC0xMjAsNyArMTIwLDggQEAgYnBmdG9vbCBtYXAgcGluICAgICAqTUFQKiAgKkZJTEUqXFxuICAgICBjaGFyYWN0ZXIgKCcuJyksIHdoaWNoIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyBvZiAqYnBmZnMqLlxcbiBcXG4gYnBmdG9vbCBtYXAgZXZlbnRfcGlwZSAqTUFQKiBbY3B1ICpOKiBpbmRleCAqTSpdXFxuLSAgICBSZWFkIGV2ZW50cyBmcm9tIGEgKipCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSoqIG1hcC5cXG4rICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogb3JcXG4rICAgICoqQlBGX01BUF9UWVBFX1JJTkdCVUYqKiBtYXAuXFxuIFxcbiAgICAgSW5zdGFsbCBwZXJmIHJpbmdzIGludG8gYSBwZXJmIGV2ZW50IGFycmF5IG1hcCBhbmQgZHVtcCBvdXRwdXQgb2YgYW55XFxuICAgICAqKmJwZl9wZXJmX2V2ZW50X291dHB1dCoqXFxcXCAoKSBjYWxsIGluIHRoZSBrZXJuZWwuIEJ5IGRlZmF1bHQgcmVhZCB0aGVcXG5AQCAtMTM0LDYgKzEzNSwxNyBAQCBicGZ0b29sIG1hcCBldmVudF9waXBlICpNQVAqIFtjcHUgKk4qIGluZGV4ICpNKl1cXG4gICAgIGV4aXN0aW5nIHJpbmcuICBBbnkgb3RoZXIgYXBwbGljYXRpb24gd2lsbCBzdG9wIHJlY2VpdmluZyBldmVudHMgaWYgaXRcXG4gICAgIGluc3RhbGxlZCBpdHMgcmluZ3MgZWFybGllci5cXG4gXFxuKyAgICBGb3IgYSByaW5nIGJ1ZmZlciBtYXAsIGNvbnN1bWUgcmVjb3JkcyBzdWJtaXR0ZWQgYnkgQlBGIHByb2dyYW1zLCBpbmNsdWRpbmdcXG4rICAgIHJlY29yZHMgYWxyZWFkeSBxdWV1ZWQgYmVmb3JlIHRoZSBjb21tYW5kIHN0YXJ0cy4gKipjcHUqKiBhbmQgKippbmRleCoqXFxuKyAgICBhcmUgbm90IHN1cHBvcnRlZC4gRWFjaCByZWNvcmQgaXMgcHJpbnRlZCBpbiBmdWxsLCBpbmNsdWRpbmcgZW1iZWRkZWQgemVyb1xcbisgICAgYnl0ZXMuIFBsYWluIG91dHB1dCByZXBvcnRzIHRoZSByZWNvcmQgc2l6ZSBmb2xsb3dlZCBieSBoZXhhZGVjaW1hbFxcbisgICAgYnl0ZXM7IEpTT04gb3V0cHV0IGNvbnRhaW5zICoqc2l6ZSoqIGFuZCAqKmRhdGEqKiBmaWVsZHMsIHdpdGggKipkYXRhKiogYW5cXG4rICAgIGFycmF5IG9mIGJ5dGUgdmFsdWVzLiBSaW5nIGJ1ZmZlciByZWNvcmRzIGhhdmUgbm8gaW1wbGljaXQgQ1BVIG9yIHRpbWVzdGFtcC5cXG4rXFxuKyAgICBDb25zdW1pbmcgYSByaW5nIGJ1ZmZlciBhZHZhbmNlcyBpdHMgc2hhcmVkIGNvbnN1bWVyIHBvc2l0aW9uLCBzbyB0aGlzXFxuKyAgICBjb21tYW5kIG11c3Qgbm90IHJ1biBhbG9uZ3NpZGUgYW5vdGhlciBjb25zdW1lciBvZiB0aGUgc2FtZSBtYXAuXFxuKyAgICAqKkJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYqKiBtYXBzIGFyZSBub3Qgc3VwcG9ydGVkLlxcbitcXG4gYnBmdG9vbCBtYXAgcGVlayAgKk1BUCpcXG4gICAgIFBlZWsgbmV4dCB2YWx1ZSBpbiB0aGUgcXVldWUgb3Igc3RhY2suXFxuIFxcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXFxuaW5kZXggNzVjYmNiNTEyZWJhZS4uMTc1MGI0ODhjOWUzYiAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXFxuQEAgLTg3OCwxMSArODc4LDExIEBAIF9icGZ0b29sKClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICBpZClcXG4tICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfaWRzX2Zvcl90eXBlIHBlcmZfZXZlbnRfYXJyYXlcXG4rICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfaWRzX2Zvcl90eXBlICdcXFwidHlwZVxcXCI6IFxcXCJcXFxcKHBlcmZfZXZlbnRfYXJyYXlcXFxcfHJpbmdidWZcXFxcKVxcXCInXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOztcXG4gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSlcXG4tICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfbmFtZXNfZm9yX3R5cGUgcGVyZl9ldmVudF9hcnJheVxcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9uYW1lc19mb3JfdHlwZSAnXFxcInR5cGVcXFwiOiBcXFwiXFxcXChwZXJmX2V2ZW50X2FycmF5XFxcXHxyaW5nYnVmXFxcXClcXFwiJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7XFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNwdSlcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jXFxuaW5kZXggYmNiNzY3ZTJkNjczMy4uN2Q1NTUzMzFmNDQzYSAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmNcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmNcXG5AQCAtMjcsNyArMjcsNyBAQFxcbiBcXG4gI2RlZmluZSBNTUFQX1BBR0VfQ05UXFx0MTZcXG4gXFxuLXN0YXRpYyB2b2xhdGlsZSBib29sIHN0b3A7XFxuK3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3Qgc3RvcDtcXG4gXFxuIHN0cnVjdCBwZXJmX2V2ZW50X3NhbXBsZSB7XFxuIFxcdHN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciBoZWFkZXI7XFxuQEAgLTQ0LDcgKzQ0LDYgQEAgc3RydWN0IHBlcmZfZXZlbnRfbG9zdCB7XFxuIFxcbiBzdGF0aWMgdm9pZCBpbnRfZXhpdChpbnQgc2lnbm8pXFxuIHtcXG4tXFx0ZnByaW50ZihzdGRlcnIsIFxcXCJTdG9wcGluZy4uLlxcXFxuXFxcIik7XFxuIFxcdHN0b3AgPSB0cnVlO1xcbiB9XFxuIFxcbkBAIC0xMDcsNiArMTA2LDI3IEBAIHByaW50X2JwZl9vdXRwdXQodm9pZCAqcHJpdmF0ZV9kYXRhLCBpbnQgY3B1LCBzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgKmV2ZW50KVxcbiBcXHRyZXR1cm4gTElCQlBGX1BFUkZfRVZFTlRfQ09OVDtcXG4gfVxcbiBcXG4rc3RhdGljIGludCBwcmludF9yaW5nYnVmX291dHB1dCh2b2lkICpjdHgsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKVxcbit7XFxuK1xcdGlmIChqc29uX291dHB1dCkge1xcbitcXHRcXHRqc29ud19zdGFydF9vYmplY3QoanNvbl93dHIpO1xcbitcXHRcXHRqc29ud191aW50X2ZpZWxkKGpzb25fd3RyLCBcXFwic2l6ZVxcXCIsIHNpemUpO1xcbitcXHRcXHRqc29ud19uYW1lKGpzb25fd3RyLCBcXFwiZGF0YVxcXCIpO1xcbitcXHRcXHRwcmludF9kYXRhX2pzb24oZGF0YSwgc2l6ZSk7XFxuK1xcdFxcdGpzb253X2VuZF9vYmplY3QoanNvbl93dHIpO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRwcmludGYoXFxcIj09IHNpemU6ICV6dSA9PT09PVxcXFxuXFxcIiwgc2l6ZSk7XFxuK1xcdFxcdGZwcmludF9oZXgoc3Rkb3V0LCBkYXRhLCBzaXplLCBcXFwiIFxcXCIpO1xcbitcXHRcXHRwcmludGYoXFxcIlxcXFxuXFxcIik7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChmZmx1c2goc3Rkb3V0KSlcXG4rXFx0XFx0cmV0dXJuIGVycm5vID8gLWVycm5vIDogLUVJTztcXG4rXFxuK1xcdC8qIEEgcHJvZHVjZXIgY2FuIGtlZXAgcG9sbCgpIGJ1c3kgZXZlbiBhZnRlciBhIHNpZ25hbCBhcnJpdmVzLiAqL1xcbitcXHRyZXR1cm4gc3RvcCA/IC1FSU5UUiA6IDA7XFxuK31cXG4rXFxuIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4ge1xcbiBcXHRzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIHBlcmZfYXR0ciA9IHtcXG5AQCAtMTIzLDE4ICsxNDMsMjYgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHQuY3B1ID0gLTEsXFxuIFxcdFxcdC5pZHggPSAtMSxcXG4gXFx0fTtcXG4tXFx0c3RydWN0IHBlcmZfYnVmZmVyICpwYjtcXG4rXFx0c3RydWN0IHBlcmZfYnVmZmVyICpwYiA9IE5VTEw7XFxuK1xcdHN0cnVjdCByaW5nX2J1ZmZlciAqcmIgPSBOVUxMO1xcbiBcXHRfX3UzMiBtYXBfaW5mb19sZW47XFxuIFxcdGludCBlcnIsIG1hcF9mZDtcXG4gXFxuK1xcdHN0b3AgPSBmYWxzZTtcXG4gXFx0bWFwX2luZm9fbGVuID0gc2l6ZW9mKG1hcF9pbmZvKTtcXG4gXFx0bWFwX2ZkID0gbWFwX3BhcnNlX2ZkX2FuZF9pbmZvKFxcdTAwMjZhcmdjLCBcXHUwMDI2YXJndiwgXFx1MDAyNm1hcF9pbmZvLCBcXHUwMDI2bWFwX2luZm9fbGVuLFxcbiBcXHRcXHRcXHRcXHQgICAgICAgMCk7XFxuIFxcdGlmIChtYXBfZmQgXFx1MDAzYyAwKVxcbiBcXHRcXHRyZXR1cm4gLTE7XFxuIFxcbi1cXHRpZiAobWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSkge1xcbi1cXHRcXHRwX2VycihcXFwibWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXlcXFwiKTtcXG4rXFx0aWYgKG1hcF9pbmZvLnR5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIG1hcF9pbmZvLnR5cGUgIT0gQlBGX01BUF9UWVBFX1JJTkdCVUYpIHtcXG4rXFx0XFx0cF9lcnIoXFxcIm1hcCBpcyBub3QgYSBwZXJmIGV2ZW50IGFycmF5IG9yIHJpbmcgYnVmZmVyXFxcIik7XFxuK1xcdFxcdGdvdG8gZXJyX2Nsb3NlX21hcDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKG1hcF9pbmZvLnR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgXFx1MDAyNlxcdTAwMjYgYXJnYykge1xcbitcXHRcXHRwX2VycihcXFwicmluZyBidWZmZXIgbWFwcyBkbyBub3Qgc3VwcG9ydCBjcHUgb3IgaW5kZXggYXJndW1lbnRzXFxcIik7XFxuIFxcdFxcdGdvdG8gZXJyX2Nsb3NlX21hcDtcXG4gXFx0fVxcbiBcXG5AQCAtMTg0LDE1ICsyMTIsMjQgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHRjdHguaWR4ID0gMDtcXG4gXFx0fVxcbiBcXG4tXFx0b3B0cy5jcHVfY250ID0gY3R4LmFsbF9jcHVzID8gMCA6IDE7XFxuLVxcdG9wdHMuY3B1cyA9IFxcdTAwMjZjdHguY3B1O1xcbi1cXHRvcHRzLm1hcF9rZXlzID0gXFx1MDAyNmN0eC5pZHg7XFxuLVxcdHBiID0gcGVyZl9idWZmZXJfX25ld19yYXcobWFwX2ZkLCBNTUFQX1BBR0VfQ05ULCBcXHUwMDI2cGVyZl9hdHRyLFxcbi1cXHRcXHRcXHRcXHQgIHByaW50X2JwZl9vdXRwdXQsIFxcdTAwMjZjdHgsIFxcdTAwMjZvcHRzKTtcXG4tXFx0aWYgKCFwYikge1xcbi1cXHRcXHRwX2VycihcXFwiZmFpbGVkIHRvIGNyZWF0ZSBwZXJmIGJ1ZmZlcjogJXMgKCVkKVxcXCIsXFxuLVxcdFxcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xcbi1cXHRcXHRnb3RvIGVycl9jbG9zZV9tYXA7XFxuK1xcdGlmIChtYXBfaW5mby50eXBlID09IEJQRl9NQVBfVFlQRV9SSU5HQlVGKSB7XFxuK1xcdFxcdHJiID0gcmluZ19idWZmZXJfX25ldyhtYXBfZmQsIHByaW50X3JpbmdidWZfb3V0cHV0LCBOVUxMLCBOVUxMKTtcXG4rXFx0XFx0aWYgKCFyYikge1xcbitcXHRcXHRcXHRwX2VycihcXFwiZmFpbGVkIHRvIGNyZWF0ZSByaW5nIGJ1ZmZlcjogJXMgKCVkKVxcXCIsXFxuK1xcdFxcdFxcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xcbitcXHRcXHRcXHRnb3RvIGVycl9jbG9zZV9tYXA7XFxuK1xcdFxcdH1cXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0b3B0cy5jcHVfY250ID0gY3R4LmFsbF9jcHVzID8gMCA6IDE7XFxuK1xcdFxcdG9wdHMuY3B1cyA9IFxcdTAwMjZjdHguY3B1O1xcbitcXHRcXHRvcHRzLm1hcF9rZXlzID0gXFx1MDAyNmN0eC5pZHg7XFxuK1xcdFxcdHBiID0gcGVyZl9idWZmZXJfX25ld19yYXcobWFwX2ZkLCBNTUFQX1BBR0VfQ05ULCBcXHUwMDI2cGVyZl9hdHRyLFxcbitcXHRcXHRcXHRcXHRcXHQgIHByaW50X2JwZl9vdXRwdXQsIFxcdTAwMjZjdHgsIFxcdTAwMjZvcHRzKTtcXG4rXFx0XFx0aWYgKCFwYikge1xcbitcXHRcXHRcXHRwX2VycihcXFwiZmFpbGVkIHRvIGNyZWF0ZSBwZXJmIGJ1ZmZlcjogJXMgKCVkKVxcXCIsXFxuK1xcdFxcdFxcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xcbitcXHRcXHRcXHRnb3RvIGVycl9jbG9zZV9tYXA7XFxuK1xcdFxcdH1cXG4gXFx0fVxcbiBcXG4gXFx0c2lnbmFsKFNJR0lOVCwgaW50X2V4aXQpO1xcbkBAIC0yMDIsMjUgKzIzOSwzMyBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdGlmIChqc29uX291dHB1dClcXG4gXFx0XFx0anNvbndfc3RhcnRfYXJyYXkoanNvbl93dHIpO1xcbiBcXG4rXFx0ZXJyID0gMDtcXG4gXFx0d2hpbGUgKCFzdG9wKSB7XFxuLVxcdFxcdGVyciA9IHBlcmZfYnVmZmVyX19wb2xsKHBiLCAyMDApO1xcbitcXHRcXHRlcnIgPSByYiA/IHJpbmdfYnVmZmVyX19wb2xsKHJiLCAyMDApIDogcGVyZl9idWZmZXJfX3BvbGwocGIsIDIwMCk7XFxuIFxcdFxcdGlmIChlcnIgXFx1MDAzYyAwIFxcdTAwMjZcXHUwMDI2IGVyciAhPSAtRUlOVFIpIHtcXG4tXFx0XFx0XFx0cF9lcnIoXFxcInBlcmYgYnVmZmVyIHBvbGxpbmcgZmFpbGVkOiAlcyAoJWQpXFxcIixcXG4tXFx0XFx0XFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XFxuLVxcdFxcdFxcdGdvdG8gZXJyX2Nsb3NlX3BiO1xcbitcXHRcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIkVycm9yOiAlcyBidWZmZXIgcG9sbGluZyBmYWlsZWQ6ICVzICglZClcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdHJiID8gXFxcInJpbmdcXFwiIDogXFxcInBlcmZcXFwiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHR9XFxuK1xcdFxcdGVyciA9IDA7XFxuIFxcdH1cXG4gXFxuK1xcdGlmIChzdG9wKVxcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIlN0b3BwaW5nLi4uXFxcXG5cXFwiKTtcXG4gXFx0aWYgKGpzb25fb3V0cHV0KVxcbiBcXHRcXHRqc29ud19lbmRfYXJyYXkoanNvbl93dHIpO1xcbitcXHRpZiAoZmZsdXNoKHN0ZG91dCkpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCJFcnJvcjogZmFpbGVkIHRvIHdyaXRlIGV2ZW50czogJXNcXFxcblxcXCIsIHN0cmVycm9yKGVycm5vKSk7XFxuK1xcdFxcdGVyciA9IC0xO1xcbitcXHR9XFxuIFxcbitcXHRyaW5nX2J1ZmZlcl9fZnJlZShyYik7XFxuIFxcdHBlcmZfYnVmZmVyX19mcmVlKHBiKTtcXG4rXFx0LyogQm90aCBidWZmZXIgbWFuYWdlcnMgYm9ycm93IG1hcF9mZC4gKi9cXG4gXFx0Y2xvc2UobWFwX2ZkKTtcXG4gXFxuLVxcdHJldHVybiAwO1xcbitcXHRyZXR1cm4gZXJyIFxcdTAwM2MgMCA/IC0xIDogMDtcXG4gXFxuLWVycl9jbG9zZV9wYjpcXG4tXFx0cGVyZl9idWZmZXJfX2ZyZWUocGIpO1xcbiBlcnJfY2xvc2VfbWFwOlxcbiBcXHRjbG9zZShtYXBfZmQpO1xcbiBcXHRyZXR1cm4gLTE7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjFhNGFlODhjMDVhMDdcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmNcXG5AQCAtMCwwICsxLDQyNSBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisjaW5jbHVkZSBcXHUwMDNjY3R5cGUuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2ZjbnRsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2Nwb2xsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzaWduYWwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9tbWFuLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvd2FpdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdGVzdF9wcm9ncy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXFwiYnBmdG9vbF9yaW5nYnVmLnNrZWwuaFxcXCJcXG4rXFxuKyNkZWZpbmUgV0FJVF9TVEVQUyA1MDBcXG4rI2RlZmluZSBXQUlUX1VTIDEwMDAwXFxuK1xcbitzdHJ1Y3QgY29uc3VtZXIge1xcbitcXHRwaWRfdCBwaWQ7XFxuK1xcdGludCBmZDtcXG4rfTtcXG4rXFxuK3N0YXRpYyBjb25zdCBjaGFyICpicGZ0b29sX3BhdGgodm9pZClcXG4re1xcbitcXHRjb25zdCBjaGFyICpwYXRoID0gZ2V0ZW52KFxcXCJCUEZUT09MXFxcIik7XFxuK1xcbitcXHRpZiAocGF0aClcXG4rXFx0XFx0cmV0dXJuIGFjY2VzcyhwYXRoLCBYX09LKSA/IE5VTEwgOiBwYXRoO1xcbitcXHRpZiAoIWFjY2VzcyhcXFwiLi90b29scy9zYmluL2JwZnRvb2xcXFwiLCBYX09LKSlcXG4rXFx0XFx0cmV0dXJuIFxcXCIuL3Rvb2xzL3NiaW4vYnBmdG9vbFxcXCI7XFxuK1xcdGlmICghYWNjZXNzKFxcXCIuLi90b29scy9zYmluL2JwZnRvb2xcXFwiLCBYX09LKSlcXG4rXFx0XFx0cmV0dXJuIFxcXCIuLi90b29scy9zYmluL2JwZnRvb2xcXFwiO1xcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY29uc3VtZXJfY2xlYW51cChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkKVxcbit7XFxuK1xcdGlmIChjaGlsZC1cXHUwMDNlcGlkIFxcdTAwM2UgMCkge1xcbitcXHRcXHRraWxsKGNoaWxkLVxcdTAwM2VwaWQsIFNJR0tJTEwpO1xcbitcXHRcXHR3aGlsZSAod2FpdHBpZChjaGlsZC1cXHUwMDNlcGlkLCBOVUxMLCAwKSBcXHUwMDNjIDAgXFx1MDAyNlxcdTAwMjYgZXJybm8gPT0gRUlOVFIpXFxuK1xcdFxcdFxcdDtcXG4rXFx0XFx0Y2hpbGQtXFx1MDAzZXBpZCA9IC0xO1xcbitcXHR9XFxuK1xcdGlmIChjaGlsZC1cXHUwMDNlZmQgXFx1MDAzZT0gMCkge1xcbitcXHRcXHRjbG9zZShjaGlsZC1cXHUwMDNlZmQpO1xcbitcXHRcXHRjaGlsZC1cXHUwMDNlZmQgPSAtMTtcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBjb25zdW1lcl9zdGFydChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkLCBpbnQgbWFwX2ZkLCBjb25zdCBjaGFyICpmb3JtYXQsXFxuK1xcdFxcdFxcdCAgIGNvbnN0IGNoYXIgKnBpbl9wYXRoLCBjb25zdCBjaGFyICpvcHRpb24sXFxuK1xcdFxcdFxcdCAgIGJvb2wgcGFpciwgYm9vbCBjYXB0dXJlX2Vycm9ycylcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcXG4rXFx0X191MzIgbGVuID0gc2l6ZW9mKGluZm8pO1xcbitcXHRjb25zdCBjaGFyICpwYXRoID0gYnBmdG9vbF9wYXRoKCk7XFxuK1xcdGNoYXIgKmFyZ3ZbMTJdLCBpZFsxNl07XFxuK1xcdGludCBvdXRbMl0sIHJlYWR5WzJdLCBuID0gMCwgZXJyLCBlcnJfZmQ7XFxuK1xcdHN0cnVjdCBwb2xsZmQgcGZkO1xcbitcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHBhdGgsIFxcXCJicGZ0b29sIHBhdGggKHNldCBCUEZUT09MIHRvIG92ZXJyaWRlKVxcXCIpIHx8XFxuK1xcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQobWFwX2ZkLCBcXHUwMDI2aW5mbywgXFx1MDAyNmxlbiksIFxcXCJtYXAgaW5mb1xcXCIpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdHNucHJpbnRmKGlkLCBzaXplb2YoaWQpLCBcXFwiJXVcXFwiLCBpbmZvLmlkKTtcXG4rXFx0YXJndltuKytdID0gKGNoYXIgKilwYXRoO1xcbitcXHRpZiAoZm9ybWF0KVxcbitcXHRcXHRhcmd2W24rK10gPSAoY2hhciAqKWZvcm1hdDtcXG4rXFx0YXJndltuKytdID0gXFxcIm1hcFxcXCI7XFxuK1xcdGFyZ3ZbbisrXSA9IFxcXCJldmVudF9waXBlXFxcIjtcXG4rXFx0YXJndltuKytdID0gcGluX3BhdGggPyBcXFwicGlubmVkXFxcIiA6IFxcXCJpZFxcXCI7XFxuK1xcdGFyZ3ZbbisrXSA9IHBpbl9wYXRoID8gKGNoYXIgKilwaW5fcGF0aCA6IGlkO1xcbitcXHRpZiAob3B0aW9uKSB7XFxuK1xcdFxcdGFyZ3ZbbisrXSA9IChjaGFyICopb3B0aW9uO1xcbitcXHRcXHRhcmd2W24rK10gPSBcXFwiMFxcXCI7XFxuK1xcdFxcdGlmIChwYWlyKSB7XFxuK1xcdFxcdFxcdGFyZ3ZbbisrXSA9IFxcXCJpbmRleFxcXCI7XFxuK1xcdFxcdFxcdGFyZ3ZbbisrXSA9IFxcXCIwXFxcIjtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdGFyZ3Zbbl0gPSBOVUxMO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhwaXBlMihvdXQsIE9fQ0xPRVhFQyksIFxcXCJvdXRwdXQgcGlwZVxcXCIpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdGlmICghQVNTRVJUX09LKHBpcGUyKHJlYWR5LCBPX0NMT0VYRUMpLCBcXFwiZXhlYyBwaXBlXFxcIikpIHtcXG4rXFx0XFx0Y2xvc2Uob3V0WzBdKTtcXG4rXFx0XFx0Y2xvc2Uob3V0WzFdKTtcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcdGNoaWxkLVxcdTAwM2VwaWQgPSBmb3JrKCk7XFxuK1xcdGlmICghY2hpbGQtXFx1MDAzZXBpZCkge1xcbitcXHRcXHRjbG9zZShvdXRbMF0pO1xcbitcXHRcXHRjbG9zZShyZWFkeVswXSk7XFxuK1xcdFxcdGVycl9mZCA9IGNhcHR1cmVfZXJyb3JzID8gb3V0WzFdIDogb3BlbihcXFwiL2Rldi9udWxsXFxcIiwgT19XUk9OTFkpO1xcbitcXHRcXHRpZiAoZHVwMihvdXRbMV0sIFNURE9VVF9GSUxFTk8pIFxcdTAwM2MgMCB8fFxcbitcXHRcXHQgICAgZHVwMihlcnJfZmQsIFNUREVSUl9GSUxFTk8pIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0Z290byBleGVjX2ZhaWw7XFxuK1xcdFxcdGlmICghY2FwdHVyZV9lcnJvcnMpXFxuK1xcdFxcdFxcdGNsb3NlKGVycl9mZCk7XFxuK1xcdFxcdGNsb3NlKG91dFsxXSk7XFxuK1xcdFxcdGV4ZWN2KHBhdGgsIGFyZ3YpO1xcbitleGVjX2ZhaWw6XFxuK1xcdFxcdGVyciA9IGVycm5vO1xcbitcXHRcXHR3cml0ZShyZWFkeVsxXSwgXFx1MDAyNmVyciwgc2l6ZW9mKGVycikpO1xcbitcXHRcXHRfZXhpdCgxMjcpO1xcbitcXHR9XFxuK1xcdGNsb3NlKG91dFsxXSk7XFxuK1xcdGNsb3NlKHJlYWR5WzFdKTtcXG4rXFx0Y2hpbGQtXFx1MDAzZWZkID0gb3V0WzBdO1xcbitcXHRwZmQgPSAoc3RydWN0IHBvbGxmZCkgeyAuZmQgPSByZWFkeVswXSwgLmV2ZW50cyA9IFBPTExJTiB9O1xcbitcXHQvKiBFT0Ygb24gdGhlIGNsb3NlLW9uLWV4ZWMgcGlwZSBkaXN0aW5ndWlzaGVzIGV4ZWMgZnJvbSBpbmhlcml0ZWQgaGFuZGxlcnMuICovXFxuK1xcdGVyciA9IGNoaWxkLVxcdTAwM2VwaWQgXFx1MDAzZSAwID8gcG9sbChcXHUwMDI2cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApIDogLTE7XFxuK1xcdGlmICghQVNTRVJUX0dUKGNoaWxkLVxcdTAwM2VwaWQsIDAsIFxcXCJmb3JrXFxcIikgfHxcXG4rXFx0ICAgICFBU1NFUlRfR1QoZXJyLCAwLCBcXFwiZXhlYyB0aW1lb3V0XFxcIikgfHxcXG4rXFx0ICAgICFBU1NFUlRfRVEocmVhZChyZWFkeVswXSwgXFx1MDAyNmVyciwgc2l6ZW9mKGVycikpLCAwLCBcXFwiZXhlY1xcXCIpKSB7XFxuK1xcdFxcdGNsb3NlKHJlYWR5WzBdKTtcXG4rXFx0XFx0Y29uc3VtZXJfY2xlYW51cChjaGlsZCk7XFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0fVxcbitcXHRjbG9zZShyZWFkeVswXSk7XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBjb25zdW1lcl9maW5pc2goc3RydWN0IGNvbnN1bWVyICpjaGlsZCwgaW50IHNpZ25vLCBib29sIHN1Y2Nlc3MsXFxuK1xcdFxcdFxcdCAgICBjaGFyICpvdXRwdXQsIHNpemVfdCBzaXplKVxcbit7XFxuK1xcdGludCBzdGF0dXMgPSAwLCBpO1xcbitcXHRwaWRfdCByZXQgPSAwO1xcbitcXHRzc2l6ZV90IG47XFxuK1xcdHNpemVfdCB1c2VkID0gMDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX09LKGZjbnRsKGNoaWxkLVxcdTAwM2VmZCwgRl9TRVRGTCwgT19OT05CTE9DSyksIFxcXCJub25ibG9ja2luZyBvdXRwdXRcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRpZiAoc2lnbm8gXFx1MDAyNlxcdTAwMjYgIUFTU0VSVF9PSyhraWxsKGNoaWxkLVxcdTAwM2VwaWQsIHNpZ25vKSwgXFxcInNpZ25hbCBjb25zdW1lclxcXCIpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBXQUlUX1NURVBTOyBpKyspIHtcXG4rXFx0XFx0d2hpbGUgKHVzZWQgXFx1MDAzYyBzaXplIC0gMSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgICAgKG4gPSByZWFkKGNoaWxkLVxcdTAwM2VmZCwgb3V0cHV0ICsgdXNlZCwgc2l6ZSAtIDEgLSB1c2VkKSkgXFx1MDAzZSAwKVxcbitcXHRcXHRcXHR1c2VkICs9IG47XFxuK1xcdFxcdHJldCA9IHdhaXRwaWQoY2hpbGQtXFx1MDAzZXBpZCwgXFx1MDAyNnN0YXR1cywgV05PSEFORyk7XFxuK1xcdFxcdGlmIChyZXQgPT0gY2hpbGQtXFx1MDAzZXBpZClcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGlmIChyZXQgXFx1MDAzYyAwIFxcdTAwMjZcXHUwMDI2IGVycm5vICE9IEVJTlRSKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0dXNsZWVwKFdBSVRfVVMpO1xcbitcXHR9XFxuK1xcdGlmICghQVNTRVJUX0VRKHJldCwgY2hpbGQtXFx1MDAzZXBpZCwgXFxcImJvdW5kZWQgY29uc3VtZXIgZXhpdFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdGNoaWxkLVxcdTAwM2VwaWQgPSAtMTtcXG4rXFx0d2hpbGUgKHVzZWQgXFx1MDAzYyBzaXplIC0gMSBcXHUwMDI2XFx1MDAyNiAobiA9IHJlYWQoY2hpbGQtXFx1MDAzZWZkLCBvdXRwdXQgKyB1c2VkLCBzaXplIC0gMSAtIHVzZWQpKSBcXHUwMDNlIDApXFxuK1xcdFxcdHVzZWQgKz0gbjtcXG4rXFx0b3V0cHV0W3VzZWRdID0gJ1xcXFwwJztcXG4rXFx0cmV0dXJuIEFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcXFwibm9ybWFsIGV4aXRcXFwiKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgICAgQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cykgPT0gMCwgc3VjY2VzcywgXFxcImV4aXQgc3RhdHVzXFxcIik7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGNvbnN1bWVyX3JlYWR5KHN0cnVjdCBjb25zdW1lciAqY2hpbGQpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBsb25nIGNhdWdodDtcXG4rXFx0Y2hhciBwYXRoWzY0XSwgbGluZVsyNTZdO1xcbitcXHRpbnQgaTtcXG4rXFx0RklMRSAqZjtcXG4rXFxuK1xcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXFxcIi9wcm9jLyVkL3N0YXR1c1xcXCIsIGNoaWxkLVxcdTAwM2VwaWQpO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgV0FJVF9TVEVQUzsgaSsrKSB7XFxuK1xcdFxcdGYgPSBmb3BlbihwYXRoLCBcXFwiclxcXCIpO1xcbitcXHRcXHRpZiAoIWYpXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmKSkge1xcbitcXHRcXHRcXHRpZiAoc3NjYW5mKGxpbmUsIFxcXCJTaWdDZ3Q6ICVsbHhcXFwiLCBcXHUwMDI2Y2F1Z2h0KSA9PSAxIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdFxcdCAgICAoY2F1Z2h0IFxcdTAwMjYgKDFVTEwgXFx1MDAzY1xcdTAwM2MgKFNJR0lOVCAtIDEpKSkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0XFx0ICAgIChjYXVnaHQgXFx1MDAyNiAoMVVMTCBcXHUwMDNjXFx1MDAzYyAoU0lHVEVSTSAtIDEpKSkpIHtcXG4rXFx0XFx0XFx0XFx0ZmNsb3NlKGYpO1xcbitcXHRcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuK1xcdFxcdGZjbG9zZShmKTtcXG4rXFx0XFx0dXNsZWVwKFdBSVRfVVMpO1xcbitcXHR9XFxuK1xcdHJldHVybiBBU1NFUlRfVFJVRShmYWxzZSwgXFxcImNvbnN1bWVyIHNpZ25hbCBoYW5kbGVycyByZWFkeVxcXCIpO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBlbWl0X3JlY29yZChzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsLCBpbnQgcmVjb3JkKVxcbit7XFxuK1xcdGNoYXIgcGFja2V0WzY0XSA9IHt9O1xcbitcXG4rXFx0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMsXFxuK1xcdFxcdCAgICAuZGF0YV9pbiA9IHBhY2tldCxcXG4rXFx0XFx0ICAgIC5kYXRhX3NpemVfaW4gPSBzaXplb2YocGFja2V0KSxcXG4rXFx0KTtcXG4rXFxuK1xcdHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjb3JkID0gcmVjb3JkO1xcbitcXHRyZXR1cm4gQVNTRVJUX09LKGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMoYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXFx1MDAzZXByb2dzLnByb2R1Y2UpLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBcXHUwMDI2b3B0cyksIFxcXCJwcm9kdWNlIHJlY29yZFxcXCIpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAgICBBU1NFUlRfT0soc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VvdXRwdXRfZXJyLCBcXFwicmluZ2J1ZiBvdXRwdXRcXFwiKTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgY29uc3VtZWQodW5zaWduZWQgbG9uZyAqcG9zaXRpb24sIHVuc2lnbmVkIGxvbmcgZXhwZWN0ZWQpXFxuK3tcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgV0FJVF9TVEVQUzsgaSsrKSB7XFxuK1xcdFxcdGlmIChfX2F0b21pY19sb2FkX24ocG9zaXRpb24sIF9fQVRPTUlDX0FDUVVJUkUpID09IGV4cGVjdGVkKVxcbitcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0XFx0dXNsZWVwKFdBSVRfVVMpO1xcbitcXHR9XFxuK1xcdHJldHVybiBBU1NFUlRfRVEoKnBvc2l0aW9uLCBleHBlY3RlZCwgXFxcImNvbnN1bWVyIHBvc2l0aW9uXFxcIik7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNoZWNrX2pzb24oY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICpleHBlY3RlZClcXG4re1xcbitcXHRjaGFyICpzcmMgPSBvdXRwdXQsICpkc3QgPSBvdXRwdXQ7XFxuK1xcdGJvb2wgcXVvdGVkID0gZmFsc2UsIGVzY2FwZWQgPSBmYWxzZTtcXG4rXFxuK1xcdC8qIElnbm9yZSBmb3JtYXR0aW5nIHdoaXRlc3BhY2Ugd2hpbGUgY2hlY2tpbmcgdGhlIGVudGlyZSBKU09OIGRvY3VtZW50LiAqL1xcbitcXHR3aGlsZSAoKnNyYykge1xcbitcXHRcXHRpZiAocXVvdGVkIHx8ICFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpzcmMpKVxcbitcXHRcXHRcXHQqZHN0KysgPSAqc3JjO1xcbitcXHRcXHRpZiAoIWVzY2FwZWQgXFx1MDAyNlxcdTAwMjYgKnNyYyA9PSAnXFxcIicpXFxuK1xcdFxcdFxcdHF1b3RlZCA9ICFxdW90ZWQ7XFxuK1xcdFxcdGVzY2FwZWQgPSAhZXNjYXBlZCBcXHUwMDI2XFx1MDAyNiBxdW90ZWQgXFx1MDAyNlxcdTAwMjYgKnNyYyA9PSAnXFxcXFxcXFwnO1xcbitcXHRcXHRzcmMrKztcXG4rXFx0fVxcbitcXHQqZHN0ID0gJ1xcXFwwJztcXG4rXFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFxcXCJKU09OIHJlY29yZHNcXFwiKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9jb25zdW1lcihjb25zdCBjaGFyICpmb3JtYXQsIGJvb2wgaWRsZSwgaW50IHNpZ25vLCBib29sIHBpbm5lZClcXG4re1xcbitcXHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcXG4rXFx0c3RydWN0IGJwZnRvb2xfcmluZ2J1ZiAqc2tlbDtcXG4rXFx0dW5zaWduZWQgbG9uZyAqcG9zaXRpb24gPSBNQVBfRkFJTEVEO1xcbitcXHRpbnQgcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKSwgZmQ7XFxuK1xcdGNoYXIgcGluX2RpcltdID0gXFxcIi9zeXMvZnMvYnBmL2JwZnRvb2xfcmluZ2J1Zl9YWFhYWFhcXFwiO1xcbitcXHRjaGFyIHBpbl9wYXRoW3NpemVvZihwaW5fZGlyKSArIHNpemVvZihcXFwiL21hcFxcXCIpXTtcXG4rXFx0Ym9vbCBkaXJfY3JlYXRlZCA9IGZhbHNlLCBtYXBfcGlubmVkID0gZmFsc2U7XFxuK1xcdGNoYXIgb3V0cHV0WzQwOTZdO1xcbitcXHRzdHJ1Y3QgcG9sbGZkIHBmZDtcXG4rXFxuK1xcdHNrZWwgPSBicGZ0b29sX3JpbmdidWZfX29wZW4oKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFxcXCJvcGVuXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0YnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtXFx1MDAzZW1hcHMucmluZ2J1ZiwgcGFnZV9zaXplKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soYnBmdG9vbF9yaW5nYnVmX19sb2FkKHNrZWwpLCBcXFwibG9hZFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZmQgPSBicGZfbWFwX19mZChza2VsLVxcdTAwM2VtYXBzLnJpbmdidWYpO1xcbitcXHRpZiAocGlubmVkKSB7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LX1BUUihta2R0ZW1wKHBpbl9kaXIpLCBcXFwiY3JlYXRlIHBpbiBkaXJlY3RvcnlcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdGRpcl9jcmVhdGVkID0gdHJ1ZTtcXG4rXFx0XFx0c25wcmludGYocGluX3BhdGgsIHNpemVvZihwaW5fcGF0aCksIFxcXCIlcy9tYXBcXFwiLCBwaW5fZGlyKTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0soYnBmX29ial9waW4oZmQsIHBpbl9wYXRoKSwgXFxcInBpbiByaW5nYnVmXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRtYXBfcGlubmVkID0gdHJ1ZTtcXG4rXFx0fVxcbitcXHRwb3NpdGlvbiA9IG1tYXAoTlVMTCwgcGFnZV9zaXplLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIGZkLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfTkVRKHBvc2l0aW9uLCBNQVBfRkFJTEVELCBcXFwiY29uc3VtZXIgbW1hcFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFpZGxlIFxcdTAwMjZcXHUwMDI2ICghZW1pdF9yZWNvcmQoc2tlbCwgMCkgfHwgIWVtaXRfcmVjb3JkKHNrZWwsIDEpKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghY29uc3VtZXJfc3RhcnQoXFx1MDAyNmNoaWxkLCBmZCwgZm9ybWF0LCBwaW5uZWQgPyBwaW5fcGF0aCA6IE5VTEwsXFxuK1xcdFxcdFxcdCAgICBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8XFxuK1xcdCAgICAhY29uc3VtZXJfcmVhZHkoXFx1MDAyNmNoaWxkKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghaWRsZSkge1xcbitcXHRcXHQvKiBCb3RoIHByZWZpbGxlZCByZWNvcmRzIG9jY3VweSAxNiBieXRlcyBpbmNsdWRpbmcgdGhlaXIgaGVhZGVycy4gKi9cXG4rXFx0XFx0aWYgKCFjb25zdW1lZChwb3NpdGlvbiwgMzIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0cGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gY2hpbGQuZmQsIC5ldmVudHMgPSBQT0xMSU4gfTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfR1QocG9sbChcXHUwMDI2cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApLCAwLFxcbitcXHRcXHRcXHQgICAgICAgXFxcInJlY29yZHMgZmx1c2hlZCBiZWZvcmUgZXhpdFxcXCIpIHx8XFxuK1xcdFxcdCAgICAhQVNTRVJUX1RSVUUocGZkLnJldmVudHMgXFx1MDAyNiBQT0xMSU4sIFxcXCJyZWNvcmQgb3V0cHV0IHJlYWRhYmxlXFxcIikgfHxcXG4rXFx0XFx0ICAgICFlbWl0X3JlY29yZChza2VsLCAyKSB8fCAhY29uc3VtZWQocG9zaXRpb24sIDY0KSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFx0aWYgKCFjb25zdW1lcl9maW5pc2goXFx1MDAyNmNoaWxkLCBzaWdubywgdHJ1ZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAoZm9ybWF0IFxcdTAwMjZcXHUwMDI2ICFzdHJjbXAoZm9ybWF0LCBcXFwiLXBcXFwiKSlcXG4rXFx0XFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgaWRsZSA/IFxcXCJbXVxcXFxuXFxcIiA6XFxuK1xcdFxcdFxcdCAgICAgXFxcIlt7XFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIiAgICAgICAgXFxcXFxcXCJzaXplXFxcXFxcXCI6IDIsXFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIiAgICAgICAgXFxcXFxcXCJkYXRhXFxcXFxcXCI6IFswLDI1NVxcXFxuXFxcIlxcbitcXHRcXHRcXHQgICAgIFxcXCIgICAgICAgIF1cXFxcblxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiICAgIH0se1xcXFxuXFxcIlxcbitcXHRcXHRcXHQgICAgIFxcXCIgICAgICAgIFxcXFxcXFwic2l6ZVxcXFxcXFwiOiA1LFxcXFxuXFxcIlxcbitcXHRcXHRcXHQgICAgIFxcXCIgICAgICAgIFxcXFxcXFwiZGF0YVxcXFxcXFwiOiBbMSwyLDMsNCw1XFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIiAgICAgICAgXVxcXFxuXFxcIlxcbitcXHRcXHRcXHQgICAgIFxcXCIgICAgfSx7XFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIiAgICAgICAgXFxcXFxcXCJzaXplXFxcXFxcXCI6IDE3LFxcXFxuXFxcIlxcbitcXHRcXHRcXHQgICAgIFxcXCIgICAgICAgIFxcXFxcXFwiZGF0YVxcXFxcXFwiOiBbMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzJcXFxcblxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiICAgICAgICBdXFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIiAgICB9XFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIl1cXFxcblxcXCIsIFxcXCJwcmV0dHkgSlNPTiByZWNvcmRzXFxcIik7XFxuK1xcdGVsc2UgaWYgKGZvcm1hdClcXG4rXFx0XFx0Y2hlY2tfanNvbihvdXRwdXQsIGlkbGUgPyBcXFwiW11cXFwiIDpcXG4rXFx0XFx0XFx0ICAgXFxcIlt7XFxcXFxcXCJzaXplXFxcXFxcXCI6MixcXFxcXFxcImRhdGFcXFxcXFxcIjpbMCwyNTVdfSxcXFwiXFxuK1xcdFxcdFxcdCAgIFxcXCJ7XFxcXFxcXCJzaXplXFxcXFxcXCI6NSxcXFxcXFxcImRhdGFcXFxcXFxcIjpbMSwyLDMsNCw1XX0sXFxcIlxcbitcXHRcXHRcXHQgICBcXFwie1xcXFxcXFwic2l6ZVxcXFxcXFwiOjE3LFxcXFxcXFwiZGF0YVxcXFxcXFwiOlsxNiwxNywxOCwxOSwyMCwyMSwyMiwyMyxcXFwiXFxuK1xcdFxcdFxcdCAgIFxcXCIyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMl19XVxcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGlkbGUgPyBcXFwiXFxcIiA6XFxuK1xcdFxcdFxcdCAgICAgXFxcIj09IHNpemU6IDIgPT09PT1cXFxcbjAwIGZmXFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIj09IHNpemU6IDUgPT09PT1cXFxcbjAxIDAyIDAzIDA0IDA1XFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIj09IHNpemU6IDE3ID09PT09XFxcXG4xMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAgXFxcIlxcbitcXHRcXHRcXHQgICAgIFxcXCIxOCAxOSAxYSAxYiAxYyAxZCAxZSAxZlxcXFxuMjBcXFxcblxcXCIsIFxcXCJwbGFpbiByZWNvcmRzXFxcIik7XFxuK291dDpcXG4rXFx0Y29uc3VtZXJfY2xlYW51cChcXHUwMDI2Y2hpbGQpO1xcbitcXHRpZiAocG9zaXRpb24gIT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0bXVubWFwKHBvc2l0aW9uLCBwYWdlX3NpemUpO1xcbitcXHRpZiAobWFwX3Bpbm5lZClcXG4rXFx0XFx0QVNTRVJUX09LKHVubGluayhwaW5fcGF0aCksIFxcXCJ1bnBpbiByaW5nYnVmXFxcIik7XFxuK1xcdGlmIChkaXJfY3JlYXRlZClcXG4rXFx0XFx0QVNTRVJUX09LKHJtZGlyKHBpbl9kaXIpLCBcXFwicmVtb3ZlIHBpbiBkaXJlY3RvcnlcXFwiKTtcXG4rXFx0YnBmdG9vbF9yaW5nYnVmX19kZXN0cm95KHNrZWwpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X3BlcmZfY29uc3VtZXIodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcXG4rXFx0dW5zaWduZWQgbG9uZyBsb25nIHNlY29uZHMsIG5hbm9zZWNvbmRzO1xcbitcXHRzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsO1xcbitcXHRjaGFyIG91dHB1dFsxNjM4NF0sIGV4cGVjdGVkWzE2Mzg0XTtcXG4rXFx0aW50IG5yX2NwdXMsIGNwdSwgaW5kZXgsIG9mZnNldCA9IDAsIGksIHVzZWQgPSAwLCBmaWVsZHM7XFxuK1xcdHN0cnVjdCBwb2xsZmQgcGZkO1xcbitcXG4rXFx0bnJfY3B1cyA9IGxpYmJwZl9udW1fcG9zc2libGVfY3B1cygpO1xcbitcXHRpZiAoIUFTU0VSVF9HVChucl9jcHVzLCAwLCBcXFwicG9zc2libGUgY3B1c1xcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdHNrZWwgPSBicGZ0b29sX3JpbmdidWZfX29wZW4oKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFxcXCJvcGVuXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0YnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtXFx1MDAzZW1hcHMucmluZ2J1ZiwgZ2V0cGFnZXNpemUoKSk7XFxuK1xcdGJwZl9tYXBfX3NldF9tYXhfZW50cmllcyhza2VsLVxcdTAwM2VtYXBzLnBlcmZidWYsIG5yX2NwdXMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhicGZ0b29sX3JpbmdidWZfX2xvYWQoc2tlbCksIFxcXCJsb2FkXFxcIikgfHxcXG4rXFx0ICAgICFjb25zdW1lcl9zdGFydChcXHUwMDI2Y2hpbGQsIGJwZl9tYXBfX2ZkKHNrZWwtXFx1MDAzZW1hcHMucGVyZmJ1ZiksIE5VTEwsXFxuK1xcdFxcdFxcdCAgICBOVUxMLCBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8ICFjb25zdW1lcl9yZWFkeShcXHUwMDI2Y2hpbGQpIHx8XFxuK1xcdCAgICAhZW1pdF9yZWNvcmQoc2tlbCwgMykpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHQvKiBPbmUgbGFyZ2UgcmVjb3JkIGZsdXNoZXMgdGhlIGV4aXN0aW5nIGJ1ZmZlcmVkIHBlcmYgb3V0cHV0IGNhbGxiYWNrLiAqL1xcbitcXHRwZmQgPSAoc3RydWN0IHBvbGxmZCkgeyAuZmQgPSBjaGlsZC5mZCwgLmV2ZW50cyA9IFBPTExJTiB9O1xcbitcXHRpZiAoIUFTU0VSVF9HVChwb2xsKFxcdTAwMjZwZmQsIDEsIFdBSVRfU1RFUFMgKiBXQUlUX1VTIC8gMTAwMCksIDAsXFxuK1xcdFxcdCAgICAgICBcXFwicGVyZiByZWNvcmQgb3V0cHV0XFxcIikgfHxcXG4rXFx0ICAgICFBU1NFUlRfVFJVRShwZmQucmV2ZW50cyBcXHUwMDI2IFBPTExJTiwgXFxcInBlcmYgb3V0cHV0IHJlYWRhYmxlXFxcIikgfHxcXG4rXFx0ICAgICFjb25zdW1lcl9maW5pc2goXFx1MDAyNmNoaWxkLCBTSUdJTlQsIHRydWUsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZmllbGRzID0gc3NjYW5mKG91dHB1dCwgXFxcIj09IEAlbGx1LiVsbHUgQ1BVOiAlZCBpbmRleDogJWQgPT09PT1cXFxcbiVuXFxcIixcXG4rXFx0XFx0XFx0XFx1MDAyNnNlY29uZHMsIFxcdTAwMjZuYW5vc2Vjb25kcywgXFx1MDAyNmNwdSwgXFx1MDAyNmluZGV4LCBcXHUwMDI2b2Zmc2V0KTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoZmllbGRzLCA0LCBcXFwicGVyZiBoZWFkZXJcXFwiKSB8fFxcbitcXHQgICAgIUFTU0VSVF9HVChvZmZzZXQsIDAsIFxcXCJwZXJmIHBheWxvYWQgb2Zmc2V0XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRBU1NFUlRfR1Qoc2Vjb25kcyAqIDEwMDAwMDAwMDBVTEwgKyBuYW5vc2Vjb25kcywgMCwgXFxcInBlcmYgdGltZXN0YW1wXFxcIik7XFxuK1xcdEFTU0VSVF9MVChuYW5vc2Vjb25kcywgMTAwMDAwMDAwMFVMTCwgXFxcInBlcmYgdGltZXN0YW1wIG5hbm9zZWNvbmRzXFxcIik7XFxuK1xcdEFTU0VSVF9HRShjcHUsIDAsIFxcXCJwZXJmIGNwdVxcXCIpO1xcbitcXHRBU1NFUlRfTFQoY3B1LCBucl9jcHVzLCBcXFwicGVyZiBjcHUgcmFuZ2VcXFwiKTtcXG4rXFx0QVNTRVJUX0VRKGluZGV4LCBjcHUsIFxcXCJwZXJmIGluZGV4XFxcIik7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBzaXplb2Yoc2tlbC1cXHUwMDNlcm9kYXRhLVxcdTAwM2VwZXJmX3BheWxvYWQpOyBpKyspIHtcXG4rXFx0XFx0Y29uc3QgY2hhciAqc2VwYXJhdG9yID0gIWkgPyBcXFwiXFxcIiA6ICEoaSAlIDE2KSA/IFxcXCJcXFxcblxcXCIgOlxcbitcXHRcXHRcXHRcXHRcXHQhKGkgJSA4KSA/IFxcXCIgIFxcXCIgOiBcXFwiIFxcXCI7XFxuK1xcbitcXHRcXHR1c2VkICs9IHNucHJpbnRmKGV4cGVjdGVkICsgdXNlZCwgc2l6ZW9mKGV4cGVjdGVkKSAtIHVzZWQsXFxuK1xcdFxcdFxcdFxcdCBcXFwiJXMlMDJ4XFxcIiwgc2VwYXJhdG9yLCBpID09IDEgPyAweGZmIDogMCk7XFxuK1xcdH1cXG4rXFx0c25wcmludGYoZXhwZWN0ZWQgKyB1c2VkLCBzaXplb2YoZXhwZWN0ZWQpIC0gdXNlZCwgXFxcIlxcXFxuXFxcIik7XFxuK1xcdEFTU0VSVF9TVFJFUShvdXRwdXQgKyBvZmZzZXQsIGV4cGVjdGVkLCBcXFwicGVyZiBwYXlsb2FkXFxcIik7XFxuK291dDpcXG4rXFx0Y29uc3VtZXJfY2xlYW51cChcXHUwMDI2Y2hpbGQpO1xcbitcXHRicGZ0b29sX3JpbmdidWZfX2Rlc3Ryb3koc2tlbCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfcmVqZWN0KGVudW0gYnBmX21hcF90eXBlIHR5cGUsIGNvbnN0IGNoYXIgKm9wdGlvbiwgYm9vbCBwYWlyLCBib29sIGpzb24pXFxuK3tcXG4rXFx0c3RydWN0IGNvbnN1bWVyIGNoaWxkID0geyAucGlkID0gLTEsIC5mZCA9IC0xIH07XFxuK1xcdGJvb2wgcmluZyA9IHR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgfHwgdHlwZSA9PSBCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGO1xcbitcXHRjb25zdCBjaGFyICpleHBlY3RlZCA9IG9wdGlvbiA/XFxuK1xcdFxcdFxcXCJ7XFxcXFxcXCJlcnJvclxcXFxcXFwiOlxcXFxcXFwicmluZyBidWZmZXIgbWFwcyBkbyBub3Qgc3VwcG9ydCBjcHUgb3IgaW5kZXggYXJndW1lbnRzXFxcXFxcXCJ9XFxcIiA6XFxuK1xcdFxcdFxcXCJ7XFxcXFxcXCJlcnJvclxcXFxcXFwiOlxcXFxcXFwibWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcXFxcXFxcIn1cXFwiO1xcbitcXHRjaGFyIG91dHB1dFs0MDk2XTtcXG4rXFx0aW50IGZkO1xcbitcXG4rXFx0ZmQgPSBicGZfbWFwX2NyZWF0ZSh0eXBlLCBOVUxMLCByaW5nID8gMCA6IDQsIHJpbmcgPyAwIDogNCxcXG4rXFx0XFx0XFx0ICAgIHJpbmcgPyBnZXRwYWdlc2l6ZSgpIDogMSwgTlVMTCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwiY3JlYXRlIG1hcFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGlmIChjb25zdW1lcl9zdGFydChcXHUwMDI2Y2hpbGQsIGZkLCBqc29uID8gXFxcIi1qXFxcIiA6IE5VTEwsIE5VTEwsIG9wdGlvbiwgcGFpciwgdHJ1ZSkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIGNvbnN1bWVyX2ZpbmlzaChcXHUwMDI2Y2hpbGQsIDAsIGZhbHNlLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpKSkge1xcbitcXHRcXHRpZiAoanNvbilcXG4rXFx0XFx0XFx0Y2hlY2tfanNvbihvdXRwdXQsIGV4cGVjdGVkKTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRBU1NFUlRfR1Qoc3RybGVuKG91dHB1dCksIDAsIFxcXCJlcnJvciBkaWFnbm9zdGljXFxcIik7XFxuK1xcdH1cXG4rXFx0Y29uc3VtZXJfY2xlYW51cChcXHUwMDI2Y2hpbGQpO1xcbitcXHRjbG9zZShmZCk7XFxuK31cXG4rXFxuK3ZvaWQgdGVzdF9icGZ0b29sX3JpbmdidWYodm9pZClcXG4re1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicGVyZl9ldmVudF9hcnJheVxcXCIpKVxcbitcXHRcXHR0ZXN0X3BlcmZfY29uc3VtZXIoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInBsYWluXFxcIikpXFxuK1xcdFxcdHRlc3RfY29uc3VtZXIoTlVMTCwgZmFsc2UsIFNJR0lOVCwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwianNvblxcXCIpKVxcbitcXHRcXHR0ZXN0X2NvbnN1bWVyKFxcXCItalxcXCIsIGZhbHNlLCBTSUdURVJNLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJwcmV0dHlfanNvblxcXCIpKVxcbitcXHRcXHR0ZXN0X2NvbnN1bWVyKFxcXCItcFxcXCIsIGZhbHNlLCBTSUdJTlQsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInBpbm5lZF9wbGFpblxcXCIpKVxcbitcXHRcXHR0ZXN0X2NvbnN1bWVyKE5VTEwsIGZhbHNlLCBTSUdURVJNLCB0cnVlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInBpbm5lZF9qc29uXFxcIikpXFxuK1xcdFxcdHRlc3RfY29uc3VtZXIoXFxcIi1qXFxcIiwgZmFsc2UsIFNJR0lOVCwgdHJ1ZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJwaW5uZWRfcHJldHR5X2pzb25cXFwiKSlcXG4rXFx0XFx0dGVzdF9jb25zdW1lcihcXFwiLXBcXFwiLCBmYWxzZSwgU0lHVEVSTSwgdHJ1ZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJpZGxlX3NpZ2ludFxcXCIpKVxcbitcXHRcXHR0ZXN0X2NvbnN1bWVyKE5VTEwsIHRydWUsIFNJR0lOVCwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiaWRsZV9zaWd0ZXJtX2pzb25cXFwiKSlcXG4rXFx0XFx0dGVzdF9jb25zdW1lcihcXFwiLWpcXFwiLCB0cnVlLCBTSUdURVJNLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJpZGxlX3NpZ2ludF9wcmV0dHlfanNvblxcXCIpKVxcbitcXHRcXHR0ZXN0X2NvbnN1bWVyKFxcXCItcFxcXCIsIHRydWUsIFNJR0lOVCwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicmVqZWN0X2FycmF5XFxcIikpXFxuK1xcdFxcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9BUlJBWSwgTlVMTCwgZmFsc2UsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInJlamVjdF91c2VyX3JpbmdidWZcXFwiKSlcXG4rXFx0XFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRiwgTlVMTCwgZmFsc2UsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInJlamVjdF9jcHVcXFwiKSlcXG4rXFx0XFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFxcXCJjcHVcXFwiLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicmVqZWN0X2luZGV4XFxcIikpXFxuK1xcdFxcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCBcXFwiaW5kZXhcXFwiLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicmVqZWN0X2NwdV9pbmRleFxcXCIpKVxcbitcXHRcXHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXFxcImNwdVxcXCIsIHRydWUsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInJlamVjdF91c2VyX3JpbmdidWZfanNvblxcXCIpKVxcbitcXHRcXHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGLCBOVUxMLCBmYWxzZSwgdHJ1ZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyZWplY3RfY3B1X2luZGV4X2pzb25cXFwiKSlcXG4rXFx0XFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFxcXCJjcHVcXFwiLCB0cnVlLCB0cnVlKTtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmJiYmM5M2MzMGE4MzNcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jXFxuQEAgLTAsMCArMSw0NyBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnBmLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFxcdTAwM2VcXG4rXFxuK3N0cnVjdCB7XFxuK1xcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUklOR0JVRik7XFxuK30gcmluZ2J1ZiBTRUMoXFxcIi5tYXBzXFxcIik7XFxuK1xcbitzdHJ1Y3Qge1xcbitcXHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkpO1xcbitcXHRfX3VpbnQoa2V5X3NpemUsIHNpemVvZihfX3UzMikpO1xcbitcXHRfX3VpbnQodmFsdWVfc2l6ZSwgc2l6ZW9mKF9fdTMyKSk7XFxuK1xcdF9fdWludChtYXhfZW50cmllcywgMSk7XFxuK30gcGVyZmJ1ZiBTRUMoXFxcIi5tYXBzXFxcIik7XFxuK1xcbisvKlxcbisgKiBJbmNsdWRlIHRoZSB1MzIgcmF3IHNpemUgaW4gcGVyZidzIDgtYnl0ZSBhbGlnbm1lbnQgdG8gYXZvaWQgcGFkZGluZy5cXG4rICogS2VlcCBwbGFpbiBvdXRwdXQgbGFyZ2UgZW5vdWdoIHRvIGZsdXNoIHN0ZGlvIGJlZm9yZSB0aGUgY29uc3VtZXIgZXhpdHMuXFxuKyAqL1xcbitjb25zdCB1bnNpZ25lZCBjaGFyIHBlcmZfcGF5bG9hZFs0MDkyXSA9IHsgMHgwMCwgMHhmZiB9O1xcbitcXG4raW50IHJlY29yZDtcXG4raW50IG91dHB1dF9lcnI7XFxuK1xcbitTRUMoXFxcInNvY2tldFxcXCIpXFxuK2ludCBwcm9kdWNlKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYilcXG4re1xcbitcXHR1bnNpZ25lZCBjaGFyIGZpcnN0W10gPSB7IDB4MDAsIDB4ZmYgfTtcXG4rXFx0dW5zaWduZWQgY2hhciBzZWNvbmRbXSA9IHsgMSwgMiwgMywgNCwgNSB9O1xcbitcXHR1bnNpZ25lZCBjaGFyIHRoaXJkW10gPSB7XFxuK1xcdFxcdDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsXFxuK1xcdFxcdDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsXFxuK1xcdH07XFxuK1xcbitcXHRpZiAocmVjb3JkID09IDApXFxuK1xcdFxcdG91dHB1dF9lcnIgPSBicGZfcmluZ2J1Zl9vdXRwdXQoXFx1MDAyNnJpbmdidWYsIGZpcnN0LCBzaXplb2YoZmlyc3QpLCAwKTtcXG4rXFx0ZWxzZSBpZiAocmVjb3JkID09IDEpXFxuK1xcdFxcdG91dHB1dF9lcnIgPSBicGZfcmluZ2J1Zl9vdXRwdXQoXFx1MDAyNnJpbmdidWYsIHNlY29uZCwgc2l6ZW9mKHNlY29uZCksIDApO1xcbitcXHRlbHNlIGlmIChyZWNvcmQgPT0gMilcXG4rXFx0XFx0b3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dChcXHUwMDI2cmluZ2J1ZiwgdGhpcmQsIHNpemVvZih0aGlyZCksIDApO1xcbitcXHRlbHNlXFxuK1xcdFxcdG91dHB1dF9lcnIgPSBicGZfcGVyZl9ldmVudF9vdXRwdXQoc2tiLCBcXHUwMDI2cGVyZmJ1ZiwgQlBGX0ZfQ1VSUkVOVF9DUFUsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICh2b2lkICopcGVyZl9wYXlsb2FkLCBzaXplb2YocGVyZl9wYXlsb2FkKSk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitjaGFyIExJQ0VOU0VbXSBTRUMoXFxcImxpY2Vuc2VcXFwiKSA9IFxcXCJHUExcXFwiO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwMzowMDowMi44ODM5MjU1MDNaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjEyNDA4OTgzNDE3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBjaGFuZ2VzIGFyZSBzdHJpY3RseSBsaW1pdGVkIHRvIHVzZXItc3BhY2UgdXRpbGl0aWVzIChicGZ0b29sIHVuZGVyIHRvb2xzL2JwZi9icGZ0b29sLykgYW5kIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLykuIE5vIGtlcm5lbC1zcGFjZSBjb2RlIG9yIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eC9tb2R1bGVzKSBpcyBtb2RpZmllZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZDNhZTNkOWUzNTVlYjg2MGRiNmRhN2VmMzNlMTQ3NTlmNmI2NThjN1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgU2VwIDExIDAzOjAwOjAxIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuaW5kZXggNWRhZjNkZTVjNzQ0Ni4uZTRlZDdlNzAxYzllNCAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG4rKysgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuQEAgLTEyMCw3ICsxMjAsOCBAQCBicGZ0b29sIG1hcCBwaW4gICAgICpNQVAqICAqRklMRSpcbiAgICAgY2hhcmFjdGVyICgnLicpLCB3aGljaCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgb2YgKmJwZmZzKi5cbiBcbiBicGZ0b29sIG1hcCBldmVudF9waXBlICpNQVAqIFtjcHUgKk4qIGluZGV4ICpNKl1cbi0gICAgUmVhZCBldmVudHMgZnJvbSBhICoqQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkqKiBtYXAuXG4rICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogb3JcbisgICAgKipCUEZfTUFQX1RZUEVfUklOR0JVRioqIG1hcC5cbiBcbiAgICAgSW5zdGFsbCBwZXJmIHJpbmdzIGludG8gYSBwZXJmIGV2ZW50IGFycmF5IG1hcCBhbmQgZHVtcCBvdXRwdXQgb2YgYW55XG4gICAgICoqYnBmX3BlcmZfZXZlbnRfb3V0cHV0KipcXCAoKSBjYWxsIGluIHRoZSBrZXJuZWwuIEJ5IGRlZmF1bHQgcmVhZCB0aGVcbkBAIC0xMzQsNiArMTM1LDE3IEBAIGJwZnRvb2wgbWFwIGV2ZW50X3BpcGUgKk1BUCogW2NwdSAqTiogaW5kZXggKk0qXVxuICAgICBleGlzdGluZyByaW5nLiAgQW55IG90aGVyIGFwcGxpY2F0aW9uIHdpbGwgc3RvcCByZWNlaXZpbmcgZXZlbnRzIGlmIGl0XG4gICAgIGluc3RhbGxlZCBpdHMgcmluZ3MgZWFybGllci5cbiBcbisgICAgRm9yIGEgcmluZyBidWZmZXIgbWFwLCBjb25zdW1lIHJlY29yZHMgc3VibWl0dGVkIGJ5IEJQRiBwcm9ncmFtcywgaW5jbHVkaW5nXG4rICAgIHJlY29yZHMgYWxyZWFkeSBxdWV1ZWQgYmVmb3JlIHRoZSBjb21tYW5kIHN0YXJ0cy4gKipjcHUqKiBhbmQgKippbmRleCoqXG4rICAgIGFyZSBub3Qgc3VwcG9ydGVkLiBFYWNoIHJlY29yZCBpcyBwcmludGVkIGluIGZ1bGwsIGluY2x1ZGluZyBlbWJlZGRlZCB6ZXJvXG4rICAgIGJ5dGVzLiBQbGFpbiBvdXRwdXQgcmVwb3J0cyB0aGUgcmVjb3JkIHNpemUgZm9sbG93ZWQgYnkgaGV4YWRlY2ltYWxcbisgICAgYnl0ZXM7IEpTT04gb3V0cHV0IGNvbnRhaW5zICoqc2l6ZSoqIGFuZCAqKmRhdGEqKiBmaWVsZHMsIHdpdGggKipkYXRhKiogYW5cbisgICAgYXJyYXkgb2YgYnl0ZSB2YWx1ZXMuIFJpbmcgYnVmZmVyIHJlY29yZHMgaGF2ZSBubyBpbXBsaWNpdCBDUFUgb3IgdGltZXN0YW1wLlxuK1xuKyAgICBDb25zdW1pbmcgYSByaW5nIGJ1ZmZlciBhZHZhbmNlcyBpdHMgc2hhcmVkIGNvbnN1bWVyIHBvc2l0aW9uLCBzbyB0aGlzXG4rICAgIGNvbW1hbmQgbXVzdCBub3QgcnVuIGFsb25nc2lkZSBhbm90aGVyIGNvbnN1bWVyIG9mIHRoZSBzYW1lIG1hcC5cbisgICAgKipCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGKiogbWFwcyBhcmUgbm90IHN1cHBvcnRlZC5cbitcbiBicGZ0b29sIG1hcCBwZWVrICAqTUFQKlxuICAgICBQZWVrIG5leHQgdmFsdWUgaW4gdGhlIHF1ZXVlIG9yIHN0YWNrLlxuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbmluZGV4IDc1Y2JjYjUxMmViYWUuLjE3NTBiNDg4YzllM2IgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbkBAIC04NzgsMTEgKzg3OCwxMSBAQCBfYnBmdG9vbCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgaWQpXG4tICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfaWRzX2Zvcl90eXBlIHBlcmZfZXZlbnRfYXJyYXlcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9pZHNfZm9yX3R5cGUgJ1widHlwZVwiOiBcIlxcKHBlcmZfZXZlbnRfYXJyYXlcXHxyaW5nYnVmXFwpXCInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSlcbi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9uYW1lc19mb3JfdHlwZSBwZXJmX2V2ZW50X2FycmF5XG4rICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfbmFtZXNfZm9yX3R5cGUgJ1widHlwZVwiOiBcIlxcKHBlcmZfZXZlbnRfYXJyYXlcXHxyaW5nYnVmXFwpXCInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgY3B1KVxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xuaW5kZXggYmNiNzY3ZTJkNjczMy4uN2Q1NTUzMzFmNDQzYSAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jXG5AQCAtMjcsNyArMjcsNyBAQFxuIFxuICNkZWZpbmUgTU1BUF9QQUdFX0NOVFx0MTZcbiBcbi1zdGF0aWMgdm9sYXRpbGUgYm9vbCBzdG9wO1xuK3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3Qgc3RvcDtcbiBcbiBzdHJ1Y3QgcGVyZl9ldmVudF9zYW1wbGUge1xuIFx0c3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyIGhlYWRlcjtcbkBAIC00NCw3ICs0NCw2IEBAIHN0cnVjdCBwZXJmX2V2ZW50X2xvc3Qge1xuIFxuIHN0YXRpYyB2b2lkIGludF9leGl0KGludCBzaWdubylcbiB7XG4tXHRmcHJpbnRmKHN0ZGVyciwgXCJTdG9wcGluZy4uLlxcblwiKTtcbiBcdHN0b3AgPSB0cnVlO1xuIH1cbiBcbkBAIC0xMDcsNiArMTA2LDI3IEBAIHByaW50X2JwZl9vdXRwdXQodm9pZCAqcHJpdmF0ZV9kYXRhLCBpbnQgY3B1LCBzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgKmV2ZW50KVxuIFx0cmV0dXJuIExJQkJQRl9QRVJGX0VWRU5UX0NPTlQ7XG4gfVxuIFxuK3N0YXRpYyBpbnQgcHJpbnRfcmluZ2J1Zl9vdXRwdXQodm9pZCAqY3R4LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSlcbit7XG4rXHRpZiAoanNvbl9vdXRwdXQpIHtcbitcdFx0anNvbndfc3RhcnRfb2JqZWN0KGpzb25fd3RyKTtcbitcdFx0anNvbndfdWludF9maWVsZChqc29uX3d0ciwgXCJzaXplXCIsIHNpemUpO1xuK1x0XHRqc29ud19uYW1lKGpzb25fd3RyLCBcImRhdGFcIik7XG4rXHRcdHByaW50X2RhdGFfanNvbihkYXRhLCBzaXplKTtcbitcdFx0anNvbndfZW5kX29iamVjdChqc29uX3d0cik7XG4rXHR9IGVsc2Uge1xuK1x0XHRwcmludGYoXCI9PSBzaXplOiAlenUgPT09PT1cXG5cIiwgc2l6ZSk7XG4rXHRcdGZwcmludF9oZXgoc3Rkb3V0LCBkYXRhLCBzaXplLCBcIiBcIik7XG4rXHRcdHByaW50ZihcIlxcblwiKTtcbitcdH1cbitcbitcdGlmIChmZmx1c2goc3Rkb3V0KSlcbitcdFx0cmV0dXJuIGVycm5vID8gLWVycm5vIDogLUVJTztcbitcbitcdC8qIEEgcHJvZHVjZXIgY2FuIGtlZXAgcG9sbCgpIGJ1c3kgZXZlbiBhZnRlciBhIHNpZ25hbCBhcnJpdmVzLiAqL1xuK1x0cmV0dXJuIHN0b3AgPyAtRUlOVFIgOiAwO1xuK31cbitcbiBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4ge1xuIFx0c3RydWN0IHBlcmZfZXZlbnRfYXR0ciBwZXJmX2F0dHIgPSB7XG5AQCAtMTIzLDE4ICsxNDMsMjYgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHQuY3B1ID0gLTEsXG4gXHRcdC5pZHggPSAtMSxcbiBcdH07XG4tXHRzdHJ1Y3QgcGVyZl9idWZmZXIgKnBiO1xuK1x0c3RydWN0IHBlcmZfYnVmZmVyICpwYiA9IE5VTEw7XG4rXHRzdHJ1Y3QgcmluZ19idWZmZXIgKnJiID0gTlVMTDtcbiBcdF9fdTMyIG1hcF9pbmZvX2xlbjtcbiBcdGludCBlcnIsIG1hcF9mZDtcbiBcbitcdHN0b3AgPSBmYWxzZTtcbiBcdG1hcF9pbmZvX2xlbiA9IHNpemVvZihtYXBfaW5mbyk7XG4gXHRtYXBfZmQgPSBtYXBfcGFyc2VfZmRfYW5kX2luZm8oXHUwMDI2YXJnYywgXHUwMDI2YXJndiwgXHUwMDI2bWFwX2luZm8sIFx1MDAyNm1hcF9pbmZvX2xlbixcbiBcdFx0XHRcdCAgICAgICAwKTtcbiBcdGlmIChtYXBfZmQgXHUwMDNjIDApXG4gXHRcdHJldHVybiAtMTtcbiBcbi1cdGlmIChtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKSB7XG4tXHRcdHBfZXJyKFwibWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXlcIik7XG4rXHRpZiAobWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSBcdTAwMjZcdTAwMjZcbitcdCAgICBtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9SSU5HQlVGKSB7XG4rXHRcdHBfZXJyKFwibWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcIik7XG4rXHRcdGdvdG8gZXJyX2Nsb3NlX21hcDtcbitcdH1cbitcbitcdGlmIChtYXBfaW5mby50eXBlID09IEJQRl9NQVBfVFlQRV9SSU5HQlVGIFx1MDAyNlx1MDAyNiBhcmdjKSB7XG4rXHRcdHBfZXJyKFwicmluZyBidWZmZXIgbWFwcyBkbyBub3Qgc3VwcG9ydCBjcHUgb3IgaW5kZXggYXJndW1lbnRzXCIpO1xuIFx0XHRnb3RvIGVycl9jbG9zZV9tYXA7XG4gXHR9XG4gXG5AQCAtMTg0LDE1ICsyMTIsMjQgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRjdHguaWR4ID0gMDtcbiBcdH1cbiBcbi1cdG9wdHMuY3B1X2NudCA9IGN0eC5hbGxfY3B1cyA/IDAgOiAxO1xuLVx0b3B0cy5jcHVzID0gXHUwMDI2Y3R4LmNwdTtcbi1cdG9wdHMubWFwX2tleXMgPSBcdTAwMjZjdHguaWR4O1xuLVx0cGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsIFx1MDAyNnBlcmZfYXR0cixcbi1cdFx0XHRcdCAgcHJpbnRfYnBmX291dHB1dCwgXHUwMDI2Y3R4LCBcdTAwMjZvcHRzKTtcbi1cdGlmICghcGIpIHtcbi1cdFx0cF9lcnIoXCJmYWlsZWQgdG8gY3JlYXRlIHBlcmYgYnVmZmVyOiAlcyAoJWQpXCIsXG4tXHRcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xuLVx0XHRnb3RvIGVycl9jbG9zZV9tYXA7XG4rXHRpZiAobWFwX2luZm8udHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRikge1xuK1x0XHRyYiA9IHJpbmdfYnVmZmVyX19uZXcobWFwX2ZkLCBwcmludF9yaW5nYnVmX291dHB1dCwgTlVMTCwgTlVMTCk7XG4rXHRcdGlmICghcmIpIHtcbitcdFx0XHRwX2VycihcImZhaWxlZCB0byBjcmVhdGUgcmluZyBidWZmZXI6ICVzICglZClcIixcbitcdFx0XHQgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTtcbitcdFx0XHRnb3RvIGVycl9jbG9zZV9tYXA7XG4rXHRcdH1cbitcdH0gZWxzZSB7XG4rXHRcdG9wdHMuY3B1X2NudCA9IGN0eC5hbGxfY3B1cyA/IDAgOiAxO1xuK1x0XHRvcHRzLmNwdXMgPSBcdTAwMjZjdHguY3B1O1xuK1x0XHRvcHRzLm1hcF9rZXlzID0gXHUwMDI2Y3R4LmlkeDtcbitcdFx0cGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsIFx1MDAyNnBlcmZfYXR0cixcbitcdFx0XHRcdFx0ICBwcmludF9icGZfb3V0cHV0LCBcdTAwMjZjdHgsIFx1MDAyNm9wdHMpO1xuK1x0XHRpZiAoIXBiKSB7XG4rXHRcdFx0cF9lcnIoXCJmYWlsZWQgdG8gY3JlYXRlIHBlcmYgYnVmZmVyOiAlcyAoJWQpXCIsXG4rXHRcdFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XG4rXHRcdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuK1x0XHR9XG4gXHR9XG4gXG4gXHRzaWduYWwoU0lHSU5ULCBpbnRfZXhpdCk7XG5AQCAtMjAyLDI1ICsyMzksMzMgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0aWYgKGpzb25fb3V0cHV0KVxuIFx0XHRqc29ud19zdGFydF9hcnJheShqc29uX3d0cik7XG4gXG4rXHRlcnIgPSAwO1xuIFx0d2hpbGUgKCFzdG9wKSB7XG4tXHRcdGVyciA9IHBlcmZfYnVmZmVyX19wb2xsKHBiLCAyMDApO1xuK1x0XHRlcnIgPSByYiA/IHJpbmdfYnVmZmVyX19wb2xsKHJiLCAyMDApIDogcGVyZl9idWZmZXJfX3BvbGwocGIsIDIwMCk7XG4gXHRcdGlmIChlcnIgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVyciAhPSAtRUlOVFIpIHtcbi1cdFx0XHRwX2VycihcInBlcmYgYnVmZmVyIHBvbGxpbmcgZmFpbGVkOiAlcyAoJWQpXCIsXG4tXHRcdFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XG4tXHRcdFx0Z290byBlcnJfY2xvc2VfcGI7XG4rXHRcdFx0ZnByaW50ZihzdGRlcnIsIFwiRXJyb3I6ICVzIGJ1ZmZlciBwb2xsaW5nIGZhaWxlZDogJXMgKCVkKVxcblwiLFxuK1x0XHRcdFx0cmIgPyBcInJpbmdcIiA6IFwicGVyZlwiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7XG4rXHRcdFx0YnJlYWs7XG4gXHRcdH1cbitcdFx0ZXJyID0gMDtcbiBcdH1cbiBcbitcdGlmIChzdG9wKVxuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCJTdG9wcGluZy4uLlxcblwiKTtcbiBcdGlmIChqc29uX291dHB1dClcbiBcdFx0anNvbndfZW5kX2FycmF5KGpzb25fd3RyKTtcbitcdGlmIChmZmx1c2goc3Rkb3V0KSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCJFcnJvcjogZmFpbGVkIHRvIHdyaXRlIGV2ZW50czogJXNcXG5cIiwgc3RyZXJyb3IoZXJybm8pKTtcbitcdFx0ZXJyID0gLTE7XG4rXHR9XG4gXG4rXHRyaW5nX2J1ZmZlcl9fZnJlZShyYik7XG4gXHRwZXJmX2J1ZmZlcl9fZnJlZShwYik7XG4rXHQvKiBCb3RoIGJ1ZmZlciBtYW5hZ2VycyBib3Jyb3cgbWFwX2ZkLiAqL1xuIFx0Y2xvc2UobWFwX2ZkKTtcbiBcbi1cdHJldHVybiAwO1xuK1x0cmV0dXJuIGVyciBcdTAwM2MgMCA/IC0xIDogMDtcbiBcbi1lcnJfY2xvc2VfcGI6XG4tXHRwZXJmX2J1ZmZlcl9fZnJlZShwYik7XG4gZXJyX2Nsb3NlX21hcDpcbiBcdGNsb3NlKG1hcF9mZCk7XG4gXHRyZXR1cm4gLTE7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjFhNGFlODhjMDVhMDdcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jXG5AQCAtMCwwICsxLDQyNSBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rI2luY2x1ZGUgXHUwMDNjY3R5cGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2Nwb2xsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvd2FpdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rI2luY2x1ZGUgXCJicGZ0b29sX3JpbmdidWYuc2tlbC5oXCJcbitcbisjZGVmaW5lIFdBSVRfU1RFUFMgNTAwXG4rI2RlZmluZSBXQUlUX1VTIDEwMDAwXG4rXG4rc3RydWN0IGNvbnN1bWVyIHtcbitcdHBpZF90IHBpZDtcbitcdGludCBmZDtcbit9O1xuK1xuK3N0YXRpYyBjb25zdCBjaGFyICpicGZ0b29sX3BhdGgodm9pZClcbit7XG4rXHRjb25zdCBjaGFyICpwYXRoID0gZ2V0ZW52KFwiQlBGVE9PTFwiKTtcbitcbitcdGlmIChwYXRoKVxuK1x0XHRyZXR1cm4gYWNjZXNzKHBhdGgsIFhfT0spID8gTlVMTCA6IHBhdGg7XG4rXHRpZiAoIWFjY2VzcyhcIi4vdG9vbHMvc2Jpbi9icGZ0b29sXCIsIFhfT0spKVxuK1x0XHRyZXR1cm4gXCIuL3Rvb2xzL3NiaW4vYnBmdG9vbFwiO1xuK1x0aWYgKCFhY2Nlc3MoXCIuLi90b29scy9zYmluL2JwZnRvb2xcIiwgWF9PSykpXG4rXHRcdHJldHVybiBcIi4uL3Rvb2xzL3NiaW4vYnBmdG9vbFwiO1xuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNvbnN1bWVyX2NsZWFudXAoc3RydWN0IGNvbnN1bWVyICpjaGlsZClcbit7XG4rXHRpZiAoY2hpbGQtXHUwMDNlcGlkIFx1MDAzZSAwKSB7XG4rXHRcdGtpbGwoY2hpbGQtXHUwMDNlcGlkLCBTSUdLSUxMKTtcbitcdFx0d2hpbGUgKHdhaXRwaWQoY2hpbGQtXHUwMDNlcGlkLCBOVUxMLCAwKSBcdTAwM2MgMCBcdTAwMjZcdTAwMjYgZXJybm8gPT0gRUlOVFIpXG4rXHRcdFx0O1xuK1x0XHRjaGlsZC1cdTAwM2VwaWQgPSAtMTtcbitcdH1cbitcdGlmIChjaGlsZC1cdTAwM2VmZCBcdTAwM2U9IDApIHtcbitcdFx0Y2xvc2UoY2hpbGQtXHUwMDNlZmQpO1xuK1x0XHRjaGlsZC1cdTAwM2VmZCA9IC0xO1xuK1x0fVxuK31cbitcbitzdGF0aWMgYm9vbCBjb25zdW1lcl9zdGFydChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkLCBpbnQgbWFwX2ZkLCBjb25zdCBjaGFyICpmb3JtYXQsXG4rXHRcdFx0ICAgY29uc3QgY2hhciAqcGluX3BhdGgsIGNvbnN0IGNoYXIgKm9wdGlvbixcbitcdFx0XHQgICBib29sIHBhaXIsIGJvb2wgY2FwdHVyZV9lcnJvcnMpXG4re1xuK1x0c3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307XG4rXHRfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7XG4rXHRjb25zdCBjaGFyICpwYXRoID0gYnBmdG9vbF9wYXRoKCk7XG4rXHRjaGFyICphcmd2WzEyXSwgaWRbMTZdO1xuK1x0aW50IG91dFsyXSwgcmVhZHlbMl0sIG4gPSAwLCBlcnIsIGVycl9mZDtcbitcdHN0cnVjdCBwb2xsZmQgcGZkO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHBhdGgsIFwiYnBmdG9vbCBwYXRoIChzZXQgQlBGVE9PTCB0byBvdmVycmlkZSlcIikgfHxcbitcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQobWFwX2ZkLCBcdTAwMjZpbmZvLCBcdTAwMjZsZW4pLCBcIm1hcCBpbmZvXCIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHRzbnByaW50ZihpZCwgc2l6ZW9mKGlkKSwgXCIldVwiLCBpbmZvLmlkKTtcbitcdGFyZ3ZbbisrXSA9IChjaGFyICopcGF0aDtcbitcdGlmIChmb3JtYXQpXG4rXHRcdGFyZ3ZbbisrXSA9IChjaGFyICopZm9ybWF0O1xuK1x0YXJndltuKytdID0gXCJtYXBcIjtcbitcdGFyZ3ZbbisrXSA9IFwiZXZlbnRfcGlwZVwiO1xuK1x0YXJndltuKytdID0gcGluX3BhdGggPyBcInBpbm5lZFwiIDogXCJpZFwiO1xuK1x0YXJndltuKytdID0gcGluX3BhdGggPyAoY2hhciAqKXBpbl9wYXRoIDogaWQ7XG4rXHRpZiAob3B0aW9uKSB7XG4rXHRcdGFyZ3ZbbisrXSA9IChjaGFyICopb3B0aW9uO1xuK1x0XHRhcmd2W24rK10gPSBcIjBcIjtcbitcdFx0aWYgKHBhaXIpIHtcbitcdFx0XHRhcmd2W24rK10gPSBcImluZGV4XCI7XG4rXHRcdFx0YXJndltuKytdID0gXCIwXCI7XG4rXHRcdH1cbitcdH1cbitcdGFyZ3Zbbl0gPSBOVUxMO1xuK1x0aWYgKCFBU1NFUlRfT0socGlwZTIob3V0LCBPX0NMT0VYRUMpLCBcIm91dHB1dCBwaXBlXCIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHRpZiAoIUFTU0VSVF9PSyhwaXBlMihyZWFkeSwgT19DTE9FWEVDKSwgXCJleGVjIHBpcGVcIikpIHtcbitcdFx0Y2xvc2Uob3V0WzBdKTtcbitcdFx0Y2xvc2Uob3V0WzFdKTtcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1x0Y2hpbGQtXHUwMDNlcGlkID0gZm9yaygpO1xuK1x0aWYgKCFjaGlsZC1cdTAwM2VwaWQpIHtcbitcdFx0Y2xvc2Uob3V0WzBdKTtcbitcdFx0Y2xvc2UocmVhZHlbMF0pO1xuK1x0XHRlcnJfZmQgPSBjYXB0dXJlX2Vycm9ycyA/IG91dFsxXSA6IG9wZW4oXCIvZGV2L251bGxcIiwgT19XUk9OTFkpO1xuK1x0XHRpZiAoZHVwMihvdXRbMV0sIFNURE9VVF9GSUxFTk8pIFx1MDAzYyAwIHx8XG4rXHRcdCAgICBkdXAyKGVycl9mZCwgU1RERVJSX0ZJTEVOTykgXHUwMDNjIDApXG4rXHRcdFx0Z290byBleGVjX2ZhaWw7XG4rXHRcdGlmICghY2FwdHVyZV9lcnJvcnMpXG4rXHRcdFx0Y2xvc2UoZXJyX2ZkKTtcbitcdFx0Y2xvc2Uob3V0WzFdKTtcbitcdFx0ZXhlY3YocGF0aCwgYXJndik7XG4rZXhlY19mYWlsOlxuK1x0XHRlcnIgPSBlcnJubztcbitcdFx0d3JpdGUocmVhZHlbMV0sIFx1MDAyNmVyciwgc2l6ZW9mKGVycikpO1xuK1x0XHRfZXhpdCgxMjcpO1xuK1x0fVxuK1x0Y2xvc2Uob3V0WzFdKTtcbitcdGNsb3NlKHJlYWR5WzFdKTtcbitcdGNoaWxkLVx1MDAzZWZkID0gb3V0WzBdO1xuK1x0cGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gcmVhZHlbMF0sIC5ldmVudHMgPSBQT0xMSU4gfTtcbitcdC8qIEVPRiBvbiB0aGUgY2xvc2Utb24tZXhlYyBwaXBlIGRpc3Rpbmd1aXNoZXMgZXhlYyBmcm9tIGluaGVyaXRlZCBoYW5kbGVycy4gKi9cbitcdGVyciA9IGNoaWxkLVx1MDAzZXBpZCBcdTAwM2UgMCA/IHBvbGwoXHUwMDI2cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApIDogLTE7XG4rXHRpZiAoIUFTU0VSVF9HVChjaGlsZC1cdTAwM2VwaWQsIDAsIFwiZm9ya1wiKSB8fFxuK1x0ICAgICFBU1NFUlRfR1QoZXJyLCAwLCBcImV4ZWMgdGltZW91dFwiKSB8fFxuK1x0ICAgICFBU1NFUlRfRVEocmVhZChyZWFkeVswXSwgXHUwMDI2ZXJyLCBzaXplb2YoZXJyKSksIDAsIFwiZXhlY1wiKSkge1xuK1x0XHRjbG9zZShyZWFkeVswXSk7XG4rXHRcdGNvbnN1bWVyX2NsZWFudXAoY2hpbGQpO1xuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rXHRjbG9zZShyZWFkeVswXSk7XG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rc3RhdGljIGJvb2wgY29uc3VtZXJfZmluaXNoKHN0cnVjdCBjb25zdW1lciAqY2hpbGQsIGludCBzaWdubywgYm9vbCBzdWNjZXNzLFxuK1x0XHRcdCAgICBjaGFyICpvdXRwdXQsIHNpemVfdCBzaXplKVxuK3tcbitcdGludCBzdGF0dXMgPSAwLCBpO1xuK1x0cGlkX3QgcmV0ID0gMDtcbitcdHNzaXplX3QgbjtcbitcdHNpemVfdCB1c2VkID0gMDtcbitcbitcdGlmICghQVNTRVJUX09LKGZjbnRsKGNoaWxkLVx1MDAzZWZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKSwgXCJub25ibG9ja2luZyBvdXRwdXRcIikpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdGlmIChzaWdubyBcdTAwMjZcdTAwMjYgIUFTU0VSVF9PSyhraWxsKGNoaWxkLVx1MDAzZXBpZCwgc2lnbm8pLCBcInNpZ25hbCBjb25zdW1lclwiKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgV0FJVF9TVEVQUzsgaSsrKSB7XG4rXHRcdHdoaWxlICh1c2VkIFx1MDAzYyBzaXplIC0gMSBcdTAwMjZcdTAwMjZcbitcdFx0ICAgICAgIChuID0gcmVhZChjaGlsZC1cdTAwM2VmZCwgb3V0cHV0ICsgdXNlZCwgc2l6ZSAtIDEgLSB1c2VkKSkgXHUwMDNlIDApXG4rXHRcdFx0dXNlZCArPSBuO1xuK1x0XHRyZXQgPSB3YWl0cGlkKGNoaWxkLVx1MDAzZXBpZCwgXHUwMDI2c3RhdHVzLCBXTk9IQU5HKTtcbitcdFx0aWYgKHJldCA9PSBjaGlsZC1cdTAwM2VwaWQpXG4rXHRcdFx0YnJlYWs7XG4rXHRcdGlmIChyZXQgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vICE9IEVJTlRSKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHR1c2xlZXAoV0FJVF9VUyk7XG4rXHR9XG4rXHRpZiAoIUFTU0VSVF9FUShyZXQsIGNoaWxkLVx1MDAzZXBpZCwgXCJib3VuZGVkIGNvbnN1bWVyIGV4aXRcIikpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdGNoaWxkLVx1MDAzZXBpZCA9IC0xO1xuK1x0d2hpbGUgKHVzZWQgXHUwMDNjIHNpemUgLSAxIFx1MDAyNlx1MDAyNiAobiA9IHJlYWQoY2hpbGQtXHUwMDNlZmQsIG91dHB1dCArIHVzZWQsIHNpemUgLSAxIC0gdXNlZCkpIFx1MDAzZSAwKVxuK1x0XHR1c2VkICs9IG47XG4rXHRvdXRwdXRbdXNlZF0gPSAnXFwwJztcbitcdHJldHVybiBBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCJub3JtYWwgZXhpdFwiKSBcdTAwMjZcdTAwMjZcbitcdCAgICAgICBBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSA9PSAwLCBzdWNjZXNzLCBcImV4aXQgc3RhdHVzXCIpO1xuK31cbitcbitzdGF0aWMgYm9vbCBjb25zdW1lcl9yZWFkeShzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgbG9uZyBjYXVnaHQ7XG4rXHRjaGFyIHBhdGhbNjRdLCBsaW5lWzI1Nl07XG4rXHRpbnQgaTtcbitcdEZJTEUgKmY7XG4rXG4rXHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFwiL3Byb2MvJWQvc3RhdHVzXCIsIGNoaWxkLVx1MDAzZXBpZCk7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBXQUlUX1NURVBTOyBpKyspIHtcbitcdFx0ZiA9IGZvcGVuKHBhdGgsIFwiclwiKTtcbitcdFx0aWYgKCFmKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmKSkge1xuK1x0XHRcdGlmIChzc2NhbmYobGluZSwgXCJTaWdDZ3Q6ICVsbHhcIiwgXHUwMDI2Y2F1Z2h0KSA9PSAxIFx1MDAyNlx1MDAyNlxuK1x0XHRcdCAgICAoY2F1Z2h0IFx1MDAyNiAoMVVMTCBcdTAwM2NcdTAwM2MgKFNJR0lOVCAtIDEpKSkgXHUwMDI2XHUwMDI2XG4rXHRcdFx0ICAgIChjYXVnaHQgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyAoU0lHVEVSTSAtIDEpKSkpIHtcbitcdFx0XHRcdGZjbG9zZShmKTtcbitcdFx0XHRcdHJldHVybiB0cnVlO1xuK1x0XHRcdH1cbitcdFx0fVxuK1x0XHRmY2xvc2UoZik7XG4rXHRcdHVzbGVlcChXQUlUX1VTKTtcbitcdH1cbitcdHJldHVybiBBU1NFUlRfVFJVRShmYWxzZSwgXCJjb25zdW1lciBzaWduYWwgaGFuZGxlcnMgcmVhZHlcIik7XG4rfVxuK1xuK3N0YXRpYyBib29sIGVtaXRfcmVjb3JkKHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWwsIGludCByZWNvcmQpXG4re1xuK1x0Y2hhciBwYWNrZXRbNjRdID0ge307XG4rXG4rXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgb3B0cyxcbitcdFx0ICAgIC5kYXRhX2luID0gcGFja2V0LFxuK1x0XHQgICAgLmRhdGFfc2l6ZV9pbiA9IHNpemVvZihwYWNrZXQpLFxuK1x0KTtcbitcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY29yZCA9IHJlY29yZDtcbitcdHJldHVybiBBU1NFUlRfT0soYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy5wcm9kdWNlKSxcbitcdFx0XHRcdFx0ICAgICAgXHUwMDI2b3B0cyksIFwicHJvZHVjZSByZWNvcmRcIikgXHUwMDI2XHUwMDI2XG4rXHQgICAgICAgQVNTRVJUX09LKHNrZWwtXHUwMDNlYnNzLVx1MDAzZW91dHB1dF9lcnIsIFwicmluZ2J1ZiBvdXRwdXRcIik7XG4rfVxuK1xuK3N0YXRpYyBib29sIGNvbnN1bWVkKHVuc2lnbmVkIGxvbmcgKnBvc2l0aW9uLCB1bnNpZ25lZCBsb25nIGV4cGVjdGVkKVxuK3tcbitcdGludCBpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgV0FJVF9TVEVQUzsgaSsrKSB7XG4rXHRcdGlmIChfX2F0b21pY19sb2FkX24ocG9zaXRpb24sIF9fQVRPTUlDX0FDUVVJUkUpID09IGV4cGVjdGVkKVxuK1x0XHRcdHJldHVybiB0cnVlO1xuK1x0XHR1c2xlZXAoV0FJVF9VUyk7XG4rXHR9XG4rXHRyZXR1cm4gQVNTRVJUX0VRKCpwb3NpdGlvbiwgZXhwZWN0ZWQsIFwiY29uc3VtZXIgcG9zaXRpb25cIik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNoZWNrX2pzb24oY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICpleHBlY3RlZClcbit7XG4rXHRjaGFyICpzcmMgPSBvdXRwdXQsICpkc3QgPSBvdXRwdXQ7XG4rXHRib29sIHF1b3RlZCA9IGZhbHNlLCBlc2NhcGVkID0gZmFsc2U7XG4rXG4rXHQvKiBJZ25vcmUgZm9ybWF0dGluZyB3aGl0ZXNwYWNlIHdoaWxlIGNoZWNraW5nIHRoZSBlbnRpcmUgSlNPTiBkb2N1bWVudC4gKi9cbitcdHdoaWxlICgqc3JjKSB7XG4rXHRcdGlmIChxdW90ZWQgfHwgIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnNyYykpXG4rXHRcdFx0KmRzdCsrID0gKnNyYztcbitcdFx0aWYgKCFlc2NhcGVkIFx1MDAyNlx1MDAyNiAqc3JjID09ICdcIicpXG4rXHRcdFx0cXVvdGVkID0gIXF1b3RlZDtcbitcdFx0ZXNjYXBlZCA9ICFlc2NhcGVkIFx1MDAyNlx1MDAyNiBxdW90ZWQgXHUwMDI2XHUwMDI2ICpzcmMgPT0gJ1xcXFwnO1xuK1x0XHRzcmMrKztcbitcdH1cbitcdCpkc3QgPSAnXFwwJztcbitcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcIkpTT04gcmVjb3Jkc1wiKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9jb25zdW1lcihjb25zdCBjaGFyICpmb3JtYXQsIGJvb2wgaWRsZSwgaW50IHNpZ25vLCBib29sIHBpbm5lZClcbit7XG4rXHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcbitcdHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWw7XG4rXHR1bnNpZ25lZCBsb25nICpwb3NpdGlvbiA9IE1BUF9GQUlMRUQ7XG4rXHRpbnQgcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKSwgZmQ7XG4rXHRjaGFyIHBpbl9kaXJbXSA9IFwiL3N5cy9mcy9icGYvYnBmdG9vbF9yaW5nYnVmX1hYWFhYWFwiO1xuK1x0Y2hhciBwaW5fcGF0aFtzaXplb2YocGluX2RpcikgKyBzaXplb2YoXCIvbWFwXCIpXTtcbitcdGJvb2wgZGlyX2NyZWF0ZWQgPSBmYWxzZSwgbWFwX3Bpbm5lZCA9IGZhbHNlO1xuK1x0Y2hhciBvdXRwdXRbNDA5Nl07XG4rXHRzdHJ1Y3QgcG9sbGZkIHBmZDtcbitcbitcdHNrZWwgPSBicGZ0b29sX3JpbmdidWZfX29wZW4oKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcIm9wZW5cIikpXG4rXHRcdHJldHVybjtcbitcdGJwZl9tYXBfX3NldF9tYXhfZW50cmllcyhza2VsLVx1MDAzZW1hcHMucmluZ2J1ZiwgcGFnZV9zaXplKTtcbitcdGlmICghQVNTRVJUX09LKGJwZnRvb2xfcmluZ2J1Zl9fbG9hZChza2VsKSwgXCJsb2FkXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGZkID0gYnBmX21hcF9fZmQoc2tlbC1cdTAwM2VtYXBzLnJpbmdidWYpO1xuK1x0aWYgKHBpbm5lZCkge1xuK1x0XHRpZiAoIUFTU0VSVF9PS19QVFIobWtkdGVtcChwaW5fZGlyKSwgXCJjcmVhdGUgcGluIGRpcmVjdG9yeVwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0ZGlyX2NyZWF0ZWQgPSB0cnVlO1xuK1x0XHRzbnByaW50ZihwaW5fcGF0aCwgc2l6ZW9mKHBpbl9wYXRoKSwgXCIlcy9tYXBcIiwgcGluX2Rpcik7XG4rXHRcdGlmICghQVNTRVJUX09LKGJwZl9vYmpfcGluKGZkLCBwaW5fcGF0aCksIFwicGluIHJpbmdidWZcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdG1hcF9waW5uZWQgPSB0cnVlO1xuK1x0fVxuK1x0cG9zaXRpb24gPSBtbWFwKE5VTEwsIHBhZ2Vfc2l6ZSwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBmZCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9ORVEocG9zaXRpb24sIE1BUF9GQUlMRUQsIFwiY29uc3VtZXIgbW1hcFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIWlkbGUgXHUwMDI2XHUwMDI2ICghZW1pdF9yZWNvcmQoc2tlbCwgMCkgfHwgIWVtaXRfcmVjb3JkKHNrZWwsIDEpKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIWNvbnN1bWVyX3N0YXJ0KFx1MDAyNmNoaWxkLCBmZCwgZm9ybWF0LCBwaW5uZWQgPyBwaW5fcGF0aCA6IE5VTEwsXG4rXHRcdFx0ICAgIE5VTEwsIGZhbHNlLCBmYWxzZSkgfHxcbitcdCAgICAhY29uc3VtZXJfcmVhZHkoXHUwMDI2Y2hpbGQpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghaWRsZSkge1xuK1x0XHQvKiBCb3RoIHByZWZpbGxlZCByZWNvcmRzIG9jY3VweSAxNiBieXRlcyBpbmNsdWRpbmcgdGhlaXIgaGVhZGVycy4gKi9cbitcdFx0aWYgKCFjb25zdW1lZChwb3NpdGlvbiwgMzIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRwZmQgPSAoc3RydWN0IHBvbGxmZCkgeyAuZmQgPSBjaGlsZC5mZCwgLmV2ZW50cyA9IFBPTExJTiB9O1xuK1x0XHRpZiAoIUFTU0VSVF9HVChwb2xsKFx1MDAyNnBmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSwgMCxcbitcdFx0XHQgICAgICAgXCJyZWNvcmRzIGZsdXNoZWQgYmVmb3JlIGV4aXRcIikgfHxcbitcdFx0ICAgICFBU1NFUlRfVFJVRShwZmQucmV2ZW50cyBcdTAwMjYgUE9MTElOLCBcInJlY29yZCBvdXRwdXQgcmVhZGFibGVcIikgfHxcbitcdFx0ICAgICFlbWl0X3JlY29yZChza2VsLCAyKSB8fCAhY29uc3VtZWQocG9zaXRpb24sIDY0KSlcbitcdFx0XHRnb3RvIG91dDtcbitcdH1cbitcdGlmICghY29uc3VtZXJfZmluaXNoKFx1MDAyNmNoaWxkLCBzaWdubywgdHJ1ZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKGZvcm1hdCBcdTAwMjZcdTAwMjYgIXN0cmNtcChmb3JtYXQsIFwiLXBcIikpXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGlkbGUgPyBcIltdXFxuXCIgOlxuK1x0XHRcdCAgICAgXCJbe1xcblwiXG4rXHRcdFx0ICAgICBcIiAgICAgICAgXFxcInNpemVcXFwiOiAyLFxcblwiXG4rXHRcdFx0ICAgICBcIiAgICAgICAgXFxcImRhdGFcXFwiOiBbMCwyNTVcXG5cIlxuK1x0XHRcdCAgICAgXCIgICAgICAgIF1cXG5cIlxuK1x0XHRcdCAgICAgXCIgICAgfSx7XFxuXCJcbitcdFx0XHQgICAgIFwiICAgICAgICBcXFwic2l6ZVxcXCI6IDUsXFxuXCJcbitcdFx0XHQgICAgIFwiICAgICAgICBcXFwiZGF0YVxcXCI6IFsxLDIsMyw0LDVcXG5cIlxuK1x0XHRcdCAgICAgXCIgICAgICAgIF1cXG5cIlxuK1x0XHRcdCAgICAgXCIgICAgfSx7XFxuXCJcbitcdFx0XHQgICAgIFwiICAgICAgICBcXFwic2l6ZVxcXCI6IDE3LFxcblwiXG4rXHRcdFx0ICAgICBcIiAgICAgICAgXFxcImRhdGFcXFwiOiBbMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzJcXG5cIlxuK1x0XHRcdCAgICAgXCIgICAgICAgIF1cXG5cIlxuK1x0XHRcdCAgICAgXCIgICAgfVxcblwiXG4rXHRcdFx0ICAgICBcIl1cXG5cIiwgXCJwcmV0dHkgSlNPTiByZWNvcmRzXCIpO1xuK1x0ZWxzZSBpZiAoZm9ybWF0KVxuK1x0XHRjaGVja19qc29uKG91dHB1dCwgaWRsZSA/IFwiW11cIiA6XG4rXHRcdFx0ICAgXCJbe1xcXCJzaXplXFxcIjoyLFxcXCJkYXRhXFxcIjpbMCwyNTVdfSxcIlxuK1x0XHRcdCAgIFwie1xcXCJzaXplXFxcIjo1LFxcXCJkYXRhXFxcIjpbMSwyLDMsNCw1XX0sXCJcbitcdFx0XHQgICBcIntcXFwic2l6ZVxcXCI6MTcsXFxcImRhdGFcXFwiOlsxNiwxNywxOCwxOSwyMCwyMSwyMiwyMyxcIlxuK1x0XHRcdCAgIFwiMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzJdfV1cIik7XG4rXHRlbHNlXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGlkbGUgPyBcIlwiIDpcbitcdFx0XHQgICAgIFwiPT0gc2l6ZTogMiA9PT09PVxcbjAwIGZmXFxuXCJcbitcdFx0XHQgICAgIFwiPT0gc2l6ZTogNSA9PT09PVxcbjAxIDAyIDAzIDA0IDA1XFxuXCJcbitcdFx0XHQgICAgIFwiPT0gc2l6ZTogMTcgPT09PT1cXG4xMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAgXCJcbitcdFx0XHQgICAgIFwiMTggMTkgMWEgMWIgMWMgMWQgMWUgMWZcXG4yMFxcblwiLCBcInBsYWluIHJlY29yZHNcIik7XG4rb3V0OlxuK1x0Y29uc3VtZXJfY2xlYW51cChcdTAwMjZjaGlsZCk7XG4rXHRpZiAocG9zaXRpb24gIT0gTUFQX0ZBSUxFRClcbitcdFx0bXVubWFwKHBvc2l0aW9uLCBwYWdlX3NpemUpO1xuK1x0aWYgKG1hcF9waW5uZWQpXG4rXHRcdEFTU0VSVF9PSyh1bmxpbmsocGluX3BhdGgpLCBcInVucGluIHJpbmdidWZcIik7XG4rXHRpZiAoZGlyX2NyZWF0ZWQpXG4rXHRcdEFTU0VSVF9PSyhybWRpcihwaW5fZGlyKSwgXCJyZW1vdmUgcGluIGRpcmVjdG9yeVwiKTtcbitcdGJwZnRvb2xfcmluZ2J1Zl9fZGVzdHJveShza2VsKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9wZXJmX2NvbnN1bWVyKHZvaWQpXG4re1xuK1x0c3RydWN0IGNvbnN1bWVyIGNoaWxkID0geyAucGlkID0gLTEsIC5mZCA9IC0xIH07XG4rXHR1bnNpZ25lZCBsb25nIGxvbmcgc2Vjb25kcywgbmFub3NlY29uZHM7XG4rXHRzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsO1xuK1x0Y2hhciBvdXRwdXRbMTYzODRdLCBleHBlY3RlZFsxNjM4NF07XG4rXHRpbnQgbnJfY3B1cywgY3B1LCBpbmRleCwgb2Zmc2V0ID0gMCwgaSwgdXNlZCA9IDAsIGZpZWxkcztcbitcdHN0cnVjdCBwb2xsZmQgcGZkO1xuK1xuK1x0bnJfY3B1cyA9IGxpYmJwZl9udW1fcG9zc2libGVfY3B1cygpO1xuK1x0aWYgKCFBU1NFUlRfR1QobnJfY3B1cywgMCwgXCJwb3NzaWJsZSBjcHVzXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRza2VsID0gYnBmdG9vbF9yaW5nYnVmX19vcGVuKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJvcGVuXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cdTAwM2VtYXBzLnJpbmdidWYsIGdldHBhZ2VzaXplKCkpO1xuK1x0YnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtXHUwMDNlbWFwcy5wZXJmYnVmLCBucl9jcHVzKTtcbitcdGlmICghQVNTRVJUX09LKGJwZnRvb2xfcmluZ2J1Zl9fbG9hZChza2VsKSwgXCJsb2FkXCIpIHx8XG4rXHQgICAgIWNvbnN1bWVyX3N0YXJ0KFx1MDAyNmNoaWxkLCBicGZfbWFwX19mZChza2VsLVx1MDAzZW1hcHMucGVyZmJ1ZiksIE5VTEwsXG4rXHRcdFx0ICAgIE5VTEwsIE5VTEwsIGZhbHNlLCBmYWxzZSkgfHwgIWNvbnN1bWVyX3JlYWR5KFx1MDAyNmNoaWxkKSB8fFxuK1x0ICAgICFlbWl0X3JlY29yZChza2VsLCAzKSlcbitcdFx0Z290byBvdXQ7XG4rXHQvKiBPbmUgbGFyZ2UgcmVjb3JkIGZsdXNoZXMgdGhlIGV4aXN0aW5nIGJ1ZmZlcmVkIHBlcmYgb3V0cHV0IGNhbGxiYWNrLiAqL1xuK1x0cGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gY2hpbGQuZmQsIC5ldmVudHMgPSBQT0xMSU4gfTtcbitcdGlmICghQVNTRVJUX0dUKHBvbGwoXHUwMDI2cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApLCAwLFxuK1x0XHQgICAgICAgXCJwZXJmIHJlY29yZCBvdXRwdXRcIikgfHxcbitcdCAgICAhQVNTRVJUX1RSVUUocGZkLnJldmVudHMgXHUwMDI2IFBPTExJTiwgXCJwZXJmIG91dHB1dCByZWFkYWJsZVwiKSB8fFxuK1x0ICAgICFjb25zdW1lcl9maW5pc2goXHUwMDI2Y2hpbGQsIFNJR0lOVCwgdHJ1ZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZmllbGRzID0gc3NjYW5mKG91dHB1dCwgXCI9PSBAJWxsdS4lbGx1IENQVTogJWQgaW5kZXg6ICVkID09PT09XFxuJW5cIixcbitcdFx0XHRcdTAwMjZzZWNvbmRzLCBcdTAwMjZuYW5vc2Vjb25kcywgXHUwMDI2Y3B1LCBcdTAwMjZpbmRleCwgXHUwMDI2b2Zmc2V0KTtcbitcdGlmICghQVNTRVJUX0VRKGZpZWxkcywgNCwgXCJwZXJmIGhlYWRlclwiKSB8fFxuK1x0ICAgICFBU1NFUlRfR1Qob2Zmc2V0LCAwLCBcInBlcmYgcGF5bG9hZCBvZmZzZXRcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0QVNTRVJUX0dUKHNlY29uZHMgKiAxMDAwMDAwMDAwVUxMICsgbmFub3NlY29uZHMsIDAsIFwicGVyZiB0aW1lc3RhbXBcIik7XG4rXHRBU1NFUlRfTFQobmFub3NlY29uZHMsIDEwMDAwMDAwMDBVTEwsIFwicGVyZiB0aW1lc3RhbXAgbmFub3NlY29uZHNcIik7XG4rXHRBU1NFUlRfR0UoY3B1LCAwLCBcInBlcmYgY3B1XCIpO1xuK1x0QVNTRVJUX0xUKGNwdSwgbnJfY3B1cywgXCJwZXJmIGNwdSByYW5nZVwiKTtcbitcdEFTU0VSVF9FUShpbmRleCwgY3B1LCBcInBlcmYgaW5kZXhcIik7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzaXplb2Yoc2tlbC1cdTAwM2Vyb2RhdGEtXHUwMDNlcGVyZl9wYXlsb2FkKTsgaSsrKSB7XG4rXHRcdGNvbnN0IGNoYXIgKnNlcGFyYXRvciA9ICFpID8gXCJcIiA6ICEoaSAlIDE2KSA/IFwiXFxuXCIgOlxuK1x0XHRcdFx0XHQhKGkgJSA4KSA/IFwiICBcIiA6IFwiIFwiO1xuK1xuK1x0XHR1c2VkICs9IHNucHJpbnRmKGV4cGVjdGVkICsgdXNlZCwgc2l6ZW9mKGV4cGVjdGVkKSAtIHVzZWQsXG4rXHRcdFx0XHQgXCIlcyUwMnhcIiwgc2VwYXJhdG9yLCBpID09IDEgPyAweGZmIDogMCk7XG4rXHR9XG4rXHRzbnByaW50ZihleHBlY3RlZCArIHVzZWQsIHNpemVvZihleHBlY3RlZCkgLSB1c2VkLCBcIlxcblwiKTtcbitcdEFTU0VSVF9TVFJFUShvdXRwdXQgKyBvZmZzZXQsIGV4cGVjdGVkLCBcInBlcmYgcGF5bG9hZFwiKTtcbitvdXQ6XG4rXHRjb25zdW1lcl9jbGVhbnVwKFx1MDAyNmNoaWxkKTtcbitcdGJwZnRvb2xfcmluZ2J1Zl9fZGVzdHJveShza2VsKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9yZWplY3QoZW51bSBicGZfbWFwX3R5cGUgdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uLCBib29sIHBhaXIsIGJvb2wganNvbilcbit7XG4rXHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcbitcdGJvb2wgcmluZyA9IHR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgfHwgdHlwZSA9PSBCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGO1xuK1x0Y29uc3QgY2hhciAqZXhwZWN0ZWQgPSBvcHRpb24gP1xuK1x0XHRcIntcXFwiZXJyb3JcXFwiOlxcXCJyaW5nIGJ1ZmZlciBtYXBzIGRvIG5vdCBzdXBwb3J0IGNwdSBvciBpbmRleCBhcmd1bWVudHNcXFwifVwiIDpcbitcdFx0XCJ7XFxcImVycm9yXFxcIjpcXFwibWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcXFwifVwiO1xuK1x0Y2hhciBvdXRwdXRbNDA5Nl07XG4rXHRpbnQgZmQ7XG4rXG4rXHRmZCA9IGJwZl9tYXBfY3JlYXRlKHR5cGUsIE5VTEwsIHJpbmcgPyAwIDogNCwgcmluZyA/IDAgOiA0LFxuK1x0XHRcdCAgICByaW5nID8gZ2V0cGFnZXNpemUoKSA6IDEsIE5VTEwpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwiY3JlYXRlIG1hcFwiKSlcbitcdFx0cmV0dXJuO1xuK1x0aWYgKGNvbnN1bWVyX3N0YXJ0KFx1MDAyNmNoaWxkLCBmZCwganNvbiA/IFwiLWpcIiA6IE5VTEwsIE5VTEwsIG9wdGlvbiwgcGFpciwgdHJ1ZSkgXHUwMDI2XHUwMDI2XG4rXHQgICAgY29uc3VtZXJfZmluaXNoKFx1MDAyNmNoaWxkLCAwLCBmYWxzZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpIHtcbitcdFx0aWYgKGpzb24pXG4rXHRcdFx0Y2hlY2tfanNvbihvdXRwdXQsIGV4cGVjdGVkKTtcbitcdFx0ZWxzZVxuK1x0XHRcdEFTU0VSVF9HVChzdHJsZW4ob3V0cHV0KSwgMCwgXCJlcnJvciBkaWFnbm9zdGljXCIpO1xuK1x0fVxuK1x0Y29uc3VtZXJfY2xlYW51cChcdTAwMjZjaGlsZCk7XG4rXHRjbG9zZShmZCk7XG4rfVxuK1xuK3ZvaWQgdGVzdF9icGZ0b29sX3JpbmdidWYodm9pZClcbit7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInBlcmZfZXZlbnRfYXJyYXlcIikpXG4rXHRcdHRlc3RfcGVyZl9jb25zdW1lcigpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJwbGFpblwiKSlcbitcdFx0dGVzdF9jb25zdW1lcihOVUxMLCBmYWxzZSwgU0lHSU5ULCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImpzb25cIikpXG4rXHRcdHRlc3RfY29uc3VtZXIoXCItalwiLCBmYWxzZSwgU0lHVEVSTSwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJwcmV0dHlfanNvblwiKSlcbitcdFx0dGVzdF9jb25zdW1lcihcIi1wXCIsIGZhbHNlLCBTSUdJTlQsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicGlubmVkX3BsYWluXCIpKVxuK1x0XHR0ZXN0X2NvbnN1bWVyKE5VTEwsIGZhbHNlLCBTSUdURVJNLCB0cnVlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicGlubmVkX2pzb25cIikpXG4rXHRcdHRlc3RfY29uc3VtZXIoXCItalwiLCBmYWxzZSwgU0lHSU5ULCB0cnVlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicGlubmVkX3ByZXR0eV9qc29uXCIpKVxuK1x0XHR0ZXN0X2NvbnN1bWVyKFwiLXBcIiwgZmFsc2UsIFNJR1RFUk0sIHRydWUpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJpZGxlX3NpZ2ludFwiKSlcbitcdFx0dGVzdF9jb25zdW1lcihOVUxMLCB0cnVlLCBTSUdJTlQsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiaWRsZV9zaWd0ZXJtX2pzb25cIikpXG4rXHRcdHRlc3RfY29uc3VtZXIoXCItalwiLCB0cnVlLCBTSUdURVJNLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImlkbGVfc2lnaW50X3ByZXR0eV9qc29uXCIpKVxuK1x0XHR0ZXN0X2NvbnN1bWVyKFwiLXBcIiwgdHJ1ZSwgU0lHSU5ULCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJlamVjdF9hcnJheVwiKSlcbitcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX0FSUkFZLCBOVUxMLCBmYWxzZSwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJyZWplY3RfdXNlcl9yaW5nYnVmXCIpKVxuK1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGLCBOVUxMLCBmYWxzZSwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJyZWplY3RfY3B1XCIpKVxuK1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXCJjcHVcIiwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicmVqZWN0X2luZGV4XCIpKVxuK1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXCJpbmRleFwiLCBmYWxzZSwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJyZWplY3RfY3B1X2luZGV4XCIpKVxuK1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXCJjcHVcIiwgdHJ1ZSwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJyZWplY3RfdXNlcl9yaW5nYnVmX2pzb25cIikpXG4rXHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCB0cnVlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicmVqZWN0X2NwdV9pbmRleF9qc29uXCIpKVxuK1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXCJjcHVcIiwgdHJ1ZSwgdHJ1ZSk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9icGZ0b29sX3JpbmdidWYuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9icGZ0b29sX3JpbmdidWYuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmJiYmM5M2MzMGE4MzNcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9icGZ0b29sX3JpbmdidWYuY1xuQEAgLTAsMCArMSw0NyBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuK1xuK3N0cnVjdCB7XG4rXHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1JJTkdCVUYpO1xuK30gcmluZ2J1ZiBTRUMoXCIubWFwc1wiKTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKTtcbitcdF9fdWludChrZXlfc2l6ZSwgc2l6ZW9mKF9fdTMyKSk7XG4rXHRfX3VpbnQodmFsdWVfc2l6ZSwgc2l6ZW9mKF9fdTMyKSk7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuK30gcGVyZmJ1ZiBTRUMoXCIubWFwc1wiKTtcbitcbisvKlxuKyAqIEluY2x1ZGUgdGhlIHUzMiByYXcgc2l6ZSBpbiBwZXJmJ3MgOC1ieXRlIGFsaWdubWVudCB0byBhdm9pZCBwYWRkaW5nLlxuKyAqIEtlZXAgcGxhaW4gb3V0cHV0IGxhcmdlIGVub3VnaCB0byBmbHVzaCBzdGRpbyBiZWZvcmUgdGhlIGNvbnN1bWVyIGV4aXRzLlxuKyAqL1xuK2NvbnN0IHVuc2lnbmVkIGNoYXIgcGVyZl9wYXlsb2FkWzQwOTJdID0geyAweDAwLCAweGZmIH07XG4rXG4raW50IHJlY29yZDtcbitpbnQgb3V0cHV0X2VycjtcbitcbitTRUMoXCJzb2NrZXRcIilcbitpbnQgcHJvZHVjZShzdHJ1Y3QgX19za19idWZmICpza2IpXG4re1xuK1x0dW5zaWduZWQgY2hhciBmaXJzdFtdID0geyAweDAwLCAweGZmIH07XG4rXHR1bnNpZ25lZCBjaGFyIHNlY29uZFtdID0geyAxLCAyLCAzLCA0LCA1IH07XG4rXHR1bnNpZ25lZCBjaGFyIHRoaXJkW10gPSB7XG4rXHRcdDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsXG4rXHRcdDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsXG4rXHR9O1xuK1xuK1x0aWYgKHJlY29yZCA9PSAwKVxuK1x0XHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFx1MDAyNnJpbmdidWYsIGZpcnN0LCBzaXplb2YoZmlyc3QpLCAwKTtcbitcdGVsc2UgaWYgKHJlY29yZCA9PSAxKVxuK1x0XHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFx1MDAyNnJpbmdidWYsIHNlY29uZCwgc2l6ZW9mKHNlY29uZCksIDApO1xuK1x0ZWxzZSBpZiAocmVjb3JkID09IDIpXG4rXHRcdG91dHB1dF9lcnIgPSBicGZfcmluZ2J1Zl9vdXRwdXQoXHUwMDI2cmluZ2J1ZiwgdGhpcmQsIHNpemVvZih0aGlyZCksIDApO1xuK1x0ZWxzZVxuK1x0XHRvdXRwdXRfZXJyID0gYnBmX3BlcmZfZXZlbnRfb3V0cHV0KHNrYiwgXHUwMDI2cGVyZmJ1ZiwgQlBGX0ZfQ1VSUkVOVF9DUFUsXG4rXHRcdFx0XHRcdFx0ICAgKHZvaWQgKilwZXJmX3BheWxvYWQsIHNpemVvZihwZXJmX3BheWxvYWQpKTtcbitcdHJldHVybiAwO1xuK31cbitcbitjaGFyIExJQ0VOU0VbXSBTRUMoXCJsaWNlbnNlXCIpID0gXCJHUExcIjtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDAzOjAwOjAyLjg4MzkyNjc5M1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjY0OTUzMDA2MTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgUGF0Y2ggU2VyaWVzKipcblxuT2theSwgc28gdGhlIHVzZXIgd2FudHMgbWUgdG8gZXZhbHVhdGUgdGhpcyBwYXRjaCBzZXJpZXMgY29tbWl0dGVkIGF0IEhFQUQuIE15IGZpcnN0IHN0ZXAgaXMgdG8gcXVpY2tseSBhbmFseXplIHRoZSBjaGFuZ2VkIGZpbGVzIHVzaW5nIHRoZSBwcm92aWRlZCBgZ2l0IGRpZmZgLiBJIHNlZSBpdCB0b3VjaGVzIHRoZXNlIGZpbGVzOiBgdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RgLCBgdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xgLCBgdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jYCwgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jYCwgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNgLlxuXG5Ob3csIGFjY29yZGluZyB0byB0aGUgZ3VpZGVsaW5lcywgSSBuZWVkIHRvIGRldGVybWluZSBpZiB0aGlzIHdhcnJhbnRzIGZ1cnRoZXIgZnV6emluZy4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFsbCBpbnRvIHRoZSBcIk5lZ2F0aXZlIENyaXRlcmlhXCIuIFNwZWNpZmljYWxseSwgaXMgKmFsbCogdGhlIG1vZGlmaWVkIGNvZGUgc3RyaWN0bHkgY29uZmluZWQgdG86IGRvY3VtZW50YXRpb24sIGNvbW1lbnRzLCBzcGVsbGluZyBmaXhlcywgdXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyB0aGF0ICpkb24ndCogaW1wYWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzP1xuXG5CYXNlZCBvbiB0aGUgZmlsZXMgbGlzdGVkLCBhbGwgbW9kaWZpY2F0aW9ucyBhcmUgd2l0aGluIHRoZSBgdG9vbHMvYnBmL2JwZnRvb2wvYCBhbmQgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9gIGRpcmVjdG9yaWVzLiBUaGlzICpzaG91bGQqIG1lYW4gd2UncmUgZGVhbGluZyB3aXRoIHVzZXItc3BhY2UgdG9vbHMgYW5kIHNlbGYtdGVzdHMuIEkgbmVlZCB0byBiZSBhYnNvbHV0ZWx5IGNlcnRhaW4gdGhvdWdoLiBFdmVuIHRob3VnaCB0aGUgcHJvdmlkZWQgZGlmZiBsb29rcyBjb21wbGV0ZSwgSSdsbCBxdWlja2x5IGRvdWJsZS1jaGVjayB0aGF0IGJ5IGNhbGxpbmcgYGdyZXBwZXJgIG9yIGNoZWNrIHRoZSBgZ2l0IHN0YXR1c2Agb3IgYGdpdCBkaWZmYCBhZ2Fpbi4gSnVzdCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG90aGVyIGNoYW5nZXMgbHVya2luZyB0aGF0IEknbSBtaXNzaW5nLiBCdXQgYmFzZWQgb24gdGhpcyBxdWljayBzY2FuLCB0aGlzICpzdHJvbmdseSogcG9pbnRzIHRvIHRoZSBwYXRjaCBiZWluZyBzYWZlIHRvIHNraXAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExOTA3LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzczLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDM6MDA6MDkuMzc5MjMxMTI4WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4NzY4MjQ3MzQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicHJpbnRfcmluZ2J1Zl9vdXRwdXRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwidG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jPTU3PXByaW50X2JwZl9vdXRwdXQodm9pZCAqcHJpdmF0ZV9kYXRhLCBpbnQgY3B1LCBzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgKmV2ZW50KVxcbi0tXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jLTEwOC1cXG50b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmM6MTA5OnN0YXRpYyBpbnQgcHJpbnRfcmluZ2J1Zl9vdXRwdXQodm9pZCAqY3R4LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSlcXG50b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMtMTEwLXtcXG4tLVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYz0xMzA9aW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbi0tXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jLTIxNS1cXHRpZiAobWFwX2luZm8udHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRikge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYzoyMTY6XFx0XFx0cmIgPSByaW5nX2J1ZmZlcl9fbmV3KG1hcF9mZCwgcHJpbnRfcmluZ2J1Zl9vdXRwdXQsIE5VTEwsIE5VTEwpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYy0yMTctXFx0XFx0aWYgKCFyYikge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwMzowMDoxMS4yNTYwNjA1OTJaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0MDM2ODE4Nzg4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIFBhdGNoJ3MgSW1wYWN0KipcblxuT2theSwgc28gSSd2ZSB0YWtlbiBhIGxvb2sgYXQgdGhpcyBwYXRjaCBhbmQsIGJhc2VkIG9uIHRoZSBmaWxlIHBhdGhzLCBpdCdzIHByZXR0eSBjbGVhciB3aGVyZSB0aGUgY2hhbmdlcyBsaWUuIEV2ZXJ5dGhpbmcncyBuZWF0bHkgdHVja2VkIHVuZGVyIHRoZSBgdG9vbHMvYCBkaXJlY3RvcnkuIFNlY3Rpb24gMiBvZiB0aGUgZG9jdW1lbnRhdGlvbiBleHBsaWNpdGx5IHN0YXRlcyB0aGF0IGFueXRoaW5nIGluIHRoYXQgc3BhY2UsIGxpa2UgdXNlci1zcGFjZSB1dGlsaXRpZXMsIHRlc3RzLCBvciBzY3JpcHRzLCB0aGF0IGRvZXNuJ3QgbWVzcyB3aXRoIHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKGB2bWxpbnV4YCkgb3Iga2VybmVsIG1vZHVsZXMsIGlzbid0IHNvbWV0aGluZyB3ZSBuZWVkIHRvIGZ1enouXG5cblRoZXJlZm9yZSwgYFdvcnRoRnV6emluZ2AgaXMgZGVmaW5pdGVseSBzZXQgdG8gYGZhbHNlYCBoZXJlLiBUaGUgYEVuYWJsZUNvbmZpZ3NgIGFuZCBgRm9jdXNTeW1ib2xzYCBsaXN0cyBhcmUgYm90aCBlbXB0eSwgYXMgZXhwZWN0ZWQuIFRoZSByZWFzb25pbmcgZ2l2ZW4g4oCTIHRoYXQgdGhlIHBhdGNoIG9ubHkgYWZmZWN0cyB1c2VyLXNwYWNlIHRvb2xzIGxpa2UgYGJwZnRvb2xgIGFuZCBzb21lIEJQRiBzZWxmdGVzdHMg4oCTIGFuZCB0aGF0IG5vdGhpbmcgaW4gdGhlIGtlcm5lbCBzcGFjZSBpdHNlbGYgaXMgdG91Y2hlZCDigJMgZnVsbHkgc3VwcG9ydHMgdGhpcyBhc3Nlc3NtZW50LlxuXG5JJ3ZlIGFsc28gcGVyZm9ybWVkIGEgc2FuaXR5IGNoZWNrIG9uIHRoZSB0b29sIHBhcmFtZXRlcnMsIGp1c3QgdG8gYmUgdGhvcm91Z2guIFRoZSBgRW5hYmxlQ29uZmlnc2AsIGBGb2N1c1N5bWJvbHNgIGFuZCB0aGUgYFdvcnRoRnV6emluZ2AgYXJlIGNvbnNpc3RlbnQsIGFnYWluLCByZWluZm9yY2luZyBteSBwcmV2aW91cyBhc3Nlc3NtZW50LlxuXG5Mb29rcyBsaWtlIGl0J3Mgc2FmZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyOTg2LCJPdXRwdXRUb2tlbnMiOjkwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTkxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDAzOjAwOjE1LjI5Mjg4NzA1WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMDAxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW10sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBjaGFuZ2VzIGFyZSBzdHJpY3RseSBsaW1pdGVkIHRvIHVzZXItc3BhY2UgdXRpbGl0aWVzIChicGZ0b29sIHVuZGVyIHRvb2xzL2JwZi9icGZ0b29sLykgYW5kIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLykuIE5vIGtlcm5lbC1zcGFjZSBjb2RlIG9yIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eC9tb2R1bGVzKSBpcyBtb2RpZmllZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIGNoYW5nZXMgYXJlIHN0cmljdGx5IGxpbWl0ZWQgdG8gdXNlci1zcGFjZSB1dGlsaXRpZXMgKGJwZnRvb2wgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wvKSBhbmQgc2VsZnRlc3RzICh0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvKS4gTm8ga2VybmVsLXNwYWNlIGNvZGUgb3IgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4L21vZHVsZXMpIGlzIG1vZGlmaWVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDM6MDA6MTUuMjkyOTEyMjhaIiwiU2VxIjo3LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjc3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+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-workflowb677l[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-11 02:58:26 +0000 UTC FinishedAt: 2026-09-11 03:00:17 +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+CgkJCTx0ZD4yMDI2LzA5LzExIDAzOjAwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgY2hhbmdlcyBhcmUgc3RyaWN0bHkgbGltaXRlZCB0byB1c2VyLXNwYWNlIHV0aWxpdGllcyAoYnBmdG9vbCB1bmRlciB0b29scy9icGYvYnBmdG9vbC8pIGFuZCBzZWxmdGVzdHMgKHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi8pLiBObyBrZXJuZWwtc3BhY2UgY29kZSBvciBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgvbW9kdWxlcykgaXMgbW9kaWZpZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDAzOjAwPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZDNhZTNkOWUzNTVlYjg2MGRiNmRhN2VmMzNlMTQ3NTlmNmI2NThjN1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgU2VwIDExIDAzOjAwOjAxIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0IGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLmU0ZWQ3ZTcwMWM5ZTQgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbkBAIC0xMjAsNyAmIzQzOzEyMCw4IEBAIGJwZnRvb2wgbWFwIHBpbiAgICAgKk1BUCogICpGSUxFKlxuICAgICBjaGFyYWN0ZXIgKCYjMzk7LiYjMzk7KSwgd2hpY2ggaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHRlbnNpb25zIG9mICpicGZmcyouXG4gXG4gYnBmdG9vbCBtYXAgZXZlbnRfcGlwZSAqTUFQKiBbY3B1ICpOKiBpbmRleCAqTSpdXG4tICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogbWFwLlxuJiM0MzsgICAgUmVhZCBldmVudHMgZnJvbSBhICoqQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkqKiBvclxuJiM0MzsgICAgKipCUEZfTUFQX1RZUEVfUklOR0JVRioqIG1hcC5cbiBcbiAgICAgSW5zdGFsbCBwZXJmIHJpbmdzIGludG8gYSBwZXJmIGV2ZW50IGFycmF5IG1hcCBhbmQgZHVtcCBvdXRwdXQgb2YgYW55XG4gICAgICoqYnBmX3BlcmZfZXZlbnRfb3V0cHV0KipcXCAoKSBjYWxsIGluIHRoZSBrZXJuZWwuIEJ5IGRlZmF1bHQgcmVhZCB0aGVcbkBAIC0xMzQsNiAmIzQzOzEzNSwxNyBAQCBicGZ0b29sIG1hcCBldmVudF9waXBlICpNQVAqIFtjcHUgKk4qIGluZGV4ICpNKl1cbiAgICAgZXhpc3RpbmcgcmluZy4gIEFueSBvdGhlciBhcHBsaWNhdGlvbiB3aWxsIHN0b3AgcmVjZWl2aW5nIGV2ZW50cyBpZiBpdFxuICAgICBpbnN0YWxsZWQgaXRzIHJpbmdzIGVhcmxpZXIuXG4gXG4mIzQzOyAgICBGb3IgYSByaW5nIGJ1ZmZlciBtYXAsIGNvbnN1bWUgcmVjb3JkcyBzdWJtaXR0ZWQgYnkgQlBGIHByb2dyYW1zLCBpbmNsdWRpbmdcbiYjNDM7ICAgIHJlY29yZHMgYWxyZWFkeSBxdWV1ZWQgYmVmb3JlIHRoZSBjb21tYW5kIHN0YXJ0cy4gKipjcHUqKiBhbmQgKippbmRleCoqXG4mIzQzOyAgICBhcmUgbm90IHN1cHBvcnRlZC4gRWFjaCByZWNvcmQgaXMgcHJpbnRlZCBpbiBmdWxsLCBpbmNsdWRpbmcgZW1iZWRkZWQgemVyb1xuJiM0MzsgICAgYnl0ZXMuIFBsYWluIG91dHB1dCByZXBvcnRzIHRoZSByZWNvcmQgc2l6ZSBmb2xsb3dlZCBieSBoZXhhZGVjaW1hbFxuJiM0MzsgICAgYnl0ZXM7IEpTT04gb3V0cHV0IGNvbnRhaW5zICoqc2l6ZSoqIGFuZCAqKmRhdGEqKiBmaWVsZHMsIHdpdGggKipkYXRhKiogYW5cbiYjNDM7ICAgIGFycmF5IG9mIGJ5dGUgdmFsdWVzLiBSaW5nIGJ1ZmZlciByZWNvcmRzIGhhdmUgbm8gaW1wbGljaXQgQ1BVIG9yIHRpbWVzdGFtcC5cbiYjNDM7XG4mIzQzOyAgICBDb25zdW1pbmcgYSByaW5nIGJ1ZmZlciBhZHZhbmNlcyBpdHMgc2hhcmVkIGNvbnN1bWVyIHBvc2l0aW9uLCBzbyB0aGlzXG4mIzQzOyAgICBjb21tYW5kIG11c3Qgbm90IHJ1biBhbG9uZ3NpZGUgYW5vdGhlciBjb25zdW1lciBvZiB0aGUgc2FtZSBtYXAuXG4mIzQzOyAgICAqKkJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYqKiBtYXBzIGFyZSBub3Qgc3VwcG9ydGVkLlxuJiM0MztcbiBicGZ0b29sIG1hcCBwZWVrICAqTUFQKlxuICAgICBQZWVrIG5leHQgdmFsdWUgaW4gdGhlIHF1ZXVlIG9yIHN0YWNrLlxuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbmluZGV4IDc1Y2JjYjUxMmViYWUuLjE3NTBiNDg4YzllM2IgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbkBAIC04NzgsMTEgJiM0Mzs4NzgsMTEgQEAgX2JwZnRvb2woKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7O1xuICAgICAgICAgICAgICAgICAgICAgICAgIGlkKVxuLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX2lkc19mb3JfdHlwZSBwZXJmX2V2ZW50X2FycmF5XG4mIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX2lkc19mb3JfdHlwZSAmIzM5O1wmIzM0O3R5cGVcJiMzNDs6IFwmIzM0O1xcKHBlcmZfZXZlbnRfYXJyYXlcXHxyaW5nYnVmXFwpXCYjMzQ7JiMzOTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOztcbiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKVxuLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX25hbWVzX2Zvcl90eXBlIHBlcmZfZXZlbnRfYXJyYXlcbiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfbmFtZXNfZm9yX3R5cGUgJiMzOTtcJiMzNDt0eXBlXCYjMzQ7OiBcJiMzNDtcXChwZXJmX2V2ZW50X2FycmF5XFx8cmluZ2J1ZlxcKVwmIzM0OyYjMzk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgY3B1KVxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xuaW5kZXggYmNiNzY3ZTJkNjczMy4uN2Q1NTUzMzFmNDQzYSAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jXG5AQCAtMjcsNyAmIzQzOzI3LDcgQEBcbiBcbiAjZGVmaW5lIE1NQVBfUEFHRV9DTlRcdDE2XG4gXG4tc3RhdGljIHZvbGF0aWxlIGJvb2wgc3RvcDtcbiYjNDM7c3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBzdG9wO1xuIFxuIHN0cnVjdCBwZXJmX2V2ZW50X3NhbXBsZSB7XG4gXHRzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgaGVhZGVyO1xuQEAgLTQ0LDcgJiM0Mzs0NCw2IEBAIHN0cnVjdCBwZXJmX2V2ZW50X2xvc3Qge1xuIFxuIHN0YXRpYyB2b2lkIGludF9leGl0KGludCBzaWdubylcbiB7XG4tXHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7U3RvcHBpbmcuLi5cXG5cJiMzNDspO1xuIFx0c3RvcCA9IHRydWU7XG4gfVxuIFxuQEAgLTEwNyw2ICYjNDM7MTA2LDI3IEBAIHByaW50X2JwZl9vdXRwdXQodm9pZCAqcHJpdmF0ZV9kYXRhLCBpbnQgY3B1LCBzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgKmV2ZW50KVxuIFx0cmV0dXJuIExJQkJQRl9QRVJGX0VWRU5UX0NPTlQ7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW50IHByaW50X3JpbmdidWZfb3V0cHV0KHZvaWQgKmN0eCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpXG4mIzQzO3tcbiYjNDM7XHRpZiAoanNvbl9vdXRwdXQpIHtcbiYjNDM7XHRcdGpzb253X3N0YXJ0X29iamVjdChqc29uX3d0cik7XG4mIzQzO1x0XHRqc29ud191aW50X2ZpZWxkKGpzb25fd3RyLCBcJiMzNDtzaXplXCYjMzQ7LCBzaXplKTtcbiYjNDM7XHRcdGpzb253X25hbWUoanNvbl93dHIsIFwmIzM0O2RhdGFcJiMzNDspO1xuJiM0MztcdFx0cHJpbnRfZGF0YV9qc29uKGRhdGEsIHNpemUpO1xuJiM0MztcdFx0anNvbndfZW5kX29iamVjdChqc29uX3d0cik7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdHByaW50ZihcJiMzNDs9PSBzaXplOiAlenUgPT09PT1cXG5cJiMzNDssIHNpemUpO1xuJiM0MztcdFx0ZnByaW50X2hleChzdGRvdXQsIGRhdGEsIHNpemUsIFwmIzM0OyBcJiMzNDspO1xuJiM0MztcdFx0cHJpbnRmKFwmIzM0O1xcblwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZmZsdXNoKHN0ZG91dCkpXG4mIzQzO1x0XHRyZXR1cm4gZXJybm8gPyAtZXJybm8gOiAtRUlPO1xuJiM0MztcbiYjNDM7XHQvKiBBIHByb2R1Y2VyIGNhbiBrZWVwIHBvbGwoKSBidXN5IGV2ZW4gYWZ0ZXIgYSBzaWduYWwgYXJyaXZlcy4gKi9cbiYjNDM7XHRyZXR1cm4gc3RvcCA/IC1FSU5UUiA6IDA7XG4mIzQzO31cbiYjNDM7XG4gaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIHtcbiBcdHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgcGVyZl9hdHRyID0ge1xuQEAgLTEyMywxOCAmIzQzOzE0MywyNiBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdC5jcHUgPSAtMSxcbiBcdFx0LmlkeCA9IC0xLFxuIFx0fTtcbi1cdHN0cnVjdCBwZXJmX2J1ZmZlciAqcGI7XG4mIzQzO1x0c3RydWN0IHBlcmZfYnVmZmVyICpwYiA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IHJpbmdfYnVmZmVyICpyYiA9IE5VTEw7XG4gXHRfX3UzMiBtYXBfaW5mb19sZW47XG4gXHRpbnQgZXJyLCBtYXBfZmQ7XG4gXG4mIzQzO1x0c3RvcCA9IGZhbHNlO1xuIFx0bWFwX2luZm9fbGVuID0gc2l6ZW9mKG1hcF9pbmZvKTtcbiBcdG1hcF9mZCA9IG1hcF9wYXJzZV9mZF9hbmRfaW5mbyhcdTAwMjZhcmdjLCBcdTAwMjZhcmd2LCBcdTAwMjZtYXBfaW5mbywgXHUwMDI2bWFwX2luZm9fbGVuLFxuIFx0XHRcdFx0ICAgICAgIDApO1xuIFx0aWYgKG1hcF9mZCBcdTAwM2MgMClcbiBcdFx0cmV0dXJuIC0xO1xuIFxuLVx0aWYgKG1hcF9pbmZvLnR5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkpIHtcbi1cdFx0cF9lcnIoXCYjMzQ7bWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXlcJiMzNDspO1xuJiM0MztcdGlmIChtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9SSU5HQlVGKSB7XG4mIzQzO1x0XHRwX2VycihcJiMzNDttYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheSBvciByaW5nIGJ1ZmZlclwmIzM0Oyk7XG4mIzQzO1x0XHRnb3RvIGVycl9jbG9zZV9tYXA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAobWFwX2luZm8udHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRiBcdTAwMjZcdTAwMjYgYXJnYykge1xuJiM0MztcdFx0cF9lcnIoXCYjMzQ7cmluZyBidWZmZXIgbWFwcyBkbyBub3Qgc3VwcG9ydCBjcHUgb3IgaW5kZXggYXJndW1lbnRzXCYjMzQ7KTtcbiBcdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuIFx0fVxuIFxuQEAgLTE4NCwxNSAmIzQzOzIxMiwyNCBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdGN0eC5pZHggPSAwO1xuIFx0fVxuIFxuLVx0b3B0cy5jcHVfY250ID0gY3R4LmFsbF9jcHVzID8gMCA6IDE7XG4tXHRvcHRzLmNwdXMgPSBcdTAwMjZjdHguY3B1O1xuLVx0b3B0cy5tYXBfa2V5cyA9IFx1MDAyNmN0eC5pZHg7XG4tXHRwYiA9IHBlcmZfYnVmZmVyX19uZXdfcmF3KG1hcF9mZCwgTU1BUF9QQUdFX0NOVCwgXHUwMDI2cGVyZl9hdHRyLFxuLVx0XHRcdFx0ICBwcmludF9icGZfb3V0cHV0LCBcdTAwMjZjdHgsIFx1MDAyNm9wdHMpO1xuLVx0aWYgKCFwYikge1xuLVx0XHRwX2VycihcJiMzNDtmYWlsZWQgdG8gY3JlYXRlIHBlcmYgYnVmZmVyOiAlcyAoJWQpXCYjMzQ7LFxuLVx0XHQgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTtcbi1cdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuJiM0MztcdGlmIChtYXBfaW5mby50eXBlID09IEJQRl9NQVBfVFlQRV9SSU5HQlVGKSB7XG4mIzQzO1x0XHRyYiA9IHJpbmdfYnVmZmVyX19uZXcobWFwX2ZkLCBwcmludF9yaW5nYnVmX291dHB1dCwgTlVMTCwgTlVMTCk7XG4mIzQzO1x0XHRpZiAoIXJiKSB7XG4mIzQzO1x0XHRcdHBfZXJyKFwmIzM0O2ZhaWxlZCB0byBjcmVhdGUgcmluZyBidWZmZXI6ICVzICglZClcJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xuJiM0MztcdFx0XHRnb3RvIGVycl9jbG9zZV9tYXA7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdG9wdHMuY3B1X2NudCA9IGN0eC5hbGxfY3B1cyA/IDAgOiAxO1xuJiM0MztcdFx0b3B0cy5jcHVzID0gXHUwMDI2Y3R4LmNwdTtcbiYjNDM7XHRcdG9wdHMubWFwX2tleXMgPSBcdTAwMjZjdHguaWR4O1xuJiM0MztcdFx0cGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsIFx1MDAyNnBlcmZfYXR0cixcbiYjNDM7XHRcdFx0XHRcdCAgcHJpbnRfYnBmX291dHB1dCwgXHUwMDI2Y3R4LCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRcdGlmICghcGIpIHtcbiYjNDM7XHRcdFx0cF9lcnIoXCYjMzQ7ZmFpbGVkIHRvIGNyZWF0ZSBwZXJmIGJ1ZmZlcjogJXMgKCVkKVwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XG4mIzQzO1x0XHRcdGdvdG8gZXJyX2Nsb3NlX21hcDtcbiYjNDM7XHRcdH1cbiBcdH1cbiBcbiBcdHNpZ25hbChTSUdJTlQsIGludF9leGl0KTtcbkBAIC0yMDIsMjUgJiM0MzsyMzksMzMgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0aWYgKGpzb25fb3V0cHV0KVxuIFx0XHRqc29ud19zdGFydF9hcnJheShqc29uX3d0cik7XG4gXG4mIzQzO1x0ZXJyID0gMDtcbiBcdHdoaWxlICghc3RvcCkge1xuLVx0XHRlcnIgPSBwZXJmX2J1ZmZlcl9fcG9sbChwYiwgMjAwKTtcbiYjNDM7XHRcdGVyciA9IHJiID8gcmluZ19idWZmZXJfX3BvbGwocmIsIDIwMCkgOiBwZXJmX2J1ZmZlcl9fcG9sbChwYiwgMjAwKTtcbiBcdFx0aWYgKGVyciBcdTAwM2MgMCBcdTAwMjZcdTAwMjYgZXJyICE9IC1FSU5UUikge1xuLVx0XHRcdHBfZXJyKFwmIzM0O3BlcmYgYnVmZmVyIHBvbGxpbmcgZmFpbGVkOiAlcyAoJWQpXCYjMzQ7LFxuLVx0XHRcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xuLVx0XHRcdGdvdG8gZXJyX2Nsb3NlX3BiO1xuJiM0MztcdFx0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7RXJyb3I6ICVzIGJ1ZmZlciBwb2xsaW5nIGZhaWxlZDogJXMgKCVkKVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRyYiA/IFwmIzM0O3JpbmdcJiMzNDsgOiBcJiMzNDtwZXJmXCYjMzQ7LCBzdHJlcnJvcigtZXJyKSwgLWVycik7XG4mIzQzO1x0XHRcdGJyZWFrO1xuIFx0XHR9XG4mIzQzO1x0XHRlcnIgPSAwO1xuIFx0fVxuIFxuJiM0MztcdGlmIChzdG9wKVxuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0O1N0b3BwaW5nLi4uXFxuXCYjMzQ7KTtcbiBcdGlmIChqc29uX291dHB1dClcbiBcdFx0anNvbndfZW5kX2FycmF5KGpzb25fd3RyKTtcbiYjNDM7XHRpZiAoZmZsdXNoKHN0ZG91dCkpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtFcnJvcjogZmFpbGVkIHRvIHdyaXRlIGV2ZW50czogJXNcXG5cJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1x0XHRlcnIgPSAtMTtcbiYjNDM7XHR9XG4gXG4mIzQzO1x0cmluZ19idWZmZXJfX2ZyZWUocmIpO1xuIFx0cGVyZl9idWZmZXJfX2ZyZWUocGIpO1xuJiM0MztcdC8qIEJvdGggYnVmZmVyIG1hbmFnZXJzIGJvcnJvdyBtYXBfZmQuICovXG4gXHRjbG9zZShtYXBfZmQpO1xuIFxuLVx0cmV0dXJuIDA7XG4mIzQzO1x0cmV0dXJuIGVyciBcdTAwM2MgMCA/IC0xIDogMDtcbiBcbi1lcnJfY2xvc2VfcGI6XG4tXHRwZXJmX2J1ZmZlcl9fZnJlZShwYik7XG4gZXJyX2Nsb3NlX21hcDpcbiBcdGNsb3NlKG1hcF9mZCk7XG4gXHRyZXR1cm4gLTE7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjFhNGFlODhjMDVhMDdcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jXG5AQCAtMCwwICYjNDM7MSw0MjUgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7I2luY2x1ZGUgXHUwMDNjY3R5cGUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3BvbGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JwZnRvb2xfcmluZ2J1Zi5za2VsLmhcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgV0FJVF9TVEVQUyA1MDBcbiYjNDM7I2RlZmluZSBXQUlUX1VTIDEwMDAwXG4mIzQzO1xuJiM0MztzdHJ1Y3QgY29uc3VtZXIge1xuJiM0MztcdHBpZF90IHBpZDtcbiYjNDM7XHRpbnQgZmQ7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqYnBmdG9vbF9wYXRoKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBjaGFyICpwYXRoID0gZ2V0ZW52KFwmIzM0O0JQRlRPT0xcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRpZiAocGF0aClcbiYjNDM7XHRcdHJldHVybiBhY2Nlc3MocGF0aCwgWF9PSykgPyBOVUxMIDogcGF0aDtcbiYjNDM7XHRpZiAoIWFjY2VzcyhcJiMzNDsuL3Rvb2xzL3NiaW4vYnBmdG9vbFwmIzM0OywgWF9PSykpXG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7Li90b29scy9zYmluL2JwZnRvb2xcJiMzNDs7XG4mIzQzO1x0aWYgKCFhY2Nlc3MoXCYjMzQ7Li4vdG9vbHMvc2Jpbi9icGZ0b29sXCYjMzQ7LCBYX09LKSlcbiYjNDM7XHRcdHJldHVybiBcJiMzNDsuLi90b29scy9zYmluL2JwZnRvb2xcJiMzNDs7XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNvbnN1bWVyX2NsZWFudXAoc3RydWN0IGNvbnN1bWVyICpjaGlsZClcbiYjNDM7e1xuJiM0MztcdGlmIChjaGlsZC1cdTAwM2VwaWQgXHUwMDNlIDApIHtcbiYjNDM7XHRcdGtpbGwoY2hpbGQtXHUwMDNlcGlkLCBTSUdLSUxMKTtcbiYjNDM7XHRcdHdoaWxlICh3YWl0cGlkKGNoaWxkLVx1MDAzZXBpZCwgTlVMTCwgMCkgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vID09IEVJTlRSKVxuJiM0MztcdFx0XHQ7XG4mIzQzO1x0XHRjaGlsZC1cdTAwM2VwaWQgPSAtMTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKGNoaWxkLVx1MDAzZWZkIFx1MDAzZT0gMCkge1xuJiM0MztcdFx0Y2xvc2UoY2hpbGQtXHUwMDNlZmQpO1xuJiM0MztcdFx0Y2hpbGQtXHUwMDNlZmQgPSAtMTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGNvbnN1bWVyX3N0YXJ0KHN0cnVjdCBjb25zdW1lciAqY2hpbGQsIGludCBtYXBfZmQsIGNvbnN0IGNoYXIgKmZvcm1hdCxcbiYjNDM7XHRcdFx0ICAgY29uc3QgY2hhciAqcGluX3BhdGgsIGNvbnN0IGNoYXIgKm9wdGlvbixcbiYjNDM7XHRcdFx0ICAgYm9vbCBwYWlyLCBib29sIGNhcHR1cmVfZXJyb3JzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307XG4mIzQzO1x0X191MzIgbGVuID0gc2l6ZW9mKGluZm8pO1xuJiM0MztcdGNvbnN0IGNoYXIgKnBhdGggPSBicGZ0b29sX3BhdGgoKTtcbiYjNDM7XHRjaGFyICphcmd2WzEyXSwgaWRbMTZdO1xuJiM0MztcdGludCBvdXRbMl0sIHJlYWR5WzJdLCBuID0gMCwgZXJyLCBlcnJfZmQ7XG4mIzQzO1x0c3RydWN0IHBvbGxmZCBwZmQ7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihwYXRoLCBcJiMzNDticGZ0b29sIHBhdGggKHNldCBCUEZUT09MIHRvIG92ZXJyaWRlKVwmIzM0OykgfHxcbiYjNDM7XHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKG1hcF9mZCwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSwgXCYjMzQ7bWFwIGluZm9cJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdHNucHJpbnRmKGlkLCBzaXplb2YoaWQpLCBcJiMzNDsldVwmIzM0OywgaW5mby5pZCk7XG4mIzQzO1x0YXJndltuJiM0MzsmIzQzO10gPSAoY2hhciAqKXBhdGg7XG4mIzQzO1x0aWYgKGZvcm1hdClcbiYjNDM7XHRcdGFyZ3ZbbiYjNDM7JiM0MztdID0gKGNoYXIgKilmb3JtYXQ7XG4mIzQzO1x0YXJndltuJiM0MzsmIzQzO10gPSBcJiMzNDttYXBcJiMzNDs7XG4mIzQzO1x0YXJndltuJiM0MzsmIzQzO10gPSBcJiMzNDtldmVudF9waXBlXCYjMzQ7O1xuJiM0MztcdGFyZ3ZbbiYjNDM7JiM0MztdID0gcGluX3BhdGggPyBcJiMzNDtwaW5uZWRcJiMzNDsgOiBcJiMzNDtpZFwmIzM0OztcbiYjNDM7XHRhcmd2W24mIzQzOyYjNDM7XSA9IHBpbl9wYXRoID8gKGNoYXIgKilwaW5fcGF0aCA6IGlkO1xuJiM0MztcdGlmIChvcHRpb24pIHtcbiYjNDM7XHRcdGFyZ3ZbbiYjNDM7JiM0MztdID0gKGNoYXIgKilvcHRpb247XG4mIzQzO1x0XHRhcmd2W24mIzQzOyYjNDM7XSA9IFwmIzM0OzBcJiMzNDs7XG4mIzQzO1x0XHRpZiAocGFpcikge1xuJiM0MztcdFx0XHRhcmd2W24mIzQzOyYjNDM7XSA9IFwmIzM0O2luZGV4XCYjMzQ7O1xuJiM0MztcdFx0XHRhcmd2W24mIzQzOyYjNDM7XSA9IFwmIzM0OzBcJiMzNDs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdGFyZ3Zbbl0gPSBOVUxMO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHBpcGUyKG91dCwgT19DTE9FWEVDKSwgXCYjMzQ7b3V0cHV0IHBpcGVcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHBpcGUyKHJlYWR5LCBPX0NMT0VYRUMpLCBcJiMzNDtleGVjIHBpcGVcJiMzNDspKSB7XG4mIzQzO1x0XHRjbG9zZShvdXRbMF0pO1xuJiM0MztcdFx0Y2xvc2Uob3V0WzFdKTtcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1x0Y2hpbGQtXHUwMDNlcGlkID0gZm9yaygpO1xuJiM0MztcdGlmICghY2hpbGQtXHUwMDNlcGlkKSB7XG4mIzQzO1x0XHRjbG9zZShvdXRbMF0pO1xuJiM0MztcdFx0Y2xvc2UocmVhZHlbMF0pO1xuJiM0MztcdFx0ZXJyX2ZkID0gY2FwdHVyZV9lcnJvcnMgPyBvdXRbMV0gOiBvcGVuKFwmIzM0Oy9kZXYvbnVsbFwmIzM0OywgT19XUk9OTFkpO1xuJiM0MztcdFx0aWYgKGR1cDIob3V0WzFdLCBTVERPVVRfRklMRU5PKSBcdTAwM2MgMCB8fFxuJiM0MztcdFx0ICAgIGR1cDIoZXJyX2ZkLCBTVERFUlJfRklMRU5PKSBcdTAwM2MgMClcbiYjNDM7XHRcdFx0Z290byBleGVjX2ZhaWw7XG4mIzQzO1x0XHRpZiAoIWNhcHR1cmVfZXJyb3JzKVxuJiM0MztcdFx0XHRjbG9zZShlcnJfZmQpO1xuJiM0MztcdFx0Y2xvc2Uob3V0WzFdKTtcbiYjNDM7XHRcdGV4ZWN2KHBhdGgsIGFyZ3YpO1xuJiM0MztleGVjX2ZhaWw6XG4mIzQzO1x0XHRlcnIgPSBlcnJubztcbiYjNDM7XHRcdHdyaXRlKHJlYWR5WzFdLCBcdTAwMjZlcnIsIHNpemVvZihlcnIpKTtcbiYjNDM7XHRcdF9leGl0KDEyNyk7XG4mIzQzO1x0fVxuJiM0MztcdGNsb3NlKG91dFsxXSk7XG4mIzQzO1x0Y2xvc2UocmVhZHlbMV0pO1xuJiM0MztcdGNoaWxkLVx1MDAzZWZkID0gb3V0WzBdO1xuJiM0MztcdHBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IHJlYWR5WzBdLCAuZXZlbnRzID0gUE9MTElOIH07XG4mIzQzO1x0LyogRU9GIG9uIHRoZSBjbG9zZS1vbi1leGVjIHBpcGUgZGlzdGluZ3Vpc2hlcyBleGVjIGZyb20gaW5oZXJpdGVkIGhhbmRsZXJzLiAqL1xuJiM0MztcdGVyciA9IGNoaWxkLVx1MDAzZXBpZCBcdTAwM2UgMCA/IHBvbGwoXHUwMDI2cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApIDogLTE7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QoY2hpbGQtXHUwMDNlcGlkLCAwLCBcJiMzNDtmb3JrXCYjMzQ7KSB8fFxuJiM0MztcdCAgICAhQVNTRVJUX0dUKGVyciwgMCwgXCYjMzQ7ZXhlYyB0aW1lb3V0XCYjMzQ7KSB8fFxuJiM0MztcdCAgICAhQVNTRVJUX0VRKHJlYWQocmVhZHlbMF0sIFx1MDAyNmVyciwgc2l6ZW9mKGVycikpLCAwLCBcJiMzNDtleGVjXCYjMzQ7KSkge1xuJiM0MztcdFx0Y2xvc2UocmVhZHlbMF0pO1xuJiM0MztcdFx0Y29uc3VtZXJfY2xlYW51cChjaGlsZCk7XG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcdGNsb3NlKHJlYWR5WzBdKTtcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgY29uc3VtZXJfZmluaXNoKHN0cnVjdCBjb25zdW1lciAqY2hpbGQsIGludCBzaWdubywgYm9vbCBzdWNjZXNzLFxuJiM0MztcdFx0XHQgICAgY2hhciAqb3V0cHV0LCBzaXplX3Qgc2l6ZSlcbiYjNDM7e1xuJiM0MztcdGludCBzdGF0dXMgPSAwLCBpO1xuJiM0MztcdHBpZF90IHJldCA9IDA7XG4mIzQzO1x0c3NpemVfdCBuO1xuJiM0MztcdHNpemVfdCB1c2VkID0gMDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZmNudGwoY2hpbGQtXHUwMDNlZmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spLCBcJiMzNDtub25ibG9ja2luZyBvdXRwdXRcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdGlmIChzaWdubyBcdTAwMjZcdTAwMjYgIUFTU0VSVF9PSyhraWxsKGNoaWxkLVx1MDAzZXBpZCwgc2lnbm8pLCBcJiMzNDtzaWduYWwgY29uc3VtZXJcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFdBSVRfU1RFUFM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHR3aGlsZSAodXNlZCBcdTAwM2Mgc2l6ZSAtIDEgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgICAgKG4gPSByZWFkKGNoaWxkLVx1MDAzZWZkLCBvdXRwdXQgJiM0MzsgdXNlZCwgc2l6ZSAtIDEgLSB1c2VkKSkgXHUwMDNlIDApXG4mIzQzO1x0XHRcdHVzZWQgJiM0Mzs9IG47XG4mIzQzO1x0XHRyZXQgPSB3YWl0cGlkKGNoaWxkLVx1MDAzZXBpZCwgXHUwMDI2c3RhdHVzLCBXTk9IQU5HKTtcbiYjNDM7XHRcdGlmIChyZXQgPT0gY2hpbGQtXHUwMDNlcGlkKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGlmIChyZXQgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vICE9IEVJTlRSKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdHVzbGVlcChXQUlUX1VTKTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEocmV0LCBjaGlsZC1cdTAwM2VwaWQsIFwmIzM0O2JvdW5kZWQgY29uc3VtZXIgZXhpdFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0Y2hpbGQtXHUwMDNlcGlkID0gLTE7XG4mIzQzO1x0d2hpbGUgKHVzZWQgXHUwMDNjIHNpemUgLSAxIFx1MDAyNlx1MDAyNiAobiA9IHJlYWQoY2hpbGQtXHUwMDNlZmQsIG91dHB1dCAmIzQzOyB1c2VkLCBzaXplIC0gMSAtIHVzZWQpKSBcdTAwM2UgMClcbiYjNDM7XHRcdHVzZWQgJiM0Mzs9IG47XG4mIzQzO1x0b3V0cHV0W3VzZWRdID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRyZXR1cm4gQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwmIzM0O25vcm1hbCBleGl0XCYjMzQ7KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgICAgQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cykgPT0gMCwgc3VjY2VzcywgXCYjMzQ7ZXhpdCBzdGF0dXNcJiMzNDspO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBjb25zdW1lcl9yZWFkeShzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBsb25nIGNhdWdodDtcbiYjNDM7XHRjaGFyIHBhdGhbNjRdLCBsaW5lWzI1Nl07XG4mIzQzO1x0aW50IGk7XG4mIzQzO1x0RklMRSAqZjtcbiYjNDM7XG4mIzQzO1x0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBcJiMzNDsvcHJvYy8lZC9zdGF0dXNcJiMzNDssIGNoaWxkLVx1MDAzZXBpZCk7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgV0FJVF9TVEVQUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGYgPSBmb3BlbihwYXRoLCBcJiMzNDtyXCYjMzQ7KTtcbiYjNDM7XHRcdGlmICghZilcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmKSkge1xuJiM0MztcdFx0XHRpZiAoc3NjYW5mKGxpbmUsIFwmIzM0O1NpZ0NndDogJWxseFwmIzM0OywgXHUwMDI2Y2F1Z2h0KSA9PSAxIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0XHQgICAgKGNhdWdodCBcdTAwMjYgKDFVTEwgXHUwMDNjXHUwMDNjIChTSUdJTlQgLSAxKSkpIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0XHQgICAgKGNhdWdodCBcdTAwMjYgKDFVTEwgXHUwMDNjXHUwMDNjIChTSUdURVJNIC0gMSkpKSkge1xuJiM0MztcdFx0XHRcdGZjbG9zZShmKTtcbiYjNDM7XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fVxuJiM0MztcdFx0ZmNsb3NlKGYpO1xuJiM0MztcdFx0dXNsZWVwKFdBSVRfVVMpO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gQVNTRVJUX1RSVUUoZmFsc2UsIFwmIzM0O2NvbnN1bWVyIHNpZ25hbCBoYW5kbGVycyByZWFkeVwmIzM0Oyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGVtaXRfcmVjb3JkKHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWwsIGludCByZWNvcmQpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIHBhY2tldFs2NF0gPSB7fTtcbiYjNDM7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMsXG4mIzQzO1x0XHQgICAgLmRhdGFfaW4gPSBwYWNrZXQsXG4mIzQzO1x0XHQgICAgLmRhdGFfc2l6ZV9pbiA9IHNpemVvZihwYWNrZXQpLFxuJiM0MztcdCk7XG4mIzQzO1xuJiM0MztcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY29yZCA9IHJlY29yZDtcbiYjNDM7XHRyZXR1cm4gQVNTRVJUX09LKGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMoYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MucHJvZHVjZSksXG4mIzQzO1x0XHRcdFx0XHQgICAgICBcdTAwMjZvcHRzKSwgXCYjMzQ7cHJvZHVjZSByZWNvcmRcJiMzNDspIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAgICBBU1NFUlRfT0soc2tlbC1cdTAwM2Vic3MtXHUwMDNlb3V0cHV0X2VyciwgXCYjMzQ7cmluZ2J1ZiBvdXRwdXRcJiMzNDspO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBjb25zdW1lZCh1bnNpZ25lZCBsb25nICpwb3NpdGlvbiwgdW5zaWduZWQgbG9uZyBleHBlY3RlZClcbiYjNDM7e1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBXQUlUX1NURVBTOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKF9fYXRvbWljX2xvYWRfbihwb3NpdGlvbiwgX19BVE9NSUNfQUNRVUlSRSkgPT0gZXhwZWN0ZWQpXG4mIzQzO1x0XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdFx0dXNsZWVwKFdBSVRfVVMpO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gQVNTRVJUX0VRKCpwb3NpdGlvbiwgZXhwZWN0ZWQsIFwmIzM0O2NvbnN1bWVyIHBvc2l0aW9uXCYjMzQ7KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfanNvbihjaGFyICpvdXRwdXQsIGNvbnN0IGNoYXIgKmV4cGVjdGVkKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciAqc3JjID0gb3V0cHV0LCAqZHN0ID0gb3V0cHV0O1xuJiM0MztcdGJvb2wgcXVvdGVkID0gZmFsc2UsIGVzY2FwZWQgPSBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0LyogSWdub3JlIGZvcm1hdHRpbmcgd2hpdGVzcGFjZSB3aGlsZSBjaGVja2luZyB0aGUgZW50aXJlIEpTT04gZG9jdW1lbnQuICovXG4mIzQzO1x0d2hpbGUgKCpzcmMpIHtcbiYjNDM7XHRcdGlmIChxdW90ZWQgfHwgIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnNyYykpXG4mIzQzO1x0XHRcdCpkc3QmIzQzOyYjNDM7ID0gKnNyYztcbiYjNDM7XHRcdGlmICghZXNjYXBlZCBcdTAwMjZcdTAwMjYgKnNyYyA9PSAmIzM5O1wmIzM0OyYjMzk7KVxuJiM0MztcdFx0XHRxdW90ZWQgPSAhcXVvdGVkO1xuJiM0MztcdFx0ZXNjYXBlZCA9ICFlc2NhcGVkIFx1MDAyNlx1MDAyNiBxdW90ZWQgXHUwMDI2XHUwMDI2ICpzcmMgPT0gJiMzOTtcXFxcJiMzOTs7XG4mIzQzO1x0XHRzcmMmIzQzOyYjNDM7O1xuJiM0MztcdH1cbiYjNDM7XHQqZHN0ID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCYjMzQ7SlNPTiByZWNvcmRzXCYjMzQ7KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9jb25zdW1lcihjb25zdCBjaGFyICpmb3JtYXQsIGJvb2wgaWRsZSwgaW50IHNpZ25vLCBib29sIHBpbm5lZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9O1xuJiM0MztcdHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWw7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyAqcG9zaXRpb24gPSBNQVBfRkFJTEVEO1xuJiM0MztcdGludCBwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpLCBmZDtcbiYjNDM7XHRjaGFyIHBpbl9kaXJbXSA9IFwmIzM0Oy9zeXMvZnMvYnBmL2JwZnRvb2xfcmluZ2J1Zl9YWFhYWFhcJiMzNDs7XG4mIzQzO1x0Y2hhciBwaW5fcGF0aFtzaXplb2YocGluX2RpcikgJiM0Mzsgc2l6ZW9mKFwmIzM0Oy9tYXBcJiMzNDspXTtcbiYjNDM7XHRib29sIGRpcl9jcmVhdGVkID0gZmFsc2UsIG1hcF9waW5uZWQgPSBmYWxzZTtcbiYjNDM7XHRjaGFyIG91dHB1dFs0MDk2XTtcbiYjNDM7XHRzdHJ1Y3QgcG9sbGZkIHBmZDtcbiYjNDM7XG4mIzQzO1x0c2tlbCA9IGJwZnRvb2xfcmluZ2J1Zl9fb3BlbigpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcJiMzNDtvcGVuXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cdTAwM2VtYXBzLnJpbmdidWYsIHBhZ2Vfc2l6ZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soYnBmdG9vbF9yaW5nYnVmX19sb2FkKHNrZWwpLCBcJiMzNDtsb2FkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZkID0gYnBmX21hcF9fZmQoc2tlbC1cdTAwM2VtYXBzLnJpbmdidWYpO1xuJiM0MztcdGlmIChwaW5uZWQpIHtcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LX1BUUihta2R0ZW1wKHBpbl9kaXIpLCBcJiMzNDtjcmVhdGUgcGluIGRpcmVjdG9yeVwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0ZGlyX2NyZWF0ZWQgPSB0cnVlO1xuJiM0MztcdFx0c25wcmludGYocGluX3BhdGgsIHNpemVvZihwaW5fcGF0aCksIFwmIzM0OyVzL21hcFwmIzM0OywgcGluX2Rpcik7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfb2JqX3BpbihmZCwgcGluX3BhdGgpLCBcJiMzNDtwaW4gcmluZ2J1ZlwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0bWFwX3Bpbm5lZCA9IHRydWU7XG4mIzQzO1x0fVxuJiM0MztcdHBvc2l0aW9uID0gbW1hcChOVUxMLCBwYWdlX3NpemUsIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgZmQsIDApO1xuJiM0MztcdGlmICghQVNTRVJUX05FUShwb3NpdGlvbiwgTUFQX0ZBSUxFRCwgXCYjMzQ7Y29uc3VtZXIgbW1hcFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIWlkbGUgXHUwMDI2XHUwMDI2ICghZW1pdF9yZWNvcmQoc2tlbCwgMCkgfHwgIWVtaXRfcmVjb3JkKHNrZWwsIDEpKSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICghY29uc3VtZXJfc3RhcnQoXHUwMDI2Y2hpbGQsIGZkLCBmb3JtYXQsIHBpbm5lZCA/IHBpbl9wYXRoIDogTlVMTCxcbiYjNDM7XHRcdFx0ICAgIE5VTEwsIGZhbHNlLCBmYWxzZSkgfHxcbiYjNDM7XHQgICAgIWNvbnN1bWVyX3JlYWR5KFx1MDAyNmNoaWxkKSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICghaWRsZSkge1xuJiM0MztcdFx0LyogQm90aCBwcmVmaWxsZWQgcmVjb3JkcyBvY2N1cHkgMTYgYnl0ZXMgaW5jbHVkaW5nIHRoZWlyIGhlYWRlcnMuICovXG4mIzQzO1x0XHRpZiAoIWNvbnN1bWVkKHBvc2l0aW9uLCAzMikpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0cGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gY2hpbGQuZmQsIC5ldmVudHMgPSBQT0xMSU4gfTtcbiYjNDM7XHRcdGlmICghQVNTRVJUX0dUKHBvbGwoXHUwMDI2cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApLCAwLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cmVjb3JkcyBmbHVzaGVkIGJlZm9yZSBleGl0XCYjMzQ7KSB8fFxuJiM0MztcdFx0ICAgICFBU1NFUlRfVFJVRShwZmQucmV2ZW50cyBcdTAwMjYgUE9MTElOLCBcJiMzNDtyZWNvcmQgb3V0cHV0IHJlYWRhYmxlXCYjMzQ7KSB8fFxuJiM0MztcdFx0ICAgICFlbWl0X3JlY29yZChza2VsLCAyKSB8fCAhY29uc3VtZWQocG9zaXRpb24sIDY0KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcdGlmICghY29uc3VtZXJfZmluaXNoKFx1MDAyNmNoaWxkLCBzaWdubywgdHJ1ZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoZm9ybWF0IFx1MDAyNlx1MDAyNiAhc3RyY21wKGZvcm1hdCwgXCYjMzQ7LXBcJiMzNDspKVxuJiM0MztcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgaWRsZSA/IFwmIzM0O1tdXFxuXCYjMzQ7IDpcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDtbe1xcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0OyAgICAgICAgXFxcJiMzNDtzaXplXFxcJiMzNDs6IDIsXFxuXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7ICAgICAgICBcXFwmIzM0O2RhdGFcXFwmIzM0OzogWzAsMjU1XFxuXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7ICAgICAgICBdXFxuXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7ICAgIH0se1xcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0OyAgICAgICAgXFxcJiMzNDtzaXplXFxcJiMzNDs6IDUsXFxuXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7ICAgICAgICBcXFwmIzM0O2RhdGFcXFwmIzM0OzogWzEsMiwzLDQsNVxcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0OyAgICAgICAgXVxcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0OyAgICB9LHtcXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDsgICAgICAgIFxcXCYjMzQ7c2l6ZVxcXCYjMzQ7OiAxNyxcXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDsgICAgICAgIFxcXCYjMzQ7ZGF0YVxcXCYjMzQ7OiBbMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzJcXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDsgICAgICAgIF1cXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDsgICAgfVxcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0O11cXG5cJiMzNDssIFwmIzM0O3ByZXR0eSBKU09OIHJlY29yZHNcJiMzNDspO1xuJiM0MztcdGVsc2UgaWYgKGZvcm1hdClcbiYjNDM7XHRcdGNoZWNrX2pzb24ob3V0cHV0LCBpZGxlID8gXCYjMzQ7W11cJiMzNDsgOlxuJiM0MztcdFx0XHQgICBcJiMzNDtbe1xcXCYjMzQ7c2l6ZVxcXCYjMzQ7OjIsXFxcJiMzNDtkYXRhXFxcJiMzNDs6WzAsMjU1XX0sXCYjMzQ7XG4mIzQzO1x0XHRcdCAgIFwmIzM0O3tcXFwmIzM0O3NpemVcXFwmIzM0Ozo1LFxcXCYjMzQ7ZGF0YVxcXCYjMzQ7OlsxLDIsMyw0LDVdfSxcJiMzNDtcbiYjNDM7XHRcdFx0ICAgXCYjMzQ7e1xcXCYjMzQ7c2l6ZVxcXCYjMzQ7OjE3LFxcXCYjMzQ7ZGF0YVxcXCYjMzQ7OlsxNiwxNywxOCwxOSwyMCwyMSwyMiwyMyxcJiMzNDtcbiYjNDM7XHRcdFx0ICAgXCYjMzQ7MjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzJdfV1cJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGlkbGUgPyBcJiMzNDtcJiMzNDsgOlxuJiM0MztcdFx0XHQgICAgIFwmIzM0Oz09IHNpemU6IDIgPT09PT1cXG4wMCBmZlxcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0Oz09IHNpemU6IDUgPT09PT1cXG4wMSAwMiAwMyAwNCAwNVxcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0Oz09IHNpemU6IDE3ID09PT09XFxuMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgIFwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0OzE4IDE5IDFhIDFiIDFjIDFkIDFlIDFmXFxuMjBcXG5cJiMzNDssIFwmIzM0O3BsYWluIHJlY29yZHNcJiMzNDspO1xuJiM0MztvdXQ6XG4mIzQzO1x0Y29uc3VtZXJfY2xlYW51cChcdTAwMjZjaGlsZCk7XG4mIzQzO1x0aWYgKHBvc2l0aW9uICE9IE1BUF9GQUlMRUQpXG4mIzQzO1x0XHRtdW5tYXAocG9zaXRpb24sIHBhZ2Vfc2l6ZSk7XG4mIzQzO1x0aWYgKG1hcF9waW5uZWQpXG4mIzQzO1x0XHRBU1NFUlRfT0sodW5saW5rKHBpbl9wYXRoKSwgXCYjMzQ7dW5waW4gcmluZ2J1ZlwmIzM0Oyk7XG4mIzQzO1x0aWYgKGRpcl9jcmVhdGVkKVxuJiM0MztcdFx0QVNTRVJUX09LKHJtZGlyKHBpbl9kaXIpLCBcJiMzNDtyZW1vdmUgcGluIGRpcmVjdG9yeVwmIzM0Oyk7XG4mIzQzO1x0YnBmdG9vbF9yaW5nYnVmX19kZXN0cm95KHNrZWwpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3BlcmZfY29uc3VtZXIodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9O1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbG9uZyBzZWNvbmRzLCBuYW5vc2Vjb25kcztcbiYjNDM7XHRzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsO1xuJiM0MztcdGNoYXIgb3V0cHV0WzE2Mzg0XSwgZXhwZWN0ZWRbMTYzODRdO1xuJiM0MztcdGludCBucl9jcHVzLCBjcHUsIGluZGV4LCBvZmZzZXQgPSAwLCBpLCB1c2VkID0gMCwgZmllbGRzO1xuJiM0MztcdHN0cnVjdCBwb2xsZmQgcGZkO1xuJiM0MztcbiYjNDM7XHRucl9jcHVzID0gbGliYnBmX251bV9wb3NzaWJsZV9jcHVzKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QobnJfY3B1cywgMCwgXCYjMzQ7cG9zc2libGUgY3B1c1wmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0c2tlbCA9IGJwZnRvb2xfcmluZ2J1Zl9fb3BlbigpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcJiMzNDtvcGVuXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cdTAwM2VtYXBzLnJpbmdidWYsIGdldHBhZ2VzaXplKCkpO1xuJiM0MztcdGJwZl9tYXBfX3NldF9tYXhfZW50cmllcyhza2VsLVx1MDAzZW1hcHMucGVyZmJ1ZiwgbnJfY3B1cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soYnBmdG9vbF9yaW5nYnVmX19sb2FkKHNrZWwpLCBcJiMzNDtsb2FkXCYjMzQ7KSB8fFxuJiM0MztcdCAgICAhY29uc3VtZXJfc3RhcnQoXHUwMDI2Y2hpbGQsIGJwZl9tYXBfX2ZkKHNrZWwtXHUwMDNlbWFwcy5wZXJmYnVmKSwgTlVMTCxcbiYjNDM7XHRcdFx0ICAgIE5VTEwsIE5VTEwsIGZhbHNlLCBmYWxzZSkgfHwgIWNvbnN1bWVyX3JlYWR5KFx1MDAyNmNoaWxkKSB8fFxuJiM0MztcdCAgICAhZW1pdF9yZWNvcmQoc2tlbCwgMykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHQvKiBPbmUgbGFyZ2UgcmVjb3JkIGZsdXNoZXMgdGhlIGV4aXN0aW5nIGJ1ZmZlcmVkIHBlcmYgb3V0cHV0IGNhbGxiYWNrLiAqL1xuJiM0MztcdHBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IGNoaWxkLmZkLCAuZXZlbnRzID0gUE9MTElOIH07XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QocG9sbChcdTAwMjZwZmQsIDEsIFdBSVRfU1RFUFMgKiBXQUlUX1VTIC8gMTAwMCksIDAsXG4mIzQzO1x0XHQgICAgICAgXCYjMzQ7cGVyZiByZWNvcmQgb3V0cHV0XCYjMzQ7KSB8fFxuJiM0MztcdCAgICAhQVNTRVJUX1RSVUUocGZkLnJldmVudHMgXHUwMDI2IFBPTExJTiwgXCYjMzQ7cGVyZiBvdXRwdXQgcmVhZGFibGVcJiMzNDspIHx8XG4mIzQzO1x0ICAgICFjb25zdW1lcl9maW5pc2goXHUwMDI2Y2hpbGQsIFNJR0lOVCwgdHJ1ZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRmaWVsZHMgPSBzc2NhbmYob3V0cHV0LCBcJiMzNDs9PSBAJWxsdS4lbGx1IENQVTogJWQgaW5kZXg6ICVkID09PT09XFxuJW5cJiMzNDssXG4mIzQzO1x0XHRcdFx1MDAyNnNlY29uZHMsIFx1MDAyNm5hbm9zZWNvbmRzLCBcdTAwMjZjcHUsIFx1MDAyNmluZGV4LCBcdTAwMjZvZmZzZXQpO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKGZpZWxkcywgNCwgXCYjMzQ7cGVyZiBoZWFkZXJcJiMzNDspIHx8XG4mIzQzO1x0ICAgICFBU1NFUlRfR1Qob2Zmc2V0LCAwLCBcJiMzNDtwZXJmIHBheWxvYWQgb2Zmc2V0XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdEFTU0VSVF9HVChzZWNvbmRzICogMTAwMDAwMDAwMFVMTCAmIzQzOyBuYW5vc2Vjb25kcywgMCwgXCYjMzQ7cGVyZiB0aW1lc3RhbXBcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9MVChuYW5vc2Vjb25kcywgMTAwMDAwMDAwMFVMTCwgXCYjMzQ7cGVyZiB0aW1lc3RhbXAgbmFub3NlY29uZHNcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9HRShjcHUsIDAsIFwmIzM0O3BlcmYgY3B1XCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfTFQoY3B1LCBucl9jcHVzLCBcJiMzNDtwZXJmIGNwdSByYW5nZVwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0VRKGluZGV4LCBjcHUsIFwmIzM0O3BlcmYgaW5kZXhcJiMzNDspO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHNpemVvZihza2VsLVx1MDAzZXJvZGF0YS1cdTAwM2VwZXJmX3BheWxvYWQpOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0Y29uc3QgY2hhciAqc2VwYXJhdG9yID0gIWkgPyBcJiMzNDtcJiMzNDsgOiAhKGkgJSAxNikgPyBcJiMzNDtcXG5cJiMzNDsgOlxuJiM0MztcdFx0XHRcdFx0IShpICUgOCkgPyBcJiMzNDsgIFwmIzM0OyA6IFwmIzM0OyBcJiMzNDs7XG4mIzQzO1xuJiM0MztcdFx0dXNlZCAmIzQzOz0gc25wcmludGYoZXhwZWN0ZWQgJiM0MzsgdXNlZCwgc2l6ZW9mKGV4cGVjdGVkKSAtIHVzZWQsXG4mIzQzO1x0XHRcdFx0IFwmIzM0OyVzJTAyeFwmIzM0Oywgc2VwYXJhdG9yLCBpID09IDEgPyAweGZmIDogMCk7XG4mIzQzO1x0fVxuJiM0MztcdHNucHJpbnRmKGV4cGVjdGVkICYjNDM7IHVzZWQsIHNpemVvZihleHBlY3RlZCkgLSB1c2VkLCBcJiMzNDtcXG5cJiMzNDspO1xuJiM0MztcdEFTU0VSVF9TVFJFUShvdXRwdXQgJiM0Mzsgb2Zmc2V0LCBleHBlY3RlZCwgXCYjMzQ7cGVyZiBwYXlsb2FkXCYjMzQ7KTtcbiYjNDM7b3V0OlxuJiM0MztcdGNvbnN1bWVyX2NsZWFudXAoXHUwMDI2Y2hpbGQpO1xuJiM0MztcdGJwZnRvb2xfcmluZ2J1Zl9fZGVzdHJveShza2VsKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9yZWplY3QoZW51bSBicGZfbWFwX3R5cGUgdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uLCBib29sIHBhaXIsIGJvb2wganNvbilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9O1xuJiM0MztcdGJvb2wgcmluZyA9IHR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgfHwgdHlwZSA9PSBCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGO1xuJiM0MztcdGNvbnN0IGNoYXIgKmV4cGVjdGVkID0gb3B0aW9uID9cbiYjNDM7XHRcdFwmIzM0O3tcXFwmIzM0O2Vycm9yXFxcJiMzNDs6XFxcJiMzNDtyaW5nIGJ1ZmZlciBtYXBzIGRvIG5vdCBzdXBwb3J0IGNwdSBvciBpbmRleCBhcmd1bWVudHNcXFwmIzM0O31cJiMzNDsgOlxuJiM0MztcdFx0XCYjMzQ7e1xcXCYjMzQ7ZXJyb3JcXFwmIzM0OzpcXFwmIzM0O21hcCBpcyBub3QgYSBwZXJmIGV2ZW50IGFycmF5IG9yIHJpbmcgYnVmZmVyXFxcJiMzNDt9XCYjMzQ7O1xuJiM0MztcdGNoYXIgb3V0cHV0WzQwOTZdO1xuJiM0MztcdGludCBmZDtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBicGZfbWFwX2NyZWF0ZSh0eXBlLCBOVUxMLCByaW5nID8gMCA6IDQsIHJpbmcgPyAwIDogNCxcbiYjNDM7XHRcdFx0ICAgIHJpbmcgPyBnZXRwYWdlc2l6ZSgpIDogMSwgTlVMTCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwmIzM0O2NyZWF0ZSBtYXBcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGlmIChjb25zdW1lcl9zdGFydChcdTAwMjZjaGlsZCwgZmQsIGpzb24gPyBcJiMzNDstalwmIzM0OyA6IE5VTEwsIE5VTEwsIG9wdGlvbiwgcGFpciwgdHJ1ZSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIGNvbnN1bWVyX2ZpbmlzaChcdTAwMjZjaGlsZCwgMCwgZmFsc2UsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKSB7XG4mIzQzO1x0XHRpZiAoanNvbilcbiYjNDM7XHRcdFx0Y2hlY2tfanNvbihvdXRwdXQsIGV4cGVjdGVkKTtcbiYjNDM7XHRcdGVsc2VcbiYjNDM7XHRcdFx0QVNTRVJUX0dUKHN0cmxlbihvdXRwdXQpLCAwLCBcJiMzNDtlcnJvciBkaWFnbm9zdGljXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1x0Y29uc3VtZXJfY2xlYW51cChcdTAwMjZjaGlsZCk7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIHRlc3RfYnBmdG9vbF9yaW5nYnVmKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtwZXJmX2V2ZW50X2FycmF5XCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfcGVyZl9jb25zdW1lcigpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3BsYWluXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfY29uc3VtZXIoTlVMTCwgZmFsc2UsIFNJR0lOVCwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2pzb25cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9jb25zdW1lcihcJiMzNDstalwmIzM0OywgZmFsc2UsIFNJR1RFUk0sIGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtwcmV0dHlfanNvblwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2NvbnN1bWVyKFwmIzM0Oy1wXCYjMzQ7LCBmYWxzZSwgU0lHSU5ULCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cGlubmVkX3BsYWluXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfY29uc3VtZXIoTlVMTCwgZmFsc2UsIFNJR1RFUk0sIHRydWUpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3Bpbm5lZF9qc29uXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfY29uc3VtZXIoXCYjMzQ7LWpcJiMzNDssIGZhbHNlLCBTSUdJTlQsIHRydWUpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3Bpbm5lZF9wcmV0dHlfanNvblwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2NvbnN1bWVyKFwmIzM0Oy1wXCYjMzQ7LCBmYWxzZSwgU0lHVEVSTSwgdHJ1ZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7aWRsZV9zaWdpbnRcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9jb25zdW1lcihOVUxMLCB0cnVlLCBTSUdJTlQsIGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtpZGxlX3NpZ3Rlcm1fanNvblwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2NvbnN1bWVyKFwmIzM0Oy1qXCYjMzQ7LCB0cnVlLCBTSUdURVJNLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7aWRsZV9zaWdpbnRfcHJldHR5X2pzb25cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9jb25zdW1lcihcJiMzNDstcFwmIzM0OywgdHJ1ZSwgU0lHSU5ULCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmVqZWN0X2FycmF5XCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9BUlJBWSwgTlVMTCwgZmFsc2UsIGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtyZWplY3RfdXNlcl9yaW5nYnVmXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmVqZWN0X2NwdVwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXCYjMzQ7Y3B1XCYjMzQ7LCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3JlamVjdF9pbmRleFwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXCYjMzQ7aW5kZXhcJiMzNDssIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmVqZWN0X2NwdV9pbmRleFwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXCYjMzQ7Y3B1XCYjMzQ7LCB0cnVlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmVqZWN0X3VzZXJfcmluZ2J1Zl9qc29uXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCB0cnVlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtyZWplY3RfY3B1X2luZGV4X2pzb25cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFwmIzM0O2NwdVwmIzM0OywgdHJ1ZSwgdHJ1ZSk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5iYmJjOTNjMzBhODMzXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNcbkBAIC0wLDAgJiM0MzsxLDQ3IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4mIzQzO1xuJiM0MztzdHJ1Y3Qge1xuJiM0MztcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUklOR0JVRik7XG4mIzQzO30gcmluZ2J1ZiBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7c3RydWN0IHtcbiYjNDM7XHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkpO1xuJiM0MztcdF9fdWludChrZXlfc2l6ZSwgc2l6ZW9mKF9fdTMyKSk7XG4mIzQzO1x0X191aW50KHZhbHVlX3NpemUsIHNpemVvZihfX3UzMikpO1xuJiM0MztcdF9fdWludChtYXhfZW50cmllcywgMSk7XG4mIzQzO30gcGVyZmJ1ZiBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogSW5jbHVkZSB0aGUgdTMyIHJhdyBzaXplIGluIHBlcmYmIzM5O3MgOC1ieXRlIGFsaWdubWVudCB0byBhdm9pZCBwYWRkaW5nLlxuJiM0MzsgKiBLZWVwIHBsYWluIG91dHB1dCBsYXJnZSBlbm91Z2ggdG8gZmx1c2ggc3RkaW8gYmVmb3JlIHRoZSBjb25zdW1lciBleGl0cy5cbiYjNDM7ICovXG4mIzQzO2NvbnN0IHVuc2lnbmVkIGNoYXIgcGVyZl9wYXlsb2FkWzQwOTJdID0geyAweDAwLCAweGZmIH07XG4mIzQzO1xuJiM0MztpbnQgcmVjb3JkO1xuJiM0MztpbnQgb3V0cHV0X2VycjtcbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDtzb2NrZXRcJiMzNDspXG4mIzQzO2ludCBwcm9kdWNlKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYilcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGNoYXIgZmlyc3RbXSA9IHsgMHgwMCwgMHhmZiB9O1xuJiM0MztcdHVuc2lnbmVkIGNoYXIgc2Vjb25kW10gPSB7IDEsIDIsIDMsIDQsIDUgfTtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyIHRoaXJkW10gPSB7XG4mIzQzO1x0XHQweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LFxuJiM0MztcdFx0MHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCxcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRpZiAocmVjb3JkID09IDApXG4mIzQzO1x0XHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFx1MDAyNnJpbmdidWYsIGZpcnN0LCBzaXplb2YoZmlyc3QpLCAwKTtcbiYjNDM7XHRlbHNlIGlmIChyZWNvcmQgPT0gMSlcbiYjNDM7XHRcdG91dHB1dF9lcnIgPSBicGZfcmluZ2J1Zl9vdXRwdXQoXHUwMDI2cmluZ2J1Ziwgc2Vjb25kLCBzaXplb2Yoc2Vjb25kKSwgMCk7XG4mIzQzO1x0ZWxzZSBpZiAocmVjb3JkID09IDIpXG4mIzQzO1x0XHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFx1MDAyNnJpbmdidWYsIHRoaXJkLCBzaXplb2YodGhpcmQpLCAwKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRvdXRwdXRfZXJyID0gYnBmX3BlcmZfZXZlbnRfb3V0cHV0KHNrYiwgXHUwMDI2cGVyZmJ1ZiwgQlBGX0ZfQ1VSUkVOVF9DUFUsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICh2b2lkICopcGVyZl9wYXlsb2FkLCBzaXplb2YocGVyZl9wYXlsb2FkKSk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2NoYXIgTElDRU5TRVtdIFNFQyhcJiMzNDtsaWNlbnNlXCYjMzQ7KSA9IFwmIzM0O0dQTFwmIzM0OztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwMzowMDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBjaGFuZ2VzIGFyZSBzdHJpY3RseSBsaW1pdGVkIHRvIHVzZXItc3BhY2UgdXRpbGl0aWVzIChicGZ0b29sIHVuZGVyIHRvb2xzL2JwZi9icGZ0b29sLykgYW5kIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLykuIE5vIGtlcm5lbC1zcGFjZSBjb2RlIG9yIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eC9tb2R1bGVzKSBpcyBtb2RpZmllZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBkM2FlM2Q5ZTM1NWViODYwZGI2ZGE3ZWYzM2UxNDc1OWY2YjY1OGM3CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBTZXAgMTEgMDM6MDA6MDEgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdCBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0CmluZGV4IDVkYWYzZGU1Yzc0NDYuLmU0ZWQ3ZTcwMWM5ZTQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0CiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0CkBAIC0xMjAsNyAmIzQzOzEyMCw4IEBAIGJwZnRvb2wgbWFwIHBpbiAgICAgKk1BUCogICpGSUxFKgogICAgIGNoYXJhY3RlciAoJiMzOTsuJiMzOTspLCB3aGljaCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgb2YgKmJwZmZzKi4KIAogYnBmdG9vbCBtYXAgZXZlbnRfcGlwZSAqTUFQKiBbY3B1ICpOKiBpbmRleCAqTSpdCi0gICAgUmVhZCBldmVudHMgZnJvbSBhICoqQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkqKiBtYXAuCiYjNDM7ICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogb3IKJiM0MzsgICAgKipCUEZfTUFQX1RZUEVfUklOR0JVRioqIG1hcC4KIAogICAgIEluc3RhbGwgcGVyZiByaW5ncyBpbnRvIGEgcGVyZiBldmVudCBhcnJheSBtYXAgYW5kIGR1bXAgb3V0cHV0IG9mIGFueQogICAgICoqYnBmX3BlcmZfZXZlbnRfb3V0cHV0KipcICgpIGNhbGwgaW4gdGhlIGtlcm5lbC4gQnkgZGVmYXVsdCByZWFkIHRoZQpAQCAtMTM0LDYgJiM0MzsxMzUsMTcgQEAgYnBmdG9vbCBtYXAgZXZlbnRfcGlwZSAqTUFQKiBbY3B1ICpOKiBpbmRleCAqTSpdCiAgICAgZXhpc3RpbmcgcmluZy4gIEFueSBvdGhlciBhcHBsaWNhdGlvbiB3aWxsIHN0b3AgcmVjZWl2aW5nIGV2ZW50cyBpZiBpdAogICAgIGluc3RhbGxlZCBpdHMgcmluZ3MgZWFybGllci4KIAomIzQzOyAgICBGb3IgYSByaW5nIGJ1ZmZlciBtYXAsIGNvbnN1bWUgcmVjb3JkcyBzdWJtaXR0ZWQgYnkgQlBGIHByb2dyYW1zLCBpbmNsdWRpbmcKJiM0MzsgICAgcmVjb3JkcyBhbHJlYWR5IHF1ZXVlZCBiZWZvcmUgdGhlIGNvbW1hbmQgc3RhcnRzLiAqKmNwdSoqIGFuZCAqKmluZGV4KioKJiM0MzsgICAgYXJlIG5vdCBzdXBwb3J0ZWQuIEVhY2ggcmVjb3JkIGlzIHByaW50ZWQgaW4gZnVsbCwgaW5jbHVkaW5nIGVtYmVkZGVkIHplcm8KJiM0MzsgICAgYnl0ZXMuIFBsYWluIG91dHB1dCByZXBvcnRzIHRoZSByZWNvcmQgc2l6ZSBmb2xsb3dlZCBieSBoZXhhZGVjaW1hbAomIzQzOyAgICBieXRlczsgSlNPTiBvdXRwdXQgY29udGFpbnMgKipzaXplKiogYW5kICoqZGF0YSoqIGZpZWxkcywgd2l0aCAqKmRhdGEqKiBhbgomIzQzOyAgICBhcnJheSBvZiBieXRlIHZhbHVlcy4gUmluZyBidWZmZXIgcmVjb3JkcyBoYXZlIG5vIGltcGxpY2l0IENQVSBvciB0aW1lc3RhbXAuCiYjNDM7CiYjNDM7ICAgIENvbnN1bWluZyBhIHJpbmcgYnVmZmVyIGFkdmFuY2VzIGl0cyBzaGFyZWQgY29uc3VtZXIgcG9zaXRpb24sIHNvIHRoaXMKJiM0MzsgICAgY29tbWFuZCBtdXN0IG5vdCBydW4gYWxvbmdzaWRlIGFub3RoZXIgY29uc3VtZXIgb2YgdGhlIHNhbWUgbWFwLgomIzQzOyAgICAqKkJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYqKiBtYXBzIGFyZSBub3Qgc3VwcG9ydGVkLgomIzQzOwogYnBmdG9vbCBtYXAgcGVlayAgKk1BUCoKICAgICBQZWVrIG5leHQgdmFsdWUgaW4gdGhlIHF1ZXVlIG9yIHN0YWNrLgogCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sCmluZGV4IDc1Y2JjYjUxMmViYWUuLjE3NTBiNDg4YzllM2IgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sCkBAIC04NzgsMTEgJiM0Mzs4NzgsMTEgQEAgX2JwZnRvb2woKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgICAgICAgICAgICAgIGlkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfaWRzX2Zvcl90eXBlIHBlcmZfZXZlbnRfYXJyYXkKJiM0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9pZHNfZm9yX3R5cGUgJiMzOTsmIzM0O3R5cGUmIzM0OzogJiMzNDtcKHBlcmZfZXZlbnRfYXJyYXlcfHJpbmdidWZcKSYjMzQ7JiMzOTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfbmFtZXNfZm9yX3R5cGUgcGVyZl9ldmVudF9hcnJheQomIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX25hbWVzX2Zvcl90eXBlICYjMzk7JiMzNDt0eXBlJiMzNDs6ICYjMzQ7XChwZXJmX2V2ZW50X2FycmF5XHxyaW5nYnVmXCkmIzM0OyYjMzk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgICAgICAgICAgICAgICAgICAgY3B1KQpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jCmluZGV4IGJjYjc2N2UyZDY3MzMuLjdkNTU1MzMxZjQ0M2EgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMKQEAgLTI3LDcgJiM0MzsyNyw3IEBACiAKICNkZWZpbmUgTU1BUF9QQUdFX0NOVAkxNgogCi1zdGF0aWMgdm9sYXRpbGUgYm9vbCBzdG9wOwomIzQzO3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3Qgc3RvcDsKIAogc3RydWN0IHBlcmZfZXZlbnRfc2FtcGxlIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgaGVhZGVyOwpAQCAtNDQsNyAmIzQzOzQ0LDYgQEAgc3RydWN0IHBlcmZfZXZlbnRfbG9zdCB7CiAKIHN0YXRpYyB2b2lkIGludF9leGl0KGludCBzaWdubykKIHsKLQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtTdG9wcGluZy4uLlxuJiMzNDspOwogCXN0b3AgPSB0cnVlOwogfQogCkBAIC0xMDcsNiAmIzQzOzEwNiwyNyBAQCBwcmludF9icGZfb3V0cHV0KHZvaWQgKnByaXZhdGVfZGF0YSwgaW50IGNwdSwgc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyICpldmVudCkKIAlyZXR1cm4gTElCQlBGX1BFUkZfRVZFTlRfQ09OVDsKIH0KIAomIzQzO3N0YXRpYyBpbnQgcHJpbnRfcmluZ2J1Zl9vdXRwdXQodm9pZCAqY3R4LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkKJiM0Mzt7CiYjNDM7CWlmIChqc29uX291dHB1dCkgewomIzQzOwkJanNvbndfc3RhcnRfb2JqZWN0KGpzb25fd3RyKTsKJiM0MzsJCWpzb253X3VpbnRfZmllbGQoanNvbl93dHIsICYjMzQ7c2l6ZSYjMzQ7LCBzaXplKTsKJiM0MzsJCWpzb253X25hbWUoanNvbl93dHIsICYjMzQ7ZGF0YSYjMzQ7KTsKJiM0MzsJCXByaW50X2RhdGFfanNvbihkYXRhLCBzaXplKTsKJiM0MzsJCWpzb253X2VuZF9vYmplY3QoanNvbl93dHIpOwomIzQzOwl9IGVsc2UgewomIzQzOwkJcHJpbnRmKCYjMzQ7PT0gc2l6ZTogJXp1ID09PT09XG4mIzM0Oywgc2l6ZSk7CiYjNDM7CQlmcHJpbnRfaGV4KHN0ZG91dCwgZGF0YSwgc2l6ZSwgJiMzNDsgJiMzNDspOwomIzQzOwkJcHJpbnRmKCYjMzQ7XG4mIzM0Oyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGZmbHVzaChzdGRvdXQpKQomIzQzOwkJcmV0dXJuIGVycm5vID8gLWVycm5vIDogLUVJTzsKJiM0MzsKJiM0MzsJLyogQSBwcm9kdWNlciBjYW4ga2VlcCBwb2xsKCkgYnVzeSBldmVuIGFmdGVyIGEgc2lnbmFsIGFycml2ZXMuICovCiYjNDM7CXJldHVybiBzdG9wID8gLUVJTlRSIDogMDsKJiM0Mzt9CiYjNDM7CiBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7CiAJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBwZXJmX2F0dHIgPSB7CkBAIC0xMjMsMTggJiM0MzsxNDMsMjYgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCQkuY3B1ID0gLTEsCiAJCS5pZHggPSAtMSwKIAl9OwotCXN0cnVjdCBwZXJmX2J1ZmZlciAqcGI7CiYjNDM7CXN0cnVjdCBwZXJmX2J1ZmZlciAqcGIgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgcmluZ19idWZmZXIgKnJiID0gTlVMTDsKIAlfX3UzMiBtYXBfaW5mb19sZW47CiAJaW50IGVyciwgbWFwX2ZkOwogCiYjNDM7CXN0b3AgPSBmYWxzZTsKIAltYXBfaW5mb19sZW4gPSBzaXplb2YobWFwX2luZm8pOwogCW1hcF9mZCA9IG1hcF9wYXJzZV9mZF9hbmRfaW5mbygmYW1wO2FyZ2MsICZhbXA7YXJndiwgJmFtcDttYXBfaW5mbywgJmFtcDttYXBfaW5mb19sZW4sCiAJCQkJICAgICAgIDApOwogCWlmIChtYXBfZmQgJmx0OyAwKQogCQlyZXR1cm4gLTE7CiAKLQlpZiAobWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSkgewotCQlwX2VycigmIzM0O21hcCBpcyBub3QgYSBwZXJmIGV2ZW50IGFycmF5JiMzNDspOwomIzQzOwlpZiAobWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSAmYW1wOyZhbXA7CiYjNDM7CSAgICBtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9SSU5HQlVGKSB7CiYjNDM7CQlwX2VycigmIzM0O21hcCBpcyBub3QgYSBwZXJmIGV2ZW50IGFycmF5IG9yIHJpbmcgYnVmZmVyJiMzNDspOwomIzQzOwkJZ290byBlcnJfY2xvc2VfbWFwOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChtYXBfaW5mby50eXBlID09IEJQRl9NQVBfVFlQRV9SSU5HQlVGICZhbXA7JmFtcDsgYXJnYykgewomIzQzOwkJcF9lcnIoJiMzNDtyaW5nIGJ1ZmZlciBtYXBzIGRvIG5vdCBzdXBwb3J0IGNwdSBvciBpbmRleCBhcmd1bWVudHMmIzM0Oyk7CiAJCWdvdG8gZXJyX2Nsb3NlX21hcDsKIAl9CiAKQEAgLTE4NCwxNSAmIzQzOzIxMiwyNCBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCWN0eC5pZHggPSAwOwogCX0KIAotCW9wdHMuY3B1X2NudCA9IGN0eC5hbGxfY3B1cyA/IDAgOiAxOwotCW9wdHMuY3B1cyA9ICZhbXA7Y3R4LmNwdTsKLQlvcHRzLm1hcF9rZXlzID0gJmFtcDtjdHguaWR4OwotCXBiID0gcGVyZl9idWZmZXJfX25ld19yYXcobWFwX2ZkLCBNTUFQX1BBR0VfQ05ULCAmYW1wO3BlcmZfYXR0ciwKLQkJCQkgIHByaW50X2JwZl9vdXRwdXQsICZhbXA7Y3R4LCAmYW1wO29wdHMpOwotCWlmICghcGIpIHsKLQkJcF9lcnIoJiMzNDtmYWlsZWQgdG8gY3JlYXRlIHBlcmYgYnVmZmVyOiAlcyAoJWQpJiMzNDssCi0JCSAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pOwotCQlnb3RvIGVycl9jbG9zZV9tYXA7CiYjNDM7CWlmIChtYXBfaW5mby50eXBlID09IEJQRl9NQVBfVFlQRV9SSU5HQlVGKSB7CiYjNDM7CQlyYiA9IHJpbmdfYnVmZmVyX19uZXcobWFwX2ZkLCBwcmludF9yaW5nYnVmX291dHB1dCwgTlVMTCwgTlVMTCk7CiYjNDM7CQlpZiAoIXJiKSB7CiYjNDM7CQkJcF9lcnIoJiMzNDtmYWlsZWQgdG8gY3JlYXRlIHJpbmcgYnVmZmVyOiAlcyAoJWQpJiMzNDssCiYjNDM7CQkJICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7CiYjNDM7CQkJZ290byBlcnJfY2xvc2VfbWFwOwomIzQzOwkJfQomIzQzOwl9IGVsc2UgewomIzQzOwkJb3B0cy5jcHVfY250ID0gY3R4LmFsbF9jcHVzID8gMCA6IDE7CiYjNDM7CQlvcHRzLmNwdXMgPSAmYW1wO2N0eC5jcHU7CiYjNDM7CQlvcHRzLm1hcF9rZXlzID0gJmFtcDtjdHguaWR4OwomIzQzOwkJcGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsICZhbXA7cGVyZl9hdHRyLAomIzQzOwkJCQkJICBwcmludF9icGZfb3V0cHV0LCAmYW1wO2N0eCwgJmFtcDtvcHRzKTsKJiM0MzsJCWlmICghcGIpIHsKJiM0MzsJCQlwX2VycigmIzM0O2ZhaWxlZCB0byBjcmVhdGUgcGVyZiBidWZmZXI6ICVzICglZCkmIzM0OywKJiM0MzsJCQkgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTsKJiM0MzsJCQlnb3RvIGVycl9jbG9zZV9tYXA7CiYjNDM7CQl9CiAJfQogCiAJc2lnbmFsKFNJR0lOVCwgaW50X2V4aXQpOwpAQCAtMjAyLDI1ICYjNDM7MjM5LDMzIEBAIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIAlpZiAoanNvbl9vdXRwdXQpCiAJCWpzb253X3N0YXJ0X2FycmF5KGpzb25fd3RyKTsKIAomIzQzOwllcnIgPSAwOwogCXdoaWxlICghc3RvcCkgewotCQllcnIgPSBwZXJmX2J1ZmZlcl9fcG9sbChwYiwgMjAwKTsKJiM0MzsJCWVyciA9IHJiID8gcmluZ19idWZmZXJfX3BvbGwocmIsIDIwMCkgOiBwZXJmX2J1ZmZlcl9fcG9sbChwYiwgMjAwKTsKIAkJaWYgKGVyciAmbHQ7IDAgJmFtcDsmYW1wOyBlcnIgIT0gLUVJTlRSKSB7Ci0JCQlwX2VycigmIzM0O3BlcmYgYnVmZmVyIHBvbGxpbmcgZmFpbGVkOiAlcyAoJWQpJiMzNDssCi0JCQkgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTsKLQkJCWdvdG8gZXJyX2Nsb3NlX3BiOwomIzQzOwkJCWZwcmludGYoc3RkZXJyLCAmIzM0O0Vycm9yOiAlcyBidWZmZXIgcG9sbGluZyBmYWlsZWQ6ICVzICglZClcbiYjMzQ7LAomIzQzOwkJCQlyYiA/ICYjMzQ7cmluZyYjMzQ7IDogJiMzNDtwZXJmJiMzNDssIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKJiM0MzsJCQlicmVhazsKIAkJfQomIzQzOwkJZXJyID0gMDsKIAl9CiAKJiM0MzsJaWYgKHN0b3ApCiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtTdG9wcGluZy4uLlxuJiMzNDspOwogCWlmIChqc29uX291dHB1dCkKIAkJanNvbndfZW5kX2FycmF5KGpzb25fd3RyKTsKJiM0MzsJaWYgKGZmbHVzaChzdGRvdXQpKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtFcnJvcjogZmFpbGVkIHRvIHdyaXRlIGV2ZW50czogJXNcbiYjMzQ7LCBzdHJlcnJvcihlcnJubykpOwomIzQzOwkJZXJyID0gLTE7CiYjNDM7CX0KIAomIzQzOwlyaW5nX2J1ZmZlcl9fZnJlZShyYik7CiAJcGVyZl9idWZmZXJfX2ZyZWUocGIpOwomIzQzOwkvKiBCb3RoIGJ1ZmZlciBtYW5hZ2VycyBib3Jyb3cgbWFwX2ZkLiAqLwogCWNsb3NlKG1hcF9mZCk7CiAKLQlyZXR1cm4gMDsKJiM0MzsJcmV0dXJuIGVyciAmbHQ7IDAgPyAtMSA6IDA7CiAKLWVycl9jbG9zZV9wYjoKLQlwZXJmX2J1ZmZlcl9fZnJlZShwYik7CiBlcnJfY2xvc2VfbWFwOgogCWNsb3NlKG1hcF9mZCk7CiAJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4xYTRhZTg4YzA1YTA3Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmMKQEAgLTAsMCAmIzQzOzEsNDI1IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsjaW5jbHVkZSAmbHQ7Y3R5cGUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7cG9sbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzaWduYWwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL21tYW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dGVzdF9wcm9ncy5oJmd0OwomIzQzOyNpbmNsdWRlICYjMzQ7YnBmdG9vbF9yaW5nYnVmLnNrZWwuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBXQUlUX1NURVBTIDUwMAomIzQzOyNkZWZpbmUgV0FJVF9VUyAxMDAwMAomIzQzOwomIzQzO3N0cnVjdCBjb25zdW1lciB7CiYjNDM7CXBpZF90IHBpZDsKJiM0MzsJaW50IGZkOwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKmJwZnRvb2xfcGF0aCh2b2lkKQomIzQzO3sKJiM0MzsJY29uc3QgY2hhciAqcGF0aCA9IGdldGVudigmIzM0O0JQRlRPT0wmIzM0Oyk7CiYjNDM7CiYjNDM7CWlmIChwYXRoKQomIzQzOwkJcmV0dXJuIGFjY2VzcyhwYXRoLCBYX09LKSA/IE5VTEwgOiBwYXRoOwomIzQzOwlpZiAoIWFjY2VzcygmIzM0Oy4vdG9vbHMvc2Jpbi9icGZ0b29sJiMzNDssIFhfT0spKQomIzQzOwkJcmV0dXJuICYjMzQ7Li90b29scy9zYmluL2JwZnRvb2wmIzM0OzsKJiM0MzsJaWYgKCFhY2Nlc3MoJiMzNDsuLi90b29scy9zYmluL2JwZnRvb2wmIzM0OywgWF9PSykpCiYjNDM7CQlyZXR1cm4gJiMzNDsuLi90b29scy9zYmluL2JwZnRvb2wmIzM0OzsKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNvbnN1bWVyX2NsZWFudXAoc3RydWN0IGNvbnN1bWVyICpjaGlsZCkKJiM0Mzt7CiYjNDM7CWlmIChjaGlsZC0mZ3Q7cGlkICZndDsgMCkgewomIzQzOwkJa2lsbChjaGlsZC0mZ3Q7cGlkLCBTSUdLSUxMKTsKJiM0MzsJCXdoaWxlICh3YWl0cGlkKGNoaWxkLSZndDtwaWQsIE5VTEwsIDApICZsdDsgMCAmYW1wOyZhbXA7IGVycm5vID09IEVJTlRSKQomIzQzOwkJCTsKJiM0MzsJCWNoaWxkLSZndDtwaWQgPSAtMTsKJiM0MzsJfQomIzQzOwlpZiAoY2hpbGQtJmd0O2ZkICZndDs9IDApIHsKJiM0MzsJCWNsb3NlKGNoaWxkLSZndDtmZCk7CiYjNDM7CQljaGlsZC0mZ3Q7ZmQgPSAtMTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBjb25zdW1lcl9zdGFydChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkLCBpbnQgbWFwX2ZkLCBjb25zdCBjaGFyICpmb3JtYXQsCiYjNDM7CQkJICAgY29uc3QgY2hhciAqcGluX3BhdGgsIGNvbnN0IGNoYXIgKm9wdGlvbiwKJiM0MzsJCQkgICBib29sIHBhaXIsIGJvb2wgY2FwdHVyZV9lcnJvcnMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTsKJiM0MzsJX191MzIgbGVuID0gc2l6ZW9mKGluZm8pOwomIzQzOwljb25zdCBjaGFyICpwYXRoID0gYnBmdG9vbF9wYXRoKCk7CiYjNDM7CWNoYXIgKmFyZ3ZbMTJdLCBpZFsxNl07CiYjNDM7CWludCBvdXRbMl0sIHJlYWR5WzJdLCBuID0gMCwgZXJyLCBlcnJfZmQ7CiYjNDM7CXN0cnVjdCBwb2xsZmQgcGZkOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIocGF0aCwgJiMzNDticGZ0b29sIHBhdGggKHNldCBCUEZUT09MIHRvIG92ZXJyaWRlKSYjMzQ7KSB8fAomIzQzOwkgICAgIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKG1hcF9mZCwgJmFtcDtpbmZvLCAmYW1wO2xlbiksICYjMzQ7bWFwIGluZm8mIzM0OykpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CXNucHJpbnRmKGlkLCBzaXplb2YoaWQpLCAmIzM0OyV1JiMzNDssIGluZm8uaWQpOwomIzQzOwlhcmd2W24mIzQzOyYjNDM7XSA9IChjaGFyICopcGF0aDsKJiM0MzsJaWYgKGZvcm1hdCkKJiM0MzsJCWFyZ3ZbbiYjNDM7JiM0MztdID0gKGNoYXIgKilmb3JtYXQ7CiYjNDM7CWFyZ3ZbbiYjNDM7JiM0MztdID0gJiMzNDttYXAmIzM0OzsKJiM0MzsJYXJndltuJiM0MzsmIzQzO10gPSAmIzM0O2V2ZW50X3BpcGUmIzM0OzsKJiM0MzsJYXJndltuJiM0MzsmIzQzO10gPSBwaW5fcGF0aCA/ICYjMzQ7cGlubmVkJiMzNDsgOiAmIzM0O2lkJiMzNDs7CiYjNDM7CWFyZ3ZbbiYjNDM7JiM0MztdID0gcGluX3BhdGggPyAoY2hhciAqKXBpbl9wYXRoIDogaWQ7CiYjNDM7CWlmIChvcHRpb24pIHsKJiM0MzsJCWFyZ3ZbbiYjNDM7JiM0MztdID0gKGNoYXIgKilvcHRpb247CiYjNDM7CQlhcmd2W24mIzQzOyYjNDM7XSA9ICYjMzQ7MCYjMzQ7OwomIzQzOwkJaWYgKHBhaXIpIHsKJiM0MzsJCQlhcmd2W24mIzQzOyYjNDM7XSA9ICYjMzQ7aW5kZXgmIzM0OzsKJiM0MzsJCQlhcmd2W24mIzQzOyYjNDM7XSA9ICYjMzQ7MCYjMzQ7OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CWFyZ3Zbbl0gPSBOVUxMOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhwaXBlMihvdXQsIE9fQ0xPRVhFQyksICYjMzQ7b3V0cHV0IHBpcGUmIzM0OykpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CWlmICghQVNTRVJUX09LKHBpcGUyKHJlYWR5LCBPX0NMT0VYRUMpLCAmIzM0O2V4ZWMgcGlwZSYjMzQ7KSkgewomIzQzOwkJY2xvc2Uob3V0WzBdKTsKJiM0MzsJCWNsb3NlKG91dFsxXSk7CiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CX0KJiM0MzsJY2hpbGQtJmd0O3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFjaGlsZC0mZ3Q7cGlkKSB7CiYjNDM7CQljbG9zZShvdXRbMF0pOwomIzQzOwkJY2xvc2UocmVhZHlbMF0pOwomIzQzOwkJZXJyX2ZkID0gY2FwdHVyZV9lcnJvcnMgPyBvdXRbMV0gOiBvcGVuKCYjMzQ7L2Rldi9udWxsJiMzNDssIE9fV1JPTkxZKTsKJiM0MzsJCWlmIChkdXAyKG91dFsxXSwgU1RET1VUX0ZJTEVOTykgJmx0OyAwIHx8CiYjNDM7CQkgICAgZHVwMihlcnJfZmQsIFNUREVSUl9GSUxFTk8pICZsdDsgMCkKJiM0MzsJCQlnb3RvIGV4ZWNfZmFpbDsKJiM0MzsJCWlmICghY2FwdHVyZV9lcnJvcnMpCiYjNDM7CQkJY2xvc2UoZXJyX2ZkKTsKJiM0MzsJCWNsb3NlKG91dFsxXSk7CiYjNDM7CQlleGVjdihwYXRoLCBhcmd2KTsKJiM0MztleGVjX2ZhaWw6CiYjNDM7CQllcnIgPSBlcnJubzsKJiM0MzsJCXdyaXRlKHJlYWR5WzFdLCAmYW1wO2Vyciwgc2l6ZW9mKGVycikpOwomIzQzOwkJX2V4aXQoMTI3KTsKJiM0MzsJfQomIzQzOwljbG9zZShvdXRbMV0pOwomIzQzOwljbG9zZShyZWFkeVsxXSk7CiYjNDM7CWNoaWxkLSZndDtmZCA9IG91dFswXTsKJiM0MzsJcGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gcmVhZHlbMF0sIC5ldmVudHMgPSBQT0xMSU4gfTsKJiM0MzsJLyogRU9GIG9uIHRoZSBjbG9zZS1vbi1leGVjIHBpcGUgZGlzdGluZ3Vpc2hlcyBleGVjIGZyb20gaW5oZXJpdGVkIGhhbmRsZXJzLiAqLwomIzQzOwllcnIgPSBjaGlsZC0mZ3Q7cGlkICZndDsgMCA/IHBvbGwoJmFtcDtwZmQsIDEsIFdBSVRfU1RFUFMgKiBXQUlUX1VTIC8gMTAwMCkgOiAtMTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QoY2hpbGQtJmd0O3BpZCwgMCwgJiMzNDtmb3JrJiMzNDspIHx8CiYjNDM7CSAgICAhQVNTRVJUX0dUKGVyciwgMCwgJiMzNDtleGVjIHRpbWVvdXQmIzM0OykgfHwKJiM0MzsJICAgICFBU1NFUlRfRVEocmVhZChyZWFkeVswXSwgJmFtcDtlcnIsIHNpemVvZihlcnIpKSwgMCwgJiMzNDtleGVjJiMzNDspKSB7CiYjNDM7CQljbG9zZShyZWFkeVswXSk7CiYjNDM7CQljb25zdW1lcl9jbGVhbnVwKGNoaWxkKTsKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwljbG9zZShyZWFkeVswXSk7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBjb25zdW1lcl9maW5pc2goc3RydWN0IGNvbnN1bWVyICpjaGlsZCwgaW50IHNpZ25vLCBib29sIHN1Y2Nlc3MsCiYjNDM7CQkJICAgIGNoYXIgKm91dHB1dCwgc2l6ZV90IHNpemUpCiYjNDM7ewomIzQzOwlpbnQgc3RhdHVzID0gMCwgaTsKJiM0MzsJcGlkX3QgcmV0ID0gMDsKJiM0MzsJc3NpemVfdCBuOwomIzQzOwlzaXplX3QgdXNlZCA9IDA7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LKGZjbnRsKGNoaWxkLSZndDtmZCwgRl9TRVRGTCwgT19OT05CTE9DSyksICYjMzQ7bm9uYmxvY2tpbmcgb3V0cHV0JiMzNDspKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwlpZiAoc2lnbm8gJmFtcDsmYW1wOyAhQVNTRVJUX09LKGtpbGwoY2hpbGQtJmd0O3BpZCwgc2lnbm8pLCAmIzM0O3NpZ25hbCBjb25zdW1lciYjMzQ7KSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFdBSVRfU1RFUFM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQl3aGlsZSAodXNlZCAmbHQ7IHNpemUgLSAxICZhbXA7JmFtcDsKJiM0MzsJCSAgICAgICAobiA9IHJlYWQoY2hpbGQtJmd0O2ZkLCBvdXRwdXQgJiM0MzsgdXNlZCwgc2l6ZSAtIDEgLSB1c2VkKSkgJmd0OyAwKQomIzQzOwkJCXVzZWQgJiM0Mzs9IG47CiYjNDM7CQlyZXQgPSB3YWl0cGlkKGNoaWxkLSZndDtwaWQsICZhbXA7c3RhdHVzLCBXTk9IQU5HKTsKJiM0MzsJCWlmIChyZXQgPT0gY2hpbGQtJmd0O3BpZCkKJiM0MzsJCQlicmVhazsKJiM0MzsJCWlmIChyZXQgJmx0OyAwICZhbXA7JmFtcDsgZXJybm8gIT0gRUlOVFIpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl1c2xlZXAoV0FJVF9VUyk7CiYjNDM7CX0KJiM0MzsJaWYgKCFBU1NFUlRfRVEocmV0LCBjaGlsZC0mZ3Q7cGlkLCAmIzM0O2JvdW5kZWQgY29uc3VtZXIgZXhpdCYjMzQ7KSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJY2hpbGQtJmd0O3BpZCA9IC0xOwomIzQzOwl3aGlsZSAodXNlZCAmbHQ7IHNpemUgLSAxICZhbXA7JmFtcDsgKG4gPSByZWFkKGNoaWxkLSZndDtmZCwgb3V0cHV0ICYjNDM7IHVzZWQsIHNpemUgLSAxIC0gdXNlZCkpICZndDsgMCkKJiM0MzsJCXVzZWQgJiM0Mzs9IG47CiYjNDM7CW91dHB1dFt1c2VkXSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJcmV0dXJuIEFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCAmIzM0O25vcm1hbCBleGl0JiMzNDspICZhbXA7JmFtcDsKJiM0MzsJICAgICAgIEFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpID09IDAsIHN1Y2Nlc3MsICYjMzQ7ZXhpdCBzdGF0dXMmIzM0Oyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIGNvbnN1bWVyX3JlYWR5KHN0cnVjdCBjb25zdW1lciAqY2hpbGQpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIGxvbmcgY2F1Z2h0OwomIzQzOwljaGFyIHBhdGhbNjRdLCBsaW5lWzI1Nl07CiYjNDM7CWludCBpOwomIzQzOwlGSUxFICpmOwomIzQzOwomIzQzOwlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICYjMzQ7L3Byb2MvJWQvc3RhdHVzJiMzNDssIGNoaWxkLSZndDtwaWQpOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgV0FJVF9TVEVQUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWYgPSBmb3BlbihwYXRoLCAmIzM0O3ImIzM0Oyk7CiYjNDM7CQlpZiAoIWYpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmKSkgewomIzQzOwkJCWlmIChzc2NhbmYobGluZSwgJiMzNDtTaWdDZ3Q6ICVsbHgmIzM0OywgJmFtcDtjYXVnaHQpID09IDEgJmFtcDsmYW1wOwomIzQzOwkJCSAgICAoY2F1Z2h0ICZhbXA7ICgxVUxMICZsdDsmbHQ7IChTSUdJTlQgLSAxKSkpICZhbXA7JmFtcDsKJiM0MzsJCQkgICAgKGNhdWdodCAmYW1wOyAoMVVMTCAmbHQ7Jmx0OyAoU0lHVEVSTSAtIDEpKSkpIHsKJiM0MzsJCQkJZmNsb3NlKGYpOwomIzQzOwkJCQlyZXR1cm4gdHJ1ZTsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CQlmY2xvc2UoZik7CiYjNDM7CQl1c2xlZXAoV0FJVF9VUyk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIEFTU0VSVF9UUlVFKGZhbHNlLCAmIzM0O2NvbnN1bWVyIHNpZ25hbCBoYW5kbGVycyByZWFkeSYjMzQ7KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgZW1pdF9yZWNvcmQoc3RydWN0IGJwZnRvb2xfcmluZ2J1ZiAqc2tlbCwgaW50IHJlY29yZCkKJiM0Mzt7CiYjNDM7CWNoYXIgcGFja2V0WzY0XSA9IHt9OwomIzQzOwomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgb3B0cywKJiM0MzsJCSAgICAuZGF0YV9pbiA9IHBhY2tldCwKJiM0MzsJCSAgICAuZGF0YV9zaXplX2luID0gc2l6ZW9mKHBhY2tldCksCiYjNDM7CSk7CiYjNDM7CiYjNDM7CXNrZWwtJmd0O2Jzcy0mZ3Q7cmVjb3JkID0gcmVjb3JkOwomIzQzOwlyZXR1cm4gQVNTRVJUX09LKGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMoYnBmX3Byb2dyYW1fX2ZkKHNrZWwtJmd0O3Byb2dzLnByb2R1Y2UpLAomIzQzOwkJCQkJICAgICAgJmFtcDtvcHRzKSwgJiMzNDtwcm9kdWNlIHJlY29yZCYjMzQ7KSAmYW1wOyZhbXA7CiYjNDM7CSAgICAgICBBU1NFUlRfT0soc2tlbC0mZ3Q7YnNzLSZndDtvdXRwdXRfZXJyLCAmIzM0O3JpbmdidWYgb3V0cHV0JiMzNDspOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBjb25zdW1lZCh1bnNpZ25lZCBsb25nICpwb3NpdGlvbiwgdW5zaWduZWQgbG9uZyBleHBlY3RlZCkKJiM0Mzt7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgV0FJVF9TVEVQUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChfX2F0b21pY19sb2FkX24ocG9zaXRpb24sIF9fQVRPTUlDX0FDUVVJUkUpID09IGV4cGVjdGVkKQomIzQzOwkJCXJldHVybiB0cnVlOwomIzQzOwkJdXNsZWVwKFdBSVRfVVMpOwomIzQzOwl9CiYjNDM7CXJldHVybiBBU1NFUlRfRVEoKnBvc2l0aW9uLCBleHBlY3RlZCwgJiMzNDtjb25zdW1lciBwb3NpdGlvbiYjMzQ7KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfanNvbihjaGFyICpvdXRwdXQsIGNvbnN0IGNoYXIgKmV4cGVjdGVkKQomIzQzO3sKJiM0MzsJY2hhciAqc3JjID0gb3V0cHV0LCAqZHN0ID0gb3V0cHV0OwomIzQzOwlib29sIHF1b3RlZCA9IGZhbHNlLCBlc2NhcGVkID0gZmFsc2U7CiYjNDM7CiYjNDM7CS8qIElnbm9yZSBmb3JtYXR0aW5nIHdoaXRlc3BhY2Ugd2hpbGUgY2hlY2tpbmcgdGhlIGVudGlyZSBKU09OIGRvY3VtZW50LiAqLwomIzQzOwl3aGlsZSAoKnNyYykgewomIzQzOwkJaWYgKHF1b3RlZCB8fCAhaXNzcGFjZSgodW5zaWduZWQgY2hhcikqc3JjKSkKJiM0MzsJCQkqZHN0JiM0MzsmIzQzOyA9ICpzcmM7CiYjNDM7CQlpZiAoIWVzY2FwZWQgJmFtcDsmYW1wOyAqc3JjID09ICYjMzk7JiMzNDsmIzM5OykKJiM0MzsJCQlxdW90ZWQgPSAhcXVvdGVkOwomIzQzOwkJZXNjYXBlZCA9ICFlc2NhcGVkICZhbXA7JmFtcDsgcXVvdGVkICZhbXA7JmFtcDsgKnNyYyA9PSAmIzM5O1xcJiMzOTs7CiYjNDM7CQlzcmMmIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CSpkc3QgPSAmIzM5O1wwJiMzOTs7CiYjNDM7CUFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCAmIzM0O0pTT04gcmVjb3JkcyYjMzQ7KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9jb25zdW1lcihjb25zdCBjaGFyICpmb3JtYXQsIGJvb2wgaWRsZSwgaW50IHNpZ25vLCBib29sIHBpbm5lZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9OwomIzQzOwlzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsOwomIzQzOwl1bnNpZ25lZCBsb25nICpwb3NpdGlvbiA9IE1BUF9GQUlMRUQ7CiYjNDM7CWludCBwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpLCBmZDsKJiM0MzsJY2hhciBwaW5fZGlyW10gPSAmIzM0Oy9zeXMvZnMvYnBmL2JwZnRvb2xfcmluZ2J1Zl9YWFhYWFgmIzM0OzsKJiM0MzsJY2hhciBwaW5fcGF0aFtzaXplb2YocGluX2RpcikgJiM0Mzsgc2l6ZW9mKCYjMzQ7L21hcCYjMzQ7KV07CiYjNDM7CWJvb2wgZGlyX2NyZWF0ZWQgPSBmYWxzZSwgbWFwX3Bpbm5lZCA9IGZhbHNlOwomIzQzOwljaGFyIG91dHB1dFs0MDk2XTsKJiM0MzsJc3RydWN0IHBvbGxmZCBwZmQ7CiYjNDM7CiYjNDM7CXNrZWwgPSBicGZ0b29sX3JpbmdidWZfX29wZW4oKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsICYjMzQ7b3BlbiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJYnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtJmd0O21hcHMucmluZ2J1ZiwgcGFnZV9zaXplKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soYnBmdG9vbF9yaW5nYnVmX19sb2FkKHNrZWwpLCAmIzM0O2xvYWQmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZmQgPSBicGZfbWFwX19mZChza2VsLSZndDttYXBzLnJpbmdidWYpOwomIzQzOwlpZiAocGlubmVkKSB7CiYjNDM7CQlpZiAoIUFTU0VSVF9PS19QVFIobWtkdGVtcChwaW5fZGlyKSwgJiMzNDtjcmVhdGUgcGluIGRpcmVjdG9yeSYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCWRpcl9jcmVhdGVkID0gdHJ1ZTsKJiM0MzsJCXNucHJpbnRmKHBpbl9wYXRoLCBzaXplb2YocGluX3BhdGgpLCAmIzM0OyVzL21hcCYjMzQ7LCBwaW5fZGlyKTsKJiM0MzsJCWlmICghQVNTRVJUX09LKGJwZl9vYmpfcGluKGZkLCBwaW5fcGF0aCksICYjMzQ7cGluIHJpbmdidWYmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQltYXBfcGlubmVkID0gdHJ1ZTsKJiM0MzsJfQomIzQzOwlwb3NpdGlvbiA9IG1tYXAoTlVMTCwgcGFnZV9zaXplLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIGZkLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfTkVRKHBvc2l0aW9uLCBNQVBfRkFJTEVELCAmIzM0O2NvbnN1bWVyIG1tYXAmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKCFpZGxlICZhbXA7JmFtcDsgKCFlbWl0X3JlY29yZChza2VsLCAwKSB8fCAhZW1pdF9yZWNvcmQoc2tlbCwgMSkpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghY29uc3VtZXJfc3RhcnQoJmFtcDtjaGlsZCwgZmQsIGZvcm1hdCwgcGlubmVkID8gcGluX3BhdGggOiBOVUxMLAomIzQzOwkJCSAgICBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8CiYjNDM7CSAgICAhY29uc3VtZXJfcmVhZHkoJmFtcDtjaGlsZCkpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKCFpZGxlKSB7CiYjNDM7CQkvKiBCb3RoIHByZWZpbGxlZCByZWNvcmRzIG9jY3VweSAxNiBieXRlcyBpbmNsdWRpbmcgdGhlaXIgaGVhZGVycy4gKi8KJiM0MzsJCWlmICghY29uc3VtZWQocG9zaXRpb24sIDMyKSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCXBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IGNoaWxkLmZkLCAuZXZlbnRzID0gUE9MTElOIH07CiYjNDM7CQlpZiAoIUFTU0VSVF9HVChwb2xsKCZhbXA7cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApLCAwLAomIzQzOwkJCSAgICAgICAmIzM0O3JlY29yZHMgZmx1c2hlZCBiZWZvcmUgZXhpdCYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfVFJVRShwZmQucmV2ZW50cyAmYW1wOyBQT0xMSU4sICYjMzQ7cmVjb3JkIG91dHB1dCByZWFkYWJsZSYjMzQ7KSB8fAomIzQzOwkJICAgICFlbWl0X3JlY29yZChza2VsLCAyKSB8fCAhY29uc3VtZWQocG9zaXRpb24sIDY0KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlpZiAoIWNvbnN1bWVyX2ZpbmlzaCgmYW1wO2NoaWxkLCBzaWdubywgdHJ1ZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKGZvcm1hdCAmYW1wOyZhbXA7ICFzdHJjbXAoZm9ybWF0LCAmIzM0Oy1wJiMzNDspKQomIzQzOwkJQVNTRVJUX1NUUkVRKG91dHB1dCwgaWRsZSA/ICYjMzQ7W11cbiYjMzQ7IDoKJiM0MzsJCQkgICAgICYjMzQ7W3tcbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OyAgICAgICAgXCYjMzQ7c2l6ZVwmIzM0OzogMixcbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OyAgICAgICAgXCYjMzQ7ZGF0YVwmIzM0OzogWzAsMjU1XG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDsgICAgICAgIF1cbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OyAgICB9LHtcbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OyAgICAgICAgXCYjMzQ7c2l6ZVwmIzM0OzogNSxcbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OyAgICAgICAgXCYjMzQ7ZGF0YVwmIzM0OzogWzEsMiwzLDQsNVxuJiMzNDsKJiM0MzsJCQkgICAgICYjMzQ7ICAgICAgICBdXG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDsgICAgfSx7XG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDsgICAgICAgIFwmIzM0O3NpemVcJiMzNDs6IDE3LFxuJiMzNDsKJiM0MzsJCQkgICAgICYjMzQ7ICAgICAgICBcJiMzNDtkYXRhXCYjMzQ7OiBbMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzJcbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OyAgICAgICAgXVxuJiMzNDsKJiM0MzsJCQkgICAgICYjMzQ7ICAgIH1cbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0O11cbiYjMzQ7LCAmIzM0O3ByZXR0eSBKU09OIHJlY29yZHMmIzM0Oyk7CiYjNDM7CWVsc2UgaWYgKGZvcm1hdCkKJiM0MzsJCWNoZWNrX2pzb24ob3V0cHV0LCBpZGxlID8gJiMzNDtbXSYjMzQ7IDoKJiM0MzsJCQkgICAmIzM0O1t7XCYjMzQ7c2l6ZVwmIzM0OzoyLFwmIzM0O2RhdGFcJiMzNDs6WzAsMjU1XX0sJiMzNDsKJiM0MzsJCQkgICAmIzM0O3tcJiMzNDtzaXplXCYjMzQ7OjUsXCYjMzQ7ZGF0YVwmIzM0OzpbMSwyLDMsNCw1XX0sJiMzNDsKJiM0MzsJCQkgICAmIzM0O3tcJiMzNDtzaXplXCYjMzQ7OjE3LFwmIzM0O2RhdGFcJiMzNDs6WzE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLCYjMzQ7CiYjNDM7CQkJICAgJiMzNDsyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMl19XSYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJQVNTRVJUX1NUUkVRKG91dHB1dCwgaWRsZSA/ICYjMzQ7JiMzNDsgOgomIzQzOwkJCSAgICAgJiMzNDs9PSBzaXplOiAyID09PT09XG4wMCBmZlxuJiMzNDsKJiM0MzsJCQkgICAgICYjMzQ7PT0gc2l6ZTogNSA9PT09PVxuMDEgMDIgMDMgMDQgMDVcbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0Oz09IHNpemU6IDE3ID09PT09XG4xMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAgJiMzNDsKJiM0MzsJCQkgICAgICYjMzQ7MTggMTkgMWEgMWIgMWMgMWQgMWUgMWZcbjIwXG4mIzM0OywgJiMzNDtwbGFpbiByZWNvcmRzJiMzNDspOwomIzQzO291dDoKJiM0MzsJY29uc3VtZXJfY2xlYW51cCgmYW1wO2NoaWxkKTsKJiM0MzsJaWYgKHBvc2l0aW9uICE9IE1BUF9GQUlMRUQpCiYjNDM7CQltdW5tYXAocG9zaXRpb24sIHBhZ2Vfc2l6ZSk7CiYjNDM7CWlmIChtYXBfcGlubmVkKQomIzQzOwkJQVNTRVJUX09LKHVubGluayhwaW5fcGF0aCksICYjMzQ7dW5waW4gcmluZ2J1ZiYjMzQ7KTsKJiM0MzsJaWYgKGRpcl9jcmVhdGVkKQomIzQzOwkJQVNTRVJUX09LKHJtZGlyKHBpbl9kaXIpLCAmIzM0O3JlbW92ZSBwaW4gZGlyZWN0b3J5JiMzNDspOwomIzQzOwlicGZ0b29sX3JpbmdidWZfX2Rlc3Ryb3koc2tlbCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfcGVyZl9jb25zdW1lcih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGNvbnN1bWVyIGNoaWxkID0geyAucGlkID0gLTEsIC5mZCA9IC0xIH07CiYjNDM7CXVuc2lnbmVkIGxvbmcgbG9uZyBzZWNvbmRzLCBuYW5vc2Vjb25kczsKJiM0MzsJc3RydWN0IGJwZnRvb2xfcmluZ2J1ZiAqc2tlbDsKJiM0MzsJY2hhciBvdXRwdXRbMTYzODRdLCBleHBlY3RlZFsxNjM4NF07CiYjNDM7CWludCBucl9jcHVzLCBjcHUsIGluZGV4LCBvZmZzZXQgPSAwLCBpLCB1c2VkID0gMCwgZmllbGRzOwomIzQzOwlzdHJ1Y3QgcG9sbGZkIHBmZDsKJiM0MzsKJiM0MzsJbnJfY3B1cyA9IGxpYmJwZl9udW1fcG9zc2libGVfY3B1cygpOwomIzQzOwlpZiAoIUFTU0VSVF9HVChucl9jcHVzLCAwLCAmIzM0O3Bvc3NpYmxlIGNwdXMmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CXNrZWwgPSBicGZ0b29sX3JpbmdidWZfX29wZW4oKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsICYjMzQ7b3BlbiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJYnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtJmd0O21hcHMucmluZ2J1ZiwgZ2V0cGFnZXNpemUoKSk7CiYjNDM7CWJwZl9tYXBfX3NldF9tYXhfZW50cmllcyhza2VsLSZndDttYXBzLnBlcmZidWYsIG5yX2NwdXMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhicGZ0b29sX3JpbmdidWZfX2xvYWQoc2tlbCksICYjMzQ7bG9hZCYjMzQ7KSB8fAomIzQzOwkgICAgIWNvbnN1bWVyX3N0YXJ0KCZhbXA7Y2hpbGQsIGJwZl9tYXBfX2ZkKHNrZWwtJmd0O21hcHMucGVyZmJ1ZiksIE5VTEwsCiYjNDM7CQkJICAgIE5VTEwsIE5VTEwsIGZhbHNlLCBmYWxzZSkgfHwgIWNvbnN1bWVyX3JlYWR5KCZhbXA7Y2hpbGQpIHx8CiYjNDM7CSAgICAhZW1pdF9yZWNvcmQoc2tlbCwgMykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJLyogT25lIGxhcmdlIHJlY29yZCBmbHVzaGVzIHRoZSBleGlzdGluZyBidWZmZXJlZCBwZXJmIG91dHB1dCBjYWxsYmFjay4gKi8KJiM0MzsJcGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gY2hpbGQuZmQsIC5ldmVudHMgPSBQT0xMSU4gfTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QocG9sbCgmYW1wO3BmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSwgMCwKJiM0MzsJCSAgICAgICAmIzM0O3BlcmYgcmVjb3JkIG91dHB1dCYjMzQ7KSB8fAomIzQzOwkgICAgIUFTU0VSVF9UUlVFKHBmZC5yZXZlbnRzICZhbXA7IFBPTExJTiwgJiMzNDtwZXJmIG91dHB1dCByZWFkYWJsZSYjMzQ7KSB8fAomIzQzOwkgICAgIWNvbnN1bWVyX2ZpbmlzaCgmYW1wO2NoaWxkLCBTSUdJTlQsIHRydWUsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWZpZWxkcyA9IHNzY2FuZihvdXRwdXQsICYjMzQ7PT0gQCVsbHUuJWxsdSBDUFU6ICVkIGluZGV4OiAlZCA9PT09PVxuJW4mIzM0OywKJiM0MzsJCQkmYW1wO3NlY29uZHMsICZhbXA7bmFub3NlY29uZHMsICZhbXA7Y3B1LCAmYW1wO2luZGV4LCAmYW1wO29mZnNldCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGZpZWxkcywgNCwgJiMzNDtwZXJmIGhlYWRlciYjMzQ7KSB8fAomIzQzOwkgICAgIUFTU0VSVF9HVChvZmZzZXQsIDAsICYjMzQ7cGVyZiBwYXlsb2FkIG9mZnNldCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlBU1NFUlRfR1Qoc2Vjb25kcyAqIDEwMDAwMDAwMDBVTEwgJiM0MzsgbmFub3NlY29uZHMsIDAsICYjMzQ7cGVyZiB0aW1lc3RhbXAmIzM0Oyk7CiYjNDM7CUFTU0VSVF9MVChuYW5vc2Vjb25kcywgMTAwMDAwMDAwMFVMTCwgJiMzNDtwZXJmIHRpbWVzdGFtcCBuYW5vc2Vjb25kcyYjMzQ7KTsKJiM0MzsJQVNTRVJUX0dFKGNwdSwgMCwgJiMzNDtwZXJmIGNwdSYjMzQ7KTsKJiM0MzsJQVNTRVJUX0xUKGNwdSwgbnJfY3B1cywgJiMzNDtwZXJmIGNwdSByYW5nZSYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGluZGV4LCBjcHUsICYjMzQ7cGVyZiBpbmRleCYjMzQ7KTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IHNpemVvZihza2VsLSZndDtyb2RhdGEtJmd0O3BlcmZfcGF5bG9hZCk7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQljb25zdCBjaGFyICpzZXBhcmF0b3IgPSAhaSA/ICYjMzQ7JiMzNDsgOiAhKGkgJSAxNikgPyAmIzM0O1xuJiMzNDsgOgomIzQzOwkJCQkJIShpICUgOCkgPyAmIzM0OyAgJiMzNDsgOiAmIzM0OyAmIzM0OzsKJiM0MzsKJiM0MzsJCXVzZWQgJiM0Mzs9IHNucHJpbnRmKGV4cGVjdGVkICYjNDM7IHVzZWQsIHNpemVvZihleHBlY3RlZCkgLSB1c2VkLAomIzQzOwkJCQkgJiMzNDslcyUwMngmIzM0Oywgc2VwYXJhdG9yLCBpID09IDEgPyAweGZmIDogMCk7CiYjNDM7CX0KJiM0MzsJc25wcmludGYoZXhwZWN0ZWQgJiM0MzsgdXNlZCwgc2l6ZW9mKGV4cGVjdGVkKSAtIHVzZWQsICYjMzQ7XG4mIzM0Oyk7CiYjNDM7CUFTU0VSVF9TVFJFUShvdXRwdXQgJiM0Mzsgb2Zmc2V0LCBleHBlY3RlZCwgJiMzNDtwZXJmIHBheWxvYWQmIzM0Oyk7CiYjNDM7b3V0OgomIzQzOwljb25zdW1lcl9jbGVhbnVwKCZhbXA7Y2hpbGQpOwomIzQzOwlicGZ0b29sX3JpbmdidWZfX2Rlc3Ryb3koc2tlbCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfcmVqZWN0KGVudW0gYnBmX21hcF90eXBlIHR5cGUsIGNvbnN0IGNoYXIgKm9wdGlvbiwgYm9vbCBwYWlyLCBib29sIGpzb24pCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTsKJiM0MzsJYm9vbCByaW5nID0gdHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRiB8fCB0eXBlID09IEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUY7CiYjNDM7CWNvbnN0IGNoYXIgKmV4cGVjdGVkID0gb3B0aW9uID8KJiM0MzsJCSYjMzQ7e1wmIzM0O2Vycm9yXCYjMzQ7OlwmIzM0O3JpbmcgYnVmZmVyIG1hcHMgZG8gbm90IHN1cHBvcnQgY3B1IG9yIGluZGV4IGFyZ3VtZW50c1wmIzM0O30mIzM0OyA6CiYjNDM7CQkmIzM0O3tcJiMzNDtlcnJvclwmIzM0OzpcJiMzNDttYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheSBvciByaW5nIGJ1ZmZlclwmIzM0O30mIzM0OzsKJiM0MzsJY2hhciBvdXRwdXRbNDA5Nl07CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJZmQgPSBicGZfbWFwX2NyZWF0ZSh0eXBlLCBOVUxMLCByaW5nID8gMCA6IDQsIHJpbmcgPyAwIDogNCwKJiM0MzsJCQkgICAgcmluZyA/IGdldHBhZ2VzaXplKCkgOiAxLCBOVUxMKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7Y3JlYXRlIG1hcCYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJaWYgKGNvbnN1bWVyX3N0YXJ0KCZhbXA7Y2hpbGQsIGZkLCBqc29uID8gJiMzNDstaiYjMzQ7IDogTlVMTCwgTlVMTCwgb3B0aW9uLCBwYWlyLCB0cnVlKSAmYW1wOyZhbXA7CiYjNDM7CSAgICBjb25zdW1lcl9maW5pc2goJmFtcDtjaGlsZCwgMCwgZmFsc2UsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKSB7CiYjNDM7CQlpZiAoanNvbikKJiM0MzsJCQljaGVja19qc29uKG91dHB1dCwgZXhwZWN0ZWQpOwomIzQzOwkJZWxzZQomIzQzOwkJCUFTU0VSVF9HVChzdHJsZW4ob3V0cHV0KSwgMCwgJiMzNDtlcnJvciBkaWFnbm9zdGljJiMzNDspOwomIzQzOwl9CiYjNDM7CWNvbnN1bWVyX2NsZWFudXAoJmFtcDtjaGlsZCk7CiYjNDM7CWNsb3NlKGZkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X2JwZnRvb2xfcmluZ2J1Zih2b2lkKQomIzQzO3sKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtwZXJmX2V2ZW50X2FycmF5JiMzNDspKQomIzQzOwkJdGVzdF9wZXJmX2NvbnN1bWVyKCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cGxhaW4mIzM0OykpCiYjNDM7CQl0ZXN0X2NvbnN1bWVyKE5VTEwsIGZhbHNlLCBTSUdJTlQsIGZhbHNlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtqc29uJiMzNDspKQomIzQzOwkJdGVzdF9jb25zdW1lcigmIzM0Oy1qJiMzNDssIGZhbHNlLCBTSUdURVJNLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cHJldHR5X2pzb24mIzM0OykpCiYjNDM7CQl0ZXN0X2NvbnN1bWVyKCYjMzQ7LXAmIzM0OywgZmFsc2UsIFNJR0lOVCwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3Bpbm5lZF9wbGFpbiYjMzQ7KSkKJiM0MzsJCXRlc3RfY29uc3VtZXIoTlVMTCwgZmFsc2UsIFNJR1RFUk0sIHRydWUpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3Bpbm5lZF9qc29uJiMzNDspKQomIzQzOwkJdGVzdF9jb25zdW1lcigmIzM0Oy1qJiMzNDssIGZhbHNlLCBTSUdJTlQsIHRydWUpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3Bpbm5lZF9wcmV0dHlfanNvbiYjMzQ7KSkKJiM0MzsJCXRlc3RfY29uc3VtZXIoJiMzNDstcCYjMzQ7LCBmYWxzZSwgU0lHVEVSTSwgdHJ1ZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7aWRsZV9zaWdpbnQmIzM0OykpCiYjNDM7CQl0ZXN0X2NvbnN1bWVyKE5VTEwsIHRydWUsIFNJR0lOVCwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2lkbGVfc2lndGVybV9qc29uJiMzNDspKQomIzQzOwkJdGVzdF9jb25zdW1lcigmIzM0Oy1qJiMzNDssIHRydWUsIFNJR1RFUk0sIGZhbHNlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtpZGxlX3NpZ2ludF9wcmV0dHlfanNvbiYjMzQ7KSkKJiM0MzsJCXRlc3RfY29uc3VtZXIoJiMzNDstcCYjMzQ7LCB0cnVlLCBTSUdJTlQsIGZhbHNlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtyZWplY3RfYXJyYXkmIzM0OykpCiYjNDM7CQl0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfQVJSQVksIE5VTEwsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cmVqZWN0X3VzZXJfcmluZ2J1ZiYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cmVqZWN0X2NwdSYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCAmIzM0O2NwdSYjMzQ7LCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JlamVjdF9pbmRleCYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCAmIzM0O2luZGV4JiMzNDssIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cmVqZWN0X2NwdV9pbmRleCYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCAmIzM0O2NwdSYjMzQ7LCB0cnVlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cmVqZWN0X3VzZXJfcmluZ2J1Zl9qc29uJiMzNDspKQomIzQzOwkJdGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRiwgTlVMTCwgZmFsc2UsIHRydWUpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JlamVjdF9jcHVfaW5kZXhfanNvbiYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCAmIzM0O2NwdSYjMzQ7LCB0cnVlLCB0cnVlKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uYmJiYzkzYzMwYTgzMwotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9icGZ0b29sX3JpbmdidWYuYwpAQCAtMCwwICYjNDM7MSw0NyBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2JwZi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1JJTkdCVUYpOwomIzQzO30gcmluZ2J1ZiBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkpOwomIzQzOwlfX3VpbnQoa2V5X3NpemUsIHNpemVvZihfX3UzMikpOwomIzQzOwlfX3VpbnQodmFsdWVfc2l6ZSwgc2l6ZW9mKF9fdTMyKSk7CiYjNDM7CV9fdWludChtYXhfZW50cmllcywgMSk7CiYjNDM7fSBwZXJmYnVmIFNFQygmIzM0Oy5tYXBzJiMzNDspOwomIzQzOwomIzQzOy8qCiYjNDM7ICogSW5jbHVkZSB0aGUgdTMyIHJhdyBzaXplIGluIHBlcmYmIzM5O3MgOC1ieXRlIGFsaWdubWVudCB0byBhdm9pZCBwYWRkaW5nLgomIzQzOyAqIEtlZXAgcGxhaW4gb3V0cHV0IGxhcmdlIGVub3VnaCB0byBmbHVzaCBzdGRpbyBiZWZvcmUgdGhlIGNvbnN1bWVyIGV4aXRzLgomIzQzOyAqLwomIzQzO2NvbnN0IHVuc2lnbmVkIGNoYXIgcGVyZl9wYXlsb2FkWzQwOTJdID0geyAweDAwLCAweGZmIH07CiYjNDM7CiYjNDM7aW50IHJlY29yZDsKJiM0MztpbnQgb3V0cHV0X2VycjsKJiM0MzsKJiM0MztTRUMoJiMzNDtzb2NrZXQmIzM0OykKJiM0MztpbnQgcHJvZHVjZShzdHJ1Y3QgX19za19idWZmICpza2IpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBjaGFyIGZpcnN0W10gPSB7IDB4MDAsIDB4ZmYgfTsKJiM0MzsJdW5zaWduZWQgY2hhciBzZWNvbmRbXSA9IHsgMSwgMiwgMywgNCwgNSB9OwomIzQzOwl1bnNpZ25lZCBjaGFyIHRoaXJkW10gPSB7CiYjNDM7CQkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LAomIzQzOwkJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJaWYgKHJlY29yZCA9PSAwKQomIzQzOwkJb3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dCgmYW1wO3JpbmdidWYsIGZpcnN0LCBzaXplb2YoZmlyc3QpLCAwKTsKJiM0MzsJZWxzZSBpZiAocmVjb3JkID09IDEpCiYjNDM7CQlvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KCZhbXA7cmluZ2J1Ziwgc2Vjb25kLCBzaXplb2Yoc2Vjb25kKSwgMCk7CiYjNDM7CWVsc2UgaWYgKHJlY29yZCA9PSAyKQomIzQzOwkJb3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dCgmYW1wO3JpbmdidWYsIHRoaXJkLCBzaXplb2YodGhpcmQpLCAwKTsKJiM0MzsJZWxzZQomIzQzOwkJb3V0cHV0X2VyciA9IGJwZl9wZXJmX2V2ZW50X291dHB1dChza2IsICZhbXA7cGVyZmJ1ZiwgQlBGX0ZfQ1VSUkVOVF9DUFUsCiYjNDM7CQkJCQkJICAgKHZvaWQgKilwZXJmX3BheWxvYWQsIHNpemVvZihwZXJmX3BheWxvYWQpKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgTElDRU5TRVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwMzowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTkwNwoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDM3MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBQYXRjaCBTZXJpZXMqKgoKT2theSwgc28gdGhlIHVzZXIgd2FudHMgbWUgdG8gZXZhbHVhdGUgdGhpcyBwYXRjaCBzZXJpZXMgY29tbWl0dGVkIGF0IEhFQUQuIE15IGZpcnN0IHN0ZXAgaXMgdG8gcXVpY2tseSBhbmFseXplIHRoZSBjaGFuZ2VkIGZpbGVzIHVzaW5nIHRoZSBwcm92aWRlZCBgZ2l0IGRpZmZgLiBJIHNlZSBpdCB0b3VjaGVzIHRoZXNlIGZpbGVzOiBgdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RgLCBgdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xgLCBgdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jYCwgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jYCwgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNgLgoKTm93LCBhY2NvcmRpbmcgdG8gdGhlIGd1aWRlbGluZXMsIEkgbmVlZCB0byBkZXRlcm1pbmUgaWYgdGhpcyB3YXJyYW50cyBmdXJ0aGVyIGZ1enppbmcuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhpcyBkb2VzbiYjMzk7dCBmYWxsIGludG8gdGhlICYjMzQ7TmVnYXRpdmUgQ3JpdGVyaWEmIzM0Oy4gU3BlY2lmaWNhbGx5LCBpcyAqYWxsKiB0aGUgbW9kaWZpZWQgY29kZSBzdHJpY3RseSBjb25maW5lZCB0bzogZG9jdW1lbnRhdGlvbiwgY29tbWVudHMsIHNwZWxsaW5nIGZpeGVzLCB1c2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIHRoYXQgKmRvbiYjMzk7dCogaW1wYWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzPwoKQmFzZWQgb24gdGhlIGZpbGVzIGxpc3RlZCwgYWxsIG1vZGlmaWNhdGlvbnMgYXJlIHdpdGhpbiB0aGUgYHRvb2xzL2JwZi9icGZ0b29sL2AgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYCBkaXJlY3Rvcmllcy4gVGhpcyAqc2hvdWxkKiBtZWFuIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggdXNlci1zcGFjZSB0b29scyBhbmQgc2VsZi10ZXN0cy4gSSBuZWVkIHRvIGJlIGFic29sdXRlbHkgY2VydGFpbiB0aG91Z2guIEV2ZW4gdGhvdWdoIHRoZSBwcm92aWRlZCBkaWZmIGxvb2tzIGNvbXBsZXRlLCBJJiMzOTtsbCBxdWlja2x5IGRvdWJsZS1jaGVjayB0aGF0IGJ5IGNhbGxpbmcgYGdyZXBwZXJgIG9yIGNoZWNrIHRoZSBgZ2l0IHN0YXR1c2Agb3IgYGdpdCBkaWZmYCBhZ2Fpbi4gSnVzdCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG90aGVyIGNoYW5nZXMgbHVya2luZyB0aGF0IEkmIzM5O20gbWlzc2luZy4gQnV0IGJhc2VkIG9uIHRoaXMgcXVpY2sgc2NhbiwgdGhpcyAqc3Ryb25nbHkqIHBvaW50cyB0byB0aGUgcGF0Y2ggYmVpbmcgc2FmZSB0byBza2lwLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDAzOjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3ByaW50X3JpbmdidWZfb3V0cHV0JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYz01Nz1wcmludF9icGZfb3V0cHV0KHZvaWQgKnByaXZhdGVfZGF0YSwgaW50IGNwdSwgc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyICpldmVudClcbi0tXG50b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMtMTA4LVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jOjEwOTpzdGF0aWMgaW50IHByaW50X3JpbmdidWZfb3V0cHV0KHZvaWQgKmN0eCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpXG50b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMtMTEwLXtcbi0tXG50b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmM9MTMwPWludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbi0tXG50b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMtMjE1LVx0aWYgKG1hcF9pbmZvLnR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYzoyMTY6XHRcdHJiID0gcmluZ19idWZmZXJfX25ldyhtYXBfZmQsIHByaW50X3JpbmdidWZfb3V0cHV0LCBOVUxMLCBOVUxMKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYy0yMTctXHRcdGlmICghcmIpIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwMzowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjk4NgoJCQkJCQkJb3V0cHV0OiA5MAoJCQkJCQkJdGhvdWdodHM6IDE5MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBQYXRjaCYjMzk7cyBJbXBhY3QqKgoKT2theSwgc28gSSYjMzk7dmUgdGFrZW4gYSBsb29rIGF0IHRoaXMgcGF0Y2ggYW5kLCBiYXNlZCBvbiB0aGUgZmlsZSBwYXRocywgaXQmIzM5O3MgcHJldHR5IGNsZWFyIHdoZXJlIHRoZSBjaGFuZ2VzIGxpZS4gRXZlcnl0aGluZyYjMzk7cyBuZWF0bHkgdHVja2VkIHVuZGVyIHRoZSBgdG9vbHMvYCBkaXJlY3RvcnkuIFNlY3Rpb24gMiBvZiB0aGUgZG9jdW1lbnRhdGlvbiBleHBsaWNpdGx5IHN0YXRlcyB0aGF0IGFueXRoaW5nIGluIHRoYXQgc3BhY2UsIGxpa2UgdXNlci1zcGFjZSB1dGlsaXRpZXMsIHRlc3RzLCBvciBzY3JpcHRzLCB0aGF0IGRvZXNuJiMzOTt0IG1lc3Mgd2l0aCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlIChgdm1saW51eGApIG9yIGtlcm5lbCBtb2R1bGVzLCBpc24mIzM5O3Qgc29tZXRoaW5nIHdlIG5lZWQgdG8gZnV6ei4KClRoZXJlZm9yZSwgYFdvcnRoRnV6emluZ2AgaXMgZGVmaW5pdGVseSBzZXQgdG8gYGZhbHNlYCBoZXJlLiBUaGUgYEVuYWJsZUNvbmZpZ3NgIGFuZCBgRm9jdXNTeW1ib2xzYCBsaXN0cyBhcmUgYm90aCBlbXB0eSwgYXMgZXhwZWN0ZWQuIFRoZSByZWFzb25pbmcgZ2l2ZW4g4oCTIHRoYXQgdGhlIHBhdGNoIG9ubHkgYWZmZWN0cyB1c2VyLXNwYWNlIHRvb2xzIGxpa2UgYGJwZnRvb2xgIGFuZCBzb21lIEJQRiBzZWxmdGVzdHMg4oCTIGFuZCB0aGF0IG5vdGhpbmcgaW4gdGhlIGtlcm5lbCBzcGFjZSBpdHNlbGYgaXMgdG91Y2hlZCDigJMgZnVsbHkgc3VwcG9ydHMgdGhpcyBhc3Nlc3NtZW50LgoKSSYjMzk7dmUgYWxzbyBwZXJmb3JtZWQgYSBzYW5pdHkgY2hlY2sgb24gdGhlIHRvb2wgcGFyYW1ldGVycywganVzdCB0byBiZSB0aG9yb3VnaC4gVGhlIGBFbmFibGVDb25maWdzYCwgYEZvY3VzU3ltYm9sc2AgYW5kIHRoZSBgV29ydGhGdXp6aW5nYCBhcmUgY29uc2lzdGVudCwgYWdhaW4sIHJlaW5mb3JjaW5nIG15IHByZXZpb3VzIGFzc2Vzc21lbnQuCgpMb29rcyBsaWtlIGl0JiMzOTtzIHNhZmUgdG8gY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDAzOjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogW10sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgY2hhbmdlcyBhcmUgc3RyaWN0bHkgbGltaXRlZCB0byB1c2VyLXNwYWNlIHV0aWxpdGllcyAoYnBmdG9vbCB1bmRlciB0b29scy9icGYvYnBmdG9vbC8pIGFuZCBzZWxmdGVzdHMgKHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi8pLiBObyBrZXJuZWwtc3BhY2UgY29kZSBvciBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgvbW9kdWxlcykgaXMgbW9kaWZpZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBjaGFuZ2VzIGFyZSBzdHJpY3RseSBsaW1pdGVkIHRvIHVzZXItc3BhY2UgdXRpbGl0aWVzIChicGZ0b29sIHVuZGVyIHRvb2xzL2JwZi9icGZ0b29sLykgYW5kIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLykuIE5vIGtlcm5lbC1zcGFjZSBjb2RlIG9yIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eC9tb2R1bGVzKSBpcyBtb2RpZmllZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MDA8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDAzOjAwOjAyLjQ1MjI1MDM4M1oiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyODQwNjczMDc3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgY2hhbmdlcyBhcmUgc3RyaWN0bHkgbGltaXRlZCB0byB1c2VyLXNwYWNlIHV0aWxpdGllcyAoYnBmdG9vbCB1bmRlciB0b29scy9icGYvYnBmdG9vbC8pIGFuZCBzZWxmdGVzdHMgKHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi8pLiBObyBrZXJuZWwtc3BhY2UgY29kZSBvciBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgvbW9kdWxlcykgaXMgbW9kaWZpZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwMzowMDowMi40NTIyNTUyOTNaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQzMDg4Njg4OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGQzYWUzZDllMzU1ZWI4NjBkYjZkYTdlZjMzZTE0NzU5ZjZiNjU4YzdcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIEZyaSBTZXAgMTEgMDM6MDA6MDEgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLmU0ZWQ3ZTcwMWM5ZTQgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbkBAIC0xMjAsNyArMTIwLDggQEAgYnBmdG9vbCBtYXAgcGluICAgICAqTUFQKiAgKkZJTEUqXFxuICAgICBjaGFyYWN0ZXIgKCcuJyksIHdoaWNoIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyBvZiAqYnBmZnMqLlxcbiBcXG4gYnBmdG9vbCBtYXAgZXZlbnRfcGlwZSAqTUFQKiBbY3B1ICpOKiBpbmRleCAqTSpdXFxuLSAgICBSZWFkIGV2ZW50cyBmcm9tIGEgKipCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSoqIG1hcC5cXG4rICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogb3JcXG4rICAgICoqQlBGX01BUF9UWVBFX1JJTkdCVUYqKiBtYXAuXFxuIFxcbiAgICAgSW5zdGFsbCBwZXJmIHJpbmdzIGludG8gYSBwZXJmIGV2ZW50IGFycmF5IG1hcCBhbmQgZHVtcCBvdXRwdXQgb2YgYW55XFxuICAgICAqKmJwZl9wZXJmX2V2ZW50X291dHB1dCoqXFxcXCAoKSBjYWxsIGluIHRoZSBrZXJuZWwuIEJ5IGRlZmF1bHQgcmVhZCB0aGVcXG5AQCAtMTM0LDYgKzEzNSwxNyBAQCBicGZ0b29sIG1hcCBldmVudF9waXBlICpNQVAqIFtjcHUgKk4qIGluZGV4ICpNKl1cXG4gICAgIGV4aXN0aW5nIHJpbmcuICBBbnkgb3RoZXIgYXBwbGljYXRpb24gd2lsbCBzdG9wIHJlY2VpdmluZyBldmVudHMgaWYgaXRcXG4gICAgIGluc3RhbGxlZCBpdHMgcmluZ3MgZWFybGllci5cXG4gXFxuKyAgICBGb3IgYSByaW5nIGJ1ZmZlciBtYXAsIGNvbnN1bWUgcmVjb3JkcyBzdWJtaXR0ZWQgYnkgQlBGIHByb2dyYW1zLCBpbmNsdWRpbmdcXG4rICAgIHJlY29yZHMgYWxyZWFkeSBxdWV1ZWQgYmVmb3JlIHRoZSBjb21tYW5kIHN0YXJ0cy4gKipjcHUqKiBhbmQgKippbmRleCoqXFxuKyAgICBhcmUgbm90IHN1cHBvcnRlZC4gRWFjaCByZWNvcmQgaXMgcHJpbnRlZCBpbiBmdWxsLCBpbmNsdWRpbmcgZW1iZWRkZWQgemVyb1xcbisgICAgYnl0ZXMuIFBsYWluIG91dHB1dCByZXBvcnRzIHRoZSByZWNvcmQgc2l6ZSBmb2xsb3dlZCBieSBoZXhhZGVjaW1hbFxcbisgICAgYnl0ZXM7IEpTT04gb3V0cHV0IGNvbnRhaW5zICoqc2l6ZSoqIGFuZCAqKmRhdGEqKiBmaWVsZHMsIHdpdGggKipkYXRhKiogYW5cXG4rICAgIGFycmF5IG9mIGJ5dGUgdmFsdWVzLiBSaW5nIGJ1ZmZlciByZWNvcmRzIGhhdmUgbm8gaW1wbGljaXQgQ1BVIG9yIHRpbWVzdGFtcC5cXG4rXFxuKyAgICBDb25zdW1pbmcgYSByaW5nIGJ1ZmZlciBhZHZhbmNlcyBpdHMgc2hhcmVkIGNvbnN1bWVyIHBvc2l0aW9uLCBzbyB0aGlzXFxuKyAgICBjb21tYW5kIG11c3Qgbm90IHJ1biBhbG9uZ3NpZGUgYW5vdGhlciBjb25zdW1lciBvZiB0aGUgc2FtZSBtYXAuXFxuKyAgICAqKkJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYqKiBtYXBzIGFyZSBub3Qgc3VwcG9ydGVkLlxcbitcXG4gYnBmdG9vbCBtYXAgcGVlayAgKk1BUCpcXG4gICAgIFBlZWsgbmV4dCB2YWx1ZSBpbiB0aGUgcXVldWUgb3Igc3RhY2suXFxuIFxcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXFxuaW5kZXggNzVjYmNiNTEyZWJhZS4uMTc1MGI0ODhjOWUzYiAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXFxuQEAgLTg3OCwxMSArODc4LDExIEBAIF9icGZ0b29sKClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICBpZClcXG4tICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfaWRzX2Zvcl90eXBlIHBlcmZfZXZlbnRfYXJyYXlcXG4rICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfaWRzX2Zvcl90eXBlICdcXFwidHlwZVxcXCI6IFxcXCJcXFxcKHBlcmZfZXZlbnRfYXJyYXlcXFxcfHJpbmdidWZcXFxcKVxcXCInXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOztcXG4gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSlcXG4tICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfbmFtZXNfZm9yX3R5cGUgcGVyZl9ldmVudF9hcnJheVxcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9uYW1lc19mb3JfdHlwZSAnXFxcInR5cGVcXFwiOiBcXFwiXFxcXChwZXJmX2V2ZW50X2FycmF5XFxcXHxyaW5nYnVmXFxcXClcXFwiJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7XFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNwdSlcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jXFxuaW5kZXggYmNiNzY3ZTJkNjczMy4uN2Q1NTUzMzFmNDQzYSAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmNcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmNcXG5AQCAtMjcsNyArMjcsNyBAQFxcbiBcXG4gI2RlZmluZSBNTUFQX1BBR0VfQ05UXFx0MTZcXG4gXFxuLXN0YXRpYyB2b2xhdGlsZSBib29sIHN0b3A7XFxuK3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3Qgc3RvcDtcXG4gXFxuIHN0cnVjdCBwZXJmX2V2ZW50X3NhbXBsZSB7XFxuIFxcdHN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciBoZWFkZXI7XFxuQEAgLTQ0LDcgKzQ0LDYgQEAgc3RydWN0IHBlcmZfZXZlbnRfbG9zdCB7XFxuIFxcbiBzdGF0aWMgdm9pZCBpbnRfZXhpdChpbnQgc2lnbm8pXFxuIHtcXG4tXFx0ZnByaW50ZihzdGRlcnIsIFxcXCJTdG9wcGluZy4uLlxcXFxuXFxcIik7XFxuIFxcdHN0b3AgPSB0cnVlO1xcbiB9XFxuIFxcbkBAIC0xMDcsNiArMTA2LDI3IEBAIHByaW50X2JwZl9vdXRwdXQodm9pZCAqcHJpdmF0ZV9kYXRhLCBpbnQgY3B1LCBzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgKmV2ZW50KVxcbiBcXHRyZXR1cm4gTElCQlBGX1BFUkZfRVZFTlRfQ09OVDtcXG4gfVxcbiBcXG4rc3RhdGljIGludCBwcmludF9yaW5nYnVmX291dHB1dCh2b2lkICpjdHgsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKVxcbit7XFxuK1xcdGlmIChqc29uX291dHB1dCkge1xcbitcXHRcXHRqc29ud19zdGFydF9vYmplY3QoanNvbl93dHIpO1xcbitcXHRcXHRqc29ud191aW50X2ZpZWxkKGpzb25fd3RyLCBcXFwic2l6ZVxcXCIsIHNpemUpO1xcbitcXHRcXHRqc29ud19uYW1lKGpzb25fd3RyLCBcXFwiZGF0YVxcXCIpO1xcbitcXHRcXHRwcmludF9kYXRhX2pzb24oZGF0YSwgc2l6ZSk7XFxuK1xcdFxcdGpzb253X2VuZF9vYmplY3QoanNvbl93dHIpO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRwcmludGYoXFxcIj09IHNpemU6ICV6dSA9PT09PVxcXFxuXFxcIiwgc2l6ZSk7XFxuK1xcdFxcdGZwcmludF9oZXgoc3Rkb3V0LCBkYXRhLCBzaXplLCBcXFwiIFxcXCIpO1xcbitcXHRcXHRwcmludGYoXFxcIlxcXFxuXFxcIik7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChmZmx1c2goc3Rkb3V0KSlcXG4rXFx0XFx0cmV0dXJuIGVycm5vID8gLWVycm5vIDogLUVJTztcXG4rXFxuK1xcdC8qIEEgcHJvZHVjZXIgY2FuIGtlZXAgcG9sbCgpIGJ1c3kgZXZlbiBhZnRlciBhIHNpZ25hbCBhcnJpdmVzLiAqL1xcbitcXHRyZXR1cm4gc3RvcCA/IC1FSU5UUiA6IDA7XFxuK31cXG4rXFxuIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4ge1xcbiBcXHRzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIHBlcmZfYXR0ciA9IHtcXG5AQCAtMTIzLDE4ICsxNDMsMjYgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHQuY3B1ID0gLTEsXFxuIFxcdFxcdC5pZHggPSAtMSxcXG4gXFx0fTtcXG4tXFx0c3RydWN0IHBlcmZfYnVmZmVyICpwYjtcXG4rXFx0c3RydWN0IHBlcmZfYnVmZmVyICpwYiA9IE5VTEw7XFxuK1xcdHN0cnVjdCByaW5nX2J1ZmZlciAqcmIgPSBOVUxMO1xcbiBcXHRfX3UzMiBtYXBfaW5mb19sZW47XFxuIFxcdGludCBlcnIsIG1hcF9mZDtcXG4gXFxuK1xcdHN0b3AgPSBmYWxzZTtcXG4gXFx0bWFwX2luZm9fbGVuID0gc2l6ZW9mKG1hcF9pbmZvKTtcXG4gXFx0bWFwX2ZkID0gbWFwX3BhcnNlX2ZkX2FuZF9pbmZvKFxcdTAwMjZhcmdjLCBcXHUwMDI2YXJndiwgXFx1MDAyNm1hcF9pbmZvLCBcXHUwMDI2bWFwX2luZm9fbGVuLFxcbiBcXHRcXHRcXHRcXHQgICAgICAgMCk7XFxuIFxcdGlmIChtYXBfZmQgXFx1MDAzYyAwKVxcbiBcXHRcXHRyZXR1cm4gLTE7XFxuIFxcbi1cXHRpZiAobWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSkge1xcbi1cXHRcXHRwX2VycihcXFwibWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXlcXFwiKTtcXG4rXFx0aWYgKG1hcF9pbmZvLnR5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIG1hcF9pbmZvLnR5cGUgIT0gQlBGX01BUF9UWVBFX1JJTkdCVUYpIHtcXG4rXFx0XFx0cF9lcnIoXFxcIm1hcCBpcyBub3QgYSBwZXJmIGV2ZW50IGFycmF5IG9yIHJpbmcgYnVmZmVyXFxcIik7XFxuK1xcdFxcdGdvdG8gZXJyX2Nsb3NlX21hcDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKG1hcF9pbmZvLnR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgXFx1MDAyNlxcdTAwMjYgYXJnYykge1xcbitcXHRcXHRwX2VycihcXFwicmluZyBidWZmZXIgbWFwcyBkbyBub3Qgc3VwcG9ydCBjcHUgb3IgaW5kZXggYXJndW1lbnRzXFxcIik7XFxuIFxcdFxcdGdvdG8gZXJyX2Nsb3NlX21hcDtcXG4gXFx0fVxcbiBcXG5AQCAtMTg0LDE1ICsyMTIsMjQgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHRjdHguaWR4ID0gMDtcXG4gXFx0fVxcbiBcXG4tXFx0b3B0cy5jcHVfY250ID0gY3R4LmFsbF9jcHVzID8gMCA6IDE7XFxuLVxcdG9wdHMuY3B1cyA9IFxcdTAwMjZjdHguY3B1O1xcbi1cXHRvcHRzLm1hcF9rZXlzID0gXFx1MDAyNmN0eC5pZHg7XFxuLVxcdHBiID0gcGVyZl9idWZmZXJfX25ld19yYXcobWFwX2ZkLCBNTUFQX1BBR0VfQ05ULCBcXHUwMDI2cGVyZl9hdHRyLFxcbi1cXHRcXHRcXHRcXHQgIHByaW50X2JwZl9vdXRwdXQsIFxcdTAwMjZjdHgsIFxcdTAwMjZvcHRzKTtcXG4tXFx0aWYgKCFwYikge1xcbi1cXHRcXHRwX2VycihcXFwiZmFpbGVkIHRvIGNyZWF0ZSBwZXJmIGJ1ZmZlcjogJXMgKCVkKVxcXCIsXFxuLVxcdFxcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xcbi1cXHRcXHRnb3RvIGVycl9jbG9zZV9tYXA7XFxuK1xcdGlmIChtYXBfaW5mby50eXBlID09IEJQRl9NQVBfVFlQRV9SSU5HQlVGKSB7XFxuK1xcdFxcdHJiID0gcmluZ19idWZmZXJfX25ldyhtYXBfZmQsIHByaW50X3JpbmdidWZfb3V0cHV0LCBOVUxMLCBOVUxMKTtcXG4rXFx0XFx0aWYgKCFyYikge1xcbitcXHRcXHRcXHRwX2VycihcXFwiZmFpbGVkIHRvIGNyZWF0ZSByaW5nIGJ1ZmZlcjogJXMgKCVkKVxcXCIsXFxuK1xcdFxcdFxcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xcbitcXHRcXHRcXHRnb3RvIGVycl9jbG9zZV9tYXA7XFxuK1xcdFxcdH1cXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0b3B0cy5jcHVfY250ID0gY3R4LmFsbF9jcHVzID8gMCA6IDE7XFxuK1xcdFxcdG9wdHMuY3B1cyA9IFxcdTAwMjZjdHguY3B1O1xcbitcXHRcXHRvcHRzLm1hcF9rZXlzID0gXFx1MDAyNmN0eC5pZHg7XFxuK1xcdFxcdHBiID0gcGVyZl9idWZmZXJfX25ld19yYXcobWFwX2ZkLCBNTUFQX1BBR0VfQ05ULCBcXHUwMDI2cGVyZl9hdHRyLFxcbitcXHRcXHRcXHRcXHRcXHQgIHByaW50X2JwZl9vdXRwdXQsIFxcdTAwMjZjdHgsIFxcdTAwMjZvcHRzKTtcXG4rXFx0XFx0aWYgKCFwYikge1xcbitcXHRcXHRcXHRwX2VycihcXFwiZmFpbGVkIHRvIGNyZWF0ZSBwZXJmIGJ1ZmZlcjogJXMgKCVkKVxcXCIsXFxuK1xcdFxcdFxcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xcbitcXHRcXHRcXHRnb3RvIGVycl9jbG9zZV9tYXA7XFxuK1xcdFxcdH1cXG4gXFx0fVxcbiBcXG4gXFx0c2lnbmFsKFNJR0lOVCwgaW50X2V4aXQpO1xcbkBAIC0yMDIsMjUgKzIzOSwzMyBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdGlmIChqc29uX291dHB1dClcXG4gXFx0XFx0anNvbndfc3RhcnRfYXJyYXkoanNvbl93dHIpO1xcbiBcXG4rXFx0ZXJyID0gMDtcXG4gXFx0d2hpbGUgKCFzdG9wKSB7XFxuLVxcdFxcdGVyciA9IHBlcmZfYnVmZmVyX19wb2xsKHBiLCAyMDApO1xcbitcXHRcXHRlcnIgPSByYiA/IHJpbmdfYnVmZmVyX19wb2xsKHJiLCAyMDApIDogcGVyZl9idWZmZXJfX3BvbGwocGIsIDIwMCk7XFxuIFxcdFxcdGlmIChlcnIgXFx1MDAzYyAwIFxcdTAwMjZcXHUwMDI2IGVyciAhPSAtRUlOVFIpIHtcXG4tXFx0XFx0XFx0cF9lcnIoXFxcInBlcmYgYnVmZmVyIHBvbGxpbmcgZmFpbGVkOiAlcyAoJWQpXFxcIixcXG4tXFx0XFx0XFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XFxuLVxcdFxcdFxcdGdvdG8gZXJyX2Nsb3NlX3BiO1xcbitcXHRcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIkVycm9yOiAlcyBidWZmZXIgcG9sbGluZyBmYWlsZWQ6ICVzICglZClcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdHJiID8gXFxcInJpbmdcXFwiIDogXFxcInBlcmZcXFwiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHR9XFxuK1xcdFxcdGVyciA9IDA7XFxuIFxcdH1cXG4gXFxuK1xcdGlmIChzdG9wKVxcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIlN0b3BwaW5nLi4uXFxcXG5cXFwiKTtcXG4gXFx0aWYgKGpzb25fb3V0cHV0KVxcbiBcXHRcXHRqc29ud19lbmRfYXJyYXkoanNvbl93dHIpO1xcbitcXHRpZiAoZmZsdXNoKHN0ZG91dCkpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCJFcnJvcjogZmFpbGVkIHRvIHdyaXRlIGV2ZW50czogJXNcXFxcblxcXCIsIHN0cmVycm9yKGVycm5vKSk7XFxuK1xcdFxcdGVyciA9IC0xO1xcbitcXHR9XFxuIFxcbitcXHRyaW5nX2J1ZmZlcl9fZnJlZShyYik7XFxuIFxcdHBlcmZfYnVmZmVyX19mcmVlKHBiKTtcXG4rXFx0LyogQm90aCBidWZmZXIgbWFuYWdlcnMgYm9ycm93IG1hcF9mZC4gKi9cXG4gXFx0Y2xvc2UobWFwX2ZkKTtcXG4gXFxuLVxcdHJldHVybiAwO1xcbitcXHRyZXR1cm4gZXJyIFxcdTAwM2MgMCA/IC0xIDogMDtcXG4gXFxuLWVycl9jbG9zZV9wYjpcXG4tXFx0cGVyZl9idWZmZXJfX2ZyZWUocGIpO1xcbiBlcnJfY2xvc2VfbWFwOlxcbiBcXHRjbG9zZShtYXBfZmQpO1xcbiBcXHRyZXR1cm4gLTE7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjFhNGFlODhjMDVhMDdcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmNcXG5AQCAtMCwwICsxLDQyNSBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisjaW5jbHVkZSBcXHUwMDNjY3R5cGUuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2ZjbnRsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2Nwb2xsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzaWduYWwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9tbWFuLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvd2FpdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdGVzdF9wcm9ncy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXFwiYnBmdG9vbF9yaW5nYnVmLnNrZWwuaFxcXCJcXG4rXFxuKyNkZWZpbmUgV0FJVF9TVEVQUyA1MDBcXG4rI2RlZmluZSBXQUlUX1VTIDEwMDAwXFxuK1xcbitzdHJ1Y3QgY29uc3VtZXIge1xcbitcXHRwaWRfdCBwaWQ7XFxuK1xcdGludCBmZDtcXG4rfTtcXG4rXFxuK3N0YXRpYyBjb25zdCBjaGFyICpicGZ0b29sX3BhdGgodm9pZClcXG4re1xcbitcXHRjb25zdCBjaGFyICpwYXRoID0gZ2V0ZW52KFxcXCJCUEZUT09MXFxcIik7XFxuK1xcbitcXHRpZiAocGF0aClcXG4rXFx0XFx0cmV0dXJuIGFjY2VzcyhwYXRoLCBYX09LKSA/IE5VTEwgOiBwYXRoO1xcbitcXHRpZiAoIWFjY2VzcyhcXFwiLi90b29scy9zYmluL2JwZnRvb2xcXFwiLCBYX09LKSlcXG4rXFx0XFx0cmV0dXJuIFxcXCIuL3Rvb2xzL3NiaW4vYnBmdG9vbFxcXCI7XFxuK1xcdGlmICghYWNjZXNzKFxcXCIuLi90b29scy9zYmluL2JwZnRvb2xcXFwiLCBYX09LKSlcXG4rXFx0XFx0cmV0dXJuIFxcXCIuLi90b29scy9zYmluL2JwZnRvb2xcXFwiO1xcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY29uc3VtZXJfY2xlYW51cChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkKVxcbit7XFxuK1xcdGlmIChjaGlsZC1cXHUwMDNlcGlkIFxcdTAwM2UgMCkge1xcbitcXHRcXHRraWxsKGNoaWxkLVxcdTAwM2VwaWQsIFNJR0tJTEwpO1xcbitcXHRcXHR3aGlsZSAod2FpdHBpZChjaGlsZC1cXHUwMDNlcGlkLCBOVUxMLCAwKSBcXHUwMDNjIDAgXFx1MDAyNlxcdTAwMjYgZXJybm8gPT0gRUlOVFIpXFxuK1xcdFxcdFxcdDtcXG4rXFx0XFx0Y2hpbGQtXFx1MDAzZXBpZCA9IC0xO1xcbitcXHR9XFxuK1xcdGlmIChjaGlsZC1cXHUwMDNlZmQgXFx1MDAzZT0gMCkge1xcbitcXHRcXHRjbG9zZShjaGlsZC1cXHUwMDNlZmQpO1xcbitcXHRcXHRjaGlsZC1cXHUwMDNlZmQgPSAtMTtcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBjb25zdW1lcl9zdGFydChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkLCBpbnQgbWFwX2ZkLCBjb25zdCBjaGFyICpmb3JtYXQsXFxuK1xcdFxcdFxcdCAgIGNvbnN0IGNoYXIgKnBpbl9wYXRoLCBjb25zdCBjaGFyICpvcHRpb24sXFxuK1xcdFxcdFxcdCAgIGJvb2wgcGFpciwgYm9vbCBjYXB0dXJlX2Vycm9ycylcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcXG4rXFx0X191MzIgbGVuID0gc2l6ZW9mKGluZm8pO1xcbitcXHRjb25zdCBjaGFyICpwYXRoID0gYnBmdG9vbF9wYXRoKCk7XFxuK1xcdGNoYXIgKmFyZ3ZbMTJdLCBpZFsxNl07XFxuK1xcdGludCBvdXRbMl0sIHJlYWR5WzJdLCBuID0gMCwgZXJyLCBlcnJfZmQ7XFxuK1xcdHN0cnVjdCBwb2xsZmQgcGZkO1xcbitcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHBhdGgsIFxcXCJicGZ0b29sIHBhdGggKHNldCBCUEZUT09MIHRvIG92ZXJyaWRlKVxcXCIpIHx8XFxuK1xcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQobWFwX2ZkLCBcXHUwMDI2aW5mbywgXFx1MDAyNmxlbiksIFxcXCJtYXAgaW5mb1xcXCIpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdHNucHJpbnRmKGlkLCBzaXplb2YoaWQpLCBcXFwiJXVcXFwiLCBpbmZvLmlkKTtcXG4rXFx0YXJndltuKytdID0gKGNoYXIgKilwYXRoO1xcbitcXHRpZiAoZm9ybWF0KVxcbitcXHRcXHRhcmd2W24rK10gPSAoY2hhciAqKWZvcm1hdDtcXG4rXFx0YXJndltuKytdID0gXFxcIm1hcFxcXCI7XFxuK1xcdGFyZ3ZbbisrXSA9IFxcXCJldmVudF9waXBlXFxcIjtcXG4rXFx0YXJndltuKytdID0gcGluX3BhdGggPyBcXFwicGlubmVkXFxcIiA6IFxcXCJpZFxcXCI7XFxuK1xcdGFyZ3ZbbisrXSA9IHBpbl9wYXRoID8gKGNoYXIgKilwaW5fcGF0aCA6IGlkO1xcbitcXHRpZiAob3B0aW9uKSB7XFxuK1xcdFxcdGFyZ3ZbbisrXSA9IChjaGFyICopb3B0aW9uO1xcbitcXHRcXHRhcmd2W24rK10gPSBcXFwiMFxcXCI7XFxuK1xcdFxcdGlmIChwYWlyKSB7XFxuK1xcdFxcdFxcdGFyZ3ZbbisrXSA9IFxcXCJpbmRleFxcXCI7XFxuK1xcdFxcdFxcdGFyZ3ZbbisrXSA9IFxcXCIwXFxcIjtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdGFyZ3Zbbl0gPSBOVUxMO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhwaXBlMihvdXQsIE9fQ0xPRVhFQyksIFxcXCJvdXRwdXQgcGlwZVxcXCIpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdGlmICghQVNTRVJUX09LKHBpcGUyKHJlYWR5LCBPX0NMT0VYRUMpLCBcXFwiZXhlYyBwaXBlXFxcIikpIHtcXG4rXFx0XFx0Y2xvc2Uob3V0WzBdKTtcXG4rXFx0XFx0Y2xvc2Uob3V0WzFdKTtcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcdGNoaWxkLVxcdTAwM2VwaWQgPSBmb3JrKCk7XFxuK1xcdGlmICghY2hpbGQtXFx1MDAzZXBpZCkge1xcbitcXHRcXHRjbG9zZShvdXRbMF0pO1xcbitcXHRcXHRjbG9zZShyZWFkeVswXSk7XFxuK1xcdFxcdGVycl9mZCA9IGNhcHR1cmVfZXJyb3JzID8gb3V0WzFdIDogb3BlbihcXFwiL2Rldi9udWxsXFxcIiwgT19XUk9OTFkpO1xcbitcXHRcXHRpZiAoZHVwMihvdXRbMV0sIFNURE9VVF9GSUxFTk8pIFxcdTAwM2MgMCB8fFxcbitcXHRcXHQgICAgZHVwMihlcnJfZmQsIFNUREVSUl9GSUxFTk8pIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0Z290byBleGVjX2ZhaWw7XFxuK1xcdFxcdGlmICghY2FwdHVyZV9lcnJvcnMpXFxuK1xcdFxcdFxcdGNsb3NlKGVycl9mZCk7XFxuK1xcdFxcdGNsb3NlKG91dFsxXSk7XFxuK1xcdFxcdGV4ZWN2KHBhdGgsIGFyZ3YpO1xcbitleGVjX2ZhaWw6XFxuK1xcdFxcdGVyciA9IGVycm5vO1xcbitcXHRcXHR3cml0ZShyZWFkeVsxXSwgXFx1MDAyNmVyciwgc2l6ZW9mKGVycikpO1xcbitcXHRcXHRfZXhpdCgxMjcpO1xcbitcXHR9XFxuK1xcdGNsb3NlKG91dFsxXSk7XFxuK1xcdGNsb3NlKHJlYWR5WzFdKTtcXG4rXFx0Y2hpbGQtXFx1MDAzZWZkID0gb3V0WzBdO1xcbitcXHRwZmQgPSAoc3RydWN0IHBvbGxmZCkgeyAuZmQgPSByZWFkeVswXSwgLmV2ZW50cyA9IFBPTExJTiB9O1xcbitcXHQvKiBFT0Ygb24gdGhlIGNsb3NlLW9uLWV4ZWMgcGlwZSBkaXN0aW5ndWlzaGVzIGV4ZWMgZnJvbSBpbmhlcml0ZWQgaGFuZGxlcnMuICovXFxuK1xcdGVyciA9IGNoaWxkLVxcdTAwM2VwaWQgXFx1MDAzZSAwID8gcG9sbChcXHUwMDI2cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApIDogLTE7XFxuK1xcdGlmICghQVNTRVJUX0dUKGNoaWxkLVxcdTAwM2VwaWQsIDAsIFxcXCJmb3JrXFxcIikgfHxcXG4rXFx0ICAgICFBU1NFUlRfR1QoZXJyLCAwLCBcXFwiZXhlYyB0aW1lb3V0XFxcIikgfHxcXG4rXFx0ICAgICFBU1NFUlRfRVEocmVhZChyZWFkeVswXSwgXFx1MDAyNmVyciwgc2l6ZW9mKGVycikpLCAwLCBcXFwiZXhlY1xcXCIpKSB7XFxuK1xcdFxcdGNsb3NlKHJlYWR5WzBdKTtcXG4rXFx0XFx0Y29uc3VtZXJfY2xlYW51cChjaGlsZCk7XFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0fVxcbitcXHRjbG9zZShyZWFkeVswXSk7XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBjb25zdW1lcl9maW5pc2goc3RydWN0IGNvbnN1bWVyICpjaGlsZCwgaW50IHNpZ25vLCBib29sIHN1Y2Nlc3MsXFxuK1xcdFxcdFxcdCAgICBjaGFyICpvdXRwdXQsIHNpemVfdCBzaXplKVxcbit7XFxuK1xcdGludCBzdGF0dXMgPSAwLCBpO1xcbitcXHRwaWRfdCByZXQgPSAwO1xcbitcXHRzc2l6ZV90IG47XFxuK1xcdHNpemVfdCB1c2VkID0gMDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX09LKGZjbnRsKGNoaWxkLVxcdTAwM2VmZCwgRl9TRVRGTCwgT19OT05CTE9DSyksIFxcXCJub25ibG9ja2luZyBvdXRwdXRcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRpZiAoc2lnbm8gXFx1MDAyNlxcdTAwMjYgIUFTU0VSVF9PSyhraWxsKGNoaWxkLVxcdTAwM2VwaWQsIHNpZ25vKSwgXFxcInNpZ25hbCBjb25zdW1lclxcXCIpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBXQUlUX1NURVBTOyBpKyspIHtcXG4rXFx0XFx0d2hpbGUgKHVzZWQgXFx1MDAzYyBzaXplIC0gMSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgICAgKG4gPSByZWFkKGNoaWxkLVxcdTAwM2VmZCwgb3V0cHV0ICsgdXNlZCwgc2l6ZSAtIDEgLSB1c2VkKSkgXFx1MDAzZSAwKVxcbitcXHRcXHRcXHR1c2VkICs9IG47XFxuK1xcdFxcdHJldCA9IHdhaXRwaWQoY2hpbGQtXFx1MDAzZXBpZCwgXFx1MDAyNnN0YXR1cywgV05PSEFORyk7XFxuK1xcdFxcdGlmIChyZXQgPT0gY2hpbGQtXFx1MDAzZXBpZClcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGlmIChyZXQgXFx1MDAzYyAwIFxcdTAwMjZcXHUwMDI2IGVycm5vICE9IEVJTlRSKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0dXNsZWVwKFdBSVRfVVMpO1xcbitcXHR9XFxuK1xcdGlmICghQVNTRVJUX0VRKHJldCwgY2hpbGQtXFx1MDAzZXBpZCwgXFxcImJvdW5kZWQgY29uc3VtZXIgZXhpdFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdGNoaWxkLVxcdTAwM2VwaWQgPSAtMTtcXG4rXFx0d2hpbGUgKHVzZWQgXFx1MDAzYyBzaXplIC0gMSBcXHUwMDI2XFx1MDAyNiAobiA9IHJlYWQoY2hpbGQtXFx1MDAzZWZkLCBvdXRwdXQgKyB1c2VkLCBzaXplIC0gMSAtIHVzZWQpKSBcXHUwMDNlIDApXFxuK1xcdFxcdHVzZWQgKz0gbjtcXG4rXFx0b3V0cHV0W3VzZWRdID0gJ1xcXFwwJztcXG4rXFx0cmV0dXJuIEFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcXFwibm9ybWFsIGV4aXRcXFwiKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgICAgQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cykgPT0gMCwgc3VjY2VzcywgXFxcImV4aXQgc3RhdHVzXFxcIik7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGNvbnN1bWVyX3JlYWR5KHN0cnVjdCBjb25zdW1lciAqY2hpbGQpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBsb25nIGNhdWdodDtcXG4rXFx0Y2hhciBwYXRoWzY0XSwgbGluZVsyNTZdO1xcbitcXHRpbnQgaTtcXG4rXFx0RklMRSAqZjtcXG4rXFxuK1xcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXFxcIi9wcm9jLyVkL3N0YXR1c1xcXCIsIGNoaWxkLVxcdTAwM2VwaWQpO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgV0FJVF9TVEVQUzsgaSsrKSB7XFxuK1xcdFxcdGYgPSBmb3BlbihwYXRoLCBcXFwiclxcXCIpO1xcbitcXHRcXHRpZiAoIWYpXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmKSkge1xcbitcXHRcXHRcXHRpZiAoc3NjYW5mKGxpbmUsIFxcXCJTaWdDZ3Q6ICVsbHhcXFwiLCBcXHUwMDI2Y2F1Z2h0KSA9PSAxIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdFxcdCAgICAoY2F1Z2h0IFxcdTAwMjYgKDFVTEwgXFx1MDAzY1xcdTAwM2MgKFNJR0lOVCAtIDEpKSkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0XFx0ICAgIChjYXVnaHQgXFx1MDAyNiAoMVVMTCBcXHUwMDNjXFx1MDAzYyAoU0lHVEVSTSAtIDEpKSkpIHtcXG4rXFx0XFx0XFx0XFx0ZmNsb3NlKGYpO1xcbitcXHRcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuK1xcdFxcdGZjbG9zZShmKTtcXG4rXFx0XFx0dXNsZWVwKFdBSVRfVVMpO1xcbitcXHR9XFxuK1xcdHJldHVybiBBU1NFUlRfVFJVRShmYWxzZSwgXFxcImNvbnN1bWVyIHNpZ25hbCBoYW5kbGVycyByZWFkeVxcXCIpO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBlbWl0X3JlY29yZChzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsLCBpbnQgcmVjb3JkKVxcbit7XFxuK1xcdGNoYXIgcGFja2V0WzY0XSA9IHt9O1xcbitcXG4rXFx0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMsXFxuK1xcdFxcdCAgICAuZGF0YV9pbiA9IHBhY2tldCxcXG4rXFx0XFx0ICAgIC5kYXRhX3NpemVfaW4gPSBzaXplb2YocGFja2V0KSxcXG4rXFx0KTtcXG4rXFxuK1xcdHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjb3JkID0gcmVjb3JkO1xcbitcXHRyZXR1cm4gQVNTRVJUX09LKGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMoYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXFx1MDAzZXByb2dzLnByb2R1Y2UpLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBcXHUwMDI2b3B0cyksIFxcXCJwcm9kdWNlIHJlY29yZFxcXCIpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAgICBBU1NFUlRfT0soc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VvdXRwdXRfZXJyLCBcXFwicmluZ2J1ZiBvdXRwdXRcXFwiKTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgY29uc3VtZWQodW5zaWduZWQgbG9uZyAqcG9zaXRpb24sIHVuc2lnbmVkIGxvbmcgZXhwZWN0ZWQpXFxuK3tcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgV0FJVF9TVEVQUzsgaSsrKSB7XFxuK1xcdFxcdGlmIChfX2F0b21pY19sb2FkX24ocG9zaXRpb24sIF9fQVRPTUlDX0FDUVVJUkUpID09IGV4cGVjdGVkKVxcbitcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0XFx0dXNsZWVwKFdBSVRfVVMpO1xcbitcXHR9XFxuK1xcdHJldHVybiBBU1NFUlRfRVEoKnBvc2l0aW9uLCBleHBlY3RlZCwgXFxcImNvbnN1bWVyIHBvc2l0aW9uXFxcIik7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNoZWNrX2pzb24oY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICpleHBlY3RlZClcXG4re1xcbitcXHRjaGFyICpzcmMgPSBvdXRwdXQsICpkc3QgPSBvdXRwdXQ7XFxuK1xcdGJvb2wgcXVvdGVkID0gZmFsc2UsIGVzY2FwZWQgPSBmYWxzZTtcXG4rXFxuK1xcdC8qIElnbm9yZSBmb3JtYXR0aW5nIHdoaXRlc3BhY2Ugd2hpbGUgY2hlY2tpbmcgdGhlIGVudGlyZSBKU09OIGRvY3VtZW50LiAqL1xcbitcXHR3aGlsZSAoKnNyYykge1xcbitcXHRcXHRpZiAocXVvdGVkIHx8ICFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpzcmMpKVxcbitcXHRcXHRcXHQqZHN0KysgPSAqc3JjO1xcbitcXHRcXHRpZiAoIWVzY2FwZWQgXFx1MDAyNlxcdTAwMjYgKnNyYyA9PSAnXFxcIicpXFxuK1xcdFxcdFxcdHF1b3RlZCA9ICFxdW90ZWQ7XFxuK1xcdFxcdGVzY2FwZWQgPSAhZXNjYXBlZCBcXHUwMDI2XFx1MDAyNiBxdW90ZWQgXFx1MDAyNlxcdTAwMjYgKnNyYyA9PSAnXFxcXFxcXFwnO1xcbitcXHRcXHRzcmMrKztcXG4rXFx0fVxcbitcXHQqZHN0ID0gJ1xcXFwwJztcXG4rXFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFxcXCJKU09OIHJlY29yZHNcXFwiKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9jb25zdW1lcihjb25zdCBjaGFyICpmb3JtYXQsIGJvb2wgaWRsZSwgaW50IHNpZ25vLCBib29sIHBpbm5lZClcXG4re1xcbitcXHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcXG4rXFx0c3RydWN0IGJwZnRvb2xfcmluZ2J1ZiAqc2tlbDtcXG4rXFx0dW5zaWduZWQgbG9uZyAqcG9zaXRpb24gPSBNQVBfRkFJTEVEO1xcbitcXHRpbnQgcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKSwgZmQ7XFxuK1xcdGNoYXIgcGluX2RpcltdID0gXFxcIi9zeXMvZnMvYnBmL2JwZnRvb2xfcmluZ2J1Zl9YWFhYWFhcXFwiO1xcbitcXHRjaGFyIHBpbl9wYXRoW3NpemVvZihwaW5fZGlyKSArIHNpemVvZihcXFwiL21hcFxcXCIpXTtcXG4rXFx0Ym9vbCBkaXJfY3JlYXRlZCA9IGZhbHNlLCBtYXBfcGlubmVkID0gZmFsc2U7XFxuK1xcdGNoYXIgb3V0cHV0WzQwOTZdO1xcbitcXHRzdHJ1Y3QgcG9sbGZkIHBmZDtcXG4rXFxuK1xcdHNrZWwgPSBicGZ0b29sX3JpbmdidWZfX29wZW4oKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFxcXCJvcGVuXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0YnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtXFx1MDAzZW1hcHMucmluZ2J1ZiwgcGFnZV9zaXplKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soYnBmdG9vbF9yaW5nYnVmX19sb2FkKHNrZWwpLCBcXFwibG9hZFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZmQgPSBicGZfbWFwX19mZChza2VsLVxcdTAwM2VtYXBzLnJpbmdidWYpO1xcbitcXHRpZiAocGlubmVkKSB7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LX1BUUihta2R0ZW1wKHBpbl9kaXIpLCBcXFwiY3JlYXRlIHBpbiBkaXJlY3RvcnlcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdGRpcl9jcmVhdGVkID0gdHJ1ZTtcXG4rXFx0XFx0c25wcmludGYocGluX3BhdGgsIHNpemVvZihwaW5fcGF0aCksIFxcXCIlcy9tYXBcXFwiLCBwaW5fZGlyKTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0soYnBmX29ial9waW4oZmQsIHBpbl9wYXRoKSwgXFxcInBpbiByaW5nYnVmXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRtYXBfcGlubmVkID0gdHJ1ZTtcXG4rXFx0fVxcbitcXHRwb3NpdGlvbiA9IG1tYXAoTlVMTCwgcGFnZV9zaXplLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIGZkLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfTkVRKHBvc2l0aW9uLCBNQVBfRkFJTEVELCBcXFwiY29uc3VtZXIgbW1hcFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFpZGxlIFxcdTAwMjZcXHUwMDI2ICghZW1pdF9yZWNvcmQoc2tlbCwgMCkgfHwgIWVtaXRfcmVjb3JkKHNrZWwsIDEpKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghY29uc3VtZXJfc3RhcnQoXFx1MDAyNmNoaWxkLCBmZCwgZm9ybWF0LCBwaW5uZWQgPyBwaW5fcGF0aCA6IE5VTEwsXFxuK1xcdFxcdFxcdCAgICBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8XFxuK1xcdCAgICAhY29uc3VtZXJfcmVhZHkoXFx1MDAyNmNoaWxkKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghaWRsZSkge1xcbitcXHRcXHQvKiBCb3RoIHByZWZpbGxlZCByZWNvcmRzIG9jY3VweSAxNiBieXRlcyBpbmNsdWRpbmcgdGhlaXIgaGVhZGVycy4gKi9cXG4rXFx0XFx0aWYgKCFjb25zdW1lZChwb3NpdGlvbiwgMzIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0cGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gY2hpbGQuZmQsIC5ldmVudHMgPSBQT0xMSU4gfTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfR1QocG9sbChcXHUwMDI2cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApLCAwLFxcbitcXHRcXHRcXHQgICAgICAgXFxcInJlY29yZHMgZmx1c2hlZCBiZWZvcmUgZXhpdFxcXCIpIHx8XFxuK1xcdFxcdCAgICAhQVNTRVJUX1RSVUUocGZkLnJldmVudHMgXFx1MDAyNiBQT0xMSU4sIFxcXCJyZWNvcmQgb3V0cHV0IHJlYWRhYmxlXFxcIikgfHxcXG4rXFx0XFx0ICAgICFlbWl0X3JlY29yZChza2VsLCAyKSB8fCAhY29uc3VtZWQocG9zaXRpb24sIDY0KSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFx0aWYgKCFjb25zdW1lcl9maW5pc2goXFx1MDAyNmNoaWxkLCBzaWdubywgdHJ1ZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAoZm9ybWF0IFxcdTAwMjZcXHUwMDI2ICFzdHJjbXAoZm9ybWF0LCBcXFwiLXBcXFwiKSlcXG4rXFx0XFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgaWRsZSA/IFxcXCJbXVxcXFxuXFxcIiA6XFxuK1xcdFxcdFxcdCAgICAgXFxcIlt7XFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIiAgICAgICAgXFxcXFxcXCJzaXplXFxcXFxcXCI6IDIsXFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIiAgICAgICAgXFxcXFxcXCJkYXRhXFxcXFxcXCI6IFswLDI1NVxcXFxuXFxcIlxcbitcXHRcXHRcXHQgICAgIFxcXCIgICAgICAgIF1cXFxcblxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiICAgIH0se1xcXFxuXFxcIlxcbitcXHRcXHRcXHQgICAgIFxcXCIgICAgICAgIFxcXFxcXFwic2l6ZVxcXFxcXFwiOiA1LFxcXFxuXFxcIlxcbitcXHRcXHRcXHQgICAgIFxcXCIgICAgICAgIFxcXFxcXFwiZGF0YVxcXFxcXFwiOiBbMSwyLDMsNCw1XFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIiAgICAgICAgXVxcXFxuXFxcIlxcbitcXHRcXHRcXHQgICAgIFxcXCIgICAgfSx7XFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIiAgICAgICAgXFxcXFxcXCJzaXplXFxcXFxcXCI6IDE3LFxcXFxuXFxcIlxcbitcXHRcXHRcXHQgICAgIFxcXCIgICAgICAgIFxcXFxcXFwiZGF0YVxcXFxcXFwiOiBbMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzJcXFxcblxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiICAgICAgICBdXFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIiAgICB9XFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIl1cXFxcblxcXCIsIFxcXCJwcmV0dHkgSlNPTiByZWNvcmRzXFxcIik7XFxuK1xcdGVsc2UgaWYgKGZvcm1hdClcXG4rXFx0XFx0Y2hlY2tfanNvbihvdXRwdXQsIGlkbGUgPyBcXFwiW11cXFwiIDpcXG4rXFx0XFx0XFx0ICAgXFxcIlt7XFxcXFxcXCJzaXplXFxcXFxcXCI6MixcXFxcXFxcImRhdGFcXFxcXFxcIjpbMCwyNTVdfSxcXFwiXFxuK1xcdFxcdFxcdCAgIFxcXCJ7XFxcXFxcXCJzaXplXFxcXFxcXCI6NSxcXFxcXFxcImRhdGFcXFxcXFxcIjpbMSwyLDMsNCw1XX0sXFxcIlxcbitcXHRcXHRcXHQgICBcXFwie1xcXFxcXFwic2l6ZVxcXFxcXFwiOjE3LFxcXFxcXFwiZGF0YVxcXFxcXFwiOlsxNiwxNywxOCwxOSwyMCwyMSwyMiwyMyxcXFwiXFxuK1xcdFxcdFxcdCAgIFxcXCIyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMl19XVxcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGlkbGUgPyBcXFwiXFxcIiA6XFxuK1xcdFxcdFxcdCAgICAgXFxcIj09IHNpemU6IDIgPT09PT1cXFxcbjAwIGZmXFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIj09IHNpemU6IDUgPT09PT1cXFxcbjAxIDAyIDAzIDA0IDA1XFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIj09IHNpemU6IDE3ID09PT09XFxcXG4xMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAgXFxcIlxcbitcXHRcXHRcXHQgICAgIFxcXCIxOCAxOSAxYSAxYiAxYyAxZCAxZSAxZlxcXFxuMjBcXFxcblxcXCIsIFxcXCJwbGFpbiByZWNvcmRzXFxcIik7XFxuK291dDpcXG4rXFx0Y29uc3VtZXJfY2xlYW51cChcXHUwMDI2Y2hpbGQpO1xcbitcXHRpZiAocG9zaXRpb24gIT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0bXVubWFwKHBvc2l0aW9uLCBwYWdlX3NpemUpO1xcbitcXHRpZiAobWFwX3Bpbm5lZClcXG4rXFx0XFx0QVNTRVJUX09LKHVubGluayhwaW5fcGF0aCksIFxcXCJ1bnBpbiByaW5nYnVmXFxcIik7XFxuK1xcdGlmIChkaXJfY3JlYXRlZClcXG4rXFx0XFx0QVNTRVJUX09LKHJtZGlyKHBpbl9kaXIpLCBcXFwicmVtb3ZlIHBpbiBkaXJlY3RvcnlcXFwiKTtcXG4rXFx0YnBmdG9vbF9yaW5nYnVmX19kZXN0cm95KHNrZWwpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X3BlcmZfY29uc3VtZXIodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcXG4rXFx0dW5zaWduZWQgbG9uZyBsb25nIHNlY29uZHMsIG5hbm9zZWNvbmRzO1xcbitcXHRzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsO1xcbitcXHRjaGFyIG91dHB1dFsxNjM4NF0sIGV4cGVjdGVkWzE2Mzg0XTtcXG4rXFx0aW50IG5yX2NwdXMsIGNwdSwgaW5kZXgsIG9mZnNldCA9IDAsIGksIHVzZWQgPSAwLCBmaWVsZHM7XFxuK1xcdHN0cnVjdCBwb2xsZmQgcGZkO1xcbitcXG4rXFx0bnJfY3B1cyA9IGxpYmJwZl9udW1fcG9zc2libGVfY3B1cygpO1xcbitcXHRpZiAoIUFTU0VSVF9HVChucl9jcHVzLCAwLCBcXFwicG9zc2libGUgY3B1c1xcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdHNrZWwgPSBicGZ0b29sX3JpbmdidWZfX29wZW4oKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFxcXCJvcGVuXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0YnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtXFx1MDAzZW1hcHMucmluZ2J1ZiwgZ2V0cGFnZXNpemUoKSk7XFxuK1xcdGJwZl9tYXBfX3NldF9tYXhfZW50cmllcyhza2VsLVxcdTAwM2VtYXBzLnBlcmZidWYsIG5yX2NwdXMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhicGZ0b29sX3JpbmdidWZfX2xvYWQoc2tlbCksIFxcXCJsb2FkXFxcIikgfHxcXG4rXFx0ICAgICFjb25zdW1lcl9zdGFydChcXHUwMDI2Y2hpbGQsIGJwZl9tYXBfX2ZkKHNrZWwtXFx1MDAzZW1hcHMucGVyZmJ1ZiksIE5VTEwsXFxuK1xcdFxcdFxcdCAgICBOVUxMLCBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8ICFjb25zdW1lcl9yZWFkeShcXHUwMDI2Y2hpbGQpIHx8XFxuK1xcdCAgICAhZW1pdF9yZWNvcmQoc2tlbCwgMykpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHQvKiBPbmUgbGFyZ2UgcmVjb3JkIGZsdXNoZXMgdGhlIGV4aXN0aW5nIGJ1ZmZlcmVkIHBlcmYgb3V0cHV0IGNhbGxiYWNrLiAqL1xcbitcXHRwZmQgPSAoc3RydWN0IHBvbGxmZCkgeyAuZmQgPSBjaGlsZC5mZCwgLmV2ZW50cyA9IFBPTExJTiB9O1xcbitcXHRpZiAoIUFTU0VSVF9HVChwb2xsKFxcdTAwMjZwZmQsIDEsIFdBSVRfU1RFUFMgKiBXQUlUX1VTIC8gMTAwMCksIDAsXFxuK1xcdFxcdCAgICAgICBcXFwicGVyZiByZWNvcmQgb3V0cHV0XFxcIikgfHxcXG4rXFx0ICAgICFBU1NFUlRfVFJVRShwZmQucmV2ZW50cyBcXHUwMDI2IFBPTExJTiwgXFxcInBlcmYgb3V0cHV0IHJlYWRhYmxlXFxcIikgfHxcXG4rXFx0ICAgICFjb25zdW1lcl9maW5pc2goXFx1MDAyNmNoaWxkLCBTSUdJTlQsIHRydWUsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZmllbGRzID0gc3NjYW5mKG91dHB1dCwgXFxcIj09IEAlbGx1LiVsbHUgQ1BVOiAlZCBpbmRleDogJWQgPT09PT1cXFxcbiVuXFxcIixcXG4rXFx0XFx0XFx0XFx1MDAyNnNlY29uZHMsIFxcdTAwMjZuYW5vc2Vjb25kcywgXFx1MDAyNmNwdSwgXFx1MDAyNmluZGV4LCBcXHUwMDI2b2Zmc2V0KTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoZmllbGRzLCA0LCBcXFwicGVyZiBoZWFkZXJcXFwiKSB8fFxcbitcXHQgICAgIUFTU0VSVF9HVChvZmZzZXQsIDAsIFxcXCJwZXJmIHBheWxvYWQgb2Zmc2V0XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRBU1NFUlRfR1Qoc2Vjb25kcyAqIDEwMDAwMDAwMDBVTEwgKyBuYW5vc2Vjb25kcywgMCwgXFxcInBlcmYgdGltZXN0YW1wXFxcIik7XFxuK1xcdEFTU0VSVF9MVChuYW5vc2Vjb25kcywgMTAwMDAwMDAwMFVMTCwgXFxcInBlcmYgdGltZXN0YW1wIG5hbm9zZWNvbmRzXFxcIik7XFxuK1xcdEFTU0VSVF9HRShjcHUsIDAsIFxcXCJwZXJmIGNwdVxcXCIpO1xcbitcXHRBU1NFUlRfTFQoY3B1LCBucl9jcHVzLCBcXFwicGVyZiBjcHUgcmFuZ2VcXFwiKTtcXG4rXFx0QVNTRVJUX0VRKGluZGV4LCBjcHUsIFxcXCJwZXJmIGluZGV4XFxcIik7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBzaXplb2Yoc2tlbC1cXHUwMDNlcm9kYXRhLVxcdTAwM2VwZXJmX3BheWxvYWQpOyBpKyspIHtcXG4rXFx0XFx0Y29uc3QgY2hhciAqc2VwYXJhdG9yID0gIWkgPyBcXFwiXFxcIiA6ICEoaSAlIDE2KSA/IFxcXCJcXFxcblxcXCIgOlxcbitcXHRcXHRcXHRcXHRcXHQhKGkgJSA4KSA/IFxcXCIgIFxcXCIgOiBcXFwiIFxcXCI7XFxuK1xcbitcXHRcXHR1c2VkICs9IHNucHJpbnRmKGV4cGVjdGVkICsgdXNlZCwgc2l6ZW9mKGV4cGVjdGVkKSAtIHVzZWQsXFxuK1xcdFxcdFxcdFxcdCBcXFwiJXMlMDJ4XFxcIiwgc2VwYXJhdG9yLCBpID09IDEgPyAweGZmIDogMCk7XFxuK1xcdH1cXG4rXFx0c25wcmludGYoZXhwZWN0ZWQgKyB1c2VkLCBzaXplb2YoZXhwZWN0ZWQpIC0gdXNlZCwgXFxcIlxcXFxuXFxcIik7XFxuK1xcdEFTU0VSVF9TVFJFUShvdXRwdXQgKyBvZmZzZXQsIGV4cGVjdGVkLCBcXFwicGVyZiBwYXlsb2FkXFxcIik7XFxuK291dDpcXG4rXFx0Y29uc3VtZXJfY2xlYW51cChcXHUwMDI2Y2hpbGQpO1xcbitcXHRicGZ0b29sX3JpbmdidWZfX2Rlc3Ryb3koc2tlbCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfcmVqZWN0KGVudW0gYnBmX21hcF90eXBlIHR5cGUsIGNvbnN0IGNoYXIgKm9wdGlvbiwgYm9vbCBwYWlyLCBib29sIGpzb24pXFxuK3tcXG4rXFx0c3RydWN0IGNvbnN1bWVyIGNoaWxkID0geyAucGlkID0gLTEsIC5mZCA9IC0xIH07XFxuK1xcdGJvb2wgcmluZyA9IHR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgfHwgdHlwZSA9PSBCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGO1xcbitcXHRjb25zdCBjaGFyICpleHBlY3RlZCA9IG9wdGlvbiA/XFxuK1xcdFxcdFxcXCJ7XFxcXFxcXCJlcnJvclxcXFxcXFwiOlxcXFxcXFwicmluZyBidWZmZXIgbWFwcyBkbyBub3Qgc3VwcG9ydCBjcHUgb3IgaW5kZXggYXJndW1lbnRzXFxcXFxcXCJ9XFxcIiA6XFxuK1xcdFxcdFxcXCJ7XFxcXFxcXCJlcnJvclxcXFxcXFwiOlxcXFxcXFwibWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcXFxcXFxcIn1cXFwiO1xcbitcXHRjaGFyIG91dHB1dFs0MDk2XTtcXG4rXFx0aW50IGZkO1xcbitcXG4rXFx0ZmQgPSBicGZfbWFwX2NyZWF0ZSh0eXBlLCBOVUxMLCByaW5nID8gMCA6IDQsIHJpbmcgPyAwIDogNCxcXG4rXFx0XFx0XFx0ICAgIHJpbmcgPyBnZXRwYWdlc2l6ZSgpIDogMSwgTlVMTCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwiY3JlYXRlIG1hcFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGlmIChjb25zdW1lcl9zdGFydChcXHUwMDI2Y2hpbGQsIGZkLCBqc29uID8gXFxcIi1qXFxcIiA6IE5VTEwsIE5VTEwsIG9wdGlvbiwgcGFpciwgdHJ1ZSkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIGNvbnN1bWVyX2ZpbmlzaChcXHUwMDI2Y2hpbGQsIDAsIGZhbHNlLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpKSkge1xcbitcXHRcXHRpZiAoanNvbilcXG4rXFx0XFx0XFx0Y2hlY2tfanNvbihvdXRwdXQsIGV4cGVjdGVkKTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRBU1NFUlRfR1Qoc3RybGVuKG91dHB1dCksIDAsIFxcXCJlcnJvciBkaWFnbm9zdGljXFxcIik7XFxuK1xcdH1cXG4rXFx0Y29uc3VtZXJfY2xlYW51cChcXHUwMDI2Y2hpbGQpO1xcbitcXHRjbG9zZShmZCk7XFxuK31cXG4rXFxuK3ZvaWQgdGVzdF9icGZ0b29sX3JpbmdidWYodm9pZClcXG4re1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicGVyZl9ldmVudF9hcnJheVxcXCIpKVxcbitcXHRcXHR0ZXN0X3BlcmZfY29uc3VtZXIoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInBsYWluXFxcIikpXFxuK1xcdFxcdHRlc3RfY29uc3VtZXIoTlVMTCwgZmFsc2UsIFNJR0lOVCwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwianNvblxcXCIpKVxcbitcXHRcXHR0ZXN0X2NvbnN1bWVyKFxcXCItalxcXCIsIGZhbHNlLCBTSUdURVJNLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJwcmV0dHlfanNvblxcXCIpKVxcbitcXHRcXHR0ZXN0X2NvbnN1bWVyKFxcXCItcFxcXCIsIGZhbHNlLCBTSUdJTlQsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInBpbm5lZF9wbGFpblxcXCIpKVxcbitcXHRcXHR0ZXN0X2NvbnN1bWVyKE5VTEwsIGZhbHNlLCBTSUdURVJNLCB0cnVlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInBpbm5lZF9qc29uXFxcIikpXFxuK1xcdFxcdHRlc3RfY29uc3VtZXIoXFxcIi1qXFxcIiwgZmFsc2UsIFNJR0lOVCwgdHJ1ZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJwaW5uZWRfcHJldHR5X2pzb25cXFwiKSlcXG4rXFx0XFx0dGVzdF9jb25zdW1lcihcXFwiLXBcXFwiLCBmYWxzZSwgU0lHVEVSTSwgdHJ1ZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJpZGxlX3NpZ2ludFxcXCIpKVxcbitcXHRcXHR0ZXN0X2NvbnN1bWVyKE5VTEwsIHRydWUsIFNJR0lOVCwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiaWRsZV9zaWd0ZXJtX2pzb25cXFwiKSlcXG4rXFx0XFx0dGVzdF9jb25zdW1lcihcXFwiLWpcXFwiLCB0cnVlLCBTSUdURVJNLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJpZGxlX3NpZ2ludF9wcmV0dHlfanNvblxcXCIpKVxcbitcXHRcXHR0ZXN0X2NvbnN1bWVyKFxcXCItcFxcXCIsIHRydWUsIFNJR0lOVCwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicmVqZWN0X2FycmF5XFxcIikpXFxuK1xcdFxcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9BUlJBWSwgTlVMTCwgZmFsc2UsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInJlamVjdF91c2VyX3JpbmdidWZcXFwiKSlcXG4rXFx0XFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRiwgTlVMTCwgZmFsc2UsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInJlamVjdF9jcHVcXFwiKSlcXG4rXFx0XFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFxcXCJjcHVcXFwiLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicmVqZWN0X2luZGV4XFxcIikpXFxuK1xcdFxcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCBcXFwiaW5kZXhcXFwiLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicmVqZWN0X2NwdV9pbmRleFxcXCIpKVxcbitcXHRcXHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXFxcImNwdVxcXCIsIHRydWUsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInJlamVjdF91c2VyX3JpbmdidWZfanNvblxcXCIpKVxcbitcXHRcXHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGLCBOVUxMLCBmYWxzZSwgdHJ1ZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyZWplY3RfY3B1X2luZGV4X2pzb25cXFwiKSlcXG4rXFx0XFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFxcXCJjcHVcXFwiLCB0cnVlLCB0cnVlKTtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmJiYmM5M2MzMGE4MzNcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jXFxuQEAgLTAsMCArMSw0NyBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnBmLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFxcdTAwM2VcXG4rXFxuK3N0cnVjdCB7XFxuK1xcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUklOR0JVRik7XFxuK30gcmluZ2J1ZiBTRUMoXFxcIi5tYXBzXFxcIik7XFxuK1xcbitzdHJ1Y3Qge1xcbitcXHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkpO1xcbitcXHRfX3VpbnQoa2V5X3NpemUsIHNpemVvZihfX3UzMikpO1xcbitcXHRfX3VpbnQodmFsdWVfc2l6ZSwgc2l6ZW9mKF9fdTMyKSk7XFxuK1xcdF9fdWludChtYXhfZW50cmllcywgMSk7XFxuK30gcGVyZmJ1ZiBTRUMoXFxcIi5tYXBzXFxcIik7XFxuK1xcbisvKlxcbisgKiBJbmNsdWRlIHRoZSB1MzIgcmF3IHNpemUgaW4gcGVyZidzIDgtYnl0ZSBhbGlnbm1lbnQgdG8gYXZvaWQgcGFkZGluZy5cXG4rICogS2VlcCBwbGFpbiBvdXRwdXQgbGFyZ2UgZW5vdWdoIHRvIGZsdXNoIHN0ZGlvIGJlZm9yZSB0aGUgY29uc3VtZXIgZXhpdHMuXFxuKyAqL1xcbitjb25zdCB1bnNpZ25lZCBjaGFyIHBlcmZfcGF5bG9hZFs0MDkyXSA9IHsgMHgwMCwgMHhmZiB9O1xcbitcXG4raW50IHJlY29yZDtcXG4raW50IG91dHB1dF9lcnI7XFxuK1xcbitTRUMoXFxcInNvY2tldFxcXCIpXFxuK2ludCBwcm9kdWNlKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYilcXG4re1xcbitcXHR1bnNpZ25lZCBjaGFyIGZpcnN0W10gPSB7IDB4MDAsIDB4ZmYgfTtcXG4rXFx0dW5zaWduZWQgY2hhciBzZWNvbmRbXSA9IHsgMSwgMiwgMywgNCwgNSB9O1xcbitcXHR1bnNpZ25lZCBjaGFyIHRoaXJkW10gPSB7XFxuK1xcdFxcdDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsXFxuK1xcdFxcdDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsXFxuK1xcdH07XFxuK1xcbitcXHRpZiAocmVjb3JkID09IDApXFxuK1xcdFxcdG91dHB1dF9lcnIgPSBicGZfcmluZ2J1Zl9vdXRwdXQoXFx1MDAyNnJpbmdidWYsIGZpcnN0LCBzaXplb2YoZmlyc3QpLCAwKTtcXG4rXFx0ZWxzZSBpZiAocmVjb3JkID09IDEpXFxuK1xcdFxcdG91dHB1dF9lcnIgPSBicGZfcmluZ2J1Zl9vdXRwdXQoXFx1MDAyNnJpbmdidWYsIHNlY29uZCwgc2l6ZW9mKHNlY29uZCksIDApO1xcbitcXHRlbHNlIGlmIChyZWNvcmQgPT0gMilcXG4rXFx0XFx0b3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dChcXHUwMDI2cmluZ2J1ZiwgdGhpcmQsIHNpemVvZih0aGlyZCksIDApO1xcbitcXHRlbHNlXFxuK1xcdFxcdG91dHB1dF9lcnIgPSBicGZfcGVyZl9ldmVudF9vdXRwdXQoc2tiLCBcXHUwMDI2cGVyZmJ1ZiwgQlBGX0ZfQ1VSUkVOVF9DUFUsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICh2b2lkICopcGVyZl9wYXlsb2FkLCBzaXplb2YocGVyZl9wYXlsb2FkKSk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitjaGFyIExJQ0VOU0VbXSBTRUMoXFxcImxpY2Vuc2VcXFwiKSA9IFxcXCJHUExcXFwiO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwMzowMDowMi44ODM5MjU1MDNaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjEyNDA4OTgzNDE3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBjaGFuZ2VzIGFyZSBzdHJpY3RseSBsaW1pdGVkIHRvIHVzZXItc3BhY2UgdXRpbGl0aWVzIChicGZ0b29sIHVuZGVyIHRvb2xzL2JwZi9icGZ0b29sLykgYW5kIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLykuIE5vIGtlcm5lbC1zcGFjZSBjb2RlIG9yIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eC9tb2R1bGVzKSBpcyBtb2RpZmllZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZDNhZTNkOWUzNTVlYjg2MGRiNmRhN2VmMzNlMTQ3NTlmNmI2NThjN1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgU2VwIDExIDAzOjAwOjAxIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuaW5kZXggNWRhZjNkZTVjNzQ0Ni4uZTRlZDdlNzAxYzllNCAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG4rKysgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuQEAgLTEyMCw3ICsxMjAsOCBAQCBicGZ0b29sIG1hcCBwaW4gICAgICpNQVAqICAqRklMRSpcbiAgICAgY2hhcmFjdGVyICgnLicpLCB3aGljaCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgb2YgKmJwZmZzKi5cbiBcbiBicGZ0b29sIG1hcCBldmVudF9waXBlICpNQVAqIFtjcHUgKk4qIGluZGV4ICpNKl1cbi0gICAgUmVhZCBldmVudHMgZnJvbSBhICoqQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkqKiBtYXAuXG4rICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogb3JcbisgICAgKipCUEZfTUFQX1RZUEVfUklOR0JVRioqIG1hcC5cbiBcbiAgICAgSW5zdGFsbCBwZXJmIHJpbmdzIGludG8gYSBwZXJmIGV2ZW50IGFycmF5IG1hcCBhbmQgZHVtcCBvdXRwdXQgb2YgYW55XG4gICAgICoqYnBmX3BlcmZfZXZlbnRfb3V0cHV0KipcXCAoKSBjYWxsIGluIHRoZSBrZXJuZWwuIEJ5IGRlZmF1bHQgcmVhZCB0aGVcbkBAIC0xMzQsNiArMTM1LDE3IEBAIGJwZnRvb2wgbWFwIGV2ZW50X3BpcGUgKk1BUCogW2NwdSAqTiogaW5kZXggKk0qXVxuICAgICBleGlzdGluZyByaW5nLiAgQW55IG90aGVyIGFwcGxpY2F0aW9uIHdpbGwgc3RvcCByZWNlaXZpbmcgZXZlbnRzIGlmIGl0XG4gICAgIGluc3RhbGxlZCBpdHMgcmluZ3MgZWFybGllci5cbiBcbisgICAgRm9yIGEgcmluZyBidWZmZXIgbWFwLCBjb25zdW1lIHJlY29yZHMgc3VibWl0dGVkIGJ5IEJQRiBwcm9ncmFtcywgaW5jbHVkaW5nXG4rICAgIHJlY29yZHMgYWxyZWFkeSBxdWV1ZWQgYmVmb3JlIHRoZSBjb21tYW5kIHN0YXJ0cy4gKipjcHUqKiBhbmQgKippbmRleCoqXG4rICAgIGFyZSBub3Qgc3VwcG9ydGVkLiBFYWNoIHJlY29yZCBpcyBwcmludGVkIGluIGZ1bGwsIGluY2x1ZGluZyBlbWJlZGRlZCB6ZXJvXG4rICAgIGJ5dGVzLiBQbGFpbiBvdXRwdXQgcmVwb3J0cyB0aGUgcmVjb3JkIHNpemUgZm9sbG93ZWQgYnkgaGV4YWRlY2ltYWxcbisgICAgYnl0ZXM7IEpTT04gb3V0cHV0IGNvbnRhaW5zICoqc2l6ZSoqIGFuZCAqKmRhdGEqKiBmaWVsZHMsIHdpdGggKipkYXRhKiogYW5cbisgICAgYXJyYXkgb2YgYnl0ZSB2YWx1ZXMuIFJpbmcgYnVmZmVyIHJlY29yZHMgaGF2ZSBubyBpbXBsaWNpdCBDUFUgb3IgdGltZXN0YW1wLlxuK1xuKyAgICBDb25zdW1pbmcgYSByaW5nIGJ1ZmZlciBhZHZhbmNlcyBpdHMgc2hhcmVkIGNvbnN1bWVyIHBvc2l0aW9uLCBzbyB0aGlzXG4rICAgIGNvbW1hbmQgbXVzdCBub3QgcnVuIGFsb25nc2lkZSBhbm90aGVyIGNvbnN1bWVyIG9mIHRoZSBzYW1lIG1hcC5cbisgICAgKipCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGKiogbWFwcyBhcmUgbm90IHN1cHBvcnRlZC5cbitcbiBicGZ0b29sIG1hcCBwZWVrICAqTUFQKlxuICAgICBQZWVrIG5leHQgdmFsdWUgaW4gdGhlIHF1ZXVlIG9yIHN0YWNrLlxuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbmluZGV4IDc1Y2JjYjUxMmViYWUuLjE3NTBiNDg4YzllM2IgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbkBAIC04NzgsMTEgKzg3OCwxMSBAQCBfYnBmdG9vbCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgaWQpXG4tICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfaWRzX2Zvcl90eXBlIHBlcmZfZXZlbnRfYXJyYXlcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9pZHNfZm9yX3R5cGUgJ1widHlwZVwiOiBcIlxcKHBlcmZfZXZlbnRfYXJyYXlcXHxyaW5nYnVmXFwpXCInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSlcbi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9uYW1lc19mb3JfdHlwZSBwZXJmX2V2ZW50X2FycmF5XG4rICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfbmFtZXNfZm9yX3R5cGUgJ1widHlwZVwiOiBcIlxcKHBlcmZfZXZlbnRfYXJyYXlcXHxyaW5nYnVmXFwpXCInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgY3B1KVxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xuaW5kZXggYmNiNzY3ZTJkNjczMy4uN2Q1NTUzMzFmNDQzYSAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jXG5AQCAtMjcsNyArMjcsNyBAQFxuIFxuICNkZWZpbmUgTU1BUF9QQUdFX0NOVFx0MTZcbiBcbi1zdGF0aWMgdm9sYXRpbGUgYm9vbCBzdG9wO1xuK3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3Qgc3RvcDtcbiBcbiBzdHJ1Y3QgcGVyZl9ldmVudF9zYW1wbGUge1xuIFx0c3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyIGhlYWRlcjtcbkBAIC00NCw3ICs0NCw2IEBAIHN0cnVjdCBwZXJmX2V2ZW50X2xvc3Qge1xuIFxuIHN0YXRpYyB2b2lkIGludF9leGl0KGludCBzaWdubylcbiB7XG4tXHRmcHJpbnRmKHN0ZGVyciwgXCJTdG9wcGluZy4uLlxcblwiKTtcbiBcdHN0b3AgPSB0cnVlO1xuIH1cbiBcbkBAIC0xMDcsNiArMTA2LDI3IEBAIHByaW50X2JwZl9vdXRwdXQodm9pZCAqcHJpdmF0ZV9kYXRhLCBpbnQgY3B1LCBzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgKmV2ZW50KVxuIFx0cmV0dXJuIExJQkJQRl9QRVJGX0VWRU5UX0NPTlQ7XG4gfVxuIFxuK3N0YXRpYyBpbnQgcHJpbnRfcmluZ2J1Zl9vdXRwdXQodm9pZCAqY3R4LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSlcbit7XG4rXHRpZiAoanNvbl9vdXRwdXQpIHtcbitcdFx0anNvbndfc3RhcnRfb2JqZWN0KGpzb25fd3RyKTtcbitcdFx0anNvbndfdWludF9maWVsZChqc29uX3d0ciwgXCJzaXplXCIsIHNpemUpO1xuK1x0XHRqc29ud19uYW1lKGpzb25fd3RyLCBcImRhdGFcIik7XG4rXHRcdHByaW50X2RhdGFfanNvbihkYXRhLCBzaXplKTtcbitcdFx0anNvbndfZW5kX29iamVjdChqc29uX3d0cik7XG4rXHR9IGVsc2Uge1xuK1x0XHRwcmludGYoXCI9PSBzaXplOiAlenUgPT09PT1cXG5cIiwgc2l6ZSk7XG4rXHRcdGZwcmludF9oZXgoc3Rkb3V0LCBkYXRhLCBzaXplLCBcIiBcIik7XG4rXHRcdHByaW50ZihcIlxcblwiKTtcbitcdH1cbitcbitcdGlmIChmZmx1c2goc3Rkb3V0KSlcbitcdFx0cmV0dXJuIGVycm5vID8gLWVycm5vIDogLUVJTztcbitcbitcdC8qIEEgcHJvZHVjZXIgY2FuIGtlZXAgcG9sbCgpIGJ1c3kgZXZlbiBhZnRlciBhIHNpZ25hbCBhcnJpdmVzLiAqL1xuK1x0cmV0dXJuIHN0b3AgPyAtRUlOVFIgOiAwO1xuK31cbitcbiBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4ge1xuIFx0c3RydWN0IHBlcmZfZXZlbnRfYXR0ciBwZXJmX2F0dHIgPSB7XG5AQCAtMTIzLDE4ICsxNDMsMjYgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHQuY3B1ID0gLTEsXG4gXHRcdC5pZHggPSAtMSxcbiBcdH07XG4tXHRzdHJ1Y3QgcGVyZl9idWZmZXIgKnBiO1xuK1x0c3RydWN0IHBlcmZfYnVmZmVyICpwYiA9IE5VTEw7XG4rXHRzdHJ1Y3QgcmluZ19idWZmZXIgKnJiID0gTlVMTDtcbiBcdF9fdTMyIG1hcF9pbmZvX2xlbjtcbiBcdGludCBlcnIsIG1hcF9mZDtcbiBcbitcdHN0b3AgPSBmYWxzZTtcbiBcdG1hcF9pbmZvX2xlbiA9IHNpemVvZihtYXBfaW5mbyk7XG4gXHRtYXBfZmQgPSBtYXBfcGFyc2VfZmRfYW5kX2luZm8oXHUwMDI2YXJnYywgXHUwMDI2YXJndiwgXHUwMDI2bWFwX2luZm8sIFx1MDAyNm1hcF9pbmZvX2xlbixcbiBcdFx0XHRcdCAgICAgICAwKTtcbiBcdGlmIChtYXBfZmQgXHUwMDNjIDApXG4gXHRcdHJldHVybiAtMTtcbiBcbi1cdGlmIChtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKSB7XG4tXHRcdHBfZXJyKFwibWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXlcIik7XG4rXHRpZiAobWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSBcdTAwMjZcdTAwMjZcbitcdCAgICBtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9SSU5HQlVGKSB7XG4rXHRcdHBfZXJyKFwibWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcIik7XG4rXHRcdGdvdG8gZXJyX2Nsb3NlX21hcDtcbitcdH1cbitcbitcdGlmIChtYXBfaW5mby50eXBlID09IEJQRl9NQVBfVFlQRV9SSU5HQlVGIFx1MDAyNlx1MDAyNiBhcmdjKSB7XG4rXHRcdHBfZXJyKFwicmluZyBidWZmZXIgbWFwcyBkbyBub3Qgc3VwcG9ydCBjcHUgb3IgaW5kZXggYXJndW1lbnRzXCIpO1xuIFx0XHRnb3RvIGVycl9jbG9zZV9tYXA7XG4gXHR9XG4gXG5AQCAtMTg0LDE1ICsyMTIsMjQgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRjdHguaWR4ID0gMDtcbiBcdH1cbiBcbi1cdG9wdHMuY3B1X2NudCA9IGN0eC5hbGxfY3B1cyA/IDAgOiAxO1xuLVx0b3B0cy5jcHVzID0gXHUwMDI2Y3R4LmNwdTtcbi1cdG9wdHMubWFwX2tleXMgPSBcdTAwMjZjdHguaWR4O1xuLVx0cGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsIFx1MDAyNnBlcmZfYXR0cixcbi1cdFx0XHRcdCAgcHJpbnRfYnBmX291dHB1dCwgXHUwMDI2Y3R4LCBcdTAwMjZvcHRzKTtcbi1cdGlmICghcGIpIHtcbi1cdFx0cF9lcnIoXCJmYWlsZWQgdG8gY3JlYXRlIHBlcmYgYnVmZmVyOiAlcyAoJWQpXCIsXG4tXHRcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xuLVx0XHRnb3RvIGVycl9jbG9zZV9tYXA7XG4rXHRpZiAobWFwX2luZm8udHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRikge1xuK1x0XHRyYiA9IHJpbmdfYnVmZmVyX19uZXcobWFwX2ZkLCBwcmludF9yaW5nYnVmX291dHB1dCwgTlVMTCwgTlVMTCk7XG4rXHRcdGlmICghcmIpIHtcbitcdFx0XHRwX2VycihcImZhaWxlZCB0byBjcmVhdGUgcmluZyBidWZmZXI6ICVzICglZClcIixcbitcdFx0XHQgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTtcbitcdFx0XHRnb3RvIGVycl9jbG9zZV9tYXA7XG4rXHRcdH1cbitcdH0gZWxzZSB7XG4rXHRcdG9wdHMuY3B1X2NudCA9IGN0eC5hbGxfY3B1cyA/IDAgOiAxO1xuK1x0XHRvcHRzLmNwdXMgPSBcdTAwMjZjdHguY3B1O1xuK1x0XHRvcHRzLm1hcF9rZXlzID0gXHUwMDI2Y3R4LmlkeDtcbitcdFx0cGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsIFx1MDAyNnBlcmZfYXR0cixcbitcdFx0XHRcdFx0ICBwcmludF9icGZfb3V0cHV0LCBcdTAwMjZjdHgsIFx1MDAyNm9wdHMpO1xuK1x0XHRpZiAoIXBiKSB7XG4rXHRcdFx0cF9lcnIoXCJmYWlsZWQgdG8gY3JlYXRlIHBlcmYgYnVmZmVyOiAlcyAoJWQpXCIsXG4rXHRcdFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XG4rXHRcdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuK1x0XHR9XG4gXHR9XG4gXG4gXHRzaWduYWwoU0lHSU5ULCBpbnRfZXhpdCk7XG5AQCAtMjAyLDI1ICsyMzksMzMgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0aWYgKGpzb25fb3V0cHV0KVxuIFx0XHRqc29ud19zdGFydF9hcnJheShqc29uX3d0cik7XG4gXG4rXHRlcnIgPSAwO1xuIFx0d2hpbGUgKCFzdG9wKSB7XG4tXHRcdGVyciA9IHBlcmZfYnVmZmVyX19wb2xsKHBiLCAyMDApO1xuK1x0XHRlcnIgPSByYiA/IHJpbmdfYnVmZmVyX19wb2xsKHJiLCAyMDApIDogcGVyZl9idWZmZXJfX3BvbGwocGIsIDIwMCk7XG4gXHRcdGlmIChlcnIgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVyciAhPSAtRUlOVFIpIHtcbi1cdFx0XHRwX2VycihcInBlcmYgYnVmZmVyIHBvbGxpbmcgZmFpbGVkOiAlcyAoJWQpXCIsXG4tXHRcdFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XG4tXHRcdFx0Z290byBlcnJfY2xvc2VfcGI7XG4rXHRcdFx0ZnByaW50ZihzdGRlcnIsIFwiRXJyb3I6ICVzIGJ1ZmZlciBwb2xsaW5nIGZhaWxlZDogJXMgKCVkKVxcblwiLFxuK1x0XHRcdFx0cmIgPyBcInJpbmdcIiA6IFwicGVyZlwiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7XG4rXHRcdFx0YnJlYWs7XG4gXHRcdH1cbitcdFx0ZXJyID0gMDtcbiBcdH1cbiBcbitcdGlmIChzdG9wKVxuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCJTdG9wcGluZy4uLlxcblwiKTtcbiBcdGlmIChqc29uX291dHB1dClcbiBcdFx0anNvbndfZW5kX2FycmF5KGpzb25fd3RyKTtcbitcdGlmIChmZmx1c2goc3Rkb3V0KSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCJFcnJvcjogZmFpbGVkIHRvIHdyaXRlIGV2ZW50czogJXNcXG5cIiwgc3RyZXJyb3IoZXJybm8pKTtcbitcdFx0ZXJyID0gLTE7XG4rXHR9XG4gXG4rXHRyaW5nX2J1ZmZlcl9fZnJlZShyYik7XG4gXHRwZXJmX2J1ZmZlcl9fZnJlZShwYik7XG4rXHQvKiBCb3RoIGJ1ZmZlciBtYW5hZ2VycyBib3Jyb3cgbWFwX2ZkLiAqL1xuIFx0Y2xvc2UobWFwX2ZkKTtcbiBcbi1cdHJldHVybiAwO1xuK1x0cmV0dXJuIGVyciBcdTAwM2MgMCA/IC0xIDogMDtcbiBcbi1lcnJfY2xvc2VfcGI6XG4tXHRwZXJmX2J1ZmZlcl9fZnJlZShwYik7XG4gZXJyX2Nsb3NlX21hcDpcbiBcdGNsb3NlKG1hcF9mZCk7XG4gXHRyZXR1cm4gLTE7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjFhNGFlODhjMDVhMDdcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jXG5AQCAtMCwwICsxLDQyNSBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rI2luY2x1ZGUgXHUwMDNjY3R5cGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2Nwb2xsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvd2FpdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rI2luY2x1ZGUgXCJicGZ0b29sX3JpbmdidWYuc2tlbC5oXCJcbitcbisjZGVmaW5lIFdBSVRfU1RFUFMgNTAwXG4rI2RlZmluZSBXQUlUX1VTIDEwMDAwXG4rXG4rc3RydWN0IGNvbnN1bWVyIHtcbitcdHBpZF90IHBpZDtcbitcdGludCBmZDtcbit9O1xuK1xuK3N0YXRpYyBjb25zdCBjaGFyICpicGZ0b29sX3BhdGgodm9pZClcbit7XG4rXHRjb25zdCBjaGFyICpwYXRoID0gZ2V0ZW52KFwiQlBGVE9PTFwiKTtcbitcbitcdGlmIChwYXRoKVxuK1x0XHRyZXR1cm4gYWNjZXNzKHBhdGgsIFhfT0spID8gTlVMTCA6IHBhdGg7XG4rXHRpZiAoIWFjY2VzcyhcIi4vdG9vbHMvc2Jpbi9icGZ0b29sXCIsIFhfT0spKVxuK1x0XHRyZXR1cm4gXCIuL3Rvb2xzL3NiaW4vYnBmdG9vbFwiO1xuK1x0aWYgKCFhY2Nlc3MoXCIuLi90b29scy9zYmluL2JwZnRvb2xcIiwgWF9PSykpXG4rXHRcdHJldHVybiBcIi4uL3Rvb2xzL3NiaW4vYnBmdG9vbFwiO1xuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNvbnN1bWVyX2NsZWFudXAoc3RydWN0IGNvbnN1bWVyICpjaGlsZClcbit7XG4rXHRpZiAoY2hpbGQtXHUwMDNlcGlkIFx1MDAzZSAwKSB7XG4rXHRcdGtpbGwoY2hpbGQtXHUwMDNlcGlkLCBTSUdLSUxMKTtcbitcdFx0d2hpbGUgKHdhaXRwaWQoY2hpbGQtXHUwMDNlcGlkLCBOVUxMLCAwKSBcdTAwM2MgMCBcdTAwMjZcdTAwMjYgZXJybm8gPT0gRUlOVFIpXG4rXHRcdFx0O1xuK1x0XHRjaGlsZC1cdTAwM2VwaWQgPSAtMTtcbitcdH1cbitcdGlmIChjaGlsZC1cdTAwM2VmZCBcdTAwM2U9IDApIHtcbitcdFx0Y2xvc2UoY2hpbGQtXHUwMDNlZmQpO1xuK1x0XHRjaGlsZC1cdTAwM2VmZCA9IC0xO1xuK1x0fVxuK31cbitcbitzdGF0aWMgYm9vbCBjb25zdW1lcl9zdGFydChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkLCBpbnQgbWFwX2ZkLCBjb25zdCBjaGFyICpmb3JtYXQsXG4rXHRcdFx0ICAgY29uc3QgY2hhciAqcGluX3BhdGgsIGNvbnN0IGNoYXIgKm9wdGlvbixcbitcdFx0XHQgICBib29sIHBhaXIsIGJvb2wgY2FwdHVyZV9lcnJvcnMpXG4re1xuK1x0c3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307XG4rXHRfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7XG4rXHRjb25zdCBjaGFyICpwYXRoID0gYnBmdG9vbF9wYXRoKCk7XG4rXHRjaGFyICphcmd2WzEyXSwgaWRbMTZdO1xuK1x0aW50IG91dFsyXSwgcmVhZHlbMl0sIG4gPSAwLCBlcnIsIGVycl9mZDtcbitcdHN0cnVjdCBwb2xsZmQgcGZkO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHBhdGgsIFwiYnBmdG9vbCBwYXRoIChzZXQgQlBGVE9PTCB0byBvdmVycmlkZSlcIikgfHxcbitcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQobWFwX2ZkLCBcdTAwMjZpbmZvLCBcdTAwMjZsZW4pLCBcIm1hcCBpbmZvXCIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHRzbnByaW50ZihpZCwgc2l6ZW9mKGlkKSwgXCIldVwiLCBpbmZvLmlkKTtcbitcdGFyZ3ZbbisrXSA9IChjaGFyICopcGF0aDtcbitcdGlmIChmb3JtYXQpXG4rXHRcdGFyZ3ZbbisrXSA9IChjaGFyICopZm9ybWF0O1xuK1x0YXJndltuKytdID0gXCJtYXBcIjtcbitcdGFyZ3ZbbisrXSA9IFwiZXZlbnRfcGlwZVwiO1xuK1x0YXJndltuKytdID0gcGluX3BhdGggPyBcInBpbm5lZFwiIDogXCJpZFwiO1xuK1x0YXJndltuKytdID0gcGluX3BhdGggPyAoY2hhciAqKXBpbl9wYXRoIDogaWQ7XG4rXHRpZiAob3B0aW9uKSB7XG4rXHRcdGFyZ3ZbbisrXSA9IChjaGFyICopb3B0aW9uO1xuK1x0XHRhcmd2W24rK10gPSBcIjBcIjtcbitcdFx0aWYgKHBhaXIpIHtcbitcdFx0XHRhcmd2W24rK10gPSBcImluZGV4XCI7XG4rXHRcdFx0YXJndltuKytdID0gXCIwXCI7XG4rXHRcdH1cbitcdH1cbitcdGFyZ3Zbbl0gPSBOVUxMO1xuK1x0aWYgKCFBU1NFUlRfT0socGlwZTIob3V0LCBPX0NMT0VYRUMpLCBcIm91dHB1dCBwaXBlXCIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHRpZiAoIUFTU0VSVF9PSyhwaXBlMihyZWFkeSwgT19DTE9FWEVDKSwgXCJleGVjIHBpcGVcIikpIHtcbitcdFx0Y2xvc2Uob3V0WzBdKTtcbitcdFx0Y2xvc2Uob3V0WzFdKTtcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1x0Y2hpbGQtXHUwMDNlcGlkID0gZm9yaygpO1xuK1x0aWYgKCFjaGlsZC1cdTAwM2VwaWQpIHtcbitcdFx0Y2xvc2Uob3V0WzBdKTtcbitcdFx0Y2xvc2UocmVhZHlbMF0pO1xuK1x0XHRlcnJfZmQgPSBjYXB0dXJlX2Vycm9ycyA/IG91dFsxXSA6IG9wZW4oXCIvZGV2L251bGxcIiwgT19XUk9OTFkpO1xuK1x0XHRpZiAoZHVwMihvdXRbMV0sIFNURE9VVF9GSUxFTk8pIFx1MDAzYyAwIHx8XG4rXHRcdCAgICBkdXAyKGVycl9mZCwgU1RERVJSX0ZJTEVOTykgXHUwMDNjIDApXG4rXHRcdFx0Z290byBleGVjX2ZhaWw7XG4rXHRcdGlmICghY2FwdHVyZV9lcnJvcnMpXG4rXHRcdFx0Y2xvc2UoZXJyX2ZkKTtcbitcdFx0Y2xvc2Uob3V0WzFdKTtcbitcdFx0ZXhlY3YocGF0aCwgYXJndik7XG4rZXhlY19mYWlsOlxuK1x0XHRlcnIgPSBlcnJubztcbitcdFx0d3JpdGUocmVhZHlbMV0sIFx1MDAyNmVyciwgc2l6ZW9mKGVycikpO1xuK1x0XHRfZXhpdCgxMjcpO1xuK1x0fVxuK1x0Y2xvc2Uob3V0WzFdKTtcbitcdGNsb3NlKHJlYWR5WzFdKTtcbitcdGNoaWxkLVx1MDAzZWZkID0gb3V0WzBdO1xuK1x0cGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gcmVhZHlbMF0sIC5ldmVudHMgPSBQT0xMSU4gfTtcbitcdC8qIEVPRiBvbiB0aGUgY2xvc2Utb24tZXhlYyBwaXBlIGRpc3Rpbmd1aXNoZXMgZXhlYyBmcm9tIGluaGVyaXRlZCBoYW5kbGVycy4gKi9cbitcdGVyciA9IGNoaWxkLVx1MDAzZXBpZCBcdTAwM2UgMCA/IHBvbGwoXHUwMDI2cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApIDogLTE7XG4rXHRpZiAoIUFTU0VSVF9HVChjaGlsZC1cdTAwM2VwaWQsIDAsIFwiZm9ya1wiKSB8fFxuK1x0ICAgICFBU1NFUlRfR1QoZXJyLCAwLCBcImV4ZWMgdGltZW91dFwiKSB8fFxuK1x0ICAgICFBU1NFUlRfRVEocmVhZChyZWFkeVswXSwgXHUwMDI2ZXJyLCBzaXplb2YoZXJyKSksIDAsIFwiZXhlY1wiKSkge1xuK1x0XHRjbG9zZShyZWFkeVswXSk7XG4rXHRcdGNvbnN1bWVyX2NsZWFudXAoY2hpbGQpO1xuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rXHRjbG9zZShyZWFkeVswXSk7XG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rc3RhdGljIGJvb2wgY29uc3VtZXJfZmluaXNoKHN0cnVjdCBjb25zdW1lciAqY2hpbGQsIGludCBzaWdubywgYm9vbCBzdWNjZXNzLFxuK1x0XHRcdCAgICBjaGFyICpvdXRwdXQsIHNpemVfdCBzaXplKVxuK3tcbitcdGludCBzdGF0dXMgPSAwLCBpO1xuK1x0cGlkX3QgcmV0ID0gMDtcbitcdHNzaXplX3QgbjtcbitcdHNpemVfdCB1c2VkID0gMDtcbitcbitcdGlmICghQVNTRVJUX09LKGZjbnRsKGNoaWxkLVx1MDAzZWZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKSwgXCJub25ibG9ja2luZyBvdXRwdXRcIikpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdGlmIChzaWdubyBcdTAwMjZcdTAwMjYgIUFTU0VSVF9PSyhraWxsKGNoaWxkLVx1MDAzZXBpZCwgc2lnbm8pLCBcInNpZ25hbCBjb25zdW1lclwiKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgV0FJVF9TVEVQUzsgaSsrKSB7XG4rXHRcdHdoaWxlICh1c2VkIFx1MDAzYyBzaXplIC0gMSBcdTAwMjZcdTAwMjZcbitcdFx0ICAgICAgIChuID0gcmVhZChjaGlsZC1cdTAwM2VmZCwgb3V0cHV0ICsgdXNlZCwgc2l6ZSAtIDEgLSB1c2VkKSkgXHUwMDNlIDApXG4rXHRcdFx0dXNlZCArPSBuO1xuK1x0XHRyZXQgPSB3YWl0cGlkKGNoaWxkLVx1MDAzZXBpZCwgXHUwMDI2c3RhdHVzLCBXTk9IQU5HKTtcbitcdFx0aWYgKHJldCA9PSBjaGlsZC1cdTAwM2VwaWQpXG4rXHRcdFx0YnJlYWs7XG4rXHRcdGlmIChyZXQgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vICE9IEVJTlRSKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHR1c2xlZXAoV0FJVF9VUyk7XG4rXHR9XG4rXHRpZiAoIUFTU0VSVF9FUShyZXQsIGNoaWxkLVx1MDAzZXBpZCwgXCJib3VuZGVkIGNvbnN1bWVyIGV4aXRcIikpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdGNoaWxkLVx1MDAzZXBpZCA9IC0xO1xuK1x0d2hpbGUgKHVzZWQgXHUwMDNjIHNpemUgLSAxIFx1MDAyNlx1MDAyNiAobiA9IHJlYWQoY2hpbGQtXHUwMDNlZmQsIG91dHB1dCArIHVzZWQsIHNpemUgLSAxIC0gdXNlZCkpIFx1MDAzZSAwKVxuK1x0XHR1c2VkICs9IG47XG4rXHRvdXRwdXRbdXNlZF0gPSAnXFwwJztcbitcdHJldHVybiBBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCJub3JtYWwgZXhpdFwiKSBcdTAwMjZcdTAwMjZcbitcdCAgICAgICBBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSA9PSAwLCBzdWNjZXNzLCBcImV4aXQgc3RhdHVzXCIpO1xuK31cbitcbitzdGF0aWMgYm9vbCBjb25zdW1lcl9yZWFkeShzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgbG9uZyBjYXVnaHQ7XG4rXHRjaGFyIHBhdGhbNjRdLCBsaW5lWzI1Nl07XG4rXHRpbnQgaTtcbitcdEZJTEUgKmY7XG4rXG4rXHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFwiL3Byb2MvJWQvc3RhdHVzXCIsIGNoaWxkLVx1MDAzZXBpZCk7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBXQUlUX1NURVBTOyBpKyspIHtcbitcdFx0ZiA9IGZvcGVuKHBhdGgsIFwiclwiKTtcbitcdFx0aWYgKCFmKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmKSkge1xuK1x0XHRcdGlmIChzc2NhbmYobGluZSwgXCJTaWdDZ3Q6ICVsbHhcIiwgXHUwMDI2Y2F1Z2h0KSA9PSAxIFx1MDAyNlx1MDAyNlxuK1x0XHRcdCAgICAoY2F1Z2h0IFx1MDAyNiAoMVVMTCBcdTAwM2NcdTAwM2MgKFNJR0lOVCAtIDEpKSkgXHUwMDI2XHUwMDI2XG4rXHRcdFx0ICAgIChjYXVnaHQgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyAoU0lHVEVSTSAtIDEpKSkpIHtcbitcdFx0XHRcdGZjbG9zZShmKTtcbitcdFx0XHRcdHJldHVybiB0cnVlO1xuK1x0XHRcdH1cbitcdFx0fVxuK1x0XHRmY2xvc2UoZik7XG4rXHRcdHVzbGVlcChXQUlUX1VTKTtcbitcdH1cbitcdHJldHVybiBBU1NFUlRfVFJVRShmYWxzZSwgXCJjb25zdW1lciBzaWduYWwgaGFuZGxlcnMgcmVhZHlcIik7XG4rfVxuK1xuK3N0YXRpYyBib29sIGVtaXRfcmVjb3JkKHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWwsIGludCByZWNvcmQpXG4re1xuK1x0Y2hhciBwYWNrZXRbNjRdID0ge307XG4rXG4rXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgb3B0cyxcbitcdFx0ICAgIC5kYXRhX2luID0gcGFja2V0LFxuK1x0XHQgICAgLmRhdGFfc2l6ZV9pbiA9IHNpemVvZihwYWNrZXQpLFxuK1x0KTtcbitcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY29yZCA9IHJlY29yZDtcbitcdHJldHVybiBBU1NFUlRfT0soYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy5wcm9kdWNlKSxcbitcdFx0XHRcdFx0ICAgICAgXHUwMDI2b3B0cyksIFwicHJvZHVjZSByZWNvcmRcIikgXHUwMDI2XHUwMDI2XG4rXHQgICAgICAgQVNTRVJUX09LKHNrZWwtXHUwMDNlYnNzLVx1MDAzZW91dHB1dF9lcnIsIFwicmluZ2J1ZiBvdXRwdXRcIik7XG4rfVxuK1xuK3N0YXRpYyBib29sIGNvbnN1bWVkKHVuc2lnbmVkIGxvbmcgKnBvc2l0aW9uLCB1bnNpZ25lZCBsb25nIGV4cGVjdGVkKVxuK3tcbitcdGludCBpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgV0FJVF9TVEVQUzsgaSsrKSB7XG4rXHRcdGlmIChfX2F0b21pY19sb2FkX24ocG9zaXRpb24sIF9fQVRPTUlDX0FDUVVJUkUpID09IGV4cGVjdGVkKVxuK1x0XHRcdHJldHVybiB0cnVlO1xuK1x0XHR1c2xlZXAoV0FJVF9VUyk7XG4rXHR9XG4rXHRyZXR1cm4gQVNTRVJUX0VRKCpwb3NpdGlvbiwgZXhwZWN0ZWQsIFwiY29uc3VtZXIgcG9zaXRpb25cIik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNoZWNrX2pzb24oY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICpleHBlY3RlZClcbit7XG4rXHRjaGFyICpzcmMgPSBvdXRwdXQsICpkc3QgPSBvdXRwdXQ7XG4rXHRib29sIHF1b3RlZCA9IGZhbHNlLCBlc2NhcGVkID0gZmFsc2U7XG4rXG4rXHQvKiBJZ25vcmUgZm9ybWF0dGluZyB3aGl0ZXNwYWNlIHdoaWxlIGNoZWNraW5nIHRoZSBlbnRpcmUgSlNPTiBkb2N1bWVudC4gKi9cbitcdHdoaWxlICgqc3JjKSB7XG4rXHRcdGlmIChxdW90ZWQgfHwgIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnNyYykpXG4rXHRcdFx0KmRzdCsrID0gKnNyYztcbitcdFx0aWYgKCFlc2NhcGVkIFx1MDAyNlx1MDAyNiAqc3JjID09ICdcIicpXG4rXHRcdFx0cXVvdGVkID0gIXF1b3RlZDtcbitcdFx0ZXNjYXBlZCA9ICFlc2NhcGVkIFx1MDAyNlx1MDAyNiBxdW90ZWQgXHUwMDI2XHUwMDI2ICpzcmMgPT0gJ1xcXFwnO1xuK1x0XHRzcmMrKztcbitcdH1cbitcdCpkc3QgPSAnXFwwJztcbitcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcIkpTT04gcmVjb3Jkc1wiKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9jb25zdW1lcihjb25zdCBjaGFyICpmb3JtYXQsIGJvb2wgaWRsZSwgaW50IHNpZ25vLCBib29sIHBpbm5lZClcbit7XG4rXHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcbitcdHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWw7XG4rXHR1bnNpZ25lZCBsb25nICpwb3NpdGlvbiA9IE1BUF9GQUlMRUQ7XG4rXHRpbnQgcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKSwgZmQ7XG4rXHRjaGFyIHBpbl9kaXJbXSA9IFwiL3N5cy9mcy9icGYvYnBmdG9vbF9yaW5nYnVmX1hYWFhYWFwiO1xuK1x0Y2hhciBwaW5fcGF0aFtzaXplb2YocGluX2RpcikgKyBzaXplb2YoXCIvbWFwXCIpXTtcbitcdGJvb2wgZGlyX2NyZWF0ZWQgPSBmYWxzZSwgbWFwX3Bpbm5lZCA9IGZhbHNlO1xuK1x0Y2hhciBvdXRwdXRbNDA5Nl07XG4rXHRzdHJ1Y3QgcG9sbGZkIHBmZDtcbitcbitcdHNrZWwgPSBicGZ0b29sX3JpbmdidWZfX29wZW4oKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcIm9wZW5cIikpXG4rXHRcdHJldHVybjtcbitcdGJwZl9tYXBfX3NldF9tYXhfZW50cmllcyhza2VsLVx1MDAzZW1hcHMucmluZ2J1ZiwgcGFnZV9zaXplKTtcbitcdGlmICghQVNTRVJUX09LKGJwZnRvb2xfcmluZ2J1Zl9fbG9hZChza2VsKSwgXCJsb2FkXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGZkID0gYnBmX21hcF9fZmQoc2tlbC1cdTAwM2VtYXBzLnJpbmdidWYpO1xuK1x0aWYgKHBpbm5lZCkge1xuK1x0XHRpZiAoIUFTU0VSVF9PS19QVFIobWtkdGVtcChwaW5fZGlyKSwgXCJjcmVhdGUgcGluIGRpcmVjdG9yeVwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0ZGlyX2NyZWF0ZWQgPSB0cnVlO1xuK1x0XHRzbnByaW50ZihwaW5fcGF0aCwgc2l6ZW9mKHBpbl9wYXRoKSwgXCIlcy9tYXBcIiwgcGluX2Rpcik7XG4rXHRcdGlmICghQVNTRVJUX09LKGJwZl9vYmpfcGluKGZkLCBwaW5fcGF0aCksIFwicGluIHJpbmdidWZcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdG1hcF9waW5uZWQgPSB0cnVlO1xuK1x0fVxuK1x0cG9zaXRpb24gPSBtbWFwKE5VTEwsIHBhZ2Vfc2l6ZSwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBmZCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9ORVEocG9zaXRpb24sIE1BUF9GQUlMRUQsIFwiY29uc3VtZXIgbW1hcFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIWlkbGUgXHUwMDI2XHUwMDI2ICghZW1pdF9yZWNvcmQoc2tlbCwgMCkgfHwgIWVtaXRfcmVjb3JkKHNrZWwsIDEpKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIWNvbnN1bWVyX3N0YXJ0KFx1MDAyNmNoaWxkLCBmZCwgZm9ybWF0LCBwaW5uZWQgPyBwaW5fcGF0aCA6IE5VTEwsXG4rXHRcdFx0ICAgIE5VTEwsIGZhbHNlLCBmYWxzZSkgfHxcbitcdCAgICAhY29uc3VtZXJfcmVhZHkoXHUwMDI2Y2hpbGQpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghaWRsZSkge1xuK1x0XHQvKiBCb3RoIHByZWZpbGxlZCByZWNvcmRzIG9jY3VweSAxNiBieXRlcyBpbmNsdWRpbmcgdGhlaXIgaGVhZGVycy4gKi9cbitcdFx0aWYgKCFjb25zdW1lZChwb3NpdGlvbiwgMzIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRwZmQgPSAoc3RydWN0IHBvbGxmZCkgeyAuZmQgPSBjaGlsZC5mZCwgLmV2ZW50cyA9IFBPTExJTiB9O1xuK1x0XHRpZiAoIUFTU0VSVF9HVChwb2xsKFx1MDAyNnBmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSwgMCxcbitcdFx0XHQgICAgICAgXCJyZWNvcmRzIGZsdXNoZWQgYmVmb3JlIGV4aXRcIikgfHxcbitcdFx0ICAgICFBU1NFUlRfVFJVRShwZmQucmV2ZW50cyBcdTAwMjYgUE9MTElOLCBcInJlY29yZCBvdXRwdXQgcmVhZGFibGVcIikgfHxcbitcdFx0ICAgICFlbWl0X3JlY29yZChza2VsLCAyKSB8fCAhY29uc3VtZWQocG9zaXRpb24sIDY0KSlcbitcdFx0XHRnb3RvIG91dDtcbitcdH1cbitcdGlmICghY29uc3VtZXJfZmluaXNoKFx1MDAyNmNoaWxkLCBzaWdubywgdHJ1ZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKGZvcm1hdCBcdTAwMjZcdTAwMjYgIXN0cmNtcChmb3JtYXQsIFwiLXBcIikpXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGlkbGUgPyBcIltdXFxuXCIgOlxuK1x0XHRcdCAgICAgXCJbe1xcblwiXG4rXHRcdFx0ICAgICBcIiAgICAgICAgXFxcInNpemVcXFwiOiAyLFxcblwiXG4rXHRcdFx0ICAgICBcIiAgICAgICAgXFxcImRhdGFcXFwiOiBbMCwyNTVcXG5cIlxuK1x0XHRcdCAgICAgXCIgICAgICAgIF1cXG5cIlxuK1x0XHRcdCAgICAgXCIgICAgfSx7XFxuXCJcbitcdFx0XHQgICAgIFwiICAgICAgICBcXFwic2l6ZVxcXCI6IDUsXFxuXCJcbitcdFx0XHQgICAgIFwiICAgICAgICBcXFwiZGF0YVxcXCI6IFsxLDIsMyw0LDVcXG5cIlxuK1x0XHRcdCAgICAgXCIgICAgICAgIF1cXG5cIlxuK1x0XHRcdCAgICAgXCIgICAgfSx7XFxuXCJcbitcdFx0XHQgICAgIFwiICAgICAgICBcXFwic2l6ZVxcXCI6IDE3LFxcblwiXG4rXHRcdFx0ICAgICBcIiAgICAgICAgXFxcImRhdGFcXFwiOiBbMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzJcXG5cIlxuK1x0XHRcdCAgICAgXCIgICAgICAgIF1cXG5cIlxuK1x0XHRcdCAgICAgXCIgICAgfVxcblwiXG4rXHRcdFx0ICAgICBcIl1cXG5cIiwgXCJwcmV0dHkgSlNPTiByZWNvcmRzXCIpO1xuK1x0ZWxzZSBpZiAoZm9ybWF0KVxuK1x0XHRjaGVja19qc29uKG91dHB1dCwgaWRsZSA/IFwiW11cIiA6XG4rXHRcdFx0ICAgXCJbe1xcXCJzaXplXFxcIjoyLFxcXCJkYXRhXFxcIjpbMCwyNTVdfSxcIlxuK1x0XHRcdCAgIFwie1xcXCJzaXplXFxcIjo1LFxcXCJkYXRhXFxcIjpbMSwyLDMsNCw1XX0sXCJcbitcdFx0XHQgICBcIntcXFwic2l6ZVxcXCI6MTcsXFxcImRhdGFcXFwiOlsxNiwxNywxOCwxOSwyMCwyMSwyMiwyMyxcIlxuK1x0XHRcdCAgIFwiMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzJdfV1cIik7XG4rXHRlbHNlXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGlkbGUgPyBcIlwiIDpcbitcdFx0XHQgICAgIFwiPT0gc2l6ZTogMiA9PT09PVxcbjAwIGZmXFxuXCJcbitcdFx0XHQgICAgIFwiPT0gc2l6ZTogNSA9PT09PVxcbjAxIDAyIDAzIDA0IDA1XFxuXCJcbitcdFx0XHQgICAgIFwiPT0gc2l6ZTogMTcgPT09PT1cXG4xMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAgXCJcbitcdFx0XHQgICAgIFwiMTggMTkgMWEgMWIgMWMgMWQgMWUgMWZcXG4yMFxcblwiLCBcInBsYWluIHJlY29yZHNcIik7XG4rb3V0OlxuK1x0Y29uc3VtZXJfY2xlYW51cChcdTAwMjZjaGlsZCk7XG4rXHRpZiAocG9zaXRpb24gIT0gTUFQX0ZBSUxFRClcbitcdFx0bXVubWFwKHBvc2l0aW9uLCBwYWdlX3NpemUpO1xuK1x0aWYgKG1hcF9waW5uZWQpXG4rXHRcdEFTU0VSVF9PSyh1bmxpbmsocGluX3BhdGgpLCBcInVucGluIHJpbmdidWZcIik7XG4rXHRpZiAoZGlyX2NyZWF0ZWQpXG4rXHRcdEFTU0VSVF9PSyhybWRpcihwaW5fZGlyKSwgXCJyZW1vdmUgcGluIGRpcmVjdG9yeVwiKTtcbitcdGJwZnRvb2xfcmluZ2J1Zl9fZGVzdHJveShza2VsKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9wZXJmX2NvbnN1bWVyKHZvaWQpXG4re1xuK1x0c3RydWN0IGNvbnN1bWVyIGNoaWxkID0geyAucGlkID0gLTEsIC5mZCA9IC0xIH07XG4rXHR1bnNpZ25lZCBsb25nIGxvbmcgc2Vjb25kcywgbmFub3NlY29uZHM7XG4rXHRzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsO1xuK1x0Y2hhciBvdXRwdXRbMTYzODRdLCBleHBlY3RlZFsxNjM4NF07XG4rXHRpbnQgbnJfY3B1cywgY3B1LCBpbmRleCwgb2Zmc2V0ID0gMCwgaSwgdXNlZCA9IDAsIGZpZWxkcztcbitcdHN0cnVjdCBwb2xsZmQgcGZkO1xuK1xuK1x0bnJfY3B1cyA9IGxpYmJwZl9udW1fcG9zc2libGVfY3B1cygpO1xuK1x0aWYgKCFBU1NFUlRfR1QobnJfY3B1cywgMCwgXCJwb3NzaWJsZSBjcHVzXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRza2VsID0gYnBmdG9vbF9yaW5nYnVmX19vcGVuKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJvcGVuXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cdTAwM2VtYXBzLnJpbmdidWYsIGdldHBhZ2VzaXplKCkpO1xuK1x0YnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtXHUwMDNlbWFwcy5wZXJmYnVmLCBucl9jcHVzKTtcbitcdGlmICghQVNTRVJUX09LKGJwZnRvb2xfcmluZ2J1Zl9fbG9hZChza2VsKSwgXCJsb2FkXCIpIHx8XG4rXHQgICAgIWNvbnN1bWVyX3N0YXJ0KFx1MDAyNmNoaWxkLCBicGZfbWFwX19mZChza2VsLVx1MDAzZW1hcHMucGVyZmJ1ZiksIE5VTEwsXG4rXHRcdFx0ICAgIE5VTEwsIE5VTEwsIGZhbHNlLCBmYWxzZSkgfHwgIWNvbnN1bWVyX3JlYWR5KFx1MDAyNmNoaWxkKSB8fFxuK1x0ICAgICFlbWl0X3JlY29yZChza2VsLCAzKSlcbitcdFx0Z290byBvdXQ7XG4rXHQvKiBPbmUgbGFyZ2UgcmVjb3JkIGZsdXNoZXMgdGhlIGV4aXN0aW5nIGJ1ZmZlcmVkIHBlcmYgb3V0cHV0IGNhbGxiYWNrLiAqL1xuK1x0cGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gY2hpbGQuZmQsIC5ldmVudHMgPSBQT0xMSU4gfTtcbitcdGlmICghQVNTRVJUX0dUKHBvbGwoXHUwMDI2cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApLCAwLFxuK1x0XHQgICAgICAgXCJwZXJmIHJlY29yZCBvdXRwdXRcIikgfHxcbitcdCAgICAhQVNTRVJUX1RSVUUocGZkLnJldmVudHMgXHUwMDI2IFBPTExJTiwgXCJwZXJmIG91dHB1dCByZWFkYWJsZVwiKSB8fFxuK1x0ICAgICFjb25zdW1lcl9maW5pc2goXHUwMDI2Y2hpbGQsIFNJR0lOVCwgdHJ1ZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZmllbGRzID0gc3NjYW5mKG91dHB1dCwgXCI9PSBAJWxsdS4lbGx1IENQVTogJWQgaW5kZXg6ICVkID09PT09XFxuJW5cIixcbitcdFx0XHRcdTAwMjZzZWNvbmRzLCBcdTAwMjZuYW5vc2Vjb25kcywgXHUwMDI2Y3B1LCBcdTAwMjZpbmRleCwgXHUwMDI2b2Zmc2V0KTtcbitcdGlmICghQVNTRVJUX0VRKGZpZWxkcywgNCwgXCJwZXJmIGhlYWRlclwiKSB8fFxuK1x0ICAgICFBU1NFUlRfR1Qob2Zmc2V0LCAwLCBcInBlcmYgcGF5bG9hZCBvZmZzZXRcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0QVNTRVJUX0dUKHNlY29uZHMgKiAxMDAwMDAwMDAwVUxMICsgbmFub3NlY29uZHMsIDAsIFwicGVyZiB0aW1lc3RhbXBcIik7XG4rXHRBU1NFUlRfTFQobmFub3NlY29uZHMsIDEwMDAwMDAwMDBVTEwsIFwicGVyZiB0aW1lc3RhbXAgbmFub3NlY29uZHNcIik7XG4rXHRBU1NFUlRfR0UoY3B1LCAwLCBcInBlcmYgY3B1XCIpO1xuK1x0QVNTRVJUX0xUKGNwdSwgbnJfY3B1cywgXCJwZXJmIGNwdSByYW5nZVwiKTtcbitcdEFTU0VSVF9FUShpbmRleCwgY3B1LCBcInBlcmYgaW5kZXhcIik7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzaXplb2Yoc2tlbC1cdTAwM2Vyb2RhdGEtXHUwMDNlcGVyZl9wYXlsb2FkKTsgaSsrKSB7XG4rXHRcdGNvbnN0IGNoYXIgKnNlcGFyYXRvciA9ICFpID8gXCJcIiA6ICEoaSAlIDE2KSA/IFwiXFxuXCIgOlxuK1x0XHRcdFx0XHQhKGkgJSA4KSA/IFwiICBcIiA6IFwiIFwiO1xuK1xuK1x0XHR1c2VkICs9IHNucHJpbnRmKGV4cGVjdGVkICsgdXNlZCwgc2l6ZW9mKGV4cGVjdGVkKSAtIHVzZWQsXG4rXHRcdFx0XHQgXCIlcyUwMnhcIiwgc2VwYXJhdG9yLCBpID09IDEgPyAweGZmIDogMCk7XG4rXHR9XG4rXHRzbnByaW50ZihleHBlY3RlZCArIHVzZWQsIHNpemVvZihleHBlY3RlZCkgLSB1c2VkLCBcIlxcblwiKTtcbitcdEFTU0VSVF9TVFJFUShvdXRwdXQgKyBvZmZzZXQsIGV4cGVjdGVkLCBcInBlcmYgcGF5bG9hZFwiKTtcbitvdXQ6XG4rXHRjb25zdW1lcl9jbGVhbnVwKFx1MDAyNmNoaWxkKTtcbitcdGJwZnRvb2xfcmluZ2J1Zl9fZGVzdHJveShza2VsKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9yZWplY3QoZW51bSBicGZfbWFwX3R5cGUgdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uLCBib29sIHBhaXIsIGJvb2wganNvbilcbit7XG4rXHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcbitcdGJvb2wgcmluZyA9IHR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgfHwgdHlwZSA9PSBCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGO1xuK1x0Y29uc3QgY2hhciAqZXhwZWN0ZWQgPSBvcHRpb24gP1xuK1x0XHRcIntcXFwiZXJyb3JcXFwiOlxcXCJyaW5nIGJ1ZmZlciBtYXBzIGRvIG5vdCBzdXBwb3J0IGNwdSBvciBpbmRleCBhcmd1bWVudHNcXFwifVwiIDpcbitcdFx0XCJ7XFxcImVycm9yXFxcIjpcXFwibWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcXFwifVwiO1xuK1x0Y2hhciBvdXRwdXRbNDA5Nl07XG4rXHRpbnQgZmQ7XG4rXG4rXHRmZCA9IGJwZl9tYXBfY3JlYXRlKHR5cGUsIE5VTEwsIHJpbmcgPyAwIDogNCwgcmluZyA/IDAgOiA0LFxuK1x0XHRcdCAgICByaW5nID8gZ2V0cGFnZXNpemUoKSA6IDEsIE5VTEwpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwiY3JlYXRlIG1hcFwiKSlcbitcdFx0cmV0dXJuO1xuK1x0aWYgKGNvbnN1bWVyX3N0YXJ0KFx1MDAyNmNoaWxkLCBmZCwganNvbiA/IFwiLWpcIiA6IE5VTEwsIE5VTEwsIG9wdGlvbiwgcGFpciwgdHJ1ZSkgXHUwMDI2XHUwMDI2XG4rXHQgICAgY29uc3VtZXJfZmluaXNoKFx1MDAyNmNoaWxkLCAwLCBmYWxzZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpIHtcbitcdFx0aWYgKGpzb24pXG4rXHRcdFx0Y2hlY2tfanNvbihvdXRwdXQsIGV4cGVjdGVkKTtcbitcdFx0ZWxzZVxuK1x0XHRcdEFTU0VSVF9HVChzdHJsZW4ob3V0cHV0KSwgMCwgXCJlcnJvciBkaWFnbm9zdGljXCIpO1xuK1x0fVxuK1x0Y29uc3VtZXJfY2xlYW51cChcdTAwMjZjaGlsZCk7XG4rXHRjbG9zZShmZCk7XG4rfVxuK1xuK3ZvaWQgdGVzdF9icGZ0b29sX3JpbmdidWYodm9pZClcbit7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInBlcmZfZXZlbnRfYXJyYXlcIikpXG4rXHRcdHRlc3RfcGVyZl9jb25zdW1lcigpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJwbGFpblwiKSlcbitcdFx0dGVzdF9jb25zdW1lcihOVUxMLCBmYWxzZSwgU0lHSU5ULCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImpzb25cIikpXG4rXHRcdHRlc3RfY29uc3VtZXIoXCItalwiLCBmYWxzZSwgU0lHVEVSTSwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJwcmV0dHlfanNvblwiKSlcbitcdFx0dGVzdF9jb25zdW1lcihcIi1wXCIsIGZhbHNlLCBTSUdJTlQsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicGlubmVkX3BsYWluXCIpKVxuK1x0XHR0ZXN0X2NvbnN1bWVyKE5VTEwsIGZhbHNlLCBTSUdURVJNLCB0cnVlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicGlubmVkX2pzb25cIikpXG4rXHRcdHRlc3RfY29uc3VtZXIoXCItalwiLCBmYWxzZSwgU0lHSU5ULCB0cnVlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicGlubmVkX3ByZXR0eV9qc29uXCIpKVxuK1x0XHR0ZXN0X2NvbnN1bWVyKFwiLXBcIiwgZmFsc2UsIFNJR1RFUk0sIHRydWUpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJpZGxlX3NpZ2ludFwiKSlcbitcdFx0dGVzdF9jb25zdW1lcihOVUxMLCB0cnVlLCBTSUdJTlQsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiaWRsZV9zaWd0ZXJtX2pzb25cIikpXG4rXHRcdHRlc3RfY29uc3VtZXIoXCItalwiLCB0cnVlLCBTSUdURVJNLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImlkbGVfc2lnaW50X3ByZXR0eV9qc29uXCIpKVxuK1x0XHR0ZXN0X2NvbnN1bWVyKFwiLXBcIiwgdHJ1ZSwgU0lHSU5ULCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJlamVjdF9hcnJheVwiKSlcbitcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX0FSUkFZLCBOVUxMLCBmYWxzZSwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJyZWplY3RfdXNlcl9yaW5nYnVmXCIpKVxuK1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGLCBOVUxMLCBmYWxzZSwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJyZWplY3RfY3B1XCIpKVxuK1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXCJjcHVcIiwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicmVqZWN0X2luZGV4XCIpKVxuK1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXCJpbmRleFwiLCBmYWxzZSwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJyZWplY3RfY3B1X2luZGV4XCIpKVxuK1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXCJjcHVcIiwgdHJ1ZSwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJyZWplY3RfdXNlcl9yaW5nYnVmX2pzb25cIikpXG4rXHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCB0cnVlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicmVqZWN0X2NwdV9pbmRleF9qc29uXCIpKVxuK1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXCJjcHVcIiwgdHJ1ZSwgdHJ1ZSk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9icGZ0b29sX3JpbmdidWYuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9icGZ0b29sX3JpbmdidWYuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmJiYmM5M2MzMGE4MzNcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9icGZ0b29sX3JpbmdidWYuY1xuQEAgLTAsMCArMSw0NyBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuK1xuK3N0cnVjdCB7XG4rXHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1JJTkdCVUYpO1xuK30gcmluZ2J1ZiBTRUMoXCIubWFwc1wiKTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKTtcbitcdF9fdWludChrZXlfc2l6ZSwgc2l6ZW9mKF9fdTMyKSk7XG4rXHRfX3VpbnQodmFsdWVfc2l6ZSwgc2l6ZW9mKF9fdTMyKSk7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuK30gcGVyZmJ1ZiBTRUMoXCIubWFwc1wiKTtcbitcbisvKlxuKyAqIEluY2x1ZGUgdGhlIHUzMiByYXcgc2l6ZSBpbiBwZXJmJ3MgOC1ieXRlIGFsaWdubWVudCB0byBhdm9pZCBwYWRkaW5nLlxuKyAqIEtlZXAgcGxhaW4gb3V0cHV0IGxhcmdlIGVub3VnaCB0byBmbHVzaCBzdGRpbyBiZWZvcmUgdGhlIGNvbnN1bWVyIGV4aXRzLlxuKyAqL1xuK2NvbnN0IHVuc2lnbmVkIGNoYXIgcGVyZl9wYXlsb2FkWzQwOTJdID0geyAweDAwLCAweGZmIH07XG4rXG4raW50IHJlY29yZDtcbitpbnQgb3V0cHV0X2VycjtcbitcbitTRUMoXCJzb2NrZXRcIilcbitpbnQgcHJvZHVjZShzdHJ1Y3QgX19za19idWZmICpza2IpXG4re1xuK1x0dW5zaWduZWQgY2hhciBmaXJzdFtdID0geyAweDAwLCAweGZmIH07XG4rXHR1bnNpZ25lZCBjaGFyIHNlY29uZFtdID0geyAxLCAyLCAzLCA0LCA1IH07XG4rXHR1bnNpZ25lZCBjaGFyIHRoaXJkW10gPSB7XG4rXHRcdDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsXG4rXHRcdDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsXG4rXHR9O1xuK1xuK1x0aWYgKHJlY29yZCA9PSAwKVxuK1x0XHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFx1MDAyNnJpbmdidWYsIGZpcnN0LCBzaXplb2YoZmlyc3QpLCAwKTtcbitcdGVsc2UgaWYgKHJlY29yZCA9PSAxKVxuK1x0XHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFx1MDAyNnJpbmdidWYsIHNlY29uZCwgc2l6ZW9mKHNlY29uZCksIDApO1xuK1x0ZWxzZSBpZiAocmVjb3JkID09IDIpXG4rXHRcdG91dHB1dF9lcnIgPSBicGZfcmluZ2J1Zl9vdXRwdXQoXHUwMDI2cmluZ2J1ZiwgdGhpcmQsIHNpemVvZih0aGlyZCksIDApO1xuK1x0ZWxzZVxuK1x0XHRvdXRwdXRfZXJyID0gYnBmX3BlcmZfZXZlbnRfb3V0cHV0KHNrYiwgXHUwMDI2cGVyZmJ1ZiwgQlBGX0ZfQ1VSUkVOVF9DUFUsXG4rXHRcdFx0XHRcdFx0ICAgKHZvaWQgKilwZXJmX3BheWxvYWQsIHNpemVvZihwZXJmX3BheWxvYWQpKTtcbitcdHJldHVybiAwO1xuK31cbitcbitjaGFyIExJQ0VOU0VbXSBTRUMoXCJsaWNlbnNlXCIpID0gXCJHUExcIjtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDAzOjAwOjAyLjg4MzkyNjc5M1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjY0OTUzMDA2MTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgUGF0Y2ggU2VyaWVzKipcblxuT2theSwgc28gdGhlIHVzZXIgd2FudHMgbWUgdG8gZXZhbHVhdGUgdGhpcyBwYXRjaCBzZXJpZXMgY29tbWl0dGVkIGF0IEhFQUQuIE15IGZpcnN0IHN0ZXAgaXMgdG8gcXVpY2tseSBhbmFseXplIHRoZSBjaGFuZ2VkIGZpbGVzIHVzaW5nIHRoZSBwcm92aWRlZCBgZ2l0IGRpZmZgLiBJIHNlZSBpdCB0b3VjaGVzIHRoZXNlIGZpbGVzOiBgdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RgLCBgdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xgLCBgdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jYCwgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jYCwgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNgLlxuXG5Ob3csIGFjY29yZGluZyB0byB0aGUgZ3VpZGVsaW5lcywgSSBuZWVkIHRvIGRldGVybWluZSBpZiB0aGlzIHdhcnJhbnRzIGZ1cnRoZXIgZnV6emluZy4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFsbCBpbnRvIHRoZSBcIk5lZ2F0aXZlIENyaXRlcmlhXCIuIFNwZWNpZmljYWxseSwgaXMgKmFsbCogdGhlIG1vZGlmaWVkIGNvZGUgc3RyaWN0bHkgY29uZmluZWQgdG86IGRvY3VtZW50YXRpb24sIGNvbW1lbnRzLCBzcGVsbGluZyBmaXhlcywgdXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyB0aGF0ICpkb24ndCogaW1wYWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzP1xuXG5CYXNlZCBvbiB0aGUgZmlsZXMgbGlzdGVkLCBhbGwgbW9kaWZpY2F0aW9ucyBhcmUgd2l0aGluIHRoZSBgdG9vbHMvYnBmL2JwZnRvb2wvYCBhbmQgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9gIGRpcmVjdG9yaWVzLiBUaGlzICpzaG91bGQqIG1lYW4gd2UncmUgZGVhbGluZyB3aXRoIHVzZXItc3BhY2UgdG9vbHMgYW5kIHNlbGYtdGVzdHMuIEkgbmVlZCB0byBiZSBhYnNvbHV0ZWx5IGNlcnRhaW4gdGhvdWdoLiBFdmVuIHRob3VnaCB0aGUgcHJvdmlkZWQgZGlmZiBsb29rcyBjb21wbGV0ZSwgSSdsbCBxdWlja2x5IGRvdWJsZS1jaGVjayB0aGF0IGJ5IGNhbGxpbmcgYGdyZXBwZXJgIG9yIGNoZWNrIHRoZSBgZ2l0IHN0YXR1c2Agb3IgYGdpdCBkaWZmYCBhZ2Fpbi4gSnVzdCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG90aGVyIGNoYW5nZXMgbHVya2luZyB0aGF0IEknbSBtaXNzaW5nLiBCdXQgYmFzZWQgb24gdGhpcyBxdWljayBzY2FuLCB0aGlzICpzdHJvbmdseSogcG9pbnRzIHRvIHRoZSBwYXRjaCBiZWluZyBzYWZlIHRvIHNraXAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExOTA3LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzczLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDM6MDA6MDkuMzc5MjMxMTI4WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4NzY4MjQ3MzQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicHJpbnRfcmluZ2J1Zl9vdXRwdXRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwidG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jPTU3PXByaW50X2JwZl9vdXRwdXQodm9pZCAqcHJpdmF0ZV9kYXRhLCBpbnQgY3B1LCBzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgKmV2ZW50KVxcbi0tXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jLTEwOC1cXG50b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmM6MTA5OnN0YXRpYyBpbnQgcHJpbnRfcmluZ2J1Zl9vdXRwdXQodm9pZCAqY3R4LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSlcXG50b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMtMTEwLXtcXG4tLVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYz0xMzA9aW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbi0tXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jLTIxNS1cXHRpZiAobWFwX2luZm8udHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRikge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYzoyMTY6XFx0XFx0cmIgPSByaW5nX2J1ZmZlcl9fbmV3KG1hcF9mZCwgcHJpbnRfcmluZ2J1Zl9vdXRwdXQsIE5VTEwsIE5VTEwpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYy0yMTctXFx0XFx0aWYgKCFyYikge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwMzowMDoxMS4yNTYwNjA1OTJaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0MDM2ODE4Nzg4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIFBhdGNoJ3MgSW1wYWN0KipcblxuT2theSwgc28gSSd2ZSB0YWtlbiBhIGxvb2sgYXQgdGhpcyBwYXRjaCBhbmQsIGJhc2VkIG9uIHRoZSBmaWxlIHBhdGhzLCBpdCdzIHByZXR0eSBjbGVhciB3aGVyZSB0aGUgY2hhbmdlcyBsaWUuIEV2ZXJ5dGhpbmcncyBuZWF0bHkgdHVja2VkIHVuZGVyIHRoZSBgdG9vbHMvYCBkaXJlY3RvcnkuIFNlY3Rpb24gMiBvZiB0aGUgZG9jdW1lbnRhdGlvbiBleHBsaWNpdGx5IHN0YXRlcyB0aGF0IGFueXRoaW5nIGluIHRoYXQgc3BhY2UsIGxpa2UgdXNlci1zcGFjZSB1dGlsaXRpZXMsIHRlc3RzLCBvciBzY3JpcHRzLCB0aGF0IGRvZXNuJ3QgbWVzcyB3aXRoIHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKGB2bWxpbnV4YCkgb3Iga2VybmVsIG1vZHVsZXMsIGlzbid0IHNvbWV0aGluZyB3ZSBuZWVkIHRvIGZ1enouXG5cblRoZXJlZm9yZSwgYFdvcnRoRnV6emluZ2AgaXMgZGVmaW5pdGVseSBzZXQgdG8gYGZhbHNlYCBoZXJlLiBUaGUgYEVuYWJsZUNvbmZpZ3NgIGFuZCBgRm9jdXNTeW1ib2xzYCBsaXN0cyBhcmUgYm90aCBlbXB0eSwgYXMgZXhwZWN0ZWQuIFRoZSByZWFzb25pbmcgZ2l2ZW4g4oCTIHRoYXQgdGhlIHBhdGNoIG9ubHkgYWZmZWN0cyB1c2VyLXNwYWNlIHRvb2xzIGxpa2UgYGJwZnRvb2xgIGFuZCBzb21lIEJQRiBzZWxmdGVzdHMg4oCTIGFuZCB0aGF0IG5vdGhpbmcgaW4gdGhlIGtlcm5lbCBzcGFjZSBpdHNlbGYgaXMgdG91Y2hlZCDigJMgZnVsbHkgc3VwcG9ydHMgdGhpcyBhc3Nlc3NtZW50LlxuXG5JJ3ZlIGFsc28gcGVyZm9ybWVkIGEgc2FuaXR5IGNoZWNrIG9uIHRoZSB0b29sIHBhcmFtZXRlcnMsIGp1c3QgdG8gYmUgdGhvcm91Z2guIFRoZSBgRW5hYmxlQ29uZmlnc2AsIGBGb2N1c1N5bWJvbHNgIGFuZCB0aGUgYFdvcnRoRnV6emluZ2AgYXJlIGNvbnNpc3RlbnQsIGFnYWluLCByZWluZm9yY2luZyBteSBwcmV2aW91cyBhc3Nlc3NtZW50LlxuXG5Mb29rcyBsaWtlIGl0J3Mgc2FmZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyOTg2LCJPdXRwdXRUb2tlbnMiOjkwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTkxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDAzOjAwOjE1LjI5Mjg4NzA1WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMDAxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW10sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBjaGFuZ2VzIGFyZSBzdHJpY3RseSBsaW1pdGVkIHRvIHVzZXItc3BhY2UgdXRpbGl0aWVzIChicGZ0b29sIHVuZGVyIHRvb2xzL2JwZi9icGZ0b29sLykgYW5kIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLykuIE5vIGtlcm5lbC1zcGFjZSBjb2RlIG9yIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eC9tb2R1bGVzKSBpcyBtb2RpZmllZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIGNoYW5nZXMgYXJlIHN0cmljdGx5IGxpbWl0ZWQgdG8gdXNlci1zcGFjZSB1dGlsaXRpZXMgKGJwZnRvb2wgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wvKSBhbmQgc2VsZnRlc3RzICh0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvKS4gTm8ga2VybmVsLXNwYWNlIGNvZGUgb3IgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4L21vZHVsZXMpIGlzIG1vZGlmaWVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDM6MDA6MTUuMjkyOTEyMjhaIiwiU2VxIjo3LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjc3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+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-workflowb677l[1] Phase: Running StartedAt: 2026-09-11 03:00:27 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb677l[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-09-11 03:00:27 +0000 UTC FinishedAt: 2026-09-11 03:00:31 +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,}