From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp0.migadu.com ([2001:41d0:303:e224::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms13.migadu.com with LMTPS id AIsNNZk8X2fk/gAAqHPOHw:P1 (envelope-from ) for ; Sun, 15 Dec 2024 20:31:22 +0000 Received: from aspmx1.migadu.com ([2001:41d0:303:e224::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp0.migadu.com with LMTPS id AIsNNZk8X2fk/gAAqHPOHw (envelope-from ) for ; Sun, 15 Dec 2024 21:31:21 +0100 X-Envelope-To: larch@yhetil.org Authentication-Results: aspmx1.migadu.com; dkim=pass header.d=debbugs.gnu.org header.s=debbugs-gnu-org header.b=gN4k8UTs; dkim=fail ("headers rsa verify failed") header.d=gmail.com header.s=20230601 header.b=T1xo5Tqd; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=gmail.com (policy=none); spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org" ARC-Seal: i=1; s=key1; d=yhetil.org; t=1734294681; a=rsa-sha256; cv=none; b=dR/NGA04ge1IcRwWNlfw0Pl+9zj+WY6mTsms9BDZZnBldMAIvfeDWLkG5HSZhh/GlKXU4g Y27fuHXLEUTj1HLJSivOw0hPflqF+lLLMzkjQgteokPe4GLes/3DSgkaSmR7kZsQoAajry REaSJIZLO68VwjIM0hqGVR7AxAQsdW98Qtdl5eJ/cGQhjcSIgXToMuq7LLJ3aNBoAqcgld 6tppIkpuZ6/GiBQt7JbaCguzAQOa8P7v+4bvSAYMdPcCTkDK5DVOh9dImzYqTX6t2guEFZ 5DsvgVrjJUUTfpO/1owUHqEN+OTa9dUAI0Hus7+o4LCfZHGPjcTp/L4BSK9hww== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=pass header.d=debbugs.gnu.org header.s=debbugs-gnu-org header.b=gN4k8UTs; dkim=fail ("headers rsa verify failed") header.d=gmail.com header.s=20230601 header.b=T1xo5Tqd; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=gmail.com (policy=none); spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org" ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1734294681; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type:resent-cc:resent-from:resent-sender: resent-message-id:list-id:list-help:list-unsubscribe:list-subscribe: list-post:dkim-signature; bh=1aU7kTCHHblHVZOr7RcCbL4C1R3ZTukOCrn72YxUyJo=; b=UyCxu9q7xpcMYXfXj9jUXSJ/4uOtUSKal+gjqE38C5r/gfJGaVkZRkmmXG2z/qnr1SZru4 vJYqGZ9cQg5YIRsIoZa9LaC0nfIRD03FGkR0C9XTZGoltO7peIcgdS/t5rF1sVZ3HrqUrE aXFkzRDHuzrd8IgNJZFlZaHDqbqX7XcFytQan4ZM2omxoGhrYw/vEbvJx+JFN9R67ijVPf YFaxMnVk1EOQoJx8t+sRt+yIiD9y5CN61UJccra5O5zjfqmXwuk4V0rnbDhhDeBebS6onl C9G7f1OTqZCa0wTFukdnTVT+QEKwRUGGP68dnd7TzI41C/rHsduM+KH8gdBWIg== Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id B530B86636 for ; Sun, 15 Dec 2024 21:31:20 +0100 (CET) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tMvGa-0002KB-JB; Sun, 15 Dec 2024 15:31:04 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tMvGY-0002K1-L2 for guix-patches@gnu.org; Sun, 15 Dec 2024 15:31:03 -0500 Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tMvGY-0002CI-8h for guix-patches@gnu.org; Sun, 15 Dec 2024 15:31:02 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debbugs.gnu.org; s=debbugs-gnu-org; h=Date:From:MIME-Version:To:Subject; bh=1aU7kTCHHblHVZOr7RcCbL4C1R3ZTukOCrn72YxUyJo=; b=gN4k8UTscHJnyGnpdyDuy6lM2P/kLS4uOwe1KIfEZpOlbgNm2orncBphDvhuKb4dPQDnZCkAd02ZhmOYu5LhUdNete11gogVJS0ghrViqdX6s5Y5qQh4Mqc2bnmPZX/FeBoUQMiM/D7SqCXhgAoYOIw+kPLYdV7DRir+dbcO1JwLh34MeQebUcNS5piX6f5m16sUtFGtvHacxVvR+v24vl2xAAvAb+orRdWTe9cX9MCtDtkNXgifDoVwprcO/wHPdvQEzXK1dC9o+RYb9McM98n9yLon9Syl+YKpJBZ6n8FSZ18STZvqj43j0ySrYbfYSSZInkE5Y7ej88nCEdSDzg==; Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1tMvGY-0001Yp-1w for guix-patches@gnu.org; Sun, 15 Dec 2024 15:31:02 -0500 X-Loop: help-debbugs@gnu.org Subject: [bug#74900] [PATCH] Replace (guix build json) with (json) in node build system Resent-From: Daniel Khodabakhsh Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Sun, 15 Dec 2024 20:31:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 74900 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 74900@debbugs.gnu.org X-Debbugs-Original-To: guix-patches@gnu.org Received: via spool by submit@debbugs.gnu.org id=B.17342946445964 (code B ref -1); Sun, 15 Dec 2024 20:31:01 +0000 Received: (at submit) by debbugs.gnu.org; 15 Dec 2024 20:30:44 +0000 Received: from localhost ([127.0.0.1]:52310 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tMvGD-0001Y5-Sl for submit@debbugs.gnu.org; Sun, 15 Dec 2024 15:30:44 -0500 Received: from lists.gnu.org ([209.51.188.17]:37042) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tMvG8-0001Xp-02 for submit@debbugs.gnu.org; Sun, 15 Dec 2024 15:30:39 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tMvG5-0002IP-Vn for guix-patches@gnu.org; Sun, 15 Dec 2024 15:30:34 -0500 Received: from mail-vs1-xe34.google.com ([2607:f8b0:4864:20::e34]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tMvG1-0002Ah-S8 for guix-patches@gnu.org; Sun, 15 Dec 2024 15:30:33 -0500 Received: by mail-vs1-xe34.google.com with SMTP id ada2fe7eead31-4afe4f1ce18so912096137.3 for ; Sun, 15 Dec 2024 12:30:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1734294628; x=1734899428; darn=gnu.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=1aU7kTCHHblHVZOr7RcCbL4C1R3ZTukOCrn72YxUyJo=; b=T1xo5TqdjsJthpOCNRpCmsom4c44qZHElsZ4UKExZ+dvRjRpzX8P+gsZAR7o0WlxL/ BvckoF3sYGVVdy9wbaw1+bntSdu+/4qUMhffQHvvewoI+RT3cJPRwCkc+nXIhHM/oWj6 KiPSkVU8AhB23R3P2atjuDs/7glePx0lxYqrFuQV2geRXVxylOnBAWhfnpYONUc8kKKx PVgd6auayGB+NtOhwBAqDaOdrHnLr4NnkpZqQXojmzn4jbjdmOqWXgAeYqJgpsTEopE3 26rNbVzXhBU7NqFxh/B9KHXWdUMf6TmnYvsIon5/g9Qm7K4gnZOJFoetUCNHxBZDeFtS 37Zg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734294628; x=1734899428; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=1aU7kTCHHblHVZOr7RcCbL4C1R3ZTukOCrn72YxUyJo=; b=HbLdWKGR8mED1qJX/543VHxcmkatFDARGE57Svm2KQd/0Zg9RqbMh7ppKyK1oL9Dfl pm9RxAJ/sUpHOsfspCVu6kWJPDUJd71vfVTnf30KakDKp8zVO1S4pYX4mBoPqFlFp6CA xAUF1KtgQSO6wUC+qrjYOdNIcP7OrV5NKqmOioaY35eCUh0i3pKOsty0SzMbh836NwS1 o6QDea9xyRQC7mcC6zauGD7FRznlrwQopgzJnn070FBc3flxz9aBvDDkdVx4W6o3LaST K5hUtovuSKetsnA9aosHZoZdJ2yzpa8lGdsRmE5Tk5tCNrMD5UXNZw6OyMzHHZ1IPs5o D7+w== X-Gm-Message-State: AOJu0Yx0WbiGXsguAQcIPtW14t0i/OMe1ofWH4TQrrTITqTA4U44ZiA+ 7O07LW8qslSkhMgOOwZbwAZVj4UhiZbs5K2r117hct7/A94m8rQjksn8YR/x8m/xQdL3SpSNGuZ /OCsFkV+etRxSbLZHonbdk3IFGNNg4mbM X-Gm-Gg: ASbGncunZ8wExPlFDWERY7EFwb8Ce3X8Wdb7V6bJUFox1XaTi3R1wGL4dVim4S/3MVf kmAWLNGQEDKDtrvkkauM7un1m6RIrq38XrLzReQ== X-Google-Smtp-Source: AGHT+IEQTYixPjgGZ/8YSpwGTZFFPp7bctWyrd7qmb97Jal/3Jnabmt5ZYebCkRh5AF2W3Lbb4pnRWbZjXH4QPBgL0A= X-Received: by 2002:a05:6102:cd3:b0:4b2:5d10:58f1 with SMTP id ada2fe7eead31-4b25d9bc2f2mr12180732137.11.1734294627535; Sun, 15 Dec 2024 12:30:27 -0800 (PST) MIME-Version: 1.0 From: Daniel Khodabakhsh Date: Sun, 15 Dec 2024 20:30:16 +0000 Message-ID: Content-Type: multipart/mixed; boundary="00000000000035ee88062954efaa" Received-SPF: pass client-ip=2607:f8b0:4864:20::e34; envelope-from=d.khodabakhsh@gmail.com; helo=mail-vs1-xe34.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+larch=yhetil.org@gnu.org Sender: guix-patches-bounces+larch=yhetil.org@gnu.org X-Migadu-Country: US X-Migadu-Flow: FLOW_IN X-Migadu-Spam-Score: -3.73 X-Spam-Score: -3.73 X-Migadu-Queue-Id: B530B86636 X-Migadu-Scanner: mx12.migadu.com X-TUID: JKYsvi8q7u4i --00000000000035ee88062954efaa Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable This change replaces the use of (guix build json) with (json) for the node ecosystem. Since guile-json is a dependency of Guix, and it's used elsewhere in the project, it makes sense to use this instead of rolling our own JSON implementation with (guix build json). This is one step to move away from (guix build json), there will be other changes to remove the other uses of it. I tested it out by building the 4 affected node-xyz packages and verified that the modified package.json was correct for node-acorn and node-addon-api. Signed-off-by: Daniel Khodabakhsh Change-Id: I0c86b3039eb2f50a19f9d9650f5a73b3a473ad37 --- gnu/packages/node-xyz.scm | 148 ++++++++++++-------------- guix/build-system/node.scm | 6 +- guix/build/node-build-system.scm | 176 +++++++++++-------------------- 3 files changed, 135 insertions(+), 195 deletions(-) diff --git a/gnu/packages/node-xyz.scm b/gnu/packages/node-xyz.scm index cf6f50e3ce..decfb50a66 100644 --- a/gnu/packages/node-xyz.scm +++ b/gnu/packages/node-xyz.scm @@ -7,6 +7,7 @@ ;;; Copyright =C2=A9 2021 Dhruvin Gandhi ;;; Copyright =C2=A9 2022 Nicolas Graves ;;; Copyright =C2=A9 2023 Jelle Licht +;;; Copyright =C2=A9 2024 Daniel Khodabakhsh ;;; ;;; This file is part of GNU Guix. ;;; @@ -24,14 +25,14 @@ ;;; along with GNU Guix. If not, see . (define-module (gnu packages node-xyz) - #:use-module ((guix licenses) #:prefix license:) #:use-module (gnu packages sqlite) #:use-module (gnu packages python) #:use-module (gnu packages web) + #:use-module (guix build-system node) #:use-module (guix gexp) - #:use-module (guix packages) #:use-module (guix git-download) - #:use-module (guix build-system node)) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix packages)) ;;; ;;; Please: Try to add new module packages in alphabetic order. @@ -69,19 +70,17 @@ (define-public node-acorn ;; it would try to use the build environment and would block = the ;; automatic building by other packages making use of node-ac= orn. ;; TODO: Add utility function - (with-atomic-json-file-replacement "package.json" - (match-lambda - (('@ . pkg-meta-alist) - (cons '@ (map (match-lambda - (("scripts" @ . scripts-alist) - `("scripts" @ ,@(filter (match-lambda - (("prepare" .= _) - #f) - (_ - #t)) - scripts-alist))= ) - (other other)) - pkg-meta-alist))))))) + (with-atomic-json-file-replacement (lambda (pkg-meta-alist) + (map + (match-lambda + (("scripts" . scripts-alist) + (cons "scripts" (filter + (match-lambda + (("prepare" . _) #f) + (_ #t)) + scripts-alist))) + (other other)) + pkg-meta-alist))))) (replace 'build (lambda* (#:key inputs native-inputs #:allow-other-keys) (let ((esbuild (search-input-file (or native-inputs inputs) @@ -156,23 +155,17 @@ (define-public node-addon-api (lambda args (define new-test-script "echo stopping after pretest on Guix") - (with-atomic-json-file-replacement "package.json" - (match-lambda - (('@ . pkg-meta-alist) - (cons - '@ - (map (match-lambda - (("scripts" '@ . scripts-alist) - `("scripts" @ ,@(map (match-lambda - (("test" . _) - (cons "test" - new-test-script)) - (other - other)) - scripts-alist))) - (other - other)) - pkg-meta-alist)))))))))) + (with-atomic-json-file-replacement (lambda (pkg-meta-alist) + (map + (match-lambda + (("scripts" . scripts-alist) + (cons "scripts" (map + (match-lambda + (("test" . _) (cons "test" new-test-script)) + (other other)) + scripts-alist))) + (other other)) + pkg-meta-alist)))))))) (home-page "https://github.com/nodejs/node-addon-api") (synopsis "Node.js API (Node-API) header-only C++ wrappers") (description "This module contains header-only C++ wrapper classes whi= ch @@ -1221,22 +1214,19 @@ (define-public node-serialport-bindings "node-abi")))) (add-after 'chdir 'avoid-prebuild-install (lambda args - (with-atomic-json-file-replacement "package.json" - (match-lambda - (('@ . pkg-meta-alist) - (cons '@ (map (match-lambda - (("scripts" @ . scripts-alist) - `("scripts" @ ,@(filter (match-lambda - (("install" .= _) - #f) - (_ - #t)) - scripts-alist))= ) - (("gypfile" . _) - '("gypfile" . #f)) - (other - other)) - pkg-meta-alist)))))))) + (with-atomic-json-file-replacement (lambda (pkg-meta-alist) + (map + (match-lambda + (("scripts" . scripts-alist) + (cons "scripts" (filter + (match-lambda + (("install" . _) #f) + (_ #t)) + scripts-alist))) + (("gypfile" . _) + (cons "gypfile" #f)) + (other other)) + pkg-meta-alist)))))) #:tests? #f)) (synopsis "Abstract base class for Node SerialPort bindings") (description "Node SerialPort is a modular suite of Node.js packages f= or @@ -1522,39 +1512,33 @@ (define-public node-sqlite3 (substitute* ".npmignore" (("lib/binding") "#lib/binding # <- patched for Guix")) - (with-atomic-json-file-replacement "package.json" - (match-lambda - (('@ . pkg-meta-alist) - (match (assoc-ref pkg-meta-alist "binary") - (('@ . binary-alist) - ;; When it builds from source, node-pre-gyp supplies - ;; module_name and module_path based on the entries u= nder - ;; "binary" from "package.json", so this package's - ;; "binding.gyp" doesn't define them. Thus, we also n= eed - ;; to supply them. The GYP_DEFINES environment variab= le - ;; turns out to be the easiest way to make sure they = are - ;; propagated from npm to node-gyp to gyp. - (setenv "GYP_DEFINES" - (string-append - "module_name=3D" - (assoc-ref binary-alist "module_name") - " " - "module_path=3D" - (assoc-ref binary-alist "module_path"))))) - ;; We need to remove the install script from "package.js= on", - ;; as it would try to use node-pre-gyp and would block t= he - ;; automatic building performed by `npm install`. - (cons '@ (map (match-lambda - (("scripts" @ . scripts-alist) - `("scripts" @ ,@(filter (match-lambda - (("install" .= _) - #f) - (_ - #t)) - scripts-alist))= ) - (other - other)) - pkg-meta-alist)))))))))) + (with-atomic-json-file-replacement (lambda (pkg-meta-alist) + (let ((binary-alist (assoc-ref pkg-meta-alist "binary"))) + ;; When it builds from source, node-pre-gyp supplies + ;; module_name and module_path based on the entries under + ;; "binary" from "package.json", so this package's + ;; "binding.gyp" doesn't define them. Thus, we also need + ;; to supply them. The GYP_DEFINES environment variable + ;; turns out to be the easiest way to make sure they are + ;; propagated from npm to node-gyp to gyp. + (setenv "GYP_DEFINES" (string-append + "module_name=3D" + (assoc-ref binary-alist "module_name") + " module_path=3D" + (assoc-ref binary-alist "module_path")))) + ;; We need to remove the install script from "package.json"= , + ;; as it would try to use node-pre-gyp and would block the + ;; automatic building performed by `npm install`. + (map + (match-lambda + (("scripts" . scripts-alist) + (cons "scripts" (filter + (match-lambda + (("install" . _) #f) + (_ #t)) + scripts-alist))) + (other other)) + pkg-meta-alist)))))))) (home-page "https://github.com/mapbox/node-sqlite3") (synopsis "Node.js bindings for SQLite3") (description diff --git a/guix/build-system/node.scm b/guix/build-system/node.scm index 57fe5f6030..425b8cd9b3 100644 --- a/guix/build-system/node.scm +++ b/guix/build-system/node.scm @@ -4,6 +4,7 @@ ;;; Copyright =C2=A9 2021 Ludovic Court=C3=A8s ;;; Copyright =C2=A9 2021 Pierre Langlois ;;; Copyright =C2=A9 2021 Philip McGrath +;;; Copyright =C2=A9 2024 Daniel Khodabakhsh ;;; ;;; This file is part of GNU Guix. ;;; @@ -36,7 +37,10 @@ (define-module (guix build-system node) (define %node-build-system-modules ;; Build-side modules imported by default. `((guix build node-build-system) - (guix build json) + (json) + (json builder) + (json parser) + (json record) ,@%default-gnu-imported-modules)) (define (default-node) diff --git a/guix/build/node-build-system.scm b/guix/build/node-build-syste= m.scm index fb23894bc1..ef0f88a5a7 100644 --- a/guix/build/node-build-system.scm +++ b/guix/build/node-build-system.scm @@ -4,6 +4,7 @@ ;;; Copyright =C2=A9 2019, 2021 Timothy Sample ;;; Copyright =C2=A9 2021, 2022 Philip McGrath ;;; Copyright =C2=A9 2022 Liliana Marie Prikler +;;; Copyright =C2=A9 2024 Daniel Khodabakhsh ;;; ;;; This file is part of GNU Guix. ;;; @@ -23,10 +24,10 @@ (define-module (guix build node-build-system) #:use-module ((guix build gnu-build-system) #:prefix gnu:) #:use-module (guix build utils) - #:use-module (guix build json) #:use-module (ice-9 ftw) #:use-module (ice-9 regex) #:use-module (ice-9 match) + #:use-module (json) #:use-module (srfi srfi-1) #:use-module (srfi srfi-71) #:export (%standard-phases @@ -34,13 +35,13 @@ (define-module (guix build node-build-system) delete-dependencies node-build)) -(define (with-atomic-json-file-replacement file proc) +(define* (with-atomic-json-file-replacement proc #:optional (file "package.json")) "Like 'with-atomic-file-replacement', but PROC is called with a single argument---the result of parsing FILE's contents as json---and should a va= lue to be written as json to the replacement FILE." (with-atomic-file-replacement file (lambda (in out) - (write-json (proc (read-json in)) out)))) + (scm->json (proc (json->scm in)) out)))) (define* (assoc-ref* alist key #:optional default) "Like assoc-ref, but return DEFAULT instead of #f if no value exists." @@ -48,10 +49,6 @@ (define* (assoc-ref* alist key #:optional default) (#f default) ((_ . value) value))) -(define* (jsobject-ref obj key #:optional default) - (match obj - (('@ . alist) (assoc-ref* alist key default)))) - (define* (alist-pop alist key #:optional (=3D equal?)) "Return two values, the first pair in ALIST with key KEY, and the other elements. Equality calls are made as (=3D KEY ALISTCAR)." @@ -63,67 +60,17 @@ (define* (alist-pop alist key #:optional (=3D equal?)) (values (car after) (append before (cdr after))) (values #f before)))) -(define* (alist-update alist key proc #:optional default (=3D equal?)) +(define* (alist-update alist key proc #:optional (=3D equal?)) "Return an association list like ALIST, but with KEY mapped to the resul= t of PROC applied to the first value found under the comparison (=3D KEY ALISTC= AR). -If no such value exists, use DEFAULT instead. +If no such value exists, return the list unchanged. Unlike acons, this removes the previous association of KEY (assuming it is unique), but the result may still share storage with ALIST." (let ((pair rest (alist-pop alist key =3D))) - (acons key - (proc (if (pair? pair) - (cdr pair) - default)) - rest))) - -(define (jsobject-update* js . updates) - "Return a json object like JS, but with all UPDATES applied. Each updat= e is -a list (KEY PROC [DEFAULT]), so that KEY is mapped to the result of PROC -applied to the value to which KEY is mapped in JS. If no such mapping exi= sts, -PROC is instead applied to DEFAULT, or to '#f' is no DEFAULT is specified. -The update takes place from left to right, so later UPDATERs will receive = the -values returned by earlier UPDATERs for the same KEY." - (match js - (('@ . alist) - (let loop ((alist alist) - (updates updates)) - (match updates - (() (cons '@ alist)) - (((key proc) . updates) - (loop (alist-update alist key proc #f equal?) updates)) - (((key proc default) . updates) - (loop (alist-update alist key proc default equal?) updates))))))= ) - -(define (jsobject-union combine seed . objects) - "Merge OBJECTS into SEED by applying (COMBINE KEY VAL0 VAL), where VAL0 -is the value found in the (possibly updated) SEED and VAL is the new value -found in one of the OBJECTS." - (match seed - (('@ . aseed) - (match objects - (() seed) - ((('@ . alists) ...) - (cons - '@ - (fold (lambda (alist aseed) - (if (null? aseed) alist - (fold - (match-lambda* - (((k . v) aseed) - (let ((pair tail (alist-pop alist k))) - (match pair - (#f (acons k v aseed)) - ((_ . v0) (acons k (combine k v0 v) aseed))))= )) - aseed - alist))) - aseed - alists))))))) + (if (pair? pair) + (acons key (proc (cdr pair)) rest) + alist))) -;; Possibly useful helper functions: -;; (define (newest key val0 val) val) -;; (define (unkeyed->keyed proc) (lambda (_key val0 val) (proc val0 val))) - - ;;; ;;; Phases. ;;; @@ -142,8 +89,8 @@ (define (set-home . _) (define (module-name module) (let* ((package.json (string-append module "/package.json")) - (package-meta (call-with-input-file package.json read-json))) - (jsobject-ref package-meta "name"))) + (package-meta (call-with-input-file package.json json->scm))) + (assoc-ref package-meta "name"))) (define (index-modules input-paths) (define (list-modules directory) @@ -167,49 +114,56 @@ (define* (patch-dependencies #:key inputs #:allow-other-keys) (define index (index-modules (map cdr inputs))) - (define resolve-dependencies - (match-lambda - (('@ . alist) - (cons '@ (map (match-lambda - ((key . value) - (cons key (hash-ref index key value)))) - alist))))) + (define (resolve-dependencies dependencies) + (map + (match-lambda + ((dependency . version) + (cons dependency (hash-ref index dependency version)))) + dependencies)) - (with-atomic-json-file-replacement "package.json" + (with-atomic-json-file-replacement (lambda (pkg-meta) - (jsobject-update* - pkg-meta - `("devDependencies" ,resolve-dependencies (@)) - `("dependencies" ,(lambda (deps) - (resolve-dependencies - (jsobject-union - (lambda (k a b) b) - (jsobject-ref pkg-meta "peerDependencies" '(@= )) - deps))) - (@))))) + (fold + (lambda (proc pkg-meta) (proc pkg-meta)) + pkg-meta + (list + (lambda (pkg-meta) + (alist-update pkg-meta "devDependencies" resolve-dependencies)= ) + (lambda (pkg-meta) + (assoc-set! + pkg-meta + "dependencies" + (resolve-dependencies + ; Combined "peerDependencies" and "dependencies" dependenc= ies + ; with "dependencies" taking precedent. + (fold + (lambda (dependency dependencies) + (assoc-set! dependencies (car dependency) (cdr dependency))) + (assoc-ref* pkg-meta "peerDependencies" '()) + (assoc-ref* pkg-meta "dependencies" '()) + )))))))) #t) -(define (delete-dependencies absent) +(define (delete-dependencies dependencies-to-remove) "Rewrite 'package.json' to allow the build to proceed without packages -listed in ABSENT, a list of strings naming npm packages. +listed in 'dependencies-to-remove', a list of strings naming npm packages. To prevent the deleted dependencies from being reintroduced, use this func= tion only after the 'patch-dependencies' phase." - (define delete-from-jsobject - (match-lambda - (('@ . alist) - (cons '@ (filter (match-lambda - ((k . _) - (not (member k absent)))) - alist))))) - - (with-atomic-json-file-replacement "package.json" + (with-atomic-json-file-replacement (lambda (pkg-meta) - (jsobject-update* - pkg-meta - `("devDependencies" ,delete-from-jsobject (@)) - `("dependencies" ,delete-from-jsobject (@)) - `("peerDependencies" ,delete-from-jsobject (@)))))) + (fold + (lambda (dependency-key pkg-meta) + (alist-update + pkg-meta + dependency-key + (lambda (dependencies) + (remove + (lambda (dependency) + (member (car dependency) dependencies-to-remove)) + dependencies)))) + pkg-meta + (list "devDependencies" "dependencies" "peerDependencies" "optionalDependencies"))))) (define* (delete-lockfiles #:key inputs #:allow-other-keys) "Delete 'package-lock.json', 'yarn.lock', and 'npm-shrinkwrap.json', if = they @@ -228,8 +182,8 @@ (define* (configure #:key outputs inputs #:allow-other-= keys) #t)) (define* (build #:key inputs #:allow-other-keys) - (let ((package-meta (call-with-input-file "package.json" read-json))) - (if (jsobject-ref (jsobject-ref package-meta "scripts" '(@)) "build" #= f) + (let ((package-meta (call-with-input-file "package.json" json->scm))) + (if (assoc-ref* (assoc-ref* package-meta "scripts" '()) "build" #f) (let ((npm (string-append (assoc-ref inputs "node") "/bin/npm"))) (invoke npm "run" "build")) (format #t "there is no build script to run~%")) @@ -301,22 +255,20 @@ (define* (avoid-node-gyp-rebuild #:key outputs #:allow-other-keys) ;; even need to overwrite this file. Therefore, let's use some helpers ;; that we'd otherwise not need. (define pkg-meta - (call-with-input-file installed-package.json read-json)) + (call-with-input-file installed-package.json json->scm)) (define scripts - (jsobject-ref pkg-meta "scripts" '(@))) - (define (jsobject-set js key val) - (jsobject-update* js (list key (const val)))) + (assoc-ref* pkg-meta "scripts" '())) - (when (equal? "node-gyp rebuild" (jsobject-ref scripts "install" #f)) + (when (equal? "node-gyp rebuild" (assoc-ref* scripts "install" #f)) (call-with-output-file installed-package.json (lambda (out) - (write-json - (jsobject-set pkg-meta - "scripts" - (jsobject-set scripts - "install" - "echo Guix: avoiding node-gyp rebuild= ")) - out))))) + (scm->json + (assoc-set! pkg-meta + "scripts" + (assoc-set! scripts + "install" + "echo Guix: avoiding node-gyp rebuild")) + out))))) (define %standard-phases (modify-phases gnu:%standard-phases base-commit: cfd4f56f75a20b6732d463180d211f796c9032e5 --=20 2.46.0 --00000000000035ee88062954efaa Content-Type: text/x-patch; charset="UTF-8"; name="0001-Replace-guix-build-json-with-json-in-node-build-syst.patch" Content-Disposition: attachment; filename="0001-Replace-guix-build-json-with-json-in-node-build-syst.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m4q28ebt0 RnJvbSAwMDk1YzJjZjdlOTc2NmJjNDc0MDQ0MWM4NDkyMTlhMzA2MDIzNTIyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBEYW5pZWwgS2hvZGFiYWtoc2ggPGQua2hvZGFiYWtoc2hAZ21h aWwuY29tPgpEYXRlOiBTdW4sIDE1IERlYyAyMDI0IDExOjMwOjMzIC0wODAwClN1YmplY3Q6IFtQ QVRDSF0gUmVwbGFjZSAoZ3VpeCBidWlsZCBqc29uKSB3aXRoIChqc29uKSBpbiBub2RlIGJ1aWxk IHN5c3RlbQoKVGhpcyBjaGFuZ2UgcmVwbGFjZXMgdGhlIHVzZSBvZiAoZ3VpeCBidWlsZCBqc29u KSB3aXRoIChqc29uKSBmb3IgdGhlIG5vZGUgZWNvc3lzdGVtLgpTaW5jZSBndWlsZS1qc29uIGlz IGEgZGVwZW5kZW5jeSBvZiBHdWl4LCBhbmQgaXQncyB1c2VkIGVsc2V3aGVyZSBpbiB0aGUgcHJv amVjdCwgaXQgbWFrZXMgc2Vuc2UgdG8gdXNlIHRoaXMgaW5zdGVhZCBvZiByb2xsaW5nIG91ciBv d24gSlNPTiBpbXBsZW1lbnRhdGlvbiB3aXRoIChndWl4IGJ1aWxkIGpzb24pLgpUaGlzIGlzIG9u ZSBzdGVwIHRvIG1vdmUgYXdheSBmcm9tIChndWl4IGJ1aWxkIGpzb24pLCB0aGVyZSB3aWxsIGJl IG90aGVyIGNoYW5nZXMgdG8gcmVtb3ZlIHRoZSBvdGhlciB1c2VzIG9mIGl0LgoKU2lnbmVkLW9m Zi1ieTogRGFuaWVsIEtob2RhYmFraHNoIDxkLmtob2RhYmFraHNoQGdtYWlsLmNvbT4KQ2hhbmdl LUlkOiBJMGM4NmIzMDM5ZWIyZjUwYTE5ZjlkOTY1MGY1YTczYjNhNDczYWQzNwotLS0KIGdudS9w YWNrYWdlcy9ub2RlLXh5ei5zY20gICAgICAgIHwgMTQ4ICsrKysrKysrKysrKy0tLS0tLS0tLS0t LS0tCiBndWl4L2J1aWxkLXN5c3RlbS9ub2RlLnNjbSAgICAgICB8ICAgNiArLQogZ3VpeC9idWls ZC9ub2RlLWJ1aWxkLXN5c3RlbS5zY20gfCAxNzYgKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0t LS0tLQogMyBmaWxlcyBjaGFuZ2VkLCAxMzUgaW5zZXJ0aW9ucygrKSwgMTk1IGRlbGV0aW9ucygt KQoKZGlmZiAtLWdpdCBhL2dudS9wYWNrYWdlcy9ub2RlLXh5ei5zY20gYi9nbnUvcGFja2FnZXMv bm9kZS14eXouc2NtCmluZGV4IGNmNmY1MGUzY2UuLmRlY2ZiNTBhNjYgMTAwNjQ0Ci0tLSBhL2du dS9wYWNrYWdlcy9ub2RlLXh5ei5zY20KKysrIGIvZ251L3BhY2thZ2VzL25vZGUteHl6LnNjbQpA QCAtNyw2ICs3LDcgQEAKIDs7OyBDb3B5cmlnaHQgwqkgMjAyMSBEaHJ1dmluIEdhbmRoaSA8Y29u dGFjdEBkaHJ1dmluLmRldj4KIDs7OyBDb3B5cmlnaHQgwqkgMjAyMiBOaWNvbGFzIEdyYXZlcyA8 bmdyYXZlc0BuZ3JhdmVzLmZyPgogOzs7IENvcHlyaWdodCDCqSAyMDIzIEplbGxlIExpY2h0IDxq bGljaHRAZnNmZS5vcmc+Cis7OzsgQ29weXJpZ2h0IMKpIDIwMjQgRGFuaWVsIEtob2RhYmFraHNo IDxkLmtob2RhYmFraHNoQGdtYWlsLmNvbT4KIDs7OwogOzs7IFRoaXMgZmlsZSBpcyBwYXJ0IG9m IEdOVSBHdWl4LgogOzs7CkBAIC0yNCwxNCArMjUsMTQgQEAKIDs7OyBhbG9uZyB3aXRoIEdOVSBH dWl4LiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogCiAoZGVm aW5lLW1vZHVsZSAoZ251IHBhY2thZ2VzIG5vZGUteHl6KQotICAjOnVzZS1tb2R1bGUgKChndWl4 IGxpY2Vuc2VzKSAjOnByZWZpeCBsaWNlbnNlOikKICAgIzp1c2UtbW9kdWxlIChnbnUgcGFja2Fn ZXMgc3FsaXRlKQogICAjOnVzZS1tb2R1bGUgKGdudSBwYWNrYWdlcyBweXRob24pCiAgICM6dXNl LW1vZHVsZSAoZ251IHBhY2thZ2VzIHdlYikKKyAgIzp1c2UtbW9kdWxlIChndWl4IGJ1aWxkLXN5 c3RlbSBub2RlKQogICAjOnVzZS1tb2R1bGUgKGd1aXggZ2V4cCkKLSAgIzp1c2UtbW9kdWxlIChn dWl4IHBhY2thZ2VzKQogICAjOnVzZS1tb2R1bGUgKGd1aXggZ2l0LWRvd25sb2FkKQotICAjOnVz ZS1tb2R1bGUgKGd1aXggYnVpbGQtc3lzdGVtIG5vZGUpKQorICAjOnVzZS1tb2R1bGUgKChndWl4 IGxpY2Vuc2VzKSAjOnByZWZpeCBsaWNlbnNlOikKKyAgIzp1c2UtbW9kdWxlIChndWl4IHBhY2th Z2VzKSkKIAogOzs7CiA7OzsgUGxlYXNlOiBUcnkgdG8gYWRkIG5ldyBtb2R1bGUgcGFja2FnZXMg aW4gYWxwaGFiZXRpYyBvcmRlci4KQEAgLTY5LDE5ICs3MCwxNyBAQCAoZGVmaW5lLXB1YmxpYyBu b2RlLWFjb3JuCiAgICAgICAgICAgICAgOzsgaXQgd291bGQgdHJ5IHRvIHVzZSB0aGUgYnVpbGQg ZW52aXJvbm1lbnQgYW5kIHdvdWxkIGJsb2NrIHRoZQogICAgICAgICAgICAgIDs7IGF1dG9tYXRp YyBidWlsZGluZyBieSBvdGhlciBwYWNrYWdlcyBtYWtpbmcgdXNlIG9mIG5vZGUtYWNvcm4uCiAg ICAgICAgICAgICAgOzsgVE9ETzogQWRkIHV0aWxpdHkgZnVuY3Rpb24KLSAgICAgICAgICAgICAo d2l0aC1hdG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50ICJwYWNrYWdlLmpzb24iCi0gICAgICAg ICAgICAgICAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICgoJ0AgLiBwa2ctbWV0YS1h bGlzdCkKLSAgICAgICAgICAgICAgICAgIChjb25zICdAIChtYXAgKG1hdGNoLWxhbWJkYQotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoInNjcmlwdHMiIEAgLiBzY3JpcHRzLWFs aXN0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgKCJzY3JpcHRzIiBAICxA KGZpbHRlciAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgicHJlcGFyZSIgLiBfKQotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZikKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAoXwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAjdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHNjcmlwdHMtYWxpc3QpKSkKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAob3RoZXIgb3RoZXIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBwa2ctbWV0YS1hbGlzdCkpKSkpKSkKKyAgICAgICAgICAgICAod2l0aC1hdG9taWMtanNv bi1maWxlLXJlcGxhY2VtZW50IChsYW1iZGEgKHBrZy1tZXRhLWFsaXN0KQorICAgICAgICAgICAg ICAgKG1hcAorICAgICAgICAgICAgICAgICAobWF0Y2gtbGFtYmRhCisgICAgICAgICAgICAgICAg ICAgKCgic2NyaXB0cyIgLiBzY3JpcHRzLWFsaXN0KQorICAgICAgICAgICAgICAgICAgICAgKGNv bnMgInNjcmlwdHMiIChmaWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJk YQorICAgICAgICAgICAgICAgICAgICAgICAgICgoInByZXBhcmUiIC4gXykgI2YpCisgICAgICAg ICAgICAgICAgICAgICAgICAgKF8gI3QpKQorICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRz LWFsaXN0KSkpCisgICAgICAgICAgICAgICAgICAgKG90aGVyIG90aGVyKSkKKyAgICAgICAgICAg ICAgICAgcGtnLW1ldGEtYWxpc3QpKSkpKQogICAgICAgICAgKHJlcGxhY2UgJ2J1aWxkCiAgICAg ICAgICAgIChsYW1iZGEqICgjOmtleSBpbnB1dHMgbmF0aXZlLWlucHV0cyAjOmFsbG93LW90aGVy LWtleXMpCiAgICAgICAgICAgICAgKGxldCAoKGVzYnVpbGQgKHNlYXJjaC1pbnB1dC1maWxlIChv ciBuYXRpdmUtaW5wdXRzIGlucHV0cykKQEAgLTE1NiwyMyArMTU1LDE3IEBAIChkZWZpbmUtcHVi bGljIG5vZGUtYWRkb24tYXBpCiAgICAgICAgICAgIChsYW1iZGEgYXJncwogICAgICAgICAgICAg IChkZWZpbmUgbmV3LXRlc3Qtc2NyaXB0CiAgICAgICAgICAgICAgICAiZWNobyBzdG9wcGluZyBh ZnRlciBwcmV0ZXN0IG9uIEd1aXgiKQotICAgICAgICAgICAgICh3aXRoLWF0b21pYy1qc29uLWZp bGUtcmVwbGFjZW1lbnQgInBhY2thZ2UuanNvbiIKLSAgICAgICAgICAgICAgIChtYXRjaC1sYW1i ZGEKLSAgICAgICAgICAgICAgICAgKCgnQCAuIHBrZy1tZXRhLWFsaXN0KQotICAgICAgICAgICAg ICAgICAgKGNvbnMKLSAgICAgICAgICAgICAgICAgICAnQAotICAgICAgICAgICAgICAgICAgICht YXAgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAgICAgICAgICAoKCJzY3JpcHRzIiAn QCAuIHNjcmlwdHMtYWxpc3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBgKCJzY3JpcHRz IiBAICxAKG1hcCAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICgoInRlc3QiIC4gXykKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zICJ0ZXN0IgotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3LXRlc3Qtc2NyaXB0 KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG90 aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBv dGhlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz Y3JpcHRzLWFsaXN0KSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChvdGhlcgotICAgICAg ICAgICAgICAgICAgICAgICAgICAgb3RoZXIpKQotICAgICAgICAgICAgICAgICAgICAgICAgcGtn LW1ldGEtYWxpc3QpKSkpKSkpKSkpCisgICAgICAgICAgICAgKHdpdGgtYXRvbWljLWpzb24tZmls ZS1yZXBsYWNlbWVudCAobGFtYmRhIChwa2ctbWV0YS1hbGlzdCkKKyAgICAgICAgICAgICAgICht YXAKKyAgICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQorICAgICAgICAgICAgICAgICAgICgo InNjcmlwdHMiIC4gc2NyaXB0cy1hbGlzdCkKKyAgICAgICAgICAgICAgICAgICAgIChjb25zICJz Y3JpcHRzIiAobWFwCisgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEKKyAgICAg ICAgICAgICAgICAgICAgICAgICAoKCJ0ZXN0IiAuIF8pIChjb25zICJ0ZXN0IiBuZXctdGVzdC1z Y3JpcHQpKQorICAgICAgICAgICAgICAgICAgICAgICAgIChvdGhlciBvdGhlcikpCisgICAgICAg ICAgICAgICAgICAgICAgIHNjcmlwdHMtYWxpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAob3Ro ZXIgb3RoZXIpKQorICAgICAgICAgICAgICAgICBwa2ctbWV0YS1hbGlzdCkpKSkpKSkpCiAgICAg KGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlLWFkZG9uLWFwaSIpCiAg ICAgKHN5bm9wc2lzICJOb2RlLmpzIEFQSSAoTm9kZS1BUEkpIGhlYWRlci1vbmx5IEMrKyB3cmFw cGVycyIpCiAgICAgKGRlc2NyaXB0aW9uICJUaGlzIG1vZHVsZSBjb250YWlucyBoZWFkZXItb25s eSBDKysgd3JhcHBlciBjbGFzc2VzIHdoaWNoCkBAIC0xMjIxLDIyICsxMjE0LDE5IEBAIChkZWZp bmUtcHVibGljIG5vZGUtc2VyaWFscG9ydC1iaW5kaW5ncwogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIm5vZGUtYWJpIikpKSkKICAgICAgICAgIChhZGQtYWZ0ZXIgJ2NoZGly ICdhdm9pZC1wcmVidWlsZC1pbnN0YWxsCiAgICAgICAgICAgIChsYW1iZGEgYXJncwotICAgICAg ICAgICAgICh3aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQgInBhY2thZ2UuanNvbiIK LSAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgKCgnQCAuIHBr Zy1tZXRhLWFsaXN0KQotICAgICAgICAgICAgICAgICAgKGNvbnMgJ0AgKG1hcCAobWF0Y2gtbGFt YmRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgic2NyaXB0cyIgQCAuIHNj cmlwdHMtYWxpc3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAoInNjcmlw dHMiIEAgLEAoZmlsdGVyIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCJpbnN0YWxsIiAuIF8pCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICNmKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIChfCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0cy1hbGlzdCkpKQotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICgoImd5cGZpbGUiIC4gXykKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgJygiZ3lwZmlsZSIgLiAjZikpCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKG90aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IG90aGVyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtnLW1ldGEtYWxpc3Qp KSkpKSkpKQorICAgICAgICAgICAgICh3aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQg KGxhbWJkYSAocGtnLW1ldGEtYWxpc3QpCisgICAgICAgICAgICAgICAobWFwCisgICAgICAgICAg ICAgICAgIChtYXRjaC1sYW1iZGEKKyAgICAgICAgICAgICAgICAgICAoKCJzY3JpcHRzIiAuIHNj cmlwdHMtYWxpc3QpCisgICAgICAgICAgICAgICAgICAgICAoY29ucyAic2NyaXB0cyIgKGZpbHRl cgorICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2gtbGFtYmRhCisgICAgICAgICAgICAgICAg ICAgICAgICAgKCgiaW5zdGFsbCIgLiBfKSAjZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAo XyAjdCkpCisgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdHMtYWxpc3QpKSkKKyAgICAgICAg ICAgICAgICAgICAoKCJneXBmaWxlIiAuIF8pCisgICAgICAgICAgICAgICAgICAgICAoY29ucyAi Z3lwZmlsZSIgI2YpKQorICAgICAgICAgICAgICAgICAgIChvdGhlciBvdGhlcikpCisgICAgICAg ICAgICAgICAgIHBrZy1tZXRhLWFsaXN0KSkpKSkpCiAgICAgICAgIzp0ZXN0cz8gI2YpKQogICAg IChzeW5vcHNpcyAiQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgTm9kZSBTZXJpYWxQb3J0IGJpbmRp bmdzIikKICAgICAoZGVzY3JpcHRpb24gIk5vZGUgU2VyaWFsUG9ydCBpcyBhIG1vZHVsYXIgc3Vp dGUgb2YgTm9kZS5qcyBwYWNrYWdlcyBmb3IKQEAgLTE1MjIsMzkgKzE1MTIsMzMgQEAgKGRlZmlu ZS1wdWJsaWMgbm9kZS1zcWxpdGUzCiAgICAgICAgICAgICAgKHN1YnN0aXR1dGUqICIubnBtaWdu b3JlIgogICAgICAgICAgICAgICAgKCgibGliL2JpbmRpbmciKQogICAgICAgICAgICAgICAgICIj bGliL2JpbmRpbmcgIyA8LSBwYXRjaGVkIGZvciBHdWl4IikpCi0gICAgICAgICAgICAgKHdpdGgt YXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCAicGFja2FnZS5qc29uIgotICAgICAgICAgICAg ICAgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAoKCdAIC4gcGtnLW1ldGEtYWxpc3Qp Ci0gICAgICAgICAgICAgICAgICAobWF0Y2ggKGFzc29jLXJlZiBwa2ctbWV0YS1hbGlzdCAiYmlu YXJ5IikKLSAgICAgICAgICAgICAgICAgICAgKCgnQCAuIGJpbmFyeS1hbGlzdCkKLSAgICAgICAg ICAgICAgICAgICAgIDs7IFdoZW4gaXQgYnVpbGRzIGZyb20gc291cmNlLCBub2RlLXByZS1neXAg c3VwcGxpZXMKLSAgICAgICAgICAgICAgICAgICAgIDs7IG1vZHVsZV9uYW1lIGFuZCBtb2R1bGVf cGF0aCBiYXNlZCBvbiB0aGUgZW50cmllcyB1bmRlcgotICAgICAgICAgICAgICAgICAgICAgOzsg ImJpbmFyeSIgZnJvbSAicGFja2FnZS5qc29uIiwgc28gdGhpcyBwYWNrYWdlJ3MKLSAgICAgICAg ICAgICAgICAgICAgIDs7ICJiaW5kaW5nLmd5cCIgZG9lc24ndCBkZWZpbmUgdGhlbS4gVGh1cywg d2UgYWxzbyBuZWVkCi0gICAgICAgICAgICAgICAgICAgICA7OyB0byBzdXBwbHkgdGhlbS4gVGhl IEdZUF9ERUZJTkVTIGVudmlyb25tZW50IHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgICAgICA7 OyB0dXJucyBvdXQgdG8gYmUgdGhlIGVhc2llc3Qgd2F5IHRvIG1ha2Ugc3VyZSB0aGV5IGFyZQot ICAgICAgICAgICAgICAgICAgICAgOzsgcHJvcGFnYXRlZCBmcm9tIG5wbSB0byBub2RlLWd5cCB0 byBneXAuCi0gICAgICAgICAgICAgICAgICAgICAoc2V0ZW52ICJHWVBfREVGSU5FUyIKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZy1hcHBlbmQKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICJtb2R1bGVfbmFtZT0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAoYXNzb2MtcmVmIGJpbmFyeS1hbGlzdCAibW9kdWxlX25hbWUiKQotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kdWxl X3BhdGg9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFzc29jLXJlZiBiaW5hcnkt YWxpc3QgIm1vZHVsZV9wYXRoIikpKSkpCi0gICAgICAgICAgICAgICAgICA7OyBXZSBuZWVkIHRv IHJlbW92ZSB0aGUgaW5zdGFsbCBzY3JpcHQgZnJvbSAicGFja2FnZS5qc29uIiwKLSAgICAgICAg ICAgICAgICAgIDs7IGFzIGl0IHdvdWxkIHRyeSB0byB1c2Ugbm9kZS1wcmUtZ3lwIGFuZCB3b3Vs ZCBibG9jayB0aGUKLSAgICAgICAgICAgICAgICAgIDs7IGF1dG9tYXRpYyBidWlsZGluZyBwZXJm b3JtZWQgYnkgYG5wbSBpbnN0YWxsYC4KLSAgICAgICAgICAgICAgICAgIChjb25zICdAIChtYXAg KG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoInNjcmlw dHMiIEAgLiBzY3JpcHRzLWFsaXN0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBgKCJzY3JpcHRzIiBAICxAKGZpbHRlciAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgiaW5zdGFsbCIg LiBfKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAjZikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAoXwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdCkpCi0gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdHMtYWxpc3QpKSkKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3RoZXIKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgb3RoZXIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBwa2ctbWV0YS1hbGlzdCkpKSkpKSkpKSkKKyAgICAgICAgICAgICAod2l0aC1hdG9taWMtanNv bi1maWxlLXJlcGxhY2VtZW50IChsYW1iZGEgKHBrZy1tZXRhLWFsaXN0KQorICAgICAgICAgICAg ICAgKGxldCAoKGJpbmFyeS1hbGlzdCAoYXNzb2MtcmVmIHBrZy1tZXRhLWFsaXN0ICJiaW5hcnki KSkpCisgICAgICAgICAgICAgICAgIDs7IFdoZW4gaXQgYnVpbGRzIGZyb20gc291cmNlLCBub2Rl LXByZS1neXAgc3VwcGxpZXMKKyAgICAgICAgICAgICAgICAgOzsgbW9kdWxlX25hbWUgYW5kIG1v ZHVsZV9wYXRoIGJhc2VkIG9uIHRoZSBlbnRyaWVzIHVuZGVyCisgICAgICAgICAgICAgICAgIDs7 ICJiaW5hcnkiIGZyb20gInBhY2thZ2UuanNvbiIsIHNvIHRoaXMgcGFja2FnZSdzCisgICAgICAg ICAgICAgICAgIDs7ICJiaW5kaW5nLmd5cCIgZG9lc24ndCBkZWZpbmUgdGhlbS4gVGh1cywgd2Ug YWxzbyBuZWVkCisgICAgICAgICAgICAgICAgIDs7IHRvIHN1cHBseSB0aGVtLiBUaGUgR1lQX0RF RklORVMgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgOzsgdHVybnMgb3V0 IHRvIGJlIHRoZSBlYXNpZXN0IHdheSB0byBtYWtlIHN1cmUgdGhleSBhcmUKKyAgICAgICAgICAg ICAgICAgOzsgcHJvcGFnYXRlZCBmcm9tIG5wbSB0byBub2RlLWd5cCB0byBneXAuCisgICAgICAg ICAgICAgICAgIChzZXRlbnYgIkdZUF9ERUZJTkVTIiAoc3RyaW5nLWFwcGVuZAorICAgICAgICAg ICAgICAgICAgICJtb2R1bGVfbmFtZT0iCisgICAgICAgICAgICAgICAgICAgKGFzc29jLXJlZiBi aW5hcnktYWxpc3QgIm1vZHVsZV9uYW1lIikKKyAgICAgICAgICAgICAgICAgICAiIG1vZHVsZV9w YXRoPSIKKyAgICAgICAgICAgICAgICAgICAoYXNzb2MtcmVmIGJpbmFyeS1hbGlzdCAibW9kdWxl X3BhdGgiKSkpKQorICAgICAgICAgICAgICAgOzsgV2UgbmVlZCB0byByZW1vdmUgdGhlIGluc3Rh bGwgc2NyaXB0IGZyb20gInBhY2thZ2UuanNvbiIsCisgICAgICAgICAgICAgICA7OyBhcyBpdCB3 b3VsZCB0cnkgdG8gdXNlIG5vZGUtcHJlLWd5cCBhbmQgd291bGQgYmxvY2sgdGhlCisgICAgICAg ICAgICAgICA7OyBhdXRvbWF0aWMgYnVpbGRpbmcgcGVyZm9ybWVkIGJ5IGBucG0gaW5zdGFsbGAu CisgICAgICAgICAgICAgICAobWFwCisgICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEKKyAg ICAgICAgICAgICAgICAgICAoKCJzY3JpcHRzIiAuIHNjcmlwdHMtYWxpc3QpCisgICAgICAgICAg ICAgICAgICAgICAoY29ucyAic2NyaXB0cyIgKGZpbHRlcgorICAgICAgICAgICAgICAgICAgICAg ICAobWF0Y2gtbGFtYmRhCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgiaW5zdGFsbCIgLiBf KSAjZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAoXyAjdCkpCisgICAgICAgICAgICAgICAg ICAgICAgIHNjcmlwdHMtYWxpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAob3RoZXIgb3RoZXIp KQorICAgICAgICAgICAgICAgICBwa2ctbWV0YS1hbGlzdCkpKSkpKSkpCiAgICAgKGhvbWUtcGFn ZSAiaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9ub2RlLXNxbGl0ZTMiKQogICAgIChzeW5vcHNp cyAiTm9kZS5qcyBiaW5kaW5ncyBmb3IgU1FMaXRlMyIpCiAgICAgKGRlc2NyaXB0aW9uCmRpZmYg LS1naXQgYS9ndWl4L2J1aWxkLXN5c3RlbS9ub2RlLnNjbSBiL2d1aXgvYnVpbGQtc3lzdGVtL25v ZGUuc2NtCmluZGV4IDU3ZmU1ZjYwMzAuLjQyNWI4Y2Q5YjMgMTAwNjQ0Ci0tLSBhL2d1aXgvYnVp bGQtc3lzdGVtL25vZGUuc2NtCisrKyBiL2d1aXgvYnVpbGQtc3lzdGVtL25vZGUuc2NtCkBAIC00 LDYgKzQsNyBAQAogOzs7IENvcHlyaWdodCDCqSAyMDIxIEx1ZG92aWMgQ291cnTDqHMgPGx1ZG9A Z251Lm9yZz4KIDs7OyBDb3B5cmlnaHQgwqkgMjAyMSBQaWVycmUgTGFuZ2xvaXMgPHBpZXJyZS5s YW5nbG9pc0BnbXguY29tPgogOzs7IENvcHlyaWdodCDCqSAyMDIxIFBoaWxpcCBNY0dyYXRoIDxw aGlsaXBAcGhpbGlwbWNncmF0aC5jb20+Cis7OzsgQ29weXJpZ2h0IMKpIDIwMjQgRGFuaWVsIEto b2RhYmFraHNoIDxkLmtob2RhYmFraHNoQGdtYWlsLmNvbT4KIDs7OwogOzs7IFRoaXMgZmlsZSBp cyBwYXJ0IG9mIEdOVSBHdWl4LgogOzs7CkBAIC0zNiw3ICszNywxMCBAQCAoZGVmaW5lLW1vZHVs ZSAoZ3VpeCBidWlsZC1zeXN0ZW0gbm9kZSkKIChkZWZpbmUgJW5vZGUtYnVpbGQtc3lzdGVtLW1v ZHVsZXMKICAgOzsgQnVpbGQtc2lkZSBtb2R1bGVzIGltcG9ydGVkIGJ5IGRlZmF1bHQuCiAgIGAo KGd1aXggYnVpbGQgbm9kZS1idWlsZC1zeXN0ZW0pCi0gICAgKGd1aXggYnVpbGQganNvbikKKyAg ICAoanNvbikKKyAgICAoanNvbiBidWlsZGVyKQorICAgIChqc29uIHBhcnNlcikKKyAgICAoanNv biByZWNvcmQpCiAgICAgLEAlZGVmYXVsdC1nbnUtaW1wb3J0ZWQtbW9kdWxlcykpCiAKIChkZWZp bmUgKGRlZmF1bHQtbm9kZSkKZGlmZiAtLWdpdCBhL2d1aXgvYnVpbGQvbm9kZS1idWlsZC1zeXN0 ZW0uc2NtIGIvZ3VpeC9idWlsZC9ub2RlLWJ1aWxkLXN5c3RlbS5zY20KaW5kZXggZmIyMzg5NGJj MS4uZWYwZjg4YTVhNyAxMDA2NDQKLS0tIGEvZ3VpeC9idWlsZC9ub2RlLWJ1aWxkLXN5c3RlbS5z Y20KKysrIGIvZ3VpeC9idWlsZC9ub2RlLWJ1aWxkLXN5c3RlbS5zY20KQEAgLTQsNiArNCw3IEBA CiA7OzsgQ29weXJpZ2h0IMKpIDIwMTksIDIwMjEgVGltb3RoeSBTYW1wbGUgPHNhbXBsZXRAbmd5 cm8uY29tPgogOzs7IENvcHlyaWdodCDCqSAyMDIxLCAyMDIyIFBoaWxpcCBNY0dyYXRoIDxwaGls aXBAcGhpbGlwbWNncmF0aC5jb20+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMjIgTGlsaWFuYSBNYXJp ZSBQcmlrbGVyIDxsaWxpYW5hLnByaWtsZXJAZ21haWwuY29tPgorOzs7IENvcHlyaWdodCDCqSAy MDI0IERhbmllbCBLaG9kYWJha2hzaCA8ZC5raG9kYWJha2hzaEBnbWFpbC5jb20+CiA7OzsKIDs7 OyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgR3VpeC4KIDs7OwpAQCAtMjMsMTAgKzI0LDEwIEBA CiAoZGVmaW5lLW1vZHVsZSAoZ3VpeCBidWlsZCBub2RlLWJ1aWxkLXN5c3RlbSkKICAgIzp1c2Ut bW9kdWxlICgoZ3VpeCBidWlsZCBnbnUtYnVpbGQtc3lzdGVtKSAjOnByZWZpeCBnbnU6KQogICAj OnVzZS1tb2R1bGUgKGd1aXggYnVpbGQgdXRpbHMpCi0gICM6dXNlLW1vZHVsZSAoZ3VpeCBidWls ZCBqc29uKQogICAjOnVzZS1tb2R1bGUgKGljZS05IGZ0dykKICAgIzp1c2UtbW9kdWxlIChpY2Ut OSByZWdleCkKICAgIzp1c2UtbW9kdWxlIChpY2UtOSBtYXRjaCkKKyAgIzp1c2UtbW9kdWxlIChq c29uKQogICAjOnVzZS1tb2R1bGUgKHNyZmkgc3JmaS0xKQogICAjOnVzZS1tb2R1bGUgKHNyZmkg c3JmaS03MSkKICAgIzpleHBvcnQgKCVzdGFuZGFyZC1waGFzZXMKQEAgLTM0LDEzICszNSwxMyBA QCAoZGVmaW5lLW1vZHVsZSAoZ3VpeCBidWlsZCBub2RlLWJ1aWxkLXN5c3RlbSkKICAgICAgICAg ICAgIGRlbGV0ZS1kZXBlbmRlbmNpZXMKICAgICAgICAgICAgIG5vZGUtYnVpbGQpKQogCi0oZGVm aW5lICh3aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQgZmlsZSBwcm9jKQorKGRlZmlu ZSogKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCBwcm9jICM6b3B0aW9uYWwgKGZp bGUgInBhY2thZ2UuanNvbiIpKQogICAiTGlrZSAnd2l0aC1hdG9taWMtZmlsZS1yZXBsYWNlbWVu dCcsIGJ1dCBQUk9DIGlzIGNhbGxlZCB3aXRoIGEgc2luZ2xlCiBhcmd1bWVudC0tLXRoZSByZXN1 bHQgb2YgcGFyc2luZyBGSUxFJ3MgY29udGVudHMgYXMganNvbi0tLWFuZCBzaG91bGQgYSB2YWx1 ZQogdG8gYmUgd3JpdHRlbiBhcyBqc29uIHRvIHRoZSByZXBsYWNlbWVudCBGSUxFLiIKICAgKHdp dGgtYXRvbWljLWZpbGUtcmVwbGFjZW1lbnQgZmlsZQogICAgIChsYW1iZGEgKGluIG91dCkKLSAg ICAgICh3cml0ZS1qc29uIChwcm9jIChyZWFkLWpzb24gaW4pKSBvdXQpKSkpCisgICAgICAoc2Nt LT5qc29uIChwcm9jIChqc29uLT5zY20gaW4pKSBvdXQpKSkpCiAKIChkZWZpbmUqIChhc3NvYy1y ZWYqIGFsaXN0IGtleSAjOm9wdGlvbmFsIGRlZmF1bHQpCiAgICJMaWtlIGFzc29jLXJlZiwgYnV0 IHJldHVybiBERUZBVUxUIGluc3RlYWQgb2YgI2YgaWYgbm8gdmFsdWUgZXhpc3RzLiIKQEAgLTQ4 LDEwICs0OSw2IEBAIChkZWZpbmUqIChhc3NvYy1yZWYqIGFsaXN0IGtleSAjOm9wdGlvbmFsIGRl ZmF1bHQpCiAgICAgKCNmIGRlZmF1bHQpCiAgICAgKChfIC4gdmFsdWUpIHZhbHVlKSkpCiAKLShk ZWZpbmUqIChqc29iamVjdC1yZWYgb2JqIGtleSAjOm9wdGlvbmFsIGRlZmF1bHQpCi0gIChtYXRj aCBvYmoKLSAgICAoKCdAIC4gYWxpc3QpIChhc3NvYy1yZWYqIGFsaXN0IGtleSBkZWZhdWx0KSkp KQotCiAoZGVmaW5lKiAoYWxpc3QtcG9wIGFsaXN0IGtleSAjOm9wdGlvbmFsICg9IGVxdWFsPykp CiAgICJSZXR1cm4gdHdvIHZhbHVlcywgdGhlIGZpcnN0IHBhaXIgaW4gQUxJU1Qgd2l0aCBrZXkg S0VZLCBhbmQgdGhlIG90aGVyCiBlbGVtZW50cy4gIEVxdWFsaXR5IGNhbGxzIGFyZSBtYWRlIGFz ICg9IEtFWSBBTElTVENBUikuIgpAQCAtNjMsNjcgKzYwLDE3IEBAIChkZWZpbmUqIChhbGlzdC1w b3AgYWxpc3Qga2V5ICM6b3B0aW9uYWwgKD0gZXF1YWw/KSkKICAgICAgICAgKHZhbHVlcyAoY2Fy IGFmdGVyKSAoYXBwZW5kIGJlZm9yZSAoY2RyIGFmdGVyKSkpCiAgICAgICAgICh2YWx1ZXMgI2Yg YmVmb3JlKSkpKQogCi0oZGVmaW5lKiAoYWxpc3QtdXBkYXRlIGFsaXN0IGtleSBwcm9jICM6b3B0 aW9uYWwgZGVmYXVsdCAoPSBlcXVhbD8pKQorKGRlZmluZSogKGFsaXN0LXVwZGF0ZSBhbGlzdCBr ZXkgcHJvYyAjOm9wdGlvbmFsICg9IGVxdWFsPykpCiAgICJSZXR1cm4gYW4gYXNzb2NpYXRpb24g bGlzdCBsaWtlIEFMSVNULCBidXQgd2l0aCBLRVkgbWFwcGVkIHRvIHRoZSByZXN1bHQgb2YKIFBS T0MgYXBwbGllZCB0byB0aGUgZmlyc3QgdmFsdWUgZm91bmQgdW5kZXIgdGhlIGNvbXBhcmlzb24g KD0gS0VZIEFMSVNUQ0FSKS4KLUlmIG5vIHN1Y2ggdmFsdWUgZXhpc3RzLCB1c2UgREVGQVVMVCBp bnN0ZWFkLgorSWYgbm8gc3VjaCB2YWx1ZSBleGlzdHMsIHJldHVybiB0aGUgbGlzdCB1bmNoYW5n ZWQuCiBVbmxpa2UgYWNvbnMsIHRoaXMgcmVtb3ZlcyB0aGUgcHJldmlvdXMgYXNzb2NpYXRpb24g b2YgS0VZIChhc3N1bWluZyBpdCBpcwogdW5pcXVlKSwgYnV0IHRoZSByZXN1bHQgbWF5IHN0aWxs IHNoYXJlIHN0b3JhZ2Ugd2l0aCBBTElTVC4iCiAgIChsZXQgKChwYWlyIHJlc3QgKGFsaXN0LXBv cCBhbGlzdCBrZXkgPSkpKQotICAgIChhY29ucyBrZXkKLSAgICAgICAgICAgKHByb2MgKGlmIChw YWlyPyBwYWlyKQotICAgICAgICAgICAgICAgICAgICAgKGNkciBwYWlyKQotICAgICAgICAgICAg ICAgICAgICAgZGVmYXVsdCkpCi0gICAgICAgICAgIHJlc3QpKSkKLQotKGRlZmluZSAoanNvYmpl Y3QtdXBkYXRlKiBqcyAuIHVwZGF0ZXMpCi0gICJSZXR1cm4gYSBqc29uIG9iamVjdCBsaWtlIEpT LCBidXQgd2l0aCBhbGwgVVBEQVRFUyBhcHBsaWVkLiAgRWFjaCB1cGRhdGUgaXMKLWEgbGlzdCAo S0VZIFBST0MgW0RFRkFVTFRdKSwgc28gdGhhdCBLRVkgaXMgbWFwcGVkIHRvIHRoZSByZXN1bHQg b2YgUFJPQwotYXBwbGllZCB0byB0aGUgdmFsdWUgdG8gd2hpY2ggS0VZIGlzIG1hcHBlZCBpbiBK Uy4gIElmIG5vIHN1Y2ggbWFwcGluZyBleGlzdHMsCi1QUk9DIGlzIGluc3RlYWQgYXBwbGllZCB0 byBERUZBVUxULCBvciB0byAnI2YnIGlzIG5vIERFRkFVTFQgaXMgc3BlY2lmaWVkLgotVGhlIHVw ZGF0ZSB0YWtlcyBwbGFjZSBmcm9tIGxlZnQgdG8gcmlnaHQsIHNvIGxhdGVyIFVQREFURVJzIHdp bGwgcmVjZWl2ZSB0aGUKLXZhbHVlcyByZXR1cm5lZCBieSBlYXJsaWVyIFVQREFURVJzIGZvciB0 aGUgc2FtZSBLRVkuIgotICAobWF0Y2gganMKLSAgICAoKCdAIC4gYWxpc3QpCi0gICAgIChsZXQg bG9vcCAoKGFsaXN0IGFsaXN0KQotICAgICAgICAgICAgICAgICh1cGRhdGVzIHVwZGF0ZXMpKQot ICAgICAgIChtYXRjaCB1cGRhdGVzCi0gICAgICAgICAoKCkgKGNvbnMgJ0AgYWxpc3QpKQotICAg ICAgICAgKCgoa2V5IHByb2MpIC4gdXBkYXRlcykKLSAgICAgICAgICAobG9vcCAoYWxpc3QtdXBk YXRlIGFsaXN0IGtleSBwcm9jICNmIGVxdWFsPykgdXBkYXRlcykpCi0gICAgICAgICAoKChrZXkg cHJvYyBkZWZhdWx0KSAuIHVwZGF0ZXMpCi0gICAgICAgICAgKGxvb3AgKGFsaXN0LXVwZGF0ZSBh bGlzdCBrZXkgcHJvYyBkZWZhdWx0IGVxdWFsPykgdXBkYXRlcykpKSkpKSkKLQotKGRlZmluZSAo anNvYmplY3QtdW5pb24gY29tYmluZSBzZWVkIC4gb2JqZWN0cykKLSAgIk1lcmdlIE9CSkVDVFMg aW50byBTRUVEIGJ5IGFwcGx5aW5nIChDT01CSU5FIEtFWSBWQUwwIFZBTCksIHdoZXJlIFZBTDAK LWlzIHRoZSB2YWx1ZSBmb3VuZCBpbiB0aGUgKHBvc3NpYmx5IHVwZGF0ZWQpIFNFRUQgYW5kIFZB TCBpcyB0aGUgbmV3IHZhbHVlCi1mb3VuZCBpbiBvbmUgb2YgdGhlIE9CSkVDVFMuIgotICAobWF0 Y2ggc2VlZAotICAgICgoJ0AgLiBhc2VlZCkKLSAgICAgKG1hdGNoIG9iamVjdHMKLSAgICAgICAo KCkgc2VlZCkKLSAgICAgICAoKCgnQCAuIGFsaXN0cykgLi4uKQotICAgICAgICAoY29ucwotICAg ICAgICAgJ0AKLSAgICAgICAgIChmb2xkIChsYW1iZGEgKGFsaXN0IGFzZWVkKQotICAgICAgICAg ICAgICAgICAoaWYgKG51bGw/IGFzZWVkKSBhbGlzdAotICAgICAgICAgICAgICAgICAgICAgKGZv bGQKLSAgICAgICAgICAgICAgICAgICAgICAobWF0Y2gtbGFtYmRhKgotICAgICAgICAgICAgICAg ICAgICAgICAgKCgoayAuIHYpIGFzZWVkKQotICAgICAgICAgICAgICAgICAgICAgICAgIChsZXQg KChwYWlyIHRhaWwgKGFsaXN0LXBvcCBhbGlzdCBrKSkpCi0gICAgICAgICAgICAgICAgICAgICAg ICAgICAobWF0Y2ggcGFpcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoI2YgKGFjb25z IGsgdiBhc2VlZCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoXyAuIHYwKSAoYWNv bnMgayAoY29tYmluZSBrIHYwIHYpIGFzZWVkKSkpKSkpCi0gICAgICAgICAgICAgICAgICAgICAg YXNlZWQKLSAgICAgICAgICAgICAgICAgICAgICBhbGlzdCkpKQotICAgICAgICAgICAgICAgYXNl ZWQKLSAgICAgICAgICAgICAgIGFsaXN0cykpKSkpKSkKKyAgICAoaWYgKHBhaXI/IHBhaXIpCisg ICAgICAoYWNvbnMga2V5IChwcm9jIChjZHIgcGFpcikpIHJlc3QpCisgICAgICBhbGlzdCkpKQog Ci07OyBQb3NzaWJseSB1c2VmdWwgaGVscGVyIGZ1bmN0aW9uczoKLTs7IChkZWZpbmUgKG5ld2Vz dCBrZXkgdmFsMCB2YWwpIHZhbCkKLTs7IChkZWZpbmUgKHVua2V5ZWQtPmtleWVkIHByb2MpIChs YW1iZGEgKF9rZXkgdmFsMCB2YWwpIChwcm9jIHZhbDAgdmFsKSkpCi0KLQwKIDs7OwogOzs7IFBo YXNlcy4KIDs7OwpAQCAtMTQyLDggKzg5LDggQEAgKGRlZmluZSAoc2V0LWhvbWUgLiBfKQogCiAo ZGVmaW5lIChtb2R1bGUtbmFtZSBtb2R1bGUpCiAgIChsZXQqICgocGFja2FnZS5qc29uIChzdHJp bmctYXBwZW5kIG1vZHVsZSAiL3BhY2thZ2UuanNvbiIpKQotICAgICAgICAgKHBhY2thZ2UtbWV0 YSAoY2FsbC13aXRoLWlucHV0LWZpbGUgcGFja2FnZS5qc29uIHJlYWQtanNvbikpKQotICAgIChq c29iamVjdC1yZWYgcGFja2FnZS1tZXRhICJuYW1lIikpKQorICAgICAgICAgKHBhY2thZ2UtbWV0 YSAoY2FsbC13aXRoLWlucHV0LWZpbGUgcGFja2FnZS5qc29uIGpzb24tPnNjbSkpKQorICAgIChh c3NvYy1yZWYgcGFja2FnZS1tZXRhICJuYW1lIikpKQogCiAoZGVmaW5lIChpbmRleC1tb2R1bGVz IGlucHV0LXBhdGhzKQogICAoZGVmaW5lIChsaXN0LW1vZHVsZXMgZGlyZWN0b3J5KQpAQCAtMTY3 LDQ5ICsxMTQsNTYgQEAgKGRlZmluZSogKHBhdGNoLWRlcGVuZGVuY2llcyAjOmtleSBpbnB1dHMg IzphbGxvdy1vdGhlci1rZXlzKQogCiAgIChkZWZpbmUgaW5kZXggKGluZGV4LW1vZHVsZXMgKG1h cCBjZHIgaW5wdXRzKSkpCiAKLSAgKGRlZmluZSByZXNvbHZlLWRlcGVuZGVuY2llcwotICAgICht YXRjaC1sYW1iZGEKLSAgICAgICgoJ0AgLiBhbGlzdCkKLSAgICAgICAoY29ucyAnQCAobWFwICht YXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgICAgICAgKChrZXkgLiB2YWx1ZSkKLSAgICAg ICAgICAgICAgICAgICAgICAgIChjb25zIGtleSAoaGFzaC1yZWYgaW5kZXgga2V5IHZhbHVlKSkp KQotICAgICAgICAgICAgICAgICAgICAgYWxpc3QpKSkpKQorICAoZGVmaW5lIChyZXNvbHZlLWRl cGVuZGVuY2llcyBkZXBlbmRlbmNpZXMpCisgICAgKG1hcAorICAgICAgKG1hdGNoLWxhbWJkYQor ICAgICAgICAoKGRlcGVuZGVuY3kgLiB2ZXJzaW9uKQorICAgICAgICAgIChjb25zIGRlcGVuZGVu Y3kgKGhhc2gtcmVmIGluZGV4IGRlcGVuZGVuY3kgdmVyc2lvbikpKSkKKyAgICAgIGRlcGVuZGVu Y2llcykpCiAKLSAgKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCAicGFja2FnZS5q c29uIgorICAod2l0aC1hdG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50CiAgICAgKGxhbWJkYSAo cGtnLW1ldGEpCi0gICAgICAoanNvYmplY3QtdXBkYXRlKgotICAgICAgIHBrZy1tZXRhCi0gICAg ICAgYCgiZGV2RGVwZW5kZW5jaWVzIiAscmVzb2x2ZS1kZXBlbmRlbmNpZXMgKEApKQotICAgICAg IGAoImRlcGVuZGVuY2llcyIgLChsYW1iZGEgKGRlcHMpCi0gICAgICAgICAgICAgICAgICAgICAg ICAgICAocmVzb2x2ZS1kZXBlbmRlbmNpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAo anNvYmplY3QtdW5pb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAoayBh IGIpIGIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqc29iamVjdC1yZWYgcGtnLW1l dGEgInBlZXJEZXBlbmRlbmNpZXMiICcoQCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg IGRlcHMpKSkKLSAgICAgICAgIChAKSkpKSkKKyAgICAgIChmb2xkCisgICAgICAgIChsYW1iZGEg KHByb2MgcGtnLW1ldGEpIChwcm9jIHBrZy1tZXRhKSkKKyAgICAgICAgcGtnLW1ldGEKKyAgICAg ICAgKGxpc3QKKyAgICAgICAgICAobGFtYmRhIChwa2ctbWV0YSkKKyAgICAgICAgICAgIChhbGlz dC11cGRhdGUgcGtnLW1ldGEgImRldkRlcGVuZGVuY2llcyIgcmVzb2x2ZS1kZXBlbmRlbmNpZXMp KQorICAgICAgICAgIChsYW1iZGEgKHBrZy1tZXRhKQorICAgICAgICAgICAgKGFzc29jLXNldCEK KyAgICAgICAgICAgICAgcGtnLW1ldGEKKyAgICAgICAgICAgICAgImRlcGVuZGVuY2llcyIKKyAg ICAgICAgICAgICAgKHJlc29sdmUtZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgOyBDb21i aW5lZCAicGVlckRlcGVuZGVuY2llcyIgYW5kICJkZXBlbmRlbmNpZXMiIGRlcGVuZGVuY2llcwor ICAgICAgICAgICAgICAgIDsgd2l0aCAiZGVwZW5kZW5jaWVzIiB0YWtpbmcgcHJlY2VkZW50Lgor ICAgICAgICAgICAgICAgIChmb2xkCisgICAgICAgICAgICAgICAgICAobGFtYmRhIChkZXBlbmRl bmN5IGRlcGVuZGVuY2llcykKKyAgICAgICAgICAgICAgICAgICAgKGFzc29jLXNldCEgZGVwZW5k ZW5jaWVzIChjYXIgZGVwZW5kZW5jeSkgKGNkciBkZXBlbmRlbmN5KSkpCisgICAgICAgICAgICAg ICAgICAoYXNzb2MtcmVmKiBwa2ctbWV0YSAicGVlckRlcGVuZGVuY2llcyIgJygpKQorICAgICAg ICAgICAgICAgICAgKGFzc29jLXJlZiogcGtnLW1ldGEgImRlcGVuZGVuY2llcyIgJygpKQorICAg ICAgICAgICAgICAgICkpKSkpKSkpCiAgICN0KQogCi0oZGVmaW5lIChkZWxldGUtZGVwZW5kZW5j aWVzIGFic2VudCkKKyhkZWZpbmUgKGRlbGV0ZS1kZXBlbmRlbmNpZXMgZGVwZW5kZW5jaWVzLXRv LXJlbW92ZSkKICAgIlJld3JpdGUgJ3BhY2thZ2UuanNvbicgdG8gYWxsb3cgdGhlIGJ1aWxkIHRv IHByb2NlZWQgd2l0aG91dCBwYWNrYWdlcwotbGlzdGVkIGluIEFCU0VOVCwgYSBsaXN0IG9mIHN0 cmluZ3MgbmFtaW5nIG5wbSBwYWNrYWdlcy4KK2xpc3RlZCBpbiAnZGVwZW5kZW5jaWVzLXRvLXJl bW92ZScsIGEgbGlzdCBvZiBzdHJpbmdzIG5hbWluZyBucG0gcGFja2FnZXMuCiAKIFRvIHByZXZl bnQgdGhlIGRlbGV0ZWQgZGVwZW5kZW5jaWVzIGZyb20gYmVpbmcgcmVpbnRyb2R1Y2VkLCB1c2Ug dGhpcyBmdW5jdGlvbgogb25seSBhZnRlciB0aGUgJ3BhdGNoLWRlcGVuZGVuY2llcycgcGhhc2Uu IgotICAoZGVmaW5lIGRlbGV0ZS1mcm9tLWpzb2JqZWN0Ci0gICAgKG1hdGNoLWxhbWJkYQotICAg ICAgKCgnQCAuIGFsaXN0KQotICAgICAgIChjb25zICdAIChmaWx0ZXIgKG1hdGNoLWxhbWJkYQot ICAgICAgICAgICAgICAgICAgICAgICAgICAoKGsgLiBfKQotICAgICAgICAgICAgICAgICAgICAg ICAgICAgKG5vdCAobWVtYmVyIGsgYWJzZW50KSkpKQotICAgICAgICAgICAgICAgICAgICAgICAg YWxpc3QpKSkpKQotCi0gICh3aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQgInBhY2th Z2UuanNvbiIKKyAgKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudAogICAgIChsYW1i ZGEgKHBrZy1tZXRhKQotICAgICAgKGpzb2JqZWN0LXVwZGF0ZSoKLSAgICAgICBwa2ctbWV0YQot ICAgICAgIGAoImRldkRlcGVuZGVuY2llcyIgLGRlbGV0ZS1mcm9tLWpzb2JqZWN0IChAKSkKLSAg ICAgICBgKCJkZXBlbmRlbmNpZXMiICxkZWxldGUtZnJvbS1qc29iamVjdCAoQCkpCi0gICAgICAg YCgicGVlckRlcGVuZGVuY2llcyIgLGRlbGV0ZS1mcm9tLWpzb2JqZWN0IChAKSkpKSkpCisgICAg ICAoZm9sZAorICAgICAgICAobGFtYmRhIChkZXBlbmRlbmN5LWtleSBwa2ctbWV0YSkKKyAgICAg ICAgICAoYWxpc3QtdXBkYXRlCisgICAgICAgICAgICBwa2ctbWV0YQorICAgICAgICAgICAgZGVw ZW5kZW5jeS1rZXkKKyAgICAgICAgICAgIChsYW1iZGEgKGRlcGVuZGVuY2llcykKKyAgICAgICAg ICAgICAgKHJlbW92ZQorICAgICAgICAgICAgICAgIChsYW1iZGEgKGRlcGVuZGVuY3kpCisgICAg ICAgICAgICAgICAgICAobWVtYmVyIChjYXIgZGVwZW5kZW5jeSkgZGVwZW5kZW5jaWVzLXRvLXJl bW92ZSkpCisgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzKSkpKQorICAgICAgICBwa2ctbWV0 YQorICAgICAgICAobGlzdCAiZGV2RGVwZW5kZW5jaWVzIiAiZGVwZW5kZW5jaWVzIiAicGVlckRl cGVuZGVuY2llcyIgIm9wdGlvbmFsRGVwZW5kZW5jaWVzIikpKSkpCiAKIChkZWZpbmUqIChkZWxl dGUtbG9ja2ZpbGVzICM6a2V5IGlucHV0cyAjOmFsbG93LW90aGVyLWtleXMpCiAgICJEZWxldGUg J3BhY2thZ2UtbG9jay5qc29uJywgJ3lhcm4ubG9jaycsIGFuZCAnbnBtLXNocmlua3dyYXAuanNv bicsIGlmIHRoZXkKQEAgLTIyOCw4ICsxODIsOCBAQCAoZGVmaW5lKiAoY29uZmlndXJlICM6a2V5 IG91dHB1dHMgaW5wdXRzICM6YWxsb3ctb3RoZXIta2V5cykKICAgICAjdCkpCiAKIChkZWZpbmUq IChidWlsZCAjOmtleSBpbnB1dHMgIzphbGxvdy1vdGhlci1rZXlzKQotICAobGV0ICgocGFja2Fn ZS1tZXRhIChjYWxsLXdpdGgtaW5wdXQtZmlsZSAicGFja2FnZS5qc29uIiByZWFkLWpzb24pKSkK LSAgICAoaWYgKGpzb2JqZWN0LXJlZiAoanNvYmplY3QtcmVmIHBhY2thZ2UtbWV0YSAic2NyaXB0 cyIgJyhAKSkgImJ1aWxkIiAjZikKKyAgKGxldCAoKHBhY2thZ2UtbWV0YSAoY2FsbC13aXRoLWlu cHV0LWZpbGUgInBhY2thZ2UuanNvbiIganNvbi0+c2NtKSkpCisgICAgKGlmIChhc3NvYy1yZWYq IChhc3NvYy1yZWYqIHBhY2thZ2UtbWV0YSAic2NyaXB0cyIgJygpKSAiYnVpbGQiICNmKQogICAg ICAgICAobGV0ICgobnBtIChzdHJpbmctYXBwZW5kIChhc3NvYy1yZWYgaW5wdXRzICJub2RlIikg Ii9iaW4vbnBtIikpKQogICAgICAgICAgIChpbnZva2UgbnBtICJydW4iICJidWlsZCIpKQogICAg ICAgICAoZm9ybWF0ICN0ICJ0aGVyZSBpcyBubyBidWlsZCBzY3JpcHQgdG8gcnVufiUiKSkKQEAg LTMwMSwyMiArMjU1LDIwIEBAIChkZWZpbmUqIChhdm9pZC1ub2RlLWd5cC1yZWJ1aWxkICM6a2V5 IG91dHB1dHMgIzphbGxvdy1vdGhlci1rZXlzKQogICA7OyBldmVuIG5lZWQgdG8gb3ZlcndyaXRl IHRoaXMgZmlsZS4gIFRoZXJlZm9yZSwgbGV0J3MgdXNlIHNvbWUgaGVscGVycwogICA7OyB0aGF0 IHdlJ2Qgb3RoZXJ3aXNlIG5vdCBuZWVkLgogICAoZGVmaW5lIHBrZy1tZXRhCi0gICAgKGNhbGwt d2l0aC1pbnB1dC1maWxlIGluc3RhbGxlZC1wYWNrYWdlLmpzb24gcmVhZC1qc29uKSkKKyAgICAo Y2FsbC13aXRoLWlucHV0LWZpbGUgaW5zdGFsbGVkLXBhY2thZ2UuanNvbiBqc29uLT5zY20pKQog ICAoZGVmaW5lIHNjcmlwdHMKLSAgICAoanNvYmplY3QtcmVmIHBrZy1tZXRhICJzY3JpcHRzIiAn KEApKSkKLSAgKGRlZmluZSAoanNvYmplY3Qtc2V0IGpzIGtleSB2YWwpCi0gICAgKGpzb2JqZWN0 LXVwZGF0ZSoganMgKGxpc3Qga2V5IChjb25zdCB2YWwpKSkpCisgICAgKGFzc29jLXJlZiogcGtn LW1ldGEgInNjcmlwdHMiICcoKSkpCiAKLSAgKHdoZW4gKGVxdWFsPyAibm9kZS1neXAgcmVidWls ZCIgKGpzb2JqZWN0LXJlZiBzY3JpcHRzICJpbnN0YWxsIiAjZikpCisgICh3aGVuIChlcXVhbD8g Im5vZGUtZ3lwIHJlYnVpbGQiIChhc3NvYy1yZWYqIHNjcmlwdHMgImluc3RhbGwiICNmKSkKICAg ICAoY2FsbC13aXRoLW91dHB1dC1maWxlIGluc3RhbGxlZC1wYWNrYWdlLmpzb24KICAgICAgIChs YW1iZGEgKG91dCkKLSAgICAgICAgKHdyaXRlLWpzb24KLSAgICAgICAgIChqc29iamVjdC1zZXQg cGtnLW1ldGEKLSAgICAgICAgICAgICAgICAgICAgICAgInNjcmlwdHMiCi0gICAgICAgICAgICAg ICAgICAgICAgIChqc29iamVjdC1zZXQgc2NyaXB0cwotICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICJpbnN0YWxsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICJlY2hvIEd1aXg6IGF2b2lkaW5nIG5vZGUtZ3lwIHJlYnVpbGQiKSkKLSAgICAgICAgIG91 dCkpKSkpCisgICAgICAgIChzY20tPmpzb24KKyAgICAgICAgICAoYXNzb2Mtc2V0ISBwa2ctbWV0 YQorICAgICAgICAgICAgICAgICAgICAgICJzY3JpcHRzIgorICAgICAgICAgICAgICAgICAgICAg IChhc3NvYy1zZXQhIHNjcmlwdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAi aW5zdGFsbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWNobyBHdWl4OiBh dm9pZGluZyBub2RlLWd5cCByZWJ1aWxkIikpCisgICAgICAgICAgb3V0KSkpKSkKIAogKGRlZmlu ZSAlc3RhbmRhcmQtcGhhc2VzCiAgIChtb2RpZnktcGhhc2VzIGdudTolc3RhbmRhcmQtcGhhc2Vz CgpiYXNlLWNvbW1pdDogY2ZkNGY1NmY3NWEyMGI2NzMyZDQ2MzE4MGQyMTFmNzk2YzkwMzJlNQot LSAKMi40Ni4wCgo= --00000000000035ee88062954efaa--