From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dave Gordon Subject: Re: [PATCH] [v2] intel_frequency: A tool to manipulate Intel GPU frequency Date: Thu, 15 Jan 2015 14:00:06 +0000 Message-ID: <54B7C7E6.1050908@intel.com> References: <1420949969-877-2-git-send-email-benjamin.widawsky@intel.com> <1421033721-3601-1-git-send-email-benjamin.widawsky@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by gabe.freedesktop.org (Postfix) with ESMTP id 927DF6E1EE for ; Thu, 15 Jan 2015 06:00:08 -0800 (PST) In-Reply-To: <1421033721-3601-1-git-send-email-benjamin.widawsky@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Ben Widawsky , Intel GFX Cc: Ben Widawsky List-Id: intel-gfx@lists.freedesktop.org T24gMTIvMDEvMTUgMDM6MzUsIEJlbiBXaWRhd3NreSB3cm90ZToKPiBXQVJOSU5HOiB2ZXJ5IG1p bmltYWxseSB0ZXN0ZWQKPiAKPiBJbiBnZW5lcmFsIHlvdSBzaG91bGQgbm90IG5lZWQgdGhpcyB0 b29sLiBJdCdzIHByaW1hcnkgcHVycG9zZSBpcyBmb3IKPiBiZW5jaG1hcmtpbmcsIGFuZCBmb3Ig ZGVidWdnaW5nIHBlcmZvcm1hbmNlIGlzc3Vlcy4KPiAKPiBGb3IgbWFueSBrZXJuZWwgcmVsZWFz ZXMgbm93IHN5c2ZzIGhhcyBzdXBwb3J0ZWQgcmVhZGluZyBhbmQgd3JpdGluZyB0aGUgR1BVCj4g ZnJlcXVlbmN5LiBUaGVyZWZvcmUsIHRoaXMgdG9vbCBwcm92aWRlcyBubyBuZXcgZnVuY3Rpb25h bGl0eS4gV2hhdCBpdCBkb2VzCj4gcHJvdmlkZSBpcyBhbiBlYXN5IHRvIHBhY2thZ2UgKGZvciBk aXN0cm9zKSB0b29sIHRoYXQgaGFuZGxlcyB0aGUgbW9zdCBjb21tb24KPiBzY2VuYXJpb3MuCj4g Cj4gdjI6Cj4gR2V0IHJpZCBvZiAtZiBmcm9tIHRoZSB1c2FnZSBtZXNzYWdlIChKb3JkYW4pCj4g QWRkIHNwYWNlIGJlZm9yZSBbLXMgKEpvcmRhbikKPiBBZGQgYSAtYy8tLWN1c3RvbSBleGFtcGxl IChKb3JkYW4pCj4gQWRkIGEgc2V0dGluZyBmb3IgcmVzZXR0aW5nIHRvIGhhcmR3YXJlIGRlZmF1 bHQgKEtlbikKPiBSZXBsaWNhdGUgZXhhbXBsZXMgaW4gY29tbWl0IG1lc3NhZ2UgaW4gdGhlIHNv dXJjZSBjb2RlLiAobWUpCj4gCj4gU2lnbmVkLW9mZi1ieTogQmVuIFdpZGF3c2t5IDxiZW5AYndp ZGF3c2submV0Pgo+IFJldmlld2VkLWJ5OiBKb3JkYW4gSnVzdGVuIDxqb3JkYW4ubC5qdXN0ZW5A aW50ZWwuY29tPgo+IENjOiBLZW5uZXRoIEdyYXVua2UgPGtlbm5ldGhAd2hpdGVjYXBlLm9yZz4K CkkgdGhpbmsgdGhlIHN5bnRheCBvZiBzb21lIG9mIHRoZXNlIGNvbW1hbmRzIGlzIHJhdGhlciBz dHJhbmdlOyBhbHNvLCBpdAp3b3VsZCBiZSBuaWNlciB0byBoYXZlIGNvbnNpc3RlbnQgbmFtaW5n IG9mIGlucHV0cyAmIG91dHB1dHMgLQpzcGVjaWZpY2FsbHksIHRoZSBpbnB1dCBuYW1lICJlZmYi IGlzIHJlbGF0ZWQgdG8gdGhlIG91dHB1dCB0YWcgIlJQMSIuClBsZWFzZSBwaWNrIG9uZSBvZiB0 aGUgb3RoZXIuCgpBbmQgYXJlIGFsbCB0aGUgZXhhbXBsZXMgYmVsb3cgYWN0dWFsbHkgY29ycmVj dD8KCj4gSGVyZSBhcmUgc29tZSBzYW1wbGUgdXNhZ2VzOgo+ICQgc3VkbyBpbnRlbF9mcmVxdWVu Y3kgLS1nZXQ9Y3VyLG1pbixtYXgsZWZmCj4gY3VyOiAyMDAgTUh6Cj4gbWluOiAyMDAgTUh6Cj4g UlAxOiAyMDAgTUh6Cj4gbWF4OiAxMjAwIE1Iego+IAo+ICQgc3VkbyBpbnRlbF9mcmVxdWVuY3kg LWcKPiBjdXI6IDIwMCBNSHoKPiBtaW46IDIwMCBNSHoKPiBSUDE6IDIwMCBNSHoKPiBtYXg6IDEy MDAgTUh6Cj4gCj4gJCBzdWRvIGludGVsX2ZyZXF1ZW5jeSAtZ2VmZgo+IFJQMTogMjAwIE1IegoK SSB3b3VsZG4ndCBleHBlY3QgdGhpcyBzeW50YXggdG8gd29yaywgYmVjYXVzZSBnZW5lcmFsbHkg c2luZ2xlLWxldHRlcgpvcHRpb25zIGNhbiBiZSBjb21iaW5lZCwgc28gdGhhdCAiLWdlZmYiIHdv dWxkIGJlIGVxdWl2YWxlbnQgdG8gIi1nIC1lCi1mIC1mIi4gSSdkIGV4cGVjdCB0byBoYXZlIHRv IHdyaXRlICItZyBlZmYiIG9yICItZz1lZmYiLgoKPiAkIHN1ZG8gaW50ZWxfZnJlcXVlbmN5IC0t c2V0IG1pbj0zMDAKPiAkIHN1ZG8gaW50ZWxfZnJlcXVlbmN5IC0tZ2V0IG1pbgo+IGN1cjogMzAw IE1Iego+IG1pbjogMzAwIE1Iego+IFJQMTogMjAwIE1Iego+IG1heDogMTIwMCBNSHoKClN1cmVs eSBpZiB5b3Ugc3BlY2lmeSAiLS1nZXQgbWluIiBpdCBzaG91bGQgb25seSBwcmludCB0aGUgIm1p biIgdmFsdWUsCm5vdCBhbGwgdGhlIG90aGVyczsgYW5kIHRoZSBzYW1lIHdpdGggIi0tZ2V0IG1h eCIgYmVsb3cuIChIb3dldmVyLCBJCnRoaW5rIHlvdSBhY3R1YWxseSBkbyBuZWVkIHRvIHNob3cg YWxsIHZhbHVlcyBpbiB0aGVzZSB0d28gZXhhbXBsZXMgdG8KY2xhcmlmeSB0aGUgZWZmZWN0cyBv ZiB0aGUgcGFyYW1ldGVyLXNldHRpbmcgY29tbWFuZHMsIHNvIEknZCBjaGFuZ2UKdGhlbSB0byBn ZXQgcmlkIG9mIHRoZSBwYXJhbWV0ZXIgbmFtZSkuCgpIZXJlLCBpdCBpc24ndCByZWFsbHkgY2xl YXIgd2hhdCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIC0tY3VzdG9tIGFuZAotLXNldCBpcyBzdXBw b3NlZCB0byBiZS4gUGFydGx5IHRoaXMgaXMganVzdCBkb3duIHRvIHRoZSBudW1iZXJzIGluCnRo ZXNlIHNwZWNpZmljIGV4YW1wbGVzLCBidXQgYWxzbyBJIHRoaW5rIHRoZSBleGFtcGxlcyBkb24n dCBhZ3JlZSB3aXRoCnRoZSBjb2RlIGJlbG93LgoKPiAkIHN1ZG8gaW50ZWxfZnJlcXVlbmN5IC0t Y3VzdG9tIG1heD05MDAKPiAkIHN1ZG8gaW50ZWxfZnJlcXVlbmN5IC0tZ2V0IG1heAo+IGN1cjog MzAwIE1Iego+IG1pbjogMzAwIE1Iego+IFJQMTogMjAwIE1Iego+IG1heDogOTAwIE1IegoKU28g ZnJvbSB0aGUgY29kZSwgSSBkZWR1Y2UgdGhhdCAiLS1jdXN0b20iIGxldHMgeW91IGNoYW5nZSBl aXRoZXIgJ21pbicKb3IgJ21heCcsIGJ1dCBkb2Vzbid0IC9uZWNlc3NhcmlseS8gY2hhbmdlIHRo ZSBjdXJyZW50IGZyZXF1ZW5jeSwgb25seQppZiBpdCBiZWNvbWVzIG91dC1vZi1ib3VuZHMuCgpP VE9IICItLXNldCIgaXMgc3VwcG9zZWQgdG8gc2V0IGJvdGggbWluICphbmQqIG1heCwgdGh1cyBs b2NraW5nIHRoZQpmcmVxdWVuY3kgdG8gYSBzcGVjaWZpYyB2YWx1ZS4gQnV0IHRoZSAtLXNldCBl eGFtcGxlIGFib3ZlIGRvZXNuJ3Qgc2hvdwp0aGF0LiBBbHNvLCB0aGUgIm1pbj0zMDAiIHN5bnRh eCB3b3VsZCBiZSBpbGxvZ2ljYWwgLSB5b3UganVzdCBuZWVkIGEKbnVtYmVyLCBhbmQgZG9lc24n dCBhcHBlYXIgdG8gYmUgd2hhdCB0aGUgY29kZSBhY3R1YWxseSBleHBlY3RzLgoKRmluYWxseSwg SSB0aGluayB0aGUgY2hvaWNlIG9mIGNvbW1hbmQgbmFtZXMgKGVzcGVjaWFsbHkgLS1zZXQgdnMK LS1jdXN0b20pIGlzIGNvbmZ1c2luZy4gSSdkIGxpa2UgdG8gcHJvcG9zZSB0aGUgZm9sbG93aW5n OgoKIyBSZWFkaW5nOgoJLS1nZXQJCSMgZ2V0IGFsbAoJLS1nZXQgbmFtZWxpc3QJIyBnZXQgc3Bl Y2lmaWVkCgktZyBbbmFtZWxpc3RdCSMgc3lub255bSBmb3IgLWcKCiMgU2V0IG9uZSBwYXJhbWV0 ZXI6CgktLXNldCBuYW1lPWZyZXEJIyBzZXQgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgKG1pbiBv ciBtYXgpCgkJCSMgbWF5IG9yIG1heSBub3QgYWZmZWN0ICdjdXInCgktcyBuYW1lPWZyZXEJIyBz eW5vbnltCgojIFJlc2V0IChhbGwpIHBhcmFtZXRlcnM6CgktLWRlZmF1bHRzCSMgUmVzZXQgYWxs IHIvdyBwYXJhbWV0ZXJzIHRvIGgvdyBkZWZhdWx0cwoJLWQJCSMgc3lub255bQoKIyBMb2NrIHRv IHNwZWNpZmljIGZyZXF1ZW5jeToKCS0tbWF4CQkjIExvY2sgdG8gKGgvdyBkZWZpbmVkKSBtYXgK CS1tCQkjIHN5bm9ueW0KCS0tbWluCQkjIExvY2sgdG8gKGgvdyBkZWZpbmVkKSBtaW4KCS1pCQkj IHN5bm9ueW0KCS0tZWZmCQkjIExvY2sgdG8gKGgvdyBkZWZpbmVkKSBSUGUKCS1lCQkjIHN5bm9u eW0KCS0tbG9jayBmcmVxCSMgTG9jayB0byBjdXN0b20gZnJlcXVlbmN5CgktbCBmcmVxCQkjIHN5 bm9ueW0KCltBc2lkZV0KSWYgdGhlIGxvY2tpbmcgY29tbWFuZHMgYXJlIGltcGxlbWVudGVkIGJ5 IHNldHRpbmcgYm90aCAnbWluJyBhbmQgJ21heCcKdG8gdGhlIHNhbWUgdmFsdWUsIGFzIGFwcGVh cnMgdG8gYmUgdGhlIGNhc2UgaW4gdGhlIGNvZGUgYmVsb3csIHRoZW4KZGVmaW5pbmcgIi0tbWF4 IiBhbmQgIi0tbWluIHRvIG1lYW4gImxvY2sgdG8gY3VycmVudCB2YWx1ZSBvZiBtYXgvbWluCnBh cmFtZXRlciAoYXMgSSB3YXMgb3JpZ2luYWxseSBnb2luZyB0bykgd291bGQgcmVzdWx0IGluIHRo ZSBzZXF1ZW5jZSBvZgpjb21tYW5kczoKCiQgc3VkbyBpbnRlbF9mcmVxdWVuY3kgLS1sb2NrIDkw MAokIHN1ZG8gaW50ZWxfZnJlcXVlbmN5IC0tbWF4Cgpub3QgaGF2aW5nIHRoZSBleHBlY3RlZCBl ZmZlY3QgLSB0aGUgc2Vjb25kIGNvbW1hbmQgd291bGQgaGF2ZSBubwplZmZlY3QsIGJlY2F1c2Ug bWF4IHdvdWxkIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIDkwMCBieSB0aGUgZmlyc3QuIFNvIGl0J3MK YmV0dGVyIHRvIGZvciAtLW1pbiBhbmQgLS1tYXggdG8gbG9jayB0aGUgZnJlcXVlbmN5IHRvIHRo ZSBoL3cgZGVmYXVsdAp2YWx1ZXMuClsvQXNpZGVdCgpPbmx5IG9uZSBjb21tYW5kIG1heSBiZSBn aXZlbiBwZXIgaW52b2NhdGlvbi4gKEl0IGNvdWxkIGJlIG1lYW5pbmdmdWwgdG8KY29tYmluZSBz b21lIHBlcm11dGF0aW9ucywgYnV0IGl0IHdvdWxkIGJlIGNvbXBsaWNhdGVkIGFuZC9vciBjb25m dXNpbmcKYW5kIGludm9sdmUgZXh0cmEgKGFyYml0cmFyeSkgZGVjaXNpb25zLCBzdWNoIGFzIHdo ZXRoZXIgb3B0aW9ucyBhcmUKcHJvY2Vzc2VkIGluIGNvbW1hbmQtbGluZSBvcmRlciBvciBpbiBm aXhlZCBvcmRlciwgYW5kIGhlbmNlIHdoZXRoZXIgb3IKbm90ICItZCAtZyAtbSIgaXMgZXF1aXZh bGVudCB0byAiLW0gLWcgLWQiLCBldGMuIFNvIEtJU1MpLgoKLkRhdmUuCgo+ICQgc3VkbyBpbnRl bF9mcmVxdWVuY3kgLS1tYXgKPiAkIHN1ZG8gaW50ZWxfZnJlcXVlbmN5IC1nCj4gY3VyOiAxMjAw IE1Iego+IG1pbjogMTIwMCBNSHoKPiBSUDE6IDIwMCBNSHoKPiBtYXg6IDEyMDAgTUh6Cj4gCj4g JCBzdWRvIGludGVsX2ZyZXF1ZW5jeSAtZQo+ICQgc3VkbyBpbnRlbF9mcmVxdWVuY3kgLWcKPiBj dXI6IDIwMCBNSHoKPiBtaW46IDIwMCBNSHoKPiBSUDE6IDIwMCBNSHoKPiBtYXg6IDIwMCBNSHoK PiAKPiAkIHN1ZG8gaW50ZWxfZnJlcXVlbmN5IC0tbWF4Cj4gJCBzdWRvIGludGVsX2ZyZXF1ZW5j eSAtZwo+IGN1cjogMTIwMCBNSHoKPiBtaW46IDEyMDAgTUh6Cj4gUlAxOiAyMDAgTUh6Cj4gbWF4 OiAxMjAwIE1Iego+IAo+ICQgc3VkbyBpbnRlbF9mcmVxdWVuY3kgLS1taW4KPiAkIHN1ZG8gaW50 ZWxfZnJlcXVlbmN5IC1nCj4gY3VyOiAyMDAgTUh6Cj4gbWluOiAyMDAgTUh6Cj4gUlAxOiAyMDAg TUh6Cj4gbWF4OiAyMDAgTUh6Cj4gLS0tCj4gIHRvb2xzL01ha2VmaWxlLnNvdXJjZXMgIHwgICAx ICsKPiAgdG9vbHMvaW50ZWxfZnJlcXVlbmN5LmMgfCAzNjMgKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrCj4gIDIgZmlsZXMgY2hhbmdlZCwgMzY0IGluc2Vy dGlvbnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IHRvb2xzL2ludGVsX2ZyZXF1ZW5jeS5jCj4g Cj4gZGlmZiAtLWdpdCBhL3Rvb2xzL01ha2VmaWxlLnNvdXJjZXMgYi90b29scy9NYWtlZmlsZS5z b3VyY2VzCj4gaW5kZXggYjg1YTZiOC4uMmJlYTM4OSAxMDA2NDQKPiAtLS0gYS90b29scy9NYWtl ZmlsZS5zb3VyY2VzCj4gKysrIGIvdG9vbHMvTWFrZWZpbGUuc291cmNlcwo+IEBAIC0xNCw2ICsx NCw3IEBAIGJpbl9QUk9HUkFNUyA9IAkJCQlcCj4gIAlpbnRlbF9kdW1wX2RlY29kZSAJCVwKPiAg CWludGVsX2Vycm9yX2RlY29kZSAJCVwKPiAgCWludGVsX2ZvcmNld2FrZWQJCVwKPiArCWludGVs X2ZyZXF1ZW5jeQkJCVwKPiAgCWludGVsX2ZyYW1lYnVmZmVyX2R1bXAgCQlcCj4gIAlpbnRlbF9n cHVfdGltZSAJCQlcCj4gIAlpbnRlbF9ncHVfdG9wIAkJCVwKPiBkaWZmIC0tZ2l0IGEvdG9vbHMv aW50ZWxfZnJlcXVlbmN5LmMgYi90b29scy9pbnRlbF9mcmVxdWVuY3kuYwo+IG5ldyBmaWxlIG1v ZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uNTlmMzgxNAo+IC0tLSAvZGV2L251bGwKPiArKysg Yi90b29scy9pbnRlbF9mcmVxdWVuY3kuYwo+IEBAIC0wLDAgKzEsMzYzIEBACj4gKy8qCj4gKyAq IENvcHlyaWdodCDCqSAyMDE1IEludGVsIENvcnBvcmF0aW9uCj4gKyAqCj4gKyAqIFBlcm1pc3Np b24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFp bmluZyBhCj4gKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVu dGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCj4gKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3 YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KPiAr ICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3Ry aWJ1dGUsIHN1YmxpY2Vuc2UsCj4gKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdh cmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+ICsgKiBTb2Z0d2FyZSBpcyBm dXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+ ICsgKgo+ICsgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9u IG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0Cj4gKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5j bHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKPiArICog U29mdHdhcmUuCj4gKyAqCj4gKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBX SVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gKyAqIElNUExJRUQsIElO Q0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM SVRZLAo+ICsgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklO R0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKPiArICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hU IEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiArICog TElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhF UldJU0UsIEFSSVNJTkcKPiArICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBU SEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgo+ICsgKiBERUFMSU5HUyBJTiBUSEUgU09G VFdBUkUuCj4gKyAqCj4gKyAqIEV4YW1wbGU6Cj4gKyAqIEdldCBhbGwgZnJlcXVlbmNpZXM6Cj4g KyAqIGludGVsX2ZyZXF1ZW5jeSAtLWdldD1jdXIsbWluLG1heCxlZmYKPiArICoKPiArICogU2Ft ZSBhcyBhYm92ZToKPiArICogaW50ZWxfZnJlcXVlbmN5IC1nCj4gKyAqCj4gKyAqIEdldCB0aGUg ZWZmaWNpZW50IGZyZXF1ZW5jeToKPiArICogaW50ZWxfZnJlcXVlbmN5IC1nZWZmCj4gKyAqCj4g KyAqIExvY2sgdGhlIEdQVSBmcmVxdWVuY3kgdG8gMzAwTUh6Ogo+ICsgKiBpbnRlbF9mcmVxdWVu Y3kgLS1zZXQgbWluPTMwMAo+ICsgKgo+ICsgKiBTZXQgdGhlIG1heGltdW0gZnJlcXVlbmN5IHRv IDkwME1IejoKPiArICogaW50ZWxfZnJlcXVlbmN5IC0tY3VzdG9tIG1heD05MDAKPiArICoKPiAr ICogTG9jayB0aGUgR1BVIGZyZXF1ZW5jeSB0byBpdHMgbWF4aW11bSBmcmVxdWVuY3k6Cj4gKyAq IGludGVsX2ZyZXF1ZW5jeSAtLW1heAo+ICsgKgo+ICsgKiBMb2NrIHRoZSBHUFUgZnJlcXVlbmN5 IHRvIGl0cyBtb3N0IGVmZmljaWVudCBmcmVxdWVuY3k6Cj4gKyAqIGludGVsX2ZyZXF1ZW5jeSAt ZQo+ICsgKgo+ICsgKiBMb2NrIFRoZSBHUFUgZnJlcXVlbmN5IHRvIGl0cyBtaW5pbXVtIGZyZXF1 ZW5jeToKPiArICogaW50ZWxfZnJlcXVlbmN5IC0tbWluCj4gKyAqCj4gKyAqIFJlc2V0IHRoZSBH UFUgdG8gaGFyZHdhcmUgZGVmYXVsdHMKPiArICogaW50ZWxfZnJlcXVlbmN5IC1kCj4gKyAqLwo+ ICsKPiArI2RlZmluZSBfR05VX1NPVVJDRQo+ICsjaW5jbHVkZSA8YXNzZXJ0Lmg+Cj4gKyNpbmNs dWRlIDxnZXRvcHQuaD4KPiArI2luY2x1ZGUgPHN0ZGlvLmg+Cj4gKyNpbmNsdWRlIDx0aW1lLmg+ Cj4gKyNpbmNsdWRlIDx1bmlzdGQuaD4KPiArCj4gKyNpbmNsdWRlICJkcm10ZXN0LmgiCj4gKyNp bmNsdWRlICJpbnRlbF9jaGlwc2V0LmgiCj4gKwo+ICtzdGF0aWMgaW50IGRldmljZSwgZGV2aWQ7 Cj4gKwo+ICtlbnVtIHsKPiArCUNVUj0wLAo+ICsJTUlOLAo+ICsJRUZGLAo+ICsJTUFYLAo+ICsJ UlAwLAo+ICsJUlBuCj4gK307Cj4gKwo+ICtzdHJ1Y3QgZnJlcV9pbmZvIHsKPiArCWNvbnN0IGNo YXIgKm5hbWU7Cj4gKwljb25zdCBjaGFyICptb2RlOwo+ICsJRklMRSAqZmlscDsKPiArCWNoYXIg KnBhdGg7Cj4gK307Cj4gKwo+ICtzdGF0aWMgc3RydWN0IGZyZXFfaW5mbyBpbmZvW10gPSB7Cj4g Kwl7ICJjdXIiLCAiciIgIH0sCj4gKwl7ICJtaW4iLCAicmIrIiB9LAo+ICsJeyAiUlAxIiwgInIi IH0sCj4gKwl7ICJtYXgiLCAicmIrIiB9LAo+ICsJeyAiUlAwIiwgInIiIH0sCj4gKwl7ICJSUG4i LCAiciIgfQo+ICt9Owo+ICsKPiArc3RhdGljIGNoYXIgKgo+ICtnZXRfc3lzZnNfcGF0aChjb25z dCBjaGFyICp3aGljaCkKPiArewo+ICsJc3RhdGljIGNvbnN0IGNoYXIgZm10W10gPSAiL3N5cy9j bGFzcy9kcm0vY2FyZCUxZC9ndF8lM3NfZnJlcV9taHoiOwo+ICsJY2hhciAqcGF0aDsKPiArCWlu dCByZXQ7Cj4gKwo+ICsjZGVmaW5lIFNUQVRJQ19TVFJMRU4oc3RyaW5nKSAoc2l6ZW9mKHN0cmlu ZykgLyBzaXplb2Yoc3RyaW5nIFswXSkpCj4gKwlyZXQgPSBhc3ByaW50ZigmcGF0aCwgZm10LCBk ZXZpY2UsIHdoaWNoKTsKPiArCWFzc2VydChyZXQgPT0gKFNUQVRJQ19TVFJMRU4oZm10KSAtIDMp KTsKPiArI3VuZGVmIFNUQVRJQ19TVFJMRU4KPiArCj4gKwlyZXR1cm4gcGF0aDsKPiArfQo+ICsK PiArc3RhdGljIHZvaWQKPiAraW5pdGlhbGl6ZV9mcmVxX2luZm8oc3RydWN0IGZyZXFfaW5mbyAq ZnJlcV9pbmZvKQo+ICt7Cj4gKwlpZiAoZnJlcV9pbmZvLT5maWxwKQo+ICsJCXJldHVybjsKPiAr Cj4gKwlmcmVxX2luZm8tPnBhdGggPSBnZXRfc3lzZnNfcGF0aChmcmVxX2luZm8tPm5hbWUpOwo+ ICsJYXNzZXJ0KGZyZXFfaW5mby0+cGF0aCk7Cj4gKwlmcmVxX2luZm8tPmZpbHAgPSBmb3Blbihm cmVxX2luZm8tPnBhdGgsIGZyZXFfaW5mby0+bW9kZSk7Cj4gKwlhc3NlcnQoZnJlcV9pbmZvLT5m aWxwKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgd2FpdF9mcmVxX3NldHRsZSh2b2lkKQo+ICt7 Cj4gKwlzdHJ1Y3QgdGltZXNwZWMgdHM7Cj4gKwo+ICsJLyogRklYTUU6IExhenkgc2xlZXAgd2l0 aG91dCBjaGVjay4gKi8KPiArCXRzLnR2X3NlYyA9IDA7Cj4gKwl0cy50dl9uc2VjID0gMjAwMDA7 Cj4gKwljbG9ja19uYW5vc2xlZXAoQ0xPQ0tfTU9OT1RPTklDLCAwLCAmdHMsIE5VTEwpOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgdm9pZCBzZXRfZnJlcXVlbmN5KHN0cnVjdCBmcmVxX2luZm8gKmZyZXFf aW5mbywgaW50IHZhbCkKPiArewo+ICsJaW5pdGlhbGl6ZV9mcmVxX2luZm8oZnJlcV9pbmZvKTsK PiArCXJld2luZChmcmVxX2luZm8tPmZpbHApOwo+ICsJYXNzZXJ0KGZwcmludGYoZnJlcV9pbmZv LT5maWxwLCAiJWQiLCB2YWwpID4gMCk7Cj4gKwo+ICsJd2FpdF9mcmVxX3NldHRsZSgpOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW50IGdldF9mcmVxdWVuY3koc3RydWN0IGZyZXFfaW5mbyAqZnJlcV9p bmZvKQo+ICt7Cj4gKwlpbnQgdmFsOwo+ICsKPiArCWluaXRpYWxpemVfZnJlcV9pbmZvKGZyZXFf aW5mbyk7Cj4gKwlyZXdpbmQoZnJlcV9pbmZvLT5maWxwKTsKPiArCWFzc2VydChmc2NhbmYoZnJl cV9pbmZvLT5maWxwLCAiJWQiLCAmdmFsKT09MSk7Cj4gKwo+ICsJcmV0dXJuIHZhbDsKPiArfQo+ ICsKPiArc3RhdGljIHZvaWQKPiArdXNhZ2UoY29uc3QgY2hhciAqcHJvZykKPiArewo+ICsJcHJp bnRmKCJVc2FnZTogJXMgWy1lXSBbLS1taW4gfCAtLW1heF0gWy1nIChtaW58bWF4fGVmZmljaWVu dCldIFstcyBmcmVxdWVuY3lfbWh6XVxuXG4iLCBwcm9nKTsKPiArCXByaW50ZigiJXMgQSBwcm9n cmFtIHRvIG1hbmlwdWxhdGUgSW50ZWwgR1BVIGZyZXF1ZW5jaWVzLlxuXG4iLCBwcm9nKTsKPiAr CXByaW50ZigiT3B0aW9uczogXG4iKTsKPiArCXByaW50ZigiICAtZQkJTG9jayBmcmVxdWVuY3kg dG8gdGhlIG1vc3QgZWZmaWNpZW50IGZyZXF1ZW5jeVxuIik7Cj4gKwlwcmludGYoIiAgLWcsIC0t Z2V0PSAgICBHZXQgdGhlIGZyZXF1ZW5jeSAob3B0aW9uYWwgYXJnOiBcImN1clwifFwibWluXCJ8 XCJtYXhcInxcImVmZlwiKVxuIik7Cj4gKwlwcmludGYoIiAgLXMsIC0tc2V0ICAgICBMb2NrIGZy ZXF1ZW5jeSB0byBhbiBhYnNvbHV0ZSB2YWx1ZSAoTUh6KVxuIik7Cj4gKwlwcmludGYoIiAgLWMs IC0tY3VzdG9tICBTZXQgYSBtaW4sIG9yIG1heCBmcmVxdWVuY3kgXCJtaW49WCB8IG1heD1ZXCJc biIpOwo+ICsJcHJpbnRmKCIgIC1tICAtLW1heCAgICAgTG9jayBmcmVxdWVuY3kgdG8gbWF4IGZy ZXF1ZW5jeVxuIik7Cj4gKwlwcmludGYoIiAgLWkgIC0tbWluICAgICBMb2NrIGZyZXF1ZW5jeSB0 byBtaW4gKG5ldmVyIGEgZ29vZCBpZGVhLCBERUJVRyBPTkxZKVxuIik7Cj4gKwlwcmludGYoIiAg LWQgIC0tZGVmYXVsdHMgIFJldHVybiB0aGUgc3lzdGVtIHRvIGhhcmR3YXJlIGRlZmF1bHRzXG4i KTsKPiArCXByaW50ZigiRXhhbXBsZXM6XG4iKTsKPiArCXByaW50ZigiXHRpbnRlbF9mcmVxdWVu Y3kgLWdtaW4sY3VyIEdldCB0aGUgY3VycmVudCBhbmQgbWluaW11bSBmcmVxdWVuY3lcbiIpOwo+ ICsJcHJpbnRmKCJcdGludGVsX2ZyZXF1ZW5jeSAtcyA0MDAgICAgTG9jayBmcmVxdWVuY3kgdG8g NDAwTWh6XG4iKTsKPiArCXByaW50ZigiXHRpbnRlbF9mcmVxdWVuY3kgLWMgbWF4PTc1MCBTZXQg dGhlIG1heCBmcmVxdWVuY3kgdG8gNzUwTUh6XG4iKTsKPiArCWV4aXQoRVhJVF9GQUlMVVJFKTsK PiArfQo+ICsKPiArLyogUmV0dXJucyByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbiAqLwo+ICtzdGF0 aWMgYm9vbAo+ICtwYXJzZShpbnQgYXJnYywgY2hhciAqYXJndltdLCBib29sICphY3RfdXBvbiwg aW50ICpuZXdfZnJlcSkKPiArewo+ICsJaW50IGMsIHRtcDsKPiArCWJvb2wgd3JpdGUgPSBmYWxz ZTsKPiArCj4gKwljaGFyICp0b2tlbltdID0gewo+ICsJCShjaGFyICopaW5mb1tDVVJdLm5hbWUs Cj4gKwkJKGNoYXIgKilpbmZvW01JTl0ubmFtZSwKPiArCQkoY2hhciAqKSJlZmYiLAo+ICsJCShj aGFyICopaW5mb1tNQVhdLm5hbWUKPiArCX07Cj4gKwo+ICsJLyogTm8gYXJncyBtZWFucyAtZyIg Ki8KPiArCWlmIChhcmdjID09IDEpIHsKPiArCQlmb3IgKGMgPSAwOyBjIDwgQVJSQVlfU0laRShh Y3RfdXBvbik7IGMrKykKPiArCQkJYWN0X3Vwb25bY10gPSB0cnVlOwo+ICsJCWdvdG8gZG9uZTsK PiArCX0KPiArCXdoaWxlICgxKSB7Cj4gKwkJaW50IG9wdGlvbl9pbmRleCA9IDA7Cj4gKwkJc3Rh dGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7Cj4gKwkJCXsgImdldCIsIG9wdGlv bmFsX2FyZ3VtZW50LCBOVUxMLCAnZycgfSwKPiArCQkJeyAic2V0IiwgcmVxdWlyZWRfYXJndW1l bnQsIE5VTEwsICdzJyB9LAo+ICsJCQl7ICJjdXN0b20iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVM TCwgJ2MnfSwKPiArCQkJeyAibWluIiwgbm9fYXJndW1lbnQsIE5VTEwsICdpJyB9LAo+ICsJCQl7 ICJtYXgiLCBub19hcmd1bWVudCwgTlVMTCwgJ20nIH0sCj4gKwkJCXsgImRlZmF1bHRzIiwgbm9f YXJndW1lbnQsIE5VTEwsICdkJyB9LAo+ICsJCQl7ICJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEws ICdoJyB9LAo+ICsJCQl7IE5VTEwsIDAsIE5VTEwsIDB9Cj4gKwkJfTsKPiArCj4gKwkJYyA9IGdl dG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJlZzo6czpjOm1pZGgiLCBsb25nX29wdGlvbnMsICZvcHRp b25faW5kZXgpOwo+ICsJCWlmIChjID09IC0xKQo+ICsJCQlicmVhazsKPiArCj4gKwkJc3dpdGNo IChjKSB7Cj4gKwkJY2FzZSAnZyc6Cj4gKwkJCWlmICh3cml0ZSA9PSB0cnVlKQo+ICsJCQkJZnBy aW50ZihzdGRlcnIsICJSZWFkIGFuZCB3cml0ZSBvcGVyYXRpb25zIG5vdCBzdXBwb3J0IHNpbXVs dGFuZW91c2x5LlxuIik7Cj4gKwo+ICsJCQlpZiAob3B0YXJnKSB7Cj4gKwkJCQljaGFyICp2YWx1 ZSwgKnN1Ym9wdHMgPSBvcHRhcmc7Cj4gKwkJCQlpbnQgeDsKPiArCQkJCXdoaWxlICgqc3Vib3B0 cyAhPSAnXDAnKSB7Cj4gKwkJCQkJeCA9IGdldHN1Ym9wdCgmc3Vib3B0cywgdG9rZW4sICZ2YWx1 ZSk7Cj4gKwkJCQkJaWYgKHggPT0gLTEpIHsKPiArCQkJCQkJZnByaW50ZihzdGRlcnIsICJVbnJl Y29nbml6ZWQgb3B0aW9uICglcylcbiIsIHZhbHVlKTsKPiArCQkJCQkJYnJlYWs7Cj4gKwkJCQkJ fSBlbHNlCj4gKwkJCQkJCWFjdF91cG9uW3hdID0gdHJ1ZTsKPiArCQkJCX0KPiArCQkJfSBlbHNl IHsKPiArCQkJCWludCBpOwo+ICsJCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWN0X3Vw b24pOyBpKyspCj4gKwkJCQkJYWN0X3Vwb25baV0gPSB0cnVlOwo+ICsJCQl9Cj4gKwkJCWJyZWFr Owo+ICsJCWNhc2UgJ3MnOgo+ICsJCQlpZiAoIW9wdGFyZykKPiArCQkJCXVzYWdlKGFyZ3ZbMF0p Owo+ICsKPiArCQkJaWYgKHdyaXRlID09IHRydWUpIHsKPiArCQkJCWZwcmludGYoc3RkZXJyLCAi T25seSBvbmUgd3JpdGUgbWF5IGJlIHNwZWNpZmllZCBhdCBhIHRpbWVcbiIpOwo+ICsJCQkJZXhp dChFWElUX0ZBSUxVUkUpOwo+ICsJCQl9Cj4gKwo+ICsJCQl3cml0ZSA9IHRydWU7Cj4gKwkJCWFj dF91cG9uW01JTl0gPSB0cnVlOwo+ICsJCQlhY3RfdXBvbltNQVhdID0gdHJ1ZTsKPiArCQkJc3Nj YW5mKG9wdGFyZywgIiVkIiwgJm5ld19mcmVxW01BWF0pOwo+ICsJCQluZXdfZnJlcVtNSU5dID0g bmV3X2ZyZXFbTUFYXTsKPiArCQkJYnJlYWs7Cj4gKwkJY2FzZSAnYyc6Cj4gKwkJCWlmICghb3B0 YXJnKQo+ICsJCQkJdXNhZ2UoYXJndlswXSk7Cj4gKwo+ICsJCQlpZiAod3JpdGUgPT0gdHJ1ZSkg ewo+ICsJCQkJZnByaW50ZihzdGRlcnIsICJPbmx5IG9uZSB3cml0ZSBtYXkgYmUgc3BlY2lmaWVk IGF0IGEgdGltZVxuIik7Cj4gKwkJCQlleGl0KEVYSVRfRkFJTFVSRSk7Cj4gKwkJCX0KPiArCj4g KwkJCXdyaXRlID0gdHJ1ZTsKPiArCj4gKwkJCWlmICghc3RybmNtcCgibWluPSIsIG9wdGFyZywg NCkpIHsKPiArCQkJCWFjdF91cG9uW01JTl0gPSB0cnVlOwo+ICsJCQkJc3NjYW5mKG9wdGFyZys0 LCAiJWQiLCAmbmV3X2ZyZXFbTUlOXSk7Cj4gKwkJCX0gZWxzZSBpZiAoIXN0cm5jbXAoIm1heD0i LCBvcHRhcmcsIDQpKSB7Cj4gKwkJCQlhY3RfdXBvbltNQVhdID0gdHJ1ZTsKPiArCQkJCXNzY2Fu ZihvcHRhcmcrNCwgIiVkIiwgJm5ld19mcmVxW01BWF0pOwo+ICsJCQl9IGVsc2Ugewo+ICsJCQkJ ZnByaW50ZihzdGRlcnIsICJTZWxlY3RlZCB1bm1vZGlmaWFibGUgZnJlcXVlbmN5XG4iKTsKPiAr CQkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKPiArCQkJfQo+ICsJCQlicmVhazsKPiArCQljYXNlICdl JzogLyogZWZmaWNpZW50ICovCj4gKwkJCWlmIChJU19WQUxMRVlWSUVXKGRldmlkKSB8fCBJU19D SEVSUllWSUVXKGRldmlkKSkgewo+ICsJCQkJLyogdGhlIExQIHBhcnRzIGhhdmUgc3BlY2lhbCBl ZmZpY2llbnQgZnJlcXVlbmNpZXMgKi8KPiArCQkJCWZwcmludGYoc3RkZXJyLAo+ICsJCQkJCSJG SVhNRTogV2FybmluZyBlZmZpY2llbnQgZnJlcXVlbmN5IGluZm9ybWF0aW9uIGlzIGluY29ycmVj dC5cbiIpOwo+ICsJCQkJZXhpdChFWElUX0ZBSUxVUkUpOwo+ICsJCQl9Cj4gKwkJCXRtcCA9IGdl dF9mcmVxdWVuY3koJmluZm9bRUZGXSk7Cj4gKwkJCW5ld19mcmVxW01JTl0gPSB0bXA7Cj4gKwkJ CW5ld19mcmVxW01BWF0gPSB0bXA7Cj4gKwkJCWFjdF91cG9uW01JTl0gPSB0cnVlOwo+ICsJCQlh Y3RfdXBvbltNQVhdID0gdHJ1ZTsKPiArCQkJd3JpdGUgPSB0cnVlOwo+ICsJCQlicmVhazsKPiAr CQljYXNlICdpJzogLyogbUluICovCj4gKwkJCXRtcCA9IGdldF9mcmVxdWVuY3koJmluZm9bUlBu XSk7Cj4gKwkJCW5ld19mcmVxW01JTl0gPSB0bXA7Cj4gKwkJCW5ld19mcmVxW01BWF0gPSB0bXA7 Cj4gKwkJCWFjdF91cG9uW01JTl0gPSB0cnVlOwo+ICsJCQlhY3RfdXBvbltNQVhdID0gdHJ1ZTsK PiArCQkJd3JpdGUgPSB0cnVlOwo+ICsJCQlicmVhazsKPiArCQljYXNlICdtJzogLyogbWF4ICov Cj4gKwkJCXRtcCA9IGdldF9mcmVxdWVuY3koJmluZm9bUlAwXSk7Cj4gKwkJCW5ld19mcmVxW01J Tl0gPSB0bXA7Cj4gKwkJCW5ld19mcmVxW01BWF0gPSB0bXA7Cj4gKwkJCWFjdF91cG9uW01JTl0g PSB0cnVlOwo+ICsJCQlhY3RfdXBvbltNQVhdID0gdHJ1ZTsKPiArCQkJd3JpdGUgPSB0cnVlOwo+ ICsJCQlicmVhazsKPiArCQljYXNlICdkJzogLyogZGVmYXVsdHMgKi8KPiArCQkJbmV3X2ZyZXFb TUlOXSA9IGdldF9mcmVxdWVuY3koJmluZm9bUlBuXSk7Cj4gKwkJCW5ld19mcmVxW01BWF0gPSBn ZXRfZnJlcXVlbmN5KCZpbmZvW1JQMF0pOwo+ICsJCQlhY3RfdXBvbltNSU5dID0gdHJ1ZTsKPiAr CQkJYWN0X3Vwb25bTUFYXSA9IHRydWU7Cj4gKwkJCXdyaXRlID0gdHJ1ZTsKPiArCQkJYnJlYWs7 Cj4gKwkJY2FzZSAnaCc6Cj4gKwkJZGVmYXVsdDoKPiArCQkJdXNhZ2UoYXJndlswXSk7Cj4gKwkJ fQo+ICsJfQo+ICsKPiArZG9uZToKPiArCXJldHVybiB3cml0ZTsKPiArfQo+ICsKPiAraW50IG1h aW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKPiArewo+ICsKPiArCWJvb2wgd3JpdGUsIGZhaWws IHRhcmdldHNbTUFYKzFdID0ge2ZhbHNlfTsKPiArCWludCBpLCB0cnkgPSAxLCBzZXRfZnJlcVtN QVgrMV0gPSB7MH07Cj4gKwo+ICsJZGV2aWQgPSBpbnRlbF9nZXRfZHJtX2RldmlkKGRybV9vcGVu X2FueSgpKTsKPiArCWRldmljZSA9IGRybV9nZXRfY2FyZCgpOwo+ICsKPiArCXdyaXRlID0gcGFy c2UoYXJnYywgYXJndiwgdGFyZ2V0cywgc2V0X2ZyZXEpOwo+ICsJZmFpbCA9IHdyaXRlOwo+ICsK PiArCS8qIElmIHdlJ3ZlIHByZXZpb3VzbHkgbG9ja2VkIHRoZSBmcmVxdWVuY3ksIHdlIG5lZWQg dG8gbWFrZSBzdXJlIHRvIHNldCB0aGluZ3MKPiArCSAqIGluIHRoZSBjb3JyZWN0IG9yZGVyLCBv ciBlbHNlIHRoZSBvcGVyYXRpb24gd2lsbCBmYWlsIChpZS4gbWluID0gbWF4ID0gMjAwLAo+ICsJ ICogYW5kIHdlIHNldCBtaW4gdG8gMzAwLCB3ZSBmYWlsIGJlY2F1c2UgaXQgd291bGQgdHJ5IHRv IHNldCBtaW4gPgo+ICsJICogbWF4KS4gVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIGJlIGdvaW5n IGVpdGhlciBmb3J3YXJkIG9yIHJldmVyc2UKPiArCSAqIHRocm91Z2ggdGhlIGxvb3AuIE1JTiBp cyBhbHdheXMgYmVmb3JlIE1BWC4KPiArCSAqCj4gKwkgKiBYWFg6IFNpbmNlIG9ubHkgbWluIGFu ZCBtYXggYXJlIGF0IHBsYXksIHRoZSBzdXBlciBsYXp5IHdheSBpcyB0byBkbyB0aGlzCj4gKwkg KiAzIHRpbWVzIGFuZCBpZiB3ZSBzdGlsbCBmYWlsIGFmdGVyIDMsIGl0J3MgZm9yIHJlYWwuCj4g KwkgKi8KPiArYWdhaW46Cj4gKwlpZiAodHJ5ID4gMikgewo+ICsJCWZwcmludGYoc3RkZXJyLCAi RGlkIG5vdCBhY2hpZXZlIGRlc2lyZWQgZnJlcS5cbiIpOwo+ICsJCWV4aXQoRVhJVF9GQUlMVVJF KTsKPiArCX0KPiArCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhcmdldHMpOyBpKyspIHsK PiArCQlpZiAodGFyZ2V0c1tpXSA9PSBmYWxzZSkKPiArCQkJY29udGludWU7Cj4gKwo+ICsJCWlm ICh3cml0ZSkgewo+ICsJCQlzZXRfZnJlcXVlbmN5KCZpbmZvW2ldLCBzZXRfZnJlcVtpXSk7Cj4g KwkJCWlmIChnZXRfZnJlcXVlbmN5KCZpbmZvW2ldKSAhPSBzZXRfZnJlcVtpXSkKPiArCQkJCWZh aWwgPSB0cnVlOwo+ICsJCQllbHNlCj4gKwkJCQlmYWlsID0gZmFsc2U7Cj4gKwkJfSBlbHNlIHsK PiArCQkJcHJpbnRmKCIlczogJWQgTUh6XG4iLCBpbmZvW2ldLm5hbWUsIGdldF9mcmVxdWVuY3ko JmluZm9baV0pKTsKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJaWYgKGZhaWwpIHsKPiArCQl0cnkrKzsK PiArCQlnb3RvIGFnYWluOwo+ICsJfQo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpF KHRhcmdldHMpOyBpKyspIHsKPiArCQlpZiAoaW5mb1tpXS5maWxwKSB7Cj4gKwkJCWZjbG9zZShp bmZvW2ldLmZpbHApOwo+ICsJCQlmcmVlKGluZm9baV0ucGF0aCk7Cj4gKwkJfQo+ICsJfQo+ICsK PiArCXJldHVybiBFWElUX1NVQ0NFU1M7Cj4gK30KPiAKCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4 QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxt YW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==