From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 5B03BE9904A for ; Fri, 10 Apr 2026 07:41:31 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 8633410E8DB; Fri, 10 Apr 2026 07:41:30 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=ursulin.net header.i=@ursulin.net header.b="wc+YFK4p"; dkim-atps=neutral Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) by gabe.freedesktop.org (Postfix) with ESMTPS id B41E110E8DB for ; Fri, 10 Apr 2026 07:41:29 +0000 (UTC) Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-488a88aeec9so21985485e9.2 for ; Fri, 10 Apr 2026 00:41:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ursulin.net; s=google; t=1775806888; x=1776411688; darn=lists.freedesktop.org; h=content-transfer-encoding:in-reply-to:content-language:references :cc:to:from:subject:user-agent:mime-version:date:message-id:from:to :cc:subject:date:message-id:reply-to; bh=248RANovkmdGC28VU/d+C4c/8Za7ybBiRghbM7hHncc=; b=wc+YFK4pNnEHAjPio9bxWX2c9cm5T40HPlLjmwZKxYeDSIMNRfN9d/CGi988Wgc/K0 iFaWa5vbJ3WJ+g5nLqsQ/Wb895Qr9iQbwFtK/M/HAmJSfz2c0OEa5Tf+71oyiI48xjhB ERh0DZgjv4YJ690L0q8FhmSlNPtrM5qxQxNKA0O48gorul7NLO3IPABHy1f9KQApTKzd OGH0kx8rznJpUQ70FI993i5dloDsM5Ra2/d1N7R2bkvBwxhSdmI/gdVGW/bTofMVwaom UKg7xmelMtmKUpQ1fB7QPBqSIwr5M30thwvz5f8jZEjshaFF1HEp54MzwiU93/QIrtZb 8/zA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775806888; x=1776411688; h=content-transfer-encoding:in-reply-to:content-language:references :cc:to:from:subject:user-agent:mime-version:date:message-id:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=248RANovkmdGC28VU/d+C4c/8Za7ybBiRghbM7hHncc=; b=PinRNmSHXmiXlo+5UYxJaI49/F1OvZnrT8+NDqmG6jm74RjwK1hdCVtFrv8acu9lEW lX2sT3+9P2U6BDSurcWkZvd8+gdaXdxlzpkxDhQeKnCuMJQ8sRj4f0SRK2S1L/3GaSVX +UVmhUcgIeNyjWixXAyVF/9F+s+I9RKSHfRXrCjlCY1gp33v6BPFQxeIrUkZMPtsAayM QsSOF1Hq/2Vm4dpiAoxPIz6u3okYg3MyTiFSSGQntny8uEhTfv5S6nZEP9rBJbcIO4my oCVDWjJCIHCCm4ArRZ+jnIVCCVEvWn/gvV5nKlocvJNr5ZKBlAPXW3NRyeAeCVI539Xa v2oQ== X-Gm-Message-State: AOJu0YxMuY6WZgi6b6tNz68mEnrKlJGBPDMlTil/l/GBl5bQBDpj3wcZ UyNdW/pNsHmpfdnsWFobj+ksMtESC4tnaYnmMwrr4aDGNXt3vkYuUMpjf2Ch/vJFZ3Y= X-Gm-Gg: AeBDiesn+5BbI+j6+r15DJUt8pPd6/E7MvBbqiaCyZybRpguMrzw0qM31uRApHcLLs9 GSsyqKlMB5TmPppWQPlbgJFbT4wfpeypvsijukL1mzjaAjZPykR7wj3QXQ7fommwRLxSPBWAtXv rJxsqUN6byUIQzukG6oJNyMe3E9jgp1mBtKwfBu4ZX8YyIb70SkQcjuL5ihIjc97OaQon0JgYKK bEC1/BRe088w6XwX4jMzdJMJHUyTYXnlvxCe9Xk145Mt2oRIS7xUmuuCUC9TwT2JrTAFqduq6bZ jrZFFzKnElcfsUE4o/UiffTF4X/JxCGgioj4XpbGR0SpYA7N2otvviSMHQtpapA4v6sGljvwB2L EFQiZ1Oa3EvRBbLX98hkFCXmf+N5DXxXs1/Pq7jKYuD8kr5xl0+6Bq1c7ht+eVV5aHK3cGl5Tu0 wwqqmkrUKChHPeaP1de9HnAvJRIRI3s/AUHFUuZujkv3B+ X-Received: by 2002:a05:600c:a404:b0:488:bfc3:ef3 with SMTP id 5b1f17b1804b1-488d6671271mr22138275e9.0.1775806887812; Fri, 10 Apr 2026 00:41:27 -0700 (PDT) Received: from [192.168.0.101] ([90.240.106.137]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488d5d85ae9sm20694585e9.3.2026.04.10.00.41.26 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 10 Apr 2026 00:41:27 -0700 (PDT) Message-ID: Date: Fri, 10 Apr 2026 08:41:26 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2] drm/sched: Add test suite for concurrent job submissions From: Tvrtko Ursulin To: Marco Pagani , Matthew Brost , Danilo Krummrich , Philipp Stanner , =?UTF-8?Q?Christian_K=C3=B6nig?= , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org References: <20260408154947.85204-1-marco.pagani@linux.dev> <6a67c09d-d85e-45a9-90a4-125db30092d8@ursulin.net> Content-Language: en-GB In-Reply-To: <6a67c09d-d85e-45a9-90a4-125db30092d8@ursulin.net> Content-Type: text/plain; charset="utf-8"; format="flowed" Content-Transfer-Encoding: base64 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Ck9uIDA5LzA0LzIwMjYgMTY6MzUsIFR2cnRrbyBVcnN1bGluIHdyb3RlOgo+IAo+IE9uIDA4LzA0 LzIwMjYgMTY6NDksIE1hcmNvIFBhZ2FuaSB3cm90ZToKPj4gQWRkIGEgbmV3IHRlc3Qgc3VpdGUg dG8gc2ltdWxhdGUgY29uY3VycmVudCBqb2Igc3VibWlzc2lvbnMgdG8gdGhlIERSTQo+PiBzY2hl ZHVsZXIsIGFzIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3QgY292ZXJlZCBieSBjdXJyZW50IHRl c3Qgc3VpdGVzLgo+Pgo+PiBUaGUgbmV3IHRlc3Qgc3VpdGUgaW5jbHVkZXMgdHdvIGluaXRpYWwg dGVzdCBjYXNlczogKGkpIGEgdGVzdCBjYXNlIGZvcgo+PiBwYXJhbGxlbCBqb2Igc3VibWlzc2lv biBhbmQgKGlpKSBhIHRlc3QgY2FzZSBmb3IgaW50ZXJsZWF2ZWQgam9iCj4+IHN1Ym1pc3Npb24g YW5kIGNvbXBsZXRpb24uIEluIHRoZSBmaXJzdCB0ZXN0IGNhc2UsIHdvcmtlciB0aHJlYWRzCj4+ IGNvbmN1cnJlbnRseSBzdWJtaXQgam9icyB0byB0aGUgc2NoZWR1bGVyLCBhbmQgdGhlbiB0aGUg dGltZWxpbmUgaXMKPj4gbWFudWFsbHkgYWR2YW5jZWQgdG8gY29tcGxldGUgdGhlbSBpbiBidWxr LiBJbiB0aGUgc2Vjb25kIHRlc3QgY2FzZSwKPj4gd29ya2VyIHRocmVhZHMgY29uY3VycmVudGx5 IHN1Ym1pdCBzZXF1ZW5jZXMgb2Ygam9icyBvZiBkaWZmZXJlbnQKPj4gZHVyYXRpb25zIHRvIHRo ZSBtb2NrIHNjaGVkdWxlciB1c2luZyBhIHNsaWRpbmcgd2luZG93IHRvIGJldHRlciBtb2RlbAo+ PiByZWFsLXdvcmxkIHdvcmtsb2Fkcy4gVGhlIHRpbWVsaW5lIGlzIGFkdmFuY2VkIGF1dG9tYXRp Y2FsbHkgYnkgdGhlCj4+IGZpbmlzaGluZyBqb2JzLCBpbnRlcmxlYXZpbmcgc3VibWlzc2lvbiB3 aXRoIGNvbXBsZXRpb24uCj4+Cj4+IFNpZ25lZC1vZmYtYnk6IE1hcmNvIFBhZ2FuaSA8bWFyY28u cGFnYW5pQGxpbnV4LmRldj4KPj4gLS0tCj4+IENoYW5nZXMgaW4gdjI6Cj4+IC0gSW1wcm92ZWQg dGVzdCBkZXNjcmlwdGlvbgo+PiAtIFVzZSBtdWx0aXBsZSBqb2IgZHVyYXRpb25zIGluc3RlYWQg b2YgaGFybW9uaWMgcGVyaW9kcy9kdXJhdGlvbnMKPj4gLSBJbXByb3ZlZCBzdWJtaXNzaW9uIGZv ciBpbnRlcmxlYXZlZCB0ZXN0IHdpdGggYSBzbGlkaW5nIHdpbmRvdwo+PiAtIFJlbW92ZWQgdW5u ZWNlc3NhcnkgYXNzZXJ0cyBwZXIgVHZydGtvJ3MgZmVlZGJhY2ssIGJ1dCBrZXB0IAo+PiB3YWl0 X3NjaGVkdWxlZAo+PiAtIENoYW5nZWQgcGFyYW1ldGVyIG5hbWVzIGZyb20gcGVyaW9kIHRvIGR1 cmF0aW9uIGZvciBjbGFyaXR5Cj4+IC0gVXNlZCB0ZW1wIHZhcmlhYmxlcyB0byByZWR1Y2UgbGlu ZSBicmVha3MKPj4gLS0tCj4+IMKgIGRyaXZlcnMvZ3B1L2RybS9zY2hlZHVsZXIvdGVzdHMvdGVz dHNfYmFzaWMuYyB8IDM1NiArKysrKysrKysrKysrKysrKysKPj4gwqAgMSBmaWxlIGNoYW5nZWQs IDM1NiBpbnNlcnRpb25zKCspCj4+Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vc2No ZWR1bGVyL3Rlc3RzL3Rlc3RzX2Jhc2ljLmMgYi9kcml2ZXJzLyAKPj4gZ3B1L2RybS9zY2hlZHVs ZXIvdGVzdHMvdGVzdHNfYmFzaWMuYwo+PiBpbmRleCBhNWE1YTM1YTg3YjAuLjE3OTFiMTU3Y2Zj OCAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3NjaGVkdWxlci90ZXN0cy90ZXN0c19i YXNpYy5jCj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9zY2hlZHVsZXIvdGVzdHMvdGVzdHNfYmFz aWMuYwo+PiBAQCAtMSw3ICsxLDExIEBACj4+IMKgIC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBHUEwtMi4wCj4+IMKgIC8qIENvcHlyaWdodCAoYykgMjAyNSBWYWx2ZSBDb3Jwb3JhdGlvbiAq Lwo+PiArI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KPj4gwqAgI2luY2x1ZGUgPGxpbnV4 L2RlbGF5Lmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvbWlubWF4Lmg+Cj4+ICsjaW5jbHVkZSA8bGlu dXgvdGltZS5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgo+PiDCoCAjaW5jbHVk ZSAic2NoZWRfdGVzdHMuaCIKPj4gQEAgLTIzNSw2ICsyMzksMzU3IEBAIHN0YXRpYyB2b2lkIGRy bV9zY2hlZF9iYXNpY19jYW5jZWwoc3RydWN0IGt1bml0IAo+PiAqdGVzdCkKPj4gwqDCoMKgwqDC oCBLVU5JVF9BU1NFUlRfRVEodGVzdCwgam9iLT5od19mZW5jZS5lcnJvciwgLUVDQU5DRUxFRCk7 Cj4+IMKgIH0KPj4gK3N0cnVjdCBzY2hlZF9jb25jdXJyZW50X2NvbnRleHQgewo+PiArwqDCoMKg IHN0cnVjdCBkcm1fbW9ja19zY2hlZHVsZXIgKnNjaGVkOwo+PiArwqDCoMKgIHN0cnVjdCB3b3Jr cXVldWVfc3RydWN0ICpzdWJfd3E7Cj4+ICvCoMKgwqAgc3RydWN0IGt1bml0ICp0ZXN0Owo+PiAr wqDCoMKgIHN0cnVjdCBjb21wbGV0aW9uIHdhaXRfZ287Cj4+ICt9Owo+PiArCj4+ICtLVU5JVF9E RUZJTkVfQUNUSU9OX1dSQVBQRVIoZHJtX21vY2tfc2NoZWRfZmluaV93cmFwLCAKPj4gZHJtX21v Y2tfc2NoZWRfZmluaSwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3Qg ZHJtX21vY2tfc2NoZWR1bGVyICopOwo+PiArCj4+ICtLVU5JVF9ERUZJTkVfQUNUSU9OX1dSQVBQ RVIoZHJtX21vY2tfc2NoZWRfZW50aXR5X2ZyZWVfd3JhcCwgCj4+IGRybV9tb2NrX3NjaGVkX2Vu dGl0eV9mcmVlLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBkcm1f bW9ja19zY2hlZF9lbnRpdHkgKik7Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIGNvbXBsZXRlX2Rlc3Ry b3lfd29ya3F1ZXVlKHZvaWQgKmNvbnRleHQpCj4+ICt7Cj4+ICvCoMKgwqAgc3RydWN0IHNjaGVk X2NvbmN1cnJlbnRfY29udGV4dCAqY3R4ID0gY29udGV4dDsKPj4gKwo+PiArwqDCoMKgIGNvbXBs ZXRlX2FsbCgmY3R4LT53YWl0X2dvKTsKPj4gKwo+PiArwqDCoMKgIGRlc3Ryb3lfd29ya3F1ZXVl KGN0eC0+c3ViX3dxKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBkcm1fc2NoZWRfY29uY3Vy cmVudF9pbml0KHN0cnVjdCBrdW5pdCAqdGVzdCkKPj4gK3sKPj4gK8KgwqDCoCBzdHJ1Y3Qgc2No ZWRfY29uY3VycmVudF9jb250ZXh0ICpjdHg7Cj4+ICvCoMKgwqAgaW50IHJldDsKPj4gKwo+PiAr wqDCoMKgIGN0eCA9IGt1bml0X2t6YWxsb2ModGVzdCwgc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVM KTsKPj4gK8KgwqDCoCBLVU5JVF9BU1NFUlRfTk9UX05VTEwodGVzdCwgY3R4KTsKPj4gKwo+PiAr wqDCoMKgIGluaXRfY29tcGxldGlvbigmY3R4LT53YWl0X2dvKTsKPj4gKwo+PiArwqDCoMKgIGN0 eC0+c2NoZWQgPSBkcm1fbW9ja19zY2hlZF9uZXcodGVzdCwgTUFYX1NDSEVEVUxFX1RJTUVPVVQp Owo+PiArCj4+ICvCoMKgwqAgcmV0ID0ga3VuaXRfYWRkX2FjdGlvbl9vcl9yZXNldCh0ZXN0LCBk cm1fbW9ja19zY2hlZF9maW5pX3dyYXAsIAo+PiBjdHgtPnNjaGVkKTsKPj4gK8KgwqDCoCBLVU5J VF9BU1NFUlRfRVEodGVzdCwgcmV0LCAwKTsKPj4gKwo+PiArwqDCoMKgIC8qIFVzZSBhbiB1bmJv dW5kZWQgd29ya3F1ZXVlIHRvIG1heGltaXplIGpvYiBzdWJtaXNzaW9uIAo+PiBjb25jdXJyZW5j eSAqLwo+PiArwqDCoMKgIGN0eC0+c3ViX3dxID0gYWxsb2Nfd29ya3F1ZXVlKCJkcm0tc2NoZWQt c3VibWl0dGVycy13cSIsIFdRX1VOQk9VTkQsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgV1FfVU5CT1VORF9NQVhfQUNUSVZFKTsKPj4gK8KgwqDCoCBLVU5J VF9BU1NFUlRfTk9UX05VTEwodGVzdCwgY3R4LT5zdWJfd3EpOwo+PiArCj4+ICvCoMKgwqAgcmV0 ID0ga3VuaXRfYWRkX2FjdGlvbl9vcl9yZXNldCh0ZXN0LCBjb21wbGV0ZV9kZXN0cm95X3dvcmtx dWV1ZSwgCj4+IGN0eCk7Cj4+ICvCoMKgwqAgS1VOSVRfQVNTRVJUX0VRKHRlc3QsIHJldCwgMCk7 Cj4+ICsKPj4gK8KgwqDCoCBjdHgtPnRlc3QgPSB0ZXN0Owo+PiArwqDCoMKgIHRlc3QtPnByaXYg PSBjdHg7Cj4+ICsKPj4gK8KgwqDCoCByZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RydWN0IGRy bV9zY2hlZF9wYXJhbGxlbF9wYXJhbXMgewo+PiArwqDCoMKgIGNvbnN0IGNoYXIgKmRlc2NyaXB0 aW9uOwo+PiArwqDCoMKgIHVuc2lnbmVkIGludCBudW1fam9iczsKPj4gK8KgwqDCoCB1bnNpZ25l ZCBpbnQgbnVtX3dvcmtlcnM7Cj4+ICt9Owo+PiArCj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGRy bV9zY2hlZF9wYXJhbGxlbF9wYXJhbXMgCj4+IGRybV9zY2hlZF9wYXJhbGxlbF9jYXNlc1tdID0g ewo+PiArwqDCoMKgIHsKPj4gK8KgwqDCoMKgwqDCoMKgIC5kZXNjcmlwdGlvbiA9ICJQYXJhbGxl bCBzdWJtaXNzaW9uIG9mIG11bHRpcGxlIGpvYnMgcGVyIAo+PiB3b3JrZXIiLAo+PiArwqDCoMKg wqDCoMKgwqAgLm51bV9qb2JzID0gOCwKPj4gK8KgwqDCoMKgwqDCoMKgIC5udW1fd29ya2VycyA9 IDE2LAo+PiArwqDCoMKgIH0sCj4+ICt9Owo+PiArCj4+ICtzdGF0aWMgdm9pZAo+PiArZHJtX3Nj aGVkX3BhcmFsbGVsX2Rlc2MoY29uc3Qgc3RydWN0IGRybV9zY2hlZF9wYXJhbGxlbF9wYXJhbXMg Cj4+ICpwYXJhbXMsIGNoYXIgKmRlc2MpCj4+ICt7Cj4+ICvCoMKgwqAgc3Ryc2NweShkZXNjLCBw YXJhbXMtPmRlc2NyaXB0aW9uLCBLVU5JVF9QQVJBTV9ERVNDX1NJWkUpOwo+PiArfQo+PiArCj4+ ICtLVU5JVF9BUlJBWV9QQVJBTShkcm1fc2NoZWRfcGFyYWxsZWwsIGRybV9zY2hlZF9wYXJhbGxl bF9jYXNlcywgCj4+IGRybV9zY2hlZF9wYXJhbGxlbF9kZXNjKTsKPiAKPiBBcyBsb25nIGFzIHlv dSBkb24ndCBwbGFuIHRvIGFkZCBtb3JlIHRlc3QgY2FzZXMgYW55IHRpbWUgc29vbiB0aGUgCj4g Ym9pbGVyIHBsYXRlIGNvdWxkIGJlIHJlZHVjZWQgYnkgdW5vdCB1c2luZyBLVU5JVF9BUlJBWV9Q QVJBTSBidXQgaXQgaXMgCj4gdXAgdG8geW91LiAoU2FtZSBmb3IgdGhlIG90aGVyIHRlc3QgYmVs b3cuKQo+IAo+PiArCj4+ICtzdHJ1Y3QgcGFyYWxsZWxfd29ya2VyIHsKPj4gK8KgwqDCoCBzdHJ1 Y3Qgd29ya19zdHJ1Y3Qgd29yazsKPj4gK8KgwqDCoCBzdHJ1Y3Qgc2NoZWRfY29uY3VycmVudF9j b250ZXh0ICpjdHg7Cj4+ICvCoMKgwqAgc3RydWN0IGRybV9tb2NrX3NjaGVkX2VudGl0eSAqZW50 aXR5Owo+PiArwqDCoMKgIHN0cnVjdCBkcm1fbW9ja19zY2hlZF9qb2IgKipqb2JzOwo+PiArwqDC oMKgIHVuc2lnbmVkIGludCBpZDsKPj4gK307Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIGRybV9zY2hl ZF9wYXJhbGxlbF93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+PiArewo+PiArwqDC oMKgIGNvbnN0IHN0cnVjdCBkcm1fc2NoZWRfcGFyYWxsZWxfcGFyYW1zICpwYXJhbXM7Cj4+ICvC oMKgwqAgc3RydWN0IHNjaGVkX2NvbmN1cnJlbnRfY29udGV4dCAqdGVzdF9jdHg7Cj4+ICvCoMKg wqAgc3RydWN0IHBhcmFsbGVsX3dvcmtlciAqd29ya2VyOwo+PiArwqDCoMKgIHVuc2lnbmVkIGlu dCBpOwo+PiArCj4+ICvCoMKgwqAgd29ya2VyID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBw YXJhbGxlbF93b3JrZXIsIHdvcmspOwo+PiArwqDCoMKgIHRlc3RfY3R4ID0gd29ya2VyLT5jdHg7 Cj4+ICvCoMKgwqAgcGFyYW1zID0gdGVzdF9jdHgtPnRlc3QtPnBhcmFtX3ZhbHVlOwo+PiArCj4+ ICvCoMKgwqAgd2FpdF9mb3JfY29tcGxldGlvbigmdGVzdF9jdHgtPndhaXRfZ28pOwo+PiArCj4+ ICvCoMKgwqAga3VuaXRfaW5mbyh0ZXN0X2N0eC0+dGVzdCwgIlBhcmFsbGVsIHdvcmtlciAldSBz dWJtaXR0aW5nICV1IGpvYnMgCj4+IHN0YXJ0ZWRcbiIsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oCB3b3JrZXItPmlkLCBwYXJhbXMtPm51bV9qb2JzKTsKPj4gKwo+PiArwqDCoMKgIGZvciAoaSA9 IDA7IGkgPCBwYXJhbXMtPm51bV9qb2JzOyBpKyspCj4+ICvCoMKgwqDCoMKgwqDCoCBkcm1fbW9j a19zY2hlZF9qb2Jfc3VibWl0KHdvcmtlci0+am9ic1tpXSk7Cj4+ICt9Cj4+ICsKPj4gKy8qCj4+ ICsgKiBTcGF3bnMgd29ya2VycyB0aGF0IHN1Ym1pdCBhIHNlcXVlbmNlIG9mIGpvYnMgdG8gdGhl IG1vY2sgc2NoZWR1bGVyLgo+PiArICogT25jZSBhbGwgam9icyBhcmUgc3VibWl0dGVkLCB0aGUg dGltZWxpbmUgaXMgbWFudWFsbHkgYWR2YW5jZWQuCj4+ICsgKi8KPj4gK3N0YXRpYyB2b2lkIGRy bV9zY2hlZF9wYXJhbGxlbF9zdWJtaXRfdGVzdChzdHJ1Y3Qga3VuaXQgKnRlc3QpCj4+ICt7Cj4+ ICvCoMKgwqAgc3RydWN0IHNjaGVkX2NvbmN1cnJlbnRfY29udGV4dCAqY3R4ID0gdGVzdC0+cHJp djsKPj4gK8KgwqDCoCBjb25zdCBzdHJ1Y3QgZHJtX3NjaGVkX3BhcmFsbGVsX3BhcmFtcyAqcGFy YW1zID0gdGVzdC0+cGFyYW1fdmFsdWU7Cj4+ICvCoMKgwqAgc3RydWN0IHBhcmFsbGVsX3dvcmtl ciAqd29ya2VycywgKndvcmtlcjsKPj4gK8KgwqDCoCBzdHJ1Y3QgZHJtX21vY2tfc2NoZWRfam9i ICpqb2I7Cj4+ICvCoMKgwqAgdW5zaWduZWQgaW50IGksIGosIGNvbXBsZXRlZF9qb2JzLCB0b3Rh bF9qb2JzOwo+PiArwqDCoMKgIGJvb2wgZG9uZTsKPj4gK8KgwqDCoCBpbnQgcmV0Owo+PiArCj4+ ICvCoMKgwqAgS1VOSVRfQVNTRVJUX0dUKHRlc3QsIHBhcmFtcy0+bnVtX3dvcmtlcnMsIDApOwo+ PiArwqDCoMKgIEtVTklUX0FTU0VSVF9HVCh0ZXN0LCBwYXJhbXMtPm51bV9qb2JzLCAwKTsKPj4g Kwo+PiArwqDCoMKgIHdvcmtlcnMgPSBrdW5pdF9rY2FsbG9jKHRlc3QsIHBhcmFtcy0+bnVtX3dv cmtlcnMsIHNpemVvZigqd29ya2VycyksCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgR0ZQX0tFUk5FTCk7Cj4+ICvCoMKgwqAgS1VOSVRfQVNTRVJUX05PVF9OVUxMKHRlc3QsIHdv cmtlcnMpOwo+PiArCj4+ICvCoMKgwqAgLyoKPj4gK8KgwqDCoMKgICogSW5pdCB3b3JrZXJzIG9u bHkgYWZ0ZXIgYWxsIGpvYnMgYW5kIGVudGl0aWVzIGhhdmUgYmVlbiAKPj4gc3VjY2Vzc2Z1bGx5 Cj4+ICvCoMKgwqDCoCAqIGFsbG9jYXRlZC4gSW4gdGhpcyB3YXksIHRoZSBjbGVhbnVwIGxvZ2lj IGZvciB3aGVuIGFuIAo+PiBhc3NlcnRpb24gZmFpbAo+PiArwqDCoMKgwqAgKiBjYW4gYmUgc2lt cGxpZmllZC4KPj4gK8KgwqDCoMKgICovCj4+ICvCoMKgwqAgZm9yIChpID0gMDsgaSA8IHBhcmFt cy0+bnVtX3dvcmtlcnM7IGkrKykgewo+PiArwqDCoMKgwqDCoMKgwqAgd29ya2VyID0gJndvcmtl cnNbaV07Cj4+ICvCoMKgwqDCoMKgwqDCoCB3b3JrZXItPmlkID0gaTsKPj4gK8KgwqDCoMKgwqDC oMKgIHdvcmtlci0+Y3R4ID0gY3R4Owo+PiArwqDCoMKgwqDCoMKgwqAgd29ya2VyLT5lbnRpdHkg PSBkcm1fbW9ja19zY2hlZF9lbnRpdHlfbmV3KHRlc3QsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgRFJNX1NDSEVEX1BSSU9S SVRZX05PUk1BTCwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBjdHgtPnNjaGVkKTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAg cmV0ID0ga3VuaXRfYWRkX2FjdGlvbl9vcl9yZXNldCh0ZXN0LCAKPj4gZHJtX21vY2tfc2NoZWRf ZW50aXR5X2ZyZWVfd3JhcCwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgd29ya2VyLT5lbnRpdHkpOwo+PiArwqDCoMKgwqDCoMKgwqAgS1VOSVRfQVNT RVJUX0VRKHRlc3QsIHJldCwgMCk7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIHdvcmtlci0+am9i cyA9IGt1bml0X2tjYWxsb2ModGVzdCwgcGFyYW1zLT5udW1fam9icywKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzaXplb2YoKndvcmtlci0+am9i cyksIEdGUF9LRVJORUwpOwo+PiArwqDCoMKgwqDCoMKgwqAgS1VOSVRfQVNTRVJUX05PVF9OVUxM KHRlc3QsIHdvcmtlci0+am9icyk7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIGZvciAoaiA9IDA7 IGogPCBwYXJhbXMtPm51bV9qb2JzOyBqKyspIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg am9iID0gZHJtX21vY2tfc2NoZWRfam9iX25ldyh0ZXN0LCB3b3JrZXItPmVudGl0eSk7Cj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHdvcmtlci0+am9ic1tqXSA9IGpvYjsKPj4gK8KgwqDCoMKg wqDCoMKgIH0KPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCBmb3IgKGkgPSAwOyBpIDwgcGFy YW1zLT5udW1fd29ya2VyczsgaSsrKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCB3b3JrZXIgPSAmd29y a2Vyc1tpXTsKPj4gK8KgwqDCoMKgwqDCoMKgIElOSVRfV09SSygmd29ya2VyLT53b3JrLCBkcm1f c2NoZWRfcGFyYWxsZWxfd29ya2VyKTsKPj4gK8KgwqDCoMKgwqDCoMKgIHF1ZXVlX3dvcmsoY3R4 LT5zdWJfd3EsICZ3b3JrZXItPndvcmspOwo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIGNv bXBsZXRlX2FsbCgmY3R4LT53YWl0X2dvKTsKPj4gK8KgwqDCoCBmbHVzaF93b3JrcXVldWUoY3R4 LT5zdWJfd3EpOwo+PiArCj4+ICvCoMKgwqAgZm9yIChpID0gMDsgaSA8IHBhcmFtcy0+bnVtX3dv cmtlcnM7IGkrKykgewo+PiArwqDCoMKgwqDCoMKgwqAgd29ya2VyID0gJndvcmtlcnNbaV07Cj4+ ICvCoMKgwqDCoMKgwqDCoCBmb3IgKGogPSAwOyBqIDwgcGFyYW1zLT5udW1fam9iczsgaisrKSB7 Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGpvYiA9IHdvcmtlci0+am9ic1tqXTsKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqAgZG9uZSA9IGRybV9tb2NrX3NjaGVkX2pvYl93YWl0X3NjaGVk dWxlZChqb2IsIEhaKTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgS1VOSVRfRVhQRUNUX1RS VUUodGVzdCwgZG9uZSk7Cj4+ICvCoMKgwqDCoMKgwqDCoCB9Cj4+ICvCoMKgwqAgfQo+PiArCj4+ ICvCoMKgwqAgdG90YWxfam9icyA9IHBhcmFtcy0+bnVtX3dvcmtlcnMgKiBwYXJhbXMtPm51bV9q b2JzOwo+PiArwqDCoMKgIGNvbXBsZXRlZF9qb2JzID0gZHJtX21vY2tfc2NoZWRfYWR2YW5jZShj dHgtPnNjaGVkLCB0b3RhbF9qb2JzKTsKPj4gK8KgwqDCoCBLVU5JVF9FWFBFQ1RfRVEodGVzdCwg Y29tcGxldGVkX2pvYnMsIHRvdGFsX2pvYnMpOwo+PiArCj4+ICvCoMKgwqAgZm9yIChpID0gMDsg aSA8IHBhcmFtcy0+bnVtX3dvcmtlcnM7IGkrKykgewo+PiArwqDCoMKgwqDCoMKgwqAgd29ya2Vy ID0gJndvcmtlcnNbaV07Cj4+ICvCoMKgwqDCoMKgwqDCoCBmb3IgKGogPSAwOyBqIDwgcGFyYW1z LT5udW1fam9iczsgaisrKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGpvYiA9IHdvcmtl ci0+am9ic1tqXTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZG9uZSA9IGRybV9tb2NrX3Nj aGVkX2pvYl93YWl0X2ZpbmlzaGVkKGpvYiwgSFopOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBLVU5JVF9FWFBFQ1RfVFJVRSh0ZXN0LCBkb25lKTsKPj4gK8KgwqDCoMKgwqDCoMKgIH0KPj4g K8KgwqDCoCB9Cj4+ICt9Cj4+ICsKPj4gK3N0cnVjdCBkcm1fc2NoZWRfaW50ZXJsZWF2ZWRfcGFy YW1zIHsKPj4gK8KgwqDCoCBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsKPj4gK8KgwqDCoCB1bnNp Z25lZCBpbnQgdGVzdF9kdXJhdGlvbl9tczsKPj4gK8KgwqDCoCB1bnNpZ25lZCBpbnQgam9iX2Jh c2VfZHVyYXRpb25fdXM7Cj4+ICvCoMKgwqAgdW5zaWduZWQgaW50IG51bV93b3JrZXJzOwo+PiAr wqDCoMKgIHVuc2lnbmVkIGludCBudW1faW5fZmxpZ2h0X2pvYnM7Cj4+ICt9Owo+PiArCj4+ICtz dGF0aWMgY29uc3Qgc3RydWN0IGRybV9zY2hlZF9pbnRlcmxlYXZlZF9wYXJhbXMgCj4+IGRybV9z Y2hlZF9pbnRlcmxlYXZlZF9jYXNlc1tdID0gewo+PiArwqDCoMKgIHsKPj4gK8KgwqDCoMKgwqDC oMKgIC5kZXNjcmlwdGlvbiA9ICJJbnRlcmxlYXZlZCBzdWJtaXNzaW9uIG9mIG11bHRpcGxlIGpv YnMgcGVyIAo+PiB3b3JrZXIiLAo+PiArwqDCoMKgwqDCoMKgwqAgLnRlc3RfZHVyYXRpb25fbXMg PSAxMDAwLAo+PiArwqDCoMKgwqDCoMKgwqAgLmpvYl9iYXNlX2R1cmF0aW9uX3VzID0gMTAwLAo+ PiArwqDCoMKgwqDCoMKgwqAgLm51bV93b3JrZXJzID0gMTYsCj4+ICvCoMKgwqDCoMKgwqDCoCAu bnVtX2luX2ZsaWdodF9qb2JzID0gOCwKPj4gK8KgwqDCoCB9LAo+PiArfTsKPj4gKwo+PiArc3Rh dGljIHZvaWQKPj4gK2RybV9zY2hlZF9pbnRlcmxlYXZlZF9kZXNjKGNvbnN0IHN0cnVjdCBkcm1f c2NoZWRfaW50ZXJsZWF2ZWRfcGFyYW1zIAo+PiAqcGFyYW1zLCBjaGFyICpkZXNjKQo+PiArewo+ PiArwqDCoMKgIHN0cnNjcHkoZGVzYywgcGFyYW1zLT5kZXNjcmlwdGlvbiwgS1VOSVRfUEFSQU1f REVTQ19TSVpFKTsKPj4gK30KPj4gKwo+PiArS1VOSVRfQVJSQVlfUEFSQU0oZHJtX3NjaGVkX2lu dGVybGVhdmVkLCBkcm1fc2NoZWRfaW50ZXJsZWF2ZWRfY2FzZXMsCj4+ICvCoMKgwqDCoMKgwqDC oMKgwqAgZHJtX3NjaGVkX2ludGVybGVhdmVkX2Rlc2MpOwo+PiArCj4+ICtzdHJ1Y3QgaW50ZXJs ZWF2ZWRfd29ya2VyIHsKPj4gK8KgwqDCoCBzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKPj4gK8Kg wqDCoCBzdHJ1Y3Qgc2NoZWRfY29uY3VycmVudF9jb250ZXh0ICpjdHg7Cj4+ICvCoMKgwqAgc3Ry dWN0IGRybV9tb2NrX3NjaGVkX2VudGl0eSAqZW50aXR5Owo+PiArwqDCoMKgIHN0cnVjdCBkcm1f bW9ja19zY2hlZF9qb2IgKipqb2JzOwo+PiArwqDCoMKgIHVuc2lnbmVkIGludCBpZDsKPj4gK8Kg wqDCoCB1bnNpZ25lZCBpbnQgam9iX2NvdW50Owo+PiArwqDCoMKgIHVuc2lnbmVkIGludCBqb2Jf ZHVyYXRpb25fdXM7Cj4+ICt9Owo+PiArCj4+ICtzdGF0aWMgdm9pZCBkcm1fc2NoZWRfaW50ZXJs ZWF2ZWRfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKPj4gK3sKPj4gK8KgwqDCoCBz dHJ1Y3Qgc2NoZWRfY29uY3VycmVudF9jb250ZXh0ICp0ZXN0X2N0eDsKPj4gK8KgwqDCoCBjb25z dCBzdHJ1Y3QgZHJtX3NjaGVkX2ludGVybGVhdmVkX3BhcmFtcyAqcGFyYW1zOwo+PiArwqDCoMKg IHN0cnVjdCBpbnRlcmxlYXZlZF93b3JrZXIgKndvcmtlcjsKPj4gK8KgwqDCoCB1bnNpZ25lZCBp bnQgaSwgaiwgbWF4X2luX2ZsaWdodF9qb2I7Cj4+ICvCoMKgwqAgdW5zaWduZWQgbG9uZyB0aW1l b3V0Owo+PiArwqDCoMKgIGJvb2wgZG9uZTsKPj4gKwo+PiArwqDCoMKgIHdvcmtlciA9IGNvbnRh aW5lcl9vZih3b3JrLCBzdHJ1Y3QgaW50ZXJsZWF2ZWRfd29ya2VyLCB3b3JrKTsKPj4gK8KgwqDC oCB0ZXN0X2N0eCA9IHdvcmtlci0+Y3R4Owo+PiArwqDCoMKgIHBhcmFtcyA9IHRlc3RfY3R4LT50 ZXN0LT5wYXJhbV92YWx1ZTsKPj4gKwo+PiArwqDCoMKgIHdhaXRfZm9yX2NvbXBsZXRpb24oJnRl c3RfY3R4LT53YWl0X2dvKTsKPj4gKwo+PiArwqDCoMKgIGt1bml0X2luZm8odGVzdF9jdHgtPnRl c3QsICJXb3JrZXIgJXUgc3VibWl0dGluZyAldSBqb2JzIG9mICV1IHVzIAo+PiBzdGFydGVkXG4i LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqAgd29ya2VyLT5pZCwgd29ya2VyLT5qb2JfY291bnQs IHdvcmtlci0+am9iX2R1cmF0aW9uX3VzKTsKPj4gKwo+PiArwqDCoMKgIHRpbWVvdXQgPSBtc2Vj c190b19qaWZmaWVzKHBhcmFtcy0+dGVzdF9kdXJhdGlvbl9tcyAqIDIpOwo+PiArCj4+ICvCoMKg wqAgLyogRmlsbCB0aGUgc3VibWlzc2lvbiB3aW5kb3cgKi8KPj4gK8KgwqDCoCBtYXhfaW5fZmxp Z2h0X2pvYiA9IG1pbih3b3JrZXItPmpvYl9jb3VudCwgcGFyYW1zLSAKPj4gPm51bV9pbl9mbGln aHRfam9icyk7Cj4+ICvCoMKgwqAgZm9yIChpID0gMDsgaSA8IG1heF9pbl9mbGlnaHRfam9iOyBp KyspCj4+ICvCoMKgwqDCoMKgwqDCoCBkcm1fbW9ja19zY2hlZF9qb2Jfc3VibWl0KHdvcmtlci0+ am9ic1tpXSk7Cj4+ICsKPj4gK8KgwqDCoCAvKiBLZWVwIHRoZSB3aW5kb3cgZnVsbCBieSBzdWJt aXR0aW5nIGEgbmV3IGpvYiBhdCBvbmNlIHVudGlsIAo+PiBkb25lICovCj4+ICvCoMKgwqAgZm9y IChpID0gMDsgaSA8IHdvcmtlci0+am9iX2NvdW50OyBpKyspIHsKPj4gK8KgwqDCoMKgwqDCoMKg IGRvbmUgPSBkcm1fbW9ja19zY2hlZF9qb2Jfd2FpdF9maW5pc2hlZCh3b3JrZXItPmpvYnNbaV0s IAo+PiB0aW1lb3V0KTsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmICghZG9uZSkKPj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqAga3VuaXRfaW5mbyh0ZXN0X2N0eC0+dGVzdCwgIkpvYiAldSBvZiB3b3Jr ZXIgJXUgdGltZWQgCj4+IG91dFxuIiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBpLCB3b3JrZXItPmlkKTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgaiA9IGkgKyBt YXhfaW5fZmxpZ2h0X2pvYjsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChqIDwgd29ya2VyLT5qb2Jf Y291bnQpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRybV9tb2NrX3NjaGVkX2pvYl9zdWJt aXQod29ya2VyLT5qb2JzW2pdKTsKPj4gK8KgwqDCoCB9Cj4gCj4gVGhlIGxvb3AgbWF5YmUgaXNu J3QgdGhlIG1vc3Qgc3RyYWlnaHQtZm9yd2FyZCBidXQgZXZlbnR1YWxseSBsb29rZWQgdG8gCj4g bWUgbGlrZSBpdCB3aWxsIGRvIHdoYXQgaXQgd2FudHMuCgpPbmUgaWRlYSB0byByZXBsYWNlIHR3 byBsb29wcyB3aXRoIGEgc2luZ2xlIGhvcGVmdWxseSBjbGVhcmVyIG9uZToKCmZvciAoaSA9IDA7 IGkgPCB3b3JrZXItPmpvYl9jb3VudDsgaSsrKSB7CglpZiAoaSA+PSBtYXhfaW5fZmxpZ2h0X2pv YikKCQlkcm1fbW9ja19zY2hlZF9qb2Jfd2FpdF9maW5pc2hlZCh3b3JrZXItPmpvYnNbaSAtIG1h eF9pbl9mbGlnaHRfam9iXSwgCnRpbWVvdXQpOwoJZHJtX21vY2tfc2NoZWRfam9iX3N1Ym1pdCh3 b3JrZXItPmpvYnNbaV0pOwp9CgpSZWdhcmRzLAoKVHZydGtvCgo+IG51bV9pbl9mbGlnaHRfam9i cyBhcyBhIHRlc3QgcGFyYW1ldGVyIGlzIHBlcmhhcHMgYXJiaXRyYXJ5PyBJIGFtIG5vdCAKPiBz dXJlIHdoYXQgaXQgYWltcyB0byBhY2hpZXZlIHZlcnN1cyBpZiB3b3JrZXJzIHdvdWxkIGp1c3Qg YmUgc3VibWl0dGluZyAKPiBvbmUgYnkgb25lLCBvciBwZXJoYXBzIHR3byBieSB0d28sIGluIGJv dGggY2FzZXMgbG9vcHMgd291bGQgYmUgc2ltcGxlci4gCj4gT3IgZXZlbiBpZiBudW1faW5fZmxp Z2h0X2pvYnMgd291bGQgcGVyaGFwcyBiZSBhdXRvbWF0aWNhbGx5IGRlcml2ZWQgCj4gZnJvbSB0 aGUgd29ya2VyLT5pZD8gSWYgdGhlIGdvYWwgaXMgdG8gc2ltdWxhdGUgcXVldWUgZGVwdGggaXQg c291bmRzIAo+IGdvb2QgdG8gdmFyeSBpdC4KPiAKPiBCdXQgdGhlc2UgYXJlIG1pbm9yIHBvaW50 cyBhbmQgdXAgdG8geW91LiBUaGUgdGVzdCBub3cgbG9va3MgcGFzc2FibHkgCj4gdGlkeSBhcyBp dCBpcy4KPiAKPiBBaCB3YWl0LCBwbGVhc2UgYWxzbyBjaGVjayBpZiB0aGlzIG9uZSBuZWVkcyB0 byBiZSBtYXJrZWQgYXMgInNsb3ciIAo+IGt1bml0IHRlc3QuIEFGQUlSIGFsbCB0aGF0IGFyZSBl eHBlY3RlZCB0byB0YWtlIG1vcmUgdGhhbiAxcyBuZWVkIHRoYXQuCj4gCj4gUmVnYXJkcywKPiAK PiBUdnJ0a28KPiAKPj4gK30KPj4gKwo+PiArLyoKPj4gKyAqIFNwYXducyB3b3JrZXJzIHRoYXQg c3VibWl0IGEgc2VxdWVuY2Ugb2Ygam9icyB0byB0aGUgbW9jayAKPj4gc2NoZWR1bGVyLiBKb2IK Pj4gKyAqIGR1cmF0aW9ucyBhcmUgY2hvc2VuIGFzIG11bHRpcGxlcyBvZiBhIGJhc2UgZHVyYXRp b24gdmFsdWUgCj4+IHNwZWNpZmllZCBhcwo+PiArICogYSB0ZXN0IHBhcmFtZXRlci4gU2luY2Ug dGhlIHNjaGVkdWxlciBzZXJpYWxpemVzIGpvYnMgZnJvbSBhbGwgCj4+IHdvcmtlcnMsCj4+ICsg KiB0aGUgdG90YWwgdGVzdCBkdXJhdGlvbiBidWRnZXQgaXMgZGl2aWRlZCBpbnRvIGVxdWFsIHNo YXJlcyBhbW9uZyAKPj4gd29ya2Vycy4KPj4gKyAqIFRoZXNlIHNoYXJlcyBhcmUgdGhlbiB1c2Vk IHRvIGNvbXB1dGUgdGhlIG51bWJlciBvZiBqb2JzIHRoYXQgZWFjaCAKPj4gd29ya2VyCj4+ICsg KiBjYW4gc3VibWl0Cj4+ICsgKi8KPj4gK3N0YXRpYyB2b2lkIGRybV9zY2hlZF9pbnRlcmxlYXZl ZF9zdWJtaXRfdGVzdChzdHJ1Y3Qga3VuaXQgKnRlc3QpCj4+ICt7Cj4+ICvCoMKgwqAgY29uc3Qg c3RydWN0IGRybV9zY2hlZF9pbnRlcmxlYXZlZF9wYXJhbXMgKnBhcmFtcyA9IHRlc3QtIAo+PiA+ cGFyYW1fdmFsdWU7Cj4+ICvCoMKgwqAgc3RydWN0IHNjaGVkX2NvbmN1cnJlbnRfY29udGV4dCAq Y3R4ID0gdGVzdC0+cHJpdjsKPj4gK8KgwqDCoCBzdHJ1Y3QgaW50ZXJsZWF2ZWRfd29ya2VyICp3 b3JrZXJzLCAqd29ya2VyOwo+PiArwqDCoMKgIHN0cnVjdCBkcm1fbW9ja19zY2hlZF9qb2IgKmpv YjsKPj4gK8KgwqDCoCB1bnNpZ25lZCBpbnQgd29ya2VyX3NoYXJlX3VzOwo+PiArwqDCoMKgIHVu c2lnbmVkIGludCBpLCBqOwo+PiArwqDCoMKgIGJvb2wgZG9uZTsKPj4gK8KgwqDCoCBpbnQgcmV0 Owo+PiArCj4+ICvCoMKgwqAgS1VOSVRfQVNTRVJUX0dUKHRlc3QsIHBhcmFtcy0+bnVtX3dvcmtl cnMsIDApOwo+PiArwqDCoMKgIEtVTklUX0FTU0VSVF9HVCh0ZXN0LCBwYXJhbXMtPmpvYl9iYXNl X2R1cmF0aW9uX3VzLCAwKTsKPj4gKwo+PiArwqDCoMKgIHdvcmtlcnMgPSBrdW5pdF9rY2FsbG9j KHRlc3QsIHBhcmFtcy0+bnVtX3dvcmtlcnMsIHNpemVvZigqd29ya2VycyksCj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgR0ZQX0tFUk5FTCk7Cj4+ICvCoMKgwqAgS1VOSVRfQVNT RVJUX05PVF9OVUxMKHRlc3QsIHdvcmtlcnMpOwo+PiArCj4+ICvCoMKgwqAgLyogRGl2aWRlIHRo ZSBhdmFpbGFibGUgdGVzdCB0aW1lIGludG8gZXF1YWwgc2hhcmVzIGFtb25nIHRoZSAKPj4gd29y a2VycyAqLwo+PiArwqDCoMKgIHdvcmtlcl9zaGFyZV91cyA9IChwYXJhbXMtPnRlc3RfZHVyYXRp b25fbXMgKiBVU0VDX1BFUl9NU0VDKSAvCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBw YXJhbXMtPm51bV93b3JrZXJzOwo+PiArCj4+ICvCoMKgwqAgLyoKPj4gK8KgwqDCoMKgICogSW5p dCB3b3JrZXJzIG9ubHkgYWZ0ZXIgYWxsIGpvYnMgYW5kIGVudGl0aWVzIGhhdmUgYmVlbiAKPj4g c3VjY2Vzc2Z1bGx5Cj4+ICvCoMKgwqDCoCAqIGFsbG9jYXRlZC4gSW4gdGhpcyB3YXksIHRoZSBj bGVhbnVwIGxvZ2ljIGZvciB3aGVuIGFuIAo+PiBhc3NlcnRpb24gZmFpbHMKPj4gK8KgwqDCoMKg ICogY2FuIGJlIHNpbXBsaWZpZWQuCj4+ICvCoMKgwqDCoCAqLwo+PiArwqDCoMKgIGZvciAoaSA9 IDA7IGkgPCBwYXJhbXMtPm51bV93b3JrZXJzOyBpKyspIHsKPj4gK8KgwqDCoMKgwqDCoMKgIHdv cmtlciA9ICZ3b3JrZXJzW2ldOwo+PiArwqDCoMKgwqDCoMKgwqAgd29ya2VyLT5pZCA9IGk7Cj4+ ICvCoMKgwqDCoMKgwqDCoCB3b3JrZXItPmN0eCA9IGN0eDsKPj4gKwo+PiArwqDCoMKgwqDCoMKg wqAgd29ya2VyLT5qb2JfZHVyYXRpb25fdXMgPSBwYXJhbXMtPmpvYl9iYXNlX2R1cmF0aW9uX3Vz ICogKGkgKyAKPj4gMSk7Cj4+ICvCoMKgwqDCoMKgwqDCoCB3b3JrZXItPmpvYl9jb3VudCA9IHdv cmtlcl9zaGFyZV91cyAvIHdvcmtlci0+am9iX2R1cmF0aW9uX3VzOwo+PiArwqDCoMKgwqDCoMKg wqAgd29ya2VyLT5qb2JfY291bnQgPSBtYXgoMVUsIHdvcmtlci0+am9iX2NvdW50KTsKPj4gKwo+ PiArwqDCoMKgwqDCoMKgwqAgd29ya2VyLT5lbnRpdHkgPSBkcm1fbW9ja19zY2hlZF9lbnRpdHlf bmV3KHRlc3QsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgRFJNX1NDSEVEX1BSSU9SSVRZX05PUk1BTCwKPj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjdHgt PnNjaGVkKTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgcmV0ID0ga3VuaXRfYWRkX2FjdGlvbl9v cl9yZXNldCh0ZXN0LCAKPj4gZHJtX21vY2tfc2NoZWRfZW50aXR5X2ZyZWVfd3JhcCwKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgd29ya2VyLT5lbnRp dHkpOwo+PiArwqDCoMKgwqDCoMKgwqAgS1VOSVRfQVNTRVJUX0VRKHRlc3QsIHJldCwgMCk7Cj4+ ICsKPj4gK8KgwqDCoMKgwqDCoMKgIHdvcmtlci0+am9icyA9IGt1bml0X2tjYWxsb2ModGVzdCwg d29ya2VyLT5qb2JfY291bnQsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgc2l6ZW9mKCp3b3JrZXItPmpvYnMpLCBHRlBfS0VSTkVMKTsKPj4gK8Kg wqDCoMKgwqDCoMKgIEtVTklUX0FTU0VSVF9OT1RfTlVMTCh0ZXN0LCB3b3JrZXItPmpvYnMpOwo+ PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBmb3IgKGogPSAwOyBqIDwgd29ya2VyLT5qb2JfY291bnQ7 IGorKykgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBqb2IgPSBkcm1fbW9ja19zY2hlZF9q b2JfbmV3KHRlc3QsIHdvcmtlci0+ZW50aXR5KTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg ZHJtX21vY2tfc2NoZWRfam9iX3NldF9kdXJhdGlvbl91cyhqb2IsIHdvcmtlci0gCj4+ID5qb2Jf ZHVyYXRpb25fdXMpOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHdvcmtlci0+am9i c1tqXSA9IGpvYjsKPj4gK8KgwqDCoMKgwqDCoMKgIH0KPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8Kg wqDCoCBmb3IgKGkgPSAwOyBpIDwgcGFyYW1zLT5udW1fd29ya2VyczsgaSsrKSB7Cj4+ICvCoMKg wqDCoMKgwqDCoCB3b3JrZXIgPSAmd29ya2Vyc1tpXTsKPj4gK8KgwqDCoMKgwqDCoMKgIElOSVRf V09SSygmd29ya2VyLT53b3JrLCBkcm1fc2NoZWRfaW50ZXJsZWF2ZWRfd29ya2VyKTsKPj4gK8Kg wqDCoMKgwqDCoMKgIHF1ZXVlX3dvcmsoY3R4LT5zdWJfd3EsICZ3b3JrZXItPndvcmspOwo+PiAr wqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIGNvbXBsZXRlX2FsbCgmY3R4LT53YWl0X2dvKTsKPj4g K8KgwqDCoCBmbHVzaF93b3JrcXVldWUoY3R4LT5zdWJfd3EpOwo+PiArCj4+ICvCoMKgwqAgZm9y IChpID0gMDsgaSA8IHBhcmFtcy0+bnVtX3dvcmtlcnM7IGkrKykgewo+PiArwqDCoMKgwqDCoMKg wqAgd29ya2VyID0gJndvcmtlcnNbaV07Cj4+ICvCoMKgwqDCoMKgwqDCoCBmb3IgKGogPSAwOyBq IDwgd29ya2VyLT5qb2JfY291bnQ7IGorKykgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBq b2IgPSB3b3JrZXItPmpvYnNbal07Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRvbmUgPSBk cm1fbW9ja19zY2hlZF9qb2JfaXNfZmluaXNoZWQoam9iKTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgS1VOSVRfRVhQRUNUX1RSVUUodGVzdCwgZG9uZSk7Cj4+ICvCoMKgwqDCoMKgwqDCoCB9 Cj4+ICvCoMKgwqAgfQo+PiArfQo+PiArCj4+ICtzdGF0aWMgc3RydWN0IGt1bml0X2Nhc2UgZHJt X3NjaGVkX2NvbmN1cnJlbnRfdGVzdHNbXSA9IHsKPj4gK8KgwqDCoCBLVU5JVF9DQVNFX1BBUkFN KGRybV9zY2hlZF9wYXJhbGxlbF9zdWJtaXRfdGVzdCwgCj4+IGRybV9zY2hlZF9wYXJhbGxlbF9n ZW5fcGFyYW1zKSwKPj4gK8KgwqDCoCBLVU5JVF9DQVNFX1BBUkFNKGRybV9zY2hlZF9pbnRlcmxl YXZlZF9zdWJtaXRfdGVzdCwgCj4+IGRybV9zY2hlZF9pbnRlcmxlYXZlZF9nZW5fcGFyYW1zKSwK Pj4gK8KgwqDCoCB7fQo+PiArfTsKPj4gKwo+PiArc3RhdGljIHN0cnVjdCBrdW5pdF9zdWl0ZSBk cm1fc2NoZWRfY29uY3VycmVudCA9IHsKPj4gK8KgwqDCoCAubmFtZSA9ICJkcm1fc2NoZWRfY29u Y3VycmVudF90ZXN0cyIsCj4+ICvCoMKgwqAgLmluaXQgPSBkcm1fc2NoZWRfY29uY3VycmVudF9p bml0LAo+PiArwqDCoMKgIC50ZXN0X2Nhc2VzID0gZHJtX3NjaGVkX2NvbmN1cnJlbnRfdGVzdHMs Cj4+ICt9Owo+PiArCj4+IMKgIHN0YXRpYyBzdHJ1Y3Qga3VuaXRfY2FzZSBkcm1fc2NoZWRfY2Fu Y2VsX3Rlc3RzW10gPSB7Cj4+IMKgwqDCoMKgwqAgS1VOSVRfQ0FTRShkcm1fc2NoZWRfYmFzaWNf Y2FuY2VsKSwKPj4gwqDCoMKgwqDCoCB7fQo+PiBAQCAtNTU2LDYgKzkxMSw3IEBAIHN0YXRpYyBz dHJ1Y3Qga3VuaXRfc3VpdGUgZHJtX3NjaGVkX2NyZWRpdHMgPSB7Cj4+IMKgIH07Cj4+IMKgIGt1 bml0X3Rlc3Rfc3VpdGVzKCZkcm1fc2NoZWRfYmFzaWMsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqAg JmRybV9zY2hlZF9jb25jdXJyZW50LAo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICZkcm1fc2No ZWRfdGltZW91dCwKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmZHJtX3NjaGVkX2NhbmNlbCwK Pj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmZHJtX3NjaGVkX3ByaW9yaXR5LAo+IAoK