Name: series-workflow9k4hn Phase: Failed StartedAt: 2026-09-07 01:04:19 +0000 UTC FinishedAt: 2026-09-07 01:24:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9k4hn[0] Phase: Succeeded StartedAt: 2026-09-07 01:04:19 +0000 UTC FinishedAt: 2026-09-07 01:24:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9k4hn[0].run-triage Phase: Succeeded StartedAt: 2026-09-07 01:04:19 +0000 UTC FinishedAt: 2026-09-07 01:24:15 +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+CgkJCTx0ZD4yMDI2LzA5LzA3IDAxOjIzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xzIGFuZCBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbCBjb2RlIG9yIGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDE6MjM8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA0MjJmYTU3ODZmNWMxMmJhMTUyM2RiZDhlNTBlN2ZjOWQyNWJmZWVkXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAwMToyMzo1OCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdCBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG5pbmRleCA1ZGFmM2RlNWM3NDQ2Li4zOGQxZjU0MmJmNWE1IDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG5AQCAtMTYsNyAmIzQzOzE2LDcgQEAgU1lOT1BTSVNcbiBcbiAqKmJwZnRvb2wqKiBbKk9QVElPTlMqXSAqKm1hcCoqICpDT01NQU5EKlxuIFxuLSpPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfCB7ICoqLW4qKiB8ICoqLS1ub21vdW50KiogfSB9XG4mIzQzOypPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfCB7ICoqLW4qKiB8ICoqLS1ub21vdW50KiogfSB8IHsgKiotcioqIHwgKiotLXJlY3Vyc2l2ZSoqIH0gfVxuIFxuICpDT01NQU5EUyogOj1cbiB7ICoqc2hvdyoqIHwgKipsaXN0KiogfCAqKmNyZWF0ZSoqIHwgKipkdW1wKiogfCAqKnVwZGF0ZSoqIHwgKipsb29rdXAqKiB8ICoqZ2V0bmV4dCoqIHxcbkBAIC0xNzAsNiAmIzQzOzE3MCwyNSBAQCBPUFRJT05TXG4gICAgIERvIG5vdCBhdXRvbWF0aWNhbGx5IGF0dGVtcHQgdG8gbW91bnQgYW55IHZpcnR1YWwgZmlsZSBzeXN0ZW0gKHN1Y2ggYXNcbiAgICAgdHJhY2VmcyBvciBCUEYgdmlydHVhbCBmaWxlIHN5c3RlbSkgd2hlbiBuZWNlc3NhcnkuXG4gXG4mIzQzOy1yLCAtLXJlY3Vyc2l2ZVxuJiM0MzsgICAgQWxzbyBkdW1wIHRoZSBpbm5lciBtYXBzIHJlZmVyZW5jZWQgYnkgKiphcnJheV9vZl9tYXBzKiogYW5kICoqaGFzaF9vZl9tYXBzKipcbiYjNDM7ICAgIGVudHJpZXMgd2hlbiBydW5uaW5nICoqbWFwIGR1bXAqKi4gRWFjaCBtYXAgSUQgaXMgdmlzaXRlZCBvbmNlLCBldmVuIGlmXG4mIzQzOyAgICBzZXZlcmFsIGVudHJpZXMgcmVmZXIgdG8gaXQuIFNlbGVjdGVkIG1hcHMgYXJlIGZvbGxvd2VkIGJ5IHRoZWlyIGlubmVyIG1hcHMuXG4mIzQzO1xuJiM0MzsgICAgUGxhaW4gb3V0cHV0IGluY2x1ZGVzIGEgaGVhZGVyIGlkZW50aWZ5aW5nIGVhY2ggbWFwLiBPbiBzdWNjZXNzLCBKU09OIG91dHB1dFxuJiM0MzsgICAgaXMgYWx3YXlzIGFuIGFycmF5IG9mIG1hcCBvYmplY3RzLCBlYWNoIGNvbnRhaW5pbmcgYW4gKippZCoqIGFuZCBhblxuJiM0MzsgICAgKiplbGVtZW50cyoqIGFycmF5LCBpbmNsdWRpbmcgd2hlbiBvbmx5IG9uZSBtYXAgaXMgZHVtcGVkLiBPdXRlciBtYXAgZW50cmllc1xuJiM0MzsgICAgcmV0YWluIHRoZWlyICoqaW5uZXJfbWFwX2lkKiogZmllbGQsIHdoaWNoIGlkZW50aWZpZXMgdGhlIGNvcnJlc3BvbmRpbmcgaW5uZXJcbiYjNDM7ICAgIG1hcCBvYmplY3QuXG4mIzQzO1xuJiM0MzsgICAgSW5uZXIgbWFwIElEcyBhcmUgcmVzb2x2ZWQgd2hlbiB0aGUgbWFwcyBhcmUgdmlzaXRlZC4gVGhlIGR1bXAgaXMgbm90IGFuXG4mIzQzOyAgICBhdG9taWMgc25hcHNob3Q6IGNvbmN1cnJlbnQgdXBkYXRlcyBjYW4gY2hhbmdlIG1hcCBjb250ZW50cyBvciByZW1vdmUgYVxuJiM0MzsgICAgcmVmZXJlbmNlZCBpbm5lciBtYXAgYmVmb3JlIGl0IGlzIHZpc2l0ZWQuIEZhaWx1cmUgdG8gb3BlbiBhIHJlZmVyZW5jZWRcbiYjNDM7ICAgIGlubmVyIG1hcCBzdG9wcyB0aGUgZHVtcCBhbmQgcmV0dXJucyBhIG5vbnplcm8gZXhpdCBzdGF0dXMuIE91dHB1dCBtYXlcbiYjNDM7ICAgIGNvbnRhaW4gbWFwcyBvciBlbnRyaWVzIHByaW50ZWQgYmVmb3JlIHRoZSBlcnJvci5cbiYjNDM7ICAgIEluIEpTT04gbW9kZSwgYW4gZXJyb3IgZHVyaW5nIHRyYXZlcnNhbCBpcyBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGFuZCB0aGVcbiYjNDM7ICAgIGVuY2xvc2luZyBhcnJheXMgYW5kIG9iamVjdHMgYXJlIGNsb3NlZC5cbiYjNDM7XG4gRVhBTVBMRVNcbiA9PT09PT09PVxuICoqIyBicGZ0b29sIG1hcCBzaG93KipcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5pbmRleCA3NWNiY2I1MTJlYmFlLi40NWMzMzZkNjNiZTBhIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5AQCAtMjYxLDcgJiM0MzsyNjEsNyBAQCBfYnBmdG9vbCgpXG4gXG4gICAgICMgRGVhbCB3aXRoIG9wdGlvbnNcbiAgICAgaWYgW1sgJHt3b3Jkc1tjd29yZF19ID09IC0qIF1dOyB0aGVuXG4tICAgICAgICBsb2NhbCBjPSYjMzk7LS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcbiYjNDM7ICAgICAgICBsb2NhbCBjPSYjMzk7LS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLXJlY3Vyc2l2ZSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcbiAgICAgICAgICAgICAtLXVzZS1sb2FkZXIgLS1iYXNlLWJ0ZiAtLXNpZ24gLWkgLWsmIzM5O1xuICAgICAgICAgQ09NUFJFUExZPSggJCggY29tcGdlbiAtVyBcJiMzNDskY1wmIzM0OyAtLSBcJiMzNDskY3VyXCYjMzQ7ICkgKVxuICAgICAgICAgcmV0dXJuIDBcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmMgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbmluZGV4IGM5MWUxYTZlMWExZWMuLjI5MDIxZjRkZDQ1MTggMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uY1xuQEAgLTI2LDYgJiM0MzsyNiw3IEBAIHN0YXRpYyBpbnQgKCpsYXN0X2RvX2hlbHApKGludCBhcmdjLCBjaGFyICoqYXJndik7XG4ganNvbl93cml0ZXJfdCAqanNvbl93dHI7XG4gYm9vbCBwcmV0dHlfb3V0cHV0O1xuIGJvb2wganNvbl9vdXRwdXQ7XG4mIzQzO2Jvb2wgcmVjdXJzaXZlO1xuIGJvb2wgc2hvd19waW5uZWQ7XG4gYm9vbCBibG9ja19tb3VudDtcbiBib29sIHZlcmlmaWVyX2xvZ3M7XG5AQCAtNDUyLDYgJiM0Mzs0NTMsNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdHsgXCYjMzQ7anNvblwmIzM0OyxcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCYjMzk7aiYjMzk7IH0sXG4gXHRcdHsgXCYjMzQ7aGVscFwmIzM0OyxcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCYjMzk7aCYjMzk7IH0sXG4gXHRcdHsgXCYjMzQ7cHJldHR5XCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtwJiMzOTsgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7cmVjdXJzaXZlXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtyJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDt2ZXJzaW9uXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtWJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDticGZmc1wmIzM0OyxcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCYjMzk7ZiYjMzk7IH0sXG4gXHRcdHsgXCYjMzQ7bWFwY29tcGF0XCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTttJiMzOTsgfSxcbkBAIC00ODUsNyAmIzQzOzQ4Nyw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGJpbl9uYW1lID0gXCYjMzQ7YnBmdG9vbFwmIzM0OztcbiBcbiBcdG9wdGVyciA9IDA7XG4tXHR3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsIFwmIzM0O1ZocGpmTG1uZFNpOms6QjpsXCYjMzQ7LFxuJiM0MztcdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXCYjMzQ7VmhwanJmTG1uZFNpOms6QjpsXCYjMzQ7LFxuIFx0XHRcdFx0ICBvcHRpb25zLCBOVUxMKSkgXHUwMDNlPSAwKSB7XG4gXHRcdHN3aXRjaCAob3B0KSB7XG4gXHRcdGNhc2UgJiMzOTtWJiMzOTs6XG5AQCAtNTA3LDYgJiM0Mzs1MDksOSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdFx0fVxuIFx0XHRcdGpzb253X3ByZXR0eShqc29uX3d0ciwgcHJldHR5X291dHB1dCk7XG4gXHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlICYjMzk7ciYjMzk7OlxuJiM0MztcdFx0XHRyZWN1cnNpdmUgPSB0cnVlO1xuJiM0MztcdFx0XHRicmVhaztcbiBcdFx0Y2FzZSAmIzM5O2YmIzM5OzpcbiBcdFx0XHRzaG93X3Bpbm5lZCA9IHRydWU7XG4gXHRcdFx0YnJlYWs7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oXG5pbmRleCA3OGI2ZTBlYmI4NWQ4Li5iNWRjNzk2MGNmNjgyIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbkBAIC04Myw2ICYjNDM7ODMsNyBAQCBleHRlcm4gY29uc3QgY2hhciAqYmluX25hbWU7XG4gXG4gZXh0ZXJuIGpzb25fd3JpdGVyX3QgKmpzb25fd3RyO1xuIGV4dGVybiBib29sIGpzb25fb3V0cHV0O1xuJiM0MztleHRlcm4gYm9vbCByZWN1cnNpdmU7XG4gZXh0ZXJuIGJvb2wgc2hvd19waW5uZWQ7XG4gZXh0ZXJuIGJvb2wgc2hvd19waWRzO1xuIGV4dGVybiBib29sIGJsb2NrX21vdW50O1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbmluZGV4IDY4NGE4ZmI3MjQxNDYuLmZjMDZjNzY1OTczMTUgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbkBAIC0xNyw2ICYjNDM7MTcsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2JwZi9icGYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2JwZi9oYXNobWFwLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2xpYmJwZl9pbnRlcm5hbC5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCYjMzQ7anNvbl93cml0ZXIuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O21haW4uaFwmIzM0O1xuQEAgLTgyNiwxMiAmIzQzOzgyNyw0NCBAQCBzdGF0aWMgdm9pZCBmcmVlX21hcF9rdl9idGYoc3RydWN0IGJ0ZiAqYnRmKVxuIFx0XHRidGZfX2ZyZWUoYnRmKTtcbiB9XG4gXG4mIzQzO3N0cnVjdCBtYXBfZHVtcF9jdHgge1xuJiM0MztcdHN0cnVjdCBoYXNobWFwICpzZWVuO1xuJiM0MztcdF9fdTMyICpwZW5kaW5nX2lkcztcbiYjNDM7XHRzaXplX3QgcGVuZGluZ19jbnQ7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGNvbGxlY3RfaW5uZXJfbWFwKHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eCwgX191MzIgaWQpXG4mIzQzO3tcbiYjNDM7XHRfX3UzMiAqaWRzO1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdGlmIChoYXNobWFwX19maW5kKGN0eC1cdTAwM2VzZWVuLCBpZCwgTlVMTCkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0aWRzID0gbGliYnBmX3JlYWxsb2NhcnJheShjdHgtXHUwMDNlcGVuZGluZ19pZHMsIGN0eC1cdTAwM2VwZW5kaW5nX2NudCAmIzQzOyAxLFxuJiM0MztcdFx0XHRcdCBzaXplb2YoKmlkcykpO1xuJiM0MztcdGlmICghaWRzKSB7XG4mIzQzO1x0XHRwX2VycihcJiMzNDttZW0gYWxsb2MgZmFpbGVkXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHR9XG4mIzQzO1x0Y3R4LVx1MDAzZXBlbmRpbmdfaWRzID0gaWRzO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBoYXNobWFwX19hZGQoY3R4LVx1MDAzZXNlZW4sIGlkLCAwKTtcbiYjNDM7XHRpZiAoZXJyKSB7XG4mIzQzO1x0XHRwX2VycihcJiMzNDtmYWlsZWQgdG8gcmVjb3JkIGlubmVyIG1hcCBpZCAldTogJXNcJiMzNDssIGlkLCBzdHJlcnJvcigtZXJyKSk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcdGlkc1tjdHgtXHUwMDNlcGVuZGluZ19jbnQmIzQzOyYjNDM7XSA9IGlkO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbnRcbiBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbi1cdCBib29sIHNob3dfaGVhZGVyKVxuJiM0MztcdCBib29sIHNob3dfaGVhZGVyLCBzdHJ1Y3QgbWFwX2R1bXBfY3R4ICpjdHgpXG4ge1xuIFx0dm9pZCAqa2V5LCAqdmFsdWUsICpwcmV2X2tleTtcbiBcdHVuc2lnbmVkIGludCBudW1fZWxlbXMgPSAwO1xuJiM0MztcdGpzb25fd3JpdGVyX3QgKnBsYWluX2J0Zl93dHIgPSBOVUxMO1xuIFx0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcbiBcdGludCBlcnI7XG4gXG5AQCAtODQ1LDYgJiM0Mzs4NzgsMTcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4gXG4gXHRwcmV2X2tleSA9IE5VTEw7XG4gXG4mIzQzO1x0aWYgKGN0eCBcdTAwMjZcdTAwMjYgIXd0ciBcdTAwMjZcdTAwMjYgKGluZm8tXHUwMDNlYnRmX3ZhbHVlX3R5cGVfaWQgfHxcbiYjNDM7XHRcdFx0ICAgIGluZm8tXHUwMDNlYnRmX3ZtbGludXhfdmFsdWVfdHlwZV9pZCkpIHtcbiYjNDM7XHRcdHBsYWluX2J0Zl93dHIgPSBnZXRfYnRmX3dyaXRlcigpO1xuJiM0MztcdFx0aWYgKHBsYWluX2J0Zl93dHIpIHtcbiYjNDM7XHRcdFx0aWYgKHNob3dfaGVhZGVyKVxuJiM0MztcdFx0XHRcdHNob3dfbWFwX2hlYWRlcl9wbGFpbihpbmZvKTtcbiYjNDM7XHRcdFx0c2hvd19oZWFkZXIgPSBmYWxzZTtcbiYjNDM7XHRcdFx0d3RyID0gcGxhaW5fYnRmX3d0cjtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuIFx0aWYgKHd0cikge1xuIFx0XHRlcnIgPSBnZXRfbWFwX2t2X2J0ZihpbmZvLCBcdTAwMjZidGYpO1xuIFx0XHRpZiAoZXJyKSB7XG5AQCAtODc0LDEwICYjNDM7OTE4LDIwIEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0XHRpZiAoZXJyKSB7XG4gXHRcdFx0aWYgKGVycm5vID09IEVOT0VOVClcbiBcdFx0XHRcdGVyciA9IDA7XG4mIzQzO1x0XHRcdGVsc2UgaWYgKGN0eClcbiYjNDM7XHRcdFx0XHRwX2VycihcJiMzNDtjYW4mIzM5O3QgZ2V0IG5leHQga2V5IGZvciBtYXAgaWQgJXU6ICVzXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgIGluZm8tXHUwMDNlaWQsIHN0cmVycm9yKGVycm5vKSk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbi1cdFx0aWYgKCFkdW1wX21hcF9lbGVtKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cikpXG4mIzQzO1x0XHRlcnIgPSBkdW1wX21hcF9lbGVtKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cik7XG4mIzQzO1x0XHRpZiAoIWVycikge1xuIFx0XHRcdG51bV9lbGVtcyYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRcdGlmIChjdHggXHUwMDI2XHUwMDI2IG1hcF9pc19tYXBfb2ZfbWFwcyhpbmZvLVx1MDAzZXR5cGUpKSB7XG4mIzQzO1x0XHRcdFx0ZXJyID0gY29sbGVjdF9pbm5lcl9tYXAoY3R4LCAqKF9fdTMyICopdmFsdWUpO1xuJiM0MztcdFx0XHRcdGlmIChlcnIpXG4mIzQzO1x0XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fVxuIFx0XHRwcmV2X2tleSA9IGtleTtcbiBcdH1cbiBcbkBAIC04OTQsMTggJiM0Mzs5NDgsMjUgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4gXHRmcmVlKGtleSk7XG4gXHRmcmVlKHZhbHVlKTtcbiBcdGZyZWVfbWFwX2t2X2J0ZihidGYpO1xuJiM0MztcdGlmIChwbGFpbl9idGZfd3RyKVxuJiM0MztcdFx0anNvbndfZGVzdHJveShcdTAwMjZwbGFpbl9idGZfd3RyKTtcbiBcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4ge1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl9nZXRfZmRfYnlfaWRfb3B0cywgb3B0cyxcbiYjNDM7XHRcdC5vcGVuX2ZsYWdzID0gQlBGX0ZfUkRPTkxZLFxuJiM0MztcdCk7XG4gXHRqc29uX3dyaXRlcl90ICp3dHIgPSBOVUxMLCAqYnRmX3d0ciA9IE5VTEw7XG4gXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbiYjNDM7XHRzdHJ1Y3QgbWFwX2R1bXBfY3R4IGN0eCA9IHt9O1xuIFx0aW50IG5iX2ZkcywgaSA9IDA7XG4gXHRfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7XG4gXHRpbnQgKmZkcyA9IE5VTEw7XG4gXHRpbnQgZXJyID0gLTE7XG4mIzQzO1x0c2l6ZV90IGo7XG4gXG4gXHRpZiAoYXJnYyAhPSAyKVxuIFx0XHR1c2FnZSgpO1xuQEAgLTkxOSw5ICYjNDM7OTgwLDM0IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRpZiAobmJfZmRzIFx1MDAzYyAxKVxuIFx0XHRnb3RvIGV4aXRfZnJlZTtcbiBcbiYjNDM7XHRpZiAocmVjdXJzaXZlKSB7XG4mIzQzO1x0XHRjdHguc2VlbiA9IGhhc2htYXBfX25ldyhoYXNoX2ZuX2Zvcl9rZXlfYXNfaWQsXG4mIzQzO1x0XHRcdFx0XHRlcXVhbF9mbl9mb3Jfa2V5X2FzX2lkLCBOVUxMKTtcbiYjNDM7XHRcdGlmIChJU19FUlIoY3R4LnNlZW4pKSB7XG4mIzQzO1x0XHRcdGN0eC5zZWVuID0gTlVMTDtcbiYjNDM7XHRcdFx0cF9lcnIoXCYjMzQ7ZmFpbGVkIHRvIGNyZWF0ZSBoYXNobWFwIGZvciByZWN1cnNpdmUgZHVtcFwmIzM0Oyk7XG4mIzQzO1x0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdC8qIFJlY29yZCB0aGUgc2VsZWN0ZWQgbWFwcyBiZWZvcmUgZGlzY292ZXJpbmcgYW55IGlubmVyIG1hcHMuICovXG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuYl9mZHM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdGxlbiA9IHNpemVvZihpbmZvKTtcbiYjNDM7XHRcdFx0aWYgKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmRzW2ldLCBcdTAwMjZpbmZvLCBcdTAwMjZsZW4pKSB7XG4mIzQzO1x0XHRcdFx0cF9lcnIoXCYjMzQ7Y2FuJiMzOTt0IGdldCBtYXAgaW5mbzogJXNcJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1x0XHRcdFx0ZXJyID0gLTE7XG4mIzQzO1x0XHRcdFx0Z290byBleGl0X2Nsb3NlO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdGVyciA9IGhhc2htYXBfX2FkZChjdHguc2VlbiwgaW5mby5pZCwgMCk7XG4mIzQzO1x0XHRcdGlmIChlcnIpIHtcbiYjNDM7XHRcdFx0XHRwX2VycihcJiMzNDtmYWlsZWQgdG8gcmVjb3JkIG1hcCBpZCAldTogJXNcJiMzNDssIGluZm8uaWQsXG4mIzQzO1x0XHRcdFx0ICAgICAgc3RyZXJyb3IoLWVycikpO1xuJiM0MztcdFx0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4gXHRpZiAoanNvbl9vdXRwdXQpIHtcbiBcdFx0d3RyID0ganNvbl93dHI7XG4tXHR9IGVsc2Uge1xuJiM0MztcdH0gZWxzZSBpZiAoIXJlY3Vyc2l2ZSkge1xuIFx0XHRpbnQgZG9fcGxhaW5fYnRmO1xuIFxuIFx0XHRkb19wbGFpbl9idGYgPSBtYXBzX2hhdmVfYnRmKGZkcywgbmJfZmRzKTtcbkBAIC05MzYsNyAmIzQzOzEwMjIsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR9XG4gXHR9XG4gXG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4mIzQzO1x0aWYgKHd0ciBcdTAwMjZcdTAwMjYgKG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmUpKVxuIFx0XHRqc29ud19zdGFydF9hcnJheSh3dHIpO1x0Lyogcm9vdCBhcnJheSAqL1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbmJfZmRzOyBpJiM0MzsmIzQzOykge1xuIFx0XHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFx1MDAyNmluZm8sIFx1MDAyNmxlbikpIHtcbkBAIC05NDQsMjIgJiM0MzsxMDMwLDUwIEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdFx0ZXJyID0gLTE7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbi1cdFx0ZXJyID0gbWFwX2R1bXAoZmRzW2ldLCBcdTAwMjZpbmZvLCB3dHIsIG5iX2ZkcyBcdTAwM2UgMSk7XG4mIzQzO1x0XHRlcnIgPSBtYXBfZHVtcChmZHNbaV0sIFx1MDAyNmluZm8sIHd0ciwgbmJfZmRzIFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZSxcbiYjNDM7XHRcdFx0ICAgICAgIHJlY3Vyc2l2ZSA/IFx1MDAyNmN0eCA6IE5VTEwpO1xuIFx0XHRpZiAoIXd0ciBcdTAwMjZcdTAwMjYgaSAhPSBuYl9mZHMgLSAxKVxuIFx0XHRcdHByaW50ZihcJiMzNDtcXG5cJiMzNDspO1xuIFxuIFx0XHRpZiAoZXJyKVxuIFx0XHRcdGJyZWFrO1xuLVx0XHRjbG9zZShmZHNbaV0pO1xuJiM0MztcdFx0LyogS2VlcCBzZWxlY3RlZCBtYXBzIGFsaXZlIHdoaWxlIHZpc2l0aW5nIHRoZWlyIGlubmVyIG1hcHMuICovXG4mIzQzO1x0XHRpZiAoIXJlY3Vyc2l2ZSlcbiYjNDM7XHRcdFx0Y2xvc2UoZmRzW2ldKTtcbiYjNDM7XHR9XG4mIzQzO1x0Zm9yIChqID0gMDsgIWVyciBcdTAwMjZcdTAwMjYgaiBcdTAwM2MgY3R4LnBlbmRpbmdfY250OyBqJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aW50IGZkO1xuJiM0MztcbiYjNDM7XHRcdGZkID0gYnBmX21hcF9nZXRfZmRfYnlfaWRfb3B0cyhjdHgucGVuZGluZ19pZHNbal0sIFx1MDAyNm9wdHMpO1xuJiM0MztcdFx0aWYgKGZkIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRcdHBfZXJyKFwmIzM0O2NhbiYjMzk7dCBvcGVuIGlubmVyIG1hcCBpZCAldTogJXNcJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgIGN0eC5wZW5kaW5nX2lkc1tqXSwgc3RyZXJyb3IoZXJybm8pKTtcbiYjNDM7XHRcdFx0ZXJyID0gLTE7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0bGVuID0gc2l6ZW9mKGluZm8pO1xuJiM0MztcdFx0aWYgKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsIFx1MDAyNmluZm8sIFx1MDAyNmxlbikpIHtcbiYjNDM7XHRcdFx0cF9lcnIoXCYjMzQ7Y2FuJiMzOTt0IGdldCBtYXAgaW5mbzogJXNcJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1x0XHRcdGVyciA9IC0xO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0aWYgKCF3dHIpXG4mIzQzO1x0XHRcdFx0cHJpbnRmKFwmIzM0O1xcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdGVyciA9IG1hcF9kdW1wKGZkLCBcdTAwMjZpbmZvLCB3dHIsIHRydWUsIFx1MDAyNmN0eCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRjbG9zZShmZCk7XG4gXHR9XG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4mIzQzO1x0aWYgKHd0ciBcdTAwMjZcdTAwMjYgKG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmUpKVxuIFx0XHRqc29ud19lbmRfYXJyYXkod3RyKTtcdC8qIHJvb3QgYXJyYXkgKi9cbiBcbiBcdGlmIChidGZfd3RyKVxuIFx0XHRqc29ud19kZXN0cm95KFx1MDAyNmJ0Zl93dHIpO1xuIGV4aXRfY2xvc2U6XG4mIzQzO1x0aWYgKHJlY3Vyc2l2ZSlcbiYjNDM7XHRcdGkgPSAwO1xuIFx0Zm9yICg7IGkgXHUwMDNjIG5iX2ZkczsgaSYjNDM7JiM0MzspXG4gXHRcdGNsb3NlKGZkc1tpXSk7XG4mIzQzO1x0aGFzaG1hcF9fZnJlZShjdHguc2Vlbik7XG4mIzQzO1x0ZnJlZShjdHgucGVuZGluZ19pZHMpO1xuIGV4aXRfZnJlZTpcbiBcdGZyZWUoZmRzKTtcbiBcdGZyZWVfYnRmX3ZtbGludXgoKTtcbkBAIC0xNDg0LDcgJiM0MzsxNTk4LDcgQEAgc3RhdGljIGludCBkb19oZWxwKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XCYjMzQ7ICAgICAgICAgICAgICAgICB0YXNrX3N0b3JhZ2UgfCBibG9vbV9maWx0ZXIgfCB1c2VyX3JpbmdidWYgfCBjZ3JwX3N0b3JhZ2UgfCBhcmVuYSB8XFxuXCYjMzQ7XG4gXHRcdFwmIzM0OyAgICAgICAgICAgICAgICAgaW5zbl9hcnJheSB8IHJoYXNoIH1cXG5cJiMzNDtcbiBcdFx0XCYjMzQ7ICAgICAgIFwmIzM0OyBIRUxQX1NQRUNfT1BUSU9OUyBcJiMzNDsgfFxcblwmIzM0O1xuLVx0XHRcJiMzNDsgICAgICAgICAgICAgICAgICAgIHstZnwtLWJwZmZzfSB8IHstbnwtLW5vbW91bnR9IH1cXG5cJiMzNDtcbiYjNDM7XHRcdFwmIzM0OyAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfCB7LXJ8LS1yZWN1cnNpdmV9IH1cXG5cJiMzNDtcbiBcdFx0XCYjMzQ7XCYjMzQ7LFxuIFx0XHRiaW5fbmFtZSwgYXJndlstMl0pO1xuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjMzMGEzMzQ0NzcwZDFcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY1xuQEAgLTAsMCAmIzQzOzEsNDE5IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZnRvb2xfaGVscGVycy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvcmVzb3VyY2UuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2RlZmluZSBPVVRQVVRfU0laRSA4MTkyXG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBkdW1wX21hcChfX3UzMiBpZCwgY29uc3QgY2hhciAqb3B0aW9ucywgY2hhciAqb3V0cHV0KVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dO1xuJiM0MztcbiYjNDM7XHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwmIzM0OyVzIG1hcCBkdW1wIGlkICV1XCYjMzQ7LCBvcHRpb25zLCBpZCk7XG4mIzQzO1x0bWVtc2V0KG91dHB1dCwgMCwgT1VUUFVUX1NJWkUpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUgLSAxKSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtkdW1wX21hcFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0LyogVGhlIGhlbHBlciBkb2VzbiYjMzk7dCB0ZXJtaW5hdGUgb3Igc3RyaXAgdGhlIG91dHB1dC4gKi9cbiYjNDM7XHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFwmIzM0O1xcblwmIzM0OyldID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIF9fdTMyIG1hcF9pZChpbnQgZmQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbiYjNDM7XHRfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsIFx1MDAyNmluZm8sIFx1MDAyNmxlbiksIFwmIzM0O21hcF9pbmZvXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdHJldHVybiBpbmZvLmlkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGNvdW50X3Rva2VuKGNvbnN0IGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqdG9rZW4pXG4mIzQzO3tcbiYjNDM7XHRpbnQgY291bnQgPSAwO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoKG91dHB1dCA9IHN0cnN0cihvdXRwdXQsIHRva2VuKSkpIHtcbiYjNDM7XHRcdGNvdW50JiM0MzsmIzQzOztcbiYjNDM7XHRcdG91dHB1dCAmIzQzOz0gc3RybGVuKHRva2VuKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIGNvdW50O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjaGVja19wbGFpbihfX3UzMiByb290X2lkLCBfX3UzMiBpbm5lcl9pZCwgY29uc3QgY2hhciAqdHlwZSxcbiYjNDM7XHRcdFx0aW50IGVudHJpZXMsIGJvb2wgdHlwZWQpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIGhlYWRlclsxMjhdO1xuJiM0MztcdGNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9O1xuJiM0MztcdGNvbnN0IGNoYXIgKnJvb3QsICppbm5lcjtcbiYjNDM7XG4mIzQzO1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcJiMzNDstLXJlY3Vyc2l2ZSBtYXAgZHVtcCBpZCAldVwmIzM0Oywgcm9vdF9pZCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O3BsYWluX2R1bXBcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFwmIzM0OyV1OiAlcyAgbmFtZSBkdW1wX291dGVyICBcJiMzNDssIHJvb3RfaWQsIHR5cGUpO1xuJiM0MztcdHJvb3QgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihyb290LCBcJiMzNDtwbGFpbl9yb290X2hlYWRlclwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0QVNTRVJUX0VRKHJvb3QgLSBvdXRwdXQsIDAsIFwmIzM0O3BsYWluX3Jvb3RfZmlyc3RcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFwmIzM0O2lubmVyX21hcF9pZDpcJiMzNDspLCBlbnRyaWVzLCBcJiMzNDtwbGFpbl9yZWZlcmVuY2VzXCYjMzQ7KTtcbiYjNDM7XHRpZiAoZW50cmllcykge1xuJiM0MztcdFx0c25wcmludGYoaGVhZGVyLCBzaXplb2YoaGVhZGVyKSwgXCYjMzQ7JXU6IGhhc2ggIG5hbWUgZHVtcF9pbm5lciAgXCYjMzQ7LCBpbm5lcl9pZCk7XG4mIzQzO1x0XHRpbm5lciA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7XG4mIzQzO1x0XHRpZiAoQVNTRVJUX09LX1BUUihpbm5lciwgXCYjMzQ7cGxhaW5faW5uZXJfaGVhZGVyXCYjMzQ7KSlcbiYjNDM7XHRcdFx0QVNTRVJUX0dUKGlubmVyIC0gcm9vdCwgMCwgXCYjMzQ7cGxhaW5faW5uZXJfYWZ0ZXJfcm9vdFwmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBoZWFkZXIpLCAxLCBcJiMzNDtwbGFpbl9pbm5lcl9vbmNlXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgXCYjMzQ7Rm91bmQgXCYjMzQ7KSwgZW50cmllcyBcdTAwMjZcdTAwMjYgIXR5cGVkID8gMiA6IDEsXG4mIzQzO1x0XHQgIFwmIzM0O3BsYWluX21hcF9jb3VudFwmIzM0Oyk7XG4mIzQzO1x0aWYgKHR5cGVkKSB7XG4mIzQzO1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIFwmIzM0O1xcXCYjMzQ7a2V5XFxcJiMzNDs6IDBcJiMzNDssIFwmIzM0O3BsYWluX2J0Zl9rZXlcJiMzNDspO1xuJiM0MztcdFx0QVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCBcJiMzNDtcXFwmIzM0O3ZhbHVlXFxcJiMzNDs6IDE2ODQzMDA5XCYjMzQ7LCBcJiMzNDtwbGFpbl9idGZfdmFsdWVcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9vdXRlcihlbnVtIGJwZl9tYXBfdHlwZSB0eXBlLCBpbnQgZW50cmllcywgYm9vbCBlbXB0eV9pbm5lcixcbiYjNDM7XHRcdCAgICAgICBib29sIHR5cGVkKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgaW5uZXJfb3B0cyk7XG4mIzQzO1x0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcbiYjNDM7XHRjaGFyIG91dGVyW09VVFBVVF9TSVpFXSwgaW5uZXJbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdO1xuJiM0MztcdGNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcmVmZXJlbmNlWzY0XTtcbiYjNDM7XHRjb25zdCBjaGFyICp0eXBlX25hbWUgPSBsaWJicGZfYnBmX21hcF90eXBlX3N0cih0eXBlKTtcbiYjNDM7XHRpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMTtcbiYjNDM7XHRfX3UzMiByb290X2lkLCBpbm5lcl9pZCwga2V5LCB2YWx1ZSA9IDB4MDEwMTAxMDE7XG4mIzQzO1xuJiM0MztcdGlmICh0eXBlZCkge1xuJiM0MztcdFx0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwmIzM0O2NyZWF0ZV9idGZcJiMzNDspIHx8XG4mIzQzO1x0XHQgICAgIUFTU0VSVF9FUShidGZfX2FkZF9pbnQoYnRmLCBcJiMzNDt1bnNpZ25lZCBpbnRcJiMzNDssIDQsIDApLCAxLCBcJiMzNDtidGZfaW50XCYjMzQ7KSB8fFxuJiM0MztcdFx0ICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksIFwmIzM0O2xvYWRfYnRmXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRpbm5lcl9vcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTtcbiYjNDM7XHRcdGlubmVyX29wdHMuYnRmX2tleV90eXBlX2lkID0gMTtcbiYjNDM7XHRcdGlubmVyX29wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxO1xuJiM0MztcdH1cbiYjNDM7XHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcJiMzNDtkdW1wX2lubmVyXCYjMzQ7LCBzaXplb2Yoa2V5KSxcbiYjNDM7XHRcdFx0XHQgIHNpemVvZih2YWx1ZSksIDIsIFx1MDAyNmlubmVyX29wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcJiMzNDtjcmVhdGVfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0a2V5ID0gMDtcbiYjNDM7XHRpZiAoIWVtcHR5X2lubmVyIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oaW5uZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O3BvcHVsYXRlX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XG4mIzQzO1x0b3V0ZXJfZmQgPSBicGZfbWFwX2NyZWF0ZSh0eXBlLCBcJiMzNDtkdW1wX291dGVyXCYjMzQ7LCBzaXplb2Yoa2V5KSwgc2l6ZW9mKF9fdTMyKSxcbiYjNDM7XHRcdFx0XHQgMywgXHUwMDI2b3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfRkQob3V0ZXJfZmQsIFwmIzM0O2NyZWF0ZV9vdXRlclwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHQvKiBUaGUgdW51c2VkIHRoaXJkIGFycmF5IHNsb3QgYWxzbyBleGVyY2lzZXMgZmFpbGVkIGxvb2t1cHMuICovXG4mIzQzO1x0Zm9yIChrZXkgPSAwOyBrZXkgXHUwMDNjIGVudHJpZXM7IGtleSYjNDM7JiM0MzspXG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCBcdTAwMjZrZXksIFx1MDAyNmlubmVyX2ZkLCBCUEZfQU5ZKSxcbiYjNDM7XHRcdFx0ICAgICAgIFwmIzM0O3BvcHVsYXRlX291dGVyXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0cm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7XG4mIzQzO1x0aW5uZXJfaWQgPSBtYXBfaWQoaW5uZXJfZmQpO1xuJiM0MztcdGlmICghcm9vdF9pZCB8fCAhaW5uZXJfaWQgfHwgIWR1bXBfbWFwKHJvb3RfaWQsIFwmIzM0Oy1qXCYjMzQ7LCBvdXRlcikgfHxcbiYjNDM7XHQgICAgIWR1bXBfbWFwKGlubmVyX2lkLCBcJiMzNDstalwmIzM0OywgaW5uZXIpKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUShvdXRlclswXSwgJiMzOTtbJiMzOTssIFwmIzM0O2RlZmF1bHRfYXJyYXlcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgXCYjMzQ7XFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OlwmIzM0OyksIDAsIFwmIzM0O2RlZmF1bHRfbm9fd3JhcHBlclwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCBcJiMzNDtcXFwmIzM0O2lkXFxcJiMzNDs6XCYjMzQ7KSwgMCwgXCYjMzQ7ZGVmYXVsdF9ub19oZWFkZXJcJiMzNDspO1xuJiM0MztcdHNucHJpbnRmKHJlZmVyZW5jZSwgc2l6ZW9mKHJlZmVyZW5jZSksIFwmIzM0O1xcXCYjMzQ7aW5uZXJfbWFwX2lkXFxcJiMzNDs6JXVcJiMzNDssIGlubmVyX2lkKTtcbiYjNDM7XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIHJlZmVyZW5jZSksIGVudHJpZXMsIFwmIzM0O2RlZmF1bHRfcmVmZXJlbmNlc1wmIzM0Oyk7XG4mIzQzO1x0aWYgKCFlbnRyaWVzKVxuJiM0MztcdFx0QVNTRVJUX1NUUkVRKG91dGVyLCBcJiMzNDtbXVwmIzM0OywgXCYjMzQ7ZW1wdHlfb3V0ZXJfZGVmYXVsdFwmIzM0Oyk7XG4mIzQzO1x0aWYgKGVtcHR5X2lubmVyKVxuJiM0MztcdFx0QVNTRVJUX1NUUkVRKGlubmVyLCBcJiMzNDtbXVwmIzM0OywgXCYjMzQ7ZW1wdHlfaW5uZXJfZGVmYXVsdFwmIzM0Oyk7XG4mIzQzO1x0ZWxzZSBpZiAodHlwZWQpXG4mIzQzO1x0XHRBU1NFUlRfSEFTX1NVQlNUUihpbm5lciwgXCYjMzQ7XFxcJiMzNDtmb3JtYXR0ZWRcXFwmIzM0Ozp7XFxcJiMzNDtrZXlcXFwmIzM0OzowLFxcXCYjMzQ7dmFsdWVcXFwmIzM0OzoxNjg0MzAwOX1cJiMzNDssXG4mIzQzO1x0XHRcdFx0ICBcJiMzNDt0eXBlZF9pbm5lclwmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0QVNTRVJUX1NUUkVRKGlubmVyLFxuJiM0MztcdFx0XHQgICAgIFwmIzM0O1t7XFxcJiMzNDtrZXlcXFwmIzM0OzpbXFxcJiMzNDsweDAwXFxcJiMzNDssXFxcJiMzNDsweDAwXFxcJiMzNDssXFxcJiMzNDsweDAwXFxcJiMzNDssXFxcJiMzNDsweDAwXFxcJiMzNDtdLFwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0O1xcXCYjMzQ7dmFsdWVcXFwmIzM0OzpbXFxcJiMzNDsweDAxXFxcJiMzNDssXFxcJiMzNDsweDAxXFxcJiMzNDssXFxcJiMzNDsweDAxXFxcJiMzNDssXFxcJiMzNDsweDAxXFxcJiMzNDtdfV1cJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7b3JkaW5hcnlfZGVmYXVsdFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdC8qIENvbXBhcmUgdGhlIGNvbXBsZXRlIEpTT04gZG9jdW1lbnQ6IGEgZmxhdCBhcnJheSB3aXRoIHRoZSByb290IGZpcnN0LFxuJiM0MztcdCAqIG9uZSBjb3B5IG9mIHRoZSBzaGFyZWQgaW5uZXIgbWFwLCBhbmQgdW5jaGFuZ2VkIGVudHJ5IHJlcHJlc2VudGF0aW9ucy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoZW50cmllcylcbiYjNDM7XHRcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuJiM0MztcdFx0XHQgXCYjMzQ7W3tcXFwmIzM0O2lkXFxcJiMzNDs6JXUsXFxcJiMzNDt0eXBlXFxcJiMzNDs6XFxcJiMzNDslc1xcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF9vdXRlclxcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0XHQgXCYjMzQ7XFxcJiMzNDtmbGFnc1xcXCYjMzQ7OjAsXFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OiVzfSx7XFxcJiMzNDtpZFxcXCYjMzQ7OiV1LFxcXCYjMzQ7dHlwZVxcXCYjMzQ7OlxcXCYjMzQ7aGFzaFxcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0XHQgXCYjMzQ7XFxcJiMzNDtuYW1lXFxcJiMzNDs6XFxcJiMzNDtkdW1wX2lubmVyXFxcJiMzNDssXFxcJiMzNDtmbGFnc1xcXCYjMzQ7OjAsXFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OiVzfV1cJiMzNDssXG4mIzQzO1x0XHRcdCByb290X2lkLCB0eXBlX25hbWUsIG91dGVyLCBpbm5lcl9pZCwgaW5uZXIpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuJiM0MztcdFx0XHQgXCYjMzQ7W3tcXFwmIzM0O2lkXFxcJiMzNDs6JXUsXFxcJiMzNDt0eXBlXFxcJiMzNDs6XFxcJiMzNDslc1xcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF9vdXRlclxcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0XHQgXCYjMzQ7XFxcJiMzNDtmbGFnc1xcXCYjMzQ7OjAsXFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OltdfV1cJiMzNDssIHJvb3RfaWQsIHR5cGVfbmFtZSk7XG4mIzQzO1x0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFwmIzM0Oy1qIC1yXCYjMzQ7LCBvdXRwdXQpKVxuJiM0MztcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwmIzM0O3JlY3Vyc2l2ZV9qc29uXCYjMzQ7KTtcbiYjNDM7XHRpZiAoZHVtcF9tYXAocm9vdF9pZCwgXCYjMzQ7LS1qc29uIC0tcmVjdXJzaXZlXCYjMzQ7LCBvdXRwdXQpKVxuJiM0MztcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwmIzM0O3JlY3Vyc2l2ZV9sb25nX29wdGlvbnNcJiMzNDspO1xuJiM0MztcdGNoZWNrX3BsYWluKHJvb3RfaWQsIGlubmVyX2lkLCB0eXBlX25hbWUsIGVudHJpZXMsIHR5cGVkKTtcbiYjNDM7XG4mIzQzO1x0LyogUmVjdXJzaW9uIG9uIGFuIG9yZGluYXJ5IG1hcCBzdGlsbCBlbWl0cyBhIHNpbmdsZSBtYXAgb2JqZWN0LiAqL1xuJiM0MztcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuJiM0MztcdFx0IFwmIzM0O1t7XFxcJiMzNDtpZFxcXCYjMzQ7OiV1LFxcXCYjMzQ7dHlwZVxcXCYjMzQ7OlxcXCYjMzQ7aGFzaFxcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF9pbm5lclxcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0IFwmIzM0O1xcXCYjMzQ7ZmxhZ3NcXFwmIzM0OzowLFxcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0Ozolc31dXCYjMzQ7LCBpbm5lcl9pZCwgaW5uZXIpO1xuJiM0MztcdGlmIChkdW1wX21hcChpbm5lcl9pZCwgXCYjMzQ7LWogLXJcJiMzNDssIG91dHB1dCkpXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCYjMzQ7b3JkaW5hcnlfcmVjdXJzaXZlXCYjMzQ7KTtcbiYjNDM7b3V0OlxuJiM0MztcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShvdXRlcl9mZCk7XG4mIzQzO1x0aWYgKGlubmVyX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGlubmVyX2ZkKTtcbiYjNDM7XHRidGZfX2ZyZWUoYnRmKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9tdWx0aXBsZV9yb290cyh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4mIzQzO1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBuYW1lW0JQRl9PQkpfTkFNRV9MRU5dO1xuJiM0MztcdGNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9LCBleHBlY3RlZFtPVVRQVVRfU0laRSAqIDRdLCBlbGVtZW50c1tPVVRQVVRfU0laRV07XG4mIzQzO1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlc1tdID0geyBcJiMzNDtoYXNoXCYjMzQ7LCBcJiMzNDthcnJheV9vZl9tYXBzXCYjMzQ7LCBcJiMzNDtoYXNoX29mX21hcHNcJiMzNDssIFwmIzM0O2hhc2hcJiMzNDsgfTtcbiYjNDM7XHRpbnQgZmRzW10gPSB7IC0xLCAtMSwgLTEsIC0xIH07XG4mIzQzO1x0X191MzIgaWRzWzRdLCBrZXk7XG4mIzQzO1x0aW50IGksIGxlbiA9IDA7XG4mIzQzO1xuJiM0MztcdC8qIFNlbGVjdCB0aGUgZmlyc3QgaW5uZXIgbWFwIGFuZCBib3RoIG91dGVycyBhcyByb290cy4gVGhlIG90aGVyIGlubmVyXG4mIzQzO1x0ICogbWFwIG11c3QgYmUgYXBwZW5kZWQgYWZ0ZXIgYWxsIHRocmVlIHJvb3RzLCBldmVuIHRob3VnaCBpdCBpcyBmb3VuZFxuJiM0MztcdCAqIHdoaWxlIGR1bXBpbmcgdGhlIGZpcnN0IG91dGVyLiBBIHByb2Nlc3Mtc3BlY2lmaWMgbmFtZSBhdm9pZHMgb3RoZXJcbiYjNDM7XHQgKiB0ZXN0cyYjMzk7IG1hcHMgam9pbmluZyB0aGUgc2VsZWN0aW9uLlxuJiM0MztcdCAqL1xuJiM0MztcdHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgXCYjMzQ7ZHVtcF8ldVwmIzM0OywgZ2V0cGlkKCkpO1xuJiM0MztcdGZkc1swXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBuYW1lLCA0LCA0LCAxLCBOVUxMKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMF0sIFwmIzM0O2NyZWF0ZV9zZWxlY3RlZF9pbm5lclwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRmZHNbM10gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCYjMzQ7ZHVtcF9kaXNjb3ZlcmVkXCYjMzQ7LCA0LCA0LCAxLCBOVUxMKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChmZHNbM10sIFwmIzM0O2NyZWF0ZV9kaXNjb3ZlcmVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdG9wdHMuaW5uZXJfbWFwX2ZkID0gZmRzWzBdO1xuJiM0MztcdGZkc1sxXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBuYW1lLCA0LCA0LCAyLCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMV0sIFwmIzM0O2NyZWF0ZV9hcnJheV9yb290XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZkc1syXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIG5hbWUsIDQsIDQsIDIsIFx1MDAyNm9wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGZkc1syXSwgXCYjMzQ7Y3JlYXRlX2hhc2hfcm9vdFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRmb3IgKGkgPSAxOyBpIFx1MDAzYz0gMjsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGtleSA9IDA7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXHUwMDI2a2V5LCBcdTAwMjZmZHNbMF0sIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cmVmZXJlbmNlX3NlbGVjdGVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRrZXkgPSAxO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZHNbaV0sIFx1MDAyNmtleSwgXHUwMDI2ZmRzWzNdLCBCUEZfQU5ZKSxcbiYjNDM7XHRcdFx0ICAgICAgIFwmIzM0O3JlZmVyZW5jZV9kaXNjb3ZlcmVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoZmRzKTsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlkc1tpXSA9IG1hcF9pZChmZHNbaV0pO1xuJiM0MztcdFx0aWYgKCFpZHNbaV0gfHwgIWR1bXBfbWFwKGlkc1tpXSwgXCYjMzQ7LWpcJiMzNDssIGVsZW1lbnRzKSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRsZW4gJiM0Mzs9IHNucHJpbnRmKGV4cGVjdGVkICYjNDM7IGxlbiwgc2l6ZW9mKGV4cGVjdGVkKSAtIGxlbixcbiYjNDM7XHRcdFx0XHRcJiMzNDslc3tcXFwmIzM0O2lkXFxcJiMzNDs6JXUsXFxcJiMzNDt0eXBlXFxcJiMzNDs6XFxcJiMzNDslc1xcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7JXNcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdFx0XHRcJiMzNDtcXFwmIzM0O2ZsYWdzXFxcJiMzNDs6MCxcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6JXN9JXNcJiMzNDssXG4mIzQzO1x0XHRcdFx0aSA/IFwmIzM0OyxcJiMzNDsgOiBcJiMzNDtbXCYjMzQ7LCBpZHNbaV0sIHR5cGVzW2ldLFxuJiM0MztcdFx0XHRcdGkgPT0gMyA/IFwmIzM0O2R1bXBfZGlzY292ZXJlZFwmIzM0OyA6IG5hbWUsIGVsZW1lbnRzLCBpID09IDMgPyBcJiMzNDtdXCYjMzQ7IDogXCYjMzQ7XCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcJiMzNDstaiAtciBtYXAgZHVtcCBuYW1lICVzXCYjMzQ7LCBuYW1lKTtcbiYjNDM7XHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcbiYjNDM7XHRcdCAgICAgIFwmIzM0O2R1bXBfbXVsdGlwbGVfcm9vdHNcJiMzNDspKSB7XG4mIzQzO1x0XHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFwmIzM0O1xcblwmIzM0OyldID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcJiMzNDtyb290c19maXJzdF9hbmRfc2VlZF9kZWR1cFwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztvdXQ6XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShmZHMpOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdGlmIChmZHNbaV0gXHUwMDNlPSAwKVxuJiM0MztcdFx0XHRjbG9zZShmZHNbaV0pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3VucmVhZGFibGUoYm9vbCBvdXRlcilcbiYjNDM7e1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xuJiM0MztcdGNoYXIgZWxlbWVudHNbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdLCByb290W09VVFBVVF9TSVpFXTtcbiYjNDM7XHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHBsYWluW09VVFBVVF9TSVpFXSA9IHt9O1xuJiM0MztcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXTtcbiYjNDM7XHRpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMSwgbG9va3VwX2Vycm5vO1xuJiM0MztcdF9fdTMyIGlubmVyX2lkLCByb290X2lkLCBrZXkgPSAwLCB2YWx1ZTtcbiYjNDM7XG4mIzQzO1x0LyogRXZlcnkga2V5IGlzIGVudW1lcmFibGUsIGJ1dCBQRVJGX0VWRU5UX0FSUkFZIGxvb2t1cCByZXR1cm5zXG4mIzQzO1x0ICogRU5PVFNVUFAgKHRoZSBrZXJuZWwtaW50ZXJuYWwgZXJybm8pLiBDaGVjayBib3RoIGVudHJpZXMgc28gYW5cbiYjNDM7XHQgKiBlYXJseSBleGl0IG9uIHRoZSBmaXJzdCBsb29rdXAgZmFpbHVyZSBjYW5ub3QgcGFzcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZLCBcJiMzNDtkdW1wX3VucmVhZGFibGVcJiMzNDssXG4mIzQzO1x0XHRcdFx0ICBzaXplb2Yoa2V5KSwgc2l6ZW9mKHZhbHVlKSwgMiwgTlVMTCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFwmIzM0O2NyZWF0ZV91bnJlYWRhYmxlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICghQVNTRVJUX0xUKGJwZl9tYXBfbG9va3VwX2VsZW0oaW5uZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2dmFsdWUpLCAwLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O3VucmVhZGFibGVfbG9va3VwXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGxvb2t1cF9lcnJubyA9IGVycm5vO1xuJiM0MztcdGlmICghQVNTRVJUX05FUShsb29rdXBfZXJybm8sIEVOT0VOVCwgXCYjMzQ7dW5yZWFkYWJsZV9ub3RfbWlzc2luZ1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpbm5lcl9pZCA9IG1hcF9pZChpbm5lcl9mZCk7XG4mIzQzO1x0aWYgKCFpbm5lcl9pZCB8fCAhZHVtcF9tYXAoaW5uZXJfaWQsIFwmIzM0Oy1qXCYjMzQ7LCBlbGVtZW50cykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRBU1NFUlRfRVEoY291bnRfdG9rZW4oZWxlbWVudHMsIFwmIzM0O1xcXCYjMzQ7ZXJyb3JcXFwmIzM0OzpcJiMzNDspLCAyLCBcJiMzNDtkZWZhdWx0X2pzb25fZXJyb3JzXCYjMzQ7KTtcbiYjNDM7XHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwmIzM0O21hcCBkdW1wIGlkICV1XCYjMzQ7LCBpbm5lcl9pZCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgcGxhaW4sIHNpemVvZihwbGFpbikgLSAxKSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtkZWZhdWx0X3BsYWluX3VucmVhZGFibGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKHBsYWluLCBzdHJlcnJvcihsb29rdXBfZXJybm8pKSwgMiwgXCYjMzQ7ZGVmYXVsdF9wbGFpbl9lcnJvcnNcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9IQVNfU1VCU1RSKHBsYWluLCBcJiMzNDtGb3VuZCAwIGVsZW1lbnRzXCYjMzQ7LCBcJiMzNDtkZWZhdWx0X3BsYWluX2NvdW50XCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0cm9vdF9pZCA9IGlubmVyX2lkO1xuJiM0MztcdGlmIChvdXRlcikge1xuJiM0MztcdFx0b3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDtcbiYjNDM7XHRcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIFwmIzM0O2R1bXBfb3V0ZXJcJiMzNDssXG4mIzQzO1x0XHRcdFx0XHQgc2l6ZW9mKGtleSksIHNpemVvZih2YWx1ZSksIDEsIFx1MDAyNm9wdHMpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0tfRkQob3V0ZXJfZmQsIFwmIzM0O2NyZWF0ZV9vdXRlclwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cG9wdWxhdGVfb3V0ZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xuJiM0MztcdFx0aWYgKCFyb290X2lkIHx8ICFkdW1wX21hcChyb290X2lkLCBcJiMzNDstalwmIzM0Oywgcm9vdCkpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4mIzQzO1x0XHRcdCBcJiMzNDtbe1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcXFwmIzM0O3R5cGVcXFwmIzM0OzpcXFwmIzM0O2FycmF5X29mX21hcHNcXFwmIzM0OyxcXFwmIzM0O25hbWVcXFwmIzM0OzpcXFwmIzM0O2R1bXBfb3V0ZXJcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdFx0IFwmIzM0O1xcXCYjMzQ7ZmxhZ3NcXFwmIzM0OzowLFxcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0Ozolc30se1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcJiMzNDtcbiYjNDM7XHRcdFx0IFwmIzM0O1xcXCYjMzQ7dHlwZVxcXCYjMzQ7OlxcXCYjMzQ7cGVyZl9ldmVudF9hcnJheVxcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF91bnJlYWRhYmxlXFxcJiMzNDssXCYjMzQ7XG4mIzQzO1x0XHRcdCBcJiMzNDtcXFwmIzM0O2ZsYWdzXFxcJiMzNDs6MCxcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6JXN9XVwmIzM0Oywgcm9vdF9pZCwgcm9vdCwgaW5uZXJfaWQsIGVsZW1lbnRzKTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4mIzQzO1x0XHRcdCBcJiMzNDtbe1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcXFwmIzM0O3R5cGVcXFwmIzM0OzpcXFwmIzM0O3BlcmZfZXZlbnRfYXJyYXlcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdFx0IFwmIzM0O1xcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF91bnJlYWRhYmxlXFxcJiMzNDssXFxcJiMzNDtmbGFnc1xcXCYjMzQ7OjAsXFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OiVzfV1cJiMzNDssXG4mIzQzO1x0XHRcdCBpbm5lcl9pZCwgZWxlbWVudHMpO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoZHVtcF9tYXAocm9vdF9pZCwgXCYjMzQ7LWogLXJcJiMzNDssIG91dHB1dCkpXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCYjMzQ7cmVjdXJzaXZlX3VucmVhZGFibGVfanNvblwmIzM0Oyk7XG4mIzQzO1x0bWVtc2V0KG91dHB1dCwgMCwgc2l6ZW9mKG91dHB1dCkpO1xuJiM0MztcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCYjMzQ7LXIgbWFwIGR1bXAgaWQgJXVcJiMzNDssIHJvb3RfaWQpO1xuJiM0MztcdGlmIChBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxuJiM0MztcdFx0ICAgICAgXCYjMzQ7cmVjdXJzaXZlX3VucmVhZGFibGVfcGxhaW5cJiMzNDspKSB7XG4mIzQzO1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIHBsYWluLCBcJiMzNDtyZWN1cnNpdmVfcGxhaW5fcHJlc2VydmVzX2Vycm9yc1wmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBzdHJlcnJvcihsb29rdXBfZXJybm8pKSwgMixcbiYjNDM7XHRcdFx0ICBcJiMzNDtyZWN1cnNpdmVfcGxhaW5fZXJyb3JzXCYjMzQ7KTtcbiYjNDM7XHRcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFwmIzM0O0ZvdW5kIFwmIzM0OyksIG91dGVyID8gMiA6IDEsXG4mIzQzO1x0XHRcdCAgXCYjMzQ7cmVjdXJzaXZlX3BsYWluX21hcHNcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7b3V0OlxuJiM0MztcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShvdXRlcl9mZCk7XG4mIzQzO1x0aWYgKGlubmVyX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGlubmVyX2ZkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9tYW55X2lubmVyX21hcHMoYm9vbCBqc29uKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4mIzQzO1x0Y29uc3Qgc3RydWN0IHJsaW1pdCBsaW1pdCA9IHsgLnJsaW1fY3VyID0gMzIsIC5ybGltX21heCA9IDMyIH07XG4mIzQzO1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCB0b2tlbls2NF07XG4mIzQzO1x0X191MzIgaWRzWzY0XSwgcm9vdF9pZCwga2V5O1xuJiM0MztcdGludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xLCBzdGF0dXM7XG4mIzQzO1x0Y2hhciAqb3V0cHV0ID0gTlVMTDtcbiYjNDM7XHRwaWRfdCBwaWQ7XG4mIzQzO1xuJiM0MztcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwmIzM0O2R1bXBfaW5uZXJcJiMzNDssIDQsIDQsIDEsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcJiMzNDtjcmVhdGVfdGVtcGxhdGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDtcbiYjNDM7XHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBcJiMzNDtkdW1wX291dGVyXCYjMzQ7LCA0LCA0LFxuJiM0MztcdFx0XHRcdCBBUlJBWV9TSVpFKGlkcyksIFx1MDAyNm9wdHMpO1xuJiM0MztcdGNsb3NlKGlubmVyX2ZkKTtcbiYjNDM7XHRpbm5lcl9mZCA9IC0xO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcJiMzNDtjcmVhdGVfb3V0ZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0Zm9yIChrZXkgPSAwOyBrZXkgXHUwMDNjIEFSUkFZX1NJWkUoaWRzKTsga2V5JiM0MzsmIzQzOykge1xuJiM0MztcdFx0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCYjMzQ7ZHVtcF9pbm5lclwmIzM0OywgNCwgNCwgMSwgTlVMTCk7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgXCYjMzQ7Y3JlYXRlX2lubmVyXCYjMzQ7KSB8fFxuJiM0MztcdFx0ICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgXHUwMDI2a2V5LCBcdTAwMjZpbm5lcl9mZCwgQlBGX0FOWSksXG4mIzQzO1x0XHRcdCAgICAgICBcJiMzNDtwb3B1bGF0ZV9vdXRlclwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0aWRzW2tleV0gPSBtYXBfaWQoaW5uZXJfZmQpO1xuJiM0MztcdFx0aWYgKCFpZHNba2V5XSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHQvKiBUaGUgb3V0ZXIgbWFwIGtlZXBzIGVhY2ggZGlzdGluY3QgaW5uZXIgbWFwIGFsaXZlLiAqL1xuJiM0MztcdFx0Y2xvc2UoaW5uZXJfZmQpO1xuJiM0MztcdFx0aW5uZXJfZmQgPSAtMTtcbiYjNDM7XHR9XG4mIzQzO1x0cm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7XG4mIzQzO1x0b3V0cHV0ID0gY2FsbG9jKDEsIDY1NTM2KTtcbiYjNDM7XHRpZiAoIXJvb3RfaWQgfHwgIUFTU0VSVF9PS19QVFIob3V0cHV0LCBcJiMzNDthbGxvY2F0ZV9vdXRwdXRcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdC8qIENyZWF0ZSBhbGwgZml4dHVyZXMgYmVmb3JlIGxvd2VyaW5nIHRoZSBsaW1pdCwgYW5kIGtlZXAgdGhlIHRlc3RcbiYjNDM7XHQgKiBydW5uZXImIzM5O3MgbGltaXQgdW5jaGFuZ2VkLiBSZXRhaW5pbmcgZXZlcnkgZGlzY292ZXJlZCBGRCB3b3VsZCBleGNlZWRcbiYjNDM7XHQgKiB0aGlzIGxpbWl0IGJlZm9yZSB0aGUgcmVjdXJzaXZlIGR1bXAgY291bGQgdmlzaXQgYWxsIGlubmVyIG1hcHMuXG4mIzQzO1x0ICovXG4mIzQzO1x0cGlkID0gZm9yaygpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHBpZCwgMCwgXCYjMzQ7Zm9ya1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIXBpZCkge1xuJiM0MztcdFx0Y2xvc2Uob3V0ZXJfZmQpO1xuJiM0MztcdFx0aWYgKHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCBcdTAwMjZsaW1pdCkpXG4mIzQzO1x0XHRcdF9leGl0KDEpO1xuJiM0MztcdFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcJiMzNDslcyAtciBtYXAgZHVtcCBpZCAldVwmIzM0OyxcbiYjNDM7XHRcdFx0IGpzb24gPyBcJiMzNDstalwmIzM0OyA6IFwmIzM0O1wmIzM0Oywgcm9vdF9pZCk7XG4mIzQzO1x0XHRpZiAoZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCA2NTUzNSkpXG4mIzQzO1x0XHRcdF9leGl0KDIpO1xuJiM0MztcdFx0aWYgKGNvdW50X3Rva2VuKG91dHB1dCwganNvbiA/IFwmIzM0O1xcXCYjMzQ7aWRcXFwmIzM0OzpcJiMzNDsgOiBcJiMzNDtGb3VuZCBcJiMzNDspICE9IEFSUkFZX1NJWkUoaWRzKSAmIzQzOyAxIHx8XG4mIzQzO1x0XHQgICAgY291bnRfdG9rZW4ob3V0cHV0LCBqc29uID8gXCYjMzQ7XFxcJiMzNDtpbm5lcl9tYXBfaWRcXFwmIzM0OzpcJiMzNDsgOiBcJiMzNDtpbm5lcl9tYXBfaWQ6XCYjMzQ7KSAhPVxuJiM0MztcdFx0ICAgIEFSUkFZX1NJWkUoaWRzKSlcbiYjNDM7XHRcdFx0X2V4aXQoMyk7XG4mIzQzO1x0XHRmb3IgKGtleSA9IDA7IGtleSBcdTAwM2MgQVJSQVlfU0laRShpZHMpOyBrZXkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdGlmIChqc29uKVxuJiM0MztcdFx0XHRcdHNucHJpbnRmKHRva2VuLCBzaXplb2YodG9rZW4pLCBcJiMzNDtcXFwmIzM0O2lkXFxcJiMzNDs6JXUsXCYjMzQ7LCBpZHNba2V5XSk7XG4mIzQzO1x0XHRcdGVsc2VcbiYjNDM7XHRcdFx0XHRzbnByaW50Zih0b2tlbiwgc2l6ZW9mKHRva2VuKSwgXCYjMzQ7XFxuJXU6IGhhc2ggIG5hbWUgZHVtcF9pbm5lciAgXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0IGlkc1trZXldKTtcbiYjNDM7XHRcdFx0aWYgKGNvdW50X3Rva2VuKG91dHB1dCwgdG9rZW4pICE9IDEpXG4mIzQzO1x0XHRcdFx0X2V4aXQoNCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAoanNvbiBcdTAwMjZcdTAwMjYgKG91dHB1dFswXSAhPSAmIzM5O1smIzM5OyB8fFxuJiM0MztcdFx0XHQgICAgIHN0cmNtcChvdXRwdXQgJiM0Mzsgc3RybGVuKG91dHB1dCkgLSAyLCBcJiMzNDtdXFxuXCYjMzQ7KSkpXG4mIzQzO1x0XHRcdF9leGl0KDUpO1xuJiM0MztcdFx0X2V4aXQoMCk7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChBU1NFUlRfRVEod2FpdHBpZChwaWQsIFx1MDAyNnN0YXR1cywgMCksIHBpZCwgXCYjMzQ7d2FpdHBpZFwmIzM0OykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIEFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcJiMzNDtjaGlsZF9leGl0ZWRcJiMzNDspKVxuJiM0MztcdFx0QVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIDAsIFwmIzM0O2R1bXBfd2l0aF9sb3dfZmRfbGltaXRcJiMzNDspO1xuJiM0MztvdXQ6XG4mIzQzO1x0ZnJlZShvdXRwdXQpO1xuJiM0MztcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShvdXRlcl9mZCk7XG4mIzQzO1x0aWYgKGlubmVyX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGlubmVyX2ZkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2R1bXAodm9pZClcbiYjNDM7e1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3VucmVhZGFibGVfb3JkaW5hcnlcJiMzNDspKVxuJiM0MztcdFx0dGVzdF91bnJlYWRhYmxlKGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt1bnJlYWRhYmxlX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfdW5yZWFkYWJsZSh0cnVlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDttYW55X2lubmVyX21hcHNfanNvblwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X21hbnlfaW5uZXJfbWFwcyh0cnVlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDttYW55X2lubmVyX21hcHNfcGxhaW5cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9tYW55X2lubmVyX21hcHMoZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O211bHRpcGxlX3Jvb3RzXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfbXVsdGlwbGVfcm9vdHMoKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDthcnJheV9vZl9tYXBzXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7aGFzaF9vZl9tYXBzXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtzaGFyZWRfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMiwgZmFsc2UsIGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtlbXB0eV9hcnJheV9vZl9tYXBzXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7ZW1wdHlfaGFzaF9vZl9tYXBzXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMCwgZmFsc2UsIGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtidGZfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCBmYWxzZSwgdHJ1ZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7ZW1wdHlfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCB0cnVlLCBmYWxzZSk7XG4mIzQzO31cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMToyMzwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBvbmx5IHVzZXItc3BhY2UgdG9vbHMgYW5kIHNlbGZ0ZXN0cyB1bmRlciB0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLiBJdCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzCnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsCmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuCgotIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOgogIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQKICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLgogIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCwKICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuCgotIERPIE5PVCBCTElORExZIFRSVVNUICYjMzQ7Tk8gRlVOQ1RJT05BTCBDSEFOR0UmIzM0OyAoTkZDSSkgT1IgJiMzNDtSRUZBQ1RPUklORyYjMzQ7IENMQUlNUzoKICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzICYjMzQ7Y2xlYW51cHMmIzM0OywgJiMzNDtyZWZhY3RvcmluZ3MmIzM0Oywgb3Igc3RhdGUKICAmIzM0O05vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkJiMzNDsuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLgogIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudAogIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLgogIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuCgotIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOgogIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKiwKICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy4KICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyCiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczoKCi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczoKICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy4KICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKQogICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLgogICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHMKICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuCiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuCi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOgogICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6CiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmcKICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLgogICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOgotIENvcmUgU3Vic3lzdGVtczoKICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSwKICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy4KLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6CiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuCi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOgogICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLgotIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6CiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo0LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6CgotIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzoKICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1cwogIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0CiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuCiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzICYjMzQ7Zm9jdXNlZCYjMzQ7LAogIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy4KCi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOgogIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50cwogIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LgoKLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6CiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFjawogIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLgogIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlcgogIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZToKLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgotIENoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuCi0gU3RyaXAgYW55ICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDQyMmZhNTc4NmY1YzEyYmExNTIzZGJkOGU1MGU3ZmM5ZDI1YmZlZWQKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIFNlcCA3IDAxOjIzOjU4IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdAppbmRleCA1ZGFmM2RlNWM3NDQ2Li4zOGQxZjU0MmJmNWE1IDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdApAQCAtMTYsNyAmIzQzOzE2LDcgQEAgU1lOT1BTSVMKIAogKipicGZ0b29sKiogWypPUFRJT05TKl0gKiptYXAqKiAqQ09NTUFORCoKIAotKk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8IHsgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IH0KJiM0MzsqT1BUSU9OUyogOj0geyB8Q09NTU9OX09QVElPTlN8IHwgeyAqKi1mKiogfCAqKi0tYnBmZnMqKiB9IHwgeyAqKi1uKiogfCAqKi0tbm9tb3VudCoqIH0gfCB7ICoqLXIqKiB8ICoqLS1yZWN1cnNpdmUqKiB9IH0KIAogKkNPTU1BTkRTKiA6PQogeyAqKnNob3cqKiB8ICoqbGlzdCoqIHwgKipjcmVhdGUqKiB8ICoqZHVtcCoqIHwgKip1cGRhdGUqKiB8ICoqbG9va3VwKiogfCAqKmdldG5leHQqKiB8CkBAIC0xNzAsNiAmIzQzOzE3MCwyNSBAQCBPUFRJT05TCiAgICAgRG8gbm90IGF1dG9tYXRpY2FsbHkgYXR0ZW1wdCB0byBtb3VudCBhbnkgdmlydHVhbCBmaWxlIHN5c3RlbSAoc3VjaCBhcwogICAgIHRyYWNlZnMgb3IgQlBGIHZpcnR1YWwgZmlsZSBzeXN0ZW0pIHdoZW4gbmVjZXNzYXJ5LgogCiYjNDM7LXIsIC0tcmVjdXJzaXZlCiYjNDM7ICAgIEFsc28gZHVtcCB0aGUgaW5uZXIgbWFwcyByZWZlcmVuY2VkIGJ5ICoqYXJyYXlfb2ZfbWFwcyoqIGFuZCAqKmhhc2hfb2ZfbWFwcyoqCiYjNDM7ICAgIGVudHJpZXMgd2hlbiBydW5uaW5nICoqbWFwIGR1bXAqKi4gRWFjaCBtYXAgSUQgaXMgdmlzaXRlZCBvbmNlLCBldmVuIGlmCiYjNDM7ICAgIHNldmVyYWwgZW50cmllcyByZWZlciB0byBpdC4gU2VsZWN0ZWQgbWFwcyBhcmUgZm9sbG93ZWQgYnkgdGhlaXIgaW5uZXIgbWFwcy4KJiM0MzsKJiM0MzsgICAgUGxhaW4gb3V0cHV0IGluY2x1ZGVzIGEgaGVhZGVyIGlkZW50aWZ5aW5nIGVhY2ggbWFwLiBPbiBzdWNjZXNzLCBKU09OIG91dHB1dAomIzQzOyAgICBpcyBhbHdheXMgYW4gYXJyYXkgb2YgbWFwIG9iamVjdHMsIGVhY2ggY29udGFpbmluZyBhbiAqKmlkKiogYW5kIGFuCiYjNDM7ICAgICoqZWxlbWVudHMqKiBhcnJheSwgaW5jbHVkaW5nIHdoZW4gb25seSBvbmUgbWFwIGlzIGR1bXBlZC4gT3V0ZXIgbWFwIGVudHJpZXMKJiM0MzsgICAgcmV0YWluIHRoZWlyICoqaW5uZXJfbWFwX2lkKiogZmllbGQsIHdoaWNoIGlkZW50aWZpZXMgdGhlIGNvcnJlc3BvbmRpbmcgaW5uZXIKJiM0MzsgICAgbWFwIG9iamVjdC4KJiM0MzsKJiM0MzsgICAgSW5uZXIgbWFwIElEcyBhcmUgcmVzb2x2ZWQgd2hlbiB0aGUgbWFwcyBhcmUgdmlzaXRlZC4gVGhlIGR1bXAgaXMgbm90IGFuCiYjNDM7ICAgIGF0b21pYyBzbmFwc2hvdDogY29uY3VycmVudCB1cGRhdGVzIGNhbiBjaGFuZ2UgbWFwIGNvbnRlbnRzIG9yIHJlbW92ZSBhCiYjNDM7ICAgIHJlZmVyZW5jZWQgaW5uZXIgbWFwIGJlZm9yZSBpdCBpcyB2aXNpdGVkLiBGYWlsdXJlIHRvIG9wZW4gYSByZWZlcmVuY2VkCiYjNDM7ICAgIGlubmVyIG1hcCBzdG9wcyB0aGUgZHVtcCBhbmQgcmV0dXJucyBhIG5vbnplcm8gZXhpdCBzdGF0dXMuIE91dHB1dCBtYXkKJiM0MzsgICAgY29udGFpbiBtYXBzIG9yIGVudHJpZXMgcHJpbnRlZCBiZWZvcmUgdGhlIGVycm9yLgomIzQzOyAgICBJbiBKU09OIG1vZGUsIGFuIGVycm9yIGR1cmluZyB0cmF2ZXJzYWwgaXMgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBhbmQgdGhlCiYjNDM7ICAgIGVuY2xvc2luZyBhcnJheXMgYW5kIG9iamVjdHMgYXJlIGNsb3NlZC4KJiM0MzsKIEVYQU1QTEVTCiA9PT09PT09PQogKiojIGJwZnRvb2wgbWFwIHNob3cqKgpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2wgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbAppbmRleCA3NWNiY2I1MTJlYmFlLi40NWMzMzZkNjNiZTBhIDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbApAQCAtMjYxLDcgJiM0MzsyNjEsNyBAQCBfYnBmdG9vbCgpCiAKICAgICAjIERlYWwgd2l0aCBvcHRpb25zCiAgICAgaWYgW1sgJHt3b3Jkc1tjd29yZF19ID09IC0qIF1dOyB0aGVuCi0gICAgICAgIGxvY2FsIGM9JiMzOTstLXZlcnNpb24gLS1qc29uIC0tcHJldHR5IC0tYnBmZnMgLS1tYXBjb21wYXQgLS1kZWJ1ZyBcCiYjNDM7ICAgICAgICBsb2NhbCBjPSYjMzk7LS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLXJlY3Vyc2l2ZSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXAogICAgICAgICAgICAgLS11c2UtbG9hZGVyIC0tYmFzZS1idGYgLS1zaWduIC1pIC1rJiMzOTsKICAgICAgICAgQ09NUFJFUExZPSggJCggY29tcGdlbiAtVyAmIzM0OyRjJiMzNDsgLS0gJiMzNDskY3VyJiMzNDsgKSApCiAgICAgICAgIHJldHVybiAwCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmMgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmMKaW5kZXggYzkxZTFhNmUxYTFlYy4uMjkwMjFmNGRkNDUxOCAxMDA2NDQKLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uYwpAQCAtMjYsNiAmIzQzOzI2LDcgQEAgc3RhdGljIGludCAoKmxhc3RfZG9faGVscCkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKIGpzb25fd3JpdGVyX3QgKmpzb25fd3RyOwogYm9vbCBwcmV0dHlfb3V0cHV0OwogYm9vbCBqc29uX291dHB1dDsKJiM0Mztib29sIHJlY3Vyc2l2ZTsKIGJvb2wgc2hvd19waW5uZWQ7CiBib29sIGJsb2NrX21vdW50OwogYm9vbCB2ZXJpZmllcl9sb2dzOwpAQCAtNDUyLDYgJiM0Mzs0NTMsNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCXsgJiMzNDtqc29uJiMzNDssCW5vX2FyZ3VtZW50LAlOVUxMLAkmIzM5O2omIzM5OyB9LAogCQl7ICYjMzQ7aGVscCYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTtoJiMzOTsgfSwKIAkJeyAmIzM0O3ByZXR0eSYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTtwJiMzOTsgfSwKJiM0MzsJCXsgJiMzNDtyZWN1cnNpdmUmIzM0OywJbm9fYXJndW1lbnQsCU5VTEwsCSYjMzk7ciYjMzk7IH0sCiAJCXsgJiMzNDt2ZXJzaW9uJiMzNDssCW5vX2FyZ3VtZW50LAlOVUxMLAkmIzM5O1YmIzM5OyB9LAogCQl7ICYjMzQ7YnBmZnMmIzM0OywJbm9fYXJndW1lbnQsCU5VTEwsCSYjMzk7ZiYjMzk7IH0sCiAJCXsgJiMzNDttYXBjb21wYXQmIzM0OywJbm9fYXJndW1lbnQsCU5VTEwsCSYjMzk7bSYjMzk7IH0sCkBAIC00ODUsNyAmIzQzOzQ4Nyw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIAliaW5fbmFtZSA9ICYjMzQ7YnBmdG9vbCYjMzQ7OwogCiAJb3B0ZXJyID0gMDsKLQl3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICYjMzQ7VmhwamZMbW5kU2k6azpCOmwmIzM0OywKJiM0MzsJd2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAmIzM0O1ZocGpyZkxtbmRTaTprOkI6bCYjMzQ7LAogCQkJCSAgb3B0aW9ucywgTlVMTCkpICZndDs9IDApIHsKIAkJc3dpdGNoIChvcHQpIHsKIAkJY2FzZSAmIzM5O1YmIzM5OzoKQEAgLTUwNyw2ICYjNDM7NTA5LDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCQkJfQogCQkJanNvbndfcHJldHR5KGpzb25fd3RyLCBwcmV0dHlfb3V0cHV0KTsKIAkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O3ImIzM5OzoKJiM0MzsJCQlyZWN1cnNpdmUgPSB0cnVlOwomIzQzOwkJCWJyZWFrOwogCQljYXNlICYjMzk7ZiYjMzk7OgogCQkJc2hvd19waW5uZWQgPSB0cnVlOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmggYi90b29scy9icGYvYnBmdG9vbC9tYWluLmgKaW5kZXggNzhiNmUwZWJiODVkOC4uYjVkYzc5NjBjZjY4MiAxMDA2NDQKLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaApAQCAtODMsNiAmIzQzOzgzLDcgQEAgZXh0ZXJuIGNvbnN0IGNoYXIgKmJpbl9uYW1lOwogCiBleHRlcm4ganNvbl93cml0ZXJfdCAqanNvbl93dHI7CiBleHRlcm4gYm9vbCBqc29uX291dHB1dDsKJiM0MztleHRlcm4gYm9vbCByZWN1cnNpdmU7CiBleHRlcm4gYm9vbCBzaG93X3Bpbm5lZDsKIGV4dGVybiBib29sIHNob3dfcGlkczsKIGV4dGVybiBib29sIGJsb2NrX21vdW50OwpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuYwppbmRleCA2ODRhOGZiNzI0MTQ2Li5mYzA2Yzc2NTk3MzE1IDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXAuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9tYXAuYwpAQCAtMTcsNiAmIzQzOzE3LDcgQEAKICNpbmNsdWRlICZsdDticGYvYnBmLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7YnBmL2J0Zi5oJmd0OwogI2luY2x1ZGUgJmx0O2JwZi9oYXNobWFwLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9saWJicGZfaW50ZXJuYWwuaCZndDsKIAogI2luY2x1ZGUgJiMzNDtqc29uX3dyaXRlci5oJiMzNDsKICNpbmNsdWRlICYjMzQ7bWFpbi5oJiMzNDsKQEAgLTgyNiwxMiAmIzQzOzgyNyw0NCBAQCBzdGF0aWMgdm9pZCBmcmVlX21hcF9rdl9idGYoc3RydWN0IGJ0ZiAqYnRmKQogCQlidGZfX2ZyZWUoYnRmKTsKIH0KIAomIzQzO3N0cnVjdCBtYXBfZHVtcF9jdHggewomIzQzOwlzdHJ1Y3QgaGFzaG1hcCAqc2VlbjsKJiM0MzsJX191MzIgKnBlbmRpbmdfaWRzOwomIzQzOwlzaXplX3QgcGVuZGluZ19jbnQ7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGNvbGxlY3RfaW5uZXJfbWFwKHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eCwgX191MzIgaWQpCiYjNDM7ewomIzQzOwlfX3UzMiAqaWRzOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlpZiAoaGFzaG1hcF9fZmluZChjdHgtJmd0O3NlZW4sIGlkLCBOVUxMKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlpZHMgPSBsaWJicGZfcmVhbGxvY2FycmF5KGN0eC0mZ3Q7cGVuZGluZ19pZHMsIGN0eC0mZ3Q7cGVuZGluZ19jbnQgJiM0MzsgMSwKJiM0MzsJCQkJIHNpemVvZigqaWRzKSk7CiYjNDM7CWlmICghaWRzKSB7CiYjNDM7CQlwX2VycigmIzM0O21lbSBhbGxvYyBmYWlsZWQmIzM0Oyk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KJiM0MzsJY3R4LSZndDtwZW5kaW5nX2lkcyA9IGlkczsKJiM0MzsKJiM0MzsJZXJyID0gaGFzaG1hcF9fYWRkKGN0eC0mZ3Q7c2VlbiwgaWQsIDApOwomIzQzOwlpZiAoZXJyKSB7CiYjNDM7CQlwX2VycigmIzM0O2ZhaWxlZCB0byByZWNvcmQgaW5uZXIgbWFwIGlkICV1OiAlcyYjMzQ7LCBpZCwgc3RyZXJyb3IoLWVycikpOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CWlkc1tjdHgtJmd0O3BlbmRpbmdfY250JiM0MzsmIzQzO10gPSBpZDsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwogc3RhdGljIGludAogbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsCi0JIGJvb2wgc2hvd19oZWFkZXIpCiYjNDM7CSBib29sIHNob3dfaGVhZGVyLCBzdHJ1Y3QgbWFwX2R1bXBfY3R4ICpjdHgpCiB7CiAJdm9pZCAqa2V5LCAqdmFsdWUsICpwcmV2X2tleTsKIAl1bnNpZ25lZCBpbnQgbnVtX2VsZW1zID0gMDsKJiM0MzsJanNvbl93cml0ZXJfdCAqcGxhaW5fYnRmX3d0ciA9IE5VTEw7CiAJc3RydWN0IGJ0ZiAqYnRmID0gTlVMTDsKIAlpbnQgZXJyOwogCkBAIC04NDUsNiAmIzQzOzg3OCwxNyBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0ciwKIAogCXByZXZfa2V5ID0gTlVMTDsKIAomIzQzOwlpZiAoY3R4ICZhbXA7JmFtcDsgIXd0ciAmYW1wOyZhbXA7IChpbmZvLSZndDtidGZfdmFsdWVfdHlwZV9pZCB8fAomIzQzOwkJCSAgICBpbmZvLSZndDtidGZfdm1saW51eF92YWx1ZV90eXBlX2lkKSkgewomIzQzOwkJcGxhaW5fYnRmX3d0ciA9IGdldF9idGZfd3JpdGVyKCk7CiYjNDM7CQlpZiAocGxhaW5fYnRmX3d0cikgewomIzQzOwkJCWlmIChzaG93X2hlYWRlcikKJiM0MzsJCQkJc2hvd19tYXBfaGVhZGVyX3BsYWluKGluZm8pOwomIzQzOwkJCXNob3dfaGVhZGVyID0gZmFsc2U7CiYjNDM7CQkJd3RyID0gcGxhaW5fYnRmX3d0cjsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwogCWlmICh3dHIpIHsKIAkJZXJyID0gZ2V0X21hcF9rdl9idGYoaW5mbywgJmFtcDtidGYpOwogCQlpZiAoZXJyKSB7CkBAIC04NzQsMTAgJiM0Mzs5MTgsMjAgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsCiAJCWlmIChlcnIpIHsKIAkJCWlmIChlcnJubyA9PSBFTk9FTlQpCiAJCQkJZXJyID0gMDsKJiM0MzsJCQllbHNlIGlmIChjdHgpCiYjNDM7CQkJCXBfZXJyKCYjMzQ7Y2FuJiMzOTt0IGdldCBuZXh0IGtleSBmb3IgbWFwIGlkICV1OiAlcyYjMzQ7LAomIzQzOwkJCQkgICAgICBpbmZvLSZndDtpZCwgc3RyZXJyb3IoZXJybm8pKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmICghZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpKQomIzQzOwkJZXJyID0gZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpOwomIzQzOwkJaWYgKCFlcnIpIHsKIAkJCW51bV9lbGVtcyYjNDM7JiM0Mzs7CiYjNDM7CQkJaWYgKGN0eCAmYW1wOyZhbXA7IG1hcF9pc19tYXBfb2ZfbWFwcyhpbmZvLSZndDt0eXBlKSkgewomIzQzOwkJCQllcnIgPSBjb2xsZWN0X2lubmVyX21hcChjdHgsICooX191MzIgKil2YWx1ZSk7CiYjNDM7CQkJCWlmIChlcnIpCiYjNDM7CQkJCQlicmVhazsKJiM0MzsJCQl9CiYjNDM7CQl9CiAJCXByZXZfa2V5ID0ga2V5OwogCX0KIApAQCAtODk0LDE4ICYjNDM7OTQ4LDI1IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLAogCWZyZWUoa2V5KTsKIAlmcmVlKHZhbHVlKTsKIAlmcmVlX21hcF9rdl9idGYoYnRmKTsKJiM0MzsJaWYgKHBsYWluX2J0Zl93dHIpCiYjNDM7CQlqc29ud19kZXN0cm95KCZhbXA7cGxhaW5fYnRmX3d0cik7CiAKIAlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewomIzQzOwlMSUJCUEZfT1BUUyhicGZfZ2V0X2ZkX2J5X2lkX29wdHMsIG9wdHMsCiYjNDM7CQkub3Blbl9mbGFncyA9IEJQRl9GX1JET05MWSwKJiM0MzsJKTsKIAlqc29uX3dyaXRlcl90ICp3dHIgPSBOVUxMLCAqYnRmX3d0ciA9IE5VTEw7CiAJc3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307CiYjNDM7CXN0cnVjdCBtYXBfZHVtcF9jdHggY3R4ID0ge307CiAJaW50IG5iX2ZkcywgaSA9IDA7CiAJX191MzIgbGVuID0gc2l6ZW9mKGluZm8pOwogCWludCAqZmRzID0gTlVMTDsKIAlpbnQgZXJyID0gLTE7CiYjNDM7CXNpemVfdCBqOwogCiAJaWYgKGFyZ2MgIT0gMikKIAkJdXNhZ2UoKTsKQEAgLTkxOSw5ICYjNDM7OTgwLDM0IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJaWYgKG5iX2ZkcyAmbHQ7IDEpCiAJCWdvdG8gZXhpdF9mcmVlOwogCiYjNDM7CWlmIChyZWN1cnNpdmUpIHsKJiM0MzsJCWN0eC5zZWVuID0gaGFzaG1hcF9fbmV3KGhhc2hfZm5fZm9yX2tleV9hc19pZCwKJiM0MzsJCQkJCWVxdWFsX2ZuX2Zvcl9rZXlfYXNfaWQsIE5VTEwpOwomIzQzOwkJaWYgKElTX0VSUihjdHguc2VlbikpIHsKJiM0MzsJCQljdHguc2VlbiA9IE5VTEw7CiYjNDM7CQkJcF9lcnIoJiMzNDtmYWlsZWQgdG8gY3JlYXRlIGhhc2htYXAgZm9yIHJlY3Vyc2l2ZSBkdW1wJiMzNDspOwomIzQzOwkJCWdvdG8gZXhpdF9jbG9zZTsKJiM0MzsJCX0KJiM0MzsJCS8qIFJlY29yZCB0aGUgc2VsZWN0ZWQgbWFwcyBiZWZvcmUgZGlzY292ZXJpbmcgYW55IGlubmVyIG1hcHMuICovCiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgbmJfZmRzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWxlbiA9IHNpemVvZihpbmZvKTsKJiM0MzsJCQlpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sICZhbXA7aW5mbywgJmFtcDtsZW4pKSB7CiYjNDM7CQkJCXBfZXJyKCYjMzQ7Y2FuJiMzOTt0IGdldCBtYXAgaW5mbzogJXMmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJCQkJZXJyID0gLTE7CiYjNDM7CQkJCWdvdG8gZXhpdF9jbG9zZTsKJiM0MzsJCQl9CiYjNDM7CQkJZXJyID0gaGFzaG1hcF9fYWRkKGN0eC5zZWVuLCBpbmZvLmlkLCAwKTsKJiM0MzsJCQlpZiAoZXJyKSB7CiYjNDM7CQkJCXBfZXJyKCYjMzQ7ZmFpbGVkIHRvIHJlY29yZCBtYXAgaWQgJXU6ICVzJiMzNDssIGluZm8uaWQsCiYjNDM7CQkJCSAgICAgIHN0cmVycm9yKC1lcnIpKTsKJiM0MzsJCQkJZ290byBleGl0X2Nsb3NlOwomIzQzOwkJCX0KJiM0MzsJCX0KJiM0MzsJfQomIzQzOwogCWlmIChqc29uX291dHB1dCkgewogCQl3dHIgPSBqc29uX3d0cjsKLQl9IGVsc2UgewomIzQzOwl9IGVsc2UgaWYgKCFyZWN1cnNpdmUpIHsKIAkJaW50IGRvX3BsYWluX2J0ZjsKIAogCQlkb19wbGFpbl9idGYgPSBtYXBzX2hhdmVfYnRmKGZkcywgbmJfZmRzKTsKQEAgLTkzNiw3ICYjNDM7MTAyMiw3IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCX0KIAl9CiAKLQlpZiAod3RyICZhbXA7JmFtcDsgbmJfZmRzICZndDsgMSkKJiM0MzsJaWYgKHd0ciAmYW1wOyZhbXA7IChuYl9mZHMgJmd0OyAxIHx8IHJlY3Vyc2l2ZSkpCiAJCWpzb253X3N0YXJ0X2FycmF5KHd0cik7CS8qIHJvb3QgYXJyYXkgKi8KIAlmb3IgKGkgPSAwOyBpICZsdDsgbmJfZmRzOyBpJiM0MzsmIzQzOykgewogCQlpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sICZhbXA7aW5mbywgJmFtcDtsZW4pKSB7CkBAIC05NDQsMjIgJiM0MzsxMDMwLDUwIEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCQllcnIgPSAtMTsKIAkJCWJyZWFrOwogCQl9Ci0JCWVyciA9IG1hcF9kdW1wKGZkc1tpXSwgJmFtcDtpbmZvLCB3dHIsIG5iX2ZkcyAmZ3Q7IDEpOwomIzQzOwkJZXJyID0gbWFwX2R1bXAoZmRzW2ldLCAmYW1wO2luZm8sIHd0ciwgbmJfZmRzICZndDsgMSB8fCByZWN1cnNpdmUsCiYjNDM7CQkJICAgICAgIHJlY3Vyc2l2ZSA/ICZhbXA7Y3R4IDogTlVMTCk7CiAJCWlmICghd3RyICZhbXA7JmFtcDsgaSAhPSBuYl9mZHMgLSAxKQogCQkJcHJpbnRmKCYjMzQ7XG4mIzM0Oyk7CiAKIAkJaWYgKGVycikKIAkJCWJyZWFrOwotCQljbG9zZShmZHNbaV0pOwomIzQzOwkJLyogS2VlcCBzZWxlY3RlZCBtYXBzIGFsaXZlIHdoaWxlIHZpc2l0aW5nIHRoZWlyIGlubmVyIG1hcHMuICovCiYjNDM7CQlpZiAoIXJlY3Vyc2l2ZSkKJiM0MzsJCQljbG9zZShmZHNbaV0pOwomIzQzOwl9CiYjNDM7CWZvciAoaiA9IDA7ICFlcnIgJmFtcDsmYW1wOyBqICZsdDsgY3R4LnBlbmRpbmdfY250OyBqJiM0MzsmIzQzOykgewomIzQzOwkJaW50IGZkOwomIzQzOwomIzQzOwkJZmQgPSBicGZfbWFwX2dldF9mZF9ieV9pZF9vcHRzKGN0eC5wZW5kaW5nX2lkc1tqXSwgJmFtcDtvcHRzKTsKJiM0MzsJCWlmIChmZCAmbHQ7IDApIHsKJiM0MzsJCQlwX2VycigmIzM0O2NhbiYjMzk7dCBvcGVuIGlubmVyIG1hcCBpZCAldTogJXMmIzM0OywKJiM0MzsJCQkgICAgICBjdHgucGVuZGluZ19pZHNbal0sIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CQkJZXJyID0gLTE7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CQlsZW4gPSBzaXplb2YoaW5mbyk7CiYjNDM7CQlpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgJmFtcDtpbmZvLCAmYW1wO2xlbikpIHsKJiM0MzsJCQlwX2VycigmIzM0O2NhbiYjMzk7dCBnZXQgbWFwIGluZm86ICVzJiMzNDssIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CQkJZXJyID0gLTE7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCWlmICghd3RyKQomIzQzOwkJCQlwcmludGYoJiMzNDtcbiYjMzQ7KTsKJiM0MzsJCQllcnIgPSBtYXBfZHVtcChmZCwgJmFtcDtpbmZvLCB3dHIsIHRydWUsICZhbXA7Y3R4KTsKJiM0MzsJCX0KJiM0MzsJCWNsb3NlKGZkKTsKIAl9Ci0JaWYgKHd0ciAmYW1wOyZhbXA7IG5iX2ZkcyAmZ3Q7IDEpCiYjNDM7CWlmICh3dHIgJmFtcDsmYW1wOyAobmJfZmRzICZndDsgMSB8fCByZWN1cnNpdmUpKQogCQlqc29ud19lbmRfYXJyYXkod3RyKTsJLyogcm9vdCBhcnJheSAqLwogCiAJaWYgKGJ0Zl93dHIpCiAJCWpzb253X2Rlc3Ryb3koJmFtcDtidGZfd3RyKTsKIGV4aXRfY2xvc2U6CiYjNDM7CWlmIChyZWN1cnNpdmUpCiYjNDM7CQlpID0gMDsKIAlmb3IgKDsgaSAmbHQ7IG5iX2ZkczsgaSYjNDM7JiM0MzspCiAJCWNsb3NlKGZkc1tpXSk7CiYjNDM7CWhhc2htYXBfX2ZyZWUoY3R4LnNlZW4pOwomIzQzOwlmcmVlKGN0eC5wZW5kaW5nX2lkcyk7CiBleGl0X2ZyZWU6CiAJZnJlZShmZHMpOwogCWZyZWVfYnRmX3ZtbGludXgoKTsKQEAgLTE0ODQsNyAmIzQzOzE1OTgsNyBAQCBzdGF0aWMgaW50IGRvX2hlbHAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCQkmIzM0OyAgICAgICAgICAgICAgICAgdGFza19zdG9yYWdlIHwgYmxvb21fZmlsdGVyIHwgdXNlcl9yaW5nYnVmIHwgY2dycF9zdG9yYWdlIHwgYXJlbmEgfFxuJiMzNDsKIAkJJiMzNDsgICAgICAgICAgICAgICAgIGluc25fYXJyYXkgfCByaGFzaCB9XG4mIzM0OwogCQkmIzM0OyAgICAgICAmIzM0OyBIRUxQX1NQRUNfT1BUSU9OUyAmIzM0OyB8XG4mIzM0OwotCQkmIzM0OyAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfVxuJiMzNDsKJiM0MzsJCSYjMzQ7ICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB8IHstcnwtLXJlY3Vyc2l2ZX0gfVxuJiMzNDsKIAkJJiMzNDsmIzM0OywKIAkJYmluX25hbWUsIGFyZ3ZbLTJdKTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjMzMGEzMzQ0NzcwZDEKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9kdW1wLmMKQEAgLTAsMCAmIzQzOzEsNDE5IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZnRvb2xfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnRmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9yZXNvdXJjZS5oJmd0OwomIzQzOwomIzQzOyNkZWZpbmUgT1VUUFVUX1NJWkUgODE5MgomIzQzOwomIzQzO3N0YXRpYyBib29sIGR1bXBfbWFwKF9fdTMyIGlkLCBjb25zdCBjaGFyICpvcHRpb25zLCBjaGFyICpvdXRwdXQpCiYjNDM7ewomIzQzOwljaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07CiYjNDM7CiYjNDM7CXNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgJiMzNDslcyBtYXAgZHVtcCBpZCAldSYjMzQ7LCBvcHRpb25zLCBpZCk7CiYjNDM7CW1lbXNldChvdXRwdXQsIDAsIE9VVFBVVF9TSVpFKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBPVVRQVVRfU0laRSAtIDEpLAomIzQzOwkJICAgICAgICYjMzQ7ZHVtcF9tYXAmIzM0OykpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CS8qIFRoZSBoZWxwZXIgZG9lc24mIzM5O3QgdGVybWluYXRlIG9yIHN0cmlwIHRoZSBvdXRwdXQuICovCiYjNDM7CW91dHB1dFtzdHJjc3BuKG91dHB1dCwgJiMzNDtcbiYjMzQ7KV0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgX191MzIgbWFwX2lkKGludCBmZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9OwomIzQzOwlfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsICZhbXA7aW5mbywgJmFtcDtsZW4pLCAmIzM0O21hcF9pbmZvJiMzNDspKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CXJldHVybiBpbmZvLmlkOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGNvdW50X3Rva2VuKGNvbnN0IGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqdG9rZW4pCiYjNDM7ewomIzQzOwlpbnQgY291bnQgPSAwOwomIzQzOwomIzQzOwl3aGlsZSAoKG91dHB1dCA9IHN0cnN0cihvdXRwdXQsIHRva2VuKSkpIHsKJiM0MzsJCWNvdW50JiM0MzsmIzQzOzsKJiM0MzsJCW91dHB1dCAmIzQzOz0gc3RybGVuKHRva2VuKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gY291bnQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNoZWNrX3BsYWluKF9fdTMyIHJvb3RfaWQsIF9fdTMyIGlubmVyX2lkLCBjb25zdCBjaGFyICp0eXBlLAomIzQzOwkJCWludCBlbnRyaWVzLCBib29sIHR5cGVkKQomIzQzO3sKJiM0MzsJY2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBoZWFkZXJbMTI4XTsKJiM0MzsJY2hhciBvdXRwdXRbT1VUUFVUX1NJWkVdID0ge307CiYjNDM7CWNvbnN0IGNoYXIgKnJvb3QsICppbm5lcjsKJiM0MzsKJiM0MzsJc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAmIzM0Oy0tcmVjdXJzaXZlIG1hcCBkdW1wIGlkICV1JiMzNDssIHJvb3RfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksCiYjNDM7CQkgICAgICAgJiMzNDtwbGFpbl9kdW1wJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCAmIzM0OyV1OiAlcyAgbmFtZSBkdW1wX291dGVyICAmIzM0Oywgcm9vdF9pZCwgdHlwZSk7CiYjNDM7CXJvb3QgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIocm9vdCwgJiMzNDtwbGFpbl9yb290X2hlYWRlciYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJQVNTRVJUX0VRKHJvb3QgLSBvdXRwdXQsIDAsICYjMzQ7cGxhaW5fcm9vdF9maXJzdCYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgJiMzNDtpbm5lcl9tYXBfaWQ6JiMzNDspLCBlbnRyaWVzLCAmIzM0O3BsYWluX3JlZmVyZW5jZXMmIzM0Oyk7CiYjNDM7CWlmIChlbnRyaWVzKSB7CiYjNDM7CQlzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCAmIzM0OyV1OiBoYXNoICBuYW1lIGR1bXBfaW5uZXIgICYjMzQ7LCBpbm5lcl9pZCk7CiYjNDM7CQlpbm5lciA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7CiYjNDM7CQlpZiAoQVNTRVJUX09LX1BUUihpbm5lciwgJiMzNDtwbGFpbl9pbm5lcl9oZWFkZXImIzM0OykpCiYjNDM7CQkJQVNTRVJUX0dUKGlubmVyIC0gcm9vdCwgMCwgJiMzNDtwbGFpbl9pbm5lcl9hZnRlcl9yb290JiMzNDspOwomIzQzOwkJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgaGVhZGVyKSwgMSwgJiMzNDtwbGFpbl9pbm5lcl9vbmNlJiMzNDspOwomIzQzOwl9CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsICYjMzQ7Rm91bmQgJiMzNDspLCBlbnRyaWVzICZhbXA7JmFtcDsgIXR5cGVkID8gMiA6IDEsCiYjNDM7CQkgICYjMzQ7cGxhaW5fbWFwX2NvdW50JiMzNDspOwomIzQzOwlpZiAodHlwZWQpIHsKJiM0MzsJCUFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgJiMzNDtcJiMzNDtrZXlcJiMzNDs6IDAmIzM0OywgJiMzNDtwbGFpbl9idGZfa2V5JiMzNDspOwomIzQzOwkJQVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCAmIzM0O1wmIzM0O3ZhbHVlXCYjMzQ7OiAxNjg0MzAwOSYjMzQ7LCAmIzM0O3BsYWluX2J0Zl92YWx1ZSYjMzQ7KTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X291dGVyKGVudW0gYnBmX21hcF90eXBlIHR5cGUsIGludCBlbnRyaWVzLCBib29sIGVtcHR5X2lubmVyLAomIzQzOwkJICAgICAgIGJvb2wgdHlwZWQpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgaW5uZXJfb3B0cyk7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7CiYjNDM7CWNoYXIgb3V0ZXJbT1VUUFVUX1NJWkVdLCBpbm5lcltPVVRQVVRfU0laRV0sIG91dHB1dFtPVVRQVVRfU0laRV07CiYjNDM7CWNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcmVmZXJlbmNlWzY0XTsKJiM0MzsJY29uc3QgY2hhciAqdHlwZV9uYW1lID0gbGliYnBmX2JwZl9tYXBfdHlwZV9zdHIodHlwZSk7CiYjNDM7CWludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xOwomIzQzOwlfX3UzMiByb290X2lkLCBpbm5lcl9pZCwga2V5LCB2YWx1ZSA9IDB4MDEwMTAxMDE7CiYjNDM7CiYjNDM7CWlmICh0eXBlZCkgewomIzQzOwkJYnRmID0gYnRmX19uZXdfZW1wdHkoKTsKJiM0MzsJCWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7Y3JlYXRlX2J0ZiYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgJiMzNDt1bnNpZ25lZCBpbnQmIzM0OywgNCwgMCksIDEsICYjMzQ7YnRmX2ludCYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksICYjMzQ7bG9hZF9idGYmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlpbm5lcl9vcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTsKJiM0MzsJCWlubmVyX29wdHMuYnRmX2tleV90eXBlX2lkID0gMTsKJiM0MzsJCWlubmVyX29wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxOwomIzQzOwl9CiYjNDM7CWlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsICYjMzQ7ZHVtcF9pbm5lciYjMzQ7LCBzaXplb2Yoa2V5KSwKJiM0MzsJCQkJICBzaXplb2YodmFsdWUpLCAyLCAmYW1wO2lubmVyX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgJiMzNDtjcmVhdGVfaW5uZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJa2V5ID0gMDsKJiM0MzsJaWYgKCFlbXB0eV9pbm5lciAmYW1wOyZhbXA7CiYjNDM7CSAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oaW5uZXJfZmQsICZhbXA7a2V5LCAmYW1wO3ZhbHVlLCBCUEZfQU5ZKSwKJiM0MzsJCSAgICAgICAmIzM0O3BvcHVsYXRlX2lubmVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CW9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7CiYjNDM7CW91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUodHlwZSwgJiMzNDtkdW1wX291dGVyJiMzNDssIHNpemVvZihrZXkpLCBzaXplb2YoX191MzIpLAomIzQzOwkJCQkgMywgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQob3V0ZXJfZmQsICYjMzQ7Y3JlYXRlX291dGVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CS8qIFRoZSB1bnVzZWQgdGhpcmQgYXJyYXkgc2xvdCBhbHNvIGV4ZXJjaXNlcyBmYWlsZWQgbG9va3Vwcy4gKi8KJiM0MzsJZm9yIChrZXkgPSAwOyBrZXkgJmx0OyBlbnRyaWVzOyBrZXkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgJmFtcDtrZXksICZhbXA7aW5uZXJfZmQsIEJQRl9BTlkpLAomIzQzOwkJCSAgICAgICAmIzM0O3BvcHVsYXRlX291dGVyJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwlyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTsKJiM0MzsJaW5uZXJfaWQgPSBtYXBfaWQoaW5uZXJfZmQpOwomIzQzOwlpZiAoIXJvb3RfaWQgfHwgIWlubmVyX2lkIHx8ICFkdW1wX21hcChyb290X2lkLCAmIzM0Oy1qJiMzNDssIG91dGVyKSB8fAomIzQzOwkgICAgIWR1bXBfbWFwKGlubmVyX2lkLCAmIzM0Oy1qJiMzNDssIGlubmVyKSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlBU1NFUlRfRVEob3V0ZXJbMF0sICYjMzk7WyYjMzk7LCAmIzM0O2RlZmF1bHRfYXJyYXkmIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgJiMzNDtcJiMzNDtlbGVtZW50c1wmIzM0OzomIzM0OyksIDAsICYjMzQ7ZGVmYXVsdF9ub193cmFwcGVyJiMzNDspOwomIzQzOwlBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsICYjMzQ7XCYjMzQ7aWRcJiMzNDs6JiMzNDspLCAwLCAmIzM0O2RlZmF1bHRfbm9faGVhZGVyJiMzNDspOwomIzQzOwlzbnByaW50ZihyZWZlcmVuY2UsIHNpemVvZihyZWZlcmVuY2UpLCAmIzM0O1wmIzM0O2lubmVyX21hcF9pZFwmIzM0OzoldSYjMzQ7LCBpbm5lcl9pZCk7CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgcmVmZXJlbmNlKSwgZW50cmllcywgJiMzNDtkZWZhdWx0X3JlZmVyZW5jZXMmIzM0Oyk7CiYjNDM7CWlmICghZW50cmllcykKJiM0MzsJCUFTU0VSVF9TVFJFUShvdXRlciwgJiMzNDtbXSYjMzQ7LCAmIzM0O2VtcHR5X291dGVyX2RlZmF1bHQmIzM0Oyk7CiYjNDM7CWlmIChlbXB0eV9pbm5lcikKJiM0MzsJCUFTU0VSVF9TVFJFUShpbm5lciwgJiMzNDtbXSYjMzQ7LCAmIzM0O2VtcHR5X2lubmVyX2RlZmF1bHQmIzM0Oyk7CiYjNDM7CWVsc2UgaWYgKHR5cGVkKQomIzQzOwkJQVNTRVJUX0hBU19TVUJTVFIoaW5uZXIsICYjMzQ7XCYjMzQ7Zm9ybWF0dGVkXCYjMzQ7OntcJiMzNDtrZXlcJiMzNDs6MCxcJiMzNDt2YWx1ZVwmIzM0OzoxNjg0MzAwOX0mIzM0OywKJiM0MzsJCQkJICAmIzM0O3R5cGVkX2lubmVyJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlBU1NFUlRfU1RSRVEoaW5uZXIsCiYjNDM7CQkJICAgICAmIzM0O1t7XCYjMzQ7a2V5XCYjMzQ7OltcJiMzNDsweDAwXCYjMzQ7LFwmIzM0OzB4MDBcJiMzNDssXCYjMzQ7MHgwMFwmIzM0OyxcJiMzNDsweDAwXCYjMzQ7XSwmIzM0OwomIzQzOwkJCSAgICAgJiMzNDtcJiMzNDt2YWx1ZVwmIzM0OzpbXCYjMzQ7MHgwMVwmIzM0OyxcJiMzNDsweDAxXCYjMzQ7LFwmIzM0OzB4MDFcJiMzNDssXCYjMzQ7MHgwMVwmIzM0O119XSYjMzQ7LAomIzQzOwkJCSAgICAgJiMzNDtvcmRpbmFyeV9kZWZhdWx0JiMzNDspOwomIzQzOwomIzQzOwkvKiBDb21wYXJlIHRoZSBjb21wbGV0ZSBKU09OIGRvY3VtZW50OiBhIGZsYXQgYXJyYXkgd2l0aCB0aGUgcm9vdCBmaXJzdCwKJiM0MzsJICogb25lIGNvcHkgb2YgdGhlIHNoYXJlZCBpbm5lciBtYXAsIGFuZCB1bmNoYW5nZWQgZW50cnkgcmVwcmVzZW50YXRpb25zLgomIzQzOwkgKi8KJiM0MzsJaWYgKGVudHJpZXMpCiYjNDM7CQlzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSwKJiM0MzsJCQkgJiMzNDtbe1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7JXNcJiMzNDssXCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDtkdW1wX291dGVyXCYjMzQ7LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0Ozolc30se1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7aGFzaFwmIzM0OywmIzM0OwomIzQzOwkJCSAmIzM0O1wmIzM0O25hbWVcJiMzNDs6XCYjMzQ7ZHVtcF9pbm5lclwmIzM0OyxcJiMzNDtmbGFnc1wmIzM0OzowLFwmIzM0O2VsZW1lbnRzXCYjMzQ7OiVzfV0mIzM0OywKJiM0MzsJCQkgcm9vdF9pZCwgdHlwZV9uYW1lLCBvdXRlciwgaW5uZXJfaWQsIGlubmVyKTsKJiM0MzsJZWxzZQomIzQzOwkJc25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksCiYjNDM7CQkJICYjMzQ7W3tcJiMzNDtpZFwmIzM0OzoldSxcJiMzNDt0eXBlXCYjMzQ7OlwmIzM0OyVzXCYjMzQ7LFwmIzM0O25hbWVcJiMzNDs6XCYjMzQ7ZHVtcF9vdXRlclwmIzM0OywmIzM0OwomIzQzOwkJCSAmIzM0O1wmIzM0O2ZsYWdzXCYjMzQ7OjAsXCYjMzQ7ZWxlbWVudHNcJiMzNDs6W119XSYjMzQ7LCByb290X2lkLCB0eXBlX25hbWUpOwomIzQzOwlpZiAoZHVtcF9tYXAocm9vdF9pZCwgJiMzNDstaiAtciYjMzQ7LCBvdXRwdXQpKQomIzQzOwkJQVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsICYjMzQ7cmVjdXJzaXZlX2pzb24mIzM0Oyk7CiYjNDM7CWlmIChkdW1wX21hcChyb290X2lkLCAmIzM0Oy0tanNvbiAtLXJlY3Vyc2l2ZSYjMzQ7LCBvdXRwdXQpKQomIzQzOwkJQVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsICYjMzQ7cmVjdXJzaXZlX2xvbmdfb3B0aW9ucyYjMzQ7KTsKJiM0MzsJY2hlY2tfcGxhaW4ocm9vdF9pZCwgaW5uZXJfaWQsIHR5cGVfbmFtZSwgZW50cmllcywgdHlwZWQpOwomIzQzOwomIzQzOwkvKiBSZWN1cnNpb24gb24gYW4gb3JkaW5hcnkgbWFwIHN0aWxsIGVtaXRzIGEgc2luZ2xlIG1hcCBvYmplY3QuICovCiYjNDM7CXNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLAomIzQzOwkJICYjMzQ7W3tcJiMzNDtpZFwmIzM0OzoldSxcJiMzNDt0eXBlXCYjMzQ7OlwmIzM0O2hhc2hcJiMzNDssXCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDtkdW1wX2lubmVyXCYjMzQ7LCYjMzQ7CiYjNDM7CQkgJiMzNDtcJiMzNDtmbGFnc1wmIzM0OzowLFwmIzM0O2VsZW1lbnRzXCYjMzQ7OiVzfV0mIzM0OywgaW5uZXJfaWQsIGlubmVyKTsKJiM0MzsJaWYgKGR1bXBfbWFwKGlubmVyX2lkLCAmIzM0Oy1qIC1yJiMzNDssIG91dHB1dCkpCiYjNDM7CQlBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgJiMzNDtvcmRpbmFyeV9yZWN1cnNpdmUmIzM0Oyk7CiYjNDM7b3V0OgomIzQzOwlpZiAob3V0ZXJfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKG91dGVyX2ZkKTsKJiM0MzsJaWYgKGlubmVyX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShpbm5lcl9mZCk7CiYjNDM7CWJ0Zl9fZnJlZShidGYpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X211bHRpcGxlX3Jvb3RzKHZvaWQpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTsKJiM0MzsJY2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBuYW1lW0JQRl9PQkpfTkFNRV9MRU5dOwomIzQzOwljaGFyIG91dHB1dFtPVVRQVVRfU0laRV0gPSB7fSwgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiA0XSwgZWxlbWVudHNbT1VUUFVUX1NJWkVdOwomIzQzOwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHR5cGVzW10gPSB7ICYjMzQ7aGFzaCYjMzQ7LCAmIzM0O2FycmF5X29mX21hcHMmIzM0OywgJiMzNDtoYXNoX29mX21hcHMmIzM0OywgJiMzNDtoYXNoJiMzNDsgfTsKJiM0MzsJaW50IGZkc1tdID0geyAtMSwgLTEsIC0xLCAtMSB9OwomIzQzOwlfX3UzMiBpZHNbNF0sIGtleTsKJiM0MzsJaW50IGksIGxlbiA9IDA7CiYjNDM7CiYjNDM7CS8qIFNlbGVjdCB0aGUgZmlyc3QgaW5uZXIgbWFwIGFuZCBib3RoIG91dGVycyBhcyByb290cy4gVGhlIG90aGVyIGlubmVyCiYjNDM7CSAqIG1hcCBtdXN0IGJlIGFwcGVuZGVkIGFmdGVyIGFsbCB0aHJlZSByb290cywgZXZlbiB0aG91Z2ggaXQgaXMgZm91bmQKJiM0MzsJICogd2hpbGUgZHVtcGluZyB0aGUgZmlyc3Qgb3V0ZXIuIEEgcHJvY2Vzcy1zcGVjaWZpYyBuYW1lIGF2b2lkcyBvdGhlcgomIzQzOwkgKiB0ZXN0cyYjMzk7IG1hcHMgam9pbmluZyB0aGUgc2VsZWN0aW9uLgomIzQzOwkgKi8KJiM0MzsJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAmIzM0O2R1bXBfJXUmIzM0OywgZ2V0cGlkKCkpOwomIzQzOwlmZHNbMF0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgbmFtZSwgNCwgNCwgMSwgTlVMTCk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKGZkc1swXSwgJiMzNDtjcmVhdGVfc2VsZWN0ZWRfaW5uZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZmRzWzNdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsICYjMzQ7ZHVtcF9kaXNjb3ZlcmVkJiMzNDssIDQsIDQsIDEsIE5VTEwpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChmZHNbM10sICYjMzQ7Y3JlYXRlX2Rpc2NvdmVyZWRfaW5uZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJb3B0cy5pbm5lcl9tYXBfZmQgPSBmZHNbMF07CiYjNDM7CWZkc1sxXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBuYW1lLCA0LCA0LCAyLCAmYW1wO29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChmZHNbMV0sICYjMzQ7Y3JlYXRlX2FycmF5X3Jvb3QmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZmRzWzJdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoZmRzWzJdLCAmIzM0O2NyZWF0ZV9oYXNoX3Jvb3QmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZm9yIChpID0gMTsgaSAmbHQ7PSAyOyBpJiM0MzsmIzQzOykgewomIzQzOwkJa2V5ID0gMDsKJiM0MzsJCWlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmRzW2ldLCAmYW1wO2tleSwgJmFtcDtmZHNbMF0sIEJQRl9BTlkpLAomIzQzOwkJCSAgICAgICAmIzM0O3JlZmVyZW5jZV9zZWxlY3RlZF9pbm5lciYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCWtleSA9IDE7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgJmFtcDtrZXksICZhbXA7ZmRzWzNdLCBCUEZfQU5ZKSwKJiM0MzsJCQkgICAgICAgJiMzNDtyZWZlcmVuY2VfZGlzY292ZXJlZF9pbm5lciYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQVJSQVlfU0laRShmZHMpOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWRzW2ldID0gbWFwX2lkKGZkc1tpXSk7CiYjNDM7CQlpZiAoIWlkc1tpXSB8fCAhZHVtcF9tYXAoaWRzW2ldLCAmIzM0Oy1qJiMzNDssIGVsZW1lbnRzKSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCWxlbiAmIzQzOz0gc25wcmludGYoZXhwZWN0ZWQgJiM0MzsgbGVuLCBzaXplb2YoZXhwZWN0ZWQpIC0gbGVuLAomIzQzOwkJCQkmIzM0OyVze1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7JXNcJiMzNDssXCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDslc1wmIzM0OywmIzM0OwomIzQzOwkJCQkmIzM0O1wmIzM0O2ZsYWdzXCYjMzQ7OjAsXCYjMzQ7ZWxlbWVudHNcJiMzNDs6JXN9JXMmIzM0OywKJiM0MzsJCQkJaSA/ICYjMzQ7LCYjMzQ7IDogJiMzNDtbJiMzNDssIGlkc1tpXSwgdHlwZXNbaV0sCiYjNDM7CQkJCWkgPT0gMyA/ICYjMzQ7ZHVtcF9kaXNjb3ZlcmVkJiMzNDsgOiBuYW1lLCBlbGVtZW50cywgaSA9PSAzID8gJiMzNDtdJiMzNDsgOiAmIzM0OyYjMzQ7KTsKJiM0MzsJfQomIzQzOwlzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksICYjMzQ7LWogLXIgbWFwIGR1bXAgbmFtZSAlcyYjMzQ7LCBuYW1lKTsKJiM0MzsJaWYgKEFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksCiYjNDM7CQkgICAgICAmIzM0O2R1bXBfbXVsdGlwbGVfcm9vdHMmIzM0OykpIHsKJiM0MzsJCW91dHB1dFtzdHJjc3BuKG91dHB1dCwgJiMzNDtcbiYjMzQ7KV0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7CQlBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgJiMzNDtyb290c19maXJzdF9hbmRfc2VlZF9kZWR1cCYjMzQ7KTsKJiM0MzsJfQomIzQzO291dDoKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IEFSUkFZX1NJWkUoZmRzKTsgaSYjNDM7JiM0MzspCiYjNDM7CQlpZiAoZmRzW2ldICZndDs9IDApCiYjNDM7CQkJY2xvc2UoZmRzW2ldKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF91bnJlYWRhYmxlKGJvb2wgb3V0ZXIpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTsKJiM0MzsJY2hhciBlbGVtZW50c1tPVVRQVVRfU0laRV0sIG91dHB1dFtPVVRQVVRfU0laRV0sIHJvb3RbT1VUUFVUX1NJWkVdOwomIzQzOwljaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHBsYWluW09VVFBVVF9TSVpFXSA9IHt9OwomIzQzOwljaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07CiYjNDM7CWludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xLCBsb29rdXBfZXJybm87CiYjNDM7CV9fdTMyIGlubmVyX2lkLCByb290X2lkLCBrZXkgPSAwLCB2YWx1ZTsKJiM0MzsKJiM0MzsJLyogRXZlcnkga2V5IGlzIGVudW1lcmFibGUsIGJ1dCBQRVJGX0VWRU5UX0FSUkFZIGxvb2t1cCByZXR1cm5zCiYjNDM7CSAqIEVOT1RTVVBQICh0aGUga2VybmVsLWludGVybmFsIGVycm5vKS4gQ2hlY2sgYm90aCBlbnRyaWVzIHNvIGFuCiYjNDM7CSAqIGVhcmx5IGV4aXQgb24gdGhlIGZpcnN0IGxvb2t1cCBmYWlsdXJlIGNhbm5vdCBwYXNzLgomIzQzOwkgKi8KJiM0MzsJaW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSwgJiMzNDtkdW1wX3VucmVhZGFibGUmIzM0OywKJiM0MzsJCQkJICBzaXplb2Yoa2V5KSwgc2l6ZW9mKHZhbHVlKSwgMiwgTlVMTCk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCAmIzM0O2NyZWF0ZV91bnJlYWRhYmxlJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX0xUKGJwZl9tYXBfbG9va3VwX2VsZW0oaW5uZXJfZmQsICZhbXA7a2V5LCAmYW1wO3ZhbHVlKSwgMCwKJiM0MzsJCSAgICAgICAmIzM0O3VucmVhZGFibGVfbG9va3VwJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWxvb2t1cF9lcnJubyA9IGVycm5vOwomIzQzOwlpZiAoIUFTU0VSVF9ORVEobG9va3VwX2Vycm5vLCBFTk9FTlQsICYjMzQ7dW5yZWFkYWJsZV9ub3RfbWlzc2luZyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpbm5lcl9pZCA9IG1hcF9pZChpbm5lcl9mZCk7CiYjNDM7CWlmICghaW5uZXJfaWQgfHwgIWR1bXBfbWFwKGlubmVyX2lkLCAmIzM0Oy1qJiMzNDssIGVsZW1lbnRzKSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlBU1NFUlRfRVEoY291bnRfdG9rZW4oZWxlbWVudHMsICYjMzQ7XCYjMzQ7ZXJyb3JcJiMzNDs6JiMzNDspLCAyLCAmIzM0O2RlZmF1bHRfanNvbl9lcnJvcnMmIzM0Oyk7CiYjNDM7CXNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgJiMzNDttYXAgZHVtcCBpZCAldSYjMzQ7LCBpbm5lcl9pZCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIHBsYWluLCBzaXplb2YocGxhaW4pIC0gMSksCiYjNDM7CQkgICAgICAgJiMzNDtkZWZhdWx0X3BsYWluX3VucmVhZGFibGUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJQVNTRVJUX0VRKGNvdW50X3Rva2VuKHBsYWluLCBzdHJlcnJvcihsb29rdXBfZXJybm8pKSwgMiwgJiMzNDtkZWZhdWx0X3BsYWluX2Vycm9ycyYjMzQ7KTsKJiM0MzsJQVNTRVJUX0hBU19TVUJTVFIocGxhaW4sICYjMzQ7Rm91bmQgMCBlbGVtZW50cyYjMzQ7LCAmIzM0O2RlZmF1bHRfcGxhaW5fY291bnQmIzM0Oyk7CiYjNDM7CiYjNDM7CXJvb3RfaWQgPSBpbm5lcl9pZDsKJiM0MzsJaWYgKG91dGVyKSB7CiYjNDM7CQlvcHRzLmlubmVyX21hcF9mZCA9IGlubmVyX2ZkOwomIzQzOwkJb3V0ZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgJiMzNDtkdW1wX291dGVyJiMzNDssCiYjNDM7CQkJCQkgc2l6ZW9mKGtleSksIHNpemVvZih2YWx1ZSksIDEsICZhbXA7b3B0cyk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgJiMzNDtjcmVhdGVfb3V0ZXImIzM0OykgfHwKJiM0MzsJCSAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsICZhbXA7a2V5LCAmYW1wO2lubmVyX2ZkLCBCUEZfQU5ZKSwKJiM0MzsJCQkgICAgICAgJiMzNDtwb3B1bGF0ZV9vdXRlciYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCXJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpOwomIzQzOwkJaWYgKCFyb290X2lkIHx8ICFkdW1wX21hcChyb290X2lkLCAmIzM0Oy1qJiMzNDssIHJvb3QpKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJc25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksCiYjNDM7CQkJICYjMzQ7W3tcJiMzNDtpZFwmIzM0OzoldSxcJiMzNDt0eXBlXCYjMzQ7OlwmIzM0O2FycmF5X29mX21hcHNcJiMzNDssXCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDtkdW1wX291dGVyXCYjMzQ7LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0Ozolc30se1wmIzM0O2lkXCYjMzQ7OiV1LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7dHlwZVwmIzM0OzpcJiMzNDtwZXJmX2V2ZW50X2FycmF5XCYjMzQ7LFwmIzM0O25hbWVcJiMzNDs6XCYjMzQ7ZHVtcF91bnJlYWRhYmxlXCYjMzQ7LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0Ozolc31dJiMzNDssIHJvb3RfaWQsIHJvb3QsIGlubmVyX2lkLCBlbGVtZW50cyk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSwKJiM0MzsJCQkgJiMzNDtbe1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7cGVyZl9ldmVudF9hcnJheVwmIzM0OywmIzM0OwomIzQzOwkJCSAmIzM0O1wmIzM0O25hbWVcJiMzNDs6XCYjMzQ7ZHVtcF91bnJlYWRhYmxlXCYjMzQ7LFwmIzM0O2ZsYWdzXCYjMzQ7OjAsXCYjMzQ7ZWxlbWVudHNcJiMzNDs6JXN9XSYjMzQ7LAomIzQzOwkJCSBpbm5lcl9pZCwgZWxlbWVudHMpOwomIzQzOwl9CiYjNDM7CWlmIChkdW1wX21hcChyb290X2lkLCAmIzM0Oy1qIC1yJiMzNDssIG91dHB1dCkpCiYjNDM7CQlBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgJiMzNDtyZWN1cnNpdmVfdW5yZWFkYWJsZV9qc29uJiMzNDspOwomIzQzOwltZW1zZXQob3V0cHV0LCAwLCBzaXplb2Yob3V0cHV0KSk7CiYjNDM7CXNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgJiMzNDstciBtYXAgZHVtcCBpZCAldSYjMzQ7LCByb290X2lkKTsKJiM0MzsJaWYgKEFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksCiYjNDM7CQkgICAgICAmIzM0O3JlY3Vyc2l2ZV91bnJlYWRhYmxlX3BsYWluJiMzNDspKSB7CiYjNDM7CQlBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIHBsYWluLCAmIzM0O3JlY3Vyc2l2ZV9wbGFpbl9wcmVzZXJ2ZXNfZXJyb3JzJiMzNDspOwomIzQzOwkJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgc3RyZXJyb3IobG9va3VwX2Vycm5vKSksIDIsCiYjNDM7CQkJICAmIzM0O3JlY3Vyc2l2ZV9wbGFpbl9lcnJvcnMmIzM0Oyk7CiYjNDM7CQlBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCAmIzM0O0ZvdW5kICYjMzQ7KSwgb3V0ZXIgPyAyIDogMSwKJiM0MzsJCQkgICYjMzQ7cmVjdXJzaXZlX3BsYWluX21hcHMmIzM0Oyk7CiYjNDM7CX0KJiM0MztvdXQ6CiYjNDM7CWlmIChvdXRlcl9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2Uob3V0ZXJfZmQpOwomIzQzOwlpZiAoaW5uZXJfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGlubmVyX2ZkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9tYW55X2lubmVyX21hcHMoYm9vbCBqc29uKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7CiYjNDM7CWNvbnN0IHN0cnVjdCBybGltaXQgbGltaXQgPSB7IC5ybGltX2N1ciA9IDMyLCAucmxpbV9tYXggPSAzMiB9OwomIzQzOwljaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIHRva2VuWzY0XTsKJiM0MzsJX191MzIgaWRzWzY0XSwgcm9vdF9pZCwga2V5OwomIzQzOwlpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMSwgc3RhdHVzOwomIzQzOwljaGFyICpvdXRwdXQgPSBOVUxMOwomIzQzOwlwaWRfdCBwaWQ7CiYjNDM7CiYjNDM7CWlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsICYjMzQ7ZHVtcF9pbm5lciYjMzQ7LCA0LCA0LCAxLCBOVUxMKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsICYjMzQ7Y3JlYXRlX3RlbXBsYXRlJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CW9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7CiYjNDM7CW91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsICYjMzQ7ZHVtcF9vdXRlciYjMzQ7LCA0LCA0LAomIzQzOwkJCQkgQVJSQVlfU0laRShpZHMpLCAmYW1wO29wdHMpOwomIzQzOwljbG9zZShpbm5lcl9mZCk7CiYjNDM7CWlubmVyX2ZkID0gLTE7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCAmIzM0O2NyZWF0ZV9vdXRlciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlmb3IgKGtleSA9IDA7IGtleSAmbHQ7IEFSUkFZX1NJWkUoaWRzKTsga2V5JiM0MzsmIzQzOykgewomIzQzOwkJaW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgJiMzNDtkdW1wX2lubmVyJiMzNDssIDQsIDQsIDEsIE5VTEwpOwomIzQzOwkJaWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsICYjMzQ7Y3JlYXRlX2lubmVyJiMzNDspIHx8CiYjNDM7CQkgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCAmYW1wO2tleSwgJmFtcDtpbm5lcl9mZCwgQlBGX0FOWSksCiYjNDM7CQkJICAgICAgICYjMzQ7cG9wdWxhdGVfb3V0ZXImIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlpZHNba2V5XSA9IG1hcF9pZChpbm5lcl9mZCk7CiYjNDM7CQlpZiAoIWlkc1trZXldKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJLyogVGhlIG91dGVyIG1hcCBrZWVwcyBlYWNoIGRpc3RpbmN0IGlubmVyIG1hcCBhbGl2ZS4gKi8KJiM0MzsJCWNsb3NlKGlubmVyX2ZkKTsKJiM0MzsJCWlubmVyX2ZkID0gLTE7CiYjNDM7CX0KJiM0MzsJcm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7CiYjNDM7CW91dHB1dCA9IGNhbGxvYygxLCA2NTUzNik7CiYjNDM7CWlmICghcm9vdF9pZCB8fCAhQVNTRVJUX09LX1BUUihvdXRwdXQsICYjMzQ7YWxsb2NhdGVfb3V0cHV0JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CS8qIENyZWF0ZSBhbGwgZml4dHVyZXMgYmVmb3JlIGxvd2VyaW5nIHRoZSBsaW1pdCwgYW5kIGtlZXAgdGhlIHRlc3QKJiM0MzsJICogcnVubmVyJiMzOTtzIGxpbWl0IHVuY2hhbmdlZC4gUmV0YWluaW5nIGV2ZXJ5IGRpc2NvdmVyZWQgRkQgd291bGQgZXhjZWVkCiYjNDM7CSAqIHRoaXMgbGltaXQgYmVmb3JlIHRoZSByZWN1cnNpdmUgZHVtcCBjb3VsZCB2aXNpdCBhbGwgaW5uZXIgbWFwcy4KJiM0MzsJICovCiYjNDM7CXBpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocGlkLCAwLCAmIzM0O2ZvcmsmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKCFwaWQpIHsKJiM0MzsJCWNsb3NlKG91dGVyX2ZkKTsKJiM0MzsJCWlmIChzZXRybGltaXQoUkxJTUlUX05PRklMRSwgJmFtcDtsaW1pdCkpCiYjNDM7CQkJX2V4aXQoMSk7CiYjNDM7CQlzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksICYjMzQ7JXMgLXIgbWFwIGR1bXAgaWQgJXUmIzM0OywKJiM0MzsJCQkganNvbiA/ICYjMzQ7LWomIzM0OyA6ICYjMzQ7JiMzNDssIHJvb3RfaWQpOwomIzQzOwkJaWYgKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgNjU1MzUpKQomIzQzOwkJCV9leGl0KDIpOwomIzQzOwkJaWYgKGNvdW50X3Rva2VuKG91dHB1dCwganNvbiA/ICYjMzQ7XCYjMzQ7aWRcJiMzNDs6JiMzNDsgOiAmIzM0O0ZvdW5kICYjMzQ7KSAhPSBBUlJBWV9TSVpFKGlkcykgJiM0MzsgMSB8fAomIzQzOwkJICAgIGNvdW50X3Rva2VuKG91dHB1dCwganNvbiA/ICYjMzQ7XCYjMzQ7aW5uZXJfbWFwX2lkXCYjMzQ7OiYjMzQ7IDogJiMzNDtpbm5lcl9tYXBfaWQ6JiMzNDspICE9CiYjNDM7CQkgICAgQVJSQVlfU0laRShpZHMpKQomIzQzOwkJCV9leGl0KDMpOwomIzQzOwkJZm9yIChrZXkgPSAwOyBrZXkgJmx0OyBBUlJBWV9TSVpFKGlkcyk7IGtleSYjNDM7JiM0MzspIHsKJiM0MzsJCQlpZiAoanNvbikKJiM0MzsJCQkJc25wcmludGYodG9rZW4sIHNpemVvZih0b2tlbiksICYjMzQ7XCYjMzQ7aWRcJiMzNDs6JXUsJiMzNDssIGlkc1trZXldKTsKJiM0MzsJCQllbHNlCiYjNDM7CQkJCXNucHJpbnRmKHRva2VuLCBzaXplb2YodG9rZW4pLCAmIzM0O1xuJXU6IGhhc2ggIG5hbWUgZHVtcF9pbm5lciAgJiMzNDssCiYjNDM7CQkJCQkgaWRzW2tleV0pOwomIzQzOwkJCWlmIChjb3VudF90b2tlbihvdXRwdXQsIHRva2VuKSAhPSAxKQomIzQzOwkJCQlfZXhpdCg0KTsKJiM0MzsJCX0KJiM0MzsJCWlmIChqc29uICZhbXA7JmFtcDsgKG91dHB1dFswXSAhPSAmIzM5O1smIzM5OyB8fAomIzQzOwkJCSAgICAgc3RyY21wKG91dHB1dCAmIzQzOyBzdHJsZW4ob3V0cHV0KSAtIDIsICYjMzQ7XVxuJiMzNDspKSkKJiM0MzsJCQlfZXhpdCg1KTsKJiM0MzsJCV9leGl0KDApOwomIzQzOwl9CiYjNDM7CWlmIChBU1NFUlRfRVEod2FpdHBpZChwaWQsICZhbXA7c3RhdHVzLCAwKSwgcGlkLCAmIzM0O3dhaXRwaWQmIzM0OykgJmFtcDsmYW1wOwomIzQzOwkgICAgQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksICYjMzQ7Y2hpbGRfZXhpdGVkJiMzNDspKQomIzQzOwkJQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIDAsICYjMzQ7ZHVtcF93aXRoX2xvd19mZF9saW1pdCYjMzQ7KTsKJiM0MztvdXQ6CiYjNDM7CWZyZWUob3V0cHV0KTsKJiM0MzsJaWYgKG91dGVyX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShvdXRlcl9mZCk7CiYjNDM7CWlmIChpbm5lcl9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoaW5uZXJfZmQpOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHRlc3RfYnBmdG9vbF9tYXBfZHVtcCh2b2lkKQomIzQzO3sKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt1bnJlYWRhYmxlX29yZGluYXJ5JiMzNDspKQomIzQzOwkJdGVzdF91bnJlYWRhYmxlKGZhbHNlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt1bnJlYWRhYmxlX2lubmVyJiMzNDspKQomIzQzOwkJdGVzdF91bnJlYWRhYmxlKHRydWUpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O21hbnlfaW5uZXJfbWFwc19qc29uJiMzNDspKQomIzQzOwkJdGVzdF9tYW55X2lubmVyX21hcHModHJ1ZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWFueV9pbm5lcl9tYXBzX3BsYWluJiMzNDspKQomIzQzOwkJdGVzdF9tYW55X2lubmVyX21hcHMoZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O211bHRpcGxlX3Jvb3RzJiMzNDspKQomIzQzOwkJdGVzdF9tdWx0aXBsZV9yb290cygpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2FycmF5X29mX21hcHMmIzM0OykpCiYjNDM7CQl0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2hhc2hfb2ZfbWFwcyYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIGZhbHNlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzaGFyZWRfaW5uZXImIzM0OykpCiYjNDM7CQl0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAyLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2VtcHR5X2FycmF5X29mX21hcHMmIzM0OykpCiYjNDM7CQl0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2VtcHR5X2hhc2hfb2ZfbWFwcyYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMCwgZmFsc2UsIGZhbHNlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtidGZfaW5uZXImIzM0OykpCiYjNDM7CQl0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIGZhbHNlLCB0cnVlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtlbXB0eV9pbm5lciYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgdHJ1ZSwgZmFsc2UpOwomIzQzO30KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDE6MjM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTM0ODMKCQkJCQkJCW91dHB1dDogODYKCQkJCQkJCXRob3VnaHRzOiA0NjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqV29ydGhGdXp6aW5nIEFzc2Vzc21lbnQ6IE5lZ2F0aXZlKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5lZWQgdG8gbG9vayBhdCB0aGUgZGlmZiBhbmQgc2VlIHdoYXQmIzM5O3MgYmVlbiB0b3VjaGVkLiBBbHJpZ2h0LCBJJiMzOTttIHNlZWluZyBjaGFuZ2VzIGluIGBicGZ0b29sYCByZWxhdGVkIGZpbGVzIGFuZCBzb21lIHNlbGYtdGVzdHMuIFNwZWNpZmljYWxseSwgSSYjMzk7bSBsb29raW5nIGF0IG1vZGlmaWNhdGlvbnMgdG8gYGJwZnRvb2xgJiMzOTtzIGRvY3VtZW50YXRpb24sIGJhc2ggY29tcGxldGlvbiwgYG1haW4uY2AsIGBtYWluLmhgLCBgbWFwLmNgLCBhbmQgdGhlIGBicGZ0b29sX21hcF9kdW1wLmNgIHNlbGYtdGVzdC4gQWxsIHRoZXNlIGNoYW5nZXMgYXJlIG5lYXRseSBjb250YWluZWQgd2l0aGluIHRoZSBgdG9vbHMvYCBkaXJlY3RvcnksIHNwZWNpZmljYWxseSB3aXRoaW4gYHRvb2xzL2JwZi9icGZ0b29sYCBhbmQgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZmAuCgpOb3csIEkgbmVlZCB0byBhcHBseSB0aGUgdHJpYWdlIGd1aWRlbGluZXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgZGVzZXJ2ZXMgZnV6emluZy4gQWNjb3JkaW5nIHRvIHRoZSBndWlkZWxpbmVzLCBJIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGNoYW5nZXMgZmFsbCB1bmRlciBhbnkgb2YgdGhlICYjMzQ7TkVHQVRJVkUgQ1JJVEVSSUEsJiMzNDsgbWVhbmluZyBpZiBJICpkb24mIzM5O3QqIG5lZWQgdG8gZmxhZyB0aGlzIGZvciBmdXp6aW5nLiBTZWVtcyBsaWtlIGEgZml0LiBUaGUgcnVsZSBoZXJlIGlzIGNsZWFyOiBJZiAqYWxsKiB0aGUgbW9kaWZpZWQgY29kZSBpcyBleGNsdXNpdmVseSBkb2N1bWVudGF0aW9uLCBjb21tZW50cywgc3BlbGxpbmcgZml4ZXMsIG9yIHVzZXItc3BhY2UgZGlyZWN0b3JpZXMgbGlrZSBgdG9vbHMvYCwgYHNhbXBsZXMvYCwgYHNjcmlwdHMvYCwgb3IgYHVzci9gICphbmQqIGRvZXMgKm5vdCogaW1wYWN0IHRoZSBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGFueSBrZXJuZWwgbW9kdWxlcywgdGhlbiBJIHNob3VsZCBzZXQgYFdvcnRoRnV6emluZz1mYWxzZWAuCgpDb25zaWRlcmluZyB0aGUgZ3VpZGVsaW5lcywgaXQmIzM5O3MgY2xlYXIgdGhhdCBhbGwgY2hhbmdlcyBhcmUgY29uZmluZWQgdG8gdXNlci1zcGFjZSB0b29scyAoYGJwZnRvb2xgKSBhbmQgYXNzb2NpYXRlZCBzZWxmLXRlc3RzLiBObyBrZXJuZWwgc291cmNlIGZpbGVzIHJlc2lkaW5nIGluIGRpcmVjdG9yaWVzIGxpa2UgYGtlcm5lbC9gLCBgbmV0L2AsIGBtbS9gLCBgZHJpdmVycy9gLCBgZnMvYCwgYGluY2x1ZGUvYCAoYmVzaWRlcyB0b29scy9pbmNsdWRlIGlmIGFueSksIG9yIG90aGVyIGNydWNpYWwga2VybmVsIGNvbXBvbmVudHMgYXJlIGFmZmVjdGVkLiBTbywgSSBhbSB2ZXJ5IGNvbmZpZGVudCB0aGlzIHBhdGNoIHdvbiYjMzk7dCBhZmZlY3QgdGhlIGtlcm5lbCBvciBtb2R1bGVzIGluIGFueSB3YXkuCgpDb25zZXF1ZW50bHksIGBXb3J0aEZ1enppbmdgIG11c3QgYmUgYGZhbHNlYCBpbiB0aGlzIGNhc2UuCgpCZWZvcmUgSSBmaW5hbGl6ZSB0aGUgcmVzcG9uc2UsIEkgc2hvdWxkIGFsc28gY29uZmlybSB0aGUgZm9ybWF0IGZvciByZXR1cm5pbmcgdGhlIHJlc3VsdHMuIEkgc2hvdWxkIHByb2JhYmx5IGRvdWJsZS1jaGVjayB0aGUgcmVxdWlyZW1lbnQgZm9yIHRoZSBgRm9jdXNTeW1ib2xzYCBhbmQgYEVuYWJsZUNvbmZpZ3NgIGFycmF5cy4gQWgsIHllcywgaWYgYFdvcnRoRnV6emluZz1mYWxzZWAsIHRoZXkgc2hvdWxkIGJlIHNldCB0byBlbXB0eSBhcnJheXMsIHdoaWNoIGlzIHRoZSBzdGFuZGFyZCBwcm9jZWR1cmUuIERvbmUhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDE6MjQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBvbmx5IHVzZXItc3BhY2UgdG9vbHMgYW5kIHNlbGZ0ZXN0cyB1bmRlciB0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLiBJdCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xzIGFuZCBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbCBjb2RlIG9yIGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDE6MjQ8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDAxOjIzOjU5LjM0MjE4Mzg3NloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUwMDE4MTQxMjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJcIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBvbmx5IHVzZXItc3BhY2UgdG9vbHMgYW5kIHNlbGZ0ZXN0cyB1bmRlciB0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLiBJdCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDE6MjM6NTkuMzQyMTg5MzU2WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1ODc5NTU0NDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA0MjJmYTU3ODZmNWMxMmJhMTUyM2RiZDhlNTBlN2ZjOWQyNWJmZWVkXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gU2VwIDcgMDE6MjM6NTggMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLjM4ZDFmNTQyYmY1YTUgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbkBAIC0xNiw3ICsxNiw3IEBAIFNZTk9QU0lTXFxuIFxcbiAqKmJwZnRvb2wqKiBbKk9QVElPTlMqXSAqKm1hcCoqICpDT01NQU5EKlxcbiBcXG4tKk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8IHsgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IH1cXG4rKk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8IHsgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IHwgeyAqKi1yKiogfCAqKi0tcmVjdXJzaXZlKiogfSB9XFxuIFxcbiAqQ09NTUFORFMqIDo9XFxuIHsgKipzaG93KiogfCAqKmxpc3QqKiB8ICoqY3JlYXRlKiogfCAqKmR1bXAqKiB8ICoqdXBkYXRlKiogfCAqKmxvb2t1cCoqIHwgKipnZXRuZXh0KiogfFxcbkBAIC0xNzAsNiArMTcwLDI1IEBAIE9QVElPTlNcXG4gICAgIERvIG5vdCBhdXRvbWF0aWNhbGx5IGF0dGVtcHQgdG8gbW91bnQgYW55IHZpcnR1YWwgZmlsZSBzeXN0ZW0gKHN1Y2ggYXNcXG4gICAgIHRyYWNlZnMgb3IgQlBGIHZpcnR1YWwgZmlsZSBzeXN0ZW0pIHdoZW4gbmVjZXNzYXJ5LlxcbiBcXG4rLXIsIC0tcmVjdXJzaXZlXFxuKyAgICBBbHNvIGR1bXAgdGhlIGlubmVyIG1hcHMgcmVmZXJlbmNlZCBieSAqKmFycmF5X29mX21hcHMqKiBhbmQgKipoYXNoX29mX21hcHMqKlxcbisgICAgZW50cmllcyB3aGVuIHJ1bm5pbmcgKiptYXAgZHVtcCoqLiBFYWNoIG1hcCBJRCBpcyB2aXNpdGVkIG9uY2UsIGV2ZW4gaWZcXG4rICAgIHNldmVyYWwgZW50cmllcyByZWZlciB0byBpdC4gU2VsZWN0ZWQgbWFwcyBhcmUgZm9sbG93ZWQgYnkgdGhlaXIgaW5uZXIgbWFwcy5cXG4rXFxuKyAgICBQbGFpbiBvdXRwdXQgaW5jbHVkZXMgYSBoZWFkZXIgaWRlbnRpZnlpbmcgZWFjaCBtYXAuIE9uIHN1Y2Nlc3MsIEpTT04gb3V0cHV0XFxuKyAgICBpcyBhbHdheXMgYW4gYXJyYXkgb2YgbWFwIG9iamVjdHMsIGVhY2ggY29udGFpbmluZyBhbiAqKmlkKiogYW5kIGFuXFxuKyAgICAqKmVsZW1lbnRzKiogYXJyYXksIGluY2x1ZGluZyB3aGVuIG9ubHkgb25lIG1hcCBpcyBkdW1wZWQuIE91dGVyIG1hcCBlbnRyaWVzXFxuKyAgICByZXRhaW4gdGhlaXIgKippbm5lcl9tYXBfaWQqKiBmaWVsZCwgd2hpY2ggaWRlbnRpZmllcyB0aGUgY29ycmVzcG9uZGluZyBpbm5lclxcbisgICAgbWFwIG9iamVjdC5cXG4rXFxuKyAgICBJbm5lciBtYXAgSURzIGFyZSByZXNvbHZlZCB3aGVuIHRoZSBtYXBzIGFyZSB2aXNpdGVkLiBUaGUgZHVtcCBpcyBub3QgYW5cXG4rICAgIGF0b21pYyBzbmFwc2hvdDogY29uY3VycmVudCB1cGRhdGVzIGNhbiBjaGFuZ2UgbWFwIGNvbnRlbnRzIG9yIHJlbW92ZSBhXFxuKyAgICByZWZlcmVuY2VkIGlubmVyIG1hcCBiZWZvcmUgaXQgaXMgdmlzaXRlZC4gRmFpbHVyZSB0byBvcGVuIGEgcmVmZXJlbmNlZFxcbisgICAgaW5uZXIgbWFwIHN0b3BzIHRoZSBkdW1wIGFuZCByZXR1cm5zIGEgbm9uemVybyBleGl0IHN0YXR1cy4gT3V0cHV0IG1heVxcbisgICAgY29udGFpbiBtYXBzIG9yIGVudHJpZXMgcHJpbnRlZCBiZWZvcmUgdGhlIGVycm9yLlxcbisgICAgSW4gSlNPTiBtb2RlLCBhbiBlcnJvciBkdXJpbmcgdHJhdmVyc2FsIGlzIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgYW5kIHRoZVxcbisgICAgZW5jbG9zaW5nIGFycmF5cyBhbmQgb2JqZWN0cyBhcmUgY2xvc2VkLlxcbitcXG4gRVhBTVBMRVNcXG4gPT09PT09PT1cXG4gKiojIGJwZnRvb2wgbWFwIHNob3cqKlxcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXFxuaW5kZXggNzVjYmNiNTEyZWJhZS4uNDVjMzM2ZDYzYmUwYSAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXFxuQEAgLTI2MSw3ICsyNjEsNyBAQCBfYnBmdG9vbCgpXFxuIFxcbiAgICAgIyBEZWFsIHdpdGggb3B0aW9uc1xcbiAgICAgaWYgW1sgJHt3b3Jkc1tjd29yZF19ID09IC0qIF1dOyB0aGVuXFxuLSAgICAgICAgbG9jYWwgYz0nLS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcXFxcbisgICAgICAgIGxvY2FsIGM9Jy0tdmVyc2lvbiAtLWpzb24gLS1wcmV0dHkgLS1yZWN1cnNpdmUgLS1icGZmcyAtLW1hcGNvbXBhdCAtLWRlYnVnIFxcXFxcXG4gICAgICAgICAgICAgLS11c2UtbG9hZGVyIC0tYmFzZS1idGYgLS1zaWduIC1pIC1rJ1xcbiAgICAgICAgIENPTVBSRVBMWT0oICQoIGNvbXBnZW4gLVcgXFxcIiRjXFxcIiAtLSBcXFwiJGN1clxcXCIgKSApXFxuICAgICAgICAgcmV0dXJuIDBcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jXFxuaW5kZXggYzkxZTFhNmUxYTFlYy4uMjkwMjFmNGRkNDUxOCAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmNcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmNcXG5AQCAtMjYsNiArMjYsNyBAQCBzdGF0aWMgaW50ICgqbGFzdF9kb19oZWxwKShpbnQgYXJnYywgY2hhciAqKmFyZ3YpO1xcbiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcXG4gYm9vbCBwcmV0dHlfb3V0cHV0O1xcbiBib29sIGpzb25fb3V0cHV0O1xcbitib29sIHJlY3Vyc2l2ZTtcXG4gYm9vbCBzaG93X3Bpbm5lZDtcXG4gYm9vbCBibG9ja19tb3VudDtcXG4gYm9vbCB2ZXJpZmllcl9sb2dzO1xcbkBAIC00NTIsNiArNDUzLDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHR7IFxcXCJqc29uXFxcIixcXHRub19hcmd1bWVudCxcXHROVUxMLFxcdCdqJyB9LFxcbiBcXHRcXHR7IFxcXCJoZWxwXFxcIixcXHRub19hcmd1bWVudCxcXHROVUxMLFxcdCdoJyB9LFxcbiBcXHRcXHR7IFxcXCJwcmV0dHlcXFwiLFxcdG5vX2FyZ3VtZW50LFxcdE5VTEwsXFx0J3AnIH0sXFxuK1xcdFxcdHsgXFxcInJlY3Vyc2l2ZVxcXCIsXFx0bm9fYXJndW1lbnQsXFx0TlVMTCxcXHQncicgfSxcXG4gXFx0XFx0eyBcXFwidmVyc2lvblxcXCIsXFx0bm9fYXJndW1lbnQsXFx0TlVMTCxcXHQnVicgfSxcXG4gXFx0XFx0eyBcXFwiYnBmZnNcXFwiLFxcdG5vX2FyZ3VtZW50LFxcdE5VTEwsXFx0J2YnIH0sXFxuIFxcdFxcdHsgXFxcIm1hcGNvbXBhdFxcXCIsXFx0bm9fYXJndW1lbnQsXFx0TlVMTCxcXHQnbScgfSxcXG5AQCAtNDg1LDcgKzQ4Nyw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0YmluX25hbWUgPSBcXFwiYnBmdG9vbFxcXCI7XFxuIFxcbiBcXHRvcHRlcnIgPSAwO1xcbi1cXHR3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsIFxcXCJWaHBqZkxtbmRTaTprOkI6bFxcXCIsXFxuK1xcdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXFxcIlZocGpyZkxtbmRTaTprOkI6bFxcXCIsXFxuIFxcdFxcdFxcdFxcdCAgb3B0aW9ucywgTlVMTCkpIFxcdTAwM2U9IDApIHtcXG4gXFx0XFx0c3dpdGNoIChvcHQpIHtcXG4gXFx0XFx0Y2FzZSAnVic6XFxuQEAgLTUwNyw2ICs1MDksOSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdFxcdH1cXG4gXFx0XFx0XFx0anNvbndfcHJldHR5KGpzb25fd3RyLCBwcmV0dHlfb3V0cHV0KTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgJ3InOlxcbitcXHRcXHRcXHRyZWN1cnNpdmUgPSB0cnVlO1xcbitcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0Y2FzZSAnZic6XFxuIFxcdFxcdFxcdHNob3dfcGlubmVkID0gdHJ1ZTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaCBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxcbmluZGV4IDc4YjZlMGViYjg1ZDguLmI1ZGM3OTYwY2Y2ODIgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oXFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oXFxuQEAgLTgzLDYgKzgzLDcgQEAgZXh0ZXJuIGNvbnN0IGNoYXIgKmJpbl9uYW1lO1xcbiBcXG4gZXh0ZXJuIGpzb25fd3JpdGVyX3QgKmpzb25fd3RyO1xcbiBleHRlcm4gYm9vbCBqc29uX291dHB1dDtcXG4rZXh0ZXJuIGJvb2wgcmVjdXJzaXZlO1xcbiBleHRlcm4gYm9vbCBzaG93X3Bpbm5lZDtcXG4gZXh0ZXJuIGJvb2wgc2hvd19waWRzO1xcbiBleHRlcm4gYm9vbCBibG9ja19tb3VudDtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xcbmluZGV4IDY4NGE4ZmI3MjQxNDYuLmZjMDZjNzY1OTczMTUgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xcbkBAIC0xNyw2ICsxNyw3IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NicGYvYnBmLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NicGYvYnRmLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NicGYvaGFzaG1hcC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2xpYmJwZl9pbnRlcm5hbC5oXFx1MDAzZVxcbiBcXG4gI2luY2x1ZGUgXFxcImpzb25fd3JpdGVyLmhcXFwiXFxuICNpbmNsdWRlIFxcXCJtYWluLmhcXFwiXFxuQEAgLTgyNiwxMiArODI3LDQ0IEBAIHN0YXRpYyB2b2lkIGZyZWVfbWFwX2t2X2J0ZihzdHJ1Y3QgYnRmICpidGYpXFxuIFxcdFxcdGJ0Zl9fZnJlZShidGYpO1xcbiB9XFxuIFxcbitzdHJ1Y3QgbWFwX2R1bXBfY3R4IHtcXG4rXFx0c3RydWN0IGhhc2htYXAgKnNlZW47XFxuK1xcdF9fdTMyICpwZW5kaW5nX2lkcztcXG4rXFx0c2l6ZV90IHBlbmRpbmdfY250O1xcbit9O1xcbitcXG4rc3RhdGljIGludCBjb2xsZWN0X2lubmVyX21hcChzdHJ1Y3QgbWFwX2R1bXBfY3R4ICpjdHgsIF9fdTMyIGlkKVxcbit7XFxuK1xcdF9fdTMyICppZHM7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRpZiAoaGFzaG1hcF9fZmluZChjdHgtXFx1MDAzZXNlZW4sIGlkLCBOVUxMKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRpZHMgPSBsaWJicGZfcmVhbGxvY2FycmF5KGN0eC1cXHUwMDNlcGVuZGluZ19pZHMsIGN0eC1cXHUwMDNlcGVuZGluZ19jbnQgKyAxLFxcbitcXHRcXHRcXHRcXHQgc2l6ZW9mKCppZHMpKTtcXG4rXFx0aWYgKCFpZHMpIHtcXG4rXFx0XFx0cF9lcnIoXFxcIm1lbSBhbGxvYyBmYWlsZWRcXFwiKTtcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHR9XFxuK1xcdGN0eC1cXHUwMDNlcGVuZGluZ19pZHMgPSBpZHM7XFxuK1xcbitcXHRlcnIgPSBoYXNobWFwX19hZGQoY3R4LVxcdTAwM2VzZWVuLCBpZCwgMCk7XFxuK1xcdGlmIChlcnIpIHtcXG4rXFx0XFx0cF9lcnIoXFxcImZhaWxlZCB0byByZWNvcmQgaW5uZXIgbWFwIGlkICV1OiAlc1xcXCIsIGlkLCBzdHJlcnJvcigtZXJyKSk7XFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0fVxcbitcXHRpZHNbY3R4LVxcdTAwM2VwZW5kaW5nX2NudCsrXSA9IGlkO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4gc3RhdGljIGludFxcbiBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcXG4tXFx0IGJvb2wgc2hvd19oZWFkZXIpXFxuK1xcdCBib29sIHNob3dfaGVhZGVyLCBzdHJ1Y3QgbWFwX2R1bXBfY3R4ICpjdHgpXFxuIHtcXG4gXFx0dm9pZCAqa2V5LCAqdmFsdWUsICpwcmV2X2tleTtcXG4gXFx0dW5zaWduZWQgaW50IG51bV9lbGVtcyA9IDA7XFxuK1xcdGpzb25fd3JpdGVyX3QgKnBsYWluX2J0Zl93dHIgPSBOVUxMO1xcbiBcXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xcbiBcXHRpbnQgZXJyO1xcbiBcXG5AQCAtODQ1LDYgKzg3OCwxNyBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcXG4gXFxuIFxcdHByZXZfa2V5ID0gTlVMTDtcXG4gXFxuK1xcdGlmIChjdHggXFx1MDAyNlxcdTAwMjYgIXd0ciBcXHUwMDI2XFx1MDAyNiAoaW5mby1cXHUwMDNlYnRmX3ZhbHVlX3R5cGVfaWQgfHxcXG4rXFx0XFx0XFx0ICAgIGluZm8tXFx1MDAzZWJ0Zl92bWxpbnV4X3ZhbHVlX3R5cGVfaWQpKSB7XFxuK1xcdFxcdHBsYWluX2J0Zl93dHIgPSBnZXRfYnRmX3dyaXRlcigpO1xcbitcXHRcXHRpZiAocGxhaW5fYnRmX3d0cikge1xcbitcXHRcXHRcXHRpZiAoc2hvd19oZWFkZXIpXFxuK1xcdFxcdFxcdFxcdHNob3dfbWFwX2hlYWRlcl9wbGFpbihpbmZvKTtcXG4rXFx0XFx0XFx0c2hvd19oZWFkZXIgPSBmYWxzZTtcXG4rXFx0XFx0XFx0d3RyID0gcGxhaW5fYnRmX3d0cjtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbiBcXHRpZiAod3RyKSB7XFxuIFxcdFxcdGVyciA9IGdldF9tYXBfa3ZfYnRmKGluZm8sIFxcdTAwMjZidGYpO1xcbiBcXHRcXHRpZiAoZXJyKSB7XFxuQEAgLTg3NCwxMCArOTE4LDIwIEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxcbiBcXHRcXHRpZiAoZXJyKSB7XFxuIFxcdFxcdFxcdGlmIChlcnJubyA9PSBFTk9FTlQpXFxuIFxcdFxcdFxcdFxcdGVyciA9IDA7XFxuK1xcdFxcdFxcdGVsc2UgaWYgKGN0eClcXG4rXFx0XFx0XFx0XFx0cF9lcnIoXFxcImNhbid0IGdldCBuZXh0IGtleSBmb3IgbWFwIGlkICV1OiAlc1xcXCIsXFxuK1xcdFxcdFxcdFxcdCAgICAgIGluZm8tXFx1MDAzZWlkLCBzdHJlcnJvcihlcnJubykpO1xcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0fVxcbi1cXHRcXHRpZiAoIWR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKSlcXG4rXFx0XFx0ZXJyID0gZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpO1xcbitcXHRcXHRpZiAoIWVycikge1xcbiBcXHRcXHRcXHRudW1fZWxlbXMrKztcXG4rXFx0XFx0XFx0aWYgKGN0eCBcXHUwMDI2XFx1MDAyNiBtYXBfaXNfbWFwX29mX21hcHMoaW5mby1cXHUwMDNldHlwZSkpIHtcXG4rXFx0XFx0XFx0XFx0ZXJyID0gY29sbGVjdF9pbm5lcl9tYXAoY3R4LCAqKF9fdTMyICopdmFsdWUpO1xcbitcXHRcXHRcXHRcXHRpZiAoZXJyKVxcbitcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuIFxcdFxcdHByZXZfa2V5ID0ga2V5O1xcbiBcXHR9XFxuIFxcbkBAIC04OTQsMTggKzk0OCwyNSBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcXG4gXFx0ZnJlZShrZXkpO1xcbiBcXHRmcmVlKHZhbHVlKTtcXG4gXFx0ZnJlZV9tYXBfa3ZfYnRmKGJ0Zik7XFxuK1xcdGlmIChwbGFpbl9idGZfd3RyKVxcbitcXHRcXHRqc29ud19kZXN0cm95KFxcdTAwMjZwbGFpbl9idGZfd3RyKTtcXG4gXFxuIFxcdHJldHVybiBlcnI7XFxuIH1cXG4gXFxuIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIHtcXG4rXFx0TElCQlBGX09QVFMoYnBmX2dldF9mZF9ieV9pZF9vcHRzLCBvcHRzLFxcbitcXHRcXHQub3Blbl9mbGFncyA9IEJQRl9GX1JET05MWSxcXG4rXFx0KTtcXG4gXFx0anNvbl93cml0ZXJfdCAqd3RyID0gTlVMTCwgKmJ0Zl93dHIgPSBOVUxMO1xcbiBcXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcXG4rXFx0c3RydWN0IG1hcF9kdW1wX2N0eCBjdHggPSB7fTtcXG4gXFx0aW50IG5iX2ZkcywgaSA9IDA7XFxuIFxcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcXG4gXFx0aW50ICpmZHMgPSBOVUxMO1xcbiBcXHRpbnQgZXJyID0gLTE7XFxuK1xcdHNpemVfdCBqO1xcbiBcXG4gXFx0aWYgKGFyZ2MgIT0gMilcXG4gXFx0XFx0dXNhZ2UoKTtcXG5AQCAtOTE5LDkgKzk4MCwzNCBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRpZiAobmJfZmRzIFxcdTAwM2MgMSlcXG4gXFx0XFx0Z290byBleGl0X2ZyZWU7XFxuIFxcbitcXHRpZiAocmVjdXJzaXZlKSB7XFxuK1xcdFxcdGN0eC5zZWVuID0gaGFzaG1hcF9fbmV3KGhhc2hfZm5fZm9yX2tleV9hc19pZCxcXG4rXFx0XFx0XFx0XFx0XFx0ZXF1YWxfZm5fZm9yX2tleV9hc19pZCwgTlVMTCk7XFxuK1xcdFxcdGlmIChJU19FUlIoY3R4LnNlZW4pKSB7XFxuK1xcdFxcdFxcdGN0eC5zZWVuID0gTlVMTDtcXG4rXFx0XFx0XFx0cF9lcnIoXFxcImZhaWxlZCB0byBjcmVhdGUgaGFzaG1hcCBmb3IgcmVjdXJzaXZlIGR1bXBcXFwiKTtcXG4rXFx0XFx0XFx0Z290byBleGl0X2Nsb3NlO1xcbitcXHRcXHR9XFxuK1xcdFxcdC8qIFJlY29yZCB0aGUgc2VsZWN0ZWQgbWFwcyBiZWZvcmUgZGlzY292ZXJpbmcgYW55IGlubmVyIG1hcHMuICovXFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBuYl9mZHM7IGkrKykge1xcbitcXHRcXHRcXHRsZW4gPSBzaXplb2YoaW5mbyk7XFxuK1xcdFxcdFxcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgXFx1MDAyNmluZm8sIFxcdTAwMjZsZW4pKSB7XFxuK1xcdFxcdFxcdFxcdHBfZXJyKFxcXCJjYW4ndCBnZXQgbWFwIGluZm86ICVzXFxcIiwgc3RyZXJyb3IoZXJybm8pKTtcXG4rXFx0XFx0XFx0XFx0ZXJyID0gLTE7XFxuK1xcdFxcdFxcdFxcdGdvdG8gZXhpdF9jbG9zZTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRlcnIgPSBoYXNobWFwX19hZGQoY3R4LnNlZW4sIGluZm8uaWQsIDApO1xcbitcXHRcXHRcXHRpZiAoZXJyKSB7XFxuK1xcdFxcdFxcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gcmVjb3JkIG1hcCBpZCAldTogJXNcXFwiLCBpbmZvLmlkLFxcbitcXHRcXHRcXHRcXHQgICAgICBzdHJlcnJvcigtZXJyKSk7XFxuK1xcdFxcdFxcdFxcdGdvdG8gZXhpdF9jbG9zZTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuIFxcdGlmIChqc29uX291dHB1dCkge1xcbiBcXHRcXHR3dHIgPSBqc29uX3d0cjtcXG4tXFx0fSBlbHNlIHtcXG4rXFx0fSBlbHNlIGlmICghcmVjdXJzaXZlKSB7XFxuIFxcdFxcdGludCBkb19wbGFpbl9idGY7XFxuIFxcbiBcXHRcXHRkb19wbGFpbl9idGYgPSBtYXBzX2hhdmVfYnRmKGZkcywgbmJfZmRzKTtcXG5AQCAtOTM2LDcgKzEwMjIsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHR9XFxuIFxcdH1cXG4gXFxuLVxcdGlmICh3dHIgXFx1MDAyNlxcdTAwMjYgbmJfZmRzIFxcdTAwM2UgMSlcXG4rXFx0aWYgKHd0ciBcXHUwMDI2XFx1MDAyNiAobmJfZmRzIFxcdTAwM2UgMSB8fCByZWN1cnNpdmUpKVxcbiBcXHRcXHRqc29ud19zdGFydF9hcnJheSh3dHIpO1xcdC8qIHJvb3QgYXJyYXkgKi9cXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5iX2ZkczsgaSsrKSB7XFxuIFxcdFxcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgXFx1MDAyNmluZm8sIFxcdTAwMjZsZW4pKSB7XFxuQEAgLTk0NCwyMiArMTAzMCw1MCBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHRcXHRlcnIgPSAtMTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdH1cXG4tXFx0XFx0ZXJyID0gbWFwX2R1bXAoZmRzW2ldLCBcXHUwMDI2aW5mbywgd3RyLCBuYl9mZHMgXFx1MDAzZSAxKTtcXG4rXFx0XFx0ZXJyID0gbWFwX2R1bXAoZmRzW2ldLCBcXHUwMDI2aW5mbywgd3RyLCBuYl9mZHMgXFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZSxcXG4rXFx0XFx0XFx0ICAgICAgIHJlY3Vyc2l2ZSA/IFxcdTAwMjZjdHggOiBOVUxMKTtcXG4gXFx0XFx0aWYgKCF3dHIgXFx1MDAyNlxcdTAwMjYgaSAhPSBuYl9mZHMgLSAxKVxcbiBcXHRcXHRcXHRwcmludGYoXFxcIlxcXFxuXFxcIik7XFxuIFxcbiBcXHRcXHRpZiAoZXJyKVxcbiBcXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0Y2xvc2UoZmRzW2ldKTtcXG4rXFx0XFx0LyogS2VlcCBzZWxlY3RlZCBtYXBzIGFsaXZlIHdoaWxlIHZpc2l0aW5nIHRoZWlyIGlubmVyIG1hcHMuICovXFxuK1xcdFxcdGlmICghcmVjdXJzaXZlKVxcbitcXHRcXHRcXHRjbG9zZShmZHNbaV0pO1xcbitcXHR9XFxuK1xcdGZvciAoaiA9IDA7ICFlcnIgXFx1MDAyNlxcdTAwMjYgaiBcXHUwMDNjIGN0eC5wZW5kaW5nX2NudDsgaisrKSB7XFxuK1xcdFxcdGludCBmZDtcXG4rXFxuK1xcdFxcdGZkID0gYnBmX21hcF9nZXRfZmRfYnlfaWRfb3B0cyhjdHgucGVuZGluZ19pZHNbal0sIFxcdTAwMjZvcHRzKTtcXG4rXFx0XFx0aWYgKGZkIFxcdTAwM2MgMCkge1xcbitcXHRcXHRcXHRwX2VycihcXFwiY2FuJ3Qgb3BlbiBpbm5lciBtYXAgaWQgJXU6ICVzXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgY3R4LnBlbmRpbmdfaWRzW2pdLCBzdHJlcnJvcihlcnJubykpO1xcbitcXHRcXHRcXHRlcnIgPSAtMTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4rXFx0XFx0bGVuID0gc2l6ZW9mKGluZm8pO1xcbitcXHRcXHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXFx1MDAyNmluZm8sIFxcdTAwMjZsZW4pKSB7XFxuK1xcdFxcdFxcdHBfZXJyKFxcXCJjYW4ndCBnZXQgbWFwIGluZm86ICVzXFxcIiwgc3RyZXJyb3IoZXJybm8pKTtcXG4rXFx0XFx0XFx0ZXJyID0gLTE7XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdGlmICghd3RyKVxcbitcXHRcXHRcXHRcXHRwcmludGYoXFxcIlxcXFxuXFxcIik7XFxuK1xcdFxcdFxcdGVyciA9IG1hcF9kdW1wKGZkLCBcXHUwMDI2aW5mbywgd3RyLCB0cnVlLCBcXHUwMDI2Y3R4KTtcXG4rXFx0XFx0fVxcbitcXHRcXHRjbG9zZShmZCk7XFxuIFxcdH1cXG4tXFx0aWYgKHd0ciBcXHUwMDI2XFx1MDAyNiBuYl9mZHMgXFx1MDAzZSAxKVxcbitcXHRpZiAod3RyIFxcdTAwMjZcXHUwMDI2IChuYl9mZHMgXFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZSkpXFxuIFxcdFxcdGpzb253X2VuZF9hcnJheSh3dHIpO1xcdC8qIHJvb3QgYXJyYXkgKi9cXG4gXFxuIFxcdGlmIChidGZfd3RyKVxcbiBcXHRcXHRqc29ud19kZXN0cm95KFxcdTAwMjZidGZfd3RyKTtcXG4gZXhpdF9jbG9zZTpcXG4rXFx0aWYgKHJlY3Vyc2l2ZSlcXG4rXFx0XFx0aSA9IDA7XFxuIFxcdGZvciAoOyBpIFxcdTAwM2MgbmJfZmRzOyBpKyspXFxuIFxcdFxcdGNsb3NlKGZkc1tpXSk7XFxuK1xcdGhhc2htYXBfX2ZyZWUoY3R4LnNlZW4pO1xcbitcXHRmcmVlKGN0eC5wZW5kaW5nX2lkcyk7XFxuIGV4aXRfZnJlZTpcXG4gXFx0ZnJlZShmZHMpO1xcbiBcXHRmcmVlX2J0Zl92bWxpbnV4KCk7XFxuQEAgLTE0ODQsNyArMTU5OCw3IEBAIHN0YXRpYyBpbnQgZG9faGVscChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdFxcXCIgICAgICAgICAgICAgICAgIHRhc2tfc3RvcmFnZSB8IGJsb29tX2ZpbHRlciB8IHVzZXJfcmluZ2J1ZiB8IGNncnBfc3RvcmFnZSB8IGFyZW5hIHxcXFxcblxcXCJcXG4gXFx0XFx0XFxcIiAgICAgICAgICAgICAgICAgaW5zbl9hcnJheSB8IHJoYXNoIH1cXFxcblxcXCJcXG4gXFx0XFx0XFxcIiAgICAgICBcXFwiIEhFTFBfU1BFQ19PUFRJT05TIFxcXCIgfFxcXFxuXFxcIlxcbi1cXHRcXHRcXFwiICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB9XFxcXG5cXFwiXFxuK1xcdFxcdFxcXCIgICAgICAgICAgICAgICAgICAgIHstZnwtLWJwZmZzfSB8IHstbnwtLW5vbW91bnR9IHwgey1yfC0tcmVjdXJzaXZlfSB9XFxcXG5cXFwiXFxuIFxcdFxcdFxcXCJcXFwiLFxcbiBcXHRcXHRiaW5fbmFtZSwgYXJndlstMl0pO1xcbiBcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi4zMzBhMzM0NDc3MGQxXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY1xcbkBAIC0wLDAgKzEsNDE5IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4rI2luY2x1ZGUgXFx1MDAzY3Rlc3RfcHJvZ3MuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZnRvb2xfaGVscGVycy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2J0Zi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3Jlc291cmNlLmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIE9VVFBVVF9TSVpFIDgxOTJcXG4rXFxuK3N0YXRpYyBib29sIGR1bXBfbWFwKF9fdTMyIGlkLCBjb25zdCBjaGFyICpvcHRpb25zLCBjaGFyICpvdXRwdXQpXFxuK3tcXG4rXFx0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dO1xcbitcXG4rXFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwiJXMgbWFwIGR1bXAgaWQgJXVcXFwiLCBvcHRpb25zLCBpZCk7XFxuK1xcdG1lbXNldChvdXRwdXQsIDAsIE9VVFBVVF9TSVpFKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBPVVRQVVRfU0laRSAtIDEpLFxcbitcXHRcXHQgICAgICAgXFxcImR1bXBfbWFwXFxcIikpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0LyogVGhlIGhlbHBlciBkb2Vzbid0IHRlcm1pbmF0ZSBvciBzdHJpcCB0aGUgb3V0cHV0LiAqL1xcbitcXHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFxcXCJcXFxcblxcXCIpXSA9ICdcXFxcMCc7XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbitzdGF0aWMgX191MzIgbWFwX2lkKGludCBmZClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcXG4rXFx0X191MzIgbGVuID0gc2l6ZW9mKGluZm8pO1xcbitcXG4rXFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXFx1MDAyNmluZm8sIFxcdTAwMjZsZW4pLCBcXFwibWFwX2luZm9cXFwiKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdHJldHVybiBpbmZvLmlkO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGNvdW50X3Rva2VuKGNvbnN0IGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqdG9rZW4pXFxuK3tcXG4rXFx0aW50IGNvdW50ID0gMDtcXG4rXFxuK1xcdHdoaWxlICgob3V0cHV0ID0gc3Ryc3RyKG91dHB1dCwgdG9rZW4pKSkge1xcbitcXHRcXHRjb3VudCsrO1xcbitcXHRcXHRvdXRwdXQgKz0gc3RybGVuKHRva2VuKTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gY291bnQ7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNoZWNrX3BsYWluKF9fdTMyIHJvb3RfaWQsIF9fdTMyIGlubmVyX2lkLCBjb25zdCBjaGFyICp0eXBlLFxcbitcXHRcXHRcXHRpbnQgZW50cmllcywgYm9vbCB0eXBlZClcXG4re1xcbitcXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIGhlYWRlclsxMjhdO1xcbitcXHRjaGFyIG91dHB1dFtPVVRQVVRfU0laRV0gPSB7fTtcXG4rXFx0Y29uc3QgY2hhciAqcm9vdCwgKmlubmVyO1xcbitcXG4rXFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwiLS1yZWN1cnNpdmUgbWFwIGR1bXAgaWQgJXVcXFwiLCByb290X2lkKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxcbitcXHRcXHQgICAgICAgXFxcInBsYWluX2R1bXBcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCBcXFwiJXU6ICVzICBuYW1lIGR1bXBfb3V0ZXIgIFxcXCIsIHJvb3RfaWQsIHR5cGUpO1xcbitcXHRyb290ID0gc3Ryc3RyKG91dHB1dCwgaGVhZGVyKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHJvb3QsIFxcXCJwbGFpbl9yb290X2hlYWRlclxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdEFTU0VSVF9FUShyb290IC0gb3V0cHV0LCAwLCBcXFwicGxhaW5fcm9vdF9maXJzdFxcXCIpO1xcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBcXFwiaW5uZXJfbWFwX2lkOlxcXCIpLCBlbnRyaWVzLCBcXFwicGxhaW5fcmVmZXJlbmNlc1xcXCIpO1xcbitcXHRpZiAoZW50cmllcykge1xcbitcXHRcXHRzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCBcXFwiJXU6IGhhc2ggIG5hbWUgZHVtcF9pbm5lciAgXFxcIiwgaW5uZXJfaWQpO1xcbitcXHRcXHRpbm5lciA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7XFxuK1xcdFxcdGlmIChBU1NFUlRfT0tfUFRSKGlubmVyLCBcXFwicGxhaW5faW5uZXJfaGVhZGVyXFxcIikpXFxuK1xcdFxcdFxcdEFTU0VSVF9HVChpbm5lciAtIHJvb3QsIDAsIFxcXCJwbGFpbl9pbm5lcl9hZnRlcl9yb290XFxcIik7XFxuK1xcdFxcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIGhlYWRlciksIDEsIFxcXCJwbGFpbl9pbm5lcl9vbmNlXFxcIik7XFxuK1xcdH1cXG4rXFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgXFxcIkZvdW5kIFxcXCIpLCBlbnRyaWVzIFxcdTAwMjZcXHUwMDI2ICF0eXBlZCA/IDIgOiAxLFxcbitcXHRcXHQgIFxcXCJwbGFpbl9tYXBfY291bnRcXFwiKTtcXG4rXFx0aWYgKHR5cGVkKSB7XFxuK1xcdFxcdEFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgXFxcIlxcXFxcXFwia2V5XFxcXFxcXCI6IDBcXFwiLCBcXFwicGxhaW5fYnRmX2tleVxcXCIpO1xcbitcXHRcXHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIFxcXCJcXFxcXFxcInZhbHVlXFxcXFxcXCI6IDE2ODQzMDA5XFxcIiwgXFxcInBsYWluX2J0Zl92YWx1ZVxcXCIpO1xcbitcXHR9XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3Rfb3V0ZXIoZW51bSBicGZfbWFwX3R5cGUgdHlwZSwgaW50IGVudHJpZXMsIGJvb2wgZW1wdHlfaW5uZXIsXFxuK1xcdFxcdCAgICAgICBib29sIHR5cGVkKVxcbit7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xcbitcXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBpbm5lcl9vcHRzKTtcXG4rXFx0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcXG4rXFx0Y2hhciBvdXRlcltPVVRQVVRfU0laRV0sIGlubmVyW09VVFBVVF9TSVpFXSwgb3V0cHV0W09VVFBVVF9TSVpFXTtcXG4rXFx0Y2hhciBleHBlY3RlZFtPVVRQVVRfU0laRSAqIDNdLCByZWZlcmVuY2VbNjRdO1xcbitcXHRjb25zdCBjaGFyICp0eXBlX25hbWUgPSBsaWJicGZfYnBmX21hcF90eXBlX3N0cih0eXBlKTtcXG4rXFx0aW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTE7XFxuK1xcdF9fdTMyIHJvb3RfaWQsIGlubmVyX2lkLCBrZXksIHZhbHVlID0gMHgwMTAxMDEwMTtcXG4rXFxuK1xcdGlmICh0eXBlZCkge1xcbitcXHRcXHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcXFwiY3JlYXRlX2J0ZlxcXCIpIHx8XFxuK1xcdFxcdCAgICAhQVNTRVJUX0VRKGJ0Zl9fYWRkX2ludChidGYsIFxcXCJ1bnNpZ25lZCBpbnRcXFwiLCA0LCAwKSwgMSwgXFxcImJ0Zl9pbnRcXFwiKSB8fFxcbitcXHRcXHQgICAgIUFTU0VSVF9PSyhidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKSwgXFxcImxvYWRfYnRmXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRpbm5lcl9vcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTtcXG4rXFx0XFx0aW5uZXJfb3B0cy5idGZfa2V5X3R5cGVfaWQgPSAxO1xcbitcXHRcXHRpbm5lcl9vcHRzLmJ0Zl92YWx1ZV90eXBlX2lkID0gMTtcXG4rXFx0fVxcbitcXHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcXFwiZHVtcF9pbm5lclxcXCIsIHNpemVvZihrZXkpLFxcbitcXHRcXHRcXHRcXHQgIHNpemVvZih2YWx1ZSksIDIsIFxcdTAwMjZpbm5lcl9vcHRzKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFxcXCJjcmVhdGVfaW5uZXJcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGtleSA9IDA7XFxuK1xcdGlmICghZW1wdHlfaW5uZXIgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShpbm5lcl9mZCwgXFx1MDAyNmtleSwgXFx1MDAyNnZhbHVlLCBCUEZfQU5ZKSxcXG4rXFx0XFx0ICAgICAgIFxcXCJwb3B1bGF0ZV9pbm5lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0b3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDtcXG4rXFx0b3V0ZXJfZmQgPSBicGZfbWFwX2NyZWF0ZSh0eXBlLCBcXFwiZHVtcF9vdXRlclxcXCIsIHNpemVvZihrZXkpLCBzaXplb2YoX191MzIpLFxcbitcXHRcXHRcXHRcXHQgMywgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXFxcImNyZWF0ZV9vdXRlclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0LyogVGhlIHVudXNlZCB0aGlyZCBhcnJheSBzbG90IGFsc28gZXhlcmNpc2VzIGZhaWxlZCBsb29rdXBzLiAqL1xcbitcXHRmb3IgKGtleSA9IDA7IGtleSBcXHUwMDNjIGVudHJpZXM7IGtleSsrKVxcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCBcXHUwMDI2a2V5LCBcXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxcbitcXHRcXHRcXHQgICAgICAgXFxcInBvcHVsYXRlX291dGVyXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTtcXG4rXFx0aW5uZXJfaWQgPSBtYXBfaWQoaW5uZXJfZmQpO1xcbitcXHRpZiAoIXJvb3RfaWQgfHwgIWlubmVyX2lkIHx8ICFkdW1wX21hcChyb290X2lkLCBcXFwiLWpcXFwiLCBvdXRlcikgfHxcXG4rXFx0ICAgICFkdW1wX21hcChpbm5lcl9pZCwgXFxcIi1qXFxcIiwgaW5uZXIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdEFTU0VSVF9FUShvdXRlclswXSwgJ1snLCBcXFwiZGVmYXVsdF9hcnJheVxcXCIpO1xcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIFxcXCJcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6XFxcIiksIDAsIFxcXCJkZWZhdWx0X25vX3dyYXBwZXJcXFwiKTtcXG4rXFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCBcXFwiXFxcXFxcXCJpZFxcXFxcXFwiOlxcXCIpLCAwLCBcXFwiZGVmYXVsdF9ub19oZWFkZXJcXFwiKTtcXG4rXFx0c25wcmludGYocmVmZXJlbmNlLCBzaXplb2YocmVmZXJlbmNlKSwgXFxcIlxcXFxcXFwiaW5uZXJfbWFwX2lkXFxcXFxcXCI6JXVcXFwiLCBpbm5lcl9pZCk7XFxuK1xcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgcmVmZXJlbmNlKSwgZW50cmllcywgXFxcImRlZmF1bHRfcmVmZXJlbmNlc1xcXCIpO1xcbitcXHRpZiAoIWVudHJpZXMpXFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRlciwgXFxcIltdXFxcIiwgXFxcImVtcHR5X291dGVyX2RlZmF1bHRcXFwiKTtcXG4rXFx0aWYgKGVtcHR5X2lubmVyKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEoaW5uZXIsIFxcXCJbXVxcXCIsIFxcXCJlbXB0eV9pbm5lcl9kZWZhdWx0XFxcIik7XFxuK1xcdGVsc2UgaWYgKHR5cGVkKVxcbitcXHRcXHRBU1NFUlRfSEFTX1NVQlNUUihpbm5lciwgXFxcIlxcXFxcXFwiZm9ybWF0dGVkXFxcXFxcXCI6e1xcXFxcXFwia2V5XFxcXFxcXCI6MCxcXFxcXFxcInZhbHVlXFxcXFxcXCI6MTY4NDMwMDl9XFxcIixcXG4rXFx0XFx0XFx0XFx0ICBcXFwidHlwZWRfaW5uZXJcXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRBU1NFUlRfU1RSRVEoaW5uZXIsXFxuK1xcdFxcdFxcdCAgICAgXFxcIlt7XFxcXFxcXCJrZXlcXFxcXFxcIjpbXFxcXFxcXCIweDAwXFxcXFxcXCIsXFxcXFxcXCIweDAwXFxcXFxcXCIsXFxcXFxcXCIweDAwXFxcXFxcXCIsXFxcXFxcXCIweDAwXFxcXFxcXCJdLFxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiXFxcXFxcXCJ2YWx1ZVxcXFxcXFwiOltcXFxcXFxcIjB4MDFcXFxcXFxcIixcXFxcXFxcIjB4MDFcXFxcXFxcIixcXFxcXFxcIjB4MDFcXFxcXFxcIixcXFxcXFxcIjB4MDFcXFxcXFxcIl19XVxcXCIsXFxuK1xcdFxcdFxcdCAgICAgXFxcIm9yZGluYXJ5X2RlZmF1bHRcXFwiKTtcXG4rXFxuK1xcdC8qIENvbXBhcmUgdGhlIGNvbXBsZXRlIEpTT04gZG9jdW1lbnQ6IGEgZmxhdCBhcnJheSB3aXRoIHRoZSByb290IGZpcnN0LFxcbitcXHQgKiBvbmUgY29weSBvZiB0aGUgc2hhcmVkIGlubmVyIG1hcCwgYW5kIHVuY2hhbmdlZCBlbnRyeSByZXByZXNlbnRhdGlvbnMuXFxuK1xcdCAqL1xcbitcXHRpZiAoZW50cmllcylcXG4rXFx0XFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCIlc1xcXFxcXFwiLFxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiZHVtcF9vdXRlclxcXFxcXFwiLFxcXCJcXG4rXFx0XFx0XFx0IFxcXCJcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6JXN9LHtcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCJoYXNoXFxcXFxcXCIsXFxcIlxcbitcXHRcXHRcXHQgXFxcIlxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiZHVtcF9pbm5lclxcXFxcXFwiLFxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc31dXFxcIixcXG4rXFx0XFx0XFx0IHJvb3RfaWQsIHR5cGVfbmFtZSwgb3V0ZXIsIGlubmVyX2lkLCBpbm5lcik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCIlc1xcXFxcXFwiLFxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiZHVtcF9vdXRlclxcXFxcXFwiLFxcXCJcXG4rXFx0XFx0XFx0IFxcXCJcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6W119XVxcXCIsIHJvb3RfaWQsIHR5cGVfbmFtZSk7XFxuK1xcdGlmIChkdW1wX21hcChyb290X2lkLCBcXFwiLWogLXJcXFwiLCBvdXRwdXQpKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXFxcInJlY3Vyc2l2ZV9qc29uXFxcIik7XFxuK1xcdGlmIChkdW1wX21hcChyb290X2lkLCBcXFwiLS1qc29uIC0tcmVjdXJzaXZlXFxcIiwgb3V0cHV0KSlcXG4rXFx0XFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFxcXCJyZWN1cnNpdmVfbG9uZ19vcHRpb25zXFxcIik7XFxuK1xcdGNoZWNrX3BsYWluKHJvb3RfaWQsIGlubmVyX2lkLCB0eXBlX25hbWUsIGVudHJpZXMsIHR5cGVkKTtcXG4rXFxuK1xcdC8qIFJlY3Vyc2lvbiBvbiBhbiBvcmRpbmFyeSBtYXAgc3RpbGwgZW1pdHMgYSBzaW5nbGUgbWFwIG9iamVjdC4gKi9cXG4rXFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCJoYXNoXFxcXFxcXCIsXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX2lubmVyXFxcXFxcXCIsXFxcIlxcbitcXHRcXHQgXFxcIlxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc31dXFxcIiwgaW5uZXJfaWQsIGlubmVyKTtcXG4rXFx0aWYgKGR1bXBfbWFwKGlubmVyX2lkLCBcXFwiLWogLXJcXFwiLCBvdXRwdXQpKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXFxcIm9yZGluYXJ5X3JlY3Vyc2l2ZVxcXCIpO1xcbitvdXQ6XFxuK1xcdGlmIChvdXRlcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShvdXRlcl9mZCk7XFxuK1xcdGlmIChpbm5lcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShpbm5lcl9mZCk7XFxuK1xcdGJ0Zl9fZnJlZShidGYpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X211bHRpcGxlX3Jvb3RzKHZvaWQpXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XFxuK1xcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgbmFtZVtCUEZfT0JKX05BTUVfTEVOXTtcXG4rXFx0Y2hhciBvdXRwdXRbT1VUUFVUX1NJWkVdID0ge30sIGV4cGVjdGVkW09VVFBVVF9TSVpFICogNF0sIGVsZW1lbnRzW09VVFBVVF9TSVpFXTtcXG4rXFx0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlc1tdID0geyBcXFwiaGFzaFxcXCIsIFxcXCJhcnJheV9vZl9tYXBzXFxcIiwgXFxcImhhc2hfb2ZfbWFwc1xcXCIsIFxcXCJoYXNoXFxcIiB9O1xcbitcXHRpbnQgZmRzW10gPSB7IC0xLCAtMSwgLTEsIC0xIH07XFxuK1xcdF9fdTMyIGlkc1s0XSwga2V5O1xcbitcXHRpbnQgaSwgbGVuID0gMDtcXG4rXFxuK1xcdC8qIFNlbGVjdCB0aGUgZmlyc3QgaW5uZXIgbWFwIGFuZCBib3RoIG91dGVycyBhcyByb290cy4gVGhlIG90aGVyIGlubmVyXFxuK1xcdCAqIG1hcCBtdXN0IGJlIGFwcGVuZGVkIGFmdGVyIGFsbCB0aHJlZSByb290cywgZXZlbiB0aG91Z2ggaXQgaXMgZm91bmRcXG4rXFx0ICogd2hpbGUgZHVtcGluZyB0aGUgZmlyc3Qgb3V0ZXIuIEEgcHJvY2Vzcy1zcGVjaWZpYyBuYW1lIGF2b2lkcyBvdGhlclxcbitcXHQgKiB0ZXN0cycgbWFwcyBqb2luaW5nIHRoZSBzZWxlY3Rpb24uXFxuK1xcdCAqL1xcbitcXHRzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksIFxcXCJkdW1wXyV1XFxcIiwgZ2V0cGlkKCkpO1xcbitcXHRmZHNbMF0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgbmFtZSwgNCwgNCwgMSwgTlVMTCk7XFxuK1xcdGlmICghQVNTRVJUX09LX0ZEKGZkc1swXSwgXFxcImNyZWF0ZV9zZWxlY3RlZF9pbm5lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZmRzWzNdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFxcXCJkdW1wX2Rpc2NvdmVyZWRcXFwiLCA0LCA0LCAxLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzNdLCBcXFwiY3JlYXRlX2Rpc2NvdmVyZWRfaW5uZXJcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdG9wdHMuaW5uZXJfbWFwX2ZkID0gZmRzWzBdO1xcbitcXHRmZHNbMV0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMV0sIFxcXCJjcmVhdGVfYXJyYXlfcm9vdFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZmRzWzJdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMl0sIFxcXCJjcmVhdGVfaGFzaF9yb290XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRmb3IgKGkgPSAxOyBpIFxcdTAwM2M9IDI7IGkrKykge1xcbitcXHRcXHRrZXkgPSAwO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXFx1MDAyNmtleSwgXFx1MDAyNmZkc1swXSwgQlBGX0FOWSksXFxuK1xcdFxcdFxcdCAgICAgICBcXFwicmVmZXJlbmNlX3NlbGVjdGVkX2lubmVyXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRrZXkgPSAxO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXFx1MDAyNmtleSwgXFx1MDAyNmZkc1szXSwgQlBGX0FOWSksXFxuK1xcdFxcdFxcdCAgICAgICBcXFwicmVmZXJlbmNlX2Rpc2NvdmVyZWRfaW5uZXJcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEFSUkFZX1NJWkUoZmRzKTsgaSsrKSB7XFxuK1xcdFxcdGlkc1tpXSA9IG1hcF9pZChmZHNbaV0pO1xcbitcXHRcXHRpZiAoIWlkc1tpXSB8fCAhZHVtcF9tYXAoaWRzW2ldLCBcXFwiLWpcXFwiLCBlbGVtZW50cykpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRsZW4gKz0gc25wcmludGYoZXhwZWN0ZWQgKyBsZW4sIHNpemVvZihleHBlY3RlZCkgLSBsZW4sXFxuK1xcdFxcdFxcdFxcdFxcXCIlc3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCIlc1xcXFxcXFwiLFxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiJXNcXFxcXFxcIixcXFwiXFxuK1xcdFxcdFxcdFxcdFxcXCJcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6JXN9JXNcXFwiLFxcbitcXHRcXHRcXHRcXHRpID8gXFxcIixcXFwiIDogXFxcIltcXFwiLCBpZHNbaV0sIHR5cGVzW2ldLFxcbitcXHRcXHRcXHRcXHRpID09IDMgPyBcXFwiZHVtcF9kaXNjb3ZlcmVkXFxcIiA6IG5hbWUsIGVsZW1lbnRzLCBpID09IDMgPyBcXFwiXVxcXCIgOiBcXFwiXFxcIik7XFxuK1xcdH1cXG4rXFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwiLWogLXIgbWFwIGR1bXAgbmFtZSAlc1xcXCIsIG5hbWUpO1xcbitcXHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcXG4rXFx0XFx0ICAgICAgXFxcImR1bXBfbXVsdGlwbGVfcm9vdHNcXFwiKSkge1xcbitcXHRcXHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFxcXCJcXFxcblxcXCIpXSA9ICdcXFxcMCc7XFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcXFwicm9vdHNfZmlyc3RfYW5kX3NlZWRfZGVkdXBcXFwiKTtcXG4rXFx0fVxcbitvdXQ6XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBBUlJBWV9TSVpFKGZkcyk7IGkrKylcXG4rXFx0XFx0aWYgKGZkc1tpXSBcXHUwMDNlPSAwKVxcbitcXHRcXHRcXHRjbG9zZShmZHNbaV0pO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X3VucmVhZGFibGUoYm9vbCBvdXRlcilcXG4re1xcbitcXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcXG4rXFx0Y2hhciBlbGVtZW50c1tPVVRQVVRfU0laRV0sIG91dHB1dFtPVVRQVVRfU0laRV0sIHJvb3RbT1VUUFVUX1NJWkVdO1xcbitcXHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHBsYWluW09VVFBVVF9TSVpFXSA9IHt9O1xcbitcXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07XFxuK1xcdGludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xLCBsb29rdXBfZXJybm87XFxuK1xcdF9fdTMyIGlubmVyX2lkLCByb290X2lkLCBrZXkgPSAwLCB2YWx1ZTtcXG4rXFxuK1xcdC8qIEV2ZXJ5IGtleSBpcyBlbnVtZXJhYmxlLCBidXQgUEVSRl9FVkVOVF9BUlJBWSBsb29rdXAgcmV0dXJuc1xcbitcXHQgKiBFTk9UU1VQUCAodGhlIGtlcm5lbC1pbnRlcm5hbCBlcnJubykuIENoZWNrIGJvdGggZW50cmllcyBzbyBhblxcbitcXHQgKiBlYXJseSBleGl0IG9uIHRoZSBmaXJzdCBsb29rdXAgZmFpbHVyZSBjYW5ub3QgcGFzcy5cXG4rXFx0ICovXFxuK1xcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVksIFxcXCJkdW1wX3VucmVhZGFibGVcXFwiLFxcbitcXHRcXHRcXHRcXHQgIHNpemVvZihrZXkpLCBzaXplb2YodmFsdWUpLCAyLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFxcXCJjcmVhdGVfdW5yZWFkYWJsZVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFBU1NFUlRfTFQoYnBmX21hcF9sb29rdXBfZWxlbShpbm5lcl9mZCwgXFx1MDAyNmtleSwgXFx1MDAyNnZhbHVlKSwgMCxcXG4rXFx0XFx0ICAgICAgIFxcXCJ1bnJlYWRhYmxlX2xvb2t1cFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0bG9va3VwX2Vycm5vID0gZXJybm87XFxuK1xcdGlmICghQVNTRVJUX05FUShsb29rdXBfZXJybm8sIEVOT0VOVCwgXFxcInVucmVhZGFibGVfbm90X21pc3NpbmdcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlubmVyX2lkID0gbWFwX2lkKGlubmVyX2ZkKTtcXG4rXFx0aWYgKCFpbm5lcl9pZCB8fCAhZHVtcF9tYXAoaW5uZXJfaWQsIFxcXCItalxcXCIsIGVsZW1lbnRzKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdEFTU0VSVF9FUShjb3VudF90b2tlbihlbGVtZW50cywgXFxcIlxcXFxcXFwiZXJyb3JcXFxcXFxcIjpcXFwiKSwgMiwgXFxcImRlZmF1bHRfanNvbl9lcnJvcnNcXFwiKTtcXG4rXFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwibWFwIGR1bXAgaWQgJXVcXFwiLCBpbm5lcl9pZCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIHBsYWluLCBzaXplb2YocGxhaW4pIC0gMSksXFxuK1xcdFxcdCAgICAgICBcXFwiZGVmYXVsdF9wbGFpbl91bnJlYWRhYmxlXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ocGxhaW4sIHN0cmVycm9yKGxvb2t1cF9lcnJubykpLCAyLCBcXFwiZGVmYXVsdF9wbGFpbl9lcnJvcnNcXFwiKTtcXG4rXFx0QVNTRVJUX0hBU19TVUJTVFIocGxhaW4sIFxcXCJGb3VuZCAwIGVsZW1lbnRzXFxcIiwgXFxcImRlZmF1bHRfcGxhaW5fY291bnRcXFwiKTtcXG4rXFxuK1xcdHJvb3RfaWQgPSBpbm5lcl9pZDtcXG4rXFx0aWYgKG91dGVyKSB7XFxuK1xcdFxcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XFxuK1xcdFxcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIFxcXCJkdW1wX291dGVyXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0IHNpemVvZihrZXkpLCBzaXplb2YodmFsdWUpLCAxLCBcXHUwMDI2b3B0cyk7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcXFwiY3JlYXRlX291dGVyXFxcIikgfHxcXG4rXFx0XFx0ICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgXFx1MDAyNmtleSwgXFx1MDAyNmlubmVyX2ZkLCBCUEZfQU5ZKSxcXG4rXFx0XFx0XFx0ICAgICAgIFxcXCJwb3B1bGF0ZV9vdXRlclxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0cm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7XFxuK1xcdFxcdGlmICghcm9vdF9pZCB8fCAhZHVtcF9tYXAocm9vdF9pZCwgXFxcIi1qXFxcIiwgcm9vdCkpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcXG4rXFx0XFx0XFx0IFxcXCJbe1xcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFxcXFxcInR5cGVcXFxcXFxcIjpcXFxcXFxcImFycmF5X29mX21hcHNcXFxcXFxcIixcXFxcXFxcIm5hbWVcXFxcXFxcIjpcXFxcXFxcImR1bXBfb3V0ZXJcXFxcXFxcIixcXFwiXFxuK1xcdFxcdFxcdCBcXFwiXFxcXFxcXCJmbGFnc1xcXFxcXFwiOjAsXFxcXFxcXCJlbGVtZW50c1xcXFxcXFwiOiVzfSx7XFxcXFxcXCJpZFxcXFxcXFwiOiV1LFxcXCJcXG4rXFx0XFx0XFx0IFxcXCJcXFxcXFxcInR5cGVcXFxcXFxcIjpcXFxcXFxcInBlcmZfZXZlbnRfYXJyYXlcXFxcXFxcIixcXFxcXFxcIm5hbWVcXFxcXFxcIjpcXFxcXFxcImR1bXBfdW5yZWFkYWJsZVxcXFxcXFwiLFxcXCJcXG4rXFx0XFx0XFx0IFxcXCJcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6JXN9XVxcXCIsIHJvb3RfaWQsIHJvb3QsIGlubmVyX2lkLCBlbGVtZW50cyk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxcbitcXHRcXHRcXHQgXFxcIlt7XFxcXFxcXCJpZFxcXFxcXFwiOiV1LFxcXFxcXFwidHlwZVxcXFxcXFwiOlxcXFxcXFwicGVyZl9ldmVudF9hcnJheVxcXFxcXFwiLFxcXCJcXG4rXFx0XFx0XFx0IFxcXCJcXFxcXFxcIm5hbWVcXFxcXFxcIjpcXFxcXFxcImR1bXBfdW5yZWFkYWJsZVxcXFxcXFwiLFxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc31dXFxcIixcXG4rXFx0XFx0XFx0IGlubmVyX2lkLCBlbGVtZW50cyk7XFxuK1xcdH1cXG4rXFx0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFxcXCItaiAtclxcXCIsIG91dHB1dCkpXFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcXFwicmVjdXJzaXZlX3VucmVhZGFibGVfanNvblxcXCIpO1xcbitcXHRtZW1zZXQob3V0cHV0LCAwLCBzaXplb2Yob3V0cHV0KSk7XFxuK1xcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXFxcIi1yIG1hcCBkdW1wIGlkICV1XFxcIiwgcm9vdF9pZCk7XFxuK1xcdGlmIChBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxcbitcXHRcXHQgICAgICBcXFwicmVjdXJzaXZlX3VucmVhZGFibGVfcGxhaW5cXFwiKSkge1xcbitcXHRcXHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIHBsYWluLCBcXFwicmVjdXJzaXZlX3BsYWluX3ByZXNlcnZlc19lcnJvcnNcXFwiKTtcXG4rXFx0XFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgc3RyZXJyb3IobG9va3VwX2Vycm5vKSksIDIsXFxuK1xcdFxcdFxcdCAgXFxcInJlY3Vyc2l2ZV9wbGFpbl9lcnJvcnNcXFwiKTtcXG4rXFx0XFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgXFxcIkZvdW5kIFxcXCIpLCBvdXRlciA/IDIgOiAxLFxcbitcXHRcXHRcXHQgIFxcXCJyZWN1cnNpdmVfcGxhaW5fbWFwc1xcXCIpO1xcbitcXHR9XFxuK291dDpcXG4rXFx0aWYgKG91dGVyX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKG91dGVyX2ZkKTtcXG4rXFx0aWYgKGlubmVyX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKGlubmVyX2ZkKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9tYW55X2lubmVyX21hcHMoYm9vbCBqc29uKVxcbit7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xcbitcXHRjb25zdCBzdHJ1Y3QgcmxpbWl0IGxpbWl0ID0geyAucmxpbV9jdXIgPSAzMiwgLnJsaW1fbWF4ID0gMzIgfTtcXG4rXFx0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCB0b2tlbls2NF07XFxuK1xcdF9fdTMyIGlkc1s2NF0sIHJvb3RfaWQsIGtleTtcXG4rXFx0aW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTEsIHN0YXR1cztcXG4rXFx0Y2hhciAqb3V0cHV0ID0gTlVMTDtcXG4rXFx0cGlkX3QgcGlkO1xcbitcXG4rXFx0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXFxcImR1bXBfaW5uZXJcXFwiLCA0LCA0LCAxLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFxcXCJjcmVhdGVfdGVtcGxhdGVcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XFxuK1xcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIFxcXCJkdW1wX291dGVyXFxcIiwgNCwgNCxcXG4rXFx0XFx0XFx0XFx0IEFSUkFZX1NJWkUoaWRzKSwgXFx1MDAyNm9wdHMpO1xcbitcXHRjbG9zZShpbm5lcl9mZCk7XFxuK1xcdGlubmVyX2ZkID0gLTE7XFxuK1xcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcXFwiY3JlYXRlX291dGVyXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRmb3IgKGtleSA9IDA7IGtleSBcXHUwMDNjIEFSUkFZX1NJWkUoaWRzKTsga2V5KyspIHtcXG4rXFx0XFx0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXFxcImR1bXBfaW5uZXJcXFwiLCA0LCA0LCAxLCBOVUxMKTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFxcXCJjcmVhdGVfaW5uZXJcXFwiKSB8fFxcbitcXHRcXHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCBcXHUwMDI2a2V5LCBcXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxcbitcXHRcXHRcXHQgICAgICAgXFxcInBvcHVsYXRlX291dGVyXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRpZHNba2V5XSA9IG1hcF9pZChpbm5lcl9mZCk7XFxuK1xcdFxcdGlmICghaWRzW2tleV0pXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHQvKiBUaGUgb3V0ZXIgbWFwIGtlZXBzIGVhY2ggZGlzdGluY3QgaW5uZXIgbWFwIGFsaXZlLiAqL1xcbitcXHRcXHRjbG9zZShpbm5lcl9mZCk7XFxuK1xcdFxcdGlubmVyX2ZkID0gLTE7XFxuK1xcdH1cXG4rXFx0cm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7XFxuK1xcdG91dHB1dCA9IGNhbGxvYygxLCA2NTUzNik7XFxuK1xcdGlmICghcm9vdF9pZCB8fCAhQVNTRVJUX09LX1BUUihvdXRwdXQsIFxcXCJhbGxvY2F0ZV9vdXRwdXRcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHQvKiBDcmVhdGUgYWxsIGZpeHR1cmVzIGJlZm9yZSBsb3dlcmluZyB0aGUgbGltaXQsIGFuZCBrZWVwIHRoZSB0ZXN0XFxuK1xcdCAqIHJ1bm5lcidzIGxpbWl0IHVuY2hhbmdlZC4gUmV0YWluaW5nIGV2ZXJ5IGRpc2NvdmVyZWQgRkQgd291bGQgZXhjZWVkXFxuK1xcdCAqIHRoaXMgbGltaXQgYmVmb3JlIHRoZSByZWN1cnNpdmUgZHVtcCBjb3VsZCB2aXNpdCBhbGwgaW5uZXIgbWFwcy5cXG4rXFx0ICovXFxuK1xcdHBpZCA9IGZvcmsoKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UocGlkLCAwLCBcXFwiZm9ya1xcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFwaWQpIHtcXG4rXFx0XFx0Y2xvc2Uob3V0ZXJfZmQpO1xcbitcXHRcXHRpZiAoc2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUsIFxcdTAwMjZsaW1pdCkpXFxuK1xcdFxcdFxcdF9leGl0KDEpO1xcbitcXHRcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCIlcyAtciBtYXAgZHVtcCBpZCAldVxcXCIsXFxuK1xcdFxcdFxcdCBqc29uID8gXFxcIi1qXFxcIiA6IFxcXCJcXFwiLCByb290X2lkKTtcXG4rXFx0XFx0aWYgKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgNjU1MzUpKVxcbitcXHRcXHRcXHRfZXhpdCgyKTtcXG4rXFx0XFx0aWYgKGNvdW50X3Rva2VuKG91dHB1dCwganNvbiA/IFxcXCJcXFxcXFxcImlkXFxcXFxcXCI6XFxcIiA6IFxcXCJGb3VuZCBcXFwiKSAhPSBBUlJBWV9TSVpFKGlkcykgKyAxIHx8XFxuK1xcdFxcdCAgICBjb3VudF90b2tlbihvdXRwdXQsIGpzb24gPyBcXFwiXFxcXFxcXCJpbm5lcl9tYXBfaWRcXFxcXFxcIjpcXFwiIDogXFxcImlubmVyX21hcF9pZDpcXFwiKSAhPVxcbitcXHRcXHQgICAgQVJSQVlfU0laRShpZHMpKVxcbitcXHRcXHRcXHRfZXhpdCgzKTtcXG4rXFx0XFx0Zm9yIChrZXkgPSAwOyBrZXkgXFx1MDAzYyBBUlJBWV9TSVpFKGlkcyk7IGtleSsrKSB7XFxuK1xcdFxcdFxcdGlmIChqc29uKVxcbitcXHRcXHRcXHRcXHRzbnByaW50Zih0b2tlbiwgc2l6ZW9mKHRva2VuKSwgXFxcIlxcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFwiLCBpZHNba2V5XSk7XFxuK1xcdFxcdFxcdGVsc2VcXG4rXFx0XFx0XFx0XFx0c25wcmludGYodG9rZW4sIHNpemVvZih0b2tlbiksIFxcXCJcXFxcbiV1OiBoYXNoICBuYW1lIGR1bXBfaW5uZXIgIFxcXCIsXFxuK1xcdFxcdFxcdFxcdFxcdCBpZHNba2V5XSk7XFxuK1xcdFxcdFxcdGlmIChjb3VudF90b2tlbihvdXRwdXQsIHRva2VuKSAhPSAxKVxcbitcXHRcXHRcXHRcXHRfZXhpdCg0KTtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAoanNvbiBcXHUwMDI2XFx1MDAyNiAob3V0cHV0WzBdICE9ICdbJyB8fFxcbitcXHRcXHRcXHQgICAgIHN0cmNtcChvdXRwdXQgKyBzdHJsZW4ob3V0cHV0KSAtIDIsIFxcXCJdXFxcXG5cXFwiKSkpXFxuK1xcdFxcdFxcdF9leGl0KDUpO1xcbitcXHRcXHRfZXhpdCgwKTtcXG4rXFx0fVxcbitcXHRpZiAoQVNTRVJUX0VRKHdhaXRwaWQocGlkLCBcXHUwMDI2c3RhdHVzLCAwKSwgcGlkLCBcXFwid2FpdHBpZFxcXCIpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXFxcImNoaWxkX2V4aXRlZFxcXCIpKVxcbitcXHRcXHRBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSwgMCwgXFxcImR1bXBfd2l0aF9sb3dfZmRfbGltaXRcXFwiKTtcXG4rb3V0OlxcbitcXHRmcmVlKG91dHB1dCk7XFxuK1xcdGlmIChvdXRlcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShvdXRlcl9mZCk7XFxuK1xcdGlmIChpbm5lcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShpbm5lcl9mZCk7XFxuK31cXG4rXFxuK3ZvaWQgdGVzdF9icGZ0b29sX21hcF9kdW1wKHZvaWQpXFxuK3tcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInVucmVhZGFibGVfb3JkaW5hcnlcXFwiKSlcXG4rXFx0XFx0dGVzdF91bnJlYWRhYmxlKGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInVucmVhZGFibGVfaW5uZXJcXFwiKSlcXG4rXFx0XFx0dGVzdF91bnJlYWRhYmxlKHRydWUpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwibWFueV9pbm5lcl9tYXBzX2pzb25cXFwiKSlcXG4rXFx0XFx0dGVzdF9tYW55X2lubmVyX21hcHModHJ1ZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJtYW55X2lubmVyX21hcHNfcGxhaW5cXFwiKSlcXG4rXFx0XFx0dGVzdF9tYW55X2lubmVyX21hcHMoZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwibXVsdGlwbGVfcm9vdHNcXFwiKSlcXG4rXFx0XFx0dGVzdF9tdWx0aXBsZV9yb290cygpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiYXJyYXlfb2ZfbWFwc1xcXCIpKVxcbitcXHRcXHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiaGFzaF9vZl9tYXBzXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInNoYXJlZF9pbm5lclxcXCIpKVxcbitcXHRcXHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAyLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiZW1wdHlfYXJyYXlfb2ZfbWFwc1xcXCIpKVxcbitcXHRcXHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiZW1wdHlfaGFzaF9vZl9tYXBzXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMCwgZmFsc2UsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImJ0Zl9pbm5lclxcXCIpKVxcbitcXHRcXHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIGZhbHNlLCB0cnVlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImVtcHR5X2lubmVyXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgdHJ1ZSwgZmFsc2UpO1xcbit9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDAxOjIzOjU5LjkzMTE0MDI5OFoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6NDQxMjg0MDk1NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xzIGFuZCBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbCBjb2RlIG9yIGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNDIyZmE1Nzg2ZjVjMTJiYTE1MjNkYmQ4ZTUwZTdmYzlkMjViZmVlZFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDcgMDE6MjM6NTggMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdCBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG5pbmRleCA1ZGFmM2RlNWM3NDQ2Li4zOGQxZjU0MmJmNWE1IDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG5AQCAtMTYsNyArMTYsNyBAQCBTWU5PUFNJU1xuIFxuICoqYnBmdG9vbCoqIFsqT1BUSU9OUypdICoqbWFwKiogKkNPTU1BTkQqXG4gXG4tKk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8IHsgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IH1cbisqT1BUSU9OUyogOj0geyB8Q09NTU9OX09QVElPTlN8IHwgeyAqKi1mKiogfCAqKi0tYnBmZnMqKiB9IHwgeyAqKi1uKiogfCAqKi0tbm9tb3VudCoqIH0gfCB7ICoqLXIqKiB8ICoqLS1yZWN1cnNpdmUqKiB9IH1cbiBcbiAqQ09NTUFORFMqIDo9XG4geyAqKnNob3cqKiB8ICoqbGlzdCoqIHwgKipjcmVhdGUqKiB8ICoqZHVtcCoqIHwgKip1cGRhdGUqKiB8ICoqbG9va3VwKiogfCAqKmdldG5leHQqKiB8XG5AQCAtMTcwLDYgKzE3MCwyNSBAQCBPUFRJT05TXG4gICAgIERvIG5vdCBhdXRvbWF0aWNhbGx5IGF0dGVtcHQgdG8gbW91bnQgYW55IHZpcnR1YWwgZmlsZSBzeXN0ZW0gKHN1Y2ggYXNcbiAgICAgdHJhY2VmcyBvciBCUEYgdmlydHVhbCBmaWxlIHN5c3RlbSkgd2hlbiBuZWNlc3NhcnkuXG4gXG4rLXIsIC0tcmVjdXJzaXZlXG4rICAgIEFsc28gZHVtcCB0aGUgaW5uZXIgbWFwcyByZWZlcmVuY2VkIGJ5ICoqYXJyYXlfb2ZfbWFwcyoqIGFuZCAqKmhhc2hfb2ZfbWFwcyoqXG4rICAgIGVudHJpZXMgd2hlbiBydW5uaW5nICoqbWFwIGR1bXAqKi4gRWFjaCBtYXAgSUQgaXMgdmlzaXRlZCBvbmNlLCBldmVuIGlmXG4rICAgIHNldmVyYWwgZW50cmllcyByZWZlciB0byBpdC4gU2VsZWN0ZWQgbWFwcyBhcmUgZm9sbG93ZWQgYnkgdGhlaXIgaW5uZXIgbWFwcy5cbitcbisgICAgUGxhaW4gb3V0cHV0IGluY2x1ZGVzIGEgaGVhZGVyIGlkZW50aWZ5aW5nIGVhY2ggbWFwLiBPbiBzdWNjZXNzLCBKU09OIG91dHB1dFxuKyAgICBpcyBhbHdheXMgYW4gYXJyYXkgb2YgbWFwIG9iamVjdHMsIGVhY2ggY29udGFpbmluZyBhbiAqKmlkKiogYW5kIGFuXG4rICAgICoqZWxlbWVudHMqKiBhcnJheSwgaW5jbHVkaW5nIHdoZW4gb25seSBvbmUgbWFwIGlzIGR1bXBlZC4gT3V0ZXIgbWFwIGVudHJpZXNcbisgICAgcmV0YWluIHRoZWlyICoqaW5uZXJfbWFwX2lkKiogZmllbGQsIHdoaWNoIGlkZW50aWZpZXMgdGhlIGNvcnJlc3BvbmRpbmcgaW5uZXJcbisgICAgbWFwIG9iamVjdC5cbitcbisgICAgSW5uZXIgbWFwIElEcyBhcmUgcmVzb2x2ZWQgd2hlbiB0aGUgbWFwcyBhcmUgdmlzaXRlZC4gVGhlIGR1bXAgaXMgbm90IGFuXG4rICAgIGF0b21pYyBzbmFwc2hvdDogY29uY3VycmVudCB1cGRhdGVzIGNhbiBjaGFuZ2UgbWFwIGNvbnRlbnRzIG9yIHJlbW92ZSBhXG4rICAgIHJlZmVyZW5jZWQgaW5uZXIgbWFwIGJlZm9yZSBpdCBpcyB2aXNpdGVkLiBGYWlsdXJlIHRvIG9wZW4gYSByZWZlcmVuY2VkXG4rICAgIGlubmVyIG1hcCBzdG9wcyB0aGUgZHVtcCBhbmQgcmV0dXJucyBhIG5vbnplcm8gZXhpdCBzdGF0dXMuIE91dHB1dCBtYXlcbisgICAgY29udGFpbiBtYXBzIG9yIGVudHJpZXMgcHJpbnRlZCBiZWZvcmUgdGhlIGVycm9yLlxuKyAgICBJbiBKU09OIG1vZGUsIGFuIGVycm9yIGR1cmluZyB0cmF2ZXJzYWwgaXMgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBhbmQgdGhlXG4rICAgIGVuY2xvc2luZyBhcnJheXMgYW5kIG9iamVjdHMgYXJlIGNsb3NlZC5cbitcbiBFWEFNUExFU1xuID09PT09PT09XG4gKiojIGJwZnRvb2wgbWFwIHNob3cqKlxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbmluZGV4IDc1Y2JjYjUxMmViYWUuLjQ1YzMzNmQ2M2JlMGEgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbkBAIC0yNjEsNyArMjYxLDcgQEAgX2JwZnRvb2woKVxuIFxuICAgICAjIERlYWwgd2l0aCBvcHRpb25zXG4gICAgIGlmIFtbICR7d29yZHNbY3dvcmRdfSA9PSAtKiBdXTsgdGhlblxuLSAgICAgICAgbG9jYWwgYz0nLS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcbisgICAgICAgIGxvY2FsIGM9Jy0tdmVyc2lvbiAtLWpzb24gLS1wcmV0dHkgLS1yZWN1cnNpdmUgLS1icGZmcyAtLW1hcGNvbXBhdCAtLWRlYnVnIFxcXG4gICAgICAgICAgICAgLS11c2UtbG9hZGVyIC0tYmFzZS1idGYgLS1zaWduIC1pIC1rJ1xuICAgICAgICAgQ09NUFJFUExZPSggJCggY29tcGdlbiAtVyBcIiRjXCIgLS0gXCIkY3VyXCIgKSApXG4gICAgICAgICByZXR1cm4gMFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uY1xuaW5kZXggYzkxZTFhNmUxYTFlYy4uMjkwMjFmNGRkNDUxOCAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uY1xuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jXG5AQCAtMjYsNiArMjYsNyBAQCBzdGF0aWMgaW50ICgqbGFzdF9kb19oZWxwKShpbnQgYXJnYywgY2hhciAqKmFyZ3YpO1xuIGpzb25fd3JpdGVyX3QgKmpzb25fd3RyO1xuIGJvb2wgcHJldHR5X291dHB1dDtcbiBib29sIGpzb25fb3V0cHV0O1xuK2Jvb2wgcmVjdXJzaXZlO1xuIGJvb2wgc2hvd19waW5uZWQ7XG4gYm9vbCBibG9ja19tb3VudDtcbiBib29sIHZlcmlmaWVyX2xvZ3M7XG5AQCAtNDUyLDYgKzQ1Myw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0eyBcImpzb25cIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdqJyB9LFxuIFx0XHR7IFwiaGVscFwiLFx0bm9fYXJndW1lbnQsXHROVUxMLFx0J2gnIH0sXG4gXHRcdHsgXCJwcmV0dHlcIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdwJyB9LFxuK1x0XHR7IFwicmVjdXJzaXZlXCIsXHRub19hcmd1bWVudCxcdE5VTEwsXHQncicgfSxcbiBcdFx0eyBcInZlcnNpb25cIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdWJyB9LFxuIFx0XHR7IFwiYnBmZnNcIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdmJyB9LFxuIFx0XHR7IFwibWFwY29tcGF0XCIsXHRub19hcmd1bWVudCxcdE5VTEwsXHQnbScgfSxcbkBAIC00ODUsNyArNDg3LDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0YmluX25hbWUgPSBcImJwZnRvb2xcIjtcbiBcbiBcdG9wdGVyciA9IDA7XG4tXHR3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsIFwiVmhwamZMbW5kU2k6azpCOmxcIixcbitcdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXCJWaHBqcmZMbW5kU2k6azpCOmxcIixcbiBcdFx0XHRcdCAgb3B0aW9ucywgTlVMTCkpIFx1MDAzZT0gMCkge1xuIFx0XHRzd2l0Y2ggKG9wdCkge1xuIFx0XHRjYXNlICdWJzpcbkBAIC01MDcsNiArNTA5LDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRcdH1cbiBcdFx0XHRqc29ud19wcmV0dHkoanNvbl93dHIsIHByZXR0eV9vdXRwdXQpO1xuIFx0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICdyJzpcbitcdFx0XHRyZWN1cnNpdmUgPSB0cnVlO1xuK1x0XHRcdGJyZWFrO1xuIFx0XHRjYXNlICdmJzpcbiBcdFx0XHRzaG93X3Bpbm5lZCA9IHRydWU7XG4gXHRcdFx0YnJlYWs7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oXG5pbmRleCA3OGI2ZTBlYmI4NWQ4Li5iNWRjNzk2MGNmNjgyIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbkBAIC04Myw2ICs4Myw3IEBAIGV4dGVybiBjb25zdCBjaGFyICpiaW5fbmFtZTtcbiBcbiBleHRlcm4ganNvbl93cml0ZXJfdCAqanNvbl93dHI7XG4gZXh0ZXJuIGJvb2wganNvbl9vdXRwdXQ7XG4rZXh0ZXJuIGJvb2wgcmVjdXJzaXZlO1xuIGV4dGVybiBib29sIHNob3dfcGlubmVkO1xuIGV4dGVybiBib29sIHNob3dfcGlkcztcbiBleHRlcm4gYm9vbCBibG9ja19tb3VudDtcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXAuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG5pbmRleCA2ODRhOGZiNzI0MTQ2Li5mYzA2Yzc2NTk3MzE1IDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG5AQCAtMTcsNiArMTcsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2JwZi9icGYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2JwZi9oYXNobWFwLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvbGliYnBmX2ludGVybmFsLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcImpzb25fd3JpdGVyLmhcIlxuICNpbmNsdWRlIFwibWFpbi5oXCJcbkBAIC04MjYsMTIgKzgyNyw0NCBAQCBzdGF0aWMgdm9pZCBmcmVlX21hcF9rdl9idGYoc3RydWN0IGJ0ZiAqYnRmKVxuIFx0XHRidGZfX2ZyZWUoYnRmKTtcbiB9XG4gXG4rc3RydWN0IG1hcF9kdW1wX2N0eCB7XG4rXHRzdHJ1Y3QgaGFzaG1hcCAqc2VlbjtcbitcdF9fdTMyICpwZW5kaW5nX2lkcztcbitcdHNpemVfdCBwZW5kaW5nX2NudDtcbit9O1xuK1xuK3N0YXRpYyBpbnQgY29sbGVjdF9pbm5lcl9tYXAoc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4LCBfX3UzMiBpZClcbit7XG4rXHRfX3UzMiAqaWRzO1xuK1x0aW50IGVycjtcbitcbitcdGlmIChoYXNobWFwX19maW5kKGN0eC1cdTAwM2VzZWVuLCBpZCwgTlVMTCkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0aWRzID0gbGliYnBmX3JlYWxsb2NhcnJheShjdHgtXHUwMDNlcGVuZGluZ19pZHMsIGN0eC1cdTAwM2VwZW5kaW5nX2NudCArIDEsXG4rXHRcdFx0XHQgc2l6ZW9mKCppZHMpKTtcbitcdGlmICghaWRzKSB7XG4rXHRcdHBfZXJyKFwibWVtIGFsbG9jIGZhaWxlZFwiKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1x0Y3R4LVx1MDAzZXBlbmRpbmdfaWRzID0gaWRzO1xuK1xuK1x0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC1cdTAwM2VzZWVuLCBpZCwgMCk7XG4rXHRpZiAoZXJyKSB7XG4rXHRcdHBfZXJyKFwiZmFpbGVkIHRvIHJlY29yZCBpbm5lciBtYXAgaWQgJXU6ICVzXCIsIGlkLCBzdHJlcnJvcigtZXJyKSk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbitcdGlkc1tjdHgtXHUwMDNlcGVuZGluZ19jbnQrK10gPSBpZDtcbitcdHJldHVybiAwO1xuK31cbitcbiBzdGF0aWMgaW50XG4gbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4tXHQgYm9vbCBzaG93X2hlYWRlcilcbitcdCBib29sIHNob3dfaGVhZGVyLCBzdHJ1Y3QgbWFwX2R1bXBfY3R4ICpjdHgpXG4ge1xuIFx0dm9pZCAqa2V5LCAqdmFsdWUsICpwcmV2X2tleTtcbiBcdHVuc2lnbmVkIGludCBudW1fZWxlbXMgPSAwO1xuK1x0anNvbl93cml0ZXJfdCAqcGxhaW5fYnRmX3d0ciA9IE5VTEw7XG4gXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xuIFx0aW50IGVycjtcbiBcbkBAIC04NDUsNiArODc4LDE3IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFxuIFx0cHJldl9rZXkgPSBOVUxMO1xuIFxuK1x0aWYgKGN0eCBcdTAwMjZcdTAwMjYgIXd0ciBcdTAwMjZcdTAwMjYgKGluZm8tXHUwMDNlYnRmX3ZhbHVlX3R5cGVfaWQgfHxcbitcdFx0XHQgICAgaW5mby1cdTAwM2VidGZfdm1saW51eF92YWx1ZV90eXBlX2lkKSkge1xuK1x0XHRwbGFpbl9idGZfd3RyID0gZ2V0X2J0Zl93cml0ZXIoKTtcbitcdFx0aWYgKHBsYWluX2J0Zl93dHIpIHtcbitcdFx0XHRpZiAoc2hvd19oZWFkZXIpXG4rXHRcdFx0XHRzaG93X21hcF9oZWFkZXJfcGxhaW4oaW5mbyk7XG4rXHRcdFx0c2hvd19oZWFkZXIgPSBmYWxzZTtcbitcdFx0XHR3dHIgPSBwbGFpbl9idGZfd3RyO1xuK1x0XHR9XG4rXHR9XG4rXG4gXHRpZiAod3RyKSB7XG4gXHRcdGVyciA9IGdldF9tYXBfa3ZfYnRmKGluZm8sIFx1MDAyNmJ0Zik7XG4gXHRcdGlmIChlcnIpIHtcbkBAIC04NzQsMTAgKzkxOCwyMCBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbiBcdFx0aWYgKGVycikge1xuIFx0XHRcdGlmIChlcnJubyA9PSBFTk9FTlQpXG4gXHRcdFx0XHRlcnIgPSAwO1xuK1x0XHRcdGVsc2UgaWYgKGN0eClcbitcdFx0XHRcdHBfZXJyKFwiY2FuJ3QgZ2V0IG5leHQga2V5IGZvciBtYXAgaWQgJXU6ICVzXCIsXG4rXHRcdFx0XHQgICAgICBpbmZvLVx1MDAzZWlkLCBzdHJlcnJvcihlcnJubykpO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHR9XG4tXHRcdGlmICghZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpKVxuK1x0XHRlcnIgPSBkdW1wX21hcF9lbGVtKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cik7XG4rXHRcdGlmICghZXJyKSB7XG4gXHRcdFx0bnVtX2VsZW1zKys7XG4rXHRcdFx0aWYgKGN0eCBcdTAwMjZcdTAwMjYgbWFwX2lzX21hcF9vZl9tYXBzKGluZm8tXHUwMDNldHlwZSkpIHtcbitcdFx0XHRcdGVyciA9IGNvbGxlY3RfaW5uZXJfbWFwKGN0eCwgKihfX3UzMiAqKXZhbHVlKTtcbitcdFx0XHRcdGlmIChlcnIpXG4rXHRcdFx0XHRcdGJyZWFrO1xuK1x0XHRcdH1cbitcdFx0fVxuIFx0XHRwcmV2X2tleSA9IGtleTtcbiBcdH1cbiBcbkBAIC04OTQsMTggKzk0OCwyNSBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbiBcdGZyZWUoa2V5KTtcbiBcdGZyZWUodmFsdWUpO1xuIFx0ZnJlZV9tYXBfa3ZfYnRmKGJ0Zik7XG4rXHRpZiAocGxhaW5fYnRmX3d0cilcbitcdFx0anNvbndfZGVzdHJveShcdTAwMjZwbGFpbl9idGZfd3RyKTtcbiBcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4ge1xuK1x0TElCQlBGX09QVFMoYnBmX2dldF9mZF9ieV9pZF9vcHRzLCBvcHRzLFxuK1x0XHQub3Blbl9mbGFncyA9IEJQRl9GX1JET05MWSxcbitcdCk7XG4gXHRqc29uX3dyaXRlcl90ICp3dHIgPSBOVUxMLCAqYnRmX3d0ciA9IE5VTEw7XG4gXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbitcdHN0cnVjdCBtYXBfZHVtcF9jdHggY3R4ID0ge307XG4gXHRpbnQgbmJfZmRzLCBpID0gMDtcbiBcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbiBcdGludCAqZmRzID0gTlVMTDtcbiBcdGludCBlcnIgPSAtMTtcbitcdHNpemVfdCBqO1xuIFxuIFx0aWYgKGFyZ2MgIT0gMilcbiBcdFx0dXNhZ2UoKTtcbkBAIC05MTksOSArOTgwLDM0IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRpZiAobmJfZmRzIFx1MDAzYyAxKVxuIFx0XHRnb3RvIGV4aXRfZnJlZTtcbiBcbitcdGlmIChyZWN1cnNpdmUpIHtcbitcdFx0Y3R4LnNlZW4gPSBoYXNobWFwX19uZXcoaGFzaF9mbl9mb3Jfa2V5X2FzX2lkLFxuK1x0XHRcdFx0XHRlcXVhbF9mbl9mb3Jfa2V5X2FzX2lkLCBOVUxMKTtcbitcdFx0aWYgKElTX0VSUihjdHguc2VlbikpIHtcbitcdFx0XHRjdHguc2VlbiA9IE5VTEw7XG4rXHRcdFx0cF9lcnIoXCJmYWlsZWQgdG8gY3JlYXRlIGhhc2htYXAgZm9yIHJlY3Vyc2l2ZSBkdW1wXCIpO1xuK1x0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbitcdFx0fVxuK1x0XHQvKiBSZWNvcmQgdGhlIHNlbGVjdGVkIG1hcHMgYmVmb3JlIGRpc2NvdmVyaW5nIGFueSBpbm5lciBtYXBzLiAqL1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuYl9mZHM7IGkrKykge1xuK1x0XHRcdGxlbiA9IHNpemVvZihpbmZvKTtcbitcdFx0XHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFx1MDAyNmluZm8sIFx1MDAyNmxlbikpIHtcbitcdFx0XHRcdHBfZXJyKFwiY2FuJ3QgZ2V0IG1hcCBpbmZvOiAlc1wiLCBzdHJlcnJvcihlcnJubykpO1xuK1x0XHRcdFx0ZXJyID0gLTE7XG4rXHRcdFx0XHRnb3RvIGV4aXRfY2xvc2U7XG4rXHRcdFx0fVxuK1x0XHRcdGVyciA9IGhhc2htYXBfX2FkZChjdHguc2VlbiwgaW5mby5pZCwgMCk7XG4rXHRcdFx0aWYgKGVycikge1xuK1x0XHRcdFx0cF9lcnIoXCJmYWlsZWQgdG8gcmVjb3JkIG1hcCBpZCAldTogJXNcIiwgaW5mby5pZCxcbitcdFx0XHRcdCAgICAgIHN0cmVycm9yKC1lcnIpKTtcbitcdFx0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbitcdFx0XHR9XG4rXHRcdH1cbitcdH1cbitcbiBcdGlmIChqc29uX291dHB1dCkge1xuIFx0XHR3dHIgPSBqc29uX3d0cjtcbi1cdH0gZWxzZSB7XG4rXHR9IGVsc2UgaWYgKCFyZWN1cnNpdmUpIHtcbiBcdFx0aW50IGRvX3BsYWluX2J0ZjtcbiBcbiBcdFx0ZG9fcGxhaW5fYnRmID0gbWFwc19oYXZlX2J0ZihmZHMsIG5iX2Zkcyk7XG5AQCAtOTM2LDcgKzEwMjIsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR9XG4gXHR9XG4gXG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4rXHRpZiAod3RyIFx1MDAyNlx1MDAyNiAobmJfZmRzIFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZSkpXG4gXHRcdGpzb253X3N0YXJ0X2FycmF5KHd0cik7XHQvKiByb290IGFycmF5ICovXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuYl9mZHM7IGkrKykge1xuIFx0XHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFx1MDAyNmluZm8sIFx1MDAyNmxlbikpIHtcbkBAIC05NDQsMjIgKzEwMzAsNTAgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHRlcnIgPSAtMTtcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuLVx0XHRlcnIgPSBtYXBfZHVtcChmZHNbaV0sIFx1MDAyNmluZm8sIHd0ciwgbmJfZmRzIFx1MDAzZSAxKTtcbitcdFx0ZXJyID0gbWFwX2R1bXAoZmRzW2ldLCBcdTAwMjZpbmZvLCB3dHIsIG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmUsXG4rXHRcdFx0ICAgICAgIHJlY3Vyc2l2ZSA/IFx1MDAyNmN0eCA6IE5VTEwpO1xuIFx0XHRpZiAoIXd0ciBcdTAwMjZcdTAwMjYgaSAhPSBuYl9mZHMgLSAxKVxuIFx0XHRcdHByaW50ZihcIlxcblwiKTtcbiBcbiBcdFx0aWYgKGVycilcbiBcdFx0XHRicmVhaztcbi1cdFx0Y2xvc2UoZmRzW2ldKTtcbitcdFx0LyogS2VlcCBzZWxlY3RlZCBtYXBzIGFsaXZlIHdoaWxlIHZpc2l0aW5nIHRoZWlyIGlubmVyIG1hcHMuICovXG4rXHRcdGlmICghcmVjdXJzaXZlKVxuK1x0XHRcdGNsb3NlKGZkc1tpXSk7XG4rXHR9XG4rXHRmb3IgKGogPSAwOyAhZXJyIFx1MDAyNlx1MDAyNiBqIFx1MDAzYyBjdHgucGVuZGluZ19jbnQ7IGorKykge1xuK1x0XHRpbnQgZmQ7XG4rXG4rXHRcdGZkID0gYnBmX21hcF9nZXRfZmRfYnlfaWRfb3B0cyhjdHgucGVuZGluZ19pZHNbal0sIFx1MDAyNm9wdHMpO1xuK1x0XHRpZiAoZmQgXHUwMDNjIDApIHtcbitcdFx0XHRwX2VycihcImNhbid0IG9wZW4gaW5uZXIgbWFwIGlkICV1OiAlc1wiLFxuK1x0XHRcdCAgICAgIGN0eC5wZW5kaW5nX2lkc1tqXSwgc3RyZXJyb3IoZXJybm8pKTtcbitcdFx0XHRlcnIgPSAtMTtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1x0XHRsZW4gPSBzaXplb2YoaW5mbyk7XG4rXHRcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcdTAwMjZpbmZvLCBcdTAwMjZsZW4pKSB7XG4rXHRcdFx0cF9lcnIoXCJjYW4ndCBnZXQgbWFwIGluZm86ICVzXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXHRcdFx0ZXJyID0gLTE7XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0aWYgKCF3dHIpXG4rXHRcdFx0XHRwcmludGYoXCJcXG5cIik7XG4rXHRcdFx0ZXJyID0gbWFwX2R1bXAoZmQsIFx1MDAyNmluZm8sIHd0ciwgdHJ1ZSwgXHUwMDI2Y3R4KTtcbitcdFx0fVxuK1x0XHRjbG9zZShmZCk7XG4gXHR9XG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4rXHRpZiAod3RyIFx1MDAyNlx1MDAyNiAobmJfZmRzIFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZSkpXG4gXHRcdGpzb253X2VuZF9hcnJheSh3dHIpO1x0Lyogcm9vdCBhcnJheSAqL1xuIFxuIFx0aWYgKGJ0Zl93dHIpXG4gXHRcdGpzb253X2Rlc3Ryb3koXHUwMDI2YnRmX3d0cik7XG4gZXhpdF9jbG9zZTpcbitcdGlmIChyZWN1cnNpdmUpXG4rXHRcdGkgPSAwO1xuIFx0Zm9yICg7IGkgXHUwMDNjIG5iX2ZkczsgaSsrKVxuIFx0XHRjbG9zZShmZHNbaV0pO1xuK1x0aGFzaG1hcF9fZnJlZShjdHguc2Vlbik7XG4rXHRmcmVlKGN0eC5wZW5kaW5nX2lkcyk7XG4gZXhpdF9mcmVlOlxuIFx0ZnJlZShmZHMpO1xuIFx0ZnJlZV9idGZfdm1saW51eCgpO1xuQEAgLTE0ODQsNyArMTU5OCw3IEBAIHN0YXRpYyBpbnQgZG9faGVscChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdFwiICAgICAgICAgICAgICAgICB0YXNrX3N0b3JhZ2UgfCBibG9vbV9maWx0ZXIgfCB1c2VyX3JpbmdidWYgfCBjZ3JwX3N0b3JhZ2UgfCBhcmVuYSB8XFxuXCJcbiBcdFx0XCIgICAgICAgICAgICAgICAgIGluc25fYXJyYXkgfCByaGFzaCB9XFxuXCJcbiBcdFx0XCIgICAgICAgXCIgSEVMUF9TUEVDX09QVElPTlMgXCIgfFxcblwiXG4tXHRcdFwiICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB9XFxuXCJcbitcdFx0XCIgICAgICAgICAgICAgICAgICAgIHstZnwtLWJwZmZzfSB8IHstbnwtLW5vbW91bnR9IHwgey1yfC0tcmVjdXJzaXZlfSB9XFxuXCJcbiBcdFx0XCJcIixcbiBcdFx0YmluX25hbWUsIGFyZ3ZbLTJdKTtcbiBcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9kdW1wLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9kdW1wLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4zMzBhMzM0NDc3MGQxXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9kdW1wLmNcbkBAIC0wLDAgKzEsNDE5IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZnRvb2xfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2J0Zi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3Jlc291cmNlLmhcdTAwM2VcbitcbisjZGVmaW5lIE9VVFBVVF9TSVpFIDgxOTJcbitcbitzdGF0aWMgYm9vbCBkdW1wX21hcChfX3UzMiBpZCwgY29uc3QgY2hhciAqb3B0aW9ucywgY2hhciAqb3V0cHV0KVxuK3tcbitcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXTtcbitcbitcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCIlcyBtYXAgZHVtcCBpZCAldVwiLCBvcHRpb25zLCBpZCk7XG4rXHRtZW1zZXQob3V0cHV0LCAwLCBPVVRQVVRfU0laRSk7XG4rXHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIE9VVFBVVF9TSVpFIC0gMSksXG4rXHRcdCAgICAgICBcImR1bXBfbWFwXCIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHQvKiBUaGUgaGVscGVyIGRvZXNuJ3QgdGVybWluYXRlIG9yIHN0cmlwIHRoZSBvdXRwdXQuICovXG4rXHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFwiXFxuXCIpXSA9ICdcXDAnO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyBfX3UzMiBtYXBfaWQoaW50IGZkKVxuK3tcbitcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuK1x0X191MzIgbGVuID0gc2l6ZW9mKGluZm8pO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSwgXCJtYXBfaW5mb1wiKSlcbitcdFx0cmV0dXJuIDA7XG4rXHRyZXR1cm4gaW5mby5pZDtcbit9XG4rXG4rc3RhdGljIGludCBjb3VudF90b2tlbihjb25zdCBjaGFyICpvdXRwdXQsIGNvbnN0IGNoYXIgKnRva2VuKVxuK3tcbitcdGludCBjb3VudCA9IDA7XG4rXG4rXHR3aGlsZSAoKG91dHB1dCA9IHN0cnN0cihvdXRwdXQsIHRva2VuKSkpIHtcbitcdFx0Y291bnQrKztcbitcdFx0b3V0cHV0ICs9IHN0cmxlbih0b2tlbik7XG4rXHR9XG4rXHRyZXR1cm4gY291bnQ7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNoZWNrX3BsYWluKF9fdTMyIHJvb3RfaWQsIF9fdTMyIGlubmVyX2lkLCBjb25zdCBjaGFyICp0eXBlLFxuK1x0XHRcdGludCBlbnRyaWVzLCBib29sIHR5cGVkKVxuK3tcbitcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgaGVhZGVyWzEyOF07XG4rXHRjaGFyIG91dHB1dFtPVVRQVVRfU0laRV0gPSB7fTtcbitcdGNvbnN0IGNoYXIgKnJvb3QsICppbm5lcjtcbitcbitcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCItLXJlY3Vyc2l2ZSBtYXAgZHVtcCBpZCAldVwiLCByb290X2lkKTtcbitcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcbitcdFx0ICAgICAgIFwicGxhaW5fZHVtcFwiKSlcbitcdFx0cmV0dXJuO1xuK1x0c25wcmludGYoaGVhZGVyLCBzaXplb2YoaGVhZGVyKSwgXCIldTogJXMgIG5hbWUgZHVtcF9vdXRlciAgXCIsIHJvb3RfaWQsIHR5cGUpO1xuK1x0cm9vdCA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIocm9vdCwgXCJwbGFpbl9yb290X2hlYWRlclwiKSlcbitcdFx0cmV0dXJuO1xuK1x0QVNTRVJUX0VRKHJvb3QgLSBvdXRwdXQsIDAsIFwicGxhaW5fcm9vdF9maXJzdFwiKTtcbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFwiaW5uZXJfbWFwX2lkOlwiKSwgZW50cmllcywgXCJwbGFpbl9yZWZlcmVuY2VzXCIpO1xuK1x0aWYgKGVudHJpZXMpIHtcbitcdFx0c25wcmludGYoaGVhZGVyLCBzaXplb2YoaGVhZGVyKSwgXCIldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICBcIiwgaW5uZXJfaWQpO1xuK1x0XHRpbm5lciA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7XG4rXHRcdGlmIChBU1NFUlRfT0tfUFRSKGlubmVyLCBcInBsYWluX2lubmVyX2hlYWRlclwiKSlcbitcdFx0XHRBU1NFUlRfR1QoaW5uZXIgLSByb290LCAwLCBcInBsYWluX2lubmVyX2FmdGVyX3Jvb3RcIik7XG4rXHRcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIGhlYWRlciksIDEsIFwicGxhaW5faW5uZXJfb25jZVwiKTtcbitcdH1cbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFwiRm91bmQgXCIpLCBlbnRyaWVzIFx1MDAyNlx1MDAyNiAhdHlwZWQgPyAyIDogMSxcbitcdFx0ICBcInBsYWluX21hcF9jb3VudFwiKTtcbitcdGlmICh0eXBlZCkge1xuK1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIFwiXFxcImtleVxcXCI6IDBcIiwgXCJwbGFpbl9idGZfa2V5XCIpO1xuK1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIFwiXFxcInZhbHVlXFxcIjogMTY4NDMwMDlcIiwgXCJwbGFpbl9idGZfdmFsdWVcIik7XG4rXHR9XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3Rfb3V0ZXIoZW51bSBicGZfbWFwX3R5cGUgdHlwZSwgaW50IGVudHJpZXMsIGJvb2wgZW1wdHlfaW5uZXIsXG4rXHRcdCAgICAgICBib29sIHR5cGVkKVxuK3tcbitcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xuK1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgaW5uZXJfb3B0cyk7XG4rXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xuK1x0Y2hhciBvdXRlcltPVVRQVVRfU0laRV0sIGlubmVyW09VVFBVVF9TSVpFXSwgb3V0cHV0W09VVFBVVF9TSVpFXTtcbitcdGNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcmVmZXJlbmNlWzY0XTtcbitcdGNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IGxpYmJwZl9icGZfbWFwX3R5cGVfc3RyKHR5cGUpO1xuK1x0aW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTE7XG4rXHRfX3UzMiByb290X2lkLCBpbm5lcl9pZCwga2V5LCB2YWx1ZSA9IDB4MDEwMTAxMDE7XG4rXG4rXHRpZiAodHlwZWQpIHtcbitcdFx0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcbitcdFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJjcmVhdGVfYnRmXCIpIHx8XG4rXHRcdCAgICAhQVNTRVJUX0VRKGJ0Zl9fYWRkX2ludChidGYsIFwidW5zaWduZWQgaW50XCIsIDQsIDApLCAxLCBcImJ0Zl9pbnRcIikgfHxcbitcdFx0ICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksIFwibG9hZF9idGZcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGlubmVyX29wdHMuYnRmX2ZkID0gYnRmX19mZChidGYpO1xuK1x0XHRpbm5lcl9vcHRzLmJ0Zl9rZXlfdHlwZV9pZCA9IDE7XG4rXHRcdGlubmVyX29wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxO1xuK1x0fVxuK1x0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCJkdW1wX2lubmVyXCIsIHNpemVvZihrZXkpLFxuK1x0XHRcdFx0ICBzaXplb2YodmFsdWUpLCAyLCBcdTAwMjZpbm5lcl9vcHRzKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcImNyZWF0ZV9pbm5lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRrZXkgPSAwO1xuK1x0aWYgKCFlbXB0eV9pbm5lciBcdTAwMjZcdTAwMjZcbitcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oaW5uZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxuK1x0XHQgICAgICAgXCJwb3B1bGF0ZV9pbm5lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRvcHRzLmlubmVyX21hcF9mZCA9IGlubmVyX2ZkO1xuK1x0b3V0ZXJfZmQgPSBicGZfbWFwX2NyZWF0ZSh0eXBlLCBcImR1bXBfb3V0ZXJcIiwgc2l6ZW9mKGtleSksIHNpemVvZihfX3UzMiksXG4rXHRcdFx0XHQgMywgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXCJjcmVhdGVfb3V0ZXJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0LyogVGhlIHVudXNlZCB0aGlyZCBhcnJheSBzbG90IGFsc28gZXhlcmNpc2VzIGZhaWxlZCBsb29rdXBzLiAqL1xuK1x0Zm9yIChrZXkgPSAwOyBrZXkgXHUwMDNjIGVudHJpZXM7IGtleSsrKVxuK1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCBcdTAwMjZrZXksIFx1MDAyNmlubmVyX2ZkLCBCUEZfQU5ZKSxcbitcdFx0XHQgICAgICAgXCJwb3B1bGF0ZV9vdXRlclwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xuK1x0aW5uZXJfaWQgPSBtYXBfaWQoaW5uZXJfZmQpO1xuK1x0aWYgKCFyb290X2lkIHx8ICFpbm5lcl9pZCB8fCAhZHVtcF9tYXAocm9vdF9pZCwgXCItalwiLCBvdXRlcikgfHxcbitcdCAgICAhZHVtcF9tYXAoaW5uZXJfaWQsIFwiLWpcIiwgaW5uZXIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdEFTU0VSVF9FUShvdXRlclswXSwgJ1snLCBcImRlZmF1bHRfYXJyYXlcIik7XG4rXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIFwiXFxcImVsZW1lbnRzXFxcIjpcIiksIDAsIFwiZGVmYXVsdF9ub193cmFwcGVyXCIpO1xuK1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCBcIlxcXCJpZFxcXCI6XCIpLCAwLCBcImRlZmF1bHRfbm9faGVhZGVyXCIpO1xuK1x0c25wcmludGYocmVmZXJlbmNlLCBzaXplb2YocmVmZXJlbmNlKSwgXCJcXFwiaW5uZXJfbWFwX2lkXFxcIjoldVwiLCBpbm5lcl9pZCk7XG4rXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIHJlZmVyZW5jZSksIGVudHJpZXMsIFwiZGVmYXVsdF9yZWZlcmVuY2VzXCIpO1xuK1x0aWYgKCFlbnRyaWVzKVxuK1x0XHRBU1NFUlRfU1RSRVEob3V0ZXIsIFwiW11cIiwgXCJlbXB0eV9vdXRlcl9kZWZhdWx0XCIpO1xuK1x0aWYgKGVtcHR5X2lubmVyKVxuK1x0XHRBU1NFUlRfU1RSRVEoaW5uZXIsIFwiW11cIiwgXCJlbXB0eV9pbm5lcl9kZWZhdWx0XCIpO1xuK1x0ZWxzZSBpZiAodHlwZWQpXG4rXHRcdEFTU0VSVF9IQVNfU1VCU1RSKGlubmVyLCBcIlxcXCJmb3JtYXR0ZWRcXFwiOntcXFwia2V5XFxcIjowLFxcXCJ2YWx1ZVxcXCI6MTY4NDMwMDl9XCIsXG4rXHRcdFx0XHQgIFwidHlwZWRfaW5uZXJcIik7XG4rXHRlbHNlXG4rXHRcdEFTU0VSVF9TVFJFUShpbm5lcixcbitcdFx0XHQgICAgIFwiW3tcXFwia2V5XFxcIjpbXFxcIjB4MDBcXFwiLFxcXCIweDAwXFxcIixcXFwiMHgwMFxcXCIsXFxcIjB4MDBcXFwiXSxcIlxuK1x0XHRcdCAgICAgXCJcXFwidmFsdWVcXFwiOltcXFwiMHgwMVxcXCIsXFxcIjB4MDFcXFwiLFxcXCIweDAxXFxcIixcXFwiMHgwMVxcXCJdfV1cIixcbitcdFx0XHQgICAgIFwib3JkaW5hcnlfZGVmYXVsdFwiKTtcbitcbitcdC8qIENvbXBhcmUgdGhlIGNvbXBsZXRlIEpTT04gZG9jdW1lbnQ6IGEgZmxhdCBhcnJheSB3aXRoIHRoZSByb290IGZpcnN0LFxuK1x0ICogb25lIGNvcHkgb2YgdGhlIHNoYXJlZCBpbm5lciBtYXAsIGFuZCB1bmNoYW5nZWQgZW50cnkgcmVwcmVzZW50YXRpb25zLlxuK1x0ICovXG4rXHRpZiAoZW50cmllcylcbitcdFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4rXHRcdFx0IFwiW3tcXFwiaWRcXFwiOiV1LFxcXCJ0eXBlXFxcIjpcXFwiJXNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiZHVtcF9vdXRlclxcXCIsXCJcbitcdFx0XHQgXCJcXFwiZmxhZ3NcXFwiOjAsXFxcImVsZW1lbnRzXFxcIjolc30se1xcXCJpZFxcXCI6JXUsXFxcInR5cGVcXFwiOlxcXCJoYXNoXFxcIixcIlxuK1x0XHRcdCBcIlxcXCJuYW1lXFxcIjpcXFwiZHVtcF9pbm5lclxcXCIsXFxcImZsYWdzXFxcIjowLFxcXCJlbGVtZW50c1xcXCI6JXN9XVwiLFxuK1x0XHRcdCByb290X2lkLCB0eXBlX25hbWUsIG91dGVyLCBpbm5lcl9pZCwgaW5uZXIpO1xuK1x0ZWxzZVxuK1x0XHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbitcdFx0XHQgXCJbe1xcXCJpZFxcXCI6JXUsXFxcInR5cGVcXFwiOlxcXCIlc1xcXCIsXFxcIm5hbWVcXFwiOlxcXCJkdW1wX291dGVyXFxcIixcIlxuK1x0XHRcdCBcIlxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOltdfV1cIiwgcm9vdF9pZCwgdHlwZV9uYW1lKTtcbitcdGlmIChkdW1wX21hcChyb290X2lkLCBcIi1qIC1yXCIsIG91dHB1dCkpXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcInJlY3Vyc2l2ZV9qc29uXCIpO1xuK1x0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFwiLS1qc29uIC0tcmVjdXJzaXZlXCIsIG91dHB1dCkpXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcInJlY3Vyc2l2ZV9sb25nX29wdGlvbnNcIik7XG4rXHRjaGVja19wbGFpbihyb290X2lkLCBpbm5lcl9pZCwgdHlwZV9uYW1lLCBlbnRyaWVzLCB0eXBlZCk7XG4rXG4rXHQvKiBSZWN1cnNpb24gb24gYW4gb3JkaW5hcnkgbWFwIHN0aWxsIGVtaXRzIGEgc2luZ2xlIG1hcCBvYmplY3QuICovXG4rXHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbitcdFx0IFwiW3tcXFwiaWRcXFwiOiV1LFxcXCJ0eXBlXFxcIjpcXFwiaGFzaFxcXCIsXFxcIm5hbWVcXFwiOlxcXCJkdW1wX2lubmVyXFxcIixcIlxuK1x0XHQgXCJcXFwiZmxhZ3NcXFwiOjAsXFxcImVsZW1lbnRzXFxcIjolc31dXCIsIGlubmVyX2lkLCBpbm5lcik7XG4rXHRpZiAoZHVtcF9tYXAoaW5uZXJfaWQsIFwiLWogLXJcIiwgb3V0cHV0KSlcbitcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwib3JkaW5hcnlfcmVjdXJzaXZlXCIpO1xuK291dDpcbitcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKG91dGVyX2ZkKTtcbitcdGlmIChpbm5lcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGlubmVyX2ZkKTtcbitcdGJ0Zl9fZnJlZShidGYpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X211bHRpcGxlX3Jvb3RzKHZvaWQpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4rXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIG5hbWVbQlBGX09CSl9OQU1FX0xFTl07XG4rXHRjaGFyIG91dHB1dFtPVVRQVVRfU0laRV0gPSB7fSwgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiA0XSwgZWxlbWVudHNbT1VUUFVUX1NJWkVdO1xuK1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlc1tdID0geyBcImhhc2hcIiwgXCJhcnJheV9vZl9tYXBzXCIsIFwiaGFzaF9vZl9tYXBzXCIsIFwiaGFzaFwiIH07XG4rXHRpbnQgZmRzW10gPSB7IC0xLCAtMSwgLTEsIC0xIH07XG4rXHRfX3UzMiBpZHNbNF0sIGtleTtcbitcdGludCBpLCBsZW4gPSAwO1xuK1xuK1x0LyogU2VsZWN0IHRoZSBmaXJzdCBpbm5lciBtYXAgYW5kIGJvdGggb3V0ZXJzIGFzIHJvb3RzLiBUaGUgb3RoZXIgaW5uZXJcbitcdCAqIG1hcCBtdXN0IGJlIGFwcGVuZGVkIGFmdGVyIGFsbCB0aHJlZSByb290cywgZXZlbiB0aG91Z2ggaXQgaXMgZm91bmRcbitcdCAqIHdoaWxlIGR1bXBpbmcgdGhlIGZpcnN0IG91dGVyLiBBIHByb2Nlc3Mtc3BlY2lmaWMgbmFtZSBhdm9pZHMgb3RoZXJcbitcdCAqIHRlc3RzJyBtYXBzIGpvaW5pbmcgdGhlIHNlbGVjdGlvbi5cbitcdCAqL1xuK1x0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcImR1bXBfJXVcIiwgZ2V0cGlkKCkpO1xuK1x0ZmRzWzBdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIG5hbWUsIDQsIDQsIDEsIE5VTEwpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzBdLCBcImNyZWF0ZV9zZWxlY3RlZF9pbm5lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRmZHNbM10gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCJkdW1wX2Rpc2NvdmVyZWRcIiwgNCwgNCwgMSwgTlVMTCk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbM10sIFwiY3JlYXRlX2Rpc2NvdmVyZWRfaW5uZXJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBmZHNbMF07XG4rXHRmZHNbMV0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMV0sIFwiY3JlYXRlX2FycmF5X3Jvb3RcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZmRzWzJdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMl0sIFwiY3JlYXRlX2hhc2hfcm9vdFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRmb3IgKGkgPSAxOyBpIFx1MDAzYz0gMjsgaSsrKSB7XG4rXHRcdGtleSA9IDA7XG4rXHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmRzW2ldLCBcdTAwMjZrZXksIFx1MDAyNmZkc1swXSwgQlBGX0FOWSksXG4rXHRcdFx0ICAgICAgIFwicmVmZXJlbmNlX3NlbGVjdGVkX2lubmVyXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRrZXkgPSAxO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXHUwMDI2a2V5LCBcdTAwMjZmZHNbM10sIEJQRl9BTlkpLFxuK1x0XHRcdCAgICAgICBcInJlZmVyZW5jZV9kaXNjb3ZlcmVkX2lubmVyXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0fVxuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShmZHMpOyBpKyspIHtcbitcdFx0aWRzW2ldID0gbWFwX2lkKGZkc1tpXSk7XG4rXHRcdGlmICghaWRzW2ldIHx8ICFkdW1wX21hcChpZHNbaV0sIFwiLWpcIiwgZWxlbWVudHMpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRsZW4gKz0gc25wcmludGYoZXhwZWN0ZWQgKyBsZW4sIHNpemVvZihleHBlY3RlZCkgLSBsZW4sXG4rXHRcdFx0XHRcIiVze1xcXCJpZFxcXCI6JXUsXFxcInR5cGVcXFwiOlxcXCIlc1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIlc1xcXCIsXCJcbitcdFx0XHRcdFwiXFxcImZsYWdzXFxcIjowLFxcXCJlbGVtZW50c1xcXCI6JXN9JXNcIixcbitcdFx0XHRcdGkgPyBcIixcIiA6IFwiW1wiLCBpZHNbaV0sIHR5cGVzW2ldLFxuK1x0XHRcdFx0aSA9PSAzID8gXCJkdW1wX2Rpc2NvdmVyZWRcIiA6IG5hbWUsIGVsZW1lbnRzLCBpID09IDMgPyBcIl1cIiA6IFwiXCIpO1xuK1x0fVxuK1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcIi1qIC1yIG1hcCBkdW1wIG5hbWUgJXNcIiwgbmFtZSk7XG4rXHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcbitcdFx0ICAgICAgXCJkdW1wX211bHRpcGxlX3Jvb3RzXCIpKSB7XG4rXHRcdG91dHB1dFtzdHJjc3BuKG91dHB1dCwgXCJcXG5cIildID0gJ1xcMCc7XG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcInJvb3RzX2ZpcnN0X2FuZF9zZWVkX2RlZHVwXCIpO1xuK1x0fVxuK291dDpcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoZmRzKTsgaSsrKVxuK1x0XHRpZiAoZmRzW2ldIFx1MDAzZT0gMClcbitcdFx0XHRjbG9zZShmZHNbaV0pO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X3VucmVhZGFibGUoYm9vbCBvdXRlcilcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbitcdGNoYXIgZWxlbWVudHNbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdLCByb290W09VVFBVVF9TSVpFXTtcbitcdGNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcGxhaW5bT1VUUFVUX1NJWkVdID0ge307XG4rXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07XG4rXHRpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMSwgbG9va3VwX2Vycm5vO1xuK1x0X191MzIgaW5uZXJfaWQsIHJvb3RfaWQsIGtleSA9IDAsIHZhbHVlO1xuK1xuK1x0LyogRXZlcnkga2V5IGlzIGVudW1lcmFibGUsIGJ1dCBQRVJGX0VWRU5UX0FSUkFZIGxvb2t1cCByZXR1cm5zXG4rXHQgKiBFTk9UU1VQUCAodGhlIGtlcm5lbC1pbnRlcm5hbCBlcnJubykuIENoZWNrIGJvdGggZW50cmllcyBzbyBhblxuK1x0ICogZWFybHkgZXhpdCBvbiB0aGUgZmlyc3QgbG9va3VwIGZhaWx1cmUgY2Fubm90IHBhc3MuXG4rXHQgKi9cbitcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVksIFwiZHVtcF91bnJlYWRhYmxlXCIsXG4rXHRcdFx0XHQgIHNpemVvZihrZXkpLCBzaXplb2YodmFsdWUpLCAyLCBOVUxMKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcImNyZWF0ZV91bnJlYWRhYmxlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghQVNTRVJUX0xUKGJwZl9tYXBfbG9va3VwX2VsZW0oaW5uZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2dmFsdWUpLCAwLFxuK1x0XHQgICAgICAgXCJ1bnJlYWRhYmxlX2xvb2t1cFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRsb29rdXBfZXJybm8gPSBlcnJubztcbitcdGlmICghQVNTRVJUX05FUShsb29rdXBfZXJybm8sIEVOT0VOVCwgXCJ1bnJlYWRhYmxlX25vdF9taXNzaW5nXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlubmVyX2lkID0gbWFwX2lkKGlubmVyX2ZkKTtcbitcdGlmICghaW5uZXJfaWQgfHwgIWR1bXBfbWFwKGlubmVyX2lkLCBcIi1qXCIsIGVsZW1lbnRzKSlcbitcdFx0Z290byBvdXQ7XG4rXHRBU1NFUlRfRVEoY291bnRfdG9rZW4oZWxlbWVudHMsIFwiXFxcImVycm9yXFxcIjpcIiksIDIsIFwiZGVmYXVsdF9qc29uX2Vycm9yc1wiKTtcbitcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCJtYXAgZHVtcCBpZCAldVwiLCBpbm5lcl9pZCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBwbGFpbiwgc2l6ZW9mKHBsYWluKSAtIDEpLFxuK1x0XHQgICAgICAgXCJkZWZhdWx0X3BsYWluX3VucmVhZGFibGVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKHBsYWluLCBzdHJlcnJvcihsb29rdXBfZXJybm8pKSwgMiwgXCJkZWZhdWx0X3BsYWluX2Vycm9yc1wiKTtcbitcdEFTU0VSVF9IQVNfU1VCU1RSKHBsYWluLCBcIkZvdW5kIDAgZWxlbWVudHNcIiwgXCJkZWZhdWx0X3BsYWluX2NvdW50XCIpO1xuK1xuK1x0cm9vdF9pZCA9IGlubmVyX2lkO1xuK1x0aWYgKG91dGVyKSB7XG4rXHRcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XG4rXHRcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIFwiZHVtcF9vdXRlclwiLFxuK1x0XHRcdFx0XHQgc2l6ZW9mKGtleSksIHNpemVvZih2YWx1ZSksIDEsIFx1MDAyNm9wdHMpO1xuK1x0XHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXCJjcmVhdGVfb3V0ZXJcIikgfHxcbitcdFx0ICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgXHUwMDI2a2V5LCBcdTAwMjZpbm5lcl9mZCwgQlBGX0FOWSksXG4rXHRcdFx0ICAgICAgIFwicG9wdWxhdGVfb3V0ZXJcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xuK1x0XHRpZiAoIXJvb3RfaWQgfHwgIWR1bXBfbWFwKHJvb3RfaWQsIFwiLWpcIiwgcm9vdCkpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuK1x0XHRcdCBcIlt7XFxcImlkXFxcIjoldSxcXFwidHlwZVxcXCI6XFxcImFycmF5X29mX21hcHNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiZHVtcF9vdXRlclxcXCIsXCJcbitcdFx0XHQgXCJcXFwiZmxhZ3NcXFwiOjAsXFxcImVsZW1lbnRzXFxcIjolc30se1xcXCJpZFxcXCI6JXUsXCJcbitcdFx0XHQgXCJcXFwidHlwZVxcXCI6XFxcInBlcmZfZXZlbnRfYXJyYXlcXFwiLFxcXCJuYW1lXFxcIjpcXFwiZHVtcF91bnJlYWRhYmxlXFxcIixcIlxuK1x0XHRcdCBcIlxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOiVzfV1cIiwgcm9vdF9pZCwgcm9vdCwgaW5uZXJfaWQsIGVsZW1lbnRzKTtcbitcdH0gZWxzZSB7XG4rXHRcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuK1x0XHRcdCBcIlt7XFxcImlkXFxcIjoldSxcXFwidHlwZVxcXCI6XFxcInBlcmZfZXZlbnRfYXJyYXlcXFwiLFwiXG4rXHRcdFx0IFwiXFxcIm5hbWVcXFwiOlxcXCJkdW1wX3VucmVhZGFibGVcXFwiLFxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOiVzfV1cIixcbitcdFx0XHQgaW5uZXJfaWQsIGVsZW1lbnRzKTtcbitcdH1cbitcdGlmIChkdW1wX21hcChyb290X2lkLCBcIi1qIC1yXCIsIG91dHB1dCkpXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcInJlY3Vyc2l2ZV91bnJlYWRhYmxlX2pzb25cIik7XG4rXHRtZW1zZXQob3V0cHV0LCAwLCBzaXplb2Yob3V0cHV0KSk7XG4rXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwiLXIgbWFwIGR1bXAgaWQgJXVcIiwgcm9vdF9pZCk7XG4rXHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcbitcdFx0ICAgICAgXCJyZWN1cnNpdmVfdW5yZWFkYWJsZV9wbGFpblwiKSkge1xuK1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIHBsYWluLCBcInJlY3Vyc2l2ZV9wbGFpbl9wcmVzZXJ2ZXNfZXJyb3JzXCIpO1xuK1x0XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBzdHJlcnJvcihsb29rdXBfZXJybm8pKSwgMixcbitcdFx0XHQgIFwicmVjdXJzaXZlX3BsYWluX2Vycm9yc1wiKTtcbitcdFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgXCJGb3VuZCBcIiksIG91dGVyID8gMiA6IDEsXG4rXHRcdFx0ICBcInJlY3Vyc2l2ZV9wbGFpbl9tYXBzXCIpO1xuK1x0fVxuK291dDpcbitcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKG91dGVyX2ZkKTtcbitcdGlmIChpbm5lcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGlubmVyX2ZkKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9tYW55X2lubmVyX21hcHMoYm9vbCBqc29uKVxuK3tcbitcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xuK1x0Y29uc3Qgc3RydWN0IHJsaW1pdCBsaW1pdCA9IHsgLnJsaW1fY3VyID0gMzIsIC5ybGltX21heCA9IDMyIH07XG4rXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIHRva2VuWzY0XTtcbitcdF9fdTMyIGlkc1s2NF0sIHJvb3RfaWQsIGtleTtcbitcdGludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xLCBzdGF0dXM7XG4rXHRjaGFyICpvdXRwdXQgPSBOVUxMO1xuK1x0cGlkX3QgcGlkO1xuK1xuK1x0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCJkdW1wX2lubmVyXCIsIDQsIDQsIDEsIE5VTEwpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFwiY3JlYXRlX3RlbXBsYXRlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XG4rXHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBcImR1bXBfb3V0ZXJcIiwgNCwgNCxcbitcdFx0XHRcdCBBUlJBWV9TSVpFKGlkcyksIFx1MDAyNm9wdHMpO1xuK1x0Y2xvc2UoaW5uZXJfZmQpO1xuK1x0aW5uZXJfZmQgPSAtMTtcbitcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcImNyZWF0ZV9vdXRlclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRmb3IgKGtleSA9IDA7IGtleSBcdTAwM2MgQVJSQVlfU0laRShpZHMpOyBrZXkrKykge1xuK1x0XHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcImR1bXBfaW5uZXJcIiwgNCwgNCwgMSwgTlVMTCk7XG4rXHRcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcImNyZWF0ZV9pbm5lclwiKSB8fFxuK1x0XHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCBcdTAwMjZrZXksIFx1MDAyNmlubmVyX2ZkLCBCUEZfQU5ZKSxcbitcdFx0XHQgICAgICAgXCJwb3B1bGF0ZV9vdXRlclwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0aWRzW2tleV0gPSBtYXBfaWQoaW5uZXJfZmQpO1xuK1x0XHRpZiAoIWlkc1trZXldKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHQvKiBUaGUgb3V0ZXIgbWFwIGtlZXBzIGVhY2ggZGlzdGluY3QgaW5uZXIgbWFwIGFsaXZlLiAqL1xuK1x0XHRjbG9zZShpbm5lcl9mZCk7XG4rXHRcdGlubmVyX2ZkID0gLTE7XG4rXHR9XG4rXHRyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTtcbitcdG91dHB1dCA9IGNhbGxvYygxLCA2NTUzNik7XG4rXHRpZiAoIXJvb3RfaWQgfHwgIUFTU0VSVF9PS19QVFIob3V0cHV0LCBcImFsbG9jYXRlX291dHB1dFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHQvKiBDcmVhdGUgYWxsIGZpeHR1cmVzIGJlZm9yZSBsb3dlcmluZyB0aGUgbGltaXQsIGFuZCBrZWVwIHRoZSB0ZXN0XG4rXHQgKiBydW5uZXIncyBsaW1pdCB1bmNoYW5nZWQuIFJldGFpbmluZyBldmVyeSBkaXNjb3ZlcmVkIEZEIHdvdWxkIGV4Y2VlZFxuK1x0ICogdGhpcyBsaW1pdCBiZWZvcmUgdGhlIHJlY3Vyc2l2ZSBkdW1wIGNvdWxkIHZpc2l0IGFsbCBpbm5lciBtYXBzLlxuK1x0ICovXG4rXHRwaWQgPSBmb3JrKCk7XG4rXHRpZiAoIUFTU0VSVF9HRShwaWQsIDAsIFwiZm9ya1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIXBpZCkge1xuK1x0XHRjbG9zZShvdXRlcl9mZCk7XG4rXHRcdGlmIChzZXRybGltaXQoUkxJTUlUX05PRklMRSwgXHUwMDI2bGltaXQpKVxuK1x0XHRcdF9leGl0KDEpO1xuK1x0XHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwiJXMgLXIgbWFwIGR1bXAgaWQgJXVcIixcbitcdFx0XHQganNvbiA/IFwiLWpcIiA6IFwiXCIsIHJvb3RfaWQpO1xuK1x0XHRpZiAoZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCA2NTUzNSkpXG4rXHRcdFx0X2V4aXQoMik7XG4rXHRcdGlmIChjb3VudF90b2tlbihvdXRwdXQsIGpzb24gPyBcIlxcXCJpZFxcXCI6XCIgOiBcIkZvdW5kIFwiKSAhPSBBUlJBWV9TSVpFKGlkcykgKyAxIHx8XG4rXHRcdCAgICBjb3VudF90b2tlbihvdXRwdXQsIGpzb24gPyBcIlxcXCJpbm5lcl9tYXBfaWRcXFwiOlwiIDogXCJpbm5lcl9tYXBfaWQ6XCIpICE9XG4rXHRcdCAgICBBUlJBWV9TSVpFKGlkcykpXG4rXHRcdFx0X2V4aXQoMyk7XG4rXHRcdGZvciAoa2V5ID0gMDsga2V5IFx1MDAzYyBBUlJBWV9TSVpFKGlkcyk7IGtleSsrKSB7XG4rXHRcdFx0aWYgKGpzb24pXG4rXHRcdFx0XHRzbnByaW50Zih0b2tlbiwgc2l6ZW9mKHRva2VuKSwgXCJcXFwiaWRcXFwiOiV1LFwiLCBpZHNba2V5XSk7XG4rXHRcdFx0ZWxzZVxuK1x0XHRcdFx0c25wcmludGYodG9rZW4sIHNpemVvZih0b2tlbiksIFwiXFxuJXU6IGhhc2ggIG5hbWUgZHVtcF9pbm5lciAgXCIsXG4rXHRcdFx0XHRcdCBpZHNba2V5XSk7XG4rXHRcdFx0aWYgKGNvdW50X3Rva2VuKG91dHB1dCwgdG9rZW4pICE9IDEpXG4rXHRcdFx0XHRfZXhpdCg0KTtcbitcdFx0fVxuK1x0XHRpZiAoanNvbiBcdTAwMjZcdTAwMjYgKG91dHB1dFswXSAhPSAnWycgfHxcbitcdFx0XHQgICAgIHN0cmNtcChvdXRwdXQgKyBzdHJsZW4ob3V0cHV0KSAtIDIsIFwiXVxcblwiKSkpXG4rXHRcdFx0X2V4aXQoNSk7XG4rXHRcdF9leGl0KDApO1xuK1x0fVxuK1x0aWYgKEFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgXHUwMDI2c3RhdHVzLCAwKSwgcGlkLCBcIndhaXRwaWRcIikgXHUwMDI2XHUwMDI2XG4rXHQgICAgQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwiY2hpbGRfZXhpdGVkXCIpKVxuK1x0XHRBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSwgMCwgXCJkdW1wX3dpdGhfbG93X2ZkX2xpbWl0XCIpO1xuK291dDpcbitcdGZyZWUob3V0cHV0KTtcbitcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKG91dGVyX2ZkKTtcbitcdGlmIChpbm5lcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGlubmVyX2ZkKTtcbit9XG4rXG4rdm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2R1bXAodm9pZClcbit7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInVucmVhZGFibGVfb3JkaW5hcnlcIikpXG4rXHRcdHRlc3RfdW5yZWFkYWJsZShmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInVucmVhZGFibGVfaW5uZXJcIikpXG4rXHRcdHRlc3RfdW5yZWFkYWJsZSh0cnVlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibWFueV9pbm5lcl9tYXBzX2pzb25cIikpXG4rXHRcdHRlc3RfbWFueV9pbm5lcl9tYXBzKHRydWUpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtYW55X2lubmVyX21hcHNfcGxhaW5cIikpXG4rXHRcdHRlc3RfbWFueV9pbm5lcl9tYXBzKGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibXVsdGlwbGVfcm9vdHNcIikpXG4rXHRcdHRlc3RfbXVsdGlwbGVfcm9vdHMoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiYXJyYXlfb2ZfbWFwc1wiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMSwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiaGFzaF9vZl9tYXBzXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInNoYXJlZF9pbm5lclwiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMiwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiZW1wdHlfYXJyYXlfb2ZfbWFwc1wiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMCwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiZW1wdHlfaGFzaF9vZl9tYXBzXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImJ0Zl9pbm5lclwiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCBmYWxzZSwgdHJ1ZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImVtcHR5X2lubmVyXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIHRydWUsIGZhbHNlKTtcbit9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwMToyMzo1OS45MzExNDI4MThaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0NDEyODA1NDc1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKldvcnRoRnV6emluZyBBc3Nlc3NtZW50OiBOZWdhdGl2ZSoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIEkgbmVlZCB0byBsb29rIGF0IHRoZSBkaWZmIGFuZCBzZWUgd2hhdCdzIGJlZW4gdG91Y2hlZC4gQWxyaWdodCwgSSdtIHNlZWluZyBjaGFuZ2VzIGluIGBicGZ0b29sYCByZWxhdGVkIGZpbGVzIGFuZCBzb21lIHNlbGYtdGVzdHMuIFNwZWNpZmljYWxseSwgSSdtIGxvb2tpbmcgYXQgbW9kaWZpY2F0aW9ucyB0byBgYnBmdG9vbGAncyBkb2N1bWVudGF0aW9uLCBiYXNoIGNvbXBsZXRpb24sIGBtYWluLmNgLCBgbWFpbi5oYCwgYG1hcC5jYCwgYW5kIHRoZSBgYnBmdG9vbF9tYXBfZHVtcC5jYCBzZWxmLXRlc3QuIEFsbCB0aGVzZSBjaGFuZ2VzIGFyZSBuZWF0bHkgY29udGFpbmVkIHdpdGhpbiB0aGUgYHRvb2xzL2AgZGlyZWN0b3J5LCBzcGVjaWZpY2FsbHkgd2l0aGluIGB0b29scy9icGYvYnBmdG9vbGAgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGZgLlxuXG5Ob3csIEkgbmVlZCB0byBhcHBseSB0aGUgdHJpYWdlIGd1aWRlbGluZXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgZGVzZXJ2ZXMgZnV6emluZy4gQWNjb3JkaW5nIHRvIHRoZSBndWlkZWxpbmVzLCBJIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGNoYW5nZXMgZmFsbCB1bmRlciBhbnkgb2YgdGhlIFwiTkVHQVRJVkUgQ1JJVEVSSUEsXCIgbWVhbmluZyBpZiBJICpkb24ndCogbmVlZCB0byBmbGFnIHRoaXMgZm9yIGZ1enppbmcuIFNlZW1zIGxpa2UgYSBmaXQuIFRoZSBydWxlIGhlcmUgaXMgY2xlYXI6IElmICphbGwqIHRoZSBtb2RpZmllZCBjb2RlIGlzIGV4Y2x1c2l2ZWx5IGRvY3VtZW50YXRpb24sIGNvbW1lbnRzLCBzcGVsbGluZyBmaXhlcywgb3IgdXNlci1zcGFjZSBkaXJlY3RvcmllcyBsaWtlIGB0b29scy9gLCBgc2FtcGxlcy9gLCBgc2NyaXB0cy9gLCBvciBgdXNyL2AgKmFuZCogZG9lcyAqbm90KiBpbXBhY3QgdGhlIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3IgYW55IGtlcm5lbCBtb2R1bGVzLCB0aGVuIEkgc2hvdWxkIHNldCBgV29ydGhGdXp6aW5nPWZhbHNlYC5cblxuQ29uc2lkZXJpbmcgdGhlIGd1aWRlbGluZXMsIGl0J3MgY2xlYXIgdGhhdCBhbGwgY2hhbmdlcyBhcmUgY29uZmluZWQgdG8gdXNlci1zcGFjZSB0b29scyAoYGJwZnRvb2xgKSBhbmQgYXNzb2NpYXRlZCBzZWxmLXRlc3RzLiBObyBrZXJuZWwgc291cmNlIGZpbGVzIHJlc2lkaW5nIGluIGRpcmVjdG9yaWVzIGxpa2UgYGtlcm5lbC9gLCBgbmV0L2AsIGBtbS9gLCBgZHJpdmVycy9gLCBgZnMvYCwgYGluY2x1ZGUvYCAoYmVzaWRlcyB0b29scy9pbmNsdWRlIGlmIGFueSksIG9yIG90aGVyIGNydWNpYWwga2VybmVsIGNvbXBvbmVudHMgYXJlIGFmZmVjdGVkLiBTbywgSSBhbSB2ZXJ5IGNvbmZpZGVudCB0aGlzIHBhdGNoIHdvbid0IGFmZmVjdCB0aGUga2VybmVsIG9yIG1vZHVsZXMgaW4gYW55IHdheS5cblxuQ29uc2VxdWVudGx5LCBgV29ydGhGdXp6aW5nYCBtdXN0IGJlIGBmYWxzZWAgaW4gdGhpcyBjYXNlLlxuXG5CZWZvcmUgSSBmaW5hbGl6ZSB0aGUgcmVzcG9uc2UsIEkgc2hvdWxkIGFsc28gY29uZmlybSB0aGUgZm9ybWF0IGZvciByZXR1cm5pbmcgdGhlIHJlc3VsdHMuIEkgc2hvdWxkIHByb2JhYmx5IGRvdWJsZS1jaGVjayB0aGUgcmVxdWlyZW1lbnQgZm9yIHRoZSBgRm9jdXNTeW1ib2xzYCBhbmQgYEVuYWJsZUNvbmZpZ3NgIGFycmF5cy4gQWgsIHllcywgaWYgYFdvcnRoRnV6emluZz1mYWxzZWAsIHRoZXkgc2hvdWxkIGJlIHNldCB0byBlbXB0eSBhcnJheXMsIHdoaWNoIGlzIHRoZSBzdGFuZGFyZCBwcm9jZWR1cmUuIERvbmUhXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNDgzLCJPdXRwdXRUb2tlbnMiOjg2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDY0LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDE6MjQ6MDQuMzQzOTUxNjg0WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNzIxMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW10sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBvbmx5IHVzZXItc3BhY2UgdG9vbHMgYW5kIHNlbGZ0ZXN0cyB1bmRlciB0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLiBJdCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xzIGFuZCBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbCBjb2RlIG9yIGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDAxOjI0OjA0LjM0Mzk4Mzg4NFoiLCJTZXEiOjUsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyODIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow9k4hn[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-07 01:04:19 +0000 UTC FinishedAt: 2026-09-07 01:24:05 +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+CgkJCTx0ZD4yMDI2LzA5LzA3IDAxOjIzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xzIGFuZCBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbCBjb2RlIG9yIGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDE6MjM8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA0MjJmYTU3ODZmNWMxMmJhMTUyM2RiZDhlNTBlN2ZjOWQyNWJmZWVkXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAwMToyMzo1OCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdCBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG5pbmRleCA1ZGFmM2RlNWM3NDQ2Li4zOGQxZjU0MmJmNWE1IDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG5AQCAtMTYsNyAmIzQzOzE2LDcgQEAgU1lOT1BTSVNcbiBcbiAqKmJwZnRvb2wqKiBbKk9QVElPTlMqXSAqKm1hcCoqICpDT01NQU5EKlxuIFxuLSpPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfCB7ICoqLW4qKiB8ICoqLS1ub21vdW50KiogfSB9XG4mIzQzOypPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfCB7ICoqLW4qKiB8ICoqLS1ub21vdW50KiogfSB8IHsgKiotcioqIHwgKiotLXJlY3Vyc2l2ZSoqIH0gfVxuIFxuICpDT01NQU5EUyogOj1cbiB7ICoqc2hvdyoqIHwgKipsaXN0KiogfCAqKmNyZWF0ZSoqIHwgKipkdW1wKiogfCAqKnVwZGF0ZSoqIHwgKipsb29rdXAqKiB8ICoqZ2V0bmV4dCoqIHxcbkBAIC0xNzAsNiAmIzQzOzE3MCwyNSBAQCBPUFRJT05TXG4gICAgIERvIG5vdCBhdXRvbWF0aWNhbGx5IGF0dGVtcHQgdG8gbW91bnQgYW55IHZpcnR1YWwgZmlsZSBzeXN0ZW0gKHN1Y2ggYXNcbiAgICAgdHJhY2VmcyBvciBCUEYgdmlydHVhbCBmaWxlIHN5c3RlbSkgd2hlbiBuZWNlc3NhcnkuXG4gXG4mIzQzOy1yLCAtLXJlY3Vyc2l2ZVxuJiM0MzsgICAgQWxzbyBkdW1wIHRoZSBpbm5lciBtYXBzIHJlZmVyZW5jZWQgYnkgKiphcnJheV9vZl9tYXBzKiogYW5kICoqaGFzaF9vZl9tYXBzKipcbiYjNDM7ICAgIGVudHJpZXMgd2hlbiBydW5uaW5nICoqbWFwIGR1bXAqKi4gRWFjaCBtYXAgSUQgaXMgdmlzaXRlZCBvbmNlLCBldmVuIGlmXG4mIzQzOyAgICBzZXZlcmFsIGVudHJpZXMgcmVmZXIgdG8gaXQuIFNlbGVjdGVkIG1hcHMgYXJlIGZvbGxvd2VkIGJ5IHRoZWlyIGlubmVyIG1hcHMuXG4mIzQzO1xuJiM0MzsgICAgUGxhaW4gb3V0cHV0IGluY2x1ZGVzIGEgaGVhZGVyIGlkZW50aWZ5aW5nIGVhY2ggbWFwLiBPbiBzdWNjZXNzLCBKU09OIG91dHB1dFxuJiM0MzsgICAgaXMgYWx3YXlzIGFuIGFycmF5IG9mIG1hcCBvYmplY3RzLCBlYWNoIGNvbnRhaW5pbmcgYW4gKippZCoqIGFuZCBhblxuJiM0MzsgICAgKiplbGVtZW50cyoqIGFycmF5LCBpbmNsdWRpbmcgd2hlbiBvbmx5IG9uZSBtYXAgaXMgZHVtcGVkLiBPdXRlciBtYXAgZW50cmllc1xuJiM0MzsgICAgcmV0YWluIHRoZWlyICoqaW5uZXJfbWFwX2lkKiogZmllbGQsIHdoaWNoIGlkZW50aWZpZXMgdGhlIGNvcnJlc3BvbmRpbmcgaW5uZXJcbiYjNDM7ICAgIG1hcCBvYmplY3QuXG4mIzQzO1xuJiM0MzsgICAgSW5uZXIgbWFwIElEcyBhcmUgcmVzb2x2ZWQgd2hlbiB0aGUgbWFwcyBhcmUgdmlzaXRlZC4gVGhlIGR1bXAgaXMgbm90IGFuXG4mIzQzOyAgICBhdG9taWMgc25hcHNob3Q6IGNvbmN1cnJlbnQgdXBkYXRlcyBjYW4gY2hhbmdlIG1hcCBjb250ZW50cyBvciByZW1vdmUgYVxuJiM0MzsgICAgcmVmZXJlbmNlZCBpbm5lciBtYXAgYmVmb3JlIGl0IGlzIHZpc2l0ZWQuIEZhaWx1cmUgdG8gb3BlbiBhIHJlZmVyZW5jZWRcbiYjNDM7ICAgIGlubmVyIG1hcCBzdG9wcyB0aGUgZHVtcCBhbmQgcmV0dXJucyBhIG5vbnplcm8gZXhpdCBzdGF0dXMuIE91dHB1dCBtYXlcbiYjNDM7ICAgIGNvbnRhaW4gbWFwcyBvciBlbnRyaWVzIHByaW50ZWQgYmVmb3JlIHRoZSBlcnJvci5cbiYjNDM7ICAgIEluIEpTT04gbW9kZSwgYW4gZXJyb3IgZHVyaW5nIHRyYXZlcnNhbCBpcyBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGFuZCB0aGVcbiYjNDM7ICAgIGVuY2xvc2luZyBhcnJheXMgYW5kIG9iamVjdHMgYXJlIGNsb3NlZC5cbiYjNDM7XG4gRVhBTVBMRVNcbiA9PT09PT09PVxuICoqIyBicGZ0b29sIG1hcCBzaG93KipcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5pbmRleCA3NWNiY2I1MTJlYmFlLi40NWMzMzZkNjNiZTBhIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5AQCAtMjYxLDcgJiM0MzsyNjEsNyBAQCBfYnBmdG9vbCgpXG4gXG4gICAgICMgRGVhbCB3aXRoIG9wdGlvbnNcbiAgICAgaWYgW1sgJHt3b3Jkc1tjd29yZF19ID09IC0qIF1dOyB0aGVuXG4tICAgICAgICBsb2NhbCBjPSYjMzk7LS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcbiYjNDM7ICAgICAgICBsb2NhbCBjPSYjMzk7LS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLXJlY3Vyc2l2ZSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcbiAgICAgICAgICAgICAtLXVzZS1sb2FkZXIgLS1iYXNlLWJ0ZiAtLXNpZ24gLWkgLWsmIzM5O1xuICAgICAgICAgQ09NUFJFUExZPSggJCggY29tcGdlbiAtVyBcJiMzNDskY1wmIzM0OyAtLSBcJiMzNDskY3VyXCYjMzQ7ICkgKVxuICAgICAgICAgcmV0dXJuIDBcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmMgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbmluZGV4IGM5MWUxYTZlMWExZWMuLjI5MDIxZjRkZDQ1MTggMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uY1xuQEAgLTI2LDYgJiM0MzsyNiw3IEBAIHN0YXRpYyBpbnQgKCpsYXN0X2RvX2hlbHApKGludCBhcmdjLCBjaGFyICoqYXJndik7XG4ganNvbl93cml0ZXJfdCAqanNvbl93dHI7XG4gYm9vbCBwcmV0dHlfb3V0cHV0O1xuIGJvb2wganNvbl9vdXRwdXQ7XG4mIzQzO2Jvb2wgcmVjdXJzaXZlO1xuIGJvb2wgc2hvd19waW5uZWQ7XG4gYm9vbCBibG9ja19tb3VudDtcbiBib29sIHZlcmlmaWVyX2xvZ3M7XG5AQCAtNDUyLDYgJiM0Mzs0NTMsNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdHsgXCYjMzQ7anNvblwmIzM0OyxcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCYjMzk7aiYjMzk7IH0sXG4gXHRcdHsgXCYjMzQ7aGVscFwmIzM0OyxcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCYjMzk7aCYjMzk7IH0sXG4gXHRcdHsgXCYjMzQ7cHJldHR5XCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtwJiMzOTsgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7cmVjdXJzaXZlXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtyJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDt2ZXJzaW9uXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtWJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDticGZmc1wmIzM0OyxcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCYjMzk7ZiYjMzk7IH0sXG4gXHRcdHsgXCYjMzQ7bWFwY29tcGF0XCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTttJiMzOTsgfSxcbkBAIC00ODUsNyAmIzQzOzQ4Nyw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGJpbl9uYW1lID0gXCYjMzQ7YnBmdG9vbFwmIzM0OztcbiBcbiBcdG9wdGVyciA9IDA7XG4tXHR3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsIFwmIzM0O1ZocGpmTG1uZFNpOms6QjpsXCYjMzQ7LFxuJiM0MztcdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXCYjMzQ7VmhwanJmTG1uZFNpOms6QjpsXCYjMzQ7LFxuIFx0XHRcdFx0ICBvcHRpb25zLCBOVUxMKSkgXHUwMDNlPSAwKSB7XG4gXHRcdHN3aXRjaCAob3B0KSB7XG4gXHRcdGNhc2UgJiMzOTtWJiMzOTs6XG5AQCAtNTA3LDYgJiM0Mzs1MDksOSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdFx0fVxuIFx0XHRcdGpzb253X3ByZXR0eShqc29uX3d0ciwgcHJldHR5X291dHB1dCk7XG4gXHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlICYjMzk7ciYjMzk7OlxuJiM0MztcdFx0XHRyZWN1cnNpdmUgPSB0cnVlO1xuJiM0MztcdFx0XHRicmVhaztcbiBcdFx0Y2FzZSAmIzM5O2YmIzM5OzpcbiBcdFx0XHRzaG93X3Bpbm5lZCA9IHRydWU7XG4gXHRcdFx0YnJlYWs7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oXG5pbmRleCA3OGI2ZTBlYmI4NWQ4Li5iNWRjNzk2MGNmNjgyIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbkBAIC04Myw2ICYjNDM7ODMsNyBAQCBleHRlcm4gY29uc3QgY2hhciAqYmluX25hbWU7XG4gXG4gZXh0ZXJuIGpzb25fd3JpdGVyX3QgKmpzb25fd3RyO1xuIGV4dGVybiBib29sIGpzb25fb3V0cHV0O1xuJiM0MztleHRlcm4gYm9vbCByZWN1cnNpdmU7XG4gZXh0ZXJuIGJvb2wgc2hvd19waW5uZWQ7XG4gZXh0ZXJuIGJvb2wgc2hvd19waWRzO1xuIGV4dGVybiBib29sIGJsb2NrX21vdW50O1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbmluZGV4IDY4NGE4ZmI3MjQxNDYuLmZjMDZjNzY1OTczMTUgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbkBAIC0xNyw2ICYjNDM7MTcsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2JwZi9icGYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2JwZi9oYXNobWFwLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2xpYmJwZl9pbnRlcm5hbC5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCYjMzQ7anNvbl93cml0ZXIuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O21haW4uaFwmIzM0O1xuQEAgLTgyNiwxMiAmIzQzOzgyNyw0NCBAQCBzdGF0aWMgdm9pZCBmcmVlX21hcF9rdl9idGYoc3RydWN0IGJ0ZiAqYnRmKVxuIFx0XHRidGZfX2ZyZWUoYnRmKTtcbiB9XG4gXG4mIzQzO3N0cnVjdCBtYXBfZHVtcF9jdHgge1xuJiM0MztcdHN0cnVjdCBoYXNobWFwICpzZWVuO1xuJiM0MztcdF9fdTMyICpwZW5kaW5nX2lkcztcbiYjNDM7XHRzaXplX3QgcGVuZGluZ19jbnQ7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGNvbGxlY3RfaW5uZXJfbWFwKHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eCwgX191MzIgaWQpXG4mIzQzO3tcbiYjNDM7XHRfX3UzMiAqaWRzO1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdGlmIChoYXNobWFwX19maW5kKGN0eC1cdTAwM2VzZWVuLCBpZCwgTlVMTCkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0aWRzID0gbGliYnBmX3JlYWxsb2NhcnJheShjdHgtXHUwMDNlcGVuZGluZ19pZHMsIGN0eC1cdTAwM2VwZW5kaW5nX2NudCAmIzQzOyAxLFxuJiM0MztcdFx0XHRcdCBzaXplb2YoKmlkcykpO1xuJiM0MztcdGlmICghaWRzKSB7XG4mIzQzO1x0XHRwX2VycihcJiMzNDttZW0gYWxsb2MgZmFpbGVkXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHR9XG4mIzQzO1x0Y3R4LVx1MDAzZXBlbmRpbmdfaWRzID0gaWRzO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBoYXNobWFwX19hZGQoY3R4LVx1MDAzZXNlZW4sIGlkLCAwKTtcbiYjNDM7XHRpZiAoZXJyKSB7XG4mIzQzO1x0XHRwX2VycihcJiMzNDtmYWlsZWQgdG8gcmVjb3JkIGlubmVyIG1hcCBpZCAldTogJXNcJiMzNDssIGlkLCBzdHJlcnJvcigtZXJyKSk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcdGlkc1tjdHgtXHUwMDNlcGVuZGluZ19jbnQmIzQzOyYjNDM7XSA9IGlkO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbnRcbiBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbi1cdCBib29sIHNob3dfaGVhZGVyKVxuJiM0MztcdCBib29sIHNob3dfaGVhZGVyLCBzdHJ1Y3QgbWFwX2R1bXBfY3R4ICpjdHgpXG4ge1xuIFx0dm9pZCAqa2V5LCAqdmFsdWUsICpwcmV2X2tleTtcbiBcdHVuc2lnbmVkIGludCBudW1fZWxlbXMgPSAwO1xuJiM0MztcdGpzb25fd3JpdGVyX3QgKnBsYWluX2J0Zl93dHIgPSBOVUxMO1xuIFx0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcbiBcdGludCBlcnI7XG4gXG5AQCAtODQ1LDYgJiM0Mzs4NzgsMTcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4gXG4gXHRwcmV2X2tleSA9IE5VTEw7XG4gXG4mIzQzO1x0aWYgKGN0eCBcdTAwMjZcdTAwMjYgIXd0ciBcdTAwMjZcdTAwMjYgKGluZm8tXHUwMDNlYnRmX3ZhbHVlX3R5cGVfaWQgfHxcbiYjNDM7XHRcdFx0ICAgIGluZm8tXHUwMDNlYnRmX3ZtbGludXhfdmFsdWVfdHlwZV9pZCkpIHtcbiYjNDM7XHRcdHBsYWluX2J0Zl93dHIgPSBnZXRfYnRmX3dyaXRlcigpO1xuJiM0MztcdFx0aWYgKHBsYWluX2J0Zl93dHIpIHtcbiYjNDM7XHRcdFx0aWYgKHNob3dfaGVhZGVyKVxuJiM0MztcdFx0XHRcdHNob3dfbWFwX2hlYWRlcl9wbGFpbihpbmZvKTtcbiYjNDM7XHRcdFx0c2hvd19oZWFkZXIgPSBmYWxzZTtcbiYjNDM7XHRcdFx0d3RyID0gcGxhaW5fYnRmX3d0cjtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuIFx0aWYgKHd0cikge1xuIFx0XHRlcnIgPSBnZXRfbWFwX2t2X2J0ZihpbmZvLCBcdTAwMjZidGYpO1xuIFx0XHRpZiAoZXJyKSB7XG5AQCAtODc0LDEwICYjNDM7OTE4LDIwIEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0XHRpZiAoZXJyKSB7XG4gXHRcdFx0aWYgKGVycm5vID09IEVOT0VOVClcbiBcdFx0XHRcdGVyciA9IDA7XG4mIzQzO1x0XHRcdGVsc2UgaWYgKGN0eClcbiYjNDM7XHRcdFx0XHRwX2VycihcJiMzNDtjYW4mIzM5O3QgZ2V0IG5leHQga2V5IGZvciBtYXAgaWQgJXU6ICVzXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgIGluZm8tXHUwMDNlaWQsIHN0cmVycm9yKGVycm5vKSk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbi1cdFx0aWYgKCFkdW1wX21hcF9lbGVtKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cikpXG4mIzQzO1x0XHRlcnIgPSBkdW1wX21hcF9lbGVtKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cik7XG4mIzQzO1x0XHRpZiAoIWVycikge1xuIFx0XHRcdG51bV9lbGVtcyYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRcdGlmIChjdHggXHUwMDI2XHUwMDI2IG1hcF9pc19tYXBfb2ZfbWFwcyhpbmZvLVx1MDAzZXR5cGUpKSB7XG4mIzQzO1x0XHRcdFx0ZXJyID0gY29sbGVjdF9pbm5lcl9tYXAoY3R4LCAqKF9fdTMyICopdmFsdWUpO1xuJiM0MztcdFx0XHRcdGlmIChlcnIpXG4mIzQzO1x0XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fVxuIFx0XHRwcmV2X2tleSA9IGtleTtcbiBcdH1cbiBcbkBAIC04OTQsMTggJiM0Mzs5NDgsMjUgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4gXHRmcmVlKGtleSk7XG4gXHRmcmVlKHZhbHVlKTtcbiBcdGZyZWVfbWFwX2t2X2J0ZihidGYpO1xuJiM0MztcdGlmIChwbGFpbl9idGZfd3RyKVxuJiM0MztcdFx0anNvbndfZGVzdHJveShcdTAwMjZwbGFpbl9idGZfd3RyKTtcbiBcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4ge1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl9nZXRfZmRfYnlfaWRfb3B0cywgb3B0cyxcbiYjNDM7XHRcdC5vcGVuX2ZsYWdzID0gQlBGX0ZfUkRPTkxZLFxuJiM0MztcdCk7XG4gXHRqc29uX3dyaXRlcl90ICp3dHIgPSBOVUxMLCAqYnRmX3d0ciA9IE5VTEw7XG4gXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbiYjNDM7XHRzdHJ1Y3QgbWFwX2R1bXBfY3R4IGN0eCA9IHt9O1xuIFx0aW50IG5iX2ZkcywgaSA9IDA7XG4gXHRfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7XG4gXHRpbnQgKmZkcyA9IE5VTEw7XG4gXHRpbnQgZXJyID0gLTE7XG4mIzQzO1x0c2l6ZV90IGo7XG4gXG4gXHRpZiAoYXJnYyAhPSAyKVxuIFx0XHR1c2FnZSgpO1xuQEAgLTkxOSw5ICYjNDM7OTgwLDM0IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRpZiAobmJfZmRzIFx1MDAzYyAxKVxuIFx0XHRnb3RvIGV4aXRfZnJlZTtcbiBcbiYjNDM7XHRpZiAocmVjdXJzaXZlKSB7XG4mIzQzO1x0XHRjdHguc2VlbiA9IGhhc2htYXBfX25ldyhoYXNoX2ZuX2Zvcl9rZXlfYXNfaWQsXG4mIzQzO1x0XHRcdFx0XHRlcXVhbF9mbl9mb3Jfa2V5X2FzX2lkLCBOVUxMKTtcbiYjNDM7XHRcdGlmIChJU19FUlIoY3R4LnNlZW4pKSB7XG4mIzQzO1x0XHRcdGN0eC5zZWVuID0gTlVMTDtcbiYjNDM7XHRcdFx0cF9lcnIoXCYjMzQ7ZmFpbGVkIHRvIGNyZWF0ZSBoYXNobWFwIGZvciByZWN1cnNpdmUgZHVtcFwmIzM0Oyk7XG4mIzQzO1x0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdC8qIFJlY29yZCB0aGUgc2VsZWN0ZWQgbWFwcyBiZWZvcmUgZGlzY292ZXJpbmcgYW55IGlubmVyIG1hcHMuICovXG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuYl9mZHM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdGxlbiA9IHNpemVvZihpbmZvKTtcbiYjNDM7XHRcdFx0aWYgKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmRzW2ldLCBcdTAwMjZpbmZvLCBcdTAwMjZsZW4pKSB7XG4mIzQzO1x0XHRcdFx0cF9lcnIoXCYjMzQ7Y2FuJiMzOTt0IGdldCBtYXAgaW5mbzogJXNcJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1x0XHRcdFx0ZXJyID0gLTE7XG4mIzQzO1x0XHRcdFx0Z290byBleGl0X2Nsb3NlO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdGVyciA9IGhhc2htYXBfX2FkZChjdHguc2VlbiwgaW5mby5pZCwgMCk7XG4mIzQzO1x0XHRcdGlmIChlcnIpIHtcbiYjNDM7XHRcdFx0XHRwX2VycihcJiMzNDtmYWlsZWQgdG8gcmVjb3JkIG1hcCBpZCAldTogJXNcJiMzNDssIGluZm8uaWQsXG4mIzQzO1x0XHRcdFx0ICAgICAgc3RyZXJyb3IoLWVycikpO1xuJiM0MztcdFx0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4gXHRpZiAoanNvbl9vdXRwdXQpIHtcbiBcdFx0d3RyID0ganNvbl93dHI7XG4tXHR9IGVsc2Uge1xuJiM0MztcdH0gZWxzZSBpZiAoIXJlY3Vyc2l2ZSkge1xuIFx0XHRpbnQgZG9fcGxhaW5fYnRmO1xuIFxuIFx0XHRkb19wbGFpbl9idGYgPSBtYXBzX2hhdmVfYnRmKGZkcywgbmJfZmRzKTtcbkBAIC05MzYsNyAmIzQzOzEwMjIsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR9XG4gXHR9XG4gXG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4mIzQzO1x0aWYgKHd0ciBcdTAwMjZcdTAwMjYgKG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmUpKVxuIFx0XHRqc29ud19zdGFydF9hcnJheSh3dHIpO1x0Lyogcm9vdCBhcnJheSAqL1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbmJfZmRzOyBpJiM0MzsmIzQzOykge1xuIFx0XHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFx1MDAyNmluZm8sIFx1MDAyNmxlbikpIHtcbkBAIC05NDQsMjIgJiM0MzsxMDMwLDUwIEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdFx0ZXJyID0gLTE7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbi1cdFx0ZXJyID0gbWFwX2R1bXAoZmRzW2ldLCBcdTAwMjZpbmZvLCB3dHIsIG5iX2ZkcyBcdTAwM2UgMSk7XG4mIzQzO1x0XHRlcnIgPSBtYXBfZHVtcChmZHNbaV0sIFx1MDAyNmluZm8sIHd0ciwgbmJfZmRzIFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZSxcbiYjNDM7XHRcdFx0ICAgICAgIHJlY3Vyc2l2ZSA/IFx1MDAyNmN0eCA6IE5VTEwpO1xuIFx0XHRpZiAoIXd0ciBcdTAwMjZcdTAwMjYgaSAhPSBuYl9mZHMgLSAxKVxuIFx0XHRcdHByaW50ZihcJiMzNDtcXG5cJiMzNDspO1xuIFxuIFx0XHRpZiAoZXJyKVxuIFx0XHRcdGJyZWFrO1xuLVx0XHRjbG9zZShmZHNbaV0pO1xuJiM0MztcdFx0LyogS2VlcCBzZWxlY3RlZCBtYXBzIGFsaXZlIHdoaWxlIHZpc2l0aW5nIHRoZWlyIGlubmVyIG1hcHMuICovXG4mIzQzO1x0XHRpZiAoIXJlY3Vyc2l2ZSlcbiYjNDM7XHRcdFx0Y2xvc2UoZmRzW2ldKTtcbiYjNDM7XHR9XG4mIzQzO1x0Zm9yIChqID0gMDsgIWVyciBcdTAwMjZcdTAwMjYgaiBcdTAwM2MgY3R4LnBlbmRpbmdfY250OyBqJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aW50IGZkO1xuJiM0MztcbiYjNDM7XHRcdGZkID0gYnBmX21hcF9nZXRfZmRfYnlfaWRfb3B0cyhjdHgucGVuZGluZ19pZHNbal0sIFx1MDAyNm9wdHMpO1xuJiM0MztcdFx0aWYgKGZkIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRcdHBfZXJyKFwmIzM0O2NhbiYjMzk7dCBvcGVuIGlubmVyIG1hcCBpZCAldTogJXNcJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgIGN0eC5wZW5kaW5nX2lkc1tqXSwgc3RyZXJyb3IoZXJybm8pKTtcbiYjNDM7XHRcdFx0ZXJyID0gLTE7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0bGVuID0gc2l6ZW9mKGluZm8pO1xuJiM0MztcdFx0aWYgKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsIFx1MDAyNmluZm8sIFx1MDAyNmxlbikpIHtcbiYjNDM7XHRcdFx0cF9lcnIoXCYjMzQ7Y2FuJiMzOTt0IGdldCBtYXAgaW5mbzogJXNcJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1x0XHRcdGVyciA9IC0xO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0aWYgKCF3dHIpXG4mIzQzO1x0XHRcdFx0cHJpbnRmKFwmIzM0O1xcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdGVyciA9IG1hcF9kdW1wKGZkLCBcdTAwMjZpbmZvLCB3dHIsIHRydWUsIFx1MDAyNmN0eCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRjbG9zZShmZCk7XG4gXHR9XG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4mIzQzO1x0aWYgKHd0ciBcdTAwMjZcdTAwMjYgKG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmUpKVxuIFx0XHRqc29ud19lbmRfYXJyYXkod3RyKTtcdC8qIHJvb3QgYXJyYXkgKi9cbiBcbiBcdGlmIChidGZfd3RyKVxuIFx0XHRqc29ud19kZXN0cm95KFx1MDAyNmJ0Zl93dHIpO1xuIGV4aXRfY2xvc2U6XG4mIzQzO1x0aWYgKHJlY3Vyc2l2ZSlcbiYjNDM7XHRcdGkgPSAwO1xuIFx0Zm9yICg7IGkgXHUwMDNjIG5iX2ZkczsgaSYjNDM7JiM0MzspXG4gXHRcdGNsb3NlKGZkc1tpXSk7XG4mIzQzO1x0aGFzaG1hcF9fZnJlZShjdHguc2Vlbik7XG4mIzQzO1x0ZnJlZShjdHgucGVuZGluZ19pZHMpO1xuIGV4aXRfZnJlZTpcbiBcdGZyZWUoZmRzKTtcbiBcdGZyZWVfYnRmX3ZtbGludXgoKTtcbkBAIC0xNDg0LDcgJiM0MzsxNTk4LDcgQEAgc3RhdGljIGludCBkb19oZWxwKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XCYjMzQ7ICAgICAgICAgICAgICAgICB0YXNrX3N0b3JhZ2UgfCBibG9vbV9maWx0ZXIgfCB1c2VyX3JpbmdidWYgfCBjZ3JwX3N0b3JhZ2UgfCBhcmVuYSB8XFxuXCYjMzQ7XG4gXHRcdFwmIzM0OyAgICAgICAgICAgICAgICAgaW5zbl9hcnJheSB8IHJoYXNoIH1cXG5cJiMzNDtcbiBcdFx0XCYjMzQ7ICAgICAgIFwmIzM0OyBIRUxQX1NQRUNfT1BUSU9OUyBcJiMzNDsgfFxcblwmIzM0O1xuLVx0XHRcJiMzNDsgICAgICAgICAgICAgICAgICAgIHstZnwtLWJwZmZzfSB8IHstbnwtLW5vbW91bnR9IH1cXG5cJiMzNDtcbiYjNDM7XHRcdFwmIzM0OyAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfCB7LXJ8LS1yZWN1cnNpdmV9IH1cXG5cJiMzNDtcbiBcdFx0XCYjMzQ7XCYjMzQ7LFxuIFx0XHRiaW5fbmFtZSwgYXJndlstMl0pO1xuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjMzMGEzMzQ0NzcwZDFcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY1xuQEAgLTAsMCAmIzQzOzEsNDE5IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZnRvb2xfaGVscGVycy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvcmVzb3VyY2UuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2RlZmluZSBPVVRQVVRfU0laRSA4MTkyXG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBkdW1wX21hcChfX3UzMiBpZCwgY29uc3QgY2hhciAqb3B0aW9ucywgY2hhciAqb3V0cHV0KVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dO1xuJiM0MztcbiYjNDM7XHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwmIzM0OyVzIG1hcCBkdW1wIGlkICV1XCYjMzQ7LCBvcHRpb25zLCBpZCk7XG4mIzQzO1x0bWVtc2V0KG91dHB1dCwgMCwgT1VUUFVUX1NJWkUpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUgLSAxKSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtkdW1wX21hcFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0LyogVGhlIGhlbHBlciBkb2VzbiYjMzk7dCB0ZXJtaW5hdGUgb3Igc3RyaXAgdGhlIG91dHB1dC4gKi9cbiYjNDM7XHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFwmIzM0O1xcblwmIzM0OyldID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIF9fdTMyIG1hcF9pZChpbnQgZmQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbiYjNDM7XHRfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsIFx1MDAyNmluZm8sIFx1MDAyNmxlbiksIFwmIzM0O21hcF9pbmZvXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdHJldHVybiBpbmZvLmlkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGNvdW50X3Rva2VuKGNvbnN0IGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqdG9rZW4pXG4mIzQzO3tcbiYjNDM7XHRpbnQgY291bnQgPSAwO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoKG91dHB1dCA9IHN0cnN0cihvdXRwdXQsIHRva2VuKSkpIHtcbiYjNDM7XHRcdGNvdW50JiM0MzsmIzQzOztcbiYjNDM7XHRcdG91dHB1dCAmIzQzOz0gc3RybGVuKHRva2VuKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIGNvdW50O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjaGVja19wbGFpbihfX3UzMiByb290X2lkLCBfX3UzMiBpbm5lcl9pZCwgY29uc3QgY2hhciAqdHlwZSxcbiYjNDM7XHRcdFx0aW50IGVudHJpZXMsIGJvb2wgdHlwZWQpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIGhlYWRlclsxMjhdO1xuJiM0MztcdGNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9O1xuJiM0MztcdGNvbnN0IGNoYXIgKnJvb3QsICppbm5lcjtcbiYjNDM7XG4mIzQzO1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcJiMzNDstLXJlY3Vyc2l2ZSBtYXAgZHVtcCBpZCAldVwmIzM0Oywgcm9vdF9pZCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O3BsYWluX2R1bXBcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFwmIzM0OyV1OiAlcyAgbmFtZSBkdW1wX291dGVyICBcJiMzNDssIHJvb3RfaWQsIHR5cGUpO1xuJiM0MztcdHJvb3QgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihyb290LCBcJiMzNDtwbGFpbl9yb290X2hlYWRlclwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0QVNTRVJUX0VRKHJvb3QgLSBvdXRwdXQsIDAsIFwmIzM0O3BsYWluX3Jvb3RfZmlyc3RcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFwmIzM0O2lubmVyX21hcF9pZDpcJiMzNDspLCBlbnRyaWVzLCBcJiMzNDtwbGFpbl9yZWZlcmVuY2VzXCYjMzQ7KTtcbiYjNDM7XHRpZiAoZW50cmllcykge1xuJiM0MztcdFx0c25wcmludGYoaGVhZGVyLCBzaXplb2YoaGVhZGVyKSwgXCYjMzQ7JXU6IGhhc2ggIG5hbWUgZHVtcF9pbm5lciAgXCYjMzQ7LCBpbm5lcl9pZCk7XG4mIzQzO1x0XHRpbm5lciA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7XG4mIzQzO1x0XHRpZiAoQVNTRVJUX09LX1BUUihpbm5lciwgXCYjMzQ7cGxhaW5faW5uZXJfaGVhZGVyXCYjMzQ7KSlcbiYjNDM7XHRcdFx0QVNTRVJUX0dUKGlubmVyIC0gcm9vdCwgMCwgXCYjMzQ7cGxhaW5faW5uZXJfYWZ0ZXJfcm9vdFwmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBoZWFkZXIpLCAxLCBcJiMzNDtwbGFpbl9pbm5lcl9vbmNlXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgXCYjMzQ7Rm91bmQgXCYjMzQ7KSwgZW50cmllcyBcdTAwMjZcdTAwMjYgIXR5cGVkID8gMiA6IDEsXG4mIzQzO1x0XHQgIFwmIzM0O3BsYWluX21hcF9jb3VudFwmIzM0Oyk7XG4mIzQzO1x0aWYgKHR5cGVkKSB7XG4mIzQzO1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIFwmIzM0O1xcXCYjMzQ7a2V5XFxcJiMzNDs6IDBcJiMzNDssIFwmIzM0O3BsYWluX2J0Zl9rZXlcJiMzNDspO1xuJiM0MztcdFx0QVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCBcJiMzNDtcXFwmIzM0O3ZhbHVlXFxcJiMzNDs6IDE2ODQzMDA5XCYjMzQ7LCBcJiMzNDtwbGFpbl9idGZfdmFsdWVcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9vdXRlcihlbnVtIGJwZl9tYXBfdHlwZSB0eXBlLCBpbnQgZW50cmllcywgYm9vbCBlbXB0eV9pbm5lcixcbiYjNDM7XHRcdCAgICAgICBib29sIHR5cGVkKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgaW5uZXJfb3B0cyk7XG4mIzQzO1x0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcbiYjNDM7XHRjaGFyIG91dGVyW09VVFBVVF9TSVpFXSwgaW5uZXJbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdO1xuJiM0MztcdGNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcmVmZXJlbmNlWzY0XTtcbiYjNDM7XHRjb25zdCBjaGFyICp0eXBlX25hbWUgPSBsaWJicGZfYnBmX21hcF90eXBlX3N0cih0eXBlKTtcbiYjNDM7XHRpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMTtcbiYjNDM7XHRfX3UzMiByb290X2lkLCBpbm5lcl9pZCwga2V5LCB2YWx1ZSA9IDB4MDEwMTAxMDE7XG4mIzQzO1xuJiM0MztcdGlmICh0eXBlZCkge1xuJiM0MztcdFx0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwmIzM0O2NyZWF0ZV9idGZcJiMzNDspIHx8XG4mIzQzO1x0XHQgICAgIUFTU0VSVF9FUShidGZfX2FkZF9pbnQoYnRmLCBcJiMzNDt1bnNpZ25lZCBpbnRcJiMzNDssIDQsIDApLCAxLCBcJiMzNDtidGZfaW50XCYjMzQ7KSB8fFxuJiM0MztcdFx0ICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksIFwmIzM0O2xvYWRfYnRmXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRpbm5lcl9vcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTtcbiYjNDM7XHRcdGlubmVyX29wdHMuYnRmX2tleV90eXBlX2lkID0gMTtcbiYjNDM7XHRcdGlubmVyX29wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxO1xuJiM0MztcdH1cbiYjNDM7XHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcJiMzNDtkdW1wX2lubmVyXCYjMzQ7LCBzaXplb2Yoa2V5KSxcbiYjNDM7XHRcdFx0XHQgIHNpemVvZih2YWx1ZSksIDIsIFx1MDAyNmlubmVyX29wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcJiMzNDtjcmVhdGVfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0a2V5ID0gMDtcbiYjNDM7XHRpZiAoIWVtcHR5X2lubmVyIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oaW5uZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O3BvcHVsYXRlX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XG4mIzQzO1x0b3V0ZXJfZmQgPSBicGZfbWFwX2NyZWF0ZSh0eXBlLCBcJiMzNDtkdW1wX291dGVyXCYjMzQ7LCBzaXplb2Yoa2V5KSwgc2l6ZW9mKF9fdTMyKSxcbiYjNDM7XHRcdFx0XHQgMywgXHUwMDI2b3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfRkQob3V0ZXJfZmQsIFwmIzM0O2NyZWF0ZV9vdXRlclwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHQvKiBUaGUgdW51c2VkIHRoaXJkIGFycmF5IHNsb3QgYWxzbyBleGVyY2lzZXMgZmFpbGVkIGxvb2t1cHMuICovXG4mIzQzO1x0Zm9yIChrZXkgPSAwOyBrZXkgXHUwMDNjIGVudHJpZXM7IGtleSYjNDM7JiM0MzspXG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCBcdTAwMjZrZXksIFx1MDAyNmlubmVyX2ZkLCBCUEZfQU5ZKSxcbiYjNDM7XHRcdFx0ICAgICAgIFwmIzM0O3BvcHVsYXRlX291dGVyXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0cm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7XG4mIzQzO1x0aW5uZXJfaWQgPSBtYXBfaWQoaW5uZXJfZmQpO1xuJiM0MztcdGlmICghcm9vdF9pZCB8fCAhaW5uZXJfaWQgfHwgIWR1bXBfbWFwKHJvb3RfaWQsIFwmIzM0Oy1qXCYjMzQ7LCBvdXRlcikgfHxcbiYjNDM7XHQgICAgIWR1bXBfbWFwKGlubmVyX2lkLCBcJiMzNDstalwmIzM0OywgaW5uZXIpKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUShvdXRlclswXSwgJiMzOTtbJiMzOTssIFwmIzM0O2RlZmF1bHRfYXJyYXlcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgXCYjMzQ7XFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OlwmIzM0OyksIDAsIFwmIzM0O2RlZmF1bHRfbm9fd3JhcHBlclwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCBcJiMzNDtcXFwmIzM0O2lkXFxcJiMzNDs6XCYjMzQ7KSwgMCwgXCYjMzQ7ZGVmYXVsdF9ub19oZWFkZXJcJiMzNDspO1xuJiM0MztcdHNucHJpbnRmKHJlZmVyZW5jZSwgc2l6ZW9mKHJlZmVyZW5jZSksIFwmIzM0O1xcXCYjMzQ7aW5uZXJfbWFwX2lkXFxcJiMzNDs6JXVcJiMzNDssIGlubmVyX2lkKTtcbiYjNDM7XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIHJlZmVyZW5jZSksIGVudHJpZXMsIFwmIzM0O2RlZmF1bHRfcmVmZXJlbmNlc1wmIzM0Oyk7XG4mIzQzO1x0aWYgKCFlbnRyaWVzKVxuJiM0MztcdFx0QVNTRVJUX1NUUkVRKG91dGVyLCBcJiMzNDtbXVwmIzM0OywgXCYjMzQ7ZW1wdHlfb3V0ZXJfZGVmYXVsdFwmIzM0Oyk7XG4mIzQzO1x0aWYgKGVtcHR5X2lubmVyKVxuJiM0MztcdFx0QVNTRVJUX1NUUkVRKGlubmVyLCBcJiMzNDtbXVwmIzM0OywgXCYjMzQ7ZW1wdHlfaW5uZXJfZGVmYXVsdFwmIzM0Oyk7XG4mIzQzO1x0ZWxzZSBpZiAodHlwZWQpXG4mIzQzO1x0XHRBU1NFUlRfSEFTX1NVQlNUUihpbm5lciwgXCYjMzQ7XFxcJiMzNDtmb3JtYXR0ZWRcXFwmIzM0Ozp7XFxcJiMzNDtrZXlcXFwmIzM0OzowLFxcXCYjMzQ7dmFsdWVcXFwmIzM0OzoxNjg0MzAwOX1cJiMzNDssXG4mIzQzO1x0XHRcdFx0ICBcJiMzNDt0eXBlZF9pbm5lclwmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0QVNTRVJUX1NUUkVRKGlubmVyLFxuJiM0MztcdFx0XHQgICAgIFwmIzM0O1t7XFxcJiMzNDtrZXlcXFwmIzM0OzpbXFxcJiMzNDsweDAwXFxcJiMzNDssXFxcJiMzNDsweDAwXFxcJiMzNDssXFxcJiMzNDsweDAwXFxcJiMzNDssXFxcJiMzNDsweDAwXFxcJiMzNDtdLFwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0O1xcXCYjMzQ7dmFsdWVcXFwmIzM0OzpbXFxcJiMzNDsweDAxXFxcJiMzNDssXFxcJiMzNDsweDAxXFxcJiMzNDssXFxcJiMzNDsweDAxXFxcJiMzNDssXFxcJiMzNDsweDAxXFxcJiMzNDtdfV1cJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7b3JkaW5hcnlfZGVmYXVsdFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdC8qIENvbXBhcmUgdGhlIGNvbXBsZXRlIEpTT04gZG9jdW1lbnQ6IGEgZmxhdCBhcnJheSB3aXRoIHRoZSByb290IGZpcnN0LFxuJiM0MztcdCAqIG9uZSBjb3B5IG9mIHRoZSBzaGFyZWQgaW5uZXIgbWFwLCBhbmQgdW5jaGFuZ2VkIGVudHJ5IHJlcHJlc2VudGF0aW9ucy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoZW50cmllcylcbiYjNDM7XHRcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuJiM0MztcdFx0XHQgXCYjMzQ7W3tcXFwmIzM0O2lkXFxcJiMzNDs6JXUsXFxcJiMzNDt0eXBlXFxcJiMzNDs6XFxcJiMzNDslc1xcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF9vdXRlclxcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0XHQgXCYjMzQ7XFxcJiMzNDtmbGFnc1xcXCYjMzQ7OjAsXFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OiVzfSx7XFxcJiMzNDtpZFxcXCYjMzQ7OiV1LFxcXCYjMzQ7dHlwZVxcXCYjMzQ7OlxcXCYjMzQ7aGFzaFxcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0XHQgXCYjMzQ7XFxcJiMzNDtuYW1lXFxcJiMzNDs6XFxcJiMzNDtkdW1wX2lubmVyXFxcJiMzNDssXFxcJiMzNDtmbGFnc1xcXCYjMzQ7OjAsXFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OiVzfV1cJiMzNDssXG4mIzQzO1x0XHRcdCByb290X2lkLCB0eXBlX25hbWUsIG91dGVyLCBpbm5lcl9pZCwgaW5uZXIpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuJiM0MztcdFx0XHQgXCYjMzQ7W3tcXFwmIzM0O2lkXFxcJiMzNDs6JXUsXFxcJiMzNDt0eXBlXFxcJiMzNDs6XFxcJiMzNDslc1xcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF9vdXRlclxcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0XHQgXCYjMzQ7XFxcJiMzNDtmbGFnc1xcXCYjMzQ7OjAsXFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OltdfV1cJiMzNDssIHJvb3RfaWQsIHR5cGVfbmFtZSk7XG4mIzQzO1x0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFwmIzM0Oy1qIC1yXCYjMzQ7LCBvdXRwdXQpKVxuJiM0MztcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwmIzM0O3JlY3Vyc2l2ZV9qc29uXCYjMzQ7KTtcbiYjNDM7XHRpZiAoZHVtcF9tYXAocm9vdF9pZCwgXCYjMzQ7LS1qc29uIC0tcmVjdXJzaXZlXCYjMzQ7LCBvdXRwdXQpKVxuJiM0MztcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwmIzM0O3JlY3Vyc2l2ZV9sb25nX29wdGlvbnNcJiMzNDspO1xuJiM0MztcdGNoZWNrX3BsYWluKHJvb3RfaWQsIGlubmVyX2lkLCB0eXBlX25hbWUsIGVudHJpZXMsIHR5cGVkKTtcbiYjNDM7XG4mIzQzO1x0LyogUmVjdXJzaW9uIG9uIGFuIG9yZGluYXJ5IG1hcCBzdGlsbCBlbWl0cyBhIHNpbmdsZSBtYXAgb2JqZWN0LiAqL1xuJiM0MztcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuJiM0MztcdFx0IFwmIzM0O1t7XFxcJiMzNDtpZFxcXCYjMzQ7OiV1LFxcXCYjMzQ7dHlwZVxcXCYjMzQ7OlxcXCYjMzQ7aGFzaFxcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF9pbm5lclxcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0IFwmIzM0O1xcXCYjMzQ7ZmxhZ3NcXFwmIzM0OzowLFxcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0Ozolc31dXCYjMzQ7LCBpbm5lcl9pZCwgaW5uZXIpO1xuJiM0MztcdGlmIChkdW1wX21hcChpbm5lcl9pZCwgXCYjMzQ7LWogLXJcJiMzNDssIG91dHB1dCkpXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCYjMzQ7b3JkaW5hcnlfcmVjdXJzaXZlXCYjMzQ7KTtcbiYjNDM7b3V0OlxuJiM0MztcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShvdXRlcl9mZCk7XG4mIzQzO1x0aWYgKGlubmVyX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGlubmVyX2ZkKTtcbiYjNDM7XHRidGZfX2ZyZWUoYnRmKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9tdWx0aXBsZV9yb290cyh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4mIzQzO1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBuYW1lW0JQRl9PQkpfTkFNRV9MRU5dO1xuJiM0MztcdGNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9LCBleHBlY3RlZFtPVVRQVVRfU0laRSAqIDRdLCBlbGVtZW50c1tPVVRQVVRfU0laRV07XG4mIzQzO1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlc1tdID0geyBcJiMzNDtoYXNoXCYjMzQ7LCBcJiMzNDthcnJheV9vZl9tYXBzXCYjMzQ7LCBcJiMzNDtoYXNoX29mX21hcHNcJiMzNDssIFwmIzM0O2hhc2hcJiMzNDsgfTtcbiYjNDM7XHRpbnQgZmRzW10gPSB7IC0xLCAtMSwgLTEsIC0xIH07XG4mIzQzO1x0X191MzIgaWRzWzRdLCBrZXk7XG4mIzQzO1x0aW50IGksIGxlbiA9IDA7XG4mIzQzO1xuJiM0MztcdC8qIFNlbGVjdCB0aGUgZmlyc3QgaW5uZXIgbWFwIGFuZCBib3RoIG91dGVycyBhcyByb290cy4gVGhlIG90aGVyIGlubmVyXG4mIzQzO1x0ICogbWFwIG11c3QgYmUgYXBwZW5kZWQgYWZ0ZXIgYWxsIHRocmVlIHJvb3RzLCBldmVuIHRob3VnaCBpdCBpcyBmb3VuZFxuJiM0MztcdCAqIHdoaWxlIGR1bXBpbmcgdGhlIGZpcnN0IG91dGVyLiBBIHByb2Nlc3Mtc3BlY2lmaWMgbmFtZSBhdm9pZHMgb3RoZXJcbiYjNDM7XHQgKiB0ZXN0cyYjMzk7IG1hcHMgam9pbmluZyB0aGUgc2VsZWN0aW9uLlxuJiM0MztcdCAqL1xuJiM0MztcdHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgXCYjMzQ7ZHVtcF8ldVwmIzM0OywgZ2V0cGlkKCkpO1xuJiM0MztcdGZkc1swXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBuYW1lLCA0LCA0LCAxLCBOVUxMKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMF0sIFwmIzM0O2NyZWF0ZV9zZWxlY3RlZF9pbm5lclwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRmZHNbM10gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCYjMzQ7ZHVtcF9kaXNjb3ZlcmVkXCYjMzQ7LCA0LCA0LCAxLCBOVUxMKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChmZHNbM10sIFwmIzM0O2NyZWF0ZV9kaXNjb3ZlcmVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdG9wdHMuaW5uZXJfbWFwX2ZkID0gZmRzWzBdO1xuJiM0MztcdGZkc1sxXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBuYW1lLCA0LCA0LCAyLCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMV0sIFwmIzM0O2NyZWF0ZV9hcnJheV9yb290XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZkc1syXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIG5hbWUsIDQsIDQsIDIsIFx1MDAyNm9wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGZkc1syXSwgXCYjMzQ7Y3JlYXRlX2hhc2hfcm9vdFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRmb3IgKGkgPSAxOyBpIFx1MDAzYz0gMjsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGtleSA9IDA7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXHUwMDI2a2V5LCBcdTAwMjZmZHNbMF0sIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cmVmZXJlbmNlX3NlbGVjdGVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRrZXkgPSAxO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZHNbaV0sIFx1MDAyNmtleSwgXHUwMDI2ZmRzWzNdLCBCUEZfQU5ZKSxcbiYjNDM7XHRcdFx0ICAgICAgIFwmIzM0O3JlZmVyZW5jZV9kaXNjb3ZlcmVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoZmRzKTsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlkc1tpXSA9IG1hcF9pZChmZHNbaV0pO1xuJiM0MztcdFx0aWYgKCFpZHNbaV0gfHwgIWR1bXBfbWFwKGlkc1tpXSwgXCYjMzQ7LWpcJiMzNDssIGVsZW1lbnRzKSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRsZW4gJiM0Mzs9IHNucHJpbnRmKGV4cGVjdGVkICYjNDM7IGxlbiwgc2l6ZW9mKGV4cGVjdGVkKSAtIGxlbixcbiYjNDM7XHRcdFx0XHRcJiMzNDslc3tcXFwmIzM0O2lkXFxcJiMzNDs6JXUsXFxcJiMzNDt0eXBlXFxcJiMzNDs6XFxcJiMzNDslc1xcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7JXNcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdFx0XHRcJiMzNDtcXFwmIzM0O2ZsYWdzXFxcJiMzNDs6MCxcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6JXN9JXNcJiMzNDssXG4mIzQzO1x0XHRcdFx0aSA/IFwmIzM0OyxcJiMzNDsgOiBcJiMzNDtbXCYjMzQ7LCBpZHNbaV0sIHR5cGVzW2ldLFxuJiM0MztcdFx0XHRcdGkgPT0gMyA/IFwmIzM0O2R1bXBfZGlzY292ZXJlZFwmIzM0OyA6IG5hbWUsIGVsZW1lbnRzLCBpID09IDMgPyBcJiMzNDtdXCYjMzQ7IDogXCYjMzQ7XCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcJiMzNDstaiAtciBtYXAgZHVtcCBuYW1lICVzXCYjMzQ7LCBuYW1lKTtcbiYjNDM7XHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcbiYjNDM7XHRcdCAgICAgIFwmIzM0O2R1bXBfbXVsdGlwbGVfcm9vdHNcJiMzNDspKSB7XG4mIzQzO1x0XHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFwmIzM0O1xcblwmIzM0OyldID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcJiMzNDtyb290c19maXJzdF9hbmRfc2VlZF9kZWR1cFwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztvdXQ6XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShmZHMpOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdGlmIChmZHNbaV0gXHUwMDNlPSAwKVxuJiM0MztcdFx0XHRjbG9zZShmZHNbaV0pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3VucmVhZGFibGUoYm9vbCBvdXRlcilcbiYjNDM7e1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xuJiM0MztcdGNoYXIgZWxlbWVudHNbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdLCByb290W09VVFBVVF9TSVpFXTtcbiYjNDM7XHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHBsYWluW09VVFBVVF9TSVpFXSA9IHt9O1xuJiM0MztcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXTtcbiYjNDM7XHRpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMSwgbG9va3VwX2Vycm5vO1xuJiM0MztcdF9fdTMyIGlubmVyX2lkLCByb290X2lkLCBrZXkgPSAwLCB2YWx1ZTtcbiYjNDM7XG4mIzQzO1x0LyogRXZlcnkga2V5IGlzIGVudW1lcmFibGUsIGJ1dCBQRVJGX0VWRU5UX0FSUkFZIGxvb2t1cCByZXR1cm5zXG4mIzQzO1x0ICogRU5PVFNVUFAgKHRoZSBrZXJuZWwtaW50ZXJuYWwgZXJybm8pLiBDaGVjayBib3RoIGVudHJpZXMgc28gYW5cbiYjNDM7XHQgKiBlYXJseSBleGl0IG9uIHRoZSBmaXJzdCBsb29rdXAgZmFpbHVyZSBjYW5ub3QgcGFzcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZLCBcJiMzNDtkdW1wX3VucmVhZGFibGVcJiMzNDssXG4mIzQzO1x0XHRcdFx0ICBzaXplb2Yoa2V5KSwgc2l6ZW9mKHZhbHVlKSwgMiwgTlVMTCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFwmIzM0O2NyZWF0ZV91bnJlYWRhYmxlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICghQVNTRVJUX0xUKGJwZl9tYXBfbG9va3VwX2VsZW0oaW5uZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2dmFsdWUpLCAwLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O3VucmVhZGFibGVfbG9va3VwXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGxvb2t1cF9lcnJubyA9IGVycm5vO1xuJiM0MztcdGlmICghQVNTRVJUX05FUShsb29rdXBfZXJybm8sIEVOT0VOVCwgXCYjMzQ7dW5yZWFkYWJsZV9ub3RfbWlzc2luZ1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpbm5lcl9pZCA9IG1hcF9pZChpbm5lcl9mZCk7XG4mIzQzO1x0aWYgKCFpbm5lcl9pZCB8fCAhZHVtcF9tYXAoaW5uZXJfaWQsIFwmIzM0Oy1qXCYjMzQ7LCBlbGVtZW50cykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRBU1NFUlRfRVEoY291bnRfdG9rZW4oZWxlbWVudHMsIFwmIzM0O1xcXCYjMzQ7ZXJyb3JcXFwmIzM0OzpcJiMzNDspLCAyLCBcJiMzNDtkZWZhdWx0X2pzb25fZXJyb3JzXCYjMzQ7KTtcbiYjNDM7XHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwmIzM0O21hcCBkdW1wIGlkICV1XCYjMzQ7LCBpbm5lcl9pZCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgcGxhaW4sIHNpemVvZihwbGFpbikgLSAxKSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtkZWZhdWx0X3BsYWluX3VucmVhZGFibGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKHBsYWluLCBzdHJlcnJvcihsb29rdXBfZXJybm8pKSwgMiwgXCYjMzQ7ZGVmYXVsdF9wbGFpbl9lcnJvcnNcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9IQVNfU1VCU1RSKHBsYWluLCBcJiMzNDtGb3VuZCAwIGVsZW1lbnRzXCYjMzQ7LCBcJiMzNDtkZWZhdWx0X3BsYWluX2NvdW50XCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0cm9vdF9pZCA9IGlubmVyX2lkO1xuJiM0MztcdGlmIChvdXRlcikge1xuJiM0MztcdFx0b3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDtcbiYjNDM7XHRcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIFwmIzM0O2R1bXBfb3V0ZXJcJiMzNDssXG4mIzQzO1x0XHRcdFx0XHQgc2l6ZW9mKGtleSksIHNpemVvZih2YWx1ZSksIDEsIFx1MDAyNm9wdHMpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0tfRkQob3V0ZXJfZmQsIFwmIzM0O2NyZWF0ZV9vdXRlclwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cG9wdWxhdGVfb3V0ZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xuJiM0MztcdFx0aWYgKCFyb290X2lkIHx8ICFkdW1wX21hcChyb290X2lkLCBcJiMzNDstalwmIzM0Oywgcm9vdCkpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4mIzQzO1x0XHRcdCBcJiMzNDtbe1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcXFwmIzM0O3R5cGVcXFwmIzM0OzpcXFwmIzM0O2FycmF5X29mX21hcHNcXFwmIzM0OyxcXFwmIzM0O25hbWVcXFwmIzM0OzpcXFwmIzM0O2R1bXBfb3V0ZXJcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdFx0IFwmIzM0O1xcXCYjMzQ7ZmxhZ3NcXFwmIzM0OzowLFxcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0Ozolc30se1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcJiMzNDtcbiYjNDM7XHRcdFx0IFwmIzM0O1xcXCYjMzQ7dHlwZVxcXCYjMzQ7OlxcXCYjMzQ7cGVyZl9ldmVudF9hcnJheVxcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF91bnJlYWRhYmxlXFxcJiMzNDssXCYjMzQ7XG4mIzQzO1x0XHRcdCBcJiMzNDtcXFwmIzM0O2ZsYWdzXFxcJiMzNDs6MCxcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6JXN9XVwmIzM0Oywgcm9vdF9pZCwgcm9vdCwgaW5uZXJfaWQsIGVsZW1lbnRzKTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4mIzQzO1x0XHRcdCBcJiMzNDtbe1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcXFwmIzM0O3R5cGVcXFwmIzM0OzpcXFwmIzM0O3BlcmZfZXZlbnRfYXJyYXlcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdFx0IFwmIzM0O1xcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF91bnJlYWRhYmxlXFxcJiMzNDssXFxcJiMzNDtmbGFnc1xcXCYjMzQ7OjAsXFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OiVzfV1cJiMzNDssXG4mIzQzO1x0XHRcdCBpbm5lcl9pZCwgZWxlbWVudHMpO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoZHVtcF9tYXAocm9vdF9pZCwgXCYjMzQ7LWogLXJcJiMzNDssIG91dHB1dCkpXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCYjMzQ7cmVjdXJzaXZlX3VucmVhZGFibGVfanNvblwmIzM0Oyk7XG4mIzQzO1x0bWVtc2V0KG91dHB1dCwgMCwgc2l6ZW9mKG91dHB1dCkpO1xuJiM0MztcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCYjMzQ7LXIgbWFwIGR1bXAgaWQgJXVcJiMzNDssIHJvb3RfaWQpO1xuJiM0MztcdGlmIChBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxuJiM0MztcdFx0ICAgICAgXCYjMzQ7cmVjdXJzaXZlX3VucmVhZGFibGVfcGxhaW5cJiMzNDspKSB7XG4mIzQzO1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIHBsYWluLCBcJiMzNDtyZWN1cnNpdmVfcGxhaW5fcHJlc2VydmVzX2Vycm9yc1wmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBzdHJlcnJvcihsb29rdXBfZXJybm8pKSwgMixcbiYjNDM7XHRcdFx0ICBcJiMzNDtyZWN1cnNpdmVfcGxhaW5fZXJyb3JzXCYjMzQ7KTtcbiYjNDM7XHRcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFwmIzM0O0ZvdW5kIFwmIzM0OyksIG91dGVyID8gMiA6IDEsXG4mIzQzO1x0XHRcdCAgXCYjMzQ7cmVjdXJzaXZlX3BsYWluX21hcHNcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7b3V0OlxuJiM0MztcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShvdXRlcl9mZCk7XG4mIzQzO1x0aWYgKGlubmVyX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGlubmVyX2ZkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9tYW55X2lubmVyX21hcHMoYm9vbCBqc29uKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4mIzQzO1x0Y29uc3Qgc3RydWN0IHJsaW1pdCBsaW1pdCA9IHsgLnJsaW1fY3VyID0gMzIsIC5ybGltX21heCA9IDMyIH07XG4mIzQzO1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCB0b2tlbls2NF07XG4mIzQzO1x0X191MzIgaWRzWzY0XSwgcm9vdF9pZCwga2V5O1xuJiM0MztcdGludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xLCBzdGF0dXM7XG4mIzQzO1x0Y2hhciAqb3V0cHV0ID0gTlVMTDtcbiYjNDM7XHRwaWRfdCBwaWQ7XG4mIzQzO1xuJiM0MztcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwmIzM0O2R1bXBfaW5uZXJcJiMzNDssIDQsIDQsIDEsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcJiMzNDtjcmVhdGVfdGVtcGxhdGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDtcbiYjNDM7XHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBcJiMzNDtkdW1wX291dGVyXCYjMzQ7LCA0LCA0LFxuJiM0MztcdFx0XHRcdCBBUlJBWV9TSVpFKGlkcyksIFx1MDAyNm9wdHMpO1xuJiM0MztcdGNsb3NlKGlubmVyX2ZkKTtcbiYjNDM7XHRpbm5lcl9mZCA9IC0xO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcJiMzNDtjcmVhdGVfb3V0ZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0Zm9yIChrZXkgPSAwOyBrZXkgXHUwMDNjIEFSUkFZX1NJWkUoaWRzKTsga2V5JiM0MzsmIzQzOykge1xuJiM0MztcdFx0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCYjMzQ7ZHVtcF9pbm5lclwmIzM0OywgNCwgNCwgMSwgTlVMTCk7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgXCYjMzQ7Y3JlYXRlX2lubmVyXCYjMzQ7KSB8fFxuJiM0MztcdFx0ICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgXHUwMDI2a2V5LCBcdTAwMjZpbm5lcl9mZCwgQlBGX0FOWSksXG4mIzQzO1x0XHRcdCAgICAgICBcJiMzNDtwb3B1bGF0ZV9vdXRlclwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0aWRzW2tleV0gPSBtYXBfaWQoaW5uZXJfZmQpO1xuJiM0MztcdFx0aWYgKCFpZHNba2V5XSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHQvKiBUaGUgb3V0ZXIgbWFwIGtlZXBzIGVhY2ggZGlzdGluY3QgaW5uZXIgbWFwIGFsaXZlLiAqL1xuJiM0MztcdFx0Y2xvc2UoaW5uZXJfZmQpO1xuJiM0MztcdFx0aW5uZXJfZmQgPSAtMTtcbiYjNDM7XHR9XG4mIzQzO1x0cm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7XG4mIzQzO1x0b3V0cHV0ID0gY2FsbG9jKDEsIDY1NTM2KTtcbiYjNDM7XHRpZiAoIXJvb3RfaWQgfHwgIUFTU0VSVF9PS19QVFIob3V0cHV0LCBcJiMzNDthbGxvY2F0ZV9vdXRwdXRcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdC8qIENyZWF0ZSBhbGwgZml4dHVyZXMgYmVmb3JlIGxvd2VyaW5nIHRoZSBsaW1pdCwgYW5kIGtlZXAgdGhlIHRlc3RcbiYjNDM7XHQgKiBydW5uZXImIzM5O3MgbGltaXQgdW5jaGFuZ2VkLiBSZXRhaW5pbmcgZXZlcnkgZGlzY292ZXJlZCBGRCB3b3VsZCBleGNlZWRcbiYjNDM7XHQgKiB0aGlzIGxpbWl0IGJlZm9yZSB0aGUgcmVjdXJzaXZlIGR1bXAgY291bGQgdmlzaXQgYWxsIGlubmVyIG1hcHMuXG4mIzQzO1x0ICovXG4mIzQzO1x0cGlkID0gZm9yaygpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHBpZCwgMCwgXCYjMzQ7Zm9ya1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIXBpZCkge1xuJiM0MztcdFx0Y2xvc2Uob3V0ZXJfZmQpO1xuJiM0MztcdFx0aWYgKHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCBcdTAwMjZsaW1pdCkpXG4mIzQzO1x0XHRcdF9leGl0KDEpO1xuJiM0MztcdFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcJiMzNDslcyAtciBtYXAgZHVtcCBpZCAldVwmIzM0OyxcbiYjNDM7XHRcdFx0IGpzb24gPyBcJiMzNDstalwmIzM0OyA6IFwmIzM0O1wmIzM0Oywgcm9vdF9pZCk7XG4mIzQzO1x0XHRpZiAoZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCA2NTUzNSkpXG4mIzQzO1x0XHRcdF9leGl0KDIpO1xuJiM0MztcdFx0aWYgKGNvdW50X3Rva2VuKG91dHB1dCwganNvbiA/IFwmIzM0O1xcXCYjMzQ7aWRcXFwmIzM0OzpcJiMzNDsgOiBcJiMzNDtGb3VuZCBcJiMzNDspICE9IEFSUkFZX1NJWkUoaWRzKSAmIzQzOyAxIHx8XG4mIzQzO1x0XHQgICAgY291bnRfdG9rZW4ob3V0cHV0LCBqc29uID8gXCYjMzQ7XFxcJiMzNDtpbm5lcl9tYXBfaWRcXFwmIzM0OzpcJiMzNDsgOiBcJiMzNDtpbm5lcl9tYXBfaWQ6XCYjMzQ7KSAhPVxuJiM0MztcdFx0ICAgIEFSUkFZX1NJWkUoaWRzKSlcbiYjNDM7XHRcdFx0X2V4aXQoMyk7XG4mIzQzO1x0XHRmb3IgKGtleSA9IDA7IGtleSBcdTAwM2MgQVJSQVlfU0laRShpZHMpOyBrZXkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdGlmIChqc29uKVxuJiM0MztcdFx0XHRcdHNucHJpbnRmKHRva2VuLCBzaXplb2YodG9rZW4pLCBcJiMzNDtcXFwmIzM0O2lkXFxcJiMzNDs6JXUsXCYjMzQ7LCBpZHNba2V5XSk7XG4mIzQzO1x0XHRcdGVsc2VcbiYjNDM7XHRcdFx0XHRzbnByaW50Zih0b2tlbiwgc2l6ZW9mKHRva2VuKSwgXCYjMzQ7XFxuJXU6IGhhc2ggIG5hbWUgZHVtcF9pbm5lciAgXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0IGlkc1trZXldKTtcbiYjNDM7XHRcdFx0aWYgKGNvdW50X3Rva2VuKG91dHB1dCwgdG9rZW4pICE9IDEpXG4mIzQzO1x0XHRcdFx0X2V4aXQoNCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAoanNvbiBcdTAwMjZcdTAwMjYgKG91dHB1dFswXSAhPSAmIzM5O1smIzM5OyB8fFxuJiM0MztcdFx0XHQgICAgIHN0cmNtcChvdXRwdXQgJiM0Mzsgc3RybGVuKG91dHB1dCkgLSAyLCBcJiMzNDtdXFxuXCYjMzQ7KSkpXG4mIzQzO1x0XHRcdF9leGl0KDUpO1xuJiM0MztcdFx0X2V4aXQoMCk7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChBU1NFUlRfRVEod2FpdHBpZChwaWQsIFx1MDAyNnN0YXR1cywgMCksIHBpZCwgXCYjMzQ7d2FpdHBpZFwmIzM0OykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIEFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcJiMzNDtjaGlsZF9leGl0ZWRcJiMzNDspKVxuJiM0MztcdFx0QVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIDAsIFwmIzM0O2R1bXBfd2l0aF9sb3dfZmRfbGltaXRcJiMzNDspO1xuJiM0MztvdXQ6XG4mIzQzO1x0ZnJlZShvdXRwdXQpO1xuJiM0MztcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShvdXRlcl9mZCk7XG4mIzQzO1x0aWYgKGlubmVyX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGlubmVyX2ZkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2R1bXAodm9pZClcbiYjNDM7e1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3VucmVhZGFibGVfb3JkaW5hcnlcJiMzNDspKVxuJiM0MztcdFx0dGVzdF91bnJlYWRhYmxlKGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt1bnJlYWRhYmxlX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfdW5yZWFkYWJsZSh0cnVlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDttYW55X2lubmVyX21hcHNfanNvblwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X21hbnlfaW5uZXJfbWFwcyh0cnVlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDttYW55X2lubmVyX21hcHNfcGxhaW5cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9tYW55X2lubmVyX21hcHMoZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O211bHRpcGxlX3Jvb3RzXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfbXVsdGlwbGVfcm9vdHMoKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDthcnJheV9vZl9tYXBzXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7aGFzaF9vZl9tYXBzXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtzaGFyZWRfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMiwgZmFsc2UsIGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtlbXB0eV9hcnJheV9vZl9tYXBzXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7ZW1wdHlfaGFzaF9vZl9tYXBzXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMCwgZmFsc2UsIGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtidGZfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCBmYWxzZSwgdHJ1ZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7ZW1wdHlfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCB0cnVlLCBmYWxzZSk7XG4mIzQzO31cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMToyMzwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBvbmx5IHVzZXItc3BhY2UgdG9vbHMgYW5kIHNlbGZ0ZXN0cyB1bmRlciB0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLiBJdCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzCnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsCmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuCgotIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOgogIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQKICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLgogIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCwKICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuCgotIERPIE5PVCBCTElORExZIFRSVVNUICYjMzQ7Tk8gRlVOQ1RJT05BTCBDSEFOR0UmIzM0OyAoTkZDSSkgT1IgJiMzNDtSRUZBQ1RPUklORyYjMzQ7IENMQUlNUzoKICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzICYjMzQ7Y2xlYW51cHMmIzM0OywgJiMzNDtyZWZhY3RvcmluZ3MmIzM0Oywgb3Igc3RhdGUKICAmIzM0O05vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkJiMzNDsuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLgogIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudAogIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLgogIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuCgotIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOgogIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKiwKICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy4KICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyCiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczoKCi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczoKICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy4KICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKQogICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLgogICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHMKICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuCiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuCi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOgogICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6CiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmcKICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLgogICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOgotIENvcmUgU3Vic3lzdGVtczoKICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSwKICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy4KLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6CiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuCi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOgogICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLgotIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6CiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo0LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6CgotIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzoKICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1cwogIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0CiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuCiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzICYjMzQ7Zm9jdXNlZCYjMzQ7LAogIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy4KCi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOgogIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50cwogIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LgoKLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6CiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFjawogIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLgogIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlcgogIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZToKLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgotIENoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuCi0gU3RyaXAgYW55ICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDQyMmZhNTc4NmY1YzEyYmExNTIzZGJkOGU1MGU3ZmM5ZDI1YmZlZWQKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIFNlcCA3IDAxOjIzOjU4IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdAppbmRleCA1ZGFmM2RlNWM3NDQ2Li4zOGQxZjU0MmJmNWE1IDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdApAQCAtMTYsNyAmIzQzOzE2LDcgQEAgU1lOT1BTSVMKIAogKipicGZ0b29sKiogWypPUFRJT05TKl0gKiptYXAqKiAqQ09NTUFORCoKIAotKk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8IHsgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IH0KJiM0MzsqT1BUSU9OUyogOj0geyB8Q09NTU9OX09QVElPTlN8IHwgeyAqKi1mKiogfCAqKi0tYnBmZnMqKiB9IHwgeyAqKi1uKiogfCAqKi0tbm9tb3VudCoqIH0gfCB7ICoqLXIqKiB8ICoqLS1yZWN1cnNpdmUqKiB9IH0KIAogKkNPTU1BTkRTKiA6PQogeyAqKnNob3cqKiB8ICoqbGlzdCoqIHwgKipjcmVhdGUqKiB8ICoqZHVtcCoqIHwgKip1cGRhdGUqKiB8ICoqbG9va3VwKiogfCAqKmdldG5leHQqKiB8CkBAIC0xNzAsNiAmIzQzOzE3MCwyNSBAQCBPUFRJT05TCiAgICAgRG8gbm90IGF1dG9tYXRpY2FsbHkgYXR0ZW1wdCB0byBtb3VudCBhbnkgdmlydHVhbCBmaWxlIHN5c3RlbSAoc3VjaCBhcwogICAgIHRyYWNlZnMgb3IgQlBGIHZpcnR1YWwgZmlsZSBzeXN0ZW0pIHdoZW4gbmVjZXNzYXJ5LgogCiYjNDM7LXIsIC0tcmVjdXJzaXZlCiYjNDM7ICAgIEFsc28gZHVtcCB0aGUgaW5uZXIgbWFwcyByZWZlcmVuY2VkIGJ5ICoqYXJyYXlfb2ZfbWFwcyoqIGFuZCAqKmhhc2hfb2ZfbWFwcyoqCiYjNDM7ICAgIGVudHJpZXMgd2hlbiBydW5uaW5nICoqbWFwIGR1bXAqKi4gRWFjaCBtYXAgSUQgaXMgdmlzaXRlZCBvbmNlLCBldmVuIGlmCiYjNDM7ICAgIHNldmVyYWwgZW50cmllcyByZWZlciB0byBpdC4gU2VsZWN0ZWQgbWFwcyBhcmUgZm9sbG93ZWQgYnkgdGhlaXIgaW5uZXIgbWFwcy4KJiM0MzsKJiM0MzsgICAgUGxhaW4gb3V0cHV0IGluY2x1ZGVzIGEgaGVhZGVyIGlkZW50aWZ5aW5nIGVhY2ggbWFwLiBPbiBzdWNjZXNzLCBKU09OIG91dHB1dAomIzQzOyAgICBpcyBhbHdheXMgYW4gYXJyYXkgb2YgbWFwIG9iamVjdHMsIGVhY2ggY29udGFpbmluZyBhbiAqKmlkKiogYW5kIGFuCiYjNDM7ICAgICoqZWxlbWVudHMqKiBhcnJheSwgaW5jbHVkaW5nIHdoZW4gb25seSBvbmUgbWFwIGlzIGR1bXBlZC4gT3V0ZXIgbWFwIGVudHJpZXMKJiM0MzsgICAgcmV0YWluIHRoZWlyICoqaW5uZXJfbWFwX2lkKiogZmllbGQsIHdoaWNoIGlkZW50aWZpZXMgdGhlIGNvcnJlc3BvbmRpbmcgaW5uZXIKJiM0MzsgICAgbWFwIG9iamVjdC4KJiM0MzsKJiM0MzsgICAgSW5uZXIgbWFwIElEcyBhcmUgcmVzb2x2ZWQgd2hlbiB0aGUgbWFwcyBhcmUgdmlzaXRlZC4gVGhlIGR1bXAgaXMgbm90IGFuCiYjNDM7ICAgIGF0b21pYyBzbmFwc2hvdDogY29uY3VycmVudCB1cGRhdGVzIGNhbiBjaGFuZ2UgbWFwIGNvbnRlbnRzIG9yIHJlbW92ZSBhCiYjNDM7ICAgIHJlZmVyZW5jZWQgaW5uZXIgbWFwIGJlZm9yZSBpdCBpcyB2aXNpdGVkLiBGYWlsdXJlIHRvIG9wZW4gYSByZWZlcmVuY2VkCiYjNDM7ICAgIGlubmVyIG1hcCBzdG9wcyB0aGUgZHVtcCBhbmQgcmV0dXJucyBhIG5vbnplcm8gZXhpdCBzdGF0dXMuIE91dHB1dCBtYXkKJiM0MzsgICAgY29udGFpbiBtYXBzIG9yIGVudHJpZXMgcHJpbnRlZCBiZWZvcmUgdGhlIGVycm9yLgomIzQzOyAgICBJbiBKU09OIG1vZGUsIGFuIGVycm9yIGR1cmluZyB0cmF2ZXJzYWwgaXMgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBhbmQgdGhlCiYjNDM7ICAgIGVuY2xvc2luZyBhcnJheXMgYW5kIG9iamVjdHMgYXJlIGNsb3NlZC4KJiM0MzsKIEVYQU1QTEVTCiA9PT09PT09PQogKiojIGJwZnRvb2wgbWFwIHNob3cqKgpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2wgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbAppbmRleCA3NWNiY2I1MTJlYmFlLi40NWMzMzZkNjNiZTBhIDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbApAQCAtMjYxLDcgJiM0MzsyNjEsNyBAQCBfYnBmdG9vbCgpCiAKICAgICAjIERlYWwgd2l0aCBvcHRpb25zCiAgICAgaWYgW1sgJHt3b3Jkc1tjd29yZF19ID09IC0qIF1dOyB0aGVuCi0gICAgICAgIGxvY2FsIGM9JiMzOTstLXZlcnNpb24gLS1qc29uIC0tcHJldHR5IC0tYnBmZnMgLS1tYXBjb21wYXQgLS1kZWJ1ZyBcCiYjNDM7ICAgICAgICBsb2NhbCBjPSYjMzk7LS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLXJlY3Vyc2l2ZSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXAogICAgICAgICAgICAgLS11c2UtbG9hZGVyIC0tYmFzZS1idGYgLS1zaWduIC1pIC1rJiMzOTsKICAgICAgICAgQ09NUFJFUExZPSggJCggY29tcGdlbiAtVyAmIzM0OyRjJiMzNDsgLS0gJiMzNDskY3VyJiMzNDsgKSApCiAgICAgICAgIHJldHVybiAwCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmMgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmMKaW5kZXggYzkxZTFhNmUxYTFlYy4uMjkwMjFmNGRkNDUxOCAxMDA2NDQKLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uYwpAQCAtMjYsNiAmIzQzOzI2LDcgQEAgc3RhdGljIGludCAoKmxhc3RfZG9faGVscCkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKIGpzb25fd3JpdGVyX3QgKmpzb25fd3RyOwogYm9vbCBwcmV0dHlfb3V0cHV0OwogYm9vbCBqc29uX291dHB1dDsKJiM0Mztib29sIHJlY3Vyc2l2ZTsKIGJvb2wgc2hvd19waW5uZWQ7CiBib29sIGJsb2NrX21vdW50OwogYm9vbCB2ZXJpZmllcl9sb2dzOwpAQCAtNDUyLDYgJiM0Mzs0NTMsNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCXsgJiMzNDtqc29uJiMzNDssCW5vX2FyZ3VtZW50LAlOVUxMLAkmIzM5O2omIzM5OyB9LAogCQl7ICYjMzQ7aGVscCYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTtoJiMzOTsgfSwKIAkJeyAmIzM0O3ByZXR0eSYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTtwJiMzOTsgfSwKJiM0MzsJCXsgJiMzNDtyZWN1cnNpdmUmIzM0OywJbm9fYXJndW1lbnQsCU5VTEwsCSYjMzk7ciYjMzk7IH0sCiAJCXsgJiMzNDt2ZXJzaW9uJiMzNDssCW5vX2FyZ3VtZW50LAlOVUxMLAkmIzM5O1YmIzM5OyB9LAogCQl7ICYjMzQ7YnBmZnMmIzM0OywJbm9fYXJndW1lbnQsCU5VTEwsCSYjMzk7ZiYjMzk7IH0sCiAJCXsgJiMzNDttYXBjb21wYXQmIzM0OywJbm9fYXJndW1lbnQsCU5VTEwsCSYjMzk7bSYjMzk7IH0sCkBAIC00ODUsNyAmIzQzOzQ4Nyw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIAliaW5fbmFtZSA9ICYjMzQ7YnBmdG9vbCYjMzQ7OwogCiAJb3B0ZXJyID0gMDsKLQl3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICYjMzQ7VmhwamZMbW5kU2k6azpCOmwmIzM0OywKJiM0MzsJd2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAmIzM0O1ZocGpyZkxtbmRTaTprOkI6bCYjMzQ7LAogCQkJCSAgb3B0aW9ucywgTlVMTCkpICZndDs9IDApIHsKIAkJc3dpdGNoIChvcHQpIHsKIAkJY2FzZSAmIzM5O1YmIzM5OzoKQEAgLTUwNyw2ICYjNDM7NTA5LDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCQkJfQogCQkJanNvbndfcHJldHR5KGpzb25fd3RyLCBwcmV0dHlfb3V0cHV0KTsKIAkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O3ImIzM5OzoKJiM0MzsJCQlyZWN1cnNpdmUgPSB0cnVlOwomIzQzOwkJCWJyZWFrOwogCQljYXNlICYjMzk7ZiYjMzk7OgogCQkJc2hvd19waW5uZWQgPSB0cnVlOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmggYi90b29scy9icGYvYnBmdG9vbC9tYWluLmgKaW5kZXggNzhiNmUwZWJiODVkOC4uYjVkYzc5NjBjZjY4MiAxMDA2NDQKLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaApAQCAtODMsNiAmIzQzOzgzLDcgQEAgZXh0ZXJuIGNvbnN0IGNoYXIgKmJpbl9uYW1lOwogCiBleHRlcm4ganNvbl93cml0ZXJfdCAqanNvbl93dHI7CiBleHRlcm4gYm9vbCBqc29uX291dHB1dDsKJiM0MztleHRlcm4gYm9vbCByZWN1cnNpdmU7CiBleHRlcm4gYm9vbCBzaG93X3Bpbm5lZDsKIGV4dGVybiBib29sIHNob3dfcGlkczsKIGV4dGVybiBib29sIGJsb2NrX21vdW50OwpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuYwppbmRleCA2ODRhOGZiNzI0MTQ2Li5mYzA2Yzc2NTk3MzE1IDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXAuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9tYXAuYwpAQCAtMTcsNiAmIzQzOzE3LDcgQEAKICNpbmNsdWRlICZsdDticGYvYnBmLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7YnBmL2J0Zi5oJmd0OwogI2luY2x1ZGUgJmx0O2JwZi9oYXNobWFwLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9saWJicGZfaW50ZXJuYWwuaCZndDsKIAogI2luY2x1ZGUgJiMzNDtqc29uX3dyaXRlci5oJiMzNDsKICNpbmNsdWRlICYjMzQ7bWFpbi5oJiMzNDsKQEAgLTgyNiwxMiAmIzQzOzgyNyw0NCBAQCBzdGF0aWMgdm9pZCBmcmVlX21hcF9rdl9idGYoc3RydWN0IGJ0ZiAqYnRmKQogCQlidGZfX2ZyZWUoYnRmKTsKIH0KIAomIzQzO3N0cnVjdCBtYXBfZHVtcF9jdHggewomIzQzOwlzdHJ1Y3QgaGFzaG1hcCAqc2VlbjsKJiM0MzsJX191MzIgKnBlbmRpbmdfaWRzOwomIzQzOwlzaXplX3QgcGVuZGluZ19jbnQ7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGNvbGxlY3RfaW5uZXJfbWFwKHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eCwgX191MzIgaWQpCiYjNDM7ewomIzQzOwlfX3UzMiAqaWRzOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlpZiAoaGFzaG1hcF9fZmluZChjdHgtJmd0O3NlZW4sIGlkLCBOVUxMKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlpZHMgPSBsaWJicGZfcmVhbGxvY2FycmF5KGN0eC0mZ3Q7cGVuZGluZ19pZHMsIGN0eC0mZ3Q7cGVuZGluZ19jbnQgJiM0MzsgMSwKJiM0MzsJCQkJIHNpemVvZigqaWRzKSk7CiYjNDM7CWlmICghaWRzKSB7CiYjNDM7CQlwX2VycigmIzM0O21lbSBhbGxvYyBmYWlsZWQmIzM0Oyk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KJiM0MzsJY3R4LSZndDtwZW5kaW5nX2lkcyA9IGlkczsKJiM0MzsKJiM0MzsJZXJyID0gaGFzaG1hcF9fYWRkKGN0eC0mZ3Q7c2VlbiwgaWQsIDApOwomIzQzOwlpZiAoZXJyKSB7CiYjNDM7CQlwX2VycigmIzM0O2ZhaWxlZCB0byByZWNvcmQgaW5uZXIgbWFwIGlkICV1OiAlcyYjMzQ7LCBpZCwgc3RyZXJyb3IoLWVycikpOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CWlkc1tjdHgtJmd0O3BlbmRpbmdfY250JiM0MzsmIzQzO10gPSBpZDsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwogc3RhdGljIGludAogbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsCi0JIGJvb2wgc2hvd19oZWFkZXIpCiYjNDM7CSBib29sIHNob3dfaGVhZGVyLCBzdHJ1Y3QgbWFwX2R1bXBfY3R4ICpjdHgpCiB7CiAJdm9pZCAqa2V5LCAqdmFsdWUsICpwcmV2X2tleTsKIAl1bnNpZ25lZCBpbnQgbnVtX2VsZW1zID0gMDsKJiM0MzsJanNvbl93cml0ZXJfdCAqcGxhaW5fYnRmX3d0ciA9IE5VTEw7CiAJc3RydWN0IGJ0ZiAqYnRmID0gTlVMTDsKIAlpbnQgZXJyOwogCkBAIC04NDUsNiAmIzQzOzg3OCwxNyBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0ciwKIAogCXByZXZfa2V5ID0gTlVMTDsKIAomIzQzOwlpZiAoY3R4ICZhbXA7JmFtcDsgIXd0ciAmYW1wOyZhbXA7IChpbmZvLSZndDtidGZfdmFsdWVfdHlwZV9pZCB8fAomIzQzOwkJCSAgICBpbmZvLSZndDtidGZfdm1saW51eF92YWx1ZV90eXBlX2lkKSkgewomIzQzOwkJcGxhaW5fYnRmX3d0ciA9IGdldF9idGZfd3JpdGVyKCk7CiYjNDM7CQlpZiAocGxhaW5fYnRmX3d0cikgewomIzQzOwkJCWlmIChzaG93X2hlYWRlcikKJiM0MzsJCQkJc2hvd19tYXBfaGVhZGVyX3BsYWluKGluZm8pOwomIzQzOwkJCXNob3dfaGVhZGVyID0gZmFsc2U7CiYjNDM7CQkJd3RyID0gcGxhaW5fYnRmX3d0cjsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwogCWlmICh3dHIpIHsKIAkJZXJyID0gZ2V0X21hcF9rdl9idGYoaW5mbywgJmFtcDtidGYpOwogCQlpZiAoZXJyKSB7CkBAIC04NzQsMTAgJiM0Mzs5MTgsMjAgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsCiAJCWlmIChlcnIpIHsKIAkJCWlmIChlcnJubyA9PSBFTk9FTlQpCiAJCQkJZXJyID0gMDsKJiM0MzsJCQllbHNlIGlmIChjdHgpCiYjNDM7CQkJCXBfZXJyKCYjMzQ7Y2FuJiMzOTt0IGdldCBuZXh0IGtleSBmb3IgbWFwIGlkICV1OiAlcyYjMzQ7LAomIzQzOwkJCQkgICAgICBpbmZvLSZndDtpZCwgc3RyZXJyb3IoZXJybm8pKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmICghZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpKQomIzQzOwkJZXJyID0gZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpOwomIzQzOwkJaWYgKCFlcnIpIHsKIAkJCW51bV9lbGVtcyYjNDM7JiM0Mzs7CiYjNDM7CQkJaWYgKGN0eCAmYW1wOyZhbXA7IG1hcF9pc19tYXBfb2ZfbWFwcyhpbmZvLSZndDt0eXBlKSkgewomIzQzOwkJCQllcnIgPSBjb2xsZWN0X2lubmVyX21hcChjdHgsICooX191MzIgKil2YWx1ZSk7CiYjNDM7CQkJCWlmIChlcnIpCiYjNDM7CQkJCQlicmVhazsKJiM0MzsJCQl9CiYjNDM7CQl9CiAJCXByZXZfa2V5ID0ga2V5OwogCX0KIApAQCAtODk0LDE4ICYjNDM7OTQ4LDI1IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLAogCWZyZWUoa2V5KTsKIAlmcmVlKHZhbHVlKTsKIAlmcmVlX21hcF9rdl9idGYoYnRmKTsKJiM0MzsJaWYgKHBsYWluX2J0Zl93dHIpCiYjNDM7CQlqc29ud19kZXN0cm95KCZhbXA7cGxhaW5fYnRmX3d0cik7CiAKIAlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewomIzQzOwlMSUJCUEZfT1BUUyhicGZfZ2V0X2ZkX2J5X2lkX29wdHMsIG9wdHMsCiYjNDM7CQkub3Blbl9mbGFncyA9IEJQRl9GX1JET05MWSwKJiM0MzsJKTsKIAlqc29uX3dyaXRlcl90ICp3dHIgPSBOVUxMLCAqYnRmX3d0ciA9IE5VTEw7CiAJc3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307CiYjNDM7CXN0cnVjdCBtYXBfZHVtcF9jdHggY3R4ID0ge307CiAJaW50IG5iX2ZkcywgaSA9IDA7CiAJX191MzIgbGVuID0gc2l6ZW9mKGluZm8pOwogCWludCAqZmRzID0gTlVMTDsKIAlpbnQgZXJyID0gLTE7CiYjNDM7CXNpemVfdCBqOwogCiAJaWYgKGFyZ2MgIT0gMikKIAkJdXNhZ2UoKTsKQEAgLTkxOSw5ICYjNDM7OTgwLDM0IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJaWYgKG5iX2ZkcyAmbHQ7IDEpCiAJCWdvdG8gZXhpdF9mcmVlOwogCiYjNDM7CWlmIChyZWN1cnNpdmUpIHsKJiM0MzsJCWN0eC5zZWVuID0gaGFzaG1hcF9fbmV3KGhhc2hfZm5fZm9yX2tleV9hc19pZCwKJiM0MzsJCQkJCWVxdWFsX2ZuX2Zvcl9rZXlfYXNfaWQsIE5VTEwpOwomIzQzOwkJaWYgKElTX0VSUihjdHguc2VlbikpIHsKJiM0MzsJCQljdHguc2VlbiA9IE5VTEw7CiYjNDM7CQkJcF9lcnIoJiMzNDtmYWlsZWQgdG8gY3JlYXRlIGhhc2htYXAgZm9yIHJlY3Vyc2l2ZSBkdW1wJiMzNDspOwomIzQzOwkJCWdvdG8gZXhpdF9jbG9zZTsKJiM0MzsJCX0KJiM0MzsJCS8qIFJlY29yZCB0aGUgc2VsZWN0ZWQgbWFwcyBiZWZvcmUgZGlzY292ZXJpbmcgYW55IGlubmVyIG1hcHMuICovCiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgbmJfZmRzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWxlbiA9IHNpemVvZihpbmZvKTsKJiM0MzsJCQlpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sICZhbXA7aW5mbywgJmFtcDtsZW4pKSB7CiYjNDM7CQkJCXBfZXJyKCYjMzQ7Y2FuJiMzOTt0IGdldCBtYXAgaW5mbzogJXMmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJCQkJZXJyID0gLTE7CiYjNDM7CQkJCWdvdG8gZXhpdF9jbG9zZTsKJiM0MzsJCQl9CiYjNDM7CQkJZXJyID0gaGFzaG1hcF9fYWRkKGN0eC5zZWVuLCBpbmZvLmlkLCAwKTsKJiM0MzsJCQlpZiAoZXJyKSB7CiYjNDM7CQkJCXBfZXJyKCYjMzQ7ZmFpbGVkIHRvIHJlY29yZCBtYXAgaWQgJXU6ICVzJiMzNDssIGluZm8uaWQsCiYjNDM7CQkJCSAgICAgIHN0cmVycm9yKC1lcnIpKTsKJiM0MzsJCQkJZ290byBleGl0X2Nsb3NlOwomIzQzOwkJCX0KJiM0MzsJCX0KJiM0MzsJfQomIzQzOwogCWlmIChqc29uX291dHB1dCkgewogCQl3dHIgPSBqc29uX3d0cjsKLQl9IGVsc2UgewomIzQzOwl9IGVsc2UgaWYgKCFyZWN1cnNpdmUpIHsKIAkJaW50IGRvX3BsYWluX2J0ZjsKIAogCQlkb19wbGFpbl9idGYgPSBtYXBzX2hhdmVfYnRmKGZkcywgbmJfZmRzKTsKQEAgLTkzNiw3ICYjNDM7MTAyMiw3IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCX0KIAl9CiAKLQlpZiAod3RyICZhbXA7JmFtcDsgbmJfZmRzICZndDsgMSkKJiM0MzsJaWYgKHd0ciAmYW1wOyZhbXA7IChuYl9mZHMgJmd0OyAxIHx8IHJlY3Vyc2l2ZSkpCiAJCWpzb253X3N0YXJ0X2FycmF5KHd0cik7CS8qIHJvb3QgYXJyYXkgKi8KIAlmb3IgKGkgPSAwOyBpICZsdDsgbmJfZmRzOyBpJiM0MzsmIzQzOykgewogCQlpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sICZhbXA7aW5mbywgJmFtcDtsZW4pKSB7CkBAIC05NDQsMjIgJiM0MzsxMDMwLDUwIEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCQllcnIgPSAtMTsKIAkJCWJyZWFrOwogCQl9Ci0JCWVyciA9IG1hcF9kdW1wKGZkc1tpXSwgJmFtcDtpbmZvLCB3dHIsIG5iX2ZkcyAmZ3Q7IDEpOwomIzQzOwkJZXJyID0gbWFwX2R1bXAoZmRzW2ldLCAmYW1wO2luZm8sIHd0ciwgbmJfZmRzICZndDsgMSB8fCByZWN1cnNpdmUsCiYjNDM7CQkJICAgICAgIHJlY3Vyc2l2ZSA/ICZhbXA7Y3R4IDogTlVMTCk7CiAJCWlmICghd3RyICZhbXA7JmFtcDsgaSAhPSBuYl9mZHMgLSAxKQogCQkJcHJpbnRmKCYjMzQ7XG4mIzM0Oyk7CiAKIAkJaWYgKGVycikKIAkJCWJyZWFrOwotCQljbG9zZShmZHNbaV0pOwomIzQzOwkJLyogS2VlcCBzZWxlY3RlZCBtYXBzIGFsaXZlIHdoaWxlIHZpc2l0aW5nIHRoZWlyIGlubmVyIG1hcHMuICovCiYjNDM7CQlpZiAoIXJlY3Vyc2l2ZSkKJiM0MzsJCQljbG9zZShmZHNbaV0pOwomIzQzOwl9CiYjNDM7CWZvciAoaiA9IDA7ICFlcnIgJmFtcDsmYW1wOyBqICZsdDsgY3R4LnBlbmRpbmdfY250OyBqJiM0MzsmIzQzOykgewomIzQzOwkJaW50IGZkOwomIzQzOwomIzQzOwkJZmQgPSBicGZfbWFwX2dldF9mZF9ieV9pZF9vcHRzKGN0eC5wZW5kaW5nX2lkc1tqXSwgJmFtcDtvcHRzKTsKJiM0MzsJCWlmIChmZCAmbHQ7IDApIHsKJiM0MzsJCQlwX2VycigmIzM0O2NhbiYjMzk7dCBvcGVuIGlubmVyIG1hcCBpZCAldTogJXMmIzM0OywKJiM0MzsJCQkgICAgICBjdHgucGVuZGluZ19pZHNbal0sIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CQkJZXJyID0gLTE7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CQlsZW4gPSBzaXplb2YoaW5mbyk7CiYjNDM7CQlpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgJmFtcDtpbmZvLCAmYW1wO2xlbikpIHsKJiM0MzsJCQlwX2VycigmIzM0O2NhbiYjMzk7dCBnZXQgbWFwIGluZm86ICVzJiMzNDssIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CQkJZXJyID0gLTE7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCWlmICghd3RyKQomIzQzOwkJCQlwcmludGYoJiMzNDtcbiYjMzQ7KTsKJiM0MzsJCQllcnIgPSBtYXBfZHVtcChmZCwgJmFtcDtpbmZvLCB3dHIsIHRydWUsICZhbXA7Y3R4KTsKJiM0MzsJCX0KJiM0MzsJCWNsb3NlKGZkKTsKIAl9Ci0JaWYgKHd0ciAmYW1wOyZhbXA7IG5iX2ZkcyAmZ3Q7IDEpCiYjNDM7CWlmICh3dHIgJmFtcDsmYW1wOyAobmJfZmRzICZndDsgMSB8fCByZWN1cnNpdmUpKQogCQlqc29ud19lbmRfYXJyYXkod3RyKTsJLyogcm9vdCBhcnJheSAqLwogCiAJaWYgKGJ0Zl93dHIpCiAJCWpzb253X2Rlc3Ryb3koJmFtcDtidGZfd3RyKTsKIGV4aXRfY2xvc2U6CiYjNDM7CWlmIChyZWN1cnNpdmUpCiYjNDM7CQlpID0gMDsKIAlmb3IgKDsgaSAmbHQ7IG5iX2ZkczsgaSYjNDM7JiM0MzspCiAJCWNsb3NlKGZkc1tpXSk7CiYjNDM7CWhhc2htYXBfX2ZyZWUoY3R4LnNlZW4pOwomIzQzOwlmcmVlKGN0eC5wZW5kaW5nX2lkcyk7CiBleGl0X2ZyZWU6CiAJZnJlZShmZHMpOwogCWZyZWVfYnRmX3ZtbGludXgoKTsKQEAgLTE0ODQsNyAmIzQzOzE1OTgsNyBAQCBzdGF0aWMgaW50IGRvX2hlbHAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCQkmIzM0OyAgICAgICAgICAgICAgICAgdGFza19zdG9yYWdlIHwgYmxvb21fZmlsdGVyIHwgdXNlcl9yaW5nYnVmIHwgY2dycF9zdG9yYWdlIHwgYXJlbmEgfFxuJiMzNDsKIAkJJiMzNDsgICAgICAgICAgICAgICAgIGluc25fYXJyYXkgfCByaGFzaCB9XG4mIzM0OwogCQkmIzM0OyAgICAgICAmIzM0OyBIRUxQX1NQRUNfT1BUSU9OUyAmIzM0OyB8XG4mIzM0OwotCQkmIzM0OyAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfVxuJiMzNDsKJiM0MzsJCSYjMzQ7ICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB8IHstcnwtLXJlY3Vyc2l2ZX0gfVxuJiMzNDsKIAkJJiMzNDsmIzM0OywKIAkJYmluX25hbWUsIGFyZ3ZbLTJdKTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjMzMGEzMzQ0NzcwZDEKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9kdW1wLmMKQEAgLTAsMCAmIzQzOzEsNDE5IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZnRvb2xfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnRmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9yZXNvdXJjZS5oJmd0OwomIzQzOwomIzQzOyNkZWZpbmUgT1VUUFVUX1NJWkUgODE5MgomIzQzOwomIzQzO3N0YXRpYyBib29sIGR1bXBfbWFwKF9fdTMyIGlkLCBjb25zdCBjaGFyICpvcHRpb25zLCBjaGFyICpvdXRwdXQpCiYjNDM7ewomIzQzOwljaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07CiYjNDM7CiYjNDM7CXNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgJiMzNDslcyBtYXAgZHVtcCBpZCAldSYjMzQ7LCBvcHRpb25zLCBpZCk7CiYjNDM7CW1lbXNldChvdXRwdXQsIDAsIE9VVFBVVF9TSVpFKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBPVVRQVVRfU0laRSAtIDEpLAomIzQzOwkJICAgICAgICYjMzQ7ZHVtcF9tYXAmIzM0OykpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CS8qIFRoZSBoZWxwZXIgZG9lc24mIzM5O3QgdGVybWluYXRlIG9yIHN0cmlwIHRoZSBvdXRwdXQuICovCiYjNDM7CW91dHB1dFtzdHJjc3BuKG91dHB1dCwgJiMzNDtcbiYjMzQ7KV0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgX191MzIgbWFwX2lkKGludCBmZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9OwomIzQzOwlfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsICZhbXA7aW5mbywgJmFtcDtsZW4pLCAmIzM0O21hcF9pbmZvJiMzNDspKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CXJldHVybiBpbmZvLmlkOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGNvdW50X3Rva2VuKGNvbnN0IGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqdG9rZW4pCiYjNDM7ewomIzQzOwlpbnQgY291bnQgPSAwOwomIzQzOwomIzQzOwl3aGlsZSAoKG91dHB1dCA9IHN0cnN0cihvdXRwdXQsIHRva2VuKSkpIHsKJiM0MzsJCWNvdW50JiM0MzsmIzQzOzsKJiM0MzsJCW91dHB1dCAmIzQzOz0gc3RybGVuKHRva2VuKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gY291bnQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNoZWNrX3BsYWluKF9fdTMyIHJvb3RfaWQsIF9fdTMyIGlubmVyX2lkLCBjb25zdCBjaGFyICp0eXBlLAomIzQzOwkJCWludCBlbnRyaWVzLCBib29sIHR5cGVkKQomIzQzO3sKJiM0MzsJY2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBoZWFkZXJbMTI4XTsKJiM0MzsJY2hhciBvdXRwdXRbT1VUUFVUX1NJWkVdID0ge307CiYjNDM7CWNvbnN0IGNoYXIgKnJvb3QsICppbm5lcjsKJiM0MzsKJiM0MzsJc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAmIzM0Oy0tcmVjdXJzaXZlIG1hcCBkdW1wIGlkICV1JiMzNDssIHJvb3RfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksCiYjNDM7CQkgICAgICAgJiMzNDtwbGFpbl9kdW1wJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCAmIzM0OyV1OiAlcyAgbmFtZSBkdW1wX291dGVyICAmIzM0Oywgcm9vdF9pZCwgdHlwZSk7CiYjNDM7CXJvb3QgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIocm9vdCwgJiMzNDtwbGFpbl9yb290X2hlYWRlciYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJQVNTRVJUX0VRKHJvb3QgLSBvdXRwdXQsIDAsICYjMzQ7cGxhaW5fcm9vdF9maXJzdCYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgJiMzNDtpbm5lcl9tYXBfaWQ6JiMzNDspLCBlbnRyaWVzLCAmIzM0O3BsYWluX3JlZmVyZW5jZXMmIzM0Oyk7CiYjNDM7CWlmIChlbnRyaWVzKSB7CiYjNDM7CQlzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCAmIzM0OyV1OiBoYXNoICBuYW1lIGR1bXBfaW5uZXIgICYjMzQ7LCBpbm5lcl9pZCk7CiYjNDM7CQlpbm5lciA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7CiYjNDM7CQlpZiAoQVNTRVJUX09LX1BUUihpbm5lciwgJiMzNDtwbGFpbl9pbm5lcl9oZWFkZXImIzM0OykpCiYjNDM7CQkJQVNTRVJUX0dUKGlubmVyIC0gcm9vdCwgMCwgJiMzNDtwbGFpbl9pbm5lcl9hZnRlcl9yb290JiMzNDspOwomIzQzOwkJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgaGVhZGVyKSwgMSwgJiMzNDtwbGFpbl9pbm5lcl9vbmNlJiMzNDspOwomIzQzOwl9CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsICYjMzQ7Rm91bmQgJiMzNDspLCBlbnRyaWVzICZhbXA7JmFtcDsgIXR5cGVkID8gMiA6IDEsCiYjNDM7CQkgICYjMzQ7cGxhaW5fbWFwX2NvdW50JiMzNDspOwomIzQzOwlpZiAodHlwZWQpIHsKJiM0MzsJCUFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgJiMzNDtcJiMzNDtrZXlcJiMzNDs6IDAmIzM0OywgJiMzNDtwbGFpbl9idGZfa2V5JiMzNDspOwomIzQzOwkJQVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCAmIzM0O1wmIzM0O3ZhbHVlXCYjMzQ7OiAxNjg0MzAwOSYjMzQ7LCAmIzM0O3BsYWluX2J0Zl92YWx1ZSYjMzQ7KTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X291dGVyKGVudW0gYnBmX21hcF90eXBlIHR5cGUsIGludCBlbnRyaWVzLCBib29sIGVtcHR5X2lubmVyLAomIzQzOwkJICAgICAgIGJvb2wgdHlwZWQpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgaW5uZXJfb3B0cyk7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7CiYjNDM7CWNoYXIgb3V0ZXJbT1VUUFVUX1NJWkVdLCBpbm5lcltPVVRQVVRfU0laRV0sIG91dHB1dFtPVVRQVVRfU0laRV07CiYjNDM7CWNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcmVmZXJlbmNlWzY0XTsKJiM0MzsJY29uc3QgY2hhciAqdHlwZV9uYW1lID0gbGliYnBmX2JwZl9tYXBfdHlwZV9zdHIodHlwZSk7CiYjNDM7CWludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xOwomIzQzOwlfX3UzMiByb290X2lkLCBpbm5lcl9pZCwga2V5LCB2YWx1ZSA9IDB4MDEwMTAxMDE7CiYjNDM7CiYjNDM7CWlmICh0eXBlZCkgewomIzQzOwkJYnRmID0gYnRmX19uZXdfZW1wdHkoKTsKJiM0MzsJCWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7Y3JlYXRlX2J0ZiYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgJiMzNDt1bnNpZ25lZCBpbnQmIzM0OywgNCwgMCksIDEsICYjMzQ7YnRmX2ludCYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksICYjMzQ7bG9hZF9idGYmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlpbm5lcl9vcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTsKJiM0MzsJCWlubmVyX29wdHMuYnRmX2tleV90eXBlX2lkID0gMTsKJiM0MzsJCWlubmVyX29wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxOwomIzQzOwl9CiYjNDM7CWlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsICYjMzQ7ZHVtcF9pbm5lciYjMzQ7LCBzaXplb2Yoa2V5KSwKJiM0MzsJCQkJICBzaXplb2YodmFsdWUpLCAyLCAmYW1wO2lubmVyX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgJiMzNDtjcmVhdGVfaW5uZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJa2V5ID0gMDsKJiM0MzsJaWYgKCFlbXB0eV9pbm5lciAmYW1wOyZhbXA7CiYjNDM7CSAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oaW5uZXJfZmQsICZhbXA7a2V5LCAmYW1wO3ZhbHVlLCBCUEZfQU5ZKSwKJiM0MzsJCSAgICAgICAmIzM0O3BvcHVsYXRlX2lubmVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CW9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7CiYjNDM7CW91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUodHlwZSwgJiMzNDtkdW1wX291dGVyJiMzNDssIHNpemVvZihrZXkpLCBzaXplb2YoX191MzIpLAomIzQzOwkJCQkgMywgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQob3V0ZXJfZmQsICYjMzQ7Y3JlYXRlX291dGVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CS8qIFRoZSB1bnVzZWQgdGhpcmQgYXJyYXkgc2xvdCBhbHNvIGV4ZXJjaXNlcyBmYWlsZWQgbG9va3Vwcy4gKi8KJiM0MzsJZm9yIChrZXkgPSAwOyBrZXkgJmx0OyBlbnRyaWVzOyBrZXkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgJmFtcDtrZXksICZhbXA7aW5uZXJfZmQsIEJQRl9BTlkpLAomIzQzOwkJCSAgICAgICAmIzM0O3BvcHVsYXRlX291dGVyJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwlyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTsKJiM0MzsJaW5uZXJfaWQgPSBtYXBfaWQoaW5uZXJfZmQpOwomIzQzOwlpZiAoIXJvb3RfaWQgfHwgIWlubmVyX2lkIHx8ICFkdW1wX21hcChyb290X2lkLCAmIzM0Oy1qJiMzNDssIG91dGVyKSB8fAomIzQzOwkgICAgIWR1bXBfbWFwKGlubmVyX2lkLCAmIzM0Oy1qJiMzNDssIGlubmVyKSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlBU1NFUlRfRVEob3V0ZXJbMF0sICYjMzk7WyYjMzk7LCAmIzM0O2RlZmF1bHRfYXJyYXkmIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgJiMzNDtcJiMzNDtlbGVtZW50c1wmIzM0OzomIzM0OyksIDAsICYjMzQ7ZGVmYXVsdF9ub193cmFwcGVyJiMzNDspOwomIzQzOwlBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsICYjMzQ7XCYjMzQ7aWRcJiMzNDs6JiMzNDspLCAwLCAmIzM0O2RlZmF1bHRfbm9faGVhZGVyJiMzNDspOwomIzQzOwlzbnByaW50ZihyZWZlcmVuY2UsIHNpemVvZihyZWZlcmVuY2UpLCAmIzM0O1wmIzM0O2lubmVyX21hcF9pZFwmIzM0OzoldSYjMzQ7LCBpbm5lcl9pZCk7CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgcmVmZXJlbmNlKSwgZW50cmllcywgJiMzNDtkZWZhdWx0X3JlZmVyZW5jZXMmIzM0Oyk7CiYjNDM7CWlmICghZW50cmllcykKJiM0MzsJCUFTU0VSVF9TVFJFUShvdXRlciwgJiMzNDtbXSYjMzQ7LCAmIzM0O2VtcHR5X291dGVyX2RlZmF1bHQmIzM0Oyk7CiYjNDM7CWlmIChlbXB0eV9pbm5lcikKJiM0MzsJCUFTU0VSVF9TVFJFUShpbm5lciwgJiMzNDtbXSYjMzQ7LCAmIzM0O2VtcHR5X2lubmVyX2RlZmF1bHQmIzM0Oyk7CiYjNDM7CWVsc2UgaWYgKHR5cGVkKQomIzQzOwkJQVNTRVJUX0hBU19TVUJTVFIoaW5uZXIsICYjMzQ7XCYjMzQ7Zm9ybWF0dGVkXCYjMzQ7OntcJiMzNDtrZXlcJiMzNDs6MCxcJiMzNDt2YWx1ZVwmIzM0OzoxNjg0MzAwOX0mIzM0OywKJiM0MzsJCQkJICAmIzM0O3R5cGVkX2lubmVyJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlBU1NFUlRfU1RSRVEoaW5uZXIsCiYjNDM7CQkJICAgICAmIzM0O1t7XCYjMzQ7a2V5XCYjMzQ7OltcJiMzNDsweDAwXCYjMzQ7LFwmIzM0OzB4MDBcJiMzNDssXCYjMzQ7MHgwMFwmIzM0OyxcJiMzNDsweDAwXCYjMzQ7XSwmIzM0OwomIzQzOwkJCSAgICAgJiMzNDtcJiMzNDt2YWx1ZVwmIzM0OzpbXCYjMzQ7MHgwMVwmIzM0OyxcJiMzNDsweDAxXCYjMzQ7LFwmIzM0OzB4MDFcJiMzNDssXCYjMzQ7MHgwMVwmIzM0O119XSYjMzQ7LAomIzQzOwkJCSAgICAgJiMzNDtvcmRpbmFyeV9kZWZhdWx0JiMzNDspOwomIzQzOwomIzQzOwkvKiBDb21wYXJlIHRoZSBjb21wbGV0ZSBKU09OIGRvY3VtZW50OiBhIGZsYXQgYXJyYXkgd2l0aCB0aGUgcm9vdCBmaXJzdCwKJiM0MzsJICogb25lIGNvcHkgb2YgdGhlIHNoYXJlZCBpbm5lciBtYXAsIGFuZCB1bmNoYW5nZWQgZW50cnkgcmVwcmVzZW50YXRpb25zLgomIzQzOwkgKi8KJiM0MzsJaWYgKGVudHJpZXMpCiYjNDM7CQlzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSwKJiM0MzsJCQkgJiMzNDtbe1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7JXNcJiMzNDssXCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDtkdW1wX291dGVyXCYjMzQ7LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0Ozolc30se1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7aGFzaFwmIzM0OywmIzM0OwomIzQzOwkJCSAmIzM0O1wmIzM0O25hbWVcJiMzNDs6XCYjMzQ7ZHVtcF9pbm5lclwmIzM0OyxcJiMzNDtmbGFnc1wmIzM0OzowLFwmIzM0O2VsZW1lbnRzXCYjMzQ7OiVzfV0mIzM0OywKJiM0MzsJCQkgcm9vdF9pZCwgdHlwZV9uYW1lLCBvdXRlciwgaW5uZXJfaWQsIGlubmVyKTsKJiM0MzsJZWxzZQomIzQzOwkJc25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksCiYjNDM7CQkJICYjMzQ7W3tcJiMzNDtpZFwmIzM0OzoldSxcJiMzNDt0eXBlXCYjMzQ7OlwmIzM0OyVzXCYjMzQ7LFwmIzM0O25hbWVcJiMzNDs6XCYjMzQ7ZHVtcF9vdXRlclwmIzM0OywmIzM0OwomIzQzOwkJCSAmIzM0O1wmIzM0O2ZsYWdzXCYjMzQ7OjAsXCYjMzQ7ZWxlbWVudHNcJiMzNDs6W119XSYjMzQ7LCByb290X2lkLCB0eXBlX25hbWUpOwomIzQzOwlpZiAoZHVtcF9tYXAocm9vdF9pZCwgJiMzNDstaiAtciYjMzQ7LCBvdXRwdXQpKQomIzQzOwkJQVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsICYjMzQ7cmVjdXJzaXZlX2pzb24mIzM0Oyk7CiYjNDM7CWlmIChkdW1wX21hcChyb290X2lkLCAmIzM0Oy0tanNvbiAtLXJlY3Vyc2l2ZSYjMzQ7LCBvdXRwdXQpKQomIzQzOwkJQVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsICYjMzQ7cmVjdXJzaXZlX2xvbmdfb3B0aW9ucyYjMzQ7KTsKJiM0MzsJY2hlY2tfcGxhaW4ocm9vdF9pZCwgaW5uZXJfaWQsIHR5cGVfbmFtZSwgZW50cmllcywgdHlwZWQpOwomIzQzOwomIzQzOwkvKiBSZWN1cnNpb24gb24gYW4gb3JkaW5hcnkgbWFwIHN0aWxsIGVtaXRzIGEgc2luZ2xlIG1hcCBvYmplY3QuICovCiYjNDM7CXNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLAomIzQzOwkJICYjMzQ7W3tcJiMzNDtpZFwmIzM0OzoldSxcJiMzNDt0eXBlXCYjMzQ7OlwmIzM0O2hhc2hcJiMzNDssXCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDtkdW1wX2lubmVyXCYjMzQ7LCYjMzQ7CiYjNDM7CQkgJiMzNDtcJiMzNDtmbGFnc1wmIzM0OzowLFwmIzM0O2VsZW1lbnRzXCYjMzQ7OiVzfV0mIzM0OywgaW5uZXJfaWQsIGlubmVyKTsKJiM0MzsJaWYgKGR1bXBfbWFwKGlubmVyX2lkLCAmIzM0Oy1qIC1yJiMzNDssIG91dHB1dCkpCiYjNDM7CQlBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgJiMzNDtvcmRpbmFyeV9yZWN1cnNpdmUmIzM0Oyk7CiYjNDM7b3V0OgomIzQzOwlpZiAob3V0ZXJfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKG91dGVyX2ZkKTsKJiM0MzsJaWYgKGlubmVyX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShpbm5lcl9mZCk7CiYjNDM7CWJ0Zl9fZnJlZShidGYpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X211bHRpcGxlX3Jvb3RzKHZvaWQpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTsKJiM0MzsJY2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBuYW1lW0JQRl9PQkpfTkFNRV9MRU5dOwomIzQzOwljaGFyIG91dHB1dFtPVVRQVVRfU0laRV0gPSB7fSwgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiA0XSwgZWxlbWVudHNbT1VUUFVUX1NJWkVdOwomIzQzOwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHR5cGVzW10gPSB7ICYjMzQ7aGFzaCYjMzQ7LCAmIzM0O2FycmF5X29mX21hcHMmIzM0OywgJiMzNDtoYXNoX29mX21hcHMmIzM0OywgJiMzNDtoYXNoJiMzNDsgfTsKJiM0MzsJaW50IGZkc1tdID0geyAtMSwgLTEsIC0xLCAtMSB9OwomIzQzOwlfX3UzMiBpZHNbNF0sIGtleTsKJiM0MzsJaW50IGksIGxlbiA9IDA7CiYjNDM7CiYjNDM7CS8qIFNlbGVjdCB0aGUgZmlyc3QgaW5uZXIgbWFwIGFuZCBib3RoIG91dGVycyBhcyByb290cy4gVGhlIG90aGVyIGlubmVyCiYjNDM7CSAqIG1hcCBtdXN0IGJlIGFwcGVuZGVkIGFmdGVyIGFsbCB0aHJlZSByb290cywgZXZlbiB0aG91Z2ggaXQgaXMgZm91bmQKJiM0MzsJICogd2hpbGUgZHVtcGluZyB0aGUgZmlyc3Qgb3V0ZXIuIEEgcHJvY2Vzcy1zcGVjaWZpYyBuYW1lIGF2b2lkcyBvdGhlcgomIzQzOwkgKiB0ZXN0cyYjMzk7IG1hcHMgam9pbmluZyB0aGUgc2VsZWN0aW9uLgomIzQzOwkgKi8KJiM0MzsJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAmIzM0O2R1bXBfJXUmIzM0OywgZ2V0cGlkKCkpOwomIzQzOwlmZHNbMF0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgbmFtZSwgNCwgNCwgMSwgTlVMTCk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKGZkc1swXSwgJiMzNDtjcmVhdGVfc2VsZWN0ZWRfaW5uZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZmRzWzNdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsICYjMzQ7ZHVtcF9kaXNjb3ZlcmVkJiMzNDssIDQsIDQsIDEsIE5VTEwpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChmZHNbM10sICYjMzQ7Y3JlYXRlX2Rpc2NvdmVyZWRfaW5uZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJb3B0cy5pbm5lcl9tYXBfZmQgPSBmZHNbMF07CiYjNDM7CWZkc1sxXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBuYW1lLCA0LCA0LCAyLCAmYW1wO29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChmZHNbMV0sICYjMzQ7Y3JlYXRlX2FycmF5X3Jvb3QmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZmRzWzJdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoZmRzWzJdLCAmIzM0O2NyZWF0ZV9oYXNoX3Jvb3QmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZm9yIChpID0gMTsgaSAmbHQ7PSAyOyBpJiM0MzsmIzQzOykgewomIzQzOwkJa2V5ID0gMDsKJiM0MzsJCWlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmRzW2ldLCAmYW1wO2tleSwgJmFtcDtmZHNbMF0sIEJQRl9BTlkpLAomIzQzOwkJCSAgICAgICAmIzM0O3JlZmVyZW5jZV9zZWxlY3RlZF9pbm5lciYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCWtleSA9IDE7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgJmFtcDtrZXksICZhbXA7ZmRzWzNdLCBCUEZfQU5ZKSwKJiM0MzsJCQkgICAgICAgJiMzNDtyZWZlcmVuY2VfZGlzY292ZXJlZF9pbm5lciYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQVJSQVlfU0laRShmZHMpOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWRzW2ldID0gbWFwX2lkKGZkc1tpXSk7CiYjNDM7CQlpZiAoIWlkc1tpXSB8fCAhZHVtcF9tYXAoaWRzW2ldLCAmIzM0Oy1qJiMzNDssIGVsZW1lbnRzKSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCWxlbiAmIzQzOz0gc25wcmludGYoZXhwZWN0ZWQgJiM0MzsgbGVuLCBzaXplb2YoZXhwZWN0ZWQpIC0gbGVuLAomIzQzOwkJCQkmIzM0OyVze1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7JXNcJiMzNDssXCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDslc1wmIzM0OywmIzM0OwomIzQzOwkJCQkmIzM0O1wmIzM0O2ZsYWdzXCYjMzQ7OjAsXCYjMzQ7ZWxlbWVudHNcJiMzNDs6JXN9JXMmIzM0OywKJiM0MzsJCQkJaSA/ICYjMzQ7LCYjMzQ7IDogJiMzNDtbJiMzNDssIGlkc1tpXSwgdHlwZXNbaV0sCiYjNDM7CQkJCWkgPT0gMyA/ICYjMzQ7ZHVtcF9kaXNjb3ZlcmVkJiMzNDsgOiBuYW1lLCBlbGVtZW50cywgaSA9PSAzID8gJiMzNDtdJiMzNDsgOiAmIzM0OyYjMzQ7KTsKJiM0MzsJfQomIzQzOwlzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksICYjMzQ7LWogLXIgbWFwIGR1bXAgbmFtZSAlcyYjMzQ7LCBuYW1lKTsKJiM0MzsJaWYgKEFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksCiYjNDM7CQkgICAgICAmIzM0O2R1bXBfbXVsdGlwbGVfcm9vdHMmIzM0OykpIHsKJiM0MzsJCW91dHB1dFtzdHJjc3BuKG91dHB1dCwgJiMzNDtcbiYjMzQ7KV0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7CQlBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgJiMzNDtyb290c19maXJzdF9hbmRfc2VlZF9kZWR1cCYjMzQ7KTsKJiM0MzsJfQomIzQzO291dDoKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IEFSUkFZX1NJWkUoZmRzKTsgaSYjNDM7JiM0MzspCiYjNDM7CQlpZiAoZmRzW2ldICZndDs9IDApCiYjNDM7CQkJY2xvc2UoZmRzW2ldKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF91bnJlYWRhYmxlKGJvb2wgb3V0ZXIpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTsKJiM0MzsJY2hhciBlbGVtZW50c1tPVVRQVVRfU0laRV0sIG91dHB1dFtPVVRQVVRfU0laRV0sIHJvb3RbT1VUUFVUX1NJWkVdOwomIzQzOwljaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHBsYWluW09VVFBVVF9TSVpFXSA9IHt9OwomIzQzOwljaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07CiYjNDM7CWludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xLCBsb29rdXBfZXJybm87CiYjNDM7CV9fdTMyIGlubmVyX2lkLCByb290X2lkLCBrZXkgPSAwLCB2YWx1ZTsKJiM0MzsKJiM0MzsJLyogRXZlcnkga2V5IGlzIGVudW1lcmFibGUsIGJ1dCBQRVJGX0VWRU5UX0FSUkFZIGxvb2t1cCByZXR1cm5zCiYjNDM7CSAqIEVOT1RTVVBQICh0aGUga2VybmVsLWludGVybmFsIGVycm5vKS4gQ2hlY2sgYm90aCBlbnRyaWVzIHNvIGFuCiYjNDM7CSAqIGVhcmx5IGV4aXQgb24gdGhlIGZpcnN0IGxvb2t1cCBmYWlsdXJlIGNhbm5vdCBwYXNzLgomIzQzOwkgKi8KJiM0MzsJaW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSwgJiMzNDtkdW1wX3VucmVhZGFibGUmIzM0OywKJiM0MzsJCQkJICBzaXplb2Yoa2V5KSwgc2l6ZW9mKHZhbHVlKSwgMiwgTlVMTCk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCAmIzM0O2NyZWF0ZV91bnJlYWRhYmxlJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX0xUKGJwZl9tYXBfbG9va3VwX2VsZW0oaW5uZXJfZmQsICZhbXA7a2V5LCAmYW1wO3ZhbHVlKSwgMCwKJiM0MzsJCSAgICAgICAmIzM0O3VucmVhZGFibGVfbG9va3VwJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWxvb2t1cF9lcnJubyA9IGVycm5vOwomIzQzOwlpZiAoIUFTU0VSVF9ORVEobG9va3VwX2Vycm5vLCBFTk9FTlQsICYjMzQ7dW5yZWFkYWJsZV9ub3RfbWlzc2luZyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpbm5lcl9pZCA9IG1hcF9pZChpbm5lcl9mZCk7CiYjNDM7CWlmICghaW5uZXJfaWQgfHwgIWR1bXBfbWFwKGlubmVyX2lkLCAmIzM0Oy1qJiMzNDssIGVsZW1lbnRzKSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlBU1NFUlRfRVEoY291bnRfdG9rZW4oZWxlbWVudHMsICYjMzQ7XCYjMzQ7ZXJyb3JcJiMzNDs6JiMzNDspLCAyLCAmIzM0O2RlZmF1bHRfanNvbl9lcnJvcnMmIzM0Oyk7CiYjNDM7CXNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgJiMzNDttYXAgZHVtcCBpZCAldSYjMzQ7LCBpbm5lcl9pZCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIHBsYWluLCBzaXplb2YocGxhaW4pIC0gMSksCiYjNDM7CQkgICAgICAgJiMzNDtkZWZhdWx0X3BsYWluX3VucmVhZGFibGUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJQVNTRVJUX0VRKGNvdW50X3Rva2VuKHBsYWluLCBzdHJlcnJvcihsb29rdXBfZXJybm8pKSwgMiwgJiMzNDtkZWZhdWx0X3BsYWluX2Vycm9ycyYjMzQ7KTsKJiM0MzsJQVNTRVJUX0hBU19TVUJTVFIocGxhaW4sICYjMzQ7Rm91bmQgMCBlbGVtZW50cyYjMzQ7LCAmIzM0O2RlZmF1bHRfcGxhaW5fY291bnQmIzM0Oyk7CiYjNDM7CiYjNDM7CXJvb3RfaWQgPSBpbm5lcl9pZDsKJiM0MzsJaWYgKG91dGVyKSB7CiYjNDM7CQlvcHRzLmlubmVyX21hcF9mZCA9IGlubmVyX2ZkOwomIzQzOwkJb3V0ZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgJiMzNDtkdW1wX291dGVyJiMzNDssCiYjNDM7CQkJCQkgc2l6ZW9mKGtleSksIHNpemVvZih2YWx1ZSksIDEsICZhbXA7b3B0cyk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgJiMzNDtjcmVhdGVfb3V0ZXImIzM0OykgfHwKJiM0MzsJCSAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsICZhbXA7a2V5LCAmYW1wO2lubmVyX2ZkLCBCUEZfQU5ZKSwKJiM0MzsJCQkgICAgICAgJiMzNDtwb3B1bGF0ZV9vdXRlciYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCXJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpOwomIzQzOwkJaWYgKCFyb290X2lkIHx8ICFkdW1wX21hcChyb290X2lkLCAmIzM0Oy1qJiMzNDssIHJvb3QpKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJc25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksCiYjNDM7CQkJICYjMzQ7W3tcJiMzNDtpZFwmIzM0OzoldSxcJiMzNDt0eXBlXCYjMzQ7OlwmIzM0O2FycmF5X29mX21hcHNcJiMzNDssXCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDtkdW1wX291dGVyXCYjMzQ7LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0Ozolc30se1wmIzM0O2lkXCYjMzQ7OiV1LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7dHlwZVwmIzM0OzpcJiMzNDtwZXJmX2V2ZW50X2FycmF5XCYjMzQ7LFwmIzM0O25hbWVcJiMzNDs6XCYjMzQ7ZHVtcF91bnJlYWRhYmxlXCYjMzQ7LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0Ozolc31dJiMzNDssIHJvb3RfaWQsIHJvb3QsIGlubmVyX2lkLCBlbGVtZW50cyk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSwKJiM0MzsJCQkgJiMzNDtbe1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7cGVyZl9ldmVudF9hcnJheVwmIzM0OywmIzM0OwomIzQzOwkJCSAmIzM0O1wmIzM0O25hbWVcJiMzNDs6XCYjMzQ7ZHVtcF91bnJlYWRhYmxlXCYjMzQ7LFwmIzM0O2ZsYWdzXCYjMzQ7OjAsXCYjMzQ7ZWxlbWVudHNcJiMzNDs6JXN9XSYjMzQ7LAomIzQzOwkJCSBpbm5lcl9pZCwgZWxlbWVudHMpOwomIzQzOwl9CiYjNDM7CWlmIChkdW1wX21hcChyb290X2lkLCAmIzM0Oy1qIC1yJiMzNDssIG91dHB1dCkpCiYjNDM7CQlBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgJiMzNDtyZWN1cnNpdmVfdW5yZWFkYWJsZV9qc29uJiMzNDspOwomIzQzOwltZW1zZXQob3V0cHV0LCAwLCBzaXplb2Yob3V0cHV0KSk7CiYjNDM7CXNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgJiMzNDstciBtYXAgZHVtcCBpZCAldSYjMzQ7LCByb290X2lkKTsKJiM0MzsJaWYgKEFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksCiYjNDM7CQkgICAgICAmIzM0O3JlY3Vyc2l2ZV91bnJlYWRhYmxlX3BsYWluJiMzNDspKSB7CiYjNDM7CQlBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIHBsYWluLCAmIzM0O3JlY3Vyc2l2ZV9wbGFpbl9wcmVzZXJ2ZXNfZXJyb3JzJiMzNDspOwomIzQzOwkJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgc3RyZXJyb3IobG9va3VwX2Vycm5vKSksIDIsCiYjNDM7CQkJICAmIzM0O3JlY3Vyc2l2ZV9wbGFpbl9lcnJvcnMmIzM0Oyk7CiYjNDM7CQlBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCAmIzM0O0ZvdW5kICYjMzQ7KSwgb3V0ZXIgPyAyIDogMSwKJiM0MzsJCQkgICYjMzQ7cmVjdXJzaXZlX3BsYWluX21hcHMmIzM0Oyk7CiYjNDM7CX0KJiM0MztvdXQ6CiYjNDM7CWlmIChvdXRlcl9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2Uob3V0ZXJfZmQpOwomIzQzOwlpZiAoaW5uZXJfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGlubmVyX2ZkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9tYW55X2lubmVyX21hcHMoYm9vbCBqc29uKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7CiYjNDM7CWNvbnN0IHN0cnVjdCBybGltaXQgbGltaXQgPSB7IC5ybGltX2N1ciA9IDMyLCAucmxpbV9tYXggPSAzMiB9OwomIzQzOwljaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIHRva2VuWzY0XTsKJiM0MzsJX191MzIgaWRzWzY0XSwgcm9vdF9pZCwga2V5OwomIzQzOwlpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMSwgc3RhdHVzOwomIzQzOwljaGFyICpvdXRwdXQgPSBOVUxMOwomIzQzOwlwaWRfdCBwaWQ7CiYjNDM7CiYjNDM7CWlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsICYjMzQ7ZHVtcF9pbm5lciYjMzQ7LCA0LCA0LCAxLCBOVUxMKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsICYjMzQ7Y3JlYXRlX3RlbXBsYXRlJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CW9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7CiYjNDM7CW91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsICYjMzQ7ZHVtcF9vdXRlciYjMzQ7LCA0LCA0LAomIzQzOwkJCQkgQVJSQVlfU0laRShpZHMpLCAmYW1wO29wdHMpOwomIzQzOwljbG9zZShpbm5lcl9mZCk7CiYjNDM7CWlubmVyX2ZkID0gLTE7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCAmIzM0O2NyZWF0ZV9vdXRlciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlmb3IgKGtleSA9IDA7IGtleSAmbHQ7IEFSUkFZX1NJWkUoaWRzKTsga2V5JiM0MzsmIzQzOykgewomIzQzOwkJaW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgJiMzNDtkdW1wX2lubmVyJiMzNDssIDQsIDQsIDEsIE5VTEwpOwomIzQzOwkJaWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsICYjMzQ7Y3JlYXRlX2lubmVyJiMzNDspIHx8CiYjNDM7CQkgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCAmYW1wO2tleSwgJmFtcDtpbm5lcl9mZCwgQlBGX0FOWSksCiYjNDM7CQkJICAgICAgICYjMzQ7cG9wdWxhdGVfb3V0ZXImIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlpZHNba2V5XSA9IG1hcF9pZChpbm5lcl9mZCk7CiYjNDM7CQlpZiAoIWlkc1trZXldKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJLyogVGhlIG91dGVyIG1hcCBrZWVwcyBlYWNoIGRpc3RpbmN0IGlubmVyIG1hcCBhbGl2ZS4gKi8KJiM0MzsJCWNsb3NlKGlubmVyX2ZkKTsKJiM0MzsJCWlubmVyX2ZkID0gLTE7CiYjNDM7CX0KJiM0MzsJcm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7CiYjNDM7CW91dHB1dCA9IGNhbGxvYygxLCA2NTUzNik7CiYjNDM7CWlmICghcm9vdF9pZCB8fCAhQVNTRVJUX09LX1BUUihvdXRwdXQsICYjMzQ7YWxsb2NhdGVfb3V0cHV0JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CS8qIENyZWF0ZSBhbGwgZml4dHVyZXMgYmVmb3JlIGxvd2VyaW5nIHRoZSBsaW1pdCwgYW5kIGtlZXAgdGhlIHRlc3QKJiM0MzsJICogcnVubmVyJiMzOTtzIGxpbWl0IHVuY2hhbmdlZC4gUmV0YWluaW5nIGV2ZXJ5IGRpc2NvdmVyZWQgRkQgd291bGQgZXhjZWVkCiYjNDM7CSAqIHRoaXMgbGltaXQgYmVmb3JlIHRoZSByZWN1cnNpdmUgZHVtcCBjb3VsZCB2aXNpdCBhbGwgaW5uZXIgbWFwcy4KJiM0MzsJICovCiYjNDM7CXBpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocGlkLCAwLCAmIzM0O2ZvcmsmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKCFwaWQpIHsKJiM0MzsJCWNsb3NlKG91dGVyX2ZkKTsKJiM0MzsJCWlmIChzZXRybGltaXQoUkxJTUlUX05PRklMRSwgJmFtcDtsaW1pdCkpCiYjNDM7CQkJX2V4aXQoMSk7CiYjNDM7CQlzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksICYjMzQ7JXMgLXIgbWFwIGR1bXAgaWQgJXUmIzM0OywKJiM0MzsJCQkganNvbiA/ICYjMzQ7LWomIzM0OyA6ICYjMzQ7JiMzNDssIHJvb3RfaWQpOwomIzQzOwkJaWYgKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgNjU1MzUpKQomIzQzOwkJCV9leGl0KDIpOwomIzQzOwkJaWYgKGNvdW50X3Rva2VuKG91dHB1dCwganNvbiA/ICYjMzQ7XCYjMzQ7aWRcJiMzNDs6JiMzNDsgOiAmIzM0O0ZvdW5kICYjMzQ7KSAhPSBBUlJBWV9TSVpFKGlkcykgJiM0MzsgMSB8fAomIzQzOwkJICAgIGNvdW50X3Rva2VuKG91dHB1dCwganNvbiA/ICYjMzQ7XCYjMzQ7aW5uZXJfbWFwX2lkXCYjMzQ7OiYjMzQ7IDogJiMzNDtpbm5lcl9tYXBfaWQ6JiMzNDspICE9CiYjNDM7CQkgICAgQVJSQVlfU0laRShpZHMpKQomIzQzOwkJCV9leGl0KDMpOwomIzQzOwkJZm9yIChrZXkgPSAwOyBrZXkgJmx0OyBBUlJBWV9TSVpFKGlkcyk7IGtleSYjNDM7JiM0MzspIHsKJiM0MzsJCQlpZiAoanNvbikKJiM0MzsJCQkJc25wcmludGYodG9rZW4sIHNpemVvZih0b2tlbiksICYjMzQ7XCYjMzQ7aWRcJiMzNDs6JXUsJiMzNDssIGlkc1trZXldKTsKJiM0MzsJCQllbHNlCiYjNDM7CQkJCXNucHJpbnRmKHRva2VuLCBzaXplb2YodG9rZW4pLCAmIzM0O1xuJXU6IGhhc2ggIG5hbWUgZHVtcF9pbm5lciAgJiMzNDssCiYjNDM7CQkJCQkgaWRzW2tleV0pOwomIzQzOwkJCWlmIChjb3VudF90b2tlbihvdXRwdXQsIHRva2VuKSAhPSAxKQomIzQzOwkJCQlfZXhpdCg0KTsKJiM0MzsJCX0KJiM0MzsJCWlmIChqc29uICZhbXA7JmFtcDsgKG91dHB1dFswXSAhPSAmIzM5O1smIzM5OyB8fAomIzQzOwkJCSAgICAgc3RyY21wKG91dHB1dCAmIzQzOyBzdHJsZW4ob3V0cHV0KSAtIDIsICYjMzQ7XVxuJiMzNDspKSkKJiM0MzsJCQlfZXhpdCg1KTsKJiM0MzsJCV9leGl0KDApOwomIzQzOwl9CiYjNDM7CWlmIChBU1NFUlRfRVEod2FpdHBpZChwaWQsICZhbXA7c3RhdHVzLCAwKSwgcGlkLCAmIzM0O3dhaXRwaWQmIzM0OykgJmFtcDsmYW1wOwomIzQzOwkgICAgQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksICYjMzQ7Y2hpbGRfZXhpdGVkJiMzNDspKQomIzQzOwkJQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIDAsICYjMzQ7ZHVtcF93aXRoX2xvd19mZF9saW1pdCYjMzQ7KTsKJiM0MztvdXQ6CiYjNDM7CWZyZWUob3V0cHV0KTsKJiM0MzsJaWYgKG91dGVyX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShvdXRlcl9mZCk7CiYjNDM7CWlmIChpbm5lcl9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoaW5uZXJfZmQpOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHRlc3RfYnBmdG9vbF9tYXBfZHVtcCh2b2lkKQomIzQzO3sKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt1bnJlYWRhYmxlX29yZGluYXJ5JiMzNDspKQomIzQzOwkJdGVzdF91bnJlYWRhYmxlKGZhbHNlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt1bnJlYWRhYmxlX2lubmVyJiMzNDspKQomIzQzOwkJdGVzdF91bnJlYWRhYmxlKHRydWUpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O21hbnlfaW5uZXJfbWFwc19qc29uJiMzNDspKQomIzQzOwkJdGVzdF9tYW55X2lubmVyX21hcHModHJ1ZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWFueV9pbm5lcl9tYXBzX3BsYWluJiMzNDspKQomIzQzOwkJdGVzdF9tYW55X2lubmVyX21hcHMoZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O211bHRpcGxlX3Jvb3RzJiMzNDspKQomIzQzOwkJdGVzdF9tdWx0aXBsZV9yb290cygpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2FycmF5X29mX21hcHMmIzM0OykpCiYjNDM7CQl0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2hhc2hfb2ZfbWFwcyYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIGZhbHNlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzaGFyZWRfaW5uZXImIzM0OykpCiYjNDM7CQl0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAyLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2VtcHR5X2FycmF5X29mX21hcHMmIzM0OykpCiYjNDM7CQl0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2VtcHR5X2hhc2hfb2ZfbWFwcyYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMCwgZmFsc2UsIGZhbHNlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtidGZfaW5uZXImIzM0OykpCiYjNDM7CQl0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIGZhbHNlLCB0cnVlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtlbXB0eV9pbm5lciYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgdHJ1ZSwgZmFsc2UpOwomIzQzO30KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDE6MjM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTM0ODMKCQkJCQkJCW91dHB1dDogODYKCQkJCQkJCXRob3VnaHRzOiA0NjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqV29ydGhGdXp6aW5nIEFzc2Vzc21lbnQ6IE5lZ2F0aXZlKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5lZWQgdG8gbG9vayBhdCB0aGUgZGlmZiBhbmQgc2VlIHdoYXQmIzM5O3MgYmVlbiB0b3VjaGVkLiBBbHJpZ2h0LCBJJiMzOTttIHNlZWluZyBjaGFuZ2VzIGluIGBicGZ0b29sYCByZWxhdGVkIGZpbGVzIGFuZCBzb21lIHNlbGYtdGVzdHMuIFNwZWNpZmljYWxseSwgSSYjMzk7bSBsb29raW5nIGF0IG1vZGlmaWNhdGlvbnMgdG8gYGJwZnRvb2xgJiMzOTtzIGRvY3VtZW50YXRpb24sIGJhc2ggY29tcGxldGlvbiwgYG1haW4uY2AsIGBtYWluLmhgLCBgbWFwLmNgLCBhbmQgdGhlIGBicGZ0b29sX21hcF9kdW1wLmNgIHNlbGYtdGVzdC4gQWxsIHRoZXNlIGNoYW5nZXMgYXJlIG5lYXRseSBjb250YWluZWQgd2l0aGluIHRoZSBgdG9vbHMvYCBkaXJlY3RvcnksIHNwZWNpZmljYWxseSB3aXRoaW4gYHRvb2xzL2JwZi9icGZ0b29sYCBhbmQgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZmAuCgpOb3csIEkgbmVlZCB0byBhcHBseSB0aGUgdHJpYWdlIGd1aWRlbGluZXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgZGVzZXJ2ZXMgZnV6emluZy4gQWNjb3JkaW5nIHRvIHRoZSBndWlkZWxpbmVzLCBJIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGNoYW5nZXMgZmFsbCB1bmRlciBhbnkgb2YgdGhlICYjMzQ7TkVHQVRJVkUgQ1JJVEVSSUEsJiMzNDsgbWVhbmluZyBpZiBJICpkb24mIzM5O3QqIG5lZWQgdG8gZmxhZyB0aGlzIGZvciBmdXp6aW5nLiBTZWVtcyBsaWtlIGEgZml0LiBUaGUgcnVsZSBoZXJlIGlzIGNsZWFyOiBJZiAqYWxsKiB0aGUgbW9kaWZpZWQgY29kZSBpcyBleGNsdXNpdmVseSBkb2N1bWVudGF0aW9uLCBjb21tZW50cywgc3BlbGxpbmcgZml4ZXMsIG9yIHVzZXItc3BhY2UgZGlyZWN0b3JpZXMgbGlrZSBgdG9vbHMvYCwgYHNhbXBsZXMvYCwgYHNjcmlwdHMvYCwgb3IgYHVzci9gICphbmQqIGRvZXMgKm5vdCogaW1wYWN0IHRoZSBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGFueSBrZXJuZWwgbW9kdWxlcywgdGhlbiBJIHNob3VsZCBzZXQgYFdvcnRoRnV6emluZz1mYWxzZWAuCgpDb25zaWRlcmluZyB0aGUgZ3VpZGVsaW5lcywgaXQmIzM5O3MgY2xlYXIgdGhhdCBhbGwgY2hhbmdlcyBhcmUgY29uZmluZWQgdG8gdXNlci1zcGFjZSB0b29scyAoYGJwZnRvb2xgKSBhbmQgYXNzb2NpYXRlZCBzZWxmLXRlc3RzLiBObyBrZXJuZWwgc291cmNlIGZpbGVzIHJlc2lkaW5nIGluIGRpcmVjdG9yaWVzIGxpa2UgYGtlcm5lbC9gLCBgbmV0L2AsIGBtbS9gLCBgZHJpdmVycy9gLCBgZnMvYCwgYGluY2x1ZGUvYCAoYmVzaWRlcyB0b29scy9pbmNsdWRlIGlmIGFueSksIG9yIG90aGVyIGNydWNpYWwga2VybmVsIGNvbXBvbmVudHMgYXJlIGFmZmVjdGVkLiBTbywgSSBhbSB2ZXJ5IGNvbmZpZGVudCB0aGlzIHBhdGNoIHdvbiYjMzk7dCBhZmZlY3QgdGhlIGtlcm5lbCBvciBtb2R1bGVzIGluIGFueSB3YXkuCgpDb25zZXF1ZW50bHksIGBXb3J0aEZ1enppbmdgIG11c3QgYmUgYGZhbHNlYCBpbiB0aGlzIGNhc2UuCgpCZWZvcmUgSSBmaW5hbGl6ZSB0aGUgcmVzcG9uc2UsIEkgc2hvdWxkIGFsc28gY29uZmlybSB0aGUgZm9ybWF0IGZvciByZXR1cm5pbmcgdGhlIHJlc3VsdHMuIEkgc2hvdWxkIHByb2JhYmx5IGRvdWJsZS1jaGVjayB0aGUgcmVxdWlyZW1lbnQgZm9yIHRoZSBgRm9jdXNTeW1ib2xzYCBhbmQgYEVuYWJsZUNvbmZpZ3NgIGFycmF5cy4gQWgsIHllcywgaWYgYFdvcnRoRnV6emluZz1mYWxzZWAsIHRoZXkgc2hvdWxkIGJlIHNldCB0byBlbXB0eSBhcnJheXMsIHdoaWNoIGlzIHRoZSBzdGFuZGFyZCBwcm9jZWR1cmUuIERvbmUhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDE6MjQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBvbmx5IHVzZXItc3BhY2UgdG9vbHMgYW5kIHNlbGZ0ZXN0cyB1bmRlciB0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLiBJdCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xzIGFuZCBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbCBjb2RlIG9yIGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDE6MjQ8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDAxOjIzOjU5LjM0MjE4Mzg3NloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUwMDE4MTQxMjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJcIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBvbmx5IHVzZXItc3BhY2UgdG9vbHMgYW5kIHNlbGZ0ZXN0cyB1bmRlciB0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLiBJdCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDE6MjM6NTkuMzQyMTg5MzU2WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1ODc5NTU0NDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA0MjJmYTU3ODZmNWMxMmJhMTUyM2RiZDhlNTBlN2ZjOWQyNWJmZWVkXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gU2VwIDcgMDE6MjM6NTggMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLjM4ZDFmNTQyYmY1YTUgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbkBAIC0xNiw3ICsxNiw3IEBAIFNZTk9QU0lTXFxuIFxcbiAqKmJwZnRvb2wqKiBbKk9QVElPTlMqXSAqKm1hcCoqICpDT01NQU5EKlxcbiBcXG4tKk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8IHsgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IH1cXG4rKk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8IHsgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IHwgeyAqKi1yKiogfCAqKi0tcmVjdXJzaXZlKiogfSB9XFxuIFxcbiAqQ09NTUFORFMqIDo9XFxuIHsgKipzaG93KiogfCAqKmxpc3QqKiB8ICoqY3JlYXRlKiogfCAqKmR1bXAqKiB8ICoqdXBkYXRlKiogfCAqKmxvb2t1cCoqIHwgKipnZXRuZXh0KiogfFxcbkBAIC0xNzAsNiArMTcwLDI1IEBAIE9QVElPTlNcXG4gICAgIERvIG5vdCBhdXRvbWF0aWNhbGx5IGF0dGVtcHQgdG8gbW91bnQgYW55IHZpcnR1YWwgZmlsZSBzeXN0ZW0gKHN1Y2ggYXNcXG4gICAgIHRyYWNlZnMgb3IgQlBGIHZpcnR1YWwgZmlsZSBzeXN0ZW0pIHdoZW4gbmVjZXNzYXJ5LlxcbiBcXG4rLXIsIC0tcmVjdXJzaXZlXFxuKyAgICBBbHNvIGR1bXAgdGhlIGlubmVyIG1hcHMgcmVmZXJlbmNlZCBieSAqKmFycmF5X29mX21hcHMqKiBhbmQgKipoYXNoX29mX21hcHMqKlxcbisgICAgZW50cmllcyB3aGVuIHJ1bm5pbmcgKiptYXAgZHVtcCoqLiBFYWNoIG1hcCBJRCBpcyB2aXNpdGVkIG9uY2UsIGV2ZW4gaWZcXG4rICAgIHNldmVyYWwgZW50cmllcyByZWZlciB0byBpdC4gU2VsZWN0ZWQgbWFwcyBhcmUgZm9sbG93ZWQgYnkgdGhlaXIgaW5uZXIgbWFwcy5cXG4rXFxuKyAgICBQbGFpbiBvdXRwdXQgaW5jbHVkZXMgYSBoZWFkZXIgaWRlbnRpZnlpbmcgZWFjaCBtYXAuIE9uIHN1Y2Nlc3MsIEpTT04gb3V0cHV0XFxuKyAgICBpcyBhbHdheXMgYW4gYXJyYXkgb2YgbWFwIG9iamVjdHMsIGVhY2ggY29udGFpbmluZyBhbiAqKmlkKiogYW5kIGFuXFxuKyAgICAqKmVsZW1lbnRzKiogYXJyYXksIGluY2x1ZGluZyB3aGVuIG9ubHkgb25lIG1hcCBpcyBkdW1wZWQuIE91dGVyIG1hcCBlbnRyaWVzXFxuKyAgICByZXRhaW4gdGhlaXIgKippbm5lcl9tYXBfaWQqKiBmaWVsZCwgd2hpY2ggaWRlbnRpZmllcyB0aGUgY29ycmVzcG9uZGluZyBpbm5lclxcbisgICAgbWFwIG9iamVjdC5cXG4rXFxuKyAgICBJbm5lciBtYXAgSURzIGFyZSByZXNvbHZlZCB3aGVuIHRoZSBtYXBzIGFyZSB2aXNpdGVkLiBUaGUgZHVtcCBpcyBub3QgYW5cXG4rICAgIGF0b21pYyBzbmFwc2hvdDogY29uY3VycmVudCB1cGRhdGVzIGNhbiBjaGFuZ2UgbWFwIGNvbnRlbnRzIG9yIHJlbW92ZSBhXFxuKyAgICByZWZlcmVuY2VkIGlubmVyIG1hcCBiZWZvcmUgaXQgaXMgdmlzaXRlZC4gRmFpbHVyZSB0byBvcGVuIGEgcmVmZXJlbmNlZFxcbisgICAgaW5uZXIgbWFwIHN0b3BzIHRoZSBkdW1wIGFuZCByZXR1cm5zIGEgbm9uemVybyBleGl0IHN0YXR1cy4gT3V0cHV0IG1heVxcbisgICAgY29udGFpbiBtYXBzIG9yIGVudHJpZXMgcHJpbnRlZCBiZWZvcmUgdGhlIGVycm9yLlxcbisgICAgSW4gSlNPTiBtb2RlLCBhbiBlcnJvciBkdXJpbmcgdHJhdmVyc2FsIGlzIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgYW5kIHRoZVxcbisgICAgZW5jbG9zaW5nIGFycmF5cyBhbmQgb2JqZWN0cyBhcmUgY2xvc2VkLlxcbitcXG4gRVhBTVBMRVNcXG4gPT09PT09PT1cXG4gKiojIGJwZnRvb2wgbWFwIHNob3cqKlxcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXFxuaW5kZXggNzVjYmNiNTEyZWJhZS4uNDVjMzM2ZDYzYmUwYSAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXFxuQEAgLTI2MSw3ICsyNjEsNyBAQCBfYnBmdG9vbCgpXFxuIFxcbiAgICAgIyBEZWFsIHdpdGggb3B0aW9uc1xcbiAgICAgaWYgW1sgJHt3b3Jkc1tjd29yZF19ID09IC0qIF1dOyB0aGVuXFxuLSAgICAgICAgbG9jYWwgYz0nLS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcXFxcbisgICAgICAgIGxvY2FsIGM9Jy0tdmVyc2lvbiAtLWpzb24gLS1wcmV0dHkgLS1yZWN1cnNpdmUgLS1icGZmcyAtLW1hcGNvbXBhdCAtLWRlYnVnIFxcXFxcXG4gICAgICAgICAgICAgLS11c2UtbG9hZGVyIC0tYmFzZS1idGYgLS1zaWduIC1pIC1rJ1xcbiAgICAgICAgIENPTVBSRVBMWT0oICQoIGNvbXBnZW4gLVcgXFxcIiRjXFxcIiAtLSBcXFwiJGN1clxcXCIgKSApXFxuICAgICAgICAgcmV0dXJuIDBcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jXFxuaW5kZXggYzkxZTFhNmUxYTFlYy4uMjkwMjFmNGRkNDUxOCAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmNcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmNcXG5AQCAtMjYsNiArMjYsNyBAQCBzdGF0aWMgaW50ICgqbGFzdF9kb19oZWxwKShpbnQgYXJnYywgY2hhciAqKmFyZ3YpO1xcbiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcXG4gYm9vbCBwcmV0dHlfb3V0cHV0O1xcbiBib29sIGpzb25fb3V0cHV0O1xcbitib29sIHJlY3Vyc2l2ZTtcXG4gYm9vbCBzaG93X3Bpbm5lZDtcXG4gYm9vbCBibG9ja19tb3VudDtcXG4gYm9vbCB2ZXJpZmllcl9sb2dzO1xcbkBAIC00NTIsNiArNDUzLDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHR7IFxcXCJqc29uXFxcIixcXHRub19hcmd1bWVudCxcXHROVUxMLFxcdCdqJyB9LFxcbiBcXHRcXHR7IFxcXCJoZWxwXFxcIixcXHRub19hcmd1bWVudCxcXHROVUxMLFxcdCdoJyB9LFxcbiBcXHRcXHR7IFxcXCJwcmV0dHlcXFwiLFxcdG5vX2FyZ3VtZW50LFxcdE5VTEwsXFx0J3AnIH0sXFxuK1xcdFxcdHsgXFxcInJlY3Vyc2l2ZVxcXCIsXFx0bm9fYXJndW1lbnQsXFx0TlVMTCxcXHQncicgfSxcXG4gXFx0XFx0eyBcXFwidmVyc2lvblxcXCIsXFx0bm9fYXJndW1lbnQsXFx0TlVMTCxcXHQnVicgfSxcXG4gXFx0XFx0eyBcXFwiYnBmZnNcXFwiLFxcdG5vX2FyZ3VtZW50LFxcdE5VTEwsXFx0J2YnIH0sXFxuIFxcdFxcdHsgXFxcIm1hcGNvbXBhdFxcXCIsXFx0bm9fYXJndW1lbnQsXFx0TlVMTCxcXHQnbScgfSxcXG5AQCAtNDg1LDcgKzQ4Nyw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0YmluX25hbWUgPSBcXFwiYnBmdG9vbFxcXCI7XFxuIFxcbiBcXHRvcHRlcnIgPSAwO1xcbi1cXHR3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsIFxcXCJWaHBqZkxtbmRTaTprOkI6bFxcXCIsXFxuK1xcdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXFxcIlZocGpyZkxtbmRTaTprOkI6bFxcXCIsXFxuIFxcdFxcdFxcdFxcdCAgb3B0aW9ucywgTlVMTCkpIFxcdTAwM2U9IDApIHtcXG4gXFx0XFx0c3dpdGNoIChvcHQpIHtcXG4gXFx0XFx0Y2FzZSAnVic6XFxuQEAgLTUwNyw2ICs1MDksOSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdFxcdH1cXG4gXFx0XFx0XFx0anNvbndfcHJldHR5KGpzb25fd3RyLCBwcmV0dHlfb3V0cHV0KTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgJ3InOlxcbitcXHRcXHRcXHRyZWN1cnNpdmUgPSB0cnVlO1xcbitcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0Y2FzZSAnZic6XFxuIFxcdFxcdFxcdHNob3dfcGlubmVkID0gdHJ1ZTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaCBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxcbmluZGV4IDc4YjZlMGViYjg1ZDguLmI1ZGM3OTYwY2Y2ODIgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oXFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oXFxuQEAgLTgzLDYgKzgzLDcgQEAgZXh0ZXJuIGNvbnN0IGNoYXIgKmJpbl9uYW1lO1xcbiBcXG4gZXh0ZXJuIGpzb25fd3JpdGVyX3QgKmpzb25fd3RyO1xcbiBleHRlcm4gYm9vbCBqc29uX291dHB1dDtcXG4rZXh0ZXJuIGJvb2wgcmVjdXJzaXZlO1xcbiBleHRlcm4gYm9vbCBzaG93X3Bpbm5lZDtcXG4gZXh0ZXJuIGJvb2wgc2hvd19waWRzO1xcbiBleHRlcm4gYm9vbCBibG9ja19tb3VudDtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xcbmluZGV4IDY4NGE4ZmI3MjQxNDYuLmZjMDZjNzY1OTczMTUgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xcbkBAIC0xNyw2ICsxNyw3IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NicGYvYnBmLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NicGYvYnRmLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NicGYvaGFzaG1hcC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2xpYmJwZl9pbnRlcm5hbC5oXFx1MDAzZVxcbiBcXG4gI2luY2x1ZGUgXFxcImpzb25fd3JpdGVyLmhcXFwiXFxuICNpbmNsdWRlIFxcXCJtYWluLmhcXFwiXFxuQEAgLTgyNiwxMiArODI3LDQ0IEBAIHN0YXRpYyB2b2lkIGZyZWVfbWFwX2t2X2J0ZihzdHJ1Y3QgYnRmICpidGYpXFxuIFxcdFxcdGJ0Zl9fZnJlZShidGYpO1xcbiB9XFxuIFxcbitzdHJ1Y3QgbWFwX2R1bXBfY3R4IHtcXG4rXFx0c3RydWN0IGhhc2htYXAgKnNlZW47XFxuK1xcdF9fdTMyICpwZW5kaW5nX2lkcztcXG4rXFx0c2l6ZV90IHBlbmRpbmdfY250O1xcbit9O1xcbitcXG4rc3RhdGljIGludCBjb2xsZWN0X2lubmVyX21hcChzdHJ1Y3QgbWFwX2R1bXBfY3R4ICpjdHgsIF9fdTMyIGlkKVxcbit7XFxuK1xcdF9fdTMyICppZHM7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRpZiAoaGFzaG1hcF9fZmluZChjdHgtXFx1MDAzZXNlZW4sIGlkLCBOVUxMKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRpZHMgPSBsaWJicGZfcmVhbGxvY2FycmF5KGN0eC1cXHUwMDNlcGVuZGluZ19pZHMsIGN0eC1cXHUwMDNlcGVuZGluZ19jbnQgKyAxLFxcbitcXHRcXHRcXHRcXHQgc2l6ZW9mKCppZHMpKTtcXG4rXFx0aWYgKCFpZHMpIHtcXG4rXFx0XFx0cF9lcnIoXFxcIm1lbSBhbGxvYyBmYWlsZWRcXFwiKTtcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHR9XFxuK1xcdGN0eC1cXHUwMDNlcGVuZGluZ19pZHMgPSBpZHM7XFxuK1xcbitcXHRlcnIgPSBoYXNobWFwX19hZGQoY3R4LVxcdTAwM2VzZWVuLCBpZCwgMCk7XFxuK1xcdGlmIChlcnIpIHtcXG4rXFx0XFx0cF9lcnIoXFxcImZhaWxlZCB0byByZWNvcmQgaW5uZXIgbWFwIGlkICV1OiAlc1xcXCIsIGlkLCBzdHJlcnJvcigtZXJyKSk7XFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0fVxcbitcXHRpZHNbY3R4LVxcdTAwM2VwZW5kaW5nX2NudCsrXSA9IGlkO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4gc3RhdGljIGludFxcbiBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcXG4tXFx0IGJvb2wgc2hvd19oZWFkZXIpXFxuK1xcdCBib29sIHNob3dfaGVhZGVyLCBzdHJ1Y3QgbWFwX2R1bXBfY3R4ICpjdHgpXFxuIHtcXG4gXFx0dm9pZCAqa2V5LCAqdmFsdWUsICpwcmV2X2tleTtcXG4gXFx0dW5zaWduZWQgaW50IG51bV9lbGVtcyA9IDA7XFxuK1xcdGpzb25fd3JpdGVyX3QgKnBsYWluX2J0Zl93dHIgPSBOVUxMO1xcbiBcXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xcbiBcXHRpbnQgZXJyO1xcbiBcXG5AQCAtODQ1LDYgKzg3OCwxNyBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcXG4gXFxuIFxcdHByZXZfa2V5ID0gTlVMTDtcXG4gXFxuK1xcdGlmIChjdHggXFx1MDAyNlxcdTAwMjYgIXd0ciBcXHUwMDI2XFx1MDAyNiAoaW5mby1cXHUwMDNlYnRmX3ZhbHVlX3R5cGVfaWQgfHxcXG4rXFx0XFx0XFx0ICAgIGluZm8tXFx1MDAzZWJ0Zl92bWxpbnV4X3ZhbHVlX3R5cGVfaWQpKSB7XFxuK1xcdFxcdHBsYWluX2J0Zl93dHIgPSBnZXRfYnRmX3dyaXRlcigpO1xcbitcXHRcXHRpZiAocGxhaW5fYnRmX3d0cikge1xcbitcXHRcXHRcXHRpZiAoc2hvd19oZWFkZXIpXFxuK1xcdFxcdFxcdFxcdHNob3dfbWFwX2hlYWRlcl9wbGFpbihpbmZvKTtcXG4rXFx0XFx0XFx0c2hvd19oZWFkZXIgPSBmYWxzZTtcXG4rXFx0XFx0XFx0d3RyID0gcGxhaW5fYnRmX3d0cjtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbiBcXHRpZiAod3RyKSB7XFxuIFxcdFxcdGVyciA9IGdldF9tYXBfa3ZfYnRmKGluZm8sIFxcdTAwMjZidGYpO1xcbiBcXHRcXHRpZiAoZXJyKSB7XFxuQEAgLTg3NCwxMCArOTE4LDIwIEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxcbiBcXHRcXHRpZiAoZXJyKSB7XFxuIFxcdFxcdFxcdGlmIChlcnJubyA9PSBFTk9FTlQpXFxuIFxcdFxcdFxcdFxcdGVyciA9IDA7XFxuK1xcdFxcdFxcdGVsc2UgaWYgKGN0eClcXG4rXFx0XFx0XFx0XFx0cF9lcnIoXFxcImNhbid0IGdldCBuZXh0IGtleSBmb3IgbWFwIGlkICV1OiAlc1xcXCIsXFxuK1xcdFxcdFxcdFxcdCAgICAgIGluZm8tXFx1MDAzZWlkLCBzdHJlcnJvcihlcnJubykpO1xcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0fVxcbi1cXHRcXHRpZiAoIWR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKSlcXG4rXFx0XFx0ZXJyID0gZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpO1xcbitcXHRcXHRpZiAoIWVycikge1xcbiBcXHRcXHRcXHRudW1fZWxlbXMrKztcXG4rXFx0XFx0XFx0aWYgKGN0eCBcXHUwMDI2XFx1MDAyNiBtYXBfaXNfbWFwX29mX21hcHMoaW5mby1cXHUwMDNldHlwZSkpIHtcXG4rXFx0XFx0XFx0XFx0ZXJyID0gY29sbGVjdF9pbm5lcl9tYXAoY3R4LCAqKF9fdTMyICopdmFsdWUpO1xcbitcXHRcXHRcXHRcXHRpZiAoZXJyKVxcbitcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuIFxcdFxcdHByZXZfa2V5ID0ga2V5O1xcbiBcXHR9XFxuIFxcbkBAIC04OTQsMTggKzk0OCwyNSBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcXG4gXFx0ZnJlZShrZXkpO1xcbiBcXHRmcmVlKHZhbHVlKTtcXG4gXFx0ZnJlZV9tYXBfa3ZfYnRmKGJ0Zik7XFxuK1xcdGlmIChwbGFpbl9idGZfd3RyKVxcbitcXHRcXHRqc29ud19kZXN0cm95KFxcdTAwMjZwbGFpbl9idGZfd3RyKTtcXG4gXFxuIFxcdHJldHVybiBlcnI7XFxuIH1cXG4gXFxuIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIHtcXG4rXFx0TElCQlBGX09QVFMoYnBmX2dldF9mZF9ieV9pZF9vcHRzLCBvcHRzLFxcbitcXHRcXHQub3Blbl9mbGFncyA9IEJQRl9GX1JET05MWSxcXG4rXFx0KTtcXG4gXFx0anNvbl93cml0ZXJfdCAqd3RyID0gTlVMTCwgKmJ0Zl93dHIgPSBOVUxMO1xcbiBcXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcXG4rXFx0c3RydWN0IG1hcF9kdW1wX2N0eCBjdHggPSB7fTtcXG4gXFx0aW50IG5iX2ZkcywgaSA9IDA7XFxuIFxcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcXG4gXFx0aW50ICpmZHMgPSBOVUxMO1xcbiBcXHRpbnQgZXJyID0gLTE7XFxuK1xcdHNpemVfdCBqO1xcbiBcXG4gXFx0aWYgKGFyZ2MgIT0gMilcXG4gXFx0XFx0dXNhZ2UoKTtcXG5AQCAtOTE5LDkgKzk4MCwzNCBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRpZiAobmJfZmRzIFxcdTAwM2MgMSlcXG4gXFx0XFx0Z290byBleGl0X2ZyZWU7XFxuIFxcbitcXHRpZiAocmVjdXJzaXZlKSB7XFxuK1xcdFxcdGN0eC5zZWVuID0gaGFzaG1hcF9fbmV3KGhhc2hfZm5fZm9yX2tleV9hc19pZCxcXG4rXFx0XFx0XFx0XFx0XFx0ZXF1YWxfZm5fZm9yX2tleV9hc19pZCwgTlVMTCk7XFxuK1xcdFxcdGlmIChJU19FUlIoY3R4LnNlZW4pKSB7XFxuK1xcdFxcdFxcdGN0eC5zZWVuID0gTlVMTDtcXG4rXFx0XFx0XFx0cF9lcnIoXFxcImZhaWxlZCB0byBjcmVhdGUgaGFzaG1hcCBmb3IgcmVjdXJzaXZlIGR1bXBcXFwiKTtcXG4rXFx0XFx0XFx0Z290byBleGl0X2Nsb3NlO1xcbitcXHRcXHR9XFxuK1xcdFxcdC8qIFJlY29yZCB0aGUgc2VsZWN0ZWQgbWFwcyBiZWZvcmUgZGlzY292ZXJpbmcgYW55IGlubmVyIG1hcHMuICovXFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBuYl9mZHM7IGkrKykge1xcbitcXHRcXHRcXHRsZW4gPSBzaXplb2YoaW5mbyk7XFxuK1xcdFxcdFxcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgXFx1MDAyNmluZm8sIFxcdTAwMjZsZW4pKSB7XFxuK1xcdFxcdFxcdFxcdHBfZXJyKFxcXCJjYW4ndCBnZXQgbWFwIGluZm86ICVzXFxcIiwgc3RyZXJyb3IoZXJybm8pKTtcXG4rXFx0XFx0XFx0XFx0ZXJyID0gLTE7XFxuK1xcdFxcdFxcdFxcdGdvdG8gZXhpdF9jbG9zZTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRlcnIgPSBoYXNobWFwX19hZGQoY3R4LnNlZW4sIGluZm8uaWQsIDApO1xcbitcXHRcXHRcXHRpZiAoZXJyKSB7XFxuK1xcdFxcdFxcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gcmVjb3JkIG1hcCBpZCAldTogJXNcXFwiLCBpbmZvLmlkLFxcbitcXHRcXHRcXHRcXHQgICAgICBzdHJlcnJvcigtZXJyKSk7XFxuK1xcdFxcdFxcdFxcdGdvdG8gZXhpdF9jbG9zZTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuIFxcdGlmIChqc29uX291dHB1dCkge1xcbiBcXHRcXHR3dHIgPSBqc29uX3d0cjtcXG4tXFx0fSBlbHNlIHtcXG4rXFx0fSBlbHNlIGlmICghcmVjdXJzaXZlKSB7XFxuIFxcdFxcdGludCBkb19wbGFpbl9idGY7XFxuIFxcbiBcXHRcXHRkb19wbGFpbl9idGYgPSBtYXBzX2hhdmVfYnRmKGZkcywgbmJfZmRzKTtcXG5AQCAtOTM2LDcgKzEwMjIsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHR9XFxuIFxcdH1cXG4gXFxuLVxcdGlmICh3dHIgXFx1MDAyNlxcdTAwMjYgbmJfZmRzIFxcdTAwM2UgMSlcXG4rXFx0aWYgKHd0ciBcXHUwMDI2XFx1MDAyNiAobmJfZmRzIFxcdTAwM2UgMSB8fCByZWN1cnNpdmUpKVxcbiBcXHRcXHRqc29ud19zdGFydF9hcnJheSh3dHIpO1xcdC8qIHJvb3QgYXJyYXkgKi9cXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5iX2ZkczsgaSsrKSB7XFxuIFxcdFxcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgXFx1MDAyNmluZm8sIFxcdTAwMjZsZW4pKSB7XFxuQEAgLTk0NCwyMiArMTAzMCw1MCBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHRcXHRlcnIgPSAtMTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdH1cXG4tXFx0XFx0ZXJyID0gbWFwX2R1bXAoZmRzW2ldLCBcXHUwMDI2aW5mbywgd3RyLCBuYl9mZHMgXFx1MDAzZSAxKTtcXG4rXFx0XFx0ZXJyID0gbWFwX2R1bXAoZmRzW2ldLCBcXHUwMDI2aW5mbywgd3RyLCBuYl9mZHMgXFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZSxcXG4rXFx0XFx0XFx0ICAgICAgIHJlY3Vyc2l2ZSA/IFxcdTAwMjZjdHggOiBOVUxMKTtcXG4gXFx0XFx0aWYgKCF3dHIgXFx1MDAyNlxcdTAwMjYgaSAhPSBuYl9mZHMgLSAxKVxcbiBcXHRcXHRcXHRwcmludGYoXFxcIlxcXFxuXFxcIik7XFxuIFxcbiBcXHRcXHRpZiAoZXJyKVxcbiBcXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0Y2xvc2UoZmRzW2ldKTtcXG4rXFx0XFx0LyogS2VlcCBzZWxlY3RlZCBtYXBzIGFsaXZlIHdoaWxlIHZpc2l0aW5nIHRoZWlyIGlubmVyIG1hcHMuICovXFxuK1xcdFxcdGlmICghcmVjdXJzaXZlKVxcbitcXHRcXHRcXHRjbG9zZShmZHNbaV0pO1xcbitcXHR9XFxuK1xcdGZvciAoaiA9IDA7ICFlcnIgXFx1MDAyNlxcdTAwMjYgaiBcXHUwMDNjIGN0eC5wZW5kaW5nX2NudDsgaisrKSB7XFxuK1xcdFxcdGludCBmZDtcXG4rXFxuK1xcdFxcdGZkID0gYnBmX21hcF9nZXRfZmRfYnlfaWRfb3B0cyhjdHgucGVuZGluZ19pZHNbal0sIFxcdTAwMjZvcHRzKTtcXG4rXFx0XFx0aWYgKGZkIFxcdTAwM2MgMCkge1xcbitcXHRcXHRcXHRwX2VycihcXFwiY2FuJ3Qgb3BlbiBpbm5lciBtYXAgaWQgJXU6ICVzXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgY3R4LnBlbmRpbmdfaWRzW2pdLCBzdHJlcnJvcihlcnJubykpO1xcbitcXHRcXHRcXHRlcnIgPSAtMTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4rXFx0XFx0bGVuID0gc2l6ZW9mKGluZm8pO1xcbitcXHRcXHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXFx1MDAyNmluZm8sIFxcdTAwMjZsZW4pKSB7XFxuK1xcdFxcdFxcdHBfZXJyKFxcXCJjYW4ndCBnZXQgbWFwIGluZm86ICVzXFxcIiwgc3RyZXJyb3IoZXJybm8pKTtcXG4rXFx0XFx0XFx0ZXJyID0gLTE7XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdGlmICghd3RyKVxcbitcXHRcXHRcXHRcXHRwcmludGYoXFxcIlxcXFxuXFxcIik7XFxuK1xcdFxcdFxcdGVyciA9IG1hcF9kdW1wKGZkLCBcXHUwMDI2aW5mbywgd3RyLCB0cnVlLCBcXHUwMDI2Y3R4KTtcXG4rXFx0XFx0fVxcbitcXHRcXHRjbG9zZShmZCk7XFxuIFxcdH1cXG4tXFx0aWYgKHd0ciBcXHUwMDI2XFx1MDAyNiBuYl9mZHMgXFx1MDAzZSAxKVxcbitcXHRpZiAod3RyIFxcdTAwMjZcXHUwMDI2IChuYl9mZHMgXFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZSkpXFxuIFxcdFxcdGpzb253X2VuZF9hcnJheSh3dHIpO1xcdC8qIHJvb3QgYXJyYXkgKi9cXG4gXFxuIFxcdGlmIChidGZfd3RyKVxcbiBcXHRcXHRqc29ud19kZXN0cm95KFxcdTAwMjZidGZfd3RyKTtcXG4gZXhpdF9jbG9zZTpcXG4rXFx0aWYgKHJlY3Vyc2l2ZSlcXG4rXFx0XFx0aSA9IDA7XFxuIFxcdGZvciAoOyBpIFxcdTAwM2MgbmJfZmRzOyBpKyspXFxuIFxcdFxcdGNsb3NlKGZkc1tpXSk7XFxuK1xcdGhhc2htYXBfX2ZyZWUoY3R4LnNlZW4pO1xcbitcXHRmcmVlKGN0eC5wZW5kaW5nX2lkcyk7XFxuIGV4aXRfZnJlZTpcXG4gXFx0ZnJlZShmZHMpO1xcbiBcXHRmcmVlX2J0Zl92bWxpbnV4KCk7XFxuQEAgLTE0ODQsNyArMTU5OCw3IEBAIHN0YXRpYyBpbnQgZG9faGVscChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdFxcXCIgICAgICAgICAgICAgICAgIHRhc2tfc3RvcmFnZSB8IGJsb29tX2ZpbHRlciB8IHVzZXJfcmluZ2J1ZiB8IGNncnBfc3RvcmFnZSB8IGFyZW5hIHxcXFxcblxcXCJcXG4gXFx0XFx0XFxcIiAgICAgICAgICAgICAgICAgaW5zbl9hcnJheSB8IHJoYXNoIH1cXFxcblxcXCJcXG4gXFx0XFx0XFxcIiAgICAgICBcXFwiIEhFTFBfU1BFQ19PUFRJT05TIFxcXCIgfFxcXFxuXFxcIlxcbi1cXHRcXHRcXFwiICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB9XFxcXG5cXFwiXFxuK1xcdFxcdFxcXCIgICAgICAgICAgICAgICAgICAgIHstZnwtLWJwZmZzfSB8IHstbnwtLW5vbW91bnR9IHwgey1yfC0tcmVjdXJzaXZlfSB9XFxcXG5cXFwiXFxuIFxcdFxcdFxcXCJcXFwiLFxcbiBcXHRcXHRiaW5fbmFtZSwgYXJndlstMl0pO1xcbiBcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi4zMzBhMzM0NDc3MGQxXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY1xcbkBAIC0wLDAgKzEsNDE5IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4rI2luY2x1ZGUgXFx1MDAzY3Rlc3RfcHJvZ3MuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZnRvb2xfaGVscGVycy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2J0Zi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3Jlc291cmNlLmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIE9VVFBVVF9TSVpFIDgxOTJcXG4rXFxuK3N0YXRpYyBib29sIGR1bXBfbWFwKF9fdTMyIGlkLCBjb25zdCBjaGFyICpvcHRpb25zLCBjaGFyICpvdXRwdXQpXFxuK3tcXG4rXFx0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dO1xcbitcXG4rXFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwiJXMgbWFwIGR1bXAgaWQgJXVcXFwiLCBvcHRpb25zLCBpZCk7XFxuK1xcdG1lbXNldChvdXRwdXQsIDAsIE9VVFBVVF9TSVpFKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBPVVRQVVRfU0laRSAtIDEpLFxcbitcXHRcXHQgICAgICAgXFxcImR1bXBfbWFwXFxcIikpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0LyogVGhlIGhlbHBlciBkb2Vzbid0IHRlcm1pbmF0ZSBvciBzdHJpcCB0aGUgb3V0cHV0LiAqL1xcbitcXHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFxcXCJcXFxcblxcXCIpXSA9ICdcXFxcMCc7XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbitzdGF0aWMgX191MzIgbWFwX2lkKGludCBmZClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcXG4rXFx0X191MzIgbGVuID0gc2l6ZW9mKGluZm8pO1xcbitcXG4rXFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXFx1MDAyNmluZm8sIFxcdTAwMjZsZW4pLCBcXFwibWFwX2luZm9cXFwiKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdHJldHVybiBpbmZvLmlkO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGNvdW50X3Rva2VuKGNvbnN0IGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqdG9rZW4pXFxuK3tcXG4rXFx0aW50IGNvdW50ID0gMDtcXG4rXFxuK1xcdHdoaWxlICgob3V0cHV0ID0gc3Ryc3RyKG91dHB1dCwgdG9rZW4pKSkge1xcbitcXHRcXHRjb3VudCsrO1xcbitcXHRcXHRvdXRwdXQgKz0gc3RybGVuKHRva2VuKTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gY291bnQ7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNoZWNrX3BsYWluKF9fdTMyIHJvb3RfaWQsIF9fdTMyIGlubmVyX2lkLCBjb25zdCBjaGFyICp0eXBlLFxcbitcXHRcXHRcXHRpbnQgZW50cmllcywgYm9vbCB0eXBlZClcXG4re1xcbitcXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIGhlYWRlclsxMjhdO1xcbitcXHRjaGFyIG91dHB1dFtPVVRQVVRfU0laRV0gPSB7fTtcXG4rXFx0Y29uc3QgY2hhciAqcm9vdCwgKmlubmVyO1xcbitcXG4rXFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwiLS1yZWN1cnNpdmUgbWFwIGR1bXAgaWQgJXVcXFwiLCByb290X2lkKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxcbitcXHRcXHQgICAgICAgXFxcInBsYWluX2R1bXBcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCBcXFwiJXU6ICVzICBuYW1lIGR1bXBfb3V0ZXIgIFxcXCIsIHJvb3RfaWQsIHR5cGUpO1xcbitcXHRyb290ID0gc3Ryc3RyKG91dHB1dCwgaGVhZGVyKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHJvb3QsIFxcXCJwbGFpbl9yb290X2hlYWRlclxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdEFTU0VSVF9FUShyb290IC0gb3V0cHV0LCAwLCBcXFwicGxhaW5fcm9vdF9maXJzdFxcXCIpO1xcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBcXFwiaW5uZXJfbWFwX2lkOlxcXCIpLCBlbnRyaWVzLCBcXFwicGxhaW5fcmVmZXJlbmNlc1xcXCIpO1xcbitcXHRpZiAoZW50cmllcykge1xcbitcXHRcXHRzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCBcXFwiJXU6IGhhc2ggIG5hbWUgZHVtcF9pbm5lciAgXFxcIiwgaW5uZXJfaWQpO1xcbitcXHRcXHRpbm5lciA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7XFxuK1xcdFxcdGlmIChBU1NFUlRfT0tfUFRSKGlubmVyLCBcXFwicGxhaW5faW5uZXJfaGVhZGVyXFxcIikpXFxuK1xcdFxcdFxcdEFTU0VSVF9HVChpbm5lciAtIHJvb3QsIDAsIFxcXCJwbGFpbl9pbm5lcl9hZnRlcl9yb290XFxcIik7XFxuK1xcdFxcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIGhlYWRlciksIDEsIFxcXCJwbGFpbl9pbm5lcl9vbmNlXFxcIik7XFxuK1xcdH1cXG4rXFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgXFxcIkZvdW5kIFxcXCIpLCBlbnRyaWVzIFxcdTAwMjZcXHUwMDI2ICF0eXBlZCA/IDIgOiAxLFxcbitcXHRcXHQgIFxcXCJwbGFpbl9tYXBfY291bnRcXFwiKTtcXG4rXFx0aWYgKHR5cGVkKSB7XFxuK1xcdFxcdEFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgXFxcIlxcXFxcXFwia2V5XFxcXFxcXCI6IDBcXFwiLCBcXFwicGxhaW5fYnRmX2tleVxcXCIpO1xcbitcXHRcXHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIFxcXCJcXFxcXFxcInZhbHVlXFxcXFxcXCI6IDE2ODQzMDA5XFxcIiwgXFxcInBsYWluX2J0Zl92YWx1ZVxcXCIpO1xcbitcXHR9XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3Rfb3V0ZXIoZW51bSBicGZfbWFwX3R5cGUgdHlwZSwgaW50IGVudHJpZXMsIGJvb2wgZW1wdHlfaW5uZXIsXFxuK1xcdFxcdCAgICAgICBib29sIHR5cGVkKVxcbit7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xcbitcXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBpbm5lcl9vcHRzKTtcXG4rXFx0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcXG4rXFx0Y2hhciBvdXRlcltPVVRQVVRfU0laRV0sIGlubmVyW09VVFBVVF9TSVpFXSwgb3V0cHV0W09VVFBVVF9TSVpFXTtcXG4rXFx0Y2hhciBleHBlY3RlZFtPVVRQVVRfU0laRSAqIDNdLCByZWZlcmVuY2VbNjRdO1xcbitcXHRjb25zdCBjaGFyICp0eXBlX25hbWUgPSBsaWJicGZfYnBmX21hcF90eXBlX3N0cih0eXBlKTtcXG4rXFx0aW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTE7XFxuK1xcdF9fdTMyIHJvb3RfaWQsIGlubmVyX2lkLCBrZXksIHZhbHVlID0gMHgwMTAxMDEwMTtcXG4rXFxuK1xcdGlmICh0eXBlZCkge1xcbitcXHRcXHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcXFwiY3JlYXRlX2J0ZlxcXCIpIHx8XFxuK1xcdFxcdCAgICAhQVNTRVJUX0VRKGJ0Zl9fYWRkX2ludChidGYsIFxcXCJ1bnNpZ25lZCBpbnRcXFwiLCA0LCAwKSwgMSwgXFxcImJ0Zl9pbnRcXFwiKSB8fFxcbitcXHRcXHQgICAgIUFTU0VSVF9PSyhidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKSwgXFxcImxvYWRfYnRmXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRpbm5lcl9vcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTtcXG4rXFx0XFx0aW5uZXJfb3B0cy5idGZfa2V5X3R5cGVfaWQgPSAxO1xcbitcXHRcXHRpbm5lcl9vcHRzLmJ0Zl92YWx1ZV90eXBlX2lkID0gMTtcXG4rXFx0fVxcbitcXHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcXFwiZHVtcF9pbm5lclxcXCIsIHNpemVvZihrZXkpLFxcbitcXHRcXHRcXHRcXHQgIHNpemVvZih2YWx1ZSksIDIsIFxcdTAwMjZpbm5lcl9vcHRzKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFxcXCJjcmVhdGVfaW5uZXJcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGtleSA9IDA7XFxuK1xcdGlmICghZW1wdHlfaW5uZXIgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShpbm5lcl9mZCwgXFx1MDAyNmtleSwgXFx1MDAyNnZhbHVlLCBCUEZfQU5ZKSxcXG4rXFx0XFx0ICAgICAgIFxcXCJwb3B1bGF0ZV9pbm5lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0b3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDtcXG4rXFx0b3V0ZXJfZmQgPSBicGZfbWFwX2NyZWF0ZSh0eXBlLCBcXFwiZHVtcF9vdXRlclxcXCIsIHNpemVvZihrZXkpLCBzaXplb2YoX191MzIpLFxcbitcXHRcXHRcXHRcXHQgMywgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXFxcImNyZWF0ZV9vdXRlclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0LyogVGhlIHVudXNlZCB0aGlyZCBhcnJheSBzbG90IGFsc28gZXhlcmNpc2VzIGZhaWxlZCBsb29rdXBzLiAqL1xcbitcXHRmb3IgKGtleSA9IDA7IGtleSBcXHUwMDNjIGVudHJpZXM7IGtleSsrKVxcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCBcXHUwMDI2a2V5LCBcXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxcbitcXHRcXHRcXHQgICAgICAgXFxcInBvcHVsYXRlX291dGVyXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTtcXG4rXFx0aW5uZXJfaWQgPSBtYXBfaWQoaW5uZXJfZmQpO1xcbitcXHRpZiAoIXJvb3RfaWQgfHwgIWlubmVyX2lkIHx8ICFkdW1wX21hcChyb290X2lkLCBcXFwiLWpcXFwiLCBvdXRlcikgfHxcXG4rXFx0ICAgICFkdW1wX21hcChpbm5lcl9pZCwgXFxcIi1qXFxcIiwgaW5uZXIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdEFTU0VSVF9FUShvdXRlclswXSwgJ1snLCBcXFwiZGVmYXVsdF9hcnJheVxcXCIpO1xcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIFxcXCJcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6XFxcIiksIDAsIFxcXCJkZWZhdWx0X25vX3dyYXBwZXJcXFwiKTtcXG4rXFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCBcXFwiXFxcXFxcXCJpZFxcXFxcXFwiOlxcXCIpLCAwLCBcXFwiZGVmYXVsdF9ub19oZWFkZXJcXFwiKTtcXG4rXFx0c25wcmludGYocmVmZXJlbmNlLCBzaXplb2YocmVmZXJlbmNlKSwgXFxcIlxcXFxcXFwiaW5uZXJfbWFwX2lkXFxcXFxcXCI6JXVcXFwiLCBpbm5lcl9pZCk7XFxuK1xcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgcmVmZXJlbmNlKSwgZW50cmllcywgXFxcImRlZmF1bHRfcmVmZXJlbmNlc1xcXCIpO1xcbitcXHRpZiAoIWVudHJpZXMpXFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRlciwgXFxcIltdXFxcIiwgXFxcImVtcHR5X291dGVyX2RlZmF1bHRcXFwiKTtcXG4rXFx0aWYgKGVtcHR5X2lubmVyKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEoaW5uZXIsIFxcXCJbXVxcXCIsIFxcXCJlbXB0eV9pbm5lcl9kZWZhdWx0XFxcIik7XFxuK1xcdGVsc2UgaWYgKHR5cGVkKVxcbitcXHRcXHRBU1NFUlRfSEFTX1NVQlNUUihpbm5lciwgXFxcIlxcXFxcXFwiZm9ybWF0dGVkXFxcXFxcXCI6e1xcXFxcXFwia2V5XFxcXFxcXCI6MCxcXFxcXFxcInZhbHVlXFxcXFxcXCI6MTY4NDMwMDl9XFxcIixcXG4rXFx0XFx0XFx0XFx0ICBcXFwidHlwZWRfaW5uZXJcXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRBU1NFUlRfU1RSRVEoaW5uZXIsXFxuK1xcdFxcdFxcdCAgICAgXFxcIlt7XFxcXFxcXCJrZXlcXFxcXFxcIjpbXFxcXFxcXCIweDAwXFxcXFxcXCIsXFxcXFxcXCIweDAwXFxcXFxcXCIsXFxcXFxcXCIweDAwXFxcXFxcXCIsXFxcXFxcXCIweDAwXFxcXFxcXCJdLFxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiXFxcXFxcXCJ2YWx1ZVxcXFxcXFwiOltcXFxcXFxcIjB4MDFcXFxcXFxcIixcXFxcXFxcIjB4MDFcXFxcXFxcIixcXFxcXFxcIjB4MDFcXFxcXFxcIixcXFxcXFxcIjB4MDFcXFxcXFxcIl19XVxcXCIsXFxuK1xcdFxcdFxcdCAgICAgXFxcIm9yZGluYXJ5X2RlZmF1bHRcXFwiKTtcXG4rXFxuK1xcdC8qIENvbXBhcmUgdGhlIGNvbXBsZXRlIEpTT04gZG9jdW1lbnQ6IGEgZmxhdCBhcnJheSB3aXRoIHRoZSByb290IGZpcnN0LFxcbitcXHQgKiBvbmUgY29weSBvZiB0aGUgc2hhcmVkIGlubmVyIG1hcCwgYW5kIHVuY2hhbmdlZCBlbnRyeSByZXByZXNlbnRhdGlvbnMuXFxuK1xcdCAqL1xcbitcXHRpZiAoZW50cmllcylcXG4rXFx0XFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCIlc1xcXFxcXFwiLFxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiZHVtcF9vdXRlclxcXFxcXFwiLFxcXCJcXG4rXFx0XFx0XFx0IFxcXCJcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6JXN9LHtcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCJoYXNoXFxcXFxcXCIsXFxcIlxcbitcXHRcXHRcXHQgXFxcIlxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiZHVtcF9pbm5lclxcXFxcXFwiLFxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc31dXFxcIixcXG4rXFx0XFx0XFx0IHJvb3RfaWQsIHR5cGVfbmFtZSwgb3V0ZXIsIGlubmVyX2lkLCBpbm5lcik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCIlc1xcXFxcXFwiLFxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiZHVtcF9vdXRlclxcXFxcXFwiLFxcXCJcXG4rXFx0XFx0XFx0IFxcXCJcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6W119XVxcXCIsIHJvb3RfaWQsIHR5cGVfbmFtZSk7XFxuK1xcdGlmIChkdW1wX21hcChyb290X2lkLCBcXFwiLWogLXJcXFwiLCBvdXRwdXQpKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXFxcInJlY3Vyc2l2ZV9qc29uXFxcIik7XFxuK1xcdGlmIChkdW1wX21hcChyb290X2lkLCBcXFwiLS1qc29uIC0tcmVjdXJzaXZlXFxcIiwgb3V0cHV0KSlcXG4rXFx0XFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFxcXCJyZWN1cnNpdmVfbG9uZ19vcHRpb25zXFxcIik7XFxuK1xcdGNoZWNrX3BsYWluKHJvb3RfaWQsIGlubmVyX2lkLCB0eXBlX25hbWUsIGVudHJpZXMsIHR5cGVkKTtcXG4rXFxuK1xcdC8qIFJlY3Vyc2lvbiBvbiBhbiBvcmRpbmFyeSBtYXAgc3RpbGwgZW1pdHMgYSBzaW5nbGUgbWFwIG9iamVjdC4gKi9cXG4rXFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCJoYXNoXFxcXFxcXCIsXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX2lubmVyXFxcXFxcXCIsXFxcIlxcbitcXHRcXHQgXFxcIlxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc31dXFxcIiwgaW5uZXJfaWQsIGlubmVyKTtcXG4rXFx0aWYgKGR1bXBfbWFwKGlubmVyX2lkLCBcXFwiLWogLXJcXFwiLCBvdXRwdXQpKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXFxcIm9yZGluYXJ5X3JlY3Vyc2l2ZVxcXCIpO1xcbitvdXQ6XFxuK1xcdGlmIChvdXRlcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShvdXRlcl9mZCk7XFxuK1xcdGlmIChpbm5lcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShpbm5lcl9mZCk7XFxuK1xcdGJ0Zl9fZnJlZShidGYpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X211bHRpcGxlX3Jvb3RzKHZvaWQpXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XFxuK1xcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgbmFtZVtCUEZfT0JKX05BTUVfTEVOXTtcXG4rXFx0Y2hhciBvdXRwdXRbT1VUUFVUX1NJWkVdID0ge30sIGV4cGVjdGVkW09VVFBVVF9TSVpFICogNF0sIGVsZW1lbnRzW09VVFBVVF9TSVpFXTtcXG4rXFx0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlc1tdID0geyBcXFwiaGFzaFxcXCIsIFxcXCJhcnJheV9vZl9tYXBzXFxcIiwgXFxcImhhc2hfb2ZfbWFwc1xcXCIsIFxcXCJoYXNoXFxcIiB9O1xcbitcXHRpbnQgZmRzW10gPSB7IC0xLCAtMSwgLTEsIC0xIH07XFxuK1xcdF9fdTMyIGlkc1s0XSwga2V5O1xcbitcXHRpbnQgaSwgbGVuID0gMDtcXG4rXFxuK1xcdC8qIFNlbGVjdCB0aGUgZmlyc3QgaW5uZXIgbWFwIGFuZCBib3RoIG91dGVycyBhcyByb290cy4gVGhlIG90aGVyIGlubmVyXFxuK1xcdCAqIG1hcCBtdXN0IGJlIGFwcGVuZGVkIGFmdGVyIGFsbCB0aHJlZSByb290cywgZXZlbiB0aG91Z2ggaXQgaXMgZm91bmRcXG4rXFx0ICogd2hpbGUgZHVtcGluZyB0aGUgZmlyc3Qgb3V0ZXIuIEEgcHJvY2Vzcy1zcGVjaWZpYyBuYW1lIGF2b2lkcyBvdGhlclxcbitcXHQgKiB0ZXN0cycgbWFwcyBqb2luaW5nIHRoZSBzZWxlY3Rpb24uXFxuK1xcdCAqL1xcbitcXHRzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksIFxcXCJkdW1wXyV1XFxcIiwgZ2V0cGlkKCkpO1xcbitcXHRmZHNbMF0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgbmFtZSwgNCwgNCwgMSwgTlVMTCk7XFxuK1xcdGlmICghQVNTRVJUX09LX0ZEKGZkc1swXSwgXFxcImNyZWF0ZV9zZWxlY3RlZF9pbm5lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZmRzWzNdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFxcXCJkdW1wX2Rpc2NvdmVyZWRcXFwiLCA0LCA0LCAxLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzNdLCBcXFwiY3JlYXRlX2Rpc2NvdmVyZWRfaW5uZXJcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdG9wdHMuaW5uZXJfbWFwX2ZkID0gZmRzWzBdO1xcbitcXHRmZHNbMV0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMV0sIFxcXCJjcmVhdGVfYXJyYXlfcm9vdFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZmRzWzJdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMl0sIFxcXCJjcmVhdGVfaGFzaF9yb290XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRmb3IgKGkgPSAxOyBpIFxcdTAwM2M9IDI7IGkrKykge1xcbitcXHRcXHRrZXkgPSAwO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXFx1MDAyNmtleSwgXFx1MDAyNmZkc1swXSwgQlBGX0FOWSksXFxuK1xcdFxcdFxcdCAgICAgICBcXFwicmVmZXJlbmNlX3NlbGVjdGVkX2lubmVyXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRrZXkgPSAxO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXFx1MDAyNmtleSwgXFx1MDAyNmZkc1szXSwgQlBGX0FOWSksXFxuK1xcdFxcdFxcdCAgICAgICBcXFwicmVmZXJlbmNlX2Rpc2NvdmVyZWRfaW5uZXJcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEFSUkFZX1NJWkUoZmRzKTsgaSsrKSB7XFxuK1xcdFxcdGlkc1tpXSA9IG1hcF9pZChmZHNbaV0pO1xcbitcXHRcXHRpZiAoIWlkc1tpXSB8fCAhZHVtcF9tYXAoaWRzW2ldLCBcXFwiLWpcXFwiLCBlbGVtZW50cykpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRsZW4gKz0gc25wcmludGYoZXhwZWN0ZWQgKyBsZW4sIHNpemVvZihleHBlY3RlZCkgLSBsZW4sXFxuK1xcdFxcdFxcdFxcdFxcXCIlc3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCIlc1xcXFxcXFwiLFxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiJXNcXFxcXFxcIixcXFwiXFxuK1xcdFxcdFxcdFxcdFxcXCJcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6JXN9JXNcXFwiLFxcbitcXHRcXHRcXHRcXHRpID8gXFxcIixcXFwiIDogXFxcIltcXFwiLCBpZHNbaV0sIHR5cGVzW2ldLFxcbitcXHRcXHRcXHRcXHRpID09IDMgPyBcXFwiZHVtcF9kaXNjb3ZlcmVkXFxcIiA6IG5hbWUsIGVsZW1lbnRzLCBpID09IDMgPyBcXFwiXVxcXCIgOiBcXFwiXFxcIik7XFxuK1xcdH1cXG4rXFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwiLWogLXIgbWFwIGR1bXAgbmFtZSAlc1xcXCIsIG5hbWUpO1xcbitcXHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcXG4rXFx0XFx0ICAgICAgXFxcImR1bXBfbXVsdGlwbGVfcm9vdHNcXFwiKSkge1xcbitcXHRcXHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFxcXCJcXFxcblxcXCIpXSA9ICdcXFxcMCc7XFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcXFwicm9vdHNfZmlyc3RfYW5kX3NlZWRfZGVkdXBcXFwiKTtcXG4rXFx0fVxcbitvdXQ6XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBBUlJBWV9TSVpFKGZkcyk7IGkrKylcXG4rXFx0XFx0aWYgKGZkc1tpXSBcXHUwMDNlPSAwKVxcbitcXHRcXHRcXHRjbG9zZShmZHNbaV0pO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X3VucmVhZGFibGUoYm9vbCBvdXRlcilcXG4re1xcbitcXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcXG4rXFx0Y2hhciBlbGVtZW50c1tPVVRQVVRfU0laRV0sIG91dHB1dFtPVVRQVVRfU0laRV0sIHJvb3RbT1VUUFVUX1NJWkVdO1xcbitcXHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHBsYWluW09VVFBVVF9TSVpFXSA9IHt9O1xcbitcXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07XFxuK1xcdGludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xLCBsb29rdXBfZXJybm87XFxuK1xcdF9fdTMyIGlubmVyX2lkLCByb290X2lkLCBrZXkgPSAwLCB2YWx1ZTtcXG4rXFxuK1xcdC8qIEV2ZXJ5IGtleSBpcyBlbnVtZXJhYmxlLCBidXQgUEVSRl9FVkVOVF9BUlJBWSBsb29rdXAgcmV0dXJuc1xcbitcXHQgKiBFTk9UU1VQUCAodGhlIGtlcm5lbC1pbnRlcm5hbCBlcnJubykuIENoZWNrIGJvdGggZW50cmllcyBzbyBhblxcbitcXHQgKiBlYXJseSBleGl0IG9uIHRoZSBmaXJzdCBsb29rdXAgZmFpbHVyZSBjYW5ub3QgcGFzcy5cXG4rXFx0ICovXFxuK1xcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVksIFxcXCJkdW1wX3VucmVhZGFibGVcXFwiLFxcbitcXHRcXHRcXHRcXHQgIHNpemVvZihrZXkpLCBzaXplb2YodmFsdWUpLCAyLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFxcXCJjcmVhdGVfdW5yZWFkYWJsZVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFBU1NFUlRfTFQoYnBmX21hcF9sb29rdXBfZWxlbShpbm5lcl9mZCwgXFx1MDAyNmtleSwgXFx1MDAyNnZhbHVlKSwgMCxcXG4rXFx0XFx0ICAgICAgIFxcXCJ1bnJlYWRhYmxlX2xvb2t1cFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0bG9va3VwX2Vycm5vID0gZXJybm87XFxuK1xcdGlmICghQVNTRVJUX05FUShsb29rdXBfZXJybm8sIEVOT0VOVCwgXFxcInVucmVhZGFibGVfbm90X21pc3NpbmdcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlubmVyX2lkID0gbWFwX2lkKGlubmVyX2ZkKTtcXG4rXFx0aWYgKCFpbm5lcl9pZCB8fCAhZHVtcF9tYXAoaW5uZXJfaWQsIFxcXCItalxcXCIsIGVsZW1lbnRzKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdEFTU0VSVF9FUShjb3VudF90b2tlbihlbGVtZW50cywgXFxcIlxcXFxcXFwiZXJyb3JcXFxcXFxcIjpcXFwiKSwgMiwgXFxcImRlZmF1bHRfanNvbl9lcnJvcnNcXFwiKTtcXG4rXFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwibWFwIGR1bXAgaWQgJXVcXFwiLCBpbm5lcl9pZCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIHBsYWluLCBzaXplb2YocGxhaW4pIC0gMSksXFxuK1xcdFxcdCAgICAgICBcXFwiZGVmYXVsdF9wbGFpbl91bnJlYWRhYmxlXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ocGxhaW4sIHN0cmVycm9yKGxvb2t1cF9lcnJubykpLCAyLCBcXFwiZGVmYXVsdF9wbGFpbl9lcnJvcnNcXFwiKTtcXG4rXFx0QVNTRVJUX0hBU19TVUJTVFIocGxhaW4sIFxcXCJGb3VuZCAwIGVsZW1lbnRzXFxcIiwgXFxcImRlZmF1bHRfcGxhaW5fY291bnRcXFwiKTtcXG4rXFxuK1xcdHJvb3RfaWQgPSBpbm5lcl9pZDtcXG4rXFx0aWYgKG91dGVyKSB7XFxuK1xcdFxcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XFxuK1xcdFxcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIFxcXCJkdW1wX291dGVyXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0IHNpemVvZihrZXkpLCBzaXplb2YodmFsdWUpLCAxLCBcXHUwMDI2b3B0cyk7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcXFwiY3JlYXRlX291dGVyXFxcIikgfHxcXG4rXFx0XFx0ICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgXFx1MDAyNmtleSwgXFx1MDAyNmlubmVyX2ZkLCBCUEZfQU5ZKSxcXG4rXFx0XFx0XFx0ICAgICAgIFxcXCJwb3B1bGF0ZV9vdXRlclxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0cm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7XFxuK1xcdFxcdGlmICghcm9vdF9pZCB8fCAhZHVtcF9tYXAocm9vdF9pZCwgXFxcIi1qXFxcIiwgcm9vdCkpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcXG4rXFx0XFx0XFx0IFxcXCJbe1xcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFxcXFxcInR5cGVcXFxcXFxcIjpcXFxcXFxcImFycmF5X29mX21hcHNcXFxcXFxcIixcXFxcXFxcIm5hbWVcXFxcXFxcIjpcXFxcXFxcImR1bXBfb3V0ZXJcXFxcXFxcIixcXFwiXFxuK1xcdFxcdFxcdCBcXFwiXFxcXFxcXCJmbGFnc1xcXFxcXFwiOjAsXFxcXFxcXCJlbGVtZW50c1xcXFxcXFwiOiVzfSx7XFxcXFxcXCJpZFxcXFxcXFwiOiV1LFxcXCJcXG4rXFx0XFx0XFx0IFxcXCJcXFxcXFxcInR5cGVcXFxcXFxcIjpcXFxcXFxcInBlcmZfZXZlbnRfYXJyYXlcXFxcXFxcIixcXFxcXFxcIm5hbWVcXFxcXFxcIjpcXFxcXFxcImR1bXBfdW5yZWFkYWJsZVxcXFxcXFwiLFxcXCJcXG4rXFx0XFx0XFx0IFxcXCJcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6JXN9XVxcXCIsIHJvb3RfaWQsIHJvb3QsIGlubmVyX2lkLCBlbGVtZW50cyk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxcbitcXHRcXHRcXHQgXFxcIlt7XFxcXFxcXCJpZFxcXFxcXFwiOiV1LFxcXFxcXFwidHlwZVxcXFxcXFwiOlxcXFxcXFwicGVyZl9ldmVudF9hcnJheVxcXFxcXFwiLFxcXCJcXG4rXFx0XFx0XFx0IFxcXCJcXFxcXFxcIm5hbWVcXFxcXFxcIjpcXFxcXFxcImR1bXBfdW5yZWFkYWJsZVxcXFxcXFwiLFxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc31dXFxcIixcXG4rXFx0XFx0XFx0IGlubmVyX2lkLCBlbGVtZW50cyk7XFxuK1xcdH1cXG4rXFx0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFxcXCItaiAtclxcXCIsIG91dHB1dCkpXFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcXFwicmVjdXJzaXZlX3VucmVhZGFibGVfanNvblxcXCIpO1xcbitcXHRtZW1zZXQob3V0cHV0LCAwLCBzaXplb2Yob3V0cHV0KSk7XFxuK1xcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXFxcIi1yIG1hcCBkdW1wIGlkICV1XFxcIiwgcm9vdF9pZCk7XFxuK1xcdGlmIChBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxcbitcXHRcXHQgICAgICBcXFwicmVjdXJzaXZlX3VucmVhZGFibGVfcGxhaW5cXFwiKSkge1xcbitcXHRcXHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIHBsYWluLCBcXFwicmVjdXJzaXZlX3BsYWluX3ByZXNlcnZlc19lcnJvcnNcXFwiKTtcXG4rXFx0XFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgc3RyZXJyb3IobG9va3VwX2Vycm5vKSksIDIsXFxuK1xcdFxcdFxcdCAgXFxcInJlY3Vyc2l2ZV9wbGFpbl9lcnJvcnNcXFwiKTtcXG4rXFx0XFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgXFxcIkZvdW5kIFxcXCIpLCBvdXRlciA/IDIgOiAxLFxcbitcXHRcXHRcXHQgIFxcXCJyZWN1cnNpdmVfcGxhaW5fbWFwc1xcXCIpO1xcbitcXHR9XFxuK291dDpcXG4rXFx0aWYgKG91dGVyX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKG91dGVyX2ZkKTtcXG4rXFx0aWYgKGlubmVyX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKGlubmVyX2ZkKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9tYW55X2lubmVyX21hcHMoYm9vbCBqc29uKVxcbit7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xcbitcXHRjb25zdCBzdHJ1Y3QgcmxpbWl0IGxpbWl0ID0geyAucmxpbV9jdXIgPSAzMiwgLnJsaW1fbWF4ID0gMzIgfTtcXG4rXFx0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCB0b2tlbls2NF07XFxuK1xcdF9fdTMyIGlkc1s2NF0sIHJvb3RfaWQsIGtleTtcXG4rXFx0aW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTEsIHN0YXR1cztcXG4rXFx0Y2hhciAqb3V0cHV0ID0gTlVMTDtcXG4rXFx0cGlkX3QgcGlkO1xcbitcXG4rXFx0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXFxcImR1bXBfaW5uZXJcXFwiLCA0LCA0LCAxLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFxcXCJjcmVhdGVfdGVtcGxhdGVcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XFxuK1xcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIFxcXCJkdW1wX291dGVyXFxcIiwgNCwgNCxcXG4rXFx0XFx0XFx0XFx0IEFSUkFZX1NJWkUoaWRzKSwgXFx1MDAyNm9wdHMpO1xcbitcXHRjbG9zZShpbm5lcl9mZCk7XFxuK1xcdGlubmVyX2ZkID0gLTE7XFxuK1xcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcXFwiY3JlYXRlX291dGVyXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRmb3IgKGtleSA9IDA7IGtleSBcXHUwMDNjIEFSUkFZX1NJWkUoaWRzKTsga2V5KyspIHtcXG4rXFx0XFx0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXFxcImR1bXBfaW5uZXJcXFwiLCA0LCA0LCAxLCBOVUxMKTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFxcXCJjcmVhdGVfaW5uZXJcXFwiKSB8fFxcbitcXHRcXHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCBcXHUwMDI2a2V5LCBcXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxcbitcXHRcXHRcXHQgICAgICAgXFxcInBvcHVsYXRlX291dGVyXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRpZHNba2V5XSA9IG1hcF9pZChpbm5lcl9mZCk7XFxuK1xcdFxcdGlmICghaWRzW2tleV0pXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHQvKiBUaGUgb3V0ZXIgbWFwIGtlZXBzIGVhY2ggZGlzdGluY3QgaW5uZXIgbWFwIGFsaXZlLiAqL1xcbitcXHRcXHRjbG9zZShpbm5lcl9mZCk7XFxuK1xcdFxcdGlubmVyX2ZkID0gLTE7XFxuK1xcdH1cXG4rXFx0cm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7XFxuK1xcdG91dHB1dCA9IGNhbGxvYygxLCA2NTUzNik7XFxuK1xcdGlmICghcm9vdF9pZCB8fCAhQVNTRVJUX09LX1BUUihvdXRwdXQsIFxcXCJhbGxvY2F0ZV9vdXRwdXRcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHQvKiBDcmVhdGUgYWxsIGZpeHR1cmVzIGJlZm9yZSBsb3dlcmluZyB0aGUgbGltaXQsIGFuZCBrZWVwIHRoZSB0ZXN0XFxuK1xcdCAqIHJ1bm5lcidzIGxpbWl0IHVuY2hhbmdlZC4gUmV0YWluaW5nIGV2ZXJ5IGRpc2NvdmVyZWQgRkQgd291bGQgZXhjZWVkXFxuK1xcdCAqIHRoaXMgbGltaXQgYmVmb3JlIHRoZSByZWN1cnNpdmUgZHVtcCBjb3VsZCB2aXNpdCBhbGwgaW5uZXIgbWFwcy5cXG4rXFx0ICovXFxuK1xcdHBpZCA9IGZvcmsoKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UocGlkLCAwLCBcXFwiZm9ya1xcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFwaWQpIHtcXG4rXFx0XFx0Y2xvc2Uob3V0ZXJfZmQpO1xcbitcXHRcXHRpZiAoc2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUsIFxcdTAwMjZsaW1pdCkpXFxuK1xcdFxcdFxcdF9leGl0KDEpO1xcbitcXHRcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCIlcyAtciBtYXAgZHVtcCBpZCAldVxcXCIsXFxuK1xcdFxcdFxcdCBqc29uID8gXFxcIi1qXFxcIiA6IFxcXCJcXFwiLCByb290X2lkKTtcXG4rXFx0XFx0aWYgKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgNjU1MzUpKVxcbitcXHRcXHRcXHRfZXhpdCgyKTtcXG4rXFx0XFx0aWYgKGNvdW50X3Rva2VuKG91dHB1dCwganNvbiA/IFxcXCJcXFxcXFxcImlkXFxcXFxcXCI6XFxcIiA6IFxcXCJGb3VuZCBcXFwiKSAhPSBBUlJBWV9TSVpFKGlkcykgKyAxIHx8XFxuK1xcdFxcdCAgICBjb3VudF90b2tlbihvdXRwdXQsIGpzb24gPyBcXFwiXFxcXFxcXCJpbm5lcl9tYXBfaWRcXFxcXFxcIjpcXFwiIDogXFxcImlubmVyX21hcF9pZDpcXFwiKSAhPVxcbitcXHRcXHQgICAgQVJSQVlfU0laRShpZHMpKVxcbitcXHRcXHRcXHRfZXhpdCgzKTtcXG4rXFx0XFx0Zm9yIChrZXkgPSAwOyBrZXkgXFx1MDAzYyBBUlJBWV9TSVpFKGlkcyk7IGtleSsrKSB7XFxuK1xcdFxcdFxcdGlmIChqc29uKVxcbitcXHRcXHRcXHRcXHRzbnByaW50Zih0b2tlbiwgc2l6ZW9mKHRva2VuKSwgXFxcIlxcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFwiLCBpZHNba2V5XSk7XFxuK1xcdFxcdFxcdGVsc2VcXG4rXFx0XFx0XFx0XFx0c25wcmludGYodG9rZW4sIHNpemVvZih0b2tlbiksIFxcXCJcXFxcbiV1OiBoYXNoICBuYW1lIGR1bXBfaW5uZXIgIFxcXCIsXFxuK1xcdFxcdFxcdFxcdFxcdCBpZHNba2V5XSk7XFxuK1xcdFxcdFxcdGlmIChjb3VudF90b2tlbihvdXRwdXQsIHRva2VuKSAhPSAxKVxcbitcXHRcXHRcXHRcXHRfZXhpdCg0KTtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAoanNvbiBcXHUwMDI2XFx1MDAyNiAob3V0cHV0WzBdICE9ICdbJyB8fFxcbitcXHRcXHRcXHQgICAgIHN0cmNtcChvdXRwdXQgKyBzdHJsZW4ob3V0cHV0KSAtIDIsIFxcXCJdXFxcXG5cXFwiKSkpXFxuK1xcdFxcdFxcdF9leGl0KDUpO1xcbitcXHRcXHRfZXhpdCgwKTtcXG4rXFx0fVxcbitcXHRpZiAoQVNTRVJUX0VRKHdhaXRwaWQocGlkLCBcXHUwMDI2c3RhdHVzLCAwKSwgcGlkLCBcXFwid2FpdHBpZFxcXCIpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXFxcImNoaWxkX2V4aXRlZFxcXCIpKVxcbitcXHRcXHRBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSwgMCwgXFxcImR1bXBfd2l0aF9sb3dfZmRfbGltaXRcXFwiKTtcXG4rb3V0OlxcbitcXHRmcmVlKG91dHB1dCk7XFxuK1xcdGlmIChvdXRlcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShvdXRlcl9mZCk7XFxuK1xcdGlmIChpbm5lcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShpbm5lcl9mZCk7XFxuK31cXG4rXFxuK3ZvaWQgdGVzdF9icGZ0b29sX21hcF9kdW1wKHZvaWQpXFxuK3tcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInVucmVhZGFibGVfb3JkaW5hcnlcXFwiKSlcXG4rXFx0XFx0dGVzdF91bnJlYWRhYmxlKGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInVucmVhZGFibGVfaW5uZXJcXFwiKSlcXG4rXFx0XFx0dGVzdF91bnJlYWRhYmxlKHRydWUpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwibWFueV9pbm5lcl9tYXBzX2pzb25cXFwiKSlcXG4rXFx0XFx0dGVzdF9tYW55X2lubmVyX21hcHModHJ1ZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJtYW55X2lubmVyX21hcHNfcGxhaW5cXFwiKSlcXG4rXFx0XFx0dGVzdF9tYW55X2lubmVyX21hcHMoZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwibXVsdGlwbGVfcm9vdHNcXFwiKSlcXG4rXFx0XFx0dGVzdF9tdWx0aXBsZV9yb290cygpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiYXJyYXlfb2ZfbWFwc1xcXCIpKVxcbitcXHRcXHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiaGFzaF9vZl9tYXBzXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInNoYXJlZF9pbm5lclxcXCIpKVxcbitcXHRcXHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAyLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiZW1wdHlfYXJyYXlfb2ZfbWFwc1xcXCIpKVxcbitcXHRcXHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiZW1wdHlfaGFzaF9vZl9tYXBzXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMCwgZmFsc2UsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImJ0Zl9pbm5lclxcXCIpKVxcbitcXHRcXHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIGZhbHNlLCB0cnVlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImVtcHR5X2lubmVyXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgdHJ1ZSwgZmFsc2UpO1xcbit9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDAxOjIzOjU5LjkzMTE0MDI5OFoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6NDQxMjg0MDk1NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xzIGFuZCBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbCBjb2RlIG9yIGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNDIyZmE1Nzg2ZjVjMTJiYTE1MjNkYmQ4ZTUwZTdmYzlkMjViZmVlZFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDcgMDE6MjM6NTggMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdCBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG5pbmRleCA1ZGFmM2RlNWM3NDQ2Li4zOGQxZjU0MmJmNWE1IDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG5AQCAtMTYsNyArMTYsNyBAQCBTWU5PUFNJU1xuIFxuICoqYnBmdG9vbCoqIFsqT1BUSU9OUypdICoqbWFwKiogKkNPTU1BTkQqXG4gXG4tKk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8IHsgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IH1cbisqT1BUSU9OUyogOj0geyB8Q09NTU9OX09QVElPTlN8IHwgeyAqKi1mKiogfCAqKi0tYnBmZnMqKiB9IHwgeyAqKi1uKiogfCAqKi0tbm9tb3VudCoqIH0gfCB7ICoqLXIqKiB8ICoqLS1yZWN1cnNpdmUqKiB9IH1cbiBcbiAqQ09NTUFORFMqIDo9XG4geyAqKnNob3cqKiB8ICoqbGlzdCoqIHwgKipjcmVhdGUqKiB8ICoqZHVtcCoqIHwgKip1cGRhdGUqKiB8ICoqbG9va3VwKiogfCAqKmdldG5leHQqKiB8XG5AQCAtMTcwLDYgKzE3MCwyNSBAQCBPUFRJT05TXG4gICAgIERvIG5vdCBhdXRvbWF0aWNhbGx5IGF0dGVtcHQgdG8gbW91bnQgYW55IHZpcnR1YWwgZmlsZSBzeXN0ZW0gKHN1Y2ggYXNcbiAgICAgdHJhY2VmcyBvciBCUEYgdmlydHVhbCBmaWxlIHN5c3RlbSkgd2hlbiBuZWNlc3NhcnkuXG4gXG4rLXIsIC0tcmVjdXJzaXZlXG4rICAgIEFsc28gZHVtcCB0aGUgaW5uZXIgbWFwcyByZWZlcmVuY2VkIGJ5ICoqYXJyYXlfb2ZfbWFwcyoqIGFuZCAqKmhhc2hfb2ZfbWFwcyoqXG4rICAgIGVudHJpZXMgd2hlbiBydW5uaW5nICoqbWFwIGR1bXAqKi4gRWFjaCBtYXAgSUQgaXMgdmlzaXRlZCBvbmNlLCBldmVuIGlmXG4rICAgIHNldmVyYWwgZW50cmllcyByZWZlciB0byBpdC4gU2VsZWN0ZWQgbWFwcyBhcmUgZm9sbG93ZWQgYnkgdGhlaXIgaW5uZXIgbWFwcy5cbitcbisgICAgUGxhaW4gb3V0cHV0IGluY2x1ZGVzIGEgaGVhZGVyIGlkZW50aWZ5aW5nIGVhY2ggbWFwLiBPbiBzdWNjZXNzLCBKU09OIG91dHB1dFxuKyAgICBpcyBhbHdheXMgYW4gYXJyYXkgb2YgbWFwIG9iamVjdHMsIGVhY2ggY29udGFpbmluZyBhbiAqKmlkKiogYW5kIGFuXG4rICAgICoqZWxlbWVudHMqKiBhcnJheSwgaW5jbHVkaW5nIHdoZW4gb25seSBvbmUgbWFwIGlzIGR1bXBlZC4gT3V0ZXIgbWFwIGVudHJpZXNcbisgICAgcmV0YWluIHRoZWlyICoqaW5uZXJfbWFwX2lkKiogZmllbGQsIHdoaWNoIGlkZW50aWZpZXMgdGhlIGNvcnJlc3BvbmRpbmcgaW5uZXJcbisgICAgbWFwIG9iamVjdC5cbitcbisgICAgSW5uZXIgbWFwIElEcyBhcmUgcmVzb2x2ZWQgd2hlbiB0aGUgbWFwcyBhcmUgdmlzaXRlZC4gVGhlIGR1bXAgaXMgbm90IGFuXG4rICAgIGF0b21pYyBzbmFwc2hvdDogY29uY3VycmVudCB1cGRhdGVzIGNhbiBjaGFuZ2UgbWFwIGNvbnRlbnRzIG9yIHJlbW92ZSBhXG4rICAgIHJlZmVyZW5jZWQgaW5uZXIgbWFwIGJlZm9yZSBpdCBpcyB2aXNpdGVkLiBGYWlsdXJlIHRvIG9wZW4gYSByZWZlcmVuY2VkXG4rICAgIGlubmVyIG1hcCBzdG9wcyB0aGUgZHVtcCBhbmQgcmV0dXJucyBhIG5vbnplcm8gZXhpdCBzdGF0dXMuIE91dHB1dCBtYXlcbisgICAgY29udGFpbiBtYXBzIG9yIGVudHJpZXMgcHJpbnRlZCBiZWZvcmUgdGhlIGVycm9yLlxuKyAgICBJbiBKU09OIG1vZGUsIGFuIGVycm9yIGR1cmluZyB0cmF2ZXJzYWwgaXMgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBhbmQgdGhlXG4rICAgIGVuY2xvc2luZyBhcnJheXMgYW5kIG9iamVjdHMgYXJlIGNsb3NlZC5cbitcbiBFWEFNUExFU1xuID09PT09PT09XG4gKiojIGJwZnRvb2wgbWFwIHNob3cqKlxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbmluZGV4IDc1Y2JjYjUxMmViYWUuLjQ1YzMzNmQ2M2JlMGEgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbkBAIC0yNjEsNyArMjYxLDcgQEAgX2JwZnRvb2woKVxuIFxuICAgICAjIERlYWwgd2l0aCBvcHRpb25zXG4gICAgIGlmIFtbICR7d29yZHNbY3dvcmRdfSA9PSAtKiBdXTsgdGhlblxuLSAgICAgICAgbG9jYWwgYz0nLS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcbisgICAgICAgIGxvY2FsIGM9Jy0tdmVyc2lvbiAtLWpzb24gLS1wcmV0dHkgLS1yZWN1cnNpdmUgLS1icGZmcyAtLW1hcGNvbXBhdCAtLWRlYnVnIFxcXG4gICAgICAgICAgICAgLS11c2UtbG9hZGVyIC0tYmFzZS1idGYgLS1zaWduIC1pIC1rJ1xuICAgICAgICAgQ09NUFJFUExZPSggJCggY29tcGdlbiAtVyBcIiRjXCIgLS0gXCIkY3VyXCIgKSApXG4gICAgICAgICByZXR1cm4gMFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uY1xuaW5kZXggYzkxZTFhNmUxYTFlYy4uMjkwMjFmNGRkNDUxOCAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uY1xuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jXG5AQCAtMjYsNiArMjYsNyBAQCBzdGF0aWMgaW50ICgqbGFzdF9kb19oZWxwKShpbnQgYXJnYywgY2hhciAqKmFyZ3YpO1xuIGpzb25fd3JpdGVyX3QgKmpzb25fd3RyO1xuIGJvb2wgcHJldHR5X291dHB1dDtcbiBib29sIGpzb25fb3V0cHV0O1xuK2Jvb2wgcmVjdXJzaXZlO1xuIGJvb2wgc2hvd19waW5uZWQ7XG4gYm9vbCBibG9ja19tb3VudDtcbiBib29sIHZlcmlmaWVyX2xvZ3M7XG5AQCAtNDUyLDYgKzQ1Myw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0eyBcImpzb25cIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdqJyB9LFxuIFx0XHR7IFwiaGVscFwiLFx0bm9fYXJndW1lbnQsXHROVUxMLFx0J2gnIH0sXG4gXHRcdHsgXCJwcmV0dHlcIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdwJyB9LFxuK1x0XHR7IFwicmVjdXJzaXZlXCIsXHRub19hcmd1bWVudCxcdE5VTEwsXHQncicgfSxcbiBcdFx0eyBcInZlcnNpb25cIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdWJyB9LFxuIFx0XHR7IFwiYnBmZnNcIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdmJyB9LFxuIFx0XHR7IFwibWFwY29tcGF0XCIsXHRub19hcmd1bWVudCxcdE5VTEwsXHQnbScgfSxcbkBAIC00ODUsNyArNDg3LDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0YmluX25hbWUgPSBcImJwZnRvb2xcIjtcbiBcbiBcdG9wdGVyciA9IDA7XG4tXHR3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsIFwiVmhwamZMbW5kU2k6azpCOmxcIixcbitcdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXCJWaHBqcmZMbW5kU2k6azpCOmxcIixcbiBcdFx0XHRcdCAgb3B0aW9ucywgTlVMTCkpIFx1MDAzZT0gMCkge1xuIFx0XHRzd2l0Y2ggKG9wdCkge1xuIFx0XHRjYXNlICdWJzpcbkBAIC01MDcsNiArNTA5LDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRcdH1cbiBcdFx0XHRqc29ud19wcmV0dHkoanNvbl93dHIsIHByZXR0eV9vdXRwdXQpO1xuIFx0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICdyJzpcbitcdFx0XHRyZWN1cnNpdmUgPSB0cnVlO1xuK1x0XHRcdGJyZWFrO1xuIFx0XHRjYXNlICdmJzpcbiBcdFx0XHRzaG93X3Bpbm5lZCA9IHRydWU7XG4gXHRcdFx0YnJlYWs7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oXG5pbmRleCA3OGI2ZTBlYmI4NWQ4Li5iNWRjNzk2MGNmNjgyIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbkBAIC04Myw2ICs4Myw3IEBAIGV4dGVybiBjb25zdCBjaGFyICpiaW5fbmFtZTtcbiBcbiBleHRlcm4ganNvbl93cml0ZXJfdCAqanNvbl93dHI7XG4gZXh0ZXJuIGJvb2wganNvbl9vdXRwdXQ7XG4rZXh0ZXJuIGJvb2wgcmVjdXJzaXZlO1xuIGV4dGVybiBib29sIHNob3dfcGlubmVkO1xuIGV4dGVybiBib29sIHNob3dfcGlkcztcbiBleHRlcm4gYm9vbCBibG9ja19tb3VudDtcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXAuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG5pbmRleCA2ODRhOGZiNzI0MTQ2Li5mYzA2Yzc2NTk3MzE1IDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG5AQCAtMTcsNiArMTcsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2JwZi9icGYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2JwZi9oYXNobWFwLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvbGliYnBmX2ludGVybmFsLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcImpzb25fd3JpdGVyLmhcIlxuICNpbmNsdWRlIFwibWFpbi5oXCJcbkBAIC04MjYsMTIgKzgyNyw0NCBAQCBzdGF0aWMgdm9pZCBmcmVlX21hcF9rdl9idGYoc3RydWN0IGJ0ZiAqYnRmKVxuIFx0XHRidGZfX2ZyZWUoYnRmKTtcbiB9XG4gXG4rc3RydWN0IG1hcF9kdW1wX2N0eCB7XG4rXHRzdHJ1Y3QgaGFzaG1hcCAqc2VlbjtcbitcdF9fdTMyICpwZW5kaW5nX2lkcztcbitcdHNpemVfdCBwZW5kaW5nX2NudDtcbit9O1xuK1xuK3N0YXRpYyBpbnQgY29sbGVjdF9pbm5lcl9tYXAoc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4LCBfX3UzMiBpZClcbit7XG4rXHRfX3UzMiAqaWRzO1xuK1x0aW50IGVycjtcbitcbitcdGlmIChoYXNobWFwX19maW5kKGN0eC1cdTAwM2VzZWVuLCBpZCwgTlVMTCkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0aWRzID0gbGliYnBmX3JlYWxsb2NhcnJheShjdHgtXHUwMDNlcGVuZGluZ19pZHMsIGN0eC1cdTAwM2VwZW5kaW5nX2NudCArIDEsXG4rXHRcdFx0XHQgc2l6ZW9mKCppZHMpKTtcbitcdGlmICghaWRzKSB7XG4rXHRcdHBfZXJyKFwibWVtIGFsbG9jIGZhaWxlZFwiKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1x0Y3R4LVx1MDAzZXBlbmRpbmdfaWRzID0gaWRzO1xuK1xuK1x0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC1cdTAwM2VzZWVuLCBpZCwgMCk7XG4rXHRpZiAoZXJyKSB7XG4rXHRcdHBfZXJyKFwiZmFpbGVkIHRvIHJlY29yZCBpbm5lciBtYXAgaWQgJXU6ICVzXCIsIGlkLCBzdHJlcnJvcigtZXJyKSk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbitcdGlkc1tjdHgtXHUwMDNlcGVuZGluZ19jbnQrK10gPSBpZDtcbitcdHJldHVybiAwO1xuK31cbitcbiBzdGF0aWMgaW50XG4gbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4tXHQgYm9vbCBzaG93X2hlYWRlcilcbitcdCBib29sIHNob3dfaGVhZGVyLCBzdHJ1Y3QgbWFwX2R1bXBfY3R4ICpjdHgpXG4ge1xuIFx0dm9pZCAqa2V5LCAqdmFsdWUsICpwcmV2X2tleTtcbiBcdHVuc2lnbmVkIGludCBudW1fZWxlbXMgPSAwO1xuK1x0anNvbl93cml0ZXJfdCAqcGxhaW5fYnRmX3d0ciA9IE5VTEw7XG4gXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xuIFx0aW50IGVycjtcbiBcbkBAIC04NDUsNiArODc4LDE3IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFxuIFx0cHJldl9rZXkgPSBOVUxMO1xuIFxuK1x0aWYgKGN0eCBcdTAwMjZcdTAwMjYgIXd0ciBcdTAwMjZcdTAwMjYgKGluZm8tXHUwMDNlYnRmX3ZhbHVlX3R5cGVfaWQgfHxcbitcdFx0XHQgICAgaW5mby1cdTAwM2VidGZfdm1saW51eF92YWx1ZV90eXBlX2lkKSkge1xuK1x0XHRwbGFpbl9idGZfd3RyID0gZ2V0X2J0Zl93cml0ZXIoKTtcbitcdFx0aWYgKHBsYWluX2J0Zl93dHIpIHtcbitcdFx0XHRpZiAoc2hvd19oZWFkZXIpXG4rXHRcdFx0XHRzaG93X21hcF9oZWFkZXJfcGxhaW4oaW5mbyk7XG4rXHRcdFx0c2hvd19oZWFkZXIgPSBmYWxzZTtcbitcdFx0XHR3dHIgPSBwbGFpbl9idGZfd3RyO1xuK1x0XHR9XG4rXHR9XG4rXG4gXHRpZiAod3RyKSB7XG4gXHRcdGVyciA9IGdldF9tYXBfa3ZfYnRmKGluZm8sIFx1MDAyNmJ0Zik7XG4gXHRcdGlmIChlcnIpIHtcbkBAIC04NzQsMTAgKzkxOCwyMCBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbiBcdFx0aWYgKGVycikge1xuIFx0XHRcdGlmIChlcnJubyA9PSBFTk9FTlQpXG4gXHRcdFx0XHRlcnIgPSAwO1xuK1x0XHRcdGVsc2UgaWYgKGN0eClcbitcdFx0XHRcdHBfZXJyKFwiY2FuJ3QgZ2V0IG5leHQga2V5IGZvciBtYXAgaWQgJXU6ICVzXCIsXG4rXHRcdFx0XHQgICAgICBpbmZvLVx1MDAzZWlkLCBzdHJlcnJvcihlcnJubykpO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHR9XG4tXHRcdGlmICghZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpKVxuK1x0XHRlcnIgPSBkdW1wX21hcF9lbGVtKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cik7XG4rXHRcdGlmICghZXJyKSB7XG4gXHRcdFx0bnVtX2VsZW1zKys7XG4rXHRcdFx0aWYgKGN0eCBcdTAwMjZcdTAwMjYgbWFwX2lzX21hcF9vZl9tYXBzKGluZm8tXHUwMDNldHlwZSkpIHtcbitcdFx0XHRcdGVyciA9IGNvbGxlY3RfaW5uZXJfbWFwKGN0eCwgKihfX3UzMiAqKXZhbHVlKTtcbitcdFx0XHRcdGlmIChlcnIpXG4rXHRcdFx0XHRcdGJyZWFrO1xuK1x0XHRcdH1cbitcdFx0fVxuIFx0XHRwcmV2X2tleSA9IGtleTtcbiBcdH1cbiBcbkBAIC04OTQsMTggKzk0OCwyNSBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbiBcdGZyZWUoa2V5KTtcbiBcdGZyZWUodmFsdWUpO1xuIFx0ZnJlZV9tYXBfa3ZfYnRmKGJ0Zik7XG4rXHRpZiAocGxhaW5fYnRmX3d0cilcbitcdFx0anNvbndfZGVzdHJveShcdTAwMjZwbGFpbl9idGZfd3RyKTtcbiBcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4ge1xuK1x0TElCQlBGX09QVFMoYnBmX2dldF9mZF9ieV9pZF9vcHRzLCBvcHRzLFxuK1x0XHQub3Blbl9mbGFncyA9IEJQRl9GX1JET05MWSxcbitcdCk7XG4gXHRqc29uX3dyaXRlcl90ICp3dHIgPSBOVUxMLCAqYnRmX3d0ciA9IE5VTEw7XG4gXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbitcdHN0cnVjdCBtYXBfZHVtcF9jdHggY3R4ID0ge307XG4gXHRpbnQgbmJfZmRzLCBpID0gMDtcbiBcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbiBcdGludCAqZmRzID0gTlVMTDtcbiBcdGludCBlcnIgPSAtMTtcbitcdHNpemVfdCBqO1xuIFxuIFx0aWYgKGFyZ2MgIT0gMilcbiBcdFx0dXNhZ2UoKTtcbkBAIC05MTksOSArOTgwLDM0IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRpZiAobmJfZmRzIFx1MDAzYyAxKVxuIFx0XHRnb3RvIGV4aXRfZnJlZTtcbiBcbitcdGlmIChyZWN1cnNpdmUpIHtcbitcdFx0Y3R4LnNlZW4gPSBoYXNobWFwX19uZXcoaGFzaF9mbl9mb3Jfa2V5X2FzX2lkLFxuK1x0XHRcdFx0XHRlcXVhbF9mbl9mb3Jfa2V5X2FzX2lkLCBOVUxMKTtcbitcdFx0aWYgKElTX0VSUihjdHguc2VlbikpIHtcbitcdFx0XHRjdHguc2VlbiA9IE5VTEw7XG4rXHRcdFx0cF9lcnIoXCJmYWlsZWQgdG8gY3JlYXRlIGhhc2htYXAgZm9yIHJlY3Vyc2l2ZSBkdW1wXCIpO1xuK1x0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbitcdFx0fVxuK1x0XHQvKiBSZWNvcmQgdGhlIHNlbGVjdGVkIG1hcHMgYmVmb3JlIGRpc2NvdmVyaW5nIGFueSBpbm5lciBtYXBzLiAqL1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuYl9mZHM7IGkrKykge1xuK1x0XHRcdGxlbiA9IHNpemVvZihpbmZvKTtcbitcdFx0XHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFx1MDAyNmluZm8sIFx1MDAyNmxlbikpIHtcbitcdFx0XHRcdHBfZXJyKFwiY2FuJ3QgZ2V0IG1hcCBpbmZvOiAlc1wiLCBzdHJlcnJvcihlcnJubykpO1xuK1x0XHRcdFx0ZXJyID0gLTE7XG4rXHRcdFx0XHRnb3RvIGV4aXRfY2xvc2U7XG4rXHRcdFx0fVxuK1x0XHRcdGVyciA9IGhhc2htYXBfX2FkZChjdHguc2VlbiwgaW5mby5pZCwgMCk7XG4rXHRcdFx0aWYgKGVycikge1xuK1x0XHRcdFx0cF9lcnIoXCJmYWlsZWQgdG8gcmVjb3JkIG1hcCBpZCAldTogJXNcIiwgaW5mby5pZCxcbitcdFx0XHRcdCAgICAgIHN0cmVycm9yKC1lcnIpKTtcbitcdFx0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbitcdFx0XHR9XG4rXHRcdH1cbitcdH1cbitcbiBcdGlmIChqc29uX291dHB1dCkge1xuIFx0XHR3dHIgPSBqc29uX3d0cjtcbi1cdH0gZWxzZSB7XG4rXHR9IGVsc2UgaWYgKCFyZWN1cnNpdmUpIHtcbiBcdFx0aW50IGRvX3BsYWluX2J0ZjtcbiBcbiBcdFx0ZG9fcGxhaW5fYnRmID0gbWFwc19oYXZlX2J0ZihmZHMsIG5iX2Zkcyk7XG5AQCAtOTM2LDcgKzEwMjIsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR9XG4gXHR9XG4gXG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4rXHRpZiAod3RyIFx1MDAyNlx1MDAyNiAobmJfZmRzIFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZSkpXG4gXHRcdGpzb253X3N0YXJ0X2FycmF5KHd0cik7XHQvKiByb290IGFycmF5ICovXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuYl9mZHM7IGkrKykge1xuIFx0XHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFx1MDAyNmluZm8sIFx1MDAyNmxlbikpIHtcbkBAIC05NDQsMjIgKzEwMzAsNTAgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHRlcnIgPSAtMTtcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuLVx0XHRlcnIgPSBtYXBfZHVtcChmZHNbaV0sIFx1MDAyNmluZm8sIHd0ciwgbmJfZmRzIFx1MDAzZSAxKTtcbitcdFx0ZXJyID0gbWFwX2R1bXAoZmRzW2ldLCBcdTAwMjZpbmZvLCB3dHIsIG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmUsXG4rXHRcdFx0ICAgICAgIHJlY3Vyc2l2ZSA/IFx1MDAyNmN0eCA6IE5VTEwpO1xuIFx0XHRpZiAoIXd0ciBcdTAwMjZcdTAwMjYgaSAhPSBuYl9mZHMgLSAxKVxuIFx0XHRcdHByaW50ZihcIlxcblwiKTtcbiBcbiBcdFx0aWYgKGVycilcbiBcdFx0XHRicmVhaztcbi1cdFx0Y2xvc2UoZmRzW2ldKTtcbitcdFx0LyogS2VlcCBzZWxlY3RlZCBtYXBzIGFsaXZlIHdoaWxlIHZpc2l0aW5nIHRoZWlyIGlubmVyIG1hcHMuICovXG4rXHRcdGlmICghcmVjdXJzaXZlKVxuK1x0XHRcdGNsb3NlKGZkc1tpXSk7XG4rXHR9XG4rXHRmb3IgKGogPSAwOyAhZXJyIFx1MDAyNlx1MDAyNiBqIFx1MDAzYyBjdHgucGVuZGluZ19jbnQ7IGorKykge1xuK1x0XHRpbnQgZmQ7XG4rXG4rXHRcdGZkID0gYnBmX21hcF9nZXRfZmRfYnlfaWRfb3B0cyhjdHgucGVuZGluZ19pZHNbal0sIFx1MDAyNm9wdHMpO1xuK1x0XHRpZiAoZmQgXHUwMDNjIDApIHtcbitcdFx0XHRwX2VycihcImNhbid0IG9wZW4gaW5uZXIgbWFwIGlkICV1OiAlc1wiLFxuK1x0XHRcdCAgICAgIGN0eC5wZW5kaW5nX2lkc1tqXSwgc3RyZXJyb3IoZXJybm8pKTtcbitcdFx0XHRlcnIgPSAtMTtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1x0XHRsZW4gPSBzaXplb2YoaW5mbyk7XG4rXHRcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcdTAwMjZpbmZvLCBcdTAwMjZsZW4pKSB7XG4rXHRcdFx0cF9lcnIoXCJjYW4ndCBnZXQgbWFwIGluZm86ICVzXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXHRcdFx0ZXJyID0gLTE7XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0aWYgKCF3dHIpXG4rXHRcdFx0XHRwcmludGYoXCJcXG5cIik7XG4rXHRcdFx0ZXJyID0gbWFwX2R1bXAoZmQsIFx1MDAyNmluZm8sIHd0ciwgdHJ1ZSwgXHUwMDI2Y3R4KTtcbitcdFx0fVxuK1x0XHRjbG9zZShmZCk7XG4gXHR9XG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4rXHRpZiAod3RyIFx1MDAyNlx1MDAyNiAobmJfZmRzIFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZSkpXG4gXHRcdGpzb253X2VuZF9hcnJheSh3dHIpO1x0Lyogcm9vdCBhcnJheSAqL1xuIFxuIFx0aWYgKGJ0Zl93dHIpXG4gXHRcdGpzb253X2Rlc3Ryb3koXHUwMDI2YnRmX3d0cik7XG4gZXhpdF9jbG9zZTpcbitcdGlmIChyZWN1cnNpdmUpXG4rXHRcdGkgPSAwO1xuIFx0Zm9yICg7IGkgXHUwMDNjIG5iX2ZkczsgaSsrKVxuIFx0XHRjbG9zZShmZHNbaV0pO1xuK1x0aGFzaG1hcF9fZnJlZShjdHguc2Vlbik7XG4rXHRmcmVlKGN0eC5wZW5kaW5nX2lkcyk7XG4gZXhpdF9mcmVlOlxuIFx0ZnJlZShmZHMpO1xuIFx0ZnJlZV9idGZfdm1saW51eCgpO1xuQEAgLTE0ODQsNyArMTU5OCw3IEBAIHN0YXRpYyBpbnQgZG9faGVscChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdFwiICAgICAgICAgICAgICAgICB0YXNrX3N0b3JhZ2UgfCBibG9vbV9maWx0ZXIgfCB1c2VyX3JpbmdidWYgfCBjZ3JwX3N0b3JhZ2UgfCBhcmVuYSB8XFxuXCJcbiBcdFx0XCIgICAgICAgICAgICAgICAgIGluc25fYXJyYXkgfCByaGFzaCB9XFxuXCJcbiBcdFx0XCIgICAgICAgXCIgSEVMUF9TUEVDX09QVElPTlMgXCIgfFxcblwiXG4tXHRcdFwiICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB9XFxuXCJcbitcdFx0XCIgICAgICAgICAgICAgICAgICAgIHstZnwtLWJwZmZzfSB8IHstbnwtLW5vbW91bnR9IHwgey1yfC0tcmVjdXJzaXZlfSB9XFxuXCJcbiBcdFx0XCJcIixcbiBcdFx0YmluX25hbWUsIGFyZ3ZbLTJdKTtcbiBcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9kdW1wLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9kdW1wLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4zMzBhMzM0NDc3MGQxXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9kdW1wLmNcbkBAIC0wLDAgKzEsNDE5IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZnRvb2xfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2J0Zi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3Jlc291cmNlLmhcdTAwM2VcbitcbisjZGVmaW5lIE9VVFBVVF9TSVpFIDgxOTJcbitcbitzdGF0aWMgYm9vbCBkdW1wX21hcChfX3UzMiBpZCwgY29uc3QgY2hhciAqb3B0aW9ucywgY2hhciAqb3V0cHV0KVxuK3tcbitcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXTtcbitcbitcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCIlcyBtYXAgZHVtcCBpZCAldVwiLCBvcHRpb25zLCBpZCk7XG4rXHRtZW1zZXQob3V0cHV0LCAwLCBPVVRQVVRfU0laRSk7XG4rXHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIE9VVFBVVF9TSVpFIC0gMSksXG4rXHRcdCAgICAgICBcImR1bXBfbWFwXCIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHQvKiBUaGUgaGVscGVyIGRvZXNuJ3QgdGVybWluYXRlIG9yIHN0cmlwIHRoZSBvdXRwdXQuICovXG4rXHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFwiXFxuXCIpXSA9ICdcXDAnO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyBfX3UzMiBtYXBfaWQoaW50IGZkKVxuK3tcbitcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuK1x0X191MzIgbGVuID0gc2l6ZW9mKGluZm8pO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSwgXCJtYXBfaW5mb1wiKSlcbitcdFx0cmV0dXJuIDA7XG4rXHRyZXR1cm4gaW5mby5pZDtcbit9XG4rXG4rc3RhdGljIGludCBjb3VudF90b2tlbihjb25zdCBjaGFyICpvdXRwdXQsIGNvbnN0IGNoYXIgKnRva2VuKVxuK3tcbitcdGludCBjb3VudCA9IDA7XG4rXG4rXHR3aGlsZSAoKG91dHB1dCA9IHN0cnN0cihvdXRwdXQsIHRva2VuKSkpIHtcbitcdFx0Y291bnQrKztcbitcdFx0b3V0cHV0ICs9IHN0cmxlbih0b2tlbik7XG4rXHR9XG4rXHRyZXR1cm4gY291bnQ7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNoZWNrX3BsYWluKF9fdTMyIHJvb3RfaWQsIF9fdTMyIGlubmVyX2lkLCBjb25zdCBjaGFyICp0eXBlLFxuK1x0XHRcdGludCBlbnRyaWVzLCBib29sIHR5cGVkKVxuK3tcbitcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgaGVhZGVyWzEyOF07XG4rXHRjaGFyIG91dHB1dFtPVVRQVVRfU0laRV0gPSB7fTtcbitcdGNvbnN0IGNoYXIgKnJvb3QsICppbm5lcjtcbitcbitcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCItLXJlY3Vyc2l2ZSBtYXAgZHVtcCBpZCAldVwiLCByb290X2lkKTtcbitcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcbitcdFx0ICAgICAgIFwicGxhaW5fZHVtcFwiKSlcbitcdFx0cmV0dXJuO1xuK1x0c25wcmludGYoaGVhZGVyLCBzaXplb2YoaGVhZGVyKSwgXCIldTogJXMgIG5hbWUgZHVtcF9vdXRlciAgXCIsIHJvb3RfaWQsIHR5cGUpO1xuK1x0cm9vdCA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIocm9vdCwgXCJwbGFpbl9yb290X2hlYWRlclwiKSlcbitcdFx0cmV0dXJuO1xuK1x0QVNTRVJUX0VRKHJvb3QgLSBvdXRwdXQsIDAsIFwicGxhaW5fcm9vdF9maXJzdFwiKTtcbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFwiaW5uZXJfbWFwX2lkOlwiKSwgZW50cmllcywgXCJwbGFpbl9yZWZlcmVuY2VzXCIpO1xuK1x0aWYgKGVudHJpZXMpIHtcbitcdFx0c25wcmludGYoaGVhZGVyLCBzaXplb2YoaGVhZGVyKSwgXCIldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICBcIiwgaW5uZXJfaWQpO1xuK1x0XHRpbm5lciA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7XG4rXHRcdGlmIChBU1NFUlRfT0tfUFRSKGlubmVyLCBcInBsYWluX2lubmVyX2hlYWRlclwiKSlcbitcdFx0XHRBU1NFUlRfR1QoaW5uZXIgLSByb290LCAwLCBcInBsYWluX2lubmVyX2FmdGVyX3Jvb3RcIik7XG4rXHRcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIGhlYWRlciksIDEsIFwicGxhaW5faW5uZXJfb25jZVwiKTtcbitcdH1cbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFwiRm91bmQgXCIpLCBlbnRyaWVzIFx1MDAyNlx1MDAyNiAhdHlwZWQgPyAyIDogMSxcbitcdFx0ICBcInBsYWluX21hcF9jb3VudFwiKTtcbitcdGlmICh0eXBlZCkge1xuK1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIFwiXFxcImtleVxcXCI6IDBcIiwgXCJwbGFpbl9idGZfa2V5XCIpO1xuK1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIFwiXFxcInZhbHVlXFxcIjogMTY4NDMwMDlcIiwgXCJwbGFpbl9idGZfdmFsdWVcIik7XG4rXHR9XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3Rfb3V0ZXIoZW51bSBicGZfbWFwX3R5cGUgdHlwZSwgaW50IGVudHJpZXMsIGJvb2wgZW1wdHlfaW5uZXIsXG4rXHRcdCAgICAgICBib29sIHR5cGVkKVxuK3tcbitcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xuK1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgaW5uZXJfb3B0cyk7XG4rXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xuK1x0Y2hhciBvdXRlcltPVVRQVVRfU0laRV0sIGlubmVyW09VVFBVVF9TSVpFXSwgb3V0cHV0W09VVFBVVF9TSVpFXTtcbitcdGNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcmVmZXJlbmNlWzY0XTtcbitcdGNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IGxpYmJwZl9icGZfbWFwX3R5cGVfc3RyKHR5cGUpO1xuK1x0aW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTE7XG4rXHRfX3UzMiByb290X2lkLCBpbm5lcl9pZCwga2V5LCB2YWx1ZSA9IDB4MDEwMTAxMDE7XG4rXG4rXHRpZiAodHlwZWQpIHtcbitcdFx0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcbitcdFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJjcmVhdGVfYnRmXCIpIHx8XG4rXHRcdCAgICAhQVNTRVJUX0VRKGJ0Zl9fYWRkX2ludChidGYsIFwidW5zaWduZWQgaW50XCIsIDQsIDApLCAxLCBcImJ0Zl9pbnRcIikgfHxcbitcdFx0ICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksIFwibG9hZF9idGZcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGlubmVyX29wdHMuYnRmX2ZkID0gYnRmX19mZChidGYpO1xuK1x0XHRpbm5lcl9vcHRzLmJ0Zl9rZXlfdHlwZV9pZCA9IDE7XG4rXHRcdGlubmVyX29wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxO1xuK1x0fVxuK1x0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCJkdW1wX2lubmVyXCIsIHNpemVvZihrZXkpLFxuK1x0XHRcdFx0ICBzaXplb2YodmFsdWUpLCAyLCBcdTAwMjZpbm5lcl9vcHRzKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcImNyZWF0ZV9pbm5lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRrZXkgPSAwO1xuK1x0aWYgKCFlbXB0eV9pbm5lciBcdTAwMjZcdTAwMjZcbitcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oaW5uZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxuK1x0XHQgICAgICAgXCJwb3B1bGF0ZV9pbm5lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRvcHRzLmlubmVyX21hcF9mZCA9IGlubmVyX2ZkO1xuK1x0b3V0ZXJfZmQgPSBicGZfbWFwX2NyZWF0ZSh0eXBlLCBcImR1bXBfb3V0ZXJcIiwgc2l6ZW9mKGtleSksIHNpemVvZihfX3UzMiksXG4rXHRcdFx0XHQgMywgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXCJjcmVhdGVfb3V0ZXJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0LyogVGhlIHVudXNlZCB0aGlyZCBhcnJheSBzbG90IGFsc28gZXhlcmNpc2VzIGZhaWxlZCBsb29rdXBzLiAqL1xuK1x0Zm9yIChrZXkgPSAwOyBrZXkgXHUwMDNjIGVudHJpZXM7IGtleSsrKVxuK1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCBcdTAwMjZrZXksIFx1MDAyNmlubmVyX2ZkLCBCUEZfQU5ZKSxcbitcdFx0XHQgICAgICAgXCJwb3B1bGF0ZV9vdXRlclwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xuK1x0aW5uZXJfaWQgPSBtYXBfaWQoaW5uZXJfZmQpO1xuK1x0aWYgKCFyb290X2lkIHx8ICFpbm5lcl9pZCB8fCAhZHVtcF9tYXAocm9vdF9pZCwgXCItalwiLCBvdXRlcikgfHxcbitcdCAgICAhZHVtcF9tYXAoaW5uZXJfaWQsIFwiLWpcIiwgaW5uZXIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdEFTU0VSVF9FUShvdXRlclswXSwgJ1snLCBcImRlZmF1bHRfYXJyYXlcIik7XG4rXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIFwiXFxcImVsZW1lbnRzXFxcIjpcIiksIDAsIFwiZGVmYXVsdF9ub193cmFwcGVyXCIpO1xuK1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCBcIlxcXCJpZFxcXCI6XCIpLCAwLCBcImRlZmF1bHRfbm9faGVhZGVyXCIpO1xuK1x0c25wcmludGYocmVmZXJlbmNlLCBzaXplb2YocmVmZXJlbmNlKSwgXCJcXFwiaW5uZXJfbWFwX2lkXFxcIjoldVwiLCBpbm5lcl9pZCk7XG4rXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIHJlZmVyZW5jZSksIGVudHJpZXMsIFwiZGVmYXVsdF9yZWZlcmVuY2VzXCIpO1xuK1x0aWYgKCFlbnRyaWVzKVxuK1x0XHRBU1NFUlRfU1RSRVEob3V0ZXIsIFwiW11cIiwgXCJlbXB0eV9vdXRlcl9kZWZhdWx0XCIpO1xuK1x0aWYgKGVtcHR5X2lubmVyKVxuK1x0XHRBU1NFUlRfU1RSRVEoaW5uZXIsIFwiW11cIiwgXCJlbXB0eV9pbm5lcl9kZWZhdWx0XCIpO1xuK1x0ZWxzZSBpZiAodHlwZWQpXG4rXHRcdEFTU0VSVF9IQVNfU1VCU1RSKGlubmVyLCBcIlxcXCJmb3JtYXR0ZWRcXFwiOntcXFwia2V5XFxcIjowLFxcXCJ2YWx1ZVxcXCI6MTY4NDMwMDl9XCIsXG4rXHRcdFx0XHQgIFwidHlwZWRfaW5uZXJcIik7XG4rXHRlbHNlXG4rXHRcdEFTU0VSVF9TVFJFUShpbm5lcixcbitcdFx0XHQgICAgIFwiW3tcXFwia2V5XFxcIjpbXFxcIjB4MDBcXFwiLFxcXCIweDAwXFxcIixcXFwiMHgwMFxcXCIsXFxcIjB4MDBcXFwiXSxcIlxuK1x0XHRcdCAgICAgXCJcXFwidmFsdWVcXFwiOltcXFwiMHgwMVxcXCIsXFxcIjB4MDFcXFwiLFxcXCIweDAxXFxcIixcXFwiMHgwMVxcXCJdfV1cIixcbitcdFx0XHQgICAgIFwib3JkaW5hcnlfZGVmYXVsdFwiKTtcbitcbitcdC8qIENvbXBhcmUgdGhlIGNvbXBsZXRlIEpTT04gZG9jdW1lbnQ6IGEgZmxhdCBhcnJheSB3aXRoIHRoZSByb290IGZpcnN0LFxuK1x0ICogb25lIGNvcHkgb2YgdGhlIHNoYXJlZCBpbm5lciBtYXAsIGFuZCB1bmNoYW5nZWQgZW50cnkgcmVwcmVzZW50YXRpb25zLlxuK1x0ICovXG4rXHRpZiAoZW50cmllcylcbitcdFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4rXHRcdFx0IFwiW3tcXFwiaWRcXFwiOiV1LFxcXCJ0eXBlXFxcIjpcXFwiJXNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiZHVtcF9vdXRlclxcXCIsXCJcbitcdFx0XHQgXCJcXFwiZmxhZ3NcXFwiOjAsXFxcImVsZW1lbnRzXFxcIjolc30se1xcXCJpZFxcXCI6JXUsXFxcInR5cGVcXFwiOlxcXCJoYXNoXFxcIixcIlxuK1x0XHRcdCBcIlxcXCJuYW1lXFxcIjpcXFwiZHVtcF9pbm5lclxcXCIsXFxcImZsYWdzXFxcIjowLFxcXCJlbGVtZW50c1xcXCI6JXN9XVwiLFxuK1x0XHRcdCByb290X2lkLCB0eXBlX25hbWUsIG91dGVyLCBpbm5lcl9pZCwgaW5uZXIpO1xuK1x0ZWxzZVxuK1x0XHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbitcdFx0XHQgXCJbe1xcXCJpZFxcXCI6JXUsXFxcInR5cGVcXFwiOlxcXCIlc1xcXCIsXFxcIm5hbWVcXFwiOlxcXCJkdW1wX291dGVyXFxcIixcIlxuK1x0XHRcdCBcIlxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOltdfV1cIiwgcm9vdF9pZCwgdHlwZV9uYW1lKTtcbitcdGlmIChkdW1wX21hcChyb290X2lkLCBcIi1qIC1yXCIsIG91dHB1dCkpXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcInJlY3Vyc2l2ZV9qc29uXCIpO1xuK1x0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFwiLS1qc29uIC0tcmVjdXJzaXZlXCIsIG91dHB1dCkpXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcInJlY3Vyc2l2ZV9sb25nX29wdGlvbnNcIik7XG4rXHRjaGVja19wbGFpbihyb290X2lkLCBpbm5lcl9pZCwgdHlwZV9uYW1lLCBlbnRyaWVzLCB0eXBlZCk7XG4rXG4rXHQvKiBSZWN1cnNpb24gb24gYW4gb3JkaW5hcnkgbWFwIHN0aWxsIGVtaXRzIGEgc2luZ2xlIG1hcCBvYmplY3QuICovXG4rXHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbitcdFx0IFwiW3tcXFwiaWRcXFwiOiV1LFxcXCJ0eXBlXFxcIjpcXFwiaGFzaFxcXCIsXFxcIm5hbWVcXFwiOlxcXCJkdW1wX2lubmVyXFxcIixcIlxuK1x0XHQgXCJcXFwiZmxhZ3NcXFwiOjAsXFxcImVsZW1lbnRzXFxcIjolc31dXCIsIGlubmVyX2lkLCBpbm5lcik7XG4rXHRpZiAoZHVtcF9tYXAoaW5uZXJfaWQsIFwiLWogLXJcIiwgb3V0cHV0KSlcbitcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwib3JkaW5hcnlfcmVjdXJzaXZlXCIpO1xuK291dDpcbitcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKG91dGVyX2ZkKTtcbitcdGlmIChpbm5lcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGlubmVyX2ZkKTtcbitcdGJ0Zl9fZnJlZShidGYpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X211bHRpcGxlX3Jvb3RzKHZvaWQpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4rXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIG5hbWVbQlBGX09CSl9OQU1FX0xFTl07XG4rXHRjaGFyIG91dHB1dFtPVVRQVVRfU0laRV0gPSB7fSwgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiA0XSwgZWxlbWVudHNbT1VUUFVUX1NJWkVdO1xuK1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlc1tdID0geyBcImhhc2hcIiwgXCJhcnJheV9vZl9tYXBzXCIsIFwiaGFzaF9vZl9tYXBzXCIsIFwiaGFzaFwiIH07XG4rXHRpbnQgZmRzW10gPSB7IC0xLCAtMSwgLTEsIC0xIH07XG4rXHRfX3UzMiBpZHNbNF0sIGtleTtcbitcdGludCBpLCBsZW4gPSAwO1xuK1xuK1x0LyogU2VsZWN0IHRoZSBmaXJzdCBpbm5lciBtYXAgYW5kIGJvdGggb3V0ZXJzIGFzIHJvb3RzLiBUaGUgb3RoZXIgaW5uZXJcbitcdCAqIG1hcCBtdXN0IGJlIGFwcGVuZGVkIGFmdGVyIGFsbCB0aHJlZSByb290cywgZXZlbiB0aG91Z2ggaXQgaXMgZm91bmRcbitcdCAqIHdoaWxlIGR1bXBpbmcgdGhlIGZpcnN0IG91dGVyLiBBIHByb2Nlc3Mtc3BlY2lmaWMgbmFtZSBhdm9pZHMgb3RoZXJcbitcdCAqIHRlc3RzJyBtYXBzIGpvaW5pbmcgdGhlIHNlbGVjdGlvbi5cbitcdCAqL1xuK1x0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcImR1bXBfJXVcIiwgZ2V0cGlkKCkpO1xuK1x0ZmRzWzBdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIG5hbWUsIDQsIDQsIDEsIE5VTEwpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzBdLCBcImNyZWF0ZV9zZWxlY3RlZF9pbm5lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRmZHNbM10gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCJkdW1wX2Rpc2NvdmVyZWRcIiwgNCwgNCwgMSwgTlVMTCk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbM10sIFwiY3JlYXRlX2Rpc2NvdmVyZWRfaW5uZXJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBmZHNbMF07XG4rXHRmZHNbMV0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMV0sIFwiY3JlYXRlX2FycmF5X3Jvb3RcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZmRzWzJdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMl0sIFwiY3JlYXRlX2hhc2hfcm9vdFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRmb3IgKGkgPSAxOyBpIFx1MDAzYz0gMjsgaSsrKSB7XG4rXHRcdGtleSA9IDA7XG4rXHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmRzW2ldLCBcdTAwMjZrZXksIFx1MDAyNmZkc1swXSwgQlBGX0FOWSksXG4rXHRcdFx0ICAgICAgIFwicmVmZXJlbmNlX3NlbGVjdGVkX2lubmVyXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRrZXkgPSAxO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXHUwMDI2a2V5LCBcdTAwMjZmZHNbM10sIEJQRl9BTlkpLFxuK1x0XHRcdCAgICAgICBcInJlZmVyZW5jZV9kaXNjb3ZlcmVkX2lubmVyXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0fVxuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShmZHMpOyBpKyspIHtcbitcdFx0aWRzW2ldID0gbWFwX2lkKGZkc1tpXSk7XG4rXHRcdGlmICghaWRzW2ldIHx8ICFkdW1wX21hcChpZHNbaV0sIFwiLWpcIiwgZWxlbWVudHMpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRsZW4gKz0gc25wcmludGYoZXhwZWN0ZWQgKyBsZW4sIHNpemVvZihleHBlY3RlZCkgLSBsZW4sXG4rXHRcdFx0XHRcIiVze1xcXCJpZFxcXCI6JXUsXFxcInR5cGVcXFwiOlxcXCIlc1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIlc1xcXCIsXCJcbitcdFx0XHRcdFwiXFxcImZsYWdzXFxcIjowLFxcXCJlbGVtZW50c1xcXCI6JXN9JXNcIixcbitcdFx0XHRcdGkgPyBcIixcIiA6IFwiW1wiLCBpZHNbaV0sIHR5cGVzW2ldLFxuK1x0XHRcdFx0aSA9PSAzID8gXCJkdW1wX2Rpc2NvdmVyZWRcIiA6IG5hbWUsIGVsZW1lbnRzLCBpID09IDMgPyBcIl1cIiA6IFwiXCIpO1xuK1x0fVxuK1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcIi1qIC1yIG1hcCBkdW1wIG5hbWUgJXNcIiwgbmFtZSk7XG4rXHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcbitcdFx0ICAgICAgXCJkdW1wX211bHRpcGxlX3Jvb3RzXCIpKSB7XG4rXHRcdG91dHB1dFtzdHJjc3BuKG91dHB1dCwgXCJcXG5cIildID0gJ1xcMCc7XG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcInJvb3RzX2ZpcnN0X2FuZF9zZWVkX2RlZHVwXCIpO1xuK1x0fVxuK291dDpcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoZmRzKTsgaSsrKVxuK1x0XHRpZiAoZmRzW2ldIFx1MDAzZT0gMClcbitcdFx0XHRjbG9zZShmZHNbaV0pO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X3VucmVhZGFibGUoYm9vbCBvdXRlcilcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbitcdGNoYXIgZWxlbWVudHNbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdLCByb290W09VVFBVVF9TSVpFXTtcbitcdGNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcGxhaW5bT1VUUFVUX1NJWkVdID0ge307XG4rXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07XG4rXHRpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMSwgbG9va3VwX2Vycm5vO1xuK1x0X191MzIgaW5uZXJfaWQsIHJvb3RfaWQsIGtleSA9IDAsIHZhbHVlO1xuK1xuK1x0LyogRXZlcnkga2V5IGlzIGVudW1lcmFibGUsIGJ1dCBQRVJGX0VWRU5UX0FSUkFZIGxvb2t1cCByZXR1cm5zXG4rXHQgKiBFTk9UU1VQUCAodGhlIGtlcm5lbC1pbnRlcm5hbCBlcnJubykuIENoZWNrIGJvdGggZW50cmllcyBzbyBhblxuK1x0ICogZWFybHkgZXhpdCBvbiB0aGUgZmlyc3QgbG9va3VwIGZhaWx1cmUgY2Fubm90IHBhc3MuXG4rXHQgKi9cbitcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVksIFwiZHVtcF91bnJlYWRhYmxlXCIsXG4rXHRcdFx0XHQgIHNpemVvZihrZXkpLCBzaXplb2YodmFsdWUpLCAyLCBOVUxMKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcImNyZWF0ZV91bnJlYWRhYmxlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghQVNTRVJUX0xUKGJwZl9tYXBfbG9va3VwX2VsZW0oaW5uZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2dmFsdWUpLCAwLFxuK1x0XHQgICAgICAgXCJ1bnJlYWRhYmxlX2xvb2t1cFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRsb29rdXBfZXJybm8gPSBlcnJubztcbitcdGlmICghQVNTRVJUX05FUShsb29rdXBfZXJybm8sIEVOT0VOVCwgXCJ1bnJlYWRhYmxlX25vdF9taXNzaW5nXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlubmVyX2lkID0gbWFwX2lkKGlubmVyX2ZkKTtcbitcdGlmICghaW5uZXJfaWQgfHwgIWR1bXBfbWFwKGlubmVyX2lkLCBcIi1qXCIsIGVsZW1lbnRzKSlcbitcdFx0Z290byBvdXQ7XG4rXHRBU1NFUlRfRVEoY291bnRfdG9rZW4oZWxlbWVudHMsIFwiXFxcImVycm9yXFxcIjpcIiksIDIsIFwiZGVmYXVsdF9qc29uX2Vycm9yc1wiKTtcbitcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCJtYXAgZHVtcCBpZCAldVwiLCBpbm5lcl9pZCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBwbGFpbiwgc2l6ZW9mKHBsYWluKSAtIDEpLFxuK1x0XHQgICAgICAgXCJkZWZhdWx0X3BsYWluX3VucmVhZGFibGVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKHBsYWluLCBzdHJlcnJvcihsb29rdXBfZXJybm8pKSwgMiwgXCJkZWZhdWx0X3BsYWluX2Vycm9yc1wiKTtcbitcdEFTU0VSVF9IQVNfU1VCU1RSKHBsYWluLCBcIkZvdW5kIDAgZWxlbWVudHNcIiwgXCJkZWZhdWx0X3BsYWluX2NvdW50XCIpO1xuK1xuK1x0cm9vdF9pZCA9IGlubmVyX2lkO1xuK1x0aWYgKG91dGVyKSB7XG4rXHRcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XG4rXHRcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIFwiZHVtcF9vdXRlclwiLFxuK1x0XHRcdFx0XHQgc2l6ZW9mKGtleSksIHNpemVvZih2YWx1ZSksIDEsIFx1MDAyNm9wdHMpO1xuK1x0XHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXCJjcmVhdGVfb3V0ZXJcIikgfHxcbitcdFx0ICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgXHUwMDI2a2V5LCBcdTAwMjZpbm5lcl9mZCwgQlBGX0FOWSksXG4rXHRcdFx0ICAgICAgIFwicG9wdWxhdGVfb3V0ZXJcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xuK1x0XHRpZiAoIXJvb3RfaWQgfHwgIWR1bXBfbWFwKHJvb3RfaWQsIFwiLWpcIiwgcm9vdCkpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuK1x0XHRcdCBcIlt7XFxcImlkXFxcIjoldSxcXFwidHlwZVxcXCI6XFxcImFycmF5X29mX21hcHNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiZHVtcF9vdXRlclxcXCIsXCJcbitcdFx0XHQgXCJcXFwiZmxhZ3NcXFwiOjAsXFxcImVsZW1lbnRzXFxcIjolc30se1xcXCJpZFxcXCI6JXUsXCJcbitcdFx0XHQgXCJcXFwidHlwZVxcXCI6XFxcInBlcmZfZXZlbnRfYXJyYXlcXFwiLFxcXCJuYW1lXFxcIjpcXFwiZHVtcF91bnJlYWRhYmxlXFxcIixcIlxuK1x0XHRcdCBcIlxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOiVzfV1cIiwgcm9vdF9pZCwgcm9vdCwgaW5uZXJfaWQsIGVsZW1lbnRzKTtcbitcdH0gZWxzZSB7XG4rXHRcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuK1x0XHRcdCBcIlt7XFxcImlkXFxcIjoldSxcXFwidHlwZVxcXCI6XFxcInBlcmZfZXZlbnRfYXJyYXlcXFwiLFwiXG4rXHRcdFx0IFwiXFxcIm5hbWVcXFwiOlxcXCJkdW1wX3VucmVhZGFibGVcXFwiLFxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOiVzfV1cIixcbitcdFx0XHQgaW5uZXJfaWQsIGVsZW1lbnRzKTtcbitcdH1cbitcdGlmIChkdW1wX21hcChyb290X2lkLCBcIi1qIC1yXCIsIG91dHB1dCkpXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcInJlY3Vyc2l2ZV91bnJlYWRhYmxlX2pzb25cIik7XG4rXHRtZW1zZXQob3V0cHV0LCAwLCBzaXplb2Yob3V0cHV0KSk7XG4rXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwiLXIgbWFwIGR1bXAgaWQgJXVcIiwgcm9vdF9pZCk7XG4rXHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcbitcdFx0ICAgICAgXCJyZWN1cnNpdmVfdW5yZWFkYWJsZV9wbGFpblwiKSkge1xuK1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIHBsYWluLCBcInJlY3Vyc2l2ZV9wbGFpbl9wcmVzZXJ2ZXNfZXJyb3JzXCIpO1xuK1x0XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBzdHJlcnJvcihsb29rdXBfZXJybm8pKSwgMixcbitcdFx0XHQgIFwicmVjdXJzaXZlX3BsYWluX2Vycm9yc1wiKTtcbitcdFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgXCJGb3VuZCBcIiksIG91dGVyID8gMiA6IDEsXG4rXHRcdFx0ICBcInJlY3Vyc2l2ZV9wbGFpbl9tYXBzXCIpO1xuK1x0fVxuK291dDpcbitcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKG91dGVyX2ZkKTtcbitcdGlmIChpbm5lcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGlubmVyX2ZkKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9tYW55X2lubmVyX21hcHMoYm9vbCBqc29uKVxuK3tcbitcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xuK1x0Y29uc3Qgc3RydWN0IHJsaW1pdCBsaW1pdCA9IHsgLnJsaW1fY3VyID0gMzIsIC5ybGltX21heCA9IDMyIH07XG4rXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIHRva2VuWzY0XTtcbitcdF9fdTMyIGlkc1s2NF0sIHJvb3RfaWQsIGtleTtcbitcdGludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xLCBzdGF0dXM7XG4rXHRjaGFyICpvdXRwdXQgPSBOVUxMO1xuK1x0cGlkX3QgcGlkO1xuK1xuK1x0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCJkdW1wX2lubmVyXCIsIDQsIDQsIDEsIE5VTEwpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFwiY3JlYXRlX3RlbXBsYXRlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XG4rXHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBcImR1bXBfb3V0ZXJcIiwgNCwgNCxcbitcdFx0XHRcdCBBUlJBWV9TSVpFKGlkcyksIFx1MDAyNm9wdHMpO1xuK1x0Y2xvc2UoaW5uZXJfZmQpO1xuK1x0aW5uZXJfZmQgPSAtMTtcbitcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcImNyZWF0ZV9vdXRlclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRmb3IgKGtleSA9IDA7IGtleSBcdTAwM2MgQVJSQVlfU0laRShpZHMpOyBrZXkrKykge1xuK1x0XHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcImR1bXBfaW5uZXJcIiwgNCwgNCwgMSwgTlVMTCk7XG4rXHRcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcImNyZWF0ZV9pbm5lclwiKSB8fFxuK1x0XHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCBcdTAwMjZrZXksIFx1MDAyNmlubmVyX2ZkLCBCUEZfQU5ZKSxcbitcdFx0XHQgICAgICAgXCJwb3B1bGF0ZV9vdXRlclwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0aWRzW2tleV0gPSBtYXBfaWQoaW5uZXJfZmQpO1xuK1x0XHRpZiAoIWlkc1trZXldKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHQvKiBUaGUgb3V0ZXIgbWFwIGtlZXBzIGVhY2ggZGlzdGluY3QgaW5uZXIgbWFwIGFsaXZlLiAqL1xuK1x0XHRjbG9zZShpbm5lcl9mZCk7XG4rXHRcdGlubmVyX2ZkID0gLTE7XG4rXHR9XG4rXHRyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTtcbitcdG91dHB1dCA9IGNhbGxvYygxLCA2NTUzNik7XG4rXHRpZiAoIXJvb3RfaWQgfHwgIUFTU0VSVF9PS19QVFIob3V0cHV0LCBcImFsbG9jYXRlX291dHB1dFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHQvKiBDcmVhdGUgYWxsIGZpeHR1cmVzIGJlZm9yZSBsb3dlcmluZyB0aGUgbGltaXQsIGFuZCBrZWVwIHRoZSB0ZXN0XG4rXHQgKiBydW5uZXIncyBsaW1pdCB1bmNoYW5nZWQuIFJldGFpbmluZyBldmVyeSBkaXNjb3ZlcmVkIEZEIHdvdWxkIGV4Y2VlZFxuK1x0ICogdGhpcyBsaW1pdCBiZWZvcmUgdGhlIHJlY3Vyc2l2ZSBkdW1wIGNvdWxkIHZpc2l0IGFsbCBpbm5lciBtYXBzLlxuK1x0ICovXG4rXHRwaWQgPSBmb3JrKCk7XG4rXHRpZiAoIUFTU0VSVF9HRShwaWQsIDAsIFwiZm9ya1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIXBpZCkge1xuK1x0XHRjbG9zZShvdXRlcl9mZCk7XG4rXHRcdGlmIChzZXRybGltaXQoUkxJTUlUX05PRklMRSwgXHUwMDI2bGltaXQpKVxuK1x0XHRcdF9leGl0KDEpO1xuK1x0XHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwiJXMgLXIgbWFwIGR1bXAgaWQgJXVcIixcbitcdFx0XHQganNvbiA/IFwiLWpcIiA6IFwiXCIsIHJvb3RfaWQpO1xuK1x0XHRpZiAoZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCA2NTUzNSkpXG4rXHRcdFx0X2V4aXQoMik7XG4rXHRcdGlmIChjb3VudF90b2tlbihvdXRwdXQsIGpzb24gPyBcIlxcXCJpZFxcXCI6XCIgOiBcIkZvdW5kIFwiKSAhPSBBUlJBWV9TSVpFKGlkcykgKyAxIHx8XG4rXHRcdCAgICBjb3VudF90b2tlbihvdXRwdXQsIGpzb24gPyBcIlxcXCJpbm5lcl9tYXBfaWRcXFwiOlwiIDogXCJpbm5lcl9tYXBfaWQ6XCIpICE9XG4rXHRcdCAgICBBUlJBWV9TSVpFKGlkcykpXG4rXHRcdFx0X2V4aXQoMyk7XG4rXHRcdGZvciAoa2V5ID0gMDsga2V5IFx1MDAzYyBBUlJBWV9TSVpFKGlkcyk7IGtleSsrKSB7XG4rXHRcdFx0aWYgKGpzb24pXG4rXHRcdFx0XHRzbnByaW50Zih0b2tlbiwgc2l6ZW9mKHRva2VuKSwgXCJcXFwiaWRcXFwiOiV1LFwiLCBpZHNba2V5XSk7XG4rXHRcdFx0ZWxzZVxuK1x0XHRcdFx0c25wcmludGYodG9rZW4sIHNpemVvZih0b2tlbiksIFwiXFxuJXU6IGhhc2ggIG5hbWUgZHVtcF9pbm5lciAgXCIsXG4rXHRcdFx0XHRcdCBpZHNba2V5XSk7XG4rXHRcdFx0aWYgKGNvdW50X3Rva2VuKG91dHB1dCwgdG9rZW4pICE9IDEpXG4rXHRcdFx0XHRfZXhpdCg0KTtcbitcdFx0fVxuK1x0XHRpZiAoanNvbiBcdTAwMjZcdTAwMjYgKG91dHB1dFswXSAhPSAnWycgfHxcbitcdFx0XHQgICAgIHN0cmNtcChvdXRwdXQgKyBzdHJsZW4ob3V0cHV0KSAtIDIsIFwiXVxcblwiKSkpXG4rXHRcdFx0X2V4aXQoNSk7XG4rXHRcdF9leGl0KDApO1xuK1x0fVxuK1x0aWYgKEFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgXHUwMDI2c3RhdHVzLCAwKSwgcGlkLCBcIndhaXRwaWRcIikgXHUwMDI2XHUwMDI2XG4rXHQgICAgQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwiY2hpbGRfZXhpdGVkXCIpKVxuK1x0XHRBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSwgMCwgXCJkdW1wX3dpdGhfbG93X2ZkX2xpbWl0XCIpO1xuK291dDpcbitcdGZyZWUob3V0cHV0KTtcbitcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKG91dGVyX2ZkKTtcbitcdGlmIChpbm5lcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGlubmVyX2ZkKTtcbit9XG4rXG4rdm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2R1bXAodm9pZClcbit7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInVucmVhZGFibGVfb3JkaW5hcnlcIikpXG4rXHRcdHRlc3RfdW5yZWFkYWJsZShmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInVucmVhZGFibGVfaW5uZXJcIikpXG4rXHRcdHRlc3RfdW5yZWFkYWJsZSh0cnVlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibWFueV9pbm5lcl9tYXBzX2pzb25cIikpXG4rXHRcdHRlc3RfbWFueV9pbm5lcl9tYXBzKHRydWUpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtYW55X2lubmVyX21hcHNfcGxhaW5cIikpXG4rXHRcdHRlc3RfbWFueV9pbm5lcl9tYXBzKGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibXVsdGlwbGVfcm9vdHNcIikpXG4rXHRcdHRlc3RfbXVsdGlwbGVfcm9vdHMoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiYXJyYXlfb2ZfbWFwc1wiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMSwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiaGFzaF9vZl9tYXBzXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInNoYXJlZF9pbm5lclwiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMiwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiZW1wdHlfYXJyYXlfb2ZfbWFwc1wiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMCwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiZW1wdHlfaGFzaF9vZl9tYXBzXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImJ0Zl9pbm5lclwiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCBmYWxzZSwgdHJ1ZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImVtcHR5X2lubmVyXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIHRydWUsIGZhbHNlKTtcbit9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwMToyMzo1OS45MzExNDI4MThaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0NDEyODA1NDc1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKldvcnRoRnV6emluZyBBc3Nlc3NtZW50OiBOZWdhdGl2ZSoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIEkgbmVlZCB0byBsb29rIGF0IHRoZSBkaWZmIGFuZCBzZWUgd2hhdCdzIGJlZW4gdG91Y2hlZC4gQWxyaWdodCwgSSdtIHNlZWluZyBjaGFuZ2VzIGluIGBicGZ0b29sYCByZWxhdGVkIGZpbGVzIGFuZCBzb21lIHNlbGYtdGVzdHMuIFNwZWNpZmljYWxseSwgSSdtIGxvb2tpbmcgYXQgbW9kaWZpY2F0aW9ucyB0byBgYnBmdG9vbGAncyBkb2N1bWVudGF0aW9uLCBiYXNoIGNvbXBsZXRpb24sIGBtYWluLmNgLCBgbWFpbi5oYCwgYG1hcC5jYCwgYW5kIHRoZSBgYnBmdG9vbF9tYXBfZHVtcC5jYCBzZWxmLXRlc3QuIEFsbCB0aGVzZSBjaGFuZ2VzIGFyZSBuZWF0bHkgY29udGFpbmVkIHdpdGhpbiB0aGUgYHRvb2xzL2AgZGlyZWN0b3J5LCBzcGVjaWZpY2FsbHkgd2l0aGluIGB0b29scy9icGYvYnBmdG9vbGAgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGZgLlxuXG5Ob3csIEkgbmVlZCB0byBhcHBseSB0aGUgdHJpYWdlIGd1aWRlbGluZXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgZGVzZXJ2ZXMgZnV6emluZy4gQWNjb3JkaW5nIHRvIHRoZSBndWlkZWxpbmVzLCBJIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGNoYW5nZXMgZmFsbCB1bmRlciBhbnkgb2YgdGhlIFwiTkVHQVRJVkUgQ1JJVEVSSUEsXCIgbWVhbmluZyBpZiBJICpkb24ndCogbmVlZCB0byBmbGFnIHRoaXMgZm9yIGZ1enppbmcuIFNlZW1zIGxpa2UgYSBmaXQuIFRoZSBydWxlIGhlcmUgaXMgY2xlYXI6IElmICphbGwqIHRoZSBtb2RpZmllZCBjb2RlIGlzIGV4Y2x1c2l2ZWx5IGRvY3VtZW50YXRpb24sIGNvbW1lbnRzLCBzcGVsbGluZyBmaXhlcywgb3IgdXNlci1zcGFjZSBkaXJlY3RvcmllcyBsaWtlIGB0b29scy9gLCBgc2FtcGxlcy9gLCBgc2NyaXB0cy9gLCBvciBgdXNyL2AgKmFuZCogZG9lcyAqbm90KiBpbXBhY3QgdGhlIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3IgYW55IGtlcm5lbCBtb2R1bGVzLCB0aGVuIEkgc2hvdWxkIHNldCBgV29ydGhGdXp6aW5nPWZhbHNlYC5cblxuQ29uc2lkZXJpbmcgdGhlIGd1aWRlbGluZXMsIGl0J3MgY2xlYXIgdGhhdCBhbGwgY2hhbmdlcyBhcmUgY29uZmluZWQgdG8gdXNlci1zcGFjZSB0b29scyAoYGJwZnRvb2xgKSBhbmQgYXNzb2NpYXRlZCBzZWxmLXRlc3RzLiBObyBrZXJuZWwgc291cmNlIGZpbGVzIHJlc2lkaW5nIGluIGRpcmVjdG9yaWVzIGxpa2UgYGtlcm5lbC9gLCBgbmV0L2AsIGBtbS9gLCBgZHJpdmVycy9gLCBgZnMvYCwgYGluY2x1ZGUvYCAoYmVzaWRlcyB0b29scy9pbmNsdWRlIGlmIGFueSksIG9yIG90aGVyIGNydWNpYWwga2VybmVsIGNvbXBvbmVudHMgYXJlIGFmZmVjdGVkLiBTbywgSSBhbSB2ZXJ5IGNvbmZpZGVudCB0aGlzIHBhdGNoIHdvbid0IGFmZmVjdCB0aGUga2VybmVsIG9yIG1vZHVsZXMgaW4gYW55IHdheS5cblxuQ29uc2VxdWVudGx5LCBgV29ydGhGdXp6aW5nYCBtdXN0IGJlIGBmYWxzZWAgaW4gdGhpcyBjYXNlLlxuXG5CZWZvcmUgSSBmaW5hbGl6ZSB0aGUgcmVzcG9uc2UsIEkgc2hvdWxkIGFsc28gY29uZmlybSB0aGUgZm9ybWF0IGZvciByZXR1cm5pbmcgdGhlIHJlc3VsdHMuIEkgc2hvdWxkIHByb2JhYmx5IGRvdWJsZS1jaGVjayB0aGUgcmVxdWlyZW1lbnQgZm9yIHRoZSBgRm9jdXNTeW1ib2xzYCBhbmQgYEVuYWJsZUNvbmZpZ3NgIGFycmF5cy4gQWgsIHllcywgaWYgYFdvcnRoRnV6emluZz1mYWxzZWAsIHRoZXkgc2hvdWxkIGJlIHNldCB0byBlbXB0eSBhcnJheXMsIHdoaWNoIGlzIHRoZSBzdGFuZGFyZCBwcm9jZWR1cmUuIERvbmUhXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNDgzLCJPdXRwdXRUb2tlbnMiOjg2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDY0LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDE6MjQ6MDQuMzQzOTUxNjg0WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNzIxMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW10sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBvbmx5IHVzZXItc3BhY2UgdG9vbHMgYW5kIHNlbGZ0ZXN0cyB1bmRlciB0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLiBJdCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xzIGFuZCBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbCBjb2RlIG9yIGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDAxOjI0OjA0LjM0Mzk4Mzg4NFoiLCJTZXEiOjUsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyODIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow9k4hn[1] Phase: Running StartedAt: 2026-09-07 01:24:15 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9k4hn[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-09-07 01:24:15 +0000 UTC FinishedAt: 2026-09-07 01:24:19 +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,}