From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: Re: [PATCH i-g-t 18/19] i915: Add gem_exec_balancer Date: Tue, 12 Mar 2019 10:23:12 +0000 Message-ID: References: <20190308181129.15562-1-chris@chris-wilson.co.uk> <20190308181129.15562-18-chris@chris-wilson.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by gabe.freedesktop.org (Postfix) with ESMTPS id E966689C63 for ; Tue, 12 Mar 2019 10:23:14 +0000 (UTC) In-Reply-To: <20190308181129.15562-18-chris@chris-wilson.co.uk> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Chris Wilson , intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org Ck9uIDA4LzAzLzIwMTkgMTg6MTEsIENocmlzIFdpbHNvbiB3cm90ZToKPiBFeGVyY2lzZSB0aGUg aW4ta2VybmVsIGxvYWQgYmFsYW5jZXIgY2hlY2tpbmcgdGhhdCB3ZSBjYW4gZGlzdHJpYnV0ZQo+ IGJhdGNoZXMgYWNyb3NzIHRoZSBzZXQgb2YgY3R4LT5lbmdpbmVzIHRvIGF2b2lkIGxvYWQuCj4g Cj4gU2lnbmVkLW9mZi1ieTogQ2hyaXMgV2lsc29uIDxjaHJpc0BjaHJpcy13aWxzb24uY28udWs+ Cj4gLS0tCj4gICB0ZXN0cy9NYWtlZmlsZS5hbSAgICAgICAgICAgICAgfCAgIDEgKwo+ICAgdGVz dHMvTWFrZWZpbGUuc291cmNlcyAgICAgICAgIHwgICAxICsKPiAgIHRlc3RzL2k5MTUvZ2VtX2V4 ZWNfYmFsYW5jZXIuYyB8IDYyNyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKPiAg IHRlc3RzL21lc29uLmJ1aWxkICAgICAgICAgICAgICB8ICAgNyArCj4gICA0IGZpbGVzIGNoYW5n ZWQsIDYzNiBpbnNlcnRpb25zKCspCj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgdGVzdHMvaTkxNS9n ZW1fZXhlY19iYWxhbmNlci5jCj4gCj4gZGlmZiAtLWdpdCBhL3Rlc3RzL01ha2VmaWxlLmFtIGIv dGVzdHMvTWFrZWZpbGUuYW0KPiBpbmRleCAyODkyNDliNDIuLjY4YTljMTRiZiAxMDA2NDQKPiAt LS0gYS90ZXN0cy9NYWtlZmlsZS5hbQo+ICsrKyBiL3Rlc3RzL01ha2VmaWxlLmFtCj4gQEAgLTEw Miw2ICsxMDIsNyBAQCBnZW1fY2xvc2VfcmFjZV9MREFERCA9ICQoTERBREQpIC1scHRocmVhZAo+ ICAgZ2VtX2N0eF90aHJhc2hfQ0ZMQUdTID0gJChBTV9DRkxBR1MpICQoVEhSRUFEX0NGTEFHUykK PiAgIGdlbV9jdHhfdGhyYXNoX0xEQUREID0gJChMREFERCkgLWxwdGhyZWFkCj4gICBnZW1fY3R4 X3NzZXVfTERBREQgPSAkKExEQUREKSAkKHRvcF9idWlsZGRpcikvbGliL2xpYmlndF9wZXJmLmxh Cj4gK2k5MTVfZ2VtX2V4ZWNfYmFsYW5jZXJfTERBREQgPSAkKExEQUREKSAkKHRvcF9idWlsZGRp cikvbGliL2xpYmlndF9wZXJmLmxhCj4gICBnZW1fZXhlY19jYXB0dXJlX0xEQUREID0gJChMREFE RCkgLWx6Cj4gICBnZW1fZXhlY19wYXJhbGxlbF9DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChUSFJF QURfQ0ZMQUdTKQo+ICAgZ2VtX2V4ZWNfcGFyYWxsZWxfTERBREQgPSAkKExEQUREKSAtbHB0aHJl YWQKPiBkaWZmIC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUuc291cmNlcyBiL3Rlc3RzL01ha2VmaWxl LnNvdXJjZXMKPiBpbmRleCA0MWU3NTZmMTUuLmY2YzIxYTFhYSAxMDA2NDQKPiAtLS0gYS90ZXN0 cy9NYWtlZmlsZS5zb3VyY2VzCj4gKysrIGIvdGVzdHMvTWFrZWZpbGUuc291cmNlcwo+IEBAIC0y Myw2ICsyMyw3IEBAIFRFU1RTX3Byb2dzID0gXAo+ICAgCWRybV9yZWFkIFwKPiAgIAlpOTE1L2dl bV9jdHhfZW5naW5lcyBcCj4gICAJaTkxNS9nZW1fY3R4X3NoYXJlZCBcCj4gKwlpOTE1L2dlbV9l eGVjX2JhbGFuY2VyIFwKPiAgIAlrbXNfM2QgXAo+ICAgCWttc19hZGRmYl9iYXNpYyBcCj4gICAJ a21zX2F0b21pYyBcCj4gZGlmZiAtLWdpdCBhL3Rlc3RzL2k5MTUvZ2VtX2V4ZWNfYmFsYW5jZXIu YyBiL3Rlc3RzL2k5MTUvZ2VtX2V4ZWNfYmFsYW5jZXIuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0 Cj4gaW5kZXggMDAwMDAwMDAwLi5kOWZkZmZlNjcKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvdGVz dHMvaTkxNS9nZW1fZXhlY19iYWxhbmNlci5jCj4gQEAgLTAsMCArMSw2MjcgQEAKPiArLyoKPiAr ICogQ29weXJpZ2h0IMKpIDIwMTggSW50ZWwgQ29ycG9yYXRpb24KPiArICoKPiArICogUGVybWlz c2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0 YWluaW5nIGEKPiArICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3Vt ZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKPiArICogdG8gZGVhbCBpbiB0aGUgU29m dHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgo+ ICsgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlz dHJpYnV0ZSwgc3VibGljZW5zZSwKPiArICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0 d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCj4gKyAqIFNvZnR3YXJlIGlz IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6 Cj4gKyAqCj4gKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Np b24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKPiArICogcGFyYWdyYXBoKSBzaGFsbCBiZSBp bmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQo+ICsg KiBTb2Z0d2FyZS4KPiArICoKPiArICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIs IFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiArICogSU1QTElFRCwg SU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC SUxJVFksCj4gKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZS SU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAo+ICsgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklH SFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+ICsg KiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9U SEVSV0lTRSwgQVJJU0lORwo+ICsgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRI IFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCj4gKyAqIElOIFRIRSBT T0ZUV0FSRS4KPiArICovCj4gKwo+ICsjaW5jbHVkZSA8c2NoZWQuaD4KPiArCj4gKyNpbmNsdWRl ICJpZ3QuaCIKPiArI2luY2x1ZGUgImlndF9wZXJmLmgiCj4gKyNpbmNsdWRlICJpOTE1L2dlbV9y aW5nLmgiCj4gKyNpbmNsdWRlICJzd19zeW5jLmgiCj4gKwo+ICtJR1RfVEVTVF9ERVNDUklQVElP TigiRXhlcmNpc2UgaW4ta2VybmVsIGxvYWQtYmFsYW5jaW5nIik7Cj4gKwo+ICtzdHJ1Y3QgY2xh c3NfaW5zdGFuY2Ugewo+ICsJdWludDE2X3QgY2xhc3M7Cj4gKwl1aW50MTZfdCBpbnN0YW5jZTsK PiArfTsKPiArI2RlZmluZSBJTlNUQU5DRV9DT1VOVCAoMSA8PCBJOTE1X1BNVV9TQU1QTEVfSU5T VEFOQ0VfQklUUykKPiArCj4gK3N0YXRpYyBib29sIGhhc19jbGFzc19pbnN0YW5jZShpbnQgaTkx NSwgdWludDE2X3QgY2xhc3MsIHVpbnQxNl90IGluc3RhbmNlKQo+ICt7Cj4gKwlpbnQgZmQ7Cj4g Kwo+ICsJZmQgPSBwZXJmX2k5MTVfb3BlbihJOTE1X1BNVV9FTkdJTkVfQlVTWShjbGFzcywgaW5z dGFuY2UpKTsKPiArCWlmIChmZCAhPSAtMSkgewo+ICsJCWNsb3NlKGZkKTsKPiArCQlyZXR1cm4g dHJ1ZTsKPiArCX0KPiArCj4gKwlyZXR1cm4gZmFsc2U7Cj4gK30KPiArCj4gK3N0YXRpYyBzdHJ1 Y3QgY2xhc3NfaW5zdGFuY2UgKgo+ICtsaXN0X2VuZ2luZXMoaW50IGk5MTUsIHVpbnQzMl90IGNs YXNzX21hc2ssIHVuc2lnbmVkIGludCAqb3V0KQo+ICt7Cj4gKwl1bnNpZ25lZCBpbnQgY291bnQg PSAwLCBzaXplID0gNjQ7Cj4gKwlzdHJ1Y3QgY2xhc3NfaW5zdGFuY2UgKmVuZ2luZXM7Cj4gKwo+ ICsJZW5naW5lcyA9IG1hbGxvYyhzaXplICogc2l6ZW9mKCplbmdpbmVzKSk7Cj4gKwlpZiAoIWVu Z2luZXMpIHsKPiArCQkqb3V0ID0gMDsKPiArCQlyZXR1cm4gTlVMTDsKPiArCX0KPiArCj4gKwlm b3IgKGVudW0gZHJtX2k5MTVfZ2VtX2VuZ2luZV9jbGFzcyBjbGFzcyA9IEk5MTVfRU5HSU5FX0NM QVNTX1JFTkRFUjsKPiArCSAgICAgY2xhc3NfbWFzazsKPiArCSAgICAgY2xhc3MrKywgY2xhc3Nf bWFzayA+Pj0gMSkgewo+ICsJCWlmICghKGNsYXNzX21hc2sgJiAxKSkKPiArCQkJY29udGludWU7 Cj4gKwo+ICsJCWZvciAodW5zaWduZWQgaW50IGluc3RhbmNlID0gMDsKPiArCQkgICAgIGluc3Rh bmNlIDwgSU5TVEFOQ0VfQ09VTlQ7Cj4gKwkJICAgICBpbnN0YW5jZSsrKSB7Cj4gKwkJICAgICBp ZiAoIWhhc19jbGFzc19pbnN0YW5jZShpOTE1LCBjbGFzcywgaW5zdGFuY2UpKQo+ICsJCQkgICAg IGNvbnRpbnVlOwo+ICsKPiArCQkJaWYgKGNvdW50ID09IHNpemUpIHsKPiArCQkJCXN0cnVjdCBj bGFzc19pbnN0YW5jZSAqZTsKPiArCj4gKwkJCQlzaXplICo9IDI7Cj4gKwkJCQllID0gcmVhbGxv YyhlbmdpbmVzLCBzaXplKnNpemVvZigqZW5naW5lcykpOwo+ICsJCQkJaWYgKCFlKSB7Cj4gKwkJ CQkJKm91dCA9IGNvdW50Owo+ICsJCQkJCXJldHVybiBlbmdpbmVzOwo+ICsJCQkJfQo+ICsKPiAr CQkJCWVuZ2luZXMgPSBlOwo+ICsJCQl9Cj4gKwo+ICsJCQllbmdpbmVzW2NvdW50KytdID0gKHN0 cnVjdCBjbGFzc19pbnN0YW5jZSl7Cj4gKwkJCQkuY2xhc3MgPSBjbGFzcywKPiArCQkJCS5pbnN0 YW5jZSA9IGluc3RhbmNlLAo+ICsJCQl9Owo+ICsJCX0KPiArCX0KPiArCj4gKwlpZiAoIWNvdW50 KSB7Cj4gKwkJZnJlZShlbmdpbmVzKTsKPiArCQllbmdpbmVzID0gTlVMTDsKPiArCX0KPiArCj4g Kwkqb3V0ID0gY291bnQ7Cj4gKwlyZXR1cm4gZW5naW5lczsKPiArfQo+ICsKPiArc3RhdGljIGlu dCBfX3NldF9sb2FkX2JhbGFuY2VyKGludCBpOTE1LCB1aW50MzJfdCBjdHgsCj4gKwkJCSAgICAg ICBjb25zdCBzdHJ1Y3QgY2xhc3NfaW5zdGFuY2UgKmNpLAo+ICsJCQkgICAgICAgdW5zaWduZWQg aW50IGNvdW50KQo+ICt7Cj4gKwlzdHJ1Y3QgaTkxNV9jb250ZXh0X2VuZ2luZXNfbG9hZF9iYWxh bmNlIGJhbGFuY2VyID0gewo+ICsJCXsgLm5hbWUgPSBJOTE1X0NPTlRFWFRfRU5HSU5FU19FWFRf TE9BRF9CQUxBTkNFIH0sCj4gKwkJLmVuZ2luZXNfbWFzayA9IH4wdWxsLAo+ICsJfTsKPiArCUk5 MTVfREVGSU5FX0NPTlRFWFRfUEFSQU1fRU5HSU5FUyhlbmdpbmVzLCBjb3VudCArIDEpOwo+ICsJ c3RydWN0IGRybV9pOTE1X2dlbV9jb250ZXh0X3BhcmFtIHAgPSB7Cj4gKwkJLmN0eF9pZCA9IGN0 eCwKPiArCQkucGFyYW0gPSBJOTE1X0NPTlRFWFRfUEFSQU1fRU5HSU5FUywKPiArCQkuc2l6ZSA9 IHNpemVvZigmZW5naW5lcyksCgpzaXplb2YoZW5naW5lcykKClJlZ2FyZHMsCgpUdnJ0a28KCj4g KwkJLnZhbHVlID0gdG9fdXNlcl9wb2ludGVyKCZlbmdpbmVzKQo+ICsJfTsKPiArCj4gKwllbmdp bmVzLmV4dGVuc2lvbnMgPSB0b191c2VyX3BvaW50ZXIoJmJhbGFuY2VyKSwKPiArCWVuZ2luZXMu Y2xhc3NfaW5zdGFuY2VbMF0uZW5naW5lX2NsYXNzID0gSTkxNV9FTkdJTkVfQ0xBU1NfSU5WQUxJ RDsKPiArCWVuZ2luZXMuY2xhc3NfaW5zdGFuY2VbMF0uZW5naW5lX2luc3RhbmNlID0gSTkxNV9F TkdJTkVfQ0xBU1NfSU5WQUxJRF9OT05FOwo+ICsJbWVtY3B5KGVuZ2luZXMuY2xhc3NfaW5zdGFu Y2UgKyAxLCBjaSwgY291bnQgKiBzaXplb2YodWludDMyX3QpKTsKPiArCj4gKwlyZXR1cm4gX19n ZW1fY29udGV4dF9zZXRfcGFyYW0oaTkxNSwgJnApOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBz ZXRfbG9hZF9iYWxhbmNlcihpbnQgaTkxNSwgdWludDMyX3QgY3R4LAo+ICsJCQkgICAgICBjb25z dCBzdHJ1Y3QgY2xhc3NfaW5zdGFuY2UgKmNpLAo+ICsJCQkgICAgICB1bnNpZ25lZCBpbnQgY291 bnQpCj4gK3sKPiArCWlndF9hc3NlcnRfZXEoX19zZXRfbG9hZF9iYWxhbmNlcihpOTE1LCBjdHgs IGNpLCBjb3VudCksIDApOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdWludDMyX3QgbG9hZF9iYWxhbmNl cl9jcmVhdGUoaW50IGk5MTUsCj4gKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBjbGFzc19pbnN0YW5j ZSAqY2ksCj4gKwkJCQkgICAgIHVuc2lnbmVkIGludCBjb3VudCkKPiArewo+ICsJdWludDMyX3Qg Y3R4Owo+ICsKPiArCWN0eCA9IGdlbV9jb250ZXh0X2NyZWF0ZShpOTE1KTsKPiArCXNldF9sb2Fk X2JhbGFuY2VyKGk5MTUsIGN0eCwgY2ksIGNvdW50KTsKPiArCj4gKwlyZXR1cm4gY3R4Owo+ICt9 Cj4gKwo+ICtzdGF0aWMgdm9pZCBraWNrX2t0aHJlYWRzKGludCBwZXJpb2RfdXMpCj4gK3sKPiAr CXNjaGVkX3lpZWxkKCk7Cj4gKwl1c2xlZXAocGVyaW9kX3VzKTsKPiArfQo+ICsKPiArc3RhdGlj IGRvdWJsZSBtZWFzdXJlX2xvYWQoaW50IHBtdSwgaW50IHBlcmlvZF91cykKPiArewo+ICsJdWlu dDY0X3QgZGF0YVsyXTsKPiArCXVpbnQ2NF90IGRfdCwgZF92Owo+ICsKPiArCWtpY2tfa3RocmVh ZHMocGVyaW9kX3VzKTsKPiArCj4gKwlpZ3RfYXNzZXJ0X2VxKHJlYWQocG11LCBkYXRhLCBzaXpl b2YoZGF0YSkpLCBzaXplb2YoZGF0YSkpOwo+ICsJZF92ID0gLWRhdGFbMF07Cj4gKwlkX3QgPSAt ZGF0YVsxXTsKPiArCj4gKwl1c2xlZXAocGVyaW9kX3VzKTsKPiArCj4gKwlpZ3RfYXNzZXJ0X2Vx KHJlYWQocG11LCBkYXRhLCBzaXplb2YoZGF0YSkpLCBzaXplb2YoZGF0YSkpOwo+ICsJZF92ICs9 IGRhdGFbMF07Cj4gKwlkX3QgKz0gZGF0YVsxXTsKPiArCj4gKwlyZXR1cm4gZF92IC8gKGRvdWJs ZSlkX3Q7Cj4gK30KPiArCj4gK3N0YXRpYyBkb3VibGUgbWVhc3VyZV9taW5fbG9hZChpbnQgcG11 LCB1bnNpZ25lZCBpbnQgbnVtLCBpbnQgcGVyaW9kX3VzKQo+ICt7Cj4gKwl1aW50NjRfdCBkYXRh WzIgKyBudW1dOwo+ICsJdWludDY0X3QgZF90LCBkX3ZbbnVtXTsKPiArCXVpbnQ2NF90IG1pbiA9 IC0xLCBtYXggPSAwOwo+ICsKPiArCWtpY2tfa3RocmVhZHMocGVyaW9kX3VzKTsKPiArCj4gKwlp Z3RfYXNzZXJ0X2VxKHJlYWQocG11LCBkYXRhLCBzaXplb2YoZGF0YSkpLCBzaXplb2YoZGF0YSkp Owo+ICsJZm9yICh1bnNpZ25lZCBpbnQgbiA9IDA7IG4gPCBudW07IG4rKykKPiArCQlkX3Zbbl0g PSAtZGF0YVsyICsgbl07Cj4gKwlkX3QgPSAtZGF0YVsxXTsKPiArCj4gKwl1c2xlZXAocGVyaW9k X3VzKTsKPiArCj4gKwlpZ3RfYXNzZXJ0X2VxKHJlYWQocG11LCBkYXRhLCBzaXplb2YoZGF0YSkp LCBzaXplb2YoZGF0YSkpOwo+ICsKPiArCWRfdCArPSBkYXRhWzFdOwo+ICsJZm9yICh1bnNpZ25l ZCBpbnQgbiA9IDA7IG4gPCBudW07IG4rKykgewo+ICsJCWRfdltuXSArPSBkYXRhWzIgKyBuXTsK PiArCQlpZ3RfZGVidWcoImVuZ2luZVslZF06ICUuMWYlJVxuIiwKPiArCQkJICBuLCBkX3Zbbl0g LyAoZG91YmxlKWRfdCAqIDEwMCk7Cj4gKwkJaWYgKGRfdltuXSA8IG1pbikKPiArCQkJbWluID0g ZF92W25dOwo+ICsJCWlmIChkX3Zbbl0gPiBtYXgpCj4gKwkJCW1heCA9IGRfdltuXTsKPiArCX0K PiArCj4gKwlpZ3RfZGVidWcoImVsYXBzZWQ6ICUiUFJJdTY0Im5zLCBsb2FkIFslLjFmLCAlLjFm XSUlXG4iLAo+ICsJCSAgZF90LCBtaW4gLyAoZG91YmxlKWRfdCAqIDEwMCwgIG1heCAvIChkb3Vi bGUpZF90ICogMTAwKTsKPiArCj4gKwlyZXR1cm4gbWluIC8gKGRvdWJsZSlkX3Q7Cj4gK30KPiAr Cj4gK3N0YXRpYyB2b2lkIGNoZWNrX2luZGl2aWR1YWxfZW5naW5lKGludCBpOTE1LAo+ICsJCQkJ ICAgIHVpbnQzMl90IGN0eCwKPiArCQkJCSAgICBjb25zdCBzdHJ1Y3QgY2xhc3NfaW5zdGFuY2Ug KmNpLAo+ICsJCQkJICAgIGludCBpZHgpCj4gK3sKPiArCWlndF9zcGluX3QgKnNwaW47Cj4gKwlk b3VibGUgbG9hZDsKPiArCWludCBwbXU7Cj4gKwo+ICsJcG11ID0gcGVyZl9pOTE1X29wZW4oSTkx NV9QTVVfRU5HSU5FX0JVU1koY2lbaWR4XS5jbGFzcywKPiArCQkJCQkJICBjaVtpZHhdLmluc3Rh bmNlKSk7Cj4gKwo+ICsJc3BpbiA9IGlndF9zcGluX2JhdGNoX25ldyhpOTE1LCAuY3R4ID0gY3R4 LCAuZW5naW5lID0gaWR4ICsgMSk7Cj4gKwlsb2FkID0gbWVhc3VyZV9sb2FkKHBtdSwgMTAwMDAp Owo+ICsJaWd0X3NwaW5fYmF0Y2hfZnJlZShpOTE1LCBzcGluKTsKPiArCj4gKwljbG9zZShwbXUp Owo+ICsKPiArCWlndF9hc3NlcnRfZihsb2FkID4gMC45MCwKPiArCQkgICAgICJlbmdpbmUgJWQg KGNsYXNzOmluc3RhbmNlICVkOiVkKSB3YXMgZm91bmQgdG8gYmUgb25seSAlLjFmJSUgYnVzeVxu IiwKPiArCQkgICAgIGlkeCwgY2lbaWR4XS5jbGFzcywgY2lbaWR4XS5pbnN0YW5jZSwgbG9hZCox MDApOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpbmRpdmlkdWFsKGludCBpOTE1KQo+ICt7Cj4g Kwl1aW50MzJfdCBjdHg7Cj4gKwo+ICsJLyoKPiArCSAqIEk5MTVfQ09OVEVYVF9QQVJBTV9FTkdJ TkUgYWxsb3dzIHVzIHRvIGluZGV4IGludG8gdGhlIHVzZXIKPiArCSAqIHN1cHBsaWVkIGFycmF5 IGZyb20gZ2VtX2V4ZWNidWYoKS4gT3VyIGNoZWNrIGlzIHRvIGJ1aWxkIHRoZQo+ICsJICogY3R4 LT5lbmdpbmVbXSB3aXRoIHZhcmlvdXMgZGlmZmVyZW50IGVuZ2luZSBjbGFzc2VzLCBmZWVkIGlu Cj4gKwkgKiBhIHNwaW5uZXIgYW5kIHRoZW4gYXNrIHBtdSB0byBjb25maXJtIGl0IHRoZSBleHBl Y3RlZCBlbmdpbmUKPiArCSAqIHdhcyBidXN5Lgo+ICsJICovCj4gKwo+ICsJY3R4ID0gZ2VtX2Nv bnRleHRfY3JlYXRlKGk5MTUpOwo+ICsKPiArCWZvciAoaW50IG1hc2sgPSAwOyBtYXNrIDwgMzI7 IG1hc2srKykgewo+ICsJCXN0cnVjdCBjbGFzc19pbnN0YW5jZSAqY2k7Cj4gKwkJdW5zaWduZWQg aW50IGNvdW50Owo+ICsKPiArCQljaSA9IGxpc3RfZW5naW5lcyhpOTE1LCAxdSA8PCBtYXNrLCAm Y291bnQpOwo+ICsJCWlmICghY2kpCj4gKwkJCWNvbnRpbnVlOwo+ICsKPiArCQlpZ3RfZGVidWco IkZvdW5kICVkIGVuZ2luZXMgb2YgY2xhc3MgJWRcbiIsIGNvdW50LCBtYXNrKTsKPiArCj4gKwkJ Zm9yIChpbnQgcGFzcyA9IDA7IHBhc3MgPCBjb3VudDsgcGFzcysrKSB7IC8qIGFwcHJveC4gY291 bnQhICovCj4gKwkJCWlndF9wZXJtdXRlX2FycmF5KGNpLCBjb3VudCwgaWd0X2V4Y2hhbmdlX2lu dDY0KTsKPiArCQkJc2V0X2xvYWRfYmFsYW5jZXIoaTkxNSwgY3R4LCBjaSwgY291bnQpOwo+ICsJ CQlmb3IgKHVuc2lnbmVkIGludCBuID0gMDsgbiA8IGNvdW50OyBuKyspCj4gKwkJCQljaGVja19p bmRpdmlkdWFsX2VuZ2luZShpOTE1LCBjdHgsIGNpLCBuKTsKPiArCQl9Cj4gKwo+ICsJCWZyZWUo Y2kpOwo+ICsJfQo+ICsKPiArCWdlbV9jb250ZXh0X2Rlc3Ryb3koaTkxNSwgY3R4KTsKPiArfQo+ ICsKPiArc3RhdGljIGludCBhZGRfcG11KGludCBwbXUsIGNvbnN0IHN0cnVjdCBjbGFzc19pbnN0 YW5jZSAqY2kpCj4gK3sKPiArCXJldHVybiBwZXJmX2k5MTVfb3Blbl9ncm91cChJOTE1X1BNVV9F TkdJTkVfQlVTWShjaS0+Y2xhc3MsCj4gKwkJCQkJCQkgY2ktPmluc3RhbmNlKSwKPiArCQkJCSAg ICBwbXUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdWludDMyX3QgX19iYXRjaF9jcmVhdGUoaW50IGk5 MTUsIHVpbnQzMl90IG9mZnNldCkKPiArewo+ICsJY29uc3QgdWludDMyX3QgYmJlID0gTUlfQkFU Q0hfQlVGRkVSX0VORDsKPiArCXVpbnQzMl90IGhhbmRsZTsKPiArCj4gKwloYW5kbGUgPSBnZW1f Y3JlYXRlKGk5MTUsIEFMSUdOKG9mZnNldCArIDQsIDQwOTYpKTsKPiArCWdlbV93cml0ZShpOTE1 LCBoYW5kbGUsIG9mZnNldCwgJmJiZSwgc2l6ZW9mKGJiZSkpOwo+ICsKPiArCXJldHVybiBoYW5k bGU7Cj4gK30KPiArCj4gK3N0YXRpYyB1aW50MzJfdCBiYXRjaF9jcmVhdGUoaW50IGk5MTUpCj4g K3sKPiArCXJldHVybiBfX2JhdGNoX2NyZWF0ZShpOTE1LCAwKTsKPiArfQo+ICsKPiArc3RhdGlj IHZvaWQgZnVsbChpbnQgaTkxNSwgdW5zaWduZWQgaW50IGZsYWdzKQo+ICsjZGVmaW5lIFBVTFNF IDB4MQo+ICsjZGVmaW5lIExBVEUgMHgyCj4gK3sKPiArCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhl Y19vYmplY3QyIGJhdGNoID0gewo+ICsJCS5oYW5kbGUgPSBiYXRjaF9jcmVhdGUoaTkxNSksCj4g Kwl9Owo+ICsKPiArCWlmIChmbGFncyAmIExBVEUpCj4gKwkJaWd0X3JlcXVpcmVfc3dfc3luYygp Owo+ICsKPiArCS8qCj4gKwkgKiBJOTE1X0NPTlRFWFRfUEFSQU1fRU5HSU5FIGNoYW5nZXMgdGhl IG1lYW5pbmcgb2YgSTkxNV9FWEVDX0RFRkFVTFQKPiArCSAqIHRvIHByb3ZpZGUgYW4gYXV0b21h dGljIHNlbGVjdGlvbiBmcm9tIHRoZSBjdHgtPmVuZ2luZVtdLiBJdAo+ICsJICogZW1wbG95cyBs b2FkLWJhbGFuY2luZyB0byBldmVubHkgZGlzdHJpYnV0ZSB0aGUgd29ya2xvYWQgdGhlCj4gKwkg KiBhcnJheS4gSWYgd2Ugc3VibWl0IE4gc3Bpbm5lcnMsIHdlIGV4cGVjdCB0aGVtIHRvIGJlIHNp bXVsdGFuZW91c2x5Cj4gKwkgKiBydW5uaW5nIGFjcm9zcyBOIGVuZ2luZXMgYW5kIHVzZSBQTVUg dG8gY29uZmlybSB0aGF0IHRoZSBlbnRpcmUKPiArCSAqIHNldCBvZiBlbmdpbmVzIGFyZSBidXN5 Lgo+ICsJICoKPiArCSAqIFdlIGNvbXBsaWNhdGUgbWF0dGVycyBieSBpbnRlcnBlcnNpbmcgc2hv cnRsaXZlZCB0YXNrcyB0byBjaGFsbGVuZ2UKPiArCSAqIHRoZSBrZXJuZWwgdG8gc2VhcmNoIGZv ciBzcGFjZSBpbiB3aGljaCB0byBpbnNlcnQgbmV3IGJhdGNoZXMuCj4gKwkgKi8KPiArCj4gKwo+ ICsJZm9yIChpbnQgbWFzayA9IDA7IG1hc2sgPCAzMjsgbWFzaysrKSB7Cj4gKwkJc3RydWN0IGNs YXNzX2luc3RhbmNlICpjaTsKPiArCQlpZ3Rfc3Bpbl90ICpzcGluID0gTlVMTDsKPiArCQl1bnNp Z25lZCBpbnQgY291bnQ7Cj4gKwkJSUdUX0NPUktfRkVOQ0UoY29yayk7Cj4gKwkJZG91YmxlIGxv YWQ7Cj4gKwkJaW50IGZlbmNlID0gLTE7Cj4gKwkJaW50ICpwbXU7Cj4gKwo+ICsJCWNpID0gbGlz dF9lbmdpbmVzKGk5MTUsIDF1IDw8IG1hc2ssICZjb3VudCk7Cj4gKwkJaWYgKCFjaSkKPiArCQkJ Y29udGludWU7Cj4gKwo+ICsJCWlndF9kZWJ1ZygiRm91bmQgJWQgZW5naW5lcyBvZiBjbGFzcyAl ZFxuIiwgY291bnQsIG1hc2spOwo+ICsKPiArCQlwbXUgPSBtYWxsb2Moc2l6ZW9mKCpwbXUpICog Y291bnQpOwo+ICsJCWlndF9hc3NlcnQocG11KTsKPiArCj4gKwkJaWYgKGZsYWdzICYgTEFURSkK PiArCQkJZmVuY2UgPSBpZ3RfY29ya19wbHVnKCZjb3JrLCBpOTE1KTsKPiArCj4gKwkJcG11WzBd ID0gLTE7Cj4gKwkJZm9yICh1bnNpZ25lZCBpbnQgbiA9IDA7IG4gPCBjb3VudDsgbisrKSB7Cj4g KwkJCXVpbnQzMl90IGN0eDsKPiArCj4gKwkJCXBtdVtuXSA9IGFkZF9wbXUocG11WzBdLCAmY2lb bl0pOwo+ICsKPiArCQkJaWYgKGZsYWdzICYgUFVMU0UpIHsKPiArCQkJCXN0cnVjdCBkcm1faTkx NV9nZW1fZXhlY2J1ZmZlcjIgZWIgPSB7Cj4gKwkJCQkJLmJ1ZmZlcnNfcHRyID0gdG9fdXNlcl9w b2ludGVyKCZiYXRjaCksCj4gKwkJCQkJLmJ1ZmZlcl9jb3VudCA9IDEsCj4gKwkJCQkJLnJzdmQy ID0gZmVuY2UsCj4gKwkJCQkJLmZsYWdzID0gZmxhZ3MgJiBMQVRFID8gSTkxNV9FWEVDX0ZFTkNF X0lOIDogMCwKPiArCQkJCX07Cj4gKwo+ICsJCQkJZ2VtX2V4ZWNidWYoaTkxNSwgJmViKTsKPiAr CQkJfQo+ICsKPiArCQkJLyoKPiArCQkJICogRWFjaCBzcGlubmVyIG5lZWRzIHRvIGJlIG9uZSBh IG5ldyB0aW1lbGluZSwKPiArCQkJICogb3RoZXJ3aXNlIHRoZXkgd2lsbCBqdXN0IHNpdCBpbiB0 aGUgc2luZ2xlIHF1ZXVlCj4gKwkJCSAqIGFuZCBub3QgcnVuIGNvbmN1cnJlbnRseS4KPiArCQkJ ICovCj4gKwkJCWN0eCA9IGxvYWRfYmFsYW5jZXJfY3JlYXRlKGk5MTUsIGNpLCBjb3VudCk7Cj4g Kwo+ICsJCQlpZiAoc3BpbiA9PSBOVUxMKSB7Cj4gKwkJCQlzcGluID0gX19pZ3Rfc3Bpbl9iYXRj aF9uZXcoaTkxNSwgY3R4LCAwLCAwKTsKPiArCQkJfSBlbHNlIHsKPiArCQkJCXN0cnVjdCBkcm1f aTkxNV9nZW1fZXhlY19vYmplY3QyIG9iaiA9IHsKPiArCQkJCQkuaGFuZGxlID0gc3Bpbi0+aGFu ZGxlLAo+ICsJCQkJfTsKPiArCQkJCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlcjIgZWIg PSB7Cj4gKwkJCQkJLmJ1ZmZlcnNfcHRyID0gdG9fdXNlcl9wb2ludGVyKCZvYmopLAo+ICsJCQkJ CS5idWZmZXJfY291bnQgPSAxLAo+ICsJCQkJCS5yc3ZkMSA9IGN0eCwKPiArCQkJCQkucnN2ZDIg PSBmZW5jZSwKPiArCQkJCQkuZmxhZ3MgPSBmbGFncyAmIExBVEUgPyBJOTE1X0VYRUNfRkVOQ0Vf SU4gOiAwLAo+ICsJCQkJfTsKPiArCj4gKwkJCQlnZW1fZXhlY2J1ZihpOTE1LCAmZWIpOwo+ICsJ CQl9Cj4gKwo+ICsJCQlnZW1fY29udGV4dF9kZXN0cm95KGk5MTUsIGN0eCk7Cj4gKwkJfQo+ICsK PiArCQlpZiAoZmxhZ3MgJiBMQVRFKSB7Cj4gKwkJCWlndF9jb3JrX3VucGx1ZygmY29yayk7Cj4g KwkJCWNsb3NlKGZlbmNlKTsKPiArCQl9Cj4gKwo+ICsJCWxvYWQgPSBtZWFzdXJlX21pbl9sb2Fk KHBtdVswXSwgY291bnQsIDEwMDAwKTsKPiArCQlpZ3Rfc3Bpbl9iYXRjaF9mcmVlKGk5MTUsIHNw aW4pOwo+ICsKPiArCQljbG9zZShwbXVbMF0pOwo+ICsJCWZyZWUocG11KTsKPiArCj4gKwkJZnJl ZShjaSk7Cj4gKwo+ICsJCWlndF9hc3NlcnRfZihsb2FkID4gMC45MCwKPiArCQkJICAgICAibWlu aW11bSBsb2FkIGZvciAlZCB4IGNsYXNzOiVkIHdhcyBmb3VuZCB0byBiZSBvbmx5ICUuMWYlJSBi dXN5XG4iLAo+ICsJCQkgICAgIGNvdW50LCBtYXNrLCBsb2FkKjEwMCk7Cj4gKwl9Cj4gKwo+ICsJ Z2VtX2Nsb3NlKGk5MTUsIGJhdGNoLmhhbmRsZSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHBp bmcoaW50IGk5MTUsIHVpbnQzMl90IGN0eCwgdW5zaWduZWQgaW50IGVuZ2luZSkKPiArewo+ICsJ c3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgb2JqID0gewo+ICsJCS5oYW5kbGUgPSBi YXRjaF9jcmVhdGUoaTkxNSksCj4gKwl9Owo+ICsJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVm ZmVyMiBleGVjYnVmID0gewo+ICsJCS5idWZmZXJzX3B0ciA9IHRvX3VzZXJfcG9pbnRlcigmb2Jq KSwKPiArCQkuYnVmZmVyX2NvdW50ID0gMSwKPiArCQkuZmxhZ3MgPSBlbmdpbmUsCj4gKwkJLnJz dmQxID0gY3R4LAo+ICsJfTsKPiArCWdlbV9leGVjYnVmKGk5MTUsICZleGVjYnVmKTsKPiArCWdl bV9zeW5jKGk5MTUsIG9iai5oYW5kbGUpOwo+ICsJZ2VtX2Nsb3NlKGk5MTUsIG9iai5oYW5kbGUp Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBzZW1hcGhvcmUoaW50IGk5MTUpCj4gK3sKPiArCXVp bnQzMl90IGJsb2NrWzJdLCBzY3JhdGNoOwo+ICsJaWd0X3NwaW5fdCAqc3BpblszXTsKPiArCj4g KwkvKgo+ICsJICogSWYgd2UgYXJlIHVzaW5nIEhXIHNlbWFwaG9yZXMgdG8gbGF1bmNoIHNlcmlh bGlzZWQgcmVxdWVzdHMKPiArCSAqIG9uIGRpZmZlcmVudCBlbmdpbmUgY29uY3VycmVudGx5LCB3 ZSB3YW50IHRvIHZlcmlmeSB0aGF0IHJlYWwKPiArCSAqIHdvcmsgaXMgdW5pbXBlZGVkLgo+ICsJ ICovCj4gKwlpZ3RfcmVxdWlyZShnZW1fc2NoZWR1bGVyX2hhc19wcmVlbXB0aW9uKGk5MTUpKTsK PiArCj4gKwlibG9ja1swXSA9IGdlbV9jb250ZXh0X2NyZWF0ZShpOTE1KTsKPiArCWJsb2NrWzFd ID0gZ2VtX2NvbnRleHRfY3JlYXRlKGk5MTUpOwo+ICsKPiArCXNjcmF0Y2ggPSBnZW1fY3JlYXRl KGk5MTUsIDQwOTYpOwo+ICsJc3BpblsyXSA9IGlndF9zcGluX2JhdGNoX25ldyhpOTE1LCAuZGVw ZW5kZW5jeSA9IHNjcmF0Y2gpOwo+ICsJZm9yIChpbnQgbWFzayA9IDE7IG1hc2sgPCAzMjsgbWFz aysrKSB7Cj4gKwkJc3RydWN0IGNsYXNzX2luc3RhbmNlICpjaTsKPiArCQl1bnNpZ25lZCBpbnQg Y291bnQ7Cj4gKwkJdWludDMyX3QgdmlwOwo+ICsKPiArCQljaSA9IGxpc3RfZW5naW5lcyhpOTE1 LCAxdSA8PCBtYXNrLCAmY291bnQpOwo+ICsJCWlmICghY2kpCj4gKwkJCWNvbnRpbnVlOwo+ICsK PiArCQlpZiAoY291bnQgPCBBUlJBWV9TSVpFKGJsb2NrKSkKPiArCQkJY29udGludWU7Cj4gKwo+ ICsJCS8qIEVuc3VyZSB0aGF0IHdlIGNvbXBsZXRlbHkgb2NjdXB5IGFsbCBlbmdpbmVzIGluIHRo aXMgZ3JvdXAgKi8KPiArCQljb3VudCA9IEFSUkFZX1NJWkUoYmxvY2spOwo+ICsKPiArCQlmb3Ig KGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKPiArCQkJc2V0X2xvYWRfYmFsYW5jZXIoaTkx NSwgYmxvY2tbaV0sIGNpLCBjb3VudCk7Cj4gKwkJCXNwaW5baV0gPSBfX2lndF9zcGluX2JhdGNo X25ldyhpOTE1LAo+ICsJCQkJCQkgICAgICAgLmN0eCA9IGJsb2NrW2ldLAo+ICsJCQkJCQkgICAg ICAgLmRlcGVuZGVuY3kgPSBzY3JhdGNoKTsKPiArCQl9Cj4gKwo+ICsJCS8qCj4gKwkJICogRWl0 aGVyIHdlIGhhdmVuJ3QgYmxvY2tlZCBib3RoIGVuZ2luZXMgd2l0aCBzZW1hcGhvcmVzLAo+ICsJ CSAqIG9yIHdlIGxldCB0aGUgdmlwIHRocm91Z2guIElmIG5vdCwgd2UgaGFuZy4KPiArCQkgKi8K PiArCQl2aXAgPSBnZW1fY29udGV4dF9jcmVhdGUoaTkxNSk7Cj4gKwkJc2V0X2xvYWRfYmFsYW5j ZXIoaTkxNSwgdmlwLCBjaSwgY291bnQpOwo+ICsJCXBpbmcoaTkxNSwgdmlwLCAwKTsKPiArCQln ZW1fY29udGV4dF9kZXN0cm95KGk5MTUsIHZpcCk7Cj4gKwo+ICsJCWZvciAoaW50IGkgPSAwOyBp IDwgY291bnQ7IGkrKykKPiArCQkJaWd0X3NwaW5fYmF0Y2hfZnJlZShpOTE1LCBzcGluW2ldKTsK PiArCj4gKwkJZnJlZShjaSk7Cj4gKwl9Cj4gKwlpZ3Rfc3Bpbl9iYXRjaF9mcmVlKGk5MTUsIHNw aW5bMl0pOwo+ICsJZ2VtX2Nsb3NlKGk5MTUsIHNjcmF0Y2gpOwo+ICsKPiArCWdlbV9jb250ZXh0 X2Rlc3Ryb3koaTkxNSwgYmxvY2tbMV0pOwo+ICsJZ2VtX2NvbnRleHRfZGVzdHJveShpOTE1LCBi bG9ja1swXSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHNtb2tldGVzdChpbnQgaTkxNSwgaW50 IHRpbWVvdXQpCj4gK3sKPiArCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyIGJhdGNo WzJdID0gewo+ICsJCXsgLmhhbmRsZSA9IF9fYmF0Y2hfY3JlYXRlKGk5MTUsIDE2MzgwKSB9Cj4g Kwl9Owo+ICsJdW5zaWduZWQgaW50IG5jb250ZXh0ID0gMDsKPiArCXVpbnQzMl90ICpjb250ZXh0 cyA9IE5VTEw7Cj4gKwl1aW50MzJfdCAqaGFuZGxlcyA9IE5VTEw7Cj4gKwo+ICsJaWd0X3JlcXVp cmVfc3dfc3luYygpOwo+ICsKPiArCWZvciAoaW50IG1hc2sgPSAwOyBtYXNrIDwgMzI7IG1hc2sr Kykgewo+ICsJCXN0cnVjdCBjbGFzc19pbnN0YW5jZSAqY2k7Cj4gKwkJdW5zaWduZWQgaW50IGNv dW50ID0gMDsKPiArCj4gKwkJY2kgPSBsaXN0X2VuZ2luZXMoaTkxNSwgMXUgPDwgbWFzaywgJmNv dW50KTsKPiArCQlpZiAoIWNpIHx8IGNvdW50IDwgMikgewo+ICsJCQlmcmVlKGNpKTsKPiArCQkJ Y29udGludWU7Cj4gKwkJfQo+ICsKPiArCQlpZ3RfZGVidWcoIkZvdW5kICVkIGVuZ2luZXMgb2Yg Y2xhc3MgJWRcbiIsIGNvdW50LCBtYXNrKTsKPiArCj4gKwkJbmNvbnRleHQgKz0gMTI4Owo+ICsJ CWNvbnRleHRzID0gcmVhbGxvYyhjb250ZXh0cywgc2l6ZW9mKCpjb250ZXh0cykgKiBuY29udGV4 dCk7Cj4gKwkJaWd0X2Fzc2VydChjb250ZXh0cyk7Cj4gKwo+ICsJCWZvciAodW5zaWduZWQgaW50 IG4gPSBuY29udGV4dCAtIDEyODsgbiA8IG5jb250ZXh0OyBuKyspIHsKPiArCQkJY29udGV4dHNb bl0gPSBsb2FkX2JhbGFuY2VyX2NyZWF0ZShpOTE1LCBjaSwgY291bnQpOwo+ICsJCQlpZ3RfYXNz ZXJ0KGNvbnRleHRzW25dKTsKPiArCQl9Cj4gKwo+ICsJCWZyZWUoY2kpOwo+ICsJfQo+ICsJaWd0 X2RlYnVnKCJDcmVhdGVkICVkIHZpcnR1YWwgZW5naW5lcyAob25lIHBlciBjb250ZXh0KVxuIiwg bmNvbnRleHQpOwo+ICsJaWd0X3JlcXVpcmUobmNvbnRleHQpOwo+ICsKPiArCWNvbnRleHRzID0g cmVhbGxvYyhjb250ZXh0cywgc2l6ZW9mKCpjb250ZXh0cykgKiBuY29udGV4dCAqIDQpOwo+ICsJ aWd0X2Fzc2VydChjb250ZXh0cyk7Cj4gKwltZW1jcHkoY29udGV4dHMgKyBuY29udGV4dCwgY29u dGV4dHMsIG5jb250ZXh0ICogc2l6ZW9mKCpjb250ZXh0cykpOwo+ICsJbmNvbnRleHQgKj0gMjsK PiArCW1lbWNweShjb250ZXh0cyArIG5jb250ZXh0LCBjb250ZXh0cywgbmNvbnRleHQgKiBzaXpl b2YoKmNvbnRleHRzKSk7Cj4gKwluY29udGV4dCAqPSAyOwo+ICsKPiArCWhhbmRsZXMgPSBtYWxs b2Moc2l6ZW9mKCpoYW5kbGVzKSAqIG5jb250ZXh0KTsKPiArCWlndF9hc3NlcnQoaGFuZGxlcyk7 Cj4gKwlmb3IgKHVuc2lnbmVkIGludCBuID0gMDsgbiA8IG5jb250ZXh0OyBuKyspCj4gKwkJaGFu ZGxlc1tuXSA9IGdlbV9jcmVhdGUoaTkxNSwgNDA5Nik7Cj4gKwo+ICsJaWd0X3VudGlsX3RpbWVv dXQodGltZW91dCkgewo+ICsJCXVuc2lnbmVkIGludCBjb3VudCA9IDEgKyAocmFuZCgpICUgKG5j b250ZXh0IC0gMSkpOwo+ICsJCUlHVF9DT1JLX0ZFTkNFKGNvcmspOwo+ICsJCWludCBmZW5jZSA9 IGlndF9jb3JrX3BsdWcoJmNvcmssIGk5MTUpOwo+ICsKPiArCQlmb3IgKHVuc2lnbmVkIGludCBu ID0gMDsgbiA8IGNvdW50OyBuKyspIHsKPiArCQkJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVm ZmVyMiBlYiA9IHsKPiArCQkJCS5idWZmZXJzX3B0ciA9IHRvX3VzZXJfcG9pbnRlcihiYXRjaCks Cj4gKwkJCQkuYnVmZmVyX2NvdW50ID0gQVJSQVlfU0laRShiYXRjaCksCj4gKwkJCQkucnN2ZDEg PSBjb250ZXh0c1tuXSwKPiArCQkJCS5yc3ZkMiA9IGZlbmNlLAo+ICsJCQkJLmZsYWdzID0gSTkx NV9FWEVDX0JBVENIX0ZJUlNUIHwgSTkxNV9FWEVDX0ZFTkNFX0lOLAo+ICsJCQl9Owo+ICsJCQli YXRjaFsxXS5oYW5kbGUgPSBoYW5kbGVzW25dOwo+ICsJCQlnZW1fZXhlY2J1ZihpOTE1LCAmZWIp Owo+ICsJCX0KPiArCQlpZ3RfcGVybXV0ZV9hcnJheShoYW5kbGVzLCBjb3VudCwgaWd0X2V4Y2hh bmdlX2ludCk7Cj4gKwo+ICsJCWlndF9jb3JrX3VucGx1ZygmY29yayk7Cj4gKwkJZm9yICh1bnNp Z25lZCBpbnQgbiA9IDA7IG4gPCBjb3VudDsgbisrKQo+ICsJCQlnZW1fc3luYyhpOTE1LCBoYW5k bGVzW25dKTsKPiArCj4gKwkJY2xvc2UoZmVuY2UpOwo+ICsJfQo+ICsKPiArCWZvciAodW5zaWdu ZWQgaW50IG4gPSAwOyBuIDwgbmNvbnRleHQ7IG4rKykgewo+ICsJCWdlbV9jbG9zZShpOTE1LCBo YW5kbGVzW25dKTsKPiArCQlfX2dlbV9jb250ZXh0X2Rlc3Ryb3koaTkxNSwgY29udGV4dHNbbl0p Owo+ICsJfQo+ICsJZnJlZShoYW5kbGVzKTsKPiArCWZyZWUoY29udGV4dHMpOwo+ICsJZ2VtX2Ns b3NlKGk5MTUsIGJhdGNoWzBdLmhhbmRsZSk7Cj4gK30KPiArCj4gK3N0YXRpYyBib29sIGhhc19j b250ZXh0X2VuZ2luZXMoaW50IGk5MTUpCj4gK3sKPiArCXN0cnVjdCBkcm1faTkxNV9nZW1fY29u dGV4dF9wYXJhbSBwID0gewo+ICsJCS5wYXJhbSA9IEk5MTVfQ09OVEVYVF9QQVJBTV9FTkdJTkVT LAo+ICsJfTsKPiArCj4gKwlyZXR1cm4gX19nZW1fY29udGV4dF9zZXRfcGFyYW0oaTkxNSwgJnAp ID09IDA7Cj4gK30KPiArCj4gK3N0YXRpYyBib29sIGhhc19sb2FkX2JhbGFuY2VyKGludCBpOTE1 KQo+ICt7Cj4gKwlzdHJ1Y3QgY2xhc3NfaW5zdGFuY2UgY2kgPSB7fTsKPiArCXVpbnQzMl90IGN0 eDsKPiArCWludCBlcnI7Cj4gKwo+ICsJY3R4ID0gZ2VtX2NvbnRleHRfY3JlYXRlKGk5MTUpOwo+ ICsJZXJyID0gX19zZXRfbG9hZF9iYWxhbmNlcihpOTE1LCBjdHgsICZjaSwgMSk7Cj4gKwlnZW1f Y29udGV4dF9kZXN0cm95KGk5MTUsIGN0eCk7Cj4gKwo+ICsJcmV0dXJuIGVyciA9PSAwOwo+ICt9 Cj4gKwo+ICtpZ3RfbWFpbgo+ICt7Cj4gKwlpbnQgaTkxNSA9IC0xOwo+ICsKPiArCWlndF9za2lw X29uX3NpbXVsYXRpb24oKTsKPiArCj4gKwlpZ3RfZml4dHVyZSB7Cj4gKwkJaTkxNSA9IGRybV9v cGVuX2RyaXZlcihEUklWRVJfSU5URUwpOwo+ICsJCWlndF9yZXF1aXJlX2dlbShpOTE1KTsKPiAr Cj4gKwkJZ2VtX3JlcXVpcmVfY29udGV4dHMoaTkxNSk7Cj4gKwkJaWd0X3JlcXVpcmUoaGFzX2Nv bnRleHRfZW5naW5lcyhpOTE1KSk7Cj4gKwkJaWd0X3JlcXVpcmUoaGFzX2xvYWRfYmFsYW5jZXIo aTkxNSkpOwo+ICsKPiArCQlpZ3RfZm9ya19oYW5nX2RldGVjdG9yKGk5MTUpOwo+ICsJfQo+ICsK PiArCWlndF9zdWJ0ZXN0KCJpbmRpdmlkdWFsIikKPiArCQlpbmRpdmlkdWFsKGk5MTUpOwo+ICsK PiArCWlndF9zdWJ0ZXN0X2dyb3VwIHsKPiArCQlzdGF0aWMgY29uc3Qgc3RydWN0IHsKPiArCQkJ Y29uc3QgY2hhciAqbmFtZTsKPiArCQkJdW5zaWduZWQgaW50IGZsYWdzOwo+ICsJCX0gcGhhc2Vz W10gPSB7Cj4gKwkJCXsgIiIsIDAgfSwKPiArCQkJeyAiLXB1bHNlIiwgUFVMU0UgfSwKPiArCQkJ eyAiLWxhdGUiLCBMQVRFIH0sCj4gKwkJCXsgIi1sYXRlLXB1bHNlIiwgUFVMU0UgfCBMQVRFIH0s Cj4gKwkJCXsgfQo+ICsJCX07Cj4gKwkJZm9yICh0eXBlb2YoKnBoYXNlcykgKnAgPSBwaGFzZXM7 IHAtPm5hbWU7IHArKykKPiArCQkJaWd0X3N1YnRlc3RfZigiZnVsbCVzIiwgcC0+bmFtZSkKPiAr CQkJCWZ1bGwoaTkxNSwgcC0+ZmxhZ3MpOwo+ICsJfQo+ICsKPiArCWlndF9zdWJ0ZXN0KCJzZW1h cGhvcmUiKQo+ICsJCXNlbWFwaG9yZShpOTE1KTsKPiArCj4gKwlpZ3Rfc3VidGVzdCgic21va2Ui KQo+ICsJCXNtb2tldGVzdChpOTE1LCAyMCk7Cj4gKwo+ICsJaWd0X2ZpeHR1cmUgewo+ICsJCWln dF9zdG9wX2hhbmdfZGV0ZWN0b3IoKTsKPiArCX0KPiArfQo+IGRpZmYgLS1naXQgYS90ZXN0cy9t ZXNvbi5idWlsZCBiL3Rlc3RzL21lc29uLmJ1aWxkCj4gaW5kZXggMDUzOWMyMGM4Li5iZDJkYjgy NWUgMTAwNjQ0Cj4gLS0tIGEvdGVzdHMvbWVzb24uYnVpbGQKPiArKysgYi90ZXN0cy9tZXNvbi5i dWlsZAo+IEBAIC0yOTMsNiArMjkzLDEzIEBAIHRlc3RfZXhlY3V0YWJsZXMgKz0gZXhlY3V0YWJs ZSgnZ2VtX2VpbycsCj4gICAJICAgaW5zdGFsbCA6IHRydWUpCj4gICB0ZXN0X2xpc3QgKz0gJ2dl bV9laW8nCj4gICAKPiArdGVzdF9leGVjdXRhYmxlcyArPSBleGVjdXRhYmxlKCdnZW1fZXhlY19i YWxhbmNlcicsICdpOTE1L2dlbV9leGVjX2JhbGFuY2VyLmMnLAo+ICsJICAgZGVwZW5kZW5jaWVz IDogdGVzdF9kZXBzICsgWyBsaWJfaWd0X3BlcmYgXSwKPiArCSAgIGluc3RhbGxfZGlyIDogbGli ZXhlY2RpciwKPiArCSAgIGluc3RhbGxfcnBhdGggOiBsaWJleGVjZGlyX3JwYXRoZGlyLAo+ICsJ ICAgaW5zdGFsbCA6IHRydWUpCj4gK3Rlc3RfcHJvZ3MgKz0gJ2dlbV9leGVjX2JhbGFuY2VyJwo+ ICsKPiAgIHRlc3RfZXhlY3V0YWJsZXMgKz0gZXhlY3V0YWJsZSgnZ2VtX21vY3Nfc2V0dGluZ3Mn LAo+ICAgCSAgIGpvaW5fcGF0aHMoJ2k5MTUnLCAnZ2VtX21vY3Nfc2V0dGluZ3MuYycpLAo+ICAg CSAgIGRlcGVuZGVuY2llcyA6IHRlc3RfZGVwcyArIFsgbGliX2lndF9wZXJmIF0sCj4gCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWls aW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZy ZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeA==