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=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT 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 8486DC47092 for ; Wed, 2 Jun 2021 12:57:07 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6C33C613F8 for ; Wed, 2 Jun 2021 12:57:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229790AbhFBM6t (ORCPT ); Wed, 2 Jun 2021 08:58:49 -0400 Received: from mail-m121144.qiye.163.com ([115.236.121.144]:46992 "EHLO mail-m121144.qiye.163.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229593AbhFBM6s (ORCPT ); Wed, 2 Jun 2021 08:58:48 -0400 Received: from vivo-HP-ProDesk-680-G4-PCI-MT.vivo.xyz (unknown [58.250.176.229]) by mail-m121144.qiye.163.com (Hmail) with ESMTPA id BE8B3AC04F0; Wed, 2 Jun 2021 20:57:01 +0800 (CST) From: Wan Jiabing To: Alex Shi , Jonathan Corbet , Paul Walmsley , Palmer Dabbelt , Albert Ou , Nathan Chancellor , Nick Desaulniers , Wu XiangCheng , Wan Jiabing , Fangrui Song , Bernard Zhao , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, clang-built-linux@googlegroups.com Subject: [PATCH] [v2] docs/zh_CN: add translations in zh_CN/dev-tools/kasan Date: Wed, 2 Jun 2021 20:56:38 +0800 Message-Id: <1622638607-12314-1-git-send-email-wanjiabing@vivo.com> X-Mailer: git-send-email 2.7.4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-HM-Spam-Status: e1kfGhgUHx5ZQUtXWQgYFAkeWUFZS1VLWVdZKFlBSE83V1ktWUFJV1kPCR oVCBIfWUFZQx1CQlYaQh1MHx4eTRhIQk1VEwETFhoSFyQUDg9ZV1kWGg8SFR0UWUFZT0tIVUpKS0 hOSFVLWQY+ X-HM-Sender-Digest: e1kMHhlZQR0aFwgeV1kSHx4VD1lBWUc6PAw6Vhw5PT8WNxUOKkgOLUlC ExYaCRFVSlVKTUlJTUhDTUlJTE9PVTMWGhIXVQwaFRESGhkSFRw7DRINFFUYFBZFWVdZEgtZQVlO Q1VJTktVSkxNVUlJQllXWQgBWUFJSEhOTzcG X-HM-Tid: 0a79cccc7643b039kuuube8b3ac04f0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add new zh translations * zh_CN/dev-tools/kasan.rst and link it to zh_CN/dev-tools/index.rst Signed-off-by: Wan Jiabing --- Changelog: v2: - Delete spaces surround with English words. --- .../translations/zh_CN/dev-tools/index.rst | 2 +- .../translations/zh_CN/dev-tools/kasan.rst | 431 +++++++++++++++++++++ 2 files changed, 432 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 fd73c47..e6c99f2 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 0000000..00add1d --- /dev/null +++ b/Documentation/translations/zh_CN/dev-tools/kasan.rst @@ -0,0 +1,431 @@ +.. 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 -- 2.7.4 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=-17.1 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT 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 1445FC47083 for ; Wed, 2 Jun 2021 13:05:44 +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 842F46121D for ; Wed, 2 Jun 2021 13:05:43 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 842F46121D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=vivo.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:MIME-Version:Message-Id:Date:Subject:To :From:Reply-To:Cc:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=S/KKWzqSCY4sMNZmGeIU+o8P4eX1xCGmNj/eBBxiqUQ=; b=SDutEncA7WXx+f RD87fxRdMpeZ02HEmq+2naCtpWQdop3yyx0vExyBIR5BI3uriHgX6cKRXehpj5Ssf1rUZ4gVmYiOV hi8tiFKRUfCHaEfT/hS2LwnEHVjGBlsbvRXriDi1eZIXvZwccHRUWKzZKEZpNsOfTSnyPL6v1UgFQ /9VG+AYSCJAf4VQ9xG1JNA7RNOfMiOQX7a8aPtT6IXSHPKOrxJGvF+FjjfHnmTj5QWtFqijimmWyX UnoGjVLmgA09dQ8BxT7nk9C6Kqpft16oJBuBCB90/26/vQlzAq3GQL4fz5nqdRLQ6hh+MVpI5+Ul1 5KKxcAY4Vi+JeWtbXXOw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1loQYj-004F1t-5h; Wed, 02 Jun 2021 13:05:21 +0000 Received: from mail-m121144.qiye.163.com ([115.236.121.144]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1loQQo-004CVB-0C for linux-riscv@lists.infradead.org; Wed, 02 Jun 2021 12:57:13 +0000 Received: from vivo-HP-ProDesk-680-G4-PCI-MT.vivo.xyz (unknown [58.250.176.229]) by mail-m121144.qiye.163.com (Hmail) with ESMTPA id BE8B3AC04F0; Wed, 2 Jun 2021 20:57:01 +0800 (CST) From: Wan Jiabing To: Alex Shi , Jonathan Corbet , Paul Walmsley , Palmer Dabbelt , Albert Ou , Nathan Chancellor , Nick Desaulniers , Wu XiangCheng , Wan Jiabing , Fangrui Song , Bernard Zhao , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, clang-built-linux@googlegroups.com Subject: [PATCH] [v2] docs/zh_CN: add translations in zh_CN/dev-tools/kasan Date: Wed, 2 Jun 2021 20:56:38 +0800 Message-Id: <1622638607-12314-1-git-send-email-wanjiabing@vivo.com> X-Mailer: git-send-email 2.7.4 MIME-Version: 1.0 X-HM-Spam-Status: e1kfGhgUHx5ZQUtXWQgYFAkeWUFZS1VLWVdZKFlBSE83V1ktWUFJV1kPCR oVCBIfWUFZQx1CQlYaQh1MHx4eTRhIQk1VEwETFhoSFyQUDg9ZV1kWGg8SFR0UWUFZT0tIVUpKS0 hOSFVLWQY+ X-HM-Sender-Digest: e1kMHhlZQR0aFwgeV1kSHx4VD1lBWUc6PAw6Vhw5PT8WNxUOKkgOLUlC ExYaCRFVSlVKTUlJTUhDTUlJTE9PVTMWGhIXVQwaFRESGhkSFRw7DRINFFUYFBZFWVdZEgtZQVlO Q1VJTktVSkxNVUlJQllXWQgBWUFJSEhOTzcG X-HM-Tid: 0a79cccc7643b039kuuube8b3ac04f0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210602_055710_446291_3266DEB3 X-CRM114-Status: GOOD ( 12.71 ) 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 QWRkIG5ldyB6aCB0cmFuc2xhdGlvbnMKKiB6aF9DTi9kZXYtdG9vbHMva2FzYW4ucnN0CmFuZCBs aW5rIGl0IHRvIHpoX0NOL2Rldi10b29scy9pbmRleC5yc3QKClNpZ25lZC1vZmYtYnk6IFdhbiBK aWFiaW5nIDx3YW5qaWFiaW5nQHZpdm8uY29tPgotLS0KQ2hhbmdlbG9nOgp2MjoKLSBEZWxldGUg c3BhY2VzIHN1cnJvdW5kIHdpdGggRW5nbGlzaCB3b3Jkcy4KLS0tCiAuLi4vdHJhbnNsYXRpb25z L3poX0NOL2Rldi10b29scy9pbmRleC5yc3QgICAgICAgICB8ICAgMiArLQogLi4uL3RyYW5zbGF0 aW9ucy96aF9DTi9kZXYtdG9vbHMva2FzYW4ucnN0ICAgICAgICAgfCA0MzEgKysrKysrKysrKysr KysrKysrKysrCiAyIGZpbGVzIGNoYW5nZWQsIDQzMiBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9u KC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04v ZGV2LXRvb2xzL2thc2FuLnJzdAoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdHJhbnNsYXRp b25zL3poX0NOL2Rldi10b29scy9pbmRleC5yc3QgYi9Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9u cy96aF9DTi9kZXYtdG9vbHMvaW5kZXgucnN0CmluZGV4IGZkNzNjNDcuLmU2Yzk5ZjIgMTAwNjQ0 Ci0tLSBhL0RvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2Rldi10b29scy9pbmRleC5y c3QKKysrIGIvRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vZGV2LXRvb2xzL2luZGV4 LnJzdApAQCAtMTksMTMgKzE5LDEzIEBACiAgICA6bWF4ZGVwdGg6IDIKIAogICAgZ2NvdgorICAg a2FzYW4KIAogVG9kb2xpc3Q6CiAKICAtIGNvY2NpbmVsbGUKICAtIHNwYXJzZQogIC0ga2Nvdgot IC0ga2FzYW4KICAtIHVic2FuCiAgLSBrbWVtbGVhawogIC0ga2NzYW4KZGlmZiAtLWdpdCBhL0Rv Y3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2Rldi10b29scy9rYXNhbi5yc3QgYi9Eb2N1 bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9kZXYtdG9vbHMva2FzYW4ucnN0Cm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYWRkMWQKLS0tIC9kZXYvbnVsbAorKysgYi9E b2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9kZXYtdG9vbHMva2FzYW4ucnN0CkBAIC0w LDAgKzEsNDMxIEBACisuLiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorCisuLiBp bmNsdWRlOjogLi4vZGlzY2xhaW1lci16aF9DTi5yc3QKKworOk9yaWdpbmFsOiBEb2N1bWVudGF0 aW9uL2Rldi10b29scy9rYXNhbi5yc3QKKzpUcmFuc2xhdG9yOiDkuIflrrblhbUgV2FuIEppYWJp bmcgPHdhbmppYWJpbmdAdml2by5jb20+CisKK+WGheaguOWcsOWdgOa2iOavkuWJgihLQVNBTikK Kz09PT09PT09PT09PT09PT09PT09PT0KKwor5qaC6L+wCistLS0tCisKK0tlcm5lbEFkZHJlc3NT QU5pdGl6ZXIoS0FTQU4p5piv5LiA56eN5Yqo5oCB5YaF5a2Y5a6J5YWo6ZSZ6K+v5qOA5rWL5bel 5YW377yMCivkuLvopoHlip/og73mmK/mo4Dmn6XlhoXlrZjotornlYzorr/pl67lkozkvb/nlKjl t7Lph4rmlL7lhoXlrZjnmoTpl67popjjgIJLQVNBTuacieS4ieenjeaooeW8jzoKKworMS4g6YCa 55SoS0FTQU7vvIjkuI7nlKjmiLfnqbrpl7TnmoRBU2Fu57G75Ly877yJCisyLiDln7rkuo7ova/k u7bmoIfnrb7nmoRLQVNBTu+8iOS4jueUqOaIt+epuumXtOeahEhXQVNhbuexu+S8vO+8iQorMy4g 5Z+65LqO56Gs5Lu25qCH562+55qES0FTQU7vvIjln7rkuo7noazku7blhoXlrZjmoIfnrb7vvIkK Kwor55Sx5LqO6YCa55SoS0FTQU7nmoTlhoXlrZjlvIDplIDovoPlpKfvvIzpgJrnlKhLQVNBTuS4 u+imgeeUqOS6juiwg+ivleOAggor5Z+65LqO6L2v5Lu25qCH562+55qES0FTQU7lj6/nlKjkuo5k b2dmb29k5rWL6K+V77yM5Zug5Li65a6D5YW35pyJ6L6D5L2O55qE5YaF5a2Y5byA6ZSA77yMCivl ubblhYHorrjlsIblhbbnlKjkuo7lrp7pmYXlt6XkvZzph4/jgIIKK+WfuuS6juehrOS7tuagh+et vueahEtBU0FO5YW35pyJ6L6D5L2O55qE5YaF5a2Y5ZKM5oCn6IO95byA6ZSA77yM5Zug5q2k5Y+v 55So5LqO55Sf5Lqn44CCCivlkIzml7blj6/nlKjkuo7mo4DmtYvnjrDlnLrlhoXlrZjpl67popjm iJbkvZzkuLrlronlhajnvJPop6Pmjqrmlr3jgIIKKwor6L2v5Lu2S0FTQU7mqKHlvI/vvIgjMeWS jCMy77yJ5L2/55So57yW6K+R5pe25bel5YW35Zyo5q+P5qyh5YaF5a2Y6K6/6Zeu5LmL5YmN5o+S 5YWl5pyJ5pWI5oCn5qOA5p+l77yMCivlm6DmraTpnIDopoHkuIDkuKrmlK/mjIHlroPnmoTnvJbo r5HlmajniYjmnKzjgIIKKwor6YCa55SoS0FTQU7lnKhHQ0PlkoxDbGFuZ+WPl+aUr+aMgeOAgkdD Q+mcgOimgTguMy4w5oiW5pu06auY54mI5pys44CC5Lu75L2V5Y+X5pSv5oyB55qECitDbGFuZ+eJ iOacrOmDveaYr+WFvOWuueeahO+8jOS9huS7jkNsYW5nIDEx5omN5byA5aeL5pSv5oyB5qOA5rWL 5YWo5bGA5Y+Y6YeP55qE6LaK55WM6K6/6Zeu44CCCisKK+WfuuS6jui9r+S7tuagh+etvueahEtB U0FO5qih5byP5LuF5ZyoQ2xhbmfkuK3lj5fmlK/mjIHjgIIKKwor56Gs5Lu2S0FTQU7mqKHlvI/v vIgjM++8ieS+nei1luehrOS7tuadpeaJp+ihjOajgOafpe+8jOS9huS7jemcgOimgeaUr+aMgeWG heWtmOagh+etvuaMh+S7pOeahAor57yW6K+R5Zmo54mI5pys44CCR0NDIDEwK+WSjENsYW5nIDEx K+aUr+aMgeatpOaooeW8j+OAggorCivkuKTnp43ova/ku7ZLQVNBTuaooeW8j+mDvemAgueUqOS6 jlNMVULlkoxTTEFC5YaF5a2Y5YiG6YWN5Zmo77yMCivogIzln7rkuo7noazku7bmoIfnrb7nmoRL QVNBTuebruWJjeS7heaUr+aMgVNMVULjgIIKKwor55uu5YmNeDg2XzY044CBYXJt44CBYXJtNjTj gIF4dGVuc2HjgIFzMzkw44CBcmlzY3bmnrbmnoTmlK/mjIHpgJrnlKhLQVNBTuaooeW8j++8jAor 5LuFYXJtNjTmnrbmnoTmlK/mjIHln7rkuo7moIfnrb7nmoRLQVNBTuaooeW8j+OAggorCivnlKjm s5UKKy0tLS0KKwor6KaB5ZCv55SoS0FTQU7vvIzor7fkvb/nlKjku6XkuIvlkb3ku6TphY3nva7l hoXmoLg6OgorCisJICBDT05GSUdfS0FTQU49eQorCivlkIzml7blnKggYGBDT05GSUdfS0FTQU5f R0VORVJJQ2BgICjlkK/nlKjpgJrnlKhLQVNBTuaooeW8jynvvIwKK2BgQ09ORklHX0tBU0FOX1NX X1RBR1NgYCAo5ZCv55So5Z+65LqO56Gs5Lu25qCH562+55qES0FTQU7mqKHlvI8p77yMCivlkowg YGBDT05GSUdfS0FTQU5fSFdfVEFHU2BgICjlkK/nlKjln7rkuo7noazku7bmoIfnrb7nmoRLQVNB TuaooeW8jynkuYvpl7Tov5vooYzpgInmi6njgIIKKwor5a+55LqO6L2v5Lu25qih5byP77yM6L+Y 5Y+v5Lul5ZyoIGBgQ09ORklHX0tBU0FOX09VVExJTkVgYCDlkowKK2BgQ09ORklHX0tBU0FOX0lO TElORWBgIOS5i+mXtOi/m+ihjOmAieaLqeOAgm91dGxpbmXlkoxpbmxpbmXmmK/nvJbor5Hlmajm o4DmtYvnsbvlnovjgIIKK+WJjeiAheS6p+eUn+i+g+Wwj+eahOS6jOi/m+WItuaWh+S7tu+8jOiA jOWQjuiAheW/qzEuMS0y5YCN44CCCisKK+imgeWwhuWPl+W9seWTjeeahHNsYWLlr7nosaHnmoRh bGxvY+WSjGZyZWXloIbmoIjot5/ouKrljIXlkKvliLDmiqXlkYrkuK3vvIwKK+ivt+WQr+eUqGBg Q09ORklHX1NUQUNLVFJBQ0VgYCDjgILopoHljIXmi6zlj5flvbHlk43niannkIbpobXpnaLnmoTl iIbphY3lkozph4rmlL7loIbmoIjot5/ouKrnmoTor53vvIwKK+ivt+WQr+eUqCBgYENPTkZJR19Q QUdFX09XTkVSYGAg5bm25L2/55SoIGBgcGFnZV9vd25lcj1vbmBgIOi/m+ihjOW8leWvvOOAggor CivplJnor6/miqXlkYoKK35+fn5+fn5+CisKK+WFuOWei+eahEtBU0FO5oql5ZGK5aaC5LiL5omA 56S6OjoKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQorICAgIEJVRzogS0FTQU46IHNsYWItb3V0LW9mLWJvdW5k cyBpbiBrbWFsbG9jX29vYl9yaWdodCsweGE4LzB4YmMgW3Rlc3Rfa2FzYW5dCisgICAgV3JpdGUg b2Ygc2l6ZSAxIGF0IGFkZHIgZmZmZjg4MDFmNDRlYzM3YiBieSB0YXNrIGluc21vZC8yNzYwCisK KyAgICBDUFU6IDEgUElEOiAyNzYwIENvbW06IGluc21vZCBOb3QgdGFpbnRlZCA0LjE5LjAtcmMz KyAjNjk4CisgICAgSGFyZHdhcmUgbmFtZTogUUVNVSBTdGFuZGFyZCBQQyAoaTQ0MEZYICsgUElJ WCwgMTk5NiksIEJJT1MgMS4xMC4yLTEgMDQvMDEvMjAxNAorICAgIENhbGwgVHJhY2U6CisgICAg IGR1bXBfc3RhY2srMHg5NC8weGQ4CisgICAgIHByaW50X2FkZHJlc3NfZGVzY3JpcHRpb24rMHg3 My8weDI4MAorICAgICBrYXNhbl9yZXBvcnQrMHgxNDQvMHgxODcKKyAgICAgX19hc2FuX3JlcG9y dF9zdG9yZTFfbm9hYm9ydCsweDE3LzB4MjAKKyAgICAga21hbGxvY19vb2JfcmlnaHQrMHhhOC8w eGJjIFt0ZXN0X2thc2FuXQorICAgICBrbWFsbG9jX3Rlc3RzX2luaXQrMHgxNi8weDcwMCBbdGVz dF9rYXNhbl0KKyAgICAgZG9fb25lX2luaXRjYWxsKzB4YTUvMHgzYWUKKyAgICAgZG9faW5pdF9t b2R1bGUrMHgxYjYvMHg1NDcKKyAgICAgbG9hZF9tb2R1bGUrMHg3NWRmLzB4ODA3MAorICAgICBf X2RvX3N5c19pbml0X21vZHVsZSsweDFjNi8weDIwMAorICAgICBfX3g2NF9zeXNfaW5pdF9tb2R1 bGUrMHg2ZS8weGIwCisgICAgIGRvX3N5c2NhbGxfNjQrMHg5Zi8weDJjMAorICAgICBlbnRyeV9T WVNDQUxMXzY0X2FmdGVyX2h3ZnJhbWUrMHg0NC8weGE5CisgICAgUklQOiAwMDMzOjB4N2Y5NjQ0 MzEwOWRhCisgICAgUlNQOiAwMDJiOjAwMDA3ZmZjZjBiNTFiMDggRUZMQUdTOiAwMDAwMDIwMiBP UklHX1JBWDogMDAwMDAwMDAwMDAwMDBhZgorICAgIFJBWDogZmZmZmZmZmZmZmZmZmZkYSBSQlg6 IDAwMDA1NWRjM2VlNTIxYTAgUkNYOiAwMDAwN2Y5NjQ0MzEwOWRhCisgICAgUkRYOiAwMDAwN2Y5 NjQ0NWNmZjg4IFJTSTogMDAwMDAwMDAwMDA1N2E1MCBSREk6IDAwMDA3Zjk2NDQ5OTIwMDAKKyAg ICBSQlA6IDAwMDA1NWRjM2VlNTEwYjAgUjA4OiAwMDAwMDAwMDAwMDAwMDAzIFIwOTogMDAwMDAw MDAwMDAwMDAwMAorICAgIFIxMDogMDAwMDdmOTY0NDMwY2QwYSBSMTE6IDAwMDAwMDAwMDAwMDAy MDIgUjEyOiAwMDAwN2Y5NjQ0NWNmZjg4CisgICAgUjEzOiAwMDAwNTVkYzNlZTUxMDkwIFIxNDog MDAwMDAwMDAwMDAwMDAwMCBSMTU6IDAwMDAwMDAwMDAwMDAwMDAKKworICAgIEFsbG9jYXRlZCBi eSB0YXNrIDI3NjA6CisgICAgIHNhdmVfc3RhY2srMHg0My8weGQwCisgICAgIGthc2FuX2ttYWxs b2MrMHhhNy8weGQwCisgICAgIGttZW1fY2FjaGVfYWxsb2NfdHJhY2UrMHhlMS8weDFiMAorICAg ICBrbWFsbG9jX29vYl9yaWdodCsweDU2LzB4YmMgW3Rlc3Rfa2FzYW5dCisgICAgIGttYWxsb2Nf dGVzdHNfaW5pdCsweDE2LzB4NzAwIFt0ZXN0X2thc2FuXQorICAgICBkb19vbmVfaW5pdGNhbGwr MHhhNS8weDNhZQorICAgICBkb19pbml0X21vZHVsZSsweDFiNi8weDU0NworICAgICBsb2FkX21v ZHVsZSsweDc1ZGYvMHg4MDcwCisgICAgIF9fZG9fc3lzX2luaXRfbW9kdWxlKzB4MWM2LzB4MjAw CisgICAgIF9feDY0X3N5c19pbml0X21vZHVsZSsweDZlLzB4YjAKKyAgICAgZG9fc3lzY2FsbF82 NCsweDlmLzB4MmMwCisgICAgIGVudHJ5X1NZU0NBTExfNjRfYWZ0ZXJfaHdmcmFtZSsweDQ0LzB4 YTkKKworICAgIEZyZWVkIGJ5IHRhc2sgODE1OgorICAgICBzYXZlX3N0YWNrKzB4NDMvMHhkMAor ICAgICBfX2thc2FuX3NsYWJfZnJlZSsweDEzNS8weDE5MAorICAgICBrYXNhbl9zbGFiX2ZyZWUr MHhlLzB4MTAKKyAgICAga2ZyZWUrMHg5My8weDFhMAorICAgICB1bWhfY29tcGxldGUrMHg2YS8w eGEwCisgICAgIGNhbGxfdXNlcm1vZGVoZWxwZXJfZXhlY19hc3luYysweDRjMy8weDY0MAorICAg ICByZXRfZnJvbV9mb3JrKzB4MzUvMHg0MAorCisgICAgVGhlIGJ1Z2d5IGFkZHJlc3MgYmVsb25n cyB0byB0aGUgb2JqZWN0IGF0IGZmZmY4ODAxZjQ0ZWMzMDAKKyAgICAgd2hpY2ggYmVsb25ncyB0 byB0aGUgY2FjaGUga21hbGxvYy0xMjggb2Ygc2l6ZSAxMjgKKyAgICBUaGUgYnVnZ3kgYWRkcmVz cyBpcyBsb2NhdGVkIDEyMyBieXRlcyBpbnNpZGUgb2YKKyAgICAgMTI4LWJ5dGUgcmVnaW9uIFtm ZmZmODgwMWY0NGVjMzAwLCBmZmZmODgwMWY0NGVjMzgwKQorICAgIFRoZSBidWdneSBhZGRyZXNz IGJlbG9uZ3MgdG8gdGhlIHBhZ2U6CisgICAgcGFnZTpmZmZmZWEwMDA3ZDEzYjAwIGNvdW50OjEg bWFwY291bnQ6MCBtYXBwaW5nOmZmZmY4ODAxZjcwMDE2NDAgaW5kZXg6MHgwCisgICAgZmxhZ3M6 IDB4MjAwMDAwMDAwMDAwMTAwKHNsYWIpCisgICAgcmF3OiAwMjAwMDAwMDAwMDAwMTAwIGZmZmZl YTAwMDdkMTFkYzAgMDAwMDAwMWEwMDAwMDAxYSBmZmZmODgwMWY3MDAxNjQwCisgICAgcmF3OiAw MDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwODAxNTAwMTUgMDAwMDAwMDFmZmZmZmZmZiAwMDAwMDAw MDAwMDAwMDAwCisgICAgcGFnZSBkdW1wZWQgYmVjYXVzZToga2FzYW46IGJhZCBhY2Nlc3MgZGV0 ZWN0ZWQKKworICAgIE1lbW9yeSBzdGF0ZSBhcm91bmQgdGhlIGJ1Z2d5IGFkZHJlc3M6CisgICAg IGZmZmY4ODAxZjQ0ZWMyMDA6IGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZiIGZiIGZiIGZiIGZi IGZiIGZiIGZiCisgICAgIGZmZmY4ODAxZjQ0ZWMyODA6IGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZi IGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjCisgICAgPmZmZmY4ODAxZjQ0ZWMzMDA6IDAwIDAwIDAw IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAzCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAg ICAgZmZmZjg4MDFmNDRlYzM4MDogZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmIgZmIgZmIgZmIg ZmIgZmIgZmIgZmIKKyAgICAgZmZmZjg4MDFmNDRlYzQwMDogZmIgZmIgZmIgZmIgZmIgZmIgZmIg ZmIgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwor5oql5ZGK5qCH6aKY 5oC757uT5LqG5Y+R55Sf55qE6ZSZ6K+v57G75Z6L5Lul5Y+K5a+86Ie06K+l6ZSZ6K+v55qE6K6/ 6Zeu57G75Z6L44CCCivntKfpmo/lhbblkI7nmoTmmK/plJnor6/orr/pl67nmoTloIbmoIjot5/o uKrjgIHmiYDorr/pl67lhoXlrZjliIbphY3kvY3nva7nmoTloIbmoIjot5/ouKoKK++8iOWvueS6 juiuv+mXruS6hnNsYWLlr7nosaHnmoTmg4XlhrXvvInku6Xlj4rlr7nosaHooqvph4rmlL7nmoTk vY3nva7nmoTloIbmoIjot5/ouKoKK++8iOWvueS6juiuv+mXruW3sumHiuaUvuWGheWtmOeahOmX rumimOaKpeWRiu+8ieOAguaOpeS4i+adpeaYr+Wvueiuv+mXrueahHNsYWLlr7nosaEKK+eahOaP j+i/sOS7peWPiuWFs+S6juiuv+mXrueahOWGheWtmOmhteeahOS/oeaBr+OAggorCivmnIDlkI7v vIzmiqXlkYrlsZXnpLrkuoborr/pl67lnLDlnYDlkajlm7TnmoTlhoXlrZjnirbmgIHjgILlnKjl hoXpg6jvvIwKK0tBU0FO5Y2V54us6Lef6Liq5q+P5Liq5YaF5a2Y6aKX57KS55qE5YaF5a2Y54q2 5oCB77yM5qC55o2uS0FTQU7mqKHlvI/liIbkuLo45oiWMTbkuKrlr7npvZDlrZfoioLjgIIKK+aK peWRiueahOWGheWtmOeKtuaAgemDqOWIhuS4reeahOavj+S4quaVsOWtl+mDveaYvuekuuS6huWb tOe7leiuv+mXruWcsOWdgOeahOWFtuS4reS4gOS4quWGheWtmOmil+eykueahOeKtuaAgeOAggor Civlr7nkuo7pgJrnlKhLQVNBTu+8jOavj+S4quWGheWtmOmil+eykueahOWkp+Wwj+S4ujjkuKrl rZfoioLjgILmr4/kuKrpopfnspLnmoTnirbmgIHooqvnvJbnoIHlnKjkuIDkuKrlvbHlrZDlrZfo ioLkuK3jgIIKK+i/mTjkuKrlrZfoioLlj6/ku6XmmK/lj6/orr/pl67nmoTvvIzpg6jliIborr/p l67nmoTvvIzlt7Lph4rmlL7nmoTmiJbmiJDkuLpSZWR6b25l55qE5LiA6YOo5YiG44CCCitLQVNB TuWvueavj+S4quW9seWtkOWtl+iKguS9v+eUqOS7peS4i+e8lueggTowMOihqOekuuWvueW6lOWG heWtmOWMuuWfn+eahOaJgOaciTjkuKrlrZfoioLpg73lj6/ku6Xorr/pl67vvJsKK+aVsOWtl04g KDEgPD0gTiA8PSA3KeihqOekuuWJjU7kuKrlrZfoioLlj6/orr/pl67vvIzlhbbku5YoOCAtIE4p 5Liq5a2X6IqC5LiN5Y+v6K6/6Zeu77ybCivku7vkvZXotJ/lgLzpg73ooajnpLrml6Dms5Xorr/p l67mlbTkuKo45a2X6IqC44CCS0FTQU7kvb/nlKjkuI3lkIznmoTotJ/lgLzmnaXljLrliIbkuI3l kIznsbvlnovnmoTkuI3lj6/orr/pl67lhoXlrZjvvIwKK+WmgnJlZHpvbmVz5oiW5bey6YeK5pS+ 55qE5YaF5a2Y77yI5Y+C6KeBIG1tL2thc2FuL2thc2FuLmjvvInjgIIKKwor5Zyo5LiK6Z2i55qE 5oql5ZGK5Lit77yM566t5aS05oyH5ZCR5b2x5a2Q5a2X6IqCIGBgMDNgYO+8jOihqOekuuiuv+mX rueahOWcsOWdgOaYr+mDqOWIhuWPr+iuv+mXrueahOOAggorCivlr7nkuo7ln7rkuo7moIfnrb7n moRLQVNBTuaooeW8j++8jOaKpeWRiuacgOWQjueahOmDqOWIhuaYvuekuuS6huiuv+mXruWcsOWd gOWRqOWbtOeahOWGheWtmOagh+etvgorKOWPguiAgyBg5a6e5pa957uG5YiZYF8g56ug6IqCKeOA ggorCivor7fms6jmhI/vvIxLQVNBTumUmeivr+agh+mimO+8iOWmgiBgYHNsYWItb3V0LW9mLWJv dW5kc2BgIOaIliBgYHVzZS1hZnRlci1mcmVlYGAg77yJCivmmK/lsL3ph4/mjqXov5HnmoQ6S0FT QU7moLnmja7lhbbmi6XmnInnmoTmnInpmZDkv6Hmga/miZPljbDlh7rmnIDlj6/og73nmoTplJno r6/nsbvlnovjgIIKK+mUmeivr+eahOWunumZheexu+Wei+WPr+iDveS8muacieaJgOS4jeWQjOOA ggorCivpgJrnlKhLQVNBTui/mOaKpeWRiuS4pOS4qui+heWKqeiwg+eUqOWghuagiOi3n+i4quOA gui/meS6m+WghuagiOi3n+i4quaMh+WQkeS7o+eggQor5Lit5LiO5a+56LGh5Lqk5LqS5L2G5LiN 55u05o6l5Ye6546w5Zyo6ZSZ6K+v6K6/6Zeu5aCG5qCI6Lef6Liq5Lit55qE5L2N572u44CCCivn m67liY3vvIzov5nljIXmi6wgY2FsbF9yY3UoKSDlkozmjpLpmJ/nmoTlt6XkvZzpmJ/liJfjgIIK Kwor5ZCv5Yqo5Y+C5pWwCit+fn5+fn5+fgorCitLQVNBTuWPl+mAmueUqCBgYHBhbmljX29uX3dh cm5gYCDlkb3ku6TooYzlj4LmlbDnmoTlvbHlk43jgIIKK+WQr+eUqOivpeWKn+iDveWQju+8jEtB U0FO5Zyo5omT5Y2w6ZSZ6K+v5oql5ZGK5ZCO5Lya5byV6LW35YaF5qC45oGQ5oWM44CCCisKK+m7 mOiupOaDheWGteS4i++8jEtBU0FO5Y+q5Li656ys5LiA5qyh5peg5pWI5YaF5a2Y6K6/6Zeu5omT 5Y2w6ZSZ6K+v5oql5ZGK44CC5L2/55SoIGBga2FzYW5fbXVsdGlfc2hvdGBgIO+8jAorS0FTQU7k vJrpkojlr7nmr4/kuKrml6DmlYjorr/pl67miZPljbDmiqXlkYrjgILov5nmnInmlYjlnLDnpoHn lKjkuoZLQVNBTuaKpeWRiueahCBgYHBhbmljX29uX3dhcm5gYCDjgIIKKwor5Z+65LqO56Gs5Lu2 5qCH562+55qES0FTQU7mqKHlvI/vvIjor7flj4LpmIXkuIvpnaLmnInlhbPlkITnp43mqKHlvI/n moTpg6jliIbvvInml6jlnKjlnKjnlJ/kuqfkuK3nlKjkvZzlronlhajnvJPop6Pmjqrmlr3jgIIK K+WboOatpO+8jOWug+aUr+aMgeWFgeiuuOemgeeUqEtBU0FO5oiW5o6n5Yi25YW25Yqf6IO955qE 5byV5a+85Y+C5pWw44CCCisKKy0gYGBrYXNhbj1vZmZgYCDmiJYgYGA9b25gYCDmjqfliLZLQVNB TuaYr+WQpuWQr+eUqCAo6buY6K6kOiBgYG9uYGAgKeOAggorCistIGBga2FzYW4ubW9kZT1zeW5j YGAg5oiWIGBgPWFzeW5jYGAg5o6n5Yi2S0FTQU7mmK/lkKbphY3nva7kuLrlkIzmraUKKyAg5oiW 5byC5q2l5omn6KGM5qih5byPKOm7mOiupDogYGBzeW5jYGAgKeOAggorICDlkIzmraXmqKHlvI/v vJrlvZPmoIfnrb7mo4Dmn6XplJnor6/lj5HnlJ/ml7bvvIznq4vljbPmo4DmtYvliLDplJnor6/o rr/pl67jgIIKKyAg5byC5q2l5qih5byP77ya5bu26L+f6ZSZ6K+v6K6/6Zeu5qOA5rWL44CC5b2T 5qCH562+5qOA5p+l6ZSZ6K+v5Y+R55Sf5pe277yM5L+h5oGv5a2Y5YKo5Zyo56Gs5Lu25LitCisg IO+8iOWcqGFybTY055qEVEZTUl9FTDHlr4TlrZjlmajkuK3vvInjgILlhoXmoLjkvJrlrprmnJ/m o4Dmn6Xnoazku7bvvIzlubbkuJTku4XlnKjov5nkupvmo4Dmn6XmnJ/pl7TmiqXlkYrmoIfnrb7p lJnor6/jgIIKKworLSBgYGthc2FuLnN0YWNrdHJhY2U9b2ZmYGAg5oiWIGBgPW9uYGAg56aB55So 5oiW5ZCv55SoYWxsb2PlkoxmcmVl5aCG5qCI6Lef6Liq5pS26ZuGKOm7mOiupDogYGBvbmBgICnj gIIKKworLSBgYGthc2FuLmZhdWx0PXJlcG9ydGBgIOaIliBgYD1wYW5pY2BgIOaOp+WItuaYr+WP quaJk+WNsEtBU0FO5oql5ZGK6L+Y5piv5ZCM5pe25L2/5YaF5qC45oGQ5oWMCisgICjpu5jorqQ6 IGBgcmVwb3J0YGAgKeOAguWNs+S9v+WQr+eUqOS6hiBgYGthc2FuX211bHRpX3Nob3RgYO+8jOS5 n+S8muWPkeeUn+WGheaguOaBkOaFjOOAggorCivlrp7mlr3nu4bliJkKKy0tLS0tLS0tLQorCivp gJrnlKhLQVNBTgorfn5+fn5+fn5+fgorCivova/ku7ZLQVNBTuaooeW8j+S9v+eUqOW9seWtkOWG heWtmOadpeiusOW9leavj+S4quWGheWtmOWtl+iKguaYr+WQpuWPr+S7peWuieWFqOiuv+mXru+8 jAor5bm25L2/55So57yW6K+R5pe25bel5YW35Zyo5q+P5qyh5YaF5a2Y6K6/6Zeu5LmL5YmN5o+S 5YWl5b2x5a2Q5YaF5a2Y5qOA5p+l44CCCisKK+mAmueUqEtBU0FO5bCGMS8455qE5YaF5qC45YaF 5a2Y5LiT55So5LqO5YW25b2x5a2Q5YaF5a2Y77yIMTZUQuS7peimhueblng4Nl82NOS4iueahCAx MjhUQu+8ie+8jAor5bm25L2/55So5YW35pyJ5q+U5L6L5ZKM5YGP56e76YeP55qE55u05o6l5pig 5bCE5bCG5YaF5a2Y5Zyw5Z2A6L2s5o2i5Li65YW255u45bqU55qE5b2x5a2Q5Zyw5Z2A44CCCisK K+i/meaYr+WwhuWcsOWdgOi9rOaNouS4uuWFtuebuOW6lOW9seWtkOWcsOWdgOeahOWHveaVsDo6 CisKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgKmthc2FuX21lbV90b19zaGFkb3coY29uc3Qgdm9p ZCAqYWRkcikKKyAgICB7CisJcmV0dXJuICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWFkZHIgPj4g S0FTQU5fU0hBRE9XX1NDQUxFX1NISUZUKQorCQkrIEtBU0FOX1NIQURPV19PRkZTRVQ7CisgICAg fQorCivlnKjov5nph4wgYGBLQVNBTl9TSEFET1dfU0NBTEVfU0hJRlQgPSAzYGDjgIIKKwor57yW 6K+R5pe25bel5YW355So5LqO5o+S5YWl5YaF5a2Y6K6/6Zeu5qOA5p+l44CC57yW6K+R5Zmo5Zyo 5q+P5qyh6K6/6Zeu5aSn5bCP5Li6Cisx44CBMuOAgTTjgIE45oiWMTbnmoTlhoXlrZjkuYvliY3m j5LlhaXlh73mlbDosIPnlKgKKyhgYF9fYXNhbl9sb2FkKihhZGRyKWBgLCBgYF9fYXNhbl9zdG9y ZSooYWRkcilgYCnjgIIKK+i/meS6m+WHveaVsOmAmui/h+ajgOafpeebuOW6lOeahOW9seWtkOWG heWtmOadpeajgOafpeWGheWtmOiuv+mXruaYr+WQpuacieaViOOAggorCivkvb/nlKhpbmxpbmXm o4DmtYvvvIznvJbor5HlmajkuI3ov5vooYzlh73mlbDosIPnlKjvvIzogIzmmK/nm7TmjqXmj5Ll haXku6PnoIEKK+adpeajgOafpeW9seWtkOWGheWtmOOAguatpOmAiemhueaYvuiRl+WcsOWinuWk p+S6huWGheaguOS9k+enr++8jAor5L2G5LiOb3V0bGluZeajgOa1i+WGheaguOebuOavlO+8jOWu g+aPkOS+m+S6hngxLjEteDLnmoTmgKfog73mj5DljYfjgIIKKwor6YCa55SoS0FTQU7mmK/llK/k uIDkuIDnp43pgJrov4fpmpTnprvlu7bov5/ph43mlrDkvb/nlKjlt7Lph4rmlL7lr7nosaHnmoTm qKHlvI8KK++8iOWPguingSBtbS9rYXNhbi9xdWFyYW50aW5lLmMg5Lul5LqG6Kej5a6e546w77yJ 44CCCisKK+WfuuS6jui9r+S7tuagh+etvueahEtBU0FO5qih5byPCit+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn4KKwor5Z+65LqO6L2v5Lu25qCH562+55qES0FTQU7kvb/nlKjova/ku7blhoXl rZjmoIfnrb7mlrnms5XmnaXmo4Dmn6Xorr/pl67mnInmlYjmgKfjgIIKK+ebruWJjeS7hemSiOWv uWFybTY05p625p6E5a6e546w44CCCisKK+WfuuS6jui9r+S7tuagh+etvueahEtBU0FO5L2/55So YXJtNjQgQ1BV55qE6aG26YOo5a2X6IqC5b+955WlKFRCSSkKK+eJueaAp+WcqOWGheaguOaMh+mS iOeahOmhtumDqOWtl+iKguS4reWtmOWCqOS4gOS4quaMh+mSiOagh+etvuOAggor5a6D5L2/55So 5b2x5a2Q5YaF5a2Y5p2l5a2Y5YKo5LiO5q+P5LiqMTblrZfoioLlhoXlrZjljZXlhYPnm7jlhbPn moTlhoXlrZjmoIfnrb4KKyjlm6DmraTvvIzlroPlsIblhoXmoLjlhoXlrZjnmoQxLzE25LiT55So 5LqO5b2x5a2Q5YaF5a2YKeOAggorCivlnKjmr4/mrKHlhoXlrZjliIbphY3ml7bvvIzln7rkuo7o va/ku7bmoIfnrb7nmoRLQVNBTumDveS8mueUn+aIkOS4gOS4qumaj+acuuagh+etvu+8jAor55So 6L+Z5Liq5qCH562+5qCH6K6w5YiG6YWN55qE5YaF5a2Y77yM5bm25bCG55u45ZCM55qE5qCH562+ 5bWM5YWl5Yiw6L+U5Zue55qE5oyH6ZKI5Lit44CCCisKK+WfuuS6jui9r+S7tuagh+etvueahEtB U0FO5L2/55So57yW6K+R5pe25bel5YW35Zyo5q+P5qyh5YaF5a2Y6K6/6Zeu5LmL5YmN5o+S5YWl 5qOA5p+l44CCCivov5nkupvmo4Dmn6Xnoa7kv53mraPlnKjorr/pl67nmoTlhoXlrZjnmoTmoIfn rb7nrYnkuo7nlKjkuo7orr/pl67or6XlhoXlrZjnmoTmjIfpkojnmoTmoIfnrb7jgIIKK+Wmguae nOagh+etvuS4jeWMuemFje+8jOWfuuS6jui9r+S7tuagh+etvueahEtBU0FO5Lya5omT5Y2w6ZSZ 6K+v5oql5ZGK44CCCisKK+WfuuS6jui9r+S7tuagh+etvueahEtBU0FO5Lmf5pyJ5Lik56eN5qOA 5rWL5qih5byP77yIb3V0bGluZe+8jAor5Y+R5Ye65Zue6LCD5p2l5qOA5p+l5YaF5a2Y6K6/6Zeu 77ybaW5saW5l77yM5omn6KGM5YaF6IGU55qE5b2x5a2Q5YaF5a2Y5qOA5p+l77yJ44CCCivkvb/n lKhvdXRsaW5l5qOA5rWL5qih5byP77yM5Lya5LuO5omn6KGM6K6/6Zeu5qOA5p+l55qE5Ye95pWw 5omT5Y2w6ZSZ6K+v5oql5ZGK44CCCivkvb/nlKhpbmxpbmXmo4DmtYvvvIznvJbor5HlmajkvJrl j5Hlh7ogYGBicmtgYCDmjIfku6TvvIzlubbkvb/nlKjkuJPnlKjnmoQKK2BgYnJrYGAg5aSE55CG 56iL5bqP5p2l5omT5Y2w6ZSZ6K+v5oql5ZGK44CCCisKK+WfuuS6jui9r+S7tuagh+etvueahEtB U0FO5L2/55SoMHhGRuS9nOS4uuWMuemFjeaJgOacieaMh+mSiOagh+etvgor77yI5LiN5qOA5p+l 6YCa6L+H5bim5pyJMHhGRuaMh+mSiOagh+etvueahOaMh+mSiOi/m+ihjOeahOiuv+mXru+8ieOA ggor5YC8MHhGReW9k+WJjeS/neeVmeeUqOS6juagh+iusOW3sumHiuaUvueahOWGheWtmOWMuuWf n+OAggorCivln7rkuo7ova/ku7bmoIfnrb7nmoRLQVNBTuebruWJjeS7heaUr+aMgeWvuVNsYWLl koxwYWdlX2FsbG9j5YaF5a2Y6L+b6KGM5qCH6K6w44CCCisKK+WfuuS6juehrOS7tuagh+etvuea hEtBU0FO5qih5byPCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK+WfuuS6juehrOS7 tuagh+etvueahEtBU0FO5Zyo5qaC5b+15LiK57G75Ly85LqO6L2v5Lu25qih5byP77yMCivkvYbl roPmmK/kvb/nlKjnoazku7blhoXlrZjmoIfnrb7kvZzkuLrmlK/mjIHogIzkuI3mmK/nvJbor5Hl majmo4DmtYvlkozlvbHlrZDlhoXlrZjjgIIKKwor5Z+65LqO56Gs5Lu25qCH562+55qES0FTQU7n m67liY3ku4Xpkojlr7lhcm02NOaetuaehOWunueOsO+8jOW5tuS4lOWfuuS6jkFSTXY4LjUKK+aM h+S7pOmbhuaetuaehOS4reW8leWFpeeahGFybTY05YaF5a2Y5qCH6K6w5omp5bGVKE1URSnlkozm nIDpq5jlrZfoioLlv73nlaUoVEJJKeOAggorCivnibnmrornmoRhcm02NOaMh+S7pOeUqOS6juS4 uuavj+asoeWGheWtmOWIhumFjeaMh+WumuWGheWtmOagh+etvuOAggor55u45ZCM55qE5qCH562+ 6KKr5oyH5a6a57uZ5oyH5ZCR6L+Z5Lqb5YiG6YWN55qE5oyH6ZKI44CC5Zyo5q+P5qyh5YaF5a2Y 6K6/6Zeu5pe277yMCivnoazku7bnoa7kv53mraPlnKjorr/pl67nmoTlhoXlrZjnmoTmoIfnrb7n rYnkuo7nlKjkuo7orr/pl67or6XlhoXlrZjnmoTmjIfpkojnmoTmoIfnrb7jgIIKK+WmguaenOag h+etvuS4jeWMuemFje+8jOWImeS8mueUn+aIkOaVhemanOW5tuaJk+WNsOaKpeWRiuOAggorCivl n7rkuo7noazku7bmoIfnrb7nmoRLQVNBTuS9v+eUqDB4RkbkvZzkuLrljLnphY3miYDmnInmjIfp kojmoIfnrb4KK++8iOS4jeajgOafpemAmui/h+W4puaciTB4RkbmjIfpkojmoIfnrb7nmoTmjIfp kojov5vooYznmoTorr/pl67vvInjgIIKK+WAvDB4RkXlvZPliY3kv53nlZnnlKjkuo7moIforrDl t7Lph4rmlL7nmoTlhoXlrZjljLrln5/jgIIKKwor5Z+65LqO56Gs5Lu25qCH562+55qES0FTQU7n m67liY3ku4XmlK/mjIHlr7lTbGFi5ZKMcGFnZV9hbGxvY+WGheWtmOi/m+ihjOagh+iusOOAggor CivlpoLmnpznoazku7bkuI3mlK/mjIFNVEXvvIhBUk12OC415LmL5YmN77yJ77yM5YiZ5LiN5Lya 5ZCv55So5Z+65LqO56Gs5Lu25qCH562+55qES0FTQU7jgIIKK+WcqOi/meenjeaDheWGteS4i++8 jOaJgOaciUtBU0FO5byV5a+85Y+C5pWw6YO95bCG6KKr5b+955Wl44CCCisKK+ivt+azqOaEj++8 jOWQr+eUqENPTkZJR19LQVNBTl9IV19UQUdT5aeL57uI5Lya5a+86Ie05ZCv55So5YaF5qC45Lit 55qEVEJJ44CCCivljbPkvb/mj5DkvpvkuoYgYGBrYXNhbi5tb2RlPW9mZmBgIOaIluehrOS7tuS4 jeaUr+aMgU1URe+8iOS9huaUr+aMgVRCSe+8ieOAggorCivln7rkuo7noazku7bmoIfnrb7nmoRL QVNBTuWPquaKpeWRiuesrOS4gOS4quWPkeeOsOeahOmUmeivr+OAguS5i+WQju+8jE1UReagh+et vuajgOafpeWwhuiiq+emgeeUqOOAggorCivlvbHlrZDlhoXlrZgKKy0tLS0tLS0tCisKK+WGheag uOWwhuWGheWtmOaYoOWwhOWIsOWcsOWdgOepuumXtOeahOWHoOS4quS4jeWQjOmDqOWIhuOAguWG heaguOiZmuaLn+WcsOWdgOeahOiMg+WbtOW+iOWkp++8mgor5rKh5pyJ6Laz5aSf55qE55yf5a6e 5YaF5a2Y5p2l5pSv5oyB5YaF5qC45Y+v5Lul6K6/6Zeu55qE5q+P5Liq5Zyw5Z2A55qE55yf5a6e 5b2x5a2Q5Yy65Z+f44CCCivlm6DmraTvvIxLQVNBTuWPquS4uuWcsOWdgOepuumXtOeahOafkOS6 m+mDqOWIhuaYoOWwhOecn+WunueahOW9seWtkOOAggorCivpu5jorqTooYzkuLoKK35+fn5+fn5+ CisKK+m7mOiupOaDheWGteS4i++8jOS9k+ezu+e7k+aehOS7heWwhuWunumZheWGheWtmOaYoOWw hOWIsOeUqOS6jue6v+aAp+aYoOWwhOeahOmYtOW9seWMuuWfnwor77yI5Lul5Y+K5Y+v6IO955qE 5YW25LuW5bCP5Yy65Z+f77yJ44CC5a+55LqO5omA5pyJ5YW25LuW5Yy65Z+fIOKAlOKAlCDkvovl poJ2bWFsbG9j5ZKMdm1lbW1hcOepuumXtCDigJTigJQKK+S4gOS4quWPquivu+mhtemdouiiq+aY oOWwhOWIsOmYtOW9seWMuuWfn+S4iuOAgui/meS4quWPquivu+eahOW9seWtkOmhtemdouWjsOaY juaJgOacieWGheWtmOiuv+mXrumDveaYr+WFgeiuuOeahOOAggorCivov5nnu5nmqKHlnZfluKbm naXkuobkuIDkuKrpl67popjvvJrlroPku6zkuI3lrZjlnKjkuo7nur/mgKfmmKDlsITkuK3vvIzo gIzmmK/lrZjlnKjkuo7kuJPnlKjnmoTmqKHlnZfnqbrpl7TkuK3jgIIKK+mAmui/h+i/nuaOpeao oeWdl+WIhumFjeWZqO+8jEtBU0FO5Li05pe25pig5bCE55yf5a6e55qE5b2x5a2Q5YaF5a2Y5Lul 6KaG55uW5a6D5Lus44CCCivkvovlpoLvvIzov5nlhYHorrjmo4DmtYvlr7nmqKHlnZflhajlsYDl j5jph4/nmoTml6DmlYjorr/pl67jgIIKKwor6L+Z5Lmf6YCg5oiQ5LqG5LiOIGBgVk1BUF9TVEFD S2BgIOeahOS4jeWFvOWuue+8muWmguaenOWghuagiOS9jeS6jnZtYWxsb2Pnqbrpl7TkuK3vvIwK K+Wug+Wwhuiiq+WIhumFjeWPquivu+mhtemdoueahOW9seWtkOWGheWtmO+8jOW5tuS4lOWGheag uOWcqOWwneivleS4uuWghuagiOWPmOmHj+iuvue9ruW9seWtkOaVsOaNruaXtuS8muWHuumUmeOA ggorCitDT05GSUdfS0FTQU5fVk1BTExPQworfn5+fn5+fn5+fn5+fn5+fn5+fn4KKwor5L2/55So IGBgQ09ORklHX0tBU0FOX1ZNQUxMT0NgYCDvvIxLQVNBTuWPr+S7peS7peabtOWkp+eahOWGheWt mOS9v+eUqAor5Li65Luj5Lu36KaG55uWdm1hbGxvY+epuumXtOOAguebruWJje+8jOi/meWcqHg4 NuOAgXJpc2N244CBczM5MOWSjHBvd2VycGPkuIrlj5fmlK/mjIHjgIIKKwor6L+Z6YCa6L+H6L+e 5o6l5Yiwdm1hbGxvY+WSjHZtYXDlubbliqjmgIHliIbphY3nnJ/lrp7nmoTlvbHlrZDlhoXlrZjm naXmlK/mjIHmmKDlsITjgIIKKwordm1hbGxvY+epuumXtOS4reeahOWkp+WkmuaVsOaYoOWwhOmD veW+iOWwj++8jOmcgOimgeS4jeWIsOS4gOaVtOmhteeahOmYtOW9seepuumXtOOAggor5Zug5q2k 77yM5Li65q+P5Liq5pig5bCE5YiG6YWN5LiA5Liq5a6M5pW055qE5b2x5a2Q6aG16Z2i5bCG5piv 5LiA56eN5rWq6LS544CCCivmraTlpJbvvIzkuLrkuobnoa7kv53kuI3lkIznmoTmmKDlsITkvb/n lKjkuI3lkIznmoTlvbHlrZDpobXpnaLvvIzmmKDlsITlv4XpobvkuI4KK2BgS0FTQU5fR1JBTlVM RV9TSVpFICogUEFHRV9TSVpFYGAg5a+56b2Q44CCCisKK+ebuOWPje+8jEtBU0FO6Leo5aSa5Liq 5pig5bCE5YWx5Lqr5ZCO5aSH56m66Ze044CC5b2Tdm1hbGxvY+epuumXtOS4reeahOaYoOWwhOS9 v+eUqAor5b2x5a2Q5Yy65Z+f55qE54m55a6a6aG16Z2i5pe277yM5a6D5Lya5YiG6YWN5LiA5Liq 5ZCO5aSH6aG16Z2i44CCCivmraTpobXpnaLnqI3lkI7lj6/ku6XnlLHlhbbku5Z2bWFsbG9j5pig 5bCE5YWx5Lqr44CCCisKK0tBU0FO6L+e5o6l5Yiwdm1hcOWfuuehgOaetuaehOS7peaHkua4heeQ huacquS9v+eUqOeahOW9seWtkOWGheWtmOOAggorCivkuLrkuobpgb/lhY3kuqTmjaLmmKDlsITn moTlm7Dpmr7vvIxLQVNBTumihOa1i+imhueblnZtYWxsb2Pnqbrpl7TnmoTpmLTlvbHljLrln5/p g6jliIblsIbkuI3kvJrooqsKK+aXqeacn+eahOmYtOW9semhtemdouimhueblu+8jOS9huaYr+Ww huS4jeS8muiiq+aYoOWwhOOAgui/meWwhumcgOimgeabtOaUueeJueWumuS6jmFyY2jnmoTku6Pn oIHjgIIKKwor6L+Z5YWB6K645ZyoeDg25LiK5pSv5oyBIGBgVk1BUF9TVEFDS2BgIO+8jOW5tuS4 lOWPr+S7peeugOWMluWvueayoeacieWbuuWumuaooeWdl+WMuuWfn+eahOaetuaehOeahOaUr+aM geOAggorCivlr7nkuo7lvIDlj5HogIUKKy0tLS0tLS0tLS0KKwor5b+955Wl6K6/6ZeuCit+fn5+ fn5+fgorCivova/ku7ZLQVNBTuaooeW8j+S9v+eUqOe8luivkeWZqOajgOa1i+adpeaPkuWFpeac ieaViOaAp+ajgOafpeOAggor5q2k57G75qOA5rWL5Y+v6IO95LiO5YaF5qC455qE5p+Q5Lqb6YOo 5YiG5LiN5YW85a6577yM5Zug5q2k6ZyA6KaB56aB55So44CCCisKK+WGheaguOeahOWFtuS7lumD qOWIhuWPr+iDveS8muiuv+mXruW3suWIhumFjeWvueixoeeahOWFg+aVsOaNruOAgumAmuW4uO+8 jEtBU0FO5Lya5qOA5rWL5bm25oql5ZGK5q2k57G76K6/6Zeu77yMCivkvYblnKjmn5Dkupvmg4Xl hrXkuIvvvIjkvovlpoLvvIzlnKjlhoXlrZjliIbphY3lmajkuK3vvInvvIzov5nkupvorr/pl67m mK/mnInmlYjnmoTjgIIKKwor5a+55LqO6L2v5Lu2S0FTQU7mqKHlvI/vvIzopoHnpoHnlKjnibnl rprmlofku7bmiJbnm67lvZXnmoTmo4DmtYvvvIwKK+ivt+WwhuKAi+KAiyBgYEtBU0FOX1NBTklU SVpFYGAg5re75Yqg5Yiw55u45bqU55qE5YaF5qC4TWFrZWZpbGXkuK06CisKKy0g5a+55LqO5Y2V 5Liq5paH5Lu2KOS+i+Wmgu+8jG1haW4ubyk6OgorCisgICAgS0FTQU5fU0FOSVRJWkVfbWFpbi5v IDo9IG4KKworLSDlr7nkuo7kuIDkuKrnm67lvZXkuIvnmoTmiYDmnInmlofku7Y6OgorCisgICAg S0FTQU5fU0FOSVRJWkUgOj0gbgorCivlr7nkuo7ova/ku7ZLQVNBTuaooeW8j++8jOimgeWcqOav j+S4quWHveaVsOeahOWfuuehgOS4iuemgeeUqOajgOa1i++8jOivt+S9v+eUqEtBU0FOCivnibnl rprnmoQgYGBfX25vX3Nhbml0aXplX2FkZHJlc3NgYCDlh73mlbDlsZ7mgKfmiJbmn5DkuKrpgJrn lKjnmoQgYGBub2luc3RyYGAg44CCCisKK+ivt+azqOaEj++8jOemgeeUqOe8luivkeWZqOajgOa1 i++8iOWfuuS6juavj+S4quaWh+S7tuaIluavj+S4quWHveaVsO+8ieS8muS9v0tBU0FO5b+955Wl 5ZyoCivova/ku7ZLQVNBTuaooeW8j+eahOS7o+eggeS4reebtOaOpeWPkeeUn+eahOiuv+mXruOA guW9k+iuv+mXruaYr+mXtOaOpeWPkeeUn+eahO+8iOmAmui/h+iwg+eUqOajgOa1i+WHveaVsO+8 iQor5oiW5L2/55So5rKh5pyJ57yW6K+R5Zmo5qOA5rWL55qE5Z+65LqO56Gs5Lu25qCH562+55qE 5qih5byP5pe277yM5a6D5rKh5pyJ5biu5Yqp44CCCisKK+WvueS6jui9r+S7tktBU0FO5qih5byP 77yM6KaB5Zyo5b2T5YmN5Lu75Yqh55qE5LiA6YOo5YiG5YaF5qC45Luj56CB5Lit56aB55SoS0FT QU7miqXlkYrvvIwKK+ivt+S9v+eUqCBgYGthc2FuX2Rpc2FibGVfY3VycmVudCgpYGAvYGBrYXNh bl9lbmFibGVfY3VycmVudCgpYGAKK+mDqOWIhuazqOmHiui/memDqOWIhuS7o+eggeOAgui/meS5 n+S8muemgeeUqOmAmui/h+WHveaVsOiwg+eUqOWPkeeUn+eahOmXtOaOpeiuv+mXrueahOaKpeWR iuOAggorCivlr7nkuo7ln7rkuo7moIfnrb7nmoRLQVNBTuaooeW8j++8iOWMheaLrOehrOS7tuao oeW8j++8ie+8jOimgeemgeeUqOiuv+mXruajgOafpe+8jAor6K+35L2/55SoIGBga2FzYW5fcmVz ZXRfdGFnKClgYCDmiJYgYGBwYWdlX2thc2FuX3RhZ19yZXNldCgpYGAg44CCCivor7fms6jmhI/v vIzpgJrov4cgYGBwYWdlX2thc2FuX3RhZ19yZXNldCgpYGAg5Li05pe256aB55So6K6/6Zeu5qOA 5p+l6ZyA6KaB6YCa6L+HCitgYHBhZ2Vfa2FzYW5fdGFnYGAvYGBwYWdlX2thc2FuX3RhZ19zZXRg YCDkv53lrZjlkozmgaLlpI3mr4/pobVLQVNBTuagh+etvuOAggorCivmtYvor5UKK35+fn4KKwor 5pyJ5LiA5LqbS0FTQU7mtYvor5Xlj6/ku6Xpqozor4FLQVNBTuaYr+WQpuato+W4uOW3peS9nOW5 tuWPr+S7peajgOa1i+afkOS6m+exu+Wei+eahOWGheWtmOaNn+Wdj+OAggor5rWL6K+V55Sx5Lik 6YOo5YiG57uE5oiQOgorCisxLiDkuI5LVW5pdOa1i+ivleahhuaetumbhuaIkOeahOa1i+ivleOA guS9v+eUqCBgYENPTkZJR19LQVNBTl9LVU5JVF9URVNUYGAg5ZCv55So44CCCivov5nkupvmtYvo r5Xlj6/ku6XpgJrov4flh6Dnp43kuI3lkIznmoTmlrnlvI/oh6rliqjov5DooYzlkozpg6jliIbp qozor4HvvJvor7flj4LpmIXkuIvpnaLnmoTor7TmmI7jgIIKKworMi4g5LiOS1VuaXTkuI3lhbzl rrnnmoTmtYvor5XjgILkvb/nlKggYGBDT05GSUdfS0FTQU5fTU9EVUxFX1RFU1RgYAor5ZCv55So 5bm25LiU5Y+q6IO95L2c5Li65qih5Z2X6L+Q6KGM44CC6L+Z5Lqb5rWL6K+V5Y+q6IO96YCa6L+H 5Yqg6L295YaF5qC45qih5Z2X5bm25qOA5p+l5YaF5qC4Civml6Xlv5fku6Xojrflj5ZLQVNBTuaK peWRiuadpeaJi+WKqOmqjOivgeOAggorCivlpoLmnpzmo4DmtYvliLDplJnor6/vvIzmr4/kuKpL VW5pdOWFvOWuueeahEtBU0FO5rWL6K+V6YO95Lya5omT5Y2w5aSa5LiqS0FTQU7miqXlkYrkuYvk uIDvvIwKK+eEtuWQjua1i+ivleaJk+WNsOWFtue8luWPt+WSjOeKtuaAgeOAggorCivlvZPmtYvo r5XpgJrov4c6OgorCisgICAgICAgIG9rIDI4IC0ga21hbGxvY19kb3VibGVfa3pmcmVlCisKK+W9 k+eUseS6jiBgYGttYWxsb2NgYCDlpLHotKXogIzlr7zoh7TmtYvor5XlpLHotKXml7Y6OgorCisg ICAgICAgICMga21hbGxvY19sYXJnZV9vb2JfcmlnaHQ6IEFTU0VSVElPTiBGQUlMRUQgYXQgbGli L3Rlc3Rfa2FzYW4uYzoxNjMKKyAgICAgICAgRXhwZWN0ZWQgcHRyIGlzIG5vdCBudWxsLCBidXQg aXMKKyAgICAgICAgbm90IG9rIDQgLSBrbWFsbG9jX2xhcmdlX29vYl9yaWdodAorCivlvZPnlLHk uo7nvLrlsJFLQVNBTuaKpeWRiuiAjOWvvOiHtOa1i+ivleWksei0peaXtjo6CisKKyAgICAgICAg IyBrbWFsbG9jX2RvdWJsZV9remZyZWU6IEVYUEVDVEFUSU9OIEZBSUxFRCBhdCBsaWIvdGVzdF9r YXNhbi5jOjYyOQorICAgICAgICBFeHBlY3RlZCBrYXNhbl9kYXRhLT5yZXBvcnRfZXhwZWN0ZWQg PT0ga2FzYW5fZGF0YS0+cmVwb3J0X2ZvdW5kLCBidXQKKyAgICAgICAga2FzYW5fZGF0YS0+cmVw b3J0X2V4cGVjdGVkID09IDEKKyAgICAgICAga2FzYW5fZGF0YS0+cmVwb3J0X2ZvdW5kID09IDAK KyAgICAgICAgbm90IG9rIDI4IC0ga21hbGxvY19kb3VibGVfa3pmcmVlCisKK+acgOWQjuaJk+WN sOaJgOaciUtBU0FO5rWL6K+V55qE57Sv56ev54q25oCB44CC5oiQ5YqfOjoKKworICAgICAgICBv ayAxIC0ga2FzYW4KKwor5oiW6ICF77yM5aaC5p6c5YW25Lit5LiA6aG55rWL6K+V5aSx6LSlOjoK KworICAgICAgICBub3Qgb2sgMSAtIGthc2FuCisKK+acieWHoOenjeaWueazleWPr+S7pei/kOih jOS4jktVbml05YW85a6555qES0FTQU7mtYvor5XjgIIKKworMS4g5Y+v5Yqg6L295qih5Z2XCisK KyAgIOWQr+eUqCBgYENPTkZJR19LVU5JVGBgIOWQju+8jEtBU0FOLUtVbml05rWL6K+V5Y+v5Lul 5p6E5bu65Li65Y+v5Yqg6L295qih5Z2X77yMCisgICDlubbpgJrov4fkvb/nlKggYGBpbnNtb2Rg YCDmiJYgYGBtb2Rwcm9iZWBgIOWKoOi9vSBgYHRlc3Rfa2FzYW4ua29gYCDmnaXov5DooYzjgIIK KworMi4g5YaF572uCisKKyAgIOmAmui/h+WGhee9riBgYENPTkZJR19LVU5JVGBgIO+8jOS5n+WP r+S7peWGhee9rktBU0FOLUtVbml05rWL6K+V44CCCisgICDlnKjov5nnp43mg4XlhrXkuIvvvIzm tYvor5XlsIblnKjlkK/liqjml7bkvZzkuLrlkI7mnJ/liJ3lp4vljJbosIPnlKjov5DooYzjgIIK KworMy4g5L2/55Soa3VuaXRfdG9vbAorCisgICDpgJrov4flhoXnva4gYGBDT05GSUdfS1VOSVRg YCDlkowgYGBDT05GSUdfS0FTQU5fS1VOSVRfVEVTVGBgIO+8jAorICAg6L+Y5Y+v5Lul5L2/55So IGBga3VuaXRfdG9vbGBgIOS7peabtOaYk+ivu+eahOaWueW8j+afpeeci0tVbml05rWL6K+V55qE 57uT5p6c44CCCisgICDov5nkuI3kvJrmiZPljbDpgJrov4fmtYvor5XnmoRLQVNBTuaKpeWRiuOA guacieWFsyBgYGt1bml0X3Rvb2xgYCDnmoTmm7TlpJrmnIDmlrDkv6Hmga/vvIwKKyAgIOivt+WP gumYhSBgS1VuaXTmlofmoaMgPGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL2h0bWwvbGF0ZXN0 L2Rldi10b29scy9rdW5pdC9pbmRleC5odG1sPmBfIOOAggorCisuLiBfS1VuaXQ6IGh0dHBzOi8v d3d3Lmtlcm5lbC5vcmcvZG9jL2h0bWwvbGF0ZXN0L2Rldi10b29scy9rdW5pdC9pbmRleC5odG1s Ci0tIAoyLjcuNAoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCmxpbnV4LXJpc2N2IG1haWxpbmcgbGlzdApsaW51eC1yaXNjdkBsaXN0cy5pbmZyYWRlYWQu b3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcmlz Y3YK