sequoia: Import all keys in a blob sync
authorNeal H. Walfield <neal@pep.foundation>
Thu, 09 May 2019 10:22:48 +0200
branchsync
changeset 3654f0962656dd57
parent 3652 560a7beb5e14
child 3655 9ca9bfc0e3f6
sequoia: Import all keys in a blob

- Up to now, pgp_import_keydata only imported the first key from a
given blob. Import all keys.
src/pgp_sequoia.c
test/include/KeyringImportTests.h
test/src/engine_tests/KeyringImportTests.cc
test/test_keys/pub/pep-test-keyring.asc
     1.1 --- a/src/pgp_sequoia.c	Wed May 08 16:11:20 2019 +0200
     1.2 +++ b/src/pgp_sequoia.c	Thu May 09 10:22:48 2019 +0200
     1.3 @@ -1636,14 +1636,13 @@
     1.4      return PEP_STATUS_OK;
     1.5  }
     1.6  
     1.7 -// XXX: This needs to handle not only TPKs, but also keyrings and
     1.8 -// revocation certificates.  Right now, we only import a single TPK
     1.9 -// and ignore everything else.
    1.10 +// XXX: This also needs to handle revocation certificates.
    1.11  PEP_STATUS pgp_import_keydata(PEP_SESSION session, const char *key_data,
    1.12                                size_t size, identity_list **private_idents)
    1.13  {
    1.14      PEP_STATUS status = PEP_STATUS_OK;
    1.15      pgp_error_t err;
    1.16 +    pgp_tpk_parser_t parser = NULL;
    1.17  
    1.18      if (private_idents)
    1.19          *private_idents = NULL;
    1.20 @@ -1665,16 +1664,27 @@
    1.21  
    1.22      case PGP_TAG_PUBLIC_KEY:
    1.23      case PGP_TAG_SECRET_KEY: {
    1.24 -        pgp_tpk_t tpk = pgp_tpk_from_packet_parser(&err, ppr);
    1.25 -        if (! tpk)
    1.26 +        parser = pgp_tpk_parser_from_packet_parser(ppr);
    1.27 +        pgp_tpk_t tpk;
    1.28 +        int count = 0;
    1.29 +        err = NULL;
    1.30 +        while ((tpk = pgp_tpk_parser_next(&err, parser))) {
    1.31 +            count ++;
    1.32 +
    1.33 +            T("#%d. TPK for %s, %s",
    1.34 +              count, pgp_tpk_primary_user_id(tpk),
    1.35 +              pgp_fingerprint_to_hex(pgp_tpk_fingerprint(tpk)));
    1.36 +
    1.37 +            // If private_idents is not NULL and there is any private key
    1.38 +            // material, it will be saved.
    1.39 +            status = tpk_save(session, tpk, private_idents);
    1.40 +            if (status == PEP_STATUS_OK)
    1.41 +                status = PEP_KEY_IMPORTED;
    1.42 +            else
    1.43 +                ERROR_OUT(NULL, status, "saving TPK");
    1.44 +        }
    1.45 +        if (err || count == 0)
    1.46              ERROR_OUT(err, PEP_UNKNOWN_ERROR, "parsing key data");
    1.47 -
    1.48 -        // If private_idents is not NULL and there is any private key
    1.49 -        // material, it will be saved.
    1.50 -        status = tpk_save(session, tpk, private_idents);
    1.51 -        if (status == PEP_STATUS_OK)
    1.52 -            status = PEP_KEY_IMPORTED;
    1.53 -        ERROR_OUT(NULL, status, "saving TPK");
    1.54          break;
    1.55      }
    1.56      default:
    1.57 @@ -1684,6 +1694,9 @@
    1.58      }
    1.59  
    1.60   out:
    1.61 +    if (parser)
    1.62 +        pgp_tpk_parser_free(parser);
    1.63 +
    1.64      T("-> %s", pEp_status_to_string(status));
    1.65      return status;
    1.66  }
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/test/include/KeyringImportTests.h	Thu May 09 10:22:48 2019 +0200
     2.3 @@ -0,0 +1,22 @@
     2.4 +// This file is under GNU General Public License 3.0
     2.5 +// see LICENSE.txt
     2.6 +
     2.7 +#ifndef KEYRING_IMPORT_TESTS_H
     2.8 +#define KEYRING_IMPORT_TESTS_H
     2.9 +
    2.10 +#include <string>
    2.11 +#include "EngineTestSessionSuite.h"
    2.12 +
    2.13 +using namespace std;
    2.14 +
    2.15 +class KeyringImportTests : public EngineTestSessionSuite {
    2.16 +    public:
    2.17 +        KeyringImportTests(string test_suite, string test_home_dir);
    2.18 +	protected:
    2.19 +        void setup();
    2.20 +        void tear_down();
    2.21 +    private:
    2.22 +        void import();
    2.23 +};
    2.24 +
    2.25 +#endif
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/test/src/engine_tests/KeyringImportTests.cc	Thu May 09 10:22:48 2019 +0200
     3.3 @@ -0,0 +1,84 @@
     3.4 +// This file is under GNU General Public License 3.0
     3.5 +// see LICENSE.txt
     3.6 +
     3.7 +#include <stdlib.h>
     3.8 +#include <string>
     3.9 +#include <iostream>
    3.10 +#include <fstream>
    3.11 +#include <cstring> // for strcmp()
    3.12 +#include "TestConstants.h"
    3.13 +
    3.14 +#include "pEpEngine.h"
    3.15 +#include "message_api.h"
    3.16 +#include "keymanagement.h"
    3.17 +#include "test_util.h"
    3.18 +
    3.19 +#include <cpptest.h>
    3.20 +#include "EngineTestSessionSuite.h"
    3.21 +#include "KeyringImportTests.h"
    3.22 +
    3.23 +using namespace std;
    3.24 +
    3.25 +KeyringImportTests::KeyringImportTests(string suitename, string test_home_dir) :
    3.26 +    EngineTestSessionSuite::EngineTestSessionSuite(suitename, test_home_dir) {
    3.27 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("KeyringImportTests::import"),
    3.28 +                                                                      static_cast<Func>(&KeyringImportTests::import)));
    3.29 +}
    3.30 +
    3.31 +void KeyringImportTests::setup() {
    3.32 +    EngineTestSessionSuite::setup();
    3.33 +}
    3.34 +
    3.35 +void KeyringImportTests::tear_down() {
    3.36 +    EngineTestSessionSuite::tear_down();
    3.37 +}
    3.38 +
    3.39 +void KeyringImportTests::import() {
    3.40 +    const string pub_key = slurp("test_keys/pub/pep-test-keyring.asc");
    3.41 +
    3.42 +    PEP_STATUS statuspub = import_key(session, pub_key.c_str(), pub_key.length(), NULL);
    3.43 +    TEST_ASSERT_MSG((statuspub == PEP_TEST_KEY_IMPORT_SUCCESS), "statuspub == PEP_STATUS_OK");
    3.44 +
    3.45 +    struct entry {
    3.46 +        const char *fingerprint;
    3.47 +        const char *address;
    3.48 +    };
    3.49 +
    3.50 +    struct entry entries[] = {
    3.51 +      { "4ABE3AAF59AC32CFE4F86500A9411D176FF00E97",
    3.52 +        "pep.test.alice@pep-project.org" },
    3.53 +      { "3D8D9423D03DDF61B60161150313D94A1CCBC7D7",
    3.54 +        "pep.test.apple@pep-project.org" },
    3.55 +      { "BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39",
    3.56 +        "pep.test.bob@pep-project.org" },
    3.57 +      { "8DD4F5827B45839E9ACCA94687BDDFFB42A85A42",
    3.58 +        "pep-test-carol@pep-project.org" },
    3.59 +      { "E8AC9779A2D13A15D8D55C84B049F489BB5BCCF6",
    3.60 +        "pep-test-dave@pep-project.org" },
    3.61 +      { "1B0E197E8AE66277B8A024B9AEA69F509F8D7CBA",
    3.62 +        "pep-test-erin@pep-project.org" },
    3.63 +      { "B022B74476D8A8E1F01E55FBAB6972569A7FC670",
    3.64 +        "pep-test-frank@pep-project.org" },
    3.65 +      { "906C9B8349954E82C5623C3C8C541BD4E203586C",
    3.66 +        "pep-test-gabrielle@pep-project.org" },
    3.67 +      { "AA2E4BEB93E5FE33DEFD8BE1135CD6D170DCF575",
    3.68 +        "pep.test.john@pep-project.org" },
    3.69 +    };
    3.70 +
    3.71 +    for (int i = 0; i < sizeof(entries) / sizeof(entries[0]); i ++) {
    3.72 +        const char *address = entries[i].address;
    3.73 +        const char *fpr = entries[i].fingerprint;
    3.74 +
    3.75 +        cout << "Looking up: " << address << ", should have fingerprint: " << fpr << endl;
    3.76 +        pEp_identity *id = new_identity(address, NULL, NULL, NULL);
    3.77 +        PEP_STATUS status = update_identity(session, id);
    3.78 +        TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
    3.79 +        cout << "Got: " << (id->fpr ?: "NULL") << " -> " << (id->address ?: "NULL") << endl;
    3.80 +
    3.81 +        // We should always get the same fingerprint.
    3.82 +        TEST_ASSERT_MSG((id->fpr), "id->fpr");
    3.83 +        TEST_ASSERT_MSG((strcmp(id->fpr, fpr) == 0), "strcmp(id->fpr, fpr) == 0");
    3.84 +
    3.85 +        free_identity(id);
    3.86 +    }
    3.87 +}
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/test/test_keys/pub/pep-test-keyring.asc	Thu May 09 10:22:48 2019 +0200
     4.3 @@ -0,0 +1,268 @@
     4.4 +-----BEGIN PGP ARMORED FILE-----
     4.5 +
     4.6 +mQENBFV4PbEBCADTmjGDsoti/VPoZ3w2oCjLBNq1jWIGMkbiUgCGUQjVsNrSZ80U
     4.7 +7RmA3Pcu3hhiVQNBGA32vL6NPhSJPanVd77s6XVZg+Gq7llbGGkuIxSkJvVrWzYc
     4.8 +kjMsAInlJ8Ll0kHHbgATOlO5OtQ21bLCfWZPSq74HEVzQAPtCGYFvOgpCktKTjms
     4.9 +GXe9ysiYN8CEWMVNbDqXmvFhi4UifpITeQBVM7dtlBw5SoeLZpsHIlKF5i5WPkNw
    4.10 +7nuMag/+lRpOqvPumhOmqybWHuAR/Dq0pOOPh6BzZ4OzOBL96aWUe1dcnIZeBEm8
    4.11 +oRxYC3nN95YsjtrLK4BQZTYDTzeh8FIccsLdABEBAAG0RHBFcCBUZXN0IEFsaWNl
    4.12 +ICh0ZXN0IGtleSBkb24ndCB1c2UpIDxwZXAudGVzdC5hbGljZUBwZXAtcHJvamVj
    4.13 +dC5vcmc+iQE4BBMBAgAiBQJVeD2xAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIX
    4.14 +gAAKCRCpQR0Xb/AOl5JjCADEBoordVBCmphG6EY+u5yjj/xeQN4Kc1Rl06Ii6m18
    4.15 +4hnF/osxnTicr+A6Hpwf8whXULuSwXvfuOsVOQdIc2e+1zrecTqyNUWuRs3T7uZ2
    4.16 +5dvROg1XZuajMPf3wh5lX2rPRhOt3UNXJjQfc1MSYXpmT+PoqFXBzMqJUo2DYcw6
    4.17 +MSZekoWkIzFXG2s2YNwILwPnLnMesFtzU6mn9qhfoFsQA6aku8AbG+SNehNZvGuu
    4.18 +UiBmu+4UYNoc/RJa7vNWECv9qZQsT820CuoOZS9MFV7nQlgkGoPerlGXil0vkOG1
    4.19 +gsuQD8QkuaTQpn1vYvRcC0P27qLfrqlPv2Ih2hoIV9tJiQE4BBMBCAAiAhsDBgsJ
    4.20 +CAcDAgYVCAIJCgsEFgIDAQIeAQIXgAUCWV9iIwAKCRCpQR0Xb/AOl4oaCACZrLPy
    4.21 +c/lGHNJ8TT3KxIls/Ss62nWq4wB7dura+IUPVqLMNefJamQqG4BSGDR+WhC6Luf4
    4.22 +K5JgauVbHbIUm3y9LLqAJunePoOAQEQmGAIcuJzHM/IKXJoTdudjT7FJ+dxjOHLh
    4.23 +zYOIJw6I301sJUx25LxxTihj3ClUzL1uH1IrH3ctD1yL9lPIixQ3JocGUYZsZ9sw
    4.24 +CWlFzhYelAUmJuINJtKMeWkFvkVQ9xMU4ZGU4RGFdYcXVmSii47dNQEiW8XzcQ6D
    4.25 +TFCuaS0WWy2tJfRQSlaOCBs/DYtlrWWWBApinb35QVWNyAmTwCm8FlvjFA6kr/UE
    4.26 +9VMfP8bhbhspQLihuQENBFV4PbEBCADQwKB97t2B2nweprfpbH8QgLCzJYaAMrpc
    4.27 +aUaJqm+J3C9eaepRXTXGtst1zaLbooG2b3QHfDzI2CEYMxO5ynmmSBOe06VKw/Pa
    4.28 +gBzK5ur/eOycl0ZPFSXdlDj30BQPvRdJvLS4OTMdoKoGpsZDY4hOYj67oHo3TFtr
    4.29 +LJCvZruPARkI/pXiOX9FqH4wquNNaYW1qwk/Wq3k/gOMwp0xjvc01MbadaiiVquJ
    4.30 +k6jjPrd2wP4FYxIADAllzMpwFAJSWvgCfmqVbukYOnaCp3QRQXQkc78TdqGXbD5u
    4.31 +wJzkxxiEsMmiGT+7RDLIKwXheKmmGXSwgi8m+EndUiqMTvOdjyUBABEBAAGJAR8E
    4.32 +GAECAAkFAlV4PbECGwwACgkQqUEdF2/wDpeQVQgArnfQ7uvG0po/CPepbrdytI2n
    4.33 +63U5dm/MFMsvXpZYVYLO/mROc+akZCPwS0yxtSMKK+tYM9leQx58r89c+K1GeZok
    4.34 +o7xziwmZbt5zEITiJp5L6gg7k6CczskPMx07gY8ooscBC3cFJhz1A0o73BKPR7J0
    4.35 +iupaNmI3sTd1/RNQm6573kGGwc4m2bcQttvN5ox8yimn2QnK3D+6A+Mmzi3Rd11t
    4.36 +F+tAWJIsfaEgDJZn9mOdUkV2ckoSk1K5PptpXSsKLOL+e2WuxSMIr8AVeRqkbYYK
    4.37 +6UzX6qIgQIrMOuaXqtRaNxNccnzIS1YtdtYERSnTaBotNp/FF2wfI7BNFP6r0IkB
    4.38 +HwQYAQgACQIbDAUCWV9iOQAKCRCpQR0Xb/AOl5ckB/9UBwdhKEro2dSkE23KY64I
    4.39 +/dNXljndLOHK8fARd1B1LWh9YHOXHtY4+h0TC8PL0IsK4j5PK8H51XqhMKKVYDVG
    4.40 +lhLUQp4qcDNcuO4dW6dS/HqAfARpLSKgwEEWW1bFzDmiOYGnQjxuEsFPlXADFTws
    4.41 +YqVX3lvZO93nU0fa5QRK65nWiMomC0Ym09hZuznvk07kyZtqAlSNgPUQNADpTJVH
    4.42 +teDbVo/oct8oRqo7ajO+psOVTaQHfEeHiFvPo0/MUWGeBhL96pRHIeO83cSipjh4
    4.43 +q46bEcclS/gTGHtFweVOiqRnR4H5YEjurCd84h8zF8MAArhxBhAtbg1nYgeHjkKX
    4.44 +mQINBFh7zckBEADIBrJVrvyjnLme7xPd45q3iShb+XZO3lYmLyaIyK5vg1xaxFv2
    4.45 +sXS7NN2q5/CUmM+Ab2+6OSOzgxvMpJ+HTSn2F6Hv7X7LWSlF+gn+wz4YlUwh17fv
    4.46 +I5UVtMSxiMyB3/t900g4LXOfOOFixpcQz9R2bsSFqBJt7aqkA5YlZxtBsCZ4UEZa
    4.47 +3b2YnTPDbwYdA1HRb1f9jEEMSpAxqmK3DF9zlSKqeJz6JX6qguUlTcOIMOyWVtKl
    4.48 +9RTl3UZrfg/qPcgilh6pK+MvuStdRdLQ5e4RPFH8G1X399RG7Ce7hQMysajBWv+8
    4.49 +ek0kARqSh6DvgUIHkEePxHQ9sKZi+R72i8A9PG512veYCRw11DzpuBbtwBvN48nz
    4.50 +g46d7+qtN8tYeylGTNtRQ+epbfotTYSPqjgkpGOTr6L36ushKM2MLDOhqjoJF+eP
    4.51 +5nbjbnaZGniEZym8I9X4iTm3/WOKyqhe2lp7UnZYzDAbkNz64miC4CIwomysZy/G
    4.52 +1VOGzeyo5SAx96VXeaHtnPIVzZqGS5VaGP39cl9R2oYW0Ur2dwHrcy2gH4abyXVA
    4.53 +hQfbNOrB0HI49cKR7xo5amMqS+SxnDS9CvEjAKi9hIHAUTRKj6m3C2o5t2ROYZZ9
    4.54 +lWTBIts1cGwMu1kVQgGYnnifHpuF2WUWVShQjSzBnW/OJUl63gW/1JoxRwARAQAB
    4.55 +tDRwRXAgQXBwbGUgTWFpbCBUZXN0IDxwZXAudGVzdC5hcHBsZUBwZXAtcHJvamVj
    4.56 +dC5vcmc+iQI9BBMBCgAnBQJYe83JAhsDBQkHhh+ABQsJCAcDBRUKCQgLBRYCAwEA
    4.57 +Ah4BAheAAAoJEAMT2Uocy8fXLlwQAITvJqBxGRTtuU0FgFLMvq4OZZPhumUGjhi1
    4.58 +TClxPQT8+uF1Sl/pn6/xgW0Tswhx9XmhzoKipFmr2u0N9u2rcS5MupoDarZQe7z8
    4.59 +AaxdwMmnoDlSdttTsE4nj8tqx4zf7YI4rSJqY68iVD2b64pOxkxgQIBhc28t9bRb
    4.60 +/RNLaajtTwLlw1TVO5zH7sKKcPehHXX5avomLDt5QKpN/wV4f9F8pUfoIw1q9vjL
    4.61 +/9fUQmWnLsnNfVVyB6gq57D5PLDa+f50wDAyopzgdY1NG23L+4HCb4EUjUtQXBpb
    4.62 +jD5QytSCzT2a0Nfmpj9e6YmljcyeJsoWvv4k40Ob8Q+ZWCBc0x6SjYAHbj1PjChW
    4.63 +fGHl0HPhqXcL95Hg4q8TTXMtrmPZ3wROUxCDn6/O6NYbCgebTmEcgKw/DxdTeKFr
    4.64 +0JLqR7qRp1V0h+DADju8Buv7ticJw4aMy+dUZgwNheyMYWYPCujY/Yh32z+08pg0
    4.65 +XcAqKCQC9KGlhnaulPKPdQ3oBmPWFIflD+gG5B6pNrlQWm7P6nvVCslf1oLeuIUM
    4.66 +e90bBmmuh/b09zG/wyM8vkDxopQakSn8FwP0MyfOrmk8MYXFfF298xpzLv2tNq/5
    4.67 +BROVov6F5ewEdG2MQ/G83pwzwZzrOwl8wUnPKM8nMoInUXi07Lnd1yprOWpi/TOj
    4.68 +O3PyvrbduQINBFh7zckBEADXCOV468fB9CNKZSh/QCtX560vOCKRHMItx5ovx7QL
    4.69 +Ti2TgwoO7KyhwgHTm1SARug+w9/jyYSU0NNdXOtKnrKjr8iwIfE3RAL84EZSDvK/
    4.70 +zXJp8u1gmgAluzAAHk2NfFX4WFtASsmd731wNAb82URbQg4AbVEmcMI9/WXusXQv
    4.71 +7Vbt4lw0+JQCuI7B7comwpdMcprOQVt3WK+iznp1SJWZ5sxzYerzMO8Jdx34mO5o
    4.72 +UiseSqV70KIiDRwn4YX3DaIINrNvk/fjmIyDEQc6f/zVAnSKnj3tSOTRCgKEWisp
    4.73 +6D5Gn8Y083YW+5cgXJAazjuB2ZHdnAEXJrNIOV/vfnU+GOMja1LjEVt7PX0pAzpD
    4.74 +RE/bjgByHAkpw4nnwclJ7xwnvcHCrXcW0OeaHvgqY7D1i3b9NeVbM0rfXrZctPuq
    4.75 +OESTJbT+Jz7ZJ5oeDRzgqJ44BzTrQ/yRkeHUF9dN+16bjNOZli24C95fF3jIthbt
    4.76 +8gOFgJW5OZEVz6w6AaU1plhGLDBZh8cqCuYRqyi8jDCee4SNrBlwcLMzzDtKPguh
    4.77 +gdQzleG8lHxXqVY88HNYDThhe1ZWoKkncP2O0sv0WFhu1y7qk8BKwang9UWwjw/C
    4.78 +3MRvz3nzttC5xcTLMZB1WLPQrE7GjDT2zmvvTENNX/VTnVeu3JHL2yYAJfoiCgBg
    4.79 +wQARAQABiQIlBBgBCgAPBQJYe83JAhsMBQkHhh+AAAoJEAMT2Uocy8fX5lIQAJ1b
    4.80 +al3rNgTJ4PsXieFyiVXKbo+DuuDsdYBVqVXFvwHGv/OtzyWnv6DCeBVAsQLK6urg
    4.81 +a0ssZuHYVAD4ECYY7ELDiFRn8INYNKh1bZvqw+rH6QJGbZnO1IL9FzaeQAw13WBm
    4.82 +JFb3w4npEVuI0ZDmfPYAqzFI3ACEwlrEYbGa2IGAN+Nz+Z7a10+PJk86wdy+bgPQ
    4.83 +qAMARxo+hzeLfFb0WP3EVOkWi/meMNyOK19K/Tlp9en+SFPvTDeGiu0PQVTH4bOs
    4.84 +q7Hx20zIFAx4tOGZogTWTfOhEc9OAXxgabBPjizHeqU9JUZJe0OWGHDYLwfy2XlK
    4.85 +oj7BVS792QmciNamyBXzwtZdTayxH16QShHKox7N/mMhtgRvTbIAAxtq/NLKbyyE
    4.86 +XnlKEuB8BmyyFVgxn4D2mR3KIHkfQ1uUYlISkKc4WX0IBQa3UZnHApUxewEKMn5i
    4.87 +F53r1T4Gsf/txrRs+El50hUhK7yLmtuc/fBscFz/LfUZg+iwAnPlGdXST9cvP9WD
    4.88 +MfV389KZLXSSsZ0lXTc1FjzEuAreZVtIHi+7vTSq6QaONF665nZRfdGuU+eBUxZp
    4.89 +jGevGRdfkEjnuIXM2yqPo2t4vV5AfGPneVKCzdTrY48psiuRyFpIlMs3D7BfcK9a
    4.90 +x77AhiRfwLzS2B+UJsnfUe1qeasF5T/JWEazo2CSmQENBFV4Pl8BCACuukQLwsHf
    4.91 +tH5jkVsSL7COFhamNsEE8lZ8MG1f1Rx5ztPuZTnaYXyWODgpj2Bxz0TcP+Q17GbL
    4.92 +Kse7TWD1k9i1RzLWz8ZSCLYq2TtjLWPleVuGGWeqY3tTWHC/nFbivolNPA0mL203
    4.93 +8TGdBolPaZiPZ4P8wuQVYNfDqi4utcezGDNS8OHhEPhfyKKoSM79HLoUPc6xsfim
    4.94 +xPMrylI/i8bFvfDYz5vmydefvAxNhqjLH3Gmhj1pnInsraEiyh7Y2zAxCfr6hD9n
    4.95 +ky7WixBinKFFhQpcUu1o+Ie6UGwLVbTyRMOcRsobyahqA/m2HfDRj1Y+n8HHqsQk
    4.96 +B2BtmMYXla3jABEBAAG0QXBFcCBUZXN0IEJvYiAodGVzdCBrZXksIGRvbid0IHVz
    4.97 +ZSkgPHBlcC50ZXN0LmJvYkBwZXAtcHJvamVjdC5vcmc+iQE4BBMBAgAiBQJVeD5f
    4.98 +AhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRBZv/SIycLuOaR5CACj3E6y
    4.99 +kNqjGS5PzghYfLJso6j954QzLwOozTzU/3/HWH4lC3Jmfr0pGI51KZ6Xevrp3N9S
   4.100 +xRqruJCFRtwNeH3ujIgDh/UHCUEsP/+d74SOenIBYGUKE1OJmh8/LQdkNSc6JNdz
   4.101 +JjDWdKeh6cAMFvWju/Nqtl/l0FGspQU9dmCMtzkKgmwoKZW56aEVZ2lTxqNEo1aQ
   4.102 ++lLrNueBq0/Q5kAVEzUG7Ufm19wXjWenEMeeElX3UAGudLJuckx7uD8W/yBwqrRA
   4.103 +baCSeZf6RVBLz96ekjWrVfMnmjkPuQPPt5cs98RxQTpxk7b6xLaWXymhA6cYU+FA
   4.104 +W4DpbjfJjMWIFDcKuQENBFV4Pl8BCADKQ2SV6gjR5N69xVdiCaefjwobrXR1niuB
   4.105 +HBNTXMJwPk2xv+e7fY28RK1BzODYCzBhpltvRoCcJi9S7Rqyz81nbxnw/1TaKtn6
   4.106 +dDDhZPVHjN3vasDueM6xTEfEihNc0Owf4wz9SBjuredUVkdTxU7FxSgVP10dOxhd
   4.107 +tkjWjGW1DF6WlYA8BAIEdbpoheJHz3NFkhPQ8Dlzo7Ioe2t7vrTztcBX11o2e+FP
   4.108 +Oq1SmhEr78wbROAyCVAXK+8qDh4zDq8iAMZK/KnZrm6pP00+iBRcb+JQgn3Gn+hU
   4.109 +0lgE3YB9kBJLeWaHxEPNnnNNvW/BMl53ctf8Ip+pzpA1K/S23KU7ABEBAAGJAR8E
   4.110 +GAECAAkFAlV4Pl8CGwwACgkQWb/0iMnC7jlqbwf/dP4sXDRiR5uVMh5WhOn1S8Mn
   4.111 +HZhLWAQ6fI9/KxggCPhgY6zAgszPMutzBsQlV4P6QX30d99IMJrzGYYxjN7Z6fF7
   4.112 +us9u103+GTzGQH7/47JG0eSTSaKQvqEaN1+6M/OBZKcwNW6xHa+lhIS5nJGV3Oey
   4.113 +/RFQwucBujQbtyjDN3aGshwqzhJXFBlF3RqFzLxuAJmeOVedaKvdPjRhgFuxhkic
   4.114 +UhVp27qXQCpDpkUkj9hb75yCE6pAzopO6s65yHsnFyehwgyMrfpTPlPM86B1LH4I
   4.115 +EwSaOrEJSdHnnFD8nnSIjRyfra3dsI/RVNmYX8EkMGICzoR4lWcYFShJQM6QQpkB
   4.116 +DQRYHG/IAQgAnvQ58f8mqiMirFeBf2WVk+gIfYpKw55l+vanCIRZJu2NtZPzHlZp
   4.117 +vMRQvLpgrUk9cIWvnL6bzptex2Mf2zvCHqfXi7e9ilGsusPvCI7yLLRahKFlglXu
   4.118 +IDvR5319s7BB38D6u+ePo35dmzSSgdSXv/CeKM3Vv6gFr9exvXFpWxQRi3xYk3f9
   4.119 +RBNMya3K/vmeJLjM1U2hvbelPjMF4VKj2E+kGA8T6XFPC3qfi2T/z0K1lnZx/Pho
   4.120 +VfhzZn62eupNH5hH1r6pUE/GT+rv7+1o6wZnNdJgX8OVOYrcJd5TGpxbXPEaQ/ca
   4.121 +lICWPN3BTQXZlYk0W86Gtla1TzAIdwqMiwARAQABtEFwRXAgVGVzdCBDYXJvbCAo
   4.122 +VGVzdCBEbyBOb3QgVXNlKSA8cGVwLXRlc3QtY2Fyb2xAcGVwLXByb2plY3Qub3Jn
   4.123 +PokBOQQTAQgAIwIbAwcLCQgHAwIBBhUIAgkKCwQWAgMBAh4BAheABQJaADefAAoJ
   4.124 +EIe93/tCqFpCnGsH/3tBl4qS4M8Ttku4NWC2an3QOlsKeid1+k2GkEoJuyuyaudq
   4.125 +Q80ZVxIOdQzOJ/FdvOz3VudW1i6HXqQ3uVITswbRRXI6Pf/ZzIjFkUGPMgfyMM/q
   4.126 +ms5K3puVJWt4OhrOfU4vykNqUu0oyTBYL0STdpRyFo3LdcDDZyGPUWUeo9JbBdBf
   4.127 +Yaqm24EAgmbE7MaV58124oDNJAR/dSoRK6WqqXfY6N5TU+nO2bIJiYExpexIkv3m
   4.128 +P5notEf7mr7ZmLsDoZCZS1QARVUJEGslx3cUS3tSrZmoK4bu+xpTSRjRjQEvQpFz
   4.129 +Nj/Eakn5p+fYwlHunSXMJc7/DZgw400efQi5BL65AQ0EWBxvyAEIAMT5UsIGF7Pp
   4.130 +U71Ro8n6vl/cFdf8PxlqT8GWlCBjz+2A+mjALu1Wv0BC3N7b5sdQsq6a9woRl5+F
   4.131 +bgELvaO9SCwIU0BS7Var3poQzdgFK0E3nLCTYi/IGxkHolODV04ikpfFsTE7xJEZ
   4.132 +0pPH1rEcqSK5u329+vllZfwwYRdsR8n1NzoOU0BVT3gr+mUqAMYRqvGakzF6agnO
   4.133 +J7hCyHdpJMEA3fhqm6zXKObANVm9bu1c99CUCV1SkpG9NbDrzMzS2F3bF+9JDRkU
   4.134 +0Lv/FUNtAbo29x19ElMxhITZ7jayDhMBtYbfE6/FLEhnVu1zZHZm3KXJa10sHBs5
   4.135 +PDHkES/LLj8AEQEAAYkBHwQYAQgACQIbDAUCWgA3nwAKCRCHvd/7QqhaQvCoB/9q
   4.136 +E0g7Uy47rfWtDNym9xcJUVfAgsHhfurN4kJAfRsgbDG8+r2bJcUF/ouPBhSzsFU/
   4.137 +q6YHmkss7LEWutYwzLxluSUK+jQBLmaBryIktWtQE4AFagcDWxEtvTf9czE7Pnlo
   4.138 +iLbBNuvoAmmaQyBBT8jlp3MiRATW2GQLfE3rW6gfJI9ofLTHQwWk1SG+J3BMeQec
   4.139 +2zIUR6XdZGAgujG7TadL7cxAoRWzwoXDWE09hCfbyDHp8TBEbEqGQx2inljr3d/r
   4.140 +xA1Kgw4TxJgOXxcV1MQApMEEMM35o3L/rERVsRRKcpQU68wK5TB6mhC0pT/OZRTe
   4.141 +8OLYfArQwrVc8kQKkiaomQENBFgcb/MBCADSCAtS+k5iA0iP700HPpRh6ua66/9v
   4.142 +UQH9NW3WpL8lOw1RbuVTf7focM7NvVmo5C+sHI73zYwBhcf/+z0DoJBTivHOjRyV
   4.143 +vuHJE79XO3DB6Ed0Juu4FI8mt2mPnMI3fAggTR5HK3ghJf96/dhN2s0C32i9O+MQ
   4.144 +G2k5SktTsge/sIu2fmVDJxdtlWfbTOe+QImoYxUCrhomyOf5ramnOmWIIR7oAa8L
   4.145 +xuWTC8nGaiSuvCSgPwo/2dWyMyEGMkokfj3RhkLfGs3IKOXORQicKRYmsHO3p9YM
   4.146 +duXRKDiRQ3H1FedIoaVnxXYbQTtL897PjS6B+BSHquHzJZwrag/KE8+ZABEBAAG0
   4.147 +P3BFcCBUZXN0IERhdmUgKFRlc3QgRG8gTm90IFVzZSkgPHBlcC10ZXN0LWRhdmVA
   4.148 +cGVwLXByb2plY3Qub3JnPokBPwQTAQgAKQUCWBxv8wIbAwUJBzW0AAcLCQgHAwIB
   4.149 +BhUIAgkKCwQWAgMBAh4BAheAAAoJELBJ9Im7W8z29mUIAJQaPFLd3ydRIdBsgg6l
   4.150 +P0ueXH383C4DNPM4cDMfUNwyAqUjYzX09xVJHVMOPRcIfdrZLHZ5t2ro26wqWbHy
   4.151 +nEmIeBBTEf/wLMf4CFKVfbm53zhbOzfFc5TB3hZVCU6pDowGh4POUapzYOkK17QN
   4.152 +Gfm/AjqEuntj0RNO4jISyihqSZH+QEYFv7ZTPZc9VbQ1YvTlXt6As0KW2c1uraOb
   4.153 +uDgmFJlUhED/l2yZfRqwJVjvxXESjSHuLGSijDJlKZBcdsryy06KwzUNRUblbIR+
   4.154 +xgNLnrsZWlb4EXQ9TBth3mShJbIaCMxpOiuavFjtdYBEIxzEpb2QmB7Z9AVaXys9
   4.155 +PC65AQ0EWBxv8wEIAMEWcd7akENhm+qScRlyzJRamB7DJUK79ZtU0DoJuK9FFdjd
   4.156 +FjTvIPkjtPREaaA0GwNjSLkipff9yExk/QtjbQM0oaNBaDOqql9wT3MX9WLZxd1f
   4.157 +eeQ7UW2UZu9zqTuocDimHsCTFDUCWkxrzR3COVN2F+8r3uMqbNrqayUeRpOvn+9C
   4.158 +s6nSGEG70GeaqZnYJyaObwKlWDW5acOnPDicCSKvpRHZY+SJF+n/KjKszmg/EMPk
   4.159 +8j0sYXAZ7/mu8x3XuxfQtb8FeV874cavDGwEhyp9+QVJHNbl5Op7Q/69rSNnfpIq
   4.160 +4B/vL/5yJ/TbVZ9kaeyssKQMgA6nXuyP6pgEDW0AEQEAAYkBJQQYAQgADwUCWBxv
   4.161 +8wIbDAUJBzW0AAAKCRCwSfSJu1vM9ssECAChrPncgPlg7AIZk6TOev9UuqIubbZW
   4.162 +n1GKM67RziylGfisGkE5ZuONPXfbuHz/dS83UzIc7oHwmmPNKhiQFf0MMp3wxaO1
   4.163 +V4w1sPPPkzNlLaorwzZwwGvG5zvYx14o0cZtZVkwQxyJKNDvYLIS+ye7fCySmuY/
   4.164 +Fa5juFmeotuOLt6Ch5QKpMaAUOOSOAay82LP/Ne6nD7AQOIohG0HNvCl9Qfh+AAg
   4.165 +ezWUmTZ+5ZBKcQXukOQ+MplFGRkPMX9bqTZw9Xpg+CccZNFsLfcTrCkuQrk6iyLu
   4.166 +NMxox1FE/ceva2RcWEwM9kdsFQwgtqRhZlmaRIiGydJ9ZPZ/BW+/sd1ymQENBFgc
   4.167 +cBQBCADZpPABxEShbYP4pYn1RNkSTCmOVazU5c418ItfXwSsm/PQ1gisSW1Es4Kw
   4.168 +2ZdAxJVCM1n3D4xM828Cwynf92/M/5yR/i0mAOxEVtdcOIvTngng9+Kf7IQkiP2x
   4.169 +8NXWy/hpdAEoQP/vHfRJMudKRYNSe0qY6qeP4TbO1RUdnL6D2A61gNKYDTBvwsTa
   4.170 +cayYdg3SvQA19xBeYWlMBZG6jOn3U0j4ih7eZfk8e0nGc/zzs+skgyYc+dA/SDAd
   4.171 +h8kkgYf4AJyp+eIEY6HV/xE7hTdFDFLXCVFEav++0Tp88ptnxe4wTkXLYSw8ep1j
   4.172 +OPEGPJzha4ymD39VtGb0I/VYKOpjABEBAAG0P3BFcCBUZXN0IEVyaW4gKFRlc3Qg
   4.173 +RG8gTm90IFVzZSkgPHBlcC10ZXN0LWVyaW5AcGVwLXByb2plY3Qub3JnPokBOQQT
   4.174 +AQgAIwUCWBxwFAIbAwcLCQgHAwIBBhUIAgkKCwQWAgMBAh4BAheAAAoJEK6mn1Cf
   4.175 +jXy64mkIANDZVtKEn6ISslnKQvjUd2oudKVeY+aIjwVvcilnwTmSn+ZPFzSCusjq
   4.176 +4JYW5rurN4evjBV1/6rnKYvVijlC1qwb3bkC5DbV4J03QLBZkdjQz8SvCBgFrBJH
   4.177 +9unpcrgBiLBPoXKQJf/1hsrUt2VwiW/x17eT9awidYnfkrfds/qef5zXIaqY9ejL
   4.178 +pwAY3Jq233jsUdMKugFSeqDpenyKl+5H39h5f/EmI0K/Y4BGoRh028B94qlf323H
   4.179 +zrpuXybIwTvWJ09BVr9wWxDvU+aXrMVB/U+7UsdZm0cUWr6eJoPY/8Pp9wLAM/Nn
   4.180 +qAGKfcfQbsFy3FnGmlqmLvIfrIOgN+e5AQ0EWBxwFAEIAL4eMuG6/UgBY3wSh9LN
   4.181 +n9et3zhX6fNkGFC7YBRX83XxMEtJ2oex+nuvDzgGm8yvGMVX4D/L83Mhkp0BQ3Vy
   4.182 +145n04v37vsa8Xb7wMkdNrYhueauyICWVJaIO0fABNwAh5PXw0J8mZRZeZh6jHXl
   4.183 +9jUc8WYWdszFiFPWp1nswzaFkxmPPizQk58BH96lbb0WH/+jJB3reeeolXqwKfxM
   4.184 +4r2OXrI2lIXCETIDbIz8QuVj3mOlg0lfjiklDVHSnMqthDnGs/IIW/1jjB4TsmyK
   4.185 +S5JqcbKLiasRi6+WwQ9KrPkfC587bvyt7nXf74mKCWS/33kBSFGrOb2xu3nZwNJ6
   4.186 +NC8AEQEAAYkBHwQYAQgACQUCWBxwFAIbDAAKCRCupp9Qn418ushuCADExQ8EvdhN
   4.187 +ueVjvfDplivzF7DEEcUae9zi/2N0f0Ovw+rXMUb+DmMD1O4UJP26ocJ5uwWYumtQ
   4.188 +LjbWDxbzkdsAqBM0yR6eGAyOP3z3E/xHuOne1t8FWLGIVE0oZ9Gj/6qLmCQPw/GO
   4.189 +MXIQPRU4LZrZ2fAmE87yvvV8W4Dw9bOIxDmqgwBoumRG6yiKE0rL7YfdLeBa9FJm
   4.190 +1hJWnpvDLKQjX0+RfQ8kAYJQ3XfJsUq+StnCBlfabFb2G4Y0wJZcsXknXWNVixlC
   4.191 +fQcn2YlZHg3PxgQnW4Fpirq3JXuQQc3+DrMG9LxhQYk7E041hSfZMoKYVuSr9Ux2
   4.192 +wOPKLuggPkXhmQENBFgccFoBCADFipauu1Myw+23yfyHrLwxzneM+i5uchduQ8Be
   4.193 +UmwCQx4ZAzQN+HYf5Ua8o9nSgz4LI04adde9dbEpKDAvp1H6Olv6mO+Pfim6rzR+
   4.194 +iF0akM0Ek6LDyJbSsi7JsZ4GXTqqo7Hb57RmJZaFVn3a5gju4cVuNxr705sMvsTs
   4.195 +uw882DvjkiEtB5kvDCwWHzp8F/19EF2besIu01flrfBlRoVaU5bQRJspA2b39vsK
   4.196 +7t6VqKf4OCsWIfHjW9Met47h3LLHGpE/5M6BfIZVZsWIIozzMc2hoL04l5oJp4hl
   4.197 +ONlKoAj/lvWJUObuUg9uH4/1Lcm4rTXPyKHYoQTJYk457wQrABEBAAG0QXBFcCBU
   4.198 +ZXN0IEZyYW5rIChUZXN0IERvIE5vdCBVc2UpIDxwZXAtdGVzdC1mcmFua0BwZXAt
   4.199 +cHJvamVjdC5vcmc+iQE/BBMBCAApBQJYHHBaAhsDBQkCx+oABwsJCAcDAgEGFQgC
   4.200 +CQoLBBYCAwECHgECF4AACgkQq2lyVpp/xnCiTAgAtxIMvynbGrtPhZrwcgV9aGp2
   4.201 +h6jNasGSThdIPxCVPV/Rtxa5wtnvplA7gzGbW2EXV6Vlfd0AxKKrErkr/b+OAfjh
   4.202 +Yltg8OR5jyH9Ydzy3uq08q48nP/M6ueamcv0X6b4DtygtTzImom2C4bZH/lV+hNe
   4.203 +oXBy0ws2v86I0K96FO9Wr0TfgkDp+wtzUB1jA0IfAJzDN2e4WwFhvtVWyO5qHEht
   4.204 +RFxw8AIDrDCXF7AzWLmRTmlq78/8sDBEMLBBfxtrFvrT0AAluDB9dHa/rhtF5/Hy
   4.205 +FUyRUKLhTSfPFjslBEPAl50qzdNbS1zqN2LB/EPFVFbMFd9P8JZNjVpVyM4oTLkB
   4.206 +DQRYHHBaAQgAryvuu7/9k5wRiSF6gAx/DibsTceZH6CAwtkca04PYUwi2iypCp8R
   4.207 +CSkSQvob7Iw5uzw315G+FbGQUbKuFbCNDoYBacVnS9SgUbd6p0RIe+eAIGbIKDgZ
   4.208 +sLcwvTkLQwVb+V9kS7xYKNvWQ3PEzgvr2qtyJoTNpPZ4Qz5nDhLTYSwwbv6SyqHq
   4.209 +E9Ej2aqlZvq3Umra5L8Xm/dG5PPn3A4+vI/EpNFtu11SN8AJx0W0bYc75ry8vNVg
   4.210 +/jjhfwCadsJ755+my4bkrxT1IVZZYLdS5Kie6hob6P/oCokHc67HtDbzP6j5sOQz
   4.211 +CN0D1ETOa0KCuhhLQvNczsfALbem8+n2xwARAQABiQElBBgBCAAPBQJYHHBaAhsM
   4.212 +BQkCx+oAAAoJEKtpclaaf8ZwBrMH/3cFlXN3G4P2iv2QU7jk1xIhoXHQ9mCkycbm
   4.213 +q3VnBOfNLWXPuw8LgD1xDRN1spRJzhJ0wLWiiM3vl7lsvCwxLa4Id/fQe60ijxxy
   4.214 +X98MdWzp9IsLBocnHPaWjgphpiO8QkoSdfSWLwqe+48YlG8WHnihzMbZckWSxRjF
   4.215 +syjTABxeQhNenvT1vuCn/wt7H0aQM9a+G1KdknOgKnhS4tbXh2dhJ+LvK/RYPQrl
   4.216 +oroUCMqnzE7Jdil+cNXkH/2nlAkq8X27YwikfolgG7/RI4mvlJ3IfcHfVYPp/jhy
   4.217 +8FYwLLgybje9W+8qNufevsKqsALULtRHBDHXyfAUgU0UgfvV6E2ZAQ0EWBxwiwEI
   4.218 +ALMdIVGK7cMwMyndeja1IPht4GSIWHC31R48KxVQrhUonrAg6/5cheyE4D0zI6Sy
   4.219 +2P6/AoPuJcQFx6AhQB0a5q/9aXIZHlvw3pWsqPGjXG7XT1W8tG2rjYF7Rey15ox3
   4.220 +l+1b9FLFN/DMm7/YN37+Ndz4jiD6O0EhmMlVYRCVBcY/eakDHJi/5Yh56GzcnqBk
   4.221 +ibMIR3XoP2Yj4APrLq09DE+4D71mEbd/EE2Fgioj1R2jGBwqlPmgbvbVDQZNj9mW
   4.222 +WpZNLMSVdMThUAwn832zCi71nSBVtNdAT/t+2uBJNjhZyoP2jj5SdtN0+xKK8g57
   4.223 +fvBq8eb921Qqb0lA1JNNGOcAEQEAAbRJcEVwIFRlc3QgR2FicmllbGxlIChUZXN0
   4.224 +IERvIE5vdCBVc2UpIDxwZXAtdGVzdC1nYWJyaWVsbGVAcGVwLXByb2plY3Qub3Jn
   4.225 +PokBVgQTAQgAQAIbAwcLCQgHAwIBBhUIAgkKCwQWAgMBAh4BAheAFiEEkGybg0mV
   4.226 +ToLFYjw8jFQb1OIDWGwFAlvpOBwFCRaYypEACgkQjFQb1OIDWGwMLQf+J2akCkFX
   4.227 +0+5ijTsF6Sahis+1Gr4K6Pqmrzpitrb3uQkKGW9AqmQwqOFWsvuUKN1kvVFnGrgL
   4.228 +AIEsl7r9Dv3m0mEwLVW4xgEtrEonqoJxwvuWPVitCOQHux3b/Dcv4lrFzEn5aIf9
   4.229 +DJu1Dhc+sqfbXtB+TEUV7vIfNrTGB8NPRZ5gbGqrwNdP5SEdL+dpw4SnpSjXLsCe
   4.230 +FKB5E49Kjuw/w7SxE7XJMopHuDflyKNaJIXrXieGf+STMaVmxzeGK979L99I2Ztu
   4.231 +kHOO+u5ZWHnLD+8Y/Iq1h9d8HHlgVKcOZGsdAziMDbwDsJchxj9cnRdy3XMkv2qL
   4.232 +2qq19s9Wx3gdOrkBDQRYHHCLAQgA1EV5Qc7yzkFSZcRMgVGpivFK7CxpvQxOQ1wU
   4.233 +q+ZxH+SY3P3atHrgOgTKe0fnJOkau47b8P0vMfXRBF1fHSQS6hwzYPxlyumFC4KW
   4.234 +kx16mIZHZoMyl9E/O61jMz/xKRl5DpiQWGHzwvod6hADXhDWzllZR0mq2YBOQW9R
   4.235 +htJGEE98gmNoMynE82Ktit+o39nqBILw4Dh0YXgvdkuW9m8bX4vJZcSHs9rNaSZL
   4.236 +x2ANk0NGcNSbM/yU3z98I1wnQREbD0an10e9olcEBRitdkfzdrdm070PlpThtcsA
   4.237 +VAPpUYR9i+DESHNBdIakZmhPC2C1dGh8x47YgHj95ffpWfk4gwARAQABiQE8BBgB
   4.238 +CAAmAhsMFiEEkGybg0mVToLFYjw8jFQb1OIDWGwFAlvpOCwFCRaYyqEACgkQjFQb
   4.239 +1OIDWGwQBgf/WldZURawx4btqWe5ENLDWB7RJopDPPx51GRQmN4iP66T0NpZTI28
   4.240 +P4jWeXMyB1PireKxqqJGHCmOcZt/248m5kMLgvK/MVd/lrLB88nvotvlANQataob
   4.241 +alzUSl8Bydi7Fqg0+xIduCWMuqDTJC7+EOouTBnkXOzx6dyhtPhoWruL5VDd4LRk
   4.242 +xRv5NbiYsCT1LL+b4yUFJtI8HkBKYbqPkLINYlkkNyIKRZ0Pdl5HgBGf20g4EnLX
   4.243 +7hUYxWEs3qP3PsQHzwjg5NcYoU7KEIV4Ry+zjn2+OJJLjOcWoVHSKcO8vUC4342E
   4.244 +z2K9EV9hsqxglctCT2DlPpka7ulk5HWJf5kBDQRVeD72AQgA0e5GhS7CxQ7hhNdb
   4.245 +t6tiunk7KQJHM1NWoT50l2lRjiGwkBri+jIgxE+L1wGP8taYnKifDriHtpNEvHg0
   4.246 +SGCBxfGq4YE5GUJ8ugn8u54XljZ8UmQSKCv/GamvXWzQVsB6dpeyzqjN4UvGtDtZ
   4.247 +kEK6zJVeeap11iUBWiNz/55WhlH3vuQ7g7Q6JvMSYnBPGp+Z4W7MisjcZWFXj1bE
   4.248 +FRYixzFaDWensn8m/50wXQHUNCi2TNLwwvHX/1U3r8rX/z4Lp84qg+ux7g8fFMcn
   4.249 +obeURCK3ARMq4LZ705FY2SdjKW13GNpGpt+jh/E+CaAZMZao1OlIoqlfpNOEMwL5
   4.250 +qdv2pwARAQABtENwRXAgVGVzdCBKb2huICh0ZXN0IGtleSwgZG9uJ3QgdXNlKSA8
   4.251 +cGVwLnRlc3Quam9obkBwZXAtcHJvamVjdC5vcmc+iQE4BBMBAgAiBQJVeD72AhsD
   4.252 +BgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRATXNbRcNz1da0LCACBsZjB4wEK
   4.253 +rGQewkAHRHVsTPmJBmTwDqjGGa1Wn/sIiJDD9uQfSWkmEXHGGyPpPlYNfZeb6lb/
   4.254 +4sYAy57WViRbdy2pCpE2N0fIIYSiJpVVaII+gEoaNK1KBy6Qi7qNLfjfgxk4wTot
   4.255 +bbvdFPS96aD7IGDoo+qcNtujOs17L7JOIVLpY6vWcrCm4xhKKmoTi3+6e4I67QnH
   4.256 +jkH6p1yjRPUJaULcP6Z8E2ve4FUeJew2ilBF8wEqG4xMsHwqDB/UmqFS+TPxbCJD
   4.257 +EmrIOh/ieFPGHcROcdgUW00HvvdP0ZVYOWzQivZzCgTAa9CnniZ/SWUcpMCjoFeb
   4.258 +2ZdJUOQRChImuQENBFV4PvYBCADBLw6PfOob/aZOGCiy0YWVcqdyog0Nspo3ZfL/
   4.259 +5Idn97Nq6DYReaNqU36udaEwiHsdFosq4u6P9VdtXt8GEteLkcxfOmuXL5jnUf8N
   4.260 +fjblu4aFvUVgRGguzuDf07VOwAEJmr/JgAiQR8HaBPfASpiTQBt0jof5EnYeR2ay
   4.261 ++WK8eLV+3ZCTlyNiapdCEuEd+3ZgF+SvvTKiBQyX9CO94ogRq9L+pmzghKJwc5xf
   4.262 ++h/dOQotrj2d/Ax4sTdnMk6GYOwpE3wuyvMZhxb9ZXEc5UzMjQtMTpYq2Dz5YZxr
   4.263 +Jcoskyah1cqx/2e/PMesFfYnz5w2XxpkZAtlfB0wUUIXSLkRABEBAAGJAR8EGAEC
   4.264 +AAkFAlV4PvYCGwwACgkQE1zW0XDc9XVCrwf+Op74yjU7TyV4nQK5Dz/K2Oe5BFVo
   4.265 +PLKZKgViHldwBjM4falX0Ub+D35fSIB2jr15KCoqfQ+M74KQeeuoCIhNwd2OLxM0
   4.266 +6IgcalaOS+YM5mxuidXEHR8+q5ikhz3+M6zUGwsWhlyCeve5pXyiIiAa1eu7B915
   4.267 +tpehAqfD4kBiJixWgSNkm7i0h0s9ZwvddJZ/AIUmAGJcWAXWrXqNyGcAGUkImwhf
   4.268 +8Qob5w3A42WvRlqN4jJUjwKCl2nG63Xp4xf1/csqHk7UzU7jQxq/UprO9sFPkgGB
   4.269 +Kyw3IpNaUYTQ5i1xI0Au3gU/VhXppHzlY5gyo6J2/cgM+pJ8QuZEROQoVw==
   4.270 +=o4Ql
   4.271 +-----END PGP ARMORED FILE-----