From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6A9B52E62B; Fri, 13 Dec 2024 23:22:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734132176; cv=none; b=jk0hnmWcOqO3dIqv6vsPIFCEtrkAImGv8vg9xehPwoMZlzdvjm2ijbiB4Z76Krf8CSFIG2DI+4bVYhhgnEaTo+75fGMQ/o7nK0XndN6/kHO919LN8W/OTy8jR8yZj3ivG/4AVBuVctTulg+fflXSXuMeUIpb6btb8Du0DRsHA6Q= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734132176; c=relaxed/simple; bh=VGdzHQIi3fVgtagYbzv6Ua/Y+Cdp0udMv+eqeWy9bXk=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=As1hBNfEr4Qa24v4N3GbOFDsAzQ8oDQmA6XQvGco/utYwDIMPPgLT1/AEG9T6Hz+6CLQ7XzkeqanvB4OsZ/DAE3ud7fSoxuGEed9GwWyOh+pHnlwKnh6qnNI+P+V2o0jd7ZuMkry6P12QNaXomLJvNQKsCL7iRTCr1DOOyFgr24= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jubRRjX+; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jubRRjX+" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 353EEC4CED0; Fri, 13 Dec 2024 23:22:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1734132176; bh=VGdzHQIi3fVgtagYbzv6Ua/Y+Cdp0udMv+eqeWy9bXk=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=jubRRjX+AKkzfqbkZzXRkcxswbL+z2aT8lM9vqwYGJhS8OBivPuLZfbQtqWHoMw5+ bXjSKS7gASj0tV738dhDH8ZK7uZC0/eRB/CA6Qpw5bvg5K1bQWc7ARtFPcPTO2rYHU HA4+OKVlxjHCWOCAvSQn7SKnpXDb5qHg8j2JIA6A0Fq0q+vZG7gRjIjzqcjeaedXQX zF/I+30UgrdwBOtPv4MlDhB5LOSqbfcauvM53kSSZi6IAhIxtruy9q/jQTNa/XLB4g iIKtgUyGZsVg9KQ68LZhtqaCkSnkBIqHn5Du5hJ5eYG9d/NfswVAJa0TPE8F7Bnflc i7aSiujMxgj0A== Date: Fri, 13 Dec 2024 15:22:53 -0800 From: Namhyung Kim To: Charlie Jenkins Cc: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Paul Walmsley , Palmer Dabbelt , =?utf-8?Q?Micka=C3=ABl_Sala=C3=BCn?= , =?utf-8?Q?G=C3=BCnther?= Noack , Christian Brauner , Guo Ren , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , Jonathan Corbet , =?utf-8?B?QmrDtnJuIFTDtnBlbA==?= , Arnd Bergmann , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-riscv@lists.infradead.org, linux-security-module@vger.kernel.org, bpf@vger.kernel.org, linux-csky@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org Subject: Re: [PATCH v2 01/16] perf tools: Create generic syscall table support Message-ID: References: <20241212-perf_syscalltbl-v2-0-f8ca984ffe40@rivosinc.com> <20241212-perf_syscalltbl-v2-1-f8ca984ffe40@rivosinc.com> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20241212-perf_syscalltbl-v2-1-f8ca984ffe40@rivosinc.com> Hello, On Thu, Dec 12, 2024 at 04:32:51PM -0800, Charlie Jenkins wrote: > Currently each architecture in perf independently generates syscall > headers. Adapt the work that has gone into unifying syscall header > implementations in the kernel to work with perf tools. Introduce this > framework with riscv at first. riscv previously relied on libaudit, but > with this change, perf tools for riscv no longer needs this external > dependency. Nice work! > > Signed-off-by: Charlie Jenkins > --- > tools/perf/Makefile.config | 11 +- > tools/perf/Makefile.perf | 4 + > tools/perf/arch/riscv/Makefile | 22 -- > tools/perf/arch/riscv/entry/syscalls/Kbuild | 2 + > .../arch/riscv/entry/syscalls/Makefile.syscalls | 4 + > tools/perf/arch/riscv/entry/syscalls/mksyscalltbl | 47 --- > tools/perf/arch/riscv/include/syscall_table.h | 8 + > tools/perf/check-headers.sh | 1 + > tools/perf/scripts/Makefile.syscalls | 60 +++ > tools/perf/scripts/syscalltbl.sh | 86 +++++ > tools/perf/util/syscalltbl.c | 8 +- > tools/scripts/syscall.tbl | 409 +++++++++++++++++++++ > 12 files changed, 585 insertions(+), 77 deletions(-) > > diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config > index 2916d59c88cd08b299202a48ddb42fa32aac04a6..a72f25162714f0117a88d94474da336814d4f030 100644 > --- a/tools/perf/Makefile.config > +++ b/tools/perf/Makefile.config > @@ -35,6 +35,13 @@ ifneq ($(NO_SYSCALL_TABLE),1) > NO_SYSCALL_TABLE := 0 > endif > > + # architectures that use the generic syscall table scripts > + ifeq ($(SRCARCH),riscv) > + NO_SYSCALL_TABLE := 0 > + CFLAGS += -DGENERIC_SYSCALL_TABLE > + CFLAGS += -I$(OUTPUT)/tools/perf/arch/$(SRCARCH)/include/generated > + endif > + > ifneq ($(NO_SYSCALL_TABLE),1) > CFLAGS += -DHAVE_SYSCALL_TABLE_SUPPORT > endif > @@ -83,10 +90,6 @@ ifeq ($(ARCH),mips) > LIBUNWIND_LIBS = -lunwind -lunwind-mips > endif > > -ifeq ($(ARCH),riscv) > - CFLAGS += -I$(OUTPUT)arch/riscv/include/generated > -endif > - > # So far there's only x86 and arm libdw unwind support merged in perf. > # Disable it on all other architectures in case libdw unwind > # support is detected in system. Add supported architectures > diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf > index d74241a151313bd09101aabb5d765a5a0a6efc84..f5278ed9f778f928436693a14e016c5c3c5171c1 100644 > --- a/tools/perf/Makefile.perf > +++ b/tools/perf/Makefile.perf > @@ -310,6 +310,10 @@ ifeq ($(filter feature-dump,$(MAKECMDGOALS)),feature-dump) > FEATURE_TESTS := all > endif > endif > +# architectures that use the generic syscall table > +ifeq ($(SRCARCH),riscv) > +include $(srctree)/tools/perf/scripts/Makefile.syscalls > +endif > include Makefile.config > endif > > diff --git a/tools/perf/arch/riscv/Makefile b/tools/perf/arch/riscv/Makefile > index 18ad078000e2bba595f92efc5d97a63fdb83ef45..087e099fb453a9236db34878077a51f711881ce0 100644 > --- a/tools/perf/arch/riscv/Makefile > +++ b/tools/perf/arch/riscv/Makefile > @@ -1,25 +1,3 @@ > # SPDX-License-Identifier: GPL-2.0 > PERF_HAVE_JITDUMP := 1 > HAVE_KVM_STAT_SUPPORT := 1 > - > -# > -# Syscall table generation for perf > -# > - > -out := $(OUTPUT)arch/riscv/include/generated/asm > -header := $(out)/syscalls.c > -incpath := $(srctree)/tools > -sysdef := $(srctree)/tools/arch/riscv/include/uapi/asm/unistd.h > -sysprf := $(srctree)/tools/perf/arch/riscv/entry/syscalls/ > -systbl := $(sysprf)/mksyscalltbl > - > -# Create output directory if not already present > -$(shell [ -d '$(out)' ] || mkdir -p '$(out)') > - > -$(header): $(sysdef) $(systbl) > - $(Q)$(SHELL) '$(systbl)' '$(CC)' '$(HOSTCC)' $(incpath) $(sysdef) > $@ > - > -clean:: > - $(call QUIET_CLEAN, riscv) $(RM) $(header) > - > -archheaders: $(header) > diff --git a/tools/perf/arch/riscv/entry/syscalls/Kbuild b/tools/perf/arch/riscv/entry/syscalls/Kbuild > new file mode 100644 > index 0000000000000000000000000000000000000000..9a41e3572c3afd4f202321fd9e492714540e8fd3 > --- /dev/null > +++ b/tools/perf/arch/riscv/entry/syscalls/Kbuild > @@ -0,0 +1,2 @@ > +# SPDX-License-Identifier: GPL-2.0 > +syscall-y += syscalls_64.h > diff --git a/tools/perf/arch/riscv/entry/syscalls/Makefile.syscalls b/tools/perf/arch/riscv/entry/syscalls/Makefile.syscalls > new file mode 100644 > index 0000000000000000000000000000000000000000..9668fd1faf60e828ed2786c2ee84739ac1f153fc > --- /dev/null > +++ b/tools/perf/arch/riscv/entry/syscalls/Makefile.syscalls > @@ -0,0 +1,4 @@ > +# SPDX-License-Identifier: GPL-2.0 > + > +syscall_abis_32 += riscv memfd_secret > +syscall_abis_64 += riscv rlimit memfd_secret > diff --git a/tools/perf/arch/riscv/entry/syscalls/mksyscalltbl b/tools/perf/arch/riscv/entry/syscalls/mksyscalltbl > deleted file mode 100755 > index c59f5e852b97712a9a879b89e6ef6999ed4b6cd7..0000000000000000000000000000000000000000 > --- a/tools/perf/arch/riscv/entry/syscalls/mksyscalltbl > +++ /dev/null > @@ -1,47 +0,0 @@ > -#!/bin/sh > -# SPDX-License-Identifier: GPL-2.0 > -# > -# Generate system call table for perf. Derived from > -# powerpc script. > -# > -# Copyright IBM Corp. 2017 > -# Author(s): Hendrik Brueckner > -# Changed by: Ravi Bangoria > -# Changed by: Kim Phillips > -# Changed by: Björn Töpel > - > -gcc=$1 > -hostcc=$2 > -incpath=$3 > -input=$4 > - > -if ! test -r $input; then > - echo "Could not read input file" >&2 > - exit 1 > -fi > - > -create_sc_table() > -{ > - local sc nr max_nr > - > - while read sc nr; do > - printf "%s\n" " [$nr] = \"$sc\"," > - max_nr=$nr > - done > - > - echo "#define SYSCALLTBL_RISCV_MAX_ID $max_nr" > -} > - > -create_table() > -{ > - echo "#include \"$input\"" > - echo "static const char *const syscalltbl_riscv[] = {" > - create_sc_table > - echo "};" > -} > - > -$gcc -E -dM -x c -I $incpath/include/uapi $input \ > - |awk '$2 ~ "__NR" && $3 !~ "__NR3264_" { > - sub("^#define __NR(3264)?_", ""); > - print | "sort -k2 -n"}' \ > - |create_table > diff --git a/tools/perf/arch/riscv/include/syscall_table.h b/tools/perf/arch/riscv/include/syscall_table.h > new file mode 100644 > index 0000000000000000000000000000000000000000..7ff51b783000d727ec48be960730b81ecdb05575 > --- /dev/null > +++ b/tools/perf/arch/riscv/include/syscall_table.h > @@ -0,0 +1,8 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +#include > + > +#if __BITS_PER_LONG == 64 > +#include > +#else > +#include > +#endif > diff --git a/tools/perf/check-headers.sh b/tools/perf/check-headers.sh > index a05c1c105c51bf1bd18a59195220894598eb7461..692f48db810ccbef229e240db29261f0c60db632 100755 > --- a/tools/perf/check-headers.sh > +++ b/tools/perf/check-headers.sh > @@ -71,6 +71,7 @@ FILES=( > "include/uapi/asm-generic/ioctls.h" > "include/uapi/asm-generic/mman-common.h" > "include/uapi/asm-generic/unistd.h" > + "scripts/syscall.tbl" > ) > > declare -a SYNC_CHECK_FILES > diff --git a/tools/perf/scripts/Makefile.syscalls b/tools/perf/scripts/Makefile.syscalls > new file mode 100644 > index 0000000000000000000000000000000000000000..e2b0c4b513d5c42c8e9ac51a9ea774c34a1311b7 > --- /dev/null > +++ b/tools/perf/scripts/Makefile.syscalls > @@ -0,0 +1,60 @@ > +# SPDX-License-Identifier: GPL-2.0 > +# This Makefile generates tools/perf/arch/$(SRCARCH)/include/generated/asm from > +# the generic syscall table if that is supported by the architecture, otherwise > +# from the architecture's defined syscall table. > + > +PHONY := all > +all: > + > +obj := $(OUTPUT)/tools/perf/arch/$(SRCARCH)/include/generated/asm > + > +syscall_abis_32 += common,32 > +syscall_abis_64 += common,64 Couldn't it be := instead of += ? > +syscalltbl := $(srctree)/tools/scripts/syscall.tbl > + > +# let architectures override $(syscall_abis_%) and $(syscalltbl) > +-include $(srctree)/tools/perf/arch/$(SRCARCH)/entry/syscalls/Makefile.syscalls > +include $(srctree)/scripts/Kbuild.include > +-include $(srctree)/tools/perf/arch/$(SRCARCH)/entry/syscalls/Kbuild > + > +systbl := $(srctree)/tools/perf/scripts/syscalltbl.sh > + > +syscall-y := $(addprefix $(obj)/, $(syscall-y)) > + > +# Remove stale wrappers when the corresponding files are removed from generic-y > +old-headers := $(wildcard $(obj)/*.c) > +unwanted := $(filter-out $(syscall-y),$(old-headers)) Can you elaborate? What's the stable wrappers? I think syscall-y and old-headers have .h files but the wildcard above is called for .c files? Thanks, Namhyung > + > +quiet_cmd_remove = REMOVE $(unwanted) > + cmd_remove = rm -f $(unwanted) > + > +quiet_cmd_systbl = SYSTBL $@ > + cmd_systbl = $(CONFIG_SHELL) $(systbl) \ > + $(if $(systbl-args-$*),$(systbl-args-$*),$(systbl-args)) \ > + --abis $(subst $(space),$(comma),$(strip $(syscall_abis_$*))) \ > + $< $@ > + > +all: $(syscall-y) > + $(if $(unwanted),$(call cmd,remove)) > + @: > + > +$(obj)/syscalls_%.h: $(syscalltbl) $(systbl) FORCE > + $(call if_changed,systbl) > + > +targets := $(syscall-y) > + > +# Create output directory. Skip it if at least one old header exists > +# since we know the output directory already exists. > +ifeq ($(old-headers),) > +$(shell mkdir -p $(obj)) > +endif > + > +PHONY += FORCE > + > +FORCE: > + > +existing-targets := $(wildcard $(sort $(targets))) > + > +-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd) > + > +.PHONY: $(PHONY) 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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id 5A979E7717F for ; Fri, 13 Dec 2024 23:24:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=Nd17vHuTdi60X7sVCzaf4sd3jRIgr1jsh6KjQsYdRqw=; b=fsYhU2QT5hwCPK U5EtzT5oR5Nuj68QbYoAdAlGMgoPb5hXJlLnY6XiqWE2vqekj0wv7H/p8Uk7mnBErrjx9GRVn3dnV PoYQpZSmvcqRM8XXRi93Z5Me8dvuXJISemJTJrbeNagKl6imOCAg0UxuYqlq5kzefqKX+P0ZUB2a8 SaapixZz915SxFQZzuAWxTz7ZhNnsH6+PVX2LathChN9pWAg8utherE+kWFv/h3J1z+3u7rpzjhgD tbIYB9k/jzatAIubA7zbtp9eWDZxUMUktVQZZKbts3KPZA/fPbRHItZrMwi4bu2EPC8h5gD5A6onu CPXdZBL+RIR1nJkjmT9g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tMF0w-00000005H8a-1r5L; Fri, 13 Dec 2024 23:24:06 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tMEzq-00000005Gxc-0c67; Fri, 13 Dec 2024 23:22:59 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id C14245C4C04; Fri, 13 Dec 2024 23:22:14 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 353EEC4CED0; Fri, 13 Dec 2024 23:22:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1734132176; bh=VGdzHQIi3fVgtagYbzv6Ua/Y+Cdp0udMv+eqeWy9bXk=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=jubRRjX+AKkzfqbkZzXRkcxswbL+z2aT8lM9vqwYGJhS8OBivPuLZfbQtqWHoMw5+ bXjSKS7gASj0tV738dhDH8ZK7uZC0/eRB/CA6Qpw5bvg5K1bQWc7ARtFPcPTO2rYHU HA4+OKVlxjHCWOCAvSQn7SKnpXDb5qHg8j2JIA6A0Fq0q+vZG7gRjIjzqcjeaedXQX zF/I+30UgrdwBOtPv4MlDhB5LOSqbfcauvM53kSSZi6IAhIxtruy9q/jQTNa/XLB4g iIKtgUyGZsVg9KQ68LZhtqaCkSnkBIqHn5Du5hJ5eYG9d/NfswVAJa0TPE8F7Bnflc i7aSiujMxgj0A== Date: Fri, 13 Dec 2024 15:22:53 -0800 From: Namhyung Kim To: Charlie Jenkins Cc: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Paul Walmsley , Palmer Dabbelt , =?utf-8?Q?Micka=C3=ABl_Sala=C3=BCn?= , =?utf-8?Q?G=C3=BCnther?= Noack , Christian Brauner , Guo Ren , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , Jonathan Corbet , =?utf-8?B?QmrDtnJuIFTDtnBlbA==?= , Arnd Bergmann , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-riscv@lists.infradead.org, linux-security-module@vger.kernel.org, bpf@vger.kernel.org, linux-csky@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org Subject: Re: [PATCH v2 01/16] perf tools: Create generic syscall table support Message-ID: References: <20241212-perf_syscalltbl-v2-0-f8ca984ffe40@rivosinc.com> <20241212-perf_syscalltbl-v2-1-f8ca984ffe40@rivosinc.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20241212-perf_syscalltbl-v2-1-f8ca984ffe40@rivosinc.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20241213_152258_264502_FF553022 X-CRM114-Status: GOOD ( 28.61 ) 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 SGVsbG8sCgpPbiBUaHUsIERlYyAxMiwgMjAyNCBhdCAwNDozMjo1MVBNIC0wODAwLCBDaGFybGll IEplbmtpbnMgd3JvdGU6Cj4gQ3VycmVudGx5IGVhY2ggYXJjaGl0ZWN0dXJlIGluIHBlcmYgaW5k ZXBlbmRlbnRseSBnZW5lcmF0ZXMgc3lzY2FsbAo+IGhlYWRlcnMuIEFkYXB0IHRoZSB3b3JrIHRo YXQgaGFzIGdvbmUgaW50byB1bmlmeWluZyBzeXNjYWxsIGhlYWRlcgo+IGltcGxlbWVudGF0aW9u cyBpbiB0aGUga2VybmVsIHRvIHdvcmsgd2l0aCBwZXJmIHRvb2xzLiBJbnRyb2R1Y2UgdGhpcwo+ IGZyYW1ld29yayB3aXRoIHJpc2N2IGF0IGZpcnN0LiByaXNjdiBwcmV2aW91c2x5IHJlbGllZCBv biBsaWJhdWRpdCwgYnV0Cj4gd2l0aCB0aGlzIGNoYW5nZSwgcGVyZiB0b29scyBmb3IgcmlzY3Yg bm8gbG9uZ2VyIG5lZWRzIHRoaXMgZXh0ZXJuYWwKPiBkZXBlbmRlbmN5LgoKTmljZSB3b3JrIQoK PiAKPiBTaWduZWQtb2ZmLWJ5OiBDaGFybGllIEplbmtpbnMgPGNoYXJsaWVAcml2b3NpbmMuY29t Pgo+IC0tLQo+ICB0b29scy9wZXJmL01ha2VmaWxlLmNvbmZpZyAgICAgICAgICAgICAgICAgICAg ICAgICB8ICAxMSArLQo+ICB0b29scy9wZXJmL01ha2VmaWxlLnBlcmYgICAgICAgICAgICAgICAg ICAgICAgICAgICB8ICAgNCArCj4gIHRvb2xzL3BlcmYvYXJjaC9yaXNjdi9NYWtlZmlsZSAgICAg ICAgICAgICAgICAgICAgIHwgIDIyIC0tCj4gIHRvb2xzL3BlcmYvYXJjaC9yaXNjdi9lbnRyeS9z eXNjYWxscy9LYnVpbGQgICAgICAgIHwgICAyICsKPiAgLi4uL2FyY2gvcmlzY3YvZW50cnkvc3lz Y2FsbHMvTWFrZWZpbGUuc3lzY2FsbHMgICAgfCAgIDQgKwo+ICB0b29scy9wZXJmL2FyY2gvcmlz Y3YvZW50cnkvc3lzY2FsbHMvbWtzeXNjYWxsdGJsICB8ICA0NyAtLS0KPiAgdG9vbHMvcGVyZi9h cmNoL3Jpc2N2L2luY2x1ZGUvc3lzY2FsbF90YWJsZS5oICAgICAgfCAgIDggKwo+ICB0b29scy9w ZXJmL2NoZWNrLWhlYWRlcnMuc2ggICAgICAgICAgICAgICAgICAgICAgICB8ICAgMSArCj4gIHRv b2xzL3BlcmYvc2NyaXB0cy9NYWtlZmlsZS5zeXNjYWxscyAgICAgICAgICAgICAgIHwgIDYwICsr Kwo+ICB0b29scy9wZXJmL3NjcmlwdHMvc3lzY2FsbHRibC5zaCAgICAgICAgICAgICAgICAgICB8 ICA4NiArKysrKwo+ICB0b29scy9wZXJmL3V0aWwvc3lzY2FsbHRibC5jICAgICAgICAgICAgICAg ICAgICAgICB8ICAgOCArLQo+ICB0b29scy9zY3JpcHRzL3N5c2NhbGwudGJsICAgICAgICAgICAg ICAgICAgICAgICAgICB8IDQwOSArKysrKysrKysrKysrKysrKysrKysKPiAgMTIgZmlsZXMgY2hh bmdlZCwgNTg1IGluc2VydGlvbnMoKyksIDc3IGRlbGV0aW9ucygtKQo+IAo+IGRpZmYgLS1naXQg YS90b29scy9wZXJmL01ha2VmaWxlLmNvbmZpZyBiL3Rvb2xzL3BlcmYvTWFrZWZpbGUuY29uZmln Cj4gaW5kZXggMjkxNmQ1OWM4OGNkMDhiMjk5MjAyYTQ4ZGRiNDJmYTMyYWFjMDRhNi4uYTcyZjI1 MTYyNzE0ZjAxMTdhODhkOTQ0NzRkYTMzNjgxNGQ0ZjAzMCAxMDA2NDQKPiAtLS0gYS90b29scy9w ZXJmL01ha2VmaWxlLmNvbmZpZwo+ICsrKyBiL3Rvb2xzL3BlcmYvTWFrZWZpbGUuY29uZmlnCj4g QEAgLTM1LDYgKzM1LDEzIEBAIGlmbmVxICgkKE5PX1NZU0NBTExfVEFCTEUpLDEpCj4gICAgICBO T19TWVNDQUxMX1RBQkxFIDo9IDAKPiAgICBlbmRpZgo+ICAKPiArICAjIGFyY2hpdGVjdHVyZXMg dGhhdCB1c2UgdGhlIGdlbmVyaWMgc3lzY2FsbCB0YWJsZSBzY3JpcHRzCj4gKyAgaWZlcSAoJChT UkNBUkNIKSxyaXNjdikKPiArICAgIE5PX1NZU0NBTExfVEFCTEUgOj0gMAo+ICsgICAgQ0ZMQUdT ICs9IC1ER0VORVJJQ19TWVNDQUxMX1RBQkxFCj4gKyAgICBDRkxBR1MgKz0gLUkkKE9VVFBVVCkv dG9vbHMvcGVyZi9hcmNoLyQoU1JDQVJDSCkvaW5jbHVkZS9nZW5lcmF0ZWQKPiArICBlbmRpZgo+ ICsKPiAgICBpZm5lcSAoJChOT19TWVNDQUxMX1RBQkxFKSwxKQo+ICAgICAgQ0ZMQUdTICs9IC1E SEFWRV9TWVNDQUxMX1RBQkxFX1NVUFBPUlQKPiAgICBlbmRpZgo+IEBAIC04MywxMCArOTAsNiBA QCBpZmVxICgkKEFSQ0gpLG1pcHMpCj4gICAgTElCVU5XSU5EX0xJQlMgPSAtbHVud2luZCAtbHVu d2luZC1taXBzCj4gIGVuZGlmCj4gIAo+IC1pZmVxICgkKEFSQ0gpLHJpc2N2KQo+IC0gIENGTEFH UyArPSAtSSQoT1VUUFVUKWFyY2gvcmlzY3YvaW5jbHVkZS9nZW5lcmF0ZWQKPiAtZW5kaWYKPiAt Cj4gICMgU28gZmFyIHRoZXJlJ3Mgb25seSB4ODYgYW5kIGFybSBsaWJkdyB1bndpbmQgc3VwcG9y dCBtZXJnZWQgaW4gcGVyZi4KPiAgIyBEaXNhYmxlIGl0IG9uIGFsbCBvdGhlciBhcmNoaXRlY3R1 cmVzIGluIGNhc2UgbGliZHcgdW53aW5kCj4gICMgc3VwcG9ydCBpcyBkZXRlY3RlZCBpbiBzeXN0 ZW0uIEFkZCBzdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlcwo+IGRpZmYgLS1naXQgYS90b29scy9wZXJm L01ha2VmaWxlLnBlcmYgYi90b29scy9wZXJmL01ha2VmaWxlLnBlcmYKPiBpbmRleCBkNzQyNDFh MTUxMzEzYmQwOTEwMWFhYmI1ZDc2NWE1YTBhNmVmYzg0Li5mNTI3OGVkOWY3NzhmOTI4NDM2Njkz YTE0ZTAxNmM1YzNjNTE3MWMxIDEwMDY0NAo+IC0tLSBhL3Rvb2xzL3BlcmYvTWFrZWZpbGUucGVy Zgo+ICsrKyBiL3Rvb2xzL3BlcmYvTWFrZWZpbGUucGVyZgo+IEBAIC0zMTAsNiArMzEwLDEwIEBA IGlmZXEgKCQoZmlsdGVyIGZlYXR1cmUtZHVtcCwkKE1BS0VDTURHT0FMUykpLGZlYXR1cmUtZHVt cCkKPiAgRkVBVFVSRV9URVNUUyA6PSBhbGwKPiAgZW5kaWYKPiAgZW5kaWYKPiArIyBhcmNoaXRl Y3R1cmVzIHRoYXQgdXNlIHRoZSBnZW5lcmljIHN5c2NhbGwgdGFibGUKPiAraWZlcSAoJChTUkNB UkNIKSxyaXNjdikKPiAraW5jbHVkZSAkKHNyY3RyZWUpL3Rvb2xzL3BlcmYvc2NyaXB0cy9NYWtl ZmlsZS5zeXNjYWxscwo+ICtlbmRpZgo+ICBpbmNsdWRlIE1ha2VmaWxlLmNvbmZpZwo+ICBlbmRp Zgo+ICAKPiBkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3Jpc2N2L01ha2VmaWxlIGIvdG9v bHMvcGVyZi9hcmNoL3Jpc2N2L01ha2VmaWxlCj4gaW5kZXggMThhZDA3ODAwMGUyYmJhNTk1Zjky ZWZjNWQ5N2E2M2ZkYjgzZWY0NS4uMDg3ZTA5OWZiNDUzYTkyMzZkYjM0ODc4MDc3YTUxZjcxMTg4 MWNlMCAxMDA2NDQKPiAtLS0gYS90b29scy9wZXJmL2FyY2gvcmlzY3YvTWFrZWZpbGUKPiArKysg Yi90b29scy9wZXJmL2FyY2gvcmlzY3YvTWFrZWZpbGUKPiBAQCAtMSwyNSArMSwzIEBACj4gICMg U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPiAgUEVSRl9IQVZFX0pJVERVTVAgOj0g MQo+ICBIQVZFX0tWTV9TVEFUX1NVUFBPUlQgOj0gMQo+IC0KPiAtIwo+IC0jIFN5c2NhbGwgdGFi bGUgZ2VuZXJhdGlvbiBmb3IgcGVyZgo+IC0jCj4gLQo+IC1vdXQgICAgOj0gJChPVVRQVVQpYXJj aC9yaXNjdi9pbmNsdWRlL2dlbmVyYXRlZC9hc20KPiAtaGVhZGVyIDo9ICQob3V0KS9zeXNjYWxs cy5jCj4gLWluY3BhdGggOj0gJChzcmN0cmVlKS90b29scwo+IC1zeXNkZWYgOj0gJChzcmN0cmVl KS90b29scy9hcmNoL3Jpc2N2L2luY2x1ZGUvdWFwaS9hc20vdW5pc3RkLmgKPiAtc3lzcHJmIDo9 ICQoc3JjdHJlZSkvdG9vbHMvcGVyZi9hcmNoL3Jpc2N2L2VudHJ5L3N5c2NhbGxzLwo+IC1zeXN0 YmwgOj0gJChzeXNwcmYpL21rc3lzY2FsbHRibAo+IC0KPiAtIyBDcmVhdGUgb3V0cHV0IGRpcmVj dG9yeSBpZiBub3QgYWxyZWFkeSBwcmVzZW50Cj4gLSQoc2hlbGwgWyAtZCAnJChvdXQpJyBdIHx8 IG1rZGlyIC1wICckKG91dCknKQo+IC0KPiAtJChoZWFkZXIpOiAkKHN5c2RlZikgJChzeXN0Ymwp Cj4gLQkkKFEpJChTSEVMTCkgJyQoc3lzdGJsKScgJyQoQ0MpJyAnJChIT1NUQ0MpJyAkKGluY3Bh dGgpICQoc3lzZGVmKSA+ICRACj4gLQo+IC1jbGVhbjo6Cj4gLQkkKGNhbGwgUVVJRVRfQ0xFQU4s IHJpc2N2KSAkKFJNKSAkKGhlYWRlcikKPiAtCj4gLWFyY2hoZWFkZXJzOiAkKGhlYWRlcikKPiBk aWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3Jpc2N2L2VudHJ5L3N5c2NhbGxzL0tidWlsZCBi L3Rvb2xzL3BlcmYvYXJjaC9yaXNjdi9lbnRyeS9zeXNjYWxscy9LYnVpbGQKPiBuZXcgZmlsZSBt b2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAuLjlhNDFlMzU3MmMzYWZkNGYyMDIzMjFmZDllNDkyNzE0NTQwZThmZDMKPiAtLS0gL2Rldi9u dWxsCj4gKysrIGIvdG9vbHMvcGVyZi9hcmNoL3Jpc2N2L2VudHJ5L3N5c2NhbGxzL0tidWlsZAo+ IEBAIC0wLDAgKzEsMiBAQAo+ICsjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCj4g K3N5c2NhbGwteSArPSBzeXNjYWxsc182NC5oCj4gZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJj aC9yaXNjdi9lbnRyeS9zeXNjYWxscy9NYWtlZmlsZS5zeXNjYWxscyBiL3Rvb2xzL3BlcmYvYXJj aC9yaXNjdi9lbnRyeS9zeXNjYWxscy9NYWtlZmlsZS5zeXNjYWxscwo+IG5ldyBmaWxlIG1vZGUg MTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u OTY2OGZkMWZhZjYwZTgyOGVkMjc4NmMyZWU4NDczOWFjMWYxNTNmYwo+IC0tLSAvZGV2L251bGwK PiArKysgYi90b29scy9wZXJmL2FyY2gvcmlzY3YvZW50cnkvc3lzY2FsbHMvTWFrZWZpbGUuc3lz Y2FsbHMKPiBAQCAtMCwwICsxLDQgQEAKPiArIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BM LTIuMAo+ICsKPiArc3lzY2FsbF9hYmlzXzMyICs9IHJpc2N2IG1lbWZkX3NlY3JldAo+ICtzeXNj YWxsX2FiaXNfNjQgKz0gcmlzY3YgcmxpbWl0IG1lbWZkX3NlY3JldAo+IGRpZmYgLS1naXQgYS90 b29scy9wZXJmL2FyY2gvcmlzY3YvZW50cnkvc3lzY2FsbHMvbWtzeXNjYWxsdGJsIGIvdG9vbHMv cGVyZi9hcmNoL3Jpc2N2L2VudHJ5L3N5c2NhbGxzL21rc3lzY2FsbHRibAo+IGRlbGV0ZWQgZmls ZSBtb2RlIDEwMDc1NQo+IGluZGV4IGM1OWY1ZTg1MmI5NzcxMmE5YTg3OWI4OWU2ZWY2OTk5ZWQ0 YjZjZDcuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKPiAtLS0gYS90 b29scy9wZXJmL2FyY2gvcmlzY3YvZW50cnkvc3lzY2FsbHMvbWtzeXNjYWxsdGJsCj4gKysrIC9k ZXYvbnVsbAo+IEBAIC0xLDQ3ICswLDAgQEAKPiAtIyEvYmluL3NoCj4gLSMgU1BEWC1MaWNlbnNl LUlkZW50aWZpZXI6IEdQTC0yLjAKPiAtIwo+IC0jIEdlbmVyYXRlIHN5c3RlbSBjYWxsIHRhYmxl IGZvciBwZXJmLiBEZXJpdmVkIGZyb20KPiAtIyBwb3dlcnBjIHNjcmlwdC4KPiAtIwo+IC0jIENv cHlyaWdodCBJQk0gQ29ycC4gMjAxNwo+IC0jIEF1dGhvcihzKTogIEhlbmRyaWsgQnJ1ZWNrbmVy IDxicnVlY2tuZXJAbGludXgudm5ldC5pYm0uY29tPgo+IC0jIENoYW5nZWQgYnk6IFJhdmkgQmFu Z29yaWEgPHJhdmkuYmFuZ29yaWFAbGludXgudm5ldC5pYm0uY29tPgo+IC0jIENoYW5nZWQgYnk6 IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGFybS5jb20+Cj4gLSMgQ2hhbmdlZCBieTogQmrD tnJuIFTDtnBlbCA8Ympvcm5Acml2b3NpbmMuY29tPgo+IC0KPiAtZ2NjPSQxCj4gLWhvc3RjYz0k Mgo+IC1pbmNwYXRoPSQzCj4gLWlucHV0PSQ0Cj4gLQo+IC1pZiAhIHRlc3QgLXIgJGlucHV0OyB0 aGVuCj4gLQllY2hvICJDb3VsZCBub3QgcmVhZCBpbnB1dCBmaWxlIiA+JjIKPiAtCWV4aXQgMQo+ IC1maQo+IC0KPiAtY3JlYXRlX3NjX3RhYmxlKCkKPiAtewo+IC0JbG9jYWwgc2MgbnIgbWF4X25y Cj4gLQo+IC0Jd2hpbGUgcmVhZCBzYyBucjsgZG8KPiAtCQlwcmludGYgIiVzXG4iICIJWyRucl0g PSBcIiRzY1wiLCIKPiAtCQltYXhfbnI9JG5yCj4gLQlkb25lCj4gLQo+IC0JZWNobyAiI2RlZmlu ZSBTWVNDQUxMVEJMX1JJU0NWX01BWF9JRCAkbWF4X25yIgo+IC19Cj4gLQo+IC1jcmVhdGVfdGFi bGUoKQo+IC17Cj4gLQllY2hvICIjaW5jbHVkZSBcIiRpbnB1dFwiIgo+IC0JZWNobyAic3RhdGlj IGNvbnN0IGNoYXIgKmNvbnN0IHN5c2NhbGx0YmxfcmlzY3ZbXSA9IHsiCj4gLQljcmVhdGVfc2Nf dGFibGUKPiAtCWVjaG8gIn07Igo+IC19Cj4gLQo+IC0kZ2NjIC1FIC1kTSAteCBjIC1JICRpbmNw YXRoL2luY2x1ZGUvdWFwaSAkaW5wdXQgXAo+IC0JfGF3ayAnJDIgfiAiX19OUiIgJiYgJDMgIX4g Il9fTlIzMjY0XyIgewo+IC0JCXN1YigiXiNkZWZpbmUgX19OUigzMjY0KT9fIiwgIiIpOwo+IC0J CXByaW50IHwgInNvcnQgLWsyIC1uIn0nIFwKPiAtCXxjcmVhdGVfdGFibGUKPiBkaWZmIC0tZ2l0 IGEvdG9vbHMvcGVyZi9hcmNoL3Jpc2N2L2luY2x1ZGUvc3lzY2FsbF90YWJsZS5oIGIvdG9vbHMv cGVyZi9hcmNoL3Jpc2N2L2luY2x1ZGUvc3lzY2FsbF90YWJsZS5oCj4gbmV3IGZpbGUgbW9kZSAx MDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43 ZmY1MWI3ODMwMDBkNzI3ZWM0OGJlOTYwNzMwYjgxZWNkYjA1NTc1Cj4gLS0tIC9kZXYvbnVsbAo+ ICsrKyBiL3Rvb2xzL3BlcmYvYXJjaC9yaXNjdi9pbmNsdWRlL3N5c2NhbGxfdGFibGUuaAo+IEBA IC0wLDAgKzEsOCBAQAo+ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLwo+ ICsjaW5jbHVkZSA8YXNtL2JpdHNwZXJsb25nLmg+Cj4gKwo+ICsjaWYgX19CSVRTX1BFUl9MT05H ID09IDY0Cj4gKyNpbmNsdWRlIDxhc20vc3lzY2FsbHNfNjQuaD4KPiArI2Vsc2UKPiArI2luY2x1 ZGUgPGFzbS9zeXNjYWxsc18zMi5oPgo+ICsjZW5kaWYKPiBkaWZmIC0tZ2l0IGEvdG9vbHMvcGVy Zi9jaGVjay1oZWFkZXJzLnNoIGIvdG9vbHMvcGVyZi9jaGVjay1oZWFkZXJzLnNoCj4gaW5kZXgg YTA1YzFjMTA1YzUxYmYxYmQxOGE1OTE5NTIyMDg5NDU5OGViNzQ2MS4uNjkyZjQ4ZGI4MTBjY2Jl ZjIyOWUyNDBkYjI5MjYxZjBjNjBkYjYzMiAxMDA3NTUKPiAtLS0gYS90b29scy9wZXJmL2NoZWNr LWhlYWRlcnMuc2gKPiArKysgYi90b29scy9wZXJmL2NoZWNrLWhlYWRlcnMuc2gKPiBAQCAtNzEs NiArNzEsNyBAQCBGSUxFUz0oCj4gICAgImluY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9pb2N0bHMu aCIKPiAgICAiaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL21tYW4tY29tbW9uLmgiCj4gICAgImlu Y2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy91bmlzdGQuaCIKPiArICAic2NyaXB0cy9zeXNjYWxsLnRi bCIKPiAgKQo+ICAKPiAgZGVjbGFyZSAtYSBTWU5DX0NIRUNLX0ZJTEVTCj4gZGlmZiAtLWdpdCBh L3Rvb2xzL3BlcmYvc2NyaXB0cy9NYWtlZmlsZS5zeXNjYWxscyBiL3Rvb2xzL3BlcmYvc2NyaXB0 cy9NYWtlZmlsZS5zeXNjYWxscwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZTJiMGM0YjUxM2Q1YzQyYzhlOWFj NTFhOWVhNzc0YzM0YTEzMTFiNwo+IC0tLSAvZGV2L251bGwKPiArKysgYi90b29scy9wZXJmL3Nj cmlwdHMvTWFrZWZpbGUuc3lzY2FsbHMKPiBAQCAtMCwwICsxLDYwIEBACj4gKyMgU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPiArIyBUaGlzIE1ha2VmaWxlIGdlbmVyYXRlcyB0b29s cy9wZXJmL2FyY2gvJChTUkNBUkNIKS9pbmNsdWRlL2dlbmVyYXRlZC9hc20gZnJvbQo+ICsjIHRo ZSBnZW5lcmljIHN5c2NhbGwgdGFibGUgaWYgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGFyY2hp dGVjdHVyZSwgb3RoZXJ3aXNlCj4gKyMgZnJvbSB0aGUgYXJjaGl0ZWN0dXJlJ3MgZGVmaW5lZCBz eXNjYWxsIHRhYmxlLgo+ICsKPiArUEhPTlkgOj0gYWxsCj4gK2FsbDoKPiArCj4gK29iaiA6PSAk KE9VVFBVVCkvdG9vbHMvcGVyZi9hcmNoLyQoU1JDQVJDSCkvaW5jbHVkZS9nZW5lcmF0ZWQvYXNt Cj4gKwo+ICtzeXNjYWxsX2FiaXNfMzIgICs9IGNvbW1vbiwzMgo+ICtzeXNjYWxsX2FiaXNfNjQg ICs9IGNvbW1vbiw2NAoKQ291bGRuJ3QgaXQgYmUgOj0gaW5zdGVhZCBvZiArPSA/CgoKPiArc3lz Y2FsbHRibCA6PSAkKHNyY3RyZWUpL3Rvb2xzL3NjcmlwdHMvc3lzY2FsbC50YmwKPiArCj4gKyMg bGV0IGFyY2hpdGVjdHVyZXMgb3ZlcnJpZGUgJChzeXNjYWxsX2FiaXNfJSkgYW5kICQoc3lzY2Fs bHRibCkKPiArLWluY2x1ZGUgJChzcmN0cmVlKS90b29scy9wZXJmL2FyY2gvJChTUkNBUkNIKS9l bnRyeS9zeXNjYWxscy9NYWtlZmlsZS5zeXNjYWxscwo+ICtpbmNsdWRlICQoc3JjdHJlZSkvc2Ny aXB0cy9LYnVpbGQuaW5jbHVkZQo+ICstaW5jbHVkZSAkKHNyY3RyZWUpL3Rvb2xzL3BlcmYvYXJj aC8kKFNSQ0FSQ0gpL2VudHJ5L3N5c2NhbGxzL0tidWlsZAo+ICsKPiArc3lzdGJsIDo9ICQoc3Jj dHJlZSkvdG9vbHMvcGVyZi9zY3JpcHRzL3N5c2NhbGx0Ymwuc2gKPiArCj4gK3N5c2NhbGwteSAg IDo9ICQoYWRkcHJlZml4ICQob2JqKS8sICQoc3lzY2FsbC15KSkKPiArCj4gKyMgUmVtb3ZlIHN0 YWxlIHdyYXBwZXJzIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgZmlsZXMgYXJlIHJlbW92ZWQgZnJv bSBnZW5lcmljLXkKPiArb2xkLWhlYWRlcnMgOj0gJCh3aWxkY2FyZCAkKG9iaikvKi5jKQo+ICt1 bndhbnRlZCAgICA6PSAkKGZpbHRlci1vdXQgJChzeXNjYWxsLXkpLCQob2xkLWhlYWRlcnMpKQoK Q2FuIHlvdSBlbGFib3JhdGU/ICBXaGF0J3MgdGhlIHN0YWJsZSB3cmFwcGVycz8KCkkgdGhpbmsg c3lzY2FsbC15IGFuZCBvbGQtaGVhZGVycyBoYXZlIC5oIGZpbGVzIGJ1dCB0aGUgd2lsZGNhcmQg YWJvdmUKaXMgY2FsbGVkIGZvciAuYyBmaWxlcz8KClRoYW5rcywKTmFtaHl1bmcKCj4gKwo+ICtx dWlldF9jbWRfcmVtb3ZlID0gUkVNT1ZFICAkKHVud2FudGVkKQo+ICsgICAgICBjbWRfcmVtb3Zl ID0gcm0gLWYgJCh1bndhbnRlZCkKPiArCj4gK3F1aWV0X2NtZF9zeXN0YmwgPSBTWVNUQkwgICRA Cj4gKyAgICAgIGNtZF9zeXN0YmwgPSAkKENPTkZJR19TSEVMTCkgJChzeXN0YmwpIFwKPiArCQkg ICAkKGlmICQoc3lzdGJsLWFyZ3MtJCopLCQoc3lzdGJsLWFyZ3MtJCopLCQoc3lzdGJsLWFyZ3Mp KSBcCj4gKwkJICAgLS1hYmlzICQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChzdHJpcCAkKHN5 c2NhbGxfYWJpc18kKikpKSBcCj4gKwkJICAgJDwgJEAKPiArCj4gK2FsbDogJChzeXNjYWxsLXkp Cj4gKwkkKGlmICQodW53YW50ZWQpLCQoY2FsbCBjbWQscmVtb3ZlKSkKPiArCUA6Cj4gKwo+ICsk KG9iaikvc3lzY2FsbHNfJS5oOiAkKHN5c2NhbGx0YmwpICQoc3lzdGJsKSBGT1JDRQo+ICsJJChj YWxsIGlmX2NoYW5nZWQsc3lzdGJsKQo+ICsKPiArdGFyZ2V0cyA6PSAkKHN5c2NhbGwteSkKPiAr Cj4gKyMgQ3JlYXRlIG91dHB1dCBkaXJlY3RvcnkuIFNraXAgaXQgaWYgYXQgbGVhc3Qgb25lIG9s ZCBoZWFkZXIgZXhpc3RzCj4gKyMgc2luY2Ugd2Uga25vdyB0aGUgb3V0cHV0IGRpcmVjdG9yeSBh bHJlYWR5IGV4aXN0cy4KPiAraWZlcSAoJChvbGQtaGVhZGVycyksKQo+ICskKHNoZWxsIG1rZGly IC1wICQob2JqKSkKPiArZW5kaWYKPiArCj4gK1BIT05ZICs9IEZPUkNFCj4gKwo+ICtGT1JDRToK PiArCj4gK2V4aXN0aW5nLXRhcmdldHMgOj0gJCh3aWxkY2FyZCAkKHNvcnQgJCh0YXJnZXRzKSkp Cj4gKwo+ICstaW5jbHVkZSAkKGZvcmVhY2ggZiwkKGV4aXN0aW5nLXRhcmdldHMpLCQoZGlyICQo ZikpLiQobm90ZGlyICQoZikpLmNtZCkKPiArCj4gKy5QSE9OWTogJChQSE9OWSkKCl9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LXJpc2N2IG1haWxp bmcgbGlzdApsaW51eC1yaXNjdkBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZy YWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcmlzY3YK