Re: Fail to detect smartcard from reconnected reader

Ludovic Rousseau <[email protected]> Fri, 21 Jul 2017 14:20:08 +0200
Newsgroups gmane.comp.lib.muscle
Message-ID <CAGstE8AxGSQSYOOrGMjLN5y4X0VHCz2AY7VQfA5U0KB=QbpVSg@mail.gmail.com>
--===============2597705525827588530==
Content-Type: multipart/alternative; boundary="f403045c44f8d372460554d2e29d"

--f403045c44f8d372460554d2e29d
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Hello,

Please generate a pcscd trace as described at
http://pcsclite.alioth.debian.org/pcsclite.html#support

bye

Dr. Ludovic Rousseau


Le 21 juil. 2017 13:47, "Thomas Bajer" <[email protected]> a =C3=A9cri=
t :

Hello,



I would like to report an error, which occurs, when using PCSC-lite for
smartcard detection in C. It causes the smartcard to remain undetected,
when the reader is disconnected. The current workaround is to restart
the PCSC deamon at the beginning.

In my application the removal of the reader is unavoidable, since I am
using a USB token, which acts as a combination of a reader and a smartcard.



Please have a look at the attached minimal example code. The program
checks, whether a reader an a card are available, then connects to the
smartcard. Afterwards, the smartcard is diconnected and the program
waits until the smartcard is no longer physically connected. This
process is being looped until the programm is aborted.



The code was linked with the newest stable release, 1.8.22-1.

The code is compiled and linked on a FreeBSD system running FreeBSD 10.3
(AMD64), the executable is then copied to a pfsense Box which also runs
FreeBSD 10.3 with the same pcscd version.



It would be great if a developer could look at this and commit a fix for
this message.



Below is the exampleReconnect.c example and the build command. Feel free
to play around with it and to make use of the defines at the beginning
of the code



Regards,

Thomas Bajer



/*

 * exampleReconnect.c

 *

 *  Created on: 20.07.2017

 *      Author: T. Bajer

 */





#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

//#include <usb.h>

#include <errno.h>

#include <stdint.h>

#ifdef __APPLE__

#include <PCSC/winscard.h>

#include <PCSC/wintypes.h>

#else

#include <winscard.h>

#endif





/*
############################################################
################################

 * #### BUILD COMMAND:
                  ####

 * #### gcc -o example exampleReconnect.c -I/usr/local/include/PCSC
-lpcsclite -lusb -Wall ####

 *
############################################################
################################
*/



/* Uncomment me for more details */

//#define SC_DEBUG



/* Uncomment me to make it work */

//#define HOTFIX





/*

 * Prototypes

 */

int connectToSmartcard( SCARDCONTEXT *hContext,

                        SCARDHANDLE *hCard,

                        LPTSTR *mszReaders);



void disconnectSmartcard(   SCARDCONTEXT *hContext,

                            SCARDHANDLE *hCard,

                            LPTSTR *mszReaders);



void waitForSmartcardConnect();



void waitForSmartcardDisconnect();





/*

 * MAIN function

 */

int main(int argc, char **argv)

{

                SCARDCONTEXT hContext;

                SCARDHANDLE hCard;

                LPTSTR mszReaders;



                printf("Smartcard detection started.\n");

                for(;;)

                {

                        printf("Waiting for smartcard connect...\n");



#ifdef HOTFIX

                        system("service pcscd restart");

#endif

                        waitForSmartcardConnect();

                        printf("Smartcard found.\n");



                        printf("Connecting to smartcard...\n");

                        if(connectToSmartcard(&hContext, &hCard,
&mszReaders) =3D=3D 0)

                        {

                                printf("Connecting successful!\n");



                                /*

                                 *  Do SC stuff here

                                 */



                                printf("Disconnecting...\n");

                                disconnectSmartcard(&hContext, &hCard,
&mszReaders);

                                printf("Disconnected!\n");

                        }

                        else

                        {

                                printf("CONNECT FAILED!\n");

                        }



                        printf("Waiting for smartcard disconnect...\n");

                        waitForSmartcardDisconnect();

                        printf("Smartcard lost!\n");

                }



                return 0;

}





/*

 * Implementations

 */



int connectToSmartcard( SCARDCONTEXT *hContext,

                        SCARDHANDLE *hCard,

                        LPTSTR *mszReaders)

{

        LONG rv =3D 0;



        DWORD dwReaders, dwActiveProtocol ;



        // Init context

        printf("Establish context\n");

        rv =3D SCardEstablishContext( SCARD_SCOPE_SYSTEM,

                                NULL,

                                NULL, hContext);

        if (SCARD_S_SUCCESS !=3D rv)

        {

                return -1;

        }



        // Get available smartcard readers

#ifdef SCARD_AUTOALLOCATE

        dwReaders =3D SCARD_AUTOALLOCATE;

        printf("List readers\n");

        rv =3D SCardListReaders(  *hContext,

                            NULL,

                            (LPTSTR)mszReaders,

                            &dwReaders);



        if (SCARD_S_SUCCESS !=3D rv)

        {

                SCardReleaseContext(*hContext);

                return -1;

        }



#else

        printf("List readers\n");

        rv =3D SCardListReaders(  *hContext,

                            NULL,

                            NULL,

                            &dwReaders);

        if (SCARD_S_SUCCESS !=3D rv)

        {

                SCardReleaseContext(*hContext);

                return -1;

        }

        printf("Allocate readers\n");

        mszReaders =3D calloc(dwReaders, sizeof(char));

        rv =3D SCardListReaders(  *hContext,

                            NULL,

                            *mszReaders,

                            &dwReaders );

        if(SCARD_S_SUCCESS !=3D rv)

        {

                SCardFreeMemory( *hContext, mszReaders );

                SCardReleaseContext( *hContext );

                return -1;

        }



#endif



        printf( "Connect to card\n" );

        // Connect to smartcard

        rv =3D SCardConnect(  *hContext,

                        *mszReaders,

                        SCARD_SHARE_SHARED,

                        SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,

                        hCard,

                        &dwActiveProtocol );

        if (SCARD_S_SUCCESS !=3D rv)

        {

                SCardFreeMemory( *hContext, *mszReaders );

                SCardReleaseContext( *hContext );

                return -1;

        }



        printf( "Smartcard connected!\n" );

        return 0;

}



