From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id AD8E2A04FD for ; Fri, 29 Jul 2022 14:09:14 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id A0D8E4069C; Fri, 29 Jul 2022 14:09:14 +0200 (CEST) Received: from mail-vs1-f49.google.com (mail-vs1-f49.google.com [209.85.217.49]) by mails.dpdk.org (Postfix) with ESMTP id 9CA2E4069C for ; Fri, 29 Jul 2022 14:09:13 +0200 (CEST) Received: by mail-vs1-f49.google.com with SMTP id 125so4316215vsx.7 for ; Fri, 29 Jul 2022 05:09:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc; bh=DSPfrLv3RtQ1KzWuQvQNJtD19FTgerpWyo5SuPQ/p7o=; b=NtOSTfiszguu/2IOMCu892cDgCMaOnoHlZY7tZFzf2ylsesfcTPQzh6nTiUZltcG0z 7mwgZGIVDcDxuJZv5QGlfpZDzuEo/w2OvlOOIClXXIAwYj82V3wOckglq4SVZ9pqm4fr Xbp1ij3G4Y5/MadIWvYGCk5yNVJm49j8lpj9Kfpe7bKOIdT3U4zIL9PSHTxytlUGD/l4 8WzKg5DBR4zuIRJ6Wbin/1/OIKuCBxQRVvuJUeH6gdM2swmQ1H1iehB6wxeSH7QBUemo 54M7Yi5qNdAnkpTa/RWIvmU65loHsIq9LBgvlYDxzvkaY3/V2b9clexIS2T2hp5JMUEk KElg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :x-gm-message-state:from:to:cc; bh=DSPfrLv3RtQ1KzWuQvQNJtD19FTgerpWyo5SuPQ/p7o=; b=pdWFi7axzIcuak8CSHMTwg3vOo+QaWEMMFUek3uewbGImlUAjpcgI2ittrTSPj+MCK vsKd9PyQriq2Byfn2UB6YOfdT7RV1r0pxLGzk2hHJ5tIJ1G8x3aSahnGiDYR4olwLkcZ xDndn/uFPABsqjgY+Cdy0Q1Amh0z3OtF64HmtfgBSqJaQVvHQUKTV7/SDPqzjqrrsKVu qaZriZ9UzPNqLSrjfeoED0nNdGBNDDUAN+eFMy+rPeNxCDys4IidM8AbPKDOB/eT+1hR XoL7NHY+0xZhuZxxsijuD0yxSQrsUstYn9byMBQfunu2FR66Di/TeZm0CHF0ZEYb9stG o/qQ== X-Gm-Message-State: AJIora9Uf8SgDQ6J8RxGWjhCv/AZtobs8hL+Y2znTsoR6fsMeSXUE+TQ z/lCTD5zgI3RFLFuabYit7dL2lspozc7aehtbrRGeOpaw8A= X-Google-Smtp-Source: AGRyM1uD0zWJm21X0LevrdGh99yYcBQDKqBrZqU97mEvIyfmgEngLeihvFVp/f3yM4+M3son12cVxs7Wr/aJrt5mWic= X-Received: by 2002:a67:e056:0:b0:358:596e:3bf8 with SMTP id n22-20020a67e056000000b00358596e3bf8mr1062025vsl.73.1659096552820; Fri, 29 Jul 2022 05:09:12 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Pavel Vazharov Date: Fri, 29 Jul 2022 15:08:59 +0300 Message-ID: Subject: Re: Question about rte_flow_validate and DPDK igb driver To: users Content-Type: multipart/alternative; boundary="000000000000add57005e4f0847a" X-BeenThere: users@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK usage discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: users-bounces@dpdk.org --000000000000add57005e4f0847a Content-Type: text/plain; charset="UTF-8" I should have checked the driver code more thoroughly before asking questions here. >From drivers/net/e1000/igb_ethdev.c (ntuple_filter_to_2tuple) seems that only filtering by the dst_port and the proto is supported by this driver. And so the check from the previous question is perfectly correct. switch (filter->dst_port_mask) { case UINT16_MAX: filter_info->dst_port_mask = 0; filter_info->dst_port = filter->dst_port; break; case 0: filter_info->dst_port_mask = 1; break; default: PMD_DRV_LOG(ERR, "invalid dst_port mask."); return -EINVAL; } switch (filter->proto_mask) { case UINT8_MAX: filter_info->proto_mask = 0; filter_info->proto = filter->proto; break; case 0: filter_info->proto_mask = 1; break; default: PMD_DRV_LOG(ERR, "invalid protocol mask."); return -EINVAL; } On Fri, Jul 29, 2022 at 1:59 PM Pavel Vazharov wrote: > Hi there, > > I'm trying to distribute among the Rx queues flows of TCP packets based on > their destination IPv4 address and source TCP port. I'm using the rte_flow > DPDK API for this purpose. I'm using DPDK 20.11.0. The setup is successful > when the application is started on a server with i40e driver but fails when > the application is started on a server using igb driver. > In the failure case the validation function returns EINVAL and the error > message is "only two tuple are supported by this filter". > I checked the source code of this DPDK driver in > drivers/net/e1000/igb_flow.c and I saw the following related code there, > starting at line 449: > > if (filter->src_ip_mask || filter->dst_ip_mask || > > filter->src_port_mask) { > > memset(filter, 0, sizeof(struct rte_eth_ntuple_filter)); > > rte_flow_error_set(error, EINVAL, > > RTE_FLOW_ERROR_TYPE_ITEM, > > NULL, "only two tuple are " > > "supported by this filter"); > > return -rte_errno; > > } > > The condition looks odd to me because it seems to ensure that only > filtering by destination port is supported while the error message hints > for something else. Why would filtering only by the destination port be > allowed!? > I've provided dst_ip_mask = 0xFFFFFFFF and src_port_mask 0xFFFF because I > just want to match exact ips and ports and in my understanding this should > classify, in my understanding, as filtering by "two tuple" - destination ip > and source port. > > So, my questions are: > 1. Am I missing something about this condition and thus it's the way it > should be? > 2. If the question is not appropriate for this user group where should I > post it - dev@dpdk.org? > > Thanks, > Pavel. > --000000000000add57005e4f0847a Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdj48ZGl2Pkkgc2hvdWxkIGhhdmUgY2hlY2tlZCB0aGUgZHJpdmVy IGNvZGUgbW9yZSB0aG9yb3VnaGx5IGJlZm9yZSBhc2tpbmcgcXVlc3Rpb25zIGhlcmUuPGJyPjwv ZGl2PkZyb20gZHJpdmVycy9uZXQvZTEwMDAvaWdiX2V0aGRldi5jIChudHVwbGVfZmlsdGVyX3Rv XzJ0dXBsZSkgc2VlbXMgdGhhdCBvbmx5IGZpbHRlcmluZyBieSB0aGUgZHN0X3BvcnQgYW5kIHRo ZSBwcm90byBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuIEFuZCBzbyB0aGUgY2hlY2sgZnJv bSB0aGUgcHJldmlvdXMgcXVlc3Rpb24gaXMgcGVyZmVjdGx5IGNvcnJlY3QuPGJyPjxicj7CoCDC oCBzd2l0Y2ggKGZpbHRlci0mZ3Q7ZHN0X3BvcnRfbWFzaykgeyDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDxicj7CoCDCoCBj YXNlIFVJTlQxNl9NQVg6IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPGJyPsKgIMKg IMKgIMKgIGZpbHRlcl9pbmZvLSZndDtkc3RfcG9ydF9tYXNrID0gMDsgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgPGJyPsKgIMKgIMKg IMKgIGZpbHRlcl9pbmZvLSZndDtkc3RfcG9ydCA9IGZpbHRlci0mZ3Q7ZHN0X3BvcnQ7IMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDxicj7CoCDCoCDCoCDCoCBi cmVhazsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA8YnI+wqAgwqAg Y2FzZSAwOiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA8YnI+ wqAgwqAgwqAgwqAgZmlsdGVyX2luZm8tJmd0O2RzdF9wb3J0X21hc2sgPSAxOyDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA8YnI+wqAg wqAgwqAgwqAgYnJlYWs7IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg PGJyPsKgIMKgIGRlZmF1bHQ6IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgPGJyPsKgIMKgIMKgIMKgIFBNRF9EUlZfTE9HKEVSUiwgJnF1b3Q7aW52YWxpZCBkc3Rf cG9ydCBtYXNrLiZxdW90Oyk7IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIDxicj7CoCDCoCDCoCDCoCByZXR1cm4gLUVJTlZBTDsgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgPGJyPsKgIMKgIH0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDxicj7CoCDCoCBzd2l0Y2ggKGZpbHRlci0mZ3Q7cHJv dG9fbWFzaykgeyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA8YnI+wqAgwqAgY2FzZSBVSU5UOF9NQVg6IMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDxicj7CoCDCoCDCoCDCoCBmaWx0ZXJfaW5mby0mZ3Q7 cHJvdG9fbWFzayA9IDA7IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPGJyPsKgIMKgIMKgIMKgIGZpbHRlcl9pbmZvLSZndDtw cm90byA9IGZpbHRlci0mZ3Q7cHJvdG87IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIDxicj7CoCDCoCDCoCDCoCBicmVhazsgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA8YnI+wqAgwqAgY2FzZSAwOiDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA8YnI+wqAgwqAgwqAgwqAgZmlsdGVy X2luZm8tJmd0O3Byb3RvX21hc2sgPSAxOyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDxicj7CoCDCoCDCoCDCoCBicmVhazsg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA8YnI+wqAgwqAgZGVmYXVs dDogwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA8YnI+wqAgwqAg wqAgwqAgUE1EX0RSVl9MT0coRVJSLCAmcXVvdDtpbnZhbGlkIHByb3RvY29sIG1hc2suJnF1b3Q7 KTsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgPGJyPsKgIMKgIMKg IMKgIHJldHVybiAtRUlOVkFMOyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA8YnI+wqAgwqAg fTxicj48L2Rpdj48L2Rpdj48YnI+PGRpdiBjbGFzcz0iZ21haWxfcXVvdGUiPjxkaXYgZGlyPSJs dHIiIGNsYXNzPSJnbWFpbF9hdHRyIj5PbiBGcmksIEp1bCAyOSwgMjAyMiBhdCAxOjU5IFBNIFBh dmVsIFZhemhhcm92ICZsdDs8YSBocmVmPSJtYWlsdG86ZnJlYWtwdkBnbWFpbC5jb20iPmZyZWFr cHZAZ21haWwuY29tPC9hPiZndDsgd3JvdGU6PGJyPjwvZGl2PjxibG9ja3F1b3RlIGNsYXNzPSJn bWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowcHggMHB4IDBweCAwLjhleDtib3JkZXItbGVmdDox cHggc29saWQgcmdiKDIwNCwyMDQsMjA0KTtwYWRkaW5nLWxlZnQ6MWV4Ij48ZGl2IGRpcj0ibHRy Ij48ZGl2PjxkaXY+SGkgdGhlcmUsPGJyPjxicj48L2Rpdj48ZGl2PkkmIzM5O20gdHJ5aW5nIHRv IGRpc3RyaWJ1dGUgYW1vbmcgdGhlIFJ4IHF1ZXVlcyBmbG93cyBvZiBUQ1AgcGFja2V0cyBiYXNl ZCBvbiB0aGVpciBkZXN0aW5hdGlvbiBJUHY0IGFkZHJlc3MgYW5kIHNvdXJjZSBUQ1AgcG9ydC4g SSYjMzk7bSB1c2luZyB0aGUgcnRlX2Zsb3cgRFBESyBBUEkgZm9yIHRoaXMgcHVycG9zZS4gSSYj Mzk7bSB1c2luZyBEUERLIDIwLjExLjAuIFRoZSBzZXR1cCBpcyBzdWNjZXNzZnVsIHdoZW4gdGhl IGFwcGxpY2F0aW9uIGlzIHN0YXJ0ZWQgb24gYSBzZXJ2ZXIgd2l0aCBpNDBlIGRyaXZlciBidXQg ZmFpbHMgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgc3RhcnRlZCBvbiBhIHNlcnZlciB1c2luZyBp Z2IgZHJpdmVyLjxicj48L2Rpdj48ZGl2PkluIHRoZSBmYWlsdXJlIGNhc2UgdGhlIHZhbGlkYXRp b24gZnVuY3Rpb24gcmV0dXJucyBFSU5WQUwgYW5kIHRoZSBlcnJvciBtZXNzYWdlIGlzICZxdW90 O29ubHkgdHdvIHR1cGxlIGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBmaWx0ZXImcXVvdDsuIDxicj5J IGNoZWNrZWQgdGhlIHNvdXJjZSBjb2RlIG9mIHRoaXMgRFBESyBkcml2ZXIgaW4gZHJpdmVycy9u ZXQvZTEwMDAvaWdiX2Zsb3cuYyBhbmQgSSBzYXcgdGhlIGZvbGxvd2luZyByZWxhdGVkIGNvZGUg dGhlcmUsIHN0YXJ0aW5nIGF0IGxpbmUgNDQ5Ojxicj48YnI+wqAgwqAgwqAgwqAgaWYgKGZpbHRl ci0mZ3Q7c3JjX2lwX21hc2sgfHwgZmlsdGVyLSZndDtkc3RfaXBfbWFzayB8fCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA8YnI+wqAgwqAgwqAgwqAgwqAgwqAgZmlsdGVyLSZndDtz cmNfcG9ydF9tYXNrKSB7IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPGJyPsKgIMKgIMKgIMKgIMKgIMKgIG1lbXNldChmaWx0 ZXIsIDAsIHNpemVvZihzdHJ1Y3QgcnRlX2V0aF9udHVwbGVfZmlsdGVyKSk7IMKgIMKgIMKgIMKg IMKgIMKgPGJyPsKgIMKgIMKgIMKgIMKgIMKgIHJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRUlO VkFMLCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA8 YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgUlRFX0ZMT1dfRVJST1JfVFlQRV9JVEVNLCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA8YnI+ wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgTlVMTCwgJnF1b3Q7b25seSB0d28gdHVwbGUgYXJlICZx dW90OyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCA8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgJnF1b3Q7c3VwcG9ydGVkIGJ5IHRoaXMgZmls dGVyJnF1b3Q7KTsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqA8YnI+wqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJuIC1ydGVfZXJybm87IMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgPGJyPsKgIMKgIMKgIMKgIH08YnI+PGJyPjwvZGl2PjxkaXY+VGhlIGNvbmRpdGlv biBsb29rcyBvZGQgdG8gbWUgYmVjYXVzZSBpdCBzZWVtcyB0byBlbnN1cmUgdGhhdCBvbmx5IGZp bHRlcmluZyBieSBkZXN0aW5hdGlvbiBwb3J0IGlzIHN1cHBvcnRlZCB3aGlsZSB0aGUgZXJyb3Ig bWVzc2FnZSBoaW50cyBmb3Igc29tZXRoaW5nIGVsc2UuIFdoeSB3b3VsZCBmaWx0ZXJpbmcgb25s eSBieSB0aGUgZGVzdGluYXRpb24gcG9ydCBiZSBhbGxvd2VkIT88YnI+SSYjMzk7dmUgcHJvdmlk ZWQgZHN0X2lwX21hc2sgPSAweEZGRkZGRkZGIGFuZCBzcmNfcG9ydF9tYXNrIDB4RkZGRiBiZWNh dXNlIEkganVzdCB3YW50IHRvIG1hdGNoIGV4YWN0IGlwcyBhbmQgcG9ydHMgYW5kIGluIG15IHVu ZGVyc3RhbmRpbmcgdGhpcyBzaG91bGQgY2xhc3NpZnksIGluIG15IHVuZGVyc3RhbmRpbmcsIGFz IGZpbHRlcmluZyBieSAmcXVvdDt0d28gdHVwbGUmcXVvdDsgLSBkZXN0aW5hdGlvbiBpcCBhbmQg c291cmNlIHBvcnQuPGJyPjxicj48L2Rpdj48ZGl2PlNvLCBteSBxdWVzdGlvbnMgYXJlOjxicj48 L2Rpdj48ZGl2PjEuIEFtIEkgbWlzc2luZyBzb21ldGhpbmcgYWJvdXQgdGhpcyBjb25kaXRpb24g YW5kIHRodXMgaXQmIzM5O3MgdGhlIHdheSBpdCBzaG91bGQgYmU/PGJyPjwvZGl2PjxkaXY+Mi4g SWYgdGhlIHF1ZXN0aW9uIGlzIG5vdCBhcHByb3ByaWF0ZSBmb3IgdGhpcyB1c2VyIGdyb3VwIHdo ZXJlIHNob3VsZCBJIHBvc3QgaXQgLSA8YSBocmVmPSJtYWlsdG86ZGV2QGRwZGsub3JnIiB0YXJn ZXQ9Il9ibGFuayI+ZGV2QGRwZGsub3JnPC9hPj88YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+VGhh bmtzLDxicj48L2Rpdj5QYXZlbC48YnI+PC9kaXY+DQo8L2Jsb2NrcXVvdGU+PC9kaXY+DQo= --000000000000add57005e4f0847a--