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=-14.9 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 autolearn=unavailable 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 809AAC47096 for ; Fri, 4 Jun 2021 02:31:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 603EA613F1 for ; Fri, 4 Jun 2021 02:31:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230004AbhFDCdX (ORCPT ); Thu, 3 Jun 2021 22:33:23 -0400 Received: from mail-pg1-f173.google.com ([209.85.215.173]:42784 "EHLO mail-pg1-f173.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229697AbhFDCdW (ORCPT ); Thu, 3 Jun 2021 22:33:22 -0400 Received: by mail-pg1-f173.google.com with SMTP id i34so247398pgl.9; Thu, 03 Jun 2021 19:31:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=8T0GZ0hbtkJl5Ufn6AUfxWOpdfrP5DhV8NMmZD9Hw6I=; b=EdrpNETDWLrgRnUcSM2V4PFykyWkS0kZU+XB85UO7cGaoBM6MDTURWy0FHl7hWR2a7 BMMlN9kUGK0DHRHl1BLwRAsXEgSx/3ZVrAvkcFtceUEB2ZYxFG2t3+mXmvMMT5fAqhy2 bhh1+90WgTHEYBpZKjeDDnUMW+uLYzQ5B44YizCcaBJoIfVimcfhBK4xU+JohIv/s0Yk 6E45DHc5wh7zGeh7l9H4FJKoInzW81vABrS0TA8sPlQCCoaFhfviySUKQbZB1/ApTve1 PayCr5TEiYQmkBOwJ4KWjimXoHX8IAmsdNQvfkIXLNFj8owziMf+4B7Tvm/s/drGa1ko Mzkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=8T0GZ0hbtkJl5Ufn6AUfxWOpdfrP5DhV8NMmZD9Hw6I=; b=B/DRBkeh5l5AjQO1svGnwYDQbpnKNlX0PnO1200e/vjGiAgFb61ykRyyqc3Ra2gYum iH8Kz0fRcV94NJOxNmFdW3ft2LGciZP4+mBpJnBIS/nZdqK9fiSyXCRfrNFceUskIYYy YpiOT5LLj6KLeLUfnivNK1n8KyYTCgh/vmUAzFD9LPWsMwEd+8/AHM35mkSDc3ksJCNp e0jv4o71Jq+wRQpNFXa0HU1/xTL9DuBPg7ckYvYtX2BcOkmmu+DeO20fG1BpIC7c7Pqp cW0CyuzkNI76uEsHH5Y9JVpBS1UGwxFLUhPBmdRA6PdJOVxCkH2FpeSlHzHBSDzCWK2B LkAg== X-Gm-Message-State: AOAM530YKfmOciTMqP8man5ob1g5UlPNej/YizP2lQqRRhyWW1GtoXCF 9JRcrJsVUz7ICzN/0Cn2vV4pBSoeuZumI2xh X-Google-Smtp-Source: ABdhPJxtRgbmWKdcvFEOCYLlrP4pFg6j0i4JI3PO7y2an9bUc85aM6ikYgZhNRLD26Y+SKpX7RkxSA== X-Received: by 2002:a63:4b43:: with SMTP id k3mr2554850pgl.450.1622773821231; Thu, 03 Jun 2021 19:30:21 -0700 (PDT) Received: from [172.28.99.179] ([119.28.155.243]) by smtp.gmail.com with ESMTPSA id c17sm371171pgm.3.2021.06.03.19.30.05 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 03 Jun 2021 19:30:20 -0700 (PDT) Subject: Re: [PATCH] [v5] docs/zh_CN: add translations in zh_CN/dev-tools/kasan To: Wan Jiabing , Alex Shi , Jonathan Corbet , Paul Walmsley , Palmer Dabbelt , Albert Ou , Nathan Chancellor , Nick Desaulniers , Wu XiangCheng , Fangrui Song , Bernard Zhao , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, clang-built-linux@googlegroups.com Cc: kael_w@yeah.net References: <20210603141127.101689-1-wanjiabing@vivo.com> From: Alex Shi Message-ID: <5c1eeafc-d3bc-cbe9-e304-c1d62a8cc7f8@gmail.com> Date: Fri, 4 Jun 2021 10:30:00 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.8.1 MIME-Version: 1.0 In-Reply-To: <20210603141127.101689-1-wanjiabing@vivo.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Reviewed-by: Alex Shi On 6/3/21 10:11 PM, Wan Jiabing wrote: > Add new zh translations > * zh_CN/dev-tools/kasan.rst > and link it to zh_CN/dev-tools/index.rst > > Reviewed-by: Fangrui Song > Signed-off-by: Wan Jiabing > --- > Changelog: > v5: > - Fix some aligns below titles. > v4: > - Fix a space missing. > v3: > - Fix aligns and inaccurate translation. > v2: > - Delete spaces surround with English words. > --- > .../translations/zh_CN/dev-tools/index.rst | 2 +- > .../translations/zh_CN/dev-tools/kasan.rst | 417 ++++++++++++++++++ > 2 files changed, 418 insertions(+), 1 deletion(-) > create mode 100644 Documentation/translations/zh_CN/dev-tools/kasan.rst > > diff --git a/Documentation/translations/zh_CN/dev-tools/index.rst b/Documentation/translations/zh_CN/dev-tools/index.rst > index fd73c479917b..e6c99f2f543f 100644 > --- a/Documentation/translations/zh_CN/dev-tools/index.rst > +++ b/Documentation/translations/zh_CN/dev-tools/index.rst > @@ -19,13 +19,13 @@ > :maxdepth: 2 > > gcov > + kasan > > Todolist: > > - coccinelle > - sparse > - kcov > - - kasan > - ubsan > - kmemleak > - kcsan > diff --git a/Documentation/translations/zh_CN/dev-tools/kasan.rst b/Documentation/translations/zh_CN/dev-tools/kasan.rst > new file mode 100644 > index 000000000000..23db9d419047 > --- /dev/null > +++ b/Documentation/translations/zh_CN/dev-tools/kasan.rst > @@ -0,0 +1,417 @@ > +.. SPDX-License-Identifier: GPL-2.0 > + > +.. include:: ../disclaimer-zh_CN.rst > + > +:Original: Documentation/dev-tools/kasan.rst > +:Translator: 万家兵 Wan Jiabing > + > +内核地址消毒剂(KASAN) > +===================== > + > +概述 > +---- > + > +KernelAddressSANitizer(KASAN)是一种动态内存安全错误检测工具,主要功能是 > +检查内存越界访问和使用已释放内存的问题。KASAN有三种模式: > + > +1. 通用KASAN(与用户空间的ASan类似) > +2. 基于软件标签的KASAN(与用户空间的HWASan类似) > +3. 基于硬件标签的KASAN(基于硬件内存标签) > + > +由于通用KASAN的内存开销较大,通用KASAN主要用于调试。基于软件标签的KASAN > +可用于dogfood测试,因为它具有较低的内存开销,并允许将其用于实际工作量。 > +基于硬件标签的KASAN具有较低的内存和性能开销,因此可用于生产。同时可用于 > +检测现场内存问题或作为安全缓解措施。 > + > +软件KASAN模式(#1和#2)使用编译时工具在每次内存访问之前插入有效性检查, > +因此需要一个支持它的编译器版本。 > + > +通用KASAN在GCC和Clang受支持。GCC需要8.3.0或更高版本。任何受支持的Clang > +版本都是兼容的,但从Clang 11才开始支持检测全局变量的越界访问。 > + > +基于软件标签的KASAN模式仅在Clang中受支持。 > + > +硬件KASAN模式(#3)依赖硬件来执行检查,但仍需要支持内存标签指令的编译器 > +版本。GCC 10+和Clang 11+支持此模式。 > + > +两种软件KASAN模式都适用于SLUB和SLAB内存分配器,而基于硬件标签的KASAN目前 > +仅支持SLUB。 > + > +目前x86_64、arm、arm64、xtensa、s390、riscv架构支持通用KASAN模式,仅 > +arm64架构支持基于标签的KASAN模式。 > + > +用法 > +---- > + > +要启用KASAN,请使用以下命令配置内核:: > + > + CONFIG_KASAN=y > + > +同时在 ``CONFIG_KASAN_GENERIC`` (启用通用KASAN模式), ``CONFIG_KASAN_SW_TAGS`` > +(启用基于硬件标签的KASAN模式),和 ``CONFIG_KASAN_HW_TAGS`` (启用基于硬件标签 > +的KASAN模式)之间进行选择。 > + > +对于软件模式,还可以在 ``CONFIG_KASAN_OUTLINE`` 和 ``CONFIG_KASAN_INLINE`` > +之间进行选择。outline和inline是编译器插桩类型。前者产生较小的二进制文件, > +而后者快1.1-2倍。 > + > +要将受影响的slab对象的alloc和free堆栈跟踪包含到报告中,请启用 > +``CONFIG_STACKTRACE`` 。要包括受影响物理页面的分配和释放堆栈跟踪的话, > +请启用 ``CONFIG_PAGE_OWNER`` 并使用 ``page_owner=on`` 进行引导。 > + > +错误报告 > +~~~~~~~~ > + > +典型的KASAN报告如下所示:: > + > + ================================================================== > + BUG: KASAN: slab-out-of-bounds in kmalloc_oob_right+0xa8/0xbc [test_kasan] > + Write of size 1 at addr ffff8801f44ec37b by task insmod/2760 > + > + CPU: 1 PID: 2760 Comm: insmod Not tainted 4.19.0-rc3+ #698 > + Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1 04/01/2014 > + Call Trace: > + dump_stack+0x94/0xd8 > + print_address_description+0x73/0x280 > + kasan_report+0x144/0x187 > + __asan_report_store1_noabort+0x17/0x20 > + kmalloc_oob_right+0xa8/0xbc [test_kasan] > + kmalloc_tests_init+0x16/0x700 [test_kasan] > + do_one_initcall+0xa5/0x3ae > + do_init_module+0x1b6/0x547 > + load_module+0x75df/0x8070 > + __do_sys_init_module+0x1c6/0x200 > + __x64_sys_init_module+0x6e/0xb0 > + do_syscall_64+0x9f/0x2c0 > + entry_SYSCALL_64_after_hwframe+0x44/0xa9 > + RIP: 0033:0x7f96443109da > + RSP: 002b:00007ffcf0b51b08 EFLAGS: 00000202 ORIG_RAX: 00000000000000af > + RAX: ffffffffffffffda RBX: 000055dc3ee521a0 RCX: 00007f96443109da > + RDX: 00007f96445cff88 RSI: 0000000000057a50 RDI: 00007f9644992000 > + RBP: 000055dc3ee510b0 R08: 0000000000000003 R09: 0000000000000000 > + R10: 00007f964430cd0a R11: 0000000000000202 R12: 00007f96445cff88 > + R13: 000055dc3ee51090 R14: 0000000000000000 R15: 0000000000000000 > + > + Allocated by task 2760: > + save_stack+0x43/0xd0 > + kasan_kmalloc+0xa7/0xd0 > + kmem_cache_alloc_trace+0xe1/0x1b0 > + kmalloc_oob_right+0x56/0xbc [test_kasan] > + kmalloc_tests_init+0x16/0x700 [test_kasan] > + do_one_initcall+0xa5/0x3ae > + do_init_module+0x1b6/0x547 > + load_module+0x75df/0x8070 > + __do_sys_init_module+0x1c6/0x200 > + __x64_sys_init_module+0x6e/0xb0 > + do_syscall_64+0x9f/0x2c0 > + entry_SYSCALL_64_after_hwframe+0x44/0xa9 > + > + Freed by task 815: > + save_stack+0x43/0xd0 > + __kasan_slab_free+0x135/0x190 > + kasan_slab_free+0xe/0x10 > + kfree+0x93/0x1a0 > + umh_complete+0x6a/0xa0 > + call_usermodehelper_exec_async+0x4c3/0x640 > + ret_from_fork+0x35/0x40 > + > + The buggy address belongs to the object at ffff8801f44ec300 > + which belongs to the cache kmalloc-128 of size 128 > + The buggy address is located 123 bytes inside of > + 128-byte region [ffff8801f44ec300, ffff8801f44ec380) > + The buggy address belongs to the page: > + page:ffffea0007d13b00 count:1 mapcount:0 mapping:ffff8801f7001640 index:0x0 > + flags: 0x200000000000100(slab) > + raw: 0200000000000100 ffffea0007d11dc0 0000001a0000001a ffff8801f7001640 > + raw: 0000000000000000 0000000080150015 00000001ffffffff 0000000000000000 > + page dumped because: kasan: bad access detected > + > + Memory state around the buggy address: > + ffff8801f44ec200: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb > + ffff8801f44ec280: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc > + >ffff8801f44ec300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 > + ^ > + ffff8801f44ec380: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb > + ffff8801f44ec400: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc > + ================================================================== > + > +报告标题总结了发生的错误类型以及导致该错误的访问类型。紧随其后的是错误访问的 > +堆栈跟踪、所访问内存分配位置的堆栈跟踪(对于访问了slab对象的情况)以及对象 > +被释放的位置的堆栈跟踪(对于访问已释放内存的问题报告)。接下来是对访问的 > +slab对象的描述以及关于访问的内存页的信息。 > + > +最后,报告展示了访问地址周围的内存状态。在内部,KASAN单独跟踪每个内存颗粒的 > +内存状态,根据KASAN模式分为8或16个对齐字节。报告的内存状态部分中的每个数字 > +都显示了围绕访问地址的其中一个内存颗粒的状态。 > + > +对于通用KASAN,每个内存颗粒的大小为8个字节。每个颗粒的状态被编码在一个影子字节 > +中。这8个字节可以是可访问的,部分访问的,已释放的或成为Redzone的一部分。KASAN > +对每个影子字节使用以下编码:00表示对应内存区域的所有8个字节都可以访问;数字N > +(1 <= N <= 7)表示前N个字节可访问,其他(8 - N)个字节不可访问;任何负值都表示 > +无法访问整个8字节。KASAN使用不同的负值来区分不同类型的不可访问内存,如redzones > +或已释放的内存(参见 mm/kasan/kasan.h)。 > + > +在上面的报告中,箭头指向影子字节 ``03`` ,表示访问的地址是部分可访问的。 > + > +对于基于标签的KASAN模式,报告最后的部分显示了访问地址周围的内存标签 > +(参考 `实施细则`_ 章节)。 > + > +请注意,KASAN错误标题(如 ``slab-out-of-bounds`` 或 ``use-after-free`` ) > +是尽量接近的:KASAN根据其拥有的有限信息打印出最可能的错误类型。错误的实际类型 > +可能会有所不同。 > + > +通用KASAN还报告两个辅助调用堆栈跟踪。这些堆栈跟踪指向代码中与对象交互但不直接 > +出现在错误访问堆栈跟踪中的位置。目前,这包括 call_rcu() 和排队的工作队列。 > + > +启动参数 > +~~~~~~~~ > + > +KASAN受通用 ``panic_on_warn`` 命令行参数的影响。启用该功能后,KASAN在打印错误 > +报告后会引起内核恐慌。 > + > +默认情况下,KASAN只为第一次无效内存访问打印错误报告。使用 ``kasan_multi_shot`` , > +KASAN会针对每个无效访问打印报告。这有效地禁用了KASAN报告的 ``panic_on_warn`` 。 > + > +基于硬件标签的KASAN模式(请参阅下面有关各种模式的部分)旨在在生产中用作安全缓解 > +措施。因此,它支持允许禁用KASAN或控制其功能的引导参数。 > + > +- ``kasan=off`` 或 ``=on`` 控制KASAN是否启用 (默认: ``on`` )。 > + > +- ``kasan.mode=sync`` 或 ``=async`` 控制KASAN是否配置为同步或异步执行模式(默认: > + ``sync`` )。同步模式:当标签检查错误发生时,立即检测到错误访问。异步模式: > + 延迟错误访问检测。当标签检查错误发生时,信息存储在硬件中(在arm64的 > + TFSR_EL1寄存器中)。内核会定期检查硬件,并且仅在这些检查期间报告标签错误。 > + > +- ``kasan.stacktrace=off`` 或 ``=on`` 禁用或启用alloc和free堆栈跟踪收集 > + (默认: ``on`` )。 > + > +- ``kasan.fault=report`` 或 ``=panic`` 控制是只打印KASAN报告还是同时使内核恐慌 > + (默认: ``report`` )。即使启用了 ``kasan_multi_shot`` ,也会发生内核恐慌。 > + > +实施细则 > +-------- > + > +通用KASAN > +~~~~~~~~~ > + > +软件KASAN模式使用影子内存来记录每个内存字节是否可以安全访问,并使用编译时工具 > +在每次内存访问之前插入影子内存检查。 > + > +通用KASAN将1/8的内核内存专用于其影子内存(16TB以覆盖x86_64上的128TB),并使用 > +具有比例和偏移量的直接映射将内存地址转换为其相应的影子地址。 > + > +这是将地址转换为其相应影子地址的函数:: > + > + static inline void *kasan_mem_to_shadow(const void *addr) > + { > + return (void *)((unsigned long)addr >> KASAN_SHADOW_SCALE_SHIFT) > + + KASAN_SHADOW_OFFSET; > + } > + > +在这里 ``KASAN_SHADOW_SCALE_SHIFT = 3`` 。 > + > +编译时工具用于插入内存访问检查。编译器在每次访问大小为1、2、4、8或16的内存之前 > +插入函数调用( ``__asan_load*(addr)`` , ``__asan_store*(addr)``)。这些函数通过 > +检查相应的影子内存来检查内存访问是否有效。 > + > +使用inline插桩,编译器不进行函数调用,而是直接插入代码来检查影子内存。此选项 > +显著地增大了内核体积,但与outline插桩内核相比,它提供了x1.1-x2的性能提升。 > + > +通用KASAN是唯一一种通过隔离延迟重新使用已释放对象的模式 > +(参见 mm/kasan/quarantine.c 以了解实现)。 > + > +基于软件标签的KASAN模式 > +~~~~~~~~~~~~~~~~~~~~~~~ > + > +基于软件标签的KASAN使用软件内存标签方法来检查访问有效性。目前仅针对arm64架构实现。 > + > +基于软件标签的KASAN使用arm64 CPU的顶部字节忽略(TBI)特性在内核指针的顶部字节中 > +存储一个指针标签。它使用影子内存来存储与每个16字节内存单元相关的内存标签(因此, > +它将内核内存的1/16专用于影子内存)。 > + > +在每次内存分配时,基于软件标签的KASAN都会生成一个随机标签,用这个标签标记分配 > +的内存,并将相同的标签嵌入到返回的指针中。 > + > +基于软件标签的KASAN使用编译时工具在每次内存访问之前插入检查。这些检查确保正在 > +访问的内存的标签等于用于访问该内存的指针的标签。如果标签不匹配,基于软件标签 > +的KASAN会打印错误报告。 > + > +基于软件标签的KASAN也有两种插桩模式(outline,发出回调来检查内存访问;inline, > +执行内联的影子内存检查)。使用outline插桩模式,会从执行访问检查的函数打印错误 > +报告。使用inline插桩,编译器会发出 ``brk`` 指令,并使用专用的 ``brk`` 处理程序 > +来打印错误报告。 > + > +基于软件标签的KASAN使用0xFF作为匹配所有指针标签(不检查通过带有0xFF指针标签 > +的指针进行的访问)。值0xFE当前保留用于标记已释放的内存区域。 > + > +基于软件标签的KASAN目前仅支持对Slab和page_alloc内存进行标记。 > + > +基于硬件标签的KASAN模式 > +~~~~~~~~~~~~~~~~~~~~~~~ > + > +基于硬件标签的KASAN在概念上类似于软件模式,但它是使用硬件内存标签作为支持而 > +不是编译器插桩和影子内存。 > + > +基于硬件标签的KASAN目前仅针对arm64架构实现,并且基于ARMv8.5指令集架构中引入 > +的arm64内存标记扩展(MTE)和最高字节忽略(TBI)。 > + > +特殊的arm64指令用于为每次内存分配指定内存标签。相同的标签被指定给指向这些分配 > +的指针。在每次内存访问时,硬件确保正在访问的内存的标签等于用于访问该内存的指针 > +的标签。如果标签不匹配,则会生成故障并打印报告。 > + > +基于硬件标签的KASAN使用0xFF作为匹配所有指针标签(不检查通过带有0xFF指针标签的 > +指针进行的访问)。值0xFE当前保留用于标记已释放的内存区域。 > + > +基于硬件标签的KASAN目前仅支持对Slab和page_alloc内存进行标记。 > + > +如果硬件不支持MTE(ARMv8.5之前),则不会启用基于硬件标签的KASAN。在这种情况下, > +所有KASAN引导参数都将被忽略。 > + > +请注意,启用CONFIG_KASAN_HW_TAGS始终会导致启用内核中的TBI。即使提供了 > +``kasan.mode=off`` 或硬件不支持MTE(但支持TBI)。 > + > +基于硬件标签的KASAN只报告第一个发现的错误。之后,MTE标签检查将被禁用。 > + > +影子内存 > +-------- > + > +内核将内存映射到地址空间的几个不同部分。内核虚拟地址的范围很大:没有足够的真实 > +内存来支持内核可以访问的每个地址的真实影子区域。因此,KASAN只为地址空间的某些 > +部分映射真实的影子。 > + > +默认行为 > +~~~~~~~~ > + > +默认情况下,体系结构仅将实际内存映射到用于线性映射的阴影区域(以及可能的其他 > +小区域)。对于所有其他区域 —— 例如vmalloc和vmemmap空间 —— 一个只读页面被映射 > +到阴影区域上。这个只读的影子页面声明所有内存访问都是允许的。 > + > +这给模块带来了一个问题:它们不存在于线性映射中,而是存在于专用的模块空间中。 > +通过连接模块分配器,KASAN临时映射真实的影子内存以覆盖它们。例如,这允许检测 > +对模块全局变量的无效访问。 > + > +这也造成了与 ``VMAP_STACK`` 的不兼容:如果堆栈位于vmalloc空间中,它将被分配 > +只读页面的影子内存,并且内核在尝试为堆栈变量设置影子数据时会出错。 > + > +CONFIG_KASAN_VMALLOC > +~~~~~~~~~~~~~~~~~~~~ > + > +使用 ``CONFIG_KASAN_VMALLOC`` ,KASAN可以以更大的内存使用为代价覆盖vmalloc > +空间。目前,这在x86、riscv、s390和powerpc上受支持。 > + > +这通过连接到vmalloc和vmap并动态分配真实的影子内存来支持映射。 > + > +vmalloc空间中的大多数映射都很小,需要不到一整页的阴影空间。因此,为每个映射 > +分配一个完整的影子页面将是一种浪费。此外,为了确保不同的映射使用不同的影子 > +页面,映射必须与 ``KASAN_GRANULE_SIZE * PAGE_SIZE`` 对齐。 > + > +相反,KASAN跨多个映射共享后备空间。当vmalloc空间中的映射使用影子区域的特定 > +页面时,它会分配一个后备页面。此页面稍后可以由其他vmalloc映射共享。 > + > +KASAN连接到vmap基础架构以懒清理未使用的影子内存。 > + > +为了避免交换映射的困难,KASAN预测覆盖vmalloc空间的阴影区域部分将不会被早期 > +的阴影页面覆盖,但是将不会被映射。这将需要更改特定于arch的代码。 > + > +这允许在x86上支持 ``VMAP_STACK`` ,并且可以简化对没有固定模块区域的架构的支持。 > + > +对于开发者 > +---------- > + > +忽略访问 > +~~~~~~~~ > + > +软件KASAN模式使用编译器插桩来插入有效性检查。此类检测可能与内核的某些部分 > +不兼容,因此需要禁用。 > + > +内核的其他部分可能会访问已分配对象的元数据。通常,KASAN会检测并报告此类访问, > +但在某些情况下(例如,在内存分配器中),这些访问是有效的。 > + > +对于软件KASAN模式,要禁用特定文件或目录的检测,请将 ``KASAN_SANITIZE`` 添加 > +到相应的内核Makefile中: > + > +- 对于单个文件(例如,main.o):: > + > + KASAN_SANITIZE_main.o := n > + > +- 对于一个目录下的所有文件:: > + > + KASAN_SANITIZE := n > + > +对于软件KASAN模式,要在每个函数的基础上禁用检测,请使用KASAN特定的 > +``__no_sanitize_address`` 函数属性或通用的 ``noinstr`` 。 > + > +请注意,禁用编译器插桩(基于每个文件或每个函数)会使KASAN忽略在软件KASAN模式 > +的代码中直接发生的访问。当访问是间接发生的(通过调用检测函数)或使用没有编译器 > +插桩的基于硬件标签的模式时,它没有帮助。 > + > +对于软件KASAN模式,要在当前任务的一部分内核代码中禁用KASAN报告,请使用 > +``kasan_disable_current()``/``kasan_enable_current()`` 部分注释这部分代码。 > +这也会禁用通过函数调用发生的间接访问的报告。 > + > +对于基于标签的KASAN模式(包括硬件模式),要禁用访问检查,请使用 > +``kasan_reset_tag()`` 或 ``page_kasan_tag_reset()`` 。请注意,通过 > +``page_kasan_tag_reset()`` 临时禁用访问检查需要通过 ``page_kasan_tag`` > +/ ``page_kasan_tag_set`` 保存和恢复每页KASAN标签。 > + > +测试 > +~~~~ > + > +有一些KASAN测试可以验证KASAN是否正常工作并可以检测某些类型的内存损坏。 > +测试由两部分组成: > + > +1. 与KUnit测试框架集成的测试。使用 ``CONFIG_KASAN_KUNIT_TEST`` 启用。 > +这些测试可以通过几种不同的方式自动运行和部分验证;请参阅下面的说明。 > + > +2. 与KUnit不兼容的测试。使用 ``CONFIG_KASAN_MODULE_TEST`` 启用并且只能作为模块 > +运行。这些测试只能通过加载内核模块并检查内核日志以获取KASAN报告来手动验证。 > + > +如果检测到错误,每个KUnit兼容的KASAN测试都会打印多个KASAN报告之一,然后测试打印 > +其编号和状态。 > + > +当测试通过:: > + > + ok 28 - kmalloc_double_kzfree > + > +当由于 ``kmalloc`` 失败而导致测试失败时:: > + > + # kmalloc_large_oob_right: ASSERTION FAILED at lib/test_kasan.c:163 > + Expected ptr is not null, but is > + not ok 4 - kmalloc_large_oob_right > + > +当由于缺少KASAN报告而导致测试失败时:: > + > + # kmalloc_double_kzfree: EXPECTATION FAILED at lib/test_kasan.c:629 > + Expected kasan_data->report_expected == kasan_data->report_found, but > + kasan_data->report_expected == 1 > + kasan_data->report_found == 0 > + not ok 28 - kmalloc_double_kzfree > + > +最后打印所有KASAN测试的累积状态。成功:: > + > + ok 1 - kasan > + > +或者,如果其中一项测试失败:: > + > + not ok 1 - kasan > + > +有几种方法可以运行与KUnit兼容的KASAN测试。 > + > +1. 可加载模块 > + > + 启用 ``CONFIG_KUNIT`` 后,KASAN-KUnit测试可以构建为可加载模块,并通过使用 > + ``insmod`` 或 ``modprobe`` 加载 ``test_kasan.ko`` 来运行。 > + > +2. 内置 > + > + 通过内置 ``CONFIG_KUNIT`` ,也可以内置KASAN-KUnit测试。在这种情况下, > + 测试将在启动时作为后期初始化调用运行。 > + > +3. 使用kunit_tool > + > + 通过内置 ``CONFIG_KUNIT`` 和 ``CONFIG_KASAN_KUNIT_TEST`` ,还可以使用 > + ``kunit_tool`` 以更易读的方式查看KUnit测试结果。这不会打印通过测试 > + 的KASAN报告。有关 ``kunit_tool`` 更多最新信息,请参阅 > + `KUnit文档 `_ 。 > + > +.. _KUnit: https://www.kernel.org/doc/html/latest/dev-tools/kunit/index.html > 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=-12.9 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham 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 D3CA2C47082 for ; Fri, 4 Jun 2021 02:30:56 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 88D9B61406 for ; Fri, 4 Jun 2021 02:30:56 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 88D9B61406 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date: Message-ID:From:References:Cc:To:Subject:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=N9+PTCjlpzSvmsyw7lmIxCBrSHAEGm5yK4zeLY1c5To=; b=xByK+t020HwVTYYlwrg0sWHYI3 vPSIpTdUK3sgXPZYLPu4oBeVbIvhWSIt94d/ydlr5fM/c4jc3ZLuKNMWeNs8SjorIbaLhlA4a1TM3 Bn/p2uBqWzH05ZUmN1abAtKNhkORGLy4jn5JftJTcm6y+6ojavQEkZYmnb40QMW+rjOZ05yHZ3SZ+ NanLhk7Wp/ctz6L3pVR6KD4PnlZTmASmrcOgULRsBdPevrJyh1U2cqI9yJcp/b4x8VAFrT2/YJS0q aiPjzOjitq4aeYucyvc0B/MoFb8oxY2Z3VyZ0nQhC6dOSdMUQyXjZQxR24mj2oK5F1krFonArRMNV T8w1z7eg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lozbQ-00BGXB-Q5; Fri, 04 Jun 2021 02:30:28 +0000 Received: from mail-pg1-x52d.google.com ([2607:f8b0:4864:20::52d]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1lozbN-00BGVi-HF for linux-riscv@lists.infradead.org; Fri, 04 Jun 2021 02:30:28 +0000 Received: by mail-pg1-x52d.google.com with SMTP id 29so6630910pgu.11 for ; Thu, 03 Jun 2021 19:30:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=8T0GZ0hbtkJl5Ufn6AUfxWOpdfrP5DhV8NMmZD9Hw6I=; b=EdrpNETDWLrgRnUcSM2V4PFykyWkS0kZU+XB85UO7cGaoBM6MDTURWy0FHl7hWR2a7 BMMlN9kUGK0DHRHl1BLwRAsXEgSx/3ZVrAvkcFtceUEB2ZYxFG2t3+mXmvMMT5fAqhy2 bhh1+90WgTHEYBpZKjeDDnUMW+uLYzQ5B44YizCcaBJoIfVimcfhBK4xU+JohIv/s0Yk 6E45DHc5wh7zGeh7l9H4FJKoInzW81vABrS0TA8sPlQCCoaFhfviySUKQbZB1/ApTve1 PayCr5TEiYQmkBOwJ4KWjimXoHX8IAmsdNQvfkIXLNFj8owziMf+4B7Tvm/s/drGa1ko Mzkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=8T0GZ0hbtkJl5Ufn6AUfxWOpdfrP5DhV8NMmZD9Hw6I=; b=ZWxVant/x01Tho7kNigK95B3LcBcylStDd6ahlYX0vC+UIwLO0EkttzZBXP3yr2PEU EnEDYUJSOhiAHoarQGDwB42xU6D+G4U16VcYJGGDxdBJ7VuvNxWb54S5PyPPa0Lsh8JX IJ6IBl+ksC5jH24KXZDP/tpXybxFlP637lKYHpl+H0XH32m0mEU1CqSv1Tmz4a8Ood3R qoUTsocTA43wtu2k86BSRs3JVTp6L/8u0Cm5Kc6LqxRK+X/MFsSIXVUZqhXmadIvshIc C2fDZ2SAVbwIMD0GhGdkEIidoZn9HoiparmMWQmEDUgOR+QQEZB5s5Qp+c2/DFCMBS/e 3Aaw== X-Gm-Message-State: AOAM533++x2IGRF079DRQq+q58rgf9SdXJHnfTU8rmPuuASzHH/tvcid 7nlt3JC23C+xLnSUpPrHIL4= X-Google-Smtp-Source: ABdhPJxtRgbmWKdcvFEOCYLlrP4pFg6j0i4JI3PO7y2an9bUc85aM6ikYgZhNRLD26Y+SKpX7RkxSA== X-Received: by 2002:a63:4b43:: with SMTP id k3mr2554850pgl.450.1622773821231; Thu, 03 Jun 2021 19:30:21 -0700 (PDT) Received: from [172.28.99.179] ([119.28.155.243]) by smtp.gmail.com with ESMTPSA id c17sm371171pgm.3.2021.06.03.19.30.05 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 03 Jun 2021 19:30:20 -0700 (PDT) Subject: Re: [PATCH] [v5] docs/zh_CN: add translations in zh_CN/dev-tools/kasan To: Wan Jiabing , Alex Shi , Jonathan Corbet , Paul Walmsley , Palmer Dabbelt , Albert Ou , Nathan Chancellor , Nick Desaulniers , Wu XiangCheng , Fangrui Song , Bernard Zhao , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, clang-built-linux@googlegroups.com Cc: kael_w@yeah.net References: <20210603141127.101689-1-wanjiabing@vivo.com> From: Alex Shi Message-ID: <5c1eeafc-d3bc-cbe9-e304-c1d62a8cc7f8@gmail.com> Date: Fri, 4 Jun 2021 10:30:00 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.8.1 MIME-Version: 1.0 In-Reply-To: <20210603141127.101689-1-wanjiabing@vivo.com> Content-Language: en-US X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210603_193025_617215_AA41CD42 X-CRM114-Status: GOOD ( 21.66 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org UmV2aWV3ZWQtYnk6IEFsZXggU2hpIDxhbGV4c0BrZXJuZWwub3JnPgoKT24gNi8zLzIxIDEwOjEx IFBNLCBXYW4gSmlhYmluZyB3cm90ZToKPiBBZGQgbmV3IHpoIHRyYW5zbGF0aW9ucwo+ICogemhf Q04vZGV2LXRvb2xzL2thc2FuLnJzdAo+IGFuZCBsaW5rIGl0IHRvIHpoX0NOL2Rldi10b29scy9p bmRleC5yc3QKPiAKPiBSZXZpZXdlZC1ieTogRmFuZ3J1aSBTb25nIDxtYXNrcmF5QGdvb2dsZS5j b20+Cj4gU2lnbmVkLW9mZi1ieTogV2FuIEppYWJpbmcgPHdhbmppYWJpbmdAdml2by5jb20+Cj4g LS0tCj4gQ2hhbmdlbG9nOgo+IHY1Ogo+IC0gRml4IHNvbWUgYWxpZ25zIGJlbG93IHRpdGxlcy4K PiB2NDoKPiAtIEZpeCBhIHNwYWNlIG1pc3NpbmcuCj4gdjM6Cj4gLSBGaXggYWxpZ25zIGFuZCBp bmFjY3VyYXRlIHRyYW5zbGF0aW9uLgo+IHYyOgo+IC0gRGVsZXRlIHNwYWNlcyBzdXJyb3VuZCB3 aXRoIEVuZ2xpc2ggd29yZHMuCj4gLS0tCj4gIC4uLi90cmFuc2xhdGlvbnMvemhfQ04vZGV2LXRv b2xzL2luZGV4LnJzdCAgICB8ICAgMiArLQo+ICAuLi4vdHJhbnNsYXRpb25zL3poX0NOL2Rldi10 b29scy9rYXNhbi5yc3QgICAgfCA0MTcgKysrKysrKysrKysrKysrKysrCj4gIDIgZmlsZXMgY2hh bmdlZCwgNDE4IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkKPiAgY3JlYXRlIG1vZGUgMTAw NjQ0IERvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2Rldi10b29scy9rYXNhbi5yc3QK PiAKPiBkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vZGV2LXRv b2xzL2luZGV4LnJzdCBiL0RvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2Rldi10b29s cy9pbmRleC5yc3QKPiBpbmRleCBmZDczYzQ3OTkxN2IuLmU2Yzk5ZjJmNTQzZiAxMDA2NDQKPiAt LS0gYS9Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9kZXYtdG9vbHMvaW5kZXgucnN0 Cj4gKysrIGIvRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vZGV2LXRvb2xzL2luZGV4 LnJzdAo+IEBAIC0xOSwxMyArMTksMTMgQEAKPiAgICAgOm1heGRlcHRoOiAyCj4gIAo+ICAgICBn Y292Cj4gKyAgIGthc2FuCj4gIAo+ICBUb2RvbGlzdDoKPiAgCj4gICAtIGNvY2NpbmVsbGUKPiAg IC0gc3BhcnNlCj4gICAtIGtjb3YKPiAtIC0ga2FzYW4KPiAgIC0gdWJzYW4KPiAgIC0ga21lbWxl YWsKPiAgIC0ga2NzYW4KPiBkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMv emhfQ04vZGV2LXRvb2xzL2thc2FuLnJzdCBiL0RvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3po X0NOL2Rldi10b29scy9rYXNhbi5yc3QKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAw MDAwMDAwMDAwMC4uMjNkYjlkNDE5MDQ3Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL0RvY3VtZW50 YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2Rldi10b29scy9rYXNhbi5yc3QKPiBAQCAtMCwwICsx LDQxNyBAQAo+ICsuLiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+ICsKPiArLi4g aW5jbHVkZTo6IC4uL2Rpc2NsYWltZXItemhfQ04ucnN0Cj4gKwo+ICs6T3JpZ2luYWw6IERvY3Vt ZW50YXRpb24vZGV2LXRvb2xzL2thc2FuLnJzdAo+ICs6VHJhbnNsYXRvcjog5LiH5a625YW1IFdh biBKaWFiaW5nIDx3YW5qaWFiaW5nQHZpdm8uY29tPgo+ICsKPiAr5YaF5qC45Zyw5Z2A5raI5q+S 5YmCKEtBU0FOKQo+ICs9PT09PT09PT09PT09PT09PT09PT0KPiArCj4gK+amgui/sAo+ICstLS0t Cj4gKwo+ICtLZXJuZWxBZGRyZXNzU0FOaXRpemVyKEtBU0FOKeaYr+S4gOenjeWKqOaAgeWGheWt mOWuieWFqOmUmeivr+ajgOa1i+W3peWFt++8jOS4u+imgeWKn+iDveaYrwo+ICvmo4Dmn6XlhoXl rZjotornlYzorr/pl67lkozkvb/nlKjlt7Lph4rmlL7lhoXlrZjnmoTpl67popjjgIJLQVNBTuac ieS4ieenjeaooeW8jzoKPiArCj4gKzEuIOmAmueUqEtBU0FO77yI5LiO55So5oi356m66Ze055qE QVNhbuexu+S8vO+8iQo+ICsyLiDln7rkuo7ova/ku7bmoIfnrb7nmoRLQVNBTu+8iOS4jueUqOaI t+epuumXtOeahEhXQVNhbuexu+S8vO+8iQo+ICszLiDln7rkuo7noazku7bmoIfnrb7nmoRLQVNB Tu+8iOWfuuS6juehrOS7tuWGheWtmOagh+etvu+8iQo+ICsKPiAr55Sx5LqO6YCa55SoS0FTQU7n moTlhoXlrZjlvIDplIDovoPlpKfvvIzpgJrnlKhLQVNBTuS4u+imgeeUqOS6juiwg+ivleOAguWf uuS6jui9r+S7tuagh+etvueahEtBU0FOCj4gK+WPr+eUqOS6jmRvZ2Zvb2TmtYvor5XvvIzlm6Dk uLrlroPlhbfmnInovoPkvY7nmoTlhoXlrZjlvIDplIDvvIzlubblhYHorrjlsIblhbbnlKjkuo7l rp7pmYXlt6XkvZzph4/jgIIKPiAr5Z+65LqO56Gs5Lu25qCH562+55qES0FTQU7lhbfmnInovoPk vY7nmoTlhoXlrZjlkozmgKfog73lvIDplIDvvIzlm6DmraTlj6/nlKjkuo7nlJ/kuqfjgILlkIzm l7blj6/nlKjkuo4KPiAr5qOA5rWL546w5Zy65YaF5a2Y6Zeu6aKY5oiW5L2c5Li65a6J5YWo57yT 6Kej5o6q5pa944CCCj4gKwo+ICvova/ku7ZLQVNBTuaooeW8j++8iCMx5ZKMIzLvvInkvb/nlKjn vJbor5Hml7blt6XlhbflnKjmr4/mrKHlhoXlrZjorr/pl67kuYvliY3mj5LlhaXmnInmlYjmgKfm o4Dmn6XvvIwKPiAr5Zug5q2k6ZyA6KaB5LiA5Liq5pSv5oyB5a6D55qE57yW6K+R5Zmo54mI5pys 44CCCj4gKwo+ICvpgJrnlKhLQVNBTuWcqEdDQ+WSjENsYW5n5Y+X5pSv5oyB44CCR0ND6ZyA6KaB OC4zLjDmiJbmm7Tpq5jniYjmnKzjgILku7vkvZXlj5fmlK/mjIHnmoRDbGFuZwo+ICvniYjmnKzp g73mmK/lhbzlrrnnmoTvvIzkvYbku45DbGFuZyAxMeaJjeW8gOWni+aUr+aMgeajgOa1i+WFqOWx gOWPmOmHj+eahOi2iueVjOiuv+mXruOAggo+ICsKPiAr5Z+65LqO6L2v5Lu25qCH562+55qES0FT QU7mqKHlvI/ku4XlnKhDbGFuZ+S4reWPl+aUr+aMgeOAggo+ICsKPiAr56Gs5Lu2S0FTQU7mqKHl vI/vvIgjM++8ieS+nei1luehrOS7tuadpeaJp+ihjOajgOafpe+8jOS9huS7jemcgOimgeaUr+aM geWGheWtmOagh+etvuaMh+S7pOeahOe8luivkeWZqAo+ICvniYjmnKzjgIJHQ0MgMTAr5ZKMQ2xh bmcgMTEr5pSv5oyB5q2k5qih5byP44CCCj4gKwo+ICvkuKTnp43ova/ku7ZLQVNBTuaooeW8j+mD vemAgueUqOS6jlNMVULlkoxTTEFC5YaF5a2Y5YiG6YWN5Zmo77yM6ICM5Z+65LqO56Gs5Lu25qCH 562+55qES0FTQU7nm67liY0KPiAr5LuF5pSv5oyBU0xVQuOAggo+ICsKPiAr55uu5YmNeDg2XzY0 44CBYXJt44CBYXJtNjTjgIF4dGVuc2HjgIFzMzkw44CBcmlzY3bmnrbmnoTmlK/mjIHpgJrnlKhL QVNBTuaooeW8j++8jOS7hQo+ICthcm02NOaetuaehOaUr+aMgeWfuuS6juagh+etvueahEtBU0FO 5qih5byP44CCCj4gKwo+ICvnlKjms5UKPiArLS0tLQo+ICsKPiAr6KaB5ZCv55SoS0FTQU7vvIzo r7fkvb/nlKjku6XkuIvlkb3ku6TphY3nva7lhoXmoLg6Ogo+ICsKPiArCSAgQ09ORklHX0tBU0FO PXkKPiArCj4gK+WQjOaXtuWcqCBgYENPTkZJR19LQVNBTl9HRU5FUklDYGAgKOWQr+eUqOmAmueU qEtBU0FO5qih5byPKe+8jCBgYENPTkZJR19LQVNBTl9TV19UQUdTYGAKPiArKOWQr+eUqOWfuuS6 juehrOS7tuagh+etvueahEtBU0FO5qih5byPKe+8jOWSjCBgYENPTkZJR19LQVNBTl9IV19UQUdT YGAgKOWQr+eUqOWfuuS6juehrOS7tuagh+etvgo+ICvnmoRLQVNBTuaooeW8jynkuYvpl7Tov5vo oYzpgInmi6njgIIKPiArCj4gK+WvueS6jui9r+S7tuaooeW8j++8jOi/mOWPr+S7peWcqCBgYENP TkZJR19LQVNBTl9PVVRMSU5FYGAg5ZKMIGBgQ09ORklHX0tBU0FOX0lOTElORWBgCj4gK+S5i+mX tOi/m+ihjOmAieaLqeOAgm91dGxpbmXlkoxpbmxpbmXmmK/nvJbor5Hlmajmj5Lmoannsbvlnovj gILliY3ogIXkuqfnlJ/ovoPlsI/nmoTkuozov5vliLbmlofku7bvvIwKPiAr6ICM5ZCO6ICF5b+r MS4xLTLlgI3jgIIKPiArCj4gK+imgeWwhuWPl+W9seWTjeeahHNsYWLlr7nosaHnmoRhbGxvY+WS jGZyZWXloIbmoIjot5/ouKrljIXlkKvliLDmiqXlkYrkuK3vvIzor7flkK/nlKgKPiArYGBDT05G SUdfU1RBQ0tUUkFDRWBgIOOAguimgeWMheaLrOWPl+W9seWTjeeJqeeQhumhtemdoueahOWIhumF jeWSjOmHiuaUvuWghuagiOi3n+i4queahOivne+8jAo+ICvor7flkK/nlKggYGBDT05GSUdfUEFH RV9PV05FUmBgIOW5tuS9v+eUqCBgYHBhZ2Vfb3duZXI9b25gYCDov5vooYzlvJXlr7zjgIIKPiAr Cj4gK+mUmeivr+aKpeWRigo+ICt+fn5+fn5+fgo+ICsKPiAr5YW45Z6L55qES0FTQU7miqXlkYrl poLkuIvmiYDnpLo6Ogo+ICsKPiArICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo+ICsgICAgQlVHOiBLQVNBTjogc2xh Yi1vdXQtb2YtYm91bmRzIGluIGttYWxsb2Nfb29iX3JpZ2h0KzB4YTgvMHhiYyBbdGVzdF9rYXNh bl0KPiArICAgIFdyaXRlIG9mIHNpemUgMSBhdCBhZGRyIGZmZmY4ODAxZjQ0ZWMzN2IgYnkgdGFz ayBpbnNtb2QvMjc2MAo+ICsKPiArICAgIENQVTogMSBQSUQ6IDI3NjAgQ29tbTogaW5zbW9kIE5v dCB0YWludGVkIDQuMTkuMC1yYzMrICM2OTgKPiArICAgIEhhcmR3YXJlIG5hbWU6IFFFTVUgU3Rh bmRhcmQgUEMgKGk0NDBGWCArIFBJSVgsIDE5OTYpLCBCSU9TIDEuMTAuMi0xIDA0LzAxLzIwMTQK PiArICAgIENhbGwgVHJhY2U6Cj4gKyAgICAgZHVtcF9zdGFjaysweDk0LzB4ZDgKPiArICAgICBw cmludF9hZGRyZXNzX2Rlc2NyaXB0aW9uKzB4NzMvMHgyODAKPiArICAgICBrYXNhbl9yZXBvcnQr MHgxNDQvMHgxODcKPiArICAgICBfX2FzYW5fcmVwb3J0X3N0b3JlMV9ub2Fib3J0KzB4MTcvMHgy MAo+ICsgICAgIGttYWxsb2Nfb29iX3JpZ2h0KzB4YTgvMHhiYyBbdGVzdF9rYXNhbl0KPiArICAg ICBrbWFsbG9jX3Rlc3RzX2luaXQrMHgxNi8weDcwMCBbdGVzdF9rYXNhbl0KPiArICAgICBkb19v bmVfaW5pdGNhbGwrMHhhNS8weDNhZQo+ICsgICAgIGRvX2luaXRfbW9kdWxlKzB4MWI2LzB4NTQ3 Cj4gKyAgICAgbG9hZF9tb2R1bGUrMHg3NWRmLzB4ODA3MAo+ICsgICAgIF9fZG9fc3lzX2luaXRf bW9kdWxlKzB4MWM2LzB4MjAwCj4gKyAgICAgX194NjRfc3lzX2luaXRfbW9kdWxlKzB4NmUvMHhi MAo+ICsgICAgIGRvX3N5c2NhbGxfNjQrMHg5Zi8weDJjMAo+ICsgICAgIGVudHJ5X1NZU0NBTExf NjRfYWZ0ZXJfaHdmcmFtZSsweDQ0LzB4YTkKPiArICAgIFJJUDogMDAzMzoweDdmOTY0NDMxMDlk YQo+ICsgICAgUlNQOiAwMDJiOjAwMDA3ZmZjZjBiNTFiMDggRUZMQUdTOiAwMDAwMDIwMiBPUklH X1JBWDogMDAwMDAwMDAwMDAwMDBhZgo+ICsgICAgUkFYOiBmZmZmZmZmZmZmZmZmZmRhIFJCWDog MDAwMDU1ZGMzZWU1MjFhMCBSQ1g6IDAwMDA3Zjk2NDQzMTA5ZGEKPiArICAgIFJEWDogMDAwMDdm OTY0NDVjZmY4OCBSU0k6IDAwMDAwMDAwMDAwNTdhNTAgUkRJOiAwMDAwN2Y5NjQ0OTkyMDAwCj4g KyAgICBSQlA6IDAwMDA1NWRjM2VlNTEwYjAgUjA4OiAwMDAwMDAwMDAwMDAwMDAzIFIwOTogMDAw MDAwMDAwMDAwMDAwMAo+ICsgICAgUjEwOiAwMDAwN2Y5NjQ0MzBjZDBhIFIxMTogMDAwMDAwMDAw MDAwMDIwMiBSMTI6IDAwMDA3Zjk2NDQ1Y2ZmODgKPiArICAgIFIxMzogMDAwMDU1ZGMzZWU1MTA5 MCBSMTQ6IDAwMDAwMDAwMDAwMDAwMDAgUjE1OiAwMDAwMDAwMDAwMDAwMDAwCj4gKwo+ICsgICAg QWxsb2NhdGVkIGJ5IHRhc2sgMjc2MDoKPiArICAgICBzYXZlX3N0YWNrKzB4NDMvMHhkMAo+ICsg ICAgIGthc2FuX2ttYWxsb2MrMHhhNy8weGQwCj4gKyAgICAga21lbV9jYWNoZV9hbGxvY190cmFj ZSsweGUxLzB4MWIwCj4gKyAgICAga21hbGxvY19vb2JfcmlnaHQrMHg1Ni8weGJjIFt0ZXN0X2th c2FuXQo+ICsgICAgIGttYWxsb2NfdGVzdHNfaW5pdCsweDE2LzB4NzAwIFt0ZXN0X2thc2FuXQo+ ICsgICAgIGRvX29uZV9pbml0Y2FsbCsweGE1LzB4M2FlCj4gKyAgICAgZG9faW5pdF9tb2R1bGUr MHgxYjYvMHg1NDcKPiArICAgICBsb2FkX21vZHVsZSsweDc1ZGYvMHg4MDcwCj4gKyAgICAgX19k b19zeXNfaW5pdF9tb2R1bGUrMHgxYzYvMHgyMDAKPiArICAgICBfX3g2NF9zeXNfaW5pdF9tb2R1 bGUrMHg2ZS8weGIwCj4gKyAgICAgZG9fc3lzY2FsbF82NCsweDlmLzB4MmMwCj4gKyAgICAgZW50 cnlfU1lTQ0FMTF82NF9hZnRlcl9od2ZyYW1lKzB4NDQvMHhhOQo+ICsKPiArICAgIEZyZWVkIGJ5 IHRhc2sgODE1Ogo+ICsgICAgIHNhdmVfc3RhY2srMHg0My8weGQwCj4gKyAgICAgX19rYXNhbl9z bGFiX2ZyZWUrMHgxMzUvMHgxOTAKPiArICAgICBrYXNhbl9zbGFiX2ZyZWUrMHhlLzB4MTAKPiAr ICAgICBrZnJlZSsweDkzLzB4MWEwCj4gKyAgICAgdW1oX2NvbXBsZXRlKzB4NmEvMHhhMAo+ICsg ICAgIGNhbGxfdXNlcm1vZGVoZWxwZXJfZXhlY19hc3luYysweDRjMy8weDY0MAo+ICsgICAgIHJl dF9mcm9tX2ZvcmsrMHgzNS8weDQwCj4gKwo+ICsgICAgVGhlIGJ1Z2d5IGFkZHJlc3MgYmVsb25n cyB0byB0aGUgb2JqZWN0IGF0IGZmZmY4ODAxZjQ0ZWMzMDAKPiArICAgICB3aGljaCBiZWxvbmdz IHRvIHRoZSBjYWNoZSBrbWFsbG9jLTEyOCBvZiBzaXplIDEyOAo+ICsgICAgVGhlIGJ1Z2d5IGFk ZHJlc3MgaXMgbG9jYXRlZCAxMjMgYnl0ZXMgaW5zaWRlIG9mCj4gKyAgICAgMTI4LWJ5dGUgcmVn aW9uIFtmZmZmODgwMWY0NGVjMzAwLCBmZmZmODgwMWY0NGVjMzgwKQo+ICsgICAgVGhlIGJ1Z2d5 IGFkZHJlc3MgYmVsb25ncyB0byB0aGUgcGFnZToKPiArICAgIHBhZ2U6ZmZmZmVhMDAwN2QxM2Iw MCBjb3VudDoxIG1hcGNvdW50OjAgbWFwcGluZzpmZmZmODgwMWY3MDAxNjQwIGluZGV4OjB4MAo+ ICsgICAgZmxhZ3M6IDB4MjAwMDAwMDAwMDAwMTAwKHNsYWIpCj4gKyAgICByYXc6IDAyMDAwMDAw MDAwMDAxMDAgZmZmZmVhMDAwN2QxMWRjMCAwMDAwMDAxYTAwMDAwMDFhIGZmZmY4ODAxZjcwMDE2 NDAKPiArICAgIHJhdzogMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDgwMTUwMDE1IDAwMDAwMDAx ZmZmZmZmZmYgMDAwMDAwMDAwMDAwMDAwMAo+ICsgICAgcGFnZSBkdW1wZWQgYmVjYXVzZToga2Fz YW46IGJhZCBhY2Nlc3MgZGV0ZWN0ZWQKPiArCj4gKyAgICBNZW1vcnkgc3RhdGUgYXJvdW5kIHRo ZSBidWdneSBhZGRyZXNzOgo+ICsgICAgIGZmZmY4ODAxZjQ0ZWMyMDA6IGZjIGZjIGZjIGZjIGZj IGZjIGZjIGZjIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiCj4gKyAgICAgZmZmZjg4MDFmNDRlYzI4 MDogZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMKPiArICAg ID5mZmZmODgwMWY0NGVjMzAwOiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAw MCAwMCAwMCAwMwo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIF4KPiArICAgICBmZmZmODgwMWY0NGVjMzgwOiBmYyBm YyBmYyBmYyBmYyBmYyBmYyBmYyBmYiBmYiBmYiBmYiBmYiBmYiBmYiBmYgo+ICsgICAgIGZmZmY4 ODAxZjQ0ZWM0MDA6IGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZjIGZjIGZjIGZjIGZjIGZjIGZj IGZjCj4gKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KPiArCj4gK+aKpeWRiuagh+mimOaAu+e7k+S6huWPkeeUn+ea hOmUmeivr+exu+Wei+S7peWPiuWvvOiHtOivpemUmeivr+eahOiuv+mXruexu+Wei+OAgue0p+ma j+WFtuWQjueahOaYr+mUmeivr+iuv+mXrueahAo+ICvloIbmoIjot5/ouKrjgIHmiYDorr/pl67l hoXlrZjliIbphY3kvY3nva7nmoTloIbmoIjot5/ouKrvvIjlr7nkuo7orr/pl67kuoZzbGFi5a+5 6LGh55qE5oOF5Ya177yJ5Lul5Y+K5a+56LGhCj4gK+iiq+mHiuaUvueahOS9jee9rueahOWghuag iOi3n+i4qu+8iOWvueS6juiuv+mXruW3sumHiuaUvuWGheWtmOeahOmXrumimOaKpeWRiu+8ieOA guaOpeS4i+adpeaYr+Wvueiuv+mXrueahAo+ICtzbGFi5a+56LGh55qE5o+P6L+w5Lul5Y+K5YWz 5LqO6K6/6Zeu55qE5YaF5a2Y6aG155qE5L+h5oGv44CCCj4gKwo+ICvmnIDlkI7vvIzmiqXlkYrl sZXnpLrkuoborr/pl67lnLDlnYDlkajlm7TnmoTlhoXlrZjnirbmgIHjgILlnKjlhoXpg6jvvIxL QVNBTuWNleeLrOi3n+i4quavj+S4quWGheWtmOmil+eykueahAo+ICvlhoXlrZjnirbmgIHvvIzm oLnmja5LQVNBTuaooeW8j+WIhuS4ujjmiJYxNuS4quWvuem9kOWtl+iKguOAguaKpeWRiueahOWG heWtmOeKtuaAgemDqOWIhuS4reeahOavj+S4quaVsOWtlwo+ICvpg73mmL7npLrkuoblm7Tnu5Xo rr/pl67lnLDlnYDnmoTlhbbkuK3kuIDkuKrlhoXlrZjpopfnspLnmoTnirbmgIHjgIIKPiArCj4g K+WvueS6jumAmueUqEtBU0FO77yM5q+P5Liq5YaF5a2Y6aKX57KS55qE5aSn5bCP5Li6OOS4quWt l+iKguOAguavj+S4qumil+eykueahOeKtuaAgeiiq+e8lueggeWcqOS4gOS4quW9seWtkOWtl+iK ggo+ICvkuK3jgILov5k45Liq5a2X6IqC5Y+v5Lul5piv5Y+v6K6/6Zeu55qE77yM6YOo5YiG6K6/ 6Zeu55qE77yM5bey6YeK5pS+55qE5oiW5oiQ5Li6UmVkem9uZeeahOS4gOmDqOWIhuOAgktBU0FO Cj4gK+Wvueavj+S4quW9seWtkOWtl+iKguS9v+eUqOS7peS4i+e8lueggTowMOihqOekuuWvueW6 lOWGheWtmOWMuuWfn+eahOaJgOaciTjkuKrlrZfoioLpg73lj6/ku6Xorr/pl67vvJvmlbDlrZdO Cj4gKygxIDw9IE4gPD0gNynooajnpLrliY1O5Liq5a2X6IqC5Y+v6K6/6Zeu77yM5YW25LuWKDgg LSBOKeS4quWtl+iKguS4jeWPr+iuv+mXru+8m+S7u+S9lei0n+WAvOmDveihqOekugo+ICvml6Dm s5Xorr/pl67mlbTkuKo45a2X6IqC44CCS0FTQU7kvb/nlKjkuI3lkIznmoTotJ/lgLzmnaXljLrl iIbkuI3lkIznsbvlnovnmoTkuI3lj6/orr/pl67lhoXlrZjvvIzlpoJyZWR6b25lcwo+ICvmiJbl t7Lph4rmlL7nmoTlhoXlrZjvvIjlj4Lop4EgbW0va2FzYW4va2FzYW4uaO+8ieOAggo+ICsKPiAr 5Zyo5LiK6Z2i55qE5oql5ZGK5Lit77yM566t5aS05oyH5ZCR5b2x5a2Q5a2X6IqCIGBgMDNgYCDv vIzooajnpLrorr/pl67nmoTlnLDlnYDmmK/pg6jliIblj6/orr/pl67nmoTjgIIKPiArCj4gK+Wv ueS6juWfuuS6juagh+etvueahEtBU0FO5qih5byP77yM5oql5ZGK5pyA5ZCO55qE6YOo5YiG5pi+ 56S65LqG6K6/6Zeu5Zyw5Z2A5ZGo5Zu055qE5YaF5a2Y5qCH562+Cj4gKyjlj4LogIMgYOWunuaW vee7huWImWBfIOeroOiKginjgIIKPiArCj4gK+ivt+azqOaEj++8jEtBU0FO6ZSZ6K+v5qCH6aKY 77yI5aaCIGBgc2xhYi1vdXQtb2YtYm91bmRzYGAg5oiWIGBgdXNlLWFmdGVyLWZyZWVgYCDvvIkK PiAr5piv5bC96YeP5o6l6L+R55qEOktBU0FO5qC55o2u5YW25oul5pyJ55qE5pyJ6ZmQ5L+h5oGv 5omT5Y2w5Ye65pyA5Y+v6IO955qE6ZSZ6K+v57G75Z6L44CC6ZSZ6K+v55qE5a6e6ZmF57G75Z6L Cj4gK+WPr+iDveS8muacieaJgOS4jeWQjOOAggo+ICsKPiAr6YCa55SoS0FTQU7ov5jmiqXlkYrk uKTkuKrovoXliqnosIPnlKjloIbmoIjot5/ouKrjgILov5nkupvloIbmoIjot5/ouKrmjIflkJHk u6PnoIHkuK3kuI7lr7nosaHkuqTkupLkvYbkuI3nm7TmjqUKPiAr5Ye6546w5Zyo6ZSZ6K+v6K6/ 6Zeu5aCG5qCI6Lef6Liq5Lit55qE5L2N572u44CC55uu5YmN77yM6L+Z5YyF5ousIGNhbGxfcmN1 KCkg5ZKM5o6S6Zif55qE5bel5L2c6Zif5YiX44CCCj4gKwo+ICvlkK/liqjlj4LmlbAKPiArfn5+ fn5+fn4KPiArCj4gK0tBU0FO5Y+X6YCa55SoIGBgcGFuaWNfb25fd2FybmBgIOWRveS7pOihjOWP guaVsOeahOW9seWTjeOAguWQr+eUqOivpeWKn+iDveWQju+8jEtBU0FO5Zyo5omT5Y2w6ZSZ6K+v Cj4gK+aKpeWRiuWQjuS8muW8lei1t+WGheaguOaBkOaFjOOAggo+ICsKPiAr6buY6K6k5oOF5Ya1 5LiL77yMS0FTQU7lj6rkuLrnrKzkuIDmrKHml6DmlYjlhoXlrZjorr/pl67miZPljbDplJnor6/m iqXlkYrjgILkvb/nlKggYGBrYXNhbl9tdWx0aV9zaG90YGAg77yMCj4gK0tBU0FO5Lya6ZKI5a+5 5q+P5Liq5peg5pWI6K6/6Zeu5omT5Y2w5oql5ZGK44CC6L+Z5pyJ5pWI5Zyw56aB55So5LqGS0FT QU7miqXlkYrnmoQgYGBwYW5pY19vbl93YXJuYGAg44CCCj4gKwo+ICvln7rkuo7noazku7bmoIfn rb7nmoRLQVNBTuaooeW8j++8iOivt+WPgumYheS4i+mdouacieWFs+WQhOenjeaooeW8j+eahOmD qOWIhu+8ieaXqOWcqOWcqOeUn+S6p+S4reeUqOS9nOWuieWFqOe8k+inowo+ICvmjqrmlr3jgILl m6DmraTvvIzlroPmlK/mjIHlhYHorrjnpoHnlKhLQVNBTuaIluaOp+WItuWFtuWKn+iDveeahOW8 leWvvOWPguaVsOOAggo+ICsKPiArLSBgYGthc2FuPW9mZmBgIOaIliBgYD1vbmBgIOaOp+WItktB U0FO5piv5ZCm5ZCv55SoICjpu5jorqQ6IGBgb25gYCAp44CCCj4gKwo+ICstIGBga2FzYW4ubW9k ZT1zeW5jYGAg5oiWIGBgPWFzeW5jYGAg5o6n5Yi2S0FTQU7mmK/lkKbphY3nva7kuLrlkIzmraXm iJblvILmraXmiafooYzmqKHlvI8o6buY6K6kOgo+ICsgIGBgc3luY2BgICnjgILlkIzmraXmqKHl vI/vvJrlvZPmoIfnrb7mo4Dmn6XplJnor6/lj5HnlJ/ml7bvvIznq4vljbPmo4DmtYvliLDplJno r6/orr/pl67jgILlvILmraXmqKHlvI/vvJoKPiArICDlu7bov5/plJnor6/orr/pl67mo4DmtYvj gILlvZPmoIfnrb7mo4Dmn6XplJnor6/lj5HnlJ/ml7bvvIzkv6Hmga/lrZjlgqjlnKjnoazku7bk uK3vvIjlnKhhcm02NOeahAo+ICsgIFRGU1JfRUwx5a+E5a2Y5Zmo5Lit77yJ44CC5YaF5qC45Lya 5a6a5pyf5qOA5p+l56Gs5Lu277yM5bm25LiU5LuF5Zyo6L+Z5Lqb5qOA5p+l5pyf6Ze05oql5ZGK 5qCH562+6ZSZ6K+v44CCCj4gKwo+ICstIGBga2FzYW4uc3RhY2t0cmFjZT1vZmZgYCDmiJYgYGA9 b25gYCDnpoHnlKjmiJblkK/nlKhhbGxvY+WSjGZyZWXloIbmoIjot5/ouKrmlLbpm4YKPiArICAo 6buY6K6kOiBgYG9uYGAgKeOAggo+ICsKPiArLSBgYGthc2FuLmZhdWx0PXJlcG9ydGBgIOaIliBg YD1wYW5pY2BgIOaOp+WItuaYr+WPquaJk+WNsEtBU0FO5oql5ZGK6L+Y5piv5ZCM5pe25L2/5YaF 5qC45oGQ5oWMCj4gKyAgKOm7mOiupDogYGByZXBvcnRgYCAp44CC5Y2z5L2/5ZCv55So5LqGIGBg a2FzYW5fbXVsdGlfc2hvdGBgIO+8jOS5n+S8muWPkeeUn+WGheaguOaBkOaFjOOAggo+ICsKPiAr 5a6e5pa957uG5YiZCj4gKy0tLS0tLS0tCj4gKwo+ICvpgJrnlKhLQVNBTgo+ICt+fn5+fn5+fn4K PiArCj4gK+i9r+S7tktBU0FO5qih5byP5L2/55So5b2x5a2Q5YaF5a2Y5p2l6K6w5b2V5q+P5Liq 5YaF5a2Y5a2X6IqC5piv5ZCm5Y+v5Lul5a6J5YWo6K6/6Zeu77yM5bm25L2/55So57yW6K+R5pe2 5bel5YW3Cj4gK+WcqOavj+asoeWGheWtmOiuv+mXruS5i+WJjeaPkuWFpeW9seWtkOWGheWtmOaj gOafpeOAggo+ICsKPiAr6YCa55SoS0FTQU7lsIYxLzjnmoTlhoXmoLjlhoXlrZjkuJPnlKjkuo7l hbblvbHlrZDlhoXlrZjvvIgxNlRC5Lul6KaG55uWeDg2XzY05LiK55qEMTI4VELvvInvvIzlubbk vb/nlKgKPiAr5YW35pyJ5q+U5L6L5ZKM5YGP56e76YeP55qE55u05o6l5pig5bCE5bCG5YaF5a2Y 5Zyw5Z2A6L2s5o2i5Li65YW255u45bqU55qE5b2x5a2Q5Zyw5Z2A44CCCj4gKwo+ICvov5nmmK/l sIblnLDlnYDovazmjaLkuLrlhbbnm7jlupTlvbHlrZDlnLDlnYDnmoTlh73mlbA6Ogo+ICsKPiAr ICAgIHN0YXRpYyBpbmxpbmUgdm9pZCAqa2FzYW5fbWVtX3RvX3NoYWRvdyhjb25zdCB2b2lkICph ZGRyKQo+ICsgICAgewo+ICsJcmV0dXJuICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWFkZHIgPj4g S0FTQU5fU0hBRE9XX1NDQUxFX1NISUZUKQo+ICsJCSsgS0FTQU5fU0hBRE9XX09GRlNFVDsKPiAr ICAgIH0KPiArCj4gK+WcqOi/memHjCBgYEtBU0FOX1NIQURPV19TQ0FMRV9TSElGVCA9IDNgYCDj gIIKPiArCj4gK+e8luivkeaXtuW3peWFt+eUqOS6juaPkuWFpeWGheWtmOiuv+mXruajgOafpeOA gue8luivkeWZqOWcqOavj+asoeiuv+mXruWkp+Wwj+S4ujHjgIEy44CBNOOAgTjmiJYxNueahOWG heWtmOS5i+WJjQo+ICvmj5LlhaXlh73mlbDosIPnlKgoIGBgX19hc2FuX2xvYWQqKGFkZHIpYGAg LCBgYF9fYXNhbl9zdG9yZSooYWRkcilgYCnjgILov5nkupvlh73mlbDpgJrov4cKPiAr5qOA5p+l 55u45bqU55qE5b2x5a2Q5YaF5a2Y5p2l5qOA5p+l5YaF5a2Y6K6/6Zeu5piv5ZCm5pyJ5pWI44CC Cj4gKwo+ICvkvb/nlKhpbmxpbmXmj5LmoanvvIznvJbor5HlmajkuI3ov5vooYzlh73mlbDosIPn lKjvvIzogIzmmK/nm7TmjqXmj5LlhaXku6PnoIHmnaXmo4Dmn6XlvbHlrZDlhoXlrZjjgILmraTp gInpobkKPiAr5pi+6JGX5Zyw5aKe5aSn5LqG5YaF5qC45L2T56ev77yM5L2G5LiOb3V0bGluZeaP kuahqeWGheaguOebuOavlO+8jOWug+aPkOS+m+S6hngxLjEteDLnmoTmgKfog73mj5DljYfjgIIK PiArCj4gK+mAmueUqEtBU0FO5piv5ZSv5LiA5LiA56eN6YCa6L+H6ZqU56a75bu26L+f6YeN5paw 5L2/55So5bey6YeK5pS+5a+56LGh55qE5qih5byPCj4gK++8iOWPguingSBtbS9rYXNhbi9xdWFy YW50aW5lLmMg5Lul5LqG6Kej5a6e546w77yJ44CCCj4gKwo+ICvln7rkuo7ova/ku7bmoIfnrb7n moRLQVNBTuaooeW8jwo+ICt+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgo+ICsKPiAr5Z+65LqO6L2v 5Lu25qCH562+55qES0FTQU7kvb/nlKjova/ku7blhoXlrZjmoIfnrb7mlrnms5XmnaXmo4Dmn6Xo rr/pl67mnInmlYjmgKfjgILnm67liY3ku4Xpkojlr7lhcm02NOaetuaehOWunueOsOOAggo+ICsK PiAr5Z+65LqO6L2v5Lu25qCH562+55qES0FTQU7kvb/nlKhhcm02NCBDUFXnmoTpobbpg6jlrZfo ioLlv73nlaUoVEJJKeeJueaAp+WcqOWGheaguOaMh+mSiOeahOmhtumDqOWtl+iKguS4rQo+ICvl rZjlgqjkuIDkuKrmjIfpkojmoIfnrb7jgILlroPkvb/nlKjlvbHlrZDlhoXlrZjmnaXlrZjlgqjk uI7mr4/kuKoxNuWtl+iKguWGheWtmOWNleWFg+ebuOWFs+eahOWGheWtmOagh+etvijlm6DmraTv vIwKPiAr5a6D5bCG5YaF5qC45YaF5a2Y55qEMS8xNuS4k+eUqOS6juW9seWtkOWGheWtmCnjgIIK PiArCj4gK+WcqOavj+asoeWGheWtmOWIhumFjeaXtu+8jOWfuuS6jui9r+S7tuagh+etvueahEtB U0FO6YO95Lya55Sf5oiQ5LiA5Liq6ZqP5py65qCH562+77yM55So6L+Z5Liq5qCH562+5qCH6K6w 5YiG6YWNCj4gK+eahOWGheWtmO+8jOW5tuWwhuebuOWQjOeahOagh+etvuW1jOWFpeWIsOi/lOWb nueahOaMh+mSiOS4reOAggo+ICsKPiAr5Z+65LqO6L2v5Lu25qCH562+55qES0FTQU7kvb/nlKjn vJbor5Hml7blt6XlhbflnKjmr4/mrKHlhoXlrZjorr/pl67kuYvliY3mj5LlhaXmo4Dmn6XjgILo v5nkupvmo4Dmn6Xnoa7kv53mraPlnKgKPiAr6K6/6Zeu55qE5YaF5a2Y55qE5qCH562+562J5LqO 55So5LqO6K6/6Zeu6K+l5YaF5a2Y55qE5oyH6ZKI55qE5qCH562+44CC5aaC5p6c5qCH562+5LiN 5Yy56YWN77yM5Z+65LqO6L2v5Lu25qCH562+Cj4gK+eahEtBU0FO5Lya5omT5Y2w6ZSZ6K+v5oql 5ZGK44CCCj4gKwo+ICvln7rkuo7ova/ku7bmoIfnrb7nmoRLQVNBTuS5n+acieS4pOenjeaPkuah qeaooeW8j++8iG91dGxpbmXvvIzlj5Hlh7rlm57osIPmnaXmo4Dmn6XlhoXlrZjorr/pl67vvJtp bmxpbmXvvIwKPiAr5omn6KGM5YaF6IGU55qE5b2x5a2Q5YaF5a2Y5qOA5p+l77yJ44CC5L2/55So b3V0bGluZeaPkuahqeaooeW8j++8jOS8muS7juaJp+ihjOiuv+mXruajgOafpeeahOWHveaVsOaJ k+WNsOmUmeivrwo+ICvmiqXlkYrjgILkvb/nlKhpbmxpbmXmj5LmoanvvIznvJbor5HlmajkvJrl j5Hlh7ogYGBicmtgYCDmjIfku6TvvIzlubbkvb/nlKjkuJPnlKjnmoQgYGBicmtgYCDlpITnkIbn qIvluo8KPiAr5p2l5omT5Y2w6ZSZ6K+v5oql5ZGK44CCCj4gKwo+ICvln7rkuo7ova/ku7bmoIfn rb7nmoRLQVNBTuS9v+eUqDB4RkbkvZzkuLrljLnphY3miYDmnInmjIfpkojmoIfnrb7vvIjkuI3m o4Dmn6XpgJrov4fluKbmnIkweEZG5oyH6ZKI5qCH562+Cj4gK+eahOaMh+mSiOi/m+ihjOeahOiu v+mXru+8ieOAguWAvDB4RkXlvZPliY3kv53nlZnnlKjkuo7moIforrDlt7Lph4rmlL7nmoTlhoXl rZjljLrln5/jgIIKPiArCj4gK+WfuuS6jui9r+S7tuagh+etvueahEtBU0FO55uu5YmN5LuF5pSv 5oyB5a+5U2xhYuWSjHBhZ2VfYWxsb2PlhoXlrZjov5vooYzmoIforrDjgIIKPiArCj4gK+WfuuS6 juehrOS7tuagh+etvueahEtBU0FO5qih5byPCj4gK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Cj4g Kwo+ICvln7rkuo7noazku7bmoIfnrb7nmoRLQVNBTuWcqOamguW/teS4iuexu+S8vOS6jui9r+S7 tuaooeW8j++8jOS9huWug+aYr+S9v+eUqOehrOS7tuWGheWtmOagh+etvuS9nOS4uuaUr+aMgeiA jAo+ICvkuI3mmK/nvJbor5Hlmajmj5LmoanlkozlvbHlrZDlhoXlrZjjgIIKPiArCj4gK+WfuuS6 juehrOS7tuagh+etvueahEtBU0FO55uu5YmN5LuF6ZKI5a+5YXJtNjTmnrbmnoTlrp7njrDvvIzl ubbkuJTln7rkuo5BUk12OC415oyH5Luk6ZuG5p625p6E5Lit5byV5YWlCj4gK+eahGFybTY05YaF 5a2Y5qCH6K6w5omp5bGVKE1URSnlkozmnIDpq5jlrZfoioLlv73nlaUoVEJJKeOAggo+ICsKPiAr 54m55q6K55qEYXJtNjTmjIfku6TnlKjkuo7kuLrmr4/mrKHlhoXlrZjliIbphY3mjIflrprlhoXl rZjmoIfnrb7jgILnm7jlkIznmoTmoIfnrb7ooqvmjIflrprnu5nmjIflkJHov5nkupvliIbphY0K PiAr55qE5oyH6ZKI44CC5Zyo5q+P5qyh5YaF5a2Y6K6/6Zeu5pe277yM56Gs5Lu256Gu5L+d5q2j 5Zyo6K6/6Zeu55qE5YaF5a2Y55qE5qCH562+562J5LqO55So5LqO6K6/6Zeu6K+l5YaF5a2Y55qE 5oyH6ZKICj4gK+eahOagh+etvuOAguWmguaenOagh+etvuS4jeWMuemFje+8jOWImeS8mueUn+aI kOaVhemanOW5tuaJk+WNsOaKpeWRiuOAggo+ICsKPiAr5Z+65LqO56Gs5Lu25qCH562+55qES0FT QU7kvb/nlKgweEZG5L2c5Li65Yy56YWN5omA5pyJ5oyH6ZKI5qCH562+77yI5LiN5qOA5p+l6YCa 6L+H5bim5pyJMHhGRuaMh+mSiOagh+etvueahAo+ICvmjIfpkojov5vooYznmoTorr/pl67vvInj gILlgLwweEZF5b2T5YmN5L+d55WZ55So5LqO5qCH6K6w5bey6YeK5pS+55qE5YaF5a2Y5Yy65Z+f 44CCCj4gKwo+ICvln7rkuo7noazku7bmoIfnrb7nmoRLQVNBTuebruWJjeS7heaUr+aMgeWvuVNs YWLlkoxwYWdlX2FsbG9j5YaF5a2Y6L+b6KGM5qCH6K6w44CCCj4gKwo+ICvlpoLmnpznoazku7bk uI3mlK/mjIFNVEXvvIhBUk12OC415LmL5YmN77yJ77yM5YiZ5LiN5Lya5ZCv55So5Z+65LqO56Gs 5Lu25qCH562+55qES0FTQU7jgILlnKjov5nnp43mg4XlhrXkuIvvvIwKPiAr5omA5pyJS0FTQU7l vJXlr7zlj4LmlbDpg73lsIbooqvlv73nlaXjgIIKPiArCj4gK+ivt+azqOaEj++8jOWQr+eUqENP TkZJR19LQVNBTl9IV19UQUdT5aeL57uI5Lya5a+86Ie05ZCv55So5YaF5qC45Lit55qEVEJJ44CC 5Y2z5L2/5o+Q5L6b5LqGCj4gK2Bga2FzYW4ubW9kZT1vZmZgYCDmiJbnoazku7bkuI3mlK/mjIFN VEXvvIjkvYbmlK/mjIFUQknvvInjgIIKPiArCj4gK+WfuuS6juehrOS7tuagh+etvueahEtBU0FO 5Y+q5oql5ZGK56ys5LiA5Liq5Y+R546w55qE6ZSZ6K+v44CC5LmL5ZCO77yMTVRF5qCH562+5qOA 5p+l5bCG6KKr56aB55So44CCCj4gKwo+ICvlvbHlrZDlhoXlrZgKPiArLS0tLS0tLS0KPiArCj4g K+WGheaguOWwhuWGheWtmOaYoOWwhOWIsOWcsOWdgOepuumXtOeahOWHoOS4quS4jeWQjOmDqOWI huOAguWGheaguOiZmuaLn+WcsOWdgOeahOiMg+WbtOW+iOWkp++8muayoeaciei2s+Wkn+eahOec n+Wungo+ICvlhoXlrZjmnaXmlK/mjIHlhoXmoLjlj6/ku6Xorr/pl67nmoTmr4/kuKrlnLDlnYDn moTnnJ/lrp7lvbHlrZDljLrln5/jgILlm6DmraTvvIxLQVNBTuWPquS4uuWcsOWdgOepuumXtOea hOafkOS6mwo+ICvpg6jliIbmmKDlsITnnJ/lrp7nmoTlvbHlrZDjgIIKPiArCj4gK+m7mOiupOih jOS4ugo+ICt+fn5+fn5+fgo+ICsKPiAr6buY6K6k5oOF5Ya15LiL77yM5L2T57O757uT5p6E5LuF 5bCG5a6e6ZmF5YaF5a2Y5pig5bCE5Yiw55So5LqO57q/5oCn5pig5bCE55qE6Zi05b2x5Yy65Z+f 77yI5Lul5Y+K5Y+v6IO955qE5YW25LuWCj4gK+Wwj+WMuuWfn++8ieOAguWvueS6juaJgOacieWF tuS7luWMuuWfnyDigJTigJQg5L6L5aaCdm1hbGxvY+WSjHZtZW1tYXDnqbrpl7Qg4oCU4oCUIOS4 gOS4quWPquivu+mhtemdouiiq+aYoOWwhAo+ICvliLDpmLTlvbHljLrln5/kuIrjgILov5nkuKrl j6ror7vnmoTlvbHlrZDpobXpnaLlo7DmmI7miYDmnInlhoXlrZjorr/pl67pg73mmK/lhYHorrjn moTjgIIKPiArCj4gK+i/mee7meaooeWdl+W4puadpeS6huS4gOS4qumXrumimO+8muWug+S7rOS4 jeWtmOWcqOS6jue6v+aAp+aYoOWwhOS4re+8jOiAjOaYr+WtmOWcqOS6juS4k+eUqOeahOaooeWd l+epuumXtOS4reOAggo+ICvpgJrov4fov57mjqXmqKHlnZfliIbphY3lmajvvIxLQVNBTuS4tOaX tuaYoOWwhOecn+WunueahOW9seWtkOWGheWtmOS7peimhuebluWug+S7rOOAguS+i+Wmgu+8jOi/ meWFgeiuuOajgOa1iwo+ICvlr7nmqKHlnZflhajlsYDlj5jph4/nmoTml6DmlYjorr/pl67jgIIK PiArCj4gK+i/meS5n+mAoOaIkOS6huS4jiBgYFZNQVBfU1RBQ0tgYCDnmoTkuI3lhbzlrrnvvJrl poLmnpzloIbmoIjkvY3kuo52bWFsbG9j56m66Ze05Lit77yM5a6D5bCG6KKr5YiG6YWNCj4gK+WP quivu+mhtemdoueahOW9seWtkOWGheWtmO+8jOW5tuS4lOWGheaguOWcqOWwneivleS4uuWghuag iOWPmOmHj+iuvue9ruW9seWtkOaVsOaNruaXtuS8muWHuumUmeOAggo+ICsKPiArQ09ORklHX0tB U0FOX1ZNQUxMT0MKPiArfn5+fn5+fn5+fn5+fn5+fn5+fn4KPiArCj4gK+S9v+eUqCBgYENPTkZJ R19LQVNBTl9WTUFMTE9DYGAg77yMS0FTQU7lj6/ku6Xku6Xmm7TlpKfnmoTlhoXlrZjkvb/nlKjk uLrku6Pku7fopobnm5Z2bWFsbG9jCj4gK+epuumXtOOAguebruWJje+8jOi/meWcqHg4NuOAgXJp c2N244CBczM5MOWSjHBvd2VycGPkuIrlj5fmlK/mjIHjgIIKPiArCj4gK+i/memAmui/h+i/nuaO peWIsHZtYWxsb2Plkox2bWFw5bm25Yqo5oCB5YiG6YWN55yf5a6e55qE5b2x5a2Q5YaF5a2Y5p2l 5pSv5oyB5pig5bCE44CCCj4gKwo+ICt2bWFsbG9j56m66Ze05Lit55qE5aSn5aSa5pWw5pig5bCE 6YO95b6I5bCP77yM6ZyA6KaB5LiN5Yiw5LiA5pW06aG155qE6Zi05b2x56m66Ze044CC5Zug5q2k 77yM5Li65q+P5Liq5pig5bCECj4gK+WIhumFjeS4gOS4quWujOaVtOeahOW9seWtkOmhtemdouWw huaYr+S4gOenjea1qui0ueOAguatpOWklu+8jOS4uuS6huehruS/neS4jeWQjOeahOaYoOWwhOS9 v+eUqOS4jeWQjOeahOW9seWtkAo+ICvpobXpnaLvvIzmmKDlsITlv4XpobvkuI4gYGBLQVNBTl9H UkFOVUxFX1NJWkUgKiBQQUdFX1NJWkVgYCDlr7npvZDjgIIKPiArCj4gK+ebuOWPje+8jEtBU0FO 6Leo5aSa5Liq5pig5bCE5YWx5Lqr5ZCO5aSH56m66Ze044CC5b2Tdm1hbGxvY+epuumXtOS4reea hOaYoOWwhOS9v+eUqOW9seWtkOWMuuWfn+eahOeJueWumgo+ICvpobXpnaLml7bvvIzlroPkvJrl iIbphY3kuIDkuKrlkI7lpIfpobXpnaLjgILmraTpobXpnaLnqI3lkI7lj6/ku6XnlLHlhbbku5Z2 bWFsbG9j5pig5bCE5YWx5Lqr44CCCj4gKwo+ICtLQVNBTui/nuaOpeWIsHZtYXDln7rnoYDmnrbm noTku6Xmh5LmuIXnkIbmnKrkvb/nlKjnmoTlvbHlrZDlhoXlrZjjgIIKPiArCj4gK+S4uuS6humB v+WFjeS6pOaNouaYoOWwhOeahOWbsOmavu+8jEtBU0FO6aKE5rWL6KaG55uWdm1hbGxvY+epuumX tOeahOmYtOW9seWMuuWfn+mDqOWIhuWwhuS4jeS8muiiq+aXqeacnwo+ICvnmoTpmLTlvbHpobXp naLopobnm5bvvIzkvYbmmK/lsIbkuI3kvJrooqvmmKDlsITjgILov5nlsIbpnIDopoHmm7TmlLnn ibnlrprkuo5hcmNo55qE5Luj56CB44CCCj4gKwo+ICvov5nlhYHorrjlnKh4ODbkuIrmlK/mjIEg YGBWTUFQX1NUQUNLYGAg77yM5bm25LiU5Y+v5Lul566A5YyW5a+55rKh5pyJ5Zu65a6a5qih5Z2X 5Yy65Z+f55qE5p625p6E55qE5pSv5oyB44CCCj4gKwo+ICvlr7nkuo7lvIDlj5HogIUKPiArLS0t LS0tLS0tLQo+ICsKPiAr5b+955Wl6K6/6ZeuCj4gK35+fn5+fn5+Cj4gKwo+ICvova/ku7ZLQVNB TuaooeW8j+S9v+eUqOe8luivkeWZqOaPkuahqeadpeaPkuWFpeacieaViOaAp+ajgOafpeOAguat pOexu+ajgOa1i+WPr+iDveS4juWGheaguOeahOafkOS6m+mDqOWIhgo+ICvkuI3lhbzlrrnvvIzl m6DmraTpnIDopoHnpoHnlKjjgIIKPiArCj4gK+WGheaguOeahOWFtuS7lumDqOWIhuWPr+iDveS8 muiuv+mXruW3suWIhumFjeWvueixoeeahOWFg+aVsOaNruOAgumAmuW4uO+8jEtBU0FO5Lya5qOA 5rWL5bm25oql5ZGK5q2k57G76K6/6Zeu77yMCj4gK+S9huWcqOafkOS6m+aDheWGteS4i++8iOS+ i+Wmgu+8jOWcqOWGheWtmOWIhumFjeWZqOS4re+8ie+8jOi/meS6m+iuv+mXruaYr+acieaViOea hOOAggo+ICsKPiAr5a+55LqO6L2v5Lu2S0FTQU7mqKHlvI/vvIzopoHnpoHnlKjnibnlrprmlofk u7bmiJbnm67lvZXnmoTmo4DmtYvvvIzor7flsIYgYGBLQVNBTl9TQU5JVElaRWBgIOa3u+WKoAo+ ICvliLDnm7jlupTnmoTlhoXmoLhNYWtlZmlsZeS4rToKPiArCj4gKy0g5a+55LqO5Y2V5Liq5paH 5Lu2KOS+i+Wmgu+8jG1haW4ubyk6Ogo+ICsKPiArICAgIEtBU0FOX1NBTklUSVpFX21haW4ubyA6 PSBuCj4gKwo+ICstIOWvueS6juS4gOS4quebruW9leS4i+eahOaJgOacieaWh+S7tjo6Cj4gKwo+ ICsgICAgS0FTQU5fU0FOSVRJWkUgOj0gbgo+ICsKPiAr5a+55LqO6L2v5Lu2S0FTQU7mqKHlvI/v vIzopoHlnKjmr4/kuKrlh73mlbDnmoTln7rnoYDkuIrnpoHnlKjmo4DmtYvvvIzor7fkvb/nlKhL QVNBTueJueWumueahAo+ICtgYF9fbm9fc2FuaXRpemVfYWRkcmVzc2BgIOWHveaVsOWxnuaAp+aI lumAmueUqOeahCBgYG5vaW5zdHJgYCDjgIIKPiArCj4gK+ivt+azqOaEj++8jOemgeeUqOe8luiv keWZqOaPkuahqe+8iOWfuuS6juavj+S4quaWh+S7tuaIluavj+S4quWHveaVsO+8ieS8muS9v0tB U0FO5b+955Wl5Zyo6L2v5Lu2S0FTQU7mqKHlvI8KPiAr55qE5Luj56CB5Lit55u05o6l5Y+R55Sf 55qE6K6/6Zeu44CC5b2T6K6/6Zeu5piv6Ze05o6l5Y+R55Sf55qE77yI6YCa6L+H6LCD55So5qOA 5rWL5Ye95pWw77yJ5oiW5L2/55So5rKh5pyJ57yW6K+R5ZmoCj4gK+aPkuahqeeahOWfuuS6jueh rOS7tuagh+etvueahOaooeW8j+aXtu+8jOWug+ayoeacieW4ruWKqeOAggo+ICsKPiAr5a+55LqO 6L2v5Lu2S0FTQU7mqKHlvI/vvIzopoHlnKjlvZPliY3ku7vliqHnmoTkuIDpg6jliIblhoXmoLjk u6PnoIHkuK3npoHnlKhLQVNBTuaKpeWRiu+8jOivt+S9v+eUqAo+ICtgYGthc2FuX2Rpc2FibGVf Y3VycmVudCgpYGAvYGBrYXNhbl9lbmFibGVfY3VycmVudCgpYGAg6YOo5YiG5rOo6YeK6L+Z6YOo 5YiG5Luj56CB44CCCj4gK+i/meS5n+S8muemgeeUqOmAmui/h+WHveaVsOiwg+eUqOWPkeeUn+ea hOmXtOaOpeiuv+mXrueahOaKpeWRiuOAggo+ICsKPiAr5a+55LqO5Z+65LqO5qCH562+55qES0FT QU7mqKHlvI/vvIjljIXmi6znoazku7bmqKHlvI/vvInvvIzopoHnpoHnlKjorr/pl67mo4Dmn6Xv vIzor7fkvb/nlKgKPiArYGBrYXNhbl9yZXNldF90YWcoKWBgIOaIliBgYHBhZ2Vfa2FzYW5fdGFn X3Jlc2V0KClgYCDjgILor7fms6jmhI/vvIzpgJrov4cKPiArYGBwYWdlX2thc2FuX3RhZ19yZXNl dCgpYGAg5Li05pe256aB55So6K6/6Zeu5qOA5p+l6ZyA6KaB6YCa6L+HIGBgcGFnZV9rYXNhbl90 YWdgYAo+ICsvIGBgcGFnZV9rYXNhbl90YWdfc2V0YGAg5L+d5a2Y5ZKM5oGi5aSN5q+P6aG1S0FT QU7moIfnrb7jgIIKPiArCj4gK+a1i+ivlQo+ICt+fn5+Cj4gKwo+ICvmnInkuIDkuptLQVNBTua1 i+ivleWPr+S7pemqjOivgUtBU0FO5piv5ZCm5q2j5bi45bel5L2c5bm25Y+v5Lul5qOA5rWL5p+Q 5Lqb57G75Z6L55qE5YaF5a2Y5o2f5Z2P44CCCj4gK+a1i+ivleeUseS4pOmDqOWIhue7hOaIkDoK PiArCj4gKzEuIOS4jktVbml05rWL6K+V5qGG5p626ZuG5oiQ55qE5rWL6K+V44CC5L2/55SoIGBg Q09ORklHX0tBU0FOX0tVTklUX1RFU1RgYCDlkK/nlKjjgIIKPiAr6L+Z5Lqb5rWL6K+V5Y+v5Lul 6YCa6L+H5Yeg56eN5LiN5ZCM55qE5pa55byP6Ieq5Yqo6L+Q6KGM5ZKM6YOo5YiG6aqM6K+B77yb 6K+35Y+C6ZiF5LiL6Z2i55qE6K+05piO44CCCj4gKwo+ICsyLiDkuI5LVW5pdOS4jeWFvOWuueea hOa1i+ivleOAguS9v+eUqCBgYENPTkZJR19LQVNBTl9NT0RVTEVfVEVTVGBgIOWQr+eUqOW5tuS4 lOWPquiDveS9nOS4uuaooeWdlwo+ICvov5DooYzjgILov5nkupvmtYvor5Xlj6rog73pgJrov4fl iqDovb3lhoXmoLjmqKHlnZflubbmo4Dmn6XlhoXmoLjml6Xlv5fku6Xojrflj5ZLQVNBTuaKpeWR iuadpeaJi+WKqOmqjOivgeOAggo+ICsKPiAr5aaC5p6c5qOA5rWL5Yiw6ZSZ6K+v77yM5q+P5Liq S1VuaXTlhbzlrrnnmoRLQVNBTua1i+ivlemDveS8muaJk+WNsOWkmuS4qktBU0FO5oql5ZGK5LmL 5LiA77yM54S25ZCO5rWL6K+V5omT5Y2wCj4gK+WFtue8luWPt+WSjOeKtuaAgeOAggo+ICsKPiAr 5b2T5rWL6K+V6YCa6L+HOjoKPiArCj4gKyAgICAgICAgb2sgMjggLSBrbWFsbG9jX2RvdWJsZV9r emZyZWUKPiArCj4gK+W9k+eUseS6jiBgYGttYWxsb2NgYCDlpLHotKXogIzlr7zoh7TmtYvor5Xl pLHotKXml7Y6Ogo+ICsKPiArICAgICAgICAjIGttYWxsb2NfbGFyZ2Vfb29iX3JpZ2h0OiBBU1NF UlRJT04gRkFJTEVEIGF0IGxpYi90ZXN0X2thc2FuLmM6MTYzCj4gKyAgICAgICAgRXhwZWN0ZWQg cHRyIGlzIG5vdCBudWxsLCBidXQgaXMKPiArICAgICAgICBub3Qgb2sgNCAtIGttYWxsb2NfbGFy Z2Vfb29iX3JpZ2h0Cj4gKwo+ICvlvZPnlLHkuo7nvLrlsJFLQVNBTuaKpeWRiuiAjOWvvOiHtOa1 i+ivleWksei0peaXtjo6Cj4gKwo+ICsgICAgICAgICMga21hbGxvY19kb3VibGVfa3pmcmVlOiBF WFBFQ1RBVElPTiBGQUlMRUQgYXQgbGliL3Rlc3Rfa2FzYW4uYzo2MjkKPiArICAgICAgICBFeHBl Y3RlZCBrYXNhbl9kYXRhLT5yZXBvcnRfZXhwZWN0ZWQgPT0ga2FzYW5fZGF0YS0+cmVwb3J0X2Zv dW5kLCBidXQKPiArICAgICAgICBrYXNhbl9kYXRhLT5yZXBvcnRfZXhwZWN0ZWQgPT0gMQo+ICsg ICAgICAgIGthc2FuX2RhdGEtPnJlcG9ydF9mb3VuZCA9PSAwCj4gKyAgICAgICAgbm90IG9rIDI4 IC0ga21hbGxvY19kb3VibGVfa3pmcmVlCj4gKwo+ICvmnIDlkI7miZPljbDmiYDmnIlLQVNBTua1 i+ivleeahOe0r+enr+eKtuaAgeOAguaIkOWKnzo6Cj4gKwo+ICsgICAgICAgIG9rIDEgLSBrYXNh bgo+ICsKPiAr5oiW6ICF77yM5aaC5p6c5YW25Lit5LiA6aG55rWL6K+V5aSx6LSlOjoKPiArCj4g KyAgICAgICAgbm90IG9rIDEgLSBrYXNhbgo+ICsKPiAr5pyJ5Yeg56eN5pa55rOV5Y+v5Lul6L+Q 6KGM5LiOS1VuaXTlhbzlrrnnmoRLQVNBTua1i+ivleOAggo+ICsKPiArMS4g5Y+v5Yqg6L295qih 5Z2XCj4gKwo+ICsgICDlkK/nlKggYGBDT05GSUdfS1VOSVRgYCDlkI7vvIxLQVNBTi1LVW5pdOa1 i+ivleWPr+S7peaehOW7uuS4uuWPr+WKoOi9veaooeWdl++8jOW5tumAmui/h+S9v+eUqAo+ICsg ICBgYGluc21vZGBgIOaIliBgYG1vZHByb2JlYGAg5Yqg6L29IGBgdGVzdF9rYXNhbi5rb2BgIOad pei/kOihjOOAggo+ICsKPiArMi4g5YaF572uCj4gKwo+ICsgICDpgJrov4flhoXnva4gYGBDT05G SUdfS1VOSVRgYCDvvIzkuZ/lj6/ku6XlhoXnva5LQVNBTi1LVW5pdOa1i+ivleOAguWcqOi/meen jeaDheWGteS4i++8jAo+ICsgICDmtYvor5XlsIblnKjlkK/liqjml7bkvZzkuLrlkI7mnJ/liJ3l p4vljJbosIPnlKjov5DooYzjgIIKPiArCj4gKzMuIOS9v+eUqGt1bml0X3Rvb2wKPiArCj4gKyAg IOmAmui/h+WGhee9riBgYENPTkZJR19LVU5JVGBgIOWSjCBgYENPTkZJR19LQVNBTl9LVU5JVF9U RVNUYGAg77yM6L+Y5Y+v5Lul5L2/55SoCj4gKyAgIGBga3VuaXRfdG9vbGBgIOS7peabtOaYk+iv u+eahOaWueW8j+afpeeci0tVbml05rWL6K+V57uT5p6c44CC6L+Z5LiN5Lya5omT5Y2w6YCa6L+H 5rWL6K+VCj4gKyAgIOeahEtBU0FO5oql5ZGK44CC5pyJ5YWzIGBga3VuaXRfdG9vbGBgIOabtOWk muacgOaWsOS/oeaBr++8jOivt+WPgumYhQo+ICsgICBgS1VuaXTmlofmoaMgPGh0dHBzOi8vd3d3 Lmtlcm5lbC5vcmcvZG9jL2h0bWwvbGF0ZXN0L2Rldi10b29scy9rdW5pdC9pbmRleC5odG1sPmBf IOOAggo+ICsKPiArLi4gX0tVbml0OiBodHRwczovL3d3dy5rZXJuZWwub3JnL2RvYy9odG1sL2xh dGVzdC9kZXYtdG9vbHMva3VuaXQvaW5kZXguaHRtbAo+IAoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtcmlzY3YgbWFpbGluZyBsaXN0CmxpbnV4 LXJpc2N2QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFp bG1hbi9saXN0aW5mby9saW51eC1yaXNjdgo=