void disconnectSmartcard(   SCARDCONTEXT *hContext,

                            SCARDHANDLE *hCard,

                            LPTSTR *mszReaders)

{

        printf("Disconnect card...\n");

        SCardDisconnect( *hCard, SCARD_LEAVE_CARD );



        printf("Free reader...\n");

        #ifdef SCARD_AUTOALLOCATE



        SCardFreeMemory( *hContext, *mszReaders );



        #else

        free( *mszReaders );

        #endif



        printf( "Release context...\n" );

        SCardReleaseContext( *hContext );

}





int checkSmartcard( SCARDCONTEXT *hContext,

                    SCARDHANDLE *hCard,

                    LPTSTR *mszReaders)

{

        LONG rv =3D 0;



        DWORD dwReaders, dwActiveProtocol;



        // Init context

#ifdef SC_DEBUG

        printf("Establishing SC context...\n");

#endif

        rv =3D SCardEstablishContext( SCARD_SCOPE_SYSTEM,

                                NULL,

                                NULL,

                                hContext);

        if (SCARD_S_SUCCESS !=3D rv)

        {

#ifdef SC_DEBUG

                printf("ERROR: Establishing SC context!\n");



#endif

        }



                // Get available smartcard readers

#ifdef SCARD_AUTOALLOCATE

        if (SCARD_S_SUCCESS =3D=3D rv)

        {

                dwReaders =3D SCARD_AUTOALLOCATE;



#ifdef SC_DEBUG

                printf("Listing SC readers...\n");

#endif



                rv =3D SCardListReaders( *hContext,

                                NULL,

                                (LPTSTR)mszReaders,

                                &dwReaders );

                if (SCARD_S_SUCCESS !=3D rv)

                {

#ifdef SC_DEBUG

                        printf("ERROR: Listing SC readers!\n");

#endif

                        /* Max: this has to be given by value, not by
pointer! (even if it
doesn't make sense..) */

                        SCardReleaseContext(*hContext);

                }

        }

                #else

        if (SCARD_S_SUCCESS =3D=3D rv)

        {

#ifdef SC_DEBUG

                printf("Listing SC readers...\n");

#endif

                rv =3D SCardListReaders(  *hContext,

                                NULL,

                                NULL,

                                &dwReaders);

                if (SCARD_S_SUCCESS !=3D rv)

                {

#ifdef SC_DEBUG

                        printf("ERROR: Listing SC readers!\n");

#endif

                        SCardReleaseContext( *hContext );

                }

        }

        if (SCARD_S_SUCCESS =3D=3D rv)

        {



#ifdef SC_DEBUG

                printf( "Listing SC readers...\n" );

#endif

                mszReaders =3D calloc( dwReaders, sizeof(char) );

                rv =3D SCardListReaders( *hContext,

                                NULL,

                                *mszReaders,

                                &dwReaders );

                if(SCARD_S_SUCCESS !=3D rv)

                {

#ifdef SC_DEBUG

                        printf( "ERROR: Listing SC readers!\n" );

#endif

                        SCardFreeMemory( *hContext, *mszReaders );

                        SCardReleaseContext( *hContext );

                }

        }

                #endif

        if (SCARD_S_SUCCESS =3D=3D rv)

        {



#ifdef SC_DEBUG

                printf( "Connecting to SC...\n" );

#endif

                rv =3D SCardConnect(  *hContext,

                            *mszReaders,

                            SCARD_SHARE_SHARED,

                            SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,

                            hCard,

                            &dwActiveProtocol);

                if (SCARD_S_SUCCESS !=3D rv)

                {

#ifdef SC_DEBUG

                        printf("ERROR: Connecting to SC!\n");

#endif

                }

        }

        SCardFreeMemory(*hContext, *mszReaders);

        SCardReleaseContext(*hContext);



        fflush(stdout);

        return rv;

}



void waitForSmartcardConnect()

{

        SCARDCONTEXT hContext;

        SCARDHANDLE hCard;

        LPTSTR mszReaders;



        while(checkSmartcard(&hContext, &hCard, &mszReaders) !=3D 0)

        {

                sleep(1);

        }

}



void waitForSmartcardDisconnect()

{

        SCARDCONTEXT hContext;

        SCARDHANDLE hCard;

        LPTSTR mszReaders;



        while(checkSmartcard(&hContext, &hCard, &mszReaders) =3D=3D 0)

        {

                sleep(1);

        }

}

_______________________________________________
Pcsclite-muscle mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pcsclite-muscle

--f403045c44f8d372460554d2e29d
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: base64

