From nobody Thu May 14 05:30:20 2026 X-Original-To: freebsd-pkg@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4gGJnk09flz6djNR for ; Thu, 14 May 2026 05:30:34 +0000 (UTC) (envelope-from sasha@starnix.net) Received: from mail-oi1-x22b.google.com (mail-oi1-x22b.google.com [IPv6:2607:f8b0:4864:20::22b]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "smtp.gmail.com", Issuer "WR4" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gGJnh3SsSz3V4p for ; Thu, 14 May 2026 05:30:32 +0000 (UTC) (envelope-from sasha@starnix.net) Authentication-Results: mx1.freebsd.org; dkim=pass header.d=starnix.net header.s=google header.b=Zo5SWz7+; dmarc=pass (policy=quarantine) header.from=starnix.net; spf=pass (mx1.freebsd.org: domain of sasha@starnix.net designates 2607:f8b0:4864:20::22b as permitted sender) smtp.mailfrom=sasha@starnix.net Received: by mail-oi1-x22b.google.com with SMTP id 5614622812f47-479d68a9063so2868049b6e.0 for ; Wed, 13 May 2026 22:30:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=starnix.net; s=google; t=1778736625; x=1779341425; darn=freebsd.org; h=autocrypt:subject:from:to:content-language:user-agent:mime-version :date:message-id:from:to:cc:subject:date:message-id:reply-to; bh=aEo8bAnj6WxUTJOIRGkvNsM39TzbXPAYG2NQMF5fmuE=; b=Zo5SWz7+BpwYrSaPCeaku8Wr5+7BE8Z/Fq1lVddw7ktuKaLcn+2vfFrQKDm14aqFG0 smlUhSbG6TtLPSmGHXZJT9bX3XYWiwZkw4Qa7yk+KTgTsoerNk89jPc3tlT4cPtQO/AJ IT8WIs9EVutGx3tAhzRDSC5ajWm/UN/YXLLGQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778736625; x=1779341425; h=autocrypt:subject:from:to:content-language:user-agent:mime-version :date:message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=aEo8bAnj6WxUTJOIRGkvNsM39TzbXPAYG2NQMF5fmuE=; b=RLPl50a9OGCrbivYYPBidzm7cJBmEI/BvtJWYApsIMyRwS43a37Q0k8xR8tl889nYe 0UwDELporZ5CBucUsr3zMSeFEmZYKnoyAUIoNsOqAuhmdVZIq7/+2doMQlETA0qks+i7 1wvBcRUZjtv3TWEXFmxue0MF1zFUfvJSSn7lX48R7gOZN5P3QlihSnHkZDXCkaXF/Y/e H2VjqPIAoG0Xc3frz6Aomo00wc7Q94yEPBg4OnUyWqtXhR8iPRlQ2HuLptt4ulss6VV5 QflnLrlC9PpYp84oNKfHJc2YG9AegcJiXG1s8o7F5NhvfveTRXBiH4Gd19+256kfWPiD 8GQg== X-Gm-Message-State: AOJu0YyjLYsODtCLuJDY0NVD+OscDTL0rs8J1llb59B59zTWJ6hTKipq yOxA7wyfhPiwE97iL9df/hE5afcScyX9vhcKmuYlH77/mWN2wtSArIDYmHiwY4SvFgi1Fvvi4KG Ylbdg X-Gm-Gg: Acq92OHgXYV1J8Z+WayZ3GIHqy7sw83cmRwshYolX0ryf/AnhrwpzZbivhbCPwqWNPq CV4bV84b3lIje6ouBEBUTlg0ezMcSr73JUtfaXcWAUd8Pbb0LR1RTo9D//xykRvQhb+Cpp7zHp7 nfLU5uMQOvlgfudlT7NxH6jaoa3u/ikyzjkMKRQu9rjM393XV9JvGvcA8L68r+6WVuXmpUyMA35 JdOMP3VRvBveKdOJ1vWo6db3Y6xcRcLLP3PKrFB+kuVB0tN6hQwQtMoag8VjUZYpaDv8dYYorKF ujuPk/hiGTtNisOwzTp6g4MmFE1y+pEtb2D8bW7yzF/Qp/6hDuRClBULasTfpWckLxLEQVnNFWc 7F9TxpFI7SKmA+2yLhxxuyjp/CvB1ieFrtqR3IuB8Sh94162ArOdgSAywxmtFM23UcawwFDXqga PazkQIDl8nq/jv4wS68mtiOYlhUmFzEkfgNoEfOnhI4YjbJFxd4YRZiAq/ra549ENZw5FnreSR X-Received: by 2002:a05:6808:3096:b0:479:eb19:6e6a with SMTP id 5614622812f47-482b2db3069mr3809110b6e.34.1778736625402; Wed, 13 May 2026 22:30:25 -0700 (PDT) Received: from [172.16.4.67] (75-163-70-225.omah.qwest.net. [75.163.70.225]) by smtp.gmail.com with ESMTPSA id 5614622812f47-482d3a34fd1sm724605b6e.9.2026.05.13.22.30.21 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 13 May 2026 22:30:23 -0700 (PDT) Message-ID: Date: Thu, 14 May 2026 00:30:20 -0500 List-Id: Binary package management and package tools discussion List-Archive: https://lists.freebsd.org/archives/freebsd-pkg List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-freebsd-pkg@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: freebsd-pkg@freebsd.org From: Sasha Karcz Subject: pkg-be-plugin: auto-create ZFS boot environments before pkg transactions Autocrypt: addr=sasha@starnix.net; keydata= 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 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="------------x1T898DHlPqGHKNAFdm0fp3p" X-Spamd-Result: default: False [-5.72 / 15.00]; SIGNED_PGP(-2.00)[]; NEURAL_HAM_LONG(-1.00)[-1.000]; NEURAL_HAM_MEDIUM(-1.00)[-1.000]; NEURAL_HAM_SHORT(-0.82)[-0.825]; DMARC_POLICY_ALLOW(-0.50)[starnix.net,quarantine]; R_SPF_ALLOW(-0.20)[+ip6:2607:f8b0:4864::/56]; R_DKIM_ALLOW(-0.20)[starnix.net:s=google]; MIME_GOOD(-0.20)[multipart/signed,multipart/mixed,multipart/alternative,text/plain]; MIME_UNKNOWN(0.10)[application/pgp-keys]; MIME_BASE64_TEXT(0.10)[]; HAS_ATTACHMENT(0.00)[]; FROM_HAS_DN(0.00)[]; RCVD_TLS_LAST(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; ARC_NA(0.00)[]; RCPT_COUNT_ONE(0.00)[1]; DKIM_TRACE(0.00)[starnix.net:+]; RCVD_VIA_SMTP_AUTH(0.00)[]; MIME_TRACE(0.00)[0:+,1:+,2:+,3:+,4:+,5:~,6:~,7:~]; RCVD_COUNT_TWO(0.00)[2]; FROM_EQ_ENVFROM(0.00)[]; ASN(0.00)[asn:15169, ipnet:2607:f8b0::/32, country:US]; TO_DN_NONE(0.00)[]; MLMMJ_DEST(0.00)[freebsd-pkg@freebsd.org]; PREVIOUSLY_DELIVERED(0.00)[freebsd-pkg@freebsd.org]; MID_RHS_MATCH_FROM(0.00)[]; RCVD_IN_DNSWL_NONE(0.00)[2607:f8b0:4864:20::22b:from] X-Spamd-Bar: ----- X-Rspamd-Queue-Id: 4gGJnh3SsSz3V4p This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --------------x1T898DHlPqGHKNAFdm0fp3p Content-Type: multipart/mixed; boundary="------------FtHe0OSm4AKualjN4Tz1NLch"; protected-headers="v1"; hp="clear" Message-ID: Date: Thu, 14 May 2026 00:30:20 -0500 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: freebsd-pkg@freebsd.org From: Sasha Karcz Subject: pkg-be-plugin: auto-create ZFS boot environments before pkg transactions Autocrypt: addr=sasha@starnix.net; keydata= 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 --------------FtHe0OSm4AKualjN4Tz1NLch Content-Type: multipart/mixed; boundary="------------eslmxPr1eW90pNoCb6z0VprS" --------------eslmxPr1eW90pNoCb6z0VprS Content-Type: multipart/alternative; boundary="------------AHskZcEHcd1RHp7NC0Ma6yOZ" --------------AHskZcEHcd1RHp7NC0Ma6yOZ Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: base64 SGVsbG8sDQoNCkkndmUgd3JpdHRlbiBhIHBrZyg4KSBwbHVnaW4gdGhhdCBhdXRvbWF0aWNh bGx5IGNyZWF0ZXMgYSBaRlMgYm9vdCANCmVudmlyb25tZW50IGJlZm9yZSBlYWNoIGluc3Rh bGwsIHVwZ3JhZGUsIGFuZCBkZWluc3RhbGwgdHJhbnNhY3Rpb24uIElmIA0KYSB0cmFuc2Fj dGlvbiBsZWF2ZXMgdGhlIHN5c3RlbSBpbiBhIGJyb2tlbiBzdGF0ZSwgdGhlIHByZS10cmFu c2FjdGlvbiANCkJFIGlzIHRoZXJlIHRvIGJvb3QgaW50by4NCg0KVGhlIHBsdWdpbiBpcyBj YWxsZWQgcGtnLWJlLXBsdWdpbiBhbmQgaW5zdGFsbHMgYXMgYmUuc28uIEl0IHVzZXMgDQps aWJiZSgzKSBkaXJlY3RseSDigJQgbm8gZXhlYyBvZiBiZWN0bCg4KSBvciB6ZnMoOCkuDQoN CipCZWhhdmlvdXIqDQoNCk9uIGVhY2ggY292ZXJlZCB0cmFuc2FjdGlvbiwgdGhlIHBsdWdp biBjYWxscyB8bGliYmVfaW5pdCgpfCBhbmQgDQp8YmVfY3JlYXRlKCl8IHRvIHNuYXBzaG90 IHRoZSBjdXJyZW50IEJFIHVuZGVyIGEgdGltZXN0YW1wZWQgbmFtZSANCihkZWZhdWx0IHBy ZWZpeDogfHByZS1wa2d8LCBlLmcuIHxwcmUtcGtnLTIwMjYwNTE0LTA5MTUzMnwpLiBBZnRl ciANCmNyZWF0aW9uLCBpdCBwcnVuZXMgb2xkZXIgYXV0by1jcmVhdGVkIEJFcyB0byBrZWVw IHRoZSBjb3VudCBhdCBvciBiZWxvdyANCmEgY29uZmlndXJhYmxlIGxpbWl0LCB3aXRoIGEg bWluaW11bS1hZ2UgZ3VhcmQgc28gcmVjZW50IHJvbGxiYWNrIHBvaW50cyANCmFyZW4ndCBk ZXN0cm95ZWQgZXZlbiB3aGVuIG92ZXIgdGhlIGxpbWl0Lg0KDQpBbGwgYWN0aXZpdHkgaXMg bG9nZ2VkIHRvIHN5c2xvZygzKSBhdCBMT0dfTk9USUNFIGZvciBub3JtYWwgb3BlcmF0aW9u cyANCmFuZCBMT0dfV0FSTklORy9MT0dfRVJSIGZvciBmYWlsdXJlcywgc28gYWRtaW5zIGNh biBncmVwIA0KfC92YXIvbG9nL21lc3NhZ2VzfCB0byBmaW5kIEJFIG5hbWVzIGZvciByb2xs YmFjayBhZnRlciBhIGJhZCB0cmFuc2FjdGlvbi4NCg0KKkNvbmZpZ3VyYXRpb24qICh2aWEg fC91c3IvbG9jYWwvZXRjL3BrZy9iZS5jb25mfCwgVUNMIGZvcm1hdCkNCg0KICAqIHxCRV9Q TFVHSU5fRU5BQkxFRHwg4oCUIG1hc3RlciBzd2l0Y2ggKGRlZmF1bHQ6IHRydWUpDQogICog fEJFX1BMVUdJTl9LRUVQfCDigJQgbWF4aW11bSBCRXMgdG8gcmV0YWluIChkZWZhdWx0OiA1 KQ0KICAqIHxCRV9QTFVHSU5fTkFNRV9QUkVGSVh8IOKAlCBuYW1lIHByZWZpeCAoZGVmYXVs dDogfHByZS1wa2d8KQ0KICAqIHxCRV9QTFVHSU5fTUlOX0FHRXwg4oCUIG1pbmltdW0gYWdl IGJlZm9yZSBwcnVuaW5nIChkZWZhdWx0OiA3ZDsNCiAgICBwcm90ZWN0cyByZWNlbnQgcm9s bGJhY2sgcG9pbnRzIGZyb20gYmVpbmcgZGVzdHJveWVkIHdoZW4gY291bnQNCiAgICBleGNl ZWRzIEtFRVApDQogICogfEJFX1BMVUdJTl9TVFJJQ1R8IOKAlCBhYm9ydCB0cmFuc2FjdGlv biBvbiBCRSBjcmVhdGlvbiBmYWlsdXJlDQogICAgKGRlZmF1bHQ6IGZhbHNlKQ0KICAqIHxC RV9QTFVHSU5fU0tJUF9UUkFOU0FDVElPTlN8IOKAlCBjb21tYS1zZXBhcmF0ZWQgbGlzdCBv ZiB0cmFuc2FjdGlvbg0KICAgIHR5cGVzIHRvIHNraXAgKHxpbnN0YWxsfCwgfHVwZ3JhZGV8 LCB8ZGVpbnN0YWxsfCkNCg0KKk5vbi1aRlMgc3lzdGVtcyoNCg0KfGxpYmJlX2luaXQoKXwg ZmFpbHMgb24gVUZTIHJvb3RzIGFuZCBpbiBqYWlscyB3aXRob3V0IFpGUyBhY2Nlc3MuIElu IA0Kbm9uLXN0cmljdCBtb2RlICh0aGUgZGVmYXVsdCkgdGhpcyBpcyBsb2dnZWQgYXMgYSB3 YXJuaW5nIGFuZCB0aGUgDQp0cmFuc2FjdGlvbiBwcm9jZWVkcyBub3JtYWxseS4gU3RyaWN0 IG1vZGUgY2F1c2VzIGEgZmFpbC1jbG9zZWQgYWJvcnQsIA0Kd2hpY2ggbWF5IGJlIGFwcHJv cHJpYXRlIGZvciBaRlMtb25seSBmbGVldHMuDQoNCipUZXN0aW5nKg0KDQpUZXN0ZWQgb24g RnJlZUJTRCAxNS4wLVJFTEVBU0UtcDUgd2l0aCB0aGUgaW5zdGFsbC91cGdyYWRlL2RlaW5z dGFsbCANCnRyYW5zYWN0aW9uIHR5cGVzLCBpbmNsdWRpbmcgbXVsdGktcGFja2FnZSB0cmFu c2FjdGlvbnMsIHRoZSBwcnVuZSBwYXRoIA0KKG92ZXItS0VFUCBhbmQgdW5kZXItbWluLWFn ZSBzY2VuYXJpb3MpLCBhbmQgc3RyaWN0LW1vZGUgYmVoYXZpb3VyLiBVbml0IA0KdGVzdHMg Y292ZXIgdGhlIGNvbmZpZyBwYXJzZXIgYW5kIHBydW5lIHNvcnQvZmlsdGVyIGxvZ2ljLg0K DQoqU291cmNlKg0KDQpodHRwczovL2dpdGh1Yi5jb20vdXNlbml4MTcvcGtnLWJlLXBsdWdp biANCjxodHRwczovL2dpdGh1Yi5jb20vdXNlbml4MTcvcGtnLWJlLXBsdWdpbj4NCg0KRmVl ZGJhY2sgd2VsY29tZS4gU3BlY2lmaWMgdGhpbmdzIEknZCBhcHByZWNpYXRlIGV5ZXMgb246 DQoNCiAxLiAqcGtnIHBsdWdpbiBBUEkgdXNhZ2UqIOKAlCBwYXJ0aWN1bGFybHkgdGhlIGhv b2sgbGlmZWN5Y2xlIChpbml0IOKGkg0KICAgIG11bHRpcGxlIGhvb2tzIOKGkiBzaHV0ZG93 bikgYW5kIHdoZXRoZXINCiAgICB8UEtHX1BMVUdJTl9IT09LX1BSRV97SU5TVEFMTCxVUEdS QURFLERFSU5TVEFMTH18IGFyZSB0aGUgcmlnaHQNCiAgICBob29rcyBmb3IgdGhpcyBwdXJw b3NlLCBvciB3aGV0aGVyIHRoZXJlJ3MgYSBsZXNzLXN1cnByaXNpbmcgcGxhY2UNCiAgICB0 byBkbyBCRSBjcmVhdGlvbi4NCiAyLiAqbGliYmUgbnZsaXN0IHByb3BlcnR5IGFjY2Vzcyog 4oCUIHRoZSB8Y3JlYXRpb258IHByb3BlcnR5IGlzIHN0b3JlZA0KICAgIGFzIGEgc3RyaW5n IG9mIGRlY2ltYWwgVW5peCBlcG9jaCBzZWNvbmRzIHJhdGhlciB0aGFuIGEgdWludDY0LiBJ DQogICAgd29ya2VkIHRoaXMgb3V0IHZpYSBpbnRlZ3JhdGlvbiB0ZXN0aW5nOyBpZiB0aGlz IGlzIGRvY3VtZW50ZWQNCiAgICBzb21ld2hlcmUgSSBtaXNzZWQsIHBvaW50ZXJzIHdlbGNv bWUuDQogMy4gKlBydW5lIHNlbWFudGljcyog4oCUIGN1cnJlbnRseSB0aGUgY291bnQgY2Fu IGRyaWZ0IGFib3ZlIHxLRUVQfCBpZg0KICAgIGFsbCBjYW5kaWRhdGUgQkVzIGFyZSB1bmRl ciB8TUlOX0FHRXwuIFRyYWRlLW9mZiBjaG9zZW4gZm9yIHRoZQ0KICAgIGhvbWVsYWItZnJp ZW5kbHkgIm5ldmVyIGRlc3Ryb3kgYSByZWNlbnQgcm9sbGJhY2siIHByb3BlcnR5LiBJZiBs aXN0DQogICAgY29uc2Vuc3VzIHByZWZlcnMgc3RyaWN0LWNvdW50IGVuZm9yY2VtZW50LCB0 aGUgcG9saWN5IGlzIGEgb25lLWxpbmUNCiAgICBjaGFuZ2UuDQoNClNhc2hhIEthcmN6DQoN Cg== --------------AHskZcEHcd1RHp7NC0Ma6yOZ Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable

Hello,

I've written a pkg(8) plugin that automatically creates a ZFS boot environment before each install, upgrade, and deinstall transaction. If a transaction leaves the system in a broken state, the pre-transaction BE is there to boot into.

The plugin is called pkg-be-plugin and installs as be.so. It uses libbe(3) directly =E2=80=94 no exec of bectl(8) or zfs(8).

Behaviour

On each covered transaction, the plugin calls libbe_in= it() and be_creat= e() to snapshot the current BE under a timestamped name (default prefix: pre-pkg<= /code>, e.g. pre-pkg-= 20260514-091532). After creation, it prunes older auto-created BEs to keep the count at or below a configurable limit, with a minimum-age guard so recent rollback points aren't destroyed even when over the limit.

All activity is logged to syslog(3) at LOG_NOTICE for normal operations and LOG_WARNING/LOG_ERR for failures, so admins can grep /var/log= /messages to find BE names for rollback after a bad transaction.

Configuration (via /usr/loc= al/etc/pkg/be.conf, UCL format)

  • BE_PLUGI= N_ENABLED =E2=80=94 master switch (default: true)
  • BE_PLUGI= N_KEEP =E2=80=94 maximum BEs to retain (default: 5)
  • BE_PLUGI= N_NAME_PREFIX =E2=80=94 name prefix (default: pre-pkg<= /code>)
  • BE_PLUGI= N_MIN_AGE =E2=80=94 minimum age before pruning (default: 7d; protects recen= t rollback points from being destroyed when count exceeds KEEP)
  • BE_PLUGI= N_STRICT =E2=80=94 abort transaction on BE creation failure (default: fals= e)
  • BE_PLUGI= N_SKIP_TRANSACTIONS =E2=80=94 comma-separated list of transaction types to skip (install<= /code>, upgrade<= /code>, deinstal= l)

Non-ZFS systems

libbe_in= it() fails on UFS roots and in jails without ZFS access. In non-strict mode (the default) this is logged as a warning and the transaction proceeds normally. Strict mode causes a fail-closed abort, which may be appropriate for ZFS-only fleets.

Testing

Tested on FreeBSD 15.0-RELEASE-p5 with the install/upgrade/deinstall transaction types, including multi-package transactions, the prune path (over-KEEP and under-min-age scenarios), and strict-mode behaviour. Unit tests cover the config parser and prune sort/filter logic.

Source

https://github= =2Ecom/usenix17/pkg-be-plugin

Feedback welcome. Specific things I'd appreciate eyes on:

  1. pkg plugin API usage =E2=80=94 particularly the hook lifec= ycle (init =E2=86=92 multiple hooks =E2=86=92 shutdown) and whether PKG_PLUG= IN_HOOK_PRE_{INSTALL,UPGRADE,DEINSTALL} are the right hooks for this purpose, or whether there's a less-surprising place to do BE creation.
  2. libbe nvlist property access =E2=80=94 the creation= property is stored as a string of decimal Unix epoch seconds rather than a uint64. I worked this out via integration testing; if this is documented somewhere I missed, pointers welcome.
  3. Prune semantics =E2=80=94 currently the count can drift abov= e KEEP if all candidate BEs are under MIN_AGE<= /code>. Trade-off chosen for the homelab-friendly "never destroy a recent rollback" property. If list consensus prefers strict-count enforcement, the policy is a one-line change.

Sasha Karcz

--------------AHskZcEHcd1RHp7NC0Ma6yOZ-- --------------eslmxPr1eW90pNoCb6z0VprS Content-Type: application/pgp-keys; name="OpenPGP_0x5B87F629EFFCBF51_and_old_rev.asc" Content-Disposition: attachment; filename="OpenPGP_0x5B87F629EFFCBF51_and_old_rev.asc" Content-Description: OpenPGP public key Content-Transfer-Encoding: quoted-printable -----BEGIN PGP PUBLIC KEY BLOCK----- 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 q37/cnVcsMc=3D =3Dqvvj -----END PGP PUBLIC KEY BLOCK----- --------------eslmxPr1eW90pNoCb6z0VprS-- --------------FtHe0OSm4AKualjN4Tz1NLch-- --------------x1T898DHlPqGHKNAFdm0fp3p Content-Type: application/pgp-signature; name="OpenPGP_signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="OpenPGP_signature.asc" -----BEGIN PGP SIGNATURE----- wsF5BAABCAAjFiEEW9tJcFXjBvf+7cvXW4f2Ke/8v1EFAmoFXe0FAwAAAAAACgkQW4f2Ke/8v1HB dQ/9E2gHMQCPnxflQVz9rnACcBnA9NA9+SR3ayyivxal+gcniYRCf1wKSrcNtJraPLSLpeIvKb/Y XvPRACEdpIDL3KWpmQVkQFoyyiOwHTYeO6qRu8UdC4hV+yXXNDHZi6FgJttNFBRWo3LIda1HjcCv nZPxrG4vyLe4i2cYP6tQtZWFAccyLlyPbzTISZVbihX7Id1BDNjQyPZn/al+UuD8Ay91+ELQod3d HERdLmiFXTENLFqYe3zeCX6FPKZeT/oV3wsHIVxzAg/JZDEvmZ/UbxJa9ie+zXgUBWqibzWqIR/M rvYVNKK3UdlMeXdFXa1goEb28tUxWMQ4TU1+8vZO20Ps8b5VThhm8QUQaOo9vQD+h3kSXDvNDpYz VaZhd/OGofDjRL5ePvUg+Zzm0rBDPEBWV5B+Uvrqx6Qb8k9T2wC6qlRzcrvtlpagJKDX4MjaBbFp 1BH04kC/xoqkmjF9QmR2+727MKT3K4ixoTZc9eJOTPeqCCOjmk7nOLYnEdC3C8PlXn9JlC89XRnL 5+2XcuBpXz0iA8gu3V8riRgfXH+vPWsG+vqfHy5HMIJTcNaymgy1le6/BYtuyrKNLoatjcHWxDYe 4sCyu1HKaUdkJjGHBP6KwCgtwXr8GIOzcIica/nkO2mF4re0pWSo3S+ijPaMw9YTeOBzuh8VFvN6 Yng= =6tX9 -----END PGP SIGNATURE----- --------------x1T898DHlPqGHKNAFdm0fp3p--