From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-vk1-xa35.google.com (mail-vk1-xa35.google.com [IPv6:2607:f8b0:4864:20::a35]) by sourceware.org (Postfix) with ESMTPS id 7AC433954C4A; Thu, 12 May 2022 20:02:08 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7AC433954C4A Received: by mail-vk1-xa35.google.com with SMTP id s68so3220500vke.6; Thu, 12 May 2022 13:02:08 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=WB7m4uvdh1vAwVbJv3uCbntK9cFVr4iRn5AcTsJdPa0=; b=6pApkdgJVH4FK406WAfj+mq7qv97cVYnPRpTuVALdmNAMqpycgaU7O1hNkTyHb9p59 yLzSUtr/QDqbyEP3Dg2j9NX8eeuiu5UqhLkTSQTeObMOzbZXsAurv1pIWxSuXlf7y9gM bmQkuv6qOMV2N9EKi2REtrlUshQAT0aoQempfZUO3YRdtIeJSQXOx3mkW43nqLoSVrei 9fQc/OHZ8yp2tAZYIKYtjVEzcJa8KVKncsyk745wNvO5bxyWsTpviZPCQBclk+CTOlMi KQwy2sJNNtEDm9WwF7NSRRnAPdGal108WcoBiCTY80RpYbG5wmshE5a0VUAa/kY3H4W8 lHBw== X-Gm-Message-State: AOAM533EeI3fqh2Dtu4PhDwimigpHB8lMsepu2UhvJAuDUA2ZqjtC160 atgAc1ynUZyQByx+xOSwmLvN1tVoZ69Bw7dgzZE= X-Google-Smtp-Source: ABdhPJzgM1NttOq5li8OX91RXbCokRtjN5DmpmcSXa0QEkVCXPv6ZIy93SRAbkDKy1hLlO+wQiU15iUIWbMsB3eKXgI= X-Received: by 2002:a1f:2c0b:0:b0:345:e29e:cb24 with SMTP id s11-20020a1f2c0b000000b00345e29ecb24mr1087323vks.7.1652385727499; Thu, 12 May 2022 13:02:07 -0700 (PDT) MIME-Version: 1.0 References: <20220415055132.1257272-1-goldstein.w.n@gmail.com> <20220415172801.1525674-1-goldstein.w.n@gmail.com> <20220415172801.1525674-2-goldstein.w.n@gmail.com> In-Reply-To: From: Sunil Pandey Date: Thu, 12 May 2022 13:01:31 -0700 Message-ID: Subject: Re: [PATCH v3 2/3] x86: Remove memcmp-sse4.S To: "H.J. Lu" , Libc-stable Mailing List Cc: Noah Goldstein , GNU C Library Content-Type: multipart/mixed; boundary="00000000000051e2f205ded608ac" X-Spam-Status: No, score=-7.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, HK_RANDOM_ENVFROM, HK_RANDOM_FROM, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-stable@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-stable mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 12 May 2022 20:02:12 -0000 --00000000000051e2f205ded608ac Content-Type: text/plain; charset="UTF-8" On Fri, Apr 15, 2022 at 10:33 AM H.J. Lu via Libc-alpha wrote: > > On Fri, Apr 15, 2022 at 10:28 AM Noah Goldstein wrote: > > > > Code didn't actually use any sse4 instructions since `ptest` was > > removed in: > > > > commit 2f9062d7171850451e6044ef78d91ff8c017b9c0 > > Author: Noah Goldstein > > Date: Wed Nov 10 16:18:56 2021 -0600 > > > > x86: Shrink memcmp-sse4.S code size > > > > The new memcmp-sse2 implementation is also faster. > > > > geometric_mean(N=20) of page cross cases SSE2 / SSE4: 0.905 > > > > Note there are two regressions prefering SSE2 for Size = 1 and Size = > preferring > > LGTM with the commit log typo fix. > > Reviewed-by: H.J. Lu > > Thanks. > > > 65. > > > > Size = 1: > > size, align0, align1, ret, New Time/Old Time > > 1, 1, 1, 0, 1.2 > > 1, 1, 1, 1, 1.197 > > 1, 1, 1, -1, 1.2 > > > > This is intentional. Size == 1 is significantly less hot based on > > profiles of GCC11 and Python3 than sizes [4, 8] (which is made > > hotter). > > > > Python3 Size = 1 -> 13.64% > > Python3 Size = [4, 8] -> 60.92% > > > > GCC11 Size = 1 -> 1.29% > > GCC11 Size = [4, 8] -> 33.86% > > > > size, align0, align1, ret, New Time/Old Time > > 4, 4, 4, 0, 0.622 > > 4, 4, 4, 1, 0.797 > > 4, 4, 4, -1, 0.805 > > 5, 5, 5, 0, 0.623 > > 5, 5, 5, 1, 0.777 > > 5, 5, 5, -1, 0.802 > > 6, 6, 6, 0, 0.625 > > 6, 6, 6, 1, 0.813 > > 6, 6, 6, -1, 0.788 > > 7, 7, 7, 0, 0.625 > > 7, 7, 7, 1, 0.799 > > 7, 7, 7, -1, 0.795 > > 8, 8, 8, 0, 0.625 > > 8, 8, 8, 1, 0.848 > > 8, 8, 8, -1, 0.914 > > 9, 9, 9, 0, 0.625 > > > > Size = 65: > > size, align0, align1, ret, New Time/Old Time > > 65, 0, 0, 0, 1.103 > > 65, 0, 0, 1, 1.216 > > 65, 0, 0, -1, 1.227 > > 65, 65, 0, 0, 1.091 > > 65, 0, 65, 1, 1.19 > > 65, 65, 65, -1, 1.215 > > > > This is because A) the checks in range [65, 96] are now unrolled 2x > > and B) because smaller values <= 16 are now given a hotter path. By > > contrast the SSE4 version has a branch for Size = 80. The unrolled > > version has get better performance for returns which need both > > comparisons. > > > > size, align0, align1, ret, New Time/Old Time > > 128, 4, 8, 0, 0.858 > > 128, 4, 8, 1, 0.879 > > 128, 4, 8, -1, 0.888 > > > > As well, out of microbenchmark environments that are not full > > predictable the branch will have a real-cost. > > --- > > sysdeps/x86_64/multiarch/Makefile | 2 - > > sysdeps/x86_64/multiarch/ifunc-impl-list.c | 4 - > > sysdeps/x86_64/multiarch/ifunc-memcmp.h | 4 - > > sysdeps/x86_64/multiarch/memcmp-sse4.S | 803 --------------------- > > 4 files changed, 813 deletions(-) > > delete mode 100644 sysdeps/x86_64/multiarch/memcmp-sse4.S > > > > diff --git a/sysdeps/x86_64/multiarch/Makefile b/sysdeps/x86_64/multiarch/Makefile > > index b573966966..0400ea332b 100644 > > --- a/sysdeps/x86_64/multiarch/Makefile > > +++ b/sysdeps/x86_64/multiarch/Makefile > > @@ -11,7 +11,6 @@ sysdep_routines += \ > > memcmp-avx2-movbe-rtm \ > > memcmp-evex-movbe \ > > memcmp-sse2 \ > > - memcmp-sse4 \ > > memcmpeq-avx2 \ > > memcmpeq-avx2-rtm \ > > memcmpeq-evex \ > > @@ -164,7 +163,6 @@ sysdep_routines += \ > > wmemcmp-avx2-movbe-rtm \ > > wmemcmp-evex-movbe \ > > wmemcmp-sse2 \ > > - wmemcmp-sse4 \ > > # sysdep_routines > > endif > > > > diff --git a/sysdeps/x86_64/multiarch/ifunc-impl-list.c b/sysdeps/x86_64/multiarch/ifunc-impl-list.c > > index c6008a73ed..a8afcf81bb 100644 > > --- a/sysdeps/x86_64/multiarch/ifunc-impl-list.c > > +++ b/sysdeps/x86_64/multiarch/ifunc-impl-list.c > > @@ -96,8 +96,6 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, > > && CPU_FEATURE_USABLE (BMI2) > > && CPU_FEATURE_USABLE (MOVBE)), > > __memcmp_evex_movbe) > > - IFUNC_IMPL_ADD (array, i, memcmp, CPU_FEATURE_USABLE (SSE4_1), > > - __memcmp_sse4_1) > > IFUNC_IMPL_ADD (array, i, memcmp, 1, __memcmp_sse2)) > > > > #ifdef SHARED > > @@ -809,8 +807,6 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, > > && CPU_FEATURE_USABLE (BMI2) > > && CPU_FEATURE_USABLE (MOVBE)), > > __wmemcmp_evex_movbe) > > - IFUNC_IMPL_ADD (array, i, wmemcmp, CPU_FEATURE_USABLE (SSE4_1), > > - __wmemcmp_sse4_1) > > IFUNC_IMPL_ADD (array, i, wmemcmp, 1, __wmemcmp_sse2)) > > > > /* Support sysdeps/x86_64/multiarch/wmemset.c. */ > > diff --git a/sysdeps/x86_64/multiarch/ifunc-memcmp.h b/sysdeps/x86_64/multiarch/ifunc-memcmp.h > > index 44759a3ad5..c743970fe3 100644 > > --- a/sysdeps/x86_64/multiarch/ifunc-memcmp.h > > +++ b/sysdeps/x86_64/multiarch/ifunc-memcmp.h > > @@ -20,7 +20,6 @@ > > # include > > > > extern __typeof (REDIRECT_NAME) OPTIMIZE (sse2) attribute_hidden; > > -extern __typeof (REDIRECT_NAME) OPTIMIZE (sse4_1) attribute_hidden; > > extern __typeof (REDIRECT_NAME) OPTIMIZE (avx2_movbe) attribute_hidden; > > extern __typeof (REDIRECT_NAME) OPTIMIZE (avx2_movbe_rtm) attribute_hidden; > > extern __typeof (REDIRECT_NAME) OPTIMIZE (evex_movbe) attribute_hidden; > > @@ -46,8 +45,5 @@ IFUNC_SELECTOR (void) > > return OPTIMIZE (avx2_movbe); > > } > > > > - if (CPU_FEATURE_USABLE_P (cpu_features, SSE4_1)) > > - return OPTIMIZE (sse4_1); > > - > > return OPTIMIZE (sse2); > > } > > diff --git a/sysdeps/x86_64/multiarch/memcmp-sse4.S b/sysdeps/x86_64/multiarch/memcmp-sse4.S > > deleted file mode 100644 > > index cd57c1e2c7..0000000000 > > --- a/sysdeps/x86_64/multiarch/memcmp-sse4.S > > +++ /dev/null > > @@ -1,803 +0,0 @@ > > -/* memcmp with SSE4.1, wmemcmp with SSE4.1 > > - Copyright (C) 2010-2022 Free Software Foundation, Inc. > > - This file is part of the GNU C Library. > > - > > - The GNU C Library is free software; you can redistribute it and/or > > - modify it under the terms of the GNU Lesser General Public > > - License as published by the Free Software Foundation; either > > - version 2.1 of the License, or (at your option) any later version. > > - > > - The GNU C Library is distributed in the hope that it will be useful, > > - but WITHOUT ANY WARRANTY; without even the implied warranty of > > - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > > - Lesser General Public License for more details. > > - > > - You should have received a copy of the GNU Lesser General Public > > - License along with the GNU C Library; if not, see > > - . */ > > - > > -#if IS_IN (libc) > > - > > -# include > > - > > -# ifndef MEMCMP > > -# define MEMCMP __memcmp_sse4_1 > > -# endif > > - > > -#ifdef USE_AS_WMEMCMP > > -# define CMPEQ pcmpeqd > > -# define CHAR_SIZE 4 > > -#else > > -# define CMPEQ pcmpeqb > > -# define CHAR_SIZE 1 > > -#endif > > - > > - > > -/* Warning! > > - wmemcmp has to use SIGNED comparison for elements. > > - memcmp has to use UNSIGNED comparison for elemnts. > > -*/ > > - > > - .section .text.sse4.1,"ax",@progbits > > -ENTRY (MEMCMP) > > -# ifdef USE_AS_WMEMCMP > > - shl $2, %RDX_LP > > -# elif defined __ILP32__ > > - /* Clear the upper 32 bits. */ > > - mov %edx, %edx > > -# endif > > - cmp $79, %RDX_LP > > - ja L(79bytesormore) > > - > > - cmp $CHAR_SIZE, %RDX_LP > > - jbe L(firstbyte) > > - > > - /* N in (CHAR_SIZE, 79) bytes. */ > > - cmpl $32, %edx > > - ja L(more_32_bytes) > > - > > - cmpl $16, %edx > > - jae L(16_to_32_bytes) > > - > > -# ifndef USE_AS_WMEMCMP > > - cmpl $8, %edx > > - jae L(8_to_16_bytes) > > - > > - cmpl $4, %edx > > - jb L(2_to_3_bytes) > > - > > - movl (%rdi), %eax > > - movl (%rsi), %ecx > > - > > - bswap %eax > > - bswap %ecx > > - > > - shlq $32, %rax > > - shlq $32, %rcx > > - > > - movl -4(%rdi, %rdx), %edi > > - movl -4(%rsi, %rdx), %esi > > - > > - bswap %edi > > - bswap %esi > > - > > - orq %rdi, %rax > > - orq %rsi, %rcx > > - subq %rcx, %rax > > - cmovne %edx, %eax > > - sbbl %ecx, %ecx > > - orl %ecx, %eax > > - ret > > - > > - .p2align 4,, 8 > > -L(2_to_3_bytes): > > - movzwl (%rdi), %eax > > - movzwl (%rsi), %ecx > > - shll $8, %eax > > - shll $8, %ecx > > - bswap %eax > > - bswap %ecx > > - movzbl -1(%rdi, %rdx), %edi > > - movzbl -1(%rsi, %rdx), %esi > > - orl %edi, %eax > > - orl %esi, %ecx > > - subl %ecx, %eax > > - ret > > - > > - .p2align 4,, 8 > > -L(8_to_16_bytes): > > - movq (%rdi), %rax > > - movq (%rsi), %rcx > > - > > - bswap %rax > > - bswap %rcx > > - > > - subq %rcx, %rax > > - jne L(8_to_16_bytes_done) > > - > > - movq -8(%rdi, %rdx), %rax > > - movq -8(%rsi, %rdx), %rcx > > - > > - bswap %rax > > - bswap %rcx > > - > > - subq %rcx, %rax > > - > > -L(8_to_16_bytes_done): > > - cmovne %edx, %eax > > - sbbl %ecx, %ecx > > - orl %ecx, %eax > > - ret > > -# else > > - xorl %eax, %eax > > - movl (%rdi), %ecx > > - cmpl (%rsi), %ecx > > - jne L(8_to_16_bytes_done) > > - movl 4(%rdi), %ecx > > - cmpl 4(%rsi), %ecx > > - jne L(8_to_16_bytes_done) > > - movl -4(%rdi, %rdx), %ecx > > - cmpl -4(%rsi, %rdx), %ecx > > - jne L(8_to_16_bytes_done) > > - ret > > -# endif > > - > > - .p2align 4,, 3 > > -L(ret_zero): > > - xorl %eax, %eax > > -L(zero): > > - ret > > - > > - .p2align 4,, 8 > > -L(firstbyte): > > - jb L(ret_zero) > > -# ifdef USE_AS_WMEMCMP > > - xorl %eax, %eax > > - movl (%rdi), %ecx > > - cmpl (%rsi), %ecx > > - je L(zero) > > -L(8_to_16_bytes_done): > > - setg %al > > - leal -1(%rax, %rax), %eax > > -# else > > - movzbl (%rdi), %eax > > - movzbl (%rsi), %ecx > > - sub %ecx, %eax > > -# endif > > - ret > > - > > - .p2align 4 > > -L(vec_return_begin_48): > > - addq $16, %rdi > > - addq $16, %rsi > > -L(vec_return_begin_32): > > - bsfl %eax, %eax > > -# ifdef USE_AS_WMEMCMP > > - movl 32(%rdi, %rax), %ecx > > - xorl %edx, %edx > > - cmpl 32(%rsi, %rax), %ecx > > - setg %dl > > - leal -1(%rdx, %rdx), %eax > > -# else > > - movzbl 32(%rsi, %rax), %ecx > > - movzbl 32(%rdi, %rax), %eax > > - subl %ecx, %eax > > -# endif > > - ret > > - > > - .p2align 4 > > -L(vec_return_begin_16): > > - addq $16, %rdi > > - addq $16, %rsi > > -L(vec_return_begin): > > - bsfl %eax, %eax > > -# ifdef USE_AS_WMEMCMP > > - movl (%rdi, %rax), %ecx > > - xorl %edx, %edx > > - cmpl (%rsi, %rax), %ecx > > - setg %dl > > - leal -1(%rdx, %rdx), %eax > > -# else > > - movzbl (%rsi, %rax), %ecx > > - movzbl (%rdi, %rax), %eax > > - subl %ecx, %eax > > -# endif > > - ret > > - > > - .p2align 4 > > -L(vec_return_end_16): > > - subl $16, %edx > > -L(vec_return_end): > > - bsfl %eax, %eax > > - addl %edx, %eax > > -# ifdef USE_AS_WMEMCMP > > - movl -16(%rdi, %rax), %ecx > > - xorl %edx, %edx > > - cmpl -16(%rsi, %rax), %ecx > > - setg %dl > > - leal -1(%rdx, %rdx), %eax > > -# else > > - movzbl -16(%rsi, %rax), %ecx > > - movzbl -16(%rdi, %rax), %eax > > - subl %ecx, %eax > > -# endif > > - ret > > - > > - .p2align 4,, 8 > > -L(more_32_bytes): > > - movdqu (%rdi), %xmm0 > > - movdqu (%rsi), %xmm1 > > - CMPEQ %xmm0, %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin) > > - > > - movdqu 16(%rdi), %xmm0 > > - movdqu 16(%rsi), %xmm1 > > - CMPEQ %xmm0, %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_16) > > - > > - cmpl $64, %edx > > - jbe L(32_to_64_bytes) > > - movdqu 32(%rdi), %xmm0 > > - movdqu 32(%rsi), %xmm1 > > - CMPEQ %xmm0, %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_32) > > - > > - .p2align 4,, 6 > > -L(32_to_64_bytes): > > - movdqu -32(%rdi, %rdx), %xmm0 > > - movdqu -32(%rsi, %rdx), %xmm1 > > - CMPEQ %xmm0, %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_end_16) > > - > > - movdqu -16(%rdi, %rdx), %xmm0 > > - movdqu -16(%rsi, %rdx), %xmm1 > > - CMPEQ %xmm0, %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_end) > > - ret > > - > > - .p2align 4 > > -L(16_to_32_bytes): > > - movdqu (%rdi), %xmm0 > > - movdqu (%rsi), %xmm1 > > - CMPEQ %xmm0, %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin) > > - > > - movdqu -16(%rdi, %rdx), %xmm0 > > - movdqu -16(%rsi, %rdx), %xmm1 > > - CMPEQ %xmm0, %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_end) > > - ret > > - > > - > > - .p2align 4 > > -L(79bytesormore): > > - movdqu (%rdi), %xmm0 > > - movdqu (%rsi), %xmm1 > > - CMPEQ %xmm0, %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin) > > - > > - > > - mov %rsi, %rcx > > - and $-16, %rsi > > - add $16, %rsi > > - sub %rsi, %rcx > > - > > - sub %rcx, %rdi > > - add %rcx, %rdx > > - test $0xf, %rdi > > - jz L(2aligned) > > - > > - cmp $128, %rdx > > - ja L(128bytesormore) > > - > > - .p2align 4,, 6 > > -L(less128bytes): > > - movdqu (%rdi), %xmm1 > > - CMPEQ (%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin) > > - > > - movdqu 16(%rdi), %xmm1 > > - CMPEQ 16(%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_16) > > - > > - movdqu 32(%rdi), %xmm1 > > - CMPEQ 32(%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_32) > > - > > - movdqu 48(%rdi), %xmm1 > > - CMPEQ 48(%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_48) > > - > > - cmp $96, %rdx > > - jb L(32_to_64_bytes) > > - > > - addq $64, %rdi > > - addq $64, %rsi > > - subq $64, %rdx > > - > > - .p2align 4,, 6 > > -L(last_64_bytes): > > - movdqu (%rdi), %xmm1 > > - CMPEQ (%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin) > > - > > - movdqu 16(%rdi), %xmm1 > > - CMPEQ 16(%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_16) > > - > > - movdqu -32(%rdi, %rdx), %xmm0 > > - movdqu -32(%rsi, %rdx), %xmm1 > > - CMPEQ %xmm0, %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_end_16) > > - > > - movdqu -16(%rdi, %rdx), %xmm0 > > - movdqu -16(%rsi, %rdx), %xmm1 > > - CMPEQ %xmm0, %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_end) > > - ret > > - > > - .p2align 4 > > -L(128bytesormore): > > - cmp $256, %rdx > > - ja L(unaligned_loop) > > -L(less256bytes): > > - movdqu (%rdi), %xmm1 > > - CMPEQ (%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin) > > - > > - movdqu 16(%rdi), %xmm1 > > - CMPEQ 16(%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_16) > > - > > - movdqu 32(%rdi), %xmm1 > > - CMPEQ 32(%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_32) > > - > > - movdqu 48(%rdi), %xmm1 > > - CMPEQ 48(%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_48) > > - > > - addq $64, %rdi > > - addq $64, %rsi > > - > > - movdqu (%rdi), %xmm1 > > - CMPEQ (%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin) > > - > > - movdqu 16(%rdi), %xmm1 > > - CMPEQ 16(%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_16) > > - > > - movdqu 32(%rdi), %xmm1 > > - CMPEQ 32(%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_32) > > - > > - movdqu 48(%rdi), %xmm1 > > - CMPEQ 48(%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_48) > > - > > - addq $-128, %rdx > > - subq $-64, %rsi > > - subq $-64, %rdi > > - > > - cmp $64, %rdx > > - ja L(less128bytes) > > - > > - cmp $32, %rdx > > - ja L(last_64_bytes) > > - > > - movdqu -32(%rdi, %rdx), %xmm0 > > - movdqu -32(%rsi, %rdx), %xmm1 > > - CMPEQ %xmm0, %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_end_16) > > - > > - movdqu -16(%rdi, %rdx), %xmm0 > > - movdqu -16(%rsi, %rdx), %xmm1 > > - CMPEQ %xmm0, %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_end) > > - ret > > - > > - .p2align 4 > > -L(unaligned_loop): > > -# ifdef DATA_CACHE_SIZE_HALF > > - mov $DATA_CACHE_SIZE_HALF, %R8_LP > > -# else > > - mov __x86_data_cache_size_half(%rip), %R8_LP > > -# endif > > - movq %r8, %r9 > > - addq %r8, %r8 > > - addq %r9, %r8 > > - cmpq %r8, %rdx > > - ja L(L2_L3_cache_unaligned) > > - sub $64, %rdx > > - .p2align 4 > > -L(64bytesormore_loop): > > - movdqu (%rdi), %xmm0 > > - movdqu 16(%rdi), %xmm1 > > - movdqu 32(%rdi), %xmm2 > > - movdqu 48(%rdi), %xmm3 > > - > > - CMPEQ (%rsi), %xmm0 > > - CMPEQ 16(%rsi), %xmm1 > > - CMPEQ 32(%rsi), %xmm2 > > - CMPEQ 48(%rsi), %xmm3 > > - > > - pand %xmm0, %xmm1 > > - pand %xmm2, %xmm3 > > - pand %xmm1, %xmm3 > > - > > - pmovmskb %xmm3, %eax > > - incw %ax > > - jnz L(64bytesormore_loop_end) > > - > > - add $64, %rsi > > - add $64, %rdi > > - sub $64, %rdx > > - ja L(64bytesormore_loop) > > - > > - .p2align 4,, 6 > > -L(loop_tail): > > - addq %rdx, %rdi > > - movdqu (%rdi), %xmm0 > > - movdqu 16(%rdi), %xmm1 > > - movdqu 32(%rdi), %xmm2 > > - movdqu 48(%rdi), %xmm3 > > - > > - addq %rdx, %rsi > > - movdqu (%rsi), %xmm4 > > - movdqu 16(%rsi), %xmm5 > > - movdqu 32(%rsi), %xmm6 > > - movdqu 48(%rsi), %xmm7 > > - > > - CMPEQ %xmm4, %xmm0 > > - CMPEQ %xmm5, %xmm1 > > - CMPEQ %xmm6, %xmm2 > > - CMPEQ %xmm7, %xmm3 > > - > > - pand %xmm0, %xmm1 > > - pand %xmm2, %xmm3 > > - pand %xmm1, %xmm3 > > - > > - pmovmskb %xmm3, %eax > > - incw %ax > > - jnz L(64bytesormore_loop_end) > > - ret > > - > > -L(L2_L3_cache_unaligned): > > - subq $64, %rdx > > - .p2align 4 > > -L(L2_L3_unaligned_128bytes_loop): > > - prefetchnta 0x1c0(%rdi) > > - prefetchnta 0x1c0(%rsi) > > - > > - movdqu (%rdi), %xmm0 > > - movdqu 16(%rdi), %xmm1 > > - movdqu 32(%rdi), %xmm2 > > - movdqu 48(%rdi), %xmm3 > > - > > - CMPEQ (%rsi), %xmm0 > > - CMPEQ 16(%rsi), %xmm1 > > - CMPEQ 32(%rsi), %xmm2 > > - CMPEQ 48(%rsi), %xmm3 > > - > > - pand %xmm0, %xmm1 > > - pand %xmm2, %xmm3 > > - pand %xmm1, %xmm3 > > - > > - pmovmskb %xmm3, %eax > > - incw %ax > > - jnz L(64bytesormore_loop_end) > > - > > - add $64, %rsi > > - add $64, %rdi > > - sub $64, %rdx > > - ja L(L2_L3_unaligned_128bytes_loop) > > - jmp L(loop_tail) > > - > > - > > - /* This case is for machines which are sensitive for unaligned > > - * instructions. */ > > - .p2align 4 > > -L(2aligned): > > - cmp $128, %rdx > > - ja L(128bytesormorein2aligned) > > -L(less128bytesin2aligned): > > - movdqa (%rdi), %xmm1 > > - CMPEQ (%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin) > > - > > - movdqa 16(%rdi), %xmm1 > > - CMPEQ 16(%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_16) > > - > > - movdqa 32(%rdi), %xmm1 > > - CMPEQ 32(%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_32) > > - > > - movdqa 48(%rdi), %xmm1 > > - CMPEQ 48(%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_48) > > - > > - cmp $96, %rdx > > - jb L(32_to_64_bytes) > > - > > - addq $64, %rdi > > - addq $64, %rsi > > - subq $64, %rdx > > - > > - .p2align 4,, 6 > > -L(aligned_last_64_bytes): > > - movdqa (%rdi), %xmm1 > > - CMPEQ (%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin) > > - > > - movdqa 16(%rdi), %xmm1 > > - CMPEQ 16(%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_16) > > - > > - movdqu -32(%rdi, %rdx), %xmm0 > > - movdqu -32(%rsi, %rdx), %xmm1 > > - CMPEQ %xmm0, %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_end_16) > > - > > - movdqu -16(%rdi, %rdx), %xmm0 > > - movdqu -16(%rsi, %rdx), %xmm1 > > - CMPEQ %xmm0, %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_end) > > - ret > > - > > - .p2align 4 > > -L(128bytesormorein2aligned): > > - cmp $256, %rdx > > - ja L(aligned_loop) > > -L(less256bytesin2alinged): > > - movdqa (%rdi), %xmm1 > > - CMPEQ (%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin) > > - > > - movdqa 16(%rdi), %xmm1 > > - CMPEQ 16(%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_16) > > - > > - movdqa 32(%rdi), %xmm1 > > - CMPEQ 32(%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_32) > > - > > - movdqa 48(%rdi), %xmm1 > > - CMPEQ 48(%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_48) > > - > > - addq $64, %rdi > > - addq $64, %rsi > > - > > - movdqa (%rdi), %xmm1 > > - CMPEQ (%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin) > > - > > - movdqa 16(%rdi), %xmm1 > > - CMPEQ 16(%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_16) > > - > > - movdqa 32(%rdi), %xmm1 > > - CMPEQ 32(%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_32) > > - > > - movdqa 48(%rdi), %xmm1 > > - CMPEQ 48(%rsi), %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_begin_48) > > - > > - addq $-128, %rdx > > - subq $-64, %rsi > > - subq $-64, %rdi > > - > > - cmp $64, %rdx > > - ja L(less128bytesin2aligned) > > - > > - cmp $32, %rdx > > - ja L(aligned_last_64_bytes) > > - > > - movdqu -32(%rdi, %rdx), %xmm0 > > - movdqu -32(%rsi, %rdx), %xmm1 > > - CMPEQ %xmm0, %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_end_16) > > - > > - movdqu -16(%rdi, %rdx), %xmm0 > > - movdqu -16(%rsi, %rdx), %xmm1 > > - CMPEQ %xmm0, %xmm1 > > - pmovmskb %xmm1, %eax > > - incw %ax > > - jnz L(vec_return_end) > > - ret > > - > > - .p2align 4 > > -L(aligned_loop): > > -# ifdef DATA_CACHE_SIZE_HALF > > - mov $DATA_CACHE_SIZE_HALF, %R8_LP > > -# else > > - mov __x86_data_cache_size_half(%rip), %R8_LP > > -# endif > > - movq %r8, %r9 > > - addq %r8, %r8 > > - addq %r9, %r8 > > - cmpq %r8, %rdx > > - ja L(L2_L3_cache_aligned) > > - > > - sub $64, %rdx > > - .p2align 4 > > -L(64bytesormore_loopin2aligned): > > - movdqa (%rdi), %xmm0 > > - movdqa 16(%rdi), %xmm1 > > - movdqa 32(%rdi), %xmm2 > > - movdqa 48(%rdi), %xmm3 > > - > > - CMPEQ (%rsi), %xmm0 > > - CMPEQ 16(%rsi), %xmm1 > > - CMPEQ 32(%rsi), %xmm2 > > - CMPEQ 48(%rsi), %xmm3 > > - > > - pand %xmm0, %xmm1 > > - pand %xmm2, %xmm3 > > - pand %xmm1, %xmm3 > > - > > - pmovmskb %xmm3, %eax > > - incw %ax > > - jnz L(64bytesormore_loop_end) > > - add $64, %rsi > > - add $64, %rdi > > - sub $64, %rdx > > - ja L(64bytesormore_loopin2aligned) > > - jmp L(loop_tail) > > - > > -L(L2_L3_cache_aligned): > > - subq $64, %rdx > > - .p2align 4 > > -L(L2_L3_aligned_128bytes_loop): > > - prefetchnta 0x1c0(%rdi) > > - prefetchnta 0x1c0(%rsi) > > - movdqa (%rdi), %xmm0 > > - movdqa 16(%rdi), %xmm1 > > - movdqa 32(%rdi), %xmm2 > > - movdqa 48(%rdi), %xmm3 > > - > > - CMPEQ (%rsi), %xmm0 > > - CMPEQ 16(%rsi), %xmm1 > > - CMPEQ 32(%rsi), %xmm2 > > - CMPEQ 48(%rsi), %xmm3 > > - > > - pand %xmm0, %xmm1 > > - pand %xmm2, %xmm3 > > - pand %xmm1, %xmm3 > > - > > - pmovmskb %xmm3, %eax > > - incw %ax > > - jnz L(64bytesormore_loop_end) > > - > > - addq $64, %rsi > > - addq $64, %rdi > > - subq $64, %rdx > > - ja L(L2_L3_aligned_128bytes_loop) > > - jmp L(loop_tail) > > - > > - .p2align 4 > > -L(64bytesormore_loop_end): > > - pmovmskb %xmm0, %ecx > > - incw %cx > > - jnz L(loop_end_ret) > > - > > - pmovmskb %xmm1, %ecx > > - notw %cx > > - sall $16, %ecx > > - jnz L(loop_end_ret) > > - > > - pmovmskb %xmm2, %ecx > > - notw %cx > > - shlq $32, %rcx > > - jnz L(loop_end_ret) > > - > > - addq $48, %rdi > > - addq $48, %rsi > > - movq %rax, %rcx > > - > > - .p2align 4,, 6 > > -L(loop_end_ret): > > - bsfq %rcx, %rcx > > -# ifdef USE_AS_WMEMCMP > > - movl (%rdi, %rcx), %eax > > - xorl %edx, %edx > > - cmpl (%rsi, %rcx), %eax > > - setg %dl > > - leal -1(%rdx, %rdx), %eax > > -# else > > - movzbl (%rdi, %rcx), %eax > > - movzbl (%rsi, %rcx), %ecx > > - subl %ecx, %eax > > -# endif > > - ret > > -END (MEMCMP) > > -#endif > > -- > > 2.25.1 > > > > > -- > H.J. I would like to backport this patch to release branches. Any comments or objections? Conflict resolution patch attached, --Sunil --00000000000051e2f205ded608ac Content-Type: application/octet-stream; name="0020-x86-Remove-memcmp-sse4.S.patch" Content-Disposition: attachment; filename="0020-x86-Remove-memcmp-sse4.S.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l33frsrv0 RnJvbSAzNTBlZDM2NmNlOWIyMWM4MTdjZTI4MDEwMmJkMWVhOWZmODQzYmFiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOb2FoIEdvbGRzdGVpbiA8Z29sZHN0ZWluLncubkBnbWFpbC5j b20+CkRhdGU6IEZyaSwgMTUgQXByIDIwMjIgMTI6Mjg6MDAgLTA1MDAKU3ViamVjdDogW1BBVENI IDIwLzI2XSB4ODY6IFJlbW92ZSBtZW1jbXAtc3NlNC5TCgpDb2RlIGRpZG4ndCBhY3R1YWxseSB1 c2UgYW55IHNzZTQgaW5zdHJ1Y3Rpb25zIHNpbmNlIGBwdGVzdGAgd2FzCnJlbW92ZWQgaW46Cgpj b21taXQgMmY5MDYyZDcxNzE4NTA0NTFlNjA0NGVmNzhkOTFmZjhjMDE3YjljMApBdXRob3I6IE5v YWggR29sZHN0ZWluIDxnb2xkc3RlaW4udy5uQGdtYWlsLmNvbT4KRGF0ZTogICBXZWQgTm92IDEw IDE2OjE4OjU2IDIwMjEgLTA2MDAKCiAgICB4ODY6IFNocmluayBtZW1jbXAtc3NlNC5TIGNvZGUg c2l6ZQoKVGhlIG5ldyBtZW1jbXAtc3NlMiBpbXBsZW1lbnRhdGlvbiBpcyBhbHNvIGZhc3Rlci4K Cmdlb21ldHJpY19tZWFuKE49MjApIG9mIHBhZ2UgY3Jvc3MgY2FzZXMgU1NFMiAvIFNTRTQ6IDAu OTA1CgpOb3RlIHRoZXJlIGFyZSB0d28gcmVncmVzc2lvbnMgcHJlZmVycmluZyBTU0UyIGZvciBT aXplID0gMSBhbmQgU2l6ZSA9CjY1LgoKU2l6ZSA9IDE6CnNpemUsIGFsaWduMCwgYWxpZ24xLCBy ZXQsIE5ldyBUaW1lL09sZCBUaW1lCiAgIDEsICAgICAgMSwgICAgICAxLCAgIDAsICAgICAgICAg ICAgICAgMS4yCiAgIDEsICAgICAgMSwgICAgICAxLCAgIDEsICAgICAgICAgICAgIDEuMTk3CiAg IDEsICAgICAgMSwgICAgICAxLCAgLTEsICAgICAgICAgICAgICAgMS4yCgpUaGlzIGlzIGludGVu dGlvbmFsLiBTaXplID09IDEgaXMgc2lnbmlmaWNhbnRseSBsZXNzIGhvdCBiYXNlZCBvbgpwcm9m aWxlcyBvZiBHQ0MxMSBhbmQgUHl0aG9uMyB0aGFuIHNpemVzIFs0LCA4XSAod2hpY2ggaXMgbWFk ZQpob3R0ZXIpLgoKUHl0aG9uMyBTaXplID0gMSAgICAgICAgLT4gMTMuNjQlClB5dGhvbjMgU2l6 ZSA9IFs0LCA4XSAgIC0+IDYwLjkyJQoKR0NDMTEgICBTaXplID0gMSAgICAgICAgLT4gIDEuMjkl CkdDQzExICAgU2l6ZSA9IFs0LCA4XSAgIC0+IDMzLjg2JQoKc2l6ZSwgYWxpZ24wLCBhbGlnbjEs IHJldCwgTmV3IFRpbWUvT2xkIFRpbWUKICAgNCwgICAgICA0LCAgICAgIDQsICAgMCwgICAgICAg ICAgICAgMC42MjIKICAgNCwgICAgICA0LCAgICAgIDQsICAgMSwgICAgICAgICAgICAgMC43OTcK ICAgNCwgICAgICA0LCAgICAgIDQsICAtMSwgICAgICAgICAgICAgMC44MDUKICAgNSwgICAgICA1 LCAgICAgIDUsICAgMCwgICAgICAgICAgICAgMC42MjMKICAgNSwgICAgICA1LCAgICAgIDUsICAg MSwgICAgICAgICAgICAgMC43NzcKICAgNSwgICAgICA1LCAgICAgIDUsICAtMSwgICAgICAgICAg ICAgMC44MDIKICAgNiwgICAgICA2LCAgICAgIDYsICAgMCwgICAgICAgICAgICAgMC42MjUKICAg NiwgICAgICA2LCAgICAgIDYsICAgMSwgICAgICAgICAgICAgMC44MTMKICAgNiwgICAgICA2LCAg ICAgIDYsICAtMSwgICAgICAgICAgICAgMC43ODgKICAgNywgICAgICA3LCAgICAgIDcsICAgMCwg ICAgICAgICAgICAgMC42MjUKICAgNywgICAgICA3LCAgICAgIDcsICAgMSwgICAgICAgICAgICAg MC43OTkKICAgNywgICAgICA3LCAgICAgIDcsICAtMSwgICAgICAgICAgICAgMC43OTUKICAgOCwg ICAgICA4LCAgICAgIDgsICAgMCwgICAgICAgICAgICAgMC42MjUKICAgOCwgICAgICA4LCAgICAg IDgsICAgMSwgICAgICAgICAgICAgMC44NDgKICAgOCwgICAgICA4LCAgICAgIDgsICAtMSwgICAg ICAgICAgICAgMC45MTQKICAgOSwgICAgICA5LCAgICAgIDksICAgMCwgICAgICAgICAgICAgMC42 MjUKClNpemUgPSA2NToKc2l6ZSwgYWxpZ24wLCBhbGlnbjEsIHJldCwgTmV3IFRpbWUvT2xkIFRp bWUKICA2NSwgICAgICAwLCAgICAgIDAsICAgMCwgICAgICAgICAgICAgMS4xMDMKICA2NSwgICAg ICAwLCAgICAgIDAsICAgMSwgICAgICAgICAgICAgMS4yMTYKICA2NSwgICAgICAwLCAgICAgIDAs ICAtMSwgICAgICAgICAgICAgMS4yMjcKICA2NSwgICAgIDY1LCAgICAgIDAsICAgMCwgICAgICAg ICAgICAgMS4wOTEKICA2NSwgICAgICAwLCAgICAgNjUsICAgMSwgICAgICAgICAgICAgIDEuMTkK ICA2NSwgICAgIDY1LCAgICAgNjUsICAtMSwgICAgICAgICAgICAgMS4yMTUKClRoaXMgaXMgYmVj YXVzZSBBKSB0aGUgY2hlY2tzIGluIHJhbmdlIFs2NSwgOTZdIGFyZSBub3cgdW5yb2xsZWQgMngK YW5kIEIpIGJlY2F1c2Ugc21hbGxlciB2YWx1ZXMgPD0gMTYgYXJlIG5vdyBnaXZlbiBhIGhvdHRl ciBwYXRoLiBCeQpjb250cmFzdCB0aGUgU1NFNCB2ZXJzaW9uIGhhcyBhIGJyYW5jaCBmb3IgU2l6 ZSA9IDgwLiBUaGUgdW5yb2xsZWQKdmVyc2lvbiBoYXMgZ2V0IGJldHRlciBwZXJmb3JtYW5jZSBm b3IgcmV0dXJucyB3aGljaCBuZWVkIGJvdGgKY29tcGFyaXNvbnMuCgpzaXplLCBhbGlnbjAsIGFs aWduMSwgcmV0LCBOZXcgVGltZS9PbGQgVGltZQogMTI4LCAgICAgIDQsICAgICAgOCwgICAwLCAg ICAgICAgICAgICAwLjg1OAogMTI4LCAgICAgIDQsICAgICAgOCwgICAxLCAgICAgICAgICAgICAw Ljg3OQogMTI4LCAgICAgIDQsICAgICAgOCwgIC0xLCAgICAgICAgICAgICAwLjg4OAoKQXMgd2Vs bCwgb3V0IG9mIG1pY3JvYmVuY2htYXJrIGVudmlyb25tZW50cyB0aGF0IGFyZSBub3QgZnVsbApw cmVkaWN0YWJsZSB0aGUgYnJhbmNoIHdpbGwgaGF2ZSBhIHJlYWwtY29zdC4KUmV2aWV3ZWQtYnk6 IEguSi4gTHUgPGhqbC50b29sc0BnbWFpbC5jb20+CgooY2hlcnJ5IHBpY2tlZCBmcm9tIGNvbW1p dCA3Y2JjMDNkMDMwOTFkNTY2NDA2MDkyNDc4OWFmZTQ2ZDMwYTU0NzdlKQotLS0KIHN5c2RlcHMv eDg2XzY0L211bHRpYXJjaC9NYWtlZmlsZSAgICAgICAgICB8ICAgMiAtCiBzeXNkZXBzL3g4Nl82 NC9tdWx0aWFyY2gvaWZ1bmMtaW1wbC1saXN0LmMgfCAgIDQgLQogc3lzZGVwcy94ODZfNjQvbXVs dGlhcmNoL2lmdW5jLW1lbWNtcC5oICAgIHwgICA0IC0KIHN5c2RlcHMveDg2XzY0L211bHRpYXJj aC9tZW1jbXAtc3NlNC5TICAgICB8IDgwMyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDQgZmlsZXMg Y2hhbmdlZCwgODEzIGRlbGV0aW9ucygtKQogZGVsZXRlIG1vZGUgMTAwNjQ0IHN5c2RlcHMveDg2 XzY0L211bHRpYXJjaC9tZW1jbXAtc3NlNC5TCgpkaWZmIC0tZ2l0IGEvc3lzZGVwcy94ODZfNjQv bXVsdGlhcmNoL01ha2VmaWxlIGIvc3lzZGVwcy94ODZfNjQvbXVsdGlhcmNoL01ha2VmaWxlCmlu ZGV4IGVjYjRkZWExOTAuLjJkOGRjMjZhYzIgMTAwNjQ0Ci0tLSBhL3N5c2RlcHMveDg2XzY0L211 bHRpYXJjaC9NYWtlZmlsZQorKysgYi9zeXNkZXBzL3g4Nl82NC9tdWx0aWFyY2gvTWFrZWZpbGUK QEAgLTExLDcgKzExLDYgQEAgc3lzZGVwX3JvdXRpbmVzICs9IFwKICAgbWVtY21wLWF2eDItbW92 YmUtcnRtIFwKICAgbWVtY21wLWV2ZXgtbW92YmUgXAogICBtZW1jbXAtc3NlMiBcCi0gIG1lbWNt cC1zc2U0IFwKICAgbWVtY21wLXNzc2UzIFwKICAgbWVtY21wZXEtYXZ4MiBcCiAgIG1lbWNtcGVx LWF2eDItcnRtIFwKQEAgLTE3OCw3ICsxNzcsNiBAQCBzeXNkZXBfcm91dGluZXMgKz0gXAogICB3 bWVtY21wLWF2eDItbW92YmUtcnRtIFwKICAgd21lbWNtcC1ldmV4LW1vdmJlIFwKICAgd21lbWNt cC1zc2UyIFwKLSAgd21lbWNtcC1zc2U0IFwKICAgd21lbWNtcC1zc3NlMyBcCiAjIHN5c2RlcF9y b3V0aW5lcwogZW5kaWYKZGlmZiAtLWdpdCBhL3N5c2RlcHMveDg2XzY0L211bHRpYXJjaC9pZnVu Yy1pbXBsLWxpc3QuYyBiL3N5c2RlcHMveDg2XzY0L211bHRpYXJjaC9pZnVuYy1pbXBsLWxpc3Qu YwppbmRleCA0MGNjNmNjNDllLi41MTZmN2YxMGUwIDEwMDY0NAotLS0gYS9zeXNkZXBzL3g4Nl82 NC9tdWx0aWFyY2gvaWZ1bmMtaW1wbC1saXN0LmMKKysrIGIvc3lzZGVwcy94ODZfNjQvbXVsdGlh cmNoL2lmdW5jLWltcGwtbGlzdC5jCkBAIC05Niw4ICs5Niw2IEBAIF9fbGliY19pZnVuY19pbXBs X2xpc3QgKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBsaWJjX2lmdW5jX2ltcGwgKmFycmF5LAog CQkJICAgICAgICYmIENQVV9GRUFUVVJFX1VTQUJMRSAoQk1JMikKIAkJCSAgICAgICAmJiBDUFVf RkVBVFVSRV9VU0FCTEUgKE1PVkJFKSksCiAJCQkgICAgICBfX21lbWNtcF9ldmV4X21vdmJlKQot CSAgICAgIElGVU5DX0lNUExfQUREIChhcnJheSwgaSwgbWVtY21wLCBDUFVfRkVBVFVSRV9VU0FC TEUgKFNTRTRfMSksCi0JCQkgICAgICBfX21lbWNtcF9zc2U0XzEpCiAJICAgICAgSUZVTkNfSU1Q TF9BREQgKGFycmF5LCBpLCBtZW1jbXAsIENQVV9GRUFUVVJFX1VTQUJMRSAoU1NTRTMpLAogCQkJ ICAgICAgX19tZW1jbXBfc3NzZTMpCiAJICAgICAgSUZVTkNfSU1QTF9BREQgKGFycmF5LCBpLCBt ZW1jbXAsIDEsIF9fbWVtY21wX3NzZTIpKQpAQCAtODQyLDggKzg0MCw2IEBAIF9fbGliY19pZnVu Y19pbXBsX2xpc3QgKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBsaWJjX2lmdW5jX2ltcGwgKmFy cmF5LAogCQkJICAgICAgICYmIENQVV9GRUFUVVJFX1VTQUJMRSAoQk1JMikKIAkJCSAgICAgICAm JiBDUFVfRkVBVFVSRV9VU0FCTEUgKE1PVkJFKSksCiAJCQkgICAgICBfX3dtZW1jbXBfZXZleF9t b3ZiZSkKLQkgICAgICBJRlVOQ19JTVBMX0FERCAoYXJyYXksIGksIHdtZW1jbXAsIENQVV9GRUFU VVJFX1VTQUJMRSAoU1NFNF8xKSwKLQkJCSAgICAgIF9fd21lbWNtcF9zc2U0XzEpCiAJICAgICAg SUZVTkNfSU1QTF9BREQgKGFycmF5LCBpLCB3bWVtY21wLCBDUFVfRkVBVFVSRV9VU0FCTEUgKFNT U0UzKSwKIAkJCSAgICAgIF9fd21lbWNtcF9zc3NlMykKIAkgICAgICBJRlVOQ19JTVBMX0FERCAo YXJyYXksIGksIHdtZW1jbXAsIDEsIF9fd21lbWNtcF9zc2UyKSkKZGlmZiAtLWdpdCBhL3N5c2Rl cHMveDg2XzY0L211bHRpYXJjaC9pZnVuYy1tZW1jbXAuaCBiL3N5c2RlcHMveDg2XzY0L211bHRp YXJjaC9pZnVuYy1tZW1jbXAuaAppbmRleCBjZDEyNjEzNjk5Li40NTE4YjBmOThjIDEwMDY0NAot LS0gYS9zeXNkZXBzL3g4Nl82NC9tdWx0aWFyY2gvaWZ1bmMtbWVtY21wLmgKKysrIGIvc3lzZGVw cy94ODZfNjQvbXVsdGlhcmNoL2lmdW5jLW1lbWNtcC5oCkBAIC0yMSw3ICsyMSw2IEBACiAKIGV4 dGVybiBfX3R5cGVvZiAoUkVESVJFQ1RfTkFNRSkgT1BUSU1JWkUgKHNzZTIpIGF0dHJpYnV0ZV9o aWRkZW47CiBleHRlcm4gX190eXBlb2YgKFJFRElSRUNUX05BTUUpIE9QVElNSVpFIChzc3NlMykg YXR0cmlidXRlX2hpZGRlbjsKLWV4dGVybiBfX3R5cGVvZiAoUkVESVJFQ1RfTkFNRSkgT1BUSU1J WkUgKHNzZTRfMSkgYXR0cmlidXRlX2hpZGRlbjsKIGV4dGVybiBfX3R5cGVvZiAoUkVESVJFQ1Rf TkFNRSkgT1BUSU1JWkUgKGF2eDJfbW92YmUpIGF0dHJpYnV0ZV9oaWRkZW47CiBleHRlcm4gX190 eXBlb2YgKFJFRElSRUNUX05BTUUpIE9QVElNSVpFIChhdngyX21vdmJlX3J0bSkgYXR0cmlidXRl X2hpZGRlbjsKIGV4dGVybiBfX3R5cGVvZiAoUkVESVJFQ1RfTkFNRSkgT1BUSU1JWkUgKGV2ZXhf bW92YmUpIGF0dHJpYnV0ZV9oaWRkZW47CkBAIC00Nyw5ICs0Niw2IEBAIElGVU5DX1NFTEVDVE9S ICh2b2lkKQogCXJldHVybiBPUFRJTUlaRSAoYXZ4Ml9tb3ZiZSk7CiAgICAgfQogCi0gIGlmIChD UFVfRkVBVFVSRV9VU0FCTEVfUCAoY3B1X2ZlYXR1cmVzLCBTU0U0XzEpKQotICAgIHJldHVybiBP UFRJTUlaRSAoc3NlNF8xKTsKLQogICBpZiAoQ1BVX0ZFQVRVUkVfVVNBQkxFX1AgKGNwdV9mZWF0 dXJlcywgU1NTRTMpKQogICAgIHJldHVybiBPUFRJTUlaRSAoc3NzZTMpOwogCmRpZmYgLS1naXQg YS9zeXNkZXBzL3g4Nl82NC9tdWx0aWFyY2gvbWVtY21wLXNzZTQuUyBiL3N5c2RlcHMveDg2XzY0 L211bHRpYXJjaC9tZW1jbXAtc3NlNC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBj ZDU3YzFlMmM3Li4wMDAwMDAwMDAwCi0tLSBhL3N5c2RlcHMveDg2XzY0L211bHRpYXJjaC9tZW1j bXAtc3NlNC5TCisrKyAvZGV2L251bGwKQEAgLTEsODAzICswLDAgQEAKLS8qIG1lbWNtcCB3aXRo IFNTRTQuMSwgd21lbWNtcCB3aXRoIFNTRTQuMQotICAgQ29weXJpZ2h0IChDKSAyMDEwLTIwMjIg RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0 aGUgR05VIEMgTGlicmFyeS4KLQotICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICBtb2RpZnkgaXQgdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFzIHB1 Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgIHZlcnNp b24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz aW9uLgotCi0gICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0 aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMZXNzZXIg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxk IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0g ICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgc2VlCi0gICA8 aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmIElTX0lOIChsaWJjKQot Ci0jIGluY2x1ZGUgPHN5c2RlcC5oPgotCi0jIGlmbmRlZiBNRU1DTVAKLSMgIGRlZmluZSBNRU1D TVAJX19tZW1jbXBfc3NlNF8xCi0jIGVuZGlmCi0KLSNpZmRlZiBVU0VfQVNfV01FTUNNUAotIyBk ZWZpbmUgQ01QRVEJcGNtcGVxZAotIyBkZWZpbmUgQ0hBUl9TSVpFCTQKLSNlbHNlCi0jIGRlZmlu ZSBDTVBFUQlwY21wZXFiCi0jIGRlZmluZSBDSEFSX1NJWkUJMQotI2VuZGlmCi0KLQotLyogV2Fy bmluZyEKLSAgICAgICAgICAgd21lbWNtcCBoYXMgdG8gdXNlIFNJR05FRCBjb21wYXJpc29uIGZv ciBlbGVtZW50cy4KLSAgICAgICAgICAgbWVtY21wIGhhcyB0byB1c2UgVU5TSUdORUQgY29tcGFy aXNvbiBmb3IgZWxlbW50cy4KLSovCi0KLQkuc2VjdGlvbiAudGV4dC5zc2U0LjEsImF4IixAcHJv Z2JpdHMKLUVOVFJZIChNRU1DTVApCi0jIGlmZGVmIFVTRV9BU19XTUVNQ01QCi0Jc2hsCSQyLCAl UkRYX0xQCi0jIGVsaWYgZGVmaW5lZCBfX0lMUDMyX18KLQkvKiBDbGVhciB0aGUgdXBwZXIgMzIg Yml0cy4gICovCi0JbW92CSVlZHgsICVlZHgKLSMgZW5kaWYKLQljbXAJJDc5LCAlUkRYX0xQCi0J amEJTCg3OWJ5dGVzb3Jtb3JlKQotCi0JY21wCSRDSEFSX1NJWkUsICVSRFhfTFAKLQlqYmUJTChm aXJzdGJ5dGUpCi0KLQkvKiBOIGluIChDSEFSX1NJWkUsIDc5KSBieXRlcy4gICovCi0JY21wbAkk MzIsICVlZHgKLQlqYQlMKG1vcmVfMzJfYnl0ZXMpCi0KLQljbXBsCSQxNiwgJWVkeAotCWphZQlM KDE2X3RvXzMyX2J5dGVzKQotCi0jIGlmbmRlZiBVU0VfQVNfV01FTUNNUAotCWNtcGwJJDgsICVl ZHgKLQlqYWUJTCg4X3RvXzE2X2J5dGVzKQotCi0JY21wbAkkNCwgJWVkeAotCWpiCUwoMl90b18z X2J5dGVzKQotCi0JbW92bAkoJXJkaSksICVlYXgKLQltb3ZsCSglcnNpKSwgJWVjeAotCi0JYnN3 YXAJJWVheAotCWJzd2FwCSVlY3gKLQotCXNobHEJJDMyLCAlcmF4Ci0Jc2hscQkkMzIsICVyY3gK LQotCW1vdmwJLTQoJXJkaSwgJXJkeCksICVlZGkKLQltb3ZsCS00KCVyc2ksICVyZHgpLCAlZXNp Ci0KLQlic3dhcAklZWRpCi0JYnN3YXAJJWVzaQotCi0Jb3JxCSVyZGksICVyYXgKLQlvcnEJJXJz aSwgJXJjeAotCXN1YnEJJXJjeCwgJXJheAotCWNtb3ZuZQklZWR4LCAlZWF4Ci0Jc2JibAklZWN4 LCAlZWN4Ci0Jb3JsCSVlY3gsICVlYXgKLQlyZXQKLQotCS5wMmFsaWduIDQsLCA4Ci1MKDJfdG9f M19ieXRlcyk6Ci0JbW92endsCSglcmRpKSwgJWVheAotCW1vdnp3bAkoJXJzaSksICVlY3gKLQlz aGxsCSQ4LCAlZWF4Ci0Jc2hsbAkkOCwgJWVjeAotCWJzd2FwCSVlYXgKLQlic3dhcAklZWN4Ci0J bW92emJsCS0xKCVyZGksICVyZHgpLCAlZWRpCi0JbW92emJsCS0xKCVyc2ksICVyZHgpLCAlZXNp Ci0Jb3JsCSVlZGksICVlYXgKLQlvcmwJJWVzaSwgJWVjeAotCXN1YmwJJWVjeCwgJWVheAotCXJl dAotCi0JLnAyYWxpZ24gNCwsIDgKLUwoOF90b18xNl9ieXRlcyk6Ci0JbW92cQkoJXJkaSksICVy YXgKLQltb3ZxCSglcnNpKSwgJXJjeAotCi0JYnN3YXAJJXJheAotCWJzd2FwCSVyY3gKLQotCXN1 YnEJJXJjeCwgJXJheAotCWpuZQlMKDhfdG9fMTZfYnl0ZXNfZG9uZSkKLQotCW1vdnEJLTgoJXJk aSwgJXJkeCksICVyYXgKLQltb3ZxCS04KCVyc2ksICVyZHgpLCAlcmN4Ci0KLQlic3dhcAklcmF4 Ci0JYnN3YXAJJXJjeAotCi0Jc3VicQklcmN4LCAlcmF4Ci0KLUwoOF90b18xNl9ieXRlc19kb25l KToKLQljbW92bmUJJWVkeCwgJWVheAotCXNiYmwJJWVjeCwgJWVjeAotCW9ybAklZWN4LCAlZWF4 Ci0JcmV0Ci0jIGVsc2UKLQl4b3JsCSVlYXgsICVlYXgKLQltb3ZsCSglcmRpKSwgJWVjeAotCWNt cGwJKCVyc2kpLCAlZWN4Ci0Jam5lCUwoOF90b18xNl9ieXRlc19kb25lKQotCW1vdmwJNCglcmRp KSwgJWVjeAotCWNtcGwJNCglcnNpKSwgJWVjeAotCWpuZQlMKDhfdG9fMTZfYnl0ZXNfZG9uZSkK LQltb3ZsCS00KCVyZGksICVyZHgpLCAlZWN4Ci0JY21wbAktNCglcnNpLCAlcmR4KSwgJWVjeAot CWpuZQlMKDhfdG9fMTZfYnl0ZXNfZG9uZSkKLQlyZXQKLSMgZW5kaWYKLQotCS5wMmFsaWduIDQs LCAzCi1MKHJldF96ZXJvKToKLQl4b3JsCSVlYXgsICVlYXgKLUwoemVybyk6Ci0JcmV0Ci0KLQku cDJhbGlnbiA0LCwgOAotTChmaXJzdGJ5dGUpOgotCWpiCUwocmV0X3plcm8pCi0jIGlmZGVmIFVT RV9BU19XTUVNQ01QCi0JeG9ybAklZWF4LCAlZWF4Ci0JbW92bAkoJXJkaSksICVlY3gKLQljbXBs CSglcnNpKSwgJWVjeAotCWplCUwoemVybykKLUwoOF90b18xNl9ieXRlc19kb25lKToKLQlzZXRn CSVhbAotCWxlYWwJLTEoJXJheCwgJXJheCksICVlYXgKLSMgZWxzZQotCW1vdnpibAkoJXJkaSks ICVlYXgKLQltb3Z6YmwJKCVyc2kpLCAlZWN4Ci0Jc3ViCSVlY3gsICVlYXgKLSMgZW5kaWYKLQly ZXQKLQotCS5wMmFsaWduIDQKLUwodmVjX3JldHVybl9iZWdpbl80OCk6Ci0JYWRkcQkkMTYsICVy ZGkKLQlhZGRxCSQxNiwgJXJzaQotTCh2ZWNfcmV0dXJuX2JlZ2luXzMyKToKLQlic2ZsCSVlYXgs ICVlYXgKLSMgaWZkZWYgVVNFX0FTX1dNRU1DTVAKLQltb3ZsCTMyKCVyZGksICVyYXgpLCAlZWN4 Ci0JeG9ybAklZWR4LCAlZWR4Ci0JY21wbAkzMiglcnNpLCAlcmF4KSwgJWVjeAotCXNldGcJJWRs Ci0JbGVhbAktMSglcmR4LCAlcmR4KSwgJWVheAotIyBlbHNlCi0JbW92emJsCTMyKCVyc2ksICVy YXgpLCAlZWN4Ci0JbW92emJsCTMyKCVyZGksICVyYXgpLCAlZWF4Ci0Jc3VibAklZWN4LCAlZWF4 Ci0jIGVuZGlmCi0JcmV0Ci0KLQkucDJhbGlnbiA0Ci1MKHZlY19yZXR1cm5fYmVnaW5fMTYpOgot CWFkZHEJJDE2LCAlcmRpCi0JYWRkcQkkMTYsICVyc2kKLUwodmVjX3JldHVybl9iZWdpbik6Ci0J YnNmbAklZWF4LCAlZWF4Ci0jIGlmZGVmIFVTRV9BU19XTUVNQ01QCi0JbW92bAkoJXJkaSwgJXJh eCksICVlY3gKLQl4b3JsCSVlZHgsICVlZHgKLQljbXBsCSglcnNpLCAlcmF4KSwgJWVjeAotCXNl dGcJJWRsCi0JbGVhbAktMSglcmR4LCAlcmR4KSwgJWVheAotIyBlbHNlCi0JbW92emJsCSglcnNp LCAlcmF4KSwgJWVjeAotCW1vdnpibAkoJXJkaSwgJXJheCksICVlYXgKLQlzdWJsCSVlY3gsICVl YXgKLSMgZW5kaWYKLQlyZXQKLQotCS5wMmFsaWduIDQKLUwodmVjX3JldHVybl9lbmRfMTYpOgot CXN1YmwJJDE2LCAlZWR4Ci1MKHZlY19yZXR1cm5fZW5kKToKLQlic2ZsCSVlYXgsICVlYXgKLQlh ZGRsCSVlZHgsICVlYXgKLSMgaWZkZWYgVVNFX0FTX1dNRU1DTVAKLQltb3ZsCS0xNiglcmRpLCAl cmF4KSwgJWVjeAotCXhvcmwJJWVkeCwgJWVkeAotCWNtcGwJLTE2KCVyc2ksICVyYXgpLCAlZWN4 Ci0Jc2V0ZwklZGwKLQlsZWFsCS0xKCVyZHgsICVyZHgpLCAlZWF4Ci0jIGVsc2UKLQltb3Z6YmwJ LTE2KCVyc2ksICVyYXgpLCAlZWN4Ci0JbW92emJsCS0xNiglcmRpLCAlcmF4KSwgJWVheAotCXN1 YmwJJWVjeCwgJWVheAotIyBlbmRpZgotCXJldAotCi0JLnAyYWxpZ24gNCwsIDgKLUwobW9yZV8z Ml9ieXRlcyk6Ci0JbW92ZHF1CSglcmRpKSwgJXhtbTAKLQltb3ZkcXUJKCVyc2kpLCAleG1tMQot CUNNUEVRCSV4bW0wLCAleG1tMQotCXBtb3Ztc2tiICV4bW0xLCAlZWF4Ci0JaW5jdwklYXgKLQlq bnoJTCh2ZWNfcmV0dXJuX2JlZ2luKQotCi0JbW92ZHF1CTE2KCVyZGkpLCAleG1tMAotCW1vdmRx dQkxNiglcnNpKSwgJXhtbTEKLQlDTVBFUQkleG1tMCwgJXhtbTEKLQlwbW92bXNrYiAleG1tMSwg JWVheAotCWluY3cJJWF4Ci0Jam56CUwodmVjX3JldHVybl9iZWdpbl8xNikKLQotCWNtcGwJJDY0 LCAlZWR4Ci0JamJlCUwoMzJfdG9fNjRfYnl0ZXMpCi0JbW92ZHF1CTMyKCVyZGkpLCAleG1tMAot CW1vdmRxdQkzMiglcnNpKSwgJXhtbTEKLQlDTVBFUQkleG1tMCwgJXhtbTEKLQlwbW92bXNrYiAl eG1tMSwgJWVheAotCWluY3cJJWF4Ci0Jam56CUwodmVjX3JldHVybl9iZWdpbl8zMikKLQotCS5w MmFsaWduIDQsLCA2Ci1MKDMyX3RvXzY0X2J5dGVzKToKLQltb3ZkcXUJLTMyKCVyZGksICVyZHgp LCAleG1tMAotCW1vdmRxdQktMzIoJXJzaSwgJXJkeCksICV4bW0xCi0JQ01QRVEJJXhtbTAsICV4 bW0xCi0JcG1vdm1za2IgJXhtbTEsICVlYXgKLQlpbmN3CSVheAotCWpueglMKHZlY19yZXR1cm5f ZW5kXzE2KQotCi0JbW92ZHF1CS0xNiglcmRpLCAlcmR4KSwgJXhtbTAKLQltb3ZkcXUJLTE2KCVy c2ksICVyZHgpLCAleG1tMQotCUNNUEVRCSV4bW0wLCAleG1tMQotCXBtb3Ztc2tiICV4bW0xLCAl ZWF4Ci0JaW5jdwklYXgKLQlqbnoJTCh2ZWNfcmV0dXJuX2VuZCkKLQlyZXQKLQotCS5wMmFsaWdu IDQKLUwoMTZfdG9fMzJfYnl0ZXMpOgotCW1vdmRxdQkoJXJkaSksICV4bW0wCi0JbW92ZHF1CSgl cnNpKSwgJXhtbTEKLQlDTVBFUQkleG1tMCwgJXhtbTEKLQlwbW92bXNrYiAleG1tMSwgJWVheAot CWluY3cJJWF4Ci0Jam56CUwodmVjX3JldHVybl9iZWdpbikKLQotCW1vdmRxdQktMTYoJXJkaSwg JXJkeCksICV4bW0wCi0JbW92ZHF1CS0xNiglcnNpLCAlcmR4KSwgJXhtbTEKLQlDTVBFUQkleG1t MCwgJXhtbTEKLQlwbW92bXNrYiAleG1tMSwgJWVheAotCWluY3cJJWF4Ci0Jam56CUwodmVjX3Jl dHVybl9lbmQpCi0JcmV0Ci0KLQotCS5wMmFsaWduIDQKLUwoNzlieXRlc29ybW9yZSk6Ci0JbW92 ZHF1CSglcmRpKSwgJXhtbTAKLQltb3ZkcXUJKCVyc2kpLCAleG1tMQotCUNNUEVRCSV4bW0wLCAl eG1tMQotCXBtb3Ztc2tiICV4bW0xLCAlZWF4Ci0JaW5jdwklYXgKLQlqbnoJTCh2ZWNfcmV0dXJu X2JlZ2luKQotCi0KLQltb3YJJXJzaSwgJXJjeAotCWFuZAkkLTE2LCAlcnNpCi0JYWRkCSQxNiwg JXJzaQotCXN1YgklcnNpLCAlcmN4Ci0KLQlzdWIJJXJjeCwgJXJkaQotCWFkZAklcmN4LCAlcmR4 Ci0JdGVzdAkkMHhmLCAlcmRpCi0JanoJTCgyYWxpZ25lZCkKLQotCWNtcAkkMTI4LCAlcmR4Ci0J amEJTCgxMjhieXRlc29ybW9yZSkKLQotCS5wMmFsaWduIDQsLCA2Ci1MKGxlc3MxMjhieXRlcyk6 Ci0JbW92ZHF1CSglcmRpKSwgJXhtbTEKLQlDTVBFUQkoJXJzaSksICV4bW0xCi0JcG1vdm1za2Ig JXhtbTEsICVlYXgKLQlpbmN3CSVheAotCWpueglMKHZlY19yZXR1cm5fYmVnaW4pCi0KLQltb3Zk cXUJMTYoJXJkaSksICV4bW0xCi0JQ01QRVEJMTYoJXJzaSksICV4bW0xCi0JcG1vdm1za2IgJXht bTEsICVlYXgKLQlpbmN3CSVheAotCWpueglMKHZlY19yZXR1cm5fYmVnaW5fMTYpCi0KLQltb3Zk cXUJMzIoJXJkaSksICV4bW0xCi0JQ01QRVEJMzIoJXJzaSksICV4bW0xCi0JcG1vdm1za2IgJXht bTEsICVlYXgKLQlpbmN3CSVheAotCWpueglMKHZlY19yZXR1cm5fYmVnaW5fMzIpCi0KLQltb3Zk cXUJNDgoJXJkaSksICV4bW0xCi0JQ01QRVEJNDgoJXJzaSksICV4bW0xCi0JcG1vdm1za2IgJXht bTEsICVlYXgKLQlpbmN3CSVheAotCWpueglMKHZlY19yZXR1cm5fYmVnaW5fNDgpCi0KLQljbXAJ JDk2LCAlcmR4Ci0JamIJTCgzMl90b182NF9ieXRlcykKLQotCWFkZHEJJDY0LCAlcmRpCi0JYWRk cQkkNjQsICVyc2kKLQlzdWJxCSQ2NCwgJXJkeAotCi0JLnAyYWxpZ24gNCwsIDYKLUwobGFzdF82 NF9ieXRlcyk6Ci0JbW92ZHF1CSglcmRpKSwgJXhtbTEKLQlDTVBFUQkoJXJzaSksICV4bW0xCi0J cG1vdm1za2IgJXhtbTEsICVlYXgKLQlpbmN3CSVheAotCWpueglMKHZlY19yZXR1cm5fYmVnaW4p Ci0KLQltb3ZkcXUJMTYoJXJkaSksICV4bW0xCi0JQ01QRVEJMTYoJXJzaSksICV4bW0xCi0JcG1v dm1za2IgJXhtbTEsICVlYXgKLQlpbmN3CSVheAotCWpueglMKHZlY19yZXR1cm5fYmVnaW5fMTYp Ci0KLQltb3ZkcXUJLTMyKCVyZGksICVyZHgpLCAleG1tMAotCW1vdmRxdQktMzIoJXJzaSwgJXJk eCksICV4bW0xCi0JQ01QRVEJJXhtbTAsICV4bW0xCi0JcG1vdm1za2IgJXhtbTEsICVlYXgKLQlp bmN3CSVheAotCWpueglMKHZlY19yZXR1cm5fZW5kXzE2KQotCi0JbW92ZHF1CS0xNiglcmRpLCAl cmR4KSwgJXhtbTAKLQltb3ZkcXUJLTE2KCVyc2ksICVyZHgpLCAleG1tMQotCUNNUEVRCSV4bW0w LCAleG1tMQotCXBtb3Ztc2tiICV4bW0xLCAlZWF4Ci0JaW5jdwklYXgKLQlqbnoJTCh2ZWNfcmV0 dXJuX2VuZCkKLQlyZXQKLQotCS5wMmFsaWduIDQKLUwoMTI4Ynl0ZXNvcm1vcmUpOgotCWNtcAkk MjU2LCAlcmR4Ci0JamEJTCh1bmFsaWduZWRfbG9vcCkKLUwobGVzczI1NmJ5dGVzKToKLQltb3Zk cXUJKCVyZGkpLCAleG1tMQotCUNNUEVRCSglcnNpKSwgJXhtbTEKLQlwbW92bXNrYiAleG1tMSwg JWVheAotCWluY3cJJWF4Ci0Jam56CUwodmVjX3JldHVybl9iZWdpbikKLQotCW1vdmRxdQkxNigl cmRpKSwgJXhtbTEKLQlDTVBFUQkxNiglcnNpKSwgJXhtbTEKLQlwbW92bXNrYiAleG1tMSwgJWVh eAotCWluY3cJJWF4Ci0Jam56CUwodmVjX3JldHVybl9iZWdpbl8xNikKLQotCW1vdmRxdQkzMigl cmRpKSwgJXhtbTEKLQlDTVBFUQkzMiglcnNpKSwgJXhtbTEKLQlwbW92bXNrYiAleG1tMSwgJWVh eAotCWluY3cJJWF4Ci0Jam56CUwodmVjX3JldHVybl9iZWdpbl8zMikKLQotCW1vdmRxdQk0OCgl cmRpKSwgJXhtbTEKLQlDTVBFUQk0OCglcnNpKSwgJXhtbTEKLQlwbW92bXNrYiAleG1tMSwgJWVh eAotCWluY3cJJWF4Ci0Jam56CUwodmVjX3JldHVybl9iZWdpbl80OCkKLQotCWFkZHEJJDY0LCAl cmRpCi0JYWRkcQkkNjQsICVyc2kKLQotCW1vdmRxdQkoJXJkaSksICV4bW0xCi0JQ01QRVEJKCVy c2kpLCAleG1tMQotCXBtb3Ztc2tiICV4bW0xLCAlZWF4Ci0JaW5jdwklYXgKLQlqbnoJTCh2ZWNf cmV0dXJuX2JlZ2luKQotCi0JbW92ZHF1CTE2KCVyZGkpLCAleG1tMQotCUNNUEVRCTE2KCVyc2kp LCAleG1tMQotCXBtb3Ztc2tiICV4bW0xLCAlZWF4Ci0JaW5jdwklYXgKLQlqbnoJTCh2ZWNfcmV0 dXJuX2JlZ2luXzE2KQotCi0JbW92ZHF1CTMyKCVyZGkpLCAleG1tMQotCUNNUEVRCTMyKCVyc2kp LCAleG1tMQotCXBtb3Ztc2tiICV4bW0xLCAlZWF4Ci0JaW5jdwklYXgKLQlqbnoJTCh2ZWNfcmV0 dXJuX2JlZ2luXzMyKQotCi0JbW92ZHF1CTQ4KCVyZGkpLCAleG1tMQotCUNNUEVRCTQ4KCVyc2kp LCAleG1tMQotCXBtb3Ztc2tiICV4bW0xLCAlZWF4Ci0JaW5jdwklYXgKLQlqbnoJTCh2ZWNfcmV0 dXJuX2JlZ2luXzQ4KQotCi0JYWRkcQkkLTEyOCwgJXJkeAotCXN1YnEJJC02NCwgJXJzaQotCXN1 YnEJJC02NCwgJXJkaQotCi0JY21wCSQ2NCwgJXJkeAotCWphCUwobGVzczEyOGJ5dGVzKQotCi0J Y21wCSQzMiwgJXJkeAotCWphCUwobGFzdF82NF9ieXRlcykKLQotCW1vdmRxdQktMzIoJXJkaSwg JXJkeCksICV4bW0wCi0JbW92ZHF1CS0zMiglcnNpLCAlcmR4KSwgJXhtbTEKLQlDTVBFUQkleG1t MCwgJXhtbTEKLQlwbW92bXNrYiAleG1tMSwgJWVheAotCWluY3cJJWF4Ci0Jam56CUwodmVjX3Jl dHVybl9lbmRfMTYpCi0KLQltb3ZkcXUJLTE2KCVyZGksICVyZHgpLCAleG1tMAotCW1vdmRxdQkt MTYoJXJzaSwgJXJkeCksICV4bW0xCi0JQ01QRVEJJXhtbTAsICV4bW0xCi0JcG1vdm1za2IgJXht bTEsICVlYXgKLQlpbmN3CSVheAotCWpueglMKHZlY19yZXR1cm5fZW5kKQotCXJldAotCi0JLnAy YWxpZ24gNAotTCh1bmFsaWduZWRfbG9vcCk6Ci0jIGlmZGVmIERBVEFfQ0FDSEVfU0laRV9IQUxG Ci0JbW92CSREQVRBX0NBQ0hFX1NJWkVfSEFMRiwgJVI4X0xQCi0jIGVsc2UKLQltb3YJX194ODZf ZGF0YV9jYWNoZV9zaXplX2hhbGYoJXJpcCksICVSOF9MUAotIyBlbmRpZgotCW1vdnEJJXI4LCAl cjkKLQlhZGRxCSVyOCwgJXI4Ci0JYWRkcQklcjksICVyOAotCWNtcHEJJXI4LCAlcmR4Ci0JamEJ TChMMl9MM19jYWNoZV91bmFsaWduZWQpCi0Jc3ViCSQ2NCwgJXJkeAotCS5wMmFsaWduIDQKLUwo NjRieXRlc29ybW9yZV9sb29wKToKLQltb3ZkcXUJKCVyZGkpLCAleG1tMAotCW1vdmRxdQkxNigl cmRpKSwgJXhtbTEKLQltb3ZkcXUJMzIoJXJkaSksICV4bW0yCi0JbW92ZHF1CTQ4KCVyZGkpLCAl eG1tMwotCi0JQ01QRVEJKCVyc2kpLCAleG1tMAotCUNNUEVRCTE2KCVyc2kpLCAleG1tMQotCUNN UEVRCTMyKCVyc2kpLCAleG1tMgotCUNNUEVRCTQ4KCVyc2kpLCAleG1tMwotCi0JcGFuZAkleG1t MCwgJXhtbTEKLQlwYW5kCSV4bW0yLCAleG1tMwotCXBhbmQJJXhtbTEsICV4bW0zCi0KLQlwbW92 bXNrYiAleG1tMywgJWVheAotCWluY3cJJWF4Ci0Jam56CUwoNjRieXRlc29ybW9yZV9sb29wX2Vu ZCkKLQotCWFkZAkkNjQsICVyc2kKLQlhZGQJJDY0LCAlcmRpCi0Jc3ViCSQ2NCwgJXJkeAotCWph CUwoNjRieXRlc29ybW9yZV9sb29wKQotCi0JLnAyYWxpZ24gNCwsIDYKLUwobG9vcF90YWlsKToK LQlhZGRxCSVyZHgsICVyZGkKLQltb3ZkcXUJKCVyZGkpLCAleG1tMAotCW1vdmRxdQkxNiglcmRp KSwgJXhtbTEKLQltb3ZkcXUJMzIoJXJkaSksICV4bW0yCi0JbW92ZHF1CTQ4KCVyZGkpLCAleG1t MwotCi0JYWRkcQklcmR4LCAlcnNpCi0JbW92ZHF1CSglcnNpKSwgJXhtbTQKLQltb3ZkcXUJMTYo JXJzaSksICV4bW01Ci0JbW92ZHF1CTMyKCVyc2kpLCAleG1tNgotCW1vdmRxdQk0OCglcnNpKSwg JXhtbTcKLQotCUNNUEVRCSV4bW00LCAleG1tMAotCUNNUEVRCSV4bW01LCAleG1tMQotCUNNUEVR CSV4bW02LCAleG1tMgotCUNNUEVRCSV4bW03LCAleG1tMwotCi0JcGFuZAkleG1tMCwgJXhtbTEK LQlwYW5kCSV4bW0yLCAleG1tMwotCXBhbmQJJXhtbTEsICV4bW0zCi0KLQlwbW92bXNrYiAleG1t MywgJWVheAotCWluY3cJJWF4Ci0Jam56CUwoNjRieXRlc29ybW9yZV9sb29wX2VuZCkKLQlyZXQK LQotTChMMl9MM19jYWNoZV91bmFsaWduZWQpOgotCXN1YnEJJDY0LCAlcmR4Ci0JLnAyYWxpZ24g NAotTChMMl9MM191bmFsaWduZWRfMTI4Ynl0ZXNfbG9vcCk6Ci0JcHJlZmV0Y2hudGEgMHgxYzAo JXJkaSkKLQlwcmVmZXRjaG50YSAweDFjMCglcnNpKQotCi0JbW92ZHF1CSglcmRpKSwgJXhtbTAK LQltb3ZkcXUJMTYoJXJkaSksICV4bW0xCi0JbW92ZHF1CTMyKCVyZGkpLCAleG1tMgotCW1vdmRx dQk0OCglcmRpKSwgJXhtbTMKLQotCUNNUEVRCSglcnNpKSwgJXhtbTAKLQlDTVBFUQkxNiglcnNp KSwgJXhtbTEKLQlDTVBFUQkzMiglcnNpKSwgJXhtbTIKLQlDTVBFUQk0OCglcnNpKSwgJXhtbTMK LQotCXBhbmQJJXhtbTAsICV4bW0xCi0JcGFuZAkleG1tMiwgJXhtbTMKLQlwYW5kCSV4bW0xLCAl eG1tMwotCi0JcG1vdm1za2IgJXhtbTMsICVlYXgKLQlpbmN3CSVheAotCWpueglMKDY0Ynl0ZXNv cm1vcmVfbG9vcF9lbmQpCi0KLQlhZGQJJDY0LCAlcnNpCi0JYWRkCSQ2NCwgJXJkaQotCXN1Ygkk NjQsICVyZHgKLQlqYQlMKEwyX0wzX3VuYWxpZ25lZF8xMjhieXRlc19sb29wKQotCWptcAlMKGxv b3BfdGFpbCkKLQotCi0JLyogVGhpcyBjYXNlIGlzIGZvciBtYWNoaW5lcyB3aGljaCBhcmUgc2Vu c2l0aXZlIGZvciB1bmFsaWduZWQKLQkgKiBpbnN0cnVjdGlvbnMuICAqLwotCS5wMmFsaWduIDQK LUwoMmFsaWduZWQpOgotCWNtcAkkMTI4LCAlcmR4Ci0JamEJTCgxMjhieXRlc29ybW9yZWluMmFs aWduZWQpCi1MKGxlc3MxMjhieXRlc2luMmFsaWduZWQpOgotCW1vdmRxYQkoJXJkaSksICV4bW0x Ci0JQ01QRVEJKCVyc2kpLCAleG1tMQotCXBtb3Ztc2tiICV4bW0xLCAlZWF4Ci0JaW5jdwklYXgK LQlqbnoJTCh2ZWNfcmV0dXJuX2JlZ2luKQotCi0JbW92ZHFhCTE2KCVyZGkpLCAleG1tMQotCUNN UEVRCTE2KCVyc2kpLCAleG1tMQotCXBtb3Ztc2tiICV4bW0xLCAlZWF4Ci0JaW5jdwklYXgKLQlq bnoJTCh2ZWNfcmV0dXJuX2JlZ2luXzE2KQotCi0JbW92ZHFhCTMyKCVyZGkpLCAleG1tMQotCUNN UEVRCTMyKCVyc2kpLCAleG1tMQotCXBtb3Ztc2tiICV4bW0xLCAlZWF4Ci0JaW5jdwklYXgKLQlq bnoJTCh2ZWNfcmV0dXJuX2JlZ2luXzMyKQotCi0JbW92ZHFhCTQ4KCVyZGkpLCAleG1tMQotCUNN UEVRCTQ4KCVyc2kpLCAleG1tMQotCXBtb3Ztc2tiICV4bW0xLCAlZWF4Ci0JaW5jdwklYXgKLQlq bnoJTCh2ZWNfcmV0dXJuX2JlZ2luXzQ4KQotCi0JY21wCSQ5NiwgJXJkeAotCWpiCUwoMzJfdG9f NjRfYnl0ZXMpCi0KLQlhZGRxCSQ2NCwgJXJkaQotCWFkZHEJJDY0LCAlcnNpCi0Jc3VicQkkNjQs ICVyZHgKLQotCS5wMmFsaWduIDQsLCA2Ci1MKGFsaWduZWRfbGFzdF82NF9ieXRlcyk6Ci0JbW92 ZHFhCSglcmRpKSwgJXhtbTEKLQlDTVBFUQkoJXJzaSksICV4bW0xCi0JcG1vdm1za2IgJXhtbTEs ICVlYXgKLQlpbmN3CSVheAotCWpueglMKHZlY19yZXR1cm5fYmVnaW4pCi0KLQltb3ZkcWEJMTYo JXJkaSksICV4bW0xCi0JQ01QRVEJMTYoJXJzaSksICV4bW0xCi0JcG1vdm1za2IgJXhtbTEsICVl YXgKLQlpbmN3CSVheAotCWpueglMKHZlY19yZXR1cm5fYmVnaW5fMTYpCi0KLQltb3ZkcXUJLTMy KCVyZGksICVyZHgpLCAleG1tMAotCW1vdmRxdQktMzIoJXJzaSwgJXJkeCksICV4bW0xCi0JQ01Q RVEJJXhtbTAsICV4bW0xCi0JcG1vdm1za2IgJXhtbTEsICVlYXgKLQlpbmN3CSVheAotCWpueglM KHZlY19yZXR1cm5fZW5kXzE2KQotCi0JbW92ZHF1CS0xNiglcmRpLCAlcmR4KSwgJXhtbTAKLQlt b3ZkcXUJLTE2KCVyc2ksICVyZHgpLCAleG1tMQotCUNNUEVRCSV4bW0wLCAleG1tMQotCXBtb3Zt c2tiICV4bW0xLCAlZWF4Ci0JaW5jdwklYXgKLQlqbnoJTCh2ZWNfcmV0dXJuX2VuZCkKLQlyZXQK LQotCS5wMmFsaWduIDQKLUwoMTI4Ynl0ZXNvcm1vcmVpbjJhbGlnbmVkKToKLQljbXAJJDI1Niwg JXJkeAotCWphCUwoYWxpZ25lZF9sb29wKQotTChsZXNzMjU2Ynl0ZXNpbjJhbGluZ2VkKToKLQlt b3ZkcWEJKCVyZGkpLCAleG1tMQotCUNNUEVRCSglcnNpKSwgJXhtbTEKLQlwbW92bXNrYiAleG1t MSwgJWVheAotCWluY3cJJWF4Ci0Jam56CUwodmVjX3JldHVybl9iZWdpbikKLQotCW1vdmRxYQkx NiglcmRpKSwgJXhtbTEKLQlDTVBFUQkxNiglcnNpKSwgJXhtbTEKLQlwbW92bXNrYiAleG1tMSwg JWVheAotCWluY3cJJWF4Ci0Jam56CUwodmVjX3JldHVybl9iZWdpbl8xNikKLQotCW1vdmRxYQkz MiglcmRpKSwgJXhtbTEKLQlDTVBFUQkzMiglcnNpKSwgJXhtbTEKLQlwbW92bXNrYiAleG1tMSwg JWVheAotCWluY3cJJWF4Ci0Jam56CUwodmVjX3JldHVybl9iZWdpbl8zMikKLQotCW1vdmRxYQk0 OCglcmRpKSwgJXhtbTEKLQlDTVBFUQk0OCglcnNpKSwgJXhtbTEKLQlwbW92bXNrYiAleG1tMSwg JWVheAotCWluY3cJJWF4Ci0Jam56CUwodmVjX3JldHVybl9iZWdpbl80OCkKLQotCWFkZHEJJDY0 LCAlcmRpCi0JYWRkcQkkNjQsICVyc2kKLQotCW1vdmRxYQkoJXJkaSksICV4bW0xCi0JQ01QRVEJ KCVyc2kpLCAleG1tMQotCXBtb3Ztc2tiICV4bW0xLCAlZWF4Ci0JaW5jdwklYXgKLQlqbnoJTCh2 ZWNfcmV0dXJuX2JlZ2luKQotCi0JbW92ZHFhCTE2KCVyZGkpLCAleG1tMQotCUNNUEVRCTE2KCVy c2kpLCAleG1tMQotCXBtb3Ztc2tiICV4bW0xLCAlZWF4Ci0JaW5jdwklYXgKLQlqbnoJTCh2ZWNf cmV0dXJuX2JlZ2luXzE2KQotCi0JbW92ZHFhCTMyKCVyZGkpLCAleG1tMQotCUNNUEVRCTMyKCVy c2kpLCAleG1tMQotCXBtb3Ztc2tiICV4bW0xLCAlZWF4Ci0JaW5jdwklYXgKLQlqbnoJTCh2ZWNf cmV0dXJuX2JlZ2luXzMyKQotCi0JbW92ZHFhCTQ4KCVyZGkpLCAleG1tMQotCUNNUEVRCTQ4KCVy c2kpLCAleG1tMQotCXBtb3Ztc2tiICV4bW0xLCAlZWF4Ci0JaW5jdwklYXgKLQlqbnoJTCh2ZWNf cmV0dXJuX2JlZ2luXzQ4KQotCi0JYWRkcQkkLTEyOCwgJXJkeAotCXN1YnEJJC02NCwgJXJzaQot CXN1YnEJJC02NCwgJXJkaQotCi0JY21wCSQ2NCwgJXJkeAotCWphCUwobGVzczEyOGJ5dGVzaW4y YWxpZ25lZCkKLQotCWNtcAkkMzIsICVyZHgKLQlqYQlMKGFsaWduZWRfbGFzdF82NF9ieXRlcykK LQotCW1vdmRxdQktMzIoJXJkaSwgJXJkeCksICV4bW0wCi0JbW92ZHF1CS0zMiglcnNpLCAlcmR4 KSwgJXhtbTEKLQlDTVBFUQkleG1tMCwgJXhtbTEKLQlwbW92bXNrYiAleG1tMSwgJWVheAotCWlu Y3cJJWF4Ci0Jam56CUwodmVjX3JldHVybl9lbmRfMTYpCi0KLQltb3ZkcXUJLTE2KCVyZGksICVy ZHgpLCAleG1tMAotCW1vdmRxdQktMTYoJXJzaSwgJXJkeCksICV4bW0xCi0JQ01QRVEJJXhtbTAs ICV4bW0xCi0JcG1vdm1za2IgJXhtbTEsICVlYXgKLQlpbmN3CSVheAotCWpueglMKHZlY19yZXR1 cm5fZW5kKQotCXJldAotCi0JLnAyYWxpZ24gNAotTChhbGlnbmVkX2xvb3ApOgotIyBpZmRlZiBE QVRBX0NBQ0hFX1NJWkVfSEFMRgotCW1vdgkkREFUQV9DQUNIRV9TSVpFX0hBTEYsICVSOF9MUAot IyBlbHNlCi0JbW92CV9feDg2X2RhdGFfY2FjaGVfc2l6ZV9oYWxmKCVyaXApLCAlUjhfTFAKLSMg ZW5kaWYKLQltb3ZxCSVyOCwgJXI5Ci0JYWRkcQklcjgsICVyOAotCWFkZHEJJXI5LCAlcjgKLQlj bXBxCSVyOCwgJXJkeAotCWphCUwoTDJfTDNfY2FjaGVfYWxpZ25lZCkKLQotCXN1YgkkNjQsICVy ZHgKLQkucDJhbGlnbiA0Ci1MKDY0Ynl0ZXNvcm1vcmVfbG9vcGluMmFsaWduZWQpOgotCW1vdmRx YQkoJXJkaSksICV4bW0wCi0JbW92ZHFhCTE2KCVyZGkpLCAleG1tMQotCW1vdmRxYQkzMiglcmRp KSwgJXhtbTIKLQltb3ZkcWEJNDgoJXJkaSksICV4bW0zCi0KLQlDTVBFUQkoJXJzaSksICV4bW0w Ci0JQ01QRVEJMTYoJXJzaSksICV4bW0xCi0JQ01QRVEJMzIoJXJzaSksICV4bW0yCi0JQ01QRVEJ NDgoJXJzaSksICV4bW0zCi0KLQlwYW5kCSV4bW0wLCAleG1tMQotCXBhbmQJJXhtbTIsICV4bW0z Ci0JcGFuZAkleG1tMSwgJXhtbTMKLQotCXBtb3Ztc2tiICV4bW0zLCAlZWF4Ci0JaW5jdwklYXgK LQlqbnoJTCg2NGJ5dGVzb3Jtb3JlX2xvb3BfZW5kKQotCWFkZAkkNjQsICVyc2kKLQlhZGQJJDY0 LCAlcmRpCi0Jc3ViCSQ2NCwgJXJkeAotCWphCUwoNjRieXRlc29ybW9yZV9sb29waW4yYWxpZ25l ZCkKLQlqbXAJTChsb29wX3RhaWwpCi0KLUwoTDJfTDNfY2FjaGVfYWxpZ25lZCk6Ci0Jc3VicQkk NjQsICVyZHgKLQkucDJhbGlnbiA0Ci1MKEwyX0wzX2FsaWduZWRfMTI4Ynl0ZXNfbG9vcCk6Ci0J cHJlZmV0Y2hudGEgMHgxYzAoJXJkaSkKLQlwcmVmZXRjaG50YSAweDFjMCglcnNpKQotCW1vdmRx YQkoJXJkaSksICV4bW0wCi0JbW92ZHFhCTE2KCVyZGkpLCAleG1tMQotCW1vdmRxYQkzMiglcmRp KSwgJXhtbTIKLQltb3ZkcWEJNDgoJXJkaSksICV4bW0zCi0KLQlDTVBFUQkoJXJzaSksICV4bW0w Ci0JQ01QRVEJMTYoJXJzaSksICV4bW0xCi0JQ01QRVEJMzIoJXJzaSksICV4bW0yCi0JQ01QRVEJ NDgoJXJzaSksICV4bW0zCi0KLQlwYW5kCSV4bW0wLCAleG1tMQotCXBhbmQJJXhtbTIsICV4bW0z Ci0JcGFuZAkleG1tMSwgJXhtbTMKLQotCXBtb3Ztc2tiICV4bW0zLCAlZWF4Ci0JaW5jdwklYXgK LQlqbnoJTCg2NGJ5dGVzb3Jtb3JlX2xvb3BfZW5kKQotCi0JYWRkcQkkNjQsICVyc2kKLQlhZGRx CSQ2NCwgJXJkaQotCXN1YnEJJDY0LCAlcmR4Ci0JamEJTChMMl9MM19hbGlnbmVkXzEyOGJ5dGVz X2xvb3ApCi0Jam1wCUwobG9vcF90YWlsKQotCi0JLnAyYWxpZ24gNAotTCg2NGJ5dGVzb3Jtb3Jl X2xvb3BfZW5kKToKLQlwbW92bXNrYiAleG1tMCwgJWVjeAotCWluY3cJJWN4Ci0Jam56CUwobG9v cF9lbmRfcmV0KQotCi0JcG1vdm1za2IgJXhtbTEsICVlY3gKLQlub3R3CSVjeAotCXNhbGwJJDE2 LCAlZWN4Ci0Jam56CUwobG9vcF9lbmRfcmV0KQotCi0JcG1vdm1za2IgJXhtbTIsICVlY3gKLQlu b3R3CSVjeAotCXNobHEJJDMyLCAlcmN4Ci0Jam56CUwobG9vcF9lbmRfcmV0KQotCi0JYWRkcQkk NDgsICVyZGkKLQlhZGRxCSQ0OCwgJXJzaQotCW1vdnEJJXJheCwgJXJjeAotCi0JLnAyYWxpZ24g NCwsIDYKLUwobG9vcF9lbmRfcmV0KToKLQlic2ZxCSVyY3gsICVyY3gKLSMgaWZkZWYgVVNFX0FT X1dNRU1DTVAKLQltb3ZsCSglcmRpLCAlcmN4KSwgJWVheAotCXhvcmwJJWVkeCwgJWVkeAotCWNt cGwJKCVyc2ksICVyY3gpLCAlZWF4Ci0Jc2V0ZwklZGwKLQlsZWFsCS0xKCVyZHgsICVyZHgpLCAl ZWF4Ci0jIGVsc2UKLQltb3Z6YmwJKCVyZGksICVyY3gpLCAlZWF4Ci0JbW92emJsCSglcnNpLCAl cmN4KSwgJWVjeAotCXN1YmwJJWVjeCwgJWVheAotIyBlbmRpZgotCXJldAotRU5EIChNRU1DTVAp Ci0jZW5kaWYKLS0gCjIuMzUuMQoK --00000000000051e2f205ded608ac--