PGRpdiBkaXI9ImF1dG8iPjxkaXY+SGVsbG8sPGRpdiBkaXI9ImF1dG8iPjxicj48L2Rpdj48ZGl2
IGRpcj0iYXV0byI+UGxlYXNlIGdlbmVyYXRlIGEgcGNzY2QgdHJhY2UgYXMgZGVzY3JpYmVkIGF0
wqA8YSBocmVmPSJodHRwOi8vcGNzY2xpdGUuYWxpb3RoLmRlYmlhbi5vcmcvcGNzY2xpdGUuaHRt
bCNzdXBwb3J0Ij5odHRwOi8vcGNzY2xpdGUuYWxpb3RoLmRlYmlhbi5vcmcvcGNzY2xpdGUuaHRt
bCNzdXBwb3J0PC9hPjwvZGl2PjxkaXYgZGlyPSJhdXRvIj48YnI+PC9kaXY+PGRpdiBkaXI9ImF1
dG8iPmJ5ZTwvZGl2PjxkaXYgZGlyPSJhdXRvIj48YnI+PGRpdiBkYXRhLXNtYXJ0bWFpbD0iZ21h
aWxfc2lnbmF0dXJlIiBkaXI9ImF1dG8iPkRyLiBMdWRvdmljIFJvdXNzZWF1PC9kaXY+PC9kaXY+
PGJyPjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj48YnI+PGRpdiBjbGFzcz0iZ21haWxfcXVvdGUi
PkxlwqAyMSBqdWlsLiAyMDE3IDEzOjQ3LCAmcXVvdDtUaG9tYXMgQmFqZXImcXVvdDsgJmx0Ozxh
IGhyZWY9Im1haWx0bzp0aG9tYXMuYmFqZXJAcGh5c2VjLmRlIj50aG9tYXMuYmFqZXJAcGh5c2Vj
LmRlPC9hPiZndDsgYSDDqWNyaXTCoDo8YnIgdHlwZT0iYXR0cmlidXRpb24iPjxibG9ja3F1b3Rl
IGNsYXNzPSJxdW90ZSIgc3R5bGU9Im1hcmdpbjowIDAgMCAuOGV4O2JvcmRlci1sZWZ0OjFweCAj
Y2NjIHNvbGlkO3BhZGRpbmctbGVmdDoxZXgiPkhlbGxvLDxicj4NCjxicj4NCjxicj4NCjxicj4N
Ckkgd291bGQgbGlrZSB0byByZXBvcnQgYW4gZXJyb3IsIHdoaWNoIG9jY3Vycywgd2hlbiB1c2lu
ZyBQQ1NDLWxpdGUgZm9yPGJyPg0Kc21hcnRjYXJkIGRldGVjdGlvbiBpbiBDLiBJdCBjYXVzZXMg
dGhlIHNtYXJ0Y2FyZCB0byByZW1haW4gdW5kZXRlY3RlZCw8YnI+DQp3aGVuIHRoZSByZWFkZXIg
aXMgZGlzY29ubmVjdGVkLiBUaGUgY3VycmVudCB3b3JrYXJvdW5kIGlzIHRvIHJlc3RhcnQ8YnI+
DQp0aGUgUENTQyBkZWFtb24gYXQgdGhlIGJlZ2lubmluZy48YnI+DQo8YnI+DQpJbiBteSBhcHBs
aWNhdGlvbiB0aGUgcmVtb3ZhbCBvZiB0aGUgcmVhZGVyIGlzIHVuYXZvaWRhYmxlLCBzaW5jZSBJ
IGFtPGJyPg0KdXNpbmcgYSBVU0IgdG9rZW4sIHdoaWNoIGFjdHMgYXMgYSBjb21iaW5hdGlvbiBv
ZiBhIHJlYWRlciBhbmQgYSBzbWFydGNhcmQuPGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KUGxlYXNl
IGhhdmUgYSBsb29rIGF0IHRoZSBhdHRhY2hlZCBtaW5pbWFsIGV4YW1wbGUgY29kZS4gVGhlIHBy
b2dyYW08YnI+DQpjaGVja3MsIHdoZXRoZXIgYSByZWFkZXIgYW4gYSBjYXJkIGFyZSBhdmFpbGFi
bGUsIHRoZW4gY29ubmVjdHMgdG8gdGhlPGJyPg0Kc21hcnRjYXJkLiBBZnRlcndhcmRzLCB0aGUg
c21hcnRjYXJkIGlzIGRpY29ubmVjdGVkIGFuZCB0aGUgcHJvZ3JhbTxicj4NCndhaXRzIHVudGls
IHRoZSBzbWFydGNhcmQgaXMgbm8gbG9uZ2VyIHBoeXNpY2FsbHkgY29ubmVjdGVkLiBUaGlzPGJy
Pg0KcHJvY2VzcyBpcyBiZWluZyBsb29wZWQgdW50aWwgdGhlIHByb2dyYW1tIGlzIGFib3J0ZWQu
PGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KVGhlIGNvZGUgd2FzIGxpbmtlZCB3aXRoIHRoZSBuZXdl
c3Qgc3RhYmxlIHJlbGVhc2UsIDEuOC4yMi0xLjxicj4NCjxicj4NClRoZSBjb2RlIGlzIGNvbXBp
bGVkIGFuZCBsaW5rZWQgb24gYSBGcmVlQlNEIHN5c3RlbSBydW5uaW5nIEZyZWVCU0QgMTAuMzxi
cj4NCihBTUQ2NCksIHRoZSBleGVjdXRhYmxlIGlzIHRoZW4gY29waWVkIHRvIGEgcGZzZW5zZSBC
b3ggd2hpY2ggYWxzbyBydW5zPGJyPg0KRnJlZUJTRCAxMC4zIHdpdGggdGhlIHNhbWUgcGNzY2Qg
dmVyc2lvbi48YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQpJdCB3b3VsZCBiZSBncmVhdCBpZiBhIGRl
dmVsb3BlciBjb3VsZCBsb29rIGF0IHRoaXMgYW5kIGNvbW1pdCBhIGZpeCBmb3I8YnI+DQp0aGlz
IG1lc3NhZ2UuPGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KQmVsb3cgaXMgdGhlIGV4YW1wbGVSZWNv
bm5lY3QuYyBleGFtcGxlIGFuZCB0aGUgYnVpbGQgY29tbWFuZC4gRmVlbCBmcmVlPGJyPg0KdG8g
cGxheSBhcm91bmQgd2l0aCBpdCBhbmQgdG8gbWFrZSB1c2Ugb2YgdGhlIGRlZmluZXMgYXQgdGhl
IGJlZ2lubmluZzxicj4NCm9mIHRoZSBjb2RlPGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KUmVnYXJk
cyw8YnI+DQo8YnI+DQpUaG9tYXMgQmFqZXI8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQovKjxicj4N
Cjxicj4NCsKgKiBleGFtcGxlUmVjb25uZWN0LmM8YnI+DQo8YnI+DQrCoCo8YnI+DQo8YnI+DQrC
oCrCoCBDcmVhdGVkIG9uOiAyMC4wNy4yMDE3PGJyPg0KPGJyPg0KwqAqwqAgwqAgwqAgQXV0aG9y
OiBULiBCYWplcjxicj4NCjxicj4NCsKgKi88YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8
YnI+DQojaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDs8YnI+DQo8YnI+DQojaW5jbHVkZSAmbHQ7c3Rk
bGliLmgmZ3Q7PGJyPg0KPGJyPg0KI2luY2x1ZGUgJmx0O3VuaXN0ZC5oJmd0Ozxicj4NCjxicj4N
Ci8vI2luY2x1ZGUgJmx0O3VzYi5oJmd0Ozxicj4NCjxicj4NCiNpbmNsdWRlICZsdDtlcnJuby5o
Jmd0Ozxicj4NCjxicj4NCiNpbmNsdWRlICZsdDtzdGRpbnQuaCZndDs8YnI+DQo8YnI+DQojaWZk
ZWYgX19BUFBMRV9fPGJyPg0KPGJyPg0KI2luY2x1ZGUgJmx0O1BDU0Mvd2luc2NhcmQuaCZndDs8
YnI+DQo8YnI+DQojaW5jbHVkZSAmbHQ7UENTQy93aW50eXBlcy5oJmd0Ozxicj4NCjxicj4NCiNl
bHNlPGJyPg0KPGJyPg0KI2luY2x1ZGUgJmx0O3dpbnNjYXJkLmgmZ3Q7PGJyPg0KPGJyPg0KI2Vu
ZGlmPGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KLyo8YnI+DQojIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyM8d2JyPiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIzx3
YnI+IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjPHdicj4jIzxicj4NCjxicj4NCsKgKiAj
IyMjIEJVSUxEIENPTU1BTkQ6PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgIyMjIzxi
cj4NCjxicj4NCsKgKiAjIyMjIGdjYyAtbyBleGFtcGxlIGV4YW1wbGVSZWNvbm5lY3QuYyAtSS91
c3IvbG9jYWwvaW5jbHVkZS9QQ1NDPGJyPg0KLWxwY3NjbGl0ZSAtbHVzYiAtV2FsbCAjIyMjPGJy
Pg0KPGJyPg0KwqAqPGJyPg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjPHdicj4jIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM8d2JyPiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIzx3YnI+IyM8YnI+DQoqLzxicj4NCjxicj4NCjxicj4NCjxicj4NCi8qIFVuY29tbWVudCBt
ZSBmb3IgbW9yZSBkZXRhaWxzICovPGJyPg0KPGJyPg0KLy8jZGVmaW5lIFNDX0RFQlVHPGJyPg0K
PGJyPg0KPGJyPg0KPGJyPg0KLyogVW5jb21tZW50IG1lIHRvIG1ha2UgaXQgd29yayAqLzxicj4N
Cjxicj4NCi8vI2RlZmluZSBIT1RGSVg8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+
DQovKjxicj4NCjxicj4NCsKgKiBQcm90b3R5cGVzPGJyPg0KPGJyPg0KwqAqLzxicj4NCjxicj4N
CmludCBjb25uZWN0VG9TbWFydGNhcmQoIFNDQVJEQ09OVEVYVCAqaENvbnRleHQsPGJyPg0KPGJy
Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgU0NBUkRIQU5ETEUgKmhDYXJk
LDxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIExQVFNUUiAq
bXN6UmVhZGVycyk7PGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0Kdm9pZCBkaXNjb25uZWN0U21hcnRj
YXJkKMKgIMKgU0NBUkRDT05URVhUICpoQ29udGV4dCw8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBTQ0FSREhBTkRMRSAqaENhcmQsPGJyPg0KPGJy
Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgTFBUU1RSICptc3pS
ZWFkZXJzKTs8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQp2b2lkIHdhaXRGb3JTbWFydGNhcmRDb25u
ZWN0KCk7PGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0Kdm9pZCB3YWl0Rm9yU21hcnRjYXJkRGlzY29u
bmVjdCgpOzxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCi8qPGJyPg0KPGJyPg0K
wqAqIE1BSU4gZnVuY3Rpb248YnI+DQo8YnI+DQrCoCovPGJyPg0KPGJyPg0KaW50IG1haW4oaW50
IGFyZ2MsIGNoYXIgKiphcmd2KTxicj4NCjxicj4NCns8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCBTQ0FSRENPTlRFWFQgaENvbnRleHQ7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgU0NBUkRIQU5ETEUgaENhcmQ7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgTFBUU1RSIG1zelJlYWRlcnM7PGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgcHJpbnRmKCZxdW90O1NtYXJ0Y2FyZCBkZXRlY3Rpb24gc3RhcnRl
ZC5cbiZxdW90Oyk7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZm9yKDs7KTxi
cj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHs8YnI+DQo8YnI+DQrCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcmludGYoJnF1b3Q7V2FpdGluZyBmb3Igc21hcnRj
YXJkIGNvbm5lY3QuLi5cbiZxdW90Oyk7PGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KI2lmZGVmIEhP
VEZJWDxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHN5c3Rl
bSgmcXVvdDtzZXJ2aWNlIHBjc2NkIHJlc3RhcnQmcXVvdDspOzxicj4NCjxicj4NCiNlbmRpZjxi
cj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHdhaXRGb3JTbWFy
dGNhcmRDb25uZWN0KCk7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgcHJpbnRmKCZxdW90O1NtYXJ0Y2FyZCBmb3VuZC5cbiZxdW90Oyk7PGJyPg0KPGJyPg0K
PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcHJpbnRmKCZx
dW90O0Nvbm5lY3RpbmcgdG8gc21hcnRjYXJkLi4uXG4mcXVvdDspOzxicj4NCjxicj4NCsKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmKGNvbm5lY3RUb1NtYXJ0Y2FyZCgmYW1w
Ozx3YnI+aENvbnRleHQsICZhbXA7aENhcmQsICZhbXA7bXN6UmVhZGVycykgPT0gMCk8YnI+DQo8
YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB7PGJyPg0KPGJyPg0KwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcHJpbnRmKCZxdW90
O0Nvbm5lY3Rpbmcgc3VjY2Vzc2Z1bCFcbiZxdW90Oyk7PGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0K
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLyo8YnI+DQo8
YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCrC
oCBEbyBTQyBzdHVmZiBoZXJlPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAqLzxicj4NCjxicj4NCjxicj4NCjxicj4NCsKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByaW50ZigmcXVvdDtEaXNj
b25uZWN0aW5nLi4uXG4mcXVvdDspOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGRpc2Nvbm5lY3RTbWFydGNhcmQoJmFtcDtoQ29udGV4
dCwgJmFtcDtoQ2FyZCwgJmFtcDttc3pSZWFkZXJzKTs8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcmludGYoJnF1b3Q7RGlzY29ubmVj
dGVkIVxuJnF1b3Q7KTs8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCB9PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZWxz
ZTxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHs8YnI+DQo8
YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcmlu
dGYoJnF1b3Q7Q09OTkVDVCBGQUlMRUQhXG4mcXVvdDspOzxicj4NCjxicj4NCsKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH08YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQrCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcmludGYoJnF1b3Q7V2FpdGluZyBmb3Igc21h
cnRjYXJkIGRpc2Nvbm5lY3QuLi5cbiZxdW90Oyk7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgd2FpdEZvclNtYXJ0Y2FyZERpc2Nvbm5lY3QoKTs8YnI+DQo8
YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcmludGYoJnF1b3Q7U21h
cnRjYXJkIGxvc3QhXG4mcXVvdDspOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IH08YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZXR1cm4g
MDs8YnI+DQo8YnI+DQp9PGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KLyo8YnI+
DQo8YnI+DQrCoCogSW1wbGVtZW50YXRpb25zPGJyPg0KPGJyPg0KwqAqLzxicj4NCjxicj4NCjxi
cj4NCjxicj4NCmludCBjb25uZWN0VG9TbWFydGNhcmQoIFNDQVJEQ09OVEVYVCAqaENvbnRleHQs
PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgU0NBUkRIQU5E
TEUgKmhDYXJkLDxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IExQVFNUUiAqbXN6UmVhZGVycyk8YnI+DQo8YnI+DQp7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAg
TE9ORyBydiA9IDA7PGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgRFdPUkQgZHdS
ZWFkZXJzLCBkd0FjdGl2ZVByb3RvY29sIDs8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQrCoCDCoCDC
oCDCoCAvLyBJbml0IGNvbnRleHQ8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCBwcmludGYoJnF1b3Q7
RXN0YWJsaXNoIGNvbnRleHRcbiZxdW90Oyk7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgcnYgPSBT
Q2FyZEVzdGFibGlzaENvbnRleHQoIFNDQVJEX1NDT1BFX1NZU1RFTSw8YnI+DQo8YnI+DQrCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBOVUxMLDxicj4NCjxi
cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIE5VTEws
IGhDb250ZXh0KTs8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCBpZiAoU0NBUkRfU19TVUNDRVNTICE9
IHJ2KTxicj4NCjxicj4NCsKgIMKgIMKgIMKgIHs8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCByZXR1cm4gLTE7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgfTxicj4NCjxicj4NCjxi
cj4NCjxicj4NCsKgIMKgIMKgIMKgIC8vIEdldCBhdmFpbGFibGUgc21hcnRjYXJkIHJlYWRlcnM8
YnI+DQo8YnI+DQojaWZkZWYgU0NBUkRfQVVUT0FMTE9DQVRFPGJyPg0KPGJyPg0KwqAgwqAgwqAg
wqAgZHdSZWFkZXJzID0gU0NBUkRfQVVUT0FMTE9DQVRFOzxicj4NCjxicj4NCsKgIMKgIMKgIMKg
IHByaW50ZigmcXVvdDtMaXN0IHJlYWRlcnNcbiZxdW90Oyk7PGJyPg0KPGJyPg0KwqAgwqAgwqAg
wqAgcnYgPSBTQ2FyZExpc3RSZWFkZXJzKMKgICpoQ29udGV4dCw8YnI+DQo8YnI+DQrCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBOVUxMLDxicj4NCjxicj4NCsKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIChMUFRTVFIpbXN6UmVhZGVycyw8
YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAmYW1w
O2R3UmVhZGVycyk7PGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgaWYgKFNDQVJE
X1NfU1VDQ0VTUyAhPSBydik8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCB7PGJyPg0KPGJyPg0KwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgU0NhcmRSZWxlYXNlQ29udGV4dCgqaENvbnRleHQpPHdicj47
PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJuIC0xOzxicj4NCjxicj4N
CsKgIMKgIMKgIMKgIH08YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQojZWxzZTxicj4NCjxicj4NCsKg
IMKgIMKgIMKgIHByaW50ZigmcXVvdDtMaXN0IHJlYWRlcnNcbiZxdW90Oyk7PGJyPg0KPGJyPg0K
wqAgwqAgwqAgwqAgcnYgPSBTQ2FyZExpc3RSZWFkZXJzKMKgICpoQ29udGV4dCw8YnI+DQo8YnI+
DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBOVUxMLDxicj4NCjxi
cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIE5VTEwsPGJyPg0K
PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgJmFtcDtkd1Jl
YWRlcnMpOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIGlmIChTQ0FSRF9TX1NVQ0NFU1MgIT0gcnYp
PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgezxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIFNDYXJkUmVsZWFzZUNvbnRleHQoKmhDb250ZXh0KTx3YnI+Ozxicj4NCjxicj4NCsKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiAtMTs8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCB9PGJy
Pg0KPGJyPg0KwqAgwqAgwqAgwqAgcHJpbnRmKCZxdW90O0FsbG9jYXRlIHJlYWRlcnNcbiZxdW90
Oyk7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgbXN6UmVhZGVycyA9IGNhbGxvYyhkd1JlYWRlcnMs
IHNpemVvZihjaGFyKSk7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgcnYgPSBTQ2FyZExpc3RSZWFk
ZXJzKMKgICpoQ29udGV4dCw8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCBOVUxMLDxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgICptc3pSZWFkZXJzLDxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICZhbXA7ZHdSZWFkZXJzICk7PGJyPg0KPGJyPg0KwqAg
wqAgwqAgwqAgaWYoU0NBUkRfU19TVUNDRVNTICE9IHJ2KTxicj4NCjxicj4NCsKgIMKgIMKgIMKg
IHs8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBTQ2FyZEZyZWVNZW1vcnkoICpo
Q29udGV4dCwgbXN6UmVhZGVycyApOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IFNDYXJkUmVsZWFzZUNvbnRleHQoICpoQ29udGV4dCApOzxicj4NCjxicj4NCsKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIHJldHVybiAtMTs8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KPGJy
Pg0KPGJyPg0KPGJyPg0KI2VuZGlmPGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAg
cHJpbnRmKCAmcXVvdDtDb25uZWN0IHRvIGNhcmRcbiZxdW90OyApOzxicj4NCjxicj4NCsKgIMKg
IMKgIMKgIC8vIENvbm5lY3QgdG8gc21hcnRjYXJkPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgcnYg
PSBTQ2FyZENvbm5lY3QowqAgKmhDb250ZXh0LDxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgICptc3pSZWFkZXJzLDxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIFNDQVJEX1NIQVJFX1NIQVJFRCw8YnI+DQo8YnI+DQrCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBTQ0FSRF9QUk9UT0NPTF9UMCB8IFNDQVJE
X1BST1RPQ09MX1QxLDxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIGhDYXJkLDxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
ICZhbXA7ZHdBY3RpdmVQcm90b2NvbCApOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIGlmIChTQ0FS
RF9TX1NVQ0NFU1MgIT0gcnYpPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgezxicj4NCjxicj4NCsKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIFNDYXJkRnJlZU1lbW9yeSggKmhDb250ZXh0LCAqbXN6UmVh
ZGVycyApOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIFNDYXJkUmVsZWFzZUNv
bnRleHQoICpoQ29udGV4dCApOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJl
dHVybiAtMTs8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0K
wqAgwqAgwqAgwqAgcHJpbnRmKCAmcXVvdDtTbWFydGNhcmQgY29ubmVjdGVkIVxuJnF1b3Q7ICk7
PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgcmV0dXJuIDA7PGJyPg0KPGJyPg0KfTxicj4NCjxicj4N
Cjxicj4NCjxicj4NCnZvaWQgZGlzY29ubmVjdFNtYXJ0Y2FyZCjCoCDCoFNDQVJEQ09OVEVYVCAq
aENvbnRleHQsPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgU0NBUkRIQU5ETEUgKmhDYXJkLDxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIExQVFNUUiAqbXN6UmVhZGVycyk8YnI+DQo8YnI+DQp7PGJy
Pg0KPGJyPg0KwqAgwqAgwqAgwqAgcHJpbnRmKCZxdW90O0Rpc2Nvbm5lY3QgY2FyZC4uLlxuJnF1
b3Q7KTs8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCBTQ2FyZERpc2Nvbm5lY3QoICpoQ2FyZCwgU0NB
UkRfTEVBVkVfQ0FSRCApOzxicj4NCjxicj4NCjxicj4NCjxicj4NCsKgIMKgIMKgIMKgIHByaW50
ZigmcXVvdDtGcmVlIHJlYWRlci4uLlxuJnF1b3Q7KTs8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCAj
aWZkZWYgU0NBUkRfQVVUT0FMTE9DQVRFPGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KwqAgwqAgwqAg
wqAgU0NhcmRGcmVlTWVtb3J5KCAqaENvbnRleHQsICptc3pSZWFkZXJzICk7PGJyPg0KPGJyPg0K
PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgI2Vsc2U8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCBmcmVl
KCAqbXN6UmVhZGVycyApOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgICNlbmRpZjxicj4NCjxicj4N
Cjxicj4NCjxicj4NCsKgIMKgIMKgIMKgIHByaW50ZiggJnF1b3Q7UmVsZWFzZSBjb250ZXh0Li4u
XG4mcXVvdDsgKTs8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCBTQ2FyZFJlbGVhc2VDb250ZXh0KCAq
aENvbnRleHQgKTs8YnI+DQo8YnI+DQp9PGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KPGJy
Pg0KaW50IGNoZWNrU21hcnRjYXJkKCBTQ0FSRENPTlRFWFQgKmhDb250ZXh0LDxicj4NCjxicj4N
CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIFNDQVJESEFORExFICpoQ2FyZCw8YnI+DQo8
YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBMUFRTVFIgKm1zelJlYWRlcnMpPGJy
Pg0KPGJyPg0Kezxicj4NCjxicj4NCsKgIMKgIMKgIMKgIExPTkcgcnYgPSAwOzxicj4NCjxicj4N
Cjxicj4NCjxicj4NCsKgIMKgIMKgIMKgIERXT1JEIGR3UmVhZGVycywgZHdBY3RpdmVQcm90b2Nv
bDs8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCAvLyBJbml0IGNvbnRleHQ8YnI+
DQo8YnI+DQojaWZkZWYgU0NfREVCVUc8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCBwcmludGYoJnF1
b3Q7RXN0YWJsaXNoaW5nIFNDIGNvbnRleHQuLi5cbiZxdW90Oyk7PGJyPg0KPGJyPg0KI2VuZGlm
PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgcnYgPSBTQ2FyZEVzdGFibGlzaENvbnRleHQoIFNDQVJE
X1NDT1BFX1NZU1RFTSw8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCBOVUxMLDxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIE5VTEwsPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaENvbnRleHQpOzxicj4NCjxicj4NCsKg
IMKgIMKgIMKgIGlmIChTQ0FSRF9TX1NVQ0NFU1MgIT0gcnYpPGJyPg0KPGJyPg0KwqAgwqAgwqAg
wqAgezxicj4NCjxicj4NCiNpZmRlZiBTQ19ERUJVRzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIHByaW50ZigmcXVvdDtFUlJPUjogRXN0YWJsaXNoaW5nIFNDIGNvbnRleHQhXG4m
cXVvdDspOzxicj4NCjxicj4NCjxicj4NCjxicj4NCiNlbmRpZjxicj4NCjxicj4NCsKgIMKgIMKg
IMKgIH08YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAvLyBH
ZXQgYXZhaWxhYmxlIHNtYXJ0Y2FyZCByZWFkZXJzPGJyPg0KPGJyPg0KI2lmZGVmIFNDQVJEX0FV
VE9BTExPQ0FURTxicj4NCjxicj4NCsKgIMKgIMKgIMKgIGlmIChTQ0FSRF9TX1NVQ0NFU1MgPT0g
cnYpPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgezxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIGR3UmVhZGVycyA9IFNDQVJEX0FVVE9BTExPQ0FURTs8YnI+DQo8YnI+DQo8YnI+DQo8
YnI+DQojaWZkZWYgU0NfREVCVUc8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBw
cmludGYoJnF1b3Q7TGlzdGluZyBTQyByZWFkZXJzLi4uXG4mcXVvdDspOzxicj4NCjxicj4NCiNl
bmRpZjxicj4NCjxicj4NCjxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJ2ID0g
U0NhcmRMaXN0UmVhZGVycyggKmhDb250ZXh0LDxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIE5VTEwsPGJyPg0KPGJyPg0KwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKExQVFNUUiltc3pSZWFkZXJz
LDxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgICZhbXA7ZHdSZWFkZXJzICk7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
aWYgKFNDQVJEX1NfU1VDQ0VTUyAhPSBydik8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCB7PGJyPg0KPGJyPg0KI2lmZGVmIFNDX0RFQlVHPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcHJpbnRmKCZxdW90O0VSUk9SOiBMaXN0aW5nIFNDIHJl
YWRlcnMhXG4mcXVvdDspOzxicj4NCjxicj4NCiNlbmRpZjxicj4NCjxicj4NCsKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIC8qIE1heDogdGhpcyBoYXMgdG8gYmUgZ2l2ZW4gYnkg
dmFsdWUsIG5vdCBieSBwb2ludGVyISAoZXZlbiBpZiBpdDxicj4NCmRvZXNuJiMzOTt0IG1ha2Ug
c2Vuc2UuLikgKi88YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCBTQ2FyZFJlbGVhc2VDb250ZXh0KCpoQ29udGV4dCk8d2JyPjs8YnI+DQo8YnI+DQrCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCB9PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgfTxicj4NCjxicj4NCsKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgICNlbHNlPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgaWYgKFND
QVJEX1NfU1VDQ0VTUyA9PSBydik8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCB7PGJyPg0KPGJyPg0K
I2lmZGVmIFNDX0RFQlVHPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcHJpbnRm
KCZxdW90O0xpc3RpbmcgU0MgcmVhZGVycy4uLlxuJnF1b3Q7KTs8YnI+DQo8YnI+DQojZW5kaWY8
YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBydiA9IFNDYXJkTGlzdFJlYWRlcnMo
wqAgKmhDb250ZXh0LDxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIE5VTEwsPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgTlVMTCw8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAmYW1wO2R3UmVhZGVycyk7PGJyPg0KPGJy
Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYgKFNDQVJEX1NfU1VDQ0VTUyAhPSBydik8YnI+
DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB7PGJyPg0KPGJyPg0KI2lmZGVmIFNDX0RF
QlVHPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcHJpbnRm
KCZxdW90O0VSUk9SOiBMaXN0aW5nIFNDIHJlYWRlcnMhXG4mcXVvdDspOzxicj4NCjxicj4NCiNl
bmRpZjxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIFNDYXJk
UmVsZWFzZUNvbnRleHQoICpoQ29udGV4dCApOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIH08YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAg
aWYgKFNDQVJEX1NfU1VDQ0VTUyA9PSBydik8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCB7PGJyPg0K
PGJyPg0KPGJyPg0KPGJyPg0KI2lmZGVmIFNDX0RFQlVHPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgcHJpbnRmKCAmcXVvdDtMaXN0aW5nIFNDIHJlYWRlcnMuLi5cbiZxdW90OyAp
Ozxicj4NCjxicj4NCiNlbmRpZjxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG1z
elJlYWRlcnMgPSBjYWxsb2MoIGR3UmVhZGVycywgc2l6ZW9mKGNoYXIpICk7PGJyPg0KPGJyPg0K
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcnYgPSBTQ2FyZExpc3RSZWFkZXJzKCAqaENvbnRleHQs
PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgTlVMTCw8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCAqbXN6UmVhZGVycyw8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAmYW1wO2R3UmVhZGVycyApOzxicj4NCjxicj4NCsKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmKFNDQVJEX1NfU1VDQ0VTUyAhPSBydik8YnI+DQo8YnI+
DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB7PGJyPg0KPGJyPg0KI2lmZGVmIFNDX0RFQlVHPGJy
Pg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcHJpbnRmKCAmcXVv
dDtFUlJPUjogTGlzdGluZyBTQyByZWFkZXJzIVxuJnF1b3Q7ICk7PGJyPg0KPGJyPg0KI2VuZGlm
PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgU0NhcmRGcmVl
TWVtb3J5KCAqaENvbnRleHQsICptc3pSZWFkZXJzICk7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgU0NhcmRSZWxlYXNlQ29udGV4dCggKmhDb250ZXh0ICk7
PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfTxicj4NCjxicj4NCsKgIMKgIMKg
IMKgIH08YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAjZW5kaWY8YnI+DQo8YnI+
DQrCoCDCoCDCoCDCoCBpZiAoU0NBUkRfU19TVUNDRVNTID09IHJ2KTxicj4NCjxicj4NCsKgIMKg
IMKgIMKgIHs8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQojaWZkZWYgU0NfREVCVUc8YnI+DQo8YnI+
DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcmludGYoICZxdW90O0Nvbm5lY3RpbmcgdG8gU0Mu
Li5cbiZxdW90OyApOzxicj4NCjxicj4NCiNlbmRpZjxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIHJ2ID0gU0NhcmRDb25uZWN0KMKgICpoQ29udGV4dCw8YnI+DQo8YnI+DQrCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAqbXN6UmVhZGVycyw8YnI+DQo8
YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBTQ0FSRF9TSEFS
RV9TSEFSRUQsPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgU0NBUkRfUFJPVE9DT0xfVDAgfCBTQ0FSRF9QUk9UT0NPTF9UMSw8YnI+DQo8YnI+DQrC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBoQ2FyZCw8YnI+DQo8YnI+
DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAmYW1wO2R3QWN0aXZl
UHJvdG9jb2wpOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmIChTQ0FSRF9T
X1NVQ0NFU1MgIT0gcnYpPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgezxicj4N
Cjxicj4NCiNpZmRlZiBTQ19ERUJVRzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIHByaW50ZigmcXVvdDtFUlJPUjogQ29ubmVjdGluZyB0byBTQyFcbiZxdW90
Oyk7PGJyPg0KPGJyPg0KI2VuZGlmPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
fTxicj4NCjxicj4NCsKgIMKgIMKgIMKgIH08YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCBTQ2FyZEZy
ZWVNZW1vcnkoKmhDb250ZXh0LCAqbXN6UmVhZGVycyk7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAg
U0NhcmRSZWxlYXNlQ29udGV4dCgqaENvbnRleHQpPHdicj47PGJyPg0KPGJyPg0KPGJyPg0KPGJy
Pg0KwqAgwqAgwqAgwqAgZmZsdXNoKHN0ZG91dCk7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgcmV0
dXJuIHJ2Ozxicj4NCjxicj4NCn08YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQp2b2lkIHdhaXRGb3JT
bWFydGNhcmRDb25uZWN0KCk8YnI+DQo8YnI+DQp7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgU0NB
UkRDT05URVhUIGhDb250ZXh0Ozxicj4NCjxicj4NCsKgIMKgIMKgIMKgIFNDQVJESEFORExFIGhD
YXJkOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIExQVFNUUiBtc3pSZWFkZXJzOzxicj4NCjxicj4N
Cjxicj4NCjxicj4NCsKgIMKgIMKgIMKgIHdoaWxlKGNoZWNrU21hcnRjYXJkKCZhbXA7PHdicj5o
Q29udGV4dCwgJmFtcDtoQ2FyZCwgJmFtcDttc3pSZWFkZXJzKSAhPSAwKTxicj4NCjxicj4NCsKg
IMKgIMKgIMKgIHs8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzbGVlcCgxKTs8
YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KPGJyPg0KfTxicj4NCjxicj4NCjxicj4NCjxi
cj4NCnZvaWQgd2FpdEZvclNtYXJ0Y2FyZERpc2Nvbm5lY3QoKTxicj4NCjxicj4NCns8YnI+DQo8
YnI+DQrCoCDCoCDCoCDCoCBTQ0FSRENPTlRFWFQgaENvbnRleHQ7PGJyPg0KPGJyPg0KwqAgwqAg
wqAgwqAgU0NBUkRIQU5ETEUgaENhcmQ7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgTFBUU1RSIG1z
elJlYWRlcnM7PGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgd2hpbGUoY2hlY2tT
bWFydGNhcmQoJmFtcDs8d2JyPmhDb250ZXh0LCAmYW1wO2hDYXJkLCAmYW1wO21zelJlYWRlcnMp
ID09IDApPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgezxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIHNsZWVwKDEpOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIH08YnI+DQo8YnI+DQp9
PGJyPg0KPGJyPg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fPHdicj5fX19fX19fX19f
X19fX19fXzxicj4NClBjc2NsaXRlLW11c2NsZSBtYWlsaW5nIGxpc3Q8YnI+DQo8YSBocmVmPSJt
YWlsdG86UGNzY2xpdGUtbXVzY2xlQGxpc3RzLmFsaW90aC5kZWJpYW4ub3JnIj5QY3NjbGl0ZS1t
dXNjbGVAbGlzdHMuYWxpb3RoLjx3YnI+ZGViaWFuLm9yZzwvYT48YnI+DQo8YSBocmVmPSJodHRw
Oi8vbGlzdHMuYWxpb3RoLmRlYmlhbi5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3Bjc2Ns
aXRlLW11c2NsZSIgcmVsPSJub3JlZmVycmVyIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL2xpc3Rz
LmFsaW90aC5kZWJpYW4uPHdicj5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvLzx3YnI+cGNz
Y2xpdGUtbXVzY2xlPC9hPjxicj4NCjwvYmxvY2txdW90ZT48L2Rpdj48YnI+PC9kaXY+PC9kaXY+
PC9kaXY+DQo=
--f403045c44f8d372460554d2e29d--


--===============2597705525827588530==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Pcsclite-muscle mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pcsclite-muscle
--===============2597705525827588530==--