From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ronald Rojas Subject: [PATCH RFC 58/59] remove irrelevant files from old repository Date: Wed, 28 Dec 2016 20:14:51 -0500 Message-ID: <1482974092-15891-58-git-send-email-ronladred@gmail.com> References: <1482974092-15891-1-git-send-email-ronladred@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1482974092-15891-1-git-send-email-ronladred@gmail.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: xen-devel , Ian Jackson , Wei Liu , George Dunlap , George Dunlap Cc: Ronald Rojas List-Id: xen-devel@lists.xenproject.org U2lnbmVkLW9mZi1ieTogUm9uYWxkIFJvamFzIDxyb25sYWRyZWRAZ21haWwuY29tPgotLS0KIE1h a2VmaWxlICAgICAgICAgICAgICAgICAgICAgICB8ICAzMSAtLQogYmVuY2htYXJrLmdvICAgICAg ICAgICAgICAgICAgIHwgNDY3IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBodG1scmVwb3J0 LmdvICAgICAgICAgICAgICAgICAgfCAyMzggLS0tLS0tLS0tLS0tLS0KIGxpYnhsLmdvICAgICAg ICAgICAgICAgICAgICAgICB8IDcyMCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQogbWFpbi5nbyAgICAgICAgICAgICAgICAgICAgICAgIHwgMTQ2IC0tLS0tLS0tLQog cGxhbi5nbyAgICAgICAgICAgICAgICAgICAgICAgIHwgMTU3IC0tLS0tLS0tLQogcHJvY2Vzc3dv cmtlci5nbyAgICAgICAgICAgICAgIHwgIDk4IC0tLS0tLQogcnVuLmdvICAgICAgICAgICAgICAg ICAgICAgICAgIHwgNDU2IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdHVicy5nbyAgICAg ICAgICAgICAgICAgICAgICAgfCAgMzQgLS0KIHRvb2xzL2dvbGFuZy94ZW5saWdodC9saWJ4bC5n byB8IDcyMCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogeGVud29y a2VyLmdvICAgICAgICAgICAgICAgICAgIHwgMjc4IC0tLS0tLS0tLS0tLS0tLS0KIDExIGZpbGVz IGNoYW5nZWQsIDcyMCBpbnNlcnRpb25zKCspLCAyNjI1IGRlbGV0aW9ucygtKQogZGVsZXRlIG1v ZGUgMTAwNjQ0IE1ha2VmaWxlCiBkZWxldGUgbW9kZSAxMDA2NDQgYmVuY2htYXJrLmdvCiBkZWxl dGUgbW9kZSAxMDA2NDQgaHRtbHJlcG9ydC5nbwogZGVsZXRlIG1vZGUgMTAwNjQ0IGxpYnhsLmdv CiBkZWxldGUgbW9kZSAxMDA2NDQgbWFpbi5nbwogZGVsZXRlIG1vZGUgMTAwNjQ0IHBsYW4uZ28K IGRlbGV0ZSBtb2RlIDEwMDY0NCBwcm9jZXNzd29ya2VyLmdvCiBkZWxldGUgbW9kZSAxMDA2NDQg cnVuLmdvCiBkZWxldGUgbW9kZSAxMDA2NDQgc3R1YnMuZ28KIGNyZWF0ZSBtb2RlIDEwMDY0NCB0 b29scy9nb2xhbmcveGVubGlnaHQvbGlieGwuZ28KIGRlbGV0ZSBtb2RlIDEwMDY0NCB4ZW53b3Jr ZXIuZ28KCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCA2OTljYzUzLi4wMDAwMDAwCi0tLSBhL01ha2VmaWxlCisrKyAvZGV2L251 bGwKQEAgLTEsMzEgKzAsMCBAQAotQklOID0gc2NoZWRiZW5jaAotQklOQUxMID0gJChCSU4pCi0K LS5QSE9OWTogYWxsCi1hbGw6ICQoQklOKQotCi0KLQotQ0dPX0NGTEFHUyA9IC1JL2J1aWxkL2hn L3hlbi5naXQvZGlzdC9pbnN0YWxsL3Vzci9sb2NhbC9pbmNsdWRlCi0KLSMgRklYTUUKLVhFTkxJ Ql9QQVRIID89IC9idWlsZC9oZy94ZW4uZ2l0L2Rpc3QvaW5zdGFsbC91c3IvbG9jYWwvbGliLwot Q0dPX0xERkxBR1MgPSAtTCQoWEVOTElCX1BBVEgpIC1XbCwtcnBhdGgtbGluaz0kKFhFTkxJQl9Q QVRIKSAKLQotc2NoZWRiZW5jaDogbWFpbi5nbyBwcm9jZXNzd29ya2VyLmdvIHhlbndvcmtlci5n byBiZW5jaG1hcmsuZ28gcnVuLmdvIGxpYnhsLmdvIGh0bWxyZXBvcnQuZ28gcGxhbi5nbwotCUNH T19MREZMQUdTPSIkKENHT19MREZMQUdTKSIgQ0dPX0NGTEFHUz0iJChDR09fQ0ZMQUdTKSIgZ28g YnVpbGQgLWxkZmxhZ3MgJy1saW5rbW9kZSBleHRlcm5hbCAtZXh0bGRmbGFncyAiLXN0YXRpYyIn IC1vICRAICReCi0KLSMgSWYgd2UgdXNlIGEgc3RhdGljYWxseSBsaW5rZWQgYmluYXJ5IHdlIGRv bid0IG5lZWQgdGhpczsgdGhlIHNhbWUKLSMgYmluYXJ5IGNhbiBiZSB1c2VkIG9uIGFueSBzeXN0 ZW0uICBLZWVwIHRoaXMgdmVyc2lvbiAod2l0aG91dCBhbnkKLSMgcnVuIHN1cHBvcnQpIHN1cHBv cnQpIGFyb3VuZCBmb3Igbm93IGluIGNhc2Ugd2Ugd2FudCB0byBnbyBiYWNrIHRvCi0jIGl0Lgot c2NoZWRiZW5jaC1yZXBvcnQ6IG1haW4uZ28gYmVuY2htYXJrLmdvIHN0dWJzLmdvIGh0bWxyZXBv cnQuZ28gcGxhbi5nbwotCWdvIGJ1aWxkIC1vICRAICReCi0KLS5QSE9OWTogY2xlYW4KLWNsZWFu OgotCXJtIC1mICQoQklOQUxMKQotCi0uUEhPTlk6IGRpc3QKLWRpc3Q6Ci0JY3AgJChCSU4pICQo RElTVERJUikKZGlmZiAtLWdpdCBhL2JlbmNobWFyay5nbyBiL2JlbmNobWFyay5nbwpkZWxldGVk IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJlMmRmYi4uMDAwMDAwMAotLS0gYS9iZW5jaG1hcmsu Z28KKysrIC9kZXYvbnVsbApAQCAtMSw0NjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykg MjAxNiBHZW9yZ2UgVy4gRHVubGFwLCBDaXRyaXggU3lzdGVtcyBVSyBMdGQKLSAqCi0gKiBUaGlz IHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y Ci0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247 IHZlcnNpb24gMiBvZiB0aGUKLSAqIExpY2Vuc2Ugb25seS4KLSAqCi0gKiBUaGlzIHByb2dyYW0g aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0g KiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5 IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP U0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh aWxzLgotICogCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5v dCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZy YW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVT QS4KLSAqLwotcGFja2FnZSBtYWluCi0KLWltcG9ydCAoCi0JImZtdCIKLQkib3MiCi0JImlvL2lv dXRpbCIKLQkiZW5jb2RpbmcvanNvbiIKLQkibWF0aCIKLQkidGltZSIKLSkKLQotdHlwZSBXb3Jr ZXJJZCBzdHJ1Y3QgewotCVNldCBpbnQKLQlJZCBpbnQKLX0KLQotZnVuYyAod2lkIFdvcmtlcklk KSBTdHJpbmcoKSAoc3RyaW5nKSB7Ci0JcmV0dXJuIGZtdC5TcHJpbnRmKCIlZDolZCIsIHdpZC5T ZXQsIHdpZC5JZCkKLX0KLQotdHlwZSBXb3JrZXJSZXBvcnQgc3RydWN0IHsKLQlJZCBXb3JrZXJJ ZAotCU5vdyBpbnQKLQlLb3BzIGludAotCU1heERlbHRhIGludAotCUNwdXRpbWUgdGltZS5EdXJh dGlvbgotfQotCi10eXBlIFdvcmtlclBhcmFtcyBzdHJ1Y3QgewotCUFyZ3MgW11zdHJpbmcKLX0K LQotZnVuYyAobCAqV29ya2VyUGFyYW1zKSBTZXRrSFooa0haIHVpbnQ2NCkgewotCWlmIGwuQXJn c1swXSA9PSAia0haIiB7Ci0JCWwuQXJnc1sxXSA9IGZtdC5TcHJpbnRmKCIlZCIsIGtIWikKLQl9 IGVsc2UgewotCQlsLkFyZ3MgPSBhcHBlbmQoW11zdHJpbmd7ImtIWiIsIGZtdC5TcHJpbnRmKCIl ZCIsIGtIWil9LCBsLkFyZ3MuLi4pCi0JfQotfQotCi10eXBlIFdvcmtlckNvbmZpZyBzdHJ1Y3Qg ewotCVBvb2wgc3RyaW5nCi0JU29mdEFmZmluaXR5IHN0cmluZwotfQotCi0vLyBQcm9wYWdhdGUg dW5zZXQgdmFsdWVzIGZyb20gYSBoaWdoZXIgbGV2ZWwKLWZ1bmMgKGwgKldvcmtlckNvbmZpZykg UHJvcGFnYXRlRnJvbShnIFdvcmtlckNvbmZpZykgewotCWlmIGwuUG9vbCA9PSAiIiB7Ci0JCWwu UG9vbCA9IGcuUG9vbAotCX0KLX0KLQotdHlwZSBXb3JrZXJTZXQgc3RydWN0IHsKLQlQYXJhbXMg V29ya2VyUGFyYW1zCi0JQ29uZmlnIFdvcmtlckNvbmZpZwotCUNvdW50IGludAotfQotCi1jb25z dCAoCi0JVVNFQyA9IDEwMDAKLQlNU0VDID0gVVNFQyAqIDEwMDAKLQlTRUMgPSBNU0VDICogMTAw MAotKQotCi1mdW5jIFRocm91Z2hwdXQobHQgaW50LCBsbSBpbnQsIHQgaW50LCBtIGludCkgKHRw dXQgZmxvYXQ2NCkgewotCXRpbWUgOj0gZmxvYXQ2NCh0IC0gbHQpIC8gU0VDCi0Ja29wcyA6PSBt IC0gbG0KLQkKLQl0cHV0ID0gZmxvYXQ2NChrb3BzKSAvIHRpbWUKLQlyZXR1cm4KLX0KLQotZnVu YyBVdGlsaXphdGlvbihsdCBpbnQsIGxjdCB0aW1lLkR1cmF0aW9uLCB0IGludCwgY3QgdGltZS5E dXJhdGlvbikgKHV0aWwgZmxvYXQ2NCkgewotCXV0aWwgPSBmbG9hdDY0KGN0IC0gbGN0KSAvIGZs b2F0NjQodCAtIGx0KQotCXJldHVybgotfQotCi10eXBlIE1pbk1heCBzdHJ1Y3QgewotCU1pbiBm bG9hdDY0Ci0JTWF4IGZsb2F0NjQKLX0KLQotZnVuYyAobW0gKk1pbk1heCkgVXBkYXRlKHggZmxv YXQ2NCkgewotCWlmIHggPiBtbS5NYXggewotCQltbS5NYXggPSB4Ci0JfQotCWlmIHggPCBtbS5N aW4gfHwgbW0uTWluID09IDAgewotCQltbS5NaW4gPSB4Ci0JfQotfQotCi10eXBlIFdvcmtlclN1 bW1hcnkgc3RydWN0IHsKLQlSYXcgW11Xb3JrZXJSZXBvcnQKLQlNaW5NYXhUcHV0IE1pbk1heAot CU1pbk1heFV0aWwgTWluTWF4Ci0JVG90YWxUcHV0IGludAotCVRvdGFsVGltZSB0aW1lLkR1cmF0 aW9uCi0JVG90YWxDcHV0aW1lIHRpbWUuRHVyYXRpb24KLQlBdmdUcHV0IGZsb2F0NjQKLQlBdmdV dGlsIGZsb2F0NjQKLX0KLQotdHlwZSBXb3JrZXJTZXRTdW1tYXJ5IHN0cnVjdCB7Ci0JV29ya2Vy cyAgICBbXVdvcmtlclN1bW1hcnkKLQlUb3RhbFRwdXQgICAgIGZsb2F0NjQKLQlBdmdBdmdUcHV0 ICAgIGZsb2F0NjQKLQlNaW5NYXhUcHV0ICAgIE1pbk1heAotCU1pbk1heEF2Z1RwdXQgTWluTWF4 Ci0JQXZnU3RkRGV2VHB1dCBmbG9hdDY0Ci0KLQlUb3RhbFV0aWwgICAgIGZsb2F0NjQKLQlNaW5N YXhVdGlsICAgIE1pbk1heAotCU1pbk1heEF2Z1V0aWwgTWluTWF4Ci0JQXZnQXZnVXRpbCAgICBm bG9hdDY0Ci0JQXZnU3RkRGV2VXRpbCBmbG9hdDY0Ci19Ci0KLXR5cGUgQmVuY2htYXJrUnVuRGF0 YSBzdHJ1Y3QgewotCVJhdyBbXVdvcmtlclJlcG9ydCAgICAgICBganNvbjoiLG9taXRlbXB0eSJg Ci0JU3VtbWFyeSBbXVdvcmtlclNldFN1bW1hcnkgIGBqc29uOiIsb21pdGVtcHR5ImAKLX0KLQot dHlwZSBSdW5Db25maWcgc3RydWN0IHsKLQlTY2hlZHVsZXIgc3RyaW5nCi0JUG9vbCBzdHJpbmcK LQlDcHVzIFtdaW50Ci0JTnVtYURpc2FibGUgKmJvb2wgYGpzb246IixvbWl0ZW1wdHkiYAotfQot Ci0vLyBQcm9wYWdhdGUgdW5zZXQgdmFsdWVzIGZyb20gYSBoaWdoZXIgbGV2ZWwKLWZ1bmMgKGwg KlJ1bkNvbmZpZykgUHJvcGFnYXRlRnJvbShnIFJ1bkNvbmZpZykgewotCWlmIGwuUG9vbCA9PSAi IiB7Ci0JCWwuUG9vbCA9IGcuUG9vbAotCX0KLQlpZiBsLlNjaGVkdWxlciA9PSAiIiB7Ci0JCWwu U2NoZWR1bGVyID0gZy5TY2hlZHVsZXIKLQl9Ci0JaWYgbC5DcHVzID09IG5pbCB7Ci0JCWwuQ3B1 cyA9IGcuQ3B1cwotCX0KLQlpZiBsLk51bWFEaXNhYmxlID09IG5pbCB7Ci0JCWwuTnVtYURpc2Fi bGUgPSBnLk51bWFEaXNhYmxlCi0JfQotfQotCi10eXBlIEJlbmNobWFya1J1biBzdHJ1Y3Qgewot CUxhYmVsIHN0cmluZwotCVdvcmtlclNldHMgW11Xb3JrZXJTZXQKLQlXb3JrZXJDb25maWcKLQlS dW5Db25maWcKLQlSdW50aW1lU2Vjb25kcyBpbnQKLQlDb21wbGV0ZWQgYm9vbAotCVJlc3VsdHMg QmVuY2htYXJrUnVuRGF0YSAKLX0KLQotdHlwZSBCZW5jaG1hcmtQbGFuIHN0cnVjdCB7Ci0JSW5w dXQgKlBsYW5JbnB1dCAgICAgYGpzb246IixvbWl0ZW1wdHkiYAotCWZpbGVuYW1lIHN0cmluZyAg ICAgIGBqc29uOiIsb21pdGVtcHR5ImAKLQlXb3JrZXJUeXBlIGludCAgICAgICBganNvbjoiLG9t aXRlbXB0eSJgCi0JLy8gR2xvYmFsIG9wdGlvbnMgZm9yIHdvcmtlcnMgdGhhdCB3aWxsIGJlIG92 ZXItcmlkZGVuIGJ5IFJ1bgotCS8vIGFuZCBXb3JrZXJTZXQgY29uZmlnIG9wdGlvbnMKLQlXb3Jr ZXJDb25maWcgICAgICAgICBganNvbjoiLG9taXRlbXB0eSJgCi0JUnVuQ29uZmlnIFJ1bkNvbmZp ZyAgIGBqc29uOiIsb21pdGVtcHR5ImAKLQlSdW5zIFtdQmVuY2htYXJrUnVuICBganNvbjoiLG9t aXRlbXB0eSJgCi19Ci0KLWZ1bmMgKHJ1biAqQmVuY2htYXJrUnVuKSBjaGVja1N1bW1hcnkoKSAo ZG9uZSBib29sLCBlcnIgZXJyb3IpIHsKLQlpZiBydW4uUmVzdWx0cy5TdW1tYXJ5ICE9IG5pbCB7 Ci0JCWRvbmUgPSB0cnVlCi0JCXJldHVybiAKLQl9Ci0JCi0JcmV0dXJuCi19Ci0KLWZ1bmMgKHJ1 biAqQmVuY2htYXJrUnVuKSBQcm9jZXNzKCkgKGVyciBlcnJvcikgewotCWRvbmUsIGVyciA6PSBy dW4uY2hlY2tTdW1tYXJ5KCkKLQlpZiBkb25lIHx8IGVyciAhPSBuaWwgewotCQlyZXR1cm4KLQl9 Ci0KLQlydW4uUmVzdWx0cy5TdW1tYXJ5ID0gbWFrZShbXVdvcmtlclNldFN1bW1hcnksIGxlbihy dW4uV29ya2VyU2V0cykpCi0KLQl0eXBlIERhdGEgc3RydWN0ewotCQlzdGFydFRpbWUgaW50Ci0J CXN0YXJ0Q3B1dGltZSB0aW1lLkR1cmF0aW9uCi0JCWxhc3RUaW1lIGludAotCQlsYXN0S29wcyBp bnQKLQkJbGFzdENwdXRpbWUgdGltZS5EdXJhdGlvbgotCX0KLQkKLQlkYXRhIDo9IG1ha2UobWFw W1dvcmtlcklkXSpEYXRhKQotCi0JLy8gRklYTUU6IEZpbHRlciBvdXQgcmVzdWx0cyB3aGljaCBz dGFydGVkIGJlZm9yZSBhbGwgaGF2ZSBzdGFydGVkCi0JZm9yIGkgOj0gcmFuZ2UgcnVuLlJlc3Vs dHMuUmF3IHsKLQkJZSA6PSBydW4uUmVzdWx0cy5SYXdbaV0KLQotCQlpZiBlLklkLlNldCA+IGxl bihydW4uUmVzdWx0cy5TdW1tYXJ5KSB7Ci0JCQlyZXR1cm4gZm10LkVycm9yZigiSW50ZXJuYWwg ZXJyb3I6IGUuSWQuU2V0ICVkID4gbGVuKFJlc3VsdHMuU3VtbWFyeSkgJWRcbiIsCi0JCQkJZS5J ZC5TZXQsIGxlbihydW4uUmVzdWx0cy5TdW1tYXJ5KSkKLQkJfQotCQkKLQkJaWYgcnVuLlJlc3Vs dHMuU3VtbWFyeVtlLklkLlNldF0uV29ya2VycyA9PSBuaWwgewotCQkJcnVuLlJlc3VsdHMuU3Vt bWFyeVtlLklkLlNldF0uV29ya2VycyA9IG1ha2UoW11Xb3JrZXJTdW1tYXJ5LAotCQkJCXJ1bi5X b3JrZXJTZXRzW2UuSWQuU2V0XS5Db3VudCkKLQkJfQotCi0JCXdzIDo9ICZydW4uUmVzdWx0cy5T dW1tYXJ5W2UuSWQuU2V0XQotCi0JCWlmIGUuSWQuSWQgPiBsZW4od3MuV29ya2VycykgewotCQkJ cmV0dXJuIGZtdC5FcnJvcmYoIkludGVybmFsIGVycm9yOiBlLklkLklkICVkID4gbGVuKFJlc3Vs dHMuU3VtbWFyeVtdLldvcmtlcnMpICVkXG4iLAotCQkJCWUuSWQuSWQsIGxlbih3cy5Xb3JrZXJz KSkKLQkJfQotCi0JCXMgOj0gJndzLldvcmtlcnNbZS5JZC5JZF0KLQotCQlzLlJhdyA9IGFwcGVu ZChzLlJhdywgZSkKLQkJCi0JCWQgOj0gZGF0YVtlLklkXQotCQlpZiBkID09IG5pbCB7Ci0JCQlk ID0gJkRhdGF7fQotCQkJZGF0YVtlLklkXSA9IGQKLQkJfQotCQkJCi0JCWlmIGQuc3RhcnRUaW1l ID09IDAgewotCQkJZC5zdGFydFRpbWUgPSBlLk5vdwotCQkJZC5zdGFydENwdXRpbWUgPSBlLkNw dXRpbWUKLQkJfSBlbHNlIHsKLQkJCXRwdXQgOj0gVGhyb3VnaHB1dChkLmxhc3RUaW1lLCBkLmxh c3RLb3BzLCBlLk5vdywgZS5Lb3BzKQotCQkJdXRpbCA6PSBVdGlsaXphdGlvbihkLmxhc3RUaW1l LCBkLmxhc3RDcHV0aW1lLCBlLk5vdywgZS5DcHV0aW1lKQotCi0JCQlzLk1pbk1heFRwdXQuVXBk YXRlKHRwdXQpCi0JCQlzLk1pbk1heFV0aWwuVXBkYXRlKHV0aWwpCi0JCQl3cy5NaW5NYXhUcHV0 LlVwZGF0ZSh0cHV0KQotCQkJd3MuTWluTWF4VXRpbC5VcGRhdGUodXRpbCkKLQkJfQotCQlkLmxh c3RUaW1lID0gZS5Ob3cKLQkJZC5sYXN0S29wcyA9IGUuS29wcwotCQlkLmxhc3RDcHV0aW1lID0g ZS5DcHV0aW1lCi0JfQotCi0JZm9yIElkLCBkIDo9IHJhbmdlIGRhdGEgewotCQl3cyA6PSAmcnVu LlJlc3VsdHMuU3VtbWFyeVtJZC5TZXRdCi0JCXMgOj0gJndzLldvcmtlcnNbSWQuSWRdCi0KLQkJ cy5Ub3RhbFRwdXQgPSBkLmxhc3RLb3BzCi0JCXMuVG90YWxUaW1lID0gdGltZS5EdXJhdGlvbihk Lmxhc3RUaW1lIC0gZC5zdGFydFRpbWUpCi0JCXMuVG90YWxDcHV0aW1lID0gZC5sYXN0Q3B1dGlt ZSAtIGQuc3RhcnRDcHV0aW1lCi0JCQotCQlzLkF2Z1RwdXQgPSBUaHJvdWdocHV0KGQuc3RhcnRU aW1lLCAwLCBkLmxhc3RUaW1lLCBkLmxhc3RLb3BzKQotCQlzLkF2Z1V0aWwgPSBVdGlsaXphdGlv bihkLnN0YXJ0VGltZSwgZC5zdGFydENwdXRpbWUsIGQubGFzdFRpbWUsIGQubGFzdENwdXRpbWUp Ci0KLQkJd3MuTWluTWF4QXZnVHB1dC5VcGRhdGUocy5BdmdUcHV0KQotCQl3cy5NaW5NYXhBdmdV dGlsLlVwZGF0ZShzLkF2Z1V0aWwpCi0JfQotCi0JLy8gQ2FsY3VsYXRlIHRoZSBhdmVyYWdlLW9m LWF2ZXJhZ2VzIGZvciBlYWNoIHNldAotCWZvciBzZXQgOj0gcmFuZ2UgcnVuLlJlc3VsdHMuU3Vt bWFyeSB7Ci0JCXdzIDo9ICZydW4uUmVzdWx0cy5TdW1tYXJ5W3NldF0KLQkJCi0JCXZhciB0b3Rh bFRwdXQgZmxvYXQ2NAotCQl2YXIgdG90YWxVdGlsIGZsb2F0NjQKLQkJdmFyIGNvdW50IGludAot CQlmb3IgaWQgOj0gcmFuZ2Ugd3MuV29ya2VycyB7Ci0JCQl0b3RhbFRwdXQgKz0gd3MuV29ya2Vy c1tpZF0uQXZnVHB1dAotCQkJdG90YWxVdGlsICs9IHdzLldvcmtlcnNbaWRdLkF2Z1V0aWwKLQkJ CWNvdW50KysKLQkJfQotCi0JCS8vIEZJWE1FIC0tIElzIHRoaXMgbGVnaXQ/Ci0JCXdzLlRvdGFs VHB1dCA9IHRvdGFsVHB1dAotCQl3cy5Ub3RhbFV0aWwgPSB0b3RhbFV0aWwKLQkJd3MuQXZnQXZn VHB1dCA9IHRvdGFsVHB1dCAvIGZsb2F0NjQoY291bnQpCi0JCXdzLkF2Z0F2Z1V0aWwgPSB0b3Rh bFV0aWwgLyBmbG9hdDY0KGNvdW50KQotCX0KLQotCS8vIFRoZW4gY2FsY3VsYXRlIHRoZSBzdGFu ZGFyZCBkZXZpYXRpb24KLQlmb3Igc2V0IDo9IHJhbmdlIHJ1bi5SZXN1bHRzLlN1bW1hcnkgewot CQl3cyA6PSAmcnVuLlJlc3VsdHMuU3VtbWFyeVtzZXRdCi0JCQotCQl2YXIgdG90YWxBdmdUcHV0 IGZsb2F0NjQKLQkJdmFyIHRvdGFsQXZnVXRpbCBmbG9hdDY0Ci0JCXZhciBjb3VudCBpbnQKLQkJ Ci0JCWZvciBpZCA6PSByYW5nZSB3cy5Xb3JrZXJzIHsKLQkJCWQxIDo9IHdzLldvcmtlcnNbaWRd LkF2Z1RwdXQgLSB3cy5BdmdBdmdUcHV0Ci0JCQlkMiA6PSB3cy5Xb3JrZXJzW2lkXS5BdmdVdGls IC0gd3MuQXZnQXZnVXRpbAotCQkJdG90YWxBdmdUcHV0ICs9IGQxICogZDEKLQkJCXRvdGFsQXZn VXRpbCArPSBkMiAqIGQyCi0JCQljb3VudCsrCi0JCX0KLQkJdjEgOj0gdG90YWxBdmdUcHV0IC8g ZmxvYXQ2NChjb3VudCkKLQkJdjIgOj0gdG90YWxBdmdVdGlsIC8gZmxvYXQ2NChjb3VudCkKLQkJ d3MuQXZnU3RkRGV2VHB1dCA9IG1hdGguU3FydCh2MSkKLQkJd3MuQXZnU3RkRGV2VXRpbCA9IG1h dGguU3FydCh2MikKLQl9Ci0KLQlyZXR1cm4KLX0KLQotZnVuYyAocnVuICpCZW5jaG1hcmtSdW4p IFRleHRSZXBvcnQobGV2ZWwgaW50KSAoZXJyIGVycm9yKSB7Ci0JdmFyIGRvbmUgYm9vbAotCWRv bmUsIGVyciA9IHJ1bi5jaGVja1N1bW1hcnkoKQotCWlmIGVyciAhPSBuaWwgewotCQlyZXR1cm4K LQl9Ci0JaWYgISBkb25lIHsKLQkJZXJyID0gZm10LkVycm9yZigiUnVuIG5vdCB5ZXQgcHJvY2Vz c2VkIikKLQkJcmV0dXJuCi0JfQotCi0JZm10LlByaW50ZigiPT0gUlVOICVzID09XG4iLCBydW4u TGFiZWwpCi0KLQlmb3Igc2V0IDo9IHJhbmdlIHJ1bi5Xb3JrZXJTZXRzIHsKLQkJd3MgOj0gJnJ1 bi5Xb3JrZXJTZXRzW3NldF0KLQkJcGFyYW1zIDo9ICIiCi0JCWZvciBfLCBzIDo9IHJhbmdlIHdz LlBhcmFtcy5BcmdzIHsKLQkJCXBhcmFtcyA9IGZtdC5TcHJpbnRmKCIlcyAlcyIsIHBhcmFtcywg cykKLQkJfQotCQlmbXQuUHJpbnRmKCJTZXQgJWQ6ICVzXG4iLCBzZXQsIHBhcmFtcykKLQl9Ci0K LQlmbXQuUHJpbnRmKCJcbiU4cyAlOHMgJThzICU4cyAlOHMgJThzICU4cyAlOHMgJThzICU4cyAl OHMgJThzICU4cyAlOHMgJThzXG4iLCAic2V0IiwgInR0b3RhbCIsICJ0YXZnYXZnIiwgInRzdGRl diIsICJ0YXZnbWF4IiwgInRhdmdtaW4iLCAidHRvdG1heCIsICJ0dG90bWluIiwgInV0b3RhbCIs ICJ1YXZnYXZnIiwgInVzdGRldiIsICJ1YXZnbWF4IiwgInVhdmdtaW4iLCAidXRvdG1heCIsICJ1 dG90bWluIikKLQlmb3Igc2V0IDo9IHJhbmdlIHJ1bi5Xb3JrZXJTZXRzIHsKLQkJd3MgOj0gJnJ1 bi5SZXN1bHRzLlN1bW1hcnlbc2V0XQotCQlmbXQuUHJpbnRmKCIlOGQgJTguMmYgJTguMmYgJTgu MmYgJTguMmYgJTguMmYgJTguMmYgJTguMmYgJTguMmYgJTguMmYgJTguMmYgJTguMmYgJTguMmYg JTguMmYgJTguMmZcbiIsCi0JCQlzZXQsCi0JCQl3cy5Ub3RhbFRwdXQsIHdzLkF2Z0F2Z1RwdXQs IHdzLkF2Z1N0ZERldlRwdXQsIHdzLk1pbk1heEF2Z1RwdXQuTWF4LAotCQkJd3MuTWluTWF4QXZn VHB1dC5NaW4sIHdzLk1pbk1heFRwdXQuTWF4LCB3cy5NaW5NYXhUcHV0Lk1pbiwKLQkJCXdzLlRv dGFsVXRpbCwgd3MuQXZnQXZnVXRpbCwgd3MuQXZnU3RkRGV2VXRpbCwgd3MuTWluTWF4QXZnVXRp bC5NYXgsCi0JCQl3cy5NaW5NYXhBdmdVdGlsLk1pbiwgd3MuTWluTWF4VXRpbC5NYXgsIHdzLk1p bk1heFV0aWwuTWluKQotCX0KLQotCWlmIGxldmVsID49IDEgewotIAkJZm10LlByaW50ZigiXG4l OHMgJThzICU4cyAlOHMgJThzICU4cyAlOHMgJThzICU4cyAlOHNcbiIsICJ3b3JrZXJpZCIsICJ0 b3B1dCIsICJ0aW1lIiwgImNwdSIsICJ0YXZnIiwgInRtaW4iLCAidG1heCIsICJ1YXZnIiwgInVt aW4iLCAidW1heCIpCi0JCWZvciBzZXQgOj0gcmFuZ2UgcnVuLlJlc3VsdHMuU3VtbWFyeSB7Ci0J CQlmb3IgaWQgOj0gcmFuZ2UgcnVuLlJlc3VsdHMuU3VtbWFyeVtzZXRdLldvcmtlcnMgewotCQkJ CXMgOj0gcnVuLlJlc3VsdHMuU3VtbWFyeVtzZXRdLldvcmtlcnNbaWRdCi0JCQkJZm10LlByaW50 ZigiJTJkOiUyZCAgICAlMTBkICU4LjJmICU4LjJmICU4LjJmICU4LjJmICU4LjJmICU4LjJmICU4 LjJmICU4LjJmXG4iLAotCQkJCQlzZXQsIGlkLAotCQkJCQlzLlRvdGFsVHB1dCwgcy5Ub3RhbFRp bWUuU2Vjb25kcygpLCBzLlRvdGFsQ3B1dGltZS5TZWNvbmRzKCksCi0JCQkJCXMuQXZnVHB1dCwg cy5NaW5NYXhUcHV0Lk1pbiwgcy5NaW5NYXhUcHV0Lk1heCwKLQkJCQkJcy5BdmdVdGlsLCBzLk1p bk1heFV0aWwuTWluLCBzLk1pbk1heFV0aWwuTWF4KQotCi0JCQkJaWYgbGV2ZWwgPj0gMiB7Ci0J CQkJCXZhciBsZSBXb3JrZXJSZXBvcnQKLQkJCQkJZm9yIF8sIGUgOj0gcmFuZ2Ugcy5SYXcgewot CQkJCQkJdmFyIGR0aW1lIGZsb2F0NjQKLQkJCQkJCXZhciBkQ3B1dGltZSB0aW1lLkR1cmF0aW9u Ci0JCQkJCQl2YXIgZEtvcHMgaW50Ci0JCQkJCQl0aW1lIDo9IGZsb2F0NjQoZS5Ob3cpIC8gU0VD Ci0JCQkJCQlpZiBlLk5vdyA+IGxlLk5vdyB7Ci0JCQkJCQkJZHRpbWUgPSBmbG9hdDY0KGUuTm93 IC0gbGUuTm93KSAvIFNFQwotCQkJCQkJCWRDcHV0aW1lID0gZS5DcHV0aW1lIC0gbGUuQ3B1dGlt ZQotCQkJCQkJCWRLb3BzID0gZS5Lb3BzIC0gbGUuS29wcwotCi0JCQkJCQl9Ci0JCQkJCQlmbXQu UHJpbnRmICgiICAgWyU4LjNmXSAoJTguM2YpICU4LjNmICglOC4zZikgJThkICglOGQpICUxMmRc biIsCi0JCQkJCQkJdGltZSwgZHRpbWUsCi0JCQkJCQkJZS5DcHV0aW1lLlNlY29uZHMoKSwgZENw dXRpbWUuU2Vjb25kcygpLAotCQkJCQkJCWUuS29wcywgZEtvcHMsIGUuTWF4RGVsdGEpCi0JCQkJ CQlsZSA9IGUKLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9Ci0JfQotCi0JZm10LlByaW50Zigi XG5cbiIpCi0KLQlyZXR1cm4KLX0KLQotZnVuYyBMb2FkQmVuY2htYXJrKGZpbGVuYW1lIHN0cmlu ZykgKHBsYW4gQmVuY2htYXJrUGxhbiwgZXJyIGVycm9yKSB7Ci0JcGxhbi5maWxlbmFtZSA9IGZp bGVuYW1lCi0JCi0JdmFyIGIgW11ieXRlCi0JYiwgZXJyID0gaW91dGlsLlJlYWRGaWxlKGZpbGVu YW1lKQotCWlmIGVyciAhPSBuaWwgewotCQlyZXR1cm4KLQl9Ci0JCi0JZXJyID0ganNvbi5Vbm1h cnNoYWwoYiwgJnBsYW4pCi0JaWYgZXJyICE9IG5pbCB7Ci0JCXJldHVybgotCX0KLQotCXJldHVy bgotfQotCi1mdW5jIChwbGFuICpCZW5jaG1hcmtQbGFuKSBTYXZlKCkgKGVyciBlcnJvcikgewot CWlmIHBsYW4uZmlsZW5hbWUgPT0gIiIgewotCQllcnIgPSBmbXQuRXJyb3JmKCJJbnZhbGlkIGZp bGVuYW1lIikKLQkJcmV0dXJuCi0JfQotCQotCXZhciBiIFtdYnl0ZQotCWIsIGVyciA9IGpzb24u TWFyc2hhbCgqcGxhbikKLQlpZiBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuCi0JfQotCi0JYmFja3Vw RmlsZW5hbWUgOj0gZm10LlNwcmludGYoIi4lcy50bXAiLCBwbGFuLmZpbGVuYW1lKQotCWVyciA9 IG9zLlJlbmFtZShwbGFuLmZpbGVuYW1lLCBiYWNrdXBGaWxlbmFtZSkKLQlpZiBlcnIgIT0gbmls IHsKLQkJaWYgb3MuSXNOb3RFeGlzdChlcnIpIHsKLQkJCWJhY2t1cEZpbGVuYW1lID0gIiIKLQkJ fSBlbHNlIHsKLQkJCXJldHVybgotCQl9Ci0JfQotCi0JZXJyID0gaW91dGlsLldyaXRlRmlsZShw bGFuLmZpbGVuYW1lLCBiLCAwNjY2KQotCWlmIGVyciAhPSBuaWwgewotCQlpZiBiYWNrdXBGaWxl bmFtZSAhPSAiIiB7Ci0JCQlvcy5SZW5hbWUoYmFja3VwRmlsZW5hbWUsIHBsYW4uZmlsZW5hbWUp Ci0JCX0KLQkJcmV0dXJuCi0JfQotCi0JaWYgYmFja3VwRmlsZW5hbWUgIT0gIiIgewotCQlvcy5S ZW1vdmUoYmFja3VwRmlsZW5hbWUpCi0JfQotCXJldHVybgotfQotCi1mdW5jIChwbGFuICpCZW5j aG1hcmtQbGFuKSBUZXh0UmVwb3J0KGxldmVsIGludCkgKGVyciBlcnJvcikgewotCWZvciBpIDo9 IHJhbmdlIHBsYW4uUnVucyB7Ci0JCXIgOj0gJnBsYW4uUnVuc1tpXQotCQlpZiAhIHIuQ29tcGxl dGVkIHsKLQkJCWZtdC5QcmludGYoIlRlc3QgWyVkXSAlcyBub3QgcnVuXG4iLCBpLCByLkxhYmVs KQotCQl9Ci0KLQkJZXJyID0gci5Qcm9jZXNzKCkKLQkJaWYgZXJyICE9IG5pbCB7Ci0JCQlmbXQu UHJpbnRmKCJFcnJvciBwcm9jZXNzaW5nIFslZF0gJXM6ICV2XG4iLCBpLCByLkxhYmVsLCBlcnIp Ci0JCQlyZXR1cm4KLQkJfQotCi0JCWVyciA9IHIuVGV4dFJlcG9ydChsZXZlbCkKLQkJaWYgZXJy ICE9IG5pbCB7Ci0JCQlyZXR1cm4KLQkJfQotCX0KLQotCXJldHVybgotfQotCmRpZmYgLS1naXQg YS9odG1scmVwb3J0LmdvIGIvaHRtbHJlcG9ydC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggNTQ1NTgyZC4uMDAwMDAwMAotLS0gYS9odG1scmVwb3J0LmdvCisrKyAvZGV2L251bGwK QEAgLTEsMjM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgR2VvcmdlIFcuIER1 bmxhcCwgQ2l0cml4IFN5c3RlbXMgVUsgTHRkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUg c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVu ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1 Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhl Ci0gKiBMaWNlbnNlIG9ubHkuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGlu IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FS UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRB QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK LSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIAotICogWW91 IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBG cmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZp ZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EuCi0gKi8KLXBhY2thZ2Ug bWFpbgotCi1pbXBvcnQgKAotCSJmbXQiCi0JIm9zIgotCSJpbyIKLQkiZW5jb2RpbmcvanNvbiIK LSkKLQotdHlwZSBPcHRpb25BeGlzIHN0cnVjdCB7Ci0JVGl0bGUgc3RyaW5nIGBqc29uOiJ0aXRs ZSxvbWl0ZW1wdHkiYAotCS8vIEFsd2F5cyBpbmNsdWRlIHRoaXMgb25lIHNvIHRoYXQgd2UgY2Fu IHN0YXJ0IGdyYXBocyBhdCAwCi0JTWluVmFsdWUgZmxvYXQ2NCBganNvbjoibWluVmFsdWUiYAot CU1heFZhbHVlIGZsb2F0NjQgYGpzb246Im1heFZhbHVlLG9taXRlbXB0eSJgCi19Ci0KLXR5cGUg T3B0aW9ucyBzdHJ1Y3QgewotCVRpdGxlIHN0cmluZyAgICAgYGpzb246InRpdGxlLG9taXRlbXB0 eSJgCi0JSEF4aXMgT3B0aW9uQXhpcyBganNvbjoiaEF4aXMiYAotCVZBeGlzIE9wdGlvbkF4aXMg YGpzb246InZBeGlzImAKLQlMZWdlbmQgc3RyaW5nICAgIGBqc29uOiJsZWdlbmQsb21pdGVtcHR5 ImAKLX0KLQotdHlwZSBQb2ludCBzdHJ1Y3QgewotCXggZmxvYXQ2NAotCXkgZmxvYXQ2NAotfQot Ci10eXBlIFJ1blJhdyBzdHJ1Y3QgewotCVRhZyBzdHJpbmcKLQlUaXRsZSBzdHJpbmcKLQloVGl0 bGUgc3RyaW5nCi0JdlRpdGxlIHN0cmluZwotCVBvaW50cyBbXVtdUG9pbnQKLX0KLQotZnVuYyAo b3B0aW9ucyAqT3B0aW9ucykgT3V0cHV0SmF2YXNjcmlwdCh3IGlvLldyaXRlciwgdGFnIHN0cmlu ZykgKGVyciBlcnJvcikgewotCXZhciBvcHRpb25zSnNvbiBbXWJ5dGUKLQlvcHRpb25zSnNvbiwg ZXJyID0ganNvbi5NYXJzaGFsKG9wdGlvbnMpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCXJldHVybgot CX0KLQotCWZtdC5GcHJpbnRmKHcsICIgICAgICAgIHZhciAlc29wdCA9ICIsIHRhZykKLQlmbXQu RnByaW50KHcsIHN0cmluZyhvcHRpb25zSnNvbikpCi0JZm10LkZwcmludGxuKHcsICI7IikKLQot CXJldHVybgotfQotCi1mdW5jIChwICpQb2ludCkgT3V0cHV0SnNvbih3IGlvLldyaXRlciwgaWQg aW50LCBtYXggaW50KSAoZXJyIGVycm9yKSB7Ci0JZm10LkZwcmludGYodywgIiAgICAgICAgICAg IFslZiIsIHAueCkKLQlmb3IgaSA6PSAwOyBpIDwgbWF4OyBpKysgewotCQlpZiBpID09IGlkIHsK LQkJCWZtdC5GcHJpbnRmKHcsICIsICVmIiwgcC55KQotCQl9IGVsc2UgewotCQkJZm10LkZwcmlu dGYodywgIiwgbnVsbCIpCi0JCX0KLQl9Ci0JZm10LkZwcmludCh3LCAiXSxcbiIpCi0JcmV0dXJu Ci19Ci0KLWZ1bmMgKGQgKlJ1blJhdykgT3V0cHV0SFRNTCh3IGlvLldyaXRlcikgKGVyciBlcnJv cikgewotCWZtdC5GcHJpbnRmKHcsICIgICAgPGRpdiBjbGFzcz0nc2NhdHRlcnBsb3QnIGlkPSdz Y2F0dGVycGxvdCVzJz48L2Rpdj5cbiIsIGQuVGFnKQotCXJldHVybgotfQotCi1mdW5jIChkICpS dW5SYXcpIE91dHB1dEphdmFzY3JpcHQodyBpby5Xcml0ZXIpIChlcnIgZXJyb3IpIHsKLQl2YXIg b3B0aW9ucyBPcHRpb25zCi0KLQlvcHRpb25zLlRpdGxlID0gZC5UaXRsZQotCW9wdGlvbnMuSEF4 aXMuVGl0bGUgPSBkLmhUaXRsZQotCW9wdGlvbnMuVkF4aXMuVGl0bGUgPSBkLnZUaXRsZQotCi0J ZXJyID0gb3B0aW9ucy5PdXRwdXRKYXZhc2NyaXB0KHcsIGQuVGFnKQotCWlmIGVyciAhPSBuaWwg ewotCQlyZXR1cm4KLQl9Ci0KLQlmbXQuUHJpbnRmKCIgICAgICAgIHZhciAlc2RhdGEgPSBuZXcg Z29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7XG4iLCBkLlRhZykKLQlmbXQuUHJpbnRm KCIgICAgICAgICVzZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUaW1lJyk7XG4iLCBkLlRhZykK LQlmb3IgaSA6PSByYW5nZSBkLlBvaW50cyB7Ci0JCWZtdC5QcmludGYoIiAgICAgICAgJXNkYXRh LmFkZENvbHVtbignbnVtYmVyJywgJ1dvcmtlciAlZCcpO1xuIiwgZC5UYWcsIGkpCi0JfQotCWZt dC5QcmludGYoIiAgICAgICAgJXNkYXRhLmFkZFJvd3MoW1xuIiwgZC5UYWcpCi0KLQkvLyBDYW4n dCB1c2UganNvbiBoZXJlIGJlY2F1c2Ugd2UgbmVlZCB0byBiZSBhYmxlIHRvIHVzZSAnbnVsbCcg Zm9yIG5vbi1leGlzdGVudCB2YWx1ZXMKLQlmb3IgaSA6PSByYW5nZSBkLlBvaW50cyB7Ci0JCWZv ciBqIDo9IHJhbmdlIGQuUG9pbnRzW2ldIHsKLQkJCWVyciA9IGQuUG9pbnRzW2ldW2pdLk91dHB1 dEpzb24odywgaSwgbGVuKGQuUG9pbnRzKSkKLQkJCWlmIGVyciAhPSBuaWwgewotCQkJCXJldHVy bgotCQkJfQotCQl9Ci0JfQotCWZtdC5QcmludCgiICAgICAgICAgIF0pO1xuIikKLQkKLQlmbXQu UHJpbnRmKCIgICAgICAgIHZhciAlc2NoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLlNj YXR0ZXJDaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2NhdHRlcnBsb3QlcycpKTtcbiIs IGQuVGFnLCBkLlRhZyk7Ci0JZm10LlByaW50ZigiICAgICAgICAlc2NoYXJ0LmRyYXcoJXNkYXRh LCAlc29wdCk7XG5cbiIsIGQuVGFnLCBkLlRhZywgZC5UYWcpCi0JCi0JcmV0dXJuCi19Ci0KLXR5 cGUgSFRNTFJlcG9ydCBzdHJ1Y3QgewotCVJhdyBbXVJ1blJhdwotfQotCi0KLWZ1bmMgKHJwdCAq SFRNTFJlcG9ydCkgT3V0cHV0KHcgaW8uV3JpdGVyKSAoZXJyIGVycm9yKSB7Ci0JLy8gUHJpbnQg c3RhcnQgLT4ganNvbiBjaGFydHMKLQlmbXQuRnByaW50KHcsCi0JCWA8aHRtbD4KLSAgPGhlYWQ+ Ci0gICAgPHN0eWxlPgotICAgICAgLnNjYXR0ZXJwbG90IHsKLSAgICAgIG1hcmdpbjphdXRvOwot ICAgICAgd2lkdGg6IDEwMHZ3OwotICAgICAgaGVpZ2h0OiA2MHZ3OwotICAgICAgfQotCi0gICAg ICAuZW1wdHkgewotICAgICAgbWFyZ2luOiBhdXRvOwotICAgICAgfQotICAgIDwvc3R5bGU+Ci0g ICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ3N0YXRp Yy5jb20vY2hhcnRzL2xvYWRlci5qcyI+PC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0 L2phdmFzY3JpcHQiPgotICAgICAgZ29vZ2xlLmNoYXJ0cy5sb2FkKCdjdXJyZW50JywgeydwYWNr YWdlcyc6Wydjb3JlY2hhcnQnXX0pOwotICAgICAgZ29vZ2xlLmNoYXJ0cy5zZXRPbkxvYWRDYWxs YmFjayhkcmF3Q2hhcnRzKTsKLSAgICAgIGZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7Ci1gKTsKLQkv LyBQcmludCBqc29uIGNoYXJ0IGNvZGUKLQlmb3IgaSA6PSByYW5nZSBycHQuUmF3IHsKLQkJZXJy ID0gcnB0LlJhd1tpXS5PdXRwdXRKYXZhc2NyaXB0KHcpCi0JCWlmIGVyciAhPSBuaWwgewotCQkJ cmV0dXJuCi0JCX0KLQl9Ci0JLy8gUHJpbnQganNvbiAtPiBodG1sCi0JZm10LkZwcmludCh3LAot CQlgICAgICAgfQotICAgIDwvc2NyaXB0PgotICA8L2hlYWQ+Ci0gIDxib2R5PgotYCk7Ci0JLy8g UHJpbnQgaHRtbAotCWZvciBpIDo9IHJhbmdlIHJwdC5SYXcgewotCQllcnIgPSBycHQuUmF3W2ld Lk91dHB1dEhUTUwodykKLQkJaWYgZXJyICE9IG5pbCB7Ci0JCQlyZXR1cm4KLQkJfQotCX0KLQkv LyBQcmludCBodG1sIC0+IGVuZAotCWZtdC5GcHJpbnQodywKLQkJYCAgPC9ib2R5PgotPC9odG1s PgotYCk7Ci0JcmV0dXJuCi19Ci0KLWZ1bmMgKHJwdCAqSFRNTFJlcG9ydCkgQWRkUnVuKHJ1biAq QmVuY2htYXJrUnVuKSAoZXJyIGVycm9yKSB7Ci0JdmFyIHRQdXQgUnVuUmF3Ci0JdmFyIFV0aWwg UnVuUmF3Ci0KLQl0UHV0LlRpdGxlID0gZm10LlNwcmludGYoIlJ1biAlcyBJbmRpdmlkdWFsIFRo cm91Z2hwdXQiLCBydW4uTGFiZWwpCi0JdFB1dC5oVGl0bGUgPSAiVGltZSAocykiCi0JdFB1dC52 VGl0bGUgPSAiVGhyb3VnaHB1dCAoa09wcykiCi0JVXRpbC5UaXRsZSA9IGZtdC5TcHJpbnRmKCJS dW4gJXMgSW5kaXZpZHVhbCBVdGlsaXphdGlvbiIsIHJ1bi5MYWJlbCkKLQlVdGlsLmhUaXRsZSA9 ICJUaW1lIChzKSIKLQlVdGlsLnZUaXRsZSA9ICJVdGlsaXphdGlvbiIKLQlmb3Igc2V0IDo9IHJh bmdlIHJ1bi5SZXN1bHRzLlN1bW1hcnkgewotCQl2YXIgaWRUcHV0IFtdUG9pbnQKLQkJdmFyIGlk VXRpbCBbXVBvaW50Ci0JCWZvciBpZCA6PSByYW5nZSBydW4uUmVzdWx0cy5TdW1tYXJ5W3NldF0u V29ya2VycyB7Ci0JCQl2YXIgbGUgV29ya2VyUmVwb3J0Ci0JCQlmb3IgXywgZSA6PSByYW5nZSBy dW4uUmVzdWx0cy5TdW1tYXJ5W3NldF0uV29ya2Vyc1tpZF0uUmF3IHsKLQkJCQlpZiBlLktvcHMg PiAwIHsKLQkJCQkJdGltZSA6PSBmbG9hdDY0KGUuTm93KSAvIFNFQwotCQkJCQl0cHV0IDo9IFRo cm91Z2hwdXQoZS5Ob3csIGUuS29wcywgbGUuTm93LCBsZS5Lb3BzKQotCQkJCQl1dGlsIDo9IFV0 aWxpemF0aW9uKGUuTm93LCBlLkNwdXRpbWUsIGxlLk5vdywgbGUuQ3B1dGltZSkKLQkJCQkJaWRU cHV0ID0gYXBwZW5kKGlkVHB1dCwgUG9pbnR7eDp0aW1lLCB5OnRwdXR9KQotCQkJCQlpZFV0aWwg PSBhcHBlbmQoaWRVdGlsLCBQb2ludHt4OnRpbWUsIHk6dXRpbH0pCi0JCQkJfQotCQkJCWxlID0g ZQotCQkJfQotCQl9Ci0JCXRQdXQuUG9pbnRzID0gYXBwZW5kKHRQdXQuUG9pbnRzLCBpZFRwdXQp Ci0JCVV0aWwuUG9pbnRzID0gYXBwZW5kKFV0aWwuUG9pbnRzLCBpZFV0aWwpCi0JfQotCXRQdXQu VGFnID0gZm10LlNwcmludGYoInJhdyVkIiwgbGVuKHJwdC5SYXcpKQotCXJwdC5SYXcgPSBhcHBl bmQocnB0LlJhdywgdFB1dCkKLQlVdGlsLlRhZyA9IGZtdC5TcHJpbnRmKCJyYXclZCIsIGxlbihy cHQuUmF3KSkKLQlycHQuUmF3ID0gYXBwZW5kKHJwdC5SYXcsIFV0aWwpCi0JcmV0dXJuCi19Ci0K LWZ1bmMgKHBsYW4gKkJlbmNobWFya1BsYW4pIEhUTUxSZXBvcnQoKSAoZXJyIGVycm9yKSB7Ci0J cnB0IDo9IEhUTUxSZXBvcnR7fQotCi0JZm9yIGkgOj0gcmFuZ2UgcGxhbi5SdW5zIHsKLQkJciA6 PSAmcGxhbi5SdW5zW2ldCi0JCWlmICEgci5Db21wbGV0ZWQgewotCQkJZm10LlByaW50ZigiVGVz dCBbJWRdICVzIG5vdCBydW5cbiIsIGksIHIuTGFiZWwpCi0JCX0KLQotCQllcnIgPSByLlByb2Nl c3MoKQotCQlpZiBlcnIgIT0gbmlsIHsKLQkJCWZtdC5QcmludGYoIkVycm9yIHByb2Nlc3Npbmcg WyVkXSAlczogJXZcbiIsIGksIHIuTGFiZWwsIGVycikKLQkJCXJldHVybgotCQl9Ci0KLQkJZXJy ID0gcnB0LkFkZFJ1bihyKQotCQlpZiBlcnIgIT0gbmlsIHsKLQkJCXJldHVybgotCQl9Ci0JfQot CWVyciA9IHJwdC5PdXRwdXQob3MuU3Rkb3V0KQotCi0JcmV0dXJuCi19CmRpZmYgLS1naXQgYS9s aWJ4bC5nbyBiL2xpYnhsLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTVjMDFj Li4wMDAwMDAwCi0tLSBhL2xpYnhsLmdvCisrKyAvZGV2L251bGwKQEAgLTEsNzIwICswLDAgQEAK LS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgR2VvcmdlIFcuIER1bmxhcCwgQ2l0cml4IFN5c3Rl bXMgVUsgTHRkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g cmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlCi0gKiBMaWNlbnNlIG9ubHku Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg d2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIAotICogWW91IHNob3VsZCBoYXZlIHJlY2Vp dmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdp dGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBG b3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24s IE1BCi0gKiAwMjExMC0xMzAxLCBVU0EuCi0gKi8KLXBhY2thZ2UgbWFpbgotCi0vKgotI2NnbyBM REZMQUdTOiAtbHhlbmxpZ2h0IC1seWFqbF9zIC1seGVuZ250dGFiIC1seGVuc3RvcmUgLWx4ZW5n dWVzdCAtbHhlbnRvb2xsb2cgLWx4ZW5ldnRjaG4gLWx4ZW5jdHJsIC1sYmxrdGFwY3RsIC1seGVu Zm9yZWlnbm1lbW9yeSAtbHhlbmNhbGwgLWx6IC1sdXVpZCAtbHV0aWwKLSNpbmNsdWRlIDxzdGRs aWIuaD4KLSNpbmNsdWRlIDxsaWJ4bC5oPgotKi8KLWltcG9ydCAiQyIKLQotLyoKLSAqIE90aGVy IGZsYWdzIHRoYXQgbWF5IGJlIG5lZWRlZCBhdCBzb21lIHBvaW50OiAKLSAqICAtbG5sLXJvdXRl LTMgLWxubC0zCi0gKgotICogVG8gZ2V0IGJhY2sgdG8gc2ltcGxlIGR5bmFtaWMgbGlua2luZzoK LSNjZ28gTERGTEFHUzogLWx4ZW5saWdodCAtbHlhamwKLSovCi0KLWltcG9ydCAoCi0JInVuc2Fm ZSIKLQkiZm10IgotCSJ0aW1lIgotKQotCi0vKgotICogVHlwZXM6IEJ1aWx0aW5zCi0gKi8KLQot dHlwZSBEb21pZCB1aW50MzIKLQotdHlwZSBNZW1LQiB1aW50NjQKLQotLy8gdHlwZWRlZiBzdHJ1 Y3QgewotLy8gICAgIHVpbnQzMl90IHNpemU7ICAgICAgICAgIC8qIG51bWJlciBvZiBieXRlcyBp biBtYXAgKi8KLS8vICAgICB1aW50OF90ICptYXA7Ci0vLyB9IGxpYnhsX2JpdG1hcDsKLQotLy8g SW1wbGVtZW50IHRoZSBHbyBiaXRtYXAgdHlwZSBzdWNoIHRoYXQgdGhlIHVuZGVybHlpbmcgZGF0 YSBjYW4KLS8vIGVhc2lseSBiZSBjb3BpZWQgaW4gYW5kIG91dC4gIE5CIHRoYXQgd2Ugc3RpbGwg aGF2ZSB0byBkbyBjb3BpZXMKLS8vIGJvdGggZGlyZWN0aW9ucywgYmVjYXVzZSBjZ28gcnVudGlt ZSByZXN0cmljdGlvbnMgZm9yYmlkIHBhc3NpbmcgdG8KLS8vIGEgQyBmdW5jdGlvbiBhIHBvaW50 ZXIgdG8gYSBHby1hbGxvY2F0ZWQgc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zIGEKLS8vIHBvaW50 ZXIuCi10eXBlIEJpdG1hcCBzdHJ1Y3QgewotCWJpdG1hcCBbXUMudWludDhfdAotfQotCi10eXBl IENvbnRleHQgc3RydWN0IHsKLQljdHggKkMubGlieGxfY3R4Ci19Ci0KLXR5cGUgVXVpZCBDLmxp YnhsX3V1aWQKLQotLyoKLSAqIFR5cGVzOiBJREwKLSAqIAotICogRklYTUU6IEdlbmVyYXRlIHRo ZXNlIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgSURMCi0gKi8KLXR5cGUgRG9taW5mbyBzdHJ1Y3Qg ewotCVV1aWQgICAgICAgICAgICAgIFV1aWQKLQlEb21pZCAgICAgICAgICAgICBEb21pZAotCVJ1 bm5pbmcgICAgICAgICAgIGJvb2wKLQlCbG9ja2VkICAgICAgICAgICBib29sCi0JUGF1c2VkICAg ICAgICAgICAgYm9vbAotCVNodXRkb3duICAgICAgICAgIGJvb2wKLQlEeWluZyAgICAgICAgICAg ICBib29sCi0JTmV2ZXJfc3RvcCAgICAgICAgYm9vbAotCQotCVNodXRkb3duX3JlYXNvbiAgIGlu dDMyIC8vIEZJWE1FIHNodXRkb3duX3JlYXNvbiBlbnVtZXJhdGlvbgotCU91dHN0YW5kaW5nX21l bWtiIE1lbUtCCi0JQ3VycmVudF9tZW1rYiAgICAgTWVtS0IKLQlTaGFyZWRfbWVta2IgICAgICBN ZW1LQgotCVBhZ2VkX21lbWtiICAgICAgIE1lbUtCCi0JTWF4X21lbWtiICAgICAgICAgTWVtS0IK LQlDcHVfdGltZSAgICAgICAgICB0aW1lLkR1cmF0aW9uCi0JVmNwdV9tYXhfaWQgICAgICAgdWlu dDMyCi0JVmNwdV9vbmxpbmUgICAgICAgdWludDMyCi0JQ3B1cG9vbCAgICAgICAgICAgdWludDMy Ci0JRG9tYWluX3R5cGUgICAgICAgaW50MzIgLy9GSVhNRSBsaWJ4bF9kb21haW5fdHlwZSBlbnVt ZXJhdGlvbgotCi19Ci0KLS8vICMgQ29uc2lzdGVudCB3aXRoIHZhbHVlcyBkZWZpbmVkIGluIGRv bWN0bC5oCi0vLyAjIEV4Y2VwdCB1bmtub3duIHdoaWNoIHdlIGhhdmUgbWFkZSB1cAotLy8gbGli eGxfc2NoZWR1bGVyID0gRW51bWVyYXRpb24oInNjaGVkdWxlciIsIFsKLS8vICAgICAoMCwgInVu a25vd24iKSwKLS8vICAgICAoNCwgInNlZGYiKSwKLS8vICAgICAoNSwgImNyZWRpdCIpLAotLy8g ICAgICg2LCAiY3JlZGl0MiIpLAotLy8gICAgICg3LCAiYXJpbmM2NTMiKSwKLS8vICAgICAoOCwg InJ0ZHMiKSwKLS8vICAgICBdKQotdHlwZSBTY2hlZHVsZXIgaW50Ci12YXIgKAotCVNjaGVkdWxl clVua25vd24gIFNjaGVkdWxlciA9IEMuTElCWExfU0NIRURVTEVSX1VOS05PV04KLQlTY2hlZHVs ZXJTZWRmICAgICBTY2hlZHVsZXIgPSBDLkxJQlhMX1NDSEVEVUxFUl9TRURGCi0JU2NoZWR1bGVy Q3JlZGl0ICAgU2NoZWR1bGVyID0gQy5MSUJYTF9TQ0hFRFVMRVJfQ1JFRElUCi0JU2NoZWR1bGVy Q3JlZGl0MiAgU2NoZWR1bGVyID0gQy5MSUJYTF9TQ0hFRFVMRVJfQ1JFRElUMgotCVNjaGVkdWxl ckFyaW5jNjUzIFNjaGVkdWxlciA9IEMuTElCWExfU0NIRURVTEVSX0FSSU5DNjUzCi0JU2NoZWR1 bGVyUlREUyAgICAgU2NoZWR1bGVyID0gQy5MSUJYTF9TQ0hFRFVMRVJfUlREUwotKQotCi0vLyBs aWJ4bF9jcHVwb29saW5mbyA9IFN0cnVjdCgiY3B1cG9vbGluZm8iLCBbCi0vLyAgICAgKCJwb29s aWQiLCAgICAgIHVpbnQzMiksCi0vLyAgICAgKCJwb29sX25hbWUiLCAgIHN0cmluZyksCi0vLyAg ICAgKCJzY2hlZCIsICAgICAgIGxpYnhsX3NjaGVkdWxlciksCi0vLyAgICAgKCJuX2RvbSIsICAg ICAgIHVpbnQzMiksCi0vLyAgICAgKCJjcHVtYXAiLCAgICAgIGxpYnhsX2JpdG1hcCkKLS8vICAg ICBdLCBkaXI9RElSX09VVCkKLQotdHlwZSBDcHVwb29sSW5mbyBzdHJ1Y3QgewotCVBvb2xpZCB1 aW50MzIKLQlQb29sTmFtZSBzdHJpbmcKLQlTY2hlZHVsZXIgU2NoZWR1bGVyCi0JRG9tYWluQ291 bnQgaW50Ci0JQ3B1bWFwIEJpdG1hcAotfQotCi0vKgotICogQ29udGV4dAotICovCi12YXIgQ3R4 IENvbnRleHQKLQotZnVuYyAoQ3R4ICpDb250ZXh0KSBJc09wZW4oKSBib29sIHsKLQlyZXR1cm4g Q3R4LmN0eCAhPSBuaWwKLX0KLQotZnVuYyAoQ3R4ICpDb250ZXh0KSBPcGVuKCkgKGVyciBlcnJv cikgewotCWlmIEN0eC5jdHggIT0gbmlsIHsKLQkJcmV0dXJuCi0JfQotCQotCXJldCA6PSBDLmxp YnhsX2N0eF9hbGxvYyh1bnNhZmUuUG9pbnRlcigmQ3R4LmN0eCksIEMuTElCWExfVkVSU0lPTiwg MCwgbmlsKQotCi0JaWYgcmV0ICE9IDAgewotCQllcnIgPSBmbXQuRXJyb3JmKCJBbGxvY2F0aW5n IGxpYnhsIGNvbnRleHQ6ICVkIiwgcmV0KQotCX0KLQlyZXR1cm4KLX0KLQotZnVuYyAoQ3R4ICpD b250ZXh0KSBDbG9zZSgpIChlcnIgZXJyb3IpIHsKLQlyZXQgOj0gQy5saWJ4bF9jdHhfZnJlZSh1 bnNhZmUuUG9pbnRlcihDdHguY3R4KSkKLQlDdHguY3R4ID0gbmlsCi0KLQlpZiByZXQgIT0gMCB7 Ci0JCWVyciA9IGZtdC5FcnJvcmYoIkZyZWVpbmcgbGlieGwgY29udGV4dDogJWQiLCByZXQpCi0J fQotCXJldHVybgotfQotCi1mdW5jIChDdHggKkNvbnRleHQpIENoZWNrT3BlbigpIChlcnIgZXJy b3IpIHsKLQlpZiBDdHguY3R4ID09IG5pbCB7Ci0JCWVyciA9IGZtdC5FcnJvcmYoIkNvbnRleHQg bm90IG9wZW5lZCIpCi0JfQotCXJldHVybgotfQotCi1mdW5jIChDdHggKkNvbnRleHQpIERvbWFp bkluZm8oSWQgRG9taWQpIChkaSAqRG9taW5mbywgZXJyIGVycm9yKSB7Ci0JZXJyID0gQ3R4LkNo ZWNrT3BlbigpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCXJldHVybgotCX0KLQotCXZhciBjZGkgQy5s aWJ4bF9kb21pbmZvCi0KLQlyZXQgOj0gQy5saWJ4bF9kb21haW5faW5mbyhDdHguY3R4LCB1bnNh ZmUuUG9pbnRlcigmY2RpKSwgQy51aW50MzJfdChJZCkpCi0KLQkvLyBGSVhNRTogSXNEb21haW5O b3RQcmVzZW50RXJyb3IKLQlpZiByZXQgIT0gMCB7Ci0JCWVyciA9IGZtdC5FcnJvcmYoImxpYnhs X2RvbWFpbl9pbmZvIGZhaWxlZDogJWQiLCByZXQpCi0JCXJldHVybgotCX0KLQotCS8vIFdlIGNv dWxkIGNvbnNpZGVyIGhhdmluZyB0aGlzIGJvaWxlcnBsYXRlIGdlbmVyYXRlZCBieSB0aGUKLQkv LyBpZGwsIGluIGEgZnVuY3Rpb24gbGlrZSB0aGlzOgotCS8vCi0JLy8gZGkgPSB0cmFuc2xhdGVD ZG9tYWluaW5mb1RvR29Eb21haW5pbmZvKGNkaSkKLQlkaSA9ICZEb21pbmZve30KLQlkaS5VdWlk ID0gVXVpZChjZGkudXVpZCkKLQlkaS5Eb21pZCA9IERvbWlkKGNkaS5kb21pZCkKLQlkaS5SdW5u aW5nID0gYm9vbChjZGkucnVubmluZykKLQlkaS5CbG9ja2VkID0gYm9vbChjZGkuYmxvY2tlZCkK LQlkaS5QYXVzZWQgPSBib29sKGNkaS5wYXVzZWQpCi0JZGkuU2h1dGRvd24gPSBib29sKGNkaS5z aHV0ZG93bikKLQlkaS5EeWluZyA9IGJvb2woY2RpLmR5aW5nKQotCWRpLk5ldmVyX3N0b3AgPSBi b29sKGNkaS5uZXZlcl9zdG9wKQotCWRpLlNodXRkb3duX3JlYXNvbiA9IGludDMyKGNkaS5zaHV0 ZG93bl9yZWFzb24pCi0JZGkuT3V0c3RhbmRpbmdfbWVta2IgPSBNZW1LQihjZGkub3V0c3RhbmRp bmdfbWVta2IpCi0JZGkuQ3VycmVudF9tZW1rYiA9IE1lbUtCKGNkaS5jdXJyZW50X21lbWtiKQot CWRpLlNoYXJlZF9tZW1rYiA9IE1lbUtCKGNkaS5zaGFyZWRfbWVta2IpCi0JZGkuUGFnZWRfbWVt a2IgPSBNZW1LQihjZGkucGFnZWRfbWVta2IpCi0JZGkuTWF4X21lbWtiID0gTWVtS0IoY2RpLm1h eF9tZW1rYikKLQlkaS5DcHVfdGltZSA9IHRpbWUuRHVyYXRpb24oY2RpLmNwdV90aW1lKQotCWRp LlZjcHVfbWF4X2lkID0gdWludDMyKGNkaS52Y3B1X21heF9pZCkKLQlkaS5WY3B1X29ubGluZSA9 IHVpbnQzMihjZGkudmNwdV9vbmxpbmUpCi0JZGkuQ3B1cG9vbCA9IHVpbnQzMihjZGkuY3B1cG9v bCkKLQlkaS5Eb21haW5fdHlwZSA9IGludDMyKGNkaS5kb21haW5fdHlwZSkKLQotCXJldHVybgot fQotCi1mdW5jIChDdHggKkNvbnRleHQpIERvbWFpblVucGF1c2UoSWQgRG9taWQpIChlcnIgZXJy b3IpIHsKLQllcnIgPSBDdHguQ2hlY2tPcGVuKCkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJcmV0dXJu Ci0JfQotCi0JcmV0IDo9IEMubGlieGxfZG9tYWluX3VucGF1c2UoQ3R4LmN0eCwgQy51aW50MzJf dChJZCkpCi0KLQlpZiByZXQgIT0gMCB7Ci0JCWVyciA9IGZtdC5FcnJvcmYoImxpYnhsX2RvbWFp bl91bnBhdXNlIGZhaWxlZDogJWQiLCByZXQpCi0JfQotCXJldHVybgotfQotCi0vKgotICogQml0 bWFwIG9wZXJhdGlvbnMKLSAqLwotCi0vLyBSZXR1cm4gYSBHbyBiaXRtYXAgd2hpY2ggaXMgYSBj b3B5IG9mIHRoZSByZWZlcnJlZCBDIGJpdG1hcC4KLWZ1bmMgYml0bWFwQ1RvR28oY2JtIEMubGli eGxfYml0bWFwKSAoZ2JtIEJpdG1hcCkgewotCS8vIEFsbG9jIGEgR28gc2xpY2UgZm9yIHRoZSBi eXRlcwotCXNpemUgOj0gaW50KGNibS5zaXplKQotCWdibS5iaXRtYXAgPSBtYWtlKFtdQy51aW50 OF90LCBzaXplKQotCi0JLy8gTWFrZSBhIHNsaWNlIHBvaW50aW5nIHRvIHRoZSBDIGFycmF5Ci0J bWFwc2xpY2UgOj0gKCpbMSA8PCAzMF1DLnVpbnQ4X3QpKHVuc2FmZS5Qb2ludGVyKGNibS5fbWFw KSlbOnNpemU6c2l6ZV0KLQotCS8vIEFuZCBjb3B5IHRoZSBDIGFycmF5IGludG8gdGhlIEdvIGFy cmF5Ci0JY29weShnYm0uYml0bWFwLCBtYXBzbGljZSkKLQotCXJldHVybgotfQotCi0vLyBNdXN0 IGJlIEMubGlieGxfYml0bWFwX2Rpc3Bvc2UnZCBvZiBhZnRlcndhcmRzCi1mdW5jIGJpdG1hcEdv dG9DKGdibSBCaXRtYXApIChjYm0gQy5saWJ4bF9iaXRtYXApIHsKLQlDLmxpYnhsX2JpdG1hcF9p bml0KCZjYm0pCi0KLQlzaXplIDo9IGxlbihnYm0uYml0bWFwKQotCWNibS5fbWFwID0gKCpDLnVp bnQ4X3QpKEMubWFsbG9jKEMuc2l6ZV90KHNpemUpKSkKLQljYm0uc2l6ZSA9IEMudWludDMyX3Qo c2l6ZSkKLQlpZiBjYm0uX21hcCA9PSBuaWwgewotCQlwYW5pYygiQy5jYWxsb2MgZmFpbGVkISIp Ci0JfQotCi0JLy8gTWFrZSBhIHNsaWNlIHBvaW50aW5nIHRvIHRoZSBDIGFycmF5Ci0JbWFwc2xp Y2UgOj0gKCpbMSA8PCAzMF1DLnVpbnQ4X3QpKHVuc2FmZS5Qb2ludGVyKGNibS5fbWFwKSlbOnNp emU6c2l6ZV0KLQotCS8vIEFuZCBjb3B5IHRoZSBHbyBhcnJheSBpbnRvIHRoZSBDIGFycmF5Ci0J Y29weShtYXBzbGljZSwgZ2JtLmJpdG1hcCkKLQotCXJldHVybgotfQotCi1mdW5jIChibSAqQml0 bWFwKSBUZXN0KGJpdCBpbnQpIChib29sKSB7Ci0JdWJpdCA6PSB1aW50KGJpdCkKLQlpZiAoYml0 ID4gYm0uTWF4KCkgfHwgYm0uYml0bWFwID09IG5pbCkgewotCQlyZXR1cm4gZmFsc2UKLQl9Ci0J Ci0JcmV0dXJuIChibS5iaXRtYXBbYml0IC8gOF0gJiAoMSA8PCAodWJpdCAmIDcpKSkgIT0gMAot fQotCi1mdW5jIChibSAqQml0bWFwKSBTZXQoYml0IGludCkgewotCWliaXQgOj0gYml0IC8gODsK LQlpZiAoaWJpdCArIDEgPiBsZW4oYm0uYml0bWFwKSkgewotCQlibS5iaXRtYXAgPSBhcHBlbmQo Ym0uYml0bWFwLCBtYWtlKFtdQy51aW50OF90LCBpYml0KzEtbGVuKGJtLmJpdG1hcCkpLi4uKQot CX0KLQkKLQlibS5iaXRtYXBbaWJpdF0gfD0gMSA8PCAodWludChiaXQpICYgNykKLX0KLQotZnVu YyAoYm0gKkJpdG1hcCkgU2V0UmFuZ2Uoc3RhcnQgaW50LCBlbmQgaW50KSB7Ci0JZm9yIGkgOj0g c3RhcnQ7IGkgPD0gZW5kOyBpKysgewotCQlibS5TZXQoaSkKLQl9Ci19Ci0KLWZ1bmMgKGJtICpC aXRtYXApIENsZWFyKGJpdCBpbnQpIHsKLQl1Yml0IDo9IHVpbnQoYml0KQotCWlmIChiaXQgPiBi bS5NYXgoKSB8fCBibS5iaXRtYXAgPT0gbmlsKSB7Ci0JCXJldHVybgotCX0KLQkKLQlibS5iaXRt YXBbYml0IC8gOF0gJj0gXigxIDw8ICh1Yml0ICYgNykpCi19Ci0KLWZ1bmMgKGJtICpCaXRtYXAp IENsZWFyUmFuZ2Uoc3RhcnQgaW50LCBlbmQgaW50KSB7Ci0JZm9yIGkgOj0gc3RhcnQ7IGkgPD0g ZW5kOyBpKysgewotCQlibS5DbGVhcihpKQotCX0KLX0KLQotZnVuYyAoYm0gKkJpdG1hcCkgTWF4 KCkgKGludCkgewotCXJldHVybiBsZW4oYm0uYml0bWFwKSAqIDggLSAxCi19Ci0KLWZ1bmMgKGJt ICpCaXRtYXApIElzRW1wdHkoKSAoYm9vbCkgewotCWZvciBpOj0wOyBpPGxlbihibS5iaXRtYXAp OyBpKysgewotCQlpZiBibS5iaXRtYXBbaV0gIT0gMCB7Ci0JCQlyZXR1cm4gZmFsc2UKLQkJfQot CX0KLQlyZXR1cm4gdHJ1ZQotfQotCi1mdW5jIChhIEJpdG1hcCkgQW5kKGIgQml0bWFwKSAoYyBC aXRtYXApIHsKLQl2YXIgbWF4LCBtaW4gaW50Ci0JaWYgbGVuKGEuYml0bWFwKSA+IGxlbihiLmJp dG1hcCkgewotCQltYXggPSBsZW4oYS5iaXRtYXApCi0JCW1pbiA9IGxlbihiLmJpdG1hcCkKLQl9 IGVsc2UgewotCQltYXggPSBsZW4oYi5iaXRtYXApCi0JCW1pbiA9IGxlbihhLmJpdG1hcCkKLQl9 Ci0JYy5iaXRtYXAgPSBtYWtlKFtdQy51aW50OF90LCBtYXgpCi0KLQlmb3IgaSA6PSAwOyBpIDwg bWluOyBpKysgewotCQljLmJpdG1hcFtpXSA9IGEuYml0bWFwW2ldICYgYi5iaXRtYXBbaV0KLQl9 Ci0JcmV0dXJuCi19Ci0KLWZ1bmMgKGJtIEJpdG1hcCkgU3RyaW5nKCkgKHMgc3RyaW5nKSB7Ci0J bGFzdE9ubGluZSA6PSBmYWxzZQotCWNyYW5nZSA6PSBmYWxzZQotCXByaW50ZWQgOj0gZmFsc2UK LQl2YXIgaSBpbnQKLQkvLy8gLS14LXh4eHh4LXggLT4gMiw0LTgsMTAKLQkvLy8gLS14LXh4eHh4 eHggLT4gMiw0LTEwCi0JZm9yIGkgPSAwOyBpIDw9IGJtLk1heCgpOyBpKysgewotCQlpZiBibS5U ZXN0KGkpIHsKLQkJCWlmICFsYXN0T25saW5lIHsKLQkJCQkvLyBTd2l0Y2hpbmcgb2ZmbGluZSAt PiBvbmxpbmUsIHByaW50IHRoaXMgY3B1Ci0JCQkJaWYgcHJpbnRlZCB7Ci0JCQkJCXMgKz0gIiwi Ci0JCQkJfQotCQkJCXMgKz0gZm10LlNwcmludGYoIiVkIiwgaSkKLQkJCQlwcmludGVkID0gdHJ1 ZQotCQkJfSBlbHNlIGlmICFjcmFuZ2UgewotCQkJCS8vIGxhc3Qgd2FzIG9ubGluZSwgYnV0IHdl J3JlIG5vdCBpbiBhIHJhbmdlOyBwcmludCAtCi0JCQkJY3JhbmdlID0gdHJ1ZQotCQkJCXMgKz0g Ii0iCi0JCQl9IGVsc2UgewotCQkJCS8vIGxhc3Qgd2FzIG9ubGluZSwgd2UncmUgaW4gYSByYW5n ZSwgIG5vdGhpbmcgZWxzZSB0byBkbwotCQkJfQotCQkJbGFzdE9ubGluZSA9IHRydWUKLQkJfSBl bHNlIHsKLQkJCWlmIGxhc3RPbmxpbmUgewotCQkJCS8vIFN3aXRjaGluZyBvbmxpbmUtPm9mZmxp bmU7IGRvIHdlIG5lZWQgdG8gZW5kIGEgcmFuZ2U/Ci0JCQkJaWYgY3JhbmdlIHsKLQkJCQkJcyAr PSBmbXQuU3ByaW50ZigiJWQiLCBpLTEpCi0JCQkJfQotCQkJfQotCQkJbGFzdE9ubGluZSA9IGZh bHNlCi0JCQljcmFuZ2UgPSBmYWxzZQotCQl9Ci0JfQotCWlmIGxhc3RPbmxpbmUgewotCQkvLyBT d2l0Y2hpbmcgb25saW5lLT5vZmZsaW5lOyBkbyB3ZSBuZWVkIHRvIGVuZCBhIHJhbmdlPwotCQlp ZiBjcmFuZ2UgewotCQkJcyArPSBmbXQuU3ByaW50ZigiJWQiLCBpLTEpCi0JCX0KLQl9Ci0KLQly ZXR1cm4KLX0KLQotLy8gY29uc3QgY2hhciAqbGlieGxfc2NoZWR1bGVyX3RvX3N0cmluZyhsaWJ4 bF9zY2hlZHVsZXIgcCk7Ci1mdW5jIChzIFNjaGVkdWxlcikgU3RyaW5nKCkgKHN0cmluZykgewot CWNzIDo9IEMubGlieGxfc2NoZWR1bGVyX3RvX3N0cmluZyhDLmxpYnhsX3NjaGVkdWxlcihzKSkK LQkvLyBObyBuZWVkIHRvIGZyZWUgY29uc3QgcmV0dXJuIHZhbHVlCi0KLQlyZXR1cm4gQy5Hb1N0 cmluZyhjcykKLX0KLQotLy8gaW50IGxpYnhsX3NjaGVkdWxlcl9mcm9tX3N0cmluZyhjb25zdCBj aGFyICpzLCBsaWJ4bF9zY2hlZHVsZXIgKmUpOwotZnVuYyAocyAqU2NoZWR1bGVyKSBGcm9tU3Ry aW5nKGdzdHIgc3RyaW5nKSAoZXJyIGVycm9yKSB7Ci0JY3N0ciA6PSBDLkNTdHJpbmcoZ3N0cikK LQlkZWZlciBDLmZyZWUodW5zYWZlLlBvaW50ZXIoY3N0cikpCi0KLQl2YXIgY3MgQy5saWJ4bF9z Y2hlZHVsZXIKLQlyZXQgOj0gQy5saWJ4bF9zY2hlZHVsZXJfZnJvbV9zdHJpbmcoY3N0ciwgJmNz KQotCWlmIHJldCAhPSAwIHsKLQkJZXJyID0gZm10LkVycm9yZigibGlieGxfc2NoZWR1bGVyX2Zy b21fc3RyaW5nOiAlZFxuIiwgcmV0KQotCQlyZXR1cm4KLQl9Ci0KLQkqcyA9IFNjaGVkdWxlcihj cykKLQlyZXR1cm4KLX0KLQotZnVuYyB0cmFuc2xhdGVDcHVwb29sSW5mb0NUb0dvKGNjaSBDLmxp YnhsX2NwdXBvb2xpbmZvKSAoZ2NpIENwdXBvb2xJbmZvKSB7Ci0JZ2NpLlBvb2xpZCA9IHVpbnQz MihjY2kucG9vbGlkKQotCWdjaS5Qb29sTmFtZSA9IEMuR29TdHJpbmcoY2NpLnBvb2xfbmFtZSkK LQlnY2kuU2NoZWR1bGVyID0gU2NoZWR1bGVyKGNjaS5zY2hlZCkKLQlnY2kuRG9tYWluQ291bnQg PSBpbnQoY2NpLm5fZG9tKQotCWdjaS5DcHVtYXAgPSBiaXRtYXBDVG9HbyhjY2kuY3B1bWFwKQot Ci0JcmV0dXJuCi19Ci0KLWZ1bmMgU2NoZWR1bGVyRnJvbVN0cmluZyhuYW1lIHN0cmluZykgKHMg U2NoZWR1bGVyLCBlcnIgZXJyb3IpIHsKLQljbmFtZSA6PSBDLkNTdHJpbmcobmFtZSkKLQlkZWZl ciBDLmZyZWUodW5zYWZlLlBvaW50ZXIoY25hbWUpKQotCi0JdmFyIGNzIEMubGlieGxfc2NoZWR1 bGVyCi0KLQlyZXQgOj0gQy5saWJ4bF9zY2hlZHVsZXJfZnJvbV9zdHJpbmcoY25hbWUsICZjcykK LQlpZiByZXQgIT0gMCB7Ci0JCWVyciA9IGZtdC5FcnJvcmYoImxpYnhsX3NjaGVkdWxlcl9mcm9t X3N0cmluZyBmYWlsZWQ6ICVkIiwgcmV0KQotCQlyZXR1cm4KLQl9Ci0KLQlzID0gU2NoZWR1bGVy KGNzKQotCi0JcmV0dXJuCi19Ci0KLS8vIGxpYnhsX2NwdXBvb2xpbmZvICogbGlieGxfbGlzdF9j cHVwb29sKGxpYnhsX2N0eCosIGludCAqbmJfcG9vbF9vdXQpOwotLy8gdm9pZCBsaWJ4bF9jcHVw b29saW5mb19saXN0X2ZyZWUobGlieGxfY3B1cG9vbGluZm8gKmxpc3QsIGludCBuYl9wb29sKTsK LWZ1bmMgKEN0eCAqQ29udGV4dCkgTGlzdENwdXBvb2woKSAobGlzdCBbXUNwdXBvb2xJbmZvKSB7 Ci0JZXJyIDo9IEN0eC5DaGVja09wZW4oKQotCWlmIGVyciAhPSBuaWwgewotCQlyZXR1cm4KLQl9 Ci0KLQl2YXIgbmJQb29sIEMuaW50Ci0KLQljX2NwdXBvb2xfbGlzdCA6PSBDLmxpYnhsX2xpc3Rf Y3B1cG9vbChDdHguY3R4LCAmbmJQb29sKQotCi0JZGVmZXIgQy5saWJ4bF9jcHVwb29saW5mb19s aXN0X2ZyZWUoY19jcHVwb29sX2xpc3QsIG5iUG9vbCkKLQotCWlmIGludChuYlBvb2wpID09IDAg ewotCQlyZXR1cm4KLQl9Ci0KLQkvLyBNYWdpYwotCWNwdXBvb2xMaXN0U2xpY2UgOj0gKCpbMSA8 PCAzMF1DLmxpYnhsX2NwdXBvb2xpbmZvKSh1bnNhZmUuUG9pbnRlcihjX2NwdXBvb2xfbGlzdCkp WzpuYlBvb2w6bmJQb29sXQotCi0JZm9yIGkgOj0gcmFuZ2UgY3B1cG9vbExpc3RTbGljZSB7Ci0J CWluZm8gOj0gdHJhbnNsYXRlQ3B1cG9vbEluZm9DVG9HbyhjcHVwb29sTGlzdFNsaWNlW2ldKQot CQkKLQkJbGlzdCA9IGFwcGVuZChsaXN0LCBpbmZvKQotCX0KLQotCXJldHVybgotfQotCi0vLyBp bnQgbGlieGxfY3B1cG9vbF9pbmZvKGxpYnhsX2N0eCAqY3R4LCBsaWJ4bF9jcHVwb29saW5mbyAq aW5mbywgdWludDMyX3QgcG9vbGlkKTsKLWZ1bmMgKEN0eCAqQ29udGV4dCkgQ3B1cG9vbEluZm8o UG9vbGlkIHVpbnQzMikgKHBvb2wgQ3B1cG9vbEluZm8pIHsKLQllcnIgOj0gQ3R4LkNoZWNrT3Bl bigpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCXJldHVybgotCX0KLQotCXZhciBjX2NwdXBvb2wgQy5s aWJ4bF9jcHVwb29saW5mbwotCQotCXJldCA6PSBDLmxpYnhsX2NwdXBvb2xfaW5mbyhDdHguY3R4 LCAmY19jcHVwb29sLCBDLnVpbnQzMl90KFBvb2xpZCkpCi0JaWYgcmV0ICE9IDAgewotCQllcnIg PSBmbXQuRXJyb3JmKCJsaWJ4bF9jcHVwb29sX2luZm8gZmFpbGVkOiAlZCIsIHJldCkKLQkJcmV0 dXJuCi0JfQotCWRlZmVyIEMubGlieGxfY3B1cG9vbGluZm9fZGlzcG9zZSgmY19jcHVwb29sKQot Ci0JcG9vbCA9IHRyYW5zbGF0ZUNwdXBvb2xJbmZvQ1RvR28oY19jcHVwb29sKQotCi0JcmV0dXJu Ci19Ci0KLQotCi0vLyBpbnQgbGlieGxfY3B1cG9vbF9jcmVhdGUobGlieGxfY3R4ICpjdHgsIGNv bnN0IGNoYXIgKm5hbWUsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgbGlieGxfc2NoZWR1 bGVyIHNjaGVkLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnhsX2JpdG1hcCBjcHVt YXAsIGxpYnhsX3V1aWQgKnV1aWQsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMy X3QgKnBvb2xpZCk7Ci0vLyBGSVhNRTogdXVpZAotLy8gRklYTUU6IFNldHRpbmcgcG9vbGlkCi1m dW5jIChDdHggKkNvbnRleHQpIENwdXBvb2xDcmVhdGUoTmFtZSBzdHJpbmcsIFNjaGVkdWxlciBT Y2hlZHVsZXIsIENwdW1hcCBCaXRtYXApIChlcnIgZXJyb3IsIFBvb2xpZCB1aW50MzIpIHsKLQll cnIgPSBDdHguQ2hlY2tPcGVuKCkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuCi0JfQotCi0J cG9vbGlkIDo9IEMudWludDMyX3QoMCkKLQluYW1lIDo9IEMuQ1N0cmluZyhOYW1lKQotCWRlZmVy IEMuZnJlZSh1bnNhZmUuUG9pbnRlcihuYW1lKSkKLQkKLQkvLyBGb3Igbm93LCBqdXN0IGRvIHdo YXQgeGwgZG9lcywgYW5kIG1ha2UgYSBuZXcgdXVpZCBldmVyeSB0aW1lIHdlIGNyZWF0ZSB0aGUg cG9vbAotCXZhciB1dWlkIEMubGlieGxfdXVpZAotCUMubGlieGxfdXVpZF9nZW5lcmF0ZSgmdXVp ZCkKLQotCWNibSA6PSBiaXRtYXBHb3RvQyhDcHVtYXApCi0JZGVmZXIgQy5saWJ4bF9iaXRtYXBf ZGlzcG9zZSgmY2JtKQotCQotCXJldCA6PSBDLmxpYnhsX2NwdXBvb2xfY3JlYXRlKEN0eC5jdHgs IG5hbWUsIEMubGlieGxfc2NoZWR1bGVyKFNjaGVkdWxlciksCi0JCWNibSwgJnV1aWQsICZwb29s aWQpCi0JLy8gRklYTUU6IFByb3BlciBlcnJvcgotCWlmIHJldCAhPSAwIHsKLQkJZXJyID0gZm10 LkVycm9yZigibGlieGxfY3B1cG9vbF9jcmVhdGUgZmFpbGVkOiAlZCIsIHJldCkKLQkJcmV0dXJu Ci0JfQotCi0JUG9vbGlkID0gdWludDMyKHBvb2xpZCkKLQkKLQlyZXR1cm4KLX0KLQotLy8gaW50 IGxpYnhsX2NwdXBvb2xfZGVzdHJveShsaWJ4bF9jdHggKmN0eCwgdWludDMyX3QgcG9vbGlkKTsK LWZ1bmMgKEN0eCAqQ29udGV4dCkgQ3B1cG9vbERlc3Ryb3koUG9vbGlkIHVpbnQzMikgKGVyciBl cnJvcikgewotCWVyciA9IEN0eC5DaGVja09wZW4oKQotCWlmIGVyciAhPSBuaWwgewotCQlyZXR1 cm4KLQl9Ci0KLQlyZXQgOj0gQy5saWJ4bF9jcHVwb29sX2Rlc3Ryb3koQ3R4LmN0eCwgQy51aW50 MzJfdChQb29saWQpKQotCS8vIEZJWE1FOiBQcm9wZXIgZXJyb3IKLQlpZiByZXQgIT0gMCB7Ci0J CWVyciA9IGZtdC5FcnJvcmYoImxpYnhsX2NwdXBvb2xfZGVzdHJveSBmYWlsZWQ6ICVkIiwgcmV0 KQotCQlyZXR1cm4KLQl9Ci0KLQlyZXR1cm4KLX0KLQotLy8gaW50IGxpYnhsX2NwdXBvb2xfY3B1 YWRkKGxpYnhsX2N0eCAqY3R4LCB1aW50MzJfdCBwb29saWQsIGludCBjcHUpOwotZnVuYyAoQ3R4 ICpDb250ZXh0KSBDcHVwb29sQ3B1YWRkKFBvb2xpZCB1aW50MzIsIENwdSBpbnQpIChlcnIgZXJy b3IpIHsKLQllcnIgPSBDdHguQ2hlY2tPcGVuKCkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJcmV0dXJu Ci0JfQotCi0JcmV0IDo9IEMubGlieGxfY3B1cG9vbF9jcHVhZGQoQ3R4LmN0eCwgQy51aW50MzJf dChQb29saWQpLCBDLmludChDcHUpKQotCS8vIEZJWE1FOiBQcm9wZXIgZXJyb3IKLQlpZiByZXQg IT0gMCB7Ci0JCWVyciA9IGZtdC5FcnJvcmYoImxpYnhsX2NwdXBvb2xfY3B1YWRkIGZhaWxlZDog JWQiLCByZXQpCi0JCXJldHVybgotCX0KLQotCXJldHVybgotfQotCi0vLyBpbnQgbGlieGxfY3B1 cG9vbF9jcHVhZGRfY3B1bWFwKGxpYnhsX2N0eCAqY3R4LCB1aW50MzJfdCBwb29saWQsCi0vLyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpYnhsX2JpdG1hcCAqY3B1bWFw KTsKLWZ1bmMgKEN0eCAqQ29udGV4dCkgQ3B1cG9vbENwdWFkZENwdW1hcChQb29saWQgdWludDMy LCBDcHVtYXAgQml0bWFwKSAoZXJyIGVycm9yKSB7Ci0JZXJyID0gQ3R4LkNoZWNrT3BlbigpCi0J aWYgZXJyICE9IG5pbCB7Ci0JCXJldHVybgotCX0KLQotCWNibSA6PSBiaXRtYXBHb3RvQyhDcHVt YXApCi0JZGVmZXIgQy5saWJ4bF9iaXRtYXBfZGlzcG9zZSgmY2JtKQotCQotCXJldCA6PSBDLmxp YnhsX2NwdXBvb2xfY3B1YWRkX2NwdW1hcChDdHguY3R4LCBDLnVpbnQzMl90KFBvb2xpZCksICZj Ym0pCi0JLy8gRklYTUU6IFByb3BlciBlcnJvcgotCWlmIHJldCAhPSAwIHsKLQkJZXJyID0gZm10 LkVycm9yZigibGlieGxfY3B1cG9vbF9jcHVhZGRfY3B1bWFwIGZhaWxlZDogJWQiLCByZXQpCi0J CXJldHVybgotCX0KLQotCXJldHVybgotfQotCi0vLyBpbnQgbGlieGxfY3B1cG9vbF9jcHVyZW1v dmUobGlieGxfY3R4ICpjdHgsIHVpbnQzMl90IHBvb2xpZCwgaW50IGNwdSk7Ci1mdW5jIChDdHgg KkNvbnRleHQpIENwdXBvb2xDcHVyZW1vdmUoUG9vbGlkIHVpbnQzMiwgQ3B1IGludCkgKGVyciBl cnJvcikgewotCWVyciA9IEN0eC5DaGVja09wZW4oKQotCWlmIGVyciAhPSBuaWwgewotCQlyZXR1 cm4KLQl9Ci0KLQlyZXQgOj0gQy5saWJ4bF9jcHVwb29sX2NwdXJlbW92ZShDdHguY3R4LCBDLnVp bnQzMl90KFBvb2xpZCksIEMuaW50KENwdSkpCi0JLy8gRklYTUU6IFByb3BlciBlcnJvcgotCWlm IHJldCAhPSAwIHsKLQkJZXJyID0gZm10LkVycm9yZigibGlieGxfY3B1cG9vbF9jcHVyZW1vdmUg ZmFpbGVkOiAlZCIsIHJldCkKLQkJcmV0dXJuCi0JfQotCi0JcmV0dXJuCi19Ci0KLS8vIGludCBs aWJ4bF9jcHVwb29sX2NwdXJlbW92ZV9jcHVtYXAobGlieGxfY3R4ICpjdHgsIHVpbnQzMl90IHBv b2xpZCwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlieGxf Yml0bWFwICpjcHVtYXApOwotZnVuYyAoQ3R4ICpDb250ZXh0KSBDcHVwb29sQ3B1cmVtb3ZlQ3B1 bWFwKFBvb2xpZCB1aW50MzIsIENwdW1hcCBCaXRtYXApIChlcnIgZXJyb3IpIHsKLQllcnIgPSBD dHguQ2hlY2tPcGVuKCkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuCi0JfQotCi0JY2JtIDo9 IGJpdG1hcEdvdG9DKENwdW1hcCkKLQlkZWZlciBDLmxpYnhsX2JpdG1hcF9kaXNwb3NlKCZjYm0p Ci0JCi0JcmV0IDo9IEMubGlieGxfY3B1cG9vbF9jcHVyZW1vdmVfY3B1bWFwKEN0eC5jdHgsIEMu dWludDMyX3QoUG9vbGlkKSwgJmNibSkKLQkvLyBGSVhNRTogUHJvcGVyIGVycm9yCi0JaWYgcmV0 ICE9IDAgewotCQllcnIgPSBmbXQuRXJyb3JmKCJsaWJ4bF9jcHVwb29sX2NwdXJlbW92ZV9jcHVt YXAgZmFpbGVkOiAlZCIsIHJldCkKLQkJcmV0dXJuCi0JfQotCi0JcmV0dXJuCi19Ci0KLS8vIGlu dCBsaWJ4bF9jcHVwb29sX3JlbmFtZShsaWJ4bF9jdHggKmN0eCwgY29uc3QgY2hhciAqbmFtZSwg dWludDMyX3QgcG9vbGlkKTsKLS8vIGludCBsaWJ4bF9jcHVwb29sX2NwdWFkZF9ub2RlKGxpYnhs X2N0eCAqY3R4LCB1aW50MzJfdCBwb29saWQsIGludCBub2RlLCBpbnQgKmNwdXMpOwotLy8gaW50 IGxpYnhsX2NwdXBvb2xfY3B1cmVtb3ZlX25vZGUobGlieGxfY3R4ICpjdHgsIHVpbnQzMl90IHBv b2xpZCwgaW50IG5vZGUsIGludCAqY3B1cyk7Ci0vLyBpbnQgbGlieGxfY3B1cG9vbF9tb3ZlZG9t YWluKGxpYnhsX2N0eCAqY3R4LCB1aW50MzJfdCBwb29saWQsIHVpbnQzMl90IGRvbWlkKTsKLQot Ly8KLS8vIFV0aWxpdHkgZnVuY3Rpb25zCi0vLwotZnVuYyAoQ3R4ICpDb250ZXh0KSBDcHVwb29s RmluZEJ5TmFtZShuYW1lIHN0cmluZykgKGluZm8gQ3B1cG9vbEluZm8sIGZvdW5kIGJvb2wpIHsK LQlwbGlzdCA6PSBDdHguTGlzdENwdXBvb2woKQotCi0JZm9yIGkgOj0gcmFuZ2UgcGxpc3Qgewot CQlpZiBwbGlzdFtpXS5Qb29sTmFtZSA9PSBuYW1lIHsKLQkJCWZvdW5kID0gdHJ1ZQotCQkJaW5m byA9IHBsaXN0W2ldCi0JCQlyZXR1cm4KLQkJfQotCX0KLQlyZXR1cm4KLX0KLQotZnVuYyAoQ3R4 ICpDb250ZXh0KSBDcHVwb29sTWFrZUZyZWUoQ3B1bWFwIEJpdG1hcCkgKGVyciBlcnJvcikgewot CXBsaXN0IDo9IEN0eC5MaXN0Q3B1cG9vbCgpCi0KLQlmb3IgaSA6PSByYW5nZSBwbGlzdCB7Ci0J CXZhciBJbnRlcnNlY3Rpb24gQml0bWFwCi0JCUludGVyc2VjdGlvbiA9IENwdW1hcC5BbmQocGxp c3RbaV0uQ3B1bWFwKQotCQlpZiAhIEludGVyc2VjdGlvbi5Jc0VtcHR5KCkgewotCQkJZXJyID0g Q3R4LkNwdXBvb2xDcHVyZW1vdmVDcHVtYXAocGxpc3RbaV0uUG9vbGlkLCBJbnRlcnNlY3Rpb24p Ci0JCQlpZiBlcnIgIT0gbmlsIHsKLQkJCQlyZXR1cm4KLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4K LX0KLQotZnVuYyBYbFRlc3QoQXJncyBbXXN0cmluZykgewotCXZhciBDcHVtYXAgQml0bWFwCi0K LQlDcHVtYXAuU2V0KDIpCi0JQ3B1bWFwLlNldFJhbmdlKDQsIDgpCi0JQ3B1bWFwLlNldCgxMCkK LQotCWZtdC5QcmludGYoIkNwdW1hcDogJXZcbiIsIENwdW1hcCkKLQotCUNwdW1hcC5TZXQoOSkK LQotCWZtdC5QcmludGYoIkNwdW1hcDogJXZcbiIsIENwdW1hcCkKLQotCXZhciBDdHggQ29udGV4 dAotCi0JZXJyIDo9IEN0eC5PcGVuKCkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJZm10LlByaW50Zigi T3BlbmluZyBjb250ZXh0OiAldlxuIiwgZXJyKQotCQlyZXR1cm4KLQl9Ci0KLQlwb29sLCBmb3Vu ZCA6PSBDdHguQ3B1cG9vbEZpbmRCeU5hbWUoInNjaGVkYmVuY2giKQotCi0JaWYgZm91bmQgewot CQlmbXQuUHJpbnRmKCJGb3VuZCBzY2hlZGJlbmNoLCBkZXN0cm95aW5nXG4iKQotCi0JCWVyciA9 IEN0eC5DcHVwb29sRGVzdHJveShwb29sLlBvb2xpZCkKLQkJaWYgZXJyICE9IG5pbCB7Ci0JCQlm bXQuUHJpbnRmKCJDb3VsZG4ndCBkZXN0cm95IHBvb2w6ICV2XG4iLCBlcnIpCi0JCQlyZXR1cm4K LQkJfQotCi0JCWZtdC5QcmludGYoIlJldHVybmluZyBjcHVzIHRvIHBvb2wgMCBmb3IgZnVuXG4i KQotCQllcnIgPSBDdHguQ3B1cG9vbENwdWFkZENwdW1hcCgwLCBwb29sLkNwdW1hcCkKLQkJaWYg ZXJyICE9IG5pbCB7Ci0JCQlmbXQuUHJpbnRmKCJDb3VsZG4ndCBhZGQgY3B1cyB0byBkb21haW4g MDogJXZcbiIsIGVycikKLQkJCXJldHVybgotCQl9Ci0JfQotCi0JQ3B1bWFwID0gQml0bWFwe30K LQotCUNwdW1hcC5TZXRSYW5nZSgxMiwgMTUpCi0KLQlmbXQuUHJpbnRmKCJGcmVlaW5nIGNwdXNc biIpCi0JZXJyID0gQ3R4LkNwdXBvb2xNYWtlRnJlZShDcHVtYXApCi0JaWYgZXJyICE9IG5pbCB7 Ci0JCWZtdC5QcmludGYoIkNvdWxkbid0IGZyZWUgY3B1czogJXZcbiIsIGVycikKLQkJcmV0dXJu Ci0JfQotCi0KLQlmbXQuUHJpbnRmKCJDcmVhdGluZyBuZXcgcG9vbFxuIikKLQotCWVyciwgUG9v bGlkIDo9IEN0eC5DcHVwb29sQ3JlYXRlKCJzY2hlZGJlbmNoIiwgU2NoZWR1bGVyQ3JlZGl0LCBD cHVtYXApCi0JaWYgZXJyICE9IG5pbCB7Ci0JCWZtdC5QcmludGYoIkVycm9yIGNyZWF0aW5nIGNw dXBvb2w6ICV2XG4iLCBlcnIpCi0JfSBlbHNlIHsKLQkJZm10LlByaW50ZigiUG9vbCBpZDogJWRc biIsIFBvb2xpZCkKLQl9Ci0KLQlwb29sID0gQ3R4LkNwdXBvb2xJbmZvKDApCi0JZm10LlByaW50 ZigiQ3B1cG9vbCAwIGluZm86ICV2XG4iLCBwb29sKQotCQotCUN0eC5DbG9zZSgpCi19CmRpZmYg LS1naXQgYS9tYWluLmdvIGIvbWFpbi5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg ZWFkNmFiMC4uMDAwMDAwMAotLS0gYS9tYWluLmdvCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICsw LDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgR2VvcmdlIFcuIER1bmxhcCwgQ2l0cml4 IFN5c3RlbXMgVUsgTHRkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlv dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt cyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0 aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlCi0gKiBMaWNlbnNl IG9ubHkuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo YXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIAotICogWW91IHNob3VsZCBoYXZl IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFs b25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl Ci0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBC b3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EuCi0gKi8KLQotcGFja2FnZSBtYWluCi0KLWlt cG9ydCAoCi0JImZtdCIKLQkib3MiCi0JInN0cmNvbnYiCi0pCi0KLWZ1bmMgbWFpbigpIHsKLQlB cmdzIDo9IG9zLkFyZ3MKLQotCUFyZ3MgPSBBcmdzWzE6XQotCWZpbGVuYW1lIDo9ICJ0ZXN0LmJl bmNoIgotCXRlbXBsYXRlIDo9ICIiCi0JdmVyYm9zaXR5IDo9IDAKLQotCWZvciBsZW4oQXJncykg PiAwIHsKLQkJc3dpdGNoKEFyZ3NbMF0pIHsKLQkJY2FzZSAiLWYiOgotCQkJaWYgbGVuKEFyZ3Mp IDwgMiB7Ci0JCQkJZm10LlByaW50bG4oIk5lZWQgYXJnIGZvciAtZiIpCi0JCQkJb3MuRXhpdCgx KQotCQkJfQotCQkJZmlsZW5hbWUgPSBBcmdzWzFdCi0JCQlBcmdzID0gQXJnc1syOl0KLQkJY2Fz ZSAiLXQiOgotCQkJaWYgbGVuKEFyZ3MpIDwgMiB7Ci0JCQkJZm10LlByaW50bG4oIk5lZWQgYXJn IGZvciAtdCIpCi0JCQkJb3MuRXhpdCgxKQotCQkJfQotCQkJdGVtcGxhdGUgPSBBcmdzWzFdCi0J CQlBcmdzID0gQXJnc1syOl0KLQkJY2FzZSAiLXYiOgotCQkJaWYgbGVuKEFyZ3MpIDwgMiB7Ci0J CQkJZm10LlByaW50bG4oIk5lZWQgYXJnIGZvciAtdiIpCi0JCQkJb3MuRXhpdCgxKQotCQkJfQot CQkJdmVyYm9zaXR5LCBfID0gc3RyY29udi5BdG9pKEFyZ3NbMV0pCi0JCQlBcmdzID0gQXJnc1sy Ol0KLQkJY2FzZSAicGxhbiI6Ci0JCQkvLyBMb2FkIGVpdGhlciB0aGUgdGVtcGxhdGUgYmVuY2ht YXJrIG9yIHRoZSBmaWxlbmFtZQotCQkJbG9hZGZpbGUgOj0gZmlsZW5hbWUKLQkJCWlmIHRlbXBs YXRlICE9ICIiIHsKLQkJCQlsb2FkZmlsZSA9IHRlbXBsYXRlCi0JCQl9Ci0JCQlwbGFuLCBlcnIg Oj0gTG9hZEJlbmNobWFyayhsb2FkZmlsZSkKLQkJCWlmIGVyciAhPSBuaWwgewotCQkJCWZtdC5Q cmludGYoIkxvYWRpbmcgYmVuY2htYXJrICVzOiAldlxuIiwKLQkJCQkJbG9hZGZpbGUsIGVycikK LQkJCQlvcy5FeGl0KDEpCi0JCQl9Ci0KLQkJCWlmIHRlbXBsYXRlICE9ICIiIHsKLQkJCQlwbGFu LmZpbGVuYW1lID0gZmlsZW5hbWUKLQkJCQllcnIgPSBwbGFuLkNsZWFyUnVucygpCi0JCQkJaWYg ZXJyICE9IG5pbCB7Ci0JCQkJCWZtdC5QcmludGYoIkNsZWFyaW5nIHJ1bnM6ICV2XG4iLAotCQkJ CQkJZXJyKQotCQkJCQlvcy5FeGl0KDEpCi0JCQkJfQotCQkJfQotCQkJCi0JCQllcnIgPSBwbGFu LkV4cGFuZElucHV0KCkKLQkJCWlmIGVyciAhPSBuaWwgewotCQkJCWZtdC5QcmludGYoIkV4cGFu ZGluZyBwbGFuOiAldlxuIiwgZXJyKQotCQkJCW9zLkV4aXQoMSkKLQkJCX0KLQotCQkJZXJyID0g cGxhbi5TYXZlKCkKLQkJCWlmIGVyciAhPSBuaWwgewotCQkJCWZtdC5QcmludGYoIlNhdmluZyBw bGFuICVzOiAldlxuIiwgZmlsZW5hbWUsIGVycikKLQkJCQlvcy5FeGl0KDEpCi0JCQl9Ci0JCQlm bXQuUHJpbnRmKCJDcmVhdGVkIHBsYW4gaW4gJXNcbiIsIGZpbGVuYW1lKQotCQkJQXJncyA9IEFy Z3NbMTpdCi0JCWNhc2UgInJ1biI6Ci0JCQlwbGFuLCBlcnIgOj0gTG9hZEJlbmNobWFyayhmaWxl bmFtZSkKLQkJCWlmIGVyciAhPSBuaWwgewotCQkJCWZtdC5QcmludGxuKCJMb2FkaW5nIGJlbmNo bWFyayAiLCBmaWxlbmFtZSwgIiAiLCBlcnIpCi0JCQkJb3MuRXhpdCgxKQotCQkJfQotCQkJCi0J CQllcnIgPSBwbGFuLlJ1bigpCi0JCQlpZiBlcnIgIT0gbmlsIHsKLQkJCQlmbXQuUHJpbnRsbigi UnVubmluZyBiZW5jaG1hcmsgcnVuOiIsIGVycikKLQkJCQlvcy5FeGl0KDEpCi0JCQl9Ci0JCQlB cmdzID0gQXJnc1sxOl0KLQkJCQotCQljYXNlICJyZXBvcnQiOgotCQkJQXJncyA9IEFyZ3NbMTpd Ci0JCQlwbGFuLCBlcnIgOj0gTG9hZEJlbmNobWFyayhmaWxlbmFtZSkKLQkJCWlmIGVyciAhPSBu aWwgewotCQkJCWZtdC5QcmludGxuKCJMb2FkaW5nIGJlbmNobWFyayAiLCBmaWxlbmFtZSwgIiAi LCBlcnIpCi0JCQkJb3MuRXhpdCgxKQotCQkJfQotCQkJCi0JCQllcnIgPSBwbGFuLlRleHRSZXBv cnQodmVyYm9zaXR5KQotCQkJaWYgZXJyICE9IG5pbCB7Ci0JCQkJZm10LlByaW50bG4oIlJ1bm5p bmcgYmVuY2htYXJrIHJ1bjoiLCBlcnIpCi0JCQkJb3MuRXhpdCgxKQotCQkJfQotCQljYXNlICJo dG1scmVwb3J0IjoKLQkJCXBsYW4sIGVyciA6PSBMb2FkQmVuY2htYXJrKGZpbGVuYW1lKQotCQkJ aWYgZXJyICE9IG5pbCB7Ci0JCQkJZm10LlByaW50bG4oIkxvYWRpbmcgYmVuY2htYXJrICIsIGZp bGVuYW1lLCAiICIsIGVycikKLQkJCQlvcy5FeGl0KDEpCi0JCQl9Ci0JCQkKLQkJCWVyciA9IHBs YW4uSFRNTFJlcG9ydCgpCi0JCQlpZiBlcnIgIT0gbmlsIHsKLQkJCQlmbXQuUHJpbnRsbigiUnVu bmluZyBiZW5jaG1hcmsgcnVuOiIsIGVycikKLQkJCQlvcy5FeGl0KDEpCi0JCQl9Ci0JCQlBcmdz ID0gQXJnc1sxOl0KLQotCQljYXNlICJ4bHRlc3QiOgotCQkJWGxUZXN0KEFyZ3MpCi0JCQlBcmdz ID0gbmlsCi0JCQkKLQkJZGVmYXVsdDoKLQkJCWZtdC5QcmludGxuKCJVbmtub3duIGFyZ3VtZW50 OiAiLCBBcmdzWzBdKQotCQkJb3MuRXhpdCgxKQotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS9w bGFuLmdvIGIvcGxhbi5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhlMGM2Yi4u MDAwMDAwMAotLS0gYS9wbGFuLmdvCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8q Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgR2VvcmdlIFcuIER1bmxhcCwgQ2l0cml4IFN5c3RlbXMg VUsgTHRkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk aXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlCi0gKiBMaWNlbnNlIG9ubHkuCi0g KgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls bCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0 aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIAotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk IGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGgg dGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3Vu ZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1B Ci0gKiAwMjExMC0xMzAxLCBVU0EuCi0gKi8KLXBhY2thZ2UgbWFpbgotCi1pbXBvcnQgKAotCSJm bXQiCi0pCi0KLXR5cGUgUGxhblNpbXBsZU1hdHJpeCBzdHJ1Y3QgewotCVNjaGVkdWxlcnMgW11z dHJpbmcKLQlXb3JrZXJzIFtdc3RyaW5nCi0JQ291bnQgW11pbnQKLQlOdW1hRGlzYWJsZSBbXWJv b2wKLX0KLQotdHlwZSBQbGFuSW5wdXQgc3RydWN0IHsKLQlXb3JrZXJQcmVzZXRzIG1hcFtzdHJp bmddV29ya2VyUGFyYW1zCi0JU2ltcGxlTWF0cml4ICpQbGFuU2ltcGxlTWF0cml4Ci19Ci0KLXZh ciBXb3JrZXJQcmVzZXRzID0gbWFwW3N0cmluZ11Xb3JrZXJQYXJhbXN7Ci0JIlAwMDEiOldvcmtl clBhcmFtc3tbXXN0cmluZ3siYnVybndhaXQiLCAiNzAiLCAiMjAwMDAwIn19LAotfQotCi1mdW5j IChwbGFuICpCZW5jaG1hcmtQbGFuKSBDbGVhclJ1bnMoKSAoZXJyIGVycm9yKSB7Ci0JcGxhbi5S dW5zID0gbmlsCi0KLQlyZXR1cm4KLX0KLQotZnVuYyAocGxhbiAqQmVuY2htYXJrUGxhbikgRXhw YW5kSW5wdXQoKSAoZXJyIGVycm9yKSB7Ci0JaWYgcGxhbi5SdW5zICE9IG5pbCB7Ci0JCWVyciA9 IGZtdC5FcnJvcmYoIlJ1bnMgbm9uLWVtcHR5LCBub3QgZG9pbmcgYW55dGhpbmdcbiIpOwotCQly ZXR1cm4KLQl9Ci0KLQlpZiBwbGFuLklucHV0ID09IG5pbCB7Ci0JCWVyciA9IGZtdC5FcnJvcmYo IklucHV0IG5pbCwgbm90aGluZyB0byBkbyIpCi0JCXJldHVybgotCX0KLQkKLQlpZiBwbGFuLklu cHV0LlNpbXBsZU1hdHJpeCA9PSBuaWwgewotCQllcnIgPSBmbXQuRXJyb3JmKCJJbnB1dC5TaW1w bGVNYXRyaXggbmlsLCBub3RoaW5nIHRvIGRvXG4iKTsKLQkJcmV0dXJuCi0JfQotCi0JZm9yIGsg Oj0gcmFuZ2UgcGxhbi5JbnB1dC5Xb3JrZXJQcmVzZXRzIHsKLQkJV29ya2VyUHJlc2V0c1trXSA9 IHBsYW4uSW5wdXQuV29ya2VyUHJlc2V0c1trXTsKLQl9Ci0KLQkvLyBVc2UgbmFtZWQgc2NoZWR1 bGVycywgb3IgZGVmYXVsdCB0byAiIiAod2hpY2ggd2lsbCB1c2UgdGhlCi0JLy8gY3VycmVudCBv bmUpCi0JdmFyIHNjaGVkdWxlcnMgW11zdHJpbmcKLQlpZiBwbGFuLklucHV0LlNpbXBsZU1hdHJp eC5TY2hlZHVsZXJzICE9IG5pbCB7Ci0JCXNjaGVkdWxlcnMgPSBwbGFuLklucHV0LlNpbXBsZU1h dHJpeC5TY2hlZHVsZXJzCi0JfSBlbHNlIHsKLQkJc2NoZWR1bGVycyA9IGFwcGVuZChzY2hlZHVs ZXJzLCAiIikKLQl9Ci0KLQkvLyBTdGFydCBieSBtYWtpbmcgYSBzbGljZSB3aXRoIGJhc2VsaW5l cyBhbmQgZWFjaCBvZiB0aGUgY291bnRzCi0JdmFyIGEsIGIgW11CZW5jaG1hcmtSdW4KLQkKLQlm b3IgXywgd24gOj0gcmFuZ2UgcGxhbi5JbnB1dC5TaW1wbGVNYXRyaXguV29ya2VycyB7Ci0JCXdw IDo9IFdvcmtlclByZXNldHNbd25dCi0JCQotCQlpZiB3cC5BcmdzID09IG5pbCB7Ci0JCQllcnIg PSBmbXQuRXJyb3JmKCJJbnZhbGlkIHdvcmtlciBwcmVzZXQ6ICVzIiwgd24pCi0JCQlyZXR1cm4K LQkJfQotCQkKLQkJcnVuIDo9IEJlbmNobWFya1J1bnsKLQkJCVdvcmtlclNldHM6W11Xb3JrZXJT ZXR7e1BhcmFtczp3cCwgQ291bnQ6MX19LAotCQkJUnVudGltZVNlY29uZHM6MTAsCi0JCX0KLQot CQlydW4uTGFiZWwgPSB3bisiIGJhc2VsaW5lIgotCQlhID0gYXBwZW5kKGEsIHJ1bikKLQl9Ci0K LQotCWZvciBfLCBjIDo9IHJhbmdlIHBsYW4uSW5wdXQuU2ltcGxlTWF0cml4LkNvdW50IHsKLQkJ cnVuIDo9IEJlbmNobWFya1J1bnsKLQkJCVJ1bnRpbWVTZWNvbmRzOjEwLAotCQl9Ci0JCQotCQlm b3IgXywgd24gOj0gcmFuZ2UgcGxhbi5JbnB1dC5TaW1wbGVNYXRyaXguV29ya2VycyB7Ci0JCQl3 cCA6PSBXb3JrZXJQcmVzZXRzW3duXQotCQkJCi0JCQlpZiBydW4uTGFiZWwgIT0gIiIgewotCQkJ CXJ1bi5MYWJlbCA9IHJ1bi5MYWJlbCsiICsgIgotCQkJfQotCQkJcnVuLkxhYmVsID0gZm10LlNw cmludGYoIiVzJXMgJWQiLCBydW4uTGFiZWwsIHduLCBjKQotCi0JCQl3cyA6PSBXb3JrZXJTZXR7 UGFyYW1zOndwLCBDb3VudDpjfQotCQkJcnVuLldvcmtlclNldHMgPSBhcHBlbmQocnVuLldvcmtl clNldHMsIHdzKQotCQl9Ci0KLQkJYSA9IGFwcGVuZChhLCBydW4pCi0JfQotCi0JLy8gLi4udGhl biBjcm9zcyBpdCBieSBzY2hlZHVsZXJzCi0JaWYgbGVuKHNjaGVkdWxlcnMpID4gMCB7Ci0JCWZv ciBfLCBiYXNlIDo9IHJhbmdlIGEgewotCQkJZm9yIF8sIHMgOj0gcmFuZ2Ugc2NoZWR1bGVycyB7 Ci0JCQkJcnVuIDo9IGJhc2UKLQkJCQlydW4uUnVuQ29uZmlnLlNjaGVkdWxlciA9IHMKLQkJCQly dW4uTGFiZWwgPSBydW4uTGFiZWwrIiAiK3MKLQkJCQliID0gYXBwZW5kKGIsIHJ1bikKLQkJCX0K LQkJfQotCQlhID0gYgotCQliID0gbmlsCi0JfQotCi0JLy8gLi4uYW5kIE51bWFEaXNhYmxlCi0J aWYgbGVuKHBsYW4uSW5wdXQuU2ltcGxlTWF0cml4Lk51bWFEaXNhYmxlKSA+IDAgewotCQlmb3Ig XywgYmFzZSA6PSByYW5nZSBhIHsKLQkJCWZvciBfLCBkIDo9IHJhbmdlIHBsYW4uSW5wdXQuU2lt cGxlTWF0cml4Lk51bWFEaXNhYmxlIHsKLQkJCQlydW4gOj0gYmFzZQotCQkJCS8vIE5lZWQgdG8g bWFrZSBhIGNvcHkgb2YgdGhpcyBzbyB0aGF0Ci0JCQkJLy8gd2UgaGF2ZSBhIHBvaW50ZXIgdG8g dXNlIGFzIGEgdHJpc3RhdGUKLQkJCQlydW4uUnVuQ29uZmlnLk51bWFEaXNhYmxlID0gbmV3KGJv b2wpCi0JCQkJKnJ1bi5SdW5Db25maWcuTnVtYURpc2FibGUgPSBkCi0JCQkJaWYgZCB7Ci0JCQkJ CXJ1bi5MYWJlbCA9IHJ1bi5MYWJlbCsiIE51bWFPZmYiCi0JCQkJfSBlbHNlIHsKLQkJCQkJcnVu LkxhYmVsID0gcnVuLkxhYmVsKyIgTnVtYU9uICIKLQkJCQl9Ci0JCQkJYiA9IGFwcGVuZChiLCBy dW4pCi0JCQl9Ci0JCX0KLQkJYSA9IGIKLQkJYiA9IG5pbAotCX0KLQotCWZvciBpIDo9IHJhbmdl IGEgewotCQlmbXQuUHJpbnRmKCIlc1xuIiwgYVtpXS5MYWJlbCkKLQl9Ci0JcGxhbi5SdW5zID0g YTsKLQlyZXR1cm4KLX0KZGlmZiAtLWdpdCBhL3Byb2Nlc3N3b3JrZXIuZ28gYi9wcm9jZXNzd29y a2VyLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzI3ZjE1Li4wMDAwMDAwCi0t LSBhL3Byb2Nlc3N3b3JrZXIuZ28KKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgot ICogQ29weXJpZ2h0IChDKSAyMDE2IEdlb3JnZSBXLiBEdW5sYXAsIENpdHJpeCBTeXN0ZW1zIFVL IEx0ZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz dHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m dHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZQotICogTGljZW5zZSBvbmx5LgotICoK LSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg YmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl IGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKiAKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh IGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRo aXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRh dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQot ICogMDIxMTAtMTMwMSwgVVNBLgotICovCi1wYWNrYWdlIG1haW4KLQotaW1wb3J0ICgKLQkiZm10 IgotCSJvcy9leGVjIgotCSJlbmNvZGluZy9qc29uIgotCSJidWZpbyIKLQkiaW8iCi0JCi0pCi0K LXR5cGUgUHJvY2Vzc1dvcmtlciBzdHJ1Y3QgewotCWlkIFdvcmtlcklkCi0JYyAqZXhlYy5DbWQK LQlzdGRvdXQgaW8uUmVhZENsb3NlcgotCWpzb25TdGFydGVkIGJvb2wKLQlMb2cgW11zdHJpbmcK LX0KLQotZnVuYyAodyAqUHJvY2Vzc1dvcmtlcikgU2V0SWQoaSBXb3JrZXJJZCkgewotCXcuaWQg PSBpCi19Ci0KLWZ1bmMgKHcgKlByb2Nlc3NXb3JrZXIpIEluaXQocCBXb3JrZXJQYXJhbXMsIGcg V29ya2VyQ29uZmlnKSAoZXJyIGVycm9yKSB7Ci0Jdy5jID0gZXhlYy5Db21tYW5kKCIuL3dvcmtl ci1wcm9jIiwgcC5BcmdzLi4uKQotCi0Jdy5zdGRvdXQsIGVyciA9IHcuYy5TdGRvdXRQaXBlKCkK LQlpZiBlcnIgIT0gbmlsIHsKLQkJZm10LlByaW50KCJDb25uZXRpbmcgdG8gc3Rkb3V0OiAiLCBl cnIpCi0JCXJldHVybgotCX0KLQotCXJldHVybgotfQotCi1mdW5jICh3ICpQcm9jZXNzV29ya2Vy KSBTaHV0ZG93bigpIHsKLQl3LmMuUHJvY2Vzcy5LaWxsKCkKLX0KLQotZnVuYyAodyAqUHJvY2Vz c1dvcmtlcikgRHVtcExvZyhmIGlvLldyaXRlcikgKGVyciBlcnJvcikgewotCWIgOj0gYnVmaW8u TmV3V3JpdGVyKGYpCi0JZGVmZXIgYi5GbHVzaCgpCi0JZm9yIF8sIGxpbmUgOj0gcmFuZ2Ugdy5M b2cgewotCQlfLCBlcnIgPSBmbXQuUHJpbnRsbihiLCBsaW5lKQotCQlpZiBlcnIgIT0gbmlsIHsK LQkJCXJldHVybgotCQl9Ci0JfQotCXJldHVybgotfQotCi1mdW5jICh3ICpQcm9jZXNzV29ya2Vy KSBQcm9jZXNzKHJlcG9ydCBjaGFuIFdvcmtlclJlcG9ydCwgZG9uZSBjaGFuIFdvcmtlcklkKSB7 Ci0Jdy5jLlN0YXJ0KCkKLQotCXNjYW5uZXIgOj0gYnVmaW8uTmV3U2Nhbm5lcih3LnN0ZG91dCkK LQotCWZvciBzY2FubmVyLlNjYW4oKSB7Ci0JCXMgOj0gc2Nhbm5lci5UZXh0KCkKLQkJCi0JCS8v Zm10LlByaW50bG4oIkdvdCB0aGVzZSBieXRlczogIiwgcyk7Ci0JCXcuTG9nID0gYXBwZW5kKHcu TG9nLCBzKQotCi0JCWlmIHcuanNvblN0YXJ0ZWQgewotCQkJdmFyIHIgV29ya2VyUmVwb3J0Ci0J CQlqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZyKQotCQkJci5JZCA9IHcuaWQKLQkJCXJlcG9y dCA8LSByCi0JCX0gZWxzZSB7Ci0JCQlpZiBzID09ICJTVEFSVCBKU09OIiB7Ci0JCQkJLy9mbXQu UHJpbnRsbigiR290IHRva2VuIHRvIHN0YXJ0IHBhcnNpbmcganNvbiIpCi0JCQkJdy5qc29uU3Rh cnRlZCA9IHRydWUKLQkJCX0KLQkJfQotCX0KLQotCWRvbmUgPC0gdy5pZAotCi0Jdy5jLldhaXQo KQotfQotCmRpZmYgLS1naXQgYS9ydW4uZ28gYi9ydW4uZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IGQxYzVkOTUuLjAwMDAwMDAKLS0tIGEvcnVuLmdvCisrKyAvZGV2L251bGwKQEAg LTEsNDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgR2VvcmdlIFcuIER1bmxh cCwgQ2l0cml4IFN5c3RlbXMgVUsgTHRkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29m dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVy IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxp c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlCi0g KiBMaWNlbnNlIG9ubHkuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRo ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFO VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklM SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAq IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIAotICogWW91IHNo b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVl IFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRo IEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EuCi0gKi8KLXBhY2thZ2UgbWFp bgotCi1pbXBvcnQgKAotCSJmbXQiCi0JIm9zIgotCSJvcy9zaWduYWwiCi0JInRpbWUiCi0JInJl Z2V4cCIKLQkic3RyY29udiIKLQkiYnVmaW8iCi0JImlvIgotKQotCi10eXBlIFdvcmtlclN0YXRl IHN0cnVjdCB7Ci0JdyBXb3JrZXIKLQlMYXN0UmVwb3J0IFdvcmtlclJlcG9ydAotfQotCi10eXBl IFdvcmtlciBpbnRlcmZhY2UgewotCVNldElkKFdvcmtlcklkKQotCUluaXQoV29ya2VyUGFyYW1z LCBXb3JrZXJDb25maWcpIGVycm9yCi0JU2h1dGRvd24oKQotCVByb2Nlc3MoY2hhbiBXb3JrZXJS ZXBvcnQsIGNoYW4gV29ya2VySWQpCi0JRHVtcExvZyhpby5Xcml0ZXIpIGVycm9yCi19Ci0KLWZ1 bmMgUmVwb3J0KHdzICpXb3JrZXJTdGF0ZSwgciBXb3JrZXJSZXBvcnQpIHsKLQkvL2ZtdC5Qcmlu dGxuKHIpCi0KLQlsciA6PSB3cy5MYXN0UmVwb3J0Ci0KLQlpZiAobHIuTm93ID4gMCkgewotCQl0 aW1lIDo9IGZsb2F0NjQoci5Ob3cpIC8gU0VDCi0JCWR0aW1lIDo9IGZsb2F0NjQoci5Ob3cgLSBs ci5Ob3cpIC8gU0VDCi0JCWtvcHMgOj0gci5Lb3BzIC0gbHIuS29wcwotCi0JCXRwdXQgOj0gVGhy b3VnaHB1dChsci5Ob3csIGxyLktvcHMsIHIuTm93LCByLktvcHMpCi0KLQkJdXRpbCA6PSBVdGls aXphdGlvbihsci5Ob3csIGxyLkNwdXRpbWUsIHIuTm93LCByLkNwdXRpbWUpCi0JCQotCQlmbXQu UHJpbnRmKCIldiAlOC4zZiBbJTguM2ZdIGNwdSAlOC4zZiBbJTguM2ZdIEtvcHM6ICU4ZCBbJThk XSBUcHV0OiAlNC4yZiBVdGlsOiAlNC4yZlxuIiwKLQkJCXIuSWQsIHRpbWUsIGR0aW1lLCByLkNw dXRpbWUuU2Vjb25kcygpLCByLkNwdXRpbWUuU2Vjb25kcygpIC0gbHIuQ3B1dGltZS5TZWNvbmRz KCksCi0JCQlyLktvcHMsIGtvcHMsIHRwdXQsIHV0aWwpOwotCX0KLQotCXdzLkxhc3RSZXBvcnQg PSByCi19Ci0KLXR5cGUgV29ya2VyTGlzdCBtYXBbV29ya2VySWRdKldvcmtlclN0YXRlCi0KLWZ1 bmMgKHdzICpXb3JrZXJMaXN0KSBTdGFydChyZXBvcnQgY2hhbiBXb3JrZXJSZXBvcnQsIGRvbmUg Y2hhbiBXb3JrZXJJZCkgKGkgaW50KSB7Ci0JaSA9IDAKLQlmb3IgaiA6PSByYW5nZSAqd3Mgewot CQlnbyAoKndzKVtqXS53LlByb2Nlc3MocmVwb3J0LCBkb25lKQotCQlpKysKLQl9Ci0JcmV0dXJu Ci19Ci0KLWZ1bmMgKHdzICpXb3JrZXJMaXN0KSBTdG9wKCkgewotCWZvciBpIDo9IHJhbmdlICp3 cyB7Ci0JCSgqd3MpW2ldLncuU2h1dGRvd24oKQotCX0KLX0KLQotY29uc3QgKAotCVdvcmtlclBy b2Nlc3MgPSBpb3RhCi0JV29ya2VyWGVuID0gaW90YQotKQotCi1mdW5jIE5ld1dvcmtlckxpc3Qo V29ya2VyU2V0cyBbXVdvcmtlclNldCwgd29ya2VyVHlwZSBpbnQpICh3bCBXb3JrZXJMaXN0LCBl cnIgZXJyb3IpIHsKLQl3bCA9IFdvcmtlckxpc3QobWFrZShtYXBbV29ya2VySWRdKldvcmtlclN0 YXRlKSkKLQotCWZvciB3c2kgOj0gcmFuZ2UgV29ya2VyU2V0cyB7Ci0JCWZvciBpIDo9IDA7IGkg PCBXb3JrZXJTZXRzW3dzaV0uQ291bnQ7IGkgPSBpKzEgewotCQkJSWQgOj0gV29ya2VySWR7U2V0 OndzaSxJZDppfQotCi0JCQl3cyA6PSB3bFtJZF0KLQotCQkJaWYgd3MgIT0gbmlsIHsKLQkJCQlw YW5pYygiRHVwbGljYXRlIHdvcmtlciBmb3IgaWQhIikKLQkJCX0KLQkJCQotCQkJd3MgPSAmV29y a2VyU3RhdGV7fQotCQkJCi0JCQlzd2l0Y2ggd29ya2VyVHlwZSB7Ci0JCQljYXNlIFdvcmtlclBy b2Nlc3M6Ci0JCQkJd3MudyA9ICZQcm9jZXNzV29ya2Vye30KLQkJCWNhc2UgV29ya2VyWGVuOgot CQkJCXdzLncgPSAmWGVuV29ya2Vye30KLQkJCWRlZmF1bHQ6Ci0JCQkJZXJyID0gZm10LkVycm9y ZigiVW5rbm93biB0eXBlOiAlZCIsIHdvcmtlclR5cGUpCi0JCQkJcmV0dXJuCi0JCQl9Ci0JCQkK LQkJCXdzLncuU2V0SWQoSWQpCi0JCQotCQkJd3Mudy5Jbml0KFdvcmtlclNldHNbd3NpXS5QYXJh bXMsIFdvcmtlclNldHNbd3NpXS5Db25maWcpCi0KLQkJCXdsW0lkXSA9IHdzCi0JCX0KLQl9Ci0J cmV0dXJuCi19Ci0KLXZhciBDcHVrSFogdWludDY0Ci0KLWZ1bmMgZ2V0Q3B1SHooKSAoZXJyIGVy cm9yKSB7Ci0JaWYgQ3B1a0haID09IDAgewotCQl2YXIgY3B1aW5mbyAqb3MuRmlsZQotCQljcHVp bmZvLCBlcnIgPSBvcy5PcGVuKCIvcHJvYy9jcHVpbmZvIikKLQkJaWYgZXJyICE9IG5pbCB7Ci0J CQlyZXR1cm4KLQkJfQotCQlyZSA6PSByZWdleHAuTXVzdENvbXBpbGUoIl5jcHUgTUh6XFxzKjog KFswLTkuXSspJCIpCi0JCXNjYW5uZXIgOj0gYnVmaW8uTmV3U2Nhbm5lcihjcHVpbmZvKQotCQlm b3Igc2Nhbm5lci5TY2FuKCkgewotCQkJcyA6PSBzY2FubmVyLlRleHQoKQotCQkJbSA6PSByZS5G aW5kU3RyaW5nU3VibWF0Y2gocykKLQkJCWlmIG0gIT0gbmlsIHsKLQkJCQl2YXIgTUhaIGZsb2F0 NjQKLQkJCQlNSFosIGVyciA9IHN0cmNvbnYuUGFyc2VGbG9hdChtWzFdLCA2NCkKLQkJCQlpZiBl cnIgIT0gbmlsIHsKLQkJCQkJcmV0dXJuCi0JCQkJfQotCQkJCUNwdWtIWiA9IHVpbnQ2NChNSFoq MTAwMCkKLQkJCQlicmVhawotCQkJfQotCQl9Ci0JCWlmIENwdWtIWiA9PSAwIHsKLQkJCWVyciA9 IGZtdC5FcnJvcmYoIkNvdWxkbid0IGZpbmQgY3B1IE1IeiIpCi0JCQlyZXR1cm4KLQkJfSBlbHNl IHsKLQkJCWZtdC5QcmludGxuKCJDcHVrSFo6ICIsIENwdWtIWikKLQkJCQotCQl9Ci0JfQotCXJl dHVybgotfQotCi0vLyBJZiB0aGUgcG9vbCBpcyBzcGVjaWZpZWQsIHVzZSB0aGF0IHBvb2w7IG90 aGVyd2lzZSBhc3N1bWUgcG9vbCAwLgotLy8KLS8vIFVuc3BlY2lmaWVkIHNjaGVkdWxlcnMgbWF0 Y2ggYW55IHBvb2w7IHVuc3BlY2lmaWVuZCBjcHUgbGlzdHMgbWF0Y2gKLS8vIGFueSBwb29sLgot Ly8KLS8vIElmIHRoZSBwb29sIGV4aXN0cyBhbmQgdGhlIHNjaGVkdWxlciBhbmQgY3B1IGxpc3Rz IG1hdGNoIHRoZSBwb29sLAotLy8gY2Fycnkgb24uICAoVGhpcyBpcyBydW5uaW5nIHRoZSBWTXMg aW4gYSBwcmUtY29uZmlndXJlZCBwb29sLikKLS8vCi0vLyBJZiB0aGUgcG9vbCBleGlzdHMgYW5k IGVpdGhlciB0aGUgc2NoZWR1bGVyIG9yIHRoZSBjcHVzIGRvbid0IG1hdGNoCi0vLyB0aGUgcG9v bCwgYW5kIHRoaXMgaXMgcG9vbCAwLCBza2lwLgotLy8KLS8vIFRPRE86IElmIHRoZSBzY2hlZHVs ZXIgbWF0Y2hlcyBidXQgdGhlIGNwdXMgZG9uJ3QsIG1vZGlmeSB0aGUgcG9vbAotLy8gYnkgYWRk aW5nIG9yIHJlbW92aW5nIGNwdXMuICAoVGhpcyBjYW4gYmUgZG9uZSBmb3IgUG9vbC0wIGFzIHdl bGwuKQotLy8KLS8vIElmIHRoZSBwb29sIGlzIG5vdCBQb29sLTAsIGFuZCB0aGUgc2NoZWR1bGVy IGRvZXNuJ3QgbWF0Y2ggb3IgdGhlCi0vLyBwb29sIGRvZXNuJ3QgZXhpc3QsIGJ1dCB0aGVyZSBh cmUgbm8gY3B1cywgc2tpcCAoYmVjYXVzZSB3ZSBkb24ndAotLy8gaGF2ZSBlbm91Z2ggaW5mb3Jt YXRpb24gdG8gY3JlYXRlIHRoZSBwb29sKS4KLS8vCi0vLyBJZiB0aGUgcG9vbCBpcyBub3QgUG9v bC0wLCBhbmQgZWl0aGVyIHRoZSBzY2hlZHVsZXIgb3IgdGhlIGNwdXMKLS8vIGRvbid0IG1hdGNo LCBhbmQgdGhlIGNwdXMgYXJlIHNwZWNpZmllZCwgY3JlYXRlIHRoZSBwb29sLgotZnVuYyAocnVu ICpCZW5jaG1hcmtSdW4pIFByZXAoKSAocmVhZHkgYm9vbCwgd2h5IHN0cmluZykgewotCXZhciBw b29sIENwdXBvb2xJbmZvCi0JcG9vbFByZXNlbnQgOj0gZmFsc2UKLQkKLQkvLyBHZW5lcmF0ZSB0 aGUgcmVxdWVzdGVkIGNwdW1hcAotCXZhciBDcHVtYXAgQml0bWFwCi0JaWYgcnVuLlJ1bkNvbmZp Zy5DcHVzICE9IG5pbCB7Ci0JCWZtdC5QcmludCgiUnVuLlByZXA6IENwdXM6ICIpCi0JCXByaW50 ZWQgOj0gZmFsc2UKLQkJZm9yIF8sIGkgOj0gcmFuZ2UgcnVuLlJ1bkNvbmZpZy5DcHVzIHsKLQkJ CWlmIHByaW50ZWQgewotCQkJCWZtdC5QcmludGYoIiwlZCIsIGkpCi0JCQl9IGVsc2UgewotCQkJ CXByaW50ZWQgPSB0cnVlCi0JCQkJZm10LlByaW50ZigiJWQiLCBpKQotCQkJfQkJCQkKLQkJCUNw dW1hcC5TZXQoaSkKLQkJfQotCQlmbXQuUHJpbnQoIlxuIikKLQkJaWYgQ3B1bWFwLklzRW1wdHko KSB7Ci0JCQl3aHkgPSAiSW52YWxpZCAoZW1wdHkpIGNwdW1hcCIKLQkJCXJldHVybgotCQl9Ci0J fQotCQotCi0JaWYgcnVuLlJ1bkNvbmZpZy5Qb29sID09ICIiIHsKLQkJZm10LlByaW50ZigiUnVu LlByZXA6IE5vIHBvb2wgc2V0LCB1c2luZyAwXG4iKQotCQlwb29sID0gQ3R4LkNwdXBvb2xJbmZv KDApCi0JCXBvb2xQcmVzZW50ID0gdHJ1ZQotCX0gZWxzZSB7Ci0JCXBvb2wsIHBvb2xQcmVzZW50 ID0gQ3R4LkNwdXBvb2xGaW5kQnlOYW1lKHJ1bi5SdW5Db25maWcuUG9vbCkKLQkJaWYgcG9vbFBy ZXNlbnQgewotCQkJZm10LlByaW50ZigiUnVuLlByZXA6IFBvb2wgJXMgZm91bmQsIFBvb2xpZCAl ZFxuIiwKLQkJCQlydW4uUnVuQ29uZmlnLlBvb2wsIHBvb2wuUG9vbGlkKQotCQl9IGVsc2Ugewot CQkJZm10LlByaW50ZigiUnVuLlByZXA6IFBvb2wgJXMgbm90IGZvdW5kXG4iKQotCQl9Ci0JfQot Ci0Jc2NoZWRNYXRjaGVzIDo9IHRydWUKLQlpZiBydW4uUnVuQ29uZmlnLlNjaGVkdWxlciAhPSAi IiAmJgotCQlwb29sUHJlc2VudCAmJgotCQlwb29sLlNjaGVkdWxlci5TdHJpbmcoKSAhPSBydW4u UnVuQ29uZmlnLlNjaGVkdWxlciB7Ci0JCQlzY2hlZE1hdGNoZXMgPSBmYWxzZTsKLQl9Ci0KLQlj cHVNYXRjaGVzIDo9IHRydWUKLQlpZiBydW4uUnVuQ29uZmlnLkNwdXMgIT0gbmlsIHsKLQkJaWYg IXBvb2xQcmVzZW50IHsKLQkJCWNwdU1hdGNoZXMgPSBmYWxzZQotCQl9IGVsc2UgewotCQkJZm9y IGkgOj0gMDsgaSA8PSBwb29sLkNwdW1hcC5NYXgoKTsgaSsrIHsKLQkJCQlpZiBwb29sLkNwdW1h cC5UZXN0KGkpICE9IENwdW1hcC5UZXN0KGkpIHsKLQkJCQkJZm10LlByaW50ZigiUHJlcDogY3B1 ICVkOiBwb29sICV2LCB3YW50ICV2LCBiYWlsaW5nXG4iLAotCQkJCQkJaSwgcG9vbC5DcHVtYXAu VGVzdChpKSwgQ3B1bWFwLlRlc3QoaSkpCi0JCQkJCWNwdU1hdGNoZXMgPSBmYWxzZQotCQkJCQli cmVhawotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkJCi0KLQkvLyBJZiB3ZSdyZSB1c2luZyBwb29s IDAsIGFuZCB0aGUgc2NoZWR1bGVyIG9yIGNwdXMgZG9uJ3QKLQkvLyBtYXRjaCwgYmFpbDsgb3Ro ZXJ3aXNlIHNheSB3ZSdyZSByZWFkeS4KLQlpZiBwb29sUHJlc2VudCAmJiBwb29sLlBvb2xpZCA9 PSAwIHsKLQkJaWYgISBzY2hlZE1hdGNoZXMgewotCQkJd2h5ID0gInNjaGVkdWxlciAhPSAiK3J1 bi5SdW5Db25maWcuU2NoZWR1bGVyKyIsIGNhbid0IGNoYW5nZSIKLQkJCXJldHVybgotCQl9Ci0K LQkJLy8gVE9ETzogQWN0dWFsbHksIHdlIGNhbiBtb2RpZnkgcG9vbCAwOyBsZWF2ZSB0aGlzIHVu dGlsIHdlIHdhbnQgaXQuCi0JCWlmICEgY3B1TWF0Y2hlcyB7Ci0JCQl3aHkgPSAiQ3B1bWFwIG1p c21hdGNoIgotCQkJcmV0dXJuCi0JCX0KLQotCQlmbXQuUHJpbnRmKCJQcmVwOiBQb29saWQgMCwg c2NoZWQgYW5kIGNwdW1hcCBtYXRjaGVzXG4iKQotCQlyZWFkeSA9IHRydWUKLQkJcmV0dXJuCi0J fQotCi0JLy8gT0ssIHdlIGdvdCBoZXJlIGl0Ci0JaWYgcnVuLlJ1bkNvbmZpZy5DcHVzID09IG5p bCB7Ci0JCS8vIE5vIGNvbnN0cnVjdGlvbiBpbmZvcm1hdGlvbjsgaXMgdGhlIGNwdXBvb2wgcmVh ZHkgd2l0aG91dCBpdD8KLQkJaWYgIXBvb2xQcmVzZW50IHsKLQkJCXdoeSA9ICJQb29sIG5vdCBw cmVzZW50LCBubyBwb29sIGNvbnN0cnVjdGlvbiBpbmZvcm1hdGlvbiIKLQkJCXJldHVybgotCQl9 IGVsc2UgaWYgIXNjaGVkTWF0Y2hlcyB7Ci0JCQl3aHkgPSAic2NoZWR1bGVyICE9ICIrcnVuLlJ1 bkNvbmZpZy5TY2hlZHVsZXIrIiwgbm8gcG9vbCBjb25zdHJ1Y3Rpb24gaW5mb3JtYXRpb24iCi0J CQlyZXR1cm4KLQkJfQotCi0JCS8vIFNjaGVkdWxlciBtYXRjaGVzLCBwb29sIHByZXNlbnQsIGNw dXMgbm90Ci0JCS8vIHNwZWNpZmllZCwganVzdCBnbyB3aXRoIGl0Ci0JCXJlYWR5ID0gdHJ1ZQot CQlyZXR1cm4KLQl9Ci0KLQkvLyBPSywgd2UgaGF2ZSBhbGwgdGhlIGluZm9ybWF0aW9uIHdlIG5l ZWQgdG8gY3JlYXRlIHRoZSBwb29sIHdlIHdhbnQuCi0JU2NoZWR1bGVyIDo9IFNjaGVkdWxlckNy ZWRpdAotCWVyciA6PSBTY2hlZHVsZXIuRnJvbVN0cmluZyhydW4uUnVuQ29uZmlnLlNjaGVkdWxl cikKLQlpZiBlcnIgIT0gbmlsIHsKLQkJd2h5ID0gIkludmFsaWQgc2NoZWR1bGVyOiAiK3J1bi5S dW5Db25maWcuU2NoZWR1bGVyCi0JCXJldHVybgotCX0KLQotCS8vIERlc3Ryb3kgdGhlIHBvb2wg aWYgaXQncyBwcmVzZW50OwotCWlmIHBvb2xQcmVzZW50IHsKLQkJZXJyIDo9IEN0eC5DcHVwb29s RGVzdHJveShwb29sLlBvb2xpZCkKLQkJaWYgZXJyICE9IG5pbCB7Ci0JCQlmbXQuUHJpbnRmKCJU cnlpbmcgdG8gZGVzdHJveSBwb29sOiAldlxuIiwgZXJyKQotCQkJd2h5ID0gIkNvdWxkbid0IGRl c3Ryb3kgY3B1cG9vbCIKLQkJCXJldHVybgotCQl9Ci0JfQotCi0JLy8gRnJlZSB0aGUgY3B1cyB3 ZSBuZWVkOwotCWVyciA9IEN0eC5DcHVwb29sTWFrZUZyZWUoQ3B1bWFwKQotCWlmIGVyciAhPSBu aWwgewotCQl3aHkgPSAiQ291bGRuJ3QgZnJlZSBjcHVzIgotCQlyZXR1cm4KLQl9Ci0KLQkvLyBB bmQgY3JlYXRlIHRoZSBwb29sLgotCWVyciwgXyA9IEN0eC5DcHVwb29sQ3JlYXRlKCJzY2hlZGJl bmNoIiwgU2NoZWR1bGVyLCBDcHVtYXApCi0JaWYgZXJyICE9IG5pbCB7Ci0JCXdoeSA9ICJDb3Vs ZG4ndCBjcmVhdGUgY3B1cG9vbCIKLQkJcmV0dXJuCi0JfQotCi0JcmVhZHkgPSB0cnVlCi0JcmV0 dXJuIAotfQotCi1mdW5jIChydW4gKkJlbmNobWFya1J1bikgR2V0Q3B1bWFwKCkgKENwdW1hcCBC aXRtYXApIHsKLQlpZiBydW4uUnVuQ29uZmlnLlBvb2wgPT0gIiIgewotCQlmbXQuUHJpbnRmKCJS dW4uUHJlcDogTm8gcG9vbCBzZXQsIHVzaW5nIDBcbiIpCi0JCXBvb2wgOj0gQ3R4LkNwdXBvb2xJ bmZvKDApCi0JCUNwdW1hcCA9IHBvb2wuQ3B1bWFwCi0JfSBlbHNlIHsKLQkJcG9vbCwgcG9vbFBy ZXNlbnQgOj0gQ3R4LkNwdXBvb2xGaW5kQnlOYW1lKHJ1bi5SdW5Db25maWcuUG9vbCkKLQkJaWYg cG9vbFByZXNlbnQgewotCQkJQ3B1bWFwID0gcG9vbC5DcHVtYXAKLQkJfSBlbHNlIHsKLQkJCXBh bmljKCJydW4uR2V0Q3B1bWFwKCk6IFBvb2wgIitydW4uUnVuQ29uZmlnLlBvb2wrIiBub3QgZm91 bmQhIikKLQkJfQotCX0KLQlyZXR1cm4KLX0KLQotZnVuYyAocnVuICpCZW5jaG1hcmtSdW4pIFJ1 bigpIChlcnIgZXJyb3IpIHsKLQlmb3Igd3NpIDo9IHJhbmdlIHJ1bi5Xb3JrZXJTZXRzIHsKLQkJ Y29uZiA6PSAmcnVuLldvcmtlclNldHNbd3NpXS5Db25maWcKLQkJCi0JCWNvbmYuUHJvcGFnYXRl RnJvbShydW4uV29ya2VyQ29uZmlnKQotCQlpZiBjb25mLlBvb2wgPT0gIiIgewotCQkJY29uZi5Q b29sID0gcnVuLlJ1bkNvbmZpZy5Qb29sCi0JCX0KLQkJcnVuLldvcmtlclNldHNbd3NpXS5QYXJh bXMuU2V0a0haKENwdWtIWikKLQkJCi0JCWlmICpydW4uUnVuQ29uZmlnLk51bWFEaXNhYmxlIHsK LQkJCWlmIGNvbmYuU29mdEFmZmluaXR5ICE9ICIiIHsKLQkJCQllcnIgPSBmbXQuRXJyb3JmKCJD YW5ub3QgZGlzYWJsZSBOdW1hIGlmIFNvZnRBZmZpbml0eSBpcyBzZXQhIikKLQkJCQlyZXR1cm4K LQkJCX0KLQkJCS8vIERpc2FibGUgbGlieGwgTlVNQSBieSBzZXR0aW5nIHRoZSBzb2Z0Ci0JCQkv LyBhZmZpbml0eSB0byB0aGUgc2V0IG9mIGNwdXMgaW4gdGhlIGNwdXBvb2wKLQkJIAljb25mLlNv ZnRBZmZpbml0eSA9IHJ1bi5HZXRDcHVtYXAoKS5TdHJpbmcoKQotCQkJZm10LlByaW50ZigiU2V0 dGluZyBTb2Z0QWZmaW5pdHkgdG8gJXMgdG8gZGlzYWJsZSBOVU1BIHBsYWNlbWVudFxuIiwKLQkJ CQljb25mLlNvZnRBZmZpbml0eSkKLQkJfQotCX0KLQkKLQlXb3JrZXJzLCBlcnIgOj0gTmV3V29y a2VyTGlzdChydW4uV29ya2VyU2V0cywgV29ya2VyWGVuKQotCWlmIGVyciAhPSBuaWwgewotCQlm bXQuUHJpbnRsbigiRXJyb3IgY3JlYXRpbmcgd29ya2VyczogJXYiLCBlcnIpCi0JCXJldHVybgot Ci0JfQotCQotCXJlcG9ydCA6PSBtYWtlKGNoYW4gV29ya2VyUmVwb3J0KQotCWRvbmUgOj0gbWFr ZShjaGFuIFdvcmtlcklkKQotCXNpZ25hbHMgOj0gbWFrZShjaGFuIG9zLlNpZ25hbCwgMSkKLQot CXNpZ25hbC5Ob3RpZnkoc2lnbmFscywgb3MuSW50ZXJydXB0KQotCQotCWkgOj0gV29ya2Vycy5T dGFydChyZXBvcnQsIGRvbmUpCi0KLQkvLyBGSVhNRToKLQkvLyAxLiBNYWtlIGEgemVybyB0aW1l b3V0IG1lYW4gIm5ldmVyIgotCS8vIDIuIE1ha2UgdGhlIHNpZ25hbHMgLyB0aW1lb3V0IHRoaW5n IGEgYml0IG1vcmUgcmF0aW9uYWw7IHNpZ25hbCB0aGVuIHRpbWVvdXQgc2hvdWxkbid0IGhhcmQg a2lsbAotCXRpbWVvdXQgOj0gdGltZS5BZnRlcih0aW1lLkR1cmF0aW9uKHJ1bi5SdW50aW1lU2Vj b25kcykgKiB0aW1lLlNlY29uZCk7Ci0Jc3RvcHBlZCA6PSBmYWxzZQotCWZvciBpID4gMCB7Ci0J CXNlbGVjdCB7Ci0JCWNhc2UgciA6PSA8LXJlcG9ydDoKLQkJCWlmICEgc3RvcHBlZCB7Ci0JCQkJ cnVuLlJlc3VsdHMuUmF3ID0gYXBwZW5kKHJ1bi5SZXN1bHRzLlJhdywgcikKLQkJCQlSZXBvcnQo V29ya2Vyc1tyLklkXSwgcikKLQkJCX0KLQkJY2FzZSBkaWQgOj0gPC1kb25lOgotCQkJaWYgISBz dG9wcGVkIHsKLQkJCQlmbXQuUHJpbnRsbigiV0FSTklORzogV29ya2VyIiwgZGlkLCAibGVmdCBl YXJseSwgc2h1dHRpbmcgZG93biB3b3JrZXJzIikKLQkJCQlXb3JrZXJzLlN0b3AoKQotCQkJCXN0 b3BwZWQgPSB0cnVlCi0JCQkJZXJyID0gZm10LkVycm9yZigiV29ya2VyICV2IGV4aXRlZCBlYXJs eSIsIGRpZCkKLQkJCQlXb3JrZXJzW2RpZF0udy5EdW1wTG9nKG9zLlN0ZG91dCkKLQkJCX0KLQkJ CWktLTsKLQkJCWZtdC5QcmludGYoIldvcmtlciAldiBleGl0ZWQ7ICVkIHdvcmtlcnMgbGVmdFxu IiwgZGlkLCBpKTsKLQkJY2FzZSA8LXRpbWVvdXQ6Ci0JCQlpZiAhIHN0b3BwZWQgewotCQkJCVdv cmtlcnMuU3RvcCgpCi0JCQkJc3RvcHBlZCA9IHRydWUKLQkJCQlydW4uQ29tcGxldGVkID0gdHJ1 ZQotCQkJfQotCQljYXNlIDwtc2lnbmFsczoKLQkJCWlmICEgc3RvcHBlZCB7Ci0JCQkJZm10LlBy aW50bG4oIlNJR0lOVCByZWNlaWV2ZWQsIHNodXR0aW5nIGRvd24gd29ya2VycyIpCi0JCQkJV29y a2Vycy5TdG9wKCkKLQkJCQlzdG9wcGVkID0gdHJ1ZQotCQkJCWlmIHJ1bi5SdW50aW1lU2Vjb25k cyA9PSAwIHsKLQkJCQkJcnVuLkNvbXBsZXRlZCA9IHRydWUKLQkJCQl9Ci0JCQkJZXJyID0gZm10 LkVycm9yZigiSW50ZXJydXB0ZWQiKQotCQkJfSBlbHNlIHsKLQkJCQlmbXQuUHJpbnRsbigiU0lH SU5UIHJlY2VpdmVkIGFmdGVyIHN0b3AsIGV4aXRpbmcgd2l0aG91dCBjbGVhbmluZyB1cCIpCi0J CQkJcmV0dXJuCi0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuCi19Ci0KLWZ1bmMgKHBsYW4gKkJlbmNo bWFya1BsYW4pIFJ1bigpIChlcnIgZXJyb3IpIHsKLQotCWVyciA9IGdldENwdUh6KCkKLQlpZiBl cnIgIT0gbmlsIHsKLQkJcmV0dXJuCi0JfQotCi0JaWYgcGxhbi5Xb3JrZXJUeXBlID09IFdvcmtl clhlbiB7Ci0JCWVyciA9IEN0eC5PcGVuKCkKLQkJaWYgZXJyICE9IG5pbCB7Ci0JCQlyZXR1cm4K LQkJfQotCX0KLQkKLQlmb3IgaSA6PSByYW5nZSBwbGFuLlJ1bnMgewotCQlyIDo9ICZwbGFuLlJ1 bnNbaV07Ci0JCWlmICEgci5Db21wbGV0ZWQgeyAKLQkJCXIuV29ya2VyQ29uZmlnLlByb3BhZ2F0 ZUZyb20ocGxhbi5Xb3JrZXJDb25maWcpCi0JCQlyLlJ1bkNvbmZpZy5Qcm9wYWdhdGVGcm9tKHBs YW4uUnVuQ29uZmlnKQotCQkJcmVhZHksIHdoeSA6PSByLlByZXAoKQotCQkJaWYgcmVhZHkgewot CQkJCWZtdC5QcmludGYoIlJ1bm5pbmcgdGVzdCBbJWRdICVzXG4iLCBpLCByLkxhYmVsKQotCQkJ CWVyciA9IHIuUnVuKCkKLQkJCQlpZiBlcnIgIT0gbmlsIHsKLQkJCQkJcmV0dXJuCi0JCQkJfQot CQkJfSBlbHNlIHsKLQkJCQlmbXQuUHJpbnRmKCJUZXN0IFslZF06ICVzIHNraXBwZWQgKCVzKVxu IiwgaSwgci5MYWJlbCwgd2h5KQotCQkJfQotCQl9Ci0JCWlmIHIuQ29tcGxldGVkIHsKLQkJCWZt dC5QcmludGYoIlRlc3QgWyVkXSAlcyBjb21wbGV0ZWRcbiIsIGksIHIuTGFiZWwpCi0JCQllcnIg PSBwbGFuLlNhdmUoKQotCQkJaWYgZXJyICE9IG5pbCB7Ci0JCQkJZm10LlByaW50bG4oIkVycm9y IHNhdmluZzogIiwgZXJyKQotCQkJCXJldHVybgotCQkJfQotCQl9Ci0JfQotCXJldHVybgotfQot CmRpZmYgLS1naXQgYS9zdHVicy5nbyBiL3N0dWJzLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCA3ODk4N2FkLi4wMDAwMDAwCi0tLSBhL3N0dWJzLmdvCisrKyAvZGV2L251bGwKQEAg LTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBHZW9yZ2UgVy4gRHVubGFw LCBDaXRyaXggU3lzdGVtcyBVSyBMdGQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0 d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlz aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUKLSAq IExpY2Vuc2Ugb25seS4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhl IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5U WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJ VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICog R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICogCi0gKiBZb3Ugc2hv dWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUg U29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGgg Rmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotcGFja2FnZSBtYWlu Ci0KLWltcG9ydCAoCi0JImZtdCIKLSkKLQotZnVuYyAocGxhbiAqQmVuY2htYXJrUGxhbikgUnVu KCkgKGVyciBlcnJvcikgewotCWVyciA9IGZtdC5FcnJvcmYoIk5vdCBpbXBsZW1lbnRlZCIpCi0K LQlyZXR1cm4KLX0KLQotZnVuYyBYbFRlc3QoQXJncyBbXXN0cmluZykgewotCXJldHVybgotfQot CmRpZmYgLS1naXQgYS90b29scy9nb2xhbmcveGVubGlnaHQvbGlieGwuZ28gYi90b29scy9nb2xh bmcveGVubGlnaHQvbGlieGwuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u YWE1YzAxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2dvbGFuZy94ZW5saWdodC9saWJ4bC5n bwpAQCAtMCwwICsxLDcyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBHZW9yZ2UgVy4g RHVubGFwLCBDaXRyaXggU3lzdGVtcyBVSyBMdGQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQg dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICog cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0 aGUKKyAqIExpY2Vuc2Ugb25seS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQg aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBX QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFO VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO VQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZ b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhl IEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg RmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworcGFja2Fn ZSBtYWluCisKKy8qCisjY2dvIExERkxBR1M6IC1seGVubGlnaHQgLWx5YWpsX3MgLWx4ZW5nbnR0 YWIgLWx4ZW5zdG9yZSAtbHhlbmd1ZXN0IC1seGVudG9vbGxvZyAtbHhlbmV2dGNobiAtbHhlbmN0 cmwgLWxibGt0YXBjdGwgLWx4ZW5mb3JlaWdubWVtb3J5IC1seGVuY2FsbCAtbHogLWx1dWlkIC1s dXRpbAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpYnhsLmg+CisqLworaW1wb3J0 ICJDIgorCisvKgorICogT3RoZXIgZmxhZ3MgdGhhdCBtYXkgYmUgbmVlZGVkIGF0IHNvbWUgcG9p bnQ6IAorICogIC1sbmwtcm91dGUtMyAtbG5sLTMKKyAqCisgKiBUbyBnZXQgYmFjayB0byBzaW1w bGUgZHluYW1pYyBsaW5raW5nOgorI2NnbyBMREZMQUdTOiAtbHhlbmxpZ2h0IC1seWFqbAorKi8K KworaW1wb3J0ICgKKwkidW5zYWZlIgorCSJmbXQiCisJInRpbWUiCispCisKKy8qCisgKiBUeXBl czogQnVpbHRpbnMKKyAqLworCit0eXBlIERvbWlkIHVpbnQzMgorCit0eXBlIE1lbUtCIHVpbnQ2 NAorCisvLyB0eXBlZGVmIHN0cnVjdCB7CisvLyAgICAgdWludDMyX3Qgc2l6ZTsgICAgICAgICAg LyogbnVtYmVyIG9mIGJ5dGVzIGluIG1hcCAqLworLy8gICAgIHVpbnQ4X3QgKm1hcDsKKy8vIH0g bGlieGxfYml0bWFwOworCisvLyBJbXBsZW1lbnQgdGhlIEdvIGJpdG1hcCB0eXBlIHN1Y2ggdGhh dCB0aGUgdW5kZXJseWluZyBkYXRhIGNhbgorLy8gZWFzaWx5IGJlIGNvcGllZCBpbiBhbmQgb3V0 LiAgTkIgdGhhdCB3ZSBzdGlsbCBoYXZlIHRvIGRvIGNvcGllcworLy8gYm90aCBkaXJlY3Rpb25z LCBiZWNhdXNlIGNnbyBydW50aW1lIHJlc3RyaWN0aW9ucyBmb3JiaWQgcGFzc2luZyB0bworLy8g YSBDIGZ1bmN0aW9uIGEgcG9pbnRlciB0byBhIEdvLWFsbG9jYXRlZCBzdHJ1Y3R1cmUgd2hpY2gg Y29udGFpbnMgYQorLy8gcG9pbnRlci4KK3R5cGUgQml0bWFwIHN0cnVjdCB7CisJYml0bWFwIFtd Qy51aW50OF90Cit9CisKK3R5cGUgQ29udGV4dCBzdHJ1Y3QgeworCWN0eCAqQy5saWJ4bF9jdHgK K30KKwordHlwZSBVdWlkIEMubGlieGxfdXVpZAorCisvKgorICogVHlwZXM6IElETAorICogCisg KiBGSVhNRTogR2VuZXJhdGUgdGhlc2UgYXV0b21hdGljYWxseSBmcm9tIHRoZSBJREwKKyAqLwor dHlwZSBEb21pbmZvIHN0cnVjdCB7CisJVXVpZCAgICAgICAgICAgICAgVXVpZAorCURvbWlkICAg ICAgICAgICAgIERvbWlkCisJUnVubmluZyAgICAgICAgICAgYm9vbAorCUJsb2NrZWQgICAgICAg ICAgIGJvb2wKKwlQYXVzZWQgICAgICAgICAgICBib29sCisJU2h1dGRvd24gICAgICAgICAgYm9v bAorCUR5aW5nICAgICAgICAgICAgIGJvb2wKKwlOZXZlcl9zdG9wICAgICAgICBib29sCisJCisJ U2h1dGRvd25fcmVhc29uICAgaW50MzIgLy8gRklYTUUgc2h1dGRvd25fcmVhc29uIGVudW1lcmF0 aW9uCisJT3V0c3RhbmRpbmdfbWVta2IgTWVtS0IKKwlDdXJyZW50X21lbWtiICAgICBNZW1LQgor CVNoYXJlZF9tZW1rYiAgICAgIE1lbUtCCisJUGFnZWRfbWVta2IgICAgICAgTWVtS0IKKwlNYXhf bWVta2IgICAgICAgICBNZW1LQgorCUNwdV90aW1lICAgICAgICAgIHRpbWUuRHVyYXRpb24KKwlW Y3B1X21heF9pZCAgICAgICB1aW50MzIKKwlWY3B1X29ubGluZSAgICAgICB1aW50MzIKKwlDcHVw b29sICAgICAgICAgICB1aW50MzIKKwlEb21haW5fdHlwZSAgICAgICBpbnQzMiAvL0ZJWE1FIGxp YnhsX2RvbWFpbl90eXBlIGVudW1lcmF0aW9uCisKK30KKworLy8gIyBDb25zaXN0ZW50IHdpdGgg dmFsdWVzIGRlZmluZWQgaW4gZG9tY3RsLmgKKy8vICMgRXhjZXB0IHVua25vd24gd2hpY2ggd2Ug aGF2ZSBtYWRlIHVwCisvLyBsaWJ4bF9zY2hlZHVsZXIgPSBFbnVtZXJhdGlvbigic2NoZWR1bGVy IiwgWworLy8gICAgICgwLCAidW5rbm93biIpLAorLy8gICAgICg0LCAic2VkZiIpLAorLy8gICAg ICg1LCAiY3JlZGl0IiksCisvLyAgICAgKDYsICJjcmVkaXQyIiksCisvLyAgICAgKDcsICJhcmlu YzY1MyIpLAorLy8gICAgICg4LCAicnRkcyIpLAorLy8gICAgIF0pCit0eXBlIFNjaGVkdWxlciBp bnQKK3ZhciAoCisJU2NoZWR1bGVyVW5rbm93biAgU2NoZWR1bGVyID0gQy5MSUJYTF9TQ0hFRFVM RVJfVU5LTk9XTgorCVNjaGVkdWxlclNlZGYgICAgIFNjaGVkdWxlciA9IEMuTElCWExfU0NIRURV TEVSX1NFREYKKwlTY2hlZHVsZXJDcmVkaXQgICBTY2hlZHVsZXIgPSBDLkxJQlhMX1NDSEVEVUxF Ul9DUkVESVQKKwlTY2hlZHVsZXJDcmVkaXQyICBTY2hlZHVsZXIgPSBDLkxJQlhMX1NDSEVEVUxF Ul9DUkVESVQyCisJU2NoZWR1bGVyQXJpbmM2NTMgU2NoZWR1bGVyID0gQy5MSUJYTF9TQ0hFRFVM RVJfQVJJTkM2NTMKKwlTY2hlZHVsZXJSVERTICAgICBTY2hlZHVsZXIgPSBDLkxJQlhMX1NDSEVE VUxFUl9SVERTCispCisKKy8vIGxpYnhsX2NwdXBvb2xpbmZvID0gU3RydWN0KCJjcHVwb29saW5m byIsIFsKKy8vICAgICAoInBvb2xpZCIsICAgICAgdWludDMyKSwKKy8vICAgICAoInBvb2xfbmFt ZSIsICAgc3RyaW5nKSwKKy8vICAgICAoInNjaGVkIiwgICAgICAgbGlieGxfc2NoZWR1bGVyKSwK Ky8vICAgICAoIm5fZG9tIiwgICAgICAgdWludDMyKSwKKy8vICAgICAoImNwdW1hcCIsICAgICAg bGlieGxfYml0bWFwKQorLy8gICAgIF0sIGRpcj1ESVJfT1VUKQorCit0eXBlIENwdXBvb2xJbmZv IHN0cnVjdCB7CisJUG9vbGlkIHVpbnQzMgorCVBvb2xOYW1lIHN0cmluZworCVNjaGVkdWxlciBT Y2hlZHVsZXIKKwlEb21haW5Db3VudCBpbnQKKwlDcHVtYXAgQml0bWFwCit9CisKKy8qCisgKiBD b250ZXh0CisgKi8KK3ZhciBDdHggQ29udGV4dAorCitmdW5jIChDdHggKkNvbnRleHQpIElzT3Bl bigpIGJvb2wgeworCXJldHVybiBDdHguY3R4ICE9IG5pbAorfQorCitmdW5jIChDdHggKkNvbnRl eHQpIE9wZW4oKSAoZXJyIGVycm9yKSB7CisJaWYgQ3R4LmN0eCAhPSBuaWwgeworCQlyZXR1cm4K Kwl9CisJCisJcmV0IDo9IEMubGlieGxfY3R4X2FsbG9jKHVuc2FmZS5Qb2ludGVyKCZDdHguY3R4 KSwgQy5MSUJYTF9WRVJTSU9OLCAwLCBuaWwpCisKKwlpZiByZXQgIT0gMCB7CisJCWVyciA9IGZt dC5FcnJvcmYoIkFsbG9jYXRpbmcgbGlieGwgY29udGV4dDogJWQiLCByZXQpCisJfQorCXJldHVy bgorfQorCitmdW5jIChDdHggKkNvbnRleHQpIENsb3NlKCkgKGVyciBlcnJvcikgeworCXJldCA6 PSBDLmxpYnhsX2N0eF9mcmVlKHVuc2FmZS5Qb2ludGVyKEN0eC5jdHgpKQorCUN0eC5jdHggPSBu aWwKKworCWlmIHJldCAhPSAwIHsKKwkJZXJyID0gZm10LkVycm9yZigiRnJlZWluZyBsaWJ4bCBj b250ZXh0OiAlZCIsIHJldCkKKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKEN0eCAqQ29udGV4dCkg Q2hlY2tPcGVuKCkgKGVyciBlcnJvcikgeworCWlmIEN0eC5jdHggPT0gbmlsIHsKKwkJZXJyID0g Zm10LkVycm9yZigiQ29udGV4dCBub3Qgb3BlbmVkIikKKwl9CisJcmV0dXJuCit9CisKK2Z1bmMg KEN0eCAqQ29udGV4dCkgRG9tYWluSW5mbyhJZCBEb21pZCkgKGRpICpEb21pbmZvLCBlcnIgZXJy b3IpIHsKKwllcnIgPSBDdHguQ2hlY2tPcGVuKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJu CisJfQorCisJdmFyIGNkaSBDLmxpYnhsX2RvbWluZm8KKworCXJldCA6PSBDLmxpYnhsX2RvbWFp bl9pbmZvKEN0eC5jdHgsIHVuc2FmZS5Qb2ludGVyKCZjZGkpLCBDLnVpbnQzMl90KElkKSkKKwor CS8vIEZJWE1FOiBJc0RvbWFpbk5vdFByZXNlbnRFcnJvcgorCWlmIHJldCAhPSAwIHsKKwkJZXJy ID0gZm10LkVycm9yZigibGlieGxfZG9tYWluX2luZm8gZmFpbGVkOiAlZCIsIHJldCkKKwkJcmV0 dXJuCisJfQorCisJLy8gV2UgY291bGQgY29uc2lkZXIgaGF2aW5nIHRoaXMgYm9pbGVycGxhdGUg Z2VuZXJhdGVkIGJ5IHRoZQorCS8vIGlkbCwgaW4gYSBmdW5jdGlvbiBsaWtlIHRoaXM6CisJLy8K KwkvLyBkaSA9IHRyYW5zbGF0ZUNkb21haW5pbmZvVG9Hb0RvbWFpbmluZm8oY2RpKQorCWRpID0g JkRvbWluZm97fQorCWRpLlV1aWQgPSBVdWlkKGNkaS51dWlkKQorCWRpLkRvbWlkID0gRG9taWQo Y2RpLmRvbWlkKQorCWRpLlJ1bm5pbmcgPSBib29sKGNkaS5ydW5uaW5nKQorCWRpLkJsb2NrZWQg PSBib29sKGNkaS5ibG9ja2VkKQorCWRpLlBhdXNlZCA9IGJvb2woY2RpLnBhdXNlZCkKKwlkaS5T aHV0ZG93biA9IGJvb2woY2RpLnNodXRkb3duKQorCWRpLkR5aW5nID0gYm9vbChjZGkuZHlpbmcp CisJZGkuTmV2ZXJfc3RvcCA9IGJvb2woY2RpLm5ldmVyX3N0b3ApCisJZGkuU2h1dGRvd25fcmVh c29uID0gaW50MzIoY2RpLnNodXRkb3duX3JlYXNvbikKKwlkaS5PdXRzdGFuZGluZ19tZW1rYiA9 IE1lbUtCKGNkaS5vdXRzdGFuZGluZ19tZW1rYikKKwlkaS5DdXJyZW50X21lbWtiID0gTWVtS0Io Y2RpLmN1cnJlbnRfbWVta2IpCisJZGkuU2hhcmVkX21lbWtiID0gTWVtS0IoY2RpLnNoYXJlZF9t ZW1rYikKKwlkaS5QYWdlZF9tZW1rYiA9IE1lbUtCKGNkaS5wYWdlZF9tZW1rYikKKwlkaS5NYXhf bWVta2IgPSBNZW1LQihjZGkubWF4X21lbWtiKQorCWRpLkNwdV90aW1lID0gdGltZS5EdXJhdGlv bihjZGkuY3B1X3RpbWUpCisJZGkuVmNwdV9tYXhfaWQgPSB1aW50MzIoY2RpLnZjcHVfbWF4X2lk KQorCWRpLlZjcHVfb25saW5lID0gdWludDMyKGNkaS52Y3B1X29ubGluZSkKKwlkaS5DcHVwb29s ID0gdWludDMyKGNkaS5jcHVwb29sKQorCWRpLkRvbWFpbl90eXBlID0gaW50MzIoY2RpLmRvbWFp bl90eXBlKQorCisJcmV0dXJuCit9CisKK2Z1bmMgKEN0eCAqQ29udGV4dCkgRG9tYWluVW5wYXVz ZShJZCBEb21pZCkgKGVyciBlcnJvcikgeworCWVyciA9IEN0eC5DaGVja09wZW4oKQorCWlmIGVy ciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisKKwlyZXQgOj0gQy5saWJ4bF9kb21haW5fdW5wYXVz ZShDdHguY3R4LCBDLnVpbnQzMl90KElkKSkKKworCWlmIHJldCAhPSAwIHsKKwkJZXJyID0gZm10 LkVycm9yZigibGlieGxfZG9tYWluX3VucGF1c2UgZmFpbGVkOiAlZCIsIHJldCkKKwl9CisJcmV0 dXJuCit9CisKKy8qCisgKiBCaXRtYXAgb3BlcmF0aW9ucworICovCisKKy8vIFJldHVybiBhIEdv IGJpdG1hcCB3aGljaCBpcyBhIGNvcHkgb2YgdGhlIHJlZmVycmVkIEMgYml0bWFwLgorZnVuYyBi aXRtYXBDVG9HbyhjYm0gQy5saWJ4bF9iaXRtYXApIChnYm0gQml0bWFwKSB7CisJLy8gQWxsb2Mg YSBHbyBzbGljZSBmb3IgdGhlIGJ5dGVzCisJc2l6ZSA6PSBpbnQoY2JtLnNpemUpCisJZ2JtLmJp dG1hcCA9IG1ha2UoW11DLnVpbnQ4X3QsIHNpemUpCisKKwkvLyBNYWtlIGEgc2xpY2UgcG9pbnRp bmcgdG8gdGhlIEMgYXJyYXkKKwltYXBzbGljZSA6PSAoKlsxIDw8IDMwXUMudWludDhfdCkodW5z YWZlLlBvaW50ZXIoY2JtLl9tYXApKVs6c2l6ZTpzaXplXQorCisJLy8gQW5kIGNvcHkgdGhlIEMg YXJyYXkgaW50byB0aGUgR28gYXJyYXkKKwljb3B5KGdibS5iaXRtYXAsIG1hcHNsaWNlKQorCisJ cmV0dXJuCit9CisKKy8vIE11c3QgYmUgQy5saWJ4bF9iaXRtYXBfZGlzcG9zZSdkIG9mIGFmdGVy d2FyZHMKK2Z1bmMgYml0bWFwR290b0MoZ2JtIEJpdG1hcCkgKGNibSBDLmxpYnhsX2JpdG1hcCkg eworCUMubGlieGxfYml0bWFwX2luaXQoJmNibSkKKworCXNpemUgOj0gbGVuKGdibS5iaXRtYXAp CisJY2JtLl9tYXAgPSAoKkMudWludDhfdCkoQy5tYWxsb2MoQy5zaXplX3Qoc2l6ZSkpKQorCWNi bS5zaXplID0gQy51aW50MzJfdChzaXplKQorCWlmIGNibS5fbWFwID09IG5pbCB7CisJCXBhbmlj KCJDLmNhbGxvYyBmYWlsZWQhIikKKwl9CisKKwkvLyBNYWtlIGEgc2xpY2UgcG9pbnRpbmcgdG8g dGhlIEMgYXJyYXkKKwltYXBzbGljZSA6PSAoKlsxIDw8IDMwXUMudWludDhfdCkodW5zYWZlLlBv aW50ZXIoY2JtLl9tYXApKVs6c2l6ZTpzaXplXQorCisJLy8gQW5kIGNvcHkgdGhlIEdvIGFycmF5 IGludG8gdGhlIEMgYXJyYXkKKwljb3B5KG1hcHNsaWNlLCBnYm0uYml0bWFwKQorCisJcmV0dXJu Cit9CisKK2Z1bmMgKGJtICpCaXRtYXApIFRlc3QoYml0IGludCkgKGJvb2wpIHsKKwl1Yml0IDo9 IHVpbnQoYml0KQorCWlmIChiaXQgPiBibS5NYXgoKSB8fCBibS5iaXRtYXAgPT0gbmlsKSB7CisJ CXJldHVybiBmYWxzZQorCX0KKwkKKwlyZXR1cm4gKGJtLmJpdG1hcFtiaXQgLyA4XSAmICgxIDw8 ICh1Yml0ICYgNykpKSAhPSAwCit9CisKK2Z1bmMgKGJtICpCaXRtYXApIFNldChiaXQgaW50KSB7 CisJaWJpdCA6PSBiaXQgLyA4OworCWlmIChpYml0ICsgMSA+IGxlbihibS5iaXRtYXApKSB7CisJ CWJtLmJpdG1hcCA9IGFwcGVuZChibS5iaXRtYXAsIG1ha2UoW11DLnVpbnQ4X3QsIGliaXQrMS1s ZW4oYm0uYml0bWFwKSkuLi4pCisJfQorCQorCWJtLmJpdG1hcFtpYml0XSB8PSAxIDw8ICh1aW50 KGJpdCkgJiA3KQorfQorCitmdW5jIChibSAqQml0bWFwKSBTZXRSYW5nZShzdGFydCBpbnQsIGVu ZCBpbnQpIHsKKwlmb3IgaSA6PSBzdGFydDsgaSA8PSBlbmQ7IGkrKyB7CisJCWJtLlNldChpKQor CX0KK30KKworZnVuYyAoYm0gKkJpdG1hcCkgQ2xlYXIoYml0IGludCkgeworCXViaXQgOj0gdWlu dChiaXQpCisJaWYgKGJpdCA+IGJtLk1heCgpIHx8IGJtLmJpdG1hcCA9PSBuaWwpIHsKKwkJcmV0 dXJuCisJfQorCQorCWJtLmJpdG1hcFtiaXQgLyA4XSAmPSBeKDEgPDwgKHViaXQgJiA3KSkKK30K KworZnVuYyAoYm0gKkJpdG1hcCkgQ2xlYXJSYW5nZShzdGFydCBpbnQsIGVuZCBpbnQpIHsKKwlm b3IgaSA6PSBzdGFydDsgaSA8PSBlbmQ7IGkrKyB7CisJCWJtLkNsZWFyKGkpCisJfQorfQorCitm dW5jIChibSAqQml0bWFwKSBNYXgoKSAoaW50KSB7CisJcmV0dXJuIGxlbihibS5iaXRtYXApICog OCAtIDEKK30KKworZnVuYyAoYm0gKkJpdG1hcCkgSXNFbXB0eSgpIChib29sKSB7CisJZm9yIGk6 PTA7IGk8bGVuKGJtLmJpdG1hcCk7IGkrKyB7CisJCWlmIGJtLmJpdG1hcFtpXSAhPSAwIHsKKwkJ CXJldHVybiBmYWxzZQorCQl9CisJfQorCXJldHVybiB0cnVlCit9CisKK2Z1bmMgKGEgQml0bWFw KSBBbmQoYiBCaXRtYXApIChjIEJpdG1hcCkgeworCXZhciBtYXgsIG1pbiBpbnQKKwlpZiBsZW4o YS5iaXRtYXApID4gbGVuKGIuYml0bWFwKSB7CisJCW1heCA9IGxlbihhLmJpdG1hcCkKKwkJbWlu ID0gbGVuKGIuYml0bWFwKQorCX0gZWxzZSB7CisJCW1heCA9IGxlbihiLmJpdG1hcCkKKwkJbWlu ID0gbGVuKGEuYml0bWFwKQorCX0KKwljLmJpdG1hcCA9IG1ha2UoW11DLnVpbnQ4X3QsIG1heCkK KworCWZvciBpIDo9IDA7IGkgPCBtaW47IGkrKyB7CisJCWMuYml0bWFwW2ldID0gYS5iaXRtYXBb aV0gJiBiLmJpdG1hcFtpXQorCX0KKwlyZXR1cm4KK30KKworZnVuYyAoYm0gQml0bWFwKSBTdHJp bmcoKSAocyBzdHJpbmcpIHsKKwlsYXN0T25saW5lIDo9IGZhbHNlCisJY3JhbmdlIDo9IGZhbHNl CisJcHJpbnRlZCA6PSBmYWxzZQorCXZhciBpIGludAorCS8vLyAtLXgteHh4eHgteCAtPiAyLDQt OCwxMAorCS8vLyAtLXgteHh4eHh4eCAtPiAyLDQtMTAKKwlmb3IgaSA9IDA7IGkgPD0gYm0uTWF4 KCk7IGkrKyB7CisJCWlmIGJtLlRlc3QoaSkgeworCQkJaWYgIWxhc3RPbmxpbmUgeworCQkJCS8v IFN3aXRjaGluZyBvZmZsaW5lIC0+IG9ubGluZSwgcHJpbnQgdGhpcyBjcHUKKwkJCQlpZiBwcmlu dGVkIHsKKwkJCQkJcyArPSAiLCIKKwkJCQl9CisJCQkJcyArPSBmbXQuU3ByaW50ZigiJWQiLCBp KQorCQkJCXByaW50ZWQgPSB0cnVlCisJCQl9IGVsc2UgaWYgIWNyYW5nZSB7CisJCQkJLy8gbGFz dCB3YXMgb25saW5lLCBidXQgd2UncmUgbm90IGluIGEgcmFuZ2U7IHByaW50IC0KKwkJCQljcmFu Z2UgPSB0cnVlCisJCQkJcyArPSAiLSIKKwkJCX0gZWxzZSB7CisJCQkJLy8gbGFzdCB3YXMgb25s aW5lLCB3ZSdyZSBpbiBhIHJhbmdlLCAgbm90aGluZyBlbHNlIHRvIGRvCisJCQl9CisJCQlsYXN0 T25saW5lID0gdHJ1ZQorCQl9IGVsc2UgeworCQkJaWYgbGFzdE9ubGluZSB7CisJCQkJLy8gU3dp dGNoaW5nIG9ubGluZS0+b2ZmbGluZTsgZG8gd2UgbmVlZCB0byBlbmQgYSByYW5nZT8KKwkJCQlp ZiBjcmFuZ2UgeworCQkJCQlzICs9IGZtdC5TcHJpbnRmKCIlZCIsIGktMSkKKwkJCQl9CisJCQl9 CisJCQlsYXN0T25saW5lID0gZmFsc2UKKwkJCWNyYW5nZSA9IGZhbHNlCisJCX0KKwl9CisJaWYg bGFzdE9ubGluZSB7CisJCS8vIFN3aXRjaGluZyBvbmxpbmUtPm9mZmxpbmU7IGRvIHdlIG5lZWQg dG8gZW5kIGEgcmFuZ2U/CisJCWlmIGNyYW5nZSB7CisJCQlzICs9IGZtdC5TcHJpbnRmKCIlZCIs IGktMSkKKwkJfQorCX0KKworCXJldHVybgorfQorCisvLyBjb25zdCBjaGFyICpsaWJ4bF9zY2hl ZHVsZXJfdG9fc3RyaW5nKGxpYnhsX3NjaGVkdWxlciBwKTsKK2Z1bmMgKHMgU2NoZWR1bGVyKSBT dHJpbmcoKSAoc3RyaW5nKSB7CisJY3MgOj0gQy5saWJ4bF9zY2hlZHVsZXJfdG9fc3RyaW5nKEMu bGlieGxfc2NoZWR1bGVyKHMpKQorCS8vIE5vIG5lZWQgdG8gZnJlZSBjb25zdCByZXR1cm4gdmFs dWUKKworCXJldHVybiBDLkdvU3RyaW5nKGNzKQorfQorCisvLyBpbnQgbGlieGxfc2NoZWR1bGVy X2Zyb21fc3RyaW5nKGNvbnN0IGNoYXIgKnMsIGxpYnhsX3NjaGVkdWxlciAqZSk7CitmdW5jIChz ICpTY2hlZHVsZXIpIEZyb21TdHJpbmcoZ3N0ciBzdHJpbmcpIChlcnIgZXJyb3IpIHsKKwljc3Ry IDo9IEMuQ1N0cmluZyhnc3RyKQorCWRlZmVyIEMuZnJlZSh1bnNhZmUuUG9pbnRlcihjc3RyKSkK KworCXZhciBjcyBDLmxpYnhsX3NjaGVkdWxlcgorCXJldCA6PSBDLmxpYnhsX3NjaGVkdWxlcl9m cm9tX3N0cmluZyhjc3RyLCAmY3MpCisJaWYgcmV0ICE9IDAgeworCQllcnIgPSBmbXQuRXJyb3Jm KCJsaWJ4bF9zY2hlZHVsZXJfZnJvbV9zdHJpbmc6ICVkXG4iLCByZXQpCisJCXJldHVybgorCX0K KworCSpzID0gU2NoZWR1bGVyKGNzKQorCXJldHVybgorfQorCitmdW5jIHRyYW5zbGF0ZUNwdXBv b2xJbmZvQ1RvR28oY2NpIEMubGlieGxfY3B1cG9vbGluZm8pIChnY2kgQ3B1cG9vbEluZm8pIHsK KwlnY2kuUG9vbGlkID0gdWludDMyKGNjaS5wb29saWQpCisJZ2NpLlBvb2xOYW1lID0gQy5Hb1N0 cmluZyhjY2kucG9vbF9uYW1lKQorCWdjaS5TY2hlZHVsZXIgPSBTY2hlZHVsZXIoY2NpLnNjaGVk KQorCWdjaS5Eb21haW5Db3VudCA9IGludChjY2kubl9kb20pCisJZ2NpLkNwdW1hcCA9IGJpdG1h cENUb0dvKGNjaS5jcHVtYXApCisKKwlyZXR1cm4KK30KKworZnVuYyBTY2hlZHVsZXJGcm9tU3Ry aW5nKG5hbWUgc3RyaW5nKSAocyBTY2hlZHVsZXIsIGVyciBlcnJvcikgeworCWNuYW1lIDo9IEMu Q1N0cmluZyhuYW1lKQorCWRlZmVyIEMuZnJlZSh1bnNhZmUuUG9pbnRlcihjbmFtZSkpCisKKwl2 YXIgY3MgQy5saWJ4bF9zY2hlZHVsZXIKKworCXJldCA6PSBDLmxpYnhsX3NjaGVkdWxlcl9mcm9t X3N0cmluZyhjbmFtZSwgJmNzKQorCWlmIHJldCAhPSAwIHsKKwkJZXJyID0gZm10LkVycm9yZigi bGlieGxfc2NoZWR1bGVyX2Zyb21fc3RyaW5nIGZhaWxlZDogJWQiLCByZXQpCisJCXJldHVybgor CX0KKworCXMgPSBTY2hlZHVsZXIoY3MpCisKKwlyZXR1cm4KK30KKworLy8gbGlieGxfY3B1cG9v bGluZm8gKiBsaWJ4bF9saXN0X2NwdXBvb2wobGlieGxfY3R4KiwgaW50ICpuYl9wb29sX291dCk7 CisvLyB2b2lkIGxpYnhsX2NwdXBvb2xpbmZvX2xpc3RfZnJlZShsaWJ4bF9jcHVwb29saW5mbyAq bGlzdCwgaW50IG5iX3Bvb2wpOworZnVuYyAoQ3R4ICpDb250ZXh0KSBMaXN0Q3B1cG9vbCgpIChs aXN0IFtdQ3B1cG9vbEluZm8pIHsKKwllcnIgOj0gQ3R4LkNoZWNrT3BlbigpCisJaWYgZXJyICE9 IG5pbCB7CisJCXJldHVybgorCX0KKworCXZhciBuYlBvb2wgQy5pbnQKKworCWNfY3B1cG9vbF9s aXN0IDo9IEMubGlieGxfbGlzdF9jcHVwb29sKEN0eC5jdHgsICZuYlBvb2wpCisKKwlkZWZlciBD LmxpYnhsX2NwdXBvb2xpbmZvX2xpc3RfZnJlZShjX2NwdXBvb2xfbGlzdCwgbmJQb29sKQorCisJ aWYgaW50KG5iUG9vbCkgPT0gMCB7CisJCXJldHVybgorCX0KKworCS8vIE1hZ2ljCisJY3B1cG9v bExpc3RTbGljZSA6PSAoKlsxIDw8IDMwXUMubGlieGxfY3B1cG9vbGluZm8pKHVuc2FmZS5Qb2lu dGVyKGNfY3B1cG9vbF9saXN0KSlbOm5iUG9vbDpuYlBvb2xdCisKKwlmb3IgaSA6PSByYW5nZSBj cHVwb29sTGlzdFNsaWNlIHsKKwkJaW5mbyA6PSB0cmFuc2xhdGVDcHVwb29sSW5mb0NUb0dvKGNw dXBvb2xMaXN0U2xpY2VbaV0pCisJCQorCQlsaXN0ID0gYXBwZW5kKGxpc3QsIGluZm8pCisJfQor CisJcmV0dXJuCit9CisKKy8vIGludCBsaWJ4bF9jcHVwb29sX2luZm8obGlieGxfY3R4ICpjdHgs IGxpYnhsX2NwdXBvb2xpbmZvICppbmZvLCB1aW50MzJfdCBwb29saWQpOworZnVuYyAoQ3R4ICpD b250ZXh0KSBDcHVwb29sSW5mbyhQb29saWQgdWludDMyKSAocG9vbCBDcHVwb29sSW5mbykgewor CWVyciA6PSBDdHguQ2hlY2tPcGVuKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQor CisJdmFyIGNfY3B1cG9vbCBDLmxpYnhsX2NwdXBvb2xpbmZvCisJCisJcmV0IDo9IEMubGlieGxf Y3B1cG9vbF9pbmZvKEN0eC5jdHgsICZjX2NwdXBvb2wsIEMudWludDMyX3QoUG9vbGlkKSkKKwlp ZiByZXQgIT0gMCB7CisJCWVyciA9IGZtdC5FcnJvcmYoImxpYnhsX2NwdXBvb2xfaW5mbyBmYWls ZWQ6ICVkIiwgcmV0KQorCQlyZXR1cm4KKwl9CisJZGVmZXIgQy5saWJ4bF9jcHVwb29saW5mb19k aXNwb3NlKCZjX2NwdXBvb2wpCisKKwlwb29sID0gdHJhbnNsYXRlQ3B1cG9vbEluZm9DVG9Hbyhj X2NwdXBvb2wpCisKKwlyZXR1cm4KK30KKworCisKKy8vIGludCBsaWJ4bF9jcHVwb29sX2NyZWF0 ZShsaWJ4bF9jdHggKmN0eCwgY29uc3QgY2hhciAqbmFtZSwKKy8vICAgICAgICAgICAgICAgICAg ICAgICAgICBsaWJ4bF9zY2hlZHVsZXIgc2NoZWQsCisvLyAgICAgICAgICAgICAgICAgICAgICAg ICAgbGlieGxfYml0bWFwIGNwdW1hcCwgbGlieGxfdXVpZCAqdXVpZCwKKy8vICAgICAgICAgICAg ICAgICAgICAgICAgICB1aW50MzJfdCAqcG9vbGlkKTsKKy8vIEZJWE1FOiB1dWlkCisvLyBGSVhN RTogU2V0dGluZyBwb29saWQKK2Z1bmMgKEN0eCAqQ29udGV4dCkgQ3B1cG9vbENyZWF0ZShOYW1l IHN0cmluZywgU2NoZWR1bGVyIFNjaGVkdWxlciwgQ3B1bWFwIEJpdG1hcCkgKGVyciBlcnJvciwg UG9vbGlkIHVpbnQzMikgeworCWVyciA9IEN0eC5DaGVja09wZW4oKQorCWlmIGVyciAhPSBuaWwg eworCQlyZXR1cm4KKwl9CisKKwlwb29saWQgOj0gQy51aW50MzJfdCgwKQorCW5hbWUgOj0gQy5D U3RyaW5nKE5hbWUpCisJZGVmZXIgQy5mcmVlKHVuc2FmZS5Qb2ludGVyKG5hbWUpKQorCQorCS8v IEZvciBub3csIGp1c3QgZG8gd2hhdCB4bCBkb2VzLCBhbmQgbWFrZSBhIG5ldyB1dWlkIGV2ZXJ5 IHRpbWUgd2UgY3JlYXRlIHRoZSBwb29sCisJdmFyIHV1aWQgQy5saWJ4bF91dWlkCisJQy5saWJ4 bF91dWlkX2dlbmVyYXRlKCZ1dWlkKQorCisJY2JtIDo9IGJpdG1hcEdvdG9DKENwdW1hcCkKKwlk ZWZlciBDLmxpYnhsX2JpdG1hcF9kaXNwb3NlKCZjYm0pCisJCisJcmV0IDo9IEMubGlieGxfY3B1 cG9vbF9jcmVhdGUoQ3R4LmN0eCwgbmFtZSwgQy5saWJ4bF9zY2hlZHVsZXIoU2NoZWR1bGVyKSwK KwkJY2JtLCAmdXVpZCwgJnBvb2xpZCkKKwkvLyBGSVhNRTogUHJvcGVyIGVycm9yCisJaWYgcmV0 ICE9IDAgeworCQllcnIgPSBmbXQuRXJyb3JmKCJsaWJ4bF9jcHVwb29sX2NyZWF0ZSBmYWlsZWQ6 ICVkIiwgcmV0KQorCQlyZXR1cm4KKwl9CisKKwlQb29saWQgPSB1aW50MzIocG9vbGlkKQorCQor CXJldHVybgorfQorCisvLyBpbnQgbGlieGxfY3B1cG9vbF9kZXN0cm95KGxpYnhsX2N0eCAqY3R4 LCB1aW50MzJfdCBwb29saWQpOworZnVuYyAoQ3R4ICpDb250ZXh0KSBDcHVwb29sRGVzdHJveShQ b29saWQgdWludDMyKSAoZXJyIGVycm9yKSB7CisJZXJyID0gQ3R4LkNoZWNrT3BlbigpCisJaWYg ZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCXJldCA6PSBDLmxpYnhsX2NwdXBvb2xfZGVz dHJveShDdHguY3R4LCBDLnVpbnQzMl90KFBvb2xpZCkpCisJLy8gRklYTUU6IFByb3BlciBlcnJv cgorCWlmIHJldCAhPSAwIHsKKwkJZXJyID0gZm10LkVycm9yZigibGlieGxfY3B1cG9vbF9kZXN0 cm95IGZhaWxlZDogJWQiLCByZXQpCisJCXJldHVybgorCX0KKworCXJldHVybgorfQorCisvLyBp bnQgbGlieGxfY3B1cG9vbF9jcHVhZGQobGlieGxfY3R4ICpjdHgsIHVpbnQzMl90IHBvb2xpZCwg aW50IGNwdSk7CitmdW5jIChDdHggKkNvbnRleHQpIENwdXBvb2xDcHVhZGQoUG9vbGlkIHVpbnQz MiwgQ3B1IGludCkgKGVyciBlcnJvcikgeworCWVyciA9IEN0eC5DaGVja09wZW4oKQorCWlmIGVy ciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisKKwlyZXQgOj0gQy5saWJ4bF9jcHVwb29sX2NwdWFk ZChDdHguY3R4LCBDLnVpbnQzMl90KFBvb2xpZCksIEMuaW50KENwdSkpCisJLy8gRklYTUU6IFBy b3BlciBlcnJvcgorCWlmIHJldCAhPSAwIHsKKwkJZXJyID0gZm10LkVycm9yZigibGlieGxfY3B1 cG9vbF9jcHVhZGQgZmFpbGVkOiAlZCIsIHJldCkKKwkJcmV0dXJuCisJfQorCisJcmV0dXJuCit9 CisKKy8vIGludCBsaWJ4bF9jcHVwb29sX2NwdWFkZF9jcHVtYXAobGlieGxfY3R4ICpjdHgsIHVp bnQzMl90IHBvb2xpZCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg bGlieGxfYml0bWFwICpjcHVtYXApOworZnVuYyAoQ3R4ICpDb250ZXh0KSBDcHVwb29sQ3B1YWRk Q3B1bWFwKFBvb2xpZCB1aW50MzIsIENwdW1hcCBCaXRtYXApIChlcnIgZXJyb3IpIHsKKwllcnIg PSBDdHguQ2hlY2tPcGVuKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCisJY2Jt IDo9IGJpdG1hcEdvdG9DKENwdW1hcCkKKwlkZWZlciBDLmxpYnhsX2JpdG1hcF9kaXNwb3NlKCZj Ym0pCisJCisJcmV0IDo9IEMubGlieGxfY3B1cG9vbF9jcHVhZGRfY3B1bWFwKEN0eC5jdHgsIEMu dWludDMyX3QoUG9vbGlkKSwgJmNibSkKKwkvLyBGSVhNRTogUHJvcGVyIGVycm9yCisJaWYgcmV0 ICE9IDAgeworCQllcnIgPSBmbXQuRXJyb3JmKCJsaWJ4bF9jcHVwb29sX2NwdWFkZF9jcHVtYXAg ZmFpbGVkOiAlZCIsIHJldCkKKwkJcmV0dXJuCisJfQorCisJcmV0dXJuCit9CisKKy8vIGludCBs aWJ4bF9jcHVwb29sX2NwdXJlbW92ZShsaWJ4bF9jdHggKmN0eCwgdWludDMyX3QgcG9vbGlkLCBp bnQgY3B1KTsKK2Z1bmMgKEN0eCAqQ29udGV4dCkgQ3B1cG9vbENwdXJlbW92ZShQb29saWQgdWlu dDMyLCBDcHUgaW50KSAoZXJyIGVycm9yKSB7CisJZXJyID0gQ3R4LkNoZWNrT3BlbigpCisJaWYg ZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCXJldCA6PSBDLmxpYnhsX2NwdXBvb2xfY3B1 cmVtb3ZlKEN0eC5jdHgsIEMudWludDMyX3QoUG9vbGlkKSwgQy5pbnQoQ3B1KSkKKwkvLyBGSVhN RTogUHJvcGVyIGVycm9yCisJaWYgcmV0ICE9IDAgeworCQllcnIgPSBmbXQuRXJyb3JmKCJsaWJ4 bF9jcHVwb29sX2NwdXJlbW92ZSBmYWlsZWQ6ICVkIiwgcmV0KQorCQlyZXR1cm4KKwl9CisKKwly ZXR1cm4KK30KKworLy8gaW50IGxpYnhsX2NwdXBvb2xfY3B1cmVtb3ZlX2NwdW1hcChsaWJ4bF9j dHggKmN0eCwgdWludDMyX3QgcG9vbGlkLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBjb25zdCBsaWJ4bF9iaXRtYXAgKmNwdW1hcCk7CitmdW5jIChDdHggKkNvbnRleHQp IENwdXBvb2xDcHVyZW1vdmVDcHVtYXAoUG9vbGlkIHVpbnQzMiwgQ3B1bWFwIEJpdG1hcCkgKGVy ciBlcnJvcikgeworCWVyciA9IEN0eC5DaGVja09wZW4oKQorCWlmIGVyciAhPSBuaWwgeworCQly ZXR1cm4KKwl9CisKKwljYm0gOj0gYml0bWFwR290b0MoQ3B1bWFwKQorCWRlZmVyIEMubGlieGxf Yml0bWFwX2Rpc3Bvc2UoJmNibSkKKwkKKwlyZXQgOj0gQy5saWJ4bF9jcHVwb29sX2NwdXJlbW92 ZV9jcHVtYXAoQ3R4LmN0eCwgQy51aW50MzJfdChQb29saWQpLCAmY2JtKQorCS8vIEZJWE1FOiBQ cm9wZXIgZXJyb3IKKwlpZiByZXQgIT0gMCB7CisJCWVyciA9IGZtdC5FcnJvcmYoImxpYnhsX2Nw dXBvb2xfY3B1cmVtb3ZlX2NwdW1hcCBmYWlsZWQ6ICVkIiwgcmV0KQorCQlyZXR1cm4KKwl9CisK KwlyZXR1cm4KK30KKworLy8gaW50IGxpYnhsX2NwdXBvb2xfcmVuYW1lKGxpYnhsX2N0eCAqY3R4 LCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBwb29saWQpOworLy8gaW50IGxpYnhsX2NwdXBv b2xfY3B1YWRkX25vZGUobGlieGxfY3R4ICpjdHgsIHVpbnQzMl90IHBvb2xpZCwgaW50IG5vZGUs IGludCAqY3B1cyk7CisvLyBpbnQgbGlieGxfY3B1cG9vbF9jcHVyZW1vdmVfbm9kZShsaWJ4bF9j dHggKmN0eCwgdWludDMyX3QgcG9vbGlkLCBpbnQgbm9kZSwgaW50ICpjcHVzKTsKKy8vIGludCBs aWJ4bF9jcHVwb29sX21vdmVkb21haW4obGlieGxfY3R4ICpjdHgsIHVpbnQzMl90IHBvb2xpZCwg dWludDMyX3QgZG9taWQpOworCisvLworLy8gVXRpbGl0eSBmdW5jdGlvbnMKKy8vCitmdW5jIChD dHggKkNvbnRleHQpIENwdXBvb2xGaW5kQnlOYW1lKG5hbWUgc3RyaW5nKSAoaW5mbyBDcHVwb29s SW5mbywgZm91bmQgYm9vbCkgeworCXBsaXN0IDo9IEN0eC5MaXN0Q3B1cG9vbCgpCisKKwlmb3Ig aSA6PSByYW5nZSBwbGlzdCB7CisJCWlmIHBsaXN0W2ldLlBvb2xOYW1lID09IG5hbWUgeworCQkJ Zm91bmQgPSB0cnVlCisJCQlpbmZvID0gcGxpc3RbaV0KKwkJCXJldHVybgorCQl9CisJfQorCXJl dHVybgorfQorCitmdW5jIChDdHggKkNvbnRleHQpIENwdXBvb2xNYWtlRnJlZShDcHVtYXAgQml0 bWFwKSAoZXJyIGVycm9yKSB7CisJcGxpc3QgOj0gQ3R4Lkxpc3RDcHVwb29sKCkKKworCWZvciBp IDo9IHJhbmdlIHBsaXN0IHsKKwkJdmFyIEludGVyc2VjdGlvbiBCaXRtYXAKKwkJSW50ZXJzZWN0 aW9uID0gQ3B1bWFwLkFuZChwbGlzdFtpXS5DcHVtYXApCisJCWlmICEgSW50ZXJzZWN0aW9uLklz RW1wdHkoKSB7CisJCQllcnIgPSBDdHguQ3B1cG9vbENwdXJlbW92ZUNwdW1hcChwbGlzdFtpXS5Q b29saWQsIEludGVyc2VjdGlvbikKKwkJCWlmIGVyciAhPSBuaWwgeworCQkJCXJldHVybgorCQkJ fQorCQl9CisJfQorCXJldHVybgorfQorCitmdW5jIFhsVGVzdChBcmdzIFtdc3RyaW5nKSB7CisJ dmFyIENwdW1hcCBCaXRtYXAKKworCUNwdW1hcC5TZXQoMikKKwlDcHVtYXAuU2V0UmFuZ2UoNCwg OCkKKwlDcHVtYXAuU2V0KDEwKQorCisJZm10LlByaW50ZigiQ3B1bWFwOiAldlxuIiwgQ3B1bWFw KQorCisJQ3B1bWFwLlNldCg5KQorCisJZm10LlByaW50ZigiQ3B1bWFwOiAldlxuIiwgQ3B1bWFw KQorCisJdmFyIEN0eCBDb250ZXh0CisKKwllcnIgOj0gQ3R4Lk9wZW4oKQorCWlmIGVyciAhPSBu aWwgeworCQlmbXQuUHJpbnRmKCJPcGVuaW5nIGNvbnRleHQ6ICV2XG4iLCBlcnIpCisJCXJldHVy bgorCX0KKworCXBvb2wsIGZvdW5kIDo9IEN0eC5DcHVwb29sRmluZEJ5TmFtZSgic2NoZWRiZW5j aCIpCisKKwlpZiBmb3VuZCB7CisJCWZtdC5QcmludGYoIkZvdW5kIHNjaGVkYmVuY2gsIGRlc3Ry b3lpbmdcbiIpCisKKwkJZXJyID0gQ3R4LkNwdXBvb2xEZXN0cm95KHBvb2wuUG9vbGlkKQorCQlp ZiBlcnIgIT0gbmlsIHsKKwkJCWZtdC5QcmludGYoIkNvdWxkbid0IGRlc3Ryb3kgcG9vbDogJXZc biIsIGVycikKKwkJCXJldHVybgorCQl9CisKKwkJZm10LlByaW50ZigiUmV0dXJuaW5nIGNwdXMg dG8gcG9vbCAwIGZvciBmdW5cbiIpCisJCWVyciA9IEN0eC5DcHVwb29sQ3B1YWRkQ3B1bWFwKDAs IHBvb2wuQ3B1bWFwKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCWZtdC5QcmludGYoIkNvdWxkbid0 IGFkZCBjcHVzIHRvIGRvbWFpbiAwOiAldlxuIiwgZXJyKQorCQkJcmV0dXJuCisJCX0KKwl9CisK KwlDcHVtYXAgPSBCaXRtYXB7fQorCisJQ3B1bWFwLlNldFJhbmdlKDEyLCAxNSkKKworCWZtdC5Q cmludGYoIkZyZWVpbmcgY3B1c1xuIikKKwllcnIgPSBDdHguQ3B1cG9vbE1ha2VGcmVlKENwdW1h cCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJZm10LlByaW50ZigiQ291bGRuJ3QgZnJlZSBjcHVzOiAl dlxuIiwgZXJyKQorCQlyZXR1cm4KKwl9CisKKworCWZtdC5QcmludGYoIkNyZWF0aW5nIG5ldyBw b29sXG4iKQorCisJZXJyLCBQb29saWQgOj0gQ3R4LkNwdXBvb2xDcmVhdGUoInNjaGVkYmVuY2gi LCBTY2hlZHVsZXJDcmVkaXQsIENwdW1hcCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJZm10LlByaW50 ZigiRXJyb3IgY3JlYXRpbmcgY3B1cG9vbDogJXZcbiIsIGVycikKKwl9IGVsc2UgeworCQlmbXQu UHJpbnRmKCJQb29sIGlkOiAlZFxuIiwgUG9vbGlkKQorCX0KKworCXBvb2wgPSBDdHguQ3B1cG9v bEluZm8oMCkKKwlmbXQuUHJpbnRmKCJDcHVwb29sIDAgaW5mbzogJXZcbiIsIHBvb2wpCisJCisJ Q3R4LkNsb3NlKCkKK30KZGlmZiAtLWdpdCBhL3hlbndvcmtlci5nbyBiL3hlbndvcmtlci5nbwpk ZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJmMzE2Zi4uMDAwMDAwMAotLS0gYS94ZW53 b3JrZXIuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdo dCAoQykgMjAxNiBHZW9yZ2UgVy4gRHVubGFwLCBDaXRyaXggU3lzdGVtcyBVSyBMdGQKLSAqCi0g KiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg YW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb247IHZlcnNpb24gMiBvZiB0aGUKLSAqIExpY2Vuc2Ugb25seS4KLSAqCi0gKiBUaGlzIHBy b2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwg YnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh cnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS IFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9y ZSBkZXRhaWxzLgotICogCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07 IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4s IDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEz MDEsIFVTQS4KLSAqLwotcGFja2FnZSBtYWluCi0KLWltcG9ydCAoCi0JImZtdCIKLQkib3MiCi0J Im9zL2V4ZWMiCi0JImVuY29kaW5nL2pzb24iCi0JImJ1ZmlvIgotCSJpbyIKLSkKLQotdHlwZSBY ZW5Xb3JrZXIgc3RydWN0IHsKLQlpZCBXb3JrZXJJZAotCUN0eCBDb250ZXh0Ci0Jdm1uYW1lIHN0 cmluZwotCWRvbWlkIGludAotCWNvbnNvbGVDbWQgKmV4ZWMuQ21kCi0JY29uc29sZSBpby5SZWFk Q2xvc2VyCi0JanNvblN0YXJ0ZWQgYm9vbAotCUxvZyBbXXN0cmluZwotfQotCi0vLyBXZSBoYXZl IHRvIGNhcGl0YWxpemUgdGhlIGVsZW1lbnQgbmFtZXMgc28gdGhhdCB0aGUganNvbiBjbGFzcyBj YW4KLS8vIGdldCBhY2Nlc3MgdG8gaXQ7IHNvIGFubm90YXRlIHRoZSBlbGVtZW50cyBzbyB0aGV5 IGNvbWUgb3V0IGxvd2VyCi0vLyBjYXNlCi10eXBlIFJ1bXBSdW5Db25maWdCbGsgc3RydWN0IHsK LQlTb3VyY2Ugc3RyaW5nICAgICBganNvbjoic291cmNlImAKLQlQYXRoIHN0cmluZyAgICAgICBg anNvbjoicGF0aCJgCi0JRnN0eXBlIHN0cmluZyAgICAgYGpzb246ImZzdHlwZSJgIAotCU1vdW50 cG9pbnQgc3RyaW5nIGBqc29uOiJtb3VudHBvaW50ImAKLX0KLQotdHlwZSBSdW1wUnVuQ29uZmln IHN0cnVjdCB7Ci0JQmxrIFJ1bXBSdW5Db25maWdCbGsgYGpzb246ImJsayJgCi0JQ21kbGluZSBz dHJpbmcgICAgICAgYGpzb246ImNtZGxpbmUiYAotCUhvc3RuYW1lIHN0cmluZyAgICAgIGBqc29u OiJob3N0bmFtZSJgCi19Ci0KLWZ1bmMgKHcgKlhlbldvcmtlcikgU2V0SWQoaSBXb3JrZXJJZCkg ewotCXcuaWQgPSBpCi0Jdy52bW5hbWUgPSBmbXQuU3ByaW50Zigid29ya2VyLSV2IiwgaSkKLQl3 LmRvbWlkID0gLTEgLy8gSU5WQUxJRCBET01JRAotfQotCi1mdW5jICh3ICpYZW5Xb3JrZXIpIElu aXQocCBXb3JrZXJQYXJhbXMsIGcgV29ya2VyQ29uZmlnKSAoZXJyIGVycm9yKSB7Ci0JaWYgZXJy ICE9IG5pbCB7Ci0JCXJldHVybgotCX0KLQkKLQltb2NrIDo9IGZhbHNlCi0JCi0JLy8gTWFrZSB4 bCBjb25maWcgZmlsZQotCS8vICBuYW1lPXdvcmtlci0kKGlkKQotCi0JY2ZnTmFtZSA6PSBvcy5U ZW1wRGlyKCkrIi9zY2hlZGJlbmNoLSIrdy52bW5hbWUrIi5jZmciCi0KLQljZmcsIGVyciA6PSBv cy5DcmVhdGUoY2ZnTmFtZSkKLQkvL2RlZmVyIG9zLlJlbW92ZShjZmdOYW1lKQotCi0JaWYgZXJy ICE9IG5pbCB7Ci0JCWZtdC5QcmludGYoIkVycm9yIGNyZWF0aW5nIGNvbmZpZ2ZpbGUgJXM6ICV2 XG4iLCBjZmdOYW1lLCBlcnIpCi0JCXJldHVybgotCX0KLQotCWZtdC5GcHJpbnRmKGNmZywgIm5h bWUgPSAnJXMnXG4iLCB3LnZtbmFtZSkKLQlmbXQuRnByaW50ZihjZmcsICJrZXJuZWwgPSAnd29y a2VyLXhlbi5pbWcnXG4iKQotCWZtdC5GcHJpbnRmKGNmZywgIm1lbW9yeSA9IDMyXG4iKQotCWZt dC5GcHJpbnRmKGNmZywgInZjcHVzID0gMVxuIikKLQlmbXQuRnByaW50ZihjZmcsICJvbl9jcmFz aCA9ICdkZXN0cm95J1xuIikKLQlmbXQuRnByaW50ZihjZmcsICJ0c2NfbW9kZSA9ICduYXRpdmUn XG4iKQotCi0JaWYgZy5Qb29sICE9ICIiIHsKLQkJZm10LkZwcmludGYoY2ZnLCAicG9vbCA9ICcl cydcbiIsIGcuUG9vbCkKLQl9Ci0KLQlpZiBnLlNvZnRBZmZpbml0eSAhPSAiIiB7Ci0JCWZtdC5G cHJpbnRmKGNmZywgImNwdXNfc29mdCA9ICclcydcbiIsIGcuU29mdEFmZmluaXR5KQotCX0KLQot CQotCS8vIHhsIGNyZWF0ZSAtcCBbZmlsZW5hbWVdCi0JewotCQlhcmdzIDo9IFtdc3RyaW5neyJ4 bCIsICJjcmVhdGUiLCAiLXAiLCBjZmdOYW1lfQotCQlpZiBtb2NrIHsKLQkJCWFyZ3MgPSBhcHBl bmQoW11zdHJpbmd7ImVjaG8ifSwgYXJncy4uLikKLQkJfQotCQllIDo9IGV4ZWMuQ29tbWFuZChh cmdzWzBdLCBhcmdzWzE6XS4uLikKLQkJCi0JCWUuU3Rkb3V0ID0gb3MuU3Rkb3V0Ci0JCWUuU3Rk ZXJyID0gb3MuU3RkZXJyCi0KLQkJZXJyID0gZS5SdW4oKQotCQlpZiBlcnIgIT0gbmlsIHsKLQkJ CWZtdC5QcmludGYoIkVycm9yIGNyZWF0aW5nIGRvbWFpbjogJXZcbiIsIGVycikKLQkJCXJldHVy bgotCQl9Ci0JfQotCi0JLy8gR2V0IGRvbWlkCi0JewotCQl2YXIgZG9taWRTdHJpbmcgW11ieXRl Ci0JCXZhciBhcmdzIFtdc3RyaW5nCi0JCQotCQlpZiBtb2NrIHsKLQkJCWFyZ3MgPSBbXXN0cmlu Z3siZWNobyIsICIyMzIifQotCQl9IGVsc2UgewotCQkJYXJncyA9IFtdc3RyaW5neyJ4bCIsICJk b21pZCIsIHcudm1uYW1lfQotCQl9Ci0JCWUgOj0gZXhlYy5Db21tYW5kKGFyZ3NbMF0sIGFyZ3Nb MTpdLi4uKQotCi0JCWRvbWlkU3RyaW5nLCBlcnIgPSBlLk91dHB1dCgpCi0JCWlmIGVyciAhPSBu aWwgewotCQkJZm10LlByaW50ZigiRXJyb3IgZ2V0dGluZyBkb21pZDogJXZcbiIsIGVycikKLQkJ CXJldHVybgotCQl9Ci0KLQkJXywgZXJyID0gZm10LlNzY2FuZihzdHJpbmcoZG9taWRTdHJpbmcp LCAiJWRcbiIsICZ3LmRvbWlkKQotCQlpZiBlcnIgIT0gbmlsIHsKLQkJCWZtdC5QcmludGYoIkVy cm9yIGNvbnZlcnRpbmcgZG9taWQ6ICV2XG4iLCBlcnIpCi0JCQlyZXR1cm4KLQkJfQotCi0JCS8v Zm10LlByaW50ZigiICVzIGRvbWlkICVkXG4iLCB3LnZtbmFtZSwgdy5kb21pZCkKLQl9Ci0JCi0J Ly8gU2V0IHhlbnN0b3JlIGNvbmZpZwotCXsKLQkJcmNmZyA6PSBSdW1wUnVuQ29uZmlnewotCQkJ QmxrOlJ1bXBSdW5Db25maWdCbGt7U291cmNlOiJkZXYiLAotCQkJCVBhdGg6InZpcnR1YWwiLAot CQkJCUZzdHlwZToia2VybmZzIiwKLQkJCQlNb3VudHBvaW50OiIva2VybiJ9LAotCQkJSG9zdG5h bWU6dy52bW5hbWV9Ci0JCQotCQlyY2ZnLkNtZGxpbmUgPSAid29ya2VyLXhlbi5pbWciCi0JCWZv ciBfLCBhIDo9IHJhbmdlIHAuQXJncyB7Ci0JCQlyY2ZnLkNtZGxpbmUgKz0gZm10LlNwcmludGYo IiAlcyIsIGEpCi0JCX0KLQotCQl2YXIgcmNmZ0J5dGVzIFtdYnl0ZQotCQotCQlyY2ZnQnl0ZXMs IGVyciA9IGpzb24uTWFyc2hhbChyY2ZnKQotCQlpZiBlcnIgIT0gbmlsIHsKLQkJCWZtdC5Qcmlu dGYoIkVycm9yIG1hcnNoYWxsaW5nIHJ1bXBydW4ganNvbjogJXZcbiIsIGVycikKLQkJCXJldHVy bgotCQl9Ci0KLQkJLy9mbXQuUHJpbnRmKCJqc29uOlxuJXNcbiIsIHN0cmluZyhyY2ZnQnl0ZXMp KQotCQlyY2ZnUGF0aCA6PSBmbXQuU3ByaW50ZigiL2xvY2FsL2RvbWFpbi8lZC9ydW1wcnVuL2Nm ZyIsIHcuZG9taWQpCi0KLQkJLy9mbXQuUHJpbnRmKCJXcml0aW5nIHRvICVzLCBqc29uIGNvbmZp ZyAlc1xuIiwgcmNmZ1BhdGgsIHJjZmdCeXRlcykKLQkJCi0JCWFyZ3MgOj0gW11zdHJpbmd7Inhl bnN0b3JlLXdyaXRlIiwgcmNmZ1BhdGgsIHN0cmluZyhyY2ZnQnl0ZXMpfQotCQlpZiBtb2NrIHsK LQkJCWFyZ3MgPSBhcHBlbmQoW11zdHJpbmd7ImVjaG8ifSwgYXJncy4uLikKLQkJfQotCQllIDo9 IGV4ZWMuQ29tbWFuZChhcmdzWzBdLCBhcmdzWzE6XS4uLikKLQkJCi0JCWUuU3Rkb3V0ID0gb3Mu U3Rkb3V0Ci0JCWUuU3RkZXJyID0gb3MuU3RkZXJyCi0KLQkJZXJyID0gZS5SdW4oKQotCQlpZiBl cnIgIT0gbmlsIHsKLQkJCWZtdC5QcmludGYoIkVycm9yIHdyaXRpbmcganNvbiBpbnRvIHhlbnN0 b3JlOiAldlxuIiwgZXJyKQotCQkJcmV0dXJuCi0JCX0KLQl9Ci0JCi0KLQkvLyBSdW4gY29uc29s ZSBjb21tYW5kLCBhdHRhY2ggdG8gdy5jb25zb2xlCi0JewotCQlhcmdzIDo9IFtdc3RyaW5neyJ4 bCIsICJjb25zb2xlIiwgdy52bW5hbWV9Ci0JCWlmIG1vY2sgewotCQkJYXJncyA9IGFwcGVuZChb XXN0cmluZ3siZWNobyJ9LCBhcmdzLi4uKQotCQl9Ci0JCXcuY29uc29sZUNtZCA9IGV4ZWMuQ29t bWFuZChhcmdzWzBdLCBhcmdzWzE6XS4uLikKLQotCQl3LmNvbnNvbGUsIGVyciA9IHcuY29uc29s ZUNtZC5TdGRvdXRQaXBlKCkKLQkJaWYgZXJyICE9IG5pbCB7Ci0JCQlmbXQuUHJpbnQoIkNvbm5l dGluZyB0byBzdGRvdXQ6ICIsIGVycikKLQkJCXJldHVybgotCQl9Ci0KLQkJdy5jb25zb2xlQ21k LlN0YXJ0KCkKLQl9Ci0JCi0JcmV0dXJuCi19Ci0KLS8vIEZJWE1FOiBSZXR1cm4gYW4gZXJyb3IK LWZ1bmMgKHcgKlhlbldvcmtlcikgU2h1dGRvd24oKSB7Ci0JLy8geGwgZGVzdHJveSBbdm1uYW1l XQotCWUgOj0gZXhlYy5Db21tYW5kKCJ4bCIsICJkZXN0cm95Iiwgdy52bW5hbWUpCi0KLQllLlN0 ZG91dCA9IG9zLlN0ZG91dAotCWUuU3RkZXJyID0gb3MuU3RkZXJyCi0KLQllcnIgOj0gZS5SdW4o KQotCWlmIGVyciAhPSBuaWwgewotCQlmbXQuUHJpbnRmKCJFcnJvciBkZXN0cm95aW5nIGRvbWFp bjogJXZcbiIsIGVycikKLQkJcmV0dXJuCi0JfQotfQotCi1mdW5jICh3ICpYZW5Xb3JrZXIpIER1 bXBMb2coZiBpby5Xcml0ZXIpIChlcnIgZXJyb3IpIHsKLQliIDo9IGJ1ZmlvLk5ld1dyaXRlcihm KQotCWRlZmVyIGIuRmx1c2goKQotCWZvciBfLCBsaW5lIDo9IHJhbmdlIHcuTG9nIHsKLQkJXywg ZXJyID0gZm10LkZwcmludGxuKGIsIGxpbmUpCi0JCWlmIGVyciAhPSBuaWwgewotCQkJcmV0dXJu Ci0JCX0KLQl9Ci0JcmV0dXJuCi19Ci0KLQotCi0vLyBGSVhNRTogUmV0dXJuIGFuIGVycm9yCi1m dW5jICh3ICpYZW5Xb3JrZXIpIFByb2Nlc3MocmVwb3J0IGNoYW4gV29ya2VyUmVwb3J0LCBkb25l IGNoYW4gV29ya2VySWQpIHsKLQkvLyAvLyB4bCB1bnBhdXNlIFt2bW5hbWVdCi0JLy9lcnIgOj0g eGcuQ3R4LkRvbWFpblVucGF1c2UoRG9taWQody5kb21pZCkpCi0JZXJyIDo9IEN0eC5Eb21haW5V bnBhdXNlKERvbWlkKHcuZG9taWQpKQotCWlmIGVyciAhPSBuaWwgewotCQlmbXQuUHJpbnRmKCJF cnJvciB1bnBhdXNpbmcgZG9tYWluOiAldlxuIiwgZXJyKQotCQlyZXR1cm4KLQl9Ci0KLQlzY2Fu bmVyIDo9IGJ1ZmlvLk5ld1NjYW5uZXIody5jb25zb2xlKQotCi0JZm9yIHNjYW5uZXIuU2Nhbigp IHsKLQkJcyA6PSBzY2FubmVyLlRleHQoKQotCi0JCXcuTG9nID0gYXBwZW5kKHcuTG9nLCBzKQot CQkKLQkJLy9mbXQuUHJpbnRsbigiR290IHRoZXNlIGJ5dGVzOiAiLCBzKTsKLQotCQlpZiB3Lmpz b25TdGFydGVkIHsKLQkJCXZhciByIFdvcmtlclJlcG9ydAotCQkJanNvbi5Vbm1hcnNoYWwoW11i eXRlKHMpLCAmcikKLQkJCXIuSWQgPSB3LmlkCi0JCQlkaSwgZXJyIDo9IEN0eC5Eb21haW5JbmZv KERvbWlkKHcuZG9taWQpKQotCQkJLy8gSWdub3JlIGVycm9ycyBmb3Igbm93Ci0JCQlpZiBlcnIg PT0gbmlsIHsKLQkJCQlyLkNwdXRpbWUgPSBkaS5DcHVfdGltZQotCQkJfQotCQkJcmVwb3J0IDwt IHIKLQkJfSBlbHNlIHsKLQkJCWlmIHMgPT0gIlNUQVJUIEpTT04iIHsKLQkJCQkvL2ZtdC5Qcmlu dGxuKCJHb3QgdG9rZW4gdG8gc3RhcnQgcGFyc2luZyBqc29uIikKLQkJCQl3Lmpzb25TdGFydGVk ID0gdHJ1ZQotCQkJfQotCQl9Ci0JfQotCi0JZG9uZSA8LSB3LmlkCi0KLQl3LmNvbnNvbGVDbWQu V2FpdCgpCi19Ci0KLS0gCjIuNy40CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVu Lm9yZwpodHRwczovL2xpc3RzLnhlbi5vcmcveGVuLWRldmVsCg==