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==--