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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BFFB1C636CC for ; Thu, 16 Feb 2023 13:05:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230173AbjBPNFl (ORCPT ); Thu, 16 Feb 2023 08:05:41 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49042 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230127AbjBPNFb (ORCPT ); Thu, 16 Feb 2023 08:05:31 -0500 Received: from mail-ej1-f45.google.com (mail-ej1-f45.google.com [209.85.218.45]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6A5404DBF3 for ; Thu, 16 Feb 2023 05:05:25 -0800 (PST) Received: by mail-ej1-f45.google.com with SMTP id ky6so5031554ejc.0 for ; Thu, 16 Feb 2023 05:05:25 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:cc:to:from:subject:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=Wm8eJUDp8ITuOLLqcsRtRkG4/rjqzDyoX58HnJB0Cyc=; b=fJkJv9ZDODn8jjWGEWFWxAxOkzwGH0QC2Mv+stj6+mNZdJVovNgsELgm+7XuJ6R77n LX6x+53AsszWJxUKzoOWRC7zbEAdTS4iEIXzESkcVKxMj2W5pOIEFU0pHVfX1sDhxAm2 O4e5tXPG/EhXiK4/cJhQDPY8QRgS/FxehwGkJiYLW6KZgHd/cm9PywEjKOcEEjPxsPBD zwL5jkiBqT3r0maoqMjc0aVqMW4HMHfcu0cftkJxE+DYa7ogrRu9wciFPUCVERM0offH vdcJb24L/zMSGDyLEQ+CEqqfrvDo8vWtaveWJ2QWzzSk8s/Ipx7VOXiC+omvGsSYeq9o io0g== X-Gm-Message-State: AO0yUKVLA53n4cExlsk+XLMgcqO5sK3HDRPixLc9djFi9KN0iolZWCzh G1w2eXfoA0TGuX5bQcU8JB4= X-Google-Smtp-Source: AK7set9uUrxOytvbFEgijikfc44j3RO3I5y5hhc6M8eMRk2jLLKCPjdl6or2iBT6Bhgdajaz6hlaTQ== X-Received: by 2002:a17:906:b84b:b0:7c9:6e0e:1427 with SMTP id ga11-20020a170906b84b00b007c96e0e1427mr6767215ejb.6.1676552723757; Thu, 16 Feb 2023 05:05:23 -0800 (PST) Received: from [10.148.80.132] ([195.228.69.10]) by smtp.gmail.com with ESMTPSA id mm16-20020a170906cc5000b008b0fbcf4b11sm787481ejb.66.2023.02.16.05.05.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 16 Feb 2023 05:05:23 -0800 (PST) Message-ID: Subject: Re: [PATCH v6 net-next 02/13] net/sched: mqprio: refactor offloading and unoffloading to dedicated functions From: Ferenc Fejes To: Vladimir Oltean , netdev@vger.kernel.org Cc: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Claudiu Manoil , Vinicius Costa Gomes , Kurt Kanzenbach , Jacob Keller , Jamal Hadi Salim , Cong Wang , Jiri Pirko , Simon Horman Date: Thu, 16 Feb 2023 14:05:22 +0100 In-Reply-To: <20230204135307.1036988-3-vladimir.oltean@nxp.com> References: <20230204135307.1036988-1-vladimir.oltean@nxp.com> <20230204135307.1036988-3-vladimir.oltean@nxp.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 User-Agent: Evolution 3.46.4-1 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org SGkhCgpPbiBTYXQsIDIwMjMtMDItMDQgYXQgMTU6NTIgKzAyMDAsIFZsYWRpbWlyIE9sdGVhbiB3 cm90ZToKPiBTb21lIG1vcmUgbG9naWMgd2lsbCBiZSBhZGRlZCB0byBtcXByaW8gb2ZmbG9hZGlu Zywgc28gc3BsaXQgdGhhdAo+IGNvZGUKPiB1cCBmcm9tIG1xcHJpb19pbml0KCksIHdoaWNoIGlz IGFscmVhZHkgbGFyZ2UsIGFuZCBjcmVhdGUgYSBuZXcKPiBmdW5jdGlvbiwgbXFwcmlvX2VuYWJs ZV9vZmZsb2FkKCksIHNpbWlsYXIgdG8KPiB0YXByaW9fZW5hYmxlX29mZmxvYWQoKS4KPiBBbHNv IGNyZWF0ZSB0aGUgb3Bwb3NpdGUgZnVuY3Rpb24gbXFwcmlvX2Rpc2FibGVfb2ZmbG9hZCgpLgo+ IAo+IFNpZ25lZC1vZmYtYnk6IFZsYWRpbWlyIE9sdGVhbiA8dmxhZGltaXIub2x0ZWFuQG54cC5j b20+Cj4gUmV2aWV3ZWQtYnk6IEphY29iIEtlbGxlciA8amFjb2IuZS5rZWxsZXJAaW50ZWwuY29t Pgo+IFJldmlld2VkLWJ5OiBTaW1vbiBIb3JtYW4gPHNpbW9uLmhvcm1hbkBjb3JpZ2luZS5jb20+ Cj4gLS0tCj4gdjEtPnY2OiBub25lCj4gCj4gwqBuZXQvc2NoZWQvc2NoX21xcHJpby5jIHwgMTAy ICsrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLQo+IC0tCj4gwqAxIGZpbGUg Y2hhbmdlZCwgNTkgaW5zZXJ0aW9ucygrKSwgNDMgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdp dCBhL25ldC9zY2hlZC9zY2hfbXFwcmlvLmMgYi9uZXQvc2NoZWQvc2NoX21xcHJpby5jCj4gaW5k ZXggZDJkOGEwMmRlZDA1Li4zNTc5YTY0ZGEwNmUgMTAwNjQ0Cj4gLS0tIGEvbmV0L3NjaGVkL3Nj aF9tcXByaW8uYwo+ICsrKyBiL25ldC9zY2hlZC9zY2hfbXFwcmlvLmMKPiBAQCAtMjcsNiArMjcs NjEgQEAgc3RydWN0IG1xcHJpb19zY2hlZCB7Cj4gwqDCoMKgwqDCoMKgwqDCoHU2NCBtYXhfcmF0 ZVtUQ19RT1BUX01BWF9RVUVVRV07Cj4gwqB9Owo+IMKgCj4gK3N0YXRpYyBpbnQgbXFwcmlvX2Vu YWJsZV9vZmZsb2FkKHN0cnVjdCBRZGlzYyAqc2NoLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb25zdCBzdHJ1Y3QgdGNf bXFwcmlvX3FvcHQgKnFvcHQpCj4gK3sKPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgdGNfbXFwcmlv X3FvcHRfb2ZmbG9hZCBtcXByaW8gPSB7LnFvcHQgPSAqcW9wdH07Cj4gK8KgwqDCoMKgwqDCoMKg c3RydWN0IG1xcHJpb19zY2hlZCAqcHJpdiA9IHFkaXNjX3ByaXYoc2NoKTsKPiArwqDCoMKgwqDC oMKgwqBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcWRpc2NfZGV2KHNjaCk7Cj4gK8KgwqDCoMKg wqDCoMKgaW50IGVyciwgaTsKPiArCj4gK8KgwqDCoMKgwqDCoMKgc3dpdGNoIChwcml2LT5tb2Rl KSB7Cj4gK8KgwqDCoMKgwqDCoMKgY2FzZSBUQ19NUVBSSU9fTU9ERV9EQ0I6Cj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChwcml2LT5zaGFwZXIgIT0gVENfTVFQUklPX1NIQVBF Ul9EQ0IpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBy ZXR1cm4gLUVJTlZBTDsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYnJlYWs7Cj4g K8KgwqDCoMKgwqDCoMKgY2FzZSBUQ19NUVBSSU9fTU9ERV9DSEFOTkVMOgo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBtcXByaW8uZmxhZ3MgPSBwcml2LT5mbGFnczsKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKHByaXYtPmZsYWdzICYgVENfTVFQUklPX0ZfTU9E RSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1xcHJp by5tb2RlID0gcHJpdi0+bW9kZTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYg KHByaXYtPmZsYWdzICYgVENfTVFQUklPX0ZfU0hBUEVSKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbXFwcmlvLnNoYXBlciA9IHByaXYtPnNoYXBlcjsK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKHByaXYtPmZsYWdzICYgVENfTVFQ UklPX0ZfTUlOX1JBVEUpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBmb3IgKGkgPSAwOyBpIDwgbXFwcmlvLnFvcHQubnVtX3RjOyBpKyspCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg bXFwcmlvLm1pbl9yYXRlW2ldID0gcHJpdi0KPiA+bWluX3JhdGVbaV07Cj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGlmIChwcml2LT5mbGFncyAmIFRDX01RUFJJT19GX01BWF9SQVRF KQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZm9yIChp ID0gMDsgaSA8IG1xcHJpby5xb3B0Lm51bV90YzsgaSsrKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1xcHJpby5tYXhfcmF0 ZVtpXSA9IHByaXYtCj4gPm1heF9yYXRlW2ldOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBicmVhazsKPiArwqDCoMKgwqDCoMKgwqBkZWZhdWx0Ogo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqByZXR1cm4gLUVJTlZBTDsKPiArwqDCoMKgwqDCoMKgwqB9Cj4gKwo+ICvC oMKgwqDCoMKgwqDCoGVyciA9IGRldi0+bmV0ZGV2X29wcy0+bmRvX3NldHVwX3RjKGRldiwKPiBU Q19TRVRVUF9RRElTQ19NUVBSSU8sCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmbXFw cmlvKTsKPiArwqDCoMKgwqDCoMKgwqBpZiAoZXJyKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqByZXR1cm4gZXJyOwo+ICsKPiArwqDCoMKgwqDCoMKgwqBwcml2LT5od19vZmZsb2Fk ID0gbXFwcmlvLnFvcHQuaHc7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgdm9pZCBtcXByaW9fZGlzYWJsZV9vZmZsb2FkKHN0cnVjdCBRZGlzYyAqc2No KQo+ICt7Cj4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IHRjX21xcHJpb19xb3B0X29mZmxvYWQgbXFw cmlvID0geyB7IDAgfSB9Owo+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBtcXByaW9fc2NoZWQgKnBy aXYgPSBxZGlzY19wcml2KHNjaCk7Cj4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IG5ldF9kZXZpY2Ug KmRldiA9IHFkaXNjX2RldihzY2gpOwo+ICsKPiArwqDCoMKgwqDCoMKgwqBzd2l0Y2ggKHByaXYt Pm1vZGUpIHsKPiArwqDCoMKgwqDCoMKgwqBjYXNlIFRDX01RUFJJT19NT0RFX0RDQjoKPiArwqDC oMKgwqDCoMKgwqBjYXNlIFRDX01RUFJJT19NT0RFX0NIQU5ORUw6Cj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGRldi0+bmV0ZGV2X29wcy0+bmRvX3NldHVwX3RjKGRldiwKPiBUQ19T RVRVUF9RRElTQ19NUVBSSU8sCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgJm1x cHJpbyk7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJyZWFrOwo+ICvCoMKgwqDC oMKgwqDCoH0KPiArfQo+ICsKPiDCoHN0YXRpYyB2b2lkIG1xcHJpb19kZXN0cm95KHN0cnVjdCBR ZGlzYyAqc2NoKQo+IMKgewo+IMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2 ID0gcWRpc2NfZGV2KHNjaCk7Cj4gQEAgLTQxLDIyICs5NiwxMCBAQCBzdGF0aWMgdm9pZCBtcXBy aW9fZGVzdHJveShzdHJ1Y3QgUWRpc2MgKnNjaCkKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGtmcmVlKHByaXYtPnFkaXNjcyk7Cj4gwqDCoMKgwqDCoMKgwqDCoH0KPiDCoAo+IC3C oMKgwqDCoMKgwqDCoGlmIChwcml2LT5od19vZmZsb2FkICYmIGRldi0+bmV0ZGV2X29wcy0+bmRv X3NldHVwX3RjKSB7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0cnVjdCB0Y19t cXByaW9fcW9wdF9vZmZsb2FkIG1xcHJpbyA9IHsgeyAwIH0gfTsKPiAtCj4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHN3aXRjaCAocHJpdi0+bW9kZSkgewo+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBjYXNlIFRDX01RUFJJT19NT0RFX0RDQjoKPiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgY2FzZSBUQ19NUVBSSU9fTU9ERV9DSEFOTkVMOgo+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZGV2LT5uZXRkZXZfb3BzLT5u ZG9fc2V0dXBfdGMoZGV2LAo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoAo+IFRDX1NFVFVQX1FESVNDX01RUFJJTywKPiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgJm1xcHJpbyk7Cj4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBicmVhazsKPiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZGVmYXVsdDoKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHJldHVybjsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg fQo+IC3CoMKgwqDCoMKgwqDCoH0gZWxzZSB7Cj4gK8KgwqDCoMKgwqDCoMKgaWYgKHByaXYtPmh3 X29mZmxvYWQgJiYgZGV2LT5uZXRkZXZfb3BzLT5uZG9fc2V0dXBfdGMpCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoG1xcHJpb19kaXNhYmxlX29mZmxvYWQoc2NoKTsKPiArwqDCoMKg wqDCoMKgwqBlbHNlCj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBuZXRkZXZfc2V0 X251bV90YyhkZXYsIDApOwo+IC3CoMKgwqDCoMKgwqDCoH0KPiDCoH0KPiDCoAo+IMKgc3RhdGlj IGludCBtcXByaW9fcGFyc2Vfb3B0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdAo+IHRj X21xcHJpb19xb3B0ICpxb3B0KQo+IEBAIC0yNTMsMzYgKzI5Niw5IEBAIHN0YXRpYyBpbnQgbXFw cmlvX2luaXQoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdAo+IG5sYXR0ciAqb3B0LAo+IMKgwqDC oMKgwqDCoMKgwqAgKiBzdXBwbGllZCBhbmQgdmVyaWZpZWQgbWFwcGluZwo+IMKgwqDCoMKgwqDC oMKgwqAgKi8KPiDCoMKgwqDCoMKgwqDCoMKgaWYgKHFvcHQtPmh3KSB7Cj4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHN0cnVjdCB0Y19tcXByaW9fcW9wdF9vZmZsb2FkIG1xcHJpbyA9 IHsucW9wdCA9Cj4gKnFvcHR9Owo+IC0KPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg c3dpdGNoIChwcml2LT5tb2RlKSB7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNh c2UgVENfTVFQUklPX01PREVfRENCOgo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgaWYgKHByaXYtPnNoYXBlciAhPSBUQ19NUVBSSU9fU0hBUEVSX0RDQikK PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqByZXR1cm4gLUVJTlZBTDsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGJyZWFrOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBj YXNlIFRDX01RUFJJT19NT0RFX0NIQU5ORUw6Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBtcXByaW8uZmxhZ3MgPSBwcml2LT5mbGFnczsKPiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChwcml2LT5mbGFncyAm IFRDX01RUFJJT19GX01PREUpCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbXFwcmlvLm1vZGUgPSBwcml2LT5tb2RlOwo+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKHByaXYtPmZs YWdzICYgVENfTVFQUklPX0ZfU0hBUEVSKQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1xcHJpby5zaGFwZXIgPSBwcml2LT5z aGFwZXI7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBp ZiAocHJpdi0+ZmxhZ3MgJiBUQ19NUVBSSU9fRl9NSU5fUkFURSkKPiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmb3IgKGkgPSAw OyBpIDwgbXFwcmlvLnFvcHQubnVtX3RjOwo+IGkrKykKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg bXFwcmlvLm1pbl9yYXRlW2ldID0gcHJpdi0KPiA+bWluX3JhdGVbaV07Cj4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAocHJpdi0+ZmxhZ3MgJiBUQ19N UVBSSU9fRl9NQVhfUkFURSkKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmb3IgKGkgPSAwOyBpIDwgbXFwcmlvLnFvcHQubnVt X3RjOwo+IGkrKykKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbXFwcmlvLm1heF9yYXRlW2ldID0g cHJpdi0KPiA+bWF4X3JhdGVbaV07Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBicmVhazsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZGVm YXVsdDoKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJl dHVybiAtRUlOVkFMOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9Cj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVyciA9IGRldi0+bmV0ZGV2X29wcy0+bmRvX3NldHVw X3RjKGRldiwKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoAo+ IFRDX1NFVFVQX1FESVNDX01RUFJJTywKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCAmbXFwcmlvKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg ZXJyID0gbXFwcmlvX2VuYWJsZV9vZmZsb2FkKHNjaCwgcW9wdCk7Cj4gwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBpZiAoZXJyKQo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiBlcnI7Cj4gLQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBwcml2LT5od19vZmZsb2FkID0gbXFwcmlvLnFvcHQuaHc7Cj4gwqDCoMKgwqDC oMKgwqDCoH0gZWxzZSB7Cj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBuZXRkZXZf c2V0X251bV90YyhkZXYsIHFvcHQtPm51bV90Yyk7Cj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBmb3IgKGkgPSAwOyBpIDwgcW9wdC0+bnVtX3RjOyBpKyspCgpUaGlzIHBhdGNoIGp1 c3QgY29kZSByZWZhY3RvcmluZyBvciBpdCBtb2RpZmllcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBv Zgp0aGUgb2ZmbG9hZGluZyB0b28/IEknbSBhc2tpbmcgaXQgaW4gcmVnYXJkcyBvZiB0aGUgdmV0 aCBpbnRlcmZhY2UuCldoZW4geW91IGNvbmZpZ3VyZSBtcXByaW8sIHRoZSAiaHciIHBhcmFtZXRl ciBpcyBtYW5kYXRvcnkuIEJ5IGRlZmF1bHQsCml0IHRyaWVzIHRvIGNvbmZpZ3VyZSBpdCB3aXRo ICJodyAxIi4gSG93ZXZlciBhcyBhIHJlc3VsdCwgdmV0aCBzcGl0CmJhY2sgIkludmFsaWQgYXJn dW1lbnQiIGVycm9yIChiZWZvcmUgeW91ciBwYXRjaGVzKS4gU2FtZSBoYXBwZW5zIGFmdGVyCnRo aXMgcGF0Y2ggdG9vLCByaWdodD8KCkZvciB2ZXRoIGhhcmR3YXJlIG9mZmxvYWRpbmcgbWFrZXMg bm8gc2Vuc2UsIGJ1dCBnaXZpbmcgdGhlICJodyAwIgphcmd1bWVudCBleHBsaWNpdGx5IGFzIG1x cHJpbyBwYXJhbWV0ZXIgbWlnaHQgY291bnRlcmludHVpdGl2ZS4KCkJlc3QsCkZlcmVuYwo=