From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 4443D4340A; Thu, 30 Nov 2023 04:30:19 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 7C13940297; Thu, 30 Nov 2023 04:30:18 +0100 (CET) Received: from mail-ua1-f43.google.com (mail-ua1-f43.google.com [209.85.222.43]) by mails.dpdk.org (Postfix) with ESMTP id 1F93B400D6 for ; Thu, 30 Nov 2023 04:30:17 +0100 (CET) Received: by mail-ua1-f43.google.com with SMTP id a1e0cc1a2514c-7c513dc5815so146349241.1 for ; Wed, 29 Nov 2023 19:30:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1701315016; x=1701919816; darn=dpdk.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=D4EVE2TEodytvXycafAyy97S+OLZb0gzs5KdMG1OzEE=; b=PA4Je9zg5PHbJAxJmuyGEg3Mov+0JZsxl+rbH/DdMt7x9et9YIUwK2VH9uu5Mrp3VV xusLSJr7gSpYVElvSUgiS4DLIWJlPQEX+7M9h1MPO9uvkmUaRweMJhK4f6dnvw/oLSrL TQoo98yeB4fMJwiRCcF8zoOSwNzqGTVrbunxE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701315016; x=1701919816; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=D4EVE2TEodytvXycafAyy97S+OLZb0gzs5KdMG1OzEE=; b=B8W478FpdpMPnTXd7RGDzS5JgU7QYOjLzHxwvrGmAcc5V7KIeyuIrzUcZEWydWl0fY r0uTtA784ge+orI1MmmwgMxyqYSVY8eGqrjTBMo0hJKt6FKO/QGzg8mg6x9oj30jSO97 eAQLrUEg8oODMb0VIGvFuh5dDzWD5wnYWt7csCioeY4+eU4UF2qtF/9Rytc0hcVNUGCQ wSKbDmku5kU8YQOanuUkel3nnZgtG/K02EP5l67m5NksPmV1AUXn6RH9z66bLHB+I7QX OZNgZxDcAI7S5jGKIhP8EleJJKu9VHL4LiL82xDGA682wmvfA6PHbPOdtNWXDKSPDo0N C+mw== X-Gm-Message-State: AOJu0YymU8d0CgOQHIDVVvKXE6uCEBetHdLSujBCDABnqxmFI/pxOQBd QaO4Erry5+4tqS1qJyPrLRVlyhUn19uw2hTOnBoKsQ== X-Google-Smtp-Source: AGHT+IH5TVaOFGz3Xi5q87hRSErW+F4O7vlQB25hrRPLhBEnn4cuEmIRJbcUrT1Yz0nliF+KfRTf45NCATDJI2N1EeM= X-Received: by 2002:a05:6102:a8a:b0:464:4d9a:9f58 with SMTP id n10-20020a0561020a8a00b004644d9a9f58mr3444020vsg.29.1701315016213; Wed, 29 Nov 2023 19:30:16 -0800 (PST) MIME-Version: 1.0 References: <20230519181549.4341-1-stephen@networkplumber.org> <20231129164438.67237-1-stephen@networkplumber.org> In-Reply-To: <20231129164438.67237-1-stephen@networkplumber.org> From: Somnath Kotur Date: Thu, 30 Nov 2023 09:00:02 +0530 Message-ID: Subject: Re: [PATCH v2] examples/ptp: replace terms master and slave To: Stephen Hemminger Cc: dev@dpdk.org, Ajit Khaparde , Kirill Rybalchenko Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="00000000000037da04060b56453c" X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org --00000000000037da04060b56453c Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, Nov 29, 2023 at 10:14=E2=80=AFPM Stephen Hemminger wrote: > > The IEEE 1588 standard has been updated to remove the use > of master-slave terminolgy. Use the terms recommended by > IEEE 1588g-2022 amendment: > > In place of the term =E2=80=9Cmaster=E2=80=9D, use the term =E2=80=9Cti= meTransmitter=E2=80=9D. > In place of the term =E2=80=9Cslave=E2=80=9D, use the term =E2=80=9Ctim= eReceiver=E2=80=9D. > > Signed-off-by: Stephen Hemminger > --- > doc/guides/nics/bnxt.rst | 8 ++-- > doc/guides/sample_app_ug/img/ptpclient.svg | 4 +- > doc/guides/sample_app_ug/intro.rst | 4 +- > doc/guides/sample_app_ug/ptpclient.rst | 29 +++++------ > examples/ptpclient/ptpclient.c | 56 +++++++++++----------- > 5 files changed, 52 insertions(+), 49 deletions(-) > > diff --git a/doc/guides/nics/bnxt.rst b/doc/guides/nics/bnxt.rst > index 6db880d632f8..8b9fcd25583d 100644 > --- a/doc/guides/nics/bnxt.rst > +++ b/doc/guides/nics/bnxt.rst > @@ -538,10 +538,12 @@ Time Synchronization > ~~~~~~~~~~~~~~~~~~~~ > > System operators may run a PTP (Precision Time Protocol) client applicat= ion to > -synchronize the time on the NIC (and optionally, on the system) to a PTP= master. > +synchronize the time on the NIC (and optionally, on the system) to a > +PTP timeTransmitter. > > -The BNXT PMD supports a PTP client application to communicate with a PTP= master > -clock using DPDK IEEE1588 APIs. Note that the PTP client application nee= ds to > +The BNXT PMD supports a PTP client application to communicate with a > +PTP timeTransmitter using DPDK IEEE1588 APIs. > +Note that the PTP client application needs to > run on PF and vector mode needs to be disabled. > > .. code-block:: console > diff --git a/doc/guides/sample_app_ug/img/ptpclient.svg b/doc/guides/samp= le_app_ug/img/ptpclient.svg > index fd78ef839b91..41869bc4c959 100644 > --- a/doc/guides/sample_app_ug/img/ptpclient.svg > +++ b/doc/guides/sample_app_ug/img/ptpclient.svg > @@ -488,7 +488,7 @@ > sodipodi:role=3D"line" > id=3D"tspan7096" > x=3D"38.764343" > - y=3D"590.47479">master > + y=3D"590.47479">timeTransmitter > xml:space=3D"preserve" > style=3D"font-style:normal;font-variant:normal;font-weight:normal= ;font-stretch:normal;font-size:47.51625061px;line-height:100%;font-family:s= ans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:star= t;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;= fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:but= t;stroke-linejoin:miter;stroke-opacity:1" > @@ -510,7 +510,7 @@ > sodipodi:role=3D"line" > id=3D"tspan7104" > x=3D"271.23392" > - y=3D"593.71478">slave > + y=3D"593.71478">timeReceiver > xml:space=3D"preserve" > style=3D"font-style:normal;font-variant:normal;font-weight:normal= ;font-stretch:normal;font-size:20.3917141px;line-height:125%;font-family:sa= ns-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start= ;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;f= ill:#800080;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt= ;stroke-linejoin:miter;stroke-opacity:1" > diff --git a/doc/guides/sample_app_ug/intro.rst b/doc/guides/sample_app_u= g/intro.rst > index e765f1fd6b12..5453df57667a 100644 > --- a/doc/guides/sample_app_ug/intro.rst > +++ b/doc/guides/sample_app_ug/intro.rst > @@ -85,8 +85,8 @@ examples are highlighted below. > * :doc:`Precision Time Protocol (PTP) client`: The PTP > client is another minimal implementation of a real world application. > In this case the application is a PTP client that communicates with a = PTP > - master clock to synchronize time on a Network Interface Card (NIC) usi= ng the > - IEEE1588 protocol. > + timeTransmitter to synchronize time on a Network Interface Card (NIC) > + using the IEEE1588 protocol. > > * :doc:`Quality of Service (QoS) Scheduler`: The QoS > Scheduler application demonstrates the use of DPDK to provide QoS sche= duling. > diff --git a/doc/guides/sample_app_ug/ptpclient.rst b/doc/guides/sample_a= pp_ug/ptpclient.rst > index d47e942738d0..242c9628eaff 100644 > --- a/doc/guides/sample_app_ug/ptpclient.rst > +++ b/doc/guides/sample_app_ug/ptpclient.rst > @@ -5,8 +5,9 @@ PTP Client Sample Application > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D > > The PTP (Precision Time Protocol) client sample application is a simple > -example of using the DPDK IEEE1588 API to communicate with a PTP master = clock > -to synchronize the time on the NIC and, optionally, on the Linux system. > +example of using the DPDK IEEE1588 API to communicate with a PTP > +timeTransmitter to synchronize the time on the NIC and, optionally, > +on the Linux system. > > Note, PTP is a time syncing protocol and cannot be used within DPDK as a > time-stamping mechanism. See the following for an explanation of the pro= tocol: > @@ -21,10 +22,10 @@ The PTP sample application is intended as a simple re= ference implementation of > a PTP client using the DPDK IEEE1588 API. > In order to keep the application simple the following assumptions are ma= de: > > -* The first discovered master is the main for the session. > +* The first discovered timeTransmitter is the main for the session. > * Only L2 PTP packets are supported. > * Only the PTP v2 protocol is supported. > -* Only the slave clock is implemented. > +* Only the timeReceiver clock is implemented. > > > How the Application Works > @@ -38,12 +39,12 @@ How the Application Works > > The PTP synchronization in the sample application works as follows: > > -* Master sends *Sync* message - the slave saves it as T2. > -* Master sends *Follow Up* message and sends time of T1. > -* Slave sends *Delay Request* frame to PTP Master and stores T3. > -* Master sends *Delay Response* T4 time which is time of received T3. > +* TimeTransmitter sends *Sync* message - the TimeReceiver saves it as T2= . > +* TimeTransmitter sends *Follow Up* message and sends time of T1. > +* TimeReceiver sends *Delay Request* frame to PTP TimeTransmitter and st= ores T3. > +* TimeTransmitter sends *Delay Response* T4 time which is time of receiv= ed T3. > > -The adjustment for slave can be represented as: > +The adjustment for timeReceiver can be represented as: > > adj =3D -[(T2-T1)-(T4 - T3)]/2 > > @@ -71,8 +72,8 @@ Refer to *DPDK Getting Started Guide* for general infor= mation on running > applications and the Environment Abstraction Layer (EAL) options. > > * ``-p portmask``: Hexadecimal portmask. > -* ``-T 0``: Update only the PTP slave clock. > -* ``-T 1``: Update the PTP slave clock and synchronize the Linux Kernel = to the PTP clock. > +* ``-T 0``: Update only the PTP timeReceiver clock. > +* ``-T 1``: Update the PTP timeReceiver clock and synchronize the Linux = Kernel to the PTP clock. > > > Code Explanation > @@ -178,7 +179,7 @@ The forwarding loop can be interrupted and the applic= ation closed using > PTP parsing > ~~~~~~~~~~~ > > -The ``parse_ptp_frames()`` function processes PTP packets, implementing = slave > +The ``parse_ptp_frames()`` function processes PTP packets, implementing = timeReceiver > PTP IEEE1588 L2 functionality. > > .. literalinclude:: ../../../examples/ptpclient/ptpclient.c > @@ -187,11 +188,11 @@ PTP IEEE1588 L2 functionality. > :end-before: >8 End of function processes PTP packets. > > There are 3 types of packets on the RX path which we must parse to creat= e a minimal > -implementation of the PTP slave client: > +implementation of the PTP timeReceiver client: > > * SYNC packet. > * FOLLOW UP packet > * DELAY RESPONSE packet. > > When we parse the *FOLLOW UP* packet we also create and send a *DELAY_RE= QUEST* packet. > -Also when we parse the *DELAY RESPONSE* packet, and all conditions are m= et we adjust the PTP slave clock. > +Also when we parse the *DELAY RESPONSE* packet, and all conditions are m= et we adjust the PTP timeReceiver clock. > diff --git a/examples/ptpclient/ptpclient.c b/examples/ptpclient/ptpclien= t.c > index cdf2da64dfee..eb34ab8621cc 100644 > --- a/examples/ptpclient/ptpclient.c > +++ b/examples/ptpclient/ptpclient.c > @@ -116,14 +116,14 @@ struct ptp_message { > } __rte_packed; > }; > > -struct ptpv2_data_slave_ordinary { > +struct ptpv2_timeReceiver_ordinary { > struct rte_mbuf *m; > struct timespec tstamp1; > struct timespec tstamp2; > struct timespec tstamp3; > struct timespec tstamp4; > struct clock_id client_clock_id; > - struct clock_id master_clock_id; > + struct clock_id transmitter_clock_id; > struct timeval new_adj; > int64_t delta; > uint16_t portid; > @@ -134,7 +134,7 @@ struct ptpv2_data_slave_ordinary { > uint16_t current_ptp_port; > }; > > -static struct ptpv2_data_slave_ordinary ptp_data; > +static struct ptpv2_timeReceiver_ordinary ptp_data; > > static inline uint64_t timespec64_to_ns(const struct timespec *ts) > { > @@ -263,38 +263,38 @@ port_init(uint16_t port, struct rte_mempool *mbuf_p= ool) > } > > static void > -print_clock_info(struct ptpv2_data_slave_ordinary *ptp_data) > +print_clock_info(struct ptpv2_timeReceiver_ordinary *ptp_data) > { > int64_t nsec; > struct timespec net_time, sys_time; > > - printf("Master Clock id: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x"= , > - ptp_data->master_clock_id.id[0], > - ptp_data->master_clock_id.id[1], > - ptp_data->master_clock_id.id[2], > - ptp_data->master_clock_id.id[3], > - ptp_data->master_clock_id.id[4], > - ptp_data->master_clock_id.id[5], > - ptp_data->master_clock_id.id[6], > - ptp_data->master_clock_id.id[7]); > - > - printf("\nT2 - Slave Clock. %lds %ldns", > + printf("TimeTransmitter Clock id: %02x:%02x:%02x:%02x:%02x:%02x:%= 02x:%02x", > + ptp_data->transmitter_clock_id.id[0], > + ptp_data->transmitter_clock_id.id[1], > + ptp_data->transmitter_clock_id.id[2], > + ptp_data->transmitter_clock_id.id[3], > + ptp_data->transmitter_clock_id.id[4], > + ptp_data->transmitter_clock_id.id[5], > + ptp_data->transmitter_clock_id.id[6], > + ptp_data->transmitter_clock_id.id[7]); > + > + printf("\nT2 - TimeReceiver Clock. %lds %ldns", > (ptp_data->tstamp2.tv_sec), > (ptp_data->tstamp2.tv_nsec)); > > - printf("\nT1 - Master Clock. %lds %ldns ", > + printf("\nT1 - TimeTransmitter Clock. %lds %ldns ", > ptp_data->tstamp1.tv_sec, > (ptp_data->tstamp1.tv_nsec)); > > - printf("\nT3 - Slave Clock. %lds %ldns", > + printf("\nT3 - TimeReceiver Clock. %lds %ldns", > ptp_data->tstamp3.tv_sec, > (ptp_data->tstamp3.tv_nsec)); > > - printf("\nT4 - Master Clock. %lds %ldns ", > + printf("\nT4 - TimeTransmitter Clock. %lds %ldns ", > ptp_data->tstamp4.tv_sec, > (ptp_data->tstamp4.tv_nsec)); > > - printf("\nDelta between master and slave clocks:%"PRId64"ns\n", > + printf("\nDelta between timeTransmitter and timeReceiver clocks:%= "PRId64"ns\n", > ptp_data->delta); > > clock_gettime(CLOCK_REALTIME, &sys_time); > @@ -328,7 +328,7 @@ print_clock_info(struct ptpv2_data_slave_ordinary *pt= p_data) > } > > static int64_t > -delta_eval(struct ptpv2_data_slave_ordinary *ptp_data) > +delta_eval(struct ptpv2_timeReceiver_ordinary *ptp_data) > { > int64_t delta; > uint64_t t1 =3D 0; > @@ -350,7 +350,7 @@ delta_eval(struct ptpv2_data_slave_ordinary *ptp_data= ) > * Parse the PTP SYNC message. > */ > static void > -parse_sync(struct ptpv2_data_slave_ordinary *ptp_data, uint16_t rx_tstam= p_idx) > +parse_sync(struct ptpv2_timeReceiver_ordinary *ptp_data, uint16_t rx_tst= amp_idx) > { > struct ptp_header *ptp_hdr; > > @@ -359,7 +359,7 @@ parse_sync(struct ptpv2_data_slave_ordinary *ptp_data= , uint16_t rx_tstamp_idx) > ptp_data->seqID_SYNC =3D rte_be_to_cpu_16(ptp_hdr->seq_id); > > if (ptp_data->ptpset =3D=3D 0) { > - rte_memcpy(&ptp_data->master_clock_id, > + rte_memcpy(&ptp_data->transmitter_clock_id, > &ptp_hdr->source_port_id.clock_id, > sizeof(struct clock_id)); > ptp_data->ptpset =3D 1; > @@ -380,7 +380,7 @@ parse_sync(struct ptpv2_data_slave_ordinary *ptp_data= , uint16_t rx_tstamp_idx) > * Parse the PTP FOLLOWUP message and send DELAY_REQ to the main clock. > */ > static void > -parse_fup(struct ptpv2_data_slave_ordinary *ptp_data) > +parse_fup(struct ptpv2_timeReceiver_ordinary *ptp_data) > { > struct rte_ether_hdr *eth_hdr; > struct rte_ether_addr eth_addr; > @@ -399,8 +399,8 @@ parse_fup(struct ptpv2_data_slave_ordinary *ptp_data) > eth_hdr =3D rte_pktmbuf_mtod(m, struct rte_ether_hdr *); > ptp_hdr =3D (struct ptp_header *)(rte_pktmbuf_mtod(m, char *) > + sizeof(struct rte_ether_hdr)); > - if (memcmp(&ptp_data->master_clock_id, > - &ptp_hdr->source_port_id.clock_id, > + if (memcmp(&ptp_data->transmitter_clock_id, > + &ptp_hdr->source_port_id.clock_id, > sizeof(struct clock_id)) !=3D 0) > return; > > @@ -530,7 +530,7 @@ update_kernel_time(void) > * Parse the DELAY_RESP message. > */ > static void > -parse_drsp(struct ptpv2_data_slave_ordinary *ptp_data) > +parse_drsp(struct ptpv2_timeReceiver_ordinary *ptp_data) > { > struct rte_mbuf *m =3D ptp_data->m; > struct ptp_message *ptp_msg; > @@ -568,7 +568,7 @@ parse_drsp(struct ptpv2_data_slave_ordinary *ptp_data= ) > } > } > > -/* This function processes PTP packets, implementing slave PTP IEEE1588 = L2 > +/* This function processes PTP packets, implementing timeReceiver PTP IE= EE1588 L2 > * functionality. > */ > > @@ -753,7 +753,7 @@ main(int argc, char *argv[]) > rte_exit(EXIT_FAILURE, "Error with EAL initialization\n")= ; > /* >8 End of initialization of EAL. */ > > - memset(&ptp_data, '\0', sizeof(struct ptpv2_data_slave_ordinary))= ; > + memset(&ptp_data, 0, sizeof(struct ptpv2_timeReceiver_ordinary)); > > /* Parse specific arguments. 8< */ > argc -=3D ret; > -- > 2.42.0 > Reviewed-by: Somnath Kotur --00000000000037da04060b56453c Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: S/MIME Cryptographic Signature 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 nSGLsSobByQoGh1GyLfFTXI7QOGn/6qvrJ7x9Oem5V7miUTD0wGAIozD7MCVoluf5Psa4Q2a5AFV gROLty059Ex4oK55Op/0e3Aa/a8hZD/tPBT3WE70owdiCwIDAQABo4IB2zCCAdcwDgYDVR0PAQH/ BAQDAgWgMIGjBggrBgEFBQcBAQSBljCBkzBOBggrBgEFBQcwAoZCaHR0cDovL3NlY3VyZS5nbG9i YWxzaWduLmNvbS9jYWNlcnQvZ3NnY2NyM3BlcnNvbmFsc2lnbjJjYTIwMjAuY3J0MEEGCCsGAQUF BzABhjVodHRwOi8vb2NzcC5nbG9iYWxzaWduLmNvbS9nc2djY3IzcGVyc29uYWxzaWduMmNhMjAy MDBNBgNVHSAERjBEMEIGCisGAQQBoDIBKAowNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xv YmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wCQYDVR0TBAIwADBJBgNVHR8EQjBAMD6gPKA6hjhodHRw Oi8vY3JsLmdsb2JhbHNpZ24uY29tL2dzZ2NjcjNwZXJzb25hbHNpZ24yY2EyMDIwLmNybDAlBgNV HREEHjAcgRpzb21uYXRoLmtvdHVyQGJyb2FkY29tLmNvbTATBgNVHSUEDDAKBggrBgEFBQcDBDAf BgNVHSMEGDAWgBSWM9HmWBdbNHWKgVZk1b5I3qGPzzAdBgNVHQ4EFgQUabMpSsFcjDNUWMvGf76o yB7jBJUwDQYJKoZIhvcNAQELBQADggEBAJBDQpQ1TqY57vpQbwtXYP0N01q8J3tfNA/K2vOiNOpv IufqZ5WKdKEtmT21nujCeuaCQ6SmpWqCUJVkLd+u/sHR62vCo8j2fb1pTkA7jeuCAuT9YMPRE86M sUphsGDq2ylriQ7y5kvl728hZ0Oakm3xUCnZ9DYS/32sFGSZyrCGZipTBnjK4n5uLQ0yekSLACiD R0zi4nzkbhwXqDbDaB+Duk52ec/Vj4xuc2uWu9rTmJNVjdk0qu9vh48xcd/BzrlmwY0crGTijAC/ r4x2/y9OfG0FyVmakU0qwDnZX982aa66tXnKNgae2k20WCDVMM5FPTrbMsQyz6Hrv3bg6qgxggJt MIICaQIBATBrMFsxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTEwLwYD VQQDEyhHbG9iYWxTaWduIEdDQyBSMyBQZXJzb25hbFNpZ24gMiBDQSAyMDIwAgx6wAr6NdQY0sTG G7cwDQYJYIZIAWUDBAIBBQCggdQwLwYJKoZIhvcNAQkEMSIEIM1p90gQXk/lrhJfuqBfrbbgUiyr KQZGhejh7PedAmm7MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTIz MTEzMDAzMzAxNlowaQYJKoZIhvcNAQkPMVwwWjALBglghkgBZQMEASowCwYJYIZIAWUDBAEWMAsG CWCGSAFlAwQBAjAKBggqhkiG9w0DBzALBgkqhkiG9w0BAQowCwYJKoZIhvcNAQEHMAsGCWCGSAFl AwQCATANBgkqhkiG9w0BAQEFAASCAQBZ3pnL1mVstpzMKZn33B31ucLjKa1SCGklfhZWLO5GCSMC dRgYqfz0tTIf4Appf0yIIqEnhmsO2c/7qlq640jPAPqmyRb43vIstRz8YssIsrmFxuFsPsBvbCqa DHGyqPCgmmUMk0g54wZRQQkhfp7wxh1+uA6yZ87jxEg0Wh/vzygmPYqSWWAIx0S3PdUqlZ4TmeiK BBH2aA5VJFLbn4aKXlpDXlP4m86VLStuYayem1HE6MrPpu/CNk/eWZjSXLpyYj5oQJ5VKVXCgeSA bfyLKAesIZP4P4IE+l5Ana1IOWbWYBU9H8nN+LPQFALW79QtGi5XFIi5hfaaft0Ak1+T --00000000000037da04060b56453c--