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 X-Spam-Level: X-Spam-Status: No, score=-4.1 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DE2D9C433E0 for ; Tue, 11 Aug 2020 11:21:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id AE90C20716 for ; Tue, 11 Aug 2020 11:21:42 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="HCwAvJxe" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728701AbgHKLVl (ORCPT ); Tue, 11 Aug 2020 07:21:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50112 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728550AbgHKLVj (ORCPT ); Tue, 11 Aug 2020 07:21:39 -0400 Received: from mail-lj1-x244.google.com (mail-lj1-x244.google.com [IPv6:2a00:1450:4864:20::244]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 04F38C06174A for ; Tue, 11 Aug 2020 04:21:39 -0700 (PDT) Received: by mail-lj1-x244.google.com with SMTP id t6so13074410ljk.9 for ; Tue, 11 Aug 2020 04:21:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=8Ct58qMIg0pwE2hoQADteqtstqL+kB4e2gL5OWh/wsI=; b=HCwAvJxed5Br6kXQie/OgvDJ2NQ/z31CpHC6x5m8dKFidNdgyIKv6dZnn6b9zN09or A2TQ1BI+EzXiJesGfcKPEDyjobKuOSd7nR04Ar1ric1IW5rcvSXXlpxIcIdlv1sgeKIV XHjwhjziuEyxoTHwCMIXjSIH2PTVXKVc1EVz52PodX0WMS53G4DtsltjGpbxxw8SNim7 F9z8MyWNiV/EWU/EnnNzB0u4UmXai5Pjv+fDsIcMiWVA9KiJ12b5r32shpoivo+vMqD1 el9FZcy9q60ICpNPe+TQs/fB87ug5izH9ocybaYmKdwHlR+hPkoj9ywz1lj/VnC8Epaz xluQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=8Ct58qMIg0pwE2hoQADteqtstqL+kB4e2gL5OWh/wsI=; b=GU+7vi58Wsfgj+dJnUkVN1mWlkVlNCKsAby4nMRoIQUvxphi8aesjIlHRNfEYIC542 42TDTzLSFu2UeEeJ+1cPxGn3f7prYz0NWmyFO4JMtalkspO+KVMbVJho5QQIptU1fflG MNNJf/q4ENOw40j8DqUrMctBkl1y2nwBya1A13ntixELGZDWw0ZI/9rFDQ6k2eCtS/Gs 9GCa0rDhtdL3MGKbdjtLudkwec2XF6qpgPP3aJ/MYL+BpKZ/GO8/oUC3rc9tGsM9VPlh nG84220mflXwERYjkpCldZAseX0rkLYIzFDqVUHsv8d3N6wZTNUn2A9yNV1Y0p3wmDnT W/RQ== X-Gm-Message-State: AOAM530DbdwQWgOcVPlrAOhJ+OdPvnR3KrKiLM6c4jJfgNXbvq/xxsCl NcbSaPBk0qj3sg0RJeX4fSruqC+eEFXIkohjZOU= X-Google-Smtp-Source: ABdhPJzk5Ns2umh9W9MkI6/l77QbQnjwM4eNUYg9DPae0+PlOO/EEm4ixqit0bXszbw2ZGhcAUsrRlQacJSdg/xOI5I= X-Received: by 2002:a2e:3615:: with SMTP id d21mr2884573lja.333.1597144894562; Tue, 11 Aug 2020 04:21:34 -0700 (PDT) MIME-Version: 1.0 References: <20200811033753.783276-1-daeho43@gmail.com> <20200811071552.GA8365@xiangao.remote.csb> <3059d7b0-cf50-4315-e5a9-8d9c00965a7c@huawei.com> <20200811101827.GA7870@xiangao.remote.csb> In-Reply-To: <20200811101827.GA7870@xiangao.remote.csb> From: Daeho Jeong Date: Tue, 11 Aug 2020 20:21:23 +0900 Message-ID: Subject: Re: [f2fs-dev] [PATCH] f2fs: change virtual mapping way for compression pages To: Gao Xiang Cc: Chao Yu , Daeho Jeong , kernel-team@android.com, linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Sure, I'll update the test condition as you said in the commit message. FYI, the test is done with 16kb chunk and Pixel 3 (arm64) device. Thanks, 2020=EB=85=84 8=EC=9B=94 11=EC=9D=BC (=ED=99=94) =EC=98=A4=ED=9B=84 7:18, G= ao Xiang =EB=8B=98=EC=9D=B4 =EC=9E=91=EC=84=B1: > > On Tue, Aug 11, 2020 at 06:33:26PM +0900, Daeho Jeong wrote: > > Plus, when we use vmap(), vmap() normally executes in a short time > > like vm_map_ram(). > > But, sometimes, it has a very long delay. > > > > 2020=C3=AB=E2=80=A6=E2=80=9E 8=C3=AC=E2=80=BA=E2=80=9D 11=C3=AC=EF=BF= =BD=C2=BC (=C3=AD=E2=84=A2=E2=80=9D) =C3=AC=CB=9C=C2=A4=C3=AD=E2=80=BA=E2= =80=9E 6:28, Daeho Jeong =C3=AB=E2=80=B9=CB=9C=C3=AC=EF= =BF=BD=C2=B4 =C3=AC=C5=BE=E2=80=98=C3=AC=E2=80=9E=C2=B1: > > > > > > Actually, as you can see, I use the whole zero data blocks in the tes= t file. > > > It can maximize the effect of changing virtual mapping. > > > When I use normal files which can be compressed about 70% from the > > > original file, > > > The vm_map_ram() version is about 2x faster than vmap() version. > > What f2fs does is much similar to btrfs compression. Even if these > blocks are all zeroed. In principle, the maximum compression ratio > is determined (cluster sized blocks into one compressed block, e.g > 16k cluster into one compressed block). > > So it'd be better to describe your configured cluster size (16k or > 128k) and your hardware information in the commit message as well. > > Actually, I also tried with this patch as well on my x86 laptop just > now with FIO (I didn't use zeroed block though), and I didn't notice > much difference with turbo boost off and maxfreq. > > I'm not arguing this commit, just a note about this commit message. > > > > >> 1048576000 bytes (0.9 G) copied, 9.146217 s, 109 M/s > > > > >> 1048576000 bytes (0.9 G) copied, 9.997542 s, 100 M/s > > > > >> 1048576000 bytes (0.9 G) copied, 10.109727 s, 99 M/s > > IMHO, the above number is much like decompressing in the arm64 little cor= es. > > Thanks, > Gao Xiang > > > > > > > > 2020=C3=AB=E2=80=A6=E2=80=9E 8=C3=AC=E2=80=BA=E2=80=9D 11=C3=AC=EF=BF= =BD=C2=BC (=C3=AD=E2=84=A2=E2=80=9D) =C3=AC=CB=9C=C2=A4=C3=AD=E2=80=BA=E2= =80=9E 4:55, Chao Yu =C3=AB=E2=80=B9=CB=9C=C3=AC=EF=BF= =BD=C2=B4 =C3=AC=C5=BE=E2=80=98=C3=AC=E2=80=9E=C2=B1: > > > > > > > > On 2020/8/11 15:15, Gao Xiang wrote: > > > > > On Tue, Aug 11, 2020 at 12:37:53PM +0900, Daeho Jeong wrote: > > > > >> From: Daeho Jeong > > > > >> > > > > >> By profiling f2fs compression works, I've found vmap() callings = are > > > > >> bottlenecks of f2fs decompression path. Changing these with > > > > >> vm_map_ram(), we can enhance f2fs decompression speed pretty muc= h. > > > > >> > > > > >> [Verification] > > > > >> dd if=3D/dev/zero of=3Ddummy bs=3D1m count=3D1000 > > > > >> echo 3 > /proc/sys/vm/drop_caches > > > > >> dd if=3Ddummy of=3D/dev/zero bs=3D512k > > > > >> > > > > >> - w/o compression - > > > > >> 1048576000 bytes (0.9 G) copied, 1.999384 s, 500 M/s > > > > >> 1048576000 bytes (0.9 G) copied, 2.035988 s, 491 M/s > > > > >> 1048576000 bytes (0.9 G) copied, 2.039457 s, 490 M/s > > > > >> > > > > >> - before patch - > > > > >> 1048576000 bytes (0.9 G) copied, 9.146217 s, 109 M/s > > > > >> 1048576000 bytes (0.9 G) copied, 9.997542 s, 100 M/s > > > > >> 1048576000 bytes (0.9 G) copied, 10.109727 s, 99 M/s > > > > >> > > > > >> - after patch - > > > > >> 1048576000 bytes (0.9 G) copied, 2.253441 s, 444 M/s > > > > >> 1048576000 bytes (0.9 G) copied, 2.739764 s, 365 M/s > > > > >> 1048576000 bytes (0.9 G) copied, 2.185649 s, 458 M/s > > > > > > > > > > Indeed, vmap() approach has some impact on the whole > > > > > workflow. But I don't think the gap is such significant, > > > > > maybe it relates to unlocked cpufreq (and big little > > > > > core difference if it's on some arm64 board). > > > > > > > > Agreed, > > > > > > > > I guess there should be other reason causing the large performance > > > > gap, scheduling, frequency, or something else. > > > > > > > > > > > > > > > > > > > > > > > > _______________________________________________ > > > > > Linux-f2fs-devel mailing list > > > > > Linux-f2fs-devel@lists.sourceforge.net > > > > > https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel > > > > > . > > > > > > > > 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 X-Spam-Level: X-Spam-Status: No, score=-3.8 required=3.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3F006C433E0 for ; Tue, 11 Aug 2020 11:21:47 +0000 (UTC) Received: from lists.sourceforge.net (lists.sourceforge.net [216.105.38.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 0AB9D20716; Tue, 11 Aug 2020 11:21:46 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=sourceforge.net header.i=@sourceforge.net header.b="moENT5RG"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=sf.net header.i=@sf.net header.b="m+NcFj73"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="HCwAvJxe" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0AB9D20716 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=linux-f2fs-devel-bounces@lists.sourceforge.net Received: from [127.0.0.1] (helo=sfs-ml-1.v29.lw.sourceforge.com) by sfs-ml-1.v29.lw.sourceforge.com with esmtp (Exim 4.90_1) (envelope-from ) id 1k5SLh-00007G-7f; Tue, 11 Aug 2020 11:21:45 +0000 Received: from [172.30.20.202] (helo=mx.sourceforge.net) by sfs-ml-1.v29.lw.sourceforge.com with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k5SLf-00006z-MY for linux-f2fs-devel@lists.sourceforge.net; Tue, 11 Aug 2020 11:21:43 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=Content-Transfer-Encoding:Content-Type:Cc:To: Subject:Message-ID:Date:From:In-Reply-To:References:MIME-Version:Sender: Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender :Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=8Ct58qMIg0pwE2hoQADteqtstqL+kB4e2gL5OWh/wsI=; b=moENT5RGfRA9xABs+3nfG8NyoX 4sYtP5PMdlGtd5QNY57k/fnT0FFuymS/4jRvyAUWkTIX501VtElABl+zXk354ZO4k8i4p3TOY2V39 wGDbZUm0PCQ3qBSwBWFN2OT45iq/alqUjCGXXrkB4KM7WWSNCIzxfJj/UNCRXceM5kw0=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=Content-Transfer-Encoding:Content-Type:Cc:To:Subject:Message-ID:Date:From :In-Reply-To:References:MIME-Version:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=8Ct58qMIg0pwE2hoQADteqtstqL+kB4e2gL5OWh/wsI=; b=m+NcFj73dzzmgQad8GqptMIKeV E1XpztPYA22WyRLrQ+5oS+jS0TgVanz18ElLXAgUfdoRZudc0blYFzKnY6ew727t7gnDXT/MYkPN9 dJYQLQNg7uIu+/GwJ/ASYk01uVBg4oESy7zj5V/XSblKrltVftPqZUn864aVtSMmjEho=; Received: from mail-lj1-f195.google.com ([209.85.208.195]) by sfi-mx-3.v28.lw.sourceforge.com with esmtps (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.92.2) id 1k5SLd-005OSx-Ak for linux-f2fs-devel@lists.sourceforge.net; Tue, 11 Aug 2020 11:21:43 +0000 Received: by mail-lj1-f195.google.com with SMTP id w14so13085383ljj.4 for ; Tue, 11 Aug 2020 04:21:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=8Ct58qMIg0pwE2hoQADteqtstqL+kB4e2gL5OWh/wsI=; b=HCwAvJxed5Br6kXQie/OgvDJ2NQ/z31CpHC6x5m8dKFidNdgyIKv6dZnn6b9zN09or A2TQ1BI+EzXiJesGfcKPEDyjobKuOSd7nR04Ar1ric1IW5rcvSXXlpxIcIdlv1sgeKIV XHjwhjziuEyxoTHwCMIXjSIH2PTVXKVc1EVz52PodX0WMS53G4DtsltjGpbxxw8SNim7 F9z8MyWNiV/EWU/EnnNzB0u4UmXai5Pjv+fDsIcMiWVA9KiJ12b5r32shpoivo+vMqD1 el9FZcy9q60ICpNPe+TQs/fB87ug5izH9ocybaYmKdwHlR+hPkoj9ywz1lj/VnC8Epaz xluQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=8Ct58qMIg0pwE2hoQADteqtstqL+kB4e2gL5OWh/wsI=; b=lo28rozdbZOJ+CBHmLMYr+GMSm5mK1OZ6/WrxAu7JR/jao5kod5Ac5cVhVHkS7QxwP YQ/XDg++zE6ja9il76Fwlq+EYDN0AsDdRbuN6QPqr9wKJXkU163OHaRAaeZF+Q1iX3F2 +/NmscHyYbKjqZ14IIpLHR9KugUriNW5BKaDOGuaroSSYL2Af7k4MpZwxEUu2DX/tDQk HJ2n5L6TZS3m+4GoToB6vqqSqLoiOL56MWCXFWtw2j7SWu/Kl1WC5ZHMPl40FOBCq9aE ufCOSpZ+J5bHDqizKFgzFwsEA+s0cdy6WXaXFVeImhrG5fQnnYhVUtG4rAAClPH/TYLX UXWw== X-Gm-Message-State: AOAM530bL4re1BPMmsBqgMdhu0sqLrikO/Q6DL4cYwkJymXM6ieAAdbF Vjxz7IhhiUP8jpF/l+6lXemM07/OoYJMcsNuYcLQ3l/OgrQ= X-Google-Smtp-Source: ABdhPJzk5Ns2umh9W9MkI6/l77QbQnjwM4eNUYg9DPae0+PlOO/EEm4ixqit0bXszbw2ZGhcAUsrRlQacJSdg/xOI5I= X-Received: by 2002:a2e:3615:: with SMTP id d21mr2884573lja.333.1597144894562; Tue, 11 Aug 2020 04:21:34 -0700 (PDT) MIME-Version: 1.0 References: <20200811033753.783276-1-daeho43@gmail.com> <20200811071552.GA8365@xiangao.remote.csb> <3059d7b0-cf50-4315-e5a9-8d9c00965a7c@huawei.com> <20200811101827.GA7870@xiangao.remote.csb> In-Reply-To: <20200811101827.GA7870@xiangao.remote.csb> From: Daeho Jeong Date: Tue, 11 Aug 2020 20:21:23 +0900 Message-ID: To: Gao Xiang X-Headers-End: 1k5SLd-005OSx-Ak Subject: Re: [f2fs-dev] [PATCH] f2fs: change virtual mapping way for compression pages X-BeenThere: linux-f2fs-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kernel-team@android.com, Daeho Jeong , linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net U3VyZSwgSSdsbCB1cGRhdGUgdGhlIHRlc3QgY29uZGl0aW9uIGFzIHlvdSBzYWlkIGluIHRoZSBj b21taXQgbWVzc2FnZS4KRllJLCB0aGUgdGVzdCBpcyBkb25lIHdpdGggMTZrYiBjaHVuayBhbmQg UGl4ZWwgMyAoYXJtNjQpIGRldmljZS4KClRoYW5rcywKCjIwMjDrhYQgOOyblCAxMeydvCAo7ZmU KSDsmKTtm4QgNzoxOCwgR2FvIFhpYW5nIDxoc2lhbmdrYW9AcmVkaGF0LmNvbT7ri5jsnbQg7J6R 7ISxOgo+Cj4gT24gVHVlLCBBdWcgMTEsIDIwMjAgYXQgMDY6MzM6MjZQTSArMDkwMCwgRGFlaG8g SmVvbmcgd3JvdGU6Cj4gPiBQbHVzLCB3aGVuIHdlIHVzZSB2bWFwKCksIHZtYXAoKSBub3JtYWxs eSBleGVjdXRlcyBpbiBhIHNob3J0IHRpbWUKPiA+IGxpa2Ugdm1fbWFwX3JhbSgpLgo+ID4gQnV0 LCBzb21ldGltZXMsIGl0IGhhcyBhIHZlcnkgbG9uZyBkZWxheS4KPiA+Cj4gPiAyMDIww6vigKbi gJ4gOMOs4oC64oCdIDExw6zvv73CvCAow63ihKLigJ0pIMOsy5zCpMOt4oC64oCeIDY6MjgsIERh ZWhvIEplb25nIDxkYWVobzQzQGdtYWlsLmNvbT7Dq+KAucucw6zvv73CtCDDrMW+4oCYw6zigJ7C sToKPiA+ID4KPiA+ID4gQWN0dWFsbHksIGFzIHlvdSBjYW4gc2VlLCBJIHVzZSB0aGUgd2hvbGUg emVybyBkYXRhIGJsb2NrcyBpbiB0aGUgdGVzdCBmaWxlLgo+ID4gPiBJdCBjYW4gbWF4aW1pemUg dGhlIGVmZmVjdCBvZiBjaGFuZ2luZyB2aXJ0dWFsIG1hcHBpbmcuCj4gPiA+IFdoZW4gSSB1c2Ug bm9ybWFsIGZpbGVzIHdoaWNoIGNhbiBiZSBjb21wcmVzc2VkIGFib3V0IDcwJSBmcm9tIHRoZQo+ ID4gPiBvcmlnaW5hbCBmaWxlLAo+ID4gPiBUaGUgdm1fbWFwX3JhbSgpIHZlcnNpb24gaXMgYWJv dXQgMnggZmFzdGVyIHRoYW4gdm1hcCgpIHZlcnNpb24uCj4KPiBXaGF0IGYyZnMgZG9lcyBpcyBt dWNoIHNpbWlsYXIgdG8gYnRyZnMgY29tcHJlc3Npb24uIEV2ZW4gaWYgdGhlc2UKPiBibG9ja3Mg YXJlIGFsbCB6ZXJvZWQuIEluIHByaW5jaXBsZSwgdGhlIG1heGltdW0gY29tcHJlc3Npb24gcmF0 aW8KPiBpcyBkZXRlcm1pbmVkIChjbHVzdGVyIHNpemVkIGJsb2NrcyBpbnRvIG9uZSBjb21wcmVz c2VkIGJsb2NrLCBlLmcKPiAxNmsgY2x1c3RlciBpbnRvIG9uZSBjb21wcmVzc2VkIGJsb2NrKS4K Pgo+IFNvIGl0J2QgYmUgYmV0dGVyIHRvIGRlc2NyaWJlIHlvdXIgY29uZmlndXJlZCBjbHVzdGVy IHNpemUgKDE2ayBvcgo+IDEyOGspIGFuZCB5b3VyIGhhcmR3YXJlIGluZm9ybWF0aW9uIGluIHRo ZSBjb21taXQgbWVzc2FnZSBhcyB3ZWxsLgo+Cj4gQWN0dWFsbHksIEkgYWxzbyB0cmllZCB3aXRo IHRoaXMgcGF0Y2ggYXMgd2VsbCBvbiBteSB4ODYgbGFwdG9wIGp1c3QKPiBub3cgd2l0aCBGSU8g KEkgZGlkbid0IHVzZSB6ZXJvZWQgYmxvY2sgdGhvdWdoKSwgYW5kIEkgZGlkbid0IG5vdGljZQo+ IG11Y2ggZGlmZmVyZW5jZSB3aXRoIHR1cmJvIGJvb3N0IG9mZiBhbmQgbWF4ZnJlcS4KPgo+IEkn bSBub3QgYXJndWluZyB0aGlzIGNvbW1pdCwganVzdCBhIG5vdGUgYWJvdXQgdGhpcyBjb21taXQg bWVzc2FnZS4KPiA+ID4gPiA+PiAxMDQ4NTc2MDAwIGJ5dGVzICgwLjkgRykgY29waWVkLCA5LjE0 NjIxNyBzLCAxMDkgTS9zCj4gPiA+ID4gPj4gMTA0ODU3NjAwMCBieXRlcyAoMC45IEcpIGNvcGll ZCwgOS45OTc1NDIgcywgMTAwIE0vcwo+ID4gPiA+ID4+IDEwNDg1NzYwMDAgYnl0ZXMgKDAuOSBH KSBjb3BpZWQsIDEwLjEwOTcyNyBzLCA5OSBNL3MKPgo+IElNSE8sIHRoZSBhYm92ZSBudW1iZXIg aXMgbXVjaCBsaWtlIGRlY29tcHJlc3NpbmcgaW4gdGhlIGFybTY0IGxpdHRsZSBjb3Jlcy4KPgo+ IFRoYW5rcywKPiBHYW8gWGlhbmcKPgo+Cj4gPiA+Cj4gPiA+IDIwMjDDq+KApuKAniA4w6zigLri gJ0gMTHDrO+/vcK8ICjDreKEouKAnSkgw6zLnMKkw63igLrigJ4gNDo1NSwgQ2hhbyBZdSA8eXVj aGFvMEBodWF3ZWkuY29tPsOr4oC5y5zDrO+/vcK0IMOsxb7igJjDrOKAnsKxOgo+ID4gPiA+Cj4g PiA+ID4gT24gMjAyMC84LzExIDE1OjE1LCBHYW8gWGlhbmcgd3JvdGU6Cj4gPiA+ID4gPiBPbiBU dWUsIEF1ZyAxMSwgMjAyMCBhdCAxMjozNzo1M1BNICswOTAwLCBEYWVobyBKZW9uZyB3cm90ZToK PiA+ID4gPiA+PiBGcm9tOiBEYWVobyBKZW9uZyA8ZGFlaG9qZW9uZ0Bnb29nbGUuY29tPgo+ID4g PiA+ID4+Cj4gPiA+ID4gPj4gQnkgcHJvZmlsaW5nIGYyZnMgY29tcHJlc3Npb24gd29ya3MsIEkn dmUgZm91bmQgdm1hcCgpIGNhbGxpbmdzIGFyZQo+ID4gPiA+ID4+IGJvdHRsZW5lY2tzIG9mIGYy ZnMgZGVjb21wcmVzc2lvbiBwYXRoLiBDaGFuZ2luZyB0aGVzZSB3aXRoCj4gPiA+ID4gPj4gdm1f bWFwX3JhbSgpLCB3ZSBjYW4gZW5oYW5jZSBmMmZzIGRlY29tcHJlc3Npb24gc3BlZWQgcHJldHR5 IG11Y2guCj4gPiA+ID4gPj4KPiA+ID4gPiA+PiBbVmVyaWZpY2F0aW9uXQo+ID4gPiA+ID4+IGRk IGlmPS9kZXYvemVybyBvZj1kdW1teSBicz0xbSBjb3VudD0xMDAwCj4gPiA+ID4gPj4gZWNobyAz ID4gL3Byb2Mvc3lzL3ZtL2Ryb3BfY2FjaGVzCj4gPiA+ID4gPj4gZGQgaWY9ZHVtbXkgb2Y9L2Rl di96ZXJvIGJzPTUxMmsKPiA+ID4gPiA+Pgo+ID4gPiA+ID4+IC0gdy9vIGNvbXByZXNzaW9uIC0K PiA+ID4gPiA+PiAxMDQ4NTc2MDAwIGJ5dGVzICgwLjkgRykgY29waWVkLCAxLjk5OTM4NCBzLCA1 MDAgTS9zCj4gPiA+ID4gPj4gMTA0ODU3NjAwMCBieXRlcyAoMC45IEcpIGNvcGllZCwgMi4wMzU5 ODggcywgNDkxIE0vcwo+ID4gPiA+ID4+IDEwNDg1NzYwMDAgYnl0ZXMgKDAuOSBHKSBjb3BpZWQs IDIuMDM5NDU3IHMsIDQ5MCBNL3MKPiA+ID4gPiA+Pgo+ID4gPiA+ID4+IC0gYmVmb3JlIHBhdGNo IC0KPiA+ID4gPiA+PiAxMDQ4NTc2MDAwIGJ5dGVzICgwLjkgRykgY29waWVkLCA5LjE0NjIxNyBz LCAxMDkgTS9zCj4gPiA+ID4gPj4gMTA0ODU3NjAwMCBieXRlcyAoMC45IEcpIGNvcGllZCwgOS45 OTc1NDIgcywgMTAwIE0vcwo+ID4gPiA+ID4+IDEwNDg1NzYwMDAgYnl0ZXMgKDAuOSBHKSBjb3Bp ZWQsIDEwLjEwOTcyNyBzLCA5OSBNL3MKPiA+ID4gPiA+Pgo+ID4gPiA+ID4+IC0gYWZ0ZXIgcGF0 Y2ggLQo+ID4gPiA+ID4+IDEwNDg1NzYwMDAgYnl0ZXMgKDAuOSBHKSBjb3BpZWQsIDIuMjUzNDQx IHMsIDQ0NCBNL3MKPiA+ID4gPiA+PiAxMDQ4NTc2MDAwIGJ5dGVzICgwLjkgRykgY29waWVkLCAy LjczOTc2NCBzLCAzNjUgTS9zCj4gPiA+ID4gPj4gMTA0ODU3NjAwMCBieXRlcyAoMC45IEcpIGNv cGllZCwgMi4xODU2NDkgcywgNDU4IE0vcwo+ID4gPiA+ID4KPiA+ID4gPiA+IEluZGVlZCwgdm1h cCgpIGFwcHJvYWNoIGhhcyBzb21lIGltcGFjdCBvbiB0aGUgd2hvbGUKPiA+ID4gPiA+IHdvcmtm bG93LiBCdXQgSSBkb24ndCB0aGluayB0aGUgZ2FwIGlzIHN1Y2ggc2lnbmlmaWNhbnQsCj4gPiA+ ID4gPiBtYXliZSBpdCByZWxhdGVzIHRvIHVubG9ja2VkIGNwdWZyZXEgKGFuZCBiaWcgbGl0dGxl Cj4gPiA+ID4gPiBjb3JlIGRpZmZlcmVuY2UgaWYgaXQncyBvbiBzb21lIGFybTY0IGJvYXJkKS4K PiA+ID4gPgo+ID4gPiA+IEFncmVlZCwKPiA+ID4gPgo+ID4gPiA+IEkgZ3Vlc3MgdGhlcmUgc2hv dWxkIGJlIG90aGVyIHJlYXNvbiBjYXVzaW5nIHRoZSBsYXJnZSBwZXJmb3JtYW5jZQo+ID4gPiA+ IGdhcCwgc2NoZWR1bGluZywgZnJlcXVlbmN5LCBvciBzb21ldGhpbmcgZWxzZS4KPiA+ID4gPgo+ ID4gPiA+ID4KPiA+ID4gPiA+Cj4gPiA+ID4gPgo+ID4gPiA+ID4gX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiA+ID4gPiA+IExpbnV4LWYyZnMtZGV2ZWwg bWFpbGluZyBsaXN0Cj4gPiA+ID4gPiBMaW51eC1mMmZzLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdl Lm5ldAo+ID4gPiA+ID4gaHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGlu Zm8vbGludXgtZjJmcy1kZXZlbAo+ID4gPiA+ID4gLgo+ID4gPiA+ID4KPiA+Cj4KCgpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eC1mMmZzLWRldmVs IG1haWxpbmcgbGlzdApMaW51eC1mMmZzLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldApodHRw czovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9saW51eC1mMmZzLWRldmVs Cg==