From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp12.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms0.migadu.com with LMTPS id aD85AWFEDWJRwAAAgWs5BA (envelope-from ) for ; Wed, 16 Feb 2022 19:37:21 +0100 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp12.migadu.com with LMTPS id oKuEOWBEDWIHVgAAauVa8A (envelope-from ) for ; Wed, 16 Feb 2022 19:37:20 +0100 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 4A48A3AB86 for ; Wed, 16 Feb 2022 19:37:20 +0100 (CET) Received: from localhost ([::1]:33776 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nKPB1-0002pP-81 for larch@yhetil.org; Wed, 16 Feb 2022 13:37:19 -0500 Received: from eggs.gnu.org ([209.51.188.92]:40538) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nKPAm-0002p1-7p for guix-patches@gnu.org; Wed, 16 Feb 2022 13:37:04 -0500 Received: from debbugs.gnu.org ([209.51.188.43]:55522) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nKPAj-0002Th-Vb for guix-patches@gnu.org; Wed, 16 Feb 2022 13:37:03 -0500 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1nKPAj-0005rK-MN for guix-patches@gnu.org; Wed, 16 Feb 2022 13:37:01 -0500 X-Loop: help-debbugs@gnu.org Subject: [bug#54021] [PATCH] Add rhino javascript package Resent-From: Frank Pursel Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Wed, 16 Feb 2022 18:37:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 54021 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: Maxime Devos Cc: 54021@debbugs.gnu.org Received: via spool by 54021-submit@debbugs.gnu.org id=B54021.164503661422505 (code B ref 54021); Wed, 16 Feb 2022 18:37:01 +0000 Received: (at 54021) by debbugs.gnu.org; 16 Feb 2022 18:36:54 +0000 Received: from localhost ([127.0.0.1]:49419 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nKPAc-0005qv-1w for submit@debbugs.gnu.org; Wed, 16 Feb 2022 13:36:54 -0500 Received: from mail-ed1-f53.google.com ([209.85.208.53]:43895) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nKPAZ-0005qe-Sy for 54021@debbugs.gnu.org; Wed, 16 Feb 2022 13:36:52 -0500 Received: by mail-ed1-f53.google.com with SMTP id y17so5428209edd.10 for <54021@debbugs.gnu.org>; Wed, 16 Feb 2022 10:36:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=QGxJ+SrGBYVivD5nJc7D5DCFxhrAFp7SNC9Ixz55N6o=; b=FKxa1bTw/B5NRxDnchjhAXJ/y9BuXpZVGVwjIkxb+PuoTr7/3JmugWKFPpfPjyn9q/ sx9KnOfpoqoKcklZOL3TVNXvTPAD2oqlgPiRPPFfZULfVtSllF27P/wv1cMBSjH+6JJ6 lSGugieSrYEf7wI8l1LE/FpSUVV5hyvJlTSatXyVK1aViy6DKzr4+40sJHgK3VA59CR/ n4u6oYNNF/DHTEAtC3dlzgMl3sEcBAkesKakHo26pjLn+i+MIEPv9UTP82bQcR81EC+P DpNTgYBWvnEVQQywpy8UjWWduCrMppCLsH+WC0G5olHjahBsOqS8gS2Q69lM+eerGgXy Nglw== 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=QGxJ+SrGBYVivD5nJc7D5DCFxhrAFp7SNC9Ixz55N6o=; b=x0c3/behIX0ogKIWeMIi3km3+LfehJilipKckANaDwjF8j/hfVXQZ4yhRi+F97ly+B g/dXPdlytOwMszeFiO9fhUb7q0X13Mn4gMT3jcughq7SOSgXdEpwL5hWoFDcfYpmxPxm PsC8y9u7N9a2KrK+4mTdxzHLDoNtl4u6ImcyyHBoJqep5AgAXbG0pfZuTDUFAKS+l1kZ TDVqQHIKsITwK/82KzUhNBeaMXUdc6SpDRRobJDlfJNkVPFD6Jd1xgQ1h8VUa9FLWU+u sop0T2H9QbYpBaYsT6azjIeZqZf3NJ/mYtf58V0GFlkhpGvPUt84ROOiLo2TFo94xlge xRIw== X-Gm-Message-State: AOAM5339mzDbe0JkBQt7uCJMR4hbluhnGEXdDnczmWsAJhHUvV/dO5N+ Vnzgunjo8SOZTZAlrWBjJkKVIkSPy3c8BwajM3o= X-Google-Smtp-Source: ABdhPJzHXjI07saV2iiFSauLcm+JQRjSxxqXjcyI0F2s+z4cug6ZM0XnMre9r1Av7rN87EdpLQaupB/9f5gAv81dk7M= X-Received: by 2002:a05:6402:2744:b0:404:ba60:fec6 with SMTP id z4-20020a056402274400b00404ba60fec6mr4424539edd.235.1645036605724; Wed, 16 Feb 2022 10:36:45 -0800 (PST) MIME-Version: 1.0 References: <87pmnnr2qq.fsf@gmail.com> <5ad705f1e2d97a07057aca0945de8ce18c145662.camel@telenet.be> In-Reply-To: <5ad705f1e2d97a07057aca0945de8ce18c145662.camel@telenet.be> From: Frank Pursel Date: Wed, 16 Feb 2022 18:36:33 +0000 Message-ID: Content-Type: multipart/alternative; boundary="00000000000086d9c105d826ee1b" 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" X-Migadu-Flow: FLOW_IN X-Migadu-Country: US ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1645036640; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:resent-cc:resent-from:resent-sender: resent-message-id:in-reply-to:in-reply-to:references:references: list-id:list-help:list-unsubscribe:list-subscribe:list-post: dkim-signature; bh=QGxJ+SrGBYVivD5nJc7D5DCFxhrAFp7SNC9Ixz55N6o=; b=XP4W0lsTNtaDikU0TTCpvbtz6r8I7X06RhWVJE3D3SS5Zic7rujzkkvIcjBE2HzRMekexF 60I/biijuQ4ZZQen7KUaNcIsLgSXC0j41M/J4T5maxP2KPqZbQHrdeAapCwLYnMSFsYICT bBG18ZzuHHtHU6D6Hv5Xlv3PsENayyBslaFg8SgF3TjKbva1D9YDzLXtc19oA6FImxa2d4 8eF4HR8Pf3pGNYSsJ0x1P02lQ5VMhiq7YuMFYoI1seWTyQsw/fQb4cGWUtx/souvcBE1zA yez6fhSGqNpotc6xcZkK8ekMtF5k6zQ4YQ4y+ZsDQ+WhGZdLIQ70gH4Uj3X02w== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1645036640; a=rsa-sha256; cv=none; b=DQRHEYxdU4/yrjMLjcLnXjb3owRslpPAiDLkllNq7SrWA01rL33Y+eqeFdxooFnLB6/tO4 bl41E0u+sQxkRrP8MlHSDUPdj/dFHoV5jvodwIoS6dBZrFAbaMTpHBJrUk7Sr7nTnLvPRy 5HeiZzEl2vhRulr+XZjdp4u8mllY+kbaKKbxS6NjjpbAkFJWSYqpU4v/ld2sutl5oF5asY sU9Gg6jOQyPzOZMIiI4KEBMHmej5pTqrd8gAMcAT/gIUQKRnRjNLzh87vtTWvilp6LjSAf MZL9JhT0j1mFnYRtDA+wkPzUAszQtF3raGpDdk8LUJNLwUoHlYkvsRn7JIv40w== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=gmail.com header.s=20210112 header.b=FKxa1bTw; dmarc=fail reason="SPF 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" X-Migadu-Spam-Score: -1.93 Authentication-Results: aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=gmail.com header.s=20210112 header.b=FKxa1bTw; dmarc=fail reason="SPF 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" X-Migadu-Queue-Id: 4A48A3AB86 X-Spam-Score: -1.93 X-Migadu-Scanner: scn1.migadu.com X-TUID: O9ZEaTPjNSGw --00000000000086d9c105d826ee1b Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Thanks for the careful review. The $@ was intended to allow the introduction of additional command line arguments but since it starts a repl and might be a source of nefariousness I've just removed it. I did not understand the bash-minimal comment. Are you saying that (search-input-file inputs "/bin/bash") will not work in the way I intended? I've changed all the inputs to native-inputs now. I'll get back to you after I do some more testing. Thank you for your helpful/thoughtful comments. Regards, Frank On Wed, Feb 16, 2022 at 5:21 PM Maxime Devos wrote= : > Frank Pursel schreef op di 15-02-2022 om 17:58 [-0800]: > > +(define-public rhino > > + (let* ((rel-ver "1.7.7.2") (rel-git-tag "Rhino1_7_7_2_Release") > > + (git-commitv "935942527ff434b205e797df4185518e5369466e") > > + (git-short-commit (substring git-commitv 0 6)) > > + (hash "09i4yr98hs6855fs7fhgmrpiwpr90lhxdv2bvfj97nn4rv1d7wl8")= ) > > This is quite a bit more complicated than necessary ... > > * 'rel-git-tag' is unused. > * Conventionally, a let-bound commit string has as name 'commit', not > 'git-commitv'. (guix upstream) expects 'commit', not 'git-commitv', > and will fail at auto-updating if a different name is used. > * (see later) > > > + (package > > + (name "rhino") > > + (version git-short-commit) > > 'git-short-commit' is a (shortened) commit string, not a version > number. This needs to be (version "1.7.7.2") instead. > > > + (source (origin > > + (method git-fetch) > > + (uri (git-reference > > + (url "https://github.com/mozilla/rhino.git") > > + (commit git-short-commit))) > > There is no need to shorten the commit string, you can use the full > "git-commitv" here. > > > + (file-name (git-file-name name git-short-commit)) > > We have a version number, so you can do (git-file-name name version) > here. > > > + (sha256 > > + (base32 > > + hash)))) > > The hash is only used in one place, so you can write it here directly. > This has as benefit that (guix packages) can do some checks on the hash > at compile time. > > [...] > > > + (arguments > > + `(#:phases (modify-phases %standard-phases > > + (add-after 'unpack 'clean-jars > > + (lambda _ > > + (for-each (lambda (jarf) > > + (delete-file jarf) > > + (format #t "Deleted: ~s > > +" jarf)) > > + (find-files "." ".*\\.jar$")) #t)) > > Cleaning the source code of binaries, making sure that the source code > actually consists of source code, seems more something for origin > snippets. It's not really explicitly mentioned anywhere I think, > but the following from =E2=80=98(guix)Snipepts versus Phases=E2=80=99 see= ms close: > > The boundary between using an origin snippet versus a build phase to > modify the sources of a package can be elusive. Origin snippets are > typically used to remove unwanted files such as bundled libraries, > nonfree sources, or to apply simple substitutions. [...] > > > + (replace 'install > > + (lambda* (#:key inputs outputs #:allow-other-key= s) > > + (let* ((out (assoc-ref outputs "out")) > > + (pkg+ver (string-append ,name ,rel-ver)= ) > > You can refer to the 'version' field of the package here: > > (pkg+ver (string-append ,name ,version)) > > > + (bin (string-append out "/bin")) > > + (rhino (string-append bin "/rhino"))) > > + (mkdir-p bin) > > + (install-file (string-append "build/" pkg+ve= r > > + "/js.jar") > > + (string-append out > "/share/java")) > > + (with-output-to-file rhino > > + (lambda _ > > + (format #t "#!~a > > +~a -jar ~a $@ > > +" > > + (search-input-file inputs > "/bin/bash") > > 'bash-minimal' is missing from 'inputs'. Not including it only works > when compiling natively. > > > + (which "java") > > + (string-append out > "/share/java/js.jar")))) > > > 'format' has a port argument, so you could do > > (call-with-output-file rhino > (lambda (port) > (format port "#!~a ~a -jar -a $@" > (search-input-file [...]) [...]))) > > Also, what's this "$@"? > > Greetings, > Maxime. > --00000000000086d9c105d826ee1b Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdj5UaGFua3MgZm9yIHRoZSBjYXJlZnVsIHJldmlldy7CoCBUaGUg JEAgd2FzIGludGVuZGVkIHRvIGFsbG93IHRoZSBpbnRyb2R1Y3Rpb24gb2YgYWRkaXRpb25hbCBj b21tYW5kIGxpbmUgYXJndW1lbnRzIGJ1dCBzaW5jZSBpdCBzdGFydHMgYSByZXBsIGFuZCBtaWdo dCBiZSBhIHNvdXJjZSBvZiBuZWZhcmlvdXNuZXNzIEkmIzM5O3ZlIGp1c3QgcmVtb3ZlZCBpdC7C oCBJIGRpZCBub3QgdW5kZXJzdGFuZCB0aGUgYmFzaC1taW5pbWFsIGNvbW1lbnQuwqAgQXJlIHlv dSBzYXlpbmcgdGhhdCAoc2VhcmNoLWlucHV0LWZpbGUgaW5wdXRzICZxdW90Oy9iaW4vYmFzaCZx dW90Oykgd2lsbCBub3Qgd29yayBpbiB0aGUgd2F5IEkgaW50ZW5kZWQ/wqAgSSYjMzk7dmUgY2hh bmdlZCBhbGwgdGhlIGlucHV0cyB0byBuYXRpdmUtaW5wdXRzIG5vdy7CoCA8YnI+PC9kaXY+PGRp dj48YnI+PC9kaXY+PGRpdj5JJiMzOTtsbCBnZXQgYmFjayB0byB5b3UgYWZ0ZXIgSSBkbyBzb21l IG1vcmUgdGVzdGluZy48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PlRoYW5rIHlvdSBmb3IgeW91 ciBoZWxwZnVsL3Rob3VnaHRmdWwgY29tbWVudHMuwqDCoDwvZGl2PjxkaXY+PGJyPjwvZGl2Pjxk aXY+UmVnYXJkcyw8L2Rpdj48ZGl2PkZyYW5rPGJyPjwvZGl2PjwvZGl2Pjxicj48ZGl2IGNsYXNz PSJnbWFpbF9xdW90ZSI+PGRpdiBkaXI9Imx0ciIgY2xhc3M9ImdtYWlsX2F0dHIiPk9uIFdlZCwg RmViIDE2LCAyMDIyIGF0IDU6MjEgUE0gTWF4aW1lIERldm9zICZsdDs8YSBocmVmPSJtYWlsdG86 bWF4aW1lZGV2b3NAdGVsZW5ldC5iZSI+bWF4aW1lZGV2b3NAdGVsZW5ldC5iZTwvYT4mZ3Q7IHdy b3RlOjxicj48L2Rpdj48YmxvY2txdW90ZSBjbGFzcz0iZ21haWxfcXVvdGUiIHN0eWxlPSJtYXJn aW46MHB4IDBweCAwcHggMC44ZXg7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkIHJnYigyMDQsMjA0LDIw NCk7cGFkZGluZy1sZWZ0OjFleCI+RnJhbmsgUHVyc2VsIHNjaHJlZWYgb3AgZGkgMTUtMDItMjAy MiBvbSAxNzo1OCBbLTA4MDBdOjxicj4NCiZndDsgKyhkZWZpbmUtcHVibGljIHJoaW5vPGJyPg0K Jmd0OyArwqAgKGxldCogKChyZWwtdmVyICZxdW90OzEuNy43LjImcXVvdDspIChyZWwtZ2l0LXRh ZyAmcXVvdDtSaGlubzFfN183XzJfUmVsZWFzZSZxdW90Oyk8YnI+DQomZ3Q7ICvCoMKgwqDCoMKg wqDCoMKgIChnaXQtY29tbWl0diAmcXVvdDs5MzU5NDI1MjdmZjQzNGIyMDVlNzk3ZGY0MTg1NTE4 ZTUzNjk0NjZlJnF1b3Q7KTxicj4NCiZndDsgK8KgwqDCoMKgwqDCoMKgwqAgKGdpdC1zaG9ydC1j b21taXQgKHN1YnN0cmluZyBnaXQtY29tbWl0diAwIDYpKTxicj4NCiZndDsgK8KgwqDCoMKgwqDC oMKgwqAgKGhhc2ggJnF1b3Q7MDlpNHlyOThoczY4NTVmczdmaGdtcnBpd3ByOTBsaHhkdjJidmZq OTdubjRydjFkN3dsOCZxdW90OykpPGJyPg0KPGJyPg0KVGhpcyBpcyBxdWl0ZSBhIGJpdCBtb3Jl IGNvbXBsaWNhdGVkIHRoYW4gbmVjZXNzYXJ5IC4uLjxicj4NCjxicj4NCsKgKiAmIzM5O3JlbC1n aXQtdGFnJiMzOTsgaXMgdW51c2VkLjxicj4NCsKgKiBDb252ZW50aW9uYWxseSwgYSBsZXQtYm91 bmQgY29tbWl0IHN0cmluZyBoYXMgYXMgbmFtZSAmIzM5O2NvbW1pdCYjMzk7LCBub3Q8YnI+DQrC oCDCoCYjMzk7Z2l0LWNvbW1pdHYmIzM5Oy7CoCAoZ3VpeCB1cHN0cmVhbSkgZXhwZWN0cyAmIzM5 O2NvbW1pdCYjMzk7LCBub3QgJiMzOTtnaXQtY29tbWl0diYjMzk7LDxicj4NCsKgIMKgYW5kIHdp bGwgZmFpbCBhdCBhdXRvLXVwZGF0aW5nIGlmIGEgZGlmZmVyZW50IG5hbWUgaXMgdXNlZC48YnI+ DQrCoCogKHNlZSBsYXRlcik8YnI+DQo8YnI+DQomZ3Q7ICvCoMKgwqAgKHBhY2thZ2U8YnI+DQom Z3Q7ICvCoMKgwqDCoMKgIChuYW1lICZxdW90O3JoaW5vJnF1b3Q7KTxicj4NCiZndDsgK8KgwqDC oMKgwqAgKHZlcnNpb24gZ2l0LXNob3J0LWNvbW1pdCk8YnI+DQo8YnI+DQomIzM5O2dpdC1zaG9y dC1jb21taXQmIzM5OyBpcyBhIChzaG9ydGVuZWQpIGNvbW1pdCBzdHJpbmcsIG5vdCBhIHZlcnNp b248YnI+DQpudW1iZXIuwqAgVGhpcyBuZWVkcyB0byBiZSAodmVyc2lvbiAmcXVvdDsxLjcuNy4y JnF1b3Q7KSBpbnN0ZWFkLjxicj4NCjxicj4NCiZndDsgK8KgwqDCoMKgwqAgKHNvdXJjZSAob3Jp Z2luPGJyPg0KJmd0OyArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChtZXRob2QgZ2l0 LWZldGNoKTxicj4NCiZndDsgK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAodXJpIChn aXQtcmVmZXJlbmNlPGJyPg0KJmd0OyArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgICh1cmwgJnF1b3Q7PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEv cmhpbm8uZ2l0IiByZWw9Im5vcmVmZXJyZXIiIHRhcmdldD0iX2JsYW5rIj5odHRwczovL2dpdGh1 Yi5jb20vbW96aWxsYS9yaGluby5naXQ8L2E+JnF1b3Q7KTxicj4NCiZndDsgK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoY29tbWl0IGdpdC1zaG9ydC1jb21taXQp KSk8YnI+DQo8YnI+DQpUaGVyZSBpcyBubyBuZWVkIHRvIHNob3J0ZW4gdGhlIGNvbW1pdCBzdHJp bmcsIHlvdSBjYW4gdXNlIHRoZSBmdWxsPGJyPg0KJnF1b3Q7Z2l0LWNvbW1pdHYmcXVvdDsgaGVy ZS48YnI+DQo8YnI+DQomZ3Q7ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGZpbGUt bmFtZSAoZ2l0LWZpbGUtbmFtZSBuYW1lIGdpdC1zaG9ydC1jb21taXQpKTxicj4NCjxicj4NCldl IGhhdmUgYSB2ZXJzaW9uIG51bWJlciwgc28geW91IGNhbiBkbyAoZ2l0LWZpbGUtbmFtZSBuYW1l IHZlcnNpb24pPGJyPg0KaGVyZS48YnI+DQo8YnI+DQomZ3Q7ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgKHNoYTI1Njxicj4NCiZndDsgK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIChiYXNlMzI8YnI+DQomZ3Q7ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGhhc2gpKSkpPGJyPg0KPGJyPg0KVGhlIGhhc2ggaXMgb25seSB1c2VkIGluIG9uZSBwbGFj ZSwgc28geW91IGNhbiB3cml0ZSBpdCBoZXJlIGRpcmVjdGx5Ljxicj4NClRoaXMgaGFzIGFzIGJl bmVmaXQgdGhhdCAoZ3VpeCBwYWNrYWdlcykgY2FuIGRvIHNvbWUgY2hlY2tzIG9uIHRoZSBoYXNo PGJyPg0KYXQgY29tcGlsZSB0aW1lLjxicj4NCjxicj4NClsuLi5dPGJyPg0KPGJyPg0KJmd0OyAr wqDCoMKgwqDCoCAoYXJndW1lbnRzPGJyPg0KJmd0OyArwqDCoMKgwqDCoMKgIGAoIzpwaGFzZXMg KG1vZGlmeS1waGFzZXMgJXN0YW5kYXJkLXBoYXNlczxicj4NCiZndDsgK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChhZGQtYWZ0ZXIgJiMzOTt1bnBhY2sgJiMzOTtjbGVh bi1qYXJzPGJyPg0KJmd0OyArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIChsYW1iZGEgXzxicj4NCiZndDsgK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgKGZvci1lYWNoIChsYW1iZGEgKGphcmYpPGJyPg0KJmd0OyArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCAoZGVsZXRlLWZpbGUgamFyZik8YnI+DQomZ3Q7ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChmb3Jt YXQgI3QgJnF1b3Q7RGVsZXRlZDogfnM8YnI+DQomZ3Q7ICsmcXVvdDsgamFyZikpPGJyPg0KJmd0 OyArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIChmaW5kLWZpbGVzICZxdW90Oy4mcXVvdDsgJnF1b3Q7LipcXC5qYXIkJnF1 b3Q7KSkgI3QpKTxicj4NCjxicj4NCkNsZWFuaW5nIHRoZSBzb3VyY2UgY29kZSBvZiBiaW5hcmll cywgbWFraW5nIHN1cmUgdGhhdCB0aGUgc291cmNlIGNvZGU8YnI+DQphY3R1YWxseSBjb25zaXN0 cyBvZiBzb3VyY2UgY29kZSwgc2VlbXMgbW9yZSBzb21ldGhpbmcgZm9yIG9yaWdpbjxicj4NCnNu aXBwZXRzLsKgIEl0JiMzOTtzIG5vdCByZWFsbHkgZXhwbGljaXRseSBtZW50aW9uZWQgYW55d2hl cmUgSSB0aGluayw8YnI+DQpidXQgdGhlIGZvbGxvd2luZyBmcm9tIOKAmChndWl4KVNuaXBlcHRz IHZlcnN1cyBQaGFzZXPigJkgc2VlbXMgY2xvc2U6PGJyPg0KPGJyPg0KVGhlIGJvdW5kYXJ5IGJl dHdlZW4gdXNpbmcgYW4gb3JpZ2luIHNuaXBwZXQgdmVyc3VzIGEgYnVpbGQgcGhhc2UgdG88YnI+ DQptb2RpZnkgdGhlIHNvdXJjZXMgb2YgYSBwYWNrYWdlIGNhbiBiZSBlbHVzaXZlLsKgIE9yaWdp biBzbmlwcGV0cyBhcmU8YnI+DQp0eXBpY2FsbHkgdXNlZCB0byByZW1vdmUgdW53YW50ZWQgZmls ZXMgc3VjaCBhcyBidW5kbGVkIGxpYnJhcmllcyw8YnI+DQpub25mcmVlIHNvdXJjZXMsIG9yIHRv IGFwcGx5IHNpbXBsZSBzdWJzdGl0dXRpb25zLsKgIFsuLi5dPGJyPg0KPGJyPg0KJmd0OyArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHJlcGxhY2UgJiMzOTtpbnN0YWxs PGJyPg0KJmd0OyArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChs YW1iZGEqICgjOmtleSBpbnB1dHMgb3V0cHV0cyAjOmFsbG93LW90aGVyLWtleXMpPGJyPg0KJmd0 OyArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAobGV0KiAo KG91dCAoYXNzb2MtcmVmIG91dHB1dHMgJnF1b3Q7b3V0JnF1b3Q7KSk8YnI+DQomZ3Q7ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg KHBrZyt2ZXIgKHN0cmluZy1hcHBlbmQgLG5hbWUgLHJlbC12ZXIpKTxicj4NCjxicj4NCllvdSBj YW4gcmVmZXIgdG8gdGhlICYjMzk7dmVyc2lvbiYjMzk7IGZpZWxkIG9mIHRoZSBwYWNrYWdlIGhl cmU6PGJyPg0KPGJyPg0KwqAgKHBrZyt2ZXIgKHN0cmluZy1hcHBlbmQgLG5hbWUgLHZlcnNpb24p KTxicj4NCjxicj4NCiZndDsgK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoYmluIChzdHJpbmctYXBwZW5kIG91dCAmcXVvdDsvYmlu JnF1b3Q7KSk8YnI+DQomZ3Q7ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHJoaW5vIChzdHJpbmctYXBwZW5kIGJpbiAmcXVvdDsv cmhpbm8mcXVvdDspKSk8YnI+DQomZ3Q7ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAobWtkaXItcCBiaW4pPGJyPg0KJmd0OyArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGluc3RhbGwtZmlsZSAoc3Ry aW5nLWFwcGVuZCAmcXVvdDtidWlsZC8mcXVvdDsgcGtnK3Zlcjxicj4NCiZndDsgK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmcXVvdDsvanMuamFy JnF1b3Q7KTxicj4NCiZndDsgK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoc3RyaW5nLWFwcGVuZCBv dXQgJnF1b3Q7L3NoYXJlL2phdmEmcXVvdDspKTxicj4NCiZndDsgK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICh3aXRoLW91dHB1dC10by1maWxlIHJo aW5vPGJyPg0KJmd0OyArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIChsYW1iZGEgXzxicj4NCiZndDsgK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGZvcm1hdCAjdCAmcXVvdDsjIX5h PGJyPg0KJmd0OyArfmEgLWphciB+YSAkQDxicj4NCiZndDsgKyZxdW90Ozxicj4NCiZndDsgK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIChzZWFyY2gtaW5wdXQtZmlsZSBpbnB1dHMgJnF1b3Q7L2Jpbi9iYXNo JnF1b3Q7KTxicj4NCjxicj4NCiYjMzk7YmFzaC1taW5pbWFsJiMzOTsgaXMgbWlzc2luZyBmcm9t ICYjMzk7aW5wdXRzJiMzOTsuwqAgTm90IGluY2x1ZGluZyBpdCBvbmx5IHdvcmtzPGJyPg0Kd2hl biBjb21waWxpbmcgbmF0aXZlbHkuPGJyPg0KPGJyPg0KJmd0OyArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg KHdoaWNoICZxdW90O2phdmEmcXVvdDspPGJyPg0KJmd0OyArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHN0 cmluZy1hcHBlbmQgb3V0ICZxdW90Oy9zaGFyZS9qYXZhL2pzLmphciZxdW90OykpKSk8YnI+DQo8 YnI+DQo8YnI+DQomIzM5O2Zvcm1hdCYjMzk7IGhhcyBhIHBvcnQgYXJndW1lbnQsIHNvIHlvdSBj b3VsZCBkbzxicj4NCjxicj4NCihjYWxsLXdpdGgtb3V0cHV0LWZpbGUgcmhpbm88YnI+DQrCoCAo bGFtYmRhIChwb3J0KTxicj4NCsKgIMKgIChmb3JtYXQgcG9ydCAmcXVvdDsjIX5hIH5hIC1qYXIg LWEgJEAmcXVvdDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCAoc2VhcmNoLWlucHV0LWZpbGUgWy4u Ll0pIFsuLi5dKSkpPGJyPg0KPGJyPg0KQWxzbywgd2hhdCYjMzk7cyB0aGlzICZxdW90OyRAJnF1 b3Q7Pzxicj4NCjxicj4NCkdyZWV0aW5ncyw8YnI+DQpNYXhpbWUuPGJyPg0KPC9ibG9ja3F1b3Rl PjwvZGl2Pg0K --00000000000086d9c105d826ee1b--