X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f X-Recipient: djgpp AT delorie DOT com X-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=to:subject:message-id:date:from:references:in-reply-to:mime-version :from:to:cc:subject:date:message-id:reply-to; bh=W4EV0FgwfvhDJtJv6qP2S0QDn9mvqjwAWE7kpYUFCLs=; b=Z2ya6B6Wncvg9rKkWOsLuK2MHYYdCjvv3ALZP+MB24TDSWgTQLzBE4lPE1LOK1Zd1I hYwKZ50db+kCzEvS/1i4ui+UXmpsC6XBx+t65qiM7gxnSSE6HP98KXNjd7MeKQmJx+xI hQobwRgfkezgIXYgE8JQImCzcdrY4vajZjG6lyAFMSe6iOKYRMWHNgRizUomHcPyCGss Wk6QH2TENqAJxqCHBE9RkJyQ/hIc0Srb5UpMsJPzlCdqynwTDrlOGvdyTji+0mO/XD71 qygEqF1JoTluuc4v1a+F2B+cg4psOaUIDFEAUYr1nkr/ikPSV/kNddNEogDHTzadiXwG jhRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=to:subject:message-id:date:from:references:in-reply-to:mime-version :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=W4EV0FgwfvhDJtJv6qP2S0QDn9mvqjwAWE7kpYUFCLs=; b=0qxOkDoLMkk9vss7qkGic2025zFWqvBOOhfXPHYCaX0qnW+/kOnk4kGVOH55cQvLRB xZIZiXcNIqjtEsgyrSHVP9IvF/gCAI0Zlb+SwR0iwwsI1N0VdyneQQjzJyB+XTZCLqM4 nfIyHnGoFTWjjPgMMyy4QGRrkMrU6FTzJsbfOeJYZWt1uqCYAQdoWe5htC2A889jqE9W +cDr002m9iYioas4nyypu//ukL4vnJnQmOlCNN/AnN9kO2ICpXjSr4LaNMQGnYT+QMkH udamweLxoTV4PBwDR30R4QDNC4nUwReZI/A/9amZRQth1MGuBkvk+f3xyekobNRwfmSo /lnw== X-Gm-Message-State: AFqh2kqmbwrtjiUrnzxipv6R399O1cKZGQWmWRG4vX7RNTwq4ODwQ7QT u8t55cKTN3LnniuQO3CRjJyqahBh9gLo4oA8j9G45Vyg X-Google-Smtp-Source: AMrXdXv5TsWlTycouKjJdj5A7PPulbu/unrNXWErt6FnEKE9mwQcTGfKuRHOfwmKXz9C2BDYDaz9nlnj47H2zuxoU2U= X-Received: by 2002:a17:902:e5ce:b0:189:9a36:accf with SMTP id u14-20020a170902e5ce00b001899a36accfmr2944193plf.19.1674603396947; Tue, 24 Jan 2023 15:36:36 -0800 (PST) MIME-Version: 1.0 In-Reply-To: <5de28b44-10f2-c824-def1-d451035ecaad@gmail.com> References: <744f054f-9682-4a05-91ad-684b18c0122b AT gmail DOT com> <21e1aa0b-1511-0071-84c0-b20c6a3d1dae AT gmail DOT com> <5de28b44-10f2-c824-def1-d451035ecaad AT gmail DOT com> From: "Frank H. Sapone (emoaddict15 AT gmail DOT com) [via djgpp AT delorie DOT com]" Date: Tue, 24 Jan 2023 18:36:35 -0500 Message-ID: Subject: Re: [PATCH] stub: ignore host exit status To: "djgpp AT delorie DOT com" Content-Type: multipart/alternative; boundary="0000000000009d663005f30afc82" Reply-To: djgpp AT delorie DOT com Errors-To: nobody AT delorie DOT com X-Mailing-List: djgpp AT delorie DOT com X-Unsubscribes-To: listserv AT delorie DOT com Precedence: bulk --0000000000009d663005f30afc82 Content-Type: text/plain; charset="UTF-8" I know you're looking for feedback but I dont use hdpmi32 and don't know of too many others that do except to run some windows console apps under dos. Cwsdpmi works just fine for djgpp. In any case, someone who knows what they're looking at can hopefully chime in. Just wanted to let you know we're receiving your messages. :) On Tuesday, January 24, 2023, J.W. Jagersma (jwjagersma AT gmail DOT com) [via djgpp AT delorie DOT com] wrote: > Would appreciate any feedback on this. I know there's a small mistake in > one > comment, but the code works. > > On 2022-11-25 00:26, J.W. Jagersma wrote: > > On 2022-11-23 20:47, J.W. Jagersma wrote: > >> Hi all, > >> > >> If you've ever tried using hdpmi32 with a djgpp program, you may have > >> noticed some strange behavior. The program first fails to run with > >> "Load error: no DPMI", but on the second try, it suddenly works. Then > >> a third invocation fails again, the fourth runs fine, etc. > >> > >> When you rename 'hdpmi32.exe' to 'cwsdpmi.exe', your program seems to > >> run consistently. But this is only because there is a second (real) > >> cwsdpmi in your PATH somewhere. What really happens, is that your > >> program alternates between running under hdpmi and cwsdpmi. > >> > >> I finally figured out why this happens, and it's very simple: hdpmi uses > >> the exit status to indicate if it was loaded via xms, vcpi, or int15. > >> And the djgpp stub considers any non-zero exit status to be a failure, > >> so it keeps searching PATH until cwsdpmi is found, which always returns > >> zero. > >> > >> For a possible solution, I would suggest to ignore the return status > >> from the host, and just check int 2f/1687 after every exec. As an added > >> bonus, this saves 13 bytes of stub space. > > > > Amended patch follows - it no longer skips the last iteration (exec > > with no path). > > > > It's a bit larger, but still saves 6 bytes in total. > > > > --- a/src/stub/stub.asm > > +++ b/src/stub/stub.asm > > @@ -199,38 +199,49 @@ not_path: > > ;----------------------------------------------------------- > ------------------ > > ; Get DPMI information before doing anything 386-specific > > > > - push es > > push di > > - xor cx, cx ; flag for load attempt set cx = 0 > > - jz @f2 ; We always jump, shorter than jmp > > + ; Set up loadname in case of no > DPMI. > > + ; First try current dir. > > + xor ah, ah ; Copy until this character (=0) > > + call store_env_string ; copy stub image to "loadname" > > + mov si, bx ; remove name so we can add DPMI > name > > + mov di, [path_off] ; Pointer to path contents (next > try) > > @b1: > > + xor cx, cx ; flag to signal end of loop > > +@b2: > > + call check_dpmi ; int 2f, ax=1687 > > + jz @f3 > > + call do_exec ; copy our name to string and try > load > > + jcxz @f1 ; cx=0 while we have more paths to > try > > + call check_dpmi ; last chance... > > + jz @f3 > > mov al, 110 > > mov dx, msg_no_dpmi > > jmpl error > > -@b2: > > - or cx, cx > > - jnz @b1 ; we already tried load once before > > - inc cx > > - call load_dpmi > > - jc @b1 > > +@f1: > > + ; Set up loadname for next attempt. > > + mov ah, ';' ; Copy until this character > > + call store_env_string ; to "loadname" > > + or al, al ; Check terminating character > > + jne @f2 ; If ';', continue > > + dec di ; else point at null for next pass. > > @f2: > > - mov ax, 0x1687 ; get DPMI entry point > > - int 0x2f > > - or ax, ax > > - jnz @b2 ; if 0 then it's there > > - and bl, 1 ; 32 bit capable? > > - jz @b2 > > + inc cx > > + cmp si, loadname ; anything there? > > + je @b2 ; final try (no path) > > + mov al, [si-1] > > + call test_delim ; is final character a path > delimiter > > + je @b1 > > + movb [si], '\\' ; no, add separator between path & > name > > + inc si > > + jmp @b1 > > @f3: > > - mov [modesw], di ; store the DPMI entry point > > - mov [modesw+2], es > > - mov [modesw_mem], si > > pop di > > - pop es > > > > ;----------------------------------------------------------- > ------------------ > > ; Now, find the name of the program file we are supposed to load. > > > > -; xor ah, ah ; termination character (set > above!) > > +; xor ah, ah ; termination char (set by > check_dpmi) > > call store_env_string ; copy it to loadname, set bx > > > > mov [stubinfo_env_size], di > > @@ -700,36 +711,29 @@ pm_dos: > > ret > > > > ;----------------------------------------------------------- > ------------------ > > -; load DPMI server if not present > > -; First check directory from which stub is loaded, then path, then > default > > -; On entry di points to image name > > +; Check for presence of a DPMI host, and save the mode switch address. > > +; Zero flag is clear on success. Clobbers ax/bx/dx. > > > > -path_off: > > - .dw 0 ; If stays zero, no path > > - > > -load_dpmi: > > - xor ah, ah ; Copy until this character (=0) > > - call store_env_string ; copy stub image to "loadname" > > - mov si, bx ; remove name so we can add DPMI > name > > - mov di, [path_off] ; Pointer to path contents (next > try) > > - jmp @f2 > > -loadloop: > > - mov ah, ';' ; Copy until this character > > - call store_env_string ; to "loadname" > > - or al,al ; Check terminating character > > - jne @f1 ; If ';', continue > > - dec di ; else point at null for next pass. > > -@f1: > > - cmp si, loadname ; anything there? > > - je do_exec ; final try (no path) let it return > > - mov al, [si-1] > > - call test_delim ; is final character a path > delimiter > > - je @f2 > > - movb [si], '\\' ; no, add separator between path & > name > > - inc si > > -@f2: > > - call do_exec ; copy our name to string and try > load > > - jc loadloop > > +check_dpmi: > > + push es > > + push cx > > + push di > > + push si > > + mov ax, 0x1687 ; get DPMI entry point > > + int 0x2f > > + mov dx, bx > > + or dl, 1 ; bx bit 0: 32-bit capable > > + xor bx, dx > > + or ax, bx ; DPMI present if ax = 0 > > + jnz @f1 > > + mov [modesw], di ; store the DPMI entry point > > + mov [modesw+2], es > > + mov [modesw_mem], si > > +@f1: > > + pop si > > + pop di > > + pop cx > > + pop es > > ret > > > > ;----------------------------------------------------------- > ------------------ > > @@ -766,13 +770,6 @@ do_exec: > > int 0x21 > > pop di > > pop es > > - jc @f1 ;carry set if exec failed > > - > > - mov ah, 0x4d ;get return code > > - int 0x21 > > - sub ax, 0x300 ;ah=3 TSR, al=code (success) > > - neg ax ;CY, if not originally 0x300 > > -@f1: > > jmp restore_umb ;called func. return for us. > > > > ;----------------------------------------------------------- > ------------------ > > @@ -796,10 +793,9 @@ include_umb: > > @f1: > > ret > > > > -; Restore upper memory status. All registers and flags preserved. > > +; Restore upper memory status. All registers preserved. > > > > restore_umb: > > - pushf > > cmpb [dos_major], 5 ; Won't work before dos 5 > > jb @f1 > > push ax > > @@ -815,7 +811,6 @@ restore_umb: > > pop bx > > pop ax > > @f1: > > - popf > > ret > > > > ;----------------------------------------------------------- > ------------------ > > @@ -840,6 +835,8 @@ msg_no_selectors: > > .db "no DPMI selectors$" > > msg_no_dpmi_memory: > > .db "no DPMI memory$" > > +path_off: > > + .dw 0 ; Points to PATH, stays zero if > none. > > > > ;----------------------------------------------------------- > ------------------ > > ; Unstored Data, available during and after mode switch > > > > --0000000000009d663005f30afc82 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 SSBrbm93IHlvdSYjMzk7cmUgbG9va2luZyBmb3IgZmVlZGJhY2sgYnV0IEkgZG9udCB1c2UgaGRw bWkzMiBhbmQgZG9uJiMzOTt0IGtub3cgb2YgdG9vIG1hbnkgb3RoZXJzIHRoYXQgZG8gZXhjZXB0 IHRvIHJ1biBzb21lIHdpbmRvd3MgY29uc29sZSBhcHBzIHVuZGVyIGRvcy7CoCBDd3NkcG1pIHdv cmtzIGp1c3QgZmluZSBmb3IgZGpncHAuPGRpdj48YnI+PC9kaXY+PGRpdj5JbiBhbnkgY2FzZSwg c29tZW9uZSB3aG8ga25vd3Mgd2hhdCB0aGV5JiMzOTtyZSBsb29raW5nIGF0IGNhbiBob3BlZnVs bHkgY2hpbWUgaW4uwqAgSnVzdCB3YW50ZWQgdG8gbGV0IHlvdSBrbm93IHdlJiMzOTtyZSByZWNl aXZpbmcgeW91ciBtZXNzYWdlcy4gOik8YnI+PGJyPk9uIFR1ZXNkYXksIEphbnVhcnkgMjQsIDIw MjMsIEouVy4gSmFnZXJzbWEgKDxhIGhyZWY9Im1haWx0bzpqd2phZ2Vyc21hQGdtYWlsLmNvbSI+ andqYWdlcnNtYUBnbWFpbC5jb208L2E+KSBbdmlhIDxhIGhyZWY9Im1haWx0bzpkamdwcEBkZWxv cmllLmNvbSI+ZGpncHBAZGVsb3JpZS5jb208L2E+XSAmbHQ7PGEgaHJlZj0ibWFpbHRvOmRqZ3Bw QGRlbG9yaWUuY29tIj5kamdwcEBkZWxvcmllLmNvbTwvYT4mZ3Q7IHdyb3RlOjxicj48YmxvY2tx dW90ZSBjbGFzcz0iZ21haWxfcXVvdGUiIHN0eWxlPSJtYXJnaW46MCAwIDAgLjhleDtib3JkZXIt bGVmdDoxcHggI2NjYyBzb2xpZDtwYWRkaW5nLWxlZnQ6MWV4Ij5Xb3VsZCBhcHByZWNpYXRlIGFu eSBmZWVkYmFjayBvbiB0aGlzLsKgIEkga25vdyB0aGVyZSYjMzk7cyBhIHNtYWxsIG1pc3Rha2Ug aW4gb25lPGJyPg0KY29tbWVudCwgYnV0IHRoZSBjb2RlIHdvcmtzLjxicj4NCjxicj4NCk9uIDIw MjItMTEtMjUgMDA6MjYsIEouVy4gSmFnZXJzbWEgd3JvdGU6PGJyPg0KJmd0OyBPbiAyMDIyLTEx LTIzIDIwOjQ3LCBKLlcuIEphZ2Vyc21hIHdyb3RlOjxicj4NCiZndDsmZ3Q7IEhpIGFsbCw8YnI+ DQomZ3Q7Jmd0Ozxicj4NCiZndDsmZ3Q7IElmIHlvdSYjMzk7dmUgZXZlciB0cmllZCB1c2luZyBo ZHBtaTMyIHdpdGggYSBkamdwcCBwcm9ncmFtLCB5b3UgbWF5IGhhdmU8YnI+DQomZ3Q7Jmd0OyBu b3RpY2VkIHNvbWUgc3RyYW5nZSBiZWhhdmlvci7CoCBUaGUgcHJvZ3JhbSBmaXJzdCBmYWlscyB0 byBydW4gd2l0aDxicj4NCiZndDsmZ3Q7ICZxdW90O0xvYWQgZXJyb3I6IG5vIERQTUkmcXVvdDss IGJ1dCBvbiB0aGUgc2Vjb25kIHRyeSwgaXQgc3VkZGVubHkgd29ya3MuwqAgVGhlbjxicj4NCiZn dDsmZ3Q7IGEgdGhpcmQgaW52b2NhdGlvbiBmYWlscyBhZ2FpbiwgdGhlIGZvdXJ0aCBydW5zIGZp bmUsIGV0Yy48YnI+DQomZ3Q7Jmd0Ozxicj4NCiZndDsmZ3Q7IFdoZW4geW91IHJlbmFtZSAmIzM5 O2hkcG1pMzIuZXhlJiMzOTsgdG8gJiMzOTtjd3NkcG1pLmV4ZSYjMzk7LCB5b3VyIHByb2dyYW0g c2VlbXMgdG88YnI+DQomZ3Q7Jmd0OyBydW4gY29uc2lzdGVudGx5LsKgIEJ1dCB0aGlzIGlzIG9u bHkgYmVjYXVzZSB0aGVyZSBpcyBhIHNlY29uZCAocmVhbCk8YnI+DQomZ3Q7Jmd0OyBjd3NkcG1p IGluIHlvdXIgUEFUSCBzb21ld2hlcmUuwqAgV2hhdCByZWFsbHkgaGFwcGVucywgaXMgdGhhdCB5 b3VyPGJyPg0KJmd0OyZndDsgcHJvZ3JhbSBhbHRlcm5hdGVzIGJldHdlZW4gcnVubmluZyB1bmRl ciBoZHBtaSBhbmQgY3dzZHBtaS48YnI+DQomZ3Q7Jmd0Ozxicj4NCiZndDsmZ3Q7IEkgZmluYWxs eSBmaWd1cmVkIG91dCB3aHkgdGhpcyBoYXBwZW5zLCBhbmQgaXQmIzM5O3MgdmVyeSBzaW1wbGU6 IGhkcG1pIHVzZXM8YnI+DQomZ3Q7Jmd0OyB0aGUgZXhpdCBzdGF0dXMgdG8gaW5kaWNhdGUgaWYg aXQgd2FzIGxvYWRlZCB2aWEgeG1zLCB2Y3BpLCBvciBpbnQxNS48YnI+DQomZ3Q7Jmd0OyBBbmQg dGhlIGRqZ3BwIHN0dWIgY29uc2lkZXJzIGFueSBub24temVybyBleGl0IHN0YXR1cyB0byBiZSBh IGZhaWx1cmUsPGJyPg0KJmd0OyZndDsgc28gaXQga2VlcHMgc2VhcmNoaW5nIFBBVEggdW50aWwg Y3dzZHBtaSBpcyBmb3VuZCwgd2hpY2ggYWx3YXlzIHJldHVybnM8YnI+DQomZ3Q7Jmd0OyB6ZXJv Ljxicj4NCiZndDsmZ3Q7PGJyPg0KJmd0OyZndDsgRm9yIGEgcG9zc2libGUgc29sdXRpb24sIEkg d291bGQgc3VnZ2VzdCB0byBpZ25vcmUgdGhlIHJldHVybiBzdGF0dXM8YnI+DQomZ3Q7Jmd0OyBm cm9tIHRoZSBob3N0LCBhbmQganVzdCBjaGVjayBpbnQgMmYvMTY4NyBhZnRlciBldmVyeSBleGVj LsKgIEFzIGFuIGFkZGVkPGJyPg0KJmd0OyZndDsgYm9udXMsIHRoaXMgc2F2ZXMgMTMgYnl0ZXMg b2Ygc3R1YiBzcGFjZS48YnI+DQomZ3Q7IDxicj4NCiZndDsgQW1lbmRlZCBwYXRjaCBmb2xsb3dz IC0gaXQgbm8gbG9uZ2VyIHNraXBzIHRoZSBsYXN0IGl0ZXJhdGlvbiAoZXhlYzxicj4NCiZndDsg d2l0aCBubyBwYXRoKS48YnI+DQomZ3Q7IDxicj4NCiZndDsgSXQmIzM5O3MgYSBiaXQgbGFyZ2Vy LCBidXQgc3RpbGwgc2F2ZXMgNiBieXRlcyBpbiB0b3RhbC48YnI+DQomZ3Q7IDxicj4NCiZndDsg LS0tIGEvc3JjL3N0dWIvc3R1Yi5hc208YnI+DQomZ3Q7ICsrKyBiL3NyYy9zdHViL3N0dWIuYXNt PGJyPg0KJmd0OyBAQCAtMTk5LDM4ICsxOTksNDkgQEAgbm90X3BhdGg6PGJyPg0KJmd0O8KgIDst LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTx3YnI+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tPHdicj4tLS0tLS0tLS0tLS0tLS0tLS08YnI+DQomZ3Q7wqAgO8KgIEdldCBEUE1JIGlu Zm9ybWF0aW9uIGJlZm9yZSBkb2luZyBhbnl0aGluZyAzODYtc3BlY2lmaWM8YnI+DQomZ3Q7wqAg PGJyPg0KJmd0OyAtwqAgwqAgwqBwdXNowqAgwqAgZXM8YnI+DQomZ3Q7wqAgwqAgwqAgwqBwdXNo wqAgwqAgZGk8YnI+DQomZ3Q7IC3CoCDCoCDCoHhvcsKgIMKgIMKgY3gsIGN4wqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgOyBmbGFnIGZvciBsb2FkIGF0dGVtcHQgc2V0IGN4ID0gMDxicj4NCiZn dDsgLcKgIMKgIMKganrCoCDCoCDCoCBAZjLCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oDsgV2UgYWx3YXlzIGp1bXAsIHNob3J0ZXIgdGhhbiBqbXA8YnI+DQomZ3Q7ICvCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDsgU2V0IHVwIGxv YWRuYW1lIGluIGNhc2Ugb2Ygbm8gRFBNSS48YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDsgRmlyc3QgdHJ5IGN1cnJlbnQg ZGlyLjxicj4NCiZndDsgK8KgIMKgIMKgeG9ywqAgwqAgwqBhaCwgYWjCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCA7IENvcHkgdW50aWwgdGhpcyBjaGFyYWN0ZXIgKD0wKTxicj4NCiZndDsgK8Kg IMKgIMKgY2FsbMKgIMKgIHN0b3JlX2Vudl9zdHJpbmfCoCDCoCDCoCDCoCA7IGNvcHkgc3R1YiBp bWFnZSB0byAmcXVvdDtsb2FkbmFtZSZxdW90Ozxicj4NCiZndDsgK8KgIMKgIMKgbW92wqAgwqAg wqBzaSwgYnjCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA7IHJlbW92ZSBuYW1lIHNvIHdlIGNh biBhZGQgRFBNSSBuYW1lPGJyPg0KJmd0OyArwqAgwqAgwqBtb3bCoCDCoCDCoGRpLCBbcGF0aF9v ZmZdwqAgwqAgwqAgwqAgwqAgOyBQb2ludGVyIHRvIHBhdGggY29udGVudHMgKG5leHQgdHJ5KTxi cj4NCiZndDvCoCBAYjE6PGJyPg0KJmd0OyArwqAgwqAgwqB4b3LCoCDCoCDCoGN4LCBjeMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIDsgZmxhZyB0byBzaWduYWwgZW5kIG9mIGxvb3A8YnI+DQom Z3Q7ICtAYjI6PGJyPg0KJmd0OyArwqAgwqAgwqBjYWxswqAgwqAgY2hlY2tfZHBtacKgIMKgIMKg IMKgIMKgIMKgIMKgIDsgaW50IDJmLCBheD0xNjg3PGJyPg0KJmd0OyArwqAgwqAgwqBqesKgIMKg IMKgIEBmMzxicj4NCiZndDsgK8KgIMKgIMKgY2FsbMKgIMKgIGRvX2V4ZWPCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoDsgY29weSBvdXIgbmFtZSB0byBzdHJpbmcgYW5kIHRyeSBsb2FkPGJyPg0K Jmd0OyArwqAgwqAgwqBqY3h6wqAgwqAgQGYxwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqA7IGN4PTAgd2hpbGUgd2UgaGF2ZSBtb3JlIHBhdGhzIHRvIHRyeTxicj4NCiZndDsgK8KgIMKg IMKgY2FsbMKgIMKgIGNoZWNrX2RwbWnCoCDCoCDCoCDCoCDCoCDCoCDCoCA7IGxhc3QgY2hhbmNl Li4uPGJyPg0KJmd0OyArwqAgwqAgwqBqesKgIMKgIMKgIEBmMzxicj4NCiZndDvCoCDCoCDCoCDC oG1vdsKgIMKgIMKgYWwsIDExMDxicj4NCiZndDvCoCDCoCDCoCDCoG1vdsKgIMKgIMKgZHgsIG1z Z19ub19kcG1pPGJyPg0KJmd0O8KgIMKgIMKgIMKgam1wbMKgIMKgIGVycm9yPGJyPg0KJmd0OyAt QGIyOjxicj4NCiZndDsgLcKgIMKgIMKgb3LCoCDCoCDCoCBjeCwgY3g8YnI+DQomZ3Q7IC3CoCDC oCDCoGpuesKgIMKgIMKgQGIxwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA7IHdlIGFs cmVhZHkgdHJpZWQgbG9hZCBvbmNlIGJlZm9yZTxicj4NCiZndDsgLcKgIMKgIMKgaW5jwqAgwqAg wqBjeDxicj4NCiZndDsgLcKgIMKgIMKgY2FsbMKgIMKgIGxvYWRfZHBtaTxicj4NCiZndDsgLcKg IMKgIMKgamPCoCDCoCDCoCBAYjE8YnI+DQomZ3Q7ICtAZjE6PGJyPg0KJmd0OyArwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA7IFNldCB1cCBs b2FkbmFtZSBmb3IgbmV4dCBhdHRlbXB0Ljxicj4NCiZndDsgK8KgIMKgIMKgbW92wqAgwqAgwqBh aCwgJiMzOTs7JiMzOTvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDsgQ29weSB1bnRpbCB0aGlz IGNoYXJhY3Rlcjxicj4NCiZndDsgK8KgIMKgIMKgY2FsbMKgIMKgIHN0b3JlX2Vudl9zdHJpbmfC oCDCoCDCoCDCoCA7IHRvICZxdW90O2xvYWRuYW1lJnF1b3Q7PGJyPg0KJmd0OyArwqAgwqAgwqBv csKgIMKgIMKgIGFsLCBhbMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDsgQ2hlY2sgdGVybWlu YXRpbmcgY2hhcmFjdGVyPGJyPg0KJmd0OyArwqAgwqAgwqBqbmXCoCDCoCDCoEBmMsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgOyBJZiAmIzM5OzsmIzM5OywgY29udGludWU8YnI+DQom Z3Q7ICvCoCDCoCDCoGRlY8KgIMKgIMKgZGnCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCA7IGVsc2UgcG9pbnQgYXQgbnVsbCBmb3IgbmV4dCBwYXNzLjxicj4NCiZndDvCoCBAZjI6PGJy Pg0KJmd0OyAtwqAgwqAgwqBtb3bCoCDCoCDCoGF4LCAweDE2ODfCoCDCoCDCoCDCoCDCoCDCoCDC oCA7IGdldCBEUE1JIGVudHJ5IHBvaW50PGJyPg0KJmd0OyAtwqAgwqAgwqBpbnTCoCDCoCDCoDB4 MmY8YnI+DQomZ3Q7IC3CoCDCoCDCoG9ywqAgwqAgwqAgYXgsIGF4PGJyPg0KJmd0OyAtwqAgwqAg wqBqbnrCoCDCoCDCoEBiMsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgOyBpZiAwIHRo ZW4gaXQmIzM5O3MgdGhlcmU8YnI+DQomZ3Q7IC3CoCDCoCDCoGFuZMKgIMKgIMKgYmwsIDHCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDsgMzIgYml0IGNhcGFibGU/PGJyPg0KJmd0OyAtwqAg wqAgwqBqesKgIMKgIMKgIEBiMjxicj4NCiZndDsgK8KgIMKgIMKgaW5jwqAgwqAgwqBjeDxicj4N CiZndDsgK8KgIMKgIMKgY21wwqAgwqAgwqBzaSwgbG9hZG5hbWXCoCDCoCDCoCDCoCDCoCDCoCA7 IGFueXRoaW5nIHRoZXJlPzxicj4NCiZndDsgK8KgIMKgIMKgamXCoCDCoCDCoCBAYjLCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDsgZmluYWwgdHJ5IChubyBwYXRoKTxicj4NCiZndDsg K8KgIMKgIMKgbW92wqAgwqAgwqBhbCwgW3NpLTFdPGJyPg0KJmd0OyArwqAgwqAgwqBjYWxswqAg wqAgdGVzdF9kZWxpbcKgIMKgIMKgIMKgIMKgIMKgIMKgIDsgaXMgZmluYWwgY2hhcmFjdGVyIGEg cGF0aCBkZWxpbWl0ZXI8YnI+DQomZ3Q7ICvCoCDCoCDCoGplwqAgwqAgwqAgQGIxPGJyPg0KJmd0 OyArwqAgwqAgwqBtb3ZiwqAgwqAgW3NpXSwgJiMzOTtcXCYjMzk7wqAgwqAgwqAgwqAgwqAgwqAg wqAgOyBubywgYWRkIHNlcGFyYXRvciBiZXR3ZWVuIHBhdGggJmFtcDsgbmFtZTxicj4NCiZndDsg K8KgIMKgIMKgaW5jwqAgwqAgwqBzaTxicj4NCiZndDsgK8KgIMKgIMKgam1wwqAgwqAgwqBAYjE8 YnI+DQomZ3Q7wqAgQGYzOjxicj4NCiZndDsgLcKgIMKgIMKgbW92wqAgwqAgwqBbbW9kZXN3XSwg ZGnCoCDCoCDCoCDCoCDCoCDCoCA7IHN0b3JlIHRoZSBEUE1JIGVudHJ5IHBvaW50PGJyPg0KJmd0 OyAtwqAgwqAgwqBtb3bCoCDCoCDCoFttb2Rlc3crMl0sIGVzPGJyPg0KJmd0OyAtwqAgwqAgwqBt b3bCoCDCoCDCoFttb2Rlc3dfbWVtXSwgc2k8YnI+DQomZ3Q7wqAgwqAgwqAgwqBwb3DCoCDCoCDC oGRpPGJyPg0KJmd0OyAtwqAgwqAgwqBwb3DCoCDCoCDCoGVzPGJyPg0KJmd0O8KgIDxicj4NCiZn dDvCoCA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08d2JyPi0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLTx3YnI+LS0tLS0tLS0tLS0tLS0tLS0tPGJyPg0KJmd0O8KgIDvCoCBOb3cs IGZpbmQgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gZmlsZSB3ZSBhcmUgc3VwcG9zZWQgdG8gbG9h ZC48YnI+DQomZ3Q7wqAgPGJyPg0KJmd0OyAtO8KgIMKgIHhvcsKgIMKgIMKgYWgsIGFowqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgOyB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIgKHNldCBhYm92ZSEp PGJyPg0KJmd0OyArO8KgIMKgIHhvcsKgIMKgIMKgYWgsIGFowqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgOyB0ZXJtaW5hdGlvbiBjaGFyIChzZXQgYnkgY2hlY2tfZHBtaSk8YnI+DQomZ3Q7wqAg wqAgwqAgwqBjYWxswqAgwqAgc3RvcmVfZW52X3N0cmluZ8KgIMKgIMKgIMKgIDsgY29weSBpdCB0 byBsb2FkbmFtZSwgc2V0IGJ4PGJyPg0KJmd0O8KgIDxicj4NCiZndDvCoCDCoCDCoCDCoG1vdsKg IMKgIMKgW3N0dWJpbmZvX2Vudl9zaXplXSwgZGk8YnI+DQomZ3Q7IEBAIC03MDAsMzYgKzcxMSwy OSBAQCBwbV9kb3M6PGJyPg0KJmd0O8KgIMKgIMKgIMKgcmV0PGJyPg0KJmd0O8KgIDxicj4NCiZn dDvCoCA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08d2JyPi0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLTx3YnI+LS0tLS0tLS0tLS0tLS0tLS0tPGJyPg0KJmd0OyAtO8KgIGxvYWQg RFBNSSBzZXJ2ZXIgaWYgbm90IHByZXNlbnQ8YnI+DQomZ3Q7IC07wqAgwqBGaXJzdCBjaGVjayBk aXJlY3RvcnkgZnJvbSB3aGljaCBzdHViIGlzIGxvYWRlZCwgdGhlbiBwYXRoLCB0aGVuIGRlZmF1 bHQ8YnI+DQomZ3Q7IC07wqAgwqBPbiBlbnRyeSBkaSBwb2ludHMgdG8gaW1hZ2UgbmFtZTxicj4N CiZndDsgKzsgQ2hlY2sgZm9yIHByZXNlbmNlIG9mIGEgRFBNSSBob3N0LCBhbmQgc2F2ZSB0aGUg bW9kZSBzd2l0Y2ggYWRkcmVzcy48YnI+DQomZ3Q7ICs7IFplcm8gZmxhZyBpcyBjbGVhciBvbiBz dWNjZXNzLsKgIENsb2JiZXJzIGF4L2J4L2R4Ljxicj4NCiZndDvCoCA8YnI+DQomZ3Q7IC1wYXRo X29mZjo8YnI+DQomZ3Q7IC3CoCDCoCDCoC5kd8KgIMKgIMKgMMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgOyBJZiBzdGF5cyB6ZXJvLCBubyBwYXRoPGJyPg0KJmd0OyAtPGJyPg0K Jmd0OyAtbG9hZF9kcG1pOjxicj4NCiZndDsgLcKgIMKgIMKgeG9ywqAgwqAgwqBhaCwgYWjCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA7IENvcHkgdW50aWwgdGhpcyBjaGFyYWN0ZXIgKD0wKTxi cj4NCiZndDsgLcKgIMKgIMKgY2FsbMKgIMKgIHN0b3JlX2Vudl9zdHJpbmfCoCDCoCDCoCDCoCA7 IGNvcHkgc3R1YiBpbWFnZSB0byAmcXVvdDtsb2FkbmFtZSZxdW90Ozxicj4NCiZndDsgLcKgIMKg IMKgbW92wqAgwqAgwqBzaSwgYnjCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA7IHJlbW92ZSBu YW1lIHNvIHdlIGNhbiBhZGQgRFBNSSBuYW1lPGJyPg0KJmd0OyAtwqAgwqAgwqBtb3bCoCDCoCDC oGRpLCBbcGF0aF9vZmZdwqAgwqAgwqAgwqAgwqAgOyBQb2ludGVyIHRvIHBhdGggY29udGVudHMg KG5leHQgdHJ5KTxicj4NCiZndDsgLcKgIMKgIMKgam1wwqAgwqAgwqBAZjI8YnI+DQomZ3Q7IC1s b2FkbG9vcDo8YnI+DQomZ3Q7IC3CoCDCoCDCoG1vdsKgIMKgIMKgYWgsICYjMzk7OyYjMzk7wqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA7IENvcHkgdW50aWwgdGhpcyBjaGFyYWN0ZXI8YnI+DQom Z3Q7IC3CoCDCoCDCoGNhbGzCoCDCoCBzdG9yZV9lbnZfc3RyaW5nwqAgwqAgwqAgwqAgOyB0byAm cXVvdDtsb2FkbmFtZSZxdW90Ozxicj4NCiZndDsgLcKgIMKgIMKgb3LCoCDCoCDCoCBhbCxhbMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgOyBDaGVjayB0ZXJtaW5hdGluZyBjaGFyYWN0ZXI8 YnI+DQomZ3Q7IC3CoCDCoCDCoGpuZcKgIMKgIMKgQGYxwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqA7IElmICYjMzk7OyYjMzk7LCBjb250aW51ZTxicj4NCiZndDsgLcKgIMKgIMKgZGVj wqAgwqAgwqBkacKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDsgZWxzZSBwb2ludCBh dCBudWxsIGZvciBuZXh0IHBhc3MuPGJyPg0KJmd0OyAtQGYxOiA8YnI+DQomZ3Q7IC3CoCDCoCDC oGNtcMKgIMKgIMKgc2ksIGxvYWRuYW1lwqAgwqAgwqAgwqAgwqAgwqAgOyBhbnl0aGluZyB0aGVy ZT88YnI+DQomZ3Q7IC3CoCDCoCDCoGplwqAgwqAgwqAgZG9fZXhlY8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgOyBmaW5hbCB0cnkgKG5vIHBhdGgpIGxldCBpdCByZXR1cm48YnI+DQomZ3Q7IC3C oCDCoCDCoG1vdsKgIMKgIMKgYWwsIFtzaS0xXTxicj4NCiZndDsgLcKgIMKgIMKgY2FsbMKgIMKg IHRlc3RfZGVsaW3CoCDCoCDCoCDCoCDCoCDCoCDCoCA7IGlzIGZpbmFsIGNoYXJhY3RlciBhIHBh dGggZGVsaW1pdGVyPGJyPg0KJmd0OyAtwqAgwqAgwqBqZcKgIMKgIMKgIEBmMjxicj4NCiZndDsg LcKgIMKgIMKgbW92YsKgIMKgIFtzaV0sICYjMzk7XFwmIzM5O8KgIMKgIMKgIMKgIMKgIMKgIMKg IDsgbm8sIGFkZCBzZXBhcmF0b3IgYmV0d2VlbiBwYXRoICZhbXA7IG5hbWU8YnI+DQomZ3Q7IC3C oCDCoCDCoGluY8KgIMKgIMKgc2k8YnI+DQomZ3Q7IC1AZjI6PGJyPg0KJmd0OyAtwqAgwqAgwqBj YWxswqAgwqAgZG9fZXhlY8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgOyBjb3B5IG91ciBuYW1l IHRvIHN0cmluZyBhbmQgdHJ5IGxvYWQ8YnI+DQomZ3Q7IC3CoCDCoCDCoGpjwqAgwqAgwqAgbG9h ZGxvb3A8YnI+DQomZ3Q7ICtjaGVja19kcG1pOjxicj4NCiZndDsgK8KgIMKgIMKgcHVzaMKgIMKg IGVzPGJyPg0KJmd0OyArwqAgwqAgwqBwdXNowqAgwqAgY3g8YnI+DQomZ3Q7ICvCoCDCoCDCoHB1 c2jCoCDCoCBkaTxicj4NCiZndDsgK8KgIMKgIMKgcHVzaMKgIMKgIHNpPGJyPg0KJmd0OyArwqAg wqAgwqBtb3bCoCDCoCDCoGF4LCAweDE2ODfCoCDCoCDCoCDCoCDCoCDCoCDCoCA7IGdldCBEUE1J IGVudHJ5IHBvaW50PGJyPg0KJmd0OyArwqAgwqAgwqBpbnTCoCDCoCDCoDB4MmY8YnI+DQomZ3Q7 ICvCoCDCoCDCoG1vdsKgIMKgIMKgZHgsIGJ4PGJyPg0KJmd0OyArwqAgwqAgwqBvcsKgIMKgIMKg IGRsLCAxwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA7IGJ4IGJpdCAwOiAzMi1iaXQgY2Fw YWJsZTxicj4NCiZndDsgK8KgIMKgIMKgeG9ywqAgwqAgwqBieCwgZHg8YnI+DQomZ3Q7ICvCoCDC oCDCoG9ywqAgwqAgwqAgYXgsIGJ4wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgOyBEUE1JIHBy ZXNlbnQgaWYgYXggPSAwPGJyPg0KJmd0OyArwqAgwqAgwqBqbnrCoCDCoCDCoEBmMTxicj4NCiZn dDsgK8KgIMKgIMKgbW92wqAgwqAgwqBbbW9kZXN3XSwgZGnCoCDCoCDCoCDCoCDCoCDCoCA7IHN0 b3JlIHRoZSBEUE1JIGVudHJ5IHBvaW50PGJyPg0KJmd0OyArwqAgwqAgwqBtb3bCoCDCoCDCoFtt b2Rlc3crMl0sIGVzPGJyPg0KJmd0OyArwqAgwqAgwqBtb3bCoCDCoCDCoFttb2Rlc3dfbWVtXSwg c2k8YnI+DQomZ3Q7ICtAZjE6PGJyPg0KJmd0OyArwqAgwqAgwqBwb3DCoCDCoCDCoHNpPGJyPg0K Jmd0OyArwqAgwqAgwqBwb3DCoCDCoCDCoGRpPGJyPg0KJmd0OyArwqAgwqAgwqBwb3DCoCDCoCDC oGN4PGJyPg0KJmd0OyArwqAgwqAgwqBwb3DCoCDCoCDCoGVzPGJyPg0KJmd0O8KgIMKgIMKgIMKg cmV0PGJyPg0KJmd0O8KgIDxicj4NCiZndDvCoCA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS08d2JyPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTx3YnI+LS0tLS0tLS0tLS0tLS0t LS0tPGJyPg0KJmd0OyBAQCAtNzY2LDEzICs3NzAsNiBAQCBkb19leGVjOjxicj4NCiZndDvCoCDC oCDCoCDCoGludMKgIMKgIMKgMHgyMTxicj4NCiZndDvCoCDCoCDCoCDCoHBvcMKgIMKgIMKgZGk8 YnI+DQomZ3Q7wqAgwqAgwqAgwqBwb3DCoCDCoCDCoGVzPGJyPg0KJmd0OyAtwqAgwqAgwqBqY8Kg IMKgIMKgIEBmMcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgO2NhcnJ5IHNldCBpZiBl eGVjIGZhaWxlZDxicj4NCiZndDsgLTxicj4NCiZndDsgLcKgIMKgIMKgbW92wqAgwqAgwqBhaCwg MHg0ZMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDtnZXQgcmV0dXJuIGNvZGU8YnI+DQomZ3Q7IC3C oCDCoCDCoGludMKgIMKgIMKgMHgyMTxicj4NCiZndDsgLcKgIMKgIMKgc3ViwqAgwqAgwqBheCwg MHgzMDDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDthaD0zIFRTUiwgYWw9Y29kZSAoc3VjY2Vzcyk8 YnI+DQomZ3Q7IC3CoCDCoCDCoG5lZ8KgIMKgIMKgYXjCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCA7Q1ksIGlmIG5vdCBvcmlnaW5hbGx5IDB4MzAwPGJyPg0KJmd0OyAtQGYxOjxicj4N CiZndDvCoCDCoCDCoCDCoGptcMKgIMKgIMKgcmVzdG9yZV91bWLCoCDCoCDCoCDCoCDCoCDCoCDC oDtjYWxsZWQgZnVuYy4gcmV0dXJuIGZvciB1cy48YnI+DQomZ3Q7wqAgPGJyPg0KJmd0O8KgIDst LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTx3YnI+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tPHdicj4tLS0tLS0tLS0tLS0tLS0tLS08YnI+DQomZ3Q7IEBAIC03OTYsMTAgKzc5Myw5 IEBAIGluY2x1ZGVfdW1iOjxicj4NCiZndDvCoCBAZjE6PGJyPg0KJmd0O8KgIMKgIMKgIMKgcmV0 PGJyPg0KJmd0O8KgIDxicj4NCiZndDsgLTsgUmVzdG9yZSB1cHBlciBtZW1vcnkgc3RhdHVzLsKg IEFsbCByZWdpc3RlcnMgYW5kIGZsYWdzIHByZXNlcnZlZC48YnI+DQomZ3Q7ICs7IFJlc3RvcmUg dXBwZXIgbWVtb3J5IHN0YXR1cy7CoCBBbGwgcmVnaXN0ZXJzIHByZXNlcnZlZC48YnI+DQomZ3Q7 wqAgPGJyPg0KJmd0O8KgIHJlc3RvcmVfdW1iOjxicj4NCiZndDsgLcKgIMKgIMKgcHVzaGY8YnI+ DQomZ3Q7wqAgwqAgwqAgwqBjbXBiwqAgwqAgW2Rvc19tYWpvcl0sIDXCoCDCoCDCoCDCoCDCoCA7 IFdvbiYjMzk7dCB3b3JrIGJlZm9yZSBkb3MgNTxicj4NCiZndDvCoCDCoCDCoCDCoGpiwqAgwqAg wqAgQGYxPGJyPg0KJmd0O8KgIMKgIMKgIMKgcHVzaMKgIMKgIGF4PGJyPg0KJmd0OyBAQCAtODE1 LDcgKzgxMSw2IEBAIHJlc3RvcmVfdW1iOjxicj4NCiZndDvCoCDCoCDCoCDCoHBvcMKgIMKgIMKg Yng8YnI+DQomZ3Q7wqAgwqAgwqAgwqBwb3DCoCDCoCDCoGF4PGJyPg0KJmd0O8KgIEBmMTo8YnI+ DQomZ3Q7IC3CoCDCoCDCoHBvcGY8YnI+DQomZ3Q7wqAgwqAgwqAgwqByZXQ8YnI+DQomZ3Q7wqAg PGJyPg0KJmd0O8KgIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTx3YnI+LS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tPHdicj4tLS0tLS0tLS0tLS0tLS0tLS08YnI+DQomZ3Q7IEBA IC04NDAsNiArODM1LDggQEAgbXNnX25vX3NlbGVjdG9yczo8YnI+DQomZ3Q7wqAgwqAgwqAgwqAu ZGLCoCDCoCDCoCZxdW90O25vIERQTUkgc2VsZWN0b3JzJCZxdW90Ozxicj4NCiZndDvCoCBtc2df bm9fZHBtaV9tZW1vcnk6PGJyPg0KJmd0O8KgIMKgIMKgIMKgLmRiwqAgwqAgwqAmcXVvdDtubyBE UE1JIG1lbW9yeSQmcXVvdDs8YnI+DQomZ3Q7ICtwYXRoX29mZjo8YnI+DQomZ3Q7ICvCoCDCoCDC oC5kd8KgIMKgIMKgMMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgOyBQb2ludHMg dG8gUEFUSCwgc3RheXMgemVybyBpZiBub25lLjxicj4NCiZndDvCoCA8YnI+DQomZ3Q7wqAgOy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPHdicj4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS08d2JyPi0tLS0tLS0tLS0tLS0tLS0tLTxicj4NCiZndDvCoCA7wqAgVW5zdG9yZWQgRGF0 YSwgYXZhaWxhYmxlIGR1cmluZyBhbmQgYWZ0ZXIgbW9kZSBzd2l0Y2g8YnI+DQomZ3Q7IDxicj4N Cjxicj4NCjwvYmxvY2txdW90ZT48L2Rpdj4NCg== --0000000000009d663005f30afc82--