From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.ispras.ru (mail.ispras.ru [83.149.199.45]) by mx.groups.io with SMTP id smtpd.web12.618.1584717229411985501 for ; Fri, 20 Mar 2020 08:13:50 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: ispras.ru, ip: 83.149.199.45, mailfrom: cheptsov@ispras.ru) Received: from [127.0.0.1] (unknown [77.232.9.83]) by mail.ispras.ru (Postfix) with ESMTPSA id 3764F64F; Fri, 20 Mar 2020 18:13:47 +0300 (MSK) From: "Vitaly Cheptsov" Mime-Version: 1.0 (Mac OS X Mail 13.0 \(3608.60.0.2.5\)) Subject: CLANGPDB binary debugging Message-Id: <9804C565-0C9E-4778-92A7-06EA6AD8D694@ispras.ru> Date: Fri, 20 Mar 2020 18:13:45 +0300 Cc: =?utf-8?Q?Marvin_H=C3=A4user?= To: "Gao, Liming" , devel@edk2.groups.io X-Mailer: Apple Mail (2.3608.60.0.2.5) X-Groupsio-MsgNum: 56054 Content-Type: multipart/signed; boundary="Apple-Mail=_0FE59AAF-9363-48BC-BBED-16475FB1170F"; protocol="application/pgp-signature"; micalg=pgp-sha512 --Apple-Mail=_0FE59AAF-9363-48BC-BBED-16475FB1170F Content-Type: multipart/alternative; boundary="Apple-Mail=_A520FC68-3918-4055-ADA3-C8994D5B1CF3" --Apple-Mail=_A520FC68-3918-4055-ADA3-C8994D5B1CF3 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Hello, We noticed that the original bugzilla, which intended to add new LLVM = toolchain support[1], also wanted to bring ELF format support with DWARF = debugging information. For some reason this did not make its way into = EDK II, and we are currently wondering, how can one debug binaries built = with LLVM 9.0. For macOS and XCODE5 toolchain we use GDB scripts based on Andrei = Warkentin=E2=80=99s work, which allow us to integrate with QEMU and = VMware[2]. It is likely that they should work with little to no work on = Linux with CLANG38/GCC5 with GDB once again. However, CLANGPDB = apparently is using PDB debugging information, which I believe is not = handled with GDB. Could you please provide the details on the matter and let us know about = the recommended route? =E2=80=94 Is dropping CLANGELF just a temporary measure and it should be = resubmitted again? =E2=80=94 Should LLDB, which seems to be aware of PDB, be used instead = of GDB, when building with CLANGPDB? If so, did anybody try that? Thanks! Best regards, Vitaly [1] https://bugzilla.tianocore.org/show_bug.cgi?id=3D1603 [2] = https://github.com/acidanthera/OpenCorePkg/blob/master/Debug/Scripts/gdb_u= efi.py --Apple-Mail=_A520FC68-3918-4055-ADA3-C8994D5B1CF3 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8 Hello,

We = noticed that the original bugzilla, which intended to add new LLVM = toolchain support[1], also wanted to bring ELF format support with DWARF = debugging information. For some reason this did not make its = way into EDK II, and we are currently wondering, how can one debug = binaries built with LLVM 9.0.

For macOS and XCODE5 = toolchain we use GDB scripts based on Andrei Warkentin=E2=80=99s work, which allow us to integrate = with QEMU and VMware[2]. It is likely that they should work with little = to no work on Linux with CLANG38/GCC5 with GDB once again. However, = CLANGPDB apparently is using PDB debugging information, which I believe = is not handled with GDB.

Could you please provide the details on = the matter and let us know about the recommended route?
=E2=80=94 Is dropping CLANGELF just a temporary measure and = it should be resubmitted again?
=E2=80=94 Should LLDB, which seems to be aware of PDB, be used instead = of GDB, when building with CLANGPDB? If so, did anybody try = that?

Thanks!

Best = regards,
Vitaly

=

= --Apple-Mail=_A520FC68-3918-4055-ADA3-C8994D5B1CF3-- --Apple-Mail=_0FE59AAF-9363-48BC-BBED-16475FB1170F Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=signature.asc Content-Type: application/pgp-signature; name=signature.asc Content-Description: Message signed with OpenPGP -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEsLABAI5Y5VbvBdmpL8K2O86Eyz4FAl503aoACgkQL8K2O86E yz7idA//REuz6preb9j3XP2fLRsEKkHlTjrGcJoSwKnlXNRLNA+eMCN/DTgih0RG LLKHhoIYDs7qMkmFLJX0CNb253ujViH0vB5oLsVLNA6HZ4ZbfVggza7gNXo1vMgw uJi8ELBEd9WGTjbLQoekvcCxjRBgWUhc4KYDcUeEU6x94z1cYAICcBZI5VzSAmCG PknEdw73lBM/lgv1huMPNes+OjrahS3txOFHMfgEnE7wq1fw1nx5BLaKCM0a9bFi YKNLh2ZsM7YPdgfMorhxs/A+v7YEwgrZOsAaB+Jk4pxRr3Jgn/TIPgf6OuKVfT8t rmTeADDrlyMI8cDzoOtig9z8OrqOQW1EteykLdGCAW06SCETNjJG9y/BhtQXbBSr QuqcRex6KW0nIzyeUIxXevVKjcRLEIgOx9zKBF9PCukn/7LMe5psH45UIbl73/LN gFkdvLgVcR1zkGOasGGXQy0N3K4zpKTmYkdnvbe1WCWuKTP0Aft+7f3Epcnyl6Uc p1cAb5hZCH+LgyffQUDJ5kttS2uWvaeMS34UaS9/5y9AJLhvsPci52Z3uxFwrnGa +29CmHN9akD1g2U0UhlUCVBfJDKVf7F9XOMa2RETbuzCG4ac4oM+1bIaltAcOmSs 1NqbNBc2/VSAnwQl3TkXMoQv5omjhxr2xShM4j32DbZnOQ3msio= =PbE2 -----END PGP SIGNATURE----- --Apple-Mail=_0FE59AAF-9363-48BC-BBED-16475FB1170F-- From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from ma1-aaemail-dr-lapp02.apple.com (ma1-aaemail-dr-lapp02.apple.com [17.171.2.68]) by mx.groups.io with SMTP id smtpd.web10.8178.1584731660610690098 for ; Fri, 20 Mar 2020 12:14:21 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@apple.com header.s=20180706 header.b=NE/yKMq9; spf=pass (domain: apple.com, ip: 17.171.2.68, mailfrom: afish@apple.com) Received: from pps.filterd (ma1-aaemail-dr-lapp02.apple.com [127.0.0.1]) by ma1-aaemail-dr-lapp02.apple.com (8.16.0.27/8.16.0.27) with SMTP id 02KIvnVJ021111; Fri, 20 Mar 2020 12:14:19 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=apple.com; h=sender : from : message-id : content-type : mime-version : subject : date : in-reply-to : cc : to : references; s=20180706; bh=6tDSaoquj9vl0boeXSS6vVFZuz5veIXhSWUaYg6WNA8=; b=NE/yKMq9p/UEfBFU3recGCpq4Wt+ujZq336LY3YFdWn/jDWKjHsq0CnWlzoOEcBOOFqq ZpfkSzGN+Pghcs555gl3+zk0onbw3E0zBx+Mlv9cbGAlKOPOmrh7cYZQs2p+2x0XUSJU pJjnqS9nAUUQjkv24KJb1wF3onTtcKZax1Xr+8/G2jx7y8SMPc5RVfQEkgWCJ0u3XrdM 5h/MvydVMIXbhhxx72rIymgZItCuaeqOCzk3pxpOZAc1gsnbZgd8mh9NHggQ+YaqLe1g VPcjcjbqLDWkRcpIt5sHKsbnUW7zoW5PIbD2UWv6KR8++qTOAlhvIZ2VrP2by7fGTySt dA== Received: from rn-mailsvcp-mta-lapp02.rno.apple.com (rn-mailsvcp-mta-lapp02.rno.apple.com [10.225.203.150]) by ma1-aaemail-dr-lapp02.apple.com with ESMTP id 2yruxvfc77-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO); Fri, 20 Mar 2020 12:14:19 -0700 Received: from nwk-mmpp-sz11.apple.com (nwk-mmpp-sz11.apple.com [17.128.115.155]) by rn-mailsvcp-mta-lapp02.rno.apple.com (Oracle Communications Messaging Server 8.1.0.5.20200312 64bit (built Mar 12 2020)) with ESMTPS id <0Q7I0027BARUDWA0@rn-mailsvcp-mta-lapp02.rno.apple.com>; Fri, 20 Mar 2020 12:14:18 -0700 (PDT) Received: from process_milters-daemon.nwk-mmpp-sz11.apple.com by nwk-mmpp-sz11.apple.com (Oracle Communications Messaging Server 8.0.2.4.20190507 64bit (built May 7 2019)) id <0Q7I00800ABB9B00@nwk-mmpp-sz11.apple.com>; Fri, 20 Mar 2020 12:14:18 -0700 (PDT) X-Va-A: X-Va-T-CD: 2c323b19c9bf43c24bf8f3f2bb9cbf14 X-Va-E-CD: 36a32cfa42a5ae8aa02473601c03cec7 X-Va-R-CD: d2d46cdd9ed31419d4eb89636f43916d X-Va-CD: 0 X-Va-ID: 8a97c825-aed0-413a-8463-792c529cf84c X-V-A: X-V-T-CD: 2c323b19c9bf43c24bf8f3f2bb9cbf14 X-V-E-CD: 36a32cfa42a5ae8aa02473601c03cec7 X-V-R-CD: d2d46cdd9ed31419d4eb89636f43916d X-V-CD: 0 X-V-ID: ca7578af-d900-4fd9-ac11-fbdc6157acfa X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138,18.0.645 definitions=2020-03-20_06:2020-03-20,2020-03-20 signatures=0 Received: from [17.235.37.239] by nwk-mmpp-sz11.apple.com (Oracle Communications Messaging Server 8.0.2.4.20190507 64bit (built May 7 2019)) with ESMTPSA id <0Q7I00CBKARR4R40@nwk-mmpp-sz11.apple.com>; Fri, 20 Mar 2020 12:14:17 -0700 (PDT) Sender: afish@apple.com From: "Andrew Fish" Message-id: <7E18AD8F-9A44-45FE-A8C8-CE06A6328930@apple.com> MIME-version: 1.0 (Mac OS X Mail 13.0 \(3594.4.17\)) Subject: Re: [edk2-devel] CLANGPDB binary debugging Date: Fri, 20 Mar 2020 12:14:15 -0700 In-reply-to: <9804C565-0C9E-4778-92A7-06EA6AD8D694@ispras.ru> Cc: "Gao, Liming" , =?utf-8?Q?Marvin_H=C3=A4user?= To: devel@edk2.groups.io, cheptsov@ispras.ru References: <9804C565-0C9E-4778-92A7-06EA6AD8D694@ispras.ru> X-Mailer: Apple Mail (2.3594.4.17) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138,18.0.645 definitions=2020-03-20_06:2020-03-20,2020-03-20 signatures=0 Content-type: multipart/alternative; boundary="Apple-Mail=_CD2505D4-E36D-40C1-865A-3071072FD8FC" --Apple-Mail=_CD2505D4-E36D-40C1-865A-3071072FD8FC Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 > On Mar 20, 2020, at 8:13 AM, Vitaly Cheptsov wrote: >=20 > Hello, >=20 > We noticed that the original bugzilla, which intended to add new LLVM to= olchain support[1], also wanted to bring ELF format support with DWARF debu= gging information. For some reason this did not make its way into EDK II, a= nd we are currently wondering, how can one debug binaries built with LLVM 9= .0. >=20 > For macOS and XCODE5 toolchain we use GDB scripts based on Andrei Warken= tin=E2=80=99s work, which allow us to integrate with QEMU and VMware[2]. It= is likely that they should work with little to no work on Linux with CLANG= 38/GCC5 with GDB once again. However, CLANGPDB apparently is using PDB debu= gging information, which I believe is not handled with GDB. >=20 > Could you please provide the details on the matter and let us know about= the recommended route? > =E2=80=94 Is dropping CLANGELF just a temporary measure and it should be= resubmitted again? > =E2=80=94 Should LLDB, which seems to be aware of PDB, be used instead o= f GDB, when building with CLANGPDB? If so, did anybody try that? >=20 Vitaly, I've not tried the CLANGPDB path, but if you want to connect lldb to QEMU = you need to set plugin.process.gdb-remote.target-definition-file [1] to [2= ].=20 [1] lldb -o "settings set plugin.process.gdb-remote.target-definition-fil= e x86_64_target_definition.py" -o "gdb-remote 9000" [2] https://github.com/llvm-mirror/lldb/blob/master/examples/python/x86_64= _target_definition.py Thanks, Andrew Fish > Thanks! >=20 > Best regards, > Vitaly >=20 > [1] https://bugzilla.tianocore.org/show_bug.cgi?id=3D1603 > [2] https://github.com/acidanthera/OpenCorePkg/blob/master/Debug/Scripts= /gdb_uefi.py >=20 >=20 --Apple-Mail=_CD2505D4-E36D-40C1-865A-3071072FD8FC Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8

On Mar 20, 2= 020, at 8:13 AM, Vitaly Cheptsov <cheptsov@ispras.ru> wrote:

Hell= o,

We noticed that the = original bugzilla, which intended to add new LLVM toolchain support[1], als= o wanted to bring ELF format support with DWARF debugging information. = ;For some reason this= did not make its way into EDK II, and we are currently wondering, how can = one debug binaries built with LLVM 9.0.

=
For m= acOS and XCODE5 toolchain we use GDB scripts based on Andrei Warkentin=E2=80=99s work, which allow us to integrate with Q= EMU and VMware[2]. It is likely that they should work with little to no wor= k on Linux with CLANG38/GCC5 with GDB once again. However, CLANGPDB apparen= tly is using PDB debugging information, which I believe is not handled with= GDB.

Coul= d you please provide the details on the matter and let us know about the re= commended route?
=E2=80=94 Is dropping CLANGELF just a= temporary measure and it should be resubmitted again?
=E2=80=94 Shoul= d LLDB, which seems to be aware of PDB, be used instead of GDB, when buildi= ng with CLANGPDB? If so, did anybody try that?
=

Vitaly,

I've not tried the CLANGPDB path, but if yo= u want to connect lldb to QEMU you need to set  plugin.process.gdb-rem= ote.target-definition-file [1] to [2]. 

[1]  lldb -o "settings set plugin.process.gdb-remote.target= -definition-file x86_64_target_definition.py" -o "gdb-remote 9000"
[2] https://github.com/llvm-mirro= r/lldb/blob/master/examples/python/x86_64_target_definition.py

Thanks,

And= rew Fish

Thanks!

Best regards,
Vitaly<= /font>

[1] <= a href=3D"https://bugzilla.tianocore.org/show_bug.cgi?id=3D1603" class=3D""= >https://bugzilla.tianocore.org/show_bug.cgi?id=3D1603


--Apple-Mail=_CD2505D4-E36D-40C1-865A-3071072FD8FC-- From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.ispras.ru (mail.ispras.ru [83.149.199.45]) by mx.groups.io with SMTP id smtpd.web10.5268.1584786541672772038 for ; Sat, 21 Mar 2020 03:29:02 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: ispras.ru, ip: 83.149.199.45, mailfrom: cheptsov@ispras.ru) Received: from [127.0.0.1] (unknown [77.232.9.83]) by mail.ispras.ru (Postfix) with ESMTPSA id 724C9650; Sat, 21 Mar 2020 13:28:59 +0300 (MSK) From: "Vitaly Cheptsov" Message-Id: Mime-Version: 1.0 (Mac OS X Mail 13.0 \(3608.60.0.2.5\)) Subject: Re: [edk2-devel] CLANGPDB binary debugging Date: Sat, 21 Mar 2020 13:28:57 +0300 In-Reply-To: <7E18AD8F-9A44-45FE-A8C8-CE06A6328930@apple.com> Cc: devel@edk2.groups.io, "Gao, Liming" , =?utf-8?Q?Marvin_H=C3=A4user?= To: Andrew Fish References: <9804C565-0C9E-4778-92A7-06EA6AD8D694@ispras.ru> <7E18AD8F-9A44-45FE-A8C8-CE06A6328930@apple.com> X-Mailer: Apple Mail (2.3608.60.0.2.5) X-Groupsio-MsgNum: 56065 Content-Type: multipart/signed; boundary="Apple-Mail=_5AF7E233-F6CF-47F6-B06D-7DE6A308E026"; protocol="application/pgp-signature"; micalg=pgp-sha512 --Apple-Mail=_5AF7E233-F6CF-47F6-B06D-7DE6A308E026 Content-Type: multipart/alternative; boundary="Apple-Mail=_F6945D30-1C87-4A7C-9B20-D6B37465B29B" --Apple-Mail=_F6945D30-1C87-4A7C-9B20-D6B37465B29B Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Hello, Andrey, thanks for the hint, it was very helpful. I rewrote the GDB script= s to work with LLDB[1] and was able to debug OVMF built with CLANGPDB. Whil= e it is still quite dirty, at the very least it works. Unfortunately the experience was close to terrible. I may certainly do som= ething wrong, but it is clear that PDB and LLDB do not support each other w= ell enough. After spending several hours on playing with the tools my concl= usion is that LLDB is simply not suited for UEFI PDB debugging, and we real= ly want DWARF as there is no other opensource debugger that supports PDB o= n macOS and Linux In case somebody knows workarounds here are the issues I faced: 1. All integer alias typedefs are discarded in favour of underlying types.= This way EFI_STATUS and EFI_TPL become unsigned long long, CHAR8 becomes c= har, and CHAR16 becomes unsigned short. It does not look like LLDB has the = original types anywhere at all, and it also does not have them registered. frame #0: 0x000000007fe242aa DxeCore.dll`CoreAllocatePoolPagesI(PoolTy= pe=3DEfiBootServicesData, NoPages=3D1, Granularity=3D4096, NeedGuard=3D'\0'= ) at Pool.c:322 319 =09 return NULL; 320 =09 } 321 -> 322 =09 Buffer =3D CoreAllocatePoolPages (PoolType, NoPages, Granulari= ty, NeedGuard); 323 =09 CoreReleaseMemoryLock (); 324 325 =09 if (Buffer !=3D NULL) { (lldb) p Status (unsigned long long) $3 =3D 0 Structures work more or less fine, but for simpler types like strings we a= re out of even potential pretty-printing. 2. Global variables are not accessible. I am not sure what happens, but th= ey either seem to not relocate or conflict with the other names: (lldb) p gST error: Couldn't materialize: couldn't get the value of variable ::gST: rea= d memory from 0x6e18 failed error: errored out in DoExecute, couldn't PrepareToExecuteJITExpression (lldb) p &gST error: Couldn't materialize: couldn't get the value of variable ::gST: rea= d memory from 0x6e18 failed error: errored out in DoExecute, couldn't PrepareToExecuteJITExpression 3. Quite a number of crashes. In most cases autocompletion by tab press causes a crash. E.g. b I So will do printing of a GUID, e.g. p gEfiGlobalVariableGuid. This may have to do with Python compatibility as Xcode 11 LLDB that uses P= ython 3 generally crashes more often than MacPorts LLDB 9.0. Surprisingly s= tructures work more or less fine. 4. Ctrl+C does not produce a valid backtrace. When I break with a breakpoi= nt, I see a proper stacktrace with more than one entry, with function proto= types and values. When I break with Ctrl+C I only see some weird backtrace = with most of the entries missing regardless of frame position: (lldb) bt * thread #1, stop reason =3D signal SIGTRAP * frame #0: 0x000000007fe4c5f3 DxeCore.dll Probably more and all the unintuitive stuff like the lack of more function= al TUI, but it is hard to remember all the trials. [1] https://github.com/acidanthera/OpenCorePkg/blob/master/Debug/Scripts/l= ldb_uefi.py Best wishes, Vitaly > 20 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0=B2 22:14, Andrew Fis= h =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB(=D0=B0): >=20 >=20 >=20 >> On Mar 20, 2020, at 8:13 AM, Vitaly Cheptsov > wrote: >>=20 >> Hello, >>=20 >> We noticed that the original bugzilla, which intended to add new LLVM t= oolchain support[1], also wanted to bring ELF format support with DWARF deb= ugging information. For some reason this did not make its way into EDK II, = and we are currently wondering, how can one debug binaries built with LLVM = 9.0. >>=20 >> For macOS and XCODE5 toolchain we use GDB scripts based on Andrei Warke= ntin=E2=80=99s work, which allow us to integrate with QEMU and VMware[2]. I= t is likely that they should work with little to no work on Linux with CLAN= G38/GCC5 with GDB once again. However, CLANGPDB apparently is using PDB deb= ugging information, which I believe is not handled with GDB. >>=20 >> Could you please provide the details on the matter and let us know abou= t the recommended route? >> =E2=80=94 Is dropping CLANGELF just a temporary measure and it should b= e resubmitted again? >> =E2=80=94 Should LLDB, which seems to be aware of PDB, be used instead = of GDB, when building with CLANGPDB? If so, did anybody try that? >>=20 >=20 > Vitaly, >=20 > I've not tried the CLANGPDB path, but if you want to connect lldb to QEM= U you need to set plugin.process.gdb-remote.target-definition-file [1] to = [2]. >=20 > [1] lldb -o "settings set plugin.process.gdb-remote.target-definition-f= ile x86_64_target_definition.py" -o "gdb-remote 9000" > [2] https://github.com/llvm-mirror/lldb/blob/master/examples/python/x86_= 64_target_definition.py >=20 > Thanks, >=20 > Andrew Fish >=20 >> Thanks! >>=20 >> Best regards, >> Vitaly >>=20 >> [1] https://bugzilla.tianocore.org/show_bug.cgi?id=3D1603 >> [2] https://github.com/acidanthera/OpenCorePkg/blob/master/Debug/Script= s/gdb_uefi.py >>=20 >>=20 --Apple-Mail=_F6945D30-1C87-4A7C-9B20-D6B37465B29B Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8 Hello,
Andrey, thanks for the hint, it was very = helpful. I rewrote the GDB scripts to work with LLDB[1] and was able to deb= ug OVMF built with CLANGPDB. While it is still quite dirty, at the very lea= st it works.

Unfo= rtunately the experience was close to terrible. I may certainly do somethin= g wrong, but it is clear that PDB and LLDB do not support each other well e= nough. After spending several hours on playing with the tools my conclusion= is that LLDB is simply not suited for UEFI PDB debugging, and we really wa= nt DWARF  as there is no other opensource debugger that supports PDB o= n macOS and Linux

In case somebody knows workarounds here are the issues I faced:

1. All integer alias typede= fs are discarded in favour of underlying types. This way EFI_STATUS and EFI= _TPL become unsigned long long, CHAR8 becomes char, and CHAR16 becomes unsi= gned short. It does not look like LLDB has the original types anywhere at a= ll, and it also does not have them registered.

    frame #0: 0x000000007= fe242aa DxeCore.dll`CoreAllocatePoolPagesI(PoolType=3DEfiBootServicesD= ata, NoPages=3D1, Granularity=3D4096, NeedGuard=3D'\0') at Pool.c:322<= br class=3D"">   319      return NULL;
   320    }
   321 
->= 322  =   Buffer =3D CoreAllocatePoolPages (PoolType, NoPages, Granularit= y, NeedGuard);
   323    CoreReleaseMemoryLock = ();
   324 
   325    if&nbs= p;(Buffer !=3D NULL) {
(lldb) p Status
(un= signed long long) $3 =3D 0

Structures work more or less fine, but for simpler types like str= ings we are out of even potential pretty-printing.

2. Global variables are not acc= essible. I am not sure what happens, but they either seem to not relocate o= r conflict with the other names:

=
(lldb) p gST
error: Couldn't materialize= : couldn't get the value of variable ::gST: read memory from 0x6e18 failed<= br class=3D"">error: errored out in DoExecute, couldn't PrepareToExecuteJIT= Expression
(lldb) p &gST
error: Couldn= 't materialize: couldn't get the value of variable ::gST: read memory from = 0x6e18 failed
error: errored out in DoExecute, couldn't Prepa= reToExecuteJITExpression

3. Quite a number of crashes.

<= /div>
In most cases autocompletion by tab press causes a cra= sh. E.g.

b I<T= AB>

So will do= printing of a GUID, e.g. p gEfiGlobalVariableGuid.

This may have to do with Python compatibility as Xcode 11 LLDB that = uses Python 3 generally crashes more often than MacPorts LLDB 9.0. Sur= prisingly structures work more or less fine.

4. Ctrl+C does not produce a valid = backtrace. When I break with a breakpoint, I see a proper stacktrace with m= ore than one entry, with function prototypes and values. When I break with = Ctrl+C I only see some weird backtrace with most of the entries missing reg= ardless of frame position:

(lldb) bt* thread #1, stop reason =3D signal SIGTRAP
=   * frame #0: 0x000000007fe4c5f3 DxeCore.dll

<= /font>
Probab= ly more and all the unintuitive stuff like the lack of more functional TUI,= but it is hard to remember all the trials.

Best wis= hes,
Vitaly

<= blockquote type=3D"cite" class=3D"">
20 =D0=BC=D0=B0=D1=80= =D1=82=D0=B0 2020 =D0=B3., =D0=B2 22:14, Andrew Fish <afish@apple.com> =D0=BD=D0=B0=D0=BF=D0= =B8=D1=81=D0=B0=D0=BB(=D0=B0):



On Mar 20, 2020, = at 8:13 AM, Vitaly Cheptsov <cheptsov@ispras.ru> wrote:

Hello,

We noticed that the original bu= gzilla, which intended to add new LLVM toolchain support[1], also wanted to= bring ELF format support with DWARF debugging information. For some reason this did not ma= ke its way into EDK II, and we are currently wondering, how can one debug b= inaries built with LLVM 9.0.

For macOS and = XCODE5 toolchain we use GDB scripts based on A= ndrei Warkentin=E2=80=99s work, which allow us to integrate with QEMU and V= Mware[2]. It is likely that they should work with little to no work on Linu= x with CLANG38/GCC5 with GDB once again. However, CLANGPDB apparently is us= ing PDB debugging information, which I believe is not handled with GDB.

Could you ple= ase provide the details on the matter and let us know about the recommended= route?
=E2=80=94 Is dropping CLANGELF just a temporar= y measure and it should be resubmitted again?
=E2=80= =94 Should LLDB= , which seems to be aware of PDB, be used instead of GDB, when building wit= h CLANGPDB? If so, did anybody try that?


Vitaly,

I've not tried the CLANGPDB path, but if you want to conne= ct lldb to QEMU you need to set  plugin.process.gdb-remote.target-defi= nition-file [1] to [2]. 
=
[1]  = ;lldb -o "settings set plugin.process.gdb-remote.target-definition-file x86= _64_target_definition.py" -o "gdb-remote 9000"

Thanks,

Andrew Fish


--Apple-Mail=_F6945D30-1C87-4A7C-9B20-D6B37465B29B-- --Apple-Mail=_5AF7E233-F6CF-47F6-B06D-7DE6A308E026 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=signature.asc Content-Type: application/pgp-signature; name=signature.asc Content-Description: Message signed with OpenPGP -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEsLABAI5Y5VbvBdmpL8K2O86Eyz4FAl517GkACgkQL8K2O86E yz7fWhAAwTpjTEQ3YbDGCuZp4u8nY7IzOQa7XxFU+QgcIr3EhjDQ6LfvYemEOqwH FB12YldCNGk1OPp8xbomcsrtKkY8YzVDLShLxBVOVaus+amMbuW3I3VBd52vQ69q RvVY0+8SxaAaosYDBS5dx5erOlAHOfrMDBiSWjAbFZOYAi1hesGVdl7Dkz86YJrK 0vBbdmOxXKobjFWTIy7bDPlH6m7KomJq9GzYjIbfrPS5c6VXOanYm3Zl8ELgOUAO EebAzTwSx+yGqIfhxD2nLX3NchS8ICQdccfLRH95bl9f+nSrUoQ4x9i40v37ulNz zKySZP+NvmfcAim0PGBnolRUV7OdXchnNl2HCFQRSRKVunT4CejwKU9vb7eACh3z 1iRkcwpKZpuXnpjnaVtJ6Z93lQnRCqWf9IF8O9e0/OvDf3Mkv7z+5YlUI9A1sPWH 1HUQ0R0uOV99lp8iecxl/6hFxKXSmWU0TN0MrtTXPGy+WiOu3wmzyL77JqktzorT R826Y8OwiR5zT02hGTuhmqMmjLTjEbBors6YbyAdJZTtbE/IHOYIGVdPEJXZqGLI MExlPZaDnnvAhRXFzQZAEfRKuJfZnrBEKKpcA8Dfq3d699vj+Xptixud/fTOEtfV 5HdJFMQ7dnwa0f6cEKWOvWcYhPqVwgvbbXgP4Aa0t66wue6DFBo= =GP2/ -----END PGP SIGNATURE----- --Apple-Mail=_5AF7E233-F6CF-47F6-B06D-7DE6A308E026-- From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from nwk-aaemail-lapp02.apple.com (nwk-aaemail-lapp02.apple.com [17.151.62.67]) by mx.groups.io with SMTP id smtpd.web12.12550.1584810790768812476 for ; Sat, 21 Mar 2020 10:13:11 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@apple.com header.s=20180706 header.b=EUBAC/CX; spf=pass (domain: apple.com, ip: 17.151.62.67, mailfrom: afish@apple.com) Received: from pps.filterd (nwk-aaemail-lapp02.apple.com [127.0.0.1]) by nwk-aaemail-lapp02.apple.com (8.16.0.27/8.16.0.27) with SMTP id 02LHCJjo056543; Sat, 21 Mar 2020 10:13:09 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=apple.com; h=sender : from : message-id : content-type : mime-version : subject : date : in-reply-to : cc : to : references; s=20180706; bh=iVo1147xXr8STwig1Vm8T4XpF05QColYlmZp32bXAJQ=; b=EUBAC/CXfZMhp/C5IhNfKxhJVo85gYdU4O+Sb7Oiz8CJsVNjpSB2iEao2JcdjqTQEvGV GSPtLoQFNYpsZYusce3vnL2cbSI5VaKtAcXaE6M4UmOD3fqANmmFjwlsToA0U4PSbo7F YLuFzHnJMa/MlzcfkcvNHdGQ7aehdCgGvn+geZIY4Rqqik8NQkRsCEp9exfl3a5eptp7 jmO1R8yx9W+CFi2PbkPM2ogxsHLZXuA/7JTv5to6dx0XWIKYdPya/dni1uoLswk2h0Cb yGsOP2kQ6rfUv15IdiHBr/YcOD4zgplTZjohtPtnh3ykwxgYihmmCLD3WDJjNlIPqCth PA== Received: from rn-mailsvcp-mta-lapp01.rno.apple.com (rn-mailsvcp-mta-lapp01.rno.apple.com [10.225.203.149]) by nwk-aaemail-lapp02.apple.com with ESMTP id 2ywfgfencu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO); Sat, 21 Mar 2020 10:13:09 -0700 Received: from nwk-mmpp-sz11.apple.com (nwk-mmpp-sz11.apple.com [17.128.115.155]) by rn-mailsvcp-mta-lapp01.rno.apple.com (Oracle Communications Messaging Server 8.1.0.5.20200312 64bit (built Mar 12 2020)) with ESMTPS id <0Q7J00B7VZTXY190@rn-mailsvcp-mta-lapp01.rno.apple.com>; Sat, 21 Mar 2020 10:13:09 -0700 (PDT) Received: from process_milters-daemon.nwk-mmpp-sz11.apple.com by nwk-mmpp-sz11.apple.com (Oracle Communications Messaging Server 8.0.2.4.20190507 64bit (built May 7 2019)) id <0Q7J00D00XRFQY00@nwk-mmpp-sz11.apple.com>; Sat, 21 Mar 2020 10:13:09 -0700 (PDT) X-Va-A: X-Va-T-CD: 2c323b19c9bf43c24bf8f3f2bb9cbf14 X-Va-E-CD: 36a32cfa42a5ae8aa02473601c03cec7 X-Va-R-CD: d2d46cdd9ed31419d4eb89636f43916d X-Va-CD: 0 X-Va-ID: cdd848ee-97ed-4ba1-8f40-4c58a763f2ee X-V-A: X-V-T-CD: 2c323b19c9bf43c24bf8f3f2bb9cbf14 X-V-E-CD: 36a32cfa42a5ae8aa02473601c03cec7 X-V-R-CD: d2d46cdd9ed31419d4eb89636f43916d X-V-CD: 0 X-V-ID: 30ef8a6c-7612-4e3d-86d8-58e2899ec8b7 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138,18.0.645 definitions=2020-03-21_07:2020-03-20,2020-03-21 signatures=0 Received: from [17.235.38.16] by nwk-mmpp-sz11.apple.com (Oracle Communications Messaging Server 8.0.2.4.20190507 64bit (built May 7 2019)) with ESMTPSA id <0Q7J0001VZTUN200@nwk-mmpp-sz11.apple.com>; Sat, 21 Mar 2020 10:13:07 -0700 (PDT) Sender: afish@apple.com From: "Andrew Fish" Message-id: <63396616-D8CF-4135-B967-772C1E6136BD@apple.com> MIME-version: 1.0 (Mac OS X Mail 13.0 \(3594.4.17\)) Subject: Re: [edk2-devel] CLANGPDB binary debugging Date: Sat, 21 Mar 2020 10:13:05 -0700 In-reply-to: Cc: "Gao, Liming" , =?utf-8?Q?Marvin_H=C3=A4user?= To: devel@edk2.groups.io, cheptsov@ispras.ru References: <9804C565-0C9E-4778-92A7-06EA6AD8D694@ispras.ru> <7E18AD8F-9A44-45FE-A8C8-CE06A6328930@apple.com> X-Mailer: Apple Mail (2.3594.4.17) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138,18.0.645 definitions=2020-03-21_07:2020-03-20,2020-03-21 signatures=0 Content-type: multipart/alternative; boundary="Apple-Mail=_6517C3C0-C420-4505-8017-42A6662F6C15" --Apple-Mail=_6517C3C0-C420-4505-8017-42A6662F6C15 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 > On Mar 21, 2020, at 3:28 AM, Vitaly Cheptsov wrote: >=20 > Hello, >=20 > Andrey, thanks for the hint, it was very helpful. I rewrote the GDB scri= pts to work with LLDB[1] and was able to debug OVMF built with CLANGPDB. Wh= ile it is still quite dirty, at the very least it works. >=20 > Unfortunately the experience was close to terrible. I may certainly do s= omething wrong, but it is clear that PDB and LLDB do not support each other= well enough. After spending several hours on playing with the tools my con= clusion is that LLDB is simply not suited for UEFI PDB debugging, and we re= ally want DWARF as there is no other opensource debugger that supports PDB= on macOS and Linux >=20 > In case somebody knows workarounds here are the issues I faced: >=20 > 1. All integer alias typedefs are discarded in favour of underlying type= s. This way EFI_STATUS and EFI_TPL become unsigned long long, CHAR8 becomes= char, and CHAR16 becomes unsigned short. It does not look like LLDB has th= e original types anywhere at all, and it also does not have them registered= . >=20 > frame #0: 0x000000007fe242aa DxeCore.dll`CoreAllocatePoolPagesI(Pool= Type=3DEfiBootServicesData, NoPages=3D1, Granularity=3D4096, NeedGuard=3D'\= 0') at Pool.c:322 > 319 =09 return NULL; > 320 =09 } > 321 =09 > -> 322 =09 Buffer =3D CoreAllocatePoolPages (PoolType, NoPages, Granula= rity, NeedGuard); > 323 =09 CoreReleaseMemoryLock (); > 324 =09 > 325 =09 if (Buffer !=3D NULL) { > (lldb) p Status > (unsigned long long) $3 =3D 0 >=20 > Structures work more or less fine, but for simpler types like strings we= are out of even potential pretty-printing. >=20 Vitaly, You can teach lldb about types. There is some example code here: https://g= ithub.com/tianocore/edk2/blob/master/EmulatorPkg/Unix/lldbefi.py > 2. Global variables are not accessible. I am not sure what happens, but = they either seem to not relocate or conflict with the other names: >=20 > (lldb) p gST > error: Couldn't materialize: couldn't get the value of variable ::gST: r= ead memory from 0x6e18 failed > error: errored out in DoExecute, couldn't PrepareToExecuteJITExpression > (lldb) p &gST > error: Couldn't materialize: couldn't get the value of variable ::gST: r= ead memory from 0x6e18 failed > error: errored out in DoExecute, couldn't PrepareToExecuteJITExpression >=20 That is strange as globals usually work best? The common issue I've seen i= s getting the slide wrong. The EFI modules are linked at a value near zero = and relocated into memory, so the slide represents that adjustment.=20 You can use `image dump sections` and ` image dump symtab` to see lldb's v= iew of symbols. More info here [1].=20 > 3. Quite a number of crashes. >=20 > In most cases autocompletion by tab press causes a crash. E.g. >=20 > b I >=20 > So will do printing of a GUID, e.g. p gEfiGlobalVariableGuid. >=20 > This may have to do with Python compatibility as Xcode 11 LLDB that uses= Python 3 generally crashes more often than MacPorts LLDB 9.0. Surprisingly= structures work more or less fine. >=20 You can tell lldb to use the older Python like this (from the Terminal.app= ): $ defaults write com.apple.dt.lldb DefaultPythonVersion 2 > 4. Ctrl+C does not produce a valid backtrace. When I break with a breakp= oint, I see a proper stacktrace with more than one entry, with function pro= totypes and values. When I break with Ctrl+C I only see some weird backtrac= e with most of the entries missing regardless of frame position: >=20 > (lldb) bt > * thread #1, stop reason =3D signal SIGTRAP > * frame #0: 0x000000007fe4c5f3 DxeCore.dll >=20 > Probably more and all the unintuitive stuff like the lack of more functi= onal TUI, but it is hard to remember all the trials. >=20 For the macOS API clang emits frame pointers, so you can walk the stack wi= thout symbols. You could try adding the compiler flag to emit the frame poi= nters.=20 > [1] https://github.com/acidanthera/OpenCorePkg/blob/master/Debug/Scripts= /lldb_uefi.py >=20 On macOS the Mach-O and dSYM have a UUID (dwarfdump -u) that is indexed by= Spotlight (mdfind "com_apple_xcode_dsym_uuids =3D=3D *") [2] This should be the UUID in the debug directory entry and you can use that = to lookup the symbols like this: module =3D target.AddModule (None, None, uuid) SBError =3D target.SetModuleLoadAddress (module, LoadAddress + TeAdjust) Also lldb has built in help for commands, but it is kind of terse since it= is autogenerated from the C++ swig.=20 (lldb) script help (lldb.target.AddModule) Help on method AddModule in module lldb: AddModule(self, *args) method of lldb.SBTarget instance AddModule(SBTarget self, SBModule module) -> bool AddModule(SBTarget self, char const * path, char const * triple, char = const * uuid) -> SBModule AddModule(SBTarget self, char const * path, char const * triple, char = const * uuid_cstr, char const * symfile) -> SBModule AddModule(SBTarget self, SBModuleSpec module_spec) -> SBModule The minimum you need to symbolicate a frame is uuid, LoadAddress, and PC.= = =20 [1] http://lldb.llvm.org/use/map.html [2] http://lldb.llvm.org/use/symbols.html Thanks, Andrew Fish > Best wishes, > Vitaly >=20 >> 20 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0=B2 22:14, Andrew Fi= sh > =D0=BD=D0=B0=D0=BF=D0=B8=D1= =81=D0=B0=D0=BB(=D0=B0): >>=20 >>=20 >>=20 >>> On Mar 20, 2020, at 8:13 AM, Vitaly Cheptsov > wrote: >>>=20 >>> Hello, >>>=20 >>> We noticed that the original bugzilla, which intended to add new LLVM = toolchain support[1], also wanted to bring ELF format support with DWARF de= bugging information. For some reason this did not make its way into EDK II,= and we are currently wondering, how can one debug binaries built with LLVM= 9.0. >>>=20 >>> For macOS and XCODE5 toolchain we use GDB scripts based on Andrei Wark= entin=E2=80=99s work, which allow us to integrate with QEMU and VMware[2]. = It is likely that they should work with little to no work on Linux with CLA= NG38/GCC5 with GDB once again. However, CLANGPDB apparently is using PDB de= bugging information, which I believe is not handled with GDB. >>>=20 >>> Could you please provide the details on the matter and let us know abo= ut the recommended route? >>> =E2=80=94 Is dropping CLANGELF just a temporary measure and it should = be resubmitted again? >>> =E2=80=94 Should LLDB, which seems to be aware of PDB, be used instead= of GDB, when building with CLANGPDB? If so, did anybody try that? >>>=20 >>=20 >> Vitaly, >>=20 >> I've not tried the CLANGPDB path, but if you want to connect lldb to QE= MU you need to set plugin.process.gdb-remote.target-definition-file [1] to= [2].=20 >>=20 >> [1] lldb -o "settings set plugin.process.gdb-remote.target-definition-= file x86_64_target_definition.py" -o "gdb-remote 9000" >> [2] https://github.com/llvm-mirror/lldb/blob/master/examples/python/x86= _64_target_definition.py >>=20 >> Thanks, >>=20 >> Andrew Fish >>=20 >>> Thanks! >>>=20 >>> Best regards, >>> Vitaly >>>=20 >>> [1] https://bugzilla.tianocore.org/show_bug.cgi?id=3D1603 >>> [2] https://github.com/acidanthera/OpenCorePkg/blob/master/Debug/Scrip= ts/gdb_uefi.py >>>=20 >=20 >=20 --Apple-Mail=_6517C3C0-C420-4505-8017-42A6662F6C15 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8

On Mar 21, 2= 020, at 3:28 AM, Vitaly Cheptsov <cheptsov@ispras.ru> wrote:

Hello,


Unfortunately the experience was close to terrible. I may certa= inly do something wrong, but it is clear that PDB and LLDB do not support e= ach other well enough. After spending several hours on playing with the too= ls my conclusion is that LLDB is simply not suited for UEFI PDB debugging, = and we really want DWARF  as there is no other opensource debugger tha= t supports PDB on macOS and Linux

In case so= mebody knows workarounds here are the issues I faced:

1. All integer alias typedefs are discarded in favour of underlyi= ng types. This way EFI_STATUS and EFI_TPL become unsigned long long, CHAR8 = becomes char, and CHAR16 becomes unsigned short. It does not look like LLDB= has the original types anywhere at all, and it also does not have them reg= istered.

=
    frame #0: 0= x000000007fe242aa DxeCore.dll`CoreAllocatePoolPagesI(PoolType=3DEfiBoo= tServicesData, NoPages=3D1, Granularity=3D4096, NeedGuard=3D'\0') at P= ool.c:322
   319      return NULL;<= br class=3D"">   320    }
   321&nb= sp;
-> 322    Buffer =3D CoreAllocatePoolPages (PoolType, No= Pages, Granularity, NeedGuard);
   323    Cor= eReleaseMemoryLock ();
   324 
  &n= bsp;325    if (Buffer !=3D NULL) {
(lldb) p S= tatus
(unsigned long long) $3 =3D 0

Structures work= more or less fine, but for simpler types like strings we are out of even p= otential pretty-printing.


V= italy,

You can teach lldb about types. = There is some example code here: https://github.= com/tianocore/edk2/blob/master/EmulatorPkg/Unix/lldbefi.py

2. Global variables are not accessible. I am not = sure what happens, but they either seem to not relocate or conflict with th= e other names:

=
(lldb) p gST
error: Couldn't materialize: couldn't get the value of variable ::gST: r= ead memory from 0x6e18 failed
error: errored out in DoExecute= , couldn't PrepareToExecuteJITExpression
(lldb) p &g= ST
error: Couldn't materialize: couldn't get the value of var= iable ::gST: read memory from 0x6e18 failed
error: errored ou= t in DoExecute, couldn't PrepareToExecuteJITExpression


That is strange as globals usually work best? The comm= on issue I've seen is getting the slide wrong. The EFI modules are linked a= t a value near zero and relocated into memory, so the slide represents that= adjustment. 

You can use `image d= ump sections` and ` image dump symtab` to see lldb's view of symbols. = More info here [1]. 

3. Quite a = number of crashes.

In most cases autocomp= letion by tab press causes a crash. E.g.

b I= <TAB>

So will do printing of a GUID, e= .g. 
This may have to do with Python compatibili= ty as Xcode 11 LLDB that uses Python 3 generally crashes more often than Ma= cPorts LLDB 9.0. Surprisingly structures work more or less fine.


You can tell lldb to use the older Python= like this (from the Terminal.app):
$ defaults write com.app= le.dt.lldb DefaultPythonVersion 2

4. Ctrl+C = does not produce a valid backtrace. When I break with a breakpoint, I see a= proper stacktrace with more than one entry, with function prototypes and v= alues. When I break with Ctrl+C I only see some weird backtrace with most o= f the entries missing regardless of frame position:

(lldb) bt=
* thread #1, stop reason =3D signal SIGTRAP
  * frame #0: 0x000000007fe4c5f3 DxeCore.dll
<= /div>

Probably more and all the unin= tuitive stuff like the lack of more functional TUI, but it is hard to remem= ber all the trials.

For the= macOS API clang emits frame pointers, so you can walk the stack without sy= mbols. You could try adding the compiler flag to emit the frame pointers.&n= bsp;



On macOS the Mach-O and dSYM have a UUID (dwarfdump -u= ) that is indexed by Spotlight (mdfind "com_apple_xcode_dsym_uuids =3D=3D *= ") [2]
This should be the UUID in the debug directory entry and y= ou can use that to lookup the symbols like this:

<= /div>
module =3D target.AddModule (None, None, uuid)
SBError = = =3D target.SetModuleLoadAddress (module, LoadAddress + TeAdjust)

Also lldb has built in help for commands, but it= is kind of terse since it is autogenerated from the C++ swig. 
<= div>
(lldb) script help (lldb.target.AddModule)
Help on method AddModul= e in module lldb:

AddModule(self, *args) meth= od of lldb.SBTarget instance
    AddModule(SBTarget self, SBModule = module) -> bool
    AddModule(SBTarget self, char const * path, = char const * triple, char const * uuid) -> SBModule
    AddModul= e(SBTarget self, char const * path, char const * triple, char const * uuid_= cstr, char const * symfile) -> SBModule
    AddModule(SBTarget s= elf, SBModuleSpec module_spec) -> SBModule
<= span style=3D"font-variant-ligatures: no-common-ligatures" class=3D"">
The minimum  you need to symbolicat= e a frame is uuid, LoadAddress, and PC. 


Thanks,

Andrew Fish

=

Best wishes,
Vitaly

20 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0=B2 22:= 14, Andrew Fish <afish@app= le.com> =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB(=D0=B0):


On Mar 20, 2020, at 8:13 AM, Vitaly Chep= tsov <cheptsov@ispras.r= u> wrote:

Hello,

We noticed that the original bugzilla, which intended to = add new LLVM toolchain support[1], also wanted to bring ELF format support = with DWARF debugging information. For some reason this did not make its way into EDK II, an= d we are currently wondering, how can one debug binaries built with LLVM 9.= 0.

For macOS and XCODE5 toolchain we use GDB = scripts based on Andrei Warkentin=E2=80=99s wo= rk, which allow us to integrate with QEMU and VMware[2]. It is likely that = they should work with little to no work on Linux with CLANG38/GCC5 with GDB= once again. However, CLANGPDB apparently is using PDB debugging informatio= n, which I believe is not handled with GDB.
Could you please provide the details on t= he matter and let us know about the recommended route?
=E2=80=94 Is dropping CLANGELF just a temporary measure and it should be r= esubmitted again?
=E2=80=94 Should LLDB, which seems to be aware of PD= B, be used instead of GDB, when building with CLANGPDB? If so, did anybody = try that?


Vitaly,
<= br class=3D"">
I've not tried = the CLANGPDB path, but if you want to connect lldb to QEMU you need to set =  plugin.process.gdb-remote.target-definition-file [1] to [2]. 

[1]  lldb -o "settings set plugin.= process.gdb-remote.target-definition-file x86_64_target_definition.py" -o "= gdb-remote 9000"
Thanks,

Andrew Fish



--Apple-Mail=_6517C3C0-C420-4505-8017-42A6662F6C15-- From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.ispras.ru (mail.ispras.ru [83.149.199.45]) by mx.groups.io with SMTP id smtpd.web12.14493.1584815782028791918 for ; Sat, 21 Mar 2020 11:36:23 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: ispras.ru, ip: 83.149.199.45, mailfrom: cheptsov@ispras.ru) Received: from [127.0.0.1] (unknown [77.232.9.83]) by mail.ispras.ru (Postfix) with ESMTPSA id CC5DD653; Sat, 21 Mar 2020 21:36:19 +0300 (MSK) From: "Vitaly Cheptsov" Message-Id: <5C8DD065-0140-428B-A146-999A5694BC99@ispras.ru> Mime-Version: 1.0 (Mac OS X Mail 13.0 \(3608.60.0.2.5\)) Subject: Re: [edk2-devel] CLANGPDB binary debugging Date: Sat, 21 Mar 2020 21:36:18 +0300 In-Reply-To: <63396616-D8CF-4135-B967-772C1E6136BD@apple.com> Cc: devel@edk2.groups.io, "Gao, Liming" , =?utf-8?Q?Marvin_H=C3=A4user?= To: Andrew Fish References: <9804C565-0C9E-4778-92A7-06EA6AD8D694@ispras.ru> <7E18AD8F-9A44-45FE-A8C8-CE06A6328930@apple.com> <63396616-D8CF-4135-B967-772C1E6136BD@apple.com> X-Mailer: Apple Mail (2.3608.60.0.2.5) X-Groupsio-MsgNum: 56072 Content-Type: multipart/signed; boundary="Apple-Mail=_70470479-C16E-41AA-96F6-03AE5C2D084B"; protocol="application/pgp-signature"; micalg=pgp-sha512 --Apple-Mail=_70470479-C16E-41AA-96F6-03AE5C2D084B Content-Type: multipart/alternative; boundary="Apple-Mail=_31023E76-662B-42F5-90E8-486884B65E56" --Apple-Mail=_31023E76-662B-42F5-90E8-486884B65E56 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Andrew, Thanks once again, but unfortunately it is not that simple. Below I answer= ed inline explaining the particular issues, which mostly seem to be specifi= c to CLANGPDB. LLVM stack emits PDB debug files, and even though LLDB does = support them to some level, it is unlikely that this will be working well e= nough soon. We should really stick to more or less native debug formats, id= eally those that have proper open specifications, on all platforms, and for= Unix that=E2=80=99s DWARF. I am pretty sure LLVM can be taught to emit DWARF debug information even f= or PE files. Perhaps we can either make some option or provide a separate t= oolchain for this? Another way would be recovering CLANGELF as originally s= uggested. > You can teach lldb about types. There is some example code here: https:/= /github.com/tianocore/edk2/blob/master/EmulatorPkg/Unix/lldbefi.py This code works just fine with LLDB and DWARF (e.g. XCODE5), though I have= not yet completed these changes for my scripts for LLDB, only for GDB. How= ever, with CLANGPDB generated files it is not functional. The reason for th= is is because LLDB is unaware of the underlying type, i.e. it does not know= what is EFI_STATUS or UINT32. I can implement pretty-printing when LLDB kn= ows about a typedef, but it is not possible to do this when the debug infor= mation is already gone or not parsed: (lldb) p Status (unsigned long long) $1 =3D 0 (lldb) p &Status (unsigned long long *) $2 =3D 0x000000007fe19ad8 (lldb) p (EFI_STATUS)Status error: use of undeclared identifier 'EFI_STATUS' Just in case I tried using exactly your code, and other stuff like source = level debugging works just fine and symbolication works fine, so it should = be some bug with PDB in particular. > That is strange as globals usually work best? The common issue I've seen= is getting the slide wrong. The EFI modules are linked at a value near zer= o and relocated into memory, so the slide represents that adjustment. >=20 > You can use `image dump sections` and ` image dump symtab` to see lldb's= view of symbols. More info here [1]. Yes, this one is a bit complicated, once again due to PDB most likely. It = knows about global symbols, but does not list them in symtab: (lldb) image dump symtab Dumping symbol table for 91 modules. Symtab, file =3D GdbSyms/Bin/X64_CLANGPDB/GdbSyms.dll, num_symbols =3D 0 Symtab, file =3D /Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_C= LANGPDB/X64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll, num_symbols = =3D 0 Symtab, file =3D /Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_C= LANGPDB/X64/MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe/DEBUG/Device= PathDxe.dll, num_symbols =3D 0 =E2=80=A6 The slides are correct, but there are two nuances that collide with it. 1. There are multiple instances of the globals with the same name (e.g. gB= S), but for some reason LLDB always tries to print the globals from the fir= st module. This happens even when I am source-level debugging, and I see a = gBS symbol from another module (e.g. DxeCore) used right at the same line. = With GDB the closest symbol is used, but with LLDB it is always coming from= the first module. I tried checking expr help to find whether I can pass it= a module explicitly, but also failed. 2. To be able to get EFI types to locate the EFI_SYSTEM_TABLE_POINTER I a= dd a dummy GdbSyms image, which is not loaded to the firmware. So basically= I cannot slide what is not in the memory, and this is also my first image.= I tried deleting it anyhow, but it failed for me. (lldb) image dump sections Dumping sections for 91 modules. Sections for 'GdbSyms/Bin/X64_CLANGPDB/GdbSyms.dll' (x86_64): SectID Type Load Address Per= m File Off. File Size Flags Section Name ---------- ---------------- --------------------------------------- ---= - ---------- ---------- ---------- ---------------------------- 0xffffffffffffffff container [0x0000000000000000-0x0000000000006e= c0)* --- 0x00000000 0x00000000 0x00000000 GdbSyms.dll. 0x00000001 code [0x0000000000000220-0x0000000000005bd6)* ---= 0x00000220 0x000059c0 0x60000020 GdbSyms.dll...text 0x00000002 data [0x0000000000005be0-0x0000000000006d79)* ---= 0x00005be0 0x000011a0 0x40000040 GdbSyms.dll...rdata 0x00000003 data [0x0000000000006d80-0x0000000000006e30)* ---= 0x00006d80 0x00000060 0xc0000040 GdbSyms.dll...data 0x00000004 regular [0x0000000000006e40-0x0000000000006ea4)* ---= 0x00006de0 0x00000080 0x42000040 GdbSyms.dll...reloc Sections for '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_CLAN= GPDB/X64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll' (x86_64): SectID Type Load Address Per= m File Off. File Size Flags Section Name ---------- ---------------- --------------------------------------- ---= - ---------- ---------- ---------- ---------------------------- 0xffffffffffffffff container [0x0000000000000000-0x00000000000523= a0)* --- 0x00000000 0x00000000 0x00000000 DxeCore.dll. 0x00000001 code [0x000000007fe1b220-0x000000007fe61e34) ---= 0x00000220 0x00046c20 0x60000020 DxeCore.dll...text 0x00000002 data [0x000000007fe61e40-0x000000007fe68065) ---= 0x00046e40 0x00006240 0x40000040 DxeCore.dll...rdata 0x00000003 data [0x000000007fe68080-0x000000007fe6d160) ---= 0x0004d080 0x000018a0 0xc0000040 DxeCore.dll...data 0x00000004 regular [0x000000007fe6d160-0x000000007fe6d398) ---= 0x0004e920 0x00000240 0x42000040 DxeCore.dll...reloc Sections for '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_CLAN= GPDB/X64/MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe/DEBUG/DevicePat= hDxe.dll' (x86_64): SectID Type Load Address Per= m File Off. File Size Flags Section Name ---------- ---------------- --------------------------------------- ---= - ---------- ---------- ---------- ---------------------------- 0xffffffffffffffff container [0x0000000000000000-0x00000000000144= 20)* --- 0x00000000 0x00000000 0x00000000 DevicePathDxe.dll. 0x00000001 code [0x000000007f986220-0x000000007f996cc6) ---= 0x00000220 0x00010ac0 0x60000020 DevicePathDxe.dll...text 0x00000002 data [0x000000007f996ce0-0x000000007f999b04) ---= 0x00010ce0 0x00002e40 0x40000040 DevicePathDxe.dll...rdata 0x00000003 data [0x000000007f999b20-0x000000007f99a1a2) ---= 0x00013b20 0x00000660 0xc0000040 DevicePathDxe.dll...data 0x00000004 regular [0x000000007f99a1c0-0x000000007f99a404) ---= 0x00014180 0x00000260 0x42000040 DevicePathDxe.dll=E2=80=A6reloc =E2=80=A6 So, all in all, unique global variables work, but there is no way to acces= s duplicating variables. They either resolve to GdbSyms or just cause a cra= sh: (lldb) p mDebugInfoTableHeader (EFI_DEBUG_IMAGE_INFO_TABLE_HEADER) $0 =3D { UpdateStatus =3D 2 TableSize =3D 92 EfiDebugImageInfoTable =3D 0x000000007f814018 } (lldb) p gBS error: Couldn't materialize: couldn't get the value of variable ::gBS: rea= d memory from 0x6df8 failed error: errored out in DoExecute, couldn't PrepareToExecuteJITExpression (lldb) p gEfiGlobalVariableGuid 0 libLLVM.dylib 0x000000010e52ee68 llvm::sys::PrintStackTrace(= llvm::raw_ostream&) + 40 1 libLLVM.dylib 0x000000010e52f262 SignalHandler(int) + 188 2 libsystem_platform.dylib 0x00007fff6ca5642d _sigtramp + 29 ... > You can tell lldb to use the older Python like this (from the Terminal.a= pp): > $ defaults write com.apple.dt.lldb DefaultPythonVersion 2 Thanks, that helped quite a bit, but for some reason Xcode version still c= rashes more for me. I attached a couple of stack traces if you feel like ha= ving a look, but once again it seems that it is all about the PDB plugin. > For the macOS API clang emits frame pointers, so you can walk the stack = without symbols. You could try adding the compiler flag to emit the frame p= ointers. I am pretty sure stack frames are not disabled with UEFI, as sometimes bac= ktracing works just fine. To me it looks like debug information parsing ran= domly breaks in LLDB, and once it happens it forgets about other images: (lldb) b CoreLocateHandleBuffer Breakpoint 2: where =3D DxeCore.dll`CoreLocateHandleBuffer + 31 at Locate.= c:649, address =3D 0x000000007fe36e4f (lldb) c Process 1 resuming Process 1 stopped * thread #1, stop reason =3D breakpoint 2.1 frame #0: 0x000000007fe36e4f DxeCore.dll`CoreLocateHandleBuffer(Search= Type=3DByProtocol, Protocol=3D0x000000007f978160, SearchKey=3D0x00000000000= 00000, NumberHandles=3D0x000000007fe19fd8, Buffer=3D0x000000007fe19fc0) at = Locate.c:649 646 =09 EFI_STATUS Status; 647 =09 UINTN BufferSize; 648 -> 649 =09 if (NumberHandles =3D=3D NULL) { 650 =09 return EFI_INVALID_PARAMETER; 651 =09 } 652 (lldb) bt * thread #1, stop reason =3D breakpoint 2.1 * frame #0: 0x000000007fe36e4f DxeCore.dll`CoreLocateHandleBuffer(Search= Type=3DByProtocol, Protocol=3D0x000000007f978160, SearchKey=3D0x00000000000= 00000, NumberHandles=3D0x000000007fe19fd8, Buffer=3D0x000000007fe19fc0) at = Locate.c:649 frame #1: 0x000000007fe36816 DxeCore.dll`CoreLocateDevicePath(Protocol= = =3D0x000000007f978160, DevicePath=3D0x000000007fe1a060, Device=3D0x0000000= 07fe1a068) at Locate.c:466 frame #2: 0x000000007f97479a SecurityStubDxe.dll =E2=80=94=E2=80=94=E2=80=94 (lldb) b CopyMem Breakpoint 3: 70 locations. (lldb) c Process 1 resuming Process 1 stopped * thread #1, stop reason =3D breakpoint 2.53 3.53 frame #0: 0x000000007e5c13b3 MnpDxe.dll`CopyMem(DestinationBuffer=3D0x= 000000007fe19b50, SourceBuffer=3D0x000000007e2aa470, Length=3D656) at CopyM= emWrapper.c:47 44 IN UINTN Length 45 ) 46 { -> 47 if (Length =3D=3D 0) { 48 return DestinationBuffer; 49 } 50 ASSERT ((Length - 1) <=3D (MAX_ADDRESS - (UINTN)DestinationBuffe= r)); (lldb) bt * thread #1, stop reason =3D breakpoint 2.53 3.53 * frame #0: 0x000000007e5c13b3 MnpDxe.dll`CopyMem(DestinationBuffer=3D0x= 000000007fe19b50, SourceBuffer=3D0x000000007e2aa470, Length=3D656) at CopyM= emWrapper.c:47 (lldb) finish error: Could not create return address breakpoint. (lldb) n Process 1 stopped * thread #1, stop reason =3D step over frame #0: 0x000000007e5c13ce MnpDxe.dll`CopyMem(DestinationBuffer=3D0x= 000000007fe19b50, SourceBuffer=3D0x000000007e2aa470, Length=3D656) at CopyM= emWrapper.c:50 47 if (Length =3D=3D 0) { 48 return DestinationBuffer; 49 } -> 50 ASSERT ((Length - 1) <=3D (MAX_ADDRESS - (UINTN)DestinationBuffe= r)); 51 ASSERT ((Length - 1) <=3D (MAX_ADDRESS - (UINTN)SourceBuffer)); 52 53 if (DestinationBuffer =3D=3D SourceBuffer) { (lldb) ... Process 1 stopped * thread #1, stop reason =3D step over frame #0: 0x000000007e5c14b4 MnpDxe.dll`CopyMem(DestinationBuffer=3D0x= 000000007fe19b50, SourceBuffer=3D0x000000007e2aa470, Length=3D656) at CopyM= emWrapper.c:57 54 return DestinationBuffer; 55 } 56 return InternalMemCopyMem (DestinationBuffer, SourceBuffer, Leng= th); -> 57 } (lldb) Process 1 stopped * thread #1, stop reason =3D step over frame #0: 0x000000007e5c726e MnpDxe.dll -> 0x7e5c726e: mov rax, qword ptr [rsp + 0x60] 0x7e5c7273: cmp byte ptr [rax + 0x68], 0x0 0x7e5c7277: jne 0x7e5c7291 0x7e5c727d: movabs rax, -0x7fffffffffffffed (lldb) bt * thread #1, stop reason =3D step over * frame #0: 0x000000007e5c726e MnpDxe.dll =E2=80=94=E2=80=94=E2=80=94 (lldb) c Process 1 resuming Process 1 stopped * thread #1, stop reason =3D signal SIGINT frame #0: 0x000000007fe4d72e DxeCore.dll -> 0x7fe4d72e: cmp al, 0x0 0x7fe4d730: je 0x7fe4d765 0x7fe4d736: mov rcx, qword ptr [rsp + 0x20] 0x7fe4d73b: call 0x7fe4c4b0 (lldb) bt * thread #1, stop reason =3D signal SIGINT * frame #0: 0x000000007fe4d72e DxeCore.dll > On macOS the Mach-O and dSYM have a UUID (dwarfdump -u) that is indexed = by Spotlight (mdfind "com_apple_xcode_dsym_uuids =3D=3D *") [2] > This should be the UUID in the debug directory entry and you can use tha= t to lookup the symbols like this: >=20 > module =3D target.AddModule (None, None, uuid) > SBError =3D target.SetModuleLoadAddress (module, LoadAddress + TeAdjust) >=20 > Also lldb has built in help for commands, but it is kind of terse since = it is autogenerated from the C++ swig. > (lldb) script help (lldb.target.AddModule) > Help on method AddModule in module lldb: >=20 > AddModule(self, *args) method of lldb.SBTarget instance > AddModule(SBTarget self, SBModule module) -> bool > AddModule(SBTarget self, char const * path, char const * triple, cha= r const * uuid) -> SBModule > AddModule(SBTarget self, char const * path, char const * triple, cha= r const * uuid_cstr, char const * symfile) -> SBModule > AddModule(SBTarget self, SBModuleSpec module_spec) -> SBModule >=20 > The minimum you need to symbolicate a frame is uuid, LoadAddress, and P= C. >=20 > [1] http://lldb.llvm.org/use/map.html > [2] http://lldb.llvm.org/use/symbols.html Thanks for the links again. Yes, I am using some of these, and in fact for= GDB that=E2=80=99s pretty much what I did when I worked with XCODE5. It is= very likely that when I get to complete LLDB support for XCODE5 it will wo= rk quite fine too. But I am already happy with XCODE5 here, and making it e= ven better will only help myself, but not other people with e.g. Linux or p= eople that want me to use the same compiler with them. Best regards, Vitaly > 21 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0=B2 20:13, Andrew Fis= h =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB(=D0=B0): >=20 >=20 >=20 >> On Mar 21, 2020, at 3:28 AM, Vitaly Cheptsov > wrote: >>=20 >> Hello, >>=20 >> Andrey, thanks for the hint, it was very helpful. I rewrote the GDB scr= ipts to work with LLDB[1] and was able to debug OVMF built with CLANGPDB. W= hile it is still quite dirty, at the very least it works. >>=20 >> Unfortunately the experience was close to terrible. I may certainly do = something wrong, but it is clear that PDB and LLDB do not support each othe= r well enough. After spending several hours on playing with the tools my co= nclusion is that LLDB is simply not suited for UEFI PDB debugging, and we r= eally want DWARF as there is no other opensource debugger that supports PD= B on macOS and Linux >>=20 >> In case somebody knows workarounds here are the issues I faced: >>=20 >> 1. All integer alias typedefs are discarded in favour of underlying typ= es. This way EFI_STATUS and EFI_TPL become unsigned long long, CHAR8 become= s char, and CHAR16 becomes unsigned short. It does not look like LLDB has t= he original types anywhere at all, and it also does not have them registere= d. >>=20 >> frame #0: 0x000000007fe242aa DxeCore.dll`CoreAllocatePoolPagesI(Poo= lType=3DEfiBootServicesData, NoPages=3D1, Granularity=3D4096, NeedGuard=3D'= \0') at Pool.c:322 >> 319 =09 return NULL; >> 320 =09 } >> 321 >> -> 322 =09 Buffer =3D CoreAllocatePoolPages (PoolType, NoPages, Granul= arity, NeedGuard); >> 323 =09 CoreReleaseMemoryLock (); >> 324 >> 325 =09 if (Buffer !=3D NULL) { >> (lldb) p Status >> (unsigned long long) $3 =3D 0 >>=20 >> Structures work more or less fine, but for simpler types like strings w= e are out of even potential pretty-printing. >>=20 >=20 > Vitaly, >=20 > You can teach lldb about types. There is some example code here: https:/= /github.com/tianocore/edk2/blob/master/EmulatorPkg/Unix/lldbefi.py >> 2. Global variables are not accessible. I am not sure what happens, but= they either seem to not relocate or conflict with the other names: >>=20 >> (lldb) p gST >> error: Couldn't materialize: couldn't get the value of variable ::gST: = read memory from 0x6e18 failed >> error: errored out in DoExecute, couldn't PrepareToExecuteJITExpression >> (lldb) p &gST >> error: Couldn't materialize: couldn't get the value of variable ::gST: = read memory from 0x6e18 failed >> error: errored out in DoExecute, couldn't PrepareToExecuteJITExpression >>=20 >=20 > That is strange as globals usually work best? The common issue I've seen= is getting the slide wrong. The EFI modules are linked at a value near zer= o and relocated into memory, so the slide represents that adjustment. >=20 > You can use `image dump sections` and ` image dump symtab` to see lldb's= view of symbols. More info here [1]. >=20 >> 3. Quite a number of crashes. >>=20 >> In most cases autocompletion by tab press causes a crash. E.g. >>=20 >> b I >>=20 >> So will do printing of a GUID, e.g. p gEfiGlobalVariableGuid. >>=20 >> This may have to do with Python compatibility as Xcode 11 LLDB that use= s Python 3 generally crashes more often than MacPorts LLDB 9.0. Surprisingl= y structures work more or less fine. >>=20 >=20 > You can tell lldb to use the older Python like this (from the Terminal.a= pp): > $ defaults write com.apple.dt.lldb DefaultPythonVersion 2 >=20 >> 4. Ctrl+C does not produce a valid backtrace. When I break with a break= point, I see a proper stacktrace with more than one entry, with function pr= ototypes and values. When I break with Ctrl+C I only see some weird backtra= ce with most of the entries missing regardless of frame position: >>=20 >> (lldb) bt >> * thread #1, stop reason =3D signal SIGTRAP >> * frame #0: 0x000000007fe4c5f3 DxeCore.dll >>=20 >> Probably more and all the unintuitive stuff like the lack of more funct= ional TUI, but it is hard to remember all the trials. >>=20 >=20 > For the macOS API clang emits frame pointers, so you can walk the stack = without symbols. You could try adding the compiler flag to emit the frame p= ointers. >=20 >=20 >> [1] https://github.com/acidanthera/OpenCorePkg/blob/master/Debug/Script= s/lldb_uefi.py >>=20 >=20 > On macOS the Mach-O and dSYM have a UUID (dwarfdump -u) that is indexed = by Spotlight (mdfind "com_apple_xcode_dsym_uuids =3D=3D *") [2] > This should be the UUID in the debug directory entry and you can use tha= t to lookup the symbols like this: >=20 > module =3D target.AddModule (None, None, uuid) > SBError =3D target.SetModuleLoadAddress (module, LoadAddress + TeAdjust) >=20 > Also lldb has built in help for commands, but it is kind of terse since = it is autogenerated from the C++ swig. > (lldb) script help (lldb.target.AddModule) > Help on method AddModule in module lldb: >=20 > AddModule(self, *args) method of lldb.SBTarget instance > AddModule(SBTarget self, SBModule module) -> bool > AddModule(SBTarget self, char const * path, char const * triple, cha= r const * uuid) -> SBModule > AddModule(SBTarget self, char const * path, char const * triple, cha= r const * uuid_cstr, char const * symfile) -> SBModule > AddModule(SBTarget self, SBModuleSpec module_spec) -> SBModule >=20 > The minimum you need to symbolicate a frame is uuid, LoadAddress, and P= C. >=20 > [1] http://lldb.llvm.org/use/map.html > [2] http://lldb.llvm.org/use/symbols.html >=20 > Thanks, >=20 > Andrew Fish >=20 >=20 >> Best wishes, >> Vitaly >>=20 >>> 20 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0=B2 22:14, Andrew F= ish > =D0=BD=D0=B0=D0=BF=D0=B8=D1= =81=D0=B0=D0=BB(=D0=B0): >>>=20 >>>=20 >>>=20 >>>> On Mar 20, 2020, at 8:13 AM, Vitaly Cheptsov > wrote: >>>>=20 >>>> Hello, >>>>=20 >>>> We noticed that the original bugzilla, which intended to add new LLVM= toolchain support[1], also wanted to bring ELF format support with DWARF d= ebugging information. For some reason this did not make its way into EDK II= , and we are currently wondering, how can one debug binaries built with LLV= M 9.0. >>>>=20 >>>> For macOS and XCODE5 toolchain we use GDB scripts based on Andrei War= kentin=E2=80=99s work, which allow us to integrate with QEMU and VMware[2].= It is likely that they should work with little to no work on Linux with CL= ANG38/GCC5 with GDB once again. However, CLANGPDB apparently is using PDB d= ebugging information, which I believe is not handled with GDB. >>>>=20 >>>> Could you please provide the details on the matter and let us know ab= out the recommended route? >>>> =E2=80=94 Is dropping CLANGELF just a temporary measure and it should= be resubmitted again? >>>> =E2=80=94 Should LLDB, which seems to be aware of PDB, be used instea= d of GDB, when building with CLANGPDB? If so, did anybody try that? >>>>=20 >>>=20 >>> Vitaly, >>>=20 >>> I've not tried the CLANGPDB path, but if you want to connect lldb to Q= EMU you need to set plugin.process.gdb-remote.target-definition-file [1] t= o [2]. >>>=20 >>> [1] lldb -o "settings set plugin.process.gdb-remote.target-definition= -file x86_64_target_definition.py" -o "gdb-remote 9000" >>> [2] https://github.com/llvm-mirror/lldb/blob/master/examples/python/x8= 6_64_target_definition.py >>>=20 >>> Thanks, >>>=20 >>> Andrew Fish >>>=20 >>>> Thanks! >>>>=20 >>>> Best regards, >>>> Vitaly >>>>=20 >>>> [1] https://bugzilla.tianocore.org/show_bug.cgi?id=3D1603 >>>> [2] https://github.com/acidanthera/OpenCorePkg/blob/master/Debug/Scri= pts/gdb_uefi.py >>>>=20 >>=20 >>=20 --Apple-Mail=_31023E76-662B-42F5-90E8-486884B65E56 Content-Type: multipart/mixed; boundary="Apple-Mail=_1DCC97AF-E04C-48EC-8905-4DB5147C5E0E" --Apple-Mail=_1DCC97AF-E04C-48EC-8905-4DB5147C5E0E Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8 Andrew,
Thanks once again, but unfortunately it = is not that simple. Below I answered inline explaining the particular = issues, which mostly seem to be specific to CLANGPDB. LLVM stac= k emits PDB debug files, and even though LLDB does support them to some lev= el, it is unlikely that this will be working well enough soon. We should re= ally stick to more or less native debug formats, ideally those that have pr= oper open specifications, on all platforms, and for Unix that=E2=80=99s DWA= RF.

I am pretty sure LLVM can be taught to emit DWARF debug inform= ation even for PE files. Perhaps we can either make some option or provide = a separate toolchain for this? Another way would be recovering CLANGELF as = originally suggested.

You can teach l= ldb about types. There is some example code here: https://github.com/tianocore/edk2/blob/master/EmulatorPkg/Unix/lldbefi.py=

This code works= just fine with LLDB and DWARF (e.g. XCODE5), though I have not yet complet= ed these changes for my scripts for LLDB, only for GDB. However, with CLANG= PDB generated files it is not functional. The reason for this is because LL= DB is unaware of the underlying type, i.e. it does not know what is EFI_STA= TUS or UINT32. I can implement pretty-printing when LLDB knows about a type= def, but it is not possible to do this when the debug information is alread= y gone or not parsed:

(lldb) p Status
(unsigned long long) $1 =3D 0
(lldb) p &Status
(unsigned long long *) $2 =3D 0x0= 00000007fe19ad8
(lldb) p (EFI_STATUS)Status
err= or: use of undeclared identifier 'EFI_STATUS'
Just in case I tried using exactly your code, and ot= her stuff like source level debugging works just fine and symbolication wor= ks fine, so it should be some bug with PDB in particular.
= =
That is strange as globals usually work best? The common issue I= 've seen is getting the slide wrong. The EFI modules are linked at a value = near zero and relocated into memory, so the slide represents that adjustmen= t. 

You can = use `image dump sections` and ` image dump symtab` to see lldb's view = of symbols. More info here [1]. 

Yes, this one is a bit complicated, once again due to PDB most likel= y. It knows about global symbols, but does not list them in symtab:

(lldb) image dump symtab
Du= mping symbol table for 91 modules.
Symtab, file =3D GdbSyms/B= in/X64_CLANGPDB/GdbSyms.dll, num_symbols =3D 0
Symtab, file = =3D /Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_CLANGPDB/X64/M= deModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll, num_symbols =3D 0
Symtab, file =3D /Users/user/Documents/UefiWorkspace/Build/OvmfX64/N= OOPT_CLANGPDB/X64/MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe/DEBUG/= DevicePathDxe.dll, num_symbols =3D 0
=E2=80=A6

The slides are correct, but there are two nuances that co= llide with it.

1. There are multiple in= stances of the globals with the same name (e.g. gBS), but for some reason L= LDB always tries to print the globals from the first module. This happens e= ven when I am source-level debugging, and I see a gBS symbol from another m= odule (e.g. DxeCore) used right at the same line. With GDB the closest symb= ol is used, but with LLDB it is always coming from the first module. I trie= d checking expr help to find whether I can pass it a module explicitly, but= also failed.

2.  To be able to ge= t EFI types to locate the EFI_SYSTEM_TABLE_POINTER I add a dummy GdbSyms im= age, which is not loaded to the firmware. So basically I cannot slide what = is not in the memory, and this is also my first image. I tried deleting it = anyhow, but it failed for me.

(lldb)&nb= sp;image dump sections
Dumping sections for 91 modules.
Sections for 'GdbSyms/Bin/X64_CLANGPDB/GdbSyms.dll' (x86_64):
  SectID     Type     =         Load Address       &nb= sp;                    &n= bsp;Perm File Off.  File Size  Flags     = ; Section Name
  ---------- ---------------- -= --------------------------------------  ---- ---------- ---------= - ---------- ----------------------------
  0xfffff= fffffffffff container        [0x0000000000000000-0= x0000000000006ec0)* ---  0x00000000 0x00000000 0x00000000 GdbSyms= .dll.
  0x00000001 code       &= nbsp;     [0x0000000000000220-0x0000000000005bd6)* --- =  0x00000220 0x000059c0 0x60000020 GdbSyms.dll...text
&nb= sp; 0x00000002 data            &nbs= p;[0x0000000000005be0-0x0000000000006d79)* ---  0x00005be0 0x0000= 11a0 0x40000040 GdbSyms.dll...rdata
  0x00000003 da= ta             [0x0000000000006d80-= 0x0000000000006e30)* ---  0x00006d80 0x00000060 0xc0000040 GdbSym= s.dll...data
  0x00000004 regular    &nbs= p;     [0x0000000000006e40-0x0000000000006ea4)* --- &nb= sp;0x00006de0 0x00000080 0x42000040 GdbSyms.dll...reloc
Secti= ons for '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_CLANGPDB/X= 64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll' (x86_64):
  SectID     Type       =       Load Address         &nb= sp;                   Per= m File Off.  File Size  Flags      = Section Name
  ---------- ---------------- --------= -------------------------------  ---- ---------- ---------- -----= ----- ----------------------------
  0xffffffffffff= ffff container        [0x0000000000000000-0x000000= 00000523a0)* ---  0x00000000 0x00000000 0x00000000 DxeCore.dll.  0x00000001 code         &= nbsp;   [0x000000007fe1b220-0x000000007fe61e34)  ---&nb= sp; 0x00000220 0x00046c20 0x60000020 DxeCore.dll...text
=   0x00000002 data            &= nbsp;[0x000000007fe61e40-0x000000007fe68065)  ---  0x00= 046e40 0x00006240 0x40000040 DxeCore.dll...rdata
  = 0x00000003 data             [0x0000= 00007fe68080-0x000000007fe6d160)  ---  0x0004d080 0x000= 018a0 0xc0000040 DxeCore.dll...data
  0x00000004 re= gular          [0x000000007fe6d160-0x00000000= 7fe6d398)  ---  0x0004e920 0x00000240 0x42000040 DxeCor= e.dll...reloc
Sections for '/Users/user/Documents/UefiWorkspa= ce/Build/OvmfX64/NOOPT_CLANGPDB/X64/MdeModulePkg/Universal/DevicePathDxe/De= vicePathDxe/DEBUG/DevicePathDxe.dll' (x86_64):
  Se= ctID     Type           &= nbsp; Load Address             &nbs= p;               Perm File Off.&nbs= p; File Size  Flags      Section Name  ---------- ---------------- -----------------------= ----------------  ---- ---------- ---------- ---------- ---------= -------------------
  0xffffffffffffffff container&= nbsp;       [0x0000000000000000-0x0000000000014420)* --= -  0x00000000 0x00000000 0x00000000 DevicePathDxe.dll.
  0x00000001 code           =   [0x000000007f986220-0x000000007f996cc6)  --- &nb= sp;0x00000220 0x00010ac0 0x60000020 DevicePathDxe.dll...text
=   0x00000002 data            &= nbsp;[0x000000007f996ce0-0x000000007f999b04)  ---  0x00= 010ce0 0x00002e40 0x40000040 DevicePathDxe.dll...rdata
 =  0x00000003 data             [= 0x000000007f999b20-0x000000007f99a1a2)  ---  0x00013b20= 0x00000660 0xc0000040 DevicePathDxe.dll...data
  0= x00000004 regular          [0x000000007f99a1c= 0-0x000000007f99a404)  ---  0x00014180 0x00000260 0x420= 00040 DevicePathDxe.dll=E2=80=A6reloc
=E2=80=A6
So, all in all, unique global variables work, but th= ere is no way to access duplicating variables. They either resolve to GdbSy= ms or just cause a crash:

(lldb) p= mDebugInfoTableHeader
(EFI_DEBUG_IMAGE_INFO_TABLE_HEADER) $0= =3D {
  UpdateStatus =3D 2
 &nb= sp;TableSize =3D 92
  EfiDebugImageInfoTable =3D 0x= 000000007f814018
}
(lldb) p gBS
error: Couldn't materialize: couldn't get the value of variable ::gB= S: read memory from 0x6df8 failed
error: errored out in DoExe= cute, couldn't PrepareToExecuteJITExpression
(lldb) p gE= fiGlobalVariableGuid
0  libLLVM.dylib    =         0x000000010e52ee68 llvm::sys::PrintStackTr= ace(llvm::raw_ostream&) + 40
1  libLLVM.dylib&n= bsp;           0x000000010e52f262 SignalHandl= er(int) + 188
2  libsystem_platform.dylib 0x00007ff= f6ca5642d _sigtramp + 29
...

<= div>
You can tell lldb = to use the older Python like this (from the Terminal.app):
$ defaults write com.apple.dt.lldb DefaultPythonVersion 2
=

Thanks, that helped quite a bit, but= for some reason Xcode version still crashes more for me. I attached a coup= le of stack traces if you feel like having a look, but once again it seems = that it is all about the PDB plugin.

For the macOS= API clang emits frame pointers, so you can walk the stack without symbols.= You could try adding the compiler flag to emit the frame pointers. 

I am pretty sure stack frames are not disabled with UEFI, = as sometimes backtracing works just fine. To me it looks like debug informa= tion parsing randomly breaks in LLDB, and once it happens it forgets about = other images:

(ll= db) b CoreLocateHandleBuffer
Breakpoint 2: where =3D Dxe= Core.dll`CoreLocateHandleBuffer + 31 at Locate.c:649, address =3D 0x0000000= 07fe36e4f
(lldb) c
Process 1 resuming
Process 1 stopped
* thread #1, stop reason =3D = ;breakpoint 2.1
    frame #0: 0x000000007= fe36e4f DxeCore.dll`CoreLocateHandleBuffer(SearchType=3DByProtocol, Pr= otocol=3D0x000000007f978160, SearchKey=3D0x0000000000000000, NumberHandles= =3D0x000000007fe19fd8, Buffer=3D0x000000007fe19fc0) at Locate.c:= 649
   646    EFI_STATUS      &n= bsp;   Status;
   647    UINTN &= nbsp;             BufferSize;
   648 
-> 649    if (NumberHandles = =3D=3D NULL) {
   650      return EF= I_INVALID_PARAMETER;
   651    }
=    652 
(lldb) bt
* thread #1, stop r= eason =3D breakpoint 2.1
  * frame #0: 0x= 000000007fe36e4f DxeCore.dll`CoreLocateHandleBuffer(SearchType=3DByPro= tocol, Protocol=3D0x000000007f978160, SearchKey=3D0x0000000000000000, Numbe= rHandles=3D0x000000007fe19fd8, Buffer=3D0x000000007fe19fc0) at Lo= cate.c:649
    frame #1: 0x000000007fe368= 16 DxeCore.dll`CoreLocateDevicePath(Protocol=3D0x000000007f978160, Dev= icePath=3D0x000000007fe1a060, Device=3D0x000000007fe1a068) at Locate.c= :466
    frame #2: 0x000000007f97479a&nbs= p;SecurityStubDxe.dll

=E2=80=94=E2=80=94=E2=80=94

(lldb) b CopyMem
Breakpoint 3: 70 locations.
(lldb) c
Process 1 resuming
Process= 1 stopped
* thread #1, stop reason =3D breakpoint 2.53 = 3.53
    frame #0: 0x000000007e5c13b3&nbs= p;MnpDxe.dll`CopyMem(DestinationBuffer=3D0x000000007fe19b50, SourceBuffer= =3D0x000000007e2aa470, Length=3D656) at CopyMemWrapper.c:47
   44     IN UINTN       = ;Length
   45     )
  &= nbsp;46   {
-> 47     if (Length =3D=3D = 0) {
   48       return Destinat= ionBuffer;
   49     }
 = ;  50     ASSERT ((Length - 1) <=3D (MAX_ADDRESS - (U= INTN)DestinationBuffer));
(lldb) bt
* thre= ad #1, stop reason =3D breakpoint 2.53 3.53
  = * frame #0: 0x000000007e5c13b3 MnpDxe.dll`CopyMem(DestinationBuff= er=3D0x000000007fe19b50, SourceBuffer=3D0x000000007e2aa470, Length=3D656) a= t CopyMemWrapper.c:47
(lldb) finish
e= rror: Could not create return address breakpoint.
(lldb) = ;n
Process 1 stopped
* thread #1, stop reason = =3D step over
    frame #0: 0x00000= 0007e5c13ce MnpDxe.dll`CopyMem(DestinationBuffer=3D0x000000007fe19b50,= SourceBuffer=3D0x000000007e2aa470, Length=3D656) at CopyMemWrapper.c:= 50
   47     if (Length =3D=3D 0= ) {
   48       return Destinati= onBuffer;
   49     }
-> = 50     ASSERT ((Length - 1) <=3D (MAX_ADDRESS - (UINTN)Des= tinationBuffer));
   51     ASSERT ((Lengt= h - 1) <=3D (MAX_ADDRESS - (UINTN)SourceBuffer));
&nb= sp;  52  
   53     if (Destinat= ionBuffer =3D=3D SourceBuffer) {
(lldb)  
...
Process 1 stopped
* thread #1, stop = reason =3D step over
    frame #0: 0= x000000007e5c14b4 MnpDxe.dll`CopyMem(DestinationBuffer=3D0x000000007fe= 19b50, SourceBuffer=3D0x000000007e2aa470, Length=3D656) at CopyMemWrap= per.c:57
   54       return Dest= inationBuffer;
   55     }
&= nbsp;  56     return InternalMemCopyMem (DestinationBuff= er, SourceBuffer, Length);
-> 57   }
(lldb)&n= bsp; 
Process 1 stopped
* thread #1, stop = reason =3D step over
    frame #0: 0= x000000007e5c726e MnpDxe.dll
->  0x7e5c726e= : mov    rax, qword ptr [rsp + 0x60]
  &n= bsp; 0x7e5c7273: cmp    byte ptr [rax + 0x68], 0x0
    0x7e5c7277: jne    0x7e5c7291    0x7e5c727d: movabs rax, -0x7fffffffffffffed=
(lldb) bt
* thread #1, stop reason =3D&nb= sp;step over
  * frame #0: 0x0= 00000007e5c726e MnpDxe.dll 

=
=E2=80=94=E2=80=94=E2=80=94

(lldb)=  c
Process 1 resuming
Process 1 stopped* thread #1, stop reason =3D signal SIGINT
&= nbsp;   frame #0: 0x000000007fe4d72e DxeCore.dll
->  0x7fe4d72e: cmp    al, 0x0
    0x7fe4d730: je     0x7fe4d765=
    0x7fe4d736: mov    rcx, qw= ord ptr [rsp + 0x20]
    0x7fe4d73b: call = ;  0x7fe4c4b0
(lldb) bt
* thread= #1, stop reason =3D signal SIGINT
  * frame #= 0: 0x000000007fe4d72e DxeCore.dll

=
On macOS the Mach= -O and dSYM have a UUID (dwarfdump -u) that is indexed by Spotlight (mdfind= "com_apple_xcode_dsym_uuids =3D=3D *") [2]
This shoul= d be the UUID in the debug directory entry and you can use that to lookup t= he symbols like this:

module =3D target.AddModule (None, None, uuid)
= SBError =3D target.SetModuleLoadAddress (module, LoadAddress + TeAdjust)

Also lldb has built= in help for commands, but it is kind of terse since it is autogenerated fr= om the C++ swig. 
(lldb) script help (lldb.targ= et.AddModule)
Help on = method AddModule in module lldb:

AddModule(self, *args) method of lldb.SBTarget insta= nce
    AddM= odule(SBTarget self, SBModule module) -> bool
    AddModule(SBTarget self, char cons= t * path, char const * triple, char const * uuid) -> SBModule
    AddModule(SBTarget= self, char const * path, char const * triple, char const * uuid_cstr, char= const * symfile) -> SBModule
    AddModule(SBTarget self, SBModuleSpec module_spec)= -> SBModule

The minimum  you need to symbolicate a frame is uuid, LoadAddre= ss, and PC. 

[1] http://lldb.llvm.org/use/map.html

Tha= nks for the links again. Yes, I am using some of these, and in fact for GDB= that=E2=80=99s pretty much what I did when I worked with XCODE5. It is ver= y likely that when I get to complete LLDB support for XCODE5 it will work q= uite fine too. But I am already happy with XCODE5 here, and making it even = better will only help myself, but not other people with e.g. Linux or peopl= e that want me to use the same compiler with them.

Best regards,
Vitaly

<= div>

21 =D0=BC=D0=B0=D1=80=D1=82=D0= =B0 2020 =D0=B3., =D0=B2 20:13, Andrew Fish <afish@apple.com> =D0=BD=D0=B0=D0=BF=D0=B8=D1=81= =D0=B0=D0=BB(=D0=B0):



On Mar 21, 2020, at 3:28 A= M, Vitaly Cheptsov <che= ptsov@ispras.ru> wrote:

Hello,
Andrey, than= ks for the hint, it was very helpful. I rewrote the GDB scripts to work wit= h LLDB[1] and was able to debug OVMF built with CLANGPDB. While it is still= quite dirty, at the very least it works.

Un= fortunately the experience was close to terrible. I may certainly do someth= ing wrong, but it is clear that PDB and LLDB do not support each other well= enough. After spending several hours on playing with the tools my conclusi= on is that LLDB is simply not suited for UEFI PDB debugging, and we really = want DWARF  as there is no other opensource debugger that supports PDB= on macOS and Linux

In case somebody knows= workarounds here are the issues I faced:

1.= All integer alias typedefs are discarded in favour of underlying types. Th= is way EFI_STATUS and EFI_TPL become unsigned long long, CHAR8 becomes char= , and CHAR16 becomes unsigned short. It does not look like LLDB has the ori= ginal types anywhere at all, and it also does not have them registered.

    frame #0: 0x00000000= 7fe242aa DxeCore.dll`CoreAllocatePoolPagesI(PoolType=3DEfiBootServices= Data, NoPages=3D1, Granularity=3D4096, NeedGuard=3D'\0') at Pool.c:322=
   319      return NULL;
   320    }
   321 
-> 322    Buffer =3D CoreAllocatePoolPages (PoolType, NoPag= es, Granularity, NeedGuard);
   323    CoreRe= leaseMemoryLock ();
   324 
   = ;325    if (Buffer !=3D NULL) {
(lldb) p Stat= us
(unsigned long long) $3 =3D 0

Structures work= more or less fine, but for simpler types like strings we are out of even p= otential pretty-printing.


Vitaly= ,

You can teach lldb about types. There is s= ome example code here: https://github.com/tianoc= ore/edk2/blob/master/EmulatorPkg/Unix/lldbefi.py

2. Global variables are not accessible. I am not sur= e what happens, but they either seem to not relocate or conflict with the o= ther names:

(lldb) p gST
= error: Couldn't materialize: couldn't get the value of variable ::gST: read= memory from 0x6e18 failed
error: errored out in DoExecute, c= ouldn't PrepareToExecuteJITExpression
(lldb) p &gST<= br class=3D"">error: Couldn't materialize: couldn't get the value of variab= le ::gST: read memory from 0x6e18 failed
error: errored out i= n DoExecute, couldn't PrepareToExecuteJITExpression


That is strange as globals usually work best? The common issue= I've seen is getting the slide wrong. The EFI modules are linked at a valu= e near zero and relocated into memory, so the slide represents that adjustm= ent. 

You can use `image dump sections`= and ` image dump symtab` to see lldb's view of symbols. More info her= e [1]. 

3. Quite a num= ber of crashes.

In most cases autocompletion= by tab press causes a crash. E.g.

b I<TA= B>

So will do printing of a GUID, e.g.&nb= sp;p gE= fiGlobalVariableGuid.
<= span class=3D"" style=3D"font-family: "Helvetica Neue";">
This may have to do with Python compatibility as = Xcode 11 LLDB that uses Python 3 generally crashes more often than MacPorts= LLDB 9.0. Surprisingly structures work more or less fine.


You can tell lldb to use the older Python like this = (from the Terminal.app):
$&nbs= p;defaults write com.apple.dt.lldb DefaultPythonVersion 2

4. Ctrl+C does not produce a valid backtrace. When = I break with a breakpoint, I see a proper stacktrace with more than one ent= ry, with function prototypes and values. When I break with Ctrl+C I only se= e some weird backtrace with most of the entries missing regardless of frame= position:

(lldb) bt
* thread #1, stop reason =3D&= nbsp;signal SIGTRAP
  * frame #0: 0x000000007f= e4c5f3 DxeCore.dll

Probably more and all the unintuitive stuff like the lack of more function= al TUI, but it is hard to remember all the trials.


For the macOS API clang emits frame pointers, so you = can walk the stack without symbols. You could try adding the compiler flag = to emit the frame pointers. 


=

On macOS the Mach-O and dSYM have a UUID (dwarfdu= mp -u) that is indexed by Spotlight (mdfind "com_apple_xcode_dsym_uuids =3D= = =3D *") [2]
This should be th= e UUID in the debug directory entry and you can use that to lookup the symb= ols like this:

=
module =3D target.AddModule (= None, None, uuid)
SBError =3D = target.SetModuleLoadAddress (module, LoadAddress + TeAdjust)

Also lldb has built in help for commands, but it is kind o= f terse since it is autogenerated from the C++ swig. 
= (lldb) <= /span>script help (lldb.target.AddModule)
Help on method AddModule in module lldb:

AddModule(self, *ar= gs) method of lldb.SBTarget instance
    AddModule(SBTarget self, SBModule module) ->= ; bool
   = AddModule(SBTarget self, char const * path, char const * triple, char cons= t * uuid) -> SBModule
    AddModule(SBTarget self, char const * path, char const * t= riple, char const * uuid_cstr, char const * symfile) -> SBModule<= /div>
    AddModule(SBTar= get self, SBModuleSpec module_spec) -> SBModule

The minimum  you need to = symbolicate a frame is uuid, LoadAddress, and PC. 
<= div style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: = 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; l= etter-spacing: normal; text-align: start; text-indent: 0px; text-transform:= none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0= px; text-decoration: none;" class=3D"">

Thanks,

Andrew= Fish


Best wishes,
Vitaly

20 =D0=BC= =D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0=B2 22:14, Andrew Fish <afish@apple.com> =D0=BD=D0= =B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB(=D0=B0):



On Mar 20, 2020, at 8:13 AM, Vitaly Cheptsov <cheptsov@ispras.ru> wrote:

Hello,

We no= ticed that the original bugzilla, which intended to add new LLVM toolchain = support[1], also wanted to bring ELF format support with DWARF debugging in= formation. For s= ome reason this did not make its way into EDK II, and we are currently wond= ering, how can one debug binaries built with LLVM 9.0.

For macOS and XCODE5 toolchain we use GDB scripts based on <= /span>Andrei Warkentin=E2=80=99s work, which allow us to i= ntegrate with QEMU and VMware[2]. It is likely that they should work with l= ittle to no work on Linux with CLANG38/GCC5 with GDB once again. However, C= LANGPDB apparently is using PDB debugging information, which I believe is n= ot handled with GDB.

Could you please provide the details on the matter and let us kn= ow about the recommended route?
=E2=80=94 Is dropping = CLANGELF just a temporary measure and it should be resubmitted again?
=
=E2=80=94 Should LLDB, which seems to be aware of PDB, be used instead of G= DB, when building with CLANGPDB? If so, did anybody try that?
<= div class=3D"">

Vi= taly,

I've not tried the CLANGPDB path, but = if you want to connect lldb to QEMU you need to set  plugin.process.gd= b-remote.target-definition-file [1] to [2]. 

[1]  lldb -o "settings set plugin.process.gdb-remote.target= -definition-file x86_64_target_definition.py" -o "gdb-remote 9000"
[2] https://github.com/= llvm-mirror/lldb/blob/master/examples/python/x86_64_target_definition.py




<= /div>
--Apple-Mail=_1DCC97AF-E04C-48EC-8905-4DB5147C5E0E Content-Disposition: attachment; filename=crashes.txt Content-Type: text/plain; x-unix-mode=0644; name="crashes.txt" Content-Transfer-Encoding: quoted-printable E.g. this is what happens when I type =C2=ABb In=C2=BB. I cannot repro= duce it with stock LLDB. (lldb) b In0 lldb 0x0000000102638705 llvm::sys::PrintS= tackTrace(llvm::raw_ostream&) + 37 1 lldb 0x0000000102637d77 llvm::sys::RunSignalHandlers= () + 39 2 lldb 0x0000000102638d58 SignalHandler(int) + 264 3 libsystem_platform.dylib 0x00007fff6ca5642d _sigtramp + 29 4 libsystem_platform.dylib 000000000000000000 _sigtramp + 2472188912 5 LLDB 0x0000000102dbf200 llvm::BinaryStreamReader::Bi= naryStreamReader(llvm::BinaryStream&) + 32 6 LLDB 0x00000001030ba527 llvm::pdb::ModuleDebugStream= Ref::reload() + 39 7 LLDB 0x0000000102d589ff lldb_private::npdb::CompileU= nitIndex::GetOrCreateCompiland(unsigned short) + 319 8 LLDB 0x0000000102d72077 lldb_private::npdb::SymbolFi= leNativePDB::ParseCompileUnitAtIndex(unsigned int) + 119 9 LLDB 0x00000001029cf71d lldb_private::SymbolVendor::= GetCompileUnitAtIndex(unsigned long) + 221 10 LLDB 0x000000010288659a lldb_private::Module::GetCom= pileUnitAtIndex(unsigned long) + 106 11 LLDB 0x000000010289fb10 lldb_private::SearchFilter::= DoCUIteration(std::__1::shared_ptr const&, lldb_priva= te::SymbolContext const&, lldb_private::Searcher&) + 208 12 LLDB 0x000000010289f7b3 lldb_private::SearchFilter::= DoModuleIteration(lldb_private::SymbolContext const&, lldb_private::Searche= r&) + 419 13 LLDB 0x000000010289f5f4 lldb_private::SearchFilter::= Search(lldb_private::Searcher&) + 180 14 LLDB 0x0000000102e5563d lldb_private::CommandComplet= ions::SourceFileCompleter::DoCompletion(lldb_private::SearchFilter*) + 29 15 LLDB 0x0000000102e54c28 lldb_private::CommandComplet= ions::SourceFiles(lldb_private::CommandInterpreter&, lldb_private::Completi= onRequest&, lldb_private::SearchFilter*) + 200 16 LLDB 0x0000000102e555ed lldb_private::CommandComplet= ions::InvokeCommonCompletionCallbacks(lldb_private::CommandInterpreter&, un= signed int, lldb_private::CompletionRequest&, lldb_private::SearchFilter*) = + 93 17 LLDB 0x000000010293b331 lldb_private::CommandObjectR= egexCommand::HandleCompletion(lldb_private::CompletionRequest&) + 33 18 LLDB 0x00000001029310e8 lldb_private::CommandInterpr= eter::HandleCompletionMatches(lldb_private::CompletionRequest&) + 424 19 LLDB 0x000000010293135d lldb_private::CommandInterpr= eter::HandleCompletion(char const*, char const*, char const*, int, int, lld= b_private::StringList&, lldb_private::StringList&) + 349 20 LLDB 0x0000000102871eaa lldb_private::IOHandlerDeleg= ate::IOHandlerComplete(lldb_private::IOHandler&, char const*, char const*, = char const*, int, int, lldb_private::StringList&, lldb_private::StringList&= ) + 90 21 LLDB 0x0000000102872547 lldb_private::IOHandlerEditl= ine::AutoCompleteCallback(char const*, char const*, char const*, int, int, = lldb_private::StringList&, lldb_private::StringList&, void*) + 55 22 LLDB 0x00000001029155fe lldb_private::Editline::TabC= ommand(int) + 110 23 LLDB 0x0000000102917931 lldb_private::Editline::Conf= igureEditor(bool)::$_13::__invoke(editline*, int) + 33 24 libedit.3.dylib 0x00007fff6a3fc7db el_wgets + 484 25 libedit.3.dylib 0x00007fff6a4078bb el_gets + 37 26 LLDB 0x0000000102916df7 lldb_private::Editline::GetL= ine(std::__1::basic_string, std::__1::all= ocator >&, bool&) + 439 27 LLDB 0x00000001028727bc lldb_private::IOHandlerEditl= ine::GetLine(std::__1::basic_string, std:= :__1::allocator >&, bool&) + 60 28 LLDB 0x0000000102872f3e lldb_private::IOHandlerEditl= ine::Run() + 190 29 LLDB 0x000000010285a3cb lldb_private::Debugger::Exec= uteIOHandlers() + 123 30 LLDB 0x000000010293589c lldb_private::CommandInterpr= eter::RunCommandInterpreter(bool, bool, lldb_private::CommandInterpreterRun= Options&) + 156 31 LLDB 0x00000001026deb91 lldb::SBDebugger::RunCommand= Interpreter(bool, bool) + 209 32 lldb 0x0000000102623665 Driver::MainLoop() + 2853 33 lldb 0x00000001026245d2 main + 1634 34 libdyld.dylib 0x00007fff6c85d7fd start + 1 35 libdyld.dylib 0x000000000000000f start + 2474256403 Stack dump: 0. Program arguments: /Applications/Xcode.app/Contents/Developer/usr/bin/l= ldb -o settings set plugin.process.gdb-remote.target-definition-file Script= s/x86_64_target_definition.py -o gdb-remote 8864 -o target modules add -s G= dbSyms/Bin/X64_CLANGPDB/GdbSyms.pdb GdbSyms/Bin/X64_CLANGPDB/GdbSyms.dll -o= command script import Scripts/lldb_uefi.py -o command script add -c lldb_u= efi.ReloadUefi reload-uefi -o reload-uefi -o b DebugBreak=20 ./maclldb.tool: line 33: 37553 Segmentation fault: 11 "$LLDB" -o "settings= set plugin.process.gdb-remote.target-definition-file Scripts/x86_64_target= _definition.py" -o "gdb-remote $LLDB_PORT" -o "target modules add -s GdbSym= s/Bin/X64_CLANGPDB/GdbSyms.pdb GdbSyms/Bin/X64_CLANGPDB/GdbSyms.dll" -o "co= mmand script import Scripts/lldb_uefi.py" -o "command script add -c lldb_ue= fi.ReloadUefi reload-uefi" -o "reload-uefi" -o "b DebugBreak" This I cannot reproduce with stock GDB either: (lldb) p mDebugInfoTableHeader 0 lldb 0x0000000102e13705 llvm::sys::PrintStackTrace(l= lvm::raw_ostream&) + 37 1 lldb 0x0000000102e12d77 llvm::sys::RunSignalHandlers= () + 39 2 lldb 0x0000000102e13d58 SignalHandler(int) + 264 3 libsystem_platform.dylib 0x00007fff6ca5642d _sigtramp + 29 4 libsystem_platform.dylib 0xaae108ecfd74df7c _sigtramp + 2429516652 5 LLDB 0x000000010359e200 llvm::BinaryStreamReader::Bi= naryStreamReader(llvm::BinaryStream&) + 32 6 LLDB 0x0000000103899527 llvm::pdb::ModuleDebugStream= Ref::reload() + 39 7 LLDB 0x00000001035379ff lldb_private::npdb::CompileU= nitIndex::GetOrCreateCompiland(unsigned short) + 319 8 LLDB 0x0000000103540a77 lldb_private::npdb::PdbAstBu= ilder::ParseAllNamespacesPlusChildrenOf(llvm::Optional) + = 663 9 LLDB 0x00000001035414e2 lldb_private::npdb::PdbAstBu= ilder::ParseDeclsForContext(clang::DeclContext&) + 82 10 LLDB 0x0000000103550fef lldb_private::npdb::SymbolFi= leNativePDB::ParseDeclsForContext(lldb_private::CompilerDeclContext) + 63 11 LLDB 0x000000010315604c lldb_private::ClangASTContex= t::DeclContextFindDeclByName(void*, lldb_private::ConstString, bool) + 668 12 LLDB 0x00000001031627b9 lldb_private::CompilerDeclCo= ntext::FindDeclByName(lldb_private::ConstString, bool) + 57 13 LLDB 0x00000001032f1b76 lldb_private::ClangExpressio= nDeclMap::FindExternalVisibleDecls(lldb_private::NameSearchContext&, std::_= _1::shared_ptr, lldb_private::CompilerDeclContext&, u= nsigned int) + 1014 14 LLDB 0x00000001032f1334 lldb_private::ClangExpressio= nDeclMap::FindExternalVisibleDecls(lldb_private::NameSearchContext&) + 628 15 LLDB 0x00000001032e63b6 lldb_private::ClangASTSource= ::FindExternalVisibleDeclsByName(clang::DeclContext const*, clang::Declarat= ionName) + 1174 16 LLDB 0x000000010635e802 clang::DeclContext::lookup(c= lang::DeclarationName) const + 754 17 LLDB 0x0000000105ff1f66 LookupDirect(clang::Sema&, c= lang::LookupResult&, clang::DeclContext const*) + 86 18 LLDB 0x0000000105fee3e9 clang::Sema::CppLookupName(c= lang::LookupResult&, clang::Scope*) + 3257 19 LLDB 0x0000000105ff1795 clang::Sema::LookupName(clan= g::LookupResult&, clang::Scope*, bool) + 725 20 LLDB 0x0000000105d66a63 clang::Sema::ClassifyName(cl= ang::Scope*, clang::CXXScopeSpec&, clang::IdentifierInfo*&, clang::SourceLo= cation, clang::Token const&, bool, std::__1::unique_ptr >) + 419 21 LLDB 0x0000000105b0ac14 clang::Parser::TryAnnotateNa= me(bool, std::__1::unique_ptr >) + 484 22 LLDB 0x0000000105aeb55a clang::Parser::ParseStatemen= tOrDeclarationAfterAttributes(llvm::SmallVector&, clang:= :Parser::AllowedConstructsKind, clang::SourceLocation*, clang::Parser::Pars= edAttributesWithRange&) + 394 23 LLDB 0x0000000105aeb279 clang::Parser::ParseStatemen= tOrDeclaration(llvm::SmallVector&, clang::Parser::Allowe= dConstructsKind, clang::SourceLocation*) + 201 24 LLDB 0x0000000105af263c clang::Parser::ParseCompound= StatementBody(bool) + 1644 25 LLDB 0x0000000105af3131 clang::Parser::ParseFunction= StatementBody(clang::Decl*, clang::Parser::ParseScope&) + 161 26 LLDB 0x0000000105b09780 clang::Parser::ParseFunction= Definition(clang::ParsingDeclarator&, clang::Parser::ParsedTemplateInfo con= st&, clang::Parser::LateParsedAttrList*) + 2608 27 LLDB 0x0000000105a84045 clang::Parser::ParseDeclGrou= p(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::SourceLocation*= , clang::Parser::ForRangeInit*) + 1781 28 LLDB 0x0000000105b08a37 clang::Parser::ParseDeclOrFu= nctionDefInternal(clang::Parser::ParsedAttributesWithRange&, clang::Parsing= DeclSpec&, clang::AccessSpecifier) + 695 29 LLDB 0x0000000105b084e3 clang::Parser::ParseDeclarat= ionOrFunctionDefinition(clang::Parser::ParsedAttributesWithRange&, clang::P= arsingDeclSpec*, clang::AccessSpecifier) + 339 30 LLDB 0x0000000105b06c57 clang::Parser::ParseExternal= Declaration(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSp= ec*) + 2535 31 LLDB 0x0000000105b05d97 clang::Parser::ParseTopLevel= Decl(clang::OpaquePtr&) + 679 32 LLDB 0x0000000105a71855 clang::ParseAST(clang::Sema&= , bool, bool) + 453 33 LLDB 0x0000000105a71672 clang::ParseAST(clang::Prepr= ocessor&, clang::ASTConsumer*, clang::ASTContext&, bool, clang::Translation= UnitKind, clang::CodeCompleteConsumer*, bool) + 194 34 LLDB 0x00000001033094a1 lldb_private::ClangExpressio= nParser::ParseInternal(lldb_private::DiagnosticManager&, clang::CodeComplet= eConsumer*, unsigned int, unsigned int) + 1729 35 LLDB 0x0000000103315793 lldb_private::ClangUserExpre= ssion::Parse(lldb_private::DiagnosticManager&, lldb_private::ExecutionConte= xt&, lldb_private::ExecutionPolicy, bool, bool) + 499 36 LLDB 0x00000001030deaf5 lldb_private::UserExpression= ::Evaluate(lldb_private::ExecutionContext&, lldb_private::EvaluateExpressio= nOptions const&, llvm::StringRef, llvm::StringRef, lldb_private::SharingPtr= &, lldb_private::Status&, unsigned int, std::__1= ::basic_string, std::__1::allocator= >*, std::__1::shared_ptr*) + 1701 37 LLDB 0x0000000103241542 lldb_private::Target::Evalua= teExpression(llvm::StringRef, lldb_private::ExecutionContextScope*, lldb_pr= ivate::SharingPtr&, lldb_private::EvaluateExpres= sionOptions const&, std::__1::basic_string, std::__1::allocator >*) + 418 38 LLDB 0x000000010364dd06 lldb_private::CommandObjectE= xpression::EvaluateExpression(llvm::StringRef, lldb_private::Stream*, lldb_= private::Stream*, lldb_private::CommandReturnObject*) + 566 39 LLDB 0x000000010364ec56 lldb_private::CommandObjectE= xpression::DoExecute(llvm::StringRef, lldb_private::CommandReturnObject&) += 1270 40 LLDB 0x000000010311877b lldb_private::CommandObjectR= aw::Execute(char const*, lldb_private::CommandReturnObject&) + 427 41 LLDB 0x000000010310fd25 lldb_private::CommandInterpr= eter::HandleCommand(char const*, lldb_private::LazyBool, lldb_private::Comm= andReturnObject&, lldb_private::ExecutionContext*, bool, bool) + 2805 42 LLDB 0x0000000103113d61 lldb_private::CommandInterpr= eter::IOHandlerInputComplete(lldb_private::IOHandler&, std::__1::basic_stri= ng, std::__1::allocator >&) + 657 43 LLDB 0x0000000103051f9d lldb_private::IOHandlerEditl= ine::Run() + 285 44 LLDB 0x00000001030393cb lldb_private::Debugger::Exec= uteIOHandlers() + 123 45 LLDB 0x000000010311489c lldb_private::CommandInterpr= eter::RunCommandInterpreter(bool, bool, lldb_private::CommandInterpreterRun= Options&) + 156 46 LLDB 0x0000000102ebdb91 lldb::SBDebugger::RunCommand= Interpreter(bool, bool) + 209 47 lldb 0x0000000102dfe665 Driver::MainLoop() + 2853 48 lldb 0x0000000102dff5d2 main + 1634 49 libdyld.dylib 0x00007fff6c85d7fd start + 1 50 libdyld.dylib 0x000000000000000f start + 2474256403 Stack dump: 0. Program arguments: /Applications/Xcode.app/Contents/Developer/usr/bin/l= ldb -o settings set plugin.process.gdb-remote.target-definition-file Script= s/x86_64_target_definition.py -o gdb-remote 8864 -o target modules add -s G= dbSyms/Bin/X64_CLANGPDB/GdbSyms.pdb GdbSyms/Bin/X64_CLANGPDB/GdbSyms.dll -o= command script import Scripts/lldb_uefi.py -o command script add -c lldb_u= efi.ReloadUefi reload-uefi -o reload-uefi -o b DebugBreak=20 ./maclldb.tool: line 33: 37722 Segmentation fault: 11 "$LLDB" -o "settings= set plugin.process.gdb-remote.target-definition-file Scripts/x86_64_target= _definition.py" -o "gdb-remote $LLDB_PORT" -o "target modules add -s GdbSym= s/Bin/X64_CLANGPDB/GdbSyms.pdb GdbSyms/Bin/X64_CLANGPDB/GdbSyms.dll" -o "co= mmand script import Scripts/lldb_uefi.py" -o "command script add -c lldb_ue= fi.ReloadUefi reload-uefi" -o "reload-uefi" -o "b DebugBreak" --Apple-Mail=_1DCC97AF-E04C-48EC-8905-4DB5147C5E0E-- --Apple-Mail=_31023E76-662B-42F5-90E8-486884B65E56-- --Apple-Mail=_70470479-C16E-41AA-96F6-03AE5C2D084B Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=signature.asc Content-Type: application/pgp-signature; name=signature.asc Content-Description: Message signed with OpenPGP -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEsLABAI5Y5VbvBdmpL8K2O86Eyz4FAl52XqIACgkQL8K2O86E yz7xVBAAiK4LGXTY1vdzKStDTSQLa5f5zkQilZdd8xqK1ym3cIZ2vEuq5EPqfzjo isXDj7vsaMasn2+exWiTMJUA0TP/pzIvT0l8AP0at5fFY00gMjSMiD4BiW8hJc9c HZqcnI0Wf1dMs/e7mnTTiCvrxk11pJPTAYePpVMt+ek/8st+Rko6R4BajSrA9tKf 2xnXXZRdKbEe97FQa2zfKKsVbo88r+RpOpvMlqL/KQICE8XVlWUqzACc/bUwrAAV pkS+gaUtRz1W+8h/TiaqRAfOWNuDgKac/1KJfX27ahKiZm9CJJoA6DaqlrQC172H MCaz/y6bdhrlCERcSYFlHJj4Za9zMFKPMO6ExtBgtmBpAA82tG0bi0iPCAvr58gw 3hr8e5OgpTKGyVdgOld3htpNr1jhAldakQx9s/sWmH28T9DFHm0CqdI7i8Hhqk9N 6ahmEMIiFpxh01k9Sg/rkXFgd75y4Ss/UFwZAOZpgYhnhFg+2MK79Y3UfdBvgBpV bL0iTwrVj31TNUNG/oezqP9bE2Egb25LYf12C3DIC7qdlhTaIIKhQlsp0rkyFwKe ZMz1rIfxTji5RT68AFyfWs3/abASmwcLe1ldDOTsV76l1Ii2iel+RskAjQICnwxQ FHWR3M2W72li6z4AOrkWB6nJosiYLTduNmxG54LRBN8pbCD0CME= =0ha9 -----END PGP SIGNATURE----- --Apple-Mail=_70470479-C16E-41AA-96F6-03AE5C2D084B-- From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from ma1-aaemail-dr-lapp03.apple.com (ma1-aaemail-dr-lapp03.apple.com [17.171.2.72]) by mx.groups.io with SMTP id smtpd.web11.17533.1584824769418249475 for ; Sat, 21 Mar 2020 14:06:10 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@apple.com header.s=20180706 header.b=PUp+oJ9s; spf=pass (domain: apple.com, ip: 17.171.2.72, mailfrom: afish@apple.com) Received: from pps.filterd (ma1-aaemail-dr-lapp03.apple.com [127.0.0.1]) by ma1-aaemail-dr-lapp03.apple.com (8.16.0.27/8.16.0.27) with SMTP id 02LL2BiC010094; Sat, 21 Mar 2020 14:06:07 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=apple.com; h=sender : from : message-id : content-type : mime-version : subject : date : in-reply-to : cc : to : references; s=20180706; bh=yKHSgSXYZaIEBsyvjiJx4JzU1Zqe6B5kE6M9BrEgRsk=; b=PUp+oJ9sqBjMWL3HgtfsBWmBDgSaijoox0SRn/83h5xStwjLPqwYxSpwDlbPAGJNansI lGsRXSLBWNYcsYonHB13wBw98MPLEkdrmWl26sEo1Hwsoy9RK2NP0OdwirAM4BPZw3fx ZToOJeWGcfwCc9SZjpw/ZuiOFxSCmaAQZcRdcZxUhH9oBDU3kjTkotCdLirNiaGLnPfa IBUaVRcKfWrwj0JkAGujJN7GCd0G92zF16BRPTFvQsEn49BaIvgQoefPFNrZA5Vww8s1 pwj8OXeK28gK5l/NRoUv6BzumP8xqaj/HIj1hHoESrLIg1mnvje7sP7LNcOY2p+jYRD5 nQ== Received: from rn-mailsvcp-mta-lapp02.rno.apple.com (rn-mailsvcp-mta-lapp02.rno.apple.com [10.225.203.150]) by ma1-aaemail-dr-lapp03.apple.com with ESMTP id 2ywhwyy1h9-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO); Sat, 21 Mar 2020 14:06:07 -0700 Received: from rn-mailsvcp-mmp-lapp04.rno.apple.com (rn-mailsvcp-mmp-lapp04.rno.apple.com [17.179.253.17]) by rn-mailsvcp-mta-lapp02.rno.apple.com (Oracle Communications Messaging Server 8.1.0.5.20200312 64bit (built Mar 12 2020)) with ESMTPS id <0Q7K00DEDAM6G240@rn-mailsvcp-mta-lapp02.rno.apple.com>; Sat, 21 Mar 2020 14:06:06 -0700 (PDT) Received: from process_milters-daemon.rn-mailsvcp-mmp-lapp04.rno.apple.com by rn-mailsvcp-mmp-lapp04.rno.apple.com (Oracle Communications Messaging Server 8.1.0.5.20200312 64bit (built Mar 12 2020)) id <0Q7K00W009O3HR00@rn-mailsvcp-mmp-lapp04.rno.apple.com>; Sat, 21 Mar 2020 14:06:06 -0700 (PDT) X-Va-A: X-Va-T-CD: 2c323b19c9bf43c24bf8f3f2bb9cbf14 X-Va-E-CD: 36a32cfa42a5ae8aa02473601c03cec7 X-Va-R-CD: d2d46cdd9ed31419d4eb89636f43916d X-Va-CD: 0 X-Va-ID: 503d4f32-cbd8-4dc7-8415-3513d6bf97f7 X-V-A: X-V-T-CD: 2c323b19c9bf43c24bf8f3f2bb9cbf14 X-V-E-CD: 36a32cfa42a5ae8aa02473601c03cec7 X-V-R-CD: d2d46cdd9ed31419d4eb89636f43916d X-V-CD: 0 X-V-ID: 687540b0-297e-48cc-976e-f6b03f89317d X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138,18.0.645 definitions=2020-03-21_09:2020-03-20,2020-03-21 signatures=0 Received: from [17.235.1.56] by rn-mailsvcp-mmp-lapp04.rno.apple.com (Oracle Communications Messaging Server 8.1.0.5.20200312 64bit (built Mar 12 2020)) with ESMTPSA id <0Q7K001F3AM3ZQ50@rn-mailsvcp-mmp-lapp04.rno.apple.com>; Sat, 21 Mar 2020 14:06:05 -0700 (PDT) Sender: afish@apple.com From: "Andrew Fish" Message-id: MIME-version: 1.0 (Mac OS X Mail 13.0 \(3594.4.17\)) Subject: Re: [edk2-devel] CLANGPDB binary debugging Date: Sat, 21 Mar 2020 14:06:03 -0700 In-reply-to: <5C8DD065-0140-428B-A146-999A5694BC99@ispras.ru> Cc: "Gao, Liming" , =?utf-8?Q?Marvin_H=C3=A4user?= To: devel@edk2.groups.io, cheptsov@ispras.ru References: <9804C565-0C9E-4778-92A7-06EA6AD8D694@ispras.ru> <7E18AD8F-9A44-45FE-A8C8-CE06A6328930@apple.com> <63396616-D8CF-4135-B967-772C1E6136BD@apple.com> <5C8DD065-0140-428B-A146-999A5694BC99@ispras.ru> X-Mailer: Apple Mail (2.3594.4.17) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138,18.0.645 definitions=2020-03-21_09:2020-03-20,2020-03-21 signatures=0 Content-type: multipart/alternative; boundary="Apple-Mail=_512E4AC5-7B40-438E-B895-B27522CB28B2" --Apple-Mail=_512E4AC5-7B40-438E-B895-B27522CB28B2 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 > On Mar 21, 2020, at 11:36 AM, Vitaly Cheptsov wrote= : >=20 > Andrew, >=20 > Thanks once again, but unfortunately it is not that simple. Below I answ= ered inline explaining the particular issues, which mostly seem to be speci= fic to CLANGPDB. LLVM stack emits PDB debug files, and even though LLDB doe= s support them to some level, it is unlikely that this will be working well= enough soon. We should really stick to more or less native debug formats, = ideally those that have proper open specifications, on all platforms, and f= or Unix that=E2=80=99s DWARF. >=20 Vitaly, I understand and I use the Xcode clang and not the CLANGPDB, but I use lld= b a lot I was just trying to point out what works with Xcode.=20 > I am pretty sure LLVM can be taught to emit DWARF debug information even= for PE files. Perhaps we can either make some option or provide a separate= toolchain for this? Another way would be recovering CLANGELF as originally= suggested. >=20 There was a bug recently in the x86_64-pc-win32-macho triple and we had t= o add -gdwarf to force it emit dwarf. Not sure what that compiler flag woul= d do to CLANGPDB but it is worth a try? Last flag wins for the compiler.=20 >> You can teach lldb about types. There is some example code here: https:= //github.com/tianocore/edk2/blob/master/EmulatorPkg/Unix/lldbefi.py > This code works just fine with LLDB and DWARF (e.g. XCODE5), though I ha= ve not yet completed these changes for my scripts for LLDB, only for GDB. H= owever, with CLANGPDB generated files it is not functional. The reason for = this is because LLDB is unaware of the underlying type, i.e. it does not kn= ow what is EFI_STATUS or UINT32. I can implement pretty-printing when LLDB = knows about a typedef, but it is not possible to do this when the debug inf= ormation is already gone or not parsed: >=20 > (lldb) p Status > (unsigned long long) $1 =3D 0 > (lldb) p &Status > (unsigned long long *) $2 =3D 0x000000007fe19ad8 > (lldb) p (EFI_STATUS)Status > error: use of undeclared identifier 'EFI_STATUS' >=20 > Just in case I tried using exactly your code, and other stuff like sourc= e level debugging works just fine and symbolication works fine, so it shoul= d be some bug with PDB in particular. >=20 >> That is strange as globals usually work best? The common issue I've see= n is getting the slide wrong. The EFI modules are linked at a value near ze= ro and relocated into memory, so the slide represents that adjustment.=20 >>=20 >> You can use `image dump sections` and ` image dump symtab` to see lldb'= s view of symbols. More info here [1].=20 >=20 > Yes, this one is a bit complicated, once again due to PDB most likely. I= t knows about global symbols, but does not list them in symtab: >=20 > (lldb) image dump symtab > Dumping symbol table for 91 modules. > Symtab, file =3D GdbSyms/Bin/X64_CLANGPDB/GdbSyms.dll, num_symbols =3D 0 > Symtab, file =3D /Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT= _CLANGPDB/X64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll, num_symbols = = =3D 0 > Symtab, file =3D /Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT= _CLANGPDB/X64/MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe/DEBUG/Devi= cePathDxe.dll, num_symbols =3D 0 > =E2=80=A6 >=20 > The slides are correct, but there are two nuances that collide with it. >=20 > 1. There are multiple instances of the globals with the same name (e.g. = gBS), but for some reason LLDB always tries to print the globals from the f= irst module. This happens even when I am source-level debugging, and I see = a gBS symbol from another module (e.g. DxeCore) used right at the same line= . With GDB the closest symbol is used, but with LLDB it is always coming fr= om the first module. I tried checking expr help to find whether I can pass = it a module explicitly, but also failed. >=20 Usually what happens with lldb is you get the global that is in scope for = the current frame.=20 > 2. To be able to get EFI types to locate the EFI_SYSTEM_TABLE_POINTER I= add a dummy GdbSyms image, which is not loaded to the firmware. So basical= ly I cannot slide what is not in the memory, and this is also my first imag= e. I tried deleting it anyhow, but it failed for me. >=20 I've not used the fake image to get things done so I can't speak to that. = I have used a fake target so I could have XIP PEIM and shadowed PEIM addres= s available at the same time. You can't have a module loaded at 2 addresses= at the same time in llldb. But you might be able to use a fake target for = your fake stuff? Just in case: # create a faka target to store info about symbols PeiXipTarget =3D target.debugger.CreateTarget (None, "i386-apple= -macosx", "remote-macosx", True, error) # make sure the gdb-remote connection target is the active targ= et target.debugger.SetSelectedTarget (target) > (lldb) image dump sections > Dumping sections for 91 modules. > Sections for 'GdbSyms/Bin/X64_CLANGPDB/GdbSyms.dll' (x86_64): > SectID Type Load Address P= erm File Off. File Size Flags Section Name > ---------- ---------------- --------------------------------------- -= --- ---------- ---------- ---------- ---------------------------- > 0xffffffffffffffff container [0x0000000000000000-0x000000000000= 6ec0)* --- 0x00000000 0x00000000 0x00000000 GdbSyms.dll. > 0x00000001 code [0x0000000000000220-0x0000000000005bd6)* -= -- 0x00000220 0x000059c0 0x60000020 GdbSyms.dll...text > 0x00000002 data [0x0000000000005be0-0x0000000000006d79)* -= -- 0x00005be0 0x000011a0 0x40000040 GdbSyms.dll...rdata > 0x00000003 data [0x0000000000006d80-0x0000000000006e30)* -= -- 0x00006d80 0x00000060 0xc0000040 GdbSyms.dll...data > 0x00000004 regular [0x0000000000006e40-0x0000000000006ea4)* -= -- 0x00006de0 0x00000080 0x42000040 GdbSyms.dll...reloc > Sections for '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_CL= ANGPDB/X64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll' (x86_64): > SectID Type Load Address P= erm File Off. File Size Flags Section Name > ---------- ---------------- --------------------------------------- -= --- ---------- ---------- ---------- ---------------------------- > 0xffffffffffffffff container [0x0000000000000000-0x000000000005= 23a0)* --- 0x00000000 0x00000000 0x00000000 DxeCore.dll. > 0x00000001 code [0x000000007fe1b220-0x000000007fe61e34) -= -- 0x00000220 0x00046c20 0x60000020 DxeCore.dll...text > 0x00000002 data [0x000000007fe61e40-0x000000007fe68065) -= -- 0x00046e40 0x00006240 0x40000040 DxeCore.dll...rdata > 0x00000003 data [0x000000007fe68080-0x000000007fe6d160) -= -- 0x0004d080 0x000018a0 0xc0000040 DxeCore.dll...data > 0x00000004 regular [0x000000007fe6d160-0x000000007fe6d398) -= -- 0x0004e920 0x00000240 0x42000040 DxeCore.dll...reloc > Sections for '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_CL= ANGPDB/X64/MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe/DEBUG/DeviceP= athDxe.dll' (x86_64): > SectID Type Load Address P= erm File Off. File Size Flags Section Name > ---------- ---------------- --------------------------------------- -= --- ---------- ---------- ---------- ---------------------------- > 0xffffffffffffffff container [0x0000000000000000-0x000000000001= 4420)* --- 0x00000000 0x00000000 0x00000000 DevicePathDxe.dll. > 0x00000001 code [0x000000007f986220-0x000000007f996cc6) -= -- 0x00000220 0x00010ac0 0x60000020 DevicePathDxe.dll...text > 0x00000002 data [0x000000007f996ce0-0x000000007f999b04) -= -- 0x00010ce0 0x00002e40 0x40000040 DevicePathDxe.dll...rdata > 0x00000003 data [0x000000007f999b20-0x000000007f99a1a2) -= -- 0x00013b20 0x00000660 0xc0000040 DevicePathDxe.dll...data > 0x00000004 regular [0x000000007f99a1c0-0x000000007f99a404) -= -- 0x00014180 0x00000260 0x42000040 DevicePathDxe.dll=E2=80=A6reloc > =E2=80=A6 >=20 > So, all in all, unique global variables work, but there is no way to acc= ess duplicating variables. They either resolve to GdbSyms or just cause a c= rash: >=20 > (lldb) p mDebugInfoTableHeader > (EFI_DEBUG_IMAGE_INFO_TABLE_HEADER) $0 =3D { > UpdateStatus =3D 2 > TableSize =3D 92 > EfiDebugImageInfoTable =3D 0x000000007f814018 > } > (lldb) p gBS > error: Couldn't materialize: couldn't get the value of variable ::gBS: r= ead memory from 0x6df8 failed > error: errored out in DoExecute, couldn't PrepareToExecuteJITExpression > (lldb) p gEfiGlobalVariableGuid > 0 libLLVM.dylib 0x000000010e52ee68 llvm::sys::PrintStackTrac= e(llvm::raw_ostream&) + 40 > 1 libLLVM.dylib 0x000000010e52f262 SignalHandler(int) + 188 > 2 libsystem_platform.dylib 0x00007fff6ca5642d _sigtramp + 29 > ... >=20 If you want to inspect globals I think this logic works to get you data, y= ou would need to print it out etc.=20 SBValueList =3D lldb.target.FindGlobalVariables ("gST", 1024) for SBValue in SBValueList: Module =3D SBValue.GetAddress().GetModule()=20 ModuleStr =3D SBValue.GetAddress().GetModule().GetFileSpec().GetFi= lename() Start =3D int (SBValue.GetLocation(), 0) End =3D Start + SBValue.GetByteSize() - 1 SBDeclaration =3D SBValue.GetDeclaration() Column =3D SBDeclaration.GetColumn() I wrote a command in the early days to dump out all the instances of a glo= bal.=20 You can also try (lldb) image lookup -Av --name gST >> You can tell lldb to use the older Python like this (from the Terminal.= app): >> $ defaults write com.apple.dt.lldb DefaultPythonVersion 2 >=20 > Thanks, that helped quite a bit, but for some reason Xcode version still= crashes more for me. I attached a couple of stack traces if you feel like = having a look, but once again it seems that it is all about the PDB plugin. >=20 >> For the macOS API clang emits frame pointers, so you can walk the stack= without symbols. You could try adding the compiler flag to emit the frame = pointers.=20 >=20 This is easy enough to check as %rpb is the frame pointer so it will get s= aved/restored on function entry/exit.=20 > I am pretty sure stack frames are not disabled with UEFI, as sometimes b= acktracing works just fine. To me it looks like debug information parsing r= andomly breaks in LLDB, and once it happens it forgets about other images: >=20 > (lldb) b CoreLocateHandleBuffer > Breakpoint 2: where =3D DxeCore.dll`CoreLocateHandleBuffer + 31 at Locat= e.c:649, address =3D 0x000000007fe36e4f > (lldb) c > Process 1 resuming > Process 1 stopped > * thread #1, stop reason =3D breakpoint 2.1 > frame #0: 0x000000007fe36e4f DxeCore.dll`CoreLocateHandleBuffer(Sear= chType=3DByProtocol, Protocol=3D0x000000007f978160, SearchKey=3D0x000000000= 0000000, NumberHandles=3D0x000000007fe19fd8, Buffer=3D0x000000007fe19fc0) a= t Locate.c:649 > 646 =09 EFI_STATUS Status; > 647 =09 UINTN BufferSize; > 648 =09 > -> 649 =09 if (NumberHandles =3D=3D NULL) { > 650 =09 return EFI_INVALID_PARAMETER; > 651 =09 } > 652 =09 > (lldb) bt > * thread #1, stop reason =3D breakpoint 2.1 > * frame #0: 0x000000007fe36e4f DxeCore.dll`CoreLocateHandleBuffer(Sear= chType=3DByProtocol, Protocol=3D0x000000007f978160, SearchKey=3D0x000000000= 0000000, NumberHandles=3D0x000000007fe19fd8, Buffer=3D0x000000007fe19fc0) a= t Locate.c:649 > frame #1: 0x000000007fe36816 DxeCore.dll`CoreLocateDevicePath(Protoc= ol=3D0x000000007f978160, DevicePath=3D0x000000007fe1a060, Device=3D0x000000= 007fe1a068) at Locate.c:466 > frame #2: 0x000000007f97479a SecurityStubDxe.dll >=20 > =E2=80=94=E2=80=94=E2=80=94 >=20 > (lldb) b CopyMem > Breakpoint 3: 70 locations. > (lldb) c > Process 1 resuming > Process 1 stopped > * thread #1, stop reason =3D breakpoint 2.53 3.53 > frame #0: 0x000000007e5c13b3 MnpDxe.dll`CopyMem(DestinationBuffer=3D= 0x000000007fe19b50, SourceBuffer=3D0x000000007e2aa470, Length=3D656) at Cop= yMemWrapper.c:47 > 44 IN UINTN Length > 45 ) > 46 { > -> 47 if (Length =3D=3D 0) { > 48 return DestinationBuffer; > 49 } > 50 ASSERT ((Length - 1) <=3D (MAX_ADDRESS - (UINTN)DestinationBuf= fer)); > (lldb) bt > * thread #1, stop reason =3D breakpoint 2.53 3.53 > * frame #0: 0x000000007e5c13b3 MnpDxe.dll`CopyMem(DestinationBuffer=3D= 0x000000007fe19b50, SourceBuffer=3D0x000000007e2aa470, Length=3D656) at Cop= yMemWrapper.c:47 > (lldb) finish > error: Could not create return address breakpoint. > (lldb) n > Process 1 stopped > * thread #1, stop reason =3D step over > frame #0: 0x000000007e5c13ce MnpDxe.dll`CopyMem(DestinationBuffer=3D= 0x000000007fe19b50, SourceBuffer=3D0x000000007e2aa470, Length=3D656) at Cop= yMemWrapper.c:50 > 47 if (Length =3D=3D 0) { > 48 return DestinationBuffer; > 49 } > -> 50 ASSERT ((Length - 1) <=3D (MAX_ADDRESS - (UINTN)DestinationBuf= fer)); > 51 ASSERT ((Length - 1) <=3D (MAX_ADDRESS - (UINTN)SourceBuffer))= ; > 52 =09 > 53 if (DestinationBuffer =3D=3D SourceBuffer) { > (lldb) > ... > Process 1 stopped > * thread #1, stop reason =3D step over > frame #0: 0x000000007e5c14b4 MnpDxe.dll`CopyMem(DestinationBuffer=3D= 0x000000007fe19b50, SourceBuffer=3D0x000000007e2aa470, Length=3D656) at Cop= yMemWrapper.c:57 > 54 return DestinationBuffer; > 55 } > 56 return InternalMemCopyMem (DestinationBuffer, SourceBuffer, Le= ngth); > -> 57 } > (lldb) > Process 1 stopped > * thread #1, stop reason =3D step over > frame #0: 0x000000007e5c726e MnpDxe.dll > -> 0x7e5c726e: mov rax, qword ptr [rsp + 0x60] > 0x7e5c7273: cmp byte ptr [rax + 0x68], 0x0 > 0x7e5c7277: jne 0x7e5c7291 > 0x7e5c727d: movabs rax, -0x7fffffffffffffed > (lldb) bt > * thread #1, stop reason =3D step over > * frame #0: 0x000000007e5c726e MnpDxe.dll=20 >=20 > =E2=80=94=E2=80=94=E2=80=94 >=20 > (lldb) c > Process 1 resuming > Process 1 stopped > * thread #1, stop reason =3D signal SIGINT > frame #0: 0x000000007fe4d72e DxeCore.dll > -> 0x7fe4d72e: cmp al, 0x0 > 0x7fe4d730: je 0x7fe4d765 > 0x7fe4d736: mov rcx, qword ptr [rsp + 0x20] > 0x7fe4d73b: call 0x7fe4c4b0 > (lldb) bt > * thread #1, stop reason =3D signal SIGINT > * frame #0: 0x000000007fe4d72e DxeCore.dll >=20 >> On macOS the Mach-O and dSYM have a UUID (dwarfdump -u) that is indexed= by Spotlight (mdfind "com_apple_xcode_dsym_uuids =3D=3D *") [2] >> This should be the UUID in the debug directory entry and you can use th= at to lookup the symbols like this: >>=20 >> module =3D target.AddModule (None, None, uuid) >> SBError =3D target.SetModuleLoadAddress (module, LoadAddress + TeAdjust= ) >>=20 >> Also lldb has built in help for commands, but it is kind of terse since= it is autogenerated from the C++ swig.=20 >> (lldb) script help (lldb.target.AddModule) >> Help on method AddModule in module lldb: >>=20 >> AddModule(self, *args) method of lldb.SBTarget instance >> AddModule(SBTarget self, SBModule module) -> bool >> AddModule(SBTarget self, char const * path, char const * triple, ch= ar const * uuid) -> SBModule >> AddModule(SBTarget self, char const * path, char const * triple, ch= ar const * uuid_cstr, char const * symfile) -> SBModule >> AddModule(SBTarget self, SBModuleSpec module_spec) -> SBModule >>=20 >> The minimum you need to symbolicate a frame is uuid, LoadAddress, and = PC.=20 >>=20 >> [1] http://lldb.llvm.org/use/map.html >> [2] http://lldb.llvm.org/use/symbols.html > Thanks for the links again. Yes, I am using some of these, and in fact f= or GDB that=E2=80=99s pretty much what I did when I worked with XCODE5. It = is very likely that when I get to complete LLDB support for XCODE5 it will = work quite fine too. But I am already happy with XCODE5 here, and making it= even better will only help myself, but not other people with e.g. Linux or= people that want me to use the same compiler with them. >=20 Thanks for looking out for others.=20 Thanks, Andrew Fish > Best regards, > Vitaly >=20 >=20 >> 21 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0=B2 20:13, Andrew Fi= sh > =D0=BD=D0=B0=D0=BF=D0=B8=D1= =81=D0=B0=D0=BB(=D0=B0): >>=20 >>=20 >>=20 >>> On Mar 21, 2020, at 3:28 AM, Vitaly Cheptsov > wrote: >>>=20 >>> Hello, >>>=20 >>> Andrey, thanks for the hint, it was very helpful. I rewrote the GDB sc= ripts to work with LLDB[1] and was able to debug OVMF built with CLANGPDB. = While it is still quite dirty, at the very least it works. >>>=20 >>> Unfortunately the experience was close to terrible. I may certainly do= something wrong, but it is clear that PDB and LLDB do not support each oth= er well enough. After spending several hours on playing with the tools my c= onclusion is that LLDB is simply not suited for UEFI PDB debugging, and we = really want DWARF as there is no other opensource debugger that supports P= DB on macOS and Linux >>>=20 >>> In case somebody knows workarounds here are the issues I faced: >>>=20 >>> 1. All integer alias typedefs are discarded in favour of underlying ty= pes. This way EFI_STATUS and EFI_TPL become unsigned long long, CHAR8 becom= es char, and CHAR16 becomes unsigned short. It does not look like LLDB has = the original types anywhere at all, and it also does not have them register= ed. >>>=20 >>> frame #0: 0x000000007fe242aa DxeCore.dll`CoreAllocatePoolPagesI(Po= olType=3DEfiBootServicesData, NoPages=3D1, Granularity=3D4096, NeedGuard=3D= '\0') at Pool.c:322 >>> 319 =09 return NULL; >>> 320 =09 } >>> 321 =09 >>> -> 322 =09 Buffer =3D CoreAllocatePoolPages (PoolType, NoPages, Granu= larity, NeedGuard); >>> 323 =09 CoreReleaseMemoryLock (); >>> 324 =09 >>> 325 =09 if (Buffer !=3D NULL) { >>> (lldb) p Status >>> (unsigned long long) $3 =3D 0 >>>=20 >>> Structures work more or less fine, but for simpler types like strings = we are out of even potential pretty-printing. >>>=20 >>=20 >> Vitaly, >>=20 >> You can teach lldb about types. There is some example code here: https:= //github.com/tianocore/edk2/blob/master/EmulatorPkg/Unix/lldbefi.py >>> 2. Global variables are not accessible. I am not sure what happens, bu= t they either seem to not relocate or conflict with the other names: >>>=20 >>> (lldb) p gST >>> error: Couldn't materialize: couldn't get the value of variable ::gST:= read memory from 0x6e18 failed >>> error: errored out in DoExecute, couldn't PrepareToExecuteJITExpressio= n >>> (lldb) p &gST >>> error: Couldn't materialize: couldn't get the value of variable ::gST:= read memory from 0x6e18 failed >>> error: errored out in DoExecute, couldn't PrepareToExecuteJITExpressio= n >>>=20 >>=20 >> That is strange as globals usually work best? The common issue I've see= n is getting the slide wrong. The EFI modules are linked at a value near ze= ro and relocated into memory, so the slide represents that adjustment.=20 >>=20 >> You can use `image dump sections` and ` image dump symtab` to see lldb'= s view of symbols. More info here [1].=20 >>=20 >>> 3. Quite a number of crashes. >>>=20 >>> In most cases autocompletion by tab press causes a crash. E.g. >>>=20 >>> b I >>>=20 >>> So will do printing of a GUID, e.g. p gEfiGlobalVariableGuid. >>>=20 >>> This may have to do with Python compatibility as Xcode 11 LLDB that us= es Python 3 generally crashes more often than MacPorts LLDB 9.0. Surprising= ly structures work more or less fine. >>>=20 >>=20 >> You can tell lldb to use the older Python like this (from the Terminal.= app): >> $ defaults write com.apple.dt.lldb DefaultPythonVersion 2 >>=20 >>> 4. Ctrl+C does not produce a valid backtrace. When I break with a brea= kpoint, I see a proper stacktrace with more than one entry, with function p= rototypes and values. When I break with Ctrl+C I only see some weird backtr= ace with most of the entries missing regardless of frame position: >>>=20 >>> (lldb) bt >>> * thread #1, stop reason =3D signal SIGTRAP >>> * frame #0: 0x000000007fe4c5f3 DxeCore.dll >>>=20 >>> Probably more and all the unintuitive stuff like the lack of more func= tional TUI, but it is hard to remember all the trials. >>>=20 >>=20 >> For the macOS API clang emits frame pointers, so you can walk the stack= without symbols. You could try adding the compiler flag to emit the frame = pointers.=20 >>=20 >>=20 >>> [1] https://github.com/acidanthera/OpenCorePkg/blob/master/Debug/Scrip= ts/lldb_uefi.py >>>=20 >>=20 >> On macOS the Mach-O and dSYM have a UUID (dwarfdump -u) that is indexed= by Spotlight (mdfind "com_apple_xcode_dsym_uuids =3D=3D *") [2] >> This should be the UUID in the debug directory entry and you can use th= at to lookup the symbols like this: >>=20 >> module =3D target.AddModule (None, None, uuid) >> SBError =3D target.SetModuleLoadAddress (module, LoadAddress + TeAdjust= ) >>=20 >> Also lldb has built in help for commands, but it is kind of terse since= it is autogenerated from the C++ swig.=20 >> (lldb) script help (lldb.target.AddModule) >> Help on method AddModule in module lldb: >>=20 >> AddModule(self, *args) method of lldb.SBTarget instance >> AddModule(SBTarget self, SBModule module) -> bool >> AddModule(SBTarget self, char const * path, char const * triple, ch= ar const * uuid) -> SBModule >> AddModule(SBTarget self, char const * path, char const * triple, ch= ar const * uuid_cstr, char const * symfile) -> SBModule >> AddModule(SBTarget self, SBModuleSpec module_spec) -> SBModule >>=20 >> The minimum you need to symbolicate a frame is uuid, LoadAddress, and = PC.=20 >>=20 >> [1] http://lldb.llvm.org/use/map.html >> [2] http://lldb.llvm.org/use/symbols.html >>=20 >> Thanks, >>=20 >> Andrew Fish >>=20 >>=20 >>> Best wishes, >>> Vitaly >>>=20 >>>> 20 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0=B2 22:14, Andrew = Fish > =D0=BD=D0=B0=D0=BF=D0=B8=D1= = =81=D0=B0=D0=BB(=D0=B0): >>>>=20 >>>>=20 >>>>=20 >>>>> On Mar 20, 2020, at 8:13 AM, Vitaly Cheptsov > wrote: >>>>>=20 >>>>> Hello, >>>>>=20 >>>>> We noticed that the original bugzilla, which intended to add new LLV= M toolchain support[1], also wanted to bring ELF format support with DWARF = debugging information. For some reason this did not make its way into EDK I= I, and we are currently wondering, how can one debug binaries built with LL= VM 9.0. >>>>>=20 >>>>> For macOS and XCODE5 toolchain we use GDB scripts based on Andrei Wa= rkentin=E2=80=99s work, which allow us to integrate with QEMU and VMware[2]= . It is likely that they should work with little to no work on Linux with C= LANG38/GCC5 with GDB once again. However, CLANGPDB apparently is using PDB = debugging information, which I believe is not handled with GDB. >>>>>=20 >>>>> Could you please provide the details on the matter and let us know a= bout the recommended route? >>>>> =E2=80=94 Is dropping CLANGELF just a temporary measure and it shoul= d be resubmitted again? >>>>> =E2=80=94 Should LLDB, which seems to be aware of PDB, be used inste= ad of GDB, when building with CLANGPDB? If so, did anybody try that? >>>>>=20 >>>>=20 >>>> Vitaly, >>>>=20 >>>> I've not tried the CLANGPDB path, but if you want to connect lldb to = QEMU you need to set plugin.process.gdb-remote.target-definition-file [1] = to [2].=20 >>>>=20 >>>> [1] lldb -o "settings set plugin.process.gdb-remote.target-definitio= n-file x86_64_target_definition.py" -o "gdb-remote 9000" >>>> [2] https://github.com/llvm-mirror/lldb/blob/master/examples/python/x= 86_64_target_definition.py >>>>=20 >>>> Thanks, >>>>=20 >>>> Andrew Fish >>>>=20 >>>>> Thanks! >>>>>=20 >>>>> Best regards, >>>>> Vitaly >>>>>=20 >>>>> [1] https://bugzilla.tianocore.org/show_bug.cgi?id=3D1603 >>>>> [2] https://github.com/acidanthera/OpenCorePkg/blob/master/Debug/Scr= ipts/gdb_uefi.py >>>>>=20 >>>=20 >=20 >=20 > --Apple-Mail=_512E4AC5-7B40-438E-B895-B27522CB28B2 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8

On Mar 21, 2= 020, at 11:36 AM, Vitaly Cheptsov <cheptsov@ispras.ru> wrote:

Andrew,

Thanks once again, but unfortunately it is not that simple. Below I answered inline e= xplaining the particular issues, which mostly seem to be specific to CLANGPDB. LLVM stack emits PDB debug fil= es, and even though LLDB does support them to some level, it is unlikely th= at this will be working well enough soon. We should really stick to more or= less native debug formats, ideally those that have proper open specificati= ons, on all platforms, and for Unix that=E2=80=99s DWARF.

=

Vitaly,

= I understand and I use the Xcode clang and not the CLANGPDB, but I use lldb= a lot I was just trying to point out what works with Xcode. 


=
I am pretty sure LL= VM can be taught to emit DWARF debug information even for PE files. Perhaps= we can either make some option or provide a separate toolchain for this? A= nother way would be recovering CLANGELF as originally suggested.

=

There was a bug recently in the &n= bsp;x86_64-pc-win32-macho triple and we had to add -gdwarf to force it= emit dwarf. Not sure what that compiler flag would do to CLANGPDB but it i= s worth a try? Last flag wins for the compiler. 
=

You can teach lldb about types. Th= ere is some example code here: https://github.co= m/tianocore/edk2/blob/master/EmulatorPkg/Unix/lldbefi.py

This code works just fine with LLD= B and DWARF (e.g. XCODE5), though I have not yet completed these changes fo= r my scripts for LLDB, only for GDB. However, with CLANGPDB generated files= it is not functional. The reason for this is because LLDB is unaware of th= e underlying type, i.e. it does not know what is EFI_STATUS or UINT32. I ca= n implement pretty-printing when LLDB knows about a typedef, but it is not = possible to do this when the debug information is already gone or not parse= d:

(lldb) p Status
(unsigned l= ong long) $1 =3D 0
(lldb) p &Status
(unsign= ed long long *) $2 =3D 0x000000007fe19ad8
(lldb) p (EFI_STATU= S)Status
error: use of undeclared identifier 'EFI_STATUS'

J= ust in case I tried using exactly your code, and other stuff like source le= vel debugging works just fine and symbolication works fine, so it should be= some bug with PDB in particular.

That is s= trange as globals usually work best? The common issue I've seen is getting = the slide wrong. The EFI modules are linked at a value near zero and reloca= ted into memory, so the slide represents that adjustment. 

You can use `image dump sect= ions` and ` image dump symtab` to see lldb's view of symbols. More inf= o here [1]. 

Ye= s, this one is a bit complicated, once again due to PDB most likely. It kno= ws about global symbols, but does not list them in symtab:

(lldb) image dump symtabDumping symbol table for 91 modules.
Symtab, fil= e =3D GdbSyms/Bin/X64_CLANGPDB/GdbSyms.dll, num_symbols =3D 0
Symtab, file =3D /Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_C= LANGPDB/X64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll, num_symbols = =3D 0
Symtab, file =3D /Users/user/Documents/UefiWorkspace/B= uild/OvmfX64/NOOPT_CLANGPDB/X64/MdeModulePkg/Universal/DevicePathDxe/Device= PathDxe/DEBUG/DevicePathDxe.dll, num_symbols =3D 0
=E2= = =80=A6

The slide= s are correct, but there are two nuances that collide with it.

1. There are multiple instanc= es of the globals with the same name (e.g. gBS), but for some reason LLDB a= lways tries to print the globals from the first module. This happens even w= hen I am source-level debugging, and I see a gBS symbol from another module= (e.g. DxeCore) used right at the same line. With GDB the closest symbol is= used, but with LLDB it is always coming from the first module. I tried che= cking expr help to find whether I can pass it a module explicitly, but also= failed.


Usually what happens with lldb is you get t= he global that is in scope for the current frame. 

2.  To be able to get EFI types to= locate the EFI_SYSTEM_TABLE_POINTER I add a dummy GdbSyms image, which is = not loaded to the firmware. So basically I cannot slide what is not in the = memory, and this is also my first image. I tried deleting it anyhow, but it= failed for me.


I've not used the fake image to get = things done so I can't speak to that. I have used a fake target so I could = have XIP PEIM and shadowed PEIM address available at the same time. You can= 't have a module loaded at 2 addresses at the same time in llldb. But you m= ight be able to use a fake target for your fake stuff?

Just in case:

&n= bsp;         # create a faka target to store info about= symbols
          PeiXipTarget =3D targ= et.debugger.CreateTarget (None, "i386-apple-macosx", "remote-macosx", True,= error)

        &nb= sp; # make sure the gdb-remote  connection target is the active target=
          target.debugger.SetSelectedTa= rget (target)


(lldb) image dump sections
Dumping sections for 91 modules.
Sections for '= GdbSyms/Bin/X64_CLANGPDB/GdbSyms.dll' (x86_64):
  S= ectID     Type           =   Load Address             &nb= sp;               Perm File Off.&nb= sp; File Size  Flags      Section Name  ---------- ---------------- ----------------------= -----------------  ---- ---------- ---------- ---------- --------= --------------------
  0xffffffffffffffff container=         [0x0000000000000000-0x0000000000006ec0)* -= --  0x00000000 0x00000000 0x00000000 GdbSyms.dll.
&= nbsp; 0x00000001 code            &n= bsp;[0x0000000000000220-0x0000000000005bd6)* ---  0x00000220 0x00= 0059c0 0x60000020 GdbSyms.dll...text
  0x00000002 d= ata             [0x0000000000005be0= -0x0000000000006d79)* ---  0x00005be0 0x000011a0 0x40000040 GdbSy= ms.dll...rdata
  0x00000003 data    =         [0x0000000000006d80-0x0000000000006e30)* = ---  0x00006d80 0x00000060 0xc0000040 GdbSyms.dll...data
  0x00000004 regular         &nbs= p;[0x0000000000006e40-0x0000000000006ea4)* ---  0x00006de0 0x0000= 0080 0x42000040 GdbSyms.dll...reloc
Sections for '/Users/user= /Documents/UefiWorkspace/Build/OvmfX64/NOOPT_CLANGPDB/X64/MdeModulePkg/Core= /Dxe/DxeMain/DEBUG/DxeCore.dll' (x86_64):
  SectID&= nbsp;    Type            =  Load Address               &n= bsp;             Perm File Off. &nb= sp;File Size  Flags      Section Name
  ---------- ---------------- ----------------------------= -----------  ---- ---------- ---------- ---------- --------------= --------------
  0xffffffffffffffff container =       [0x0000000000000000-0x00000000000523a0)* ---&nbs= p; 0x00000000 0x00000000 0x00000000 DxeCore.dll.
 &= nbsp;0x00000001 code             [0= x000000007fe1b220-0x000000007fe61e34)  ---  0x00000220 = 0x00046c20 0x60000020 DxeCore.dll...text
  0x000000= 02 data             [0x000000007fe6= 1e40-0x000000007fe68065)  ---  0x00046e40 0x00006240 0x= 40000040 DxeCore.dll...rdata
  0x00000003 data = ;            [0x000000007fe68080-0x00000= 0007fe6d160)  ---  0x0004d080 0x000018a0 0xc0000040 Dxe= Core.dll...data
  0x00000004 regular    &= nbsp;     [0x000000007fe6d160-0x000000007fe6d398)  = ;---  0x0004e920 0x00000240 0x42000040 DxeCore.dll...reloc
Sections for '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOO= PT_CLANGPDB/X64/MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe/DEBUG/De= vicePathDxe.dll' (x86_64):
  SectID   &nb= sp; Type             Load Addr= ess                   &nb= sp;         Perm File Off.  File Size&nb= sp; Flags      Section Name
 &n= bsp;---------- ---------------- ---------------------------------------&nbs= p; ---- ---------- ---------- ---------- ----------------------------<= br class=3D"">  0xffffffffffffffff container      =   [0x0000000000000000-0x0000000000014420)* ---  0x00000= 000 0x00000000 0x00000000 DevicePathDxe.dll.
  0x00= 000001 code             [0x00000000= 7f986220-0x000000007f996cc6)  ---  0x00000220 0x00010ac= 0 0x60000020 DevicePathDxe.dll...text
  0x00000002 = data             [0x000000007f996ce= 0-0x000000007f999b04)  ---  0x00010ce0 0x00002e40 0x400= 00040 DevicePathDxe.dll...rdata
  0x00000003 data&n= bsp;            [0x000000007f999b20-0x00= 0000007f99a1a2)  ---  0x00013b20 0x00000660 0xc0000040 = DevicePathDxe.dll...data
  0x00000004 regular =         [0x000000007f99a1c0-0x000000007f99a404)&n= bsp; ---  0x00014180 0x00000260 0x42000040 DevicePathDxe.dll= = =E2=80=A6reloc
=E2=80=A6

So, all in all, unique global variables work, but th= ere is no way to access duplicating variables. They either resolve to GdbSy= ms or just cause a crash:

(lldb) p mDebugInfoTableHeader
(EFI_DEBUG_IMAGE= _INFO_TABLE_HEADER) $0 =3D {
  UpdateStatus =3D 2  TableSize =3D 92
  EfiDebu= gImageInfoTable =3D 0x000000007f814018
}
(lldb)=  p gBS
error: Couldn't materialize: couldn't get the val= ue of variable ::gBS: read memory from 0x6df8 failed
error: e= rrored out in DoExecute, couldn't PrepareToExecuteJITExpression
(lldb) p gEfiGlobalVariableGuid
0  libLLVM.= dylib            0x000000010e52ee68 llvm= ::sys::PrintStackTrace(llvm::raw_ostream&) + 40
1 &n= bsp;libLLVM.dylib            0x000000010= e52f262 SignalHandler(int) + 188
2  libsystem_platf= orm.dylib 0x00007fff6ca5642d _sigtramp + 29
...


<= /div>
If you want to inspect globals I think this logic works to get yo= u data, you would need to print it out etc. 

=
SBValueList =3D lldb.target.FindGlobalVariables ("gST", 1024)
for SBValue in SBValueList:
Module =3D SBValue.GetAddress().GetM= odule() 
        ModuleStr =3D SBValue.G= etAddress().GetModule().GetFileSpec().GetFilename()
&n= bsp;       Start =3D int (SBValue.GetLocation(), 0)
        End =3D Start + SBValue.GetByteSiz= e() - 1
        = SBDeclaration =3D SBValue.GetDeclaration()
        Column =3D SBDeclaration.GetColumn()

I wrote a command in the early days to dump out all = the instances of a global. 

=
You can also try (lldb) image lookup -Av --name gST
You can tell lldb to use the older Python like thi= s (from the Terminal.app):
$ defaults write com.a= pple.dt.lldb DefaultPythonVersion 2

=
Thanks, that helped quite a bit, but for some reason Xcode = version still crashes more for me. I attached a couple of stack traces if y= ou feel like having a look, but once again it seems that it is all about th= e PDB plugin.

For the macOS API clang e= mits frame pointers, so you can walk the stack without symbols. You could t= ry adding the compiler flag to emit the frame pointers. 


This is easy enough to c= heck as %rpb is the frame pointer so it will get saved/restored on function= entry/exit. 

I am pretty sure stack frames are not disabled with UEFI, as = sometimes backtracing works just fine. To me it looks like debug informatio= n parsing randomly breaks in LLDB, and once it happens it forgets about oth= er images:

(lldb)=  b CoreLocateHandleBuffer
Breakpoint 2: where =3D DxeCor= e.dll`CoreLocateHandleBuffer + 31 at Locate.c:649, address =3D 0x000000007f= e36e4f
(lldb) c
Process 1 resuming
Process 1 stopped
* thread #1, stop reason =3D br= eakpoint 2.1
    frame #0: 0x000000007fe3= 6e4f DxeCore.dll`CoreLocateHandleBuffer(SearchType=3DByProtocol, Proto= col=3D0x000000007f978160, SearchKey=3D0x0000000000000000, NumberHandles=3D0= x000000007fe19fd8, Buffer=3D0x000000007fe19fc0) at Locate.c:649   646    EFI_STATUS       = ;   Status;
   647    UINTN &n= bsp;             BufferSize;
   648 
-> 649    if (NumberHandles = =3D=3D NULL) {
   650      return = EFI_INVALID_PARAMETER;
   651    }
   652 
(lldb) bt
* thread #= 1, stop reason =3D breakpoint 2.1
  * frame #0= : 0x000000007fe36e4f DxeCore.dll`CoreLocateHandleBuffer(SearchTyp= e=3DByProtocol, Protocol=3D0x000000007f978160, SearchKey=3D0x00000000000000= 00, NumberHandles=3D0x000000007fe19fd8, Buffer=3D0x000000007fe19fc0) a= t Locate.c:649
    frame #1: 0x00000= 0007fe36816 DxeCore.dll`CoreLocateDevicePath(Protocol=3D0x000000007f97= 8160, DevicePath=3D0x000000007fe1a060, Device=3D0x000000007fe1a068) at = ;Locate.c:466
    frame #2: 0x000000007f9= 7479a SecurityStubDxe.dll

=E2=80=94=E2=80=94=E2=80=94

(lldb) b CopyMem
Breakpoint 3: 70 locations.(lldb) c
Process 1 resuming
Pr= ocess 1 stopped
* thread #1, stop reason =3D breakpoint = 2.53 3.53
    frame #0: 0x000000007e5c13b= 3 MnpDxe.dll`CopyMem(DestinationBuffer=3D0x000000007fe19b50, SourceBuf= fer=3D0x000000007e2aa470, Length=3D656) at CopyMemWrapper.c:47
   44     IN UINTN      &nb= sp;Length
   45     )
&nbs= p;  46   {
-> 47     if (Length =3D= =3D 0) {
   48       return&n= bsp;DestinationBuffer;
   49     }
   50     ASSERT ((Length - 1) <= =3D (MAX_ADDRESS - (UINTN)DestinationBuffer));
(lldb) b= t
* thread #1, stop reason =3D breakpoint 2.53 3.53
  * frame #0: 0x000000007e5c13b3 MnpDxe.dll`C= opyMem(DestinationBuffer=3D0x000000007fe19b50, SourceBuffer=3D0x000000007e2= aa470, Length=3D656) at CopyMemWrapper.c:47
(lldb) = finish
error: Could not create return address breakpoint.
(lldb) n
Process 1 stopped
* th= read #1, stop reason =3D step over
    fr= ame #0: 0x000000007e5c13ce MnpDxe.dll`CopyMem(DestinationBuffer= =3D0x000000007fe19b50, SourceBuffer=3D0x000000007e2aa470, Length=3D656) at=  CopyMemWrapper.c:50
   47     if&n= bsp;(Length =3D=3D 0) {
   48      =  return DestinationBuffer;
   49 &nb= sp;  = ; }
-> 50     ASSERT ((Length - 1) &l= t;=3D (MAX_ADDRESS - (UINTN)DestinationBuffer));
   = ;51   =   ASSERT ((Length - 1) <=3D (MAX_ADDRESS - (UINTN)= SourceBuffer));
   52  
  &nbs= p;53  =   if (DestinationBuffer =3D=3D SourceBuffer) {
(lldb)  
...
Process 1 stopp= ed
* thread #1, stop reason =3D step over
=     frame #0: 0x000000007e5c14b4 MnpDxe.dll`CopyMe= m(DestinationBuffer=3D0x000000007fe19b50, SourceBuffer=3D0x000000007e2aa470= , Length=3D656) at CopyMemWrapper.c:57
   54&n= bsp;      return DestinationBuffer;
  &n= bsp;55     56     return=  InternalMemCopyMem (DestinationBuffer, SourceBuffer, Length);
-> 57   }
(lldb)  
Process= 1 stopped
* thread #1, stop reason =3D step over
    frame #0: 0x000000007e5c726e MnpDxe.dl= l
->  0x7e5c726e: mov    rax, qwo= rd ptr [rsp + 0x60]
    0x7e5c7273: cmp  =   byte ptr [rax + 0x68], 0x0
    0x7= e5c7277: jne    0x7e5c7291
    = 0x7e5c727d: movabs rax, -0x7fffffffffffffed
(lldb) bt* thread #1, stop reason =3D step over
  * frame #0: 0x000000007e5c726e MnpDxe.dll&= nbsp;

=E2= =80=94=E2=80=94=E2=80=94

(lldb) c
Process 1 resuming
Proce= ss 1 stopped
* thread #1, stop reason =3D signal SIGINT<= br class=3D"">    frame #0: 0x000000007fe4d72e Dxe= Core.dll
->  0x7fe4d72e: cmp    a= l, 0x0
    0x7fe4d730: je    &n= bsp;0x7fe4d765
    0x7fe4d736: mov   = ; rcx, qword ptr [rsp + 0x20]
    0x7fe4d= 73b: call   0x7fe4c4b0
(lldb) bt
* thread #1, stop reason =3D signal SIGINT
 =  * frame #0: 0x000000007fe4d72e DxeCore.dll

On macOS the Mach-O and dSYM have a UUID (dwarfdump = -u) that is indexed by Spotlight (mdfind "com_apple_xcode_dsym_uuids =3D=3D= *") [2]
This should be the UUID in the debug director= y entry and you can use that to lookup the symbols like this:

module =3D target.AddModule (N= one, None, uuid)
SBError =3D target.SetModuleLoadAddre= ss (module, LoadAddress + TeAdjust)

Also lldb has built in help for commands, but it is kind= of terse since it is autogenerated from the C++ swig. 
(lldb) script help (lldb.target.AddModule)
Help on method AddModule in module lldb:

AddModule(s= elf, *args) method of lldb.SBTarget instance
    AddModule(SBTarget self, SBModule modu= le) -> bool
  =   AddModule(SBTarget self, char const * path, char const * triple, cha= r const * uuid) -> SBModule
    AddModule(SBTarget self, char const * path, char con= st * triple, char const * uuid_cstr, char const * symfile) -> SBModule
    AddModule= (SBTarget self, SBModuleSpec module_spec) -> SBModule

The minimum  you ne= ed to symbolicate a frame is uuid, LoadAddress, and PC. 
<= /div>


Thanks for the links ag= ain. Yes, I am using some of these, and in fact for GDB that=E2=80=99s pret= ty much what I did when I worked with XCODE5. It is very likely that when I= get to complete LLDB support for XCODE5 it will work quite fine too. But I= am already happy with XCODE5 here, and making it even better will only hel= p myself, but not other people with e.g. Linux or people that want me to us= e the same compiler with them.


Thanks for looking ou= t for others. 

Thanks,
<= br class=3D"">
Andrew Fish

Best regards,
Vitaly


<= /div>
2= 1 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0=B2 20:13, Andrew Fish &l= t;afish@apple.com> =D0= = =BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB(=D0=B0):



<= div class=3D"">On Mar 21, 2020, at 3:28 AM, Vitaly Cheptsov <cheptsov@ispras.ru> wrote:
Hello,

Andrey, thanks for the hint, it was very hel= pful. I rewrote the GDB scripts to work with LLDB[1] and was able to debug = OVMF built with CLANGPDB. While it is still quite dirty, at the very least = it works.

Unfortunately the experience was c= lose to terrible. I may certainly do something wrong, but it is clear that = PDB and LLDB do not support each other well enough. After spending several = hours on playing with the tools my conclusion is that LLDB is simply not su= ited for UEFI PDB debugging, and we really want DWARF  as there is no = other opensource debugger that supports PDB on macOS and Linux

In case somebody knows workarounds here are the issues = I faced:

=
1. All integer alias typedefs are d= iscarded in favour of underlying types. This way EFI_STATUS and EFI_TPL bec= ome unsigned long long, CHAR8 becomes char, and CHAR16 becomes unsigned sho= rt. It does not look like LLDB has the original types anywhere at all, and = it also does not have them registered.

 = ;   frame #0: 0x000000007fe242aa DxeCore.dll`CoreAlloca= tePoolPagesI(PoolType=3DEfiBootServicesData, NoPages=3D1, Granularity=3D409= 6, NeedGuard=3D'\0') at Pool.c:322
   319 = ;   =   return NULL;
   320    }
   321 
-> 322    Buffer =3D CoreA= llocatePoolPages (PoolType, NoPages, Granularity, NeedGuard);
   323    CoreReleaseMemoryLock ();
  &= nbsp;324  <= /span>
   325    if (Buffer !=3D NULL) {=
(lldb) p Status
(unsigned long long) $3 = =3D 0

Structures work more or less fine, but for simpler types l= ike strings we are out of even potential pretty-printing.

=

Vitaly,

You can te= ach lldb about types. There is some example code here: https://github.com/tianocore/edk2/blob/master/EmulatorPkg/Unix/lldbe= fi.py

2. Glo= bal variables are not accessible. I am not sure what happens, but they eith= er seem to not relocate or conflict with the other names:

(lldb) p gST
error: Couldn't materia= lize: couldn't get the value of variable ::gST: read memory from 0x6e18 fai= led
error: errored out in DoExecute, couldn't PrepareToExecut= eJITExpression
(lldb) p &gST
error: Co= uldn't materialize: couldn't get the value of variable ::gST: read memory f= rom 0x6e18 failed
error: errored out in DoExecute, couldn't P= repareToExecuteJITExpression
<= br class=3D"">

That is st= range as globals usually work best? The common issue I've seen is getting t= he slide wrong. The EFI modules are linked at a value near zero and relocat= ed into memory, so the slide represents that adjustment. 

You can use `image dump sections` and ` image dump= symtab` to see lldb's view of symbols. More info here [1]. 

3. Quite a number of cras= hes.

In most cases autocompletion by tab pre= ss causes a crash. E.g.

b I<TAB>
=

So will do printing of a GUID, e.g. p gEfiGlobalVar= iableGuid.

This may have to do with Python compatibility as Xcode 11 = LLDB that uses Python 3 generally crashes more often than MacPorts LLDB 9.0= . Surprisingly structures work more or less fine.


You can tell lldb to use the older Python like this (fr= om the Terminal.app):
$ d= efaults write com.apple.dt.lldb DefaultPythonVersion 2

<= div class=3D"" style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; = font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight= : normal; letter-spacing: normal; text-align: start; text-indent: 0px; text= -transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stro= ke-width: 0px; text-decoration: none;">4. Ctrl+C does not produce a valid backtrac= e. When I break with a breakpoint, I see a proper stacktrace with more than= one entry, with function prototypes and values. When I break with Ctrl+C I= only see some weird backtrace with most of the entries missing regardless = of frame position:

(lldb) bt
* thread #1, stop re= ason =3D signal SIGTRAP
  * frame #0: 0x0= 00000007fe4c5f3 DxeCore.dll

Probably more and all the unintuitive stuff like the lack of more= functional TUI, but it is hard to remember all the trials.


For the macOS API clang emits frame pointers= , so you can walk the stack without symbols. You could try adding the compi= ler flag to emit the frame pointers. 

<= br class=3D"">

=
On macOS the Mach-O and dSYM = have a UUID (dwarfdump -u) that is indexed by Spotlight (mdfind "com_apple_= xcode_dsym_uuids =3D=3D *") [2]

module =3D= target.AddModule (None, None, uuid)
SBError =3D target.SetModuleLoadAddress (module, LoadAddress + TeAdj= ust)

Also lldb has built in help for command= s, but it is kind of terse since it is autogenerated from the C++ swig.&nbs= p;
(lldb) script help (lldb.target.AddModule)
=
Help on method AddModule in module= lldb:

= Add= Module(self, *args) method of lldb.SBTarget instance
    AddModule(SBTarget self, SBMo= dule module) -> bool
    AddModule(SBTarget self, char const * pa= th, char const * triple, char const * uuid_cstr, char const * symfile) ->= ; SBModule
  &nbs= p; AddModule(SBTarget self, SBModuleSpec module_spec) -> SBModule=

The minimum &= nbsp;you need to symbolicate a frame is uuid, LoadAddress, and PC. 
Best wishes,
Vitaly

20 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0= =B2 22:14, Andrew Fish <a= fish@apple.com> =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB(=D0=B0):<= /div>


On Mar 20, 2020, at 8:13 AM, Vitaly= Cheptsov <cheptsov@isp= ras.ru> wrote:

Hello,

We noticed that the original bugzilla, which intende= d to add new LLVM toolchain support[1], also wanted to bring ELF format sup= port with DWARF debugging information. For some reason this did not make its way into EDK I= I, and we are currently wondering, how can one debug binaries built with LL= VM 9.0.

For macOS and XCODE5 toolchain we use= GDB scripts based on Andrei Warkentin=E2=80= =99s work, which allow us to integrate with QEMU and VMware[2]. It is like= ly that they should work with little to no work on Linux with CLANG38/GCC5 = with GDB once again. However, CLANGPDB apparently is using PDB debugging in= formation, which I believe is not handled with GDB.

Could you please provide the de= tails on the matter and let us know about the recommended route?
=E2=80=94 Is dropping CLANGELF just a temporary measure and it s= hould be resubmitted again?
=E2=80=94 Should LLDB, which seems to be = aware of PDB, be used instead of GDB, when building with CLANGPDB? If so, d= id anybody try that?


Vitaly,

I've= not tried the CLANGPDB path, but if you want to connect lldb to QEMU you n= eed to set  plugin.process.gdb-remote.target-definition-file [1] to [2= ]. 

=
[1]  lldb -o "settings se= t plugin.process.gdb-remote.target-definition-file x86_64_target_definition= .py" -o "gdb-remote 9000"



<crashes.tx= t>
--Apple-Mail=_512E4AC5-7B40-438E-B895-B27522CB28B2-- From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.ispras.ru (mail.ispras.ru [83.149.199.45]) by mx.groups.io with SMTP id smtpd.web10.48777.1584954619651030177 for ; Mon, 23 Mar 2020 02:10:20 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: ispras.ru, ip: 83.149.199.45, mailfrom: cheptsov@ispras.ru) Received: from [127.0.0.1] (unknown [77.232.9.83]) by mail.ispras.ru (Postfix) with ESMTPSA id D30C6653; Mon, 23 Mar 2020 12:10:15 +0300 (MSK) From: "Vitaly Cheptsov" Message-Id: <3D39F81F-6EBC-4079-8FC0-0112D756F0EB@ispras.ru> Mime-Version: 1.0 (Mac OS X Mail 13.0 \(3608.60.0.2.5\)) Subject: Re: [edk2-devel] CLANGPDB binary debugging Date: Mon, 23 Mar 2020 12:10:14 +0300 In-Reply-To: Cc: devel@edk2.groups.io, =?utf-8?Q?Marvin_H=C3=A4user?= To: Andrew Fish , "Gao, Liming" References: <9804C565-0C9E-4778-92A7-06EA6AD8D694@ispras.ru> <7E18AD8F-9A44-45FE-A8C8-CE06A6328930@apple.com> <63396616-D8CF-4135-B967-772C1E6136BD@apple.com> <5C8DD065-0140-428B-A146-999A5694BC99@ispras.ru> X-Mailer: Apple Mail (2.3608.60.0.2.5) X-Groupsio-MsgNum: 56100 Content-Type: multipart/signed; boundary="Apple-Mail=_750CC4C3-238E-4A77-B88F-D079B932DB45"; protocol="application/pgp-signature"; micalg=pgp-sha512 --Apple-Mail=_750CC4C3-238E-4A77-B88F-D079B932DB45 Content-Type: multipart/alternative; boundary="Apple-Mail=_3A9DFBBC-1A3D-40F3-A555-21D0D51CC107" --Apple-Mail=_3A9DFBBC-1A3D-40F3-A555-21D0D51CC107 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Andrew, I investigated further and was able to make some progress. I got rid of PD= B, and changed debug information generation to DWARF[1]. This resolved most= of LLDB crashes and made pretty-printing work just fine as type aliases li= ke EFI_STATUS now work correctly (I am still to commit this). Unfortunately= there are several downsides. Dead code stripping in LLD linker is broken w= hen generating PE with DWARF, so I had to patch it[2]. Debug link implement= ation in llvm-objcopy is also quite ugly, we do not get MTOC or anything al= ike[3], just some section with a random name containing base filename. I can submit a more proper patch to EDK II properly implementing CLANGDWAR= F toolchain instead of patching CLANGPDB like in [1], but it is questionabl= e whether it is worth it. LLVM 10 will land very soon, and the necessary LL= D patches[2] will definitely not make their way in this release. We will ha= ve to wait for LLVM 11 at the very least, and I am not sure I am ready to d= rive llvm-objcopy changes either. Liming, what do you think? > I've not used the fake image to get things done so I can't speak to that= . I have used a fake target so I could have XIP PEIM and shadowed PEIM addr= ess available at the same time. You can't have a module loaded at 2 address= es at the same time in llldb. But you might be able to use a fake target fo= r your fake stuff? >=20 > Just in case: >=20 > # create a faka target to store info about symbols > PeiXipTarget =3D target.debugger.CreateTarget (None, "i386-app= le-macosx", "remote-macosx", True, error) >=20 > # make sure the gdb-remote connection target is the active ta= rget > target.debugger.SetSelectedTarget (target) Yes, that was actually a smart idea. I initially did it that way, as I had= mixing Mach-O and PE triples, but later removed, which was actually a mist= ake. Now I have a fake target for GdbSyms and a proper target for other ima= ges[4]. This somewhat solves the issue with invalid addresses for gST, as g= ST from DxeCore is now picked. However, I cannot access global variables fr= om other modules for some reason still. > If you want to inspect globals I think this logic works to get you data,= you would need to print it out etc. >=20 > SBValueList =3D lldb.target.FindGlobalVariables ("gST", 1024) > for SBValue in SBValueList: > =09Module =3D SBValue.GetAddress().GetModule() > ModuleStr =3D SBValue.GetAddress().GetModule().GetFileSpec().Get= Filename() > Start =3D int (SBValue.GetLocation(), 0) > End =3D Start + SBValue.GetByteSize() - 1 > SBDeclaration =3D SBValue.GetDeclaration() > Column =3D SBDeclaration.GetColumn() >=20 > I wrote a command in the early days to dump out all the instances of a g= lobal. >=20 > You can also try (lldb) image lookup -Av --name gST Something is really weird, gST from the first image shows, but lldb believ= es that it does not exist. lldb.target.FindGlobalVariables ("gST", 1024) al= so returns an empty list. I noticed that LLDB shows invalid type for gST in the symtab, there also i= s no address. I started to wonder whether this is the cause and decided to = check XCODE5, as the the issue could have been with PE format. Unfortunatel= y even after I tried XCODE5 support with LLDB, I got exactly the same probl= em. I am quite clueless what is going on. Below I included two transcripts:= for CLANGDWARF and XCODE5. (lldb) p gST (EFI_SYSTEM_TABLE *) $0 =3D 0x000000007f9ee018 (lldb) p *gST (EFI_SYSTEM_TABLE) $1 =3D { Hdr =3D (Signature =3D 0x5453595320494249, Revision =3D 0x00020046, Head= erSize =3D 0x00000078, CRC32 =3D 0x3d5e9b5d, Reserved =3D 0x00000000) FirmwareVendor =3D 0x000000007f9e9c98 FirmwareRevision =3D 0x00010000 ConsoleInHandle =3D 0x000000007ed58f18 ConIn =3D 0x000000007e6edcb8 ConsoleOutHandle =3D 0x000000007ed57018 ConOut =3D 0x000000007e6ede40 StandardErrorHandle =3D 0x000000007ed57a98 StdErr =3D 0x000000007e6ee030 RuntimeServices =3D 0x000000007f9eeb98 BootServices =3D 0x000000007fe689e8 NumberOfTableEntries =3D 0x000000000000000a ConfigurationTable =3D 0x000000007f9eec98 } (lldb) image lookup -Av --name gST (lldb) image dump sections Dumping sections for 90 modules. Sections for '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_CLAN= GPDB/X64/DxeCore.debug' (x86_64): SectID Type Load Address Per= m File Off. File Size Flags Section Name ---------- ---------------- --------------------------------------- ---= - ---------- ---------- ---------- ---------------------------- 0xffffffffffffffff container [0x000000007fe1b000-0x000000007ff38a= c0) --- 0x00000000 0x00000000 0x00000000 DxeCore.debug. 0x00000001 code [0x000000007fe1b320-0x000000007fe61f34) ---= 0x00000320 0x00046c20 0x60000020 DxeCore.debug...text 0x00000002 data [0x000000007fe61f40-0x000000007fe680f1) ---= 0x00046f40 0x000061c0 0x40000040 DxeCore.debug...rdata 0x00000003 data [0x000000007fe68100-0x000000007fe6d1e0) ---= 0x0004d100 0x000018a0 0xc0000040 DxeCore.debug...data 0x00000004 regular [0x000000007fe6d1e0-0x000000007fe6d424) ---= 0x0004e9a0 0x00000260 0x42000040 DxeCore.debug...reloc 0x00000005 dwarf-abbrev [0x000000007fe6d440-0x000000007fe74059) ---= 0x0004ec00 0x00006c20 0x42000040 DxeCore.debug...debug_abbrev 0x00000006 dwarf-info [0x000000007fe74060-0x000000007fec1355) ---= 0x00055820 0x0004d300 0x42000040 DxeCore.debug...debug_info 0x00000007 dwarf-line [0x000000007fec1360-0x000000007fef9fd4) ---= 0x000a2b20 0x00038c80 0x42000040 DxeCore.debug...debug_line 0x00000008 dwarf-macinfo [0x000000007fef9fe0-0x000000007fefa056) ---= 0x000db7a0 0x00000080 0x42000040 DxeCore.debug...debug_macinfo 0x00000009 dwarf-ranges [0x000000007fefa060-0x000000007feff610) ---= 0x000db820 0x000055c0 0x42000040 DxeCore.debug...debug_ranges 0x0000000a dwarf-str [0x000000007feff620-0x000000007ff38abd) ---= 0x000e0de0 0x000394a0 0x42000040 DxeCore.debug...debug_str Sections for '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_CLAN= GPDB/X64/DevicePathDxe.debug' (x86_64): SectID Type Load Address Per= m File Off. File Size Flags Section Name ---------- ---------------- --------------------------------------- ---= - ---------- ---------- ---------- ---------------------------- 0xffffffffffffffff container [0x000000007f986000-0x000000007f9cb0= a0) --- 0x00000000 0x00000000 0x00000000 DevicePathDxe.debug. 0x00000001 code [0x000000007f986320-0x000000007f996dc6) ---= 0x00000320 0x00010ac0 0x60000020 DevicePathDxe.debug...text 0x00000002 data [0x000000007f996de0-0x000000007f999b75) ---= 0x00010de0 0x00002da0 0x40000040 DevicePathDxe.debug...rdata 0x00000003 data [0x000000007f999b80-0x000000007f99a202) ---= 0x00013b80 0x00000660 0xc0000040 DevicePathDxe.debug...data 0x00000004 regular [0x000000007f99a220-0x000000007f99a464) ---= 0x000141e0 0x00000260 0x42000040 DevicePathDxe.debug...reloc 0x00000005 dwarf-abbrev [0x000000007f99a480-0x000000007f99bd09) ---= 0x00014440 0x000018a0 0x42000040 DevicePathDxe.debug...debug_abbrev 0x00000006 dwarf-info [0x000000007f99bd20-0x000000007f9ad8b7) ---= 0x00015ce0 0x00011ba0 0x42000040 DevicePathDxe.debug...debug_info 0x00000007 dwarf-line [0x000000007f9ad8c0-0x000000007f9bc1f7) ---= 0x00027880 0x0000e940 0x42000040 DevicePathDxe.debug...debug_line 0x00000008 dwarf-macinfo [0x000000007f9bc200-0x000000007f9bc223) ---= 0x000361c0 0x00000040 0x42000040 DevicePathDxe.debug...debug_macinfo 0x00000009 dwarf-ranges [0x000000007f9bc240-0x000000007f9be020) ---= 0x00036200 0x00001de0 0x42000040 DevicePathDxe.debug...debug_ranges 0x0000000a dwarf-str [0x000000007f9be020-0x000000007f9cb099) ---= 0x00037fe0 0x0000d080 0x42000040 DevicePathDxe.debug...debug_str =E2=80=A6 (lldb) image dump symtab Dumping symbol table for 90 modules. Symtab, file =3D /Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_C= LANGPDB/X64/DxeCore.debug, num_symbols =3D 4343: Debug symbol |Synthetic symbol ||Externally Visible ||| Index UserID DSX Type File Address/Value Load Address S= ize Flags Name ------- ------ --- --------------- ------------------ ------------------ -= ----------------- ---------- ---------------------------------- [ 0] 4294967295 Invalid 0x0000000000000000 0x000000007fe1b0= 00 0x000000000000003a 0x00000000 .text [ 1] 4294967295 Invalid 0x0000000000000000 = 0x0000000000000000 0x00000000 .data [ 2] 4294967295 Invalid 0x0000000000001898 = 0x0000000000000000 0x00000000 .bss [ 3] 4294967295 Invalid 0x0000000000046bc0 0x000000007fe61b= c0 0x0000000000000374 0x00000000 .text$_ModuleEntryPoint [ 4] 4294967295 Code 0x0000000000046bc0 0x000000007fe61b= c0 0x0000000000000374 0x00000000 _ModuleEntryPoint [ 5] 4294967295 Invalid 0x0000000000001b08 = 0x0000000000000000 0x00000000 .bss$gHobList [ 6] 4294967295 Invalid 0x0000000000001b08 = 0x0000000000000000 0x00000000 gHobList [ 7] 4294967295 Invalid 0x0000000000000000 = 0x0000000000000000 0x00000000 .rdata [ 8] 4294967295 Invalid 0x0000000000000000 = 0x0000000000000000 0x00000000 .str [ 9] 4294967295 Invalid 0x0000000000000058 = 0x0000000000000000 0x00000000 .rdata [ 10] 4294967295 Invalid 0x0000000000000058 = 0x0000000000000000 0x00000000 .str.1 [ 11] 4294967295 Invalid 0x0000000000000000 = 0x0000000000000000 0x00000000 .debug_str [ 12] 4294967295 Invalid 0x0000000000000000 = 0x0000000000000000 0x00000000 .debug_abbrev [ 13] 4294967295 Invalid 0x0000000000000000 = 0x0000000000000000 0x00000000 .debug_info [ 14] 4294967295 Invalid 0x0000000000000000 = 0x0000000000000000 0x00000000 .debug_ranges [ 15] 4294967295 Invalid 0x0000000000000000 = 0x0000000000000000 0x00000000 .debug_macinfo [ 16] 4294967295 Invalid 0x0000000000000000 = 0x0000000000000000 0x00000000 .debug_line [ 17] 4294967295 Code 0x000000000003f680 0x000000007fe5a6= 80 0x0000000000000020 0x00000000 ProcessModuleEntryPointList [ 18] 4294967295 Code 0x0000000000023130 0x000000007fe3e1= 30 0x0000000000000020 0x00000000 DebugAssertEnabled [ 19] 4294967295 Code 0x0000000000023060 0x000000007fe3e0= 60 0x00000000000000d0 0x00000000 DebugAssert [ 20] 4294967295 Code 0x0000000000022150 0x000000007fe3d1= 50 0x0000000000000020 0x00000000 CpuDeadLoop [ 21] 4294967295 Invalid 0x0000000000000000 0x000000007fe1b0= 00 0x000000000000003a 0x00000000 .text [ 22] 4294967295 Invalid 0x0000000000000000 = 0x0000000000000000 0x00000000 .data [ 23] 4294967295 Invalid 0x0000000000001898 = 0x0000000000000000 0x00000000 .bss [ 24] 4294967295 Invalid 0x000000000003f240 0x000000007fe5a2= 40 0x0000000000000440 0x00000000 .text$ProcessLibraryConstructorList [ 25] 4294967295 Code 0x000000000003f240 0x000000007fe5a2= 40 0x0000000000000440 0x00000000 ProcessLibraryConstructorList [ 26] 4294967295 Invalid 0x000000000003f680 0x000000007fe5a6= 80 0x0000000000000020 0x00000000 .text$ProcessModuleEntryPointList [ 27] 4294967295 Invalid 0x0000000000000070 = 0x0000000000000000 0x00000000 .data$gEfiCallerIdGuid [ 28] 4294967295 Invalid 0x0000000000000070 = 0x0000000000000000 0x00000000 gEfiCallerIdGuid [ 29] 4294967295 Invalid 0x0000000000000148 = 0x0000000000000000 0x00000000 .data$gEfiEventMemoryMapChangeGuid [ 30] 4294967295 Invalid 0x0000000000000148 = 0x0000000000000000 0x00000000 gEfiEventMemoryMapChangeGuid [ 31] 4294967295 Invalid 0x0000000000000168 = 0x0000000000000000 0x00000000 .data$gEfiEventVirtualAddressChangeGuid [ 32] 4294967295 Invalid 0x0000000000000168 = 0x0000000000000000 0x00000000 gEfiEventVirtualAddressChangeGuid [ 33] 4294967295 Invalid 0x0000000000000138 = 0x0000000000000000 0x00000000 .data$gEfiEventExitBootServicesGuid [ 34] 4294967295 Invalid 0x0000000000000138 = 0x0000000000000000 0x00000000 gEfiEventExitBootServicesGuid =E2=80=A6. [ 303] 4294967295 Invalid 0x0000000000001b60 = 0x0000000000000000 0x00000000 .bss$gST [ 304] 4294967295 Invalid 0x0000000000001b60 = 0x0000000000000000 0x00000000 gST [ 305] 4294967295 Invalid 0x00000000000018a0 = 0x0000000000000000 0x00000000 .bss$gBS [ 306] 4294967295 Invalid 0x00000000000018a0 = 0x0000000000000000 0x00000000 gBS =E2=80=A6 =E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94= =E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94 (lldb) p gST (EFI_SYSTEM_TABLE *) $2 =3D 0x000000007fbee018 (lldb) p &gST (EFI_SYSTEM_TABLE **) $4 =3D 0x000000007fe6d788 (lldb) p *gST (EFI_SYSTEM_TABLE) $3 =3D { Hdr =3D (Signature =3D 0x5453595320494249, Revision =3D 0x00020046, Head= erSize =3D 0x00000078, CRC32 =3D 0x5355dbe2, Reserved =3D 0x00000000) FirmwareVendor =3D 0x000000007fbe9c98 FirmwareRevision =3D 0x00010000 ConsoleInHandle =3D 0x000000007ede5a98 ConIn =3D 0x000000007e95f640 ConsoleOutHandle =3D 0x000000007ede4e98 ConOut =3D 0x000000007e95f800 StandardErrorHandle =3D 0x000000007ede4b98 StdErr =3D 0x000000007e95f910 RuntimeServices =3D 0x000000007fbeeb98 BootServices =3D 0x000000007fe6cde8 NumberOfTableEntries =3D 0x0000000000000009 ConfigurationTable =3D 0x000000007fbeec98 } (lldb) image lookup -Av --name gST (lldb) image dump sections Dumping sections for 88 modules. Sections for '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_XCOD= E5/X64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll' (x86_64): SectID Type Load Address Per= m File Off. File Size Flags Section Name ---------- ---------------- --------------------------------------- ---= - ---------- ---------- ---------- ---------------------------- 0x00000100 container [0x000000007fe26240-0x000000007fe6bb40) r-x= 0x000004a0 0x00045900 0x00000000 DxeCore.dll.__TEXT 0x00000001 code [0x000000007fe26240-0x000000007fe65bd8) r-x= 0x000004a0 0x0003f998 0x80000400 DxeCore.dll.__TEXT.__text 0x00000002 data-cstr [0x000000007fe65bd8-0x000000007fe6ba23) r-x= 0x0003fe38 0x00005e4b 0x00000002 DxeCore.dll.__TEXT.__cstring 0x00000003 regular [0x000000007fe6ba24-0x000000007fe6ba6c) r-x= 0x00045c84 0x00000048 0x00000000 DxeCore.dll.__TEXT.__ustring 0x00000004 regular [0x000000007fe6ba70-0x000000007fe6bb40) r-x= 0x00045cd0 0x000000d0 0x00000000 DxeCore.dll.__TEXT.__const 0x00000200 container [0x000000007fe6bb40-0x000000007fe70e60) rw-= 0x00045da0 0x00001ae0 0x00000000 DxeCore.dll.__DATA 0x00000005 regular [0x000000007fe6bb40-0x000000007fe6bd58) rw-= 0x00045da0 0x00000218 0x00000000 DxeCore.dll.__DATA.__const 0x00000006 data [0x000000007fe6bd60-0x000000007fe6d610) rw-= 0x00045fc0 0x000018b0 0x00000000 DxeCore.dll.__DATA.__data 0x00000007 zero-fill [0x000000007fe6d610-0x000000007fe70e20) rw-= 0x00000000 0x00000000 0x00000001 DxeCore.dll.__DATA.__common 0x00000008 zero-fill [0x000000007fe70e20-0x000000007fe70e58) rw-= 0x00000000 0x00000000 0x00000001 DxeCore.dll.__DATA.__bss 0x00000100 container [0x000000000004b000-0x00000000000ef000)* rw-= 0x00001000 0x000a3a74 0x00000000 DxeCore.dll.__DWARF 0x00000001 dwarf-line [0x000000000004b000-0x00000000000723fb)* rw-= 0x00001000 0x000273fb 0x00000000 DxeCore.dll.__DWARF.__debug_line 0x00000002 dwarf-pubnames [0x00000000000723fb-0x0000000000078429)* rw-= 0x000283fb 0x0000602e 0x00000000 DxeCore.dll.__DWARF.__debug_pubnames 0x00000003 dwarf-pubtypes [0x0000000000078429-0x000000000008b915)* rw-= 0x0002e429 0x000134ec 0x00000000 DxeCore.dll.__DWARF.__debug_pubtypes 0x00000004 dwarf-aranges [0x000000000008b915-0x000000000008ea65)* rw-= 0x00041915 0x00003150 0x00000000 DxeCore.dll.__DWARF.__debug_aranges 0x00000005 dwarf-info [0x000000000008ea65-0x00000000000c78bf)* rw-= 0x00044a65 0x00038e5a 0x00000000 DxeCore.dll.__DWARF.__debug_info 0x00000006 dwarf-frame [0x00000000000c78bf-0x00000000000cc697)* rw-= 0x0007d8bf 0x00004dd8 0x00000000 DxeCore.dll.__DWARF.__debug_frame 0x00000007 dwarf-ranges [0x00000000000cc697-0x00000000000cc757)* rw-= 0x00082697 0x000000c0 0x00000000 DxeCore.dll.__DWARF.__debug_ranges 0x00000008 dwarf-abbrev [0x00000000000cc757-0x00000000000cca9b)* rw-= 0x00082757 0x00000344 0x00000000 DxeCore.dll.__DWARF.__debug_abbrev 0x00000009 dwarf-str [0x00000000000cca9b-0x00000000000dcc05)* rw-= 0x00082a9b 0x0001016a 0x00000000 DxeCore.dll.__DWARF.__debug_str 0x0000000a apple-names [0x00000000000dcc05-0x00000000000e2439)* rw-= 0x00092c05 0x00005834 0x00000000 DxeCore.dll.__DWARF.__apple_names 0x0000000b apple-namespaces [0x00000000000e2439-0x00000000000e245d)* rw-= 0x00098439 0x00000024 0x00000000 DxeCore.dll.__DWARF.__apple_namespac 0x0000000c apple-types [0x00000000000e245d-0x00000000000eea50)* rw-= 0x0009845d 0x0000c5f3 0x00000000 DxeCore.dll.__DWARF.__apple_types 0x0000000d apple-objc [0x00000000000eea50-0x00000000000eea74)* rw-= 0x000a4a50 0x00000024 0x00000000 DxeCore.dll.__DWARF.__apple_objc Sections for '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_XCOD= E5/X64/MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe/DEBUG/DevicePathD= xe.dll' (x86_64): =E2=80=A6 (lldb) image dump symtab Dumping symbol table for 88 modules. Symtab, file =3D /Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_X= CODE5/X64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll, num_symbols =3D = 1203: Debug symbol |Synthetic symbol ||Externally Visible ||| Index UserID DSX Type File Address/Value Load Address S= ize Flags Name ------- ------ --- --------------- ------------------ ------------------ -= ----------------- ---------- ---------------------------------- [ 0] 118 D SourceFile 0x0000000000000000 S= ibling -> [ 20] 0x00640000 /Users/user/Documents/UefiPackages/MdeModulePk= g/Core/Dxe/SectionExtraction/CoreSectionExtraction.c [ 1] 120 D ObjectFile 0x000000005e78588d 0= x0000000000000000 0x00660001 /Users/user/Documents/UefiWorkspace/Build/Ovmf= X64/NOOPT_XCODE5/X64/MdeModulePkg/Core/Dxe/DxeMain/OUTPUT/DxeCore.lib(CoreS= ectionExtraction.obj) [ 2] 122 D X Code 0x0000000000000240 0x000000007fe26240 0= x0000000000000260 0x000f0000 CustomGuidedSectionExtract [ 3] 126 D X Code 0x00000000000004a0 0x000000007fe264a0 0= x0000000000000110 0x000f0000 InitializeSectionExtraction [ 4] 130 D X Code 0x00000000000005b0 0x000000007fe265b0 0= x0000000000000140 0x000f0000 IsValidSectionStream [ 5] 134 D X Code 0x00000000000006f0 0x000000007fe266f0 0= x0000000000000180 0x000f0000 OpenSectionStreamEx [ 6] 138 D X Code 0x0000000000000870 0x000000007fe26870 0= x0000000000000070 0x000f0000 OpenSectionStream [ 7] 142 D X Code 0x00000000000008e0 0x000000007fe268e0 0= x0000000000000100 0x000f0000 ChildIsType =E2=80=A6 [ 831] 2470 D X Code 0x00000000000306b0 0x000000007fe566b0 0= x00000000000000f4 0x000f0000 UefiBootServicesTableLibConstructor [ 832] 2473 D X Data 0x0000000000047780 0x000000007fe6d780 0= x0000000000000008 0x000f0000 gImageHandle [ 833] 2474 D X Data 0x0000000000047788 0x000000007fe6d788 0= x0000000000000008 0x000f0000 gST [ 834] 2475 D X Data 0x0000000000047790 0x000000007fe6d790 0= x0000000000000008 0x000f0000 gBS =E2=80=A6 > This is easy enough to check as %rpb is the frame pointer so it will get= saved/restored on function entry/exit. Actually it is fine. I happened to break in the interrupt routine, which w= as not mapped for a particular image. After I stepped a little, it soon rea= ched the debug symbols: (lldb) bt all * thread #1, stop reason =3D instruction step over * frame #0: 0x000000007fe49f3c DxeCore.dll`CoreRestoreTpl(NewTpl=3D0x000= 0000000000008) at Tpl.c:102:12 frame #1: 0x000000007e518c95 thread #2 frame #0: 0x000000007fb3ff88 CpuDxe.dll`CpuSleep + 1 frame #1: 0x000000007fb4d719 CpuDxe.dll`ApWakeupFunction(ExchangeInfo= =3D0x0000000000087198, ApIndex=3D0x0000000000000001) at MpLib.c:768:9 frame #2: 0x000000007fb2d151 thread #3 frame #0: 0x000000007fb3ff88 CpuDxe.dll`CpuSleep + 1 frame #1: 0x000000007fb4d719 CpuDxe.dll`ApWakeupFunction(ExchangeInfo= =3D0x0000000000087198, ApIndex=3D0x0000000000000002) at MpLib.c:768:9 frame #2: 0x000000007fb2d151 thread #4 frame #0: 0x000000007fb3ff88 CpuDxe.dll`CpuSleep + 1 frame #1: 0x000000007fb4d719 CpuDxe.dll`ApWakeupFunction(ExchangeInfo= =3D0x0000000000087198, ApIndex=3D0x0000000000000003) at MpLib.c:768:9 frame #2: 0x000000007fb2d151 Best wishes, Vitaly [1] https://github.com/acidanthera/OpenCorePkg/blob/7684a9f/Debug/ClangDwa= rf.patch [2] https://bugs.llvm.org/show_bug.cgi?id=3D45273 [3] https://bugs.llvm.org/show_bug.cgi?id=3D45277 [4] https://github.com/acidanthera/OpenCorePkg/commit/3e5f3f3f9a8d3f197834= bbfcf5029f771df89754 > 22 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0=B2 00:06, Andrew Fis= h =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB(=D0=B0): >=20 >=20 >=20 >> On Mar 21, 2020, at 11:36 AM, Vitaly Cheptsov > wrote: >>=20 >> Andrew, >>=20 >> Thanks once again, but unfortunately it is not that simple. Below I ans= wered inline explaining the particular issues, which mostly seem to be spec= ific to CLANGPDB. LLVM stack emits PDB debug files, and even though LLDB do= es support them to some level, it is unlikely that this will be working wel= l enough soon. We should really stick to more or less native debug formats,= ideally those that have proper open specifications, on all platforms, and = for Unix that=E2=80=99s DWARF. >>=20 >=20 > Vitaly, >=20 > I understand and I use the Xcode clang and not the CLANGPDB, but I use l= ldb a lot I was just trying to point out what works with Xcode. >=20 >=20 >> I am pretty sure LLVM can be taught to emit DWARF debug information eve= n for PE files. Perhaps we can either make some option or provide a separat= e toolchain for this? Another way would be recovering CLANGELF as originall= y suggested. >>=20 >=20 > There was a bug recently in the x86_64-pc-win32-macho triple and we had= to add -gdwarf to force it emit dwarf. Not sure what that compiler flag wo= uld do to CLANGPDB but it is worth a try? Last flag wins for the compiler. >=20 >=20 >>> You can teach lldb about types. There is some example code here: https= ://github.com/tianocore/edk2/blob/master/EmulatorPkg/Unix/lldbefi.py >> This code works just fine with LLDB and DWARF (e.g. XCODE5), though I h= ave not yet completed these changes for my scripts for LLDB, only for GDB. = However, with CLANGPDB generated files it is not functional. The reason for= this is because LLDB is unaware of the underlying type, i.e. it does not k= now what is EFI_STATUS or UINT32. I can implement pretty-printing when LLDB= knows about a typedef, but it is not possible to do this when the debug in= formation is already gone or not parsed: >>=20 >> (lldb) p Status >> (unsigned long long) $1 =3D 0 >> (lldb) p &Status >> (unsigned long long *) $2 =3D 0x000000007fe19ad8 >> (lldb) p (EFI_STATUS)Status >> error: use of undeclared identifier 'EFI_STATUS' >>=20 >> Just in case I tried using exactly your code, and other stuff like sour= ce level debugging works just fine and symbolication works fine, so it shou= ld be some bug with PDB in particular. >>=20 >>> That is strange as globals usually work best? The common issue I've se= en is getting the slide wrong. The EFI modules are linked at a value near z= ero and relocated into memory, so the slide represents that adjustment. >>>=20 >>> You can use `image dump sections` and ` image dump symtab` to see lldb= 's view of symbols. More info here [1]. >>=20 >> Yes, this one is a bit complicated, once again due to PDB most likely. = It knows about global symbols, but does not list them in symtab: >>=20 >> (lldb) image dump symtab >> Dumping symbol table for 91 modules. >> Symtab, file =3D GdbSyms/Bin/X64_CLANGPDB/GdbSyms.dll, num_symbols =3D = 0 >> Symtab, file =3D /Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOP= T_CLANGPDB/X64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll, num_symbols= =3D 0 >> Symtab, file =3D /Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOP= T_CLANGPDB/X64/MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe/DEBUG/Dev= icePathDxe.dll, num_symbols =3D 0 >> =E2=80=A6 >>=20 >> The slides are correct, but there are two nuances that collide with it. >>=20 >> 1. There are multiple instances of the globals with the same name (e.g.= gBS), but for some reason LLDB always tries to print the globals from the = first module. This happens even when I am source-level debugging, and I see= a gBS symbol from another module (e.g. DxeCore) used right at the same lin= e. With GDB the closest symbol is used, but with LLDB it is always coming f= rom the first module. I tried checking expr help to find whether I can pass= it a module explicitly, but also failed. >>=20 >=20 > Usually what happens with lldb is you get the global that is in scope fo= r the current frame. >=20 >> 2. To be able to get EFI types to locate the EFI_SYSTEM_TABLE_POINTER = I add a dummy GdbSyms image, which is not loaded to the firmware. So basica= lly I cannot slide what is not in the memory, and this is also my first ima= ge. I tried deleting it anyhow, but it failed for me. >>=20 >=20 > I've not used the fake image to get things done so I can't speak to that= . I have used a fake target so I could have XIP PEIM and shadowed PEIM addr= ess available at the same time. You can't have a module loaded at 2 address= es at the same time in llldb. But you might be able to use a fake target fo= r your fake stuff? >=20 > Just in case: >=20 > # create a faka target to store info about symbols > PeiXipTarget =3D target.debugger.CreateTarget (None, "i386-app= le-macosx", "remote-macosx", True, error) >=20 > # make sure the gdb-remote connection target is the active ta= rget > target.debugger.SetSelectedTarget (target) >=20 >=20 >> (lldb) image dump sections >> Dumping sections for 91 modules. >> Sections for 'GdbSyms/Bin/X64_CLANGPDB/GdbSyms.dll' (x86_64): >> SectID Type Load Address = Perm File Off. File Size Flags Section Name >> ---------- ---------------- --------------------------------------- = ---- ---------- ---------- ---------- ---------------------------- >> 0xffffffffffffffff container [0x0000000000000000-0x00000000000= 06ec0)* --- 0x00000000 0x00000000 0x00000000 GdbSyms.dll. >> 0x00000001 code [0x0000000000000220-0x0000000000005bd6)* = --- 0x00000220 0x000059c0 0x60000020 GdbSyms.dll...text >> 0x00000002 data [0x0000000000005be0-0x0000000000006d79)* = --- 0x00005be0 0x000011a0 0x40000040 GdbSyms.dll...rdata >> 0x00000003 data [0x0000000000006d80-0x0000000000006e30)* = --- 0x00006d80 0x00000060 0xc0000040 GdbSyms.dll...data >> 0x00000004 regular [0x0000000000006e40-0x0000000000006ea4)* = --- 0x00006de0 0x00000080 0x42000040 GdbSyms.dll...reloc >> Sections for '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_C= LANGPDB/X64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll' (x86_64): >> SectID Type Load Address = Perm File Off. File Size Flags Section Name >> ---------- ---------------- --------------------------------------- = ---- ---------- ---------- ---------- ---------------------------- >> 0xffffffffffffffff container [0x0000000000000000-0x00000000000= 523a0)* --- 0x00000000 0x00000000 0x00000000 DxeCore.dll. >> 0x00000001 code [0x000000007fe1b220-0x000000007fe61e34) = --- 0x00000220 0x00046c20 0x60000020 DxeCore.dll...text >> 0x00000002 data [0x000000007fe61e40-0x000000007fe68065) = --- 0x00046e40 0x00006240 0x40000040 DxeCore.dll...rdata >> 0x00000003 data [0x000000007fe68080-0x000000007fe6d160) = --- 0x0004d080 0x000018a0 0xc0000040 DxeCore.dll...data >> 0x00000004 regular [0x000000007fe6d160-0x000000007fe6d398) = --- 0x0004e920 0x00000240 0x42000040 DxeCore.dll...reloc >> Sections for '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_C= LANGPDB/X64/MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe/DEBUG/Device= PathDxe.dll' (x86_64): >> SectID Type Load Address = Perm File Off. File Size Flags Section Name >> ---------- ---------------- --------------------------------------- = ---- ---------- ---------- ---------- ---------------------------- >> 0xffffffffffffffff container [0x0000000000000000-0x00000000000= 14420)* --- 0x00000000 0x00000000 0x00000000 DevicePathDxe.dll. >> 0x00000001 code [0x000000007f986220-0x000000007f996cc6) = --- 0x00000220 0x00010ac0 0x60000020 DevicePathDxe.dll...text >> 0x00000002 data [0x000000007f996ce0-0x000000007f999b04) = --- 0x00010ce0 0x00002e40 0x40000040 DevicePathDxe.dll...rdata >> 0x00000003 data [0x000000007f999b20-0x000000007f99a1a2) = --- 0x00013b20 0x00000660 0xc0000040 DevicePathDxe.dll...data >> 0x00000004 regular [0x000000007f99a1c0-0x000000007f99a404) = --- 0x00014180 0x00000260 0x42000040 DevicePathDxe.dll=E2=80=A6reloc >> =E2=80=A6 >>=20 >> So, all in all, unique global variables work, but there is no way to ac= cess duplicating variables. They either resolve to GdbSyms or just cause a = crash: >>=20 >> (lldb) p mDebugInfoTableHeader >> (EFI_DEBUG_IMAGE_INFO_TABLE_HEADER) $0 =3D { >> UpdateStatus =3D 2 >> TableSize =3D 92 >> EfiDebugImageInfoTable =3D 0x000000007f814018 >> } >> (lldb) p gBS >> error: Couldn't materialize: couldn't get the value of variable ::gBS: = read memory from 0x6df8 failed >> error: errored out in DoExecute, couldn't PrepareToExecuteJITExpression >> (lldb) p gEfiGlobalVariableGuid >> 0 libLLVM.dylib 0x000000010e52ee68 llvm::sys::PrintStackTra= ce(llvm::raw_ostream&) + 40 >> 1 libLLVM.dylib 0x000000010e52f262 SignalHandler(int) + 188 >> 2 libsystem_platform.dylib 0x00007fff6ca5642d _sigtramp + 29 >> ... >>=20 >=20 > If you want to inspect globals I think this logic works to get you data,= you would need to print it out etc. >=20 > SBValueList =3D lldb.target.FindGlobalVariables ("gST", 1024) > for SBValue in SBValueList: > =09Module =3D SBValue.GetAddress().GetModule() > ModuleStr =3D SBValue.GetAddress().GetModule().GetFileSpec().Get= Filename() > Start =3D int (SBValue.GetLocation(), 0) > End =3D Start + SBValue.GetByteSize() - 1 > SBDeclaration =3D SBValue.GetDeclaration() > Column =3D SBDeclaration.GetColumn() >=20 > I wrote a command in the early days to dump out all the instances of a g= lobal. >=20 > You can also try (lldb) image lookup -Av --name gST >=20 >>> You can tell lldb to use the older Python like this (from the Terminal= .app): >>> $ defaults write com.apple.dt.lldb DefaultPythonVersion 2 >>=20 >> Thanks, that helped quite a bit, but for some reason Xcode version stil= l crashes more for me. I attached a couple of stack traces if you feel like= having a look, but once again it seems that it is all about the PDB plugin= . >>=20 >>> For the macOS API clang emits frame pointers, so you can walk the stac= k without symbols. You could try adding the compiler flag to emit the frame= pointers. >>=20 >=20 > This is easy enough to check as %rpb is the frame pointer so it will get= saved/restored on function entry/exit. >=20 >> I am pretty sure stack frames are not disabled with UEFI, as sometimes = backtracing works just fine. To me it looks like debug information parsing = randomly breaks in LLDB, and once it happens it forgets about other images: >>=20 >> (lldb) b CoreLocateHandleBuffer >> Breakpoint 2: where =3D DxeCore.dll`CoreLocateHandleBuffer + 31 at Loca= te.c:649, address =3D 0x000000007fe36e4f >> (lldb) c >> Process 1 resuming >> Process 1 stopped >> * thread #1, stop reason =3D breakpoint 2.1 >> frame #0: 0x000000007fe36e4f DxeCore.dll`CoreLocateHandleBuffer(Sea= rchType=3DByProtocol, Protocol=3D0x000000007f978160, SearchKey=3D0x00000000= 00000000, NumberHandles=3D0x000000007fe19fd8, Buffer=3D0x000000007fe19fc0) = at Locate.c:649 >> 646 =09 EFI_STATUS Status; >> 647 =09 UINTN BufferSize; >> 648 >> -> 649 =09 if (NumberHandles =3D=3D NULL) { >> 650 =09 return EFI_INVALID_PARAMETER; >> 651 =09 } >> 652 >> (lldb) bt >> * thread #1, stop reason =3D breakpoint 2.1 >> * frame #0: 0x000000007fe36e4f DxeCore.dll`CoreLocateHandleBuffer(Sea= rchType=3DByProtocol, Protocol=3D0x000000007f978160, SearchKey=3D0x00000000= 00000000, NumberHandles=3D0x000000007fe19fd8, Buffer=3D0x000000007fe19fc0) = at Locate.c:649 >> frame #1: 0x000000007fe36816 DxeCore.dll`CoreLocateDevicePath(Proto= col=3D0x000000007f978160, DevicePath=3D0x000000007fe1a060, Device=3D0x00000= 0007fe1a068) at Locate.c:466 >> frame #2: 0x000000007f97479a SecurityStubDxe.dll >>=20 >> =E2=80=94=E2=80=94=E2=80=94 >>=20 >> (lldb) b CopyMem >> Breakpoint 3: 70 locations. >> (lldb) c >> Process 1 resuming >> Process 1 stopped >> * thread #1, stop reason =3D breakpoint 2.53 3.53 >> frame #0: 0x000000007e5c13b3 MnpDxe.dll`CopyMem(DestinationBuffer= =3D0x000000007fe19b50, SourceBuffer=3D0x000000007e2aa470, Length=3D656) at= CopyMemWrapper.c:47 >> 44 IN UINTN Length >> 45 ) >> 46 { >> -> 47 if (Length =3D=3D 0) { >> 48 return DestinationBuffer; >> 49 } >> 50 ASSERT ((Length - 1) <=3D (MAX_ADDRESS - (UINTN)DestinationBu= ffer)); >> (lldb) bt >> * thread #1, stop reason =3D breakpoint 2.53 3.53 >> * frame #0: 0x000000007e5c13b3 MnpDxe.dll`CopyMem(DestinationBuffer= =3D0x000000007fe19b50, SourceBuffer=3D0x000000007e2aa470, Length=3D656) at= CopyMemWrapper.c:47 >> (lldb) finish >> error: Could not create return address breakpoint. >> (lldb) n >> Process 1 stopped >> * thread #1, stop reason =3D step over >> frame #0: 0x000000007e5c13ce MnpDxe.dll`CopyMem(DestinationBuffer= =3D0x000000007fe19b50, SourceBuffer=3D0x000000007e2aa470, Length=3D656) at= CopyMemWrapper.c:50 >> 47 if (Length =3D=3D 0) { >> 48 return DestinationBuffer; >> 49 } >> -> 50 ASSERT ((Length - 1) <=3D (MAX_ADDRESS - (UINTN)DestinationBu= ffer)); >> 51 ASSERT ((Length - 1) <=3D (MAX_ADDRESS - (UINTN)SourceBuffer)= ); >> 52 >> 53 if (DestinationBuffer =3D=3D SourceBuffer) { >> (lldb) >> ... >> Process 1 stopped >> * thread #1, stop reason =3D step over >> frame #0: 0x000000007e5c14b4 MnpDxe.dll`CopyMem(DestinationBuffer= =3D0x000000007fe19b50, SourceBuffer=3D0x000000007e2aa470, Length=3D656) at= CopyMemWrapper.c:57 >> 54 return DestinationBuffer; >> 55 } >> 56 return InternalMemCopyMem (DestinationBuffer, SourceBuffer, L= ength); >> -> 57 } >> (lldb) >> Process 1 stopped >> * thread #1, stop reason =3D step over >> frame #0: 0x000000007e5c726e MnpDxe.dll >> -> 0x7e5c726e: mov rax, qword ptr [rsp + 0x60] >> 0x7e5c7273: cmp byte ptr [rax + 0x68], 0x0 >> 0x7e5c7277: jne 0x7e5c7291 >> 0x7e5c727d: movabs rax, -0x7fffffffffffffed >> (lldb) bt >> * thread #1, stop reason =3D step over >> * frame #0: 0x000000007e5c726e MnpDxe.dll >>=20 >> =E2=80=94=E2=80=94=E2=80=94 >>=20 >> (lldb) c >> Process 1 resuming >> Process 1 stopped >> * thread #1, stop reason =3D signal SIGINT >> frame #0: 0x000000007fe4d72e DxeCore.dll >> -> 0x7fe4d72e: cmp al, 0x0 >> 0x7fe4d730: je 0x7fe4d765 >> 0x7fe4d736: mov rcx, qword ptr [rsp + 0x20] >> 0x7fe4d73b: call 0x7fe4c4b0 >> (lldb) bt >> * thread #1, stop reason =3D signal SIGINT >> * frame #0: 0x000000007fe4d72e DxeCore.dll >>=20 >>> On macOS the Mach-O and dSYM have a UUID (dwarfdump -u) that is indexe= d by Spotlight (mdfind "com_apple_xcode_dsym_uuids =3D=3D *") [2] >>> This should be the UUID in the debug directory entry and you can use t= hat to lookup the symbols like this: >>>=20 >>> module =3D target.AddModule (None, None, uuid) >>> SBError =3D target.SetModuleLoadAddress (module, LoadAddress + TeAdjus= t) >>>=20 >>> Also lldb has built in help for commands, but it is kind of terse sinc= e it is autogenerated from the C++ swig. >>> (lldb) script help (lldb.target.AddModule) >>> Help on method AddModule in module lldb: >>>=20 >>> AddModule(self, *args) method of lldb.SBTarget instance >>> AddModule(SBTarget self, SBModule module) -> bool >>> AddModule(SBTarget self, char const * path, char const * triple, c= har const * uuid) -> SBModule >>> AddModule(SBTarget self, char const * path, char const * triple, c= har const * uuid_cstr, char const * symfile) -> SBModule >>> AddModule(SBTarget self, SBModuleSpec module_spec) -> SBModule >>>=20 >>> The minimum you need to symbolicate a frame is uuid, LoadAddress, and= PC. >>>=20 >>> [1] http://lldb.llvm.org/use/map.html >>> [2] http://lldb.llvm.org/use/symbols.html >> Thanks for the links again. Yes, I am using some of these, and in fact = for GDB that=E2=80=99s pretty much what I did when I worked with XCODE5. It= is very likely that when I get to complete LLDB support for XCODE5 it will= work quite fine too. But I am already happy with XCODE5 here, and making i= t even better will only help myself, but not other people with e.g. Linux o= r people that want me to use the same compiler with them. >>=20 >=20 > Thanks for looking out for others. >=20 > Thanks, >=20 > Andrew Fish >=20 >> Best regards, >> Vitaly >>=20 >>=20 >>> 21 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0=B2 20:13, Andrew F= ish > =D0=BD=D0=B0=D0=BF=D0=B8=D1= =81=D0=B0=D0=BB(=D0=B0): >>>=20 >>>=20 >>>=20 >>>> On Mar 21, 2020, at 3:28 AM, Vitaly Cheptsov > wrote: >>>>=20 >>>> Hello, >>>>=20 >>>> Andrey, thanks for the hint, it was very helpful. I rewrote the GDB s= cripts to work with LLDB[1] and was able to debug OVMF built with CLANGPDB.= While it is still quite dirty, at the very least it works. >>>>=20 >>>> Unfortunately the experience was close to terrible. I may certainly d= o something wrong, but it is clear that PDB and LLDB do not support each ot= her well enough. After spending several hours on playing with the tools my = conclusion is that LLDB is simply not suited for UEFI PDB debugging, and we= really want DWARF as there is no other opensource debugger that supports = PDB on macOS and Linux >>>>=20 >>>> In case somebody knows workarounds here are the issues I faced: >>>>=20 >>>> 1. All integer alias typedefs are discarded in favour of underlying t= ypes. This way EFI_STATUS and EFI_TPL become unsigned long long, CHAR8 beco= mes char, and CHAR16 becomes unsigned short. It does not look like LLDB has= the original types anywhere at all, and it also does not have them registe= red. >>>>=20 >>>> frame #0: 0x000000007fe242aa DxeCore.dll`CoreAllocatePoolPagesI(P= oolType=3DEfiBootServicesData, NoPages=3D1, Granularity=3D4096, NeedGuard= =3D'\0') at Pool.c:322 >>>> 319 =09 return NULL; >>>> 320 =09 } >>>> 321 >>>> -> 322 =09 Buffer =3D CoreAllocatePoolPages (PoolType, NoPages, Gran= ularity, NeedGuard); >>>> 323 =09 CoreReleaseMemoryLock (); >>>> 324 >>>> 325 =09 if (Buffer !=3D NULL) { >>>> (lldb) p Status >>>> (unsigned long long) $3 =3D 0 >>>>=20 >>>> Structures work more or less fine, but for simpler types like strings= we are out of even potential pretty-printing. >>>>=20 >>>=20 >>> Vitaly, >>>=20 >>> You can teach lldb about types. There is some example code here: https= ://github.com/tianocore/edk2/blob/master/EmulatorPkg/Unix/lldbefi.py >>>> 2. Global variables are not accessible. I am not sure what happens, b= ut they either seem to not relocate or conflict with the other names: >>>>=20 >>>> (lldb) p gST >>>> error: Couldn't materialize: couldn't get the value of variable ::gST= : read memory from 0x6e18 failed >>>> error: errored out in DoExecute, couldn't PrepareToExecuteJITExpressi= on >>>> (lldb) p &gST >>>> error: Couldn't materialize: couldn't get the value of variable ::gST= : read memory from 0x6e18 failed >>>> error: errored out in DoExecute, couldn't PrepareToExecuteJITExpressi= on >>>>=20 >>>=20 >>> That is strange as globals usually work best? The common issue I've se= en is getting the slide wrong. The EFI modules are linked at a value near z= ero and relocated into memory, so the slide represents that adjustment. >>>=20 >>> You can use `image dump sections` and ` image dump symtab` to see lldb= 's view of symbols. More info here [1]. >>>=20 >>>> 3. Quite a number of crashes. >>>>=20 >>>> In most cases autocompletion by tab press causes a crash. E.g. >>>>=20 >>>> b I >>>>=20 >>>> So will do printing of a GUID, e.g. p gEfiGlobalVariableGuid. >>>>=20 >>>> This may have to do with Python compatibility as Xcode 11 LLDB that u= ses Python 3 generally crashes more often than MacPorts LLDB 9.0. Surprisin= gly structures work more or less fine. >>>>=20 >>>=20 >>> You can tell lldb to use the older Python like this (from the Terminal= .app): >>> $ defaults write com.apple.dt.lldb DefaultPythonVersion 2 >>>=20 >>>> 4. Ctrl+C does not produce a valid backtrace. When I break with a bre= akpoint, I see a proper stacktrace with more than one entry, with function = prototypes and values. When I break with Ctrl+C I only see some weird backt= race with most of the entries missing regardless of frame position: >>>>=20 >>>> (lldb) bt >>>> * thread #1, stop reason =3D signal SIGTRAP >>>> * frame #0: 0x000000007fe4c5f3 DxeCore.dll >>>>=20 >>>> Probably more and all the unintuitive stuff like the lack of more fun= ctional TUI, but it is hard to remember all the trials. >>>>=20 >>>=20 >>> For the macOS API clang emits frame pointers, so you can walk the stac= k without symbols. You could try adding the compiler flag to emit the frame= pointers. >>>=20 >>>=20 >>>> [1] https://github.com/acidanthera/OpenCorePkg/blob/master/Debug/Scri= pts/lldb_uefi.py >>>>=20 >>>=20 >>> On macOS the Mach-O and dSYM have a UUID (dwarfdump -u) that is indexe= d by Spotlight (mdfind "com_apple_xcode_dsym_uuids =3D=3D *") [2] >>> This should be the UUID in the debug directory entry and you can use t= hat to lookup the symbols like this: >>>=20 >>> module =3D target.AddModule (None, None, uuid) >>> SBError =3D target.SetModuleLoadAddress (module, LoadAddress + TeAdjus= t) >>>=20 >>> Also lldb has built in help for commands, but it is kind of terse sinc= e it is autogenerated from the C++ swig. >>> (lldb) script help (lldb.target.AddModule) >>> Help on method AddModule in module lldb: >>>=20 >>> AddModule(self, *args) method of lldb.SBTarget instance >>> AddModule(SBTarget self, SBModule module) -> bool >>> AddModule(SBTarget self, char const * path, char const * triple, c= har const * uuid) -> SBModule >>> AddModule(SBTarget self, char const * path, char const * triple, c= har const * uuid_cstr, char const * symfile) -> SBModule >>> AddModule(SBTarget self, SBModuleSpec module_spec) -> SBModule >>>=20 >>> The minimum you need to symbolicate a frame is uuid, LoadAddress, and= PC. >>>=20 >>> [1] http://lldb.llvm.org/use/map.html >>> [2] http://lldb.llvm.org/use/symbols.html >>>=20 >>> Thanks, >>>=20 >>> Andrew Fish >>>=20 >>>=20 >>>> Best wishes, >>>> Vitaly >>>>=20 >>>>> 20 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0=B2 22:14, Andrew= Fish > =D0=BD=D0=B0=D0=BF=D0=B8= =D1=81=D0=B0=D0=BB(=D0=B0): >>>>>=20 >>>>>=20 >>>>>=20 >>>>>> On Mar 20, 2020, at 8:13 AM, Vitaly Cheptsov > wrote: >>>>>>=20 >>>>>> Hello, >>>>>>=20 >>>>>> We noticed that the original bugzilla, which intended to add new LL= VM toolchain support[1], also wanted to bring ELF format support with DWARF= debugging information. For some reason this did not make its way into EDK = II, and we are currently wondering, how can one debug binaries built with L= LVM 9.0. >>>>>>=20 >>>>>> For macOS and XCODE5 toolchain we use GDB scripts based on Andrei W= arkentin=E2=80=99s work, which allow us to integrate with QEMU and VMware[2= ]. It is likely that they should work with little to no work on Linux with = CLANG38/GCC5 with GDB once again. However, CLANGPDB apparently is using PDB= debugging information, which I believe is not handled with GDB. >>>>>>=20 >>>>>> Could you please provide the details on the matter and let us know = about the recommended route? >>>>>> =E2=80=94 Is dropping CLANGELF just a temporary measure and it shou= ld be resubmitted again? >>>>>> =E2=80=94 Should LLDB, which seems to be aware of PDB, be used inst= ead of GDB, when building with CLANGPDB? If so, did anybody try that? >>>>>>=20 >>>>>=20 >>>>> Vitaly, >>>>>=20 >>>>> I've not tried the CLANGPDB path, but if you want to connect lldb to= QEMU you need to set plugin.process.gdb-remote.target-definition-file [1]= to [2]. >>>>>=20 >>>>> [1] lldb -o "settings set plugin.process.gdb-remote.target-definiti= on-file x86_64_target_definition.py" -o "gdb-remote 9000" >>>>> [2] https://github.com/llvm-mirror/lldb/blob/master/examples/python/= x86_64_target_definition.py >>>>>=20 >>>>> Thanks, >>>>>=20 >>>>> Andrew Fish >>>>>=20 >>>>>> Thanks! >>>>>>=20 >>>>>> Best regards, >>>>>> Vitaly >>>>>>=20 >>>>>> [1] https://bugzilla.tianocore.org/show_bug.cgi?id=3D1603 >>>>>> [2] https://github.com/acidanthera/OpenCorePkg/blob/master/Debug/Sc= ripts/gdb_uefi.py >>>>>>=20 >>>>=20 >>=20 >>=20 >> --Apple-Mail=_3A9DFBBC-1A3D-40F3-A555-21D0D51CC107 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8 Andrew,
I investigated further and was able to m= ake some progress. I got rid of PDB, and changed debug information generati= on to DWARF[1]. This resolved most of LLDB crashes and made pretty-printing= work just fine as type aliases like EFI_STATUS now work correctly (I am st= ill to commit this). Unfortunately there are several downsides. Dead code s= tripping in LLD linker is broken when generating PE with DWARF, so I had to= patch it[2]. Debug link implementation in llvm-objcopy is also quite ugly,= we do not get MTOC or anything alike[3], just some section with a random n= ame containing base filename.

I can submit a more proper patch to EDK II properly implementi= ng CLANGDWARF toolchain instead of patching CLANGPDB like in [1], but it is= questionable whether it is worth it. LLVM 10 will land very soon, and the = necessary LLD patches[2] will definitely not make their way in this release= . We will have to wait for LLVM 11 at the very least, and I am not sure I a= m ready to drive llvm-objcopy changes either. Liming, what do you think?

I've not used the fake image to get thing= s done so I can't speak to that. I have used a fake target so I could have = XIP PEIM and shadowed PEIM address available at the same time. You can't ha= ve a module loaded at 2 addresses at the same time in llldb. But you might = be able to use a fake target for your fake stuff?

Just in case:

        &= nbsp; # create a faka target to store info about symbols
          PeiXipTarget =3D target.debugger.Crea= teTarget (None, "i386-apple-macosx", "remote-macosx", True, error)

      &nbs= p;   # make sure the gdb-remote  connection target is the active = target
          target.debug= ger.SetSelectedTarget (target)

Yes, that was actually a smart idea. I initially did it th= at way, as I had mixing Mach-O and PE triples, but later removed, which was= actually a mistake. Now I have a fake target for GdbSyms and a proper targ= et for other images[4]. This somewhat solves the issue with invalid address= es for gST, as gST from DxeCore is now picked. However, I cannot access glo= bal variables from other modules for some reason still.

If you want to inspect globals I think this logic works to= get you data, you would need to print it out etc. 

SBValueList =3D lldb.target.FindGlo= balVariables ("gST", 1024)
for SBValue in SBValueList:=
Module =3D SBValue.GetAddress().GetModule() 
        ModuleStr =3D SBValue.GetAddress().Ge= tModule().GetFileSpec().GetFilename()
    &n= bsp;   Start =3D int (SBValue.GetLocation(), 0)
&= nbsp;       End =3D Start + SBValue.GetByteSize() - 1
<= div class=3D"">        SBDeclaration =3D SBValue.= GetDeclaration()
        Column = =3D S= BDeclaration.GetColumn()

<= div class=3D"">I wrote a command in the early days to dump out all the inst= ances of a global. 

You can also try (lldb) image lookup -Av --name gST

Something is = really weird, gST from the first image shows, but lldb believes that it doe= s not exist. lldb.target.FindGlobalVariables ("gST", 1024) also return= s an empty list.

I noticed that LLDB shows invalid type for gST in the symtab, there = also is no address. I started to wonder whether this is the cause and decid= ed to check XCODE5, as the the issue could have been with PE format. Unfort= unately even after I tried XCODE5 support with LLDB, I got exactly the= same problem. I am quite clueless what is going on. Below I in= cluded two transcripts: for CLANGDWARF and XCODE5.

(lldb) p gST
(EFI_SYSTEM_TABLE *) $0 =3D 0x000000007f9ee018
(lldb)=  p *gST
(EFI_SYSTEM_TABLE) $1 =3D {
 =  Hdr =3D (Signature =3D 0x5453595320494249, Revision =3D 0x00020046, H= eaderSize =3D 0x00000078, CRC32 =3D 0x3d5e9b5d, Reserved =3D 0x00000000)  FirmwareVendor =3D 0x000000007f9e9c98
  FirmwareRevision =3D 0x00010000
  Cons= oleInHandle =3D 0x000000007ed58f18
  ConIn =3D 0x00= 0000007e6edcb8
  ConsoleOutHandle =3D 0x000000007ed= 57018
  ConOut =3D 0x000000007e6ede40
  StandardErrorHandle =3D 0x000000007ed57a98
 = ; StdErr =3D 0x000000007e6ee030
  RuntimeServi= ces =3D 0x000000007f9eeb98
  BootServices =3D 0x000= 000007fe689e8
  NumberOfTableEntries =3D 0x00000000= 0000000a
  ConfigurationTable =3D 0x000000007f9eec9= 8
}
(lldb) image lookup -Av --name gST
(lldb) image dump sections
Dumping sections f= or 90 modules.
Sections for '/Users/user/Documents/UefiWorksp= ace/Build/OvmfX64/NOOPT_CLANGPDB/X64/DxeCore.debug' (x86_64):
  SectID     Type       =       Load Address         &nb= sp;                   Per= m File Off.  File Size  Flags      = Section Name
  ---------- ---------------- --------= -------------------------------  ---- ---------- ---------- -----= ----- ----------------------------
  0xffffffffffff= ffff container        [0x000000007fe1b000-0x000000= 007ff38ac0)  ---  0x00000000 0x00000000 0x00000000 DxeC= ore.debug.
  0x00000001 code     &nb= sp;       [0x000000007fe1b320-0x000000007fe61f34) =  ---  0x00000320 0x00046c20 0x60000020 DxeCore.debug...text<= br class=3D"">  0x00000002 data         =     [0x000000007fe61f40-0x000000007fe680f1)  ---&n= bsp; 0x00046f40 0x000061c0 0x40000040 DxeCore.debug...rdata
  0x00000003 data           =   [0x000000007fe68100-0x000000007fe6d1e0)  --- &nb= sp;0x0004d100 0x000018a0 0xc0000040 DxeCore.debug...data
&nbs= p; 0x00000004 regular          [0x000000= 007fe6d1e0-0x000000007fe6d424)  ---  0x0004e9a0 0x00000= 260 0x42000040 DxeCore.debug...reloc
  0x00000005 d= warf-abbrev     [0x000000007fe6d440-0x000000007fe74059)=   ---  0x0004ec00 0x00006c20 0x42000040 DxeCore.debug..= .debug_abbrev
  0x00000006 dwarf-info   &= nbsp;   [0x000000007fe74060-0x000000007fec1355)  ---&nb= sp; 0x00055820 0x0004d300 0x42000040 DxeCore.debug...debug_info
  0x00000007 dwarf-line       [0= x000000007fec1360-0x000000007fef9fd4)  ---  0x000a2b20 = 0x00038c80 0x42000040 DxeCore.debug...debug_line
  = 0x00000008 dwarf-macinfo    [0x000000007fef9fe0-0x000000007f= efa056)  ---  0x000db7a0 0x00000080 0x42000040 DxeCore.= debug...debug_macinfo
  0x00000009 dwarf-ranges&nbs= p;    [0x000000007fefa060-0x000000007feff610)  ---=   0x000db820 0x000055c0 0x42000040 DxeCore.debug...debug_ranges  0x0000000a dwarf-str       &nb= sp;[0x000000007feff620-0x000000007ff38abd)  ---  0x000e= 0de0 0x000394a0 0x42000040 DxeCore.debug...debug_str
Sections= for '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_CLANGPDB/X64/= DevicePathDxe.debug' (x86_64):
  SectID  =   Type             Load = Address                  =           Perm File Off.  File Siz= e  Flags      Section Name
&nbs= p; ---------- ---------------- ---------------------------------------=   ---- ---------- ---------- ---------- -------------------------= ---
  0xffffffffffffffff container    &nb= sp;   [0x000000007f986000-0x000000007f9cb0a0)  --- = ; 0x00000000 0x00000000 0x00000000 DevicePathDxe.debug.
=   0x00000001 code            &= nbsp;[0x000000007f986320-0x000000007f996dc6)  ---  0x00= 000320 0x00010ac0 0x60000020 DevicePathDxe.debug...text
 = ; 0x00000002 data             = [0x000000007f996de0-0x000000007f999b75)  ---  0x00010de= 0 0x00002da0 0x40000040 DevicePathDxe.debug...rdata
 &nb= sp;0x00000003 data             [0x0= 00000007f999b80-0x000000007f99a202)  ---  0x00013b80 0x= 00000660 0xc0000040 DevicePathDxe.debug...data
  0x= 00000004 regular          [0x000000007f99a220= -0x000000007f99a464)  ---  0x000141e0 0x00000260 0x4200= 0040 DevicePathDxe.debug...reloc
  0x00000005 dwarf= -abbrev     [0x000000007f99a480-0x000000007f99bd09)&nbs= p; ---  0x00014440 0x000018a0 0x42000040 DevicePathDxe.debug= ...debug_abbrev
  0x00000006 dwarf-info  =     [0x000000007f99bd20-0x000000007f9ad8b7)  ---&= nbsp; 0x00015ce0 0x00011ba0 0x42000040 DevicePathDxe.debug...debug_inf= o
  0x00000007 dwarf-line      =  [0x000000007f9ad8c0-0x000000007f9bc1f7)  ---  0x0= 0027880 0x0000e940 0x42000040 DevicePathDxe.debug...debug_line
  0x00000008 dwarf-macinfo    [0x000000007f9bc20= 0-0x000000007f9bc223)  ---  0x000361c0 0x00000040 0x420= 00040 DevicePathDxe.debug...debug_macinfo
  0x00000= 009 dwarf-ranges     [0x000000007f9bc240-0x000000007f9b= e020)  ---  0x00036200 0x00001de0 0x42000040 DevicePath= Dxe.debug...debug_ranges
  0x0000000a dwarf-str&nbs= p;       [0x000000007f9be020-0x000000007f9cb099) &= nbsp;---  0x00037fe0 0x0000d080 0x42000040 DevicePathDxe.debug...= debug_str
=E2=80=A6
(lldb) i= mage dump symtab
Dumping symbol table for 90 modules.
Symtab, file =3D /Users/user/Documents/UefiWorkspace/Build/OvmfX64/N= OOPT_CLANGPDB/X64/DxeCore.debug, num_symbols =3D 4343:
 =              Debug symbol
               |Synthetic symbol               ||Exter= nally Visible
             = ;  |||
Index   UserID DSX Type  &nbs= p;         File Address/Value Load Address &n= bsp;     Size            =   Flags      Name
------- ----= -- --- --------------- ------------------ ------------------ --------------= ---- ---------- ----------------------------------
[  &n= bsp; 0] 4294967295     Invalid     =     0x0000000000000000 0x000000007fe1b000 0x000000000000003a= 0x00000000 .text
[    1] 4294967295 &nbs= p;   Invalid         0x000000000000= 0000                   &n= bsp;0x0000000000000000 0x00000000 .data
[    2= ] 4294967295     Invalid       &nbs= p; 0x0000000000001898              =       0x0000000000000000 0x00000000 .bss
= [    3] 4294967295     Invalid &nbs= p;       0x0000000000046bc0 0x000000007fe61bc0 0x000000= 0000000374 0x00000000 .text$_ModuleEntryPoint
[   &= nbsp;4] 4294967295     Code        =     0x0000000000046bc0 0x000000007fe61bc0 0x0000000000000374= 0x00000000 _ModuleEntryPoint
[    5] 42949672= 95     Invalid         0x= 0000000000001b08                &nb= sp;   0x0000000000000000 0x00000000 .bss$gHobList
[=     6] 4294967295     Invalid  = ;       0x0000000000001b08        &= nbsp;           0x0000000000000000 0x00000000= gHobList
[    7] 4294967295    = ; Invalid         0x0000000000000000&nbs= p;                   0x00= 00000000000000 0x00000000 .rdata
[    8] 42949= 67295     Invalid         = ;0x0000000000000000                =     0x0000000000000000 0x00000000 .str
[ =   9] 4294967295     Invalid   &nbs= p;     0x0000000000000058          =           0x0000000000000000 0x00000000 .rdat= a
[   10] 4294967295     I= nvalid         0x0000000000000058   = ;                 0x0000000000= 000000 0x00000000 .str.1
[   11] 4294967295&nb= sp;    Invalid         0x00000= 00000000000                  &= nbsp; 0x0000000000000000 0x00000000 .debug_str
[ &n= bsp; 12] 4294967295     Invalid    =     0x0000000000000000          &n= bsp;         0x0000000000000000 0x00000000 .debug_= abbrev
[   13] 4294967295    &n= bsp;Invalid         0x0000000000000000  =                   0x00000= 00000000000 0x00000000 .debug_info
[   14] 429= 4967295     Invalid        &nb= sp;0x0000000000000000               = ;     0x0000000000000000 0x00000000 .debug_ranges
[   15] 4294967295     Invalid&nb= sp;        0x0000000000000000      =               0x0000000000000000 0x= 00000000 .debug_macinfo
[   16] 4294967295&nbs= p;    Invalid         0x000000= 0000000000                  &n= bsp; 0x0000000000000000 0x00000000 .debug_line
[ &n= bsp; 17] 4294967295     Code      &= nbsp;     0x000000000003f680 0x000000007fe5a680 0x0000000000= 000020 0x00000000 ProcessModuleEntryPointList
[  &n= bsp;18] 4294967295     Code        =     0x0000000000023130 0x000000007fe3e130 0x0000000000000020= 0x00000000 DebugAssertEnabled
[   19] 4294967= 295     Code           &n= bsp;0x0000000000023060 0x000000007fe3e060 0x00000000000000d0 0x00000000 Deb= ugAssert
[   20] 4294967295    =  Code            0x0000000000022150= 0x000000007fe3d150 0x0000000000000020 0x00000000 CpuDeadLoop
[   21] 4294967295     Invalid &nb= sp;       0x0000000000000000 0x000000007fe1b000 0x00000= 0000000003a 0x00000000 .text
[   22] 429496729= 5     Invalid         0x0= 000000000000000                &nbs= p;   0x0000000000000000 0x00000000 .data
[ &nb= sp; 23] 4294967295     Invalid     =     0x0000000000001898          &nb= sp;         0x0000000000000000 0x00000000 .bss
[   24] 4294967295     Invali= d         0x000000000003f240 0x000000007fe5a2= 40 0x0000000000000440 0x00000000 .text$ProcessLibraryConstructorList
[   25] 4294967295     Code = ;           0x000000000003f240 0x000000007fe5= a240 0x0000000000000440 0x00000000 ProcessLibraryConstructorList
[   26] 4294967295     Invalid&nb= sp;        0x000000000003f680 0x000000007fe5a680 0= x0000000000000020 0x00000000 .text$ProcessModuleEntryPointList
[   27] 4294967295     Invalid &n= bsp;       0x0000000000000070       = ;             0x0000000000000000 0x00000= 000 .data$gEfiCallerIdGuid
[   28] 4294967295&= nbsp;    Invalid         0x000= 0000000000070                 =   0x0000000000000000 0x00000000 gEfiCallerIdGuid
[=    29] 4294967295     Invalid  = ;       0x0000000000000148        &= nbsp;           0x0000000000000000 0x00000000= .data$gEfiEventMemoryMapChangeGuid
[   30] 42= 94967295     Invalid        &n= bsp;0x0000000000000148              &nbs= p;     0x0000000000000000 0x00000000 gEfiEventMemoryMapChang= eGuid
[   31] 4294967295    &nb= sp;Invalid         0x0000000000000168  &= nbsp;                 0x000000= 0000000000 0x00000000 .data$gEfiEventVirtualAddressChangeGuid
[   32] 4294967295     Invalid &nb= sp;       0x0000000000000168       =             0x0000000000000000 0x000000= 00 gEfiEventVirtualAddressChangeGuid
[   33] 4= 294967295     Invalid        &= nbsp;0x0000000000000138              &nb= sp;     0x0000000000000000 0x00000000 .data$gEfiEventExitBoo= tServicesGuid
[   34] 4294967295   &= nbsp; Invalid         0x0000000000000138=                     = 0x0000000000000000 0x00000000 gEfiEventExitBootServicesGuid
= =E2=80=A6.
[  303] 4294967295   &= nbsp; Invalid         0x0000000000001b60=                     = 0x0000000000000000 0x00000000 .bss$gST
[  304] 4294= 967295     Invalid        &nbs= p;0x0000000000001b60               =     0x0000000000000000 0x00000000 gST
[ =  305] 4294967295     Invalid     &n= bsp;   0x00000000000018a0           = ;         0x0000000000000000 0x00000000 .bss$gBS[  306] 4294967295     Invalid&n= bsp;        0x00000000000018a0     =               0x0000000000000000 0= x00000000 gBS
=E2=80=A6

<= /div>
=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94= = =E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94= =E2=80=94

(lldb)=  p gST
(EFI_SYSTEM_TABLE *) $2 =3D 0x000000007fbee018
(lldb) p &gST
(EFI_SYSTEM_TABLE **) $4 =3D = 0x000000007fe6d788
(lldb) p *gST
(EFI_SYSTEM_TABLE) = $3 =3D {
  Hdr =3D (Signature =3D 0x545359532049424= 9, Revision =3D 0x00020046, HeaderSize =3D 0x00000078, CRC32 =3D 0x5355dbe2= , Reserved =3D 0x00000000)
  FirmwareVendor =3D 0x0= 00000007fbe9c98
  FirmwareRevision =3D 0x00010000  ConsoleInHandle =3D 0x000000007ede5a98
  ConIn =3D 0x000000007e95f640
  Conso= leOutHandle =3D 0x000000007ede4e98
  ConOut =3D 0x0= 00000007e95f800
  StandardErrorHandle =3D 0x0000000= 07ede4b98
  StdErr =3D 0x000000007e95f910
  RuntimeServices =3D 0x000000007fbeeb98
&nb= sp; BootServices =3D 0x000000007fe6cde8
  Numb= erOfTableEntries =3D 0x0000000000000009
  Configura= tionTable =3D 0x000000007fbeec98
}
(lldb) = image lookup -Av --name gST
(lldb) image dump sectionsDumping sections for 88 modules.
Sections for '/= Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_XCODE5/X64/MdeModule= Pkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll' (x86_64):
  = ;SectID     Type          = ;   Load Address             &= nbsp;               Perm File Off.&= nbsp; File Size  Flags      Section Name=
  ---------- ---------------- --------------------= -------------------  ---- ---------- ---------- ---------- ------= ----------------------
  0x00000100 container =       [0x000000007fe26240-0x000000007fe6bb40) &nb= sp;r-x  0x000004a0 0x00045900 0x00000000 DxeCore.dll.__TEXT
  0x00000001 code          = ;   [0x000000007fe26240-0x000000007fe65bd8)  r-x &= nbsp;0x000004a0 0x0003f998 0x80000400 DxeCore.dll.__TEXT.__text
  0x00000002 data-cstr        [0x0000= 00007fe65bd8-0x000000007fe6ba23)  r-x  0x0003fe38 0x000= 05e4b 0x00000002 DxeCore.dll.__TEXT.__cstring
  0x0= 0000003 regular          [0x000000007fe6ba24-= 0x000000007fe6ba6c)  r-x  0x00045c84 0x00000048 0x00000= 000 DxeCore.dll.__TEXT.__ustring
  0x00000004 regul= ar          [0x000000007fe6ba70-0x000000007fe= 6bb40)  r-x  0x00045cd0 0x000000d0 0x00000000 DxeCore.d= ll.__TEXT.__const
  0x00000200 container  &nbs= p;     [0x000000007fe6bb40-0x000000007fe70e60)  rw= -  0x00045da0 0x00001ae0 0x00000000 DxeCore.dll.__DATA
  0x00000005 regular         &nbs= p;[0x000000007fe6bb40-0x000000007fe6bd58)  rw-  0x00045= da0 0x00000218 0x00000000 DxeCore.dll.__DATA.__const
 &n= bsp;0x00000006 data             [0x= 000000007fe6bd60-0x000000007fe6d610)  rw-  0x00045fc0 0= x000018b0 0x00000000 DxeCore.dll.__DATA.__data
  0x= 00000007 zero-fill        [0x000000007fe6d610-0x00= 0000007fe70e20)  rw-  0x00000000 0x00000000 0x00000001 = DxeCore.dll.__DATA.__common
  0x00000008 zero-fill&= nbsp;       [0x000000007fe70e20-0x000000007fe70e58)&nbs= p; rw-  0x00000000 0x00000000 0x00000001 DxeCore.dll.__DATA.= __bss
  0x00000100 container      &n= bsp; [0x000000000004b000-0x00000000000ef000)* rw-  0x0000100= 0 0x000a3a74 0x00000000 DxeCore.dll.__DWARF
  0x000= 00001 dwarf-line       [0x000000000004b000-0x00000= 000000723fb)* rw-  0x00001000 0x000273fb 0x00000000 DxeCore.dll._= _DWARF.__debug_line
  0x00000002 dwarf-pubnames&nbs= p;  [0x00000000000723fb-0x0000000000078429)* rw-  0x000= 283fb 0x0000602e 0x00000000 DxeCore.dll.__DWARF.__debug_pubnames
  0x00000003 dwarf-pubtypes   [0x0000000000= 078429-0x000000000008b915)* rw-  0x0002e429 0x000134ec 0x00000000= DxeCore.dll.__DWARF.__debug_pubtypes
  0x00000004 = dwarf-aranges    [0x000000000008b915-0x000000000008ea65)* rw= -  0x00041915 0x00003150 0x00000000 DxeCore.dll.__DWARF.__debug_a= ranges
  0x00000005 dwarf-info     &= nbsp; [0x000000000008ea65-0x00000000000c78bf)* rw-  0x00044a= 65 0x00038e5a 0x00000000 DxeCore.dll.__DWARF.__debug_info
&nb= sp; 0x00000006 dwarf-frame      [0x00000000000c78b= f-0x00000000000cc697)* rw-  0x0007d8bf 0x00004dd8 0x00000000 DxeC= ore.dll.__DWARF.__debug_frame
  0x00000007 dwarf-ra= nges     [0x00000000000cc697-0x00000000000cc757)* rw-&n= bsp; 0x00082697 0x000000c0 0x00000000 DxeCore.dll.__DWARF.__debug_rang= es
  0x00000008 dwarf-abbrev    &nbs= p;[0x00000000000cc757-0x00000000000cca9b)* rw-  0x00082757 0x0000= 0344 0x00000000 DxeCore.dll.__DWARF.__debug_abbrev
 &nbs= p;0x00000009 dwarf-str        [0x00000000000cca9b-= 0x00000000000dcc05)* rw-  0x00082a9b 0x0001016a 0x00000000 DxeCor= e.dll.__DWARF.__debug_str
  0x0000000a apple-names&= nbsp;     [0x00000000000dcc05-0x00000000000e2439)* rw- =  0x00092c05 0x00005834 0x00000000 DxeCore.dll.__DWARF.__apple_names  0x0000000b apple-namespaces [0x00000000000e2439-0x0= 0000000000e245d)* rw-  0x00098439 0x00000024 0x00000000 DxeCore.d= ll.__DWARF.__apple_namespac
  0x0000000c apple-type= s      [0x00000000000e245d-0x00000000000eea50)* rw-&nbs= p; 0x0009845d 0x0000c5f3 0x00000000 DxeCore.dll.__DWARF.__apple_types<= br class=3D"">  0x0000000d apple-objc      &n= bsp;[0x00000000000eea50-0x00000000000eea74)* rw-  0x000a4a50 0x00= 000024 0x00000000 DxeCore.dll.__DWARF.__apple_objc
Sections f= or '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_XCODE5/X64/MdeM= odulePkg/Universal/DevicePathDxe/DevicePathDxe/DEBUG/DevicePathDxe.dll' (x8= 6_64):
=E2=80=A6
(lldb) imag= e dump symtab
Dumping symbol table for 88 modules.
Symtab, file =3D /Users/user/Documents/UefiWorkspace/Build/OvmfX64/N= OOPT_XCODE5/X64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll, num_symbol= s =3D 1203:
              =  Debug symbol
            =    |Synthetic symbol
        &n= bsp;      ||Externally Visible
    &= nbsp;          |||
Index  =  UserID DSX Type            File Ad= dress/Value Load Address       Size   &n= bsp;           Flags      = ;Name
------- ------ --- --------------- ------------------ -= ----------------- ------------------ ---------- ---------------------------= -------
[    0]    118 D &= nbsp; SourceFile      0x0000000000000000  &nb= sp;                 Sibling -&= gt; [   20] 0x00640000 /Users/user/Documents/UefiPackag= es/MdeModulePkg/Core/Dxe/SectionExtraction/CoreSectionExtraction.c
[    1]    120 D   Obje= ctFile      0x000000005e78588d      &nbs= p;             0x0000000000000000 0x0066= 0001 /Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_XCODE5/X6= 4/MdeModulePkg/Core/Dxe/DxeMain/OUTPUT/DxeCore.lib(CoreSectionExtraction.ob= j)
[    2]    122 D X Code = ;           0x0000000000000240 0x000000007fe2= 6240 0x0000000000000260 0x000f0000 CustomGuidedSectionExtract
[    3]    126 D X Code      =       0x00000000000004a0 0x000000007fe264a0 0x000000000= 0000110 0x000f0000 InitializeSectionExtraction
[   =  4]    130 D X Code          &= nbsp; 0x00000000000005b0 0x000000007fe265b0 0x0000000000000140 0x000f0= 000 IsValidSectionStream
[    5]   &= nbsp;134 D X Code            0x000000000= 00006f0 0x000000007fe266f0 0x0000000000000180 0x000f0000 OpenSectionStreamE= x
[    6]    138 D X Code =           0x0000000000000870 0x000000007fe26= 870 0x0000000000000070 0x000f0000 OpenSectionStream
[  &= nbsp; 7]    142 D X Code        &nb= sp;   0x00000000000008e0 0x000000007fe268e0 0x0000000000000100 0x= 000f0000 ChildIsType
=E2=80=A6
[ &n= bsp;831]   2470 D X Code          &= nbsp; 0x00000000000306b0 0x000000007fe566b0 0x00000000000000f4 0x000f0= 000 UefiBootServicesTableLibConstructor
[  832]&nbs= p;  2473 D X Data            0= x0000000000047780 0x000000007fe6d780 0x0000000000000008 0x000f0000 gImageHa= ndle
[  833]   2474 D X Data  &= nbsp;         0x0000000000047788 0x000000007fe6d78= 8 0x0000000000000008 0x000f0000 gST
[  834] &n= bsp; 2475 D X Data            0x000= 0000000047790 0x000000007fe6d790 0x0000000000000008 0x000f0000 gBS
=E2=80=A6

This is easy en= ough to check as %rpb is the frame pointer so it will get saved/restored on= function entry/exit. 

Actually it is fine. I happened to break in the interrupt routine, = which was not mapped for a particular image. After I stepped a little, it s= oon reached the debug symbols:

(lldb) bt all
* thread #1, stop reason =3D= instruction step over
  * frame #0: 0x000000007fe4= 9f3c DxeCore.dll`CoreRestoreTpl(NewTpl=3D0x0000000000000008) at Tpl.c:102:1= 2
    frame #1: 0x000000007e518c95
  thread #2
    frame #0: 0x00000= 0007fb3ff88 CpuDxe.dll`CpuSleep + 1
    frame = #1: 0x000000007fb4d719 CpuDxe.dll`ApWakeupFunction(ExchangeInfo=3D0x0000000= 000087198, ApIndex=3D0x0000000000000001) at MpLib.c:768:9
&nb= sp;   frame #2: 0x000000007fb2d151
  thre= ad #3
    frame #0: 0x000000007fb3ff88 CpuDxe.= dll`CpuSleep + 1
    frame #1: 0x000000007fb4d= 719 CpuDxe.dll`ApWakeupFunction(ExchangeInfo=3D0x0000000000087198, ApIndex= =3D0x0000000000000002) at MpLib.c:768:9
    f= rame #2: 0x000000007fb2d151
  thread #4
    frame #0: 0x000000007fb3ff88 CpuDxe.dll`CpuSleep + 1<= br class=3D"">    frame #1: 0x000000007fb4d719 CpuDxe.dll`Ap= WakeupFunction(ExchangeInfo=3D0x0000000000087198, ApIndex=3D0x0000000000000= 003) at MpLib.c:768:9
    frame #2: 0x00000000= 7fb2d151

Best wis= hes,
Vitaly

=
[4] https://github.com/a= cidanthera/OpenCorePkg/commit/3e5f3f3f9a8d3f197834bbfcf5029f771df89754<= br class=3D"">

22 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0=B2 00:06, A= ndrew Fish <afish@apple.co= m> =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB(=D0=B0):



On Mar 21, 2020, at 11:36 AM, Vitaly Cheptsov <cheptsov@ispras.ru> wrote:
Andrew,

Thanks once again, but unfortunately it is n= ot that simple. = Below I answered inline explaining the particular issues, which mostly seem= to be specific to CLANGPDB. LLV= M stack emits PDB debug files, and even though LLDB does support them to so= me level, it is unlikely that this will be working well enough soon. We sho= uld really stick to more or less native debug formats, ideally those that h= ave proper open specifications, on all platforms, and for Unix that=E2=80= =99s DWARF.

Vitaly,

I understand and I use the Xcode clang and not the CL= ANGPDB, but I use lldb a lot I was just trying to point out what works with= Xcode. 

<= /div>
I am pretty sure LLVM can be= taught to emit DWARF debug information even for PE files. Perhaps we can e= ither make some option or provide a separate toolchain for this? Another wa= y would be recovering CLANGELF as originally suggested.


There was a bug recently in the  = ;x86_64-pc-win32-macho triple and we had to add -gdwarf to force it em= it dwarf. Not sure what that compiler flag would do to CLANGPDB but it is w= orth a try? Last flag wins for the compiler. 

You can teach lldb about types. T= here is some example code here: https://github.c= om/tianocore/edk2/blob/master/EmulatorPkg/Unix/lldbefi.py

This code works just fine with LL= DB and DWARF (e.g. XCODE5), though I have not yet completed these changes f= or my scripts for LLDB, only for GDB. However, with CLANGPDB generated file= s it is not functional. The reason for this is because LLDB is unaware of t= he underlying type, i.e. it does not know what is EFI_STATUS or UINT32. I c= an implement pretty-printing when LLDB knows about a typedef, but it is not= possible to do this when the debug information is already gone or not pars= ed:

(lldb) p Status
(unsigned = long long) $1 =3D 0
(lldb) p &Status
(unsig= ned long long *) $2 =3D 0x000000007fe19ad8
(lldb) p (EFI_STAT= US)Status
error: use of undeclared identifier 'EFI_STATUS'

<= /div>
= Just in case I tried using exactly your code, and other stuff like source l= evel debugging works just fine and symbolication works fine, so it should b= e some bug with PDB in particular.

That is s= trange as globals usually work best? The common issue I've seen is getting = the slide wrong. The EFI modules are linked at a value near zero and reloca= ted into memory, so the slide represents that adjustment. 

You can use `image dump sect= ions` and ` image dump symtab` to see lldb's view of symbols. More inf= o here [1]. 

Ye= s, this one is a bit complicated, once again due to PDB most likely. It kno= ws about global symbols, but does not list them in symtab:

(lldb) image dump symtabDumping symbol table for 91 modules.
Symtab, fil= e =3D GdbSyms/Bin/X64_CLANGPDB/GdbSyms.dll, num_symbols =3D 0
Symtab, file =3D /Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_C= LANGPDB/X64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll, num_symbols = =3D 0
Symtab, file =3D /Users/user/Documents/UefiWorkspace/B= uild/OvmfX64/NOOPT_CLANGPDB/X64/MdeModulePkg/Universal/DevicePathDxe/Device= PathDxe/DEBUG/DevicePathDxe.dll, num_symbols =3D 0
=E2= = =80=A6

The slide= s are correct, but there are two nuances that collide with it.

1. There are multiple instanc= es of the globals with the same name (e.g. gBS), but for some reason LLDB a= lways tries to print the globals from the first module. This happens even w= hen I am source-level debugging, and I see a gBS symbol from another module= (e.g. DxeCore) used right at the same line. With GDB the closest symbol is= used, but with LLDB it is always coming from the first module. I tried che= cking expr help to find whether I can pass it a module explicitly, but also= failed.


Usually what happens with lldb is you get the gl= obal that is in scope for the current frame. 

2.  To be able to get EFI types t= o locate the EFI_SYSTEM_TABLE_POINTER I add a dummy GdbSyms image, which is= not loaded to the firmware. So basically I cannot slide what is not in the= memory, and this is also my first image. I tried deleting it anyhow, but i= t failed for me.


I've not used the fake image to get thin= gs done so I can't speak to that. I have used a fake target so I could have= XIP PEIM and shadowed PEIM address available at the same time. You can't h= ave a module loaded at 2 addresses at the same time in llldb. But you might= be able to use a fake target for your fake stuff?

Just in case:

 =         # create a faka target to store info about sym= bols
          PeiXipTarget = =3D target.debugger.CreateTarget (None, "i386-apple-macosx", "remote-macos= x", True, error)

=           # make sure the gdb-remote  connect= ion target is the active target
      &= nbsp;   target.debugger.SetSelectedTarget (target)


(lldb) image dump sections
Dumping sect= ions for 91 modules.
Sections for 'GdbSyms/Bin/X64_CLANGPDB/G= dbSyms.dll' (x86_64):
  SectID    &n= bsp;Type             Load Address&n= bsp;                    &= nbsp;       Perm File Off.  File Size &n= bsp;Flags      Section Name
  -= --------- ---------------- --------------------------------------- &nb= sp;---- ---------- ---------- ---------- ----------------------------
  0xffffffffffffffff container       = ; [0x0000000000000000-0x0000000000006ec0)* ---  0x00000000 0= x00000000 0x00000000 GdbSyms.dll.
  0x00000001 code=              [0x0000000000000220-0x= 0000000000005bd6)* ---  0x00000220 0x000059c0 0x60000020 GdbSyms.= dll...text
  0x00000002 data     &nb= sp;       [0x0000000000005be0-0x0000000000006d79)* ---&= nbsp; 0x00005be0 0x000011a0 0x40000040 GdbSyms.dll...rdata
  0x00000003 data           &nbs= p; [0x0000000000006d80-0x0000000000006e30)* ---  0x00006d80 = 0x00000060 0xc0000040 GdbSyms.dll...data
  0x000000= 04 regular          [0x0000000000006e40-0x000= 0000000006ea4)* ---  0x00006de0 0x00000080 0x42000040 GdbSyms.dll= ...reloc
Sections for '/Users/user/Documents/UefiWorkspace/Bu= ild/OvmfX64/NOOPT_CLANGPDB/X64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.= dll' (x86_64):
  SectID     Typ= e             Load Address &nb= sp;                     &= nbsp;     Perm File Off.  File Size  Fla= gs      Section Name
  --------= -- ---------------- ---------------------------------------  ----= ---------- ---------- ---------- ----------------------------
  0xffffffffffffffff container        = [0x0000000000000000-0x00000000000523a0)* ---  0x00000000 0x000000= 00 0x00000000 DxeCore.dll.
  0x00000001 code &= nbsp;           [0x000000007fe1b220-0x0000000= 07fe61e34)  ---  0x00000220 0x00046c20 0x60000020 DxeCo= re.dll...text
  0x00000002 data     =         [0x000000007fe61e40-0x000000007fe68065)&nb= sp; ---  0x00046e40 0x00006240 0x40000040 DxeCore.dll...rdat= a
  0x00000003 data        = ;     [0x000000007fe68080-0x000000007fe6d160)  ---=   0x0004d080 0x000018a0 0xc0000040 DxeCore.dll...data
  0x00000004 regular          [0= x000000007fe6d160-0x000000007fe6d398)  ---  0x0004e920 = 0x00000240 0x42000040 DxeCore.dll...reloc
Sections for '/User= s/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_CLANGPDB/X64/MdeModulePk= g/Universal/DevicePathDxe/DevicePathDxe/DEBUG/DevicePathDxe.dll' (x86_64):<= br class=3D"">  SectID     Type   &= nbsp;         Load Address     &nbs= p;                     &n= bsp; Perm File Off.  File Size  Flags   =   Section Name
  ---------- ------------= ---- ---------------------------------------  ---- ---------- ---= ------- ---------- ----------------------------
  0= xffffffffffffffff container        [0x000000000000= 0000-0x0000000000014420)* ---  0x00000000 0x00000000 0x00000000 D= evicePathDxe.dll.
  0x00000001 code   &nb= sp;         [0x000000007f986220-0x000000007f996cc6= )  ---  0x00000220 0x00010ac0 0x60000020 DevicePathDxe.= dll...text
  0x00000002 data     &nb= sp;       [0x000000007f996ce0-0x000000007f999b04) =  ---  0x00010ce0 0x00002e40 0x40000040 DevicePathDxe.dll...r= data
  0x00000003 data       &n= bsp;     [0x000000007f999b20-0x000000007f99a1a2)  = ---  0x00013b20 0x00000660 0xc0000040 DevicePathDxe.dll...data  0x00000004 regular         = ; [0x000000007f99a1c0-0x000000007f99a404)  ---  0x= 00014180 0x00000260 0x42000040 DevicePathDxe.dll=E2=80=A6reloc
=E2=80=A6

So, a= ll in all, unique global variables work, but there is no way to access dupl= icating variables. They either resolve to GdbSyms or just cause a crash:

(lldb) p mDebu= gInfoTableHeader
(EFI_DEBUG_IMAGE_INFO_TABLE_HEADER) $0 =3D {=
  UpdateStatus =3D 2
  Tab= leSize =3D 92
  EfiDebugImageInfoTable =3D 0x000000= 007f814018
}
(lldb) p gBS
er= ror: Couldn't materialize: couldn't get the value of variable ::gBS: read m= emory from 0x6df8 failed
error: errored out in DoExecute, cou= ldn't PrepareToExecuteJITExpression
(lldb) p gEfiGlobalV= ariableGuid
0  libLLVM.dylib      &n= bsp;     0x000000010e52ee68 llvm::sys::PrintStackTrace(llvm:= :raw_ostream&) + 40
1  libLLVM.dylib  &nbs= p;         0x000000010e52f262 SignalHandler(int) += 188
2  libsystem_platform.dylib 0x00007fff6ca5642d= _sigtramp + 29
...


If you want to inspect= globals I think this logic works to get you data, you would need to print = it out etc. 

SBValueList =3D lldb.targe= t.FindGlobalVariables ("gST", 1024)
for SBValue in SBValueList:
M= odule =3D SBValue.GetAddress().GetModule() 
        ModuleStr =3D SBValue.GetAdd= ress().GetModule().GetFileSpec().GetFilename()
        Start =3D int (SBValue.GetL= ocation(), 0)
    &n= bsp;   End =3D Start + SBValue.GetByteSize() - 1
        SBDeclaration =3D SBValue.GetDeclaration()
&nbs= p;       Column =3D SBDeclaration.GetColumn()

<= /div>
I wrote a command in the early= days to dump out all the instances of a global. 

You can also try (lldb) image lookup -Av --name gST

You can tell lldb to use the older Python like= this (from the Terminal.app):
$ defaults write c= om.apple.dt.lldb DefaultPythonVersion 2

Thanks, that helped quite a bit, but for some reason Xc= ode version still crashes more for me. I attached a couple of stack traces = if you feel like having a look, but once again it seems that it is all abou= t the PDB plugin.

For the macOS API cla= ng emits frame pointers, so you can walk the stack without symbols. You cou= ld try adding the compiler flag to emit the frame pointers. 

<= /div>

This is easy enough to= check as %rpb is the frame pointer so it will get saved/restored on functi= on entry/exit. 

I am pretty sure stack frames are not disabled with = UEFI, as sometimes backtracing works just fine. To me it looks like debug i= nformation parsing randomly breaks in LLDB, and once it happens it forgets = about other images:

(lldb) b CoreLocateHandleBuffer
Breakpoint 2: where = =3D DxeCore.dll`CoreLocateHandleBuffer + 31 at Locate.c:649, address =3D 0= x000000007fe36e4f
(lldb) c
Process 1 resum= ing
Process 1 stopped
* thread #1, stop reason = = =3D breakpoint 2.1
    frame #0: 0x= 000000007fe36e4f DxeCore.dll`CoreLocateHandleBuffer(SearchType=3DByPro= tocol, Protocol=3D0x000000007f978160, SearchKey=3D0x0000000000000000, Numbe= rHandles=3D0x000000007fe19fd8, Buffer=3D0x000000007fe19fc0) at Lo= cate.c:649
   646    EFI_STATUS    =       Status;
   647    U= INTN               BufferSize;=
   648 
-> 649    if&nbs= p;(NumberHandles =3D=3D NULL) {
   650     &n= bsp;return EFI_INVALID_PARAMETER;
   651 =  &n= bsp;}
   652 
(lldb) bt
* thread #1, stop reason =3D breakpoint 2.1
 &nb= sp;* frame #0: 0x000000007fe36e4f DxeCore.dll`CoreLocateHandleBuf= fer(SearchType=3DByProtocol, Protocol=3D0x000000007f978160, SearchKey=3D0x0= 000000000000000, NumberHandles=3D0x000000007fe19fd8, Buffer=3D0x000000= 007fe19fc0) at Locate.c:649
    frame #1:=  0x000000007fe36816 DxeCore.dll`CoreLocateDevicePath(Protocol=3D0= x000000007f978160, DevicePath=3D0x000000007fe1a060, Device=3D0x000000007fe1= a068) at Locate.c:466
    frame #2: = 0x000000007f97479a SecurityStubDxe.dll

=E2=80=94=E2=80=94=E2=80=94

(lldb) b CopyMem
Breakpoint 3: 7= 0 locations.
(lldb) c
Process 1 resumingProcess 1 stopped
* thread #1, stop reason =3D&n= bsp;breakpoint 2.53 3.53
    frame #0: 0x= 000000007e5c13b3 MnpDxe.dll`CopyMem(DestinationBuffer=3D0x000000007fe1= 9b50, SourceBuffer=3D0x000000007e2aa470, Length=3D656) at CopyMemWrapp= er.c:47
   44     IN UINTN   &= nbsp;   Length
   45     )
   46   {
-> 47     if&= nbsp;(Length =3D=3D 0) {
   48      = ; return DestinationBuffer;
   49 &n= bsp; &nbs= p; }
   50     ASSERT ((Length -&nb= sp;1) <=3D (MAX_ADDRESS - (UINTN)DestinationBuffer));
(lld= b) bt
* thread #1, stop reason =3D breakpoint 2.53 = 3.53
  * frame #0: 0x000000007e5c13b3 Mnp= Dxe.dll`CopyMem(DestinationBuffer=3D0x000000007fe19b50, SourceBuffer=3D0x00= 0000007e2aa470, Length=3D656) at CopyMemWrapper.c:47
(ll= db) finish
error: Could not create return address breakp= oint.
(lldb) n
Process 1 stopped
* thread #1, stop reason =3D step over
  &nb= sp; frame #0: 0x000000007e5c13ce MnpDxe.dll`CopyMem(Destinat= ionBuffer=3D0x000000007fe19b50, SourceBuffer=3D0x000000007e2aa470, Length= =3D656) at CopyMemWrapper.c:50
   47 &nb= sp;  = ; if (Length =3D=3D 0) {
   48 =   &n= bsp;   return DestinationBuffer;
   = 49   <= /span>  }
-> 50     ASSERT ((Length -=  1) <=3D (MAX_ADDRESS - (UINTN)DestinationBuffer));
&= nbsp;  51     ASSERT ((Length - 1) <=3D (MAX_ADDRES= S - (UINTN)SourceBuffer));
   52  
=    53     if (DestinationBuffer =3D=3D SourceBuff= er) {
(lldb)  
...
Proc= ess 1 stopped
* thread #1, stop reason =3D step over
    frame #0: 0x000000007e5c14b4 MnpDxe= .dll`CopyMem(DestinationBuffer=3D0x000000007fe19b50, SourceBuffer=3D0x00000= 0007e2aa470, Length=3D656) at CopyMemWrapper.c:57
 =  54       return DestinationBuffer;
   55     }
   56  = ;  &= nbsp;return InternalMemCopyMem (DestinationBuffer, SourceBuffer, Lengt= h);
-> 57   }
(lldb)  
Process 1 stopped
* thread #1, stop reason =3D st= ep over
    frame #0: 0x000000007e5c726e&= nbsp;MnpDxe.dll
->  0x7e5c726e: mov   =  rax, qword ptr [rsp + 0x60]
    0x7e5c72= 73: cmp    byte ptr [rax + 0x68], 0x0
  &= nbsp; 0x7e5c7277: jne    0x7e5c7291
 = ;   0x7e5c727d: movabs rax, -0x7fffffffffffffed
(ll= db) bt
* thread #1, stop reason =3D step over
  * frame #0: 0x000000007e5c726e&nb= sp;MnpDxe.dll 

=E2=80=94=E2=80=94=E2=80=94

(lldb) c
Process 1 resuming
Process 1 stopped
* thread #1, stop reason =3D si= gnal SIGINT
    frame #0: 0x000000007fe4d= 72e DxeCore.dll
->  0x7fe4d72e: cmp  &= nbsp; al, 0x0
    0x7fe4d730: je &nb= sp;   0x7fe4d765
    0x7fe4d736: mov=     rcx, qword ptr [rsp + 0x20]
   &= nbsp;0x7fe4d73b: call   0x7fe4c4b0
(lldb) = ;bt
* thread #1, stop reason =3D signal SIGINT
  * frame #0: 0x000000007fe4d72e DxeCore.dll

On macOS the Mach-O and dSYM have a UUID (= dwarfdump -u) that is indexed by Spotlight (mdfind "com_apple_xcode_dsym_uu= ids =3D=3D *") [2]
This should be the UUID in the debu= g directory entry and you can use that to lookup the symbols like this:

module =3D target.Ad= dModule (None, None, uuid)
SBError =3D target.SetModul= eLoadAddress (module, LoadAddress + TeAdjust)

Also lldb has built in help for commands, but = it is kind of terse since it is autogenerated from the C++ swig. 
(lldb) script help (lldb.target.AddModule)
<= div class=3D"" style=3D"margin: 0px; font-stretch: normal; font-size: 11px;= line-height: normal; font-family: Menlo;">Help on method AddModule in module = lldb:
<= span class=3D"" style=3D"font-variant-ligatures: no-common-ligatures;">AddM= odule(self, *args) method of lldb.SBTarget instance
    AddModule(SBTarget self, SBMo= dule module) -> bool
    AddModule(SBTarget self, char const * pa= th, char const * triple, char const * uuid_cstr, char const * symfile) ->= ; SBModule
  &nbs= p; AddModule(SBTarget self, SBModuleSpec module_spec) -> SBModule=

The minimum &= nbsp;you need to symbolicate a frame is uuid, LoadAddress, and PC. 


Thanks for the= links again. Yes, I am using some of these, and in fact for GDB that=E2=80= = =99s pretty much what I did when I worked with XCODE5. It is very likely t= hat when I get to complete LLDB support for XCODE5 it will work quite fine = too. But I am already happy with XCODE5 here, and making it even better wil= l only help myself, but not other people with e.g. Linux or people that wan= t me to use the same compiler with them.

Thanks for looki= ng out for others. 

Thanks,

Andrew Fish

Best regards,
Vitaly


<= /div>
2= 1 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0=B2 20:13, Andrew Fish &l= t;afish@apple.com> =D0= = =BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB(=D0=B0):



<= div class=3D"">On Mar 21, 2020, at 3:28 AM, Vitaly Cheptsov <cheptsov@ispras.ru> wrote:
Hello,

Andrey, thanks for the hint, it was very hel= pful. I rewrote the GDB scripts to work with LLDB[1] and was able to debug = OVMF built with CLANGPDB. While it is still quite dirty, at the very least = it works.

Unfortunately the experience was c= lose to terrible. I may certainly do something wrong, but it is clear that = PDB and LLDB do not support each other well enough. After spending several = hours on playing with the tools my conclusion is that LLDB is simply not su= ited for UEFI PDB debugging, and we really want DWARF  as there is no = other opensource debugger that supports PDB on macOS and Linux

In case somebody knows workarounds here are the issues = I faced:

=
1. All integer alias typedefs are d= iscarded in favour of underlying types. This way EFI_STATUS and EFI_TPL bec= ome unsigned long long, CHAR8 becomes char, and CHAR16 becomes unsigned sho= rt. It does not look like LLDB has the original types anywhere at all, and = it also does not have them registered.

 = ;   frame #0: 0x000000007fe242aa DxeCore.dll`CoreAlloca= tePoolPagesI(PoolType=3DEfiBootServicesData, NoPages=3D1, Granularity=3D409= 6, NeedGuard=3D'\0') at Pool.c:322
   319 = ;   =   return NULL;
   320    }
   321 
-> 322    Buffer =3D CoreA= llocatePoolPages (PoolType, NoPages, Granularity, NeedGuard);
   323    CoreReleaseMemoryLock ();
  &= nbsp;324  <= /span>
   325    if (Buffer !=3D NULL) {=
(lldb) p Status
(unsigned long long) $3 = =3D 0

Structures work more or less fine, but for simpler types l= ike strings we are out of even potential pretty-printing.

=

Vitaly,

You can te= ach lldb about types. There is some example code here: https://github.com/tianocore/edk2/blob/master/EmulatorPkg/Unix/lldbe= fi.py

2. Glo= bal variables are not accessible. I am not sure what happens, but they eith= er seem to not relocate or conflict with the other names:

(lldb) p gST
error: Couldn't materia= lize: couldn't get the value of variable ::gST: read memory from 0x6e18 fai= led
error: errored out in DoExecute, couldn't PrepareToExecut= eJITExpression
(lldb) p &gST
error: Co= uldn't materialize: couldn't get the value of variable ::gST: read memory f= rom 0x6e18 failed
error: errored out in DoExecute, couldn't P= repareToExecuteJITExpression
<= br class=3D"">

That is st= range as globals usually work best? The common issue I've seen is getting t= he slide wrong. The EFI modules are linked at a value near zero and relocat= ed into memory, so the slide represents that adjustment. 

You can use `image dump sections` and ` image dump= symtab` to see lldb's view of symbols. More info here [1]. 

3. Quite a number of cras= hes.

In most cases autocompletion by tab pre= ss causes a crash. E.g.

b I<TAB>
=

So will do printing of a GUID, e.g. p gEfiGlobalVar= iableGuid.

This may have to do with Python compatibility as Xcode 11 = LLDB that uses Python 3 generally crashes more often than MacPorts LLDB 9.0= . Surprisingly structures work more or less fine.


You can tell lldb to use the older Python like this (fr= om the Terminal.app):
$ d= efaults write com.apple.dt.lldb DefaultPythonVersion 2

<= div class=3D"" style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; = font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight= : normal; letter-spacing: normal; text-align: start; text-indent: 0px; text= -transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stro= ke-width: 0px; text-decoration: none;">4. Ctrl+C does not produce a valid backtrac= e. When I break with a breakpoint, I see a proper stacktrace with more than= one entry, with function prototypes and values. When I break with Ctrl+C I= only see some weird backtrace with most of the entries missing regardless = of frame position:

(lldb) bt
* thread #1, stop re= ason =3D signal SIGTRAP
  * frame #0: 0x0= 00000007fe4c5f3 DxeCore.dll

Probably more and all the unintuitive stuff like the lack of more= functional TUI, but it is hard to remember all the trials.


For the macOS API clang emits frame pointers= , so you can walk the stack without symbols. You could try adding the compi= ler flag to emit the frame pointers. 

<= br class=3D"">

=
On macOS the Mach-O and dSYM = have a UUID (dwarfdump -u) that is indexed by Spotlight (mdfind "com_apple_= xcode_dsym_uuids =3D=3D *") [2]

module =3D= target.AddModule (None, None, uuid)
SBError =3D target.SetModuleLoadAddress (module, LoadAddress + TeAdj= ust)

Also lldb has built in help for command= s, but it is kind of terse since it is autogenerated from the C++ swig.&nbs= p;
(lldb) script help (lldb.target.AddModule)
=
Help on method AddModule in module= lldb:

= Add= Module(self, *args) method of lldb.SBTarget instance
    AddModule(SBTarget self, SBMo= dule module) -> bool
    AddModule(SBTarget self, char const * pa= th, char const * triple, char const * uuid_cstr, char const * symfile) ->= ; SBModule
  &nbs= p; AddModule(SBTarget self, SBModuleSpec module_spec) -> SBModule=

The minimum &= nbsp;you need to symbolicate a frame is uuid, LoadAddress, and PC. 
Best wishes,
Vitaly

20 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0= =B2 22:14, Andrew Fish <a= fish@apple.com> =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB(=D0=B0):<= /div>


On Mar 20, 2020, at 8:13 AM, Vitaly= Cheptsov <cheptsov@isp= ras.ru> wrote:

Hello,

We noticed that the original bugzilla, which intende= d to add new LLVM toolchain support[1], also wanted to bring ELF format sup= port with DWARF debugging information. For some reason this did not make its way into EDK I= I, and we are currently wondering, how can one debug binaries built with LL= VM 9.0.

For macOS and XCODE5 toolchain we use= GDB scripts based on Andrei Warkentin=E2=80= =99s work, which allow us to integrate with QEMU and VMware[2]. It is like= ly that they should work with little to no work on Linux with CLANG38/GCC5 = with GDB once again. However, CLANGPDB apparently is using PDB debugging in= formation, which I believe is not handled with GDB.

Could you please provide the de= tails on the matter and let us know about the recommended route?
=E2=80=94 Is dropping CLANGELF just a temporary measure and it s= hould be resubmitted again?
=E2=80=94 Should LLDB, which seems to be = aware of PDB, be used instead of GDB, when building with CLANGPDB? If so, d= id anybody try that?


Vitaly,

I've= not tried the CLANGPDB path, but if you want to connect lldb to QEMU you n= eed to set  plugin.process.gdb-remote.target-definition-file [1] to [2= ]. 

=
[1]  lldb -o "settings se= t plugin.process.gdb-remote.target-definition-file x86_64_target_definition= .py" -o "gdb-remote 9000"



<= ;crashes.txt>
--Apple-Mail=_3A9DFBBC-1A3D-40F3-A555-21D0D51CC107-- --Apple-Mail=_750CC4C3-238E-4A77-B88F-D079B932DB45 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=signature.asc Content-Type: application/pgp-signature; name=signature.asc Content-Description: Message signed with OpenPGP -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEsLABAI5Y5VbvBdmpL8K2O86Eyz4FAl54fPYACgkQL8K2O86E yz7zjw//f/LG+EL2mrk9gbDTPiYlvnSD9lFAGo0FS4ZhWm7Zkg9OaBIl2e6gkzFY YXPWg+GfHOiW2lst8Mj35Pivdg0WBWGHFH6Qz2OSd3RrHvJFFOswqhyTYK8krOKJ AM0bCdPb21vQD3xABdFfZK655fU0Fy9Ns/V8BwTVuVGbWwJ+1ttj4hVG2rixMBAE m1hiRBTbUyHbg+s2/frvkR2SiHAkMediSSS+2JyjnOOoyC9LhImsXkpkhaOyYWGu 7AUk+GwF7fxIyVriiyERm2A7/bMBvY6qJNJpVlhv7Ec72+QnqNNz1qKPLhynpDDU uH9tF7cCn6nxoi8CsUAportcP7XnW4YZnyxa9+7uIqsM8/s7Fwp92XlP280ffzbA tpaWDvDscMk142E0I/KX8MntJH1Ck35ppVPurKB0uMJMRQtU6zNJgowIvQMErM7s h/QCi2o2rSCn4XyLlfyvjelZbEAJVQr8n5LoAZzzKhPl9KVsktiDxuu/OB8auxhY KockFC3xCzHM1Mb/b1ohlcTnPpT/KcXDR8zLZOkuMemk8syV+ozjkH7rSZPyO76a sMOpdybSncV+Nf9dXuuLRQRD6/A+BE75IlUJbTkavVemN9k4BKTvuFydIqFGgget cGuypVp/52CzSsMqNgmPlTy8X4Y+EVgfL/LvBAECaQm/VVNQhhU= =lHCL -----END PGP SIGNATURE----- --Apple-Mail=_750CC4C3-238E-4A77-B88F-D079B932DB45-- From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by mx.groups.io with SMTP id smtpd.web11.10843.1585142215650468815 for ; Wed, 25 Mar 2020 06:16:55 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 134.134.136.126, mailfrom: liming.gao@intel.com) IronPort-SDR: m8IjsMlFzzVXTxAPmrMfdiekrqphEsELBl6nmRD/NObAJ6N7hpFsNIXKQn7m4lxZTILl4kKzoa 9ZOA7zvq7uXw== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Mar 2020 06:16:54 -0700 IronPort-SDR: uz7Y9b0cWoPGwdmIkHTGG8TeRMPc6KHzabEerN3pE75+hKDHkFPLtuYp86MjS6Y82GREWOZGvI VVweYNzV6Itw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,304,1580803200"; d="scan'208,217";a="247168718" Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205]) by orsmga003.jf.intel.com with ESMTP; 25 Mar 2020 06:16:54 -0700 Received: from shsmsx606.ccr.corp.intel.com (10.109.6.216) by fmsmsx107.amr.corp.intel.com (10.18.124.205) with Microsoft SMTP Server (TLS) id 14.3.439.0; Wed, 25 Mar 2020 06:16:53 -0700 Received: from shsmsx606.ccr.corp.intel.com (10.109.6.216) by SHSMSX606.ccr.corp.intel.com (10.109.6.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Wed, 25 Mar 2020 21:16:50 +0800 Received: from shsmsx606.ccr.corp.intel.com ([10.109.6.216]) by SHSMSX606.ccr.corp.intel.com ([10.109.6.216]) with mapi id 15.01.1713.004; Wed, 25 Mar 2020 21:16:50 +0800 From: "Liming Gao" To: "devel@edk2.groups.io" , "cheptsov@ispras.ru" , Andrew Fish CC: =?utf-8?B?TWFydmluIEjDpHVzZXI=?= Subject: Re: [edk2-devel] CLANGPDB binary debugging Thread-Topic: [edk2-devel] CLANGPDB binary debugging Thread-Index: AQHV/soxP7l2HCkUa0i+ixto7UtQYahRU82AgAD/kICAAHDqgIAAF0AAgAAp14CAAlyqAIADUvcQ Date: Wed, 25 Mar 2020 13:16:50 +0000 Message-ID: <86c6477b5a354eb98ae4e637a764dc5d@intel.com> References: <9804C565-0C9E-4778-92A7-06EA6AD8D694@ispras.ru> <7E18AD8F-9A44-45FE-A8C8-CE06A6328930@apple.com> <63396616-D8CF-4135-B967-772C1E6136BD@apple.com> <5C8DD065-0140-428B-A146-999A5694BC99@ispras.ru> <3D39F81F-6EBC-4079-8FC0-0112D756F0EB@ispras.ru> In-Reply-To: <3D39F81F-6EBC-4079-8FC0-0112D756F0EB@ispras.ru> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-version: 11.2.0.6 dlp-product: dlpe-windows dlp-reaction: no-action x-originating-ip: [10.239.127.36] MIME-Version: 1.0 Return-Path: liming.gao@intel.com Content-Language: en-US Content-Type: multipart/alternative; boundary="_000_86c6477b5a354eb98ae4e637a764dc5dintelcom_" --_000_86c6477b5a354eb98ae4e637a764dc5dintelcom_ Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Vml0YWx5Og0KIFRoYW5rcyBmb3IgeW91ciBmdXJ0aGVyIGludmVzdGlnYXRpb24gd2l0aCBMTERC LiBOb3csIHdlIGhhdmUgdHdvIENMQU5HIHRvb2wgY2hhaW4uIENMQU5HUERCIGFuZCBDTEFORzM4 LiBDTEFOR1BEQiB3b3JrcyB3aXRoIExMVk05LjAgb3IgYWJvdmUgdG8gZ2VuZXJhdGUgUEUgaW1h Z2Ugd2l0aCBQREIgZGVidWcgc3ltYm9sLiBDTEFORzM4IGNhbiBhbHNvIGJlIHVzZWQgdG8gZ2Vu ZXJhdGUgRUxGIGltYWdlIGFuZCBjb252ZXJ0IHRvIFBFIGltYWdlIHdpdGggRFdBUkYgZGVidWcg c3ltYm9sIG9uIExpbnV4IGhvc3QuIFNvLCB0aGVzZSB0d28gY2hhaW5zIGNvdmVyIGJvdGggdXNh Z2UgbW9kZWxzLiBXZSBkb27igJl0IG5lZWQgdG8gaW50cm9kdWNlIG5ldyBDTEFOR0RXQVJGIHRv b2wgY2hhaW4uIEZvciBMTERCIGlzc3VlIG9uIFBEQiBkZWJ1ZyBzeW1ib2wsIEkgc3VnZ2VzdCB0 byByZXBvcnQgdGhlbSBpbiBMTFZNLg0KDQogQmVzaWRlcywgTExWTTEwLjAgaXMganVzdCByZWxl YXNlZC4NCg0KVGhhbmtzDQpMaW1pbmcNCkZyb206IGRldmVsQGVkazIuZ3JvdXBzLmlvIDxkZXZl bEBlZGsyLmdyb3Vwcy5pbz4gT24gQmVoYWxmIE9mIFZpdGFseSBDaGVwdHNvdg0KU2VudDogMjAy MOW5tDPmnIgyM+aXpSAxNzoxMA0KVG86IEFuZHJldyBGaXNoIDxhZmlzaEBhcHBsZS5jb20+OyBH YW8sIExpbWluZyA8bGltaW5nLmdhb0BpbnRlbC5jb20+DQpDYzogZGV2ZWxAZWRrMi5ncm91cHMu aW87IE1hcnZpbiBIw6R1c2VyIDxtaGFldXNlckBvdXRsb29rLmRlPg0KU3ViamVjdDogUmU6IFtl ZGsyLWRldmVsXSBDTEFOR1BEQiBiaW5hcnkgZGVidWdnaW5nDQoNCkFuZHJldywNCg0KSSBpbnZl c3RpZ2F0ZWQgZnVydGhlciBhbmQgd2FzIGFibGUgdG8gbWFrZSBzb21lIHByb2dyZXNzLiBJIGdv dCByaWQgb2YgUERCLCBhbmQgY2hhbmdlZCBkZWJ1ZyBpbmZvcm1hdGlvbiBnZW5lcmF0aW9uIHRv IERXQVJGWzFdLiBUaGlzIHJlc29sdmVkIG1vc3Qgb2YgTExEQiBjcmFzaGVzIGFuZCBtYWRlIHBy ZXR0eS1wcmludGluZyB3b3JrIGp1c3QgZmluZSBhcyB0eXBlIGFsaWFzZXMgbGlrZSBFRklfU1RB VFVTIG5vdyB3b3JrIGNvcnJlY3RseSAoSSBhbSBzdGlsbCB0byBjb21taXQgdGhpcykuIFVuZm9y dHVuYXRlbHkgdGhlcmUgYXJlIHNldmVyYWwgZG93bnNpZGVzLiBEZWFkIGNvZGUgc3RyaXBwaW5n IGluIExMRCBsaW5rZXIgaXMgYnJva2VuIHdoZW4gZ2VuZXJhdGluZyBQRSB3aXRoIERXQVJGLCBz byBJIGhhZCB0byBwYXRjaCBpdFsyXS4gRGVidWcgbGluayBpbXBsZW1lbnRhdGlvbiBpbiBsbHZt LW9iamNvcHkgaXMgYWxzbyBxdWl0ZSB1Z2x5LCB3ZSBkbyBub3QgZ2V0IE1UT0Mgb3IgYW55dGhp bmcgYWxpa2VbM10sIGp1c3Qgc29tZSBzZWN0aW9uIHdpdGggYSByYW5kb20gbmFtZSBjb250YWlu aW5nIGJhc2UgZmlsZW5hbWUuDQoNCkkgY2FuIHN1Ym1pdCBhIG1vcmUgcHJvcGVyIHBhdGNoIHRv IEVESyBJSSBwcm9wZXJseSBpbXBsZW1lbnRpbmcgQ0xBTkdEV0FSRiB0b29sY2hhaW4gaW5zdGVh ZCBvZiBwYXRjaGluZyBDTEFOR1BEQiBsaWtlIGluIFsxXSwgYnV0IGl0IGlzIHF1ZXN0aW9uYWJs ZSB3aGV0aGVyIGl0IGlzIHdvcnRoIGl0LiBMTFZNIDEwIHdpbGwgbGFuZCB2ZXJ5IHNvb24sIGFu ZCB0aGUgbmVjZXNzYXJ5IExMRCBwYXRjaGVzWzJdIHdpbGwgZGVmaW5pdGVseSBub3QgbWFrZSB0 aGVpciB3YXkgaW4gdGhpcyByZWxlYXNlLiBXZSB3aWxsIGhhdmUgdG8gd2FpdCBmb3IgTExWTSAx MSBhdCB0aGUgdmVyeSBsZWFzdCwgYW5kIEkgYW0gbm90IHN1cmUgSSBhbSByZWFkeSB0byBkcml2 ZSBsbHZtLW9iamNvcHkgY2hhbmdlcyBlaXRoZXIuIExpbWluZywgd2hhdCBkbyB5b3UgdGhpbms/ DQoNCkkndmUgbm90IHVzZWQgdGhlIGZha2UgaW1hZ2UgdG8gZ2V0IHRoaW5ncyBkb25lIHNvIEkg Y2FuJ3Qgc3BlYWsgdG8gdGhhdC4gSSBoYXZlIHVzZWQgYSBmYWtlIHRhcmdldCBzbyBJIGNvdWxk IGhhdmUgWElQIFBFSU0gYW5kIHNoYWRvd2VkIFBFSU0gYWRkcmVzcyBhdmFpbGFibGUgYXQgdGhl IHNhbWUgdGltZS4gWW91IGNhbid0IGhhdmUgYSBtb2R1bGUgbG9hZGVkIGF0IDIgYWRkcmVzc2Vz IGF0IHRoZSBzYW1lIHRpbWUgaW4gbGxsZGIuIEJ1dCB5b3UgbWlnaHQgYmUgYWJsZSB0byB1c2Ug YSBmYWtlIHRhcmdldCBmb3IgeW91ciBmYWtlIHN0dWZmPw0KDQpKdXN0IGluIGNhc2U6DQoNCiAg ICAgICAgICAjIGNyZWF0ZSBhIGZha2EgdGFyZ2V0IHRvIHN0b3JlIGluZm8gYWJvdXQgc3ltYm9s cw0KICAgICAgICAgIFBlaVhpcFRhcmdldCA9IHRhcmdldC5kZWJ1Z2dlci5DcmVhdGVUYXJnZXQg KE5vbmUsICJpMzg2LWFwcGxlLW1hY29zeCIsICJyZW1vdGUtbWFjb3N4IiwgVHJ1ZSwgZXJyb3Ip DQoNCiAgICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgZ2RiLXJlbW90ZSAgY29ubmVjdGlvbiB0YXJn ZXQgaXMgdGhlIGFjdGl2ZSB0YXJnZXQNCiAgICAgICAgICB0YXJnZXQuZGVidWdnZXIuU2V0U2Vs ZWN0ZWRUYXJnZXQgKHRhcmdldCkNCg0KWWVzLCB0aGF0IHdhcyBhY3R1YWxseSBhIHNtYXJ0IGlk ZWEuIEkgaW5pdGlhbGx5IGRpZCBpdCB0aGF0IHdheSwgYXMgSSBoYWQgbWl4aW5nIE1hY2gtTyBh bmQgUEUgdHJpcGxlcywgYnV0IGxhdGVyIHJlbW92ZWQsIHdoaWNoIHdhcyBhY3R1YWxseSBhIG1p c3Rha2UuIE5vdyBJIGhhdmUgYSBmYWtlIHRhcmdldCBmb3IgR2RiU3ltcyBhbmQgYSBwcm9wZXIg dGFyZ2V0IGZvciBvdGhlciBpbWFnZXNbNF0uIFRoaXMgc29tZXdoYXQgc29sdmVzIHRoZSBpc3N1 ZSB3aXRoIGludmFsaWQgYWRkcmVzc2VzIGZvciBnU1QsIGFzIGdTVCBmcm9tIER4ZUNvcmUgaXMg bm93IHBpY2tlZC4gSG93ZXZlciwgSSBjYW5ub3QgYWNjZXNzIGdsb2JhbCB2YXJpYWJsZXMgZnJv bSBvdGhlciBtb2R1bGVzIGZvciBzb21lIHJlYXNvbiBzdGlsbC4NCg0KSWYgeW91IHdhbnQgdG8g aW5zcGVjdCBnbG9iYWxzIEkgdGhpbmsgdGhpcyBsb2dpYyB3b3JrcyB0byBnZXQgeW91IGRhdGEs IHlvdSB3b3VsZCBuZWVkIHRvIHByaW50IGl0IG91dCBldGMuDQoNClNCVmFsdWVMaXN0ID0gbGxk Yi50YXJnZXQuRmluZEdsb2JhbFZhcmlhYmxlcyAoImdTVCIsIDEwMjQpDQpmb3IgU0JWYWx1ZSBp biBTQlZhbHVlTGlzdDoNCk1vZHVsZSA9IFNCVmFsdWUuR2V0QWRkcmVzcygpLkdldE1vZHVsZSgp DQogICAgICAgIE1vZHVsZVN0ciA9IFNCVmFsdWUuR2V0QWRkcmVzcygpLkdldE1vZHVsZSgpLkdl dEZpbGVTcGVjKCkuR2V0RmlsZW5hbWUoKQ0KICAgICAgICBTdGFydCA9IGludCAoU0JWYWx1ZS5H ZXRMb2NhdGlvbigpLCAwKQ0KICAgICAgICBFbmQgPSBTdGFydCArIFNCVmFsdWUuR2V0Qnl0ZVNp emUoKSAtIDENCiAgICAgICAgU0JEZWNsYXJhdGlvbiA9IFNCVmFsdWUuR2V0RGVjbGFyYXRpb24o KQ0KICAgICAgICBDb2x1bW4gPSBTQkRlY2xhcmF0aW9uLkdldENvbHVtbigpDQoNCkkgd3JvdGUg YSBjb21tYW5kIGluIHRoZSBlYXJseSBkYXlzIHRvIGR1bXAgb3V0IGFsbCB0aGUgaW5zdGFuY2Vz IG9mIGEgZ2xvYmFsLg0KDQpZb3UgY2FuIGFsc28gdHJ5IChsbGRiKSBpbWFnZSBsb29rdXAgLUF2 IC0tbmFtZSBnU1QNCg0KU29tZXRoaW5nIGlzIHJlYWxseSB3ZWlyZCwgZ1NUIGZyb20gdGhlIGZp cnN0IGltYWdlIHNob3dzLCBidXQgbGxkYiBiZWxpZXZlcyB0aGF0IGl0IGRvZXMgbm90IGV4aXN0 LiBsbGRiLnRhcmdldC5GaW5kR2xvYmFsVmFyaWFibGVzICgiZ1NUIiwgMTAyNCkgYWxzbyByZXR1 cm5zIGFuIGVtcHR5IGxpc3QuDQoNCkkgbm90aWNlZCB0aGF0IExMREIgc2hvd3MgaW52YWxpZCB0 eXBlIGZvciBnU1QgaW4gdGhlIHN5bXRhYiwgdGhlcmUgYWxzbyBpcyBubyBhZGRyZXNzLiBJIHN0 YXJ0ZWQgdG8gd29uZGVyIHdoZXRoZXIgdGhpcyBpcyB0aGUgY2F1c2UgYW5kIGRlY2lkZWQgdG8g Y2hlY2sgWENPREU1LCBhcyB0aGUgdGhlIGlzc3VlIGNvdWxkIGhhdmUgYmVlbiB3aXRoIFBFIGZv cm1hdC4gVW5mb3J0dW5hdGVseSBldmVuIGFmdGVyIEkgdHJpZWQgWENPREU1IHN1cHBvcnQgd2l0 aCBMTERCLCBJIGdvdCBleGFjdGx5IHRoZSBzYW1lIHByb2JsZW0uIEkgYW0gcXVpdGUgY2x1ZWxl c3Mgd2hhdCBpcyBnb2luZyBvbi4gQmVsb3cgSSBpbmNsdWRlZCB0d28gdHJhbnNjcmlwdHM6IGZv ciBDTEFOR0RXQVJGIGFuZCBYQ09ERTUuDQoNCihsbGRiKSBwIGdTVA0KKEVGSV9TWVNURU1fVEFC TEUgKikgJDAgPSAweDAwMDAwMDAwN2Y5ZWUwMTgNCihsbGRiKSBwICpnU1QNCihFRklfU1lTVEVN X1RBQkxFKSAkMSA9IHsNCiAgSGRyID0gKFNpZ25hdHVyZSA9IDB4NTQ1MzU5NTMyMDQ5NDI0OSwg UmV2aXNpb24gPSAweDAwMDIwMDQ2LCBIZWFkZXJTaXplID0gMHgwMDAwMDA3OCwgQ1JDMzIgPSAw eDNkNWU5YjVkLCBSZXNlcnZlZCA9IDB4MDAwMDAwMDApDQogIEZpcm13YXJlVmVuZG9yID0gMHgw MDAwMDAwMDdmOWU5Yzk4DQogIEZpcm13YXJlUmV2aXNpb24gPSAweDAwMDEwMDAwDQogIENvbnNv bGVJbkhhbmRsZSA9IDB4MDAwMDAwMDA3ZWQ1OGYxOA0KICBDb25JbiA9IDB4MDAwMDAwMDA3ZTZl ZGNiOA0KICBDb25zb2xlT3V0SGFuZGxlID0gMHgwMDAwMDAwMDdlZDU3MDE4DQogIENvbk91dCA9 IDB4MDAwMDAwMDA3ZTZlZGU0MA0KICBTdGFuZGFyZEVycm9ySGFuZGxlID0gMHgwMDAwMDAwMDdl ZDU3YTk4DQogIFN0ZEVyciA9IDB4MDAwMDAwMDA3ZTZlZTAzMA0KICBSdW50aW1lU2VydmljZXMg PSAweDAwMDAwMDAwN2Y5ZWViOTgNCiAgQm9vdFNlcnZpY2VzID0gMHgwMDAwMDAwMDdmZTY4OWU4 DQogIE51bWJlck9mVGFibGVFbnRyaWVzID0gMHgwMDAwMDAwMDAwMDAwMDBhDQogIENvbmZpZ3Vy YXRpb25UYWJsZSA9IDB4MDAwMDAwMDA3ZjllZWM5OA0KfQ0KKGxsZGIpIGltYWdlIGxvb2t1cCAt QXYgLS1uYW1lIGdTVA0KKGxsZGIpIGltYWdlIGR1bXAgc2VjdGlvbnMNCkR1bXBpbmcgc2VjdGlv bnMgZm9yIDkwIG1vZHVsZXMuDQpTZWN0aW9ucyBmb3IgJy9Vc2Vycy91c2VyL0RvY3VtZW50cy9V ZWZpV29ya3NwYWNlL0J1aWxkL092bWZYNjQvTk9PUFRfQ0xBTkdQREIvWDY0L0R4ZUNvcmUuZGVi dWcnICh4ODZfNjQpOg0KICBTZWN0SUQgICAgIFR5cGUgICAgICAgICAgICAgTG9hZCBBZGRyZXNz ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJtIEZpbGUgT2ZmLiAgRmlsZSBTaXplICBG bGFncyAgICAgIFNlY3Rpb24gTmFtZQ0KICAtLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0gLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tIC0tLS0tLS0tLS0gLS0t LS0tLS0tLSAtLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgMHhmZmZm ZmZmZmZmZmZmZmZmIGNvbnRhaW5lciAgICAgICAgWzB4MDAwMDAwMDA3ZmUxYjAwMC0weDAwMDAw MDAwN2ZmMzhhYzApICAtLS0gIDB4MDAwMDAwMDAgMHgwMDAwMDAwMCAweDAwMDAwMDAwIER4ZUNv cmUuZGVidWcuDQogIDB4MDAwMDAwMDEgY29kZSAgICAgICAgICAgICBbMHgwMDAwMDAwMDdmZTFi MzIwLTB4MDAwMDAwMDA3ZmU2MWYzNCkgIC0tLSAgMHgwMDAwMDMyMCAweDAwMDQ2YzIwIDB4NjAw MDAwMjAgRHhlQ29yZS5kZWJ1Zy4uLnRleHQNCiAgMHgwMDAwMDAwMiBkYXRhICAgICAgICAgICAg IFsweDAwMDAwMDAwN2ZlNjFmNDAtMHgwMDAwMDAwMDdmZTY4MGYxKSAgLS0tICAweDAwMDQ2ZjQw IDB4MDAwMDYxYzAgMHg0MDAwMDA0MCBEeGVDb3JlLmRlYnVnLi4ucmRhdGENCiAgMHgwMDAwMDAw MyBkYXRhICAgICAgICAgICAgIFsweDAwMDAwMDAwN2ZlNjgxMDAtMHgwMDAwMDAwMDdmZTZkMWUw KSAgLS0tICAweDAwMDRkMTAwIDB4MDAwMDE4YTAgMHhjMDAwMDA0MCBEeGVDb3JlLmRlYnVnLi4u ZGF0YQ0KICAweDAwMDAwMDA0IHJlZ3VsYXIgICAgICAgICAgWzB4MDAwMDAwMDA3ZmU2ZDFlMC0w eDAwMDAwMDAwN2ZlNmQ0MjQpICAtLS0gIDB4MDAwNGU5YTAgMHgwMDAwMDI2MCAweDQyMDAwMDQw IER4ZUNvcmUuZGVidWcuLi5yZWxvYw0KICAweDAwMDAwMDA1IGR3YXJmLWFiYnJldiAgICAgWzB4 MDAwMDAwMDA3ZmU2ZDQ0MC0weDAwMDAwMDAwN2ZlNzQwNTkpICAtLS0gIDB4MDAwNGVjMDAgMHgw MDAwNmMyMCAweDQyMDAwMDQwIER4ZUNvcmUuZGVidWcuLi5kZWJ1Z19hYmJyZXYNCiAgMHgwMDAw MDAwNiBkd2FyZi1pbmZvICAgICAgIFsweDAwMDAwMDAwN2ZlNzQwNjAtMHgwMDAwMDAwMDdmZWMx MzU1KSAgLS0tICAweDAwMDU1ODIwIDB4MDAwNGQzMDAgMHg0MjAwMDA0MCBEeGVDb3JlLmRlYnVn Li4uZGVidWdfaW5mbw0KICAweDAwMDAwMDA3IGR3YXJmLWxpbmUgICAgICAgWzB4MDAwMDAwMDA3 ZmVjMTM2MC0weDAwMDAwMDAwN2ZlZjlmZDQpICAtLS0gIDB4MDAwYTJiMjAgMHgwMDAzOGM4MCAw eDQyMDAwMDQwIER4ZUNvcmUuZGVidWcuLi5kZWJ1Z19saW5lDQogIDB4MDAwMDAwMDggZHdhcmYt bWFjaW5mbyAgICBbMHgwMDAwMDAwMDdmZWY5ZmUwLTB4MDAwMDAwMDA3ZmVmYTA1NikgIC0tLSAg MHgwMDBkYjdhMCAweDAwMDAwMDgwIDB4NDIwMDAwNDAgRHhlQ29yZS5kZWJ1Zy4uLmRlYnVnX21h Y2luZm8NCiAgMHgwMDAwMDAwOSBkd2FyZi1yYW5nZXMgICAgIFsweDAwMDAwMDAwN2ZlZmEwNjAt MHgwMDAwMDAwMDdmZWZmNjEwKSAgLS0tICAweDAwMGRiODIwIDB4MDAwMDU1YzAgMHg0MjAwMDA0 MCBEeGVDb3JlLmRlYnVnLi4uZGVidWdfcmFuZ2VzDQogIDB4MDAwMDAwMGEgZHdhcmYtc3RyICAg ICAgICBbMHgwMDAwMDAwMDdmZWZmNjIwLTB4MDAwMDAwMDA3ZmYzOGFiZCkgIC0tLSAgMHgwMDBl MGRlMCAweDAwMDM5NGEwIDB4NDIwMDAwNDAgRHhlQ29yZS5kZWJ1Zy4uLmRlYnVnX3N0cg0KU2Vj dGlvbnMgZm9yICcvVXNlcnMvdXNlci9Eb2N1bWVudHMvVWVmaVdvcmtzcGFjZS9CdWlsZC9Pdm1m WDY0L05PT1BUX0NMQU5HUERCL1g2NC9EZXZpY2VQYXRoRHhlLmRlYnVnJyAoeDg2XzY0KToNCiAg U2VjdElEICAgICBUeXBlICAgICAgICAgICAgIExvYWQgQWRkcmVzcyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgUGVybSBGaWxlIE9mZi4gIEZpbGUgU2l6ZSAgRmxhZ3MgICAgICBTZWN0aW9u IE5hbWUNCiAgLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLSAtLS0tLS0tLS0tIC0tLS0tLS0tLS0gLS0tLS0tLS0t LSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIDB4ZmZmZmZmZmZmZmZmZmZmZiBjb250 YWluZXIgICAgICAgIFsweDAwMDAwMDAwN2Y5ODYwMDAtMHgwMDAwMDAwMDdmOWNiMGEwKSAgLS0t ICAweDAwMDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDAwMCBEZXZpY2VQYXRoRHhlLmRlYnVnLg0K ICAweDAwMDAwMDAxIGNvZGUgICAgICAgICAgICAgWzB4MDAwMDAwMDA3Zjk4NjMyMC0weDAwMDAw MDAwN2Y5OTZkYzYpICAtLS0gIDB4MDAwMDAzMjAgMHgwMDAxMGFjMCAweDYwMDAwMDIwIERldmlj ZVBhdGhEeGUuZGVidWcuLi50ZXh0DQogIDB4MDAwMDAwMDIgZGF0YSAgICAgICAgICAgICBbMHgw MDAwMDAwMDdmOTk2ZGUwLTB4MDAwMDAwMDA3Zjk5OWI3NSkgIC0tLSAgMHgwMDAxMGRlMCAweDAw MDAyZGEwIDB4NDAwMDAwNDAgRGV2aWNlUGF0aER4ZS5kZWJ1Zy4uLnJkYXRhDQogIDB4MDAwMDAw MDMgZGF0YSAgICAgICAgICAgICBbMHgwMDAwMDAwMDdmOTk5YjgwLTB4MDAwMDAwMDA3Zjk5YTIw MikgIC0tLSAgMHgwMDAxM2I4MCAweDAwMDAwNjYwIDB4YzAwMDAwNDAgRGV2aWNlUGF0aER4ZS5k ZWJ1Zy4uLmRhdGENCiAgMHgwMDAwMDAwNCByZWd1bGFyICAgICAgICAgIFsweDAwMDAwMDAwN2Y5 OWEyMjAtMHgwMDAwMDAwMDdmOTlhNDY0KSAgLS0tICAweDAwMDE0MWUwIDB4MDAwMDAyNjAgMHg0 MjAwMDA0MCBEZXZpY2VQYXRoRHhlLmRlYnVnLi4ucmVsb2MNCiAgMHgwMDAwMDAwNSBkd2FyZi1h YmJyZXYgICAgIFsweDAwMDAwMDAwN2Y5OWE0ODAtMHgwMDAwMDAwMDdmOTliZDA5KSAgLS0tICAw eDAwMDE0NDQwIDB4MDAwMDE4YTAgMHg0MjAwMDA0MCBEZXZpY2VQYXRoRHhlLmRlYnVnLi4uZGVi dWdfYWJicmV2DQogIDB4MDAwMDAwMDYgZHdhcmYtaW5mbyAgICAgICBbMHgwMDAwMDAwMDdmOTli ZDIwLTB4MDAwMDAwMDA3ZjlhZDhiNykgIC0tLSAgMHgwMDAxNWNlMCAweDAwMDExYmEwIDB4NDIw MDAwNDAgRGV2aWNlUGF0aER4ZS5kZWJ1Zy4uLmRlYnVnX2luZm8NCiAgMHgwMDAwMDAwNyBkd2Fy Zi1saW5lICAgICAgIFsweDAwMDAwMDAwN2Y5YWQ4YzAtMHgwMDAwMDAwMDdmOWJjMWY3KSAgLS0t ICAweDAwMDI3ODgwIDB4MDAwMGU5NDAgMHg0MjAwMDA0MCBEZXZpY2VQYXRoRHhlLmRlYnVnLi4u ZGVidWdfbGluZQ0KICAweDAwMDAwMDA4IGR3YXJmLW1hY2luZm8gICAgWzB4MDAwMDAwMDA3Zjli YzIwMC0weDAwMDAwMDAwN2Y5YmMyMjMpICAtLS0gIDB4MDAwMzYxYzAgMHgwMDAwMDA0MCAweDQy MDAwMDQwIERldmljZVBhdGhEeGUuZGVidWcuLi5kZWJ1Z19tYWNpbmZvDQogIDB4MDAwMDAwMDkg ZHdhcmYtcmFuZ2VzICAgICBbMHgwMDAwMDAwMDdmOWJjMjQwLTB4MDAwMDAwMDA3ZjliZTAyMCkg IC0tLSAgMHgwMDAzNjIwMCAweDAwMDAxZGUwIDB4NDIwMDAwNDAgRGV2aWNlUGF0aER4ZS5kZWJ1 Zy4uLmRlYnVnX3Jhbmdlcw0KICAweDAwMDAwMDBhIGR3YXJmLXN0ciAgICAgICAgWzB4MDAwMDAw MDA3ZjliZTAyMC0weDAwMDAwMDAwN2Y5Y2IwOTkpICAtLS0gIDB4MDAwMzdmZTAgMHgwMDAwZDA4 MCAweDQyMDAwMDQwIERldmljZVBhdGhEeGUuZGVidWcuLi5kZWJ1Z19zdHINCuKApg0KKGxsZGIp IGltYWdlIGR1bXAgc3ltdGFiDQpEdW1waW5nIHN5bWJvbCB0YWJsZSBmb3IgOTAgbW9kdWxlcy4N ClN5bXRhYiwgZmlsZSA9IC9Vc2Vycy91c2VyL0RvY3VtZW50cy9VZWZpV29ya3NwYWNlL0J1aWxk L092bWZYNjQvTk9PUFRfQ0xBTkdQREIvWDY0L0R4ZUNvcmUuZGVidWcsIG51bV9zeW1ib2xzID0g NDM0MzoNCiAgICAgICAgICAgICAgIERlYnVnIHN5bWJvbA0KICAgICAgICAgICAgICAgfFN5bnRo ZXRpYyBzeW1ib2wNCiAgICAgICAgICAgICAgIHx8RXh0ZXJuYWxseSBWaXNpYmxlDQogICAgICAg ICAgICAgICB8fHwNCkluZGV4ICAgVXNlcklEIERTWCBUeXBlICAgICAgICAgICAgRmlsZSBBZGRy ZXNzL1ZhbHVlIExvYWQgQWRkcmVzcyAgICAgICBTaXplICAgICAgICAgICAgICAgRmxhZ3MgICAg ICBOYW1lDQotLS0tLS0tIC0tLS0tLSAtLS0gLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0t LS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0gLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KWyAgICAwXSA0Mjk0OTY3Mjk1ICAgICBJ bnZhbGlkICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwMDA3ZmUxYjAwMCAweDAw MDAwMDAwMDAwMDAwM2EgMHgwMDAwMDAwMCAudGV4dA0KWyAgICAxXSA0Mjk0OTY3Mjk1ICAgICBJ bnZhbGlkICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgICAgICAweDAw MDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAwMCAuZGF0YQ0KWyAgICAyXSA0Mjk0OTY3Mjk1ICAgICBJ bnZhbGlkICAgICAgICAgMHgwMDAwMDAwMDAwMDAxODk4ICAgICAgICAgICAgICAgICAgICAweDAw MDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAwMCAuYnNzDQpbICAgIDNdIDQyOTQ5NjcyOTUgICAgIElu dmFsaWQgICAgICAgICAweDAwMDAwMDAwMDAwNDZiYzAgMHgwMDAwMDAwMDdmZTYxYmMwIDB4MDAw MDAwMDAwMDAwMDM3NCAweDAwMDAwMDAwIC50ZXh0JF9Nb2R1bGVFbnRyeVBvaW50DQpbICAgIDRd IDQyOTQ5NjcyOTUgICAgIENvZGUgICAgICAgICAgICAweDAwMDAwMDAwMDAwNDZiYzAgMHgwMDAw MDAwMDdmZTYxYmMwIDB4MDAwMDAwMDAwMDAwMDM3NCAweDAwMDAwMDAwIF9Nb2R1bGVFbnRyeVBv aW50DQpbICAgIDVdIDQyOTQ5NjcyOTUgICAgIEludmFsaWQgICAgICAgICAweDAwMDAwMDAwMDAw MDFiMDggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMCAweDAwMDAwMDAwIC5i c3MkZ0hvYkxpc3QNClsgICAgNl0gNDI5NDk2NzI5NSAgICAgSW52YWxpZCAgICAgICAgIDB4MDAw MDAwMDAwMDAwMWIwOCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAw MDAwMDAgZ0hvYkxpc3QNClsgICAgN10gNDI5NDk2NzI5NSAgICAgSW52YWxpZCAgICAgICAgIDB4 MDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAwIDB4 MDAwMDAwMDAgLnJkYXRhDQpbICAgIDhdIDQyOTQ5NjcyOTUgICAgIEludmFsaWQgICAgICAgICAw eDAwMDAwMDAwMDAwMDAwMDAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMCAw eDAwMDAwMDAwIC5zdHINClsgICAgOV0gNDI5NDk2NzI5NSAgICAgSW52YWxpZCAgICAgICAgIDB4 MDAwMDAwMDAwMDAwMDA1OCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAwIDB4 MDAwMDAwMDAgLnJkYXRhDQpbICAgMTBdIDQyOTQ5NjcyOTUgICAgIEludmFsaWQgICAgICAgICAw eDAwMDAwMDAwMDAwMDAwNTggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMCAw eDAwMDAwMDAwIC5zdHIuMQ0KWyAgIDExXSA0Mjk0OTY3Mjk1ICAgICBJbnZhbGlkICAgICAgICAg MHgwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDAg MHgwMDAwMDAwMCAuZGVidWdfc3RyDQpbICAgMTJdIDQyOTQ5NjcyOTUgICAgIEludmFsaWQgICAg ICAgICAweDAwMDAwMDAwMDAwMDAwMDAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAw MDAwMCAweDAwMDAwMDAwIC5kZWJ1Z19hYmJyZXYNClsgICAxM10gNDI5NDk2NzI5NSAgICAgSW52 YWxpZCAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgICAgICAgICAgMHgwMDAw MDAwMDAwMDAwMDAwIDB4MDAwMDAwMDAgLmRlYnVnX2luZm8NClsgICAxNF0gNDI5NDk2NzI5NSAg ICAgSW52YWxpZCAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgICAgICAgICAg MHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwMDAgLmRlYnVnX3Jhbmdlcw0KWyAgIDE1XSA0Mjk0 OTY3Mjk1ICAgICBJbnZhbGlkICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAg ICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAwMCAuZGVidWdfbWFjaW5mbw0KWyAg IDE2XSA0Mjk0OTY3Mjk1ICAgICBJbnZhbGlkICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAwICAg ICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAwMCAuZGVidWdfbGlu ZQ0KWyAgIDE3XSA0Mjk0OTY3Mjk1ICAgICBDb2RlICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDNm NjgwIDB4MDAwMDAwMDA3ZmU1YTY4MCAweDAwMDAwMDAwMDAwMDAwMjAgMHgwMDAwMDAwMCBQcm9j ZXNzTW9kdWxlRW50cnlQb2ludExpc3QNClsgICAxOF0gNDI5NDk2NzI5NSAgICAgQ29kZSAgICAg ICAgICAgIDB4MDAwMDAwMDAwMDAyMzEzMCAweDAwMDAwMDAwN2ZlM2UxMzAgMHgwMDAwMDAwMDAw MDAwMDIwIDB4MDAwMDAwMDAgRGVidWdBc3NlcnRFbmFibGVkDQpbICAgMTldIDQyOTQ5NjcyOTUg ICAgIENvZGUgICAgICAgICAgICAweDAwMDAwMDAwMDAwMjMwNjAgMHgwMDAwMDAwMDdmZTNlMDYw IDB4MDAwMDAwMDAwMDAwMDBkMCAweDAwMDAwMDAwIERlYnVnQXNzZXJ0DQpbICAgMjBdIDQyOTQ5 NjcyOTUgICAgIENvZGUgICAgICAgICAgICAweDAwMDAwMDAwMDAwMjIxNTAgMHgwMDAwMDAwMDdm ZTNkMTUwIDB4MDAwMDAwMDAwMDAwMDAyMCAweDAwMDAwMDAwIENwdURlYWRMb29wDQpbICAgMjFd IDQyOTQ5NjcyOTUgICAgIEludmFsaWQgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDAgMHgwMDAw MDAwMDdmZTFiMDAwIDB4MDAwMDAwMDAwMDAwMDAzYSAweDAwMDAwMDAwIC50ZXh0DQpbICAgMjJd IDQyOTQ5NjcyOTUgICAgIEludmFsaWQgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDAgICAgICAg ICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMCAweDAwMDAwMDAwIC5kYXRhDQpbICAgMjNd IDQyOTQ5NjcyOTUgICAgIEludmFsaWQgICAgICAgICAweDAwMDAwMDAwMDAwMDE4OTggICAgICAg ICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMCAweDAwMDAwMDAwIC5ic3MNClsgICAyNF0g NDI5NDk2NzI5NSAgICAgSW52YWxpZCAgICAgICAgIDB4MDAwMDAwMDAwMDAzZjI0MCAweDAwMDAw MDAwN2ZlNWEyNDAgMHgwMDAwMDAwMDAwMDAwNDQwIDB4MDAwMDAwMDAgLnRleHQkUHJvY2Vzc0xp YnJhcnlDb25zdHJ1Y3Rvckxpc3QNClsgICAyNV0gNDI5NDk2NzI5NSAgICAgQ29kZSAgICAgICAg ICAgIDB4MDAwMDAwMDAwMDAzZjI0MCAweDAwMDAwMDAwN2ZlNWEyNDAgMHgwMDAwMDAwMDAwMDAw NDQwIDB4MDAwMDAwMDAgUHJvY2Vzc0xpYnJhcnlDb25zdHJ1Y3Rvckxpc3QNClsgICAyNl0gNDI5 NDk2NzI5NSAgICAgSW52YWxpZCAgICAgICAgIDB4MDAwMDAwMDAwMDAzZjY4MCAweDAwMDAwMDAw N2ZlNWE2ODAgMHgwMDAwMDAwMDAwMDAwMDIwIDB4MDAwMDAwMDAgLnRleHQkUHJvY2Vzc01vZHVs ZUVudHJ5UG9pbnRMaXN0DQpbICAgMjddIDQyOTQ5NjcyOTUgICAgIEludmFsaWQgICAgICAgICAw eDAwMDAwMDAwMDAwMDAwNzAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMCAw eDAwMDAwMDAwIC5kYXRhJGdFZmlDYWxsZXJJZEd1aWQNClsgICAyOF0gNDI5NDk2NzI5NSAgICAg SW52YWxpZCAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDA3MCAgICAgICAgICAgICAgICAgICAgMHgw MDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwMDAgZ0VmaUNhbGxlcklkR3VpZA0KWyAgIDI5XSA0Mjk0 OTY3Mjk1ICAgICBJbnZhbGlkICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMTQ4ICAgICAgICAgICAg ICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAwMCAuZGF0YSRnRWZpRXZlbnRNZW1v cnlNYXBDaGFuZ2VHdWlkDQpbICAgMzBdIDQyOTQ5NjcyOTUgICAgIEludmFsaWQgICAgICAgICAw eDAwMDAwMDAwMDAwMDAxNDggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMCAw eDAwMDAwMDAwIGdFZmlFdmVudE1lbW9yeU1hcENoYW5nZUd1aWQNClsgICAzMV0gNDI5NDk2NzI5 NSAgICAgSW52YWxpZCAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDE2OCAgICAgICAgICAgICAgICAg ICAgMHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwMDAgLmRhdGEkZ0VmaUV2ZW50VmlydHVhbEFk ZHJlc3NDaGFuZ2VHdWlkDQpbICAgMzJdIDQyOTQ5NjcyOTUgICAgIEludmFsaWQgICAgICAgICAw eDAwMDAwMDAwMDAwMDAxNjggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMCAw eDAwMDAwMDAwIGdFZmlFdmVudFZpcnR1YWxBZGRyZXNzQ2hhbmdlR3VpZA0KWyAgIDMzXSA0Mjk0 OTY3Mjk1ICAgICBJbnZhbGlkICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMTM4ICAgICAgICAgICAg ICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAwMCAuZGF0YSRnRWZpRXZlbnRFeGl0 Qm9vdFNlcnZpY2VzR3VpZA0KWyAgIDM0XSA0Mjk0OTY3Mjk1ICAgICBJbnZhbGlkICAgICAgICAg MHgwMDAwMDAwMDAwMDAwMTM4ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDAg MHgwMDAwMDAwMCBnRWZpRXZlbnRFeGl0Qm9vdFNlcnZpY2VzR3VpZA0K4oCmLg0KWyAgMzAzXSA0 Mjk0OTY3Mjk1ICAgICBJbnZhbGlkICAgICAgICAgMHgwMDAwMDAwMDAwMDAxYjYwICAgICAgICAg ICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAwMCAuYnNzJGdTVA0KWyAgMzA0 XSA0Mjk0OTY3Mjk1ICAgICBJbnZhbGlkICAgICAgICAgMHgwMDAwMDAwMDAwMDAxYjYwICAgICAg ICAgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAwMCBnU1QNClsgIDMwNV0g NDI5NDk2NzI5NSAgICAgSW52YWxpZCAgICAgICAgIDB4MDAwMDAwMDAwMDAwMThhMCAgICAgICAg ICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwMDAgLmJzcyRnQlMNClsgIDMw Nl0gNDI5NDk2NzI5NSAgICAgSW52YWxpZCAgICAgICAgIDB4MDAwMDAwMDAwMDAwMThhMCAgICAg ICAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwMDAgZ0JTDQrigKYNCg0K 4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCUDQoNCihsbGRiKSBw IGdTVA0KKEVGSV9TWVNURU1fVEFCTEUgKikgJDIgPSAweDAwMDAwMDAwN2ZiZWUwMTgNCihsbGRi KSBwICZnU1QNCihFRklfU1lTVEVNX1RBQkxFICoqKSAkNCA9IDB4MDAwMDAwMDA3ZmU2ZDc4OA0K KGxsZGIpIHAgKmdTVA0KKEVGSV9TWVNURU1fVEFCTEUpICQzID0gew0KICBIZHIgPSAoU2lnbmF0 dXJlID0gMHg1NDUzNTk1MzIwNDk0MjQ5LCBSZXZpc2lvbiA9IDB4MDAwMjAwNDYsIEhlYWRlclNp emUgPSAweDAwMDAwMDc4LCBDUkMzMiA9IDB4NTM1NWRiZTIsIFJlc2VydmVkID0gMHgwMDAwMDAw MCkNCiAgRmlybXdhcmVWZW5kb3IgPSAweDAwMDAwMDAwN2ZiZTljOTgNCiAgRmlybXdhcmVSZXZp c2lvbiA9IDB4MDAwMTAwMDANCiAgQ29uc29sZUluSGFuZGxlID0gMHgwMDAwMDAwMDdlZGU1YTk4 DQogIENvbkluID0gMHgwMDAwMDAwMDdlOTVmNjQwDQogIENvbnNvbGVPdXRIYW5kbGUgPSAweDAw MDAwMDAwN2VkZTRlOTgNCiAgQ29uT3V0ID0gMHgwMDAwMDAwMDdlOTVmODAwDQogIFN0YW5kYXJk RXJyb3JIYW5kbGUgPSAweDAwMDAwMDAwN2VkZTRiOTgNCiAgU3RkRXJyID0gMHgwMDAwMDAwMDdl OTVmOTEwDQogIFJ1bnRpbWVTZXJ2aWNlcyA9IDB4MDAwMDAwMDA3ZmJlZWI5OA0KICBCb290U2Vy dmljZXMgPSAweDAwMDAwMDAwN2ZlNmNkZTgNCiAgTnVtYmVyT2ZUYWJsZUVudHJpZXMgPSAweDAw MDAwMDAwMDAwMDAwMDkNCiAgQ29uZmlndXJhdGlvblRhYmxlID0gMHgwMDAwMDAwMDdmYmVlYzk4 DQp9DQoobGxkYikgaW1hZ2UgbG9va3VwIC1BdiAtLW5hbWUgZ1NUDQoobGxkYikgaW1hZ2UgZHVt cCBzZWN0aW9ucw0KRHVtcGluZyBzZWN0aW9ucyBmb3IgODggbW9kdWxlcy4NClNlY3Rpb25zIGZv ciAnL1VzZXJzL3VzZXIvRG9jdW1lbnRzL1VlZmlXb3Jrc3BhY2UvQnVpbGQvT3ZtZlg2NC9OT09Q VF9YQ09ERTUvWDY0L01kZU1vZHVsZVBrZy9Db3JlL0R4ZS9EeGVNYWluL0RFQlVHL0R4ZUNvcmUu ZGxsJyAoeDg2XzY0KToNCiAgU2VjdElEICAgICBUeXBlICAgICAgICAgICAgIExvYWQgQWRkcmVz cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVybSBGaWxlIE9mZi4gIEZpbGUgU2l6ZSAg RmxhZ3MgICAgICBTZWN0aW9uIE5hbWUNCiAgLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLSAtLS0tLS0tLS0tIC0t LS0tLS0tLS0gLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIDB4MDAw MDAxMDAgY29udGFpbmVyICAgICAgICBbMHgwMDAwMDAwMDdmZTI2MjQwLTB4MDAwMDAwMDA3ZmU2 YmI0MCkgIHIteCAgMHgwMDAwMDRhMCAweDAwMDQ1OTAwIDB4MDAwMDAwMDAgRHhlQ29yZS5kbGwu X19URVhUDQogIDB4MDAwMDAwMDEgY29kZSAgICAgICAgICAgICBbMHgwMDAwMDAwMDdmZTI2MjQw LTB4MDAwMDAwMDA3ZmU2NWJkOCkgIHIteCAgMHgwMDAwMDRhMCAweDAwMDNmOTk4IDB4ODAwMDA0 MDAgRHhlQ29yZS5kbGwuX19URVhULl9fdGV4dA0KICAweDAwMDAwMDAyIGRhdGEtY3N0ciAgICAg ICAgWzB4MDAwMDAwMDA3ZmU2NWJkOC0weDAwMDAwMDAwN2ZlNmJhMjMpICByLXggIDB4MDAwM2Zl MzggMHgwMDAwNWU0YiAweDAwMDAwMDAyIER4ZUNvcmUuZGxsLl9fVEVYVC5fX2NzdHJpbmcNCiAg MHgwMDAwMDAwMyByZWd1bGFyICAgICAgICAgIFsweDAwMDAwMDAwN2ZlNmJhMjQtMHgwMDAwMDAw MDdmZTZiYTZjKSAgci14ICAweDAwMDQ1Yzg0IDB4MDAwMDAwNDggMHgwMDAwMDAwMCBEeGVDb3Jl LmRsbC5fX1RFWFQuX191c3RyaW5nDQogIDB4MDAwMDAwMDQgcmVndWxhciAgICAgICAgICBbMHgw MDAwMDAwMDdmZTZiYTcwLTB4MDAwMDAwMDA3ZmU2YmI0MCkgIHIteCAgMHgwMDA0NWNkMCAweDAw MDAwMGQwIDB4MDAwMDAwMDAgRHhlQ29yZS5kbGwuX19URVhULl9fY29uc3QNCiAgMHgwMDAwMDIw MCBjb250YWluZXIgICAgICAgIFsweDAwMDAwMDAwN2ZlNmJiNDAtMHgwMDAwMDAwMDdmZTcwZTYw KSAgcnctICAweDAwMDQ1ZGEwIDB4MDAwMDFhZTAgMHgwMDAwMDAwMCBEeGVDb3JlLmRsbC5fX0RB VEENCiAgMHgwMDAwMDAwNSByZWd1bGFyICAgICAgICAgIFsweDAwMDAwMDAwN2ZlNmJiNDAtMHgw MDAwMDAwMDdmZTZiZDU4KSAgcnctICAweDAwMDQ1ZGEwIDB4MDAwMDAyMTggMHgwMDAwMDAwMCBE eGVDb3JlLmRsbC5fX0RBVEEuX19jb25zdA0KICAweDAwMDAwMDA2IGRhdGEgICAgICAgICAgICAg WzB4MDAwMDAwMDA3ZmU2YmQ2MC0weDAwMDAwMDAwN2ZlNmQ2MTApICBydy0gIDB4MDAwNDVmYzAg MHgwMDAwMThiMCAweDAwMDAwMDAwIER4ZUNvcmUuZGxsLl9fREFUQS5fX2RhdGENCiAgMHgwMDAw MDAwNyB6ZXJvLWZpbGwgICAgICAgIFsweDAwMDAwMDAwN2ZlNmQ2MTAtMHgwMDAwMDAwMDdmZTcw ZTIwKSAgcnctICAweDAwMDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDAwMSBEeGVDb3JlLmRsbC5f X0RBVEEuX19jb21tb24NCiAgMHgwMDAwMDAwOCB6ZXJvLWZpbGwgICAgICAgIFsweDAwMDAwMDAw N2ZlNzBlMjAtMHgwMDAwMDAwMDdmZTcwZTU4KSAgcnctICAweDAwMDAwMDAwIDB4MDAwMDAwMDAg MHgwMDAwMDAwMSBEeGVDb3JlLmRsbC5fX0RBVEEuX19ic3MNCiAgMHgwMDAwMDEwMCBjb250YWlu ZXIgICAgICAgIFsweDAwMDAwMDAwMDAwNGIwMDAtMHgwMDAwMDAwMDAwMGVmMDAwKSogcnctICAw eDAwMDAxMDAwIDB4MDAwYTNhNzQgMHgwMDAwMDAwMCBEeGVDb3JlLmRsbC5fX0RXQVJGDQogIDB4 MDAwMDAwMDEgZHdhcmYtbGluZSAgICAgICBbMHgwMDAwMDAwMDAwMDRiMDAwLTB4MDAwMDAwMDAw MDA3MjNmYikqIHJ3LSAgMHgwMDAwMTAwMCAweDAwMDI3M2ZiIDB4MDAwMDAwMDAgRHhlQ29yZS5k bGwuX19EV0FSRi5fX2RlYnVnX2xpbmUNCiAgMHgwMDAwMDAwMiBkd2FyZi1wdWJuYW1lcyAgIFsw eDAwMDAwMDAwMDAwNzIzZmItMHgwMDAwMDAwMDAwMDc4NDI5KSogcnctICAweDAwMDI4M2ZiIDB4 MDAwMDYwMmUgMHgwMDAwMDAwMCBEeGVDb3JlLmRsbC5fX0RXQVJGLl9fZGVidWdfcHVibmFtZXMN CiAgMHgwMDAwMDAwMyBkd2FyZi1wdWJ0eXBlcyAgIFsweDAwMDAwMDAwMDAwNzg0MjktMHgwMDAw MDAwMDAwMDhiOTE1KSogcnctICAweDAwMDJlNDI5IDB4MDAwMTM0ZWMgMHgwMDAwMDAwMCBEeGVD b3JlLmRsbC5fX0RXQVJGLl9fZGVidWdfcHVidHlwZXMNCiAgMHgwMDAwMDAwNCBkd2FyZi1hcmFu Z2VzICAgIFsweDAwMDAwMDAwMDAwOGI5MTUtMHgwMDAwMDAwMDAwMDhlYTY1KSogcnctICAweDAw MDQxOTE1IDB4MDAwMDMxNTAgMHgwMDAwMDAwMCBEeGVDb3JlLmRsbC5fX0RXQVJGLl9fZGVidWdf YXJhbmdlcw0KICAweDAwMDAwMDA1IGR3YXJmLWluZm8gICAgICAgWzB4MDAwMDAwMDAwMDA4ZWE2 NS0weDAwMDAwMDAwMDAwYzc4YmYpKiBydy0gIDB4MDAwNDRhNjUgMHgwMDAzOGU1YSAweDAwMDAw MDAwIER4ZUNvcmUuZGxsLl9fRFdBUkYuX19kZWJ1Z19pbmZvDQogIDB4MDAwMDAwMDYgZHdhcmYt ZnJhbWUgICAgICBbMHgwMDAwMDAwMDAwMGM3OGJmLTB4MDAwMDAwMDAwMDBjYzY5NykqIHJ3LSAg MHgwMDA3ZDhiZiAweDAwMDA0ZGQ4IDB4MDAwMDAwMDAgRHhlQ29yZS5kbGwuX19EV0FSRi5fX2Rl YnVnX2ZyYW1lDQogIDB4MDAwMDAwMDcgZHdhcmYtcmFuZ2VzICAgICBbMHgwMDAwMDAwMDAwMGNj Njk3LTB4MDAwMDAwMDAwMDBjYzc1NykqIHJ3LSAgMHgwMDA4MjY5NyAweDAwMDAwMGMwIDB4MDAw MDAwMDAgRHhlQ29yZS5kbGwuX19EV0FSRi5fX2RlYnVnX3Jhbmdlcw0KICAweDAwMDAwMDA4IGR3 YXJmLWFiYnJldiAgICAgWzB4MDAwMDAwMDAwMDBjYzc1Ny0weDAwMDAwMDAwMDAwY2NhOWIpKiBy dy0gIDB4MDAwODI3NTcgMHgwMDAwMDM0NCAweDAwMDAwMDAwIER4ZUNvcmUuZGxsLl9fRFdBUkYu X19kZWJ1Z19hYmJyZXYNCiAgMHgwMDAwMDAwOSBkd2FyZi1zdHIgICAgICAgIFsweDAwMDAwMDAw MDAwY2NhOWItMHgwMDAwMDAwMDAwMGRjYzA1KSogcnctICAweDAwMDgyYTliIDB4MDAwMTAxNmEg MHgwMDAwMDAwMCBEeGVDb3JlLmRsbC5fX0RXQVJGLl9fZGVidWdfc3RyDQogIDB4MDAwMDAwMGEg YXBwbGUtbmFtZXMgICAgICBbMHgwMDAwMDAwMDAwMGRjYzA1LTB4MDAwMDAwMDAwMDBlMjQzOSkq IHJ3LSAgMHgwMDA5MmMwNSAweDAwMDA1ODM0IDB4MDAwMDAwMDAgRHhlQ29yZS5kbGwuX19EV0FS Ri5fX2FwcGxlX25hbWVzDQogIDB4MDAwMDAwMGIgYXBwbGUtbmFtZXNwYWNlcyBbMHgwMDAwMDAw MDAwMGUyNDM5LTB4MDAwMDAwMDAwMDBlMjQ1ZCkqIHJ3LSAgMHgwMDA5ODQzOSAweDAwMDAwMDI0 IDB4MDAwMDAwMDAgRHhlQ29yZS5kbGwuX19EV0FSRi5fX2FwcGxlX25hbWVzcGFjDQogIDB4MDAw MDAwMGMgYXBwbGUtdHlwZXMgICAgICBbMHgwMDAwMDAwMDAwMGUyNDVkLTB4MDAwMDAwMDAwMDBl ZWE1MCkqIHJ3LSAgMHgwMDA5ODQ1ZCAweDAwMDBjNWYzIDB4MDAwMDAwMDAgRHhlQ29yZS5kbGwu X19EV0FSRi5fX2FwcGxlX3R5cGVzDQogIDB4MDAwMDAwMGQgYXBwbGUtb2JqYyAgICAgICBbMHgw MDAwMDAwMDAwMGVlYTUwLTB4MDAwMDAwMDAwMDBlZWE3NCkqIHJ3LSAgMHgwMDBhNGE1MCAweDAw MDAwMDI0IDB4MDAwMDAwMDAgRHhlQ29yZS5kbGwuX19EV0FSRi5fX2FwcGxlX29iamMNClNlY3Rp b25zIGZvciAnL1VzZXJzL3VzZXIvRG9jdW1lbnRzL1VlZmlXb3Jrc3BhY2UvQnVpbGQvT3ZtZlg2 NC9OT09QVF9YQ09ERTUvWDY0L01kZU1vZHVsZVBrZy9Vbml2ZXJzYWwvRGV2aWNlUGF0aER4ZS9E ZXZpY2VQYXRoRHhlL0RFQlVHL0RldmljZVBhdGhEeGUuZGxsJyAoeDg2XzY0KToNCuKApg0KKGxs ZGIpIGltYWdlIGR1bXAgc3ltdGFiDQpEdW1waW5nIHN5bWJvbCB0YWJsZSBmb3IgODggbW9kdWxl cy4NClN5bXRhYiwgZmlsZSA9IC9Vc2Vycy91c2VyL0RvY3VtZW50cy9VZWZpV29ya3NwYWNlL0J1 aWxkL092bWZYNjQvTk9PUFRfWENPREU1L1g2NC9NZGVNb2R1bGVQa2cvQ29yZS9EeGUvRHhlTWFp bi9ERUJVRy9EeGVDb3JlLmRsbCwgbnVtX3N5bWJvbHMgPSAxMjAzOg0KICAgICAgICAgICAgICAg RGVidWcgc3ltYm9sDQogICAgICAgICAgICAgICB8U3ludGhldGljIHN5bWJvbA0KICAgICAgICAg ICAgICAgfHxFeHRlcm5hbGx5IFZpc2libGUNCiAgICAgICAgICAgICAgIHx8fA0KSW5kZXggICBV c2VySUQgRFNYIFR5cGUgICAgICAgICAgICBGaWxlIEFkZHJlc3MvVmFsdWUgTG9hZCBBZGRyZXNz ICAgICAgIFNpemUgICAgICAgICAgICAgICBGbGFncyAgICAgIE5hbWUNCi0tLS0tLS0gLS0tLS0t IC0tLSAtLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0t LSAtLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tDQpbICAgIDBdICAgIDExOCBEICAgU291cmNlRmlsZSAgICAgIDB4MDAwMDAwMDAw MDAwMDAwMCAgICAgICAgICAgICAgICAgICAgU2libGluZyAtPiBbICAgMjBdIDB4MDA2NDAwMDAg L1VzZXJzL3VzZXIvRG9jdW1lbnRzL1VlZmlQYWNrYWdlcy9NZGVNb2R1bGVQa2cvQ29yZS9EeGUv U2VjdGlvbkV4dHJhY3Rpb24vQ29yZVNlY3Rpb25FeHRyYWN0aW9uLmMNClsgICAgMV0gICAgMTIw IEQgICBPYmplY3RGaWxlICAgICAgMHgwMDAwMDAwMDVlNzg1ODhkICAgICAgICAgICAgICAgICAg ICAweDAwMDAwMDAwMDAwMDAwMDAgMHgwMDY2MDAwMSAvVXNlcnMvdXNlci9Eb2N1bWVudHMvVWVm aVdvcmtzcGFjZS9CdWlsZC9Pdm1mWDY0L05PT1BUX1hDT0RFNS9YNjQvTWRlTW9kdWxlUGtnL0Nv cmUvRHhlL0R4ZU1haW4vT1VUUFVUL0R4ZUNvcmUubGliKENvcmVTZWN0aW9uRXh0cmFjdGlvbi5v YmopDQpbICAgIDJdICAgIDEyMiBEIFggQ29kZSAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDI0 MCAweDAwMDAwMDAwN2ZlMjYyNDAgMHgwMDAwMDAwMDAwMDAwMjYwIDB4MDAwZjAwMDAgQ3VzdG9t R3VpZGVkU2VjdGlvbkV4dHJhY3QNClsgICAgM10gICAgMTI2IEQgWCBDb2RlICAgICAgICAgICAg MHgwMDAwMDAwMDAwMDAwNGEwIDB4MDAwMDAwMDA3ZmUyNjRhMCAweDAwMDAwMDAwMDAwMDAxMTAg MHgwMDBmMDAwMCBJbml0aWFsaXplU2VjdGlvbkV4dHJhY3Rpb24NClsgICAgNF0gICAgMTMwIEQg WCBDb2RlICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwNWIwIDB4MDAwMDAwMDA3ZmUyNjViMCAw eDAwMDAwMDAwMDAwMDAxNDAgMHgwMDBmMDAwMCBJc1ZhbGlkU2VjdGlvblN0cmVhbQ0KWyAgICA1 XSAgICAxMzQgRCBYIENvZGUgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDA2ZjAgMHgwMDAwMDAw MDdmZTI2NmYwIDB4MDAwMDAwMDAwMDAwMDE4MCAweDAwMGYwMDAwIE9wZW5TZWN0aW9uU3RyZWFt RXgNClsgICAgNl0gICAgMTM4IEQgWCBDb2RlICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwODcw IDB4MDAwMDAwMDA3ZmUyNjg3MCAweDAwMDAwMDAwMDAwMDAwNzAgMHgwMDBmMDAwMCBPcGVuU2Vj dGlvblN0cmVhbQ0KWyAgICA3XSAgICAxNDIgRCBYIENvZGUgICAgICAgICAgICAweDAwMDAwMDAw MDAwMDA4ZTAgMHgwMDAwMDAwMDdmZTI2OGUwIDB4MDAwMDAwMDAwMDAwMDEwMCAweDAwMGYwMDAw IENoaWxkSXNUeXBlDQrigKYNClsgIDgzMV0gICAyNDcwIEQgWCBDb2RlICAgICAgICAgICAgMHgw MDAwMDAwMDAwMDMwNmIwIDB4MDAwMDAwMDA3ZmU1NjZiMCAweDAwMDAwMDAwMDAwMDAwZjQgMHgw MDBmMDAwMCBVZWZpQm9vdFNlcnZpY2VzVGFibGVMaWJDb25zdHJ1Y3Rvcg0KWyAgODMyXSAgIDI0 NzMgRCBYIERhdGEgICAgICAgICAgICAweDAwMDAwMDAwMDAwNDc3ODAgMHgwMDAwMDAwMDdmZTZk NzgwIDB4MDAwMDAwMDAwMDAwMDAwOCAweDAwMGYwMDAwIGdJbWFnZUhhbmRsZQ0KWyAgODMzXSAg IDI0NzQgRCBYIERhdGEgICAgICAgICAgICAweDAwMDAwMDAwMDAwNDc3ODggMHgwMDAwMDAwMDdm ZTZkNzg4IDB4MDAwMDAwMDAwMDAwMDAwOCAweDAwMGYwMDAwIGdTVA0KWyAgODM0XSAgIDI0NzUg RCBYIERhdGEgICAgICAgICAgICAweDAwMDAwMDAwMDAwNDc3OTAgMHgwMDAwMDAwMDdmZTZkNzkw IDB4MDAwMDAwMDAwMDAwMDAwOCAweDAwMGYwMDAwIGdCUw0K4oCmDQoNClRoaXMgaXMgZWFzeSBl bm91Z2ggdG8gY2hlY2sgYXMgJXJwYiBpcyB0aGUgZnJhbWUgcG9pbnRlciBzbyBpdCB3aWxsIGdl dCBzYXZlZC9yZXN0b3JlZCBvbiBmdW5jdGlvbiBlbnRyeS9leGl0Lg0KDQpBY3R1YWxseSBpdCBp cyBmaW5lLiBJIGhhcHBlbmVkIHRvIGJyZWFrIGluIHRoZSBpbnRlcnJ1cHQgcm91dGluZSwgd2hp Y2ggd2FzIG5vdCBtYXBwZWQgZm9yIGEgcGFydGljdWxhciBpbWFnZS4gQWZ0ZXIgSSBzdGVwcGVk IGEgbGl0dGxlLCBpdCBzb29uIHJlYWNoZWQgdGhlIGRlYnVnIHN5bWJvbHM6DQoNCihsbGRiKSBi dCBhbGwNCiogdGhyZWFkICMxLCBzdG9wIHJlYXNvbiA9IGluc3RydWN0aW9uIHN0ZXAgb3Zlcg0K ICAqIGZyYW1lICMwOiAweDAwMDAwMDAwN2ZlNDlmM2MgRHhlQ29yZS5kbGxgQ29yZVJlc3RvcmVU cGwoTmV3VHBsPTB4MDAwMDAwMDAwMDAwMDAwOCkgYXQgVHBsLmM6MTAyOjEyDQogICAgZnJhbWUg IzE6IDB4MDAwMDAwMDA3ZTUxOGM5NQ0KICB0aHJlYWQgIzINCiAgICBmcmFtZSAjMDogMHgwMDAw MDAwMDdmYjNmZjg4IENwdUR4ZS5kbGxgQ3B1U2xlZXAgKyAxDQogICAgZnJhbWUgIzE6IDB4MDAw MDAwMDA3ZmI0ZDcxOSBDcHVEeGUuZGxsYEFwV2FrZXVwRnVuY3Rpb24oRXhjaGFuZ2VJbmZvPTB4 MDAwMDAwMDAwMDA4NzE5OCwgQXBJbmRleD0weDAwMDAwMDAwMDAwMDAwMDEpIGF0IE1wTGliLmM6 NzY4OjkNCiAgICBmcmFtZSAjMjogMHgwMDAwMDAwMDdmYjJkMTUxDQogIHRocmVhZCAjMw0KICAg IGZyYW1lICMwOiAweDAwMDAwMDAwN2ZiM2ZmODggQ3B1RHhlLmRsbGBDcHVTbGVlcCArIDENCiAg ICBmcmFtZSAjMTogMHgwMDAwMDAwMDdmYjRkNzE5IENwdUR4ZS5kbGxgQXBXYWtldXBGdW5jdGlv bihFeGNoYW5nZUluZm89MHgwMDAwMDAwMDAwMDg3MTk4LCBBcEluZGV4PTB4MDAwMDAwMDAwMDAw MDAwMikgYXQgTXBMaWIuYzo3Njg6OQ0KICAgIGZyYW1lICMyOiAweDAwMDAwMDAwN2ZiMmQxNTEN CiAgdGhyZWFkICM0DQogICAgZnJhbWUgIzA6IDB4MDAwMDAwMDA3ZmIzZmY4OCBDcHVEeGUuZGxs YENwdVNsZWVwICsgMQ0KICAgIGZyYW1lICMxOiAweDAwMDAwMDAwN2ZiNGQ3MTkgQ3B1RHhlLmRs bGBBcFdha2V1cEZ1bmN0aW9uKEV4Y2hhbmdlSW5mbz0weDAwMDAwMDAwMDAwODcxOTgsIEFwSW5k ZXg9MHgwMDAwMDAwMDAwMDAwMDAzKSBhdCBNcExpYi5jOjc2ODo5DQogICAgZnJhbWUgIzI6IDB4 MDAwMDAwMDA3ZmIyZDE1MQ0KDQpCZXN0IHdpc2hlcywNClZpdGFseQ0KDQpbMV0gaHR0cHM6Ly9n aXRodWIuY29tL2FjaWRhbnRoZXJhL09wZW5Db3JlUGtnL2Jsb2IvNzY4NGE5Zi9EZWJ1Zy9DbGFu Z0R3YXJmLnBhdGNoDQpbMl0gaHR0cHM6Ly9idWdzLmxsdm0ub3JnL3Nob3dfYnVnLmNnaT9pZD00 NTI3Mw0KWzNdIGh0dHBzOi8vYnVncy5sbHZtLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDUyNzcNCls0 XSBodHRwczovL2dpdGh1Yi5jb20vYWNpZGFudGhlcmEvT3BlbkNvcmVQa2cvY29tbWl0LzNlNWYz ZjNmOWE4ZDNmMTk3ODM0YmJmY2Y1MDI5Zjc3MWRmODk3NTQNCg0KDQoyMiDQvNCw0YDRgtCwIDIw MjAg0LMuLCDQsiAwMDowNiwgQW5kcmV3IEZpc2ggPGFmaXNoQGFwcGxlLmNvbTxtYWlsdG86YWZp c2hAYXBwbGUuY29tPj4g0L3QsNC/0LjRgdCw0Lso0LApOg0KDQoNCg0KDQpPbiBNYXIgMjEsIDIw MjAsIGF0IDExOjM2IEFNLCBWaXRhbHkgQ2hlcHRzb3YgPGNoZXB0c292QGlzcHJhcy5ydTxtYWls dG86Y2hlcHRzb3ZAaXNwcmFzLnJ1Pj4gd3JvdGU6DQoNCkFuZHJldywNCg0KVGhhbmtzIG9uY2Ug YWdhaW4sIGJ1dCB1bmZvcnR1bmF0ZWx5IGl0IGlzIG5vdCB0aGF0IHNpbXBsZS4gQmVsb3cgSSBh bnN3ZXJlZCBpbmxpbmUgZXhwbGFpbmluZyB0aGUgcGFydGljdWxhciBpc3N1ZXMsIHdoaWNoIG1v c3RseSBzZWVtIHRvIGJlIHNwZWNpZmljIHRvIENMQU5HUERCLiBMTFZNIHN0YWNrIGVtaXRzIFBE QiBkZWJ1ZyBmaWxlcywgYW5kIGV2ZW4gdGhvdWdoIExMREIgZG9lcyBzdXBwb3J0IHRoZW0gdG8g c29tZSBsZXZlbCwgaXQgaXMgdW5saWtlbHkgdGhhdCB0aGlzIHdpbGwgYmUgd29ya2luZyB3ZWxs IGVub3VnaCBzb29uLiBXZSBzaG91bGQgcmVhbGx5IHN0aWNrIHRvIG1vcmUgb3IgbGVzcyBuYXRp dmUgZGVidWcgZm9ybWF0cywgaWRlYWxseSB0aG9zZSB0aGF0IGhhdmUgcHJvcGVyIG9wZW4gc3Bl Y2lmaWNhdGlvbnMsIG9uIGFsbCBwbGF0Zm9ybXMsIGFuZCBmb3IgVW5peCB0aGF04oCZcyBEV0FS Ri4NCg0KDQpWaXRhbHksDQoNCkkgdW5kZXJzdGFuZCBhbmQgSSB1c2UgdGhlIFhjb2RlIGNsYW5n IGFuZCBub3QgdGhlIENMQU5HUERCLCBidXQgSSB1c2UgbGxkYiBhIGxvdCBJIHdhcyBqdXN0IHRy eWluZyB0byBwb2ludCBvdXQgd2hhdCB3b3JrcyB3aXRoIFhjb2RlLg0KDQoNCg0KSSBhbSBwcmV0 dHkgc3VyZSBMTFZNIGNhbiBiZSB0YXVnaHQgdG8gZW1pdCBEV0FSRiBkZWJ1ZyBpbmZvcm1hdGlv biBldmVuIGZvciBQRSBmaWxlcy4gUGVyaGFwcyB3ZSBjYW4gZWl0aGVyIG1ha2Ugc29tZSBvcHRp b24gb3IgcHJvdmlkZSBhIHNlcGFyYXRlIHRvb2xjaGFpbiBmb3IgdGhpcz8gQW5vdGhlciB3YXkg d291bGQgYmUgcmVjb3ZlcmluZyBDTEFOR0VMRiBhcyBvcmlnaW5hbGx5IHN1Z2dlc3RlZC4NCg0K DQpUaGVyZSB3YXMgYSBidWcgcmVjZW50bHkgaW4gdGhlICB4ODZfNjQtcGMtd2luMzItbWFjaG8g dHJpcGxlIGFuZCB3ZSBoYWQgdG8gYWRkIC1nZHdhcmYgdG8gZm9yY2UgaXQgZW1pdCBkd2FyZi4g Tm90IHN1cmUgd2hhdCB0aGF0IGNvbXBpbGVyIGZsYWcgd291bGQgZG8gdG8gQ0xBTkdQREIgYnV0 IGl0IGlzIHdvcnRoIGEgdHJ5PyBMYXN0IGZsYWcgd2lucyBmb3IgdGhlIGNvbXBpbGVyLg0KDQoN Cg0KWW91IGNhbiB0ZWFjaCBsbGRiIGFib3V0IHR5cGVzLiBUaGVyZSBpcyBzb21lIGV4YW1wbGUg Y29kZSBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vdGlhbm9jb3JlL2VkazIvYmxvYi9tYXN0ZXIv RW11bGF0b3JQa2cvVW5peC9sbGRiZWZpLnB5DQoNClRoaXMgY29kZSB3b3JrcyBqdXN0IGZpbmUg d2l0aCBMTERCIGFuZCBEV0FSRiAoZS5nLiBYQ09ERTUpLCB0aG91Z2ggSSBoYXZlIG5vdCB5ZXQg Y29tcGxldGVkIHRoZXNlIGNoYW5nZXMgZm9yIG15IHNjcmlwdHMgZm9yIExMREIsIG9ubHkgZm9y IEdEQi4gSG93ZXZlciwgd2l0aCBDTEFOR1BEQiBnZW5lcmF0ZWQgZmlsZXMgaXQgaXMgbm90IGZ1 bmN0aW9uYWwuIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgYmVjYXVzZSBMTERCIGlzIHVuYXdhcmUg b2YgdGhlIHVuZGVybHlpbmcgdHlwZSwgaS5lLiBpdCBkb2VzIG5vdCBrbm93IHdoYXQgaXMgRUZJ X1NUQVRVUyBvciBVSU5UMzIuIEkgY2FuIGltcGxlbWVudCBwcmV0dHktcHJpbnRpbmcgd2hlbiBM TERCIGtub3dzIGFib3V0IGEgdHlwZWRlZiwgYnV0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byBkbyB0 aGlzIHdoZW4gdGhlIGRlYnVnIGluZm9ybWF0aW9uIGlzIGFscmVhZHkgZ29uZSBvciBub3QgcGFy c2VkOg0KDQoobGxkYikgcCBTdGF0dXMNCih1bnNpZ25lZCBsb25nIGxvbmcpICQxID0gMA0KKGxs ZGIpIHAgJlN0YXR1cw0KKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSAkMiA9IDB4MDAwMDAwMDA3ZmUx OWFkOA0KKGxsZGIpIHAgKEVGSV9TVEFUVVMpU3RhdHVzDQplcnJvcjogdXNlIG9mIHVuZGVjbGFy ZWQgaWRlbnRpZmllciAnRUZJX1NUQVRVUycNCg0KSnVzdCBpbiBjYXNlIEkgdHJpZWQgdXNpbmcg ZXhhY3RseSB5b3VyIGNvZGUsIGFuZCBvdGhlciBzdHVmZiBsaWtlIHNvdXJjZSBsZXZlbCBkZWJ1 Z2dpbmcgd29ya3MganVzdCBmaW5lIGFuZCBzeW1ib2xpY2F0aW9uIHdvcmtzIGZpbmUsIHNvIGl0 IHNob3VsZCBiZSBzb21lIGJ1ZyB3aXRoIFBEQiBpbiBwYXJ0aWN1bGFyLg0KDQoNClRoYXQgaXMg c3RyYW5nZSBhcyBnbG9iYWxzIHVzdWFsbHkgd29yayBiZXN0PyBUaGUgY29tbW9uIGlzc3VlIEkn dmUgc2VlbiBpcyBnZXR0aW5nIHRoZSBzbGlkZSB3cm9uZy4gVGhlIEVGSSBtb2R1bGVzIGFyZSBs aW5rZWQgYXQgYSB2YWx1ZSBuZWFyIHplcm8gYW5kIHJlbG9jYXRlZCBpbnRvIG1lbW9yeSwgc28g dGhlIHNsaWRlIHJlcHJlc2VudHMgdGhhdCBhZGp1c3RtZW50Lg0KDQpZb3UgY2FuIHVzZSBgaW1h Z2UgZHVtcCBzZWN0aW9uc2AgYW5kIGAgaW1hZ2UgZHVtcCBzeW10YWJgIHRvIHNlZSBsbGRiJ3Mg dmlldyBvZiBzeW1ib2xzLiBNb3JlIGluZm8gaGVyZSBbMV0uDQoNClllcywgdGhpcyBvbmUgaXMg YSBiaXQgY29tcGxpY2F0ZWQsIG9uY2UgYWdhaW4gZHVlIHRvIFBEQiBtb3N0IGxpa2VseS4gSXQg a25vd3MgYWJvdXQgZ2xvYmFsIHN5bWJvbHMsIGJ1dCBkb2VzIG5vdCBsaXN0IHRoZW0gaW4gc3lt dGFiOg0KDQoobGxkYikgaW1hZ2UgZHVtcCBzeW10YWINCkR1bXBpbmcgc3ltYm9sIHRhYmxlIGZv ciA5MSBtb2R1bGVzLg0KU3ltdGFiLCBmaWxlID0gR2RiU3ltcy9CaW4vWDY0X0NMQU5HUERCL0dk YlN5bXMuZGxsLCBudW1fc3ltYm9scyA9IDANClN5bXRhYiwgZmlsZSA9IC9Vc2Vycy91c2VyL0Rv Y3VtZW50cy9VZWZpV29ya3NwYWNlL0J1aWxkL092bWZYNjQvTk9PUFRfQ0xBTkdQREIvWDY0L01k ZU1vZHVsZVBrZy9Db3JlL0R4ZS9EeGVNYWluL0RFQlVHL0R4ZUNvcmUuZGxsLCBudW1fc3ltYm9s cyA9IDANClN5bXRhYiwgZmlsZSA9IC9Vc2Vycy91c2VyL0RvY3VtZW50cy9VZWZpV29ya3NwYWNl L0J1aWxkL092bWZYNjQvTk9PUFRfQ0xBTkdQREIvWDY0L01kZU1vZHVsZVBrZy9Vbml2ZXJzYWwv RGV2aWNlUGF0aER4ZS9EZXZpY2VQYXRoRHhlL0RFQlVHL0RldmljZVBhdGhEeGUuZGxsLCBudW1f c3ltYm9scyA9IDANCuKApg0KDQpUaGUgc2xpZGVzIGFyZSBjb3JyZWN0LCBidXQgdGhlcmUgYXJl IHR3byBudWFuY2VzIHRoYXQgY29sbGlkZSB3aXRoIGl0Lg0KDQoxLiBUaGVyZSBhcmUgbXVsdGlw bGUgaW5zdGFuY2VzIG9mIHRoZSBnbG9iYWxzIHdpdGggdGhlIHNhbWUgbmFtZSAoZS5nLiBnQlMp LCBidXQgZm9yIHNvbWUgcmVhc29uIExMREIgYWx3YXlzIHRyaWVzIHRvIHByaW50IHRoZSBnbG9i YWxzIGZyb20gdGhlIGZpcnN0IG1vZHVsZS4gVGhpcyBoYXBwZW5zIGV2ZW4gd2hlbiBJIGFtIHNv dXJjZS1sZXZlbCBkZWJ1Z2dpbmcsIGFuZCBJIHNlZSBhIGdCUyBzeW1ib2wgZnJvbSBhbm90aGVy IG1vZHVsZSAoZS5nLiBEeGVDb3JlKSB1c2VkIHJpZ2h0IGF0IHRoZSBzYW1lIGxpbmUuIFdpdGgg R0RCIHRoZSBjbG9zZXN0IHN5bWJvbCBpcyB1c2VkLCBidXQgd2l0aCBMTERCIGl0IGlzIGFsd2F5 cyBjb21pbmcgZnJvbSB0aGUgZmlyc3QgbW9kdWxlLiBJIHRyaWVkIGNoZWNraW5nIGV4cHIgaGVs cCB0byBmaW5kIHdoZXRoZXIgSSBjYW4gcGFzcyBpdCBhIG1vZHVsZSBleHBsaWNpdGx5LCBidXQg YWxzbyBmYWlsZWQuDQoNCg0KVXN1YWxseSB3aGF0IGhhcHBlbnMgd2l0aCBsbGRiIGlzIHlvdSBn ZXQgdGhlIGdsb2JhbCB0aGF0IGlzIGluIHNjb3BlIGZvciB0aGUgY3VycmVudCBmcmFtZS4NCg0K DQoyLiAgVG8gYmUgYWJsZSB0byBnZXQgRUZJIHR5cGVzIHRvIGxvY2F0ZSB0aGUgRUZJX1NZU1RF TV9UQUJMRV9QT0lOVEVSIEkgYWRkIGEgZHVtbXkgR2RiU3ltcyBpbWFnZSwgd2hpY2ggaXMgbm90 IGxvYWRlZCB0byB0aGUgZmlybXdhcmUuIFNvIGJhc2ljYWxseSBJIGNhbm5vdCBzbGlkZSB3aGF0 IGlzIG5vdCBpbiB0aGUgbWVtb3J5LCBhbmQgdGhpcyBpcyBhbHNvIG15IGZpcnN0IGltYWdlLiBJ IHRyaWVkIGRlbGV0aW5nIGl0IGFueWhvdywgYnV0IGl0IGZhaWxlZCBmb3IgbWUuDQoNCg0KSSd2 ZSBub3QgdXNlZCB0aGUgZmFrZSBpbWFnZSB0byBnZXQgdGhpbmdzIGRvbmUgc28gSSBjYW4ndCBz cGVhayB0byB0aGF0LiBJIGhhdmUgdXNlZCBhIGZha2UgdGFyZ2V0IHNvIEkgY291bGQgaGF2ZSBY SVAgUEVJTSBhbmQgc2hhZG93ZWQgUEVJTSBhZGRyZXNzIGF2YWlsYWJsZSBhdCB0aGUgc2FtZSB0 aW1lLiBZb3UgY2FuJ3QgaGF2ZSBhIG1vZHVsZSBsb2FkZWQgYXQgMiBhZGRyZXNzZXMgYXQgdGhl IHNhbWUgdGltZSBpbiBsbGxkYi4gQnV0IHlvdSBtaWdodCBiZSBhYmxlIHRvIHVzZSBhIGZha2Ug dGFyZ2V0IGZvciB5b3VyIGZha2Ugc3R1ZmY/DQoNCkp1c3QgaW4gY2FzZToNCg0KICAgICAgICAg ICMgY3JlYXRlIGEgZmFrYSB0YXJnZXQgdG8gc3RvcmUgaW5mbyBhYm91dCBzeW1ib2xzDQogICAg ICAgICAgUGVpWGlwVGFyZ2V0ID0gdGFyZ2V0LmRlYnVnZ2VyLkNyZWF0ZVRhcmdldCAoTm9uZSwg ImkzODYtYXBwbGUtbWFjb3N4IiwgInJlbW90ZS1tYWNvc3giLCBUcnVlLCBlcnJvcikNCg0KICAg ICAgICAgICMgbWFrZSBzdXJlIHRoZSBnZGItcmVtb3RlICBjb25uZWN0aW9uIHRhcmdldCBpcyB0 aGUgYWN0aXZlIHRhcmdldA0KICAgICAgICAgIHRhcmdldC5kZWJ1Z2dlci5TZXRTZWxlY3RlZFRh cmdldCAodGFyZ2V0KQ0KDQoNCg0KKGxsZGIpIGltYWdlIGR1bXAgc2VjdGlvbnMNCkR1bXBpbmcg c2VjdGlvbnMgZm9yIDkxIG1vZHVsZXMuDQpTZWN0aW9ucyBmb3IgJ0dkYlN5bXMvQmluL1g2NF9D TEFOR1BEQi9HZGJTeW1zLmRsbCcgKHg4Nl82NCk6DQogIFNlY3RJRCAgICAgVHlwZSAgICAgICAg ICAgICBMb2FkIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcm0gRmlsZSBP ZmYuICBGaWxlIFNpemUgIEZsYWdzICAgICAgU2VjdGlvbiBOYW1lDQogIC0tLS0tLS0tLS0gLS0t LS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0t LS0gLS0tLS0tLS0tLSAtLS0tLS0tLS0tIC0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQ0KICAweGZmZmZmZmZmZmZmZmZmZmYgY29udGFpbmVyICAgICAgICBbMHgwMDAwMDAw MDAwMDAwMDAwLTB4MDAwMDAwMDAwMDAwNmVjMCkqIC0tLSAgMHgwMDAwMDAwMCAweDAwMDAwMDAw IDB4MDAwMDAwMDAgR2RiU3ltcy5kbGwuDQogIDB4MDAwMDAwMDEgY29kZSAgICAgICAgICAgICBb MHgwMDAwMDAwMDAwMDAwMjIwLTB4MDAwMDAwMDAwMDAwNWJkNikqIC0tLSAgMHgwMDAwMDIyMCAw eDAwMDA1OWMwIDB4NjAwMDAwMjAgR2RiU3ltcy5kbGwuLi50ZXh0DQogIDB4MDAwMDAwMDIgZGF0 YSAgICAgICAgICAgICBbMHgwMDAwMDAwMDAwMDA1YmUwLTB4MDAwMDAwMDAwMDAwNmQ3OSkqIC0t LSAgMHgwMDAwNWJlMCAweDAwMDAxMWEwIDB4NDAwMDAwNDAgR2RiU3ltcy5kbGwuLi5yZGF0YQ0K ICAweDAwMDAwMDAzIGRhdGEgICAgICAgICAgICAgWzB4MDAwMDAwMDAwMDAwNmQ4MC0weDAwMDAw MDAwMDAwMDZlMzApKiAtLS0gIDB4MDAwMDZkODAgMHgwMDAwMDA2MCAweGMwMDAwMDQwIEdkYlN5 bXMuZGxsLi4uZGF0YQ0KICAweDAwMDAwMDA0IHJlZ3VsYXIgICAgICAgICAgWzB4MDAwMDAwMDAw MDAwNmU0MC0weDAwMDAwMDAwMDAwMDZlYTQpKiAtLS0gIDB4MDAwMDZkZTAgMHgwMDAwMDA4MCAw eDQyMDAwMDQwIEdkYlN5bXMuZGxsLi4ucmVsb2MNClNlY3Rpb25zIGZvciAnL1VzZXJzL3VzZXIv RG9jdW1lbnRzL1VlZmlXb3Jrc3BhY2UvQnVpbGQvT3ZtZlg2NC9OT09QVF9DTEFOR1BEQi9YNjQv TWRlTW9kdWxlUGtnL0NvcmUvRHhlL0R4ZU1haW4vREVCVUcvRHhlQ29yZS5kbGwnICh4ODZfNjQp Og0KICBTZWN0SUQgICAgIFR5cGUgICAgICAgICAgICAgTG9hZCBBZGRyZXNzICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBQZXJtIEZpbGUgT2ZmLiAgRmlsZSBTaXplICBGbGFncyAgICAgIFNl Y3Rpb24gTmFtZQ0KICAtLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tIC0tLS0tLS0tLS0gLS0tLS0tLS0tLSAtLS0t LS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgMHhmZmZmZmZmZmZmZmZmZmZm IGNvbnRhaW5lciAgICAgICAgWzB4MDAwMDAwMDAwMDAwMDAwMC0weDAwMDAwMDAwMDAwNTIzYTAp KiAtLS0gIDB4MDAwMDAwMDAgMHgwMDAwMDAwMCAweDAwMDAwMDAwIER4ZUNvcmUuZGxsLg0KICAw eDAwMDAwMDAxIGNvZGUgICAgICAgICAgICAgWzB4MDAwMDAwMDA3ZmUxYjIyMC0weDAwMDAwMDAw N2ZlNjFlMzQpICAtLS0gIDB4MDAwMDAyMjAgMHgwMDA0NmMyMCAweDYwMDAwMDIwIER4ZUNvcmUu ZGxsLi4udGV4dA0KICAweDAwMDAwMDAyIGRhdGEgICAgICAgICAgICAgWzB4MDAwMDAwMDA3ZmU2 MWU0MC0weDAwMDAwMDAwN2ZlNjgwNjUpICAtLS0gIDB4MDAwNDZlNDAgMHgwMDAwNjI0MCAweDQw MDAwMDQwIER4ZUNvcmUuZGxsLi4ucmRhdGENCiAgMHgwMDAwMDAwMyBkYXRhICAgICAgICAgICAg IFsweDAwMDAwMDAwN2ZlNjgwODAtMHgwMDAwMDAwMDdmZTZkMTYwKSAgLS0tICAweDAwMDRkMDgw IDB4MDAwMDE4YTAgMHhjMDAwMDA0MCBEeGVDb3JlLmRsbC4uLmRhdGENCiAgMHgwMDAwMDAwNCBy ZWd1bGFyICAgICAgICAgIFsweDAwMDAwMDAwN2ZlNmQxNjAtMHgwMDAwMDAwMDdmZTZkMzk4KSAg LS0tICAweDAwMDRlOTIwIDB4MDAwMDAyNDAgMHg0MjAwMDA0MCBEeGVDb3JlLmRsbC4uLnJlbG9j DQpTZWN0aW9ucyBmb3IgJy9Vc2Vycy91c2VyL0RvY3VtZW50cy9VZWZpV29ya3NwYWNlL0J1aWxk L092bWZYNjQvTk9PUFRfQ0xBTkdQREIvWDY0L01kZU1vZHVsZVBrZy9Vbml2ZXJzYWwvRGV2aWNl UGF0aER4ZS9EZXZpY2VQYXRoRHhlL0RFQlVHL0RldmljZVBhdGhEeGUuZGxsJyAoeDg2XzY0KToN CiAgU2VjdElEICAgICBUeXBlICAgICAgICAgICAgIExvYWQgQWRkcmVzcyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgUGVybSBGaWxlIE9mZi4gIEZpbGUgU2l6ZSAgRmxhZ3MgICAgICBTZWN0 aW9uIE5hbWUNCiAgLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLSAtLS0tLS0tLS0tIC0tLS0tLS0tLS0gLS0tLS0t LS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIDB4ZmZmZmZmZmZmZmZmZmZmZiBj b250YWluZXIgICAgICAgIFsweDAwMDAwMDAwMDAwMDAwMDAtMHgwMDAwMDAwMDAwMDE0NDIwKSog LS0tICAweDAwMDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDAwMCBEZXZpY2VQYXRoRHhlLmRsbC4N CiAgMHgwMDAwMDAwMSBjb2RlICAgICAgICAgICAgIFsweDAwMDAwMDAwN2Y5ODYyMjAtMHgwMDAw MDAwMDdmOTk2Y2M2KSAgLS0tICAweDAwMDAwMjIwIDB4MDAwMTBhYzAgMHg2MDAwMDAyMCBEZXZp Y2VQYXRoRHhlLmRsbC4uLnRleHQNCiAgMHgwMDAwMDAwMiBkYXRhICAgICAgICAgICAgIFsweDAw MDAwMDAwN2Y5OTZjZTAtMHgwMDAwMDAwMDdmOTk5YjA0KSAgLS0tICAweDAwMDEwY2UwIDB4MDAw MDJlNDAgMHg0MDAwMDA0MCBEZXZpY2VQYXRoRHhlLmRsbC4uLnJkYXRhDQogIDB4MDAwMDAwMDMg ZGF0YSAgICAgICAgICAgICBbMHgwMDAwMDAwMDdmOTk5YjIwLTB4MDAwMDAwMDA3Zjk5YTFhMikg IC0tLSAgMHgwMDAxM2IyMCAweDAwMDAwNjYwIDB4YzAwMDAwNDAgRGV2aWNlUGF0aER4ZS5kbGwu Li5kYXRhDQogIDB4MDAwMDAwMDQgcmVndWxhciAgICAgICAgICBbMHgwMDAwMDAwMDdmOTlhMWMw LTB4MDAwMDAwMDA3Zjk5YTQwNCkgIC0tLSAgMHgwMDAxNDE4MCAweDAwMDAwMjYwIDB4NDIwMDAw NDAgRGV2aWNlUGF0aER4ZS5kbGzigKZyZWxvYw0K4oCmDQoNClNvLCBhbGwgaW4gYWxsLCB1bmlx dWUgZ2xvYmFsIHZhcmlhYmxlcyB3b3JrLCBidXQgdGhlcmUgaXMgbm8gd2F5IHRvIGFjY2VzcyBk dXBsaWNhdGluZyB2YXJpYWJsZXMuIFRoZXkgZWl0aGVyIHJlc29sdmUgdG8gR2RiU3ltcyBvciBq dXN0IGNhdXNlIGEgY3Jhc2g6DQoNCihsbGRiKSBwIG1EZWJ1Z0luZm9UYWJsZUhlYWRlcg0KKEVG SV9ERUJVR19JTUFHRV9JTkZPX1RBQkxFX0hFQURFUikgJDAgPSB7DQogIFVwZGF0ZVN0YXR1cyA9 IDINCiAgVGFibGVTaXplID0gOTINCiAgRWZpRGVidWdJbWFnZUluZm9UYWJsZSA9IDB4MDAwMDAw MDA3ZjgxNDAxOA0KfQ0KKGxsZGIpIHAgZ0JTDQplcnJvcjogQ291bGRuJ3QgbWF0ZXJpYWxpemU6 IGNvdWxkbid0IGdldCB0aGUgdmFsdWUgb2YgdmFyaWFibGUgOjpnQlM6IHJlYWQgbWVtb3J5IGZy b20gMHg2ZGY4IGZhaWxlZA0KZXJyb3I6IGVycm9yZWQgb3V0IGluIERvRXhlY3V0ZSwgY291bGRu J3QgUHJlcGFyZVRvRXhlY3V0ZUpJVEV4cHJlc3Npb24NCihsbGRiKSBwIGdFZmlHbG9iYWxWYXJp YWJsZUd1aWQNCjAgIGxpYkxMVk0uZHlsaWIgICAgICAgICAgICAweDAwMDAwMDAxMGU1MmVlNjgg bGx2bTo6c3lzOjpQcmludFN0YWNrVHJhY2UobGx2bTo6cmF3X29zdHJlYW0mKSArIDQwDQoxICBs aWJMTFZNLmR5bGliICAgICAgICAgICAgMHgwMDAwMDAwMTBlNTJmMjYyIFNpZ25hbEhhbmRsZXIo aW50KSArIDE4OA0KMiAgbGlic3lzdGVtX3BsYXRmb3JtLmR5bGliIDB4MDAwMDdmZmY2Y2E1NjQy ZCBfc2lndHJhbXAgKyAyOQ0KLi4uDQoNCg0KSWYgeW91IHdhbnQgdG8gaW5zcGVjdCBnbG9iYWxz IEkgdGhpbmsgdGhpcyBsb2dpYyB3b3JrcyB0byBnZXQgeW91IGRhdGEsIHlvdSB3b3VsZCBuZWVk IHRvIHByaW50IGl0IG91dCBldGMuDQoNClNCVmFsdWVMaXN0ID0gbGxkYi50YXJnZXQuRmluZEds b2JhbFZhcmlhYmxlcyAoImdTVCIsIDEwMjQpDQpmb3IgU0JWYWx1ZSBpbiBTQlZhbHVlTGlzdDoN CiAgIE1vZHVsZSA9IFNCVmFsdWUuR2V0QWRkcmVzcygpLkdldE1vZHVsZSgpDQogICAgICAgIE1v ZHVsZVN0ciA9IFNCVmFsdWUuR2V0QWRkcmVzcygpLkdldE1vZHVsZSgpLkdldEZpbGVTcGVjKCku R2V0RmlsZW5hbWUoKQ0KICAgICAgICBTdGFydCA9IGludCAoU0JWYWx1ZS5HZXRMb2NhdGlvbigp LCAwKQ0KICAgICAgICBFbmQgPSBTdGFydCArIFNCVmFsdWUuR2V0Qnl0ZVNpemUoKSAtIDENCiAg ICAgICAgU0JEZWNsYXJhdGlvbiA9IFNCVmFsdWUuR2V0RGVjbGFyYXRpb24oKQ0KICAgICAgICBD b2x1bW4gPSBTQkRlY2xhcmF0aW9uLkdldENvbHVtbigpDQoNCkkgd3JvdGUgYSBjb21tYW5kIGlu IHRoZSBlYXJseSBkYXlzIHRvIGR1bXAgb3V0IGFsbCB0aGUgaW5zdGFuY2VzIG9mIGEgZ2xvYmFs Lg0KDQpZb3UgY2FuIGFsc28gdHJ5IChsbGRiKSBpbWFnZSBsb29rdXAgLUF2IC0tbmFtZSBnU1QN Cg0KDQpZb3UgY2FuIHRlbGwgbGxkYiB0byB1c2UgdGhlIG9sZGVyIFB5dGhvbiBsaWtlIHRoaXMg KGZyb20gdGhlIFRlcm1pbmFsLmFwcCk6DQokIGRlZmF1bHRzIHdyaXRlIGNvbS5hcHBsZS5kdC5s bGRiIERlZmF1bHRQeXRob25WZXJzaW9uIDINCg0KVGhhbmtzLCB0aGF0IGhlbHBlZCBxdWl0ZSBh IGJpdCwgYnV0IGZvciBzb21lIHJlYXNvbiBYY29kZSB2ZXJzaW9uIHN0aWxsIGNyYXNoZXMgbW9y ZSBmb3IgbWUuIEkgYXR0YWNoZWQgYSBjb3VwbGUgb2Ygc3RhY2sgdHJhY2VzIGlmIHlvdSBmZWVs IGxpa2UgaGF2aW5nIGEgbG9vaywgYnV0IG9uY2UgYWdhaW4gaXQgc2VlbXMgdGhhdCBpdCBpcyBh bGwgYWJvdXQgdGhlIFBEQiBwbHVnaW4uDQoNCkZvciB0aGUgbWFjT1MgQVBJIGNsYW5nIGVtaXRz IGZyYW1lIHBvaW50ZXJzLCBzbyB5b3UgY2FuIHdhbGsgdGhlIHN0YWNrIHdpdGhvdXQgc3ltYm9s cy4gWW91IGNvdWxkIHRyeSBhZGRpbmcgdGhlIGNvbXBpbGVyIGZsYWcgdG8gZW1pdCB0aGUgZnJh bWUgcG9pbnRlcnMuDQoNCg0KVGhpcyBpcyBlYXN5IGVub3VnaCB0byBjaGVjayBhcyAlcnBiIGlz IHRoZSBmcmFtZSBwb2ludGVyIHNvIGl0IHdpbGwgZ2V0IHNhdmVkL3Jlc3RvcmVkIG9uIGZ1bmN0 aW9uIGVudHJ5L2V4aXQuDQoNCg0KSSBhbSBwcmV0dHkgc3VyZSBzdGFjayBmcmFtZXMgYXJlIG5v dCBkaXNhYmxlZCB3aXRoIFVFRkksIGFzIHNvbWV0aW1lcyBiYWNrdHJhY2luZyB3b3JrcyBqdXN0 IGZpbmUuIFRvIG1lIGl0IGxvb2tzIGxpa2UgZGVidWcgaW5mb3JtYXRpb24gcGFyc2luZyByYW5k b21seSBicmVha3MgaW4gTExEQiwgYW5kIG9uY2UgaXQgaGFwcGVucyBpdCBmb3JnZXRzIGFib3V0 IG90aGVyIGltYWdlczoNCg0KKGxsZGIpIGIgQ29yZUxvY2F0ZUhhbmRsZUJ1ZmZlcg0KQnJlYWtw b2ludCAyOiB3aGVyZSA9IER4ZUNvcmUuZGxsYENvcmVMb2NhdGVIYW5kbGVCdWZmZXIgKyAzMSBh dCBMb2NhdGUuYzo2NDksIGFkZHJlc3MgPSAweDAwMDAwMDAwN2ZlMzZlNGYNCihsbGRiKSBjDQpQ cm9jZXNzIDEgcmVzdW1pbmcNClByb2Nlc3MgMSBzdG9wcGVkDQoqIHRocmVhZCAjMSwgc3RvcCBy ZWFzb24gPSBicmVha3BvaW50IDIuMQ0KICAgIGZyYW1lICMwOiAweDAwMDAwMDAwN2ZlMzZlNGYg RHhlQ29yZS5kbGxgQ29yZUxvY2F0ZUhhbmRsZUJ1ZmZlcihTZWFyY2hUeXBlPUJ5UHJvdG9jb2ws IFByb3RvY29sPTB4MDAwMDAwMDA3Zjk3ODE2MCwgU2VhcmNoS2V5PTB4MDAwMDAwMDAwMDAwMDAw MCwgTnVtYmVySGFuZGxlcz0weDAwMDAwMDAwN2ZlMTlmZDgsIEJ1ZmZlcj0weDAwMDAwMDAwN2Zl MTlmYzApIGF0IExvY2F0ZS5jOjY0OQ0KICAgNjQ2ICAgICAgRUZJX1NUQVRVUyAgICAgICAgICBT dGF0dXM7DQogICA2NDcgICAgICBVSU5UTiAgICAgICAgICAgICAgIEJ1ZmZlclNpemU7DQogICA2 NDgNCi0+IDY0OSAgICAgaWYgKE51bWJlckhhbmRsZXMgPT0gTlVMTCkgew0KICAgNjUwICAgICAg ICByZXR1cm4gRUZJX0lOVkFMSURfUEFSQU1FVEVSOw0KICAgNjUxICAgICAgfQ0KICAgNjUyDQoo bGxkYikgYnQNCiogdGhyZWFkICMxLCBzdG9wIHJlYXNvbiA9IGJyZWFrcG9pbnQgMi4xDQogICog ZnJhbWUgIzA6IDB4MDAwMDAwMDA3ZmUzNmU0ZiBEeGVDb3JlLmRsbGBDb3JlTG9jYXRlSGFuZGxl QnVmZmVyKFNlYXJjaFR5cGU9QnlQcm90b2NvbCwgUHJvdG9jb2w9MHgwMDAwMDAwMDdmOTc4MTYw LCBTZWFyY2hLZXk9MHgwMDAwMDAwMDAwMDAwMDAwLCBOdW1iZXJIYW5kbGVzPTB4MDAwMDAwMDA3 ZmUxOWZkOCwgQnVmZmVyPTB4MDAwMDAwMDA3ZmUxOWZjMCkgYXQgTG9jYXRlLmM6NjQ5DQogICAg ZnJhbWUgIzE6IDB4MDAwMDAwMDA3ZmUzNjgxNiBEeGVDb3JlLmRsbGBDb3JlTG9jYXRlRGV2aWNl UGF0aChQcm90b2NvbD0weDAwMDAwMDAwN2Y5NzgxNjAsIERldmljZVBhdGg9MHgwMDAwMDAwMDdm ZTFhMDYwLCBEZXZpY2U9MHgwMDAwMDAwMDdmZTFhMDY4KSBhdCBMb2NhdGUuYzo0NjYNCiAgICBm cmFtZSAjMjogMHgwMDAwMDAwMDdmOTc0NzlhIFNlY3VyaXR5U3R1YkR4ZS5kbGwNCg0K4oCU4oCU 4oCUDQoNCihsbGRiKSBiIENvcHlNZW0NCkJyZWFrcG9pbnQgMzogNzAgbG9jYXRpb25zLg0KKGxs ZGIpIGMNClByb2Nlc3MgMSByZXN1bWluZw0KUHJvY2VzcyAxIHN0b3BwZWQNCiogdGhyZWFkICMx LCBzdG9wIHJlYXNvbiA9IGJyZWFrcG9pbnQgMi41MyAzLjUzDQogICAgZnJhbWUgIzA6IDB4MDAw MDAwMDA3ZTVjMTNiMyBNbnBEeGUuZGxsYENvcHlNZW0oRGVzdGluYXRpb25CdWZmZXI9MHgwMDAw MDAwMDdmZTE5YjUwLCBTb3VyY2VCdWZmZXI9MHgwMDAwMDAwMDdlMmFhNDcwLCBMZW5ndGg9NjU2 KSBhdCBDb3B5TWVtV3JhcHBlci5jOjQ3DQogICA0NCAgICAgICAgSU4gVUlOVE4gICAgICAgTGVu Z3RoDQogICA0NSAgICAgICAgKQ0KICAgNDYgICAgICB7DQotPiA0NyAgICAgICBpZiAoTGVuZ3Ro ID09IDApIHsNCiAgIDQ4ICAgICAgICAgIHJldHVybiBEZXN0aW5hdGlvbkJ1ZmZlcjsNCiAgIDQ5 ICAgICAgICB9DQogICA1MCAgICAgICAgQVNTRVJUICgoTGVuZ3RoIC0gMSkgPD0gKE1BWF9BRERS RVNTIC0gKFVJTlROKURlc3RpbmF0aW9uQnVmZmVyKSk7DQoobGxkYikgYnQNCiogdGhyZWFkICMx LCBzdG9wIHJlYXNvbiA9IGJyZWFrcG9pbnQgMi41MyAzLjUzDQogICogZnJhbWUgIzA6IDB4MDAw MDAwMDA3ZTVjMTNiMyBNbnBEeGUuZGxsYENvcHlNZW0oRGVzdGluYXRpb25CdWZmZXI9MHgwMDAw MDAwMDdmZTE5YjUwLCBTb3VyY2VCdWZmZXI9MHgwMDAwMDAwMDdlMmFhNDcwLCBMZW5ndGg9NjU2 KSBhdCBDb3B5TWVtV3JhcHBlci5jOjQ3DQoobGxkYikgZmluaXNoDQplcnJvcjogQ291bGQgbm90 IGNyZWF0ZSByZXR1cm4gYWRkcmVzcyBicmVha3BvaW50Lg0KKGxsZGIpIG4NClByb2Nlc3MgMSBz dG9wcGVkDQoqIHRocmVhZCAjMSwgc3RvcCByZWFzb24gPSBzdGVwIG92ZXINCiAgICBmcmFtZSAj MDogMHgwMDAwMDAwMDdlNWMxM2NlIE1ucER4ZS5kbGxgQ29weU1lbShEZXN0aW5hdGlvbkJ1ZmZl cj0weDAwMDAwMDAwN2ZlMTliNTAsIFNvdXJjZUJ1ZmZlcj0weDAwMDAwMDAwN2UyYWE0NzAsIExl bmd0aD02NTYpIGF0IENvcHlNZW1XcmFwcGVyLmM6NTANCiAgIDQ3ICAgICAgICBpZiAoTGVuZ3Ro ID09IDApIHsNCiAgIDQ4ICAgICAgICAgIHJldHVybiBEZXN0aW5hdGlvbkJ1ZmZlcjsNCiAgIDQ5 ICAgICAgICB9DQotPiA1MCAgICAgICBBU1NFUlQgKChMZW5ndGggLSAxKSA8PSAoTUFYX0FERFJF U1MgLSAoVUlOVE4pRGVzdGluYXRpb25CdWZmZXIpKTsNCiAgIDUxICAgICAgICBBU1NFUlQgKChM ZW5ndGggLSAxKSA8PSAoTUFYX0FERFJFU1MgLSAoVUlOVE4pU291cmNlQnVmZmVyKSk7DQogICA1 Mg0KICAgNTMgICAgICAgIGlmIChEZXN0aW5hdGlvbkJ1ZmZlciA9PSBTb3VyY2VCdWZmZXIpIHsN CihsbGRiKQ0KLi4uDQpQcm9jZXNzIDEgc3RvcHBlZA0KKiB0aHJlYWQgIzEsIHN0b3AgcmVhc29u ID0gc3RlcCBvdmVyDQogICAgZnJhbWUgIzA6IDB4MDAwMDAwMDA3ZTVjMTRiNCBNbnBEeGUuZGxs YENvcHlNZW0oRGVzdGluYXRpb25CdWZmZXI9MHgwMDAwMDAwMDdmZTE5YjUwLCBTb3VyY2VCdWZm ZXI9MHgwMDAwMDAwMDdlMmFhNDcwLCBMZW5ndGg9NjU2KSBhdCBDb3B5TWVtV3JhcHBlci5jOjU3 DQogICA1NCAgICAgICAgICByZXR1cm4gRGVzdGluYXRpb25CdWZmZXI7DQogICA1NSAgICAgICAg fQ0KICAgNTYgICAgICAgIHJldHVybiBJbnRlcm5hbE1lbUNvcHlNZW0gKERlc3RpbmF0aW9uQnVm ZmVyLCBTb3VyY2VCdWZmZXIsIExlbmd0aCk7DQotPiA1NyAgICAgfQ0KKGxsZGIpDQpQcm9jZXNz IDEgc3RvcHBlZA0KKiB0aHJlYWQgIzEsIHN0b3AgcmVhc29uID0gc3RlcCBvdmVyDQogICAgZnJh bWUgIzA6IDB4MDAwMDAwMDA3ZTVjNzI2ZSBNbnBEeGUuZGxsDQotPiAgMHg3ZTVjNzI2ZTogbW92 ICAgIHJheCwgcXdvcmQgcHRyIFtyc3AgKyAweDYwXQ0KICAgIDB4N2U1YzcyNzM6IGNtcCAgICBi eXRlIHB0ciBbcmF4ICsgMHg2OF0sIDB4MA0KICAgIDB4N2U1YzcyNzc6IGpuZSAgICAweDdlNWM3 MjkxDQogICAgMHg3ZTVjNzI3ZDogbW92YWJzIHJheCwgLTB4N2ZmZmZmZmZmZmZmZmZlZA0KKGxs ZGIpIGJ0DQoqIHRocmVhZCAjMSwgc3RvcCByZWFzb24gPSBzdGVwIG92ZXINCiAgKiBmcmFtZSAj MDogMHgwMDAwMDAwMDdlNWM3MjZlIE1ucER4ZS5kbGwNCg0K4oCU4oCU4oCUDQoNCihsbGRiKSBj DQpQcm9jZXNzIDEgcmVzdW1pbmcNClByb2Nlc3MgMSBzdG9wcGVkDQoqIHRocmVhZCAjMSwgc3Rv cCByZWFzb24gPSBzaWduYWwgU0lHSU5UDQogICAgZnJhbWUgIzA6IDB4MDAwMDAwMDA3ZmU0ZDcy ZSBEeGVDb3JlLmRsbA0KLT4gIDB4N2ZlNGQ3MmU6IGNtcCAgICBhbCwgMHgwDQogICAgMHg3ZmU0 ZDczMDogamUgICAgIDB4N2ZlNGQ3NjUNCiAgICAweDdmZTRkNzM2OiBtb3YgICAgcmN4LCBxd29y ZCBwdHIgW3JzcCArIDB4MjBdDQogICAgMHg3ZmU0ZDczYjogY2FsbCAgIDB4N2ZlNGM0YjANCihs bGRiKSBidA0KKiB0aHJlYWQgIzEsIHN0b3AgcmVhc29uID0gc2lnbmFsIFNJR0lOVA0KICAqIGZy YW1lICMwOiAweDAwMDAwMDAwN2ZlNGQ3MmUgRHhlQ29yZS5kbGwNCg0KT24gbWFjT1MgdGhlIE1h Y2gtTyBhbmQgZFNZTSBoYXZlIGEgVVVJRCAoZHdhcmZkdW1wIC11KSB0aGF0IGlzIGluZGV4ZWQg YnkgU3BvdGxpZ2h0IChtZGZpbmQgImNvbV9hcHBsZV94Y29kZV9kc3ltX3V1aWRzID09ICoiKSBb Ml0NClRoaXMgc2hvdWxkIGJlIHRoZSBVVUlEIGluIHRoZSBkZWJ1ZyBkaXJlY3RvcnkgZW50cnkg YW5kIHlvdSBjYW4gdXNlIHRoYXQgdG8gbG9va3VwIHRoZSBzeW1ib2xzIGxpa2UgdGhpczoNCg0K bW9kdWxlID0gdGFyZ2V0LkFkZE1vZHVsZSAoTm9uZSwgTm9uZSwgdXVpZCkNClNCRXJyb3IgPSB0 YXJnZXQuU2V0TW9kdWxlTG9hZEFkZHJlc3MgKG1vZHVsZSwgTG9hZEFkZHJlc3MgKyBUZUFkanVz dCkNCg0KQWxzbyBsbGRiIGhhcyBidWlsdCBpbiBoZWxwIGZvciBjb21tYW5kcywgYnV0IGl0IGlz IGtpbmQgb2YgdGVyc2Ugc2luY2UgaXQgaXMgYXV0b2dlbmVyYXRlZCBmcm9tIHRoZSBDKysgc3dp Zy4NCihsbGRiKSBzY3JpcHQgaGVscCAobGxkYi50YXJnZXQuQWRkTW9kdWxlKQ0KSGVscCBvbiBt ZXRob2QgQWRkTW9kdWxlIGluIG1vZHVsZSBsbGRiOg0KDQpBZGRNb2R1bGUoc2VsZiwgKmFyZ3Mp IG1ldGhvZCBvZiBsbGRiLlNCVGFyZ2V0IGluc3RhbmNlDQogICAgQWRkTW9kdWxlKFNCVGFyZ2V0 IHNlbGYsIFNCTW9kdWxlIG1vZHVsZSkgLT4gYm9vbA0KICAgIEFkZE1vZHVsZShTQlRhcmdldCBz ZWxmLCBjaGFyIGNvbnN0ICogcGF0aCwgY2hhciBjb25zdCAqIHRyaXBsZSwgY2hhciBjb25zdCAq IHV1aWQpIC0+IFNCTW9kdWxlDQogICAgQWRkTW9kdWxlKFNCVGFyZ2V0IHNlbGYsIGNoYXIgY29u c3QgKiBwYXRoLCBjaGFyIGNvbnN0ICogdHJpcGxlLCBjaGFyIGNvbnN0ICogdXVpZF9jc3RyLCBj aGFyIGNvbnN0ICogc3ltZmlsZSkgLT4gU0JNb2R1bGUNCiAgICBBZGRNb2R1bGUoU0JUYXJnZXQg c2VsZiwgU0JNb2R1bGVTcGVjIG1vZHVsZV9zcGVjKSAtPiBTQk1vZHVsZQ0KDQoNClRoZSBtaW5p bXVtICB5b3UgbmVlZCB0byBzeW1ib2xpY2F0ZSBhIGZyYW1lIGlzIHV1aWQsIExvYWRBZGRyZXNz LCBhbmQgUEMuDQoNClsxXSBodHRwOi8vbGxkYi5sbHZtLm9yZy91c2UvbWFwLmh0bWwNClsyXSBo dHRwOi8vbGxkYi5sbHZtLm9yZy91c2Uvc3ltYm9scy5odG1sDQoNClRoYW5rcyBmb3IgdGhlIGxp bmtzIGFnYWluLiBZZXMsIEkgYW0gdXNpbmcgc29tZSBvZiB0aGVzZSwgYW5kIGluIGZhY3QgZm9y IEdEQiB0aGF04oCZcyBwcmV0dHkgbXVjaCB3aGF0IEkgZGlkIHdoZW4gSSB3b3JrZWQgd2l0aCBY Q09ERTUuIEl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgd2hlbiBJIGdldCB0byBjb21wbGV0ZSBMTERC IHN1cHBvcnQgZm9yIFhDT0RFNSBpdCB3aWxsIHdvcmsgcXVpdGUgZmluZSB0b28uIEJ1dCBJIGFt IGFscmVhZHkgaGFwcHkgd2l0aCBYQ09ERTUgaGVyZSwgYW5kIG1ha2luZyBpdCBldmVuIGJldHRl ciB3aWxsIG9ubHkgaGVscCBteXNlbGYsIGJ1dCBub3Qgb3RoZXIgcGVvcGxlIHdpdGggZS5nLiBM aW51eCBvciBwZW9wbGUgdGhhdCB3YW50IG1lIHRvIHVzZSB0aGUgc2FtZSBjb21waWxlciB3aXRo IHRoZW0uDQoNCg0KVGhhbmtzIGZvciBsb29raW5nIG91dCBmb3Igb3RoZXJzLg0KDQpUaGFua3Ms DQoNCkFuZHJldyBGaXNoDQoNCg0KQmVzdCByZWdhcmRzLA0KVml0YWx5DQoNCg0KMjEg0LzQsNGA 0YLQsCAyMDIwINCzLiwg0LIgMjA6MTMsIEFuZHJldyBGaXNoIDxhZmlzaEBhcHBsZS5jb208bWFp bHRvOmFmaXNoQGFwcGxlLmNvbT4+INC90LDQv9C40YHQsNC7KNCwKToNCg0KDQoNCg0KT24gTWFy IDIxLCAyMDIwLCBhdCAzOjI4IEFNLCBWaXRhbHkgQ2hlcHRzb3YgPGNoZXB0c292QGlzcHJhcy5y dTxtYWlsdG86Y2hlcHRzb3ZAaXNwcmFzLnJ1Pj4gd3JvdGU6DQoNCkhlbGxvLA0KDQpBbmRyZXks IHRoYW5rcyBmb3IgdGhlIGhpbnQsIGl0IHdhcyB2ZXJ5IGhlbHBmdWwuIEkgcmV3cm90ZSB0aGUg R0RCIHNjcmlwdHMgdG8gd29yayB3aXRoIExMREJbMV0gYW5kIHdhcyBhYmxlIHRvIGRlYnVnIE9W TUYgYnVpbHQgd2l0aCBDTEFOR1BEQi4gV2hpbGUgaXQgaXMgc3RpbGwgcXVpdGUgZGlydHksIGF0 IHRoZSB2ZXJ5IGxlYXN0IGl0IHdvcmtzLg0KDQpVbmZvcnR1bmF0ZWx5IHRoZSBleHBlcmllbmNl IHdhcyBjbG9zZSB0byB0ZXJyaWJsZS4gSSBtYXkgY2VydGFpbmx5IGRvIHNvbWV0aGluZyB3cm9u ZywgYnV0IGl0IGlzIGNsZWFyIHRoYXQgUERCIGFuZCBMTERCIGRvIG5vdCBzdXBwb3J0IGVhY2gg b3RoZXIgd2VsbCBlbm91Z2guIEFmdGVyIHNwZW5kaW5nIHNldmVyYWwgaG91cnMgb24gcGxheWlu ZyB3aXRoIHRoZSB0b29scyBteSBjb25jbHVzaW9uIGlzIHRoYXQgTExEQiBpcyBzaW1wbHkgbm90 IHN1aXRlZCBmb3IgVUVGSSBQREIgZGVidWdnaW5nLCBhbmQgd2UgcmVhbGx5IHdhbnQgRFdBUkYg IGFzIHRoZXJlIGlzIG5vIG90aGVyIG9wZW5zb3VyY2UgZGVidWdnZXIgdGhhdCBzdXBwb3J0cyBQ REIgb24gbWFjT1MgYW5kIExpbnV4DQoNCkluIGNhc2Ugc29tZWJvZHkga25vd3Mgd29ya2Fyb3Vu ZHMgaGVyZSBhcmUgdGhlIGlzc3VlcyBJIGZhY2VkOg0KDQoxLiBBbGwgaW50ZWdlciBhbGlhcyB0 eXBlZGVmcyBhcmUgZGlzY2FyZGVkIGluIGZhdm91ciBvZiB1bmRlcmx5aW5nIHR5cGVzLiBUaGlz IHdheSBFRklfU1RBVFVTIGFuZCBFRklfVFBMIGJlY29tZSB1bnNpZ25lZCBsb25nIGxvbmcsIENI QVI4IGJlY29tZXMgY2hhciwgYW5kIENIQVIxNiBiZWNvbWVzIHVuc2lnbmVkIHNob3J0LiBJdCBk b2VzIG5vdCBsb29rIGxpa2UgTExEQiBoYXMgdGhlIG9yaWdpbmFsIHR5cGVzIGFueXdoZXJlIGF0 IGFsbCwgYW5kIGl0IGFsc28gZG9lcyBub3QgaGF2ZSB0aGVtIHJlZ2lzdGVyZWQuDQoNCiAgICBm cmFtZSAjMDogMHgwMDAwMDAwMDdmZTI0MmFhIER4ZUNvcmUuZGxsYENvcmVBbGxvY2F0ZVBvb2xQ YWdlc0koUG9vbFR5cGU9RWZpQm9vdFNlcnZpY2VzRGF0YSwgTm9QYWdlcz0xLCBHcmFudWxhcml0 eT00MDk2LCBOZWVkR3VhcmQ9J1wwJykgYXQgUG9vbC5jOjMyMg0KICAgMzE5ICAgICAgICAgICAg IHJldHVybiBOVUxMOw0KICAgMzIwICAgICAgICAgICB9DQogICAzMjENCi0+IDMyMiAgICAgICAg ICBCdWZmZXIgPSBDb3JlQWxsb2NhdGVQb29sUGFnZXMgKFBvb2xUeXBlLCBOb1BhZ2VzLCBHcmFu dWxhcml0eSwgTmVlZEd1YXJkKTsNCiAgIDMyMyAgICBDb3JlUmVsZWFzZU1lbW9yeUxvY2sgKCk7 DQogICAzMjQNCiAgIDMyNSAgICAgICAgICAgaWYgKEJ1ZmZlciAhPSBOVUxMKSB7DQoobGxkYikg cCBTdGF0dXMNCih1bnNpZ25lZCBsb25nIGxvbmcpICQzID0gMA0KDQpTdHJ1Y3R1cmVzIHdvcmsg bW9yZSBvciBsZXNzIGZpbmUsIGJ1dCBmb3Igc2ltcGxlciB0eXBlcyBsaWtlIHN0cmluZ3Mgd2Ug YXJlIG91dCBvZiBldmVuIHBvdGVudGlhbCBwcmV0dHktcHJpbnRpbmcuDQoNCg0KVml0YWx5LA0K DQpZb3UgY2FuIHRlYWNoIGxsZGIgYWJvdXQgdHlwZXMuIFRoZXJlIGlzIHNvbWUgZXhhbXBsZSBj b2RlIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS90aWFub2NvcmUvZWRrMi9ibG9iL21hc3Rlci9F bXVsYXRvclBrZy9Vbml4L2xsZGJlZmkucHkNCg0KDQoyLiBHbG9iYWwgdmFyaWFibGVzIGFyZSBu b3QgYWNjZXNzaWJsZS4gSSBhbSBub3Qgc3VyZSB3aGF0IGhhcHBlbnMsIGJ1dCB0aGV5IGVpdGhl ciBzZWVtIHRvIG5vdCByZWxvY2F0ZSBvciBjb25mbGljdCB3aXRoIHRoZSBvdGhlciBuYW1lczoN Cg0KKGxsZGIpIHAgZ1NUDQplcnJvcjogQ291bGRuJ3QgbWF0ZXJpYWxpemU6IGNvdWxkbid0IGdl dCB0aGUgdmFsdWUgb2YgdmFyaWFibGUgOjpnU1Q6IHJlYWQgbWVtb3J5IGZyb20gMHg2ZTE4IGZh aWxlZA0KZXJyb3I6IGVycm9yZWQgb3V0IGluIERvRXhlY3V0ZSwgY291bGRuJ3QgUHJlcGFyZVRv RXhlY3V0ZUpJVEV4cHJlc3Npb24NCihsbGRiKSBwICZnU1QNCmVycm9yOiBDb3VsZG4ndCBtYXRl cmlhbGl6ZTogY291bGRuJ3QgZ2V0IHRoZSB2YWx1ZSBvZiB2YXJpYWJsZSA6OmdTVDogcmVhZCBt ZW1vcnkgZnJvbSAweDZlMTggZmFpbGVkDQplcnJvcjogZXJyb3JlZCBvdXQgaW4gRG9FeGVjdXRl LCBjb3VsZG4ndCBQcmVwYXJlVG9FeGVjdXRlSklURXhwcmVzc2lvbg0KDQoNClRoYXQgaXMgc3Ry YW5nZSBhcyBnbG9iYWxzIHVzdWFsbHkgd29yayBiZXN0PyBUaGUgY29tbW9uIGlzc3VlIEkndmUg c2VlbiBpcyBnZXR0aW5nIHRoZSBzbGlkZSB3cm9uZy4gVGhlIEVGSSBtb2R1bGVzIGFyZSBsaW5r ZWQgYXQgYSB2YWx1ZSBuZWFyIHplcm8gYW5kIHJlbG9jYXRlZCBpbnRvIG1lbW9yeSwgc28gdGhl IHNsaWRlIHJlcHJlc2VudHMgdGhhdCBhZGp1c3RtZW50Lg0KDQpZb3UgY2FuIHVzZSBgaW1hZ2Ug ZHVtcCBzZWN0aW9uc2AgYW5kIGAgaW1hZ2UgZHVtcCBzeW10YWJgIHRvIHNlZSBsbGRiJ3Mgdmll dyBvZiBzeW1ib2xzLiBNb3JlIGluZm8gaGVyZSBbMV0uDQoNCg0KMy4gUXVpdGUgYSBudW1iZXIg b2YgY3Jhc2hlcy4NCg0KSW4gbW9zdCBjYXNlcyBhdXRvY29tcGxldGlvbiBieSB0YWIgcHJlc3Mg Y2F1c2VzIGEgY3Jhc2guIEUuZy4NCg0KYiBJPFRBQj4NCg0KU28gd2lsbCBkbyBwcmludGluZyBv ZiBhIEdVSUQsIGUuZy4gcCBnRWZpR2xvYmFsVmFyaWFibGVHdWlkLg0KDQpUaGlzIG1heSBoYXZl IHRvIGRvIHdpdGggUHl0aG9uIGNvbXBhdGliaWxpdHkgYXMgWGNvZGUgMTEgTExEQiB0aGF0IHVz ZXMgUHl0aG9uIDMgZ2VuZXJhbGx5IGNyYXNoZXMgbW9yZSBvZnRlbiB0aGFuIE1hY1BvcnRzIExM REIgOS4wLiBTdXJwcmlzaW5nbHkgc3RydWN0dXJlcyB3b3JrIG1vcmUgb3IgbGVzcyBmaW5lLg0K DQoNCllvdSBjYW4gdGVsbCBsbGRiIHRvIHVzZSB0aGUgb2xkZXIgUHl0aG9uIGxpa2UgdGhpcyAo ZnJvbSB0aGUgVGVybWluYWwuYXBwKToNCiQgZGVmYXVsdHMgd3JpdGUgY29tLmFwcGxlLmR0Lmxs ZGIgRGVmYXVsdFB5dGhvblZlcnNpb24gMg0KDQoNCjQuIEN0cmwrQyBkb2VzIG5vdCBwcm9kdWNl IGEgdmFsaWQgYmFja3RyYWNlLiBXaGVuIEkgYnJlYWsgd2l0aCBhIGJyZWFrcG9pbnQsIEkgc2Vl IGEgcHJvcGVyIHN0YWNrdHJhY2Ugd2l0aCBtb3JlIHRoYW4gb25lIGVudHJ5LCB3aXRoIGZ1bmN0 aW9uIHByb3RvdHlwZXMgYW5kIHZhbHVlcy4gV2hlbiBJIGJyZWFrIHdpdGggQ3RybCtDIEkgb25s eSBzZWUgc29tZSB3ZWlyZCBiYWNrdHJhY2Ugd2l0aCBtb3N0IG9mIHRoZSBlbnRyaWVzIG1pc3Np bmcgcmVnYXJkbGVzcyBvZiBmcmFtZSBwb3NpdGlvbjoNCg0KKGxsZGIpIGJ0DQoqIHRocmVhZCAj MSwgc3RvcCByZWFzb24gPSBzaWduYWwgU0lHVFJBUA0KICAqIGZyYW1lICMwOiAweDAwMDAwMDAw N2ZlNGM1ZjMgRHhlQ29yZS5kbGwNCg0KUHJvYmFibHkgbW9yZSBhbmQgYWxsIHRoZSB1bmludHVp dGl2ZSBzdHVmZiBsaWtlIHRoZSBsYWNrIG9mIG1vcmUgZnVuY3Rpb25hbCBUVUksIGJ1dCBpdCBp cyBoYXJkIHRvIHJlbWVtYmVyIGFsbCB0aGUgdHJpYWxzLg0KDQoNCkZvciB0aGUgbWFjT1MgQVBJ IGNsYW5nIGVtaXRzIGZyYW1lIHBvaW50ZXJzLCBzbyB5b3UgY2FuIHdhbGsgdGhlIHN0YWNrIHdp dGhvdXQgc3ltYm9scy4gWW91IGNvdWxkIHRyeSBhZGRpbmcgdGhlIGNvbXBpbGVyIGZsYWcgdG8g ZW1pdCB0aGUgZnJhbWUgcG9pbnRlcnMuDQoNCg0KWzFdIGh0dHBzOi8vZ2l0aHViLmNvbS9hY2lk YW50aGVyYS9PcGVuQ29yZVBrZy9ibG9iL21hc3Rlci9EZWJ1Zy9TY3JpcHRzL2xsZGJfdWVmaS5w eQ0KDQoNCk9uIG1hY09TIHRoZSBNYWNoLU8gYW5kIGRTWU0gaGF2ZSBhIFVVSUQgKGR3YXJmZHVt cCAtdSkgdGhhdCBpcyBpbmRleGVkIGJ5IFNwb3RsaWdodCAobWRmaW5kICJjb21fYXBwbGVfeGNv ZGVfZHN5bV91dWlkcyA9PSAqIikgWzJdDQpUaGlzIHNob3VsZCBiZSB0aGUgVVVJRCBpbiB0aGUg ZGVidWcgZGlyZWN0b3J5IGVudHJ5IGFuZCB5b3UgY2FuIHVzZSB0aGF0IHRvIGxvb2t1cCB0aGUg c3ltYm9scyBsaWtlIHRoaXM6DQoNCm1vZHVsZSA9IHRhcmdldC5BZGRNb2R1bGUgKE5vbmUsIE5v bmUsIHV1aWQpDQpTQkVycm9yID0gdGFyZ2V0LlNldE1vZHVsZUxvYWRBZGRyZXNzIChtb2R1bGUs IExvYWRBZGRyZXNzICsgVGVBZGp1c3QpDQoNCkFsc28gbGxkYiBoYXMgYnVpbHQgaW4gaGVscCBm b3IgY29tbWFuZHMsIGJ1dCBpdCBpcyBraW5kIG9mIHRlcnNlIHNpbmNlIGl0IGlzIGF1dG9nZW5l cmF0ZWQgZnJvbSB0aGUgQysrIHN3aWcuDQoobGxkYikgc2NyaXB0IGhlbHAgKGxsZGIudGFyZ2V0 LkFkZE1vZHVsZSkNCkhlbHAgb24gbWV0aG9kIEFkZE1vZHVsZSBpbiBtb2R1bGUgbGxkYjoNCg0K QWRkTW9kdWxlKHNlbGYsICphcmdzKSBtZXRob2Qgb2YgbGxkYi5TQlRhcmdldCBpbnN0YW5jZQ0K ICAgIEFkZE1vZHVsZShTQlRhcmdldCBzZWxmLCBTQk1vZHVsZSBtb2R1bGUpIC0+IGJvb2wNCiAg ICBBZGRNb2R1bGUoU0JUYXJnZXQgc2VsZiwgY2hhciBjb25zdCAqIHBhdGgsIGNoYXIgY29uc3Qg KiB0cmlwbGUsIGNoYXIgY29uc3QgKiB1dWlkKSAtPiBTQk1vZHVsZQ0KICAgIEFkZE1vZHVsZShT QlRhcmdldCBzZWxmLCBjaGFyIGNvbnN0ICogcGF0aCwgY2hhciBjb25zdCAqIHRyaXBsZSwgY2hh ciBjb25zdCAqIHV1aWRfY3N0ciwgY2hhciBjb25zdCAqIHN5bWZpbGUpIC0+IFNCTW9kdWxlDQog ICAgQWRkTW9kdWxlKFNCVGFyZ2V0IHNlbGYsIFNCTW9kdWxlU3BlYyBtb2R1bGVfc3BlYykgLT4g U0JNb2R1bGUNCg0KDQpUaGUgbWluaW11bSAgeW91IG5lZWQgdG8gc3ltYm9saWNhdGUgYSBmcmFt ZSBpcyB1dWlkLCBMb2FkQWRkcmVzcywgYW5kIFBDLg0KDQpbMV0gaHR0cDovL2xsZGIubGx2bS5v cmcvdXNlL21hcC5odG1sDQpbMl0gaHR0cDovL2xsZGIubGx2bS5vcmcvdXNlL3N5bWJvbHMuaHRt bA0KDQpUaGFua3MsDQoNCkFuZHJldyBGaXNoDQoNCg0KDQpCZXN0IHdpc2hlcywNClZpdGFseQ0K DQoyMCDQvNCw0YDRgtCwIDIwMjAg0LMuLCDQsiAyMjoxNCwgQW5kcmV3IEZpc2ggPGFmaXNoQGFw cGxlLmNvbTxtYWlsdG86YWZpc2hAYXBwbGUuY29tPj4g0L3QsNC/0LjRgdCw0Lso0LApOg0KDQoN Cg0KDQpPbiBNYXIgMjAsIDIwMjAsIGF0IDg6MTMgQU0sIFZpdGFseSBDaGVwdHNvdiA8Y2hlcHRz b3ZAaXNwcmFzLnJ1PG1haWx0bzpjaGVwdHNvdkBpc3ByYXMucnU+PiB3cm90ZToNCg0KSGVsbG8s DQoNCldlIG5vdGljZWQgdGhhdCB0aGUgb3JpZ2luYWwgYnVnemlsbGEsIHdoaWNoIGludGVuZGVk IHRvIGFkZCBuZXcgTExWTSB0b29sY2hhaW4gc3VwcG9ydFsxXSwgYWxzbyB3YW50ZWQgdG8gYnJp bmcgRUxGIGZvcm1hdCBzdXBwb3J0IHdpdGggRFdBUkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiBG b3Igc29tZSByZWFzb24gdGhpcyBkaWQgbm90IG1ha2UgaXRzIHdheSBpbnRvIEVESyBJSSwgYW5k IHdlIGFyZSBjdXJyZW50bHkgd29uZGVyaW5nLCBob3cgY2FuIG9uZSBkZWJ1ZyBiaW5hcmllcyBi dWlsdCB3aXRoIExMVk0gOS4wLg0KDQoNCkZvciBtYWNPUyBhbmQgWENPREU1IHRvb2xjaGFpbiB3 ZSB1c2UgR0RCIHNjcmlwdHMgYmFzZWQgb24gQW5kcmVpIFdhcmtlbnRpbuKAmXMgd29yaywgd2hp Y2ggYWxsb3cgdXMgdG8gaW50ZWdyYXRlIHdpdGggUUVNVSBhbmQgVk13YXJlWzJdLiBJdCBpcyBs aWtlbHkgdGhhdCB0aGV5IHNob3VsZCB3b3JrIHdpdGggbGl0dGxlIHRvIG5vIHdvcmsgb24gTGlu dXggd2l0aCBDTEFORzM4L0dDQzUgd2l0aCBHREIgb25jZSBhZ2Fpbi4gSG93ZXZlciwgQ0xBTkdQ REIgYXBwYXJlbnRseSBpcyB1c2luZyBQREIgZGVidWdnaW5nIGluZm9ybWF0aW9uLCB3aGljaCBJ IGJlbGlldmUgaXMgbm90IGhhbmRsZWQgd2l0aCBHREIuDQoNCkNvdWxkIHlvdSBwbGVhc2UgcHJv dmlkZSB0aGUgZGV0YWlscyBvbiB0aGUgbWF0dGVyIGFuZCBsZXQgdXMga25vdyBhYm91dCB0aGUg cmVjb21tZW5kZWQgcm91dGU/DQrigJQgSXMgZHJvcHBpbmcgQ0xBTkdFTEYganVzdCBhIHRlbXBv cmFyeSBtZWFzdXJlIGFuZCBpdCBzaG91bGQgYmUgcmVzdWJtaXR0ZWQgYWdhaW4/DQrigJQgU2hv dWxkIExMREIsIHdoaWNoIHNlZW1zIHRvIGJlIGF3YXJlIG9mIFBEQiwgYmUgdXNlZCBpbnN0ZWFk IG9mIEdEQiwgd2hlbiBidWlsZGluZyB3aXRoIENMQU5HUERCPyBJZiBzbywgZGlkIGFueWJvZHkg dHJ5IHRoYXQ/DQoNCg0KDQpWaXRhbHksDQoNCkkndmUgbm90IHRyaWVkIHRoZSBDTEFOR1BEQiBw YXRoLCBidXQgaWYgeW91IHdhbnQgdG8gY29ubmVjdCBsbGRiIHRvIFFFTVUgeW91IG5lZWQgdG8g c2V0ICBwbHVnaW4ucHJvY2Vzcy5nZGItcmVtb3RlLnRhcmdldC1kZWZpbml0aW9uLWZpbGUgWzFd IHRvIFsyXS4NCg0KWzFdICBsbGRiIC1vICJzZXR0aW5ncyBzZXQgcGx1Z2luLnByb2Nlc3MuZ2Ri LXJlbW90ZS50YXJnZXQtZGVmaW5pdGlvbi1maWxlIHg4Nl82NF90YXJnZXRfZGVmaW5pdGlvbi5w eSIgLW8gImdkYi1yZW1vdGUgOTAwMCINClsyXSBodHRwczovL2dpdGh1Yi5jb20vbGx2bS1taXJy b3IvbGxkYi9ibG9iL21hc3Rlci9leGFtcGxlcy9weXRob24veDg2XzY0X3RhcmdldF9kZWZpbml0 aW9uLnB5DQoNClRoYW5rcywNCg0KQW5kcmV3IEZpc2gNCg0KDQpUaGFua3MhDQoNCg0KQmVzdCBy ZWdhcmRzLA0KVml0YWx5DQoNClsxXSBodHRwczovL2J1Z3ppbGxhLnRpYW5vY29yZS5vcmcvc2hv d19idWcuY2dpP2lkPTE2MDMNClsyXSBodHRwczovL2dpdGh1Yi5jb20vYWNpZGFudGhlcmEvT3Bl bkNvcmVQa2cvYmxvYi9tYXN0ZXIvRGVidWcvU2NyaXB0cy9nZGJfdWVmaS5weQ0KDQoNCg0KPGNy YXNoZXMudHh0Pg0KDQoNCg== --_000_86c6477b5a354eb98ae4e637a764dc5dintelcom_ Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiIHhtbG5zOm89InVy bjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgeG1sbnM6dz0idXJuOnNjaGVt YXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIgeG1sbnM6bT0iaHR0cDovL3NjaGVtYXMubWlj cm9zb2Z0LmNvbS9vZmZpY2UvMjAwNC8xMi9vbW1sIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv VFIvUkVDLWh0bWw0MCI+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIg Y29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCjxtZXRhIG5hbWU9IkdlbmVyYXRv ciIgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgMTUgKGZpbHRlcmVkIG1lZGl1bSkiPg0KPCEtLVtp ZiAhbXNvXT48c3R5bGU+dlw6KiB7YmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTCk7fQ0Kb1w6KiB7 YmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTCk7fQ0Kd1w6KiB7YmVoYXZpb3I6dXJsKCNkZWZhdWx0 I1ZNTCk7fQ0KLnNoYXBlIHtiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTt9DQo8L3N0eWxlPjwh W2VuZGlmXS0tPjxzdHlsZT48IS0tDQovKiBGb250IERlZmluaXRpb25zICovDQpAZm9udC1mYWNl DQoJe2ZvbnQtZmFtaWx5OkhlbHZldGljYTsNCglwYW5vc2UtMToyIDExIDYgNCAyIDIgMiAyIDIg NDt9DQpAZm9udC1mYWNlDQoJe2ZvbnQtZmFtaWx5OlNpbVN1bjsNCglwYW5vc2UtMToyIDEgNiAw IDMgMSAxIDEgMSAxO30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6IkNhbWJyaWEgTWF0aCI7 DQoJcGFub3NlLTE6MiA0IDUgMyA1IDQgNiAzIDIgNDt9DQpAZm9udC1mYWNlDQoJe2ZvbnQtZmFt aWx5OkRlbmdYaWFuOw0KCXBhbm9zZS0xOjIgMSA2IDAgMyAxIDEgMSAxIDE7fQ0KQGZvbnQtZmFj ZQ0KCXtmb250LWZhbWlseTpDYWxpYnJpOw0KCXBhbm9zZS0xOjIgMTUgNSAyIDIgMiA0IDMgMiA0 O30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6IlxARGVuZ1hpYW4iOw0KCXBhbm9zZS0xOjIg MSA2IDAgMyAxIDEgMSAxIDE7fQ0KQGZvbnQtZmFjZQ0KCXtmb250LWZhbWlseToiXEBTaW1TdW4i Ow0KCXBhbm9zZS0xOjIgMSA2IDAgMyAxIDEgMSAxIDE7fQ0KQGZvbnQtZmFjZQ0KCXtmb250LWZh bWlseToiSGVsdmV0aWNhIE5ldWUiO30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6TWVubG87 DQoJcGFub3NlLTE6MCAwIDAgMCAwIDAgMCAwIDAgMDt9DQovKiBTdHlsZSBEZWZpbml0aW9ucyAq Lw0KcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbA0KCXttYXJnaW46MGNt Ow0KCW1hcmdpbi1ib3R0b206LjAwMDFwdDsNCglmb250LXNpemU6MTIuMHB0Ow0KCWZvbnQtZmFt aWx5OlNpbVN1bjt9DQphOmxpbmssIHNwYW4uTXNvSHlwZXJsaW5rDQoJe21zby1zdHlsZS1wcmlv cml0eTo5OTsNCgljb2xvcjpibHVlOw0KCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQ0Kc3Bh bi5hcHBsZS10YWItc3Bhbg0KCXttc28tc3R5bGUtbmFtZTphcHBsZS10YWItc3Bhbjt9DQpzcGFu LmFwcGxlLWNvbnZlcnRlZC1zcGFjZQ0KCXttc28tc3R5bGUtbmFtZTphcHBsZS1jb252ZXJ0ZWQt c3BhY2U7fQ0Kc3Bhbi5FbWFpbFN0eWxlMjENCgl7bXNvLXN0eWxlLXR5cGU6cGVyc29uYWwtcmVw bHk7DQoJZm9udC1mYW1pbHk6RGVuZ1hpYW47DQoJY29sb3I6d2luZG93dGV4dDt9DQouTXNvQ2hw RGVmYXVsdA0KCXttc28tc3R5bGUtdHlwZTpleHBvcnQtb25seTsNCglmb250LXNpemU6MTAuMHB0 O30NCkBwYWdlIFdvcmRTZWN0aW9uMQ0KCXtzaXplOjYxMi4wcHQgNzkyLjBwdDsNCgltYXJnaW46 NzIuMHB0IDcyLjBwdCA3Mi4wcHQgNzIuMHB0O30NCmRpdi5Xb3JkU2VjdGlvbjENCgl7cGFnZTpX b3JkU2VjdGlvbjE7fQ0KLS0+PC9zdHlsZT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4NCjxvOnNo YXBlZGVmYXVsdHMgdjpleHQ9ImVkaXQiIHNwaWRtYXg9IjEwMjYiIC8+DQo8L3htbD48IVtlbmRp Zl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4NCjxvOnNoYXBlbGF5b3V0IHY6ZXh0PSJlZGl0 Ij4NCjxvOmlkbWFwIHY6ZXh0PSJlZGl0IiBkYXRhPSIxIiAvPg0KPC9vOnNoYXBlbGF5b3V0Pjwv eG1sPjwhW2VuZGlmXS0tPg0KPC9oZWFkPg0KPGJvZHkgbGFuZz0iWkgtQ04iIGxpbms9ImJsdWUi IHZsaW5rPSJwdXJwbGUiPg0KPGRpdiBjbGFzcz0iV29yZFNlY3Rpb24xIj4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjEwLjVwdDtmb250 LWZhbWlseTpEZW5nWGlhbiI+Vml0YWx5OjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjEwLjVwdDtm b250LWZhbWlseTpEZW5nWGlhbiI+Jm5ic3A7VGhhbmtzIGZvciB5b3VyIGZ1cnRoZXIgaW52ZXN0 aWdhdGlvbiB3aXRoIExMREIuIE5vdywgd2UgaGF2ZSB0d28gQ0xBTkcgdG9vbCBjaGFpbi4gQ0xB TkdQREIgYW5kIENMQU5HMzguIENMQU5HUERCIHdvcmtzIHdpdGggTExWTTkuMCBvciBhYm92ZSB0 byBnZW5lcmF0ZSBQRSBpbWFnZSB3aXRoIFBEQg0KIGRlYnVnIHN5bWJvbC4gQ0xBTkczOCBjYW4g YWxzbyBiZSB1c2VkIHRvIGdlbmVyYXRlIEVMRiBpbWFnZSBhbmQgY29udmVydCB0byBQRSBpbWFn ZSB3aXRoIERXQVJGIGRlYnVnIHN5bWJvbCBvbiBMaW51eCBob3N0LiBTbywgdGhlc2UgdHdvIGNo YWlucyBjb3ZlciBib3RoIHVzYWdlIG1vZGVscy4gV2UgZG9u4oCZdCBuZWVkIHRvIGludHJvZHVj ZSBuZXcgQ0xBTkdEV0FSRiB0b29sIGNoYWluLiBGb3IgTExEQiBpc3N1ZSBvbiBQREIgZGVidWcg c3ltYm9sLA0KIEkgc3VnZ2VzdCB0byByZXBvcnQgdGhlbSBpbiBMTFZNLiA8bzpwPjwvbzpwPjwv c3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9 ImZvbnQtc2l6ZToxMC41cHQ7Zm9udC1mYW1pbHk6RGVuZ1hpYW4iPjxvOnA+Jm5ic3A7PC9vOnA+ PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHls ZT0iZm9udC1zaXplOjEwLjVwdDtmb250LWZhbWlseTpEZW5nWGlhbiI+Jm5ic3A7QmVzaWRlcywg TExWTTEwLjAgaXMganVzdCByZWxlYXNlZC4NCjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjEwLjVw dDtmb250LWZhbWlseTpEZW5nWGlhbiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6MTAu NXB0O2ZvbnQtZmFtaWx5OkRlbmdYaWFuIj5UaGFua3M8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTox MC41cHQ7Zm9udC1mYW1pbHk6RGVuZ1hpYW4iPkxpbWluZzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4N CjxkaXY+DQo8ZGl2IHN0eWxlPSJib3JkZXI6bm9uZTtib3JkZXItdG9wOnNvbGlkICNFMUUxRTEg MS4wcHQ7cGFkZGluZzozLjBwdCAwY20gMGNtIDBjbSI+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48 Yj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6 JnF1b3Q7Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlmIj5Gcm9tOjwvc3Bhbj48L2I+PHNwYW4gbGFu Zz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGli cmkmcXVvdDssc2Fucy1zZXJpZiI+IGRldmVsQGVkazIuZ3JvdXBzLmlvICZsdDtkZXZlbEBlZGsy Lmdyb3Vwcy5pbyZndDsNCjxiPk9uIEJlaGFsZiBPZiA8L2I+Vml0YWx5IENoZXB0c292PGJyPg0K PGI+U2VudDo8L2I+IDIwMjA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQiPuW5 tDwvc3Bhbj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1m YW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlmIj4zPC9zcGFuPjxzcGFuIHN0eWxl PSJmb250LXNpemU6MTEuMHB0Ij7mnIg8L3NwYW4+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJm b250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssc2Fucy1zZXJp ZiI+MjM8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQiPuaXpTwvc3Bhbj48c3Bh biBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7 Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlmIj4NCiAxNzoxMDxicj4NCjxiPlRvOjwvYj4gQW5kcmV3 IEZpc2ggJmx0O2FmaXNoQGFwcGxlLmNvbSZndDs7IEdhbywgTGltaW5nICZsdDtsaW1pbmcuZ2Fv QGludGVsLmNvbSZndDs8YnI+DQo8Yj5DYzo8L2I+IGRldmVsQGVkazIuZ3JvdXBzLmlvOyBNYXJ2 aW4gSMOkdXNlciAmbHQ7bWhhZXVzZXJAb3V0bG9vay5kZSZndDs8YnI+DQo8Yj5TdWJqZWN0Ojwv Yj4gUmU6IFtlZGsyLWRldmVsXSBDTEFOR1BEQiBiaW5hcnkgZGVidWdnaW5nPG86cD48L286cD48 L3NwYW4+PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxh bmc9IkVOLVVTIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+QW5kcmV3LDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxk aXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+PG86cD4mbmJzcDs8 L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNw YW4gbGFuZz0iRU4tVVMiPkkgaW52ZXN0aWdhdGVkIGZ1cnRoZXIgYW5kIHdhcyBhYmxlIHRvIG1h a2Ugc29tZSBwcm9ncmVzcy4gSSBnb3QgcmlkIG9mIFBEQiwgYW5kIGNoYW5nZWQgZGVidWcgaW5m b3JtYXRpb24gZ2VuZXJhdGlvbiB0byBEV0FSRlsxXS4gVGhpcyByZXNvbHZlZCBtb3N0IG9mIExM REIgY3Jhc2hlcyBhbmQgbWFkZSBwcmV0dHktcHJpbnRpbmcgd29yayBqdXN0IGZpbmUgYXMgdHlw ZSBhbGlhc2VzDQogbGlrZSBFRklfU1RBVFVTIG5vdyB3b3JrIGNvcnJlY3RseSAoSSBhbSBzdGls bCB0byBjb21taXQgdGhpcykuIFVuZm9ydHVuYXRlbHkgdGhlcmUgYXJlIHNldmVyYWwgZG93bnNp ZGVzLiBEZWFkIGNvZGUgc3RyaXBwaW5nIGluIExMRCBsaW5rZXIgaXMgYnJva2VuIHdoZW4gZ2Vu ZXJhdGluZyBQRSB3aXRoIERXQVJGLCBzbyBJIGhhZCB0byBwYXRjaCBpdFsyXS4gRGVidWcgbGlu ayBpbXBsZW1lbnRhdGlvbiBpbiBsbHZtLW9iamNvcHkgaXMgYWxzbw0KIHF1aXRlIHVnbHksIHdl IGRvIG5vdCBnZXQgTVRPQyBvciBhbnl0aGluZyBhbGlrZVszXSwganVzdCBzb21lIHNlY3Rpb24g d2l0aCBhIHJhbmRvbSBuYW1lIGNvbnRhaW5pbmcgYmFzZSBmaWxlbmFtZS48bzpwPjwvbzpwPjwv c3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5n PSJFTi1VUyI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPkkgY2FuIHN1Ym1pdCBhIG1vcmUg cHJvcGVyIHBhdGNoIHRvIEVESyBJSSBwcm9wZXJseSBpbXBsZW1lbnRpbmcgQ0xBTkdEV0FSRiB0 b29sY2hhaW4gaW5zdGVhZCBvZiBwYXRjaGluZyBDTEFOR1BEQiBsaWtlIGluIFsxXSwgYnV0IGl0 IGlzIHF1ZXN0aW9uYWJsZSB3aGV0aGVyIGl0IGlzIHdvcnRoIGl0LiBMTFZNIDEwIHdpbGwgbGFu ZCB2ZXJ5IHNvb24sIGFuZCB0aGUgbmVjZXNzYXJ5DQogTExEIHBhdGNoZXNbMl0gd2lsbCBkZWZp bml0ZWx5IG5vdCBtYWtlIHRoZWlyIHdheSBpbiB0aGlzIHJlbGVhc2UuIFdlIHdpbGwgaGF2ZSB0 byB3YWl0IGZvciBMTFZNIDExIGF0IHRoZSB2ZXJ5IGxlYXN0LCBhbmQgSSBhbSBub3Qgc3VyZSBJ IGFtIHJlYWR5IHRvIGRyaXZlIGxsdm0tb2JqY29weSBjaGFuZ2VzIGVpdGhlci4gTGltaW5nLCB3 aGF0IGRvIHlvdSB0aGluaz88bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+PG86cD4mbmJzcDs8L286cD48 L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPGJsb2NrcXVvdGUgc3R5bGU9Im1hcmdpbi10b3A6 NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCI+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ PHNwYW4gbGFuZz0iRU4tVVMiPkkndmUgbm90IHVzZWQgdGhlIGZha2UgaW1hZ2UgdG8gZ2V0IHRo aW5ncyBkb25lIHNvIEkgY2FuJ3Qgc3BlYWsgdG8gdGhhdC4gSSBoYXZlIHVzZWQgYSBmYWtlIHRh cmdldCBzbyBJIGNvdWxkIGhhdmUgWElQIFBFSU0gYW5kIHNoYWRvd2VkIFBFSU0gYWRkcmVzcyBh dmFpbGFibGUgYXQgdGhlIHNhbWUgdGltZS4gWW91IGNhbid0IGhhdmUgYSBtb2R1bGUgbG9hZGVk IGF0IDIgYWRkcmVzc2VzDQogYXQgdGhlIHNhbWUgdGltZSBpbiBsbGxkYi4gQnV0IHlvdSBtaWdo dCBiZSBhYmxlIHRvIHVzZSBhIGZha2UgdGFyZ2V0IGZvciB5b3VyIGZha2Ugc3R1ZmY/PG86cD48 L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNw YW4gbGFuZz0iRU4tVVMiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRp dj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIj5KdXN0IGluIGNhc2U6 PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1h bCI+PHNwYW4gbGFuZz0iRU4tVVMiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2 Pg0KPGRpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+ Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAjIGNyZWF0ZSBhIGZha2EgdGFyZ2V0 IHRvIHN0b3JlIGluZm8gYWJvdXQgc3ltYm9sczxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2 Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIj4mbmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IFBlaVhpcFRhcmdldCA9IHRhcmdldC5kZWJ1Z2dl ci5DcmVhdGVUYXJnZXQgKE5vbmUsICZxdW90O2kzODYtYXBwbGUtbWFjb3N4JnF1b3Q7LCAmcXVv dDtyZW1vdGUtbWFjb3N4JnF1b3Q7LCBUcnVlLCBlcnJvcik8bzpwPjwvbzpwPjwvc3Bhbj48L3A+ DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+ PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1z b05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAm bmJzcDsgIyBtYWtlIHN1cmUgdGhlIGdkYi1yZW1vdGUgJm5ic3A7Y29ubmVjdGlvbiB0YXJnZXQg aXMgdGhlIGFjdGl2ZSB0YXJnZXQ8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+ DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+Jm5ic3A7ICZuYnNwOyAm bmJzcDsgJm5ic3A7ICZuYnNwOyB0YXJnZXQuZGVidWdnZXIuU2V0U2VsZWN0ZWRUYXJnZXQgKHRh cmdldCk8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ibG9ja3F1b3Rl Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPjxvOnA+Jm5ic3A7PC9v OnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFu IGxhbmc9IkVOLVVTIj5ZZXMsIHRoYXQgd2FzIGFjdHVhbGx5IGEgc21hcnQgaWRlYS4gSSBpbml0 aWFsbHkgZGlkIGl0IHRoYXQgd2F5LCBhcyBJIGhhZCBtaXhpbmcgTWFjaC1PIGFuZCBQRSB0cmlw bGVzLCBidXQgbGF0ZXIgcmVtb3ZlZCwgd2hpY2ggd2FzIGFjdHVhbGx5IGEgbWlzdGFrZS4gTm93 IEkgaGF2ZSBhIGZha2UgdGFyZ2V0IGZvciBHZGJTeW1zIGFuZCBhIHByb3BlciB0YXJnZXQgZm9y IG90aGVyDQogaW1hZ2VzWzRdLiBUaGlzIHNvbWV3aGF0IHNvbHZlcyB0aGUgaXNzdWUgd2l0aCBp bnZhbGlkIGFkZHJlc3NlcyBmb3IgZ1NULCBhcyBnU1QgZnJvbSBEeGVDb3JlIGlzIG5vdyBwaWNr ZWQuIEhvd2V2ZXIsIEkgY2Fubm90IGFjY2VzcyBnbG9iYWwgdmFyaWFibGVzIGZyb20gb3RoZXIg bW9kdWxlcyBmb3Igc29tZSByZWFzb24gc3RpbGwuPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9k aXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPjxvOnA+ Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxibG9ja3F1b3RlIHN0eWxl PSJtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQiPg0KPGRpdj4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIj5JZiB5b3Ugd2FudCB0byBpbnNwZWN0IGds b2JhbHMgSSB0aGluayB0aGlzIGxvZ2ljIHdvcmtzIHRvIGdldCB5b3UgZGF0YSwgeW91IHdvdWxk IG5lZWQgdG8gcHJpbnQgaXQgb3V0IGV0Yy4mbmJzcDs8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8 L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+PG86 cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05v cm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPlNCVmFsdWVMaXN0ID0gbGxkYi50YXJnZXQuRmluZEds b2JhbFZhcmlhYmxlcyAoJnF1b3Q7Z1NUJnF1b3Q7LCAxMDI0KTxvOnA+PC9vOnA+PC9zcGFuPjwv cD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVT Ij5mb3IgU0JWYWx1ZSBpbiBTQlZhbHVlTGlzdDo8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rp dj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBjbGFzcz0iYXBwbGUtdGFiLXNw YW4iPjxzcGFuIGxhbmc9IkVOLVVTIj48L3NwYW4+PC9zcGFuPjxzcGFuIGxhbmc9IkVOLVVTIj5N b2R1bGUgPSBTQlZhbHVlLkdldEFkZHJlc3MoKS5HZXRNb2R1bGUoKSZuYnNwOzxvOnA+PC9vOnA+ PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxh bmc9IkVOLVVTIj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgTW9kdWxlU3RyID0gU0JWYWx1 ZS5HZXRBZGRyZXNzKCkuR2V0TW9kdWxlKCkuR2V0RmlsZVNwZWMoKS5HZXRGaWxlbmFtZSgpPG86 cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ PHNwYW4gbGFuZz0iRU4tVVMiPiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBTdGFydCA9IGlu dCAoU0JWYWx1ZS5HZXRMb2NhdGlvbigpLCAwKTxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2 Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIj4mbmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDsgRW5kID0gU3RhcnQgJiM0MzsgU0JWYWx1ZS5HZXRCeXRlU2l6 ZSgpIC0gMTxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsm bmJzcDs8L3NwYW4+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OC41cHQ7Zm9u dC1mYW1pbHk6JnF1b3Q7TWVubG8mcXVvdDssc2VyaWYiPlNCRGVjbGFyYXRpb24gPSZuYnNwOzwv c3Bhbj48c3BhbiBsYW5nPSJFTi1VUyI+U0JWYWx1ZS5HZXREZWNsYXJhdGlvbigpPG86cD48L286 cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4g bGFuZz0iRU4tVVMiPiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBDb2x1bW4gPSZuYnNwOzwv c3Bhbj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo4LjVwdDtmb250LWZhbWls eTomcXVvdDtNZW5sbyZxdW90OyxzZXJpZiI+U0JEZWNsYXJhdGlvbi48L3NwYW4+PHNwYW4gbGFu Zz0iRU4tVVMiPkdldENvbHVtbigpPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2 Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPjxvOnA+Jm5ic3A7PC9v OnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFu IGxhbmc9IkVOLVVTIj5JIHdyb3RlIGEgY29tbWFuZCBpbiB0aGUgZWFybHkgZGF5cyB0byBkdW1w IG91dCBhbGwgdGhlIGluc3RhbmNlcyBvZiBhIGdsb2JhbC4mbmJzcDs8bzpwPjwvbzpwPjwvc3Bh bj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJF Ti1VUyI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xh c3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPllvdSBjYW4gYWxzbyB0cnkgKGxsZGIp IGltYWdlIGxvb2t1cCAtQXYgLS1uYW1lIGdTVDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2 Pg0KPC9ibG9ja3F1b3RlPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNw YW4gbGFuZz0iRU4tVVMiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRp dj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIj5Tb21ldGhpbmcgaXMg cmVhbGx5IHdlaXJkLCBnU1QgZnJvbSB0aGUgZmlyc3QgaW1hZ2Ugc2hvd3MsIGJ1dCBsbGRiIGJl bGlldmVzIHRoYXQgaXQgZG9lcyBub3QgZXhpc3QuJm5ic3A7PHNwYW4gc3R5bGU9ImNvbG9yOmJs YWNrIj5sbGRiLnRhcmdldC5GaW5kR2xvYmFsVmFyaWFibGVzICgmcXVvdDtnU1QmcXVvdDssIDEw MjQpIGFsc28gcmV0dXJucyBhbiBlbXB0eSBsaXN0Ljwvc3Bhbj48bzpwPjwvbzpwPjwvc3Bhbj48 L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1V UyI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPkkgbm90aWNlZCB0aGF0IExMREIgc2hvd3Mg aW52YWxpZCB0eXBlIGZvciBnU1QgaW4gdGhlIHN5bXRhYiwgdGhlcmUgYWxzbyBpcyBubyBhZGRy ZXNzLiBJIHN0YXJ0ZWQgdG8gd29uZGVyIHdoZXRoZXIgdGhpcyBpcyB0aGUgY2F1c2UgYW5kIGRl Y2lkZWQgdG8gY2hlY2sgWENPREU1LCBhcyB0aGUgdGhlIGlzc3VlIGNvdWxkIGhhdmUgYmVlbiB3 aXRoIFBFIGZvcm1hdC4gVW5mb3J0dW5hdGVseQ0KIGV2ZW4gYWZ0ZXIgSSB0cmllZDxzcGFuIHN0 eWxlPSJjb2xvcjpibGFjayI+Jm5ic3A7WENPREU1IHN1cHBvcnQgd2l0aCBMTERCLCBJIGdvdCBl eGFjdGx5IHRoZSBzYW1lIHByb2JsZW0uIEkgYW0gcXVpdGUgY2x1ZWxlc3Mgd2hhdCBpcyBnb2lu ZyBvbi4mbmJzcDtCZWxvdyBJIGluY2x1ZGVkIHR3byB0cmFuc2NyaXB0czogZm9yIENMQU5HRFdB UkYgYW5kIFhDT0RFNS48L3NwYW4+PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2 Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPjxvOnA+Jm5ic3A7PC9v OnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFu IGxhbmc9IkVOLVVTIj4obGxkYikmbmJzcDtwIGdTVDxicj4NCihFRklfU1lTVEVNX1RBQkxFICop ICQwID0gMHgwMDAwMDAwMDdmOWVlMDE4PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8 ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPihsbGRiKSZuYnNw O3AgKmdTVDxicj4NCihFRklfU1lTVEVNX1RBQkxFKSAkMSA9IHs8YnI+DQombmJzcDsmbmJzcDtI ZHIgPSAoU2lnbmF0dXJlID0gMHg1NDUzNTk1MzIwNDk0MjQ5LCBSZXZpc2lvbiA9IDB4MDAwMjAw NDYsIEhlYWRlclNpemUgPSAweDAwMDAwMDc4LCBDUkMzMiA9IDB4M2Q1ZTliNWQsIFJlc2VydmVk ID0gMHgwMDAwMDAwMCk8YnI+DQombmJzcDsmbmJzcDtGaXJtd2FyZVZlbmRvciA9IDB4MDAwMDAw MDA3ZjllOWM5ODxicj4NCiZuYnNwOyZuYnNwO0Zpcm13YXJlUmV2aXNpb24gPSAweDAwMDEwMDAw PGJyPg0KJm5ic3A7Jm5ic3A7Q29uc29sZUluSGFuZGxlID0gMHgwMDAwMDAwMDdlZDU4ZjE4PGJy Pg0KJm5ic3A7Jm5ic3A7Q29uSW4gPSAweDAwMDAwMDAwN2U2ZWRjYjg8YnI+DQombmJzcDsmbmJz cDtDb25zb2xlT3V0SGFuZGxlID0gMHgwMDAwMDAwMDdlZDU3MDE4PGJyPg0KJm5ic3A7Jm5ic3A7 Q29uT3V0ID0gMHgwMDAwMDAwMDdlNmVkZTQwPGJyPg0KJm5ic3A7Jm5ic3A7U3RhbmRhcmRFcnJv ckhhbmRsZSA9IDB4MDAwMDAwMDA3ZWQ1N2E5ODxicj4NCiZuYnNwOyZuYnNwO1N0ZEVyciA9IDB4 MDAwMDAwMDA3ZTZlZTAzMDxicj4NCiZuYnNwOyZuYnNwO1J1bnRpbWVTZXJ2aWNlcyA9IDB4MDAw MDAwMDA3ZjllZWI5ODxicj4NCiZuYnNwOyZuYnNwO0Jvb3RTZXJ2aWNlcyA9IDB4MDAwMDAwMDA3 ZmU2ODllODxicj4NCiZuYnNwOyZuYnNwO051bWJlck9mVGFibGVFbnRyaWVzID0gMHgwMDAwMDAw MDAwMDAwMDBhPGJyPg0KJm5ic3A7Jm5ic3A7Q29uZmlndXJhdGlvblRhYmxlID0gMHgwMDAwMDAw MDdmOWVlYzk4PGJyPg0KfTxicj4NCihsbGRiKSZuYnNwO2ltYWdlIGxvb2t1cCAtQXYgLS1uYW1l IGdTVDxicj4NCihsbGRiKSZuYnNwO2ltYWdlIGR1bXAgc2VjdGlvbnM8YnI+DQpEdW1waW5nIHNl Y3Rpb25zIGZvciA5MCBtb2R1bGVzLjxicj4NClNlY3Rpb25zIGZvciAnL1VzZXJzL3VzZXIvRG9j dW1lbnRzL1VlZmlXb3Jrc3BhY2UvQnVpbGQvT3ZtZlg2NC9OT09QVF9DTEFOR1BEQi9YNjQvRHhl Q29yZS5kZWJ1ZycgKHg4Nl82NCk6PGJyPg0KJm5ic3A7Jm5ic3A7U2VjdElEJm5ic3A7Jm5ic3A7 ICZuYnNwOyZuYnNwO1R5cGUmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7 ICZuYnNwOyZuYnNwO0xvYWQgQWRkcmVzcyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDsmbmJzcDtQZXJtIEZpbGUgT2ZmLiZuYnNwOyZuYnNwO0ZpbGUgU2l6ZSZu YnNwOyZuYnNwO0ZsYWdzJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDtTZWN0aW9uIE5hbWU8YnI+ DQombmJzcDsmbmJzcDstLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJm5ic3A7Jm5ic3A7LS0tLSAtLS0tLS0tLS0tIC0tLS0t LS0tLS0gLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPGJyPg0KJm5ic3A7 Jm5ic3A7MHhmZmZmZmZmZmZmZmZmZmZmIGNvbnRhaW5lciZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu YnNwOyZuYnNwO1sweDAwMDAwMDAwN2ZlMWIwMDAtMHgwMDAwMDAwMDdmZjM4YWMwKSZuYnNwOyZu YnNwOy0tLSZuYnNwOyZuYnNwOzB4MDAwMDAwMDAgMHgwMDAwMDAwMCAweDAwMDAwMDAwIER4ZUNv cmUuZGVidWcuPGJyPg0KJm5ic3A7Jm5ic3A7MHgwMDAwMDAwMSBjb2RlJm5ic3A7Jm5ic3A7ICZu YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDtbMHgwMDAwMDAwMDdmZTFiMzIw LTB4MDAwMDAwMDA3ZmU2MWYzNCkmbmJzcDsmbmJzcDstLS0mbmJzcDsmbmJzcDsweDAwMDAwMzIw IDB4MDAwNDZjMjAgMHg2MDAwMDAyMCBEeGVDb3JlLmRlYnVnLi4udGV4dDxicj4NCiZuYnNwOyZu YnNwOzB4MDAwMDAwMDIgZGF0YSZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz cDsgJm5ic3A7Jm5ic3A7WzB4MDAwMDAwMDA3ZmU2MWY0MC0weDAwMDAwMDAwN2ZlNjgwZjEpJm5i c3A7Jm5ic3A7LS0tJm5ic3A7Jm5ic3A7MHgwMDA0NmY0MCAweDAwMDA2MWMwIDB4NDAwMDAwNDAg RHhlQ29yZS5kZWJ1Zy4uLnJkYXRhPGJyPg0KJm5ic3A7Jm5ic3A7MHgwMDAwMDAwMyBkYXRhJm5i c3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDtbMHgwMDAw MDAwMDdmZTY4MTAwLTB4MDAwMDAwMDA3ZmU2ZDFlMCkmbmJzcDsmbmJzcDstLS0mbmJzcDsmbmJz cDsweDAwMDRkMTAwIDB4MDAwMDE4YTAgMHhjMDAwMDA0MCBEeGVDb3JlLmRlYnVnLi4uZGF0YTxi cj4NCiZuYnNwOyZuYnNwOzB4MDAwMDAwMDQgcmVndWxhciZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu YnNwOyAmbmJzcDsmbmJzcDtbMHgwMDAwMDAwMDdmZTZkMWUwLTB4MDAwMDAwMDA3ZmU2ZDQyNCkm bmJzcDsmbmJzcDstLS0mbmJzcDsmbmJzcDsweDAwMDRlOWEwIDB4MDAwMDAyNjAgMHg0MjAwMDA0 MCBEeGVDb3JlLmRlYnVnLi4ucmVsb2M8YnI+DQombmJzcDsmbmJzcDsweDAwMDAwMDA1IGR3YXJm LWFiYnJldiZuYnNwOyZuYnNwOyAmbmJzcDsmbmJzcDtbMHgwMDAwMDAwMDdmZTZkNDQwLTB4MDAw MDAwMDA3ZmU3NDA1OSkmbmJzcDsmbmJzcDstLS0mbmJzcDsmbmJzcDsweDAwMDRlYzAwIDB4MDAw MDZjMjAgMHg0MjAwMDA0MCBEeGVDb3JlLmRlYnVnLi4uZGVidWdfYWJicmV2PGJyPg0KJm5ic3A7 Jm5ic3A7MHgwMDAwMDAwNiBkd2FyZi1pbmZvJm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJz cDtbMHgwMDAwMDAwMDdmZTc0MDYwLTB4MDAwMDAwMDA3ZmVjMTM1NSkmbmJzcDsmbmJzcDstLS0m bmJzcDsmbmJzcDsweDAwMDU1ODIwIDB4MDAwNGQzMDAgMHg0MjAwMDA0MCBEeGVDb3JlLmRlYnVn Li4uZGVidWdfaW5mbzxicj4NCiZuYnNwOyZuYnNwOzB4MDAwMDAwMDcgZHdhcmYtbGluZSZuYnNw OyZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7WzB4MDAwMDAwMDA3ZmVjMTM2MC0weDAwMDAwMDAw N2ZlZjlmZDQpJm5ic3A7Jm5ic3A7LS0tJm5ic3A7Jm5ic3A7MHgwMDBhMmIyMCAweDAwMDM4Yzgw IDB4NDIwMDAwNDAgRHhlQ29yZS5kZWJ1Zy4uLmRlYnVnX2xpbmU8YnI+DQombmJzcDsmbmJzcDsw eDAwMDAwMDA4IGR3YXJmLW1hY2luZm8mbmJzcDsgJm5ic3A7Jm5ic3A7WzB4MDAwMDAwMDA3ZmVm OWZlMC0weDAwMDAwMDAwN2ZlZmEwNTYpJm5ic3A7Jm5ic3A7LS0tJm5ic3A7Jm5ic3A7MHgwMDBk YjdhMCAweDAwMDAwMDgwIDB4NDIwMDAwNDAgRHhlQ29yZS5kZWJ1Zy4uLmRlYnVnX21hY2luZm88 YnI+DQombmJzcDsmbmJzcDsweDAwMDAwMDA5IGR3YXJmLXJhbmdlcyZuYnNwOyZuYnNwOyAmbmJz cDsmbmJzcDtbMHgwMDAwMDAwMDdmZWZhMDYwLTB4MDAwMDAwMDA3ZmVmZjYxMCkmbmJzcDsmbmJz cDstLS0mbmJzcDsmbmJzcDsweDAwMGRiODIwIDB4MDAwMDU1YzAgMHg0MjAwMDA0MCBEeGVDb3Jl LmRlYnVnLi4uZGVidWdfcmFuZ2VzPGJyPg0KJm5ic3A7Jm5ic3A7MHgwMDAwMDAwYSBkd2FyZi1z dHImbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDtbMHgwMDAwMDAwMDdmZWZmNjIwLTB4 MDAwMDAwMDA3ZmYzOGFiZCkmbmJzcDsmbmJzcDstLS0mbmJzcDsmbmJzcDsweDAwMGUwZGUwIDB4 MDAwMzk0YTAgMHg0MjAwMDA0MCBEeGVDb3JlLmRlYnVnLi4uZGVidWdfc3RyPGJyPg0KU2VjdGlv bnMgZm9yICcvVXNlcnMvdXNlci9Eb2N1bWVudHMvVWVmaVdvcmtzcGFjZS9CdWlsZC9Pdm1mWDY0 L05PT1BUX0NMQU5HUERCL1g2NC9EZXZpY2VQYXRoRHhlLmRlYnVnJyAoeDg2XzY0KTo8YnI+DQom bmJzcDsmbmJzcDtTZWN0SUQmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7VHlwZSZuYnNwOyZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7TG9hZCBBZGRyZXNzJm5i c3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwO1Blcm0gRmls ZSBPZmYuJm5ic3A7Jm5ic3A7RmlsZSBTaXplJm5ic3A7Jm5ic3A7RmxhZ3MmbmJzcDsgJm5ic3A7 ICZuYnNwOyZuYnNwO1NlY3Rpb24gTmFtZTxicj4NCiZuYnNwOyZuYnNwOy0tLS0tLS0tLS0gLS0t LS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0mbmJz cDsmbmJzcDstLS0tIC0tLS0tLS0tLS0gLS0tLS0tLS0tLSAtLS0tLS0tLS0tIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS08YnI+DQombmJzcDsmbmJzcDsweGZmZmZmZmZmZmZmZmZmZmYgY29u dGFpbmVyJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7WzB4MDAwMDAwMDA3Zjk4NjAw MC0weDAwMDAwMDAwN2Y5Y2IwYTApJm5ic3A7Jm5ic3A7LS0tJm5ic3A7Jm5ic3A7MHgwMDAwMDAw MCAweDAwMDAwMDAwIDB4MDAwMDAwMDAgRGV2aWNlUGF0aER4ZS5kZWJ1Zy48YnI+DQombmJzcDsm bmJzcDsweDAwMDAwMDAxIGNvZGUmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i c3A7ICZuYnNwOyZuYnNwO1sweDAwMDAwMDAwN2Y5ODYzMjAtMHgwMDAwMDAwMDdmOTk2ZGM2KSZu YnNwOyZuYnNwOy0tLSZuYnNwOyZuYnNwOzB4MDAwMDAzMjAgMHgwMDAxMGFjMCAweDYwMDAwMDIw IERldmljZVBhdGhEeGUuZGVidWcuLi50ZXh0PGJyPg0KJm5ic3A7Jm5ic3A7MHgwMDAwMDAwMiBk YXRhJm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDtb MHgwMDAwMDAwMDdmOTk2ZGUwLTB4MDAwMDAwMDA3Zjk5OWI3NSkmbmJzcDsmbmJzcDstLS0mbmJz cDsmbmJzcDsweDAwMDEwZGUwIDB4MDAwMDJkYTAgMHg0MDAwMDA0MCBEZXZpY2VQYXRoRHhlLmRl YnVnLi4ucmRhdGE8YnI+DQombmJzcDsmbmJzcDsweDAwMDAwMDAzIGRhdGEmbmJzcDsmbmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwO1sweDAwMDAwMDAwN2Y5OTli ODAtMHgwMDAwMDAwMDdmOTlhMjAyKSZuYnNwOyZuYnNwOy0tLSZuYnNwOyZuYnNwOzB4MDAwMTNi ODAgMHgwMDAwMDY2MCAweGMwMDAwMDQwIERldmljZVBhdGhEeGUuZGVidWcuLi5kYXRhPGJyPg0K Jm5ic3A7Jm5ic3A7MHgwMDAwMDAwNCByZWd1bGFyJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7 ICZuYnNwOyZuYnNwO1sweDAwMDAwMDAwN2Y5OWEyMjAtMHgwMDAwMDAwMDdmOTlhNDY0KSZuYnNw OyZuYnNwOy0tLSZuYnNwOyZuYnNwOzB4MDAwMTQxZTAgMHgwMDAwMDI2MCAweDQyMDAwMDQwIERl dmljZVBhdGhEeGUuZGVidWcuLi5yZWxvYzxicj4NCiZuYnNwOyZuYnNwOzB4MDAwMDAwMDUgZHdh cmYtYWJicmV2Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwO1sweDAwMDAwMDAwN2Y5OWE0ODAtMHgw MDAwMDAwMDdmOTliZDA5KSZuYnNwOyZuYnNwOy0tLSZuYnNwOyZuYnNwOzB4MDAwMTQ0NDAgMHgw MDAwMThhMCAweDQyMDAwMDQwIERldmljZVBhdGhEeGUuZGVidWcuLi5kZWJ1Z19hYmJyZXY8YnI+ DQombmJzcDsmbmJzcDsweDAwMDAwMDA2IGR3YXJmLWluZm8mbmJzcDsmbmJzcDsgJm5ic3A7ICZu YnNwOyZuYnNwO1sweDAwMDAwMDAwN2Y5OWJkMjAtMHgwMDAwMDAwMDdmOWFkOGI3KSZuYnNwOyZu YnNwOy0tLSZuYnNwOyZuYnNwOzB4MDAwMTVjZTAgMHgwMDAxMWJhMCAweDQyMDAwMDQwIERldmlj ZVBhdGhEeGUuZGVidWcuLi5kZWJ1Z19pbmZvPGJyPg0KJm5ic3A7Jm5ic3A7MHgwMDAwMDAwNyBk d2FyZi1saW5lJm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDtbMHgwMDAwMDAwMDdmOWFk OGMwLTB4MDAwMDAwMDA3ZjliYzFmNykmbmJzcDsmbmJzcDstLS0mbmJzcDsmbmJzcDsweDAwMDI3 ODgwIDB4MDAwMGU5NDAgMHg0MjAwMDA0MCBEZXZpY2VQYXRoRHhlLmRlYnVnLi4uZGVidWdfbGlu ZTxicj4NCiZuYnNwOyZuYnNwOzB4MDAwMDAwMDggZHdhcmYtbWFjaW5mbyZuYnNwOyAmbmJzcDsm bmJzcDtbMHgwMDAwMDAwMDdmOWJjMjAwLTB4MDAwMDAwMDA3ZjliYzIyMykmbmJzcDsmbmJzcDst LS0mbmJzcDsmbmJzcDsweDAwMDM2MWMwIDB4MDAwMDAwNDAgMHg0MjAwMDA0MCBEZXZpY2VQYXRo RHhlLmRlYnVnLi4uZGVidWdfbWFjaW5mbzxicj4NCiZuYnNwOyZuYnNwOzB4MDAwMDAwMDkgZHdh cmYtcmFuZ2VzJm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwO1sweDAwMDAwMDAwN2Y5YmMyNDAtMHgw MDAwMDAwMDdmOWJlMDIwKSZuYnNwOyZuYnNwOy0tLSZuYnNwOyZuYnNwOzB4MDAwMzYyMDAgMHgw MDAwMWRlMCAweDQyMDAwMDQwIERldmljZVBhdGhEeGUuZGVidWcuLi5kZWJ1Z19yYW5nZXM8YnI+ DQombmJzcDsmbmJzcDsweDAwMDAwMDBhIGR3YXJmLXN0ciZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu YnNwOyZuYnNwO1sweDAwMDAwMDAwN2Y5YmUwMjAtMHgwMDAwMDAwMDdmOWNiMDk5KSZuYnNwOyZu YnNwOy0tLSZuYnNwOyZuYnNwOzB4MDAwMzdmZTAgMHgwMDAwZDA4MCAweDQyMDAwMDQwIERldmlj ZVBhdGhEeGUuZGVidWcuLi5kZWJ1Z19zdHI8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4N CjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+4oCmPG86cD48 L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNw YW4gbGFuZz0iRU4tVVMiPihsbGRiKSZuYnNwO2ltYWdlIGR1bXAgc3ltdGFiPGJyPg0KRHVtcGlu ZyBzeW1ib2wgdGFibGUgZm9yIDkwIG1vZHVsZXMuPGJyPg0KU3ltdGFiLCBmaWxlID0gL1VzZXJz L3VzZXIvRG9jdW1lbnRzL1VlZmlXb3Jrc3BhY2UvQnVpbGQvT3ZtZlg2NC9OT09QVF9DTEFOR1BE Qi9YNjQvRHhlQ29yZS5kZWJ1ZywgbnVtX3N5bWJvbHMgPSA0MzQzOjxicj4NCiZuYnNwOyAmbmJz cDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDtEZWJ1ZyBzeW1ib2w8 YnI+DQombmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i c3A7fFN5bnRoZXRpYyBzeW1ib2w8YnI+DQombmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7fHxFeHRlcm5hbGx5IFZpc2libGU8YnI+DQombmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7fHx8PGJyPg0K SW5kZXgmbmJzcDsmbmJzcDsmbmJzcDtVc2VySUQgRFNYIFR5cGUmbmJzcDsgJm5ic3A7ICZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwO0ZpbGUgQWRkcmVzcy9WYWx1ZSBMb2FkIEFkZHJl c3MmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwO1NpemUmbmJzcDsmbmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDtGbGFncyZuYnNwOyAmbmJz cDsgJm5ic3A7Jm5ic3A7TmFtZTxicj4NCi0tLS0tLS0gLS0tLS0tIC0tLSAtLS0tLS0tLS0tLS0t LS0gLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0t LS0gLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPGJyPg0KWyZu YnNwOyAmbmJzcDsmbmJzcDswXSA0Mjk0OTY3Mjk1Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwO0lu dmFsaWQmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAw MDAwMDAgMHgwMDAwMDAwMDdmZTFiMDAwIDB4MDAwMDAwMDAwMDAwMDAzYSAweDAwMDAwMDAwIC50 ZXh0PGJyPg0KWyZuYnNwOyAmbmJzcDsmbmJzcDsxXSA0Mjk0OTY3Mjk1Jm5ic3A7Jm5ic3A7ICZu YnNwOyZuYnNwO0ludmFsaWQmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsw eDAwMDAwMDAwMDAwMDAwMDAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAwMDAwMDAgMHgw MDAwMDAwMCAuZGF0YTxicj4NClsmbmJzcDsgJm5ic3A7Jm5ic3A7Ml0gNDI5NDk2NzI5NSZuYnNw OyZuYnNwOyAmbmJzcDsmbmJzcDtJbnZhbGlkJm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i c3A7Jm5ic3A7MHgwMDAwMDAwMDAwMDAxODk4Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7MHgwMDAwMDAwMDAw MDAwMDAwIDB4MDAwMDAwMDAgLmJzczxicj4NClsmbmJzcDsgJm5ic3A7Jm5ic3A7M10gNDI5NDk2 NzI5NSZuYnNwOyZuYnNwOyAmbmJzcDsmbmJzcDtJbnZhbGlkJm5ic3A7Jm5ic3A7ICZuYnNwOyAm bmJzcDsgJm5ic3A7Jm5ic3A7MHgwMDAwMDAwMDAwMDQ2YmMwIDB4MDAwMDAwMDA3ZmU2MWJjMCAw eDAwMDAwMDAwMDAwMDAzNzQgMHgwMDAwMDAwMCAudGV4dCRfTW9kdWxlRW50cnlQb2ludDxicj4N ClsmbmJzcDsgJm5ic3A7Jm5ic3A7NF0gNDI5NDk2NzI5NSZuYnNwOyZuYnNwOyAmbmJzcDsmbmJz cDtDb2RlJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAw MDAwMDAwMDAwNDZiYzAgMHgwMDAwMDAwMDdmZTYxYmMwIDB4MDAwMDAwMDAwMDAwMDM3NCAweDAw MDAwMDAwIF9Nb2R1bGVFbnRyeVBvaW50PGJyPg0KWyZuYnNwOyAmbmJzcDsmbmJzcDs1XSA0Mjk0 OTY3Mjk1Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwO0ludmFsaWQmbmJzcDsmbmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAwMDFiMDgmbmJzcDsgJm5ic3A7ICZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsw eDAwMDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAwMCAuYnNzJGdIb2JMaXN0PGJyPg0KWyZuYnNwOyAm bmJzcDsmbmJzcDs2XSA0Mjk0OTY3Mjk1Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwO0ludmFsaWQm bmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAwMDFiMDgm bmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu YnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAwMCBnSG9iTGlzdDxi cj4NClsmbmJzcDsgJm5ic3A7Jm5ic3A7N10gNDI5NDk2NzI5NSZuYnNwOyZuYnNwOyAmbmJzcDsm bmJzcDtJbnZhbGlkJm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7MHgwMDAw MDAwMDAwMDAwMDAwJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7MHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAw MDAgLnJkYXRhPGJyPg0KWyZuYnNwOyAmbmJzcDsmbmJzcDs4XSA0Mjk0OTY3Mjk1Jm5ic3A7Jm5i c3A7ICZuYnNwOyZuYnNwO0ludmFsaWQmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsm bmJzcDsweDAwMDAwMDAwMDAwMDAwMDAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAwMDAw MDAgMHgwMDAwMDAwMCAuc3RyPGJyPg0KWyZuYnNwOyAmbmJzcDsmbmJzcDs5XSA0Mjk0OTY3Mjk1 Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwO0ludmFsaWQmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNw OyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAwMDAwNTgmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz cDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAwMDAw MDAwMDAwMDAwMDAgMHgwMDAwMDAwMCAucmRhdGE8YnI+DQpbJm5ic3A7Jm5ic3A7Jm5ic3A7MTBd IDQyOTQ5NjcyOTUmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7SW52YWxpZCZuYnNwOyZuYnNwOyAm bmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzB4MDAwMDAwMDAwMDAwMDA1OCZuYnNwOyAmbmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZu YnNwOzB4MDAwMDAwMDAwMDAwMDAwMCAweDAwMDAwMDAwIC5zdHIuMTxicj4NClsmbmJzcDsmbmJz cDsmbmJzcDsxMV0gNDI5NDk2NzI5NSZuYnNwOyZuYnNwOyAmbmJzcDsmbmJzcDtJbnZhbGlkJm5i c3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7MHgwMDAwMDAwMDAwMDAwMDAwJm5i c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz cDsgJm5ic3A7Jm5ic3A7MHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwMDAgLmRlYnVnX3N0cjxi cj4NClsmbmJzcDsmbmJzcDsmbmJzcDsxMl0gNDI5NDk2NzI5NSZuYnNwOyZuYnNwOyAmbmJzcDsm bmJzcDtJbnZhbGlkJm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7MHgwMDAw MDAwMDAwMDAwMDAwJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7MHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAw MDAgLmRlYnVnX2FiYnJldjxicj4NClsmbmJzcDsmbmJzcDsmbmJzcDsxM10gNDI5NDk2NzI5NSZu YnNwOyZuYnNwOyAmbmJzcDsmbmJzcDtJbnZhbGlkJm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsg Jm5ic3A7Jm5ic3A7MHgwMDAwMDAwMDAwMDAwMDAwJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7MHgwMDAwMDAw MDAwMDAwMDAwIDB4MDAwMDAwMDAgLmRlYnVnX2luZm88YnI+DQpbJm5ic3A7Jm5ic3A7Jm5ic3A7 MTRdIDQyOTQ5NjcyOTUmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7SW52YWxpZCZuYnNwOyZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzB4MDAwMDAwMDAwMDAwMDAwMCZuYnNwOyAmbmJz cDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw OyZuYnNwOzB4MDAwMDAwMDAwMDAwMDAwMCAweDAwMDAwMDAwIC5kZWJ1Z19yYW5nZXM8YnI+DQpb Jm5ic3A7Jm5ic3A7Jm5ic3A7MTVdIDQyOTQ5NjcyOTUmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7 SW52YWxpZCZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzB4MDAwMDAwMDAw MDAwMDAwMCZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAm bmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzB4MDAwMDAwMDAwMDAwMDAwMCAweDAwMDAwMDAwIC5k ZWJ1Z19tYWNpbmZvPGJyPg0KWyZuYnNwOyZuYnNwOyZuYnNwOzE2XSA0Mjk0OTY3Mjk1Jm5ic3A7 Jm5ic3A7ICZuYnNwOyZuYnNwO0ludmFsaWQmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz cDsmbmJzcDsweDAwMDAwMDAwMDAwMDAwMDAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAw MDAwMDAgMHgwMDAwMDAwMCAuZGVidWdfbGluZTxicj4NClsmbmJzcDsmbmJzcDsmbmJzcDsxN10g NDI5NDk2NzI5NSZuYnNwOyZuYnNwOyAmbmJzcDsmbmJzcDtDb2RlJm5ic3A7ICZuYnNwOyAmbmJz cDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAwM2Y2ODAgMHgwMDAwMDAw MDdmZTVhNjgwIDB4MDAwMDAwMDAwMDAwMDAyMCAweDAwMDAwMDAwIFByb2Nlc3NNb2R1bGVFbnRy eVBvaW50TGlzdDxicj4NClsmbmJzcDsmbmJzcDsmbmJzcDsxOF0gNDI5NDk2NzI5NSZuYnNwOyZu YnNwOyAmbmJzcDsmbmJzcDtDb2RlJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAm bmJzcDsmbmJzcDsweDAwMDAwMDAwMDAwMjMxMzAgMHgwMDAwMDAwMDdmZTNlMTMwIDB4MDAwMDAw MDAwMDAwMDAyMCAweDAwMDAwMDAwIERlYnVnQXNzZXJ0RW5hYmxlZDxicj4NClsmbmJzcDsmbmJz cDsmbmJzcDsxOV0gNDI5NDk2NzI5NSZuYnNwOyZuYnNwOyAmbmJzcDsmbmJzcDtDb2RlJm5ic3A7 ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAwMjMw NjAgMHgwMDAwMDAwMDdmZTNlMDYwIDB4MDAwMDAwMDAwMDAwMDBkMCAweDAwMDAwMDAwIERlYnVn QXNzZXJ0PGJyPg0KWyZuYnNwOyZuYnNwOyZuYnNwOzIwXSA0Mjk0OTY3Mjk1Jm5ic3A7Jm5ic3A7 ICZuYnNwOyZuYnNwO0NvZGUmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw OyZuYnNwOzB4MDAwMDAwMDAwMDAyMjE1MCAweDAwMDAwMDAwN2ZlM2QxNTAgMHgwMDAwMDAwMDAw MDAwMDIwIDB4MDAwMDAwMDAgQ3B1RGVhZExvb3A8YnI+DQpbJm5ic3A7Jm5ic3A7Jm5ic3A7MjFd IDQyOTQ5NjcyOTUmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7SW52YWxpZCZuYnNwOyZuYnNwOyAm bmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzB4MDAwMDAwMDAwMDAwMDAwMCAweDAwMDAwMDAwN2Zl MWIwMDAgMHgwMDAwMDAwMDAwMDAwMDNhIDB4MDAwMDAwMDAgLnRleHQ8YnI+DQpbJm5ic3A7Jm5i c3A7Jm5ic3A7MjJdIDQyOTQ5NjcyOTUmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7SW52YWxpZCZu YnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzB4MDAwMDAwMDAwMDAwMDAwMCZu YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i c3A7ICZuYnNwOyZuYnNwOzB4MDAwMDAwMDAwMDAwMDAwMCAweDAwMDAwMDAwIC5kYXRhPGJyPg0K WyZuYnNwOyZuYnNwOyZuYnNwOzIzXSA0Mjk0OTY3Mjk1Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNw O0ludmFsaWQmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAw MDAwMDE4OTgmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAwMCAu YnNzPGJyPg0KWyZuYnNwOyZuYnNwOyZuYnNwOzI0XSA0Mjk0OTY3Mjk1Jm5ic3A7Jm5ic3A7ICZu YnNwOyZuYnNwO0ludmFsaWQmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsw eDAwMDAwMDAwMDAwM2YyNDAgMHgwMDAwMDAwMDdmZTVhMjQwIDB4MDAwMDAwMDAwMDAwMDQ0MCAw eDAwMDAwMDAwIC50ZXh0JFByb2Nlc3NMaWJyYXJ5Q29uc3RydWN0b3JMaXN0PGJyPg0KWyZuYnNw OyZuYnNwOyZuYnNwOzI1XSA0Mjk0OTY3Mjk1Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwO0NvZGUm bmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzB4MDAwMDAwMDAw MDAzZjI0MCAweDAwMDAwMDAwN2ZlNWEyNDAgMHgwMDAwMDAwMDAwMDAwNDQwIDB4MDAwMDAwMDAg UHJvY2Vzc0xpYnJhcnlDb25zdHJ1Y3Rvckxpc3Q8YnI+DQpbJm5ic3A7Jm5ic3A7Jm5ic3A7MjZd IDQyOTQ5NjcyOTUmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7SW52YWxpZCZuYnNwOyZuYnNwOyAm bmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzB4MDAwMDAwMDAwMDAzZjY4MCAweDAwMDAwMDAwN2Zl NWE2ODAgMHgwMDAwMDAwMDAwMDAwMDIwIDB4MDAwMDAwMDAgLnRleHQkUHJvY2Vzc01vZHVsZUVu dHJ5UG9pbnRMaXN0PGJyPg0KWyZuYnNwOyZuYnNwOyZuYnNwOzI3XSA0Mjk0OTY3Mjk1Jm5ic3A7 Jm5ic3A7ICZuYnNwOyZuYnNwO0ludmFsaWQmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz cDsmbmJzcDsweDAwMDAwMDAwMDAwMDAwNzAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAw MDAwMDAgMHgwMDAwMDAwMCAuZGF0YSRnRWZpQ2FsbGVySWRHdWlkPGJyPg0KWyZuYnNwOyZuYnNw OyZuYnNwOzI4XSA0Mjk0OTY3Mjk1Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwO0ludmFsaWQmbmJz cDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAwMDAwNzAmbmJz cDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw OyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAwMCBnRWZpQ2FsbGVySWRH dWlkPGJyPg0KWyZuYnNwOyZuYnNwOyZuYnNwOzI5XSA0Mjk0OTY3Mjk1Jm5ic3A7Jm5ic3A7ICZu YnNwOyZuYnNwO0ludmFsaWQmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsw eDAwMDAwMDAwMDAwMDAxNDgmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAwMDAwMDAgMHgw MDAwMDAwMCAuZGF0YSRnRWZpRXZlbnRNZW1vcnlNYXBDaGFuZ2VHdWlkPGJyPg0KWyZuYnNwOyZu YnNwOyZuYnNwOzMwXSA0Mjk0OTY3Mjk1Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwO0ludmFsaWQm bmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAwMDAxNDgm bmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu YnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAwMCBnRWZpRXZlbnRN ZW1vcnlNYXBDaGFuZ2VHdWlkPGJyPg0KWyZuYnNwOyZuYnNwOyZuYnNwOzMxXSA0Mjk0OTY3Mjk1 Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwO0ludmFsaWQmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNw OyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAwMDAxNjgmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz cDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAwMDAw MDAwMDAwMDAwMDAgMHgwMDAwMDAwMCAuZGF0YSRnRWZpRXZlbnRWaXJ0dWFsQWRkcmVzc0NoYW5n ZUd1aWQ8YnI+DQpbJm5ic3A7Jm5ic3A7Jm5ic3A7MzJdIDQyOTQ5NjcyOTUmbmJzcDsmbmJzcDsg Jm5ic3A7Jm5ic3A7SW52YWxpZCZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNw OzB4MDAwMDAwMDAwMDAwMDE2OCZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzB4MDAwMDAwMDAwMDAwMDAwMCAw eDAwMDAwMDAwIGdFZmlFdmVudFZpcnR1YWxBZGRyZXNzQ2hhbmdlR3VpZDxicj4NClsmbmJzcDsm bmJzcDsmbmJzcDszM10gNDI5NDk2NzI5NSZuYnNwOyZuYnNwOyAmbmJzcDsmbmJzcDtJbnZhbGlk Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7MHgwMDAwMDAwMDAwMDAwMTM4 Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAm bmJzcDsgJm5ic3A7Jm5ic3A7MHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwMDAgLmRhdGEkZ0Vm aUV2ZW50RXhpdEJvb3RTZXJ2aWNlc0d1aWQ8YnI+DQpbJm5ic3A7Jm5ic3A7Jm5ic3A7MzRdIDQy OTQ5NjcyOTUmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7SW52YWxpZCZuYnNwOyZuYnNwOyAmbmJz cDsgJm5ic3A7ICZuYnNwOyZuYnNwOzB4MDAwMDAwMDAwMDAwMDEzOCZuYnNwOyAmbmJzcDsgJm5i c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNw OzB4MDAwMDAwMDAwMDAwMDAwMCAweDAwMDAwMDAwIGdFZmlFdmVudEV4aXRCb290U2VydmljZXNH dWlkPGJyPg0K4oCmLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIj5bJm5ic3A7Jm5ic3A7MzAzXSA0Mjk0 OTY3Mjk1Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwO0ludmFsaWQmbmJzcDsmbmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAwMDFiNjAmbmJzcDsgJm5ic3A7ICZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsw eDAwMDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAwMCAuYnNzJGdTVDxicj4NClsmbmJzcDsmbmJzcDsz MDRdIDQyOTQ5NjcyOTUmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7SW52YWxpZCZuYnNwOyZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzB4MDAwMDAwMDAwMDAwMWI2MCZuYnNwOyAmbmJz cDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw OyZuYnNwOzB4MDAwMDAwMDAwMDAwMDAwMCAweDAwMDAwMDAwIGdTVDxicj4NClsmbmJzcDsmbmJz cDszMDVdIDQyOTQ5NjcyOTUmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7SW52YWxpZCZuYnNwOyZu YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzB4MDAwMDAwMDAwMDAwMThhMCZuYnNwOyAm bmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu YnNwOyZuYnNwOzB4MDAwMDAwMDAwMDAwMDAwMCAweDAwMDAwMDAwIC5ic3MkZ0JTPGJyPg0KWyZu YnNwOyZuYnNwOzMwNl0gNDI5NDk2NzI5NSZuYnNwOyZuYnNwOyAmbmJzcDsmbmJzcDtJbnZhbGlk Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7MHgwMDAwMDAwMDAwMDAxOGEw Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAm bmJzcDsgJm5ic3A7Jm5ic3A7MHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwMDAgZ0JTPGJyPg0K 4oCmPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05v cm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwv ZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIj7igJTi gJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJQ8bzpwPjwvbzpwPjwvc3Bh bj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJF Ti1VUyI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xh c3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPihsbGRiKSZuYnNwO3AgZ1NUPGJyPg0K KEVGSV9TWVNURU1fVEFCTEUgKikgJDIgPSAweDAwMDAwMDAwN2ZiZWUwMTg8bzpwPjwvbzpwPjwv c3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5n PSJFTi1VUyIgc3R5bGU9ImNvbG9yOmJsYWNrIj4obGxkYikmbmJzcDtwICZhbXA7Z1NUPGJyPg0K KEVGSV9TWVNURU1fVEFCTEUgKiopICQ0ID0gMHgwMDAwMDAwMDdmZTZkNzg4PGJyPg0KPC9zcGFu PjxzcGFuIGxhbmc9IkVOLVVTIj4obGxkYikmbmJzcDtwICpnU1Q8YnI+DQooRUZJX1NZU1RFTV9U QUJMRSkgJDMgPSB7PGJyPg0KJm5ic3A7Jm5ic3A7SGRyID0gKFNpZ25hdHVyZSA9IDB4NTQ1MzU5 NTMyMDQ5NDI0OSwgUmV2aXNpb24gPSAweDAwMDIwMDQ2LCBIZWFkZXJTaXplID0gMHgwMDAwMDA3 OCwgQ1JDMzIgPSAweDUzNTVkYmUyLCBSZXNlcnZlZCA9IDB4MDAwMDAwMDApPGJyPg0KJm5ic3A7 Jm5ic3A7RmlybXdhcmVWZW5kb3IgPSAweDAwMDAwMDAwN2ZiZTljOTg8YnI+DQombmJzcDsmbmJz cDtGaXJtd2FyZVJldmlzaW9uID0gMHgwMDAxMDAwMDxicj4NCiZuYnNwOyZuYnNwO0NvbnNvbGVJ bkhhbmRsZSA9IDB4MDAwMDAwMDA3ZWRlNWE5ODxicj4NCiZuYnNwOyZuYnNwO0NvbkluID0gMHgw MDAwMDAwMDdlOTVmNjQwPGJyPg0KJm5ic3A7Jm5ic3A7Q29uc29sZU91dEhhbmRsZSA9IDB4MDAw MDAwMDA3ZWRlNGU5ODxicj4NCiZuYnNwOyZuYnNwO0Nvbk91dCA9IDB4MDAwMDAwMDA3ZTk1Zjgw MDxicj4NCiZuYnNwOyZuYnNwO1N0YW5kYXJkRXJyb3JIYW5kbGUgPSAweDAwMDAwMDAwN2VkZTRi OTg8YnI+DQombmJzcDsmbmJzcDtTdGRFcnIgPSAweDAwMDAwMDAwN2U5NWY5MTA8YnI+DQombmJz cDsmbmJzcDtSdW50aW1lU2VydmljZXMgPSAweDAwMDAwMDAwN2ZiZWViOTg8YnI+DQombmJzcDsm bmJzcDtCb290U2VydmljZXMgPSAweDAwMDAwMDAwN2ZlNmNkZTg8YnI+DQombmJzcDsmbmJzcDtO dW1iZXJPZlRhYmxlRW50cmllcyA9IDB4MDAwMDAwMDAwMDAwMDAwOTxicj4NCiZuYnNwOyZuYnNw O0NvbmZpZ3VyYXRpb25UYWJsZSA9IDB4MDAwMDAwMDA3ZmJlZWM5ODxicj4NCn08YnI+DQoobGxk YikmbmJzcDtpbWFnZSBsb29rdXAgLUF2IC0tbmFtZSBnU1Q8YnI+DQoobGxkYikmbmJzcDtpbWFn ZSBkdW1wIHNlY3Rpb25zPGJyPg0KRHVtcGluZyBzZWN0aW9ucyBmb3IgODggbW9kdWxlcy48YnI+ DQpTZWN0aW9ucyBmb3IgJy9Vc2Vycy91c2VyL0RvY3VtZW50cy9VZWZpV29ya3NwYWNlL0J1aWxk L092bWZYNjQvTk9PUFRfWENPREU1L1g2NC9NZGVNb2R1bGVQa2cvQ29yZS9EeGUvRHhlTWFpbi9E RUJVRy9EeGVDb3JlLmRsbCcgKHg4Nl82NCk6PGJyPg0KJm5ic3A7Jm5ic3A7U2VjdElEJm5ic3A7 Jm5ic3A7ICZuYnNwOyZuYnNwO1R5cGUmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsg Jm5ic3A7ICZuYnNwOyZuYnNwO0xvYWQgQWRkcmVzcyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDtQZXJtIEZpbGUgT2ZmLiZuYnNwOyZuYnNwO0ZpbGUg U2l6ZSZuYnNwOyZuYnNwO0ZsYWdzJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDtTZWN0aW9uIE5h bWU8YnI+DQombmJzcDsmbmJzcDstLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJm5ic3A7Jm5ic3A7LS0tLSAtLS0tLS0tLS0t IC0tLS0tLS0tLS0gLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPGJyPg0K Jm5ic3A7Jm5ic3A7MHgwMDAwMDEwMCBjb250YWluZXImbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz cDsmbmJzcDtbMHgwMDAwMDAwMDdmZTI2MjQwLTB4MDAwMDAwMDA3ZmU2YmI0MCkmbmJzcDsmbmJz cDtyLXgmbmJzcDsmbmJzcDsweDAwMDAwNGEwIDB4MDAwNDU5MDAgMHgwMDAwMDAwMCBEeGVDb3Jl LmRsbC5fX1RFWFQ8YnI+DQombmJzcDsmbmJzcDsweDAwMDAwMDAxIGNvZGUmbmJzcDsmbmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwO1sweDAwMDAwMDAwN2ZlMjYy NDAtMHgwMDAwMDAwMDdmZTY1YmQ4KSZuYnNwOyZuYnNwO3IteCZuYnNwOyZuYnNwOzB4MDAwMDA0 YTAgMHgwMDAzZjk5OCAweDgwMDAwNDAwIER4ZUNvcmUuZGxsLl9fVEVYVC5fX3RleHQ8YnI+DQom bmJzcDsmbmJzcDsweDAwMDAwMDAyIGRhdGEtY3N0ciZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw OyZuYnNwO1sweDAwMDAwMDAwN2ZlNjViZDgtMHgwMDAwMDAwMDdmZTZiYTIzKSZuYnNwOyZuYnNw O3IteCZuYnNwOyZuYnNwOzB4MDAwM2ZlMzggMHgwMDAwNWU0YiAweDAwMDAwMDAyIER4ZUNvcmUu ZGxsLl9fVEVYVC5fX2NzdHJpbmc8YnI+DQombmJzcDsmbmJzcDsweDAwMDAwMDAzIHJlZ3VsYXIm bmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7WzB4MDAwMDAwMDA3ZmU2YmEy NC0weDAwMDAwMDAwN2ZlNmJhNmMpJm5ic3A7Jm5ic3A7ci14Jm5ic3A7Jm5ic3A7MHgwMDA0NWM4 NCAweDAwMDAwMDQ4IDB4MDAwMDAwMDAgRHhlQ29yZS5kbGwuX19URVhULl9fdXN0cmluZzxicj4N CiZuYnNwOyZuYnNwOzB4MDAwMDAwMDQgcmVndWxhciZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw OyAmbmJzcDsmbmJzcDtbMHgwMDAwMDAwMDdmZTZiYTcwLTB4MDAwMDAwMDA3ZmU2YmI0MCkmbmJz cDsmbmJzcDtyLXgmbmJzcDsmbmJzcDsweDAwMDQ1Y2QwIDB4MDAwMDAwZDAgMHgwMDAwMDAwMCBE eGVDb3JlLmRsbC5fX1RFWFQuX19jb25zdDxicj4NCiZuYnNwOyZuYnNwOzB4MDAwMDAyMDAgY29u dGFpbmVyJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7WzB4MDAwMDAwMDA3ZmU2YmI0 MC0weDAwMDAwMDAwN2ZlNzBlNjApJm5ic3A7Jm5ic3A7cnctJm5ic3A7Jm5ic3A7MHgwMDA0NWRh MCAweDAwMDAxYWUwIDB4MDAwMDAwMDAgRHhlQ29yZS5kbGwuX19EQVRBPGJyPg0KJm5ic3A7Jm5i c3A7MHgwMDAwMDAwNSByZWd1bGFyJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZu YnNwO1sweDAwMDAwMDAwN2ZlNmJiNDAtMHgwMDAwMDAwMDdmZTZiZDU4KSZuYnNwOyZuYnNwO3J3 LSZuYnNwOyZuYnNwOzB4MDAwNDVkYTAgMHgwMDAwMDIxOCAweDAwMDAwMDAwIER4ZUNvcmUuZGxs Ll9fREFUQS5fX2NvbnN0PGJyPg0KJm5ic3A7Jm5ic3A7MHgwMDAwMDAwNiBkYXRhJm5ic3A7Jm5i c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDtbMHgwMDAwMDAwMDdm ZTZiZDYwLTB4MDAwMDAwMDA3ZmU2ZDYxMCkmbmJzcDsmbmJzcDtydy0mbmJzcDsmbmJzcDsweDAw MDQ1ZmMwIDB4MDAwMDE4YjAgMHgwMDAwMDAwMCBEeGVDb3JlLmRsbC5fX0RBVEEuX19kYXRhPGJy Pg0KJm5ic3A7Jm5ic3A7MHgwMDAwMDAwNyB6ZXJvLWZpbGwmbmJzcDsgJm5ic3A7ICZuYnNwOyAm bmJzcDsmbmJzcDtbMHgwMDAwMDAwMDdmZTZkNjEwLTB4MDAwMDAwMDA3ZmU3MGUyMCkmbmJzcDsm bmJzcDtydy0mbmJzcDsmbmJzcDsweDAwMDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDAwMSBEeGVD b3JlLmRsbC5fX0RBVEEuX19jb21tb248YnI+DQombmJzcDsmbmJzcDsweDAwMDAwMDA4IHplcm8t ZmlsbCZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwO1sweDAwMDAwMDAwN2ZlNzBlMjAt MHgwMDAwMDAwMDdmZTcwZTU4KSZuYnNwOyZuYnNwO3J3LSZuYnNwOyZuYnNwOzB4MDAwMDAwMDAg MHgwMDAwMDAwMCAweDAwMDAwMDAxIER4ZUNvcmUuZGxsLl9fREFUQS5fX2Jzczxicj4NCiZuYnNw OyZuYnNwOzB4MDAwMDAxMDAgY29udGFpbmVyJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5i c3A7WzB4MDAwMDAwMDAwMDA0YjAwMC0weDAwMDAwMDAwMDAwZWYwMDApKiBydy0mbmJzcDsmbmJz cDsweDAwMDAxMDAwIDB4MDAwYTNhNzQgMHgwMDAwMDAwMCBEeGVDb3JlLmRsbC5fX0RXQVJGPGJy Pg0KJm5ic3A7Jm5ic3A7MHgwMDAwMDAwMSBkd2FyZi1saW5lJm5ic3A7Jm5ic3A7ICZuYnNwOyAm bmJzcDsmbmJzcDtbMHgwMDAwMDAwMDAwMDRiMDAwLTB4MDAwMDAwMDAwMDA3MjNmYikqIHJ3LSZu YnNwOyZuYnNwOzB4MDAwMDEwMDAgMHgwMDAyNzNmYiAweDAwMDAwMDAwIER4ZUNvcmUuZGxsLl9f RFdBUkYuX19kZWJ1Z19saW5lPGJyPg0KJm5ic3A7Jm5ic3A7MHgwMDAwMDAwMiBkd2FyZi1wdWJu YW1lcyZuYnNwOyZuYnNwOyZuYnNwO1sweDAwMDAwMDAwMDAwNzIzZmItMHgwMDAwMDAwMDAwMDc4 NDI5KSogcnctJm5ic3A7Jm5ic3A7MHgwMDAyODNmYiAweDAwMDA2MDJlIDB4MDAwMDAwMDAgRHhl Q29yZS5kbGwuX19EV0FSRi5fX2RlYnVnX3B1Ym5hbWVzPGJyPg0KJm5ic3A7Jm5ic3A7MHgwMDAw MDAwMyBkd2FyZi1wdWJ0eXBlcyZuYnNwOyZuYnNwOyZuYnNwO1sweDAwMDAwMDAwMDAwNzg0Mjkt MHgwMDAwMDAwMDAwMDhiOTE1KSogcnctJm5ic3A7Jm5ic3A7MHgwMDAyZTQyOSAweDAwMDEzNGVj IDB4MDAwMDAwMDAgRHhlQ29yZS5kbGwuX19EV0FSRi5fX2RlYnVnX3B1YnR5cGVzPGJyPg0KJm5i c3A7Jm5ic3A7MHgwMDAwMDAwNCBkd2FyZi1hcmFuZ2VzJm5ic3A7ICZuYnNwOyZuYnNwO1sweDAw MDAwMDAwMDAwOGI5MTUtMHgwMDAwMDAwMDAwMDhlYTY1KSogcnctJm5ic3A7Jm5ic3A7MHgwMDA0 MTkxNSAweDAwMDAzMTUwIDB4MDAwMDAwMDAgRHhlQ29yZS5kbGwuX19EV0FSRi5fX2RlYnVnX2Fy YW5nZXM8YnI+DQombmJzcDsmbmJzcDsweDAwMDAwMDA1IGR3YXJmLWluZm8mbmJzcDsmbmJzcDsg Jm5ic3A7ICZuYnNwOyZuYnNwO1sweDAwMDAwMDAwMDAwOGVhNjUtMHgwMDAwMDAwMDAwMGM3OGJm KSogcnctJm5ic3A7Jm5ic3A7MHgwMDA0NGE2NSAweDAwMDM4ZTVhIDB4MDAwMDAwMDAgRHhlQ29y ZS5kbGwuX19EV0FSRi5fX2RlYnVnX2luZm88YnI+DQombmJzcDsmbmJzcDsweDAwMDAwMDA2IGR3 YXJmLWZyYW1lJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDtbMHgwMDAwMDAwMDAwMGM3OGJmLTB4 MDAwMDAwMDAwMDBjYzY5NykqIHJ3LSZuYnNwOyZuYnNwOzB4MDAwN2Q4YmYgMHgwMDAwNGRkOCAw eDAwMDAwMDAwIER4ZUNvcmUuZGxsLl9fRFdBUkYuX19kZWJ1Z19mcmFtZTxicj4NCiZuYnNwOyZu YnNwOzB4MDAwMDAwMDcgZHdhcmYtcmFuZ2VzJm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwO1sweDAw MDAwMDAwMDAwY2M2OTctMHgwMDAwMDAwMDAwMGNjNzU3KSogcnctJm5ic3A7Jm5ic3A7MHgwMDA4 MjY5NyAweDAwMDAwMGMwIDB4MDAwMDAwMDAgRHhlQ29yZS5kbGwuX19EV0FSRi5fX2RlYnVnX3Jh bmdlczxicj4NCiZuYnNwOyZuYnNwOzB4MDAwMDAwMDggZHdhcmYtYWJicmV2Jm5ic3A7Jm5ic3A7 ICZuYnNwOyZuYnNwO1sweDAwMDAwMDAwMDAwY2M3NTctMHgwMDAwMDAwMDAwMGNjYTliKSogcnct Jm5ic3A7Jm5ic3A7MHgwMDA4Mjc1NyAweDAwMDAwMzQ0IDB4MDAwMDAwMDAgRHhlQ29yZS5kbGwu X19EV0FSRi5fX2RlYnVnX2FiYnJldjxicj4NCiZuYnNwOyZuYnNwOzB4MDAwMDAwMDkgZHdhcmYt c3RyJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7WzB4MDAwMDAwMDAwMDBjY2E5Yi0w eDAwMDAwMDAwMDAwZGNjMDUpKiBydy0mbmJzcDsmbmJzcDsweDAwMDgyYTliIDB4MDAwMTAxNmEg MHgwMDAwMDAwMCBEeGVDb3JlLmRsbC5fX0RXQVJGLl9fZGVidWdfc3RyPGJyPg0KJm5ic3A7Jm5i c3A7MHgwMDAwMDAwYSBhcHBsZS1uYW1lcyZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7WzB4MDAw MDAwMDAwMDBkY2MwNS0weDAwMDAwMDAwMDAwZTI0MzkpKiBydy0mbmJzcDsmbmJzcDsweDAwMDky YzA1IDB4MDAwMDU4MzQgMHgwMDAwMDAwMCBEeGVDb3JlLmRsbC5fX0RXQVJGLl9fYXBwbGVfbmFt ZXM8YnI+DQombmJzcDsmbmJzcDsweDAwMDAwMDBiIGFwcGxlLW5hbWVzcGFjZXMgWzB4MDAwMDAw MDAwMDBlMjQzOS0weDAwMDAwMDAwMDAwZTI0NWQpKiBydy0mbmJzcDsmbmJzcDsweDAwMDk4NDM5 IDB4MDAwMDAwMjQgMHgwMDAwMDAwMCBEeGVDb3JlLmRsbC5fX0RXQVJGLl9fYXBwbGVfbmFtZXNw YWM8YnI+DQombmJzcDsmbmJzcDsweDAwMDAwMDBjIGFwcGxlLXR5cGVzJm5ic3A7ICZuYnNwOyAm bmJzcDsmbmJzcDtbMHgwMDAwMDAwMDAwMGUyNDVkLTB4MDAwMDAwMDAwMDBlZWE1MCkqIHJ3LSZu YnNwOyZuYnNwOzB4MDAwOTg0NWQgMHgwMDAwYzVmMyAweDAwMDAwMDAwIER4ZUNvcmUuZGxsLl9f RFdBUkYuX19hcHBsZV90eXBlczxicj4NCiZuYnNwOyZuYnNwOzB4MDAwMDAwMGQgYXBwbGUtb2Jq YyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7WzB4MDAwMDAwMDAwMDBlZWE1MC0weDAw MDAwMDAwMDAwZWVhNzQpKiBydy0mbmJzcDsmbmJzcDsweDAwMGE0YTUwIDB4MDAwMDAwMjQgMHgw MDAwMDAwMCBEeGVDb3JlLmRsbC5fX0RXQVJGLl9fYXBwbGVfb2JqYzxicj4NClNlY3Rpb25zIGZv ciAnL1VzZXJzL3VzZXIvRG9jdW1lbnRzL1VlZmlXb3Jrc3BhY2UvQnVpbGQvT3ZtZlg2NC9OT09Q VF9YQ09ERTUvWDY0L01kZU1vZHVsZVBrZy9Vbml2ZXJzYWwvRGV2aWNlUGF0aER4ZS9EZXZpY2VQ YXRoRHhlL0RFQlVHL0RldmljZVBhdGhEeGUuZGxsJyAoeDg2XzY0KTo8bzpwPjwvbzpwPjwvc3Bh bj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJF Ti1VUyI+4oCmPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPihsbGRiKSZuYnNwO2ltYWdlIGR1bXAgc3lt dGFiPGJyPg0KRHVtcGluZyBzeW1ib2wgdGFibGUgZm9yIDg4IG1vZHVsZXMuPGJyPg0KU3ltdGFi LCBmaWxlID0gL1VzZXJzL3VzZXIvRG9jdW1lbnRzL1VlZmlXb3Jrc3BhY2UvQnVpbGQvT3ZtZlg2 NC9OT09QVF9YQ09ERTUvWDY0L01kZU1vZHVsZVBrZy9Db3JlL0R4ZS9EeGVNYWluL0RFQlVHL0R4 ZUNvcmUuZGxsLCBudW1fc3ltYm9scyA9IDEyMDM6PGJyPg0KJm5ic3A7ICZuYnNwOyAmbmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwO0RlYnVnIHN5bWJvbDxicj4NCiZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDt8U3ludGhl dGljIHN5bWJvbDxicj4NCiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDt8fEV4dGVybmFsbHkgVmlzaWJsZTxicj4NCiZuYnNwOyAmbmJzcDsgJm5i c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDt8fHw8YnI+DQpJbmRleCZuYnNw OyZuYnNwOyZuYnNwO1VzZXJJRCBEU1ggVHlwZSZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAm bmJzcDsgJm5ic3A7Jm5ic3A7RmlsZSBBZGRyZXNzL1ZhbHVlIExvYWQgQWRkcmVzcyZuYnNwOyZu YnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7U2l6ZSZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwO0ZsYWdzJm5ic3A7ICZuYnNwOyAmbmJzcDsm bmJzcDtOYW1lPGJyPg0KLS0tLS0tLSAtLS0tLS0gLS0tIC0tLS0tLS0tLS0tLS0tLSAtLS0tLS0t LS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0t LS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08YnI+DQpbJm5ic3A7ICZuYnNw OyZuYnNwOzBdJm5ic3A7ICZuYnNwOyZuYnNwOzExOCBEJm5ic3A7Jm5ic3A7Jm5ic3A7U291cmNl RmlsZSZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7MHgwMDAwMDAwMDAwMDAwMDAwJm5ic3A7ICZu YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i c3A7Jm5ic3A7U2libGluZyAtJmd0OyBbJm5ic3A7Jm5ic3A7Jm5ic3A7MjBdIDB4MDA2NDAwMDAm bmJzcDsvVXNlcnMvdXNlci9Eb2N1bWVudHMvVWVmaVBhY2thZ2VzL01kZU1vZHVsZVBrZy9Db3Jl L0R4ZS9TZWN0aW9uRXh0cmFjdGlvbi9Db3JlU2VjdGlvbkV4dHJhY3Rpb24uYzxicj4NClsmbmJz cDsgJm5ic3A7Jm5ic3A7MV0mbmJzcDsgJm5ic3A7Jm5ic3A7MTIwIEQmbmJzcDsmbmJzcDsmbmJz cDtPYmplY3RGaWxlJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwNWU3ODU4OGQm bmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu YnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAwMDAwMDAgMHgwMDY2MDAwMSZuYnNwOy9Vc2Vy cy91c2VyL0RvY3VtZW50cy9VZWZpV29ya3NwYWNlL0J1aWxkL092bWZYNjQvTk9PUFRfWENPREU1 L1g2NC9NZGVNb2R1bGVQa2cvQ29yZS9EeGUvRHhlTWFpbi9PVVRQVVQvRHhlQ29yZS5saWIoQ29y ZVNlY3Rpb25FeHRyYWN0aW9uLm9iaik8YnI+DQpbJm5ic3A7ICZuYnNwOyZuYnNwOzJdJm5ic3A7 ICZuYnNwOyZuYnNwOzEyMiBEIFggQ29kZSZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz cDsgJm5ic3A7Jm5ic3A7MHgwMDAwMDAwMDAwMDAwMjQwIDB4MDAwMDAwMDA3ZmUyNjI0MCAweDAw MDAwMDAwMDAwMDAyNjAgMHgwMDBmMDAwMCBDdXN0b21HdWlkZWRTZWN0aW9uRXh0cmFjdDxicj4N ClsmbmJzcDsgJm5ic3A7Jm5ic3A7M10mbmJzcDsgJm5ic3A7Jm5ic3A7MTI2IEQgWCBDb2RlJm5i c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAw MDA0YTAgMHgwMDAwMDAwMDdmZTI2NGEwIDB4MDAwMDAwMDAwMDAwMDExMCAweDAwMGYwMDAwIElu aXRpYWxpemVTZWN0aW9uRXh0cmFjdGlvbjxicj4NClsmbmJzcDsgJm5ic3A7Jm5ic3A7NF0mbmJz cDsgJm5ic3A7Jm5ic3A7MTMwIEQgWCBDb2RlJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu YnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAwMDA1YjAgMHgwMDAwMDAwMDdmZTI2NWIwIDB4 MDAwMDAwMDAwMDAwMDE0MCAweDAwMGYwMDAwIElzVmFsaWRTZWN0aW9uU3RyZWFtPGJyPg0KWyZu YnNwOyAmbmJzcDsmbmJzcDs1XSZuYnNwOyAmbmJzcDsmbmJzcDsxMzQgRCBYIENvZGUmbmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzB4MDAwMDAwMDAwMDAwMDZm MCAweDAwMDAwMDAwN2ZlMjY2ZjAgMHgwMDAwMDAwMDAwMDAwMTgwIDB4MDAwZjAwMDAgT3BlblNl Y3Rpb25TdHJlYW1FeDxicj4NClsmbmJzcDsgJm5ic3A7Jm5ic3A7Nl0mbmJzcDsgJm5ic3A7Jm5i c3A7MTM4IEQgWCBDb2RlJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsm bmJzcDsweDAwMDAwMDAwMDAwMDA4NzAgMHgwMDAwMDAwMDdmZTI2ODcwIDB4MDAwMDAwMDAwMDAw MDA3MCAweDAwMGYwMDAwIE9wZW5TZWN0aW9uU3RyZWFtPGJyPg0KWyZuYnNwOyAmbmJzcDsmbmJz cDs3XSZuYnNwOyAmbmJzcDsmbmJzcDsxNDIgRCBYIENvZGUmbmJzcDsgJm5ic3A7ICZuYnNwOyAm bmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzB4MDAwMDAwMDAwMDAwMDhlMCAweDAwMDAwMDAwN2Zl MjY4ZTAgMHgwMDAwMDAwMDAwMDAwMTAwIDB4MDAwZjAwMDAgQ2hpbGRJc1R5cGU8YnI+DQrigKY8 bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFs Ij48c3BhbiBsYW5nPSJFTi1VUyI+WyZuYnNwOyZuYnNwOzgzMV0mbmJzcDsmbmJzcDsmbmJzcDsy NDcwIEQgWCBDb2RlJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJz cDsweDAwMDAwMDAwMDAwMzA2YjAgMHgwMDAwMDAwMDdmZTU2NmIwIDB4MDAwMDAwMDAwMDAwMDBm NCAweDAwMGYwMDAwIFVlZmlCb290U2VydmljZXNUYWJsZUxpYkNvbnN0cnVjdG9yPGJyPg0KWyZu YnNwOyZuYnNwOzgzMl0mbmJzcDsmbmJzcDsmbmJzcDsyNDczIEQgWCBEYXRhJm5ic3A7ICZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAwMDAwNDc3ODAgMHgw MDAwMDAwMDdmZTZkNzgwIDB4MDAwMDAwMDAwMDAwMDAwOCAweDAwMGYwMDAwIGdJbWFnZUhhbmRs ZTxicj4NClsmbmJzcDsmbmJzcDs4MzNdJm5ic3A7Jm5ic3A7Jm5ic3A7MjQ3NCBEIFggRGF0YSZu YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7MHgwMDAwMDAwMDAw MDQ3Nzg4IDB4MDAwMDAwMDA3ZmU2ZDc4OCAweDAwMDAwMDAwMDAwMDAwMDggMHgwMDBmMDAwMCBn U1Q8YnI+DQpbJm5ic3A7Jm5ic3A7ODM0XSZuYnNwOyZuYnNwOyZuYnNwOzI0NzUgRCBYIERhdGEm bmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzB4MDAwMDAwMDAw MDA0Nzc5MCAweDAwMDAwMDAwN2ZlNmQ3OTAgMHgwMDAwMDAwMDAwMDAwMDA4IDB4MDAwZjAwMDAg Z0JTPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05v cm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPuKApjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2 Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIj48bzpwPiZu YnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8YmxvY2txdW90ZSBzdHlsZT0i bWFyZ2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Ij4NCjxkaXY+DQo8cCBjbGFzcz0i TXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+VGhpcyBpcyBlYXN5IGVub3VnaCB0byBjaGVj ayBhcyAlcnBiIGlzIHRoZSBmcmFtZSBwb2ludGVyIHNvIGl0IHdpbGwgZ2V0IHNhdmVkL3Jlc3Rv cmVkIG9uIGZ1bmN0aW9uIGVudHJ5L2V4aXQuJm5ic3A7PG86cD48L286cD48L3NwYW4+PC9wPg0K PC9kaXY+DQo8L2Jsb2NrcXVvdGU+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJF Ti1VUyI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xh c3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPkFjdHVhbGx5IGl0IGlzIGZpbmUuIEkg aGFwcGVuZWQgdG8gYnJlYWsgaW4gdGhlIGludGVycnVwdCByb3V0aW5lLCB3aGljaCB3YXMgbm90 IG1hcHBlZCBmb3IgYSBwYXJ0aWN1bGFyIGltYWdlLiBBZnRlciBJIHN0ZXBwZWQgYSBsaXR0bGUs IGl0IHNvb24gcmVhY2hlZCB0aGUgZGVidWcgc3ltYm9sczo8bzpwPjwvbzpwPjwvc3Bhbj48L3A+ DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+ PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1z b05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPihsbGRiKSZuYnNwO2J0IGFsbDxicj4NCiogdGhy ZWFkICMxLCBzdG9wIHJlYXNvbiA9IGluc3RydWN0aW9uIHN0ZXAgb3Zlcjxicj4NCiZuYnNwOyZu YnNwOyogZnJhbWUgIzA6IDB4MDAwMDAwMDA3ZmU0OWYzYyBEeGVDb3JlLmRsbGBDb3JlUmVzdG9y ZVRwbChOZXdUcGw9MHgwMDAwMDAwMDAwMDAwMDA4KSBhdCBUcGwuYzoxMDI6MTI8YnI+DQombmJz cDsgJm5ic3A7Jm5ic3A7ZnJhbWUgIzE6IDB4MDAwMDAwMDA3ZTUxOGM5NTxicj4NCiZuYnNwOyZu YnNwO3RocmVhZCAjMjxicj4NCiZuYnNwOyAmbmJzcDsmbmJzcDtmcmFtZSAjMDogMHgwMDAwMDAw MDdmYjNmZjg4IENwdUR4ZS5kbGxgQ3B1U2xlZXAgJiM0MzsgMTxicj4NCiZuYnNwOyAmbmJzcDsm bmJzcDtmcmFtZSAjMTogMHgwMDAwMDAwMDdmYjRkNzE5IENwdUR4ZS5kbGxgQXBXYWtldXBGdW5j dGlvbihFeGNoYW5nZUluZm89MHgwMDAwMDAwMDAwMDg3MTk4LCBBcEluZGV4PTB4MDAwMDAwMDAw MDAwMDAwMSkgYXQgTXBMaWIuYzo3Njg6OTxicj4NCiZuYnNwOyAmbmJzcDsmbmJzcDtmcmFtZSAj MjogMHgwMDAwMDAwMDdmYjJkMTUxPGJyPg0KJm5ic3A7Jm5ic3A7dGhyZWFkICMzPGJyPg0KJm5i c3A7ICZuYnNwOyZuYnNwO2ZyYW1lICMwOiAweDAwMDAwMDAwN2ZiM2ZmODggQ3B1RHhlLmRsbGBD cHVTbGVlcCAmIzQzOyAxPGJyPg0KJm5ic3A7ICZuYnNwOyZuYnNwO2ZyYW1lICMxOiAweDAwMDAw MDAwN2ZiNGQ3MTkgQ3B1RHhlLmRsbGBBcFdha2V1cEZ1bmN0aW9uKEV4Y2hhbmdlSW5mbz0weDAw MDAwMDAwMDAwODcxOTgsIEFwSW5kZXg9MHgwMDAwMDAwMDAwMDAwMDAyKSBhdCBNcExpYi5jOjc2 ODo5PGJyPg0KJm5ic3A7ICZuYnNwOyZuYnNwO2ZyYW1lICMyOiAweDAwMDAwMDAwN2ZiMmQxNTE8 YnI+DQombmJzcDsmbmJzcDt0aHJlYWQgIzQ8YnI+DQombmJzcDsgJm5ic3A7Jm5ic3A7ZnJhbWUg IzA6IDB4MDAwMDAwMDA3ZmIzZmY4OCBDcHVEeGUuZGxsYENwdVNsZWVwICYjNDM7IDE8YnI+DQom bmJzcDsgJm5ic3A7Jm5ic3A7ZnJhbWUgIzE6IDB4MDAwMDAwMDA3ZmI0ZDcxOSBDcHVEeGUuZGxs YEFwV2FrZXVwRnVuY3Rpb24oRXhjaGFuZ2VJbmZvPTB4MDAwMDAwMDAwMDA4NzE5OCwgQXBJbmRl eD0weDAwMDAwMDAwMDAwMDAwMDMpIGF0IE1wTGliLmM6NzY4Ojk8YnI+DQombmJzcDsgJm5ic3A7 Jm5ic3A7ZnJhbWUgIzI6IDB4MDAwMDAwMDA3ZmIyZDE1MTxvOnA+PC9vOnA+PC9zcGFuPjwvcD4N CjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIj48 bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNv Tm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+QmVzdCB3aXNoZXMsPG86cD48L286cD48L3NwYW4+ PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4t VVMiPlZpdGFseTxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48 L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1V UyI+WzFdJm5ic3A7PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FjaWRhbnRoZXJhL09wZW5D b3JlUGtnL2Jsb2IvNzY4NGE5Zi9EZWJ1Zy9DbGFuZ0R3YXJmLnBhdGNoIj5odHRwczovL2dpdGh1 Yi5jb20vYWNpZGFudGhlcmEvT3BlbkNvcmVQa2cvYmxvYi83Njg0YTlmL0RlYnVnL0NsYW5nRHdh cmYucGF0Y2g8L2E+PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xh c3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPlsyXSZuYnNwOzxhIGhyZWY9Imh0dHBz Oi8vYnVncy5sbHZtLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDUyNzMiPmh0dHBzOi8vYnVncy5sbHZt Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDUyNzM8L2E+PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9k aXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPlszXSZu YnNwOzxhIGhyZWY9Imh0dHBzOi8vYnVncy5sbHZtLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDUyNzci Pmh0dHBzOi8vYnVncy5sbHZtLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDUyNzc8L2E+PG86cD48L286 cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4g bGFuZz0iRU4tVVMiPls0XSZuYnNwOzxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hY2lkYW50 aGVyYS9PcGVuQ29yZVBrZy9jb21taXQvM2U1ZjNmM2Y5YThkM2YxOTc4MzRiYmZjZjUwMjlmNzcx ZGY4OTc1NCI+aHR0cHM6Ly9naXRodWIuY29tL2FjaWRhbnRoZXJhL09wZW5Db3JlUGtnL2NvbW1p dC8zZTVmM2YzZjlhOGQzZjE5NzgzNGJiZmNmNTAyOWY3NzFkZjg5NzU0PC9hPjxvOnA+PC9vOnA+ PC9zcGFuPjwvcD4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1V UyI+PGJyPg0KPGJyPg0KPG86cD48L286cD48L3NwYW4+PC9wPg0KPGJsb2NrcXVvdGUgc3R5bGU9 Im1hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCI+DQo8ZGl2Pg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPjIyINC80LDRgNGC0LAgMjAyMCDQsy4sINCy IDAwOjA2LCBBbmRyZXcgRmlzaCAmbHQ7PGEgaHJlZj0ibWFpbHRvOmFmaXNoQGFwcGxlLmNvbSI+ YWZpc2hAYXBwbGUuY29tPC9hPiZndDsg0L3QsNC/0LjRgdCw0Lso0LApOjxvOnA+PC9vOnA+PC9z cGFuPjwvcD4NCjwvZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMi PjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFs Ij48c3BhbiBsYW5nPSJFTi1VUyI+PGJyPg0KPC9zcGFuPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHls ZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5z LXNlcmlmIj48YnIgc3R5bGU9ImNhcmV0LWNvbG9yOiByZ2IoMCwgMCwgMCk7Zm9udC12YXJpYW50 LWNhcHM6IG5vcm1hbDt0ZXh0LWFsaWduOnN0YXJ0Oy13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6 IDBweDt3b3JkLXNwYWNpbmc6MHB4Ij4NCjxicj4NCjwvc3Bhbj48c3BhbiBsYW5nPSJFTi1VUyI+ PG86cD48L286cD48L3NwYW4+PC9wPg0KPGJsb2NrcXVvdGUgc3R5bGU9Im1hcmdpbi10b3A6NS4w cHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCI+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNw YW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7 SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPk9uIE1hciAyMSwgMjAyMCwgYXQgMTE6MzYgQU0s IFZpdGFseSBDaGVwdHNvdiAmbHQ7PGEgaHJlZj0ibWFpbHRvOmNoZXB0c292QGlzcHJhcy5ydSI+ Y2hlcHRzb3ZAaXNwcmFzLnJ1PC9hPiZndDsgd3JvdGU6PG86cD48L286cD48L3NwYW4+PC9wPg0K PC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZv bnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJp ZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3Jt YWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5 OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj5BbmRyZXcsPG86cD48L286cD48L3Nw YW4+PC9wPg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBz dHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90Oyxz YW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5 LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+VGhhbmtz IG9uY2UgYWdhaW4sIGJ1dCB1bmZvcnR1bmF0ZWx5IGl0IGlzIG5vdCB0aGF0IHNpbXBsZS4mbmJz cDtCZWxvdyBJIGFuc3dlcmVkIGlubGluZSBleHBsYWluaW5nIHRoZSBwYXJ0aWN1bGFyIGlzc3Vl cywgd2hpY2ggbW9zdGx5IHNlZW0gdG88c3BhbiBjbGFzcz0iYXBwbGUtY29udmVydGVkLXNwYWNl Ij4mbmJzcDs8L3NwYW4+YmUmbmJzcDtzcGVjaWZpYw0KIHRvIENMQU5HUERCLiBMTFZNIHN0YWNr IGVtaXRzIFBEQiBkZWJ1ZyBmaWxlcywgYW5kIGV2ZW4gdGhvdWdoIExMREIgZG9lcyBzdXBwb3J0 IHRoZW0gdG8gc29tZSBsZXZlbCwgaXQgaXMgdW5saWtlbHkgdGhhdCB0aGlzIHdpbGwgYmUgd29y a2luZyB3ZWxsIGVub3VnaCBzb29uLiBXZSBzaG91bGQgcmVhbGx5IHN0aWNrIHRvIG1vcmUgb3Ig bGVzcyBuYXRpdmUgZGVidWcgZm9ybWF0cywgaWRlYWxseSB0aG9zZSB0aGF0IGhhdmUgcHJvcGVy IG9wZW4NCiBzcGVjaWZpY2F0aW9ucywgb24gYWxsIHBsYXRmb3JtcywgYW5kIGZvciBVbml4IHRo YXTigJlzIERXQVJGLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0 O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNw OzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ibG9ja3F1b3RlPg0KPGRpdj4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXpl OjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpw PiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWls eTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+Vml0YWx5LDxvOnA+PC9vOnA+PC9z cGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9 IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGlj YSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4N CjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZv bnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJp ZiI+SSB1bmRlcnN0YW5kIGFuZCBJIHVzZSB0aGUgWGNvZGUgY2xhbmcgYW5kIG5vdCB0aGUgQ0xB TkdQREIsIGJ1dCBJIHVzZSBsbGRiIGEgbG90IEkgd2FzIGp1c3QgdHJ5aW5nIHRvIHBvaW50IG91 dCB3aGF0IHdvcmtzIHdpdGggWGNvZGUuJm5ic3A7PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9k aXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxl PSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMt c2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPHAgY2xhc3M9Ik1z b05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1m YW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxiciBzdHlsZT0iY2FyZXQt Y29sb3I6IHJnYigwLCAwLCAwKTtmb250LXZhcmlhbnQtY2Fwczogbm9ybWFsO3RleHQtYWxpZ246 c3RhcnQ7LXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4O3dvcmQtc3BhY2luZzowcHgiPg0K PGJyPg0KPC9zcGFuPjxzcGFuIGxhbmc9IkVOLVVTIj48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8 YmxvY2txdW90ZSBzdHlsZT0ibWFyZ2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Ij4N CjxkaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0 eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNh bnMtc2VyaWYiPkkgYW0gcHJldHR5IHN1cmUgTExWTSBjYW4gYmUgdGF1Z2h0IHRvIGVtaXQgRFdB UkYgZGVidWcgaW5mb3JtYXRpb24gZXZlbiBmb3IgUEUgZmlsZXMuIFBlcmhhcHMgd2UgY2FuIGVp dGhlciBtYWtlIHNvbWUgb3B0aW9uIG9yIHByb3ZpZGUgYSBzZXBhcmF0ZSB0b29sY2hhaW4NCiBm b3IgdGhpcz8gQW5vdGhlciB3YXkgd291bGQgYmUgcmVjb3ZlcmluZyBDTEFOR0VMRiBhcyBvcmln aW5hbGx5IHN1Z2dlc3RlZC48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5 LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD4m bmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvYmxvY2txdW90ZT4NCjxk aXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQt c2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+ PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPGRpdj4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0 O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj5UaGVyZSB3YXMg YSBidWcgcmVjZW50bHkgaW4gdGhlJm5ic3A7Jm5ic3A7eDg2XzY0LXBjLXdpbjMyLW1hY2hvIHRy aXBsZSBhbmQgd2UgaGFkIHRvIGFkZCZuYnNwOy1nZHdhcmYgdG8gZm9yY2UgaXQgZW1pdCBkd2Fy Zi4gTm90IHN1cmUgd2hhdCB0aGF0IGNvbXBpbGVyIGZsYWcgd291bGQgZG8gdG8gQ0xBTkdQREIN CiBidXQgaXQgaXMgd29ydGggYSB0cnk/IExhc3QgZmxhZyB3aW5zIGZvciB0aGUgY29tcGlsZXIu Jm5ic3A7PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1z b05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1m YW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+ PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBs YW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2 ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PGJyIHN0eWxlPSJjYXJldC1jb2xvcjogcmdiKDAsIDAs IDApO2ZvbnQtdmFyaWFudC1jYXBzOiBub3JtYWw7dGV4dC1hbGlnbjpzdGFydDstd2Via2l0LXRl eHQtc3Ryb2tlLXdpZHRoOiAwcHg7d29yZC1zcGFjaW5nOjBweCI+DQo8YnI+DQo8L3NwYW4+PHNw YW4gbGFuZz0iRU4tVVMiPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxibG9ja3F1b3RlIHN0eWxl PSJtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQiPg0KPGRpdj4NCjxkaXY+DQo8 YmxvY2txdW90ZSBzdHlsZT0ibWFyZ2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Ij4N CjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZv bnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJp ZiI+WW91IGNhbiB0ZWFjaCBsbGRiIGFib3V0IHR5cGVzLiBUaGVyZSBpcyBzb21lIGV4YW1wbGUg Y29kZSBoZXJlOiZuYnNwOzxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90aWFub2NvcmUvZWRr Mi9ibG9iL21hc3Rlci9FbXVsYXRvclBrZy9Vbml4L2xsZGJlZmkucHkiPmh0dHBzOi8vZ2l0aHVi LmNvbS90aWFub2NvcmUvZWRrMi9ibG9iL21hc3Rlci9FbXVsYXRvclBrZy9Vbml4L2xsZGJlZmku cHk8L2E+PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8L2Jsb2NrcXVvdGU+DQo8ZGl2 Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNp emU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxv OnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1 b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPlRoaXMgY29kZSB3b3JrcyBqdXN0IGZpbmUg d2l0aCBMTERCIGFuZCBEV0FSRiAoZS5nLiBYQ09ERTUpLCB0aG91Z2ggSSBoYXZlIG5vdCB5ZXQg Y29tcGxldGVkIHRoZXNlIGNoYW5nZXMgZm9yIG15IHNjcmlwdHMgZm9yIExMREIsIG9ubHkgZm9y IEdEQi4gSG93ZXZlciwgd2l0aA0KIENMQU5HUERCIGdlbmVyYXRlZCBmaWxlcyBpdCBpcyBub3Qg ZnVuY3Rpb25hbC4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyBiZWNhdXNlIExMREIgaXMgdW5hd2Fy ZSBvZiB0aGUgdW5kZXJseWluZyB0eXBlLCBpLmUuIGl0IGRvZXMgbm90IGtub3cgd2hhdCBpcyBF RklfU1RBVFVTIG9yIFVJTlQzMi4gSSBjYW4gaW1wbGVtZW50IHByZXR0eS1wcmludGluZyB3aGVu IExMREIga25vd3MgYWJvdXQgYSB0eXBlZGVmLCBidXQgaXQgaXMgbm90IHBvc3NpYmxlDQogdG8g ZG8gdGhpcyB3aGVuIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBhbHJlYWR5IGdvbmUgb3Igbm90 IHBhcnNlZDo8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0i TXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250 LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD4mbmJzcDs8L286 cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4g bGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVs dmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPihsbGRiKSBwIFN0YXR1czxicj4NCih1bnNpZ25lZCBs b25nIGxvbmcpICQxID0gMDxicj4NCihsbGRiKSBwICZhbXA7U3RhdHVzPGJyPg0KKHVuc2lnbmVk IGxvbmcgbG9uZyAqKSAkMiA9IDB4MDAwMDAwMDA3ZmUxOWFkODxicj4NCihsbGRiKSBwIChFRklf U1RBVFVTKVN0YXR1czxicj4NCmVycm9yOiB1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICdF RklfU1RBVFVTJzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxkaXY+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5 LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD4m bmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1h bCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6 JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPkp1c3QgaW4gY2FzZSBJIHRyaWVkIHVz aW5nIGV4YWN0bHkgeW91ciBjb2RlLCBhbmQgb3RoZXIgc3R1ZmYgbGlrZSBzb3VyY2UgbGV2ZWwg ZGVidWdnaW5nIHdvcmtzIGp1c3QgZmluZSBhbmQgc3ltYm9saWNhdGlvbiB3b3JrcyBmaW5lLCBz byBpdCBzaG91bGQgYmUgc29tZSBidWcNCiB3aXRoIFBEQiBpbiBwYXJ0aWN1bGFyLjxvOnA+PC9v OnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFu IGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hl bHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48YnI+DQo8YnI+DQo8bzpwPjwvbzpwPjwvc3Bhbj48 L3A+DQo8L2Rpdj4NCjxkaXY+DQo8YmxvY2txdW90ZSBzdHlsZT0ibWFyZ2luLXRvcDo1LjBwdDtt YXJnaW4tYm90dG9tOjUuMHB0Ij4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBs YW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2 ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+VGhhdCBpcyBzdHJhbmdlIGFzIGdsb2JhbHMgdXN1YWxs eSB3b3JrIGJlc3Q/IFRoZSBjb21tb24gaXNzdWUgSSd2ZSBzZWVuIGlzIGdldHRpbmcgdGhlIHNs aWRlIHdyb25nLiBUaGUgRUZJIG1vZHVsZXMgYXJlIGxpbmtlZCBhdCBhIHZhbHVlIG5lYXIgemVy byBhbmQgcmVsb2NhdGVkDQogaW50byBtZW1vcnksIHNvIHRoZSBzbGlkZSByZXByZXNlbnRzIHRo YXQgYWRqdXN0bWVudC4mbmJzcDs8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+ DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6 ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86 cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05v cm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1p bHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPllvdSBjYW4gdXNlIGBpbWFnZSBk dW1wIHNlY3Rpb25zYCBhbmQgYCZuYnNwO2ltYWdlIGR1bXAgc3ltdGFiYCB0byBzZWUgbGxkYidz IHZpZXcgb2Ygc3ltYm9scy4gTW9yZSBpbmZvIGhlcmUgWzFdLiZuYnNwOzxvOnA+PC9vOnA+PC9z cGFuPjwvcD4NCjwvZGl2Pg0KPC9ibG9ja3F1b3RlPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNw YW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7 SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4N CjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBz dHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90Oyxz YW5zLXNlcmlmIj5ZZXMsIHRoaXMgb25lIGlzIGEgYml0IGNvbXBsaWNhdGVkLCBvbmNlIGFnYWlu IGR1ZSB0byBQREIgbW9zdCBsaWtlbHkuIEl0IGtub3dzIGFib3V0IGdsb2JhbCBzeW1ib2xzLCBi dXQgZG9lcyBub3QgbGlzdCB0aGVtIGluIHN5bXRhYjo8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8 L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5 bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fu cy1zZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4w cHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPihsbGRiKSZu YnNwO2ltYWdlIGR1bXAgc3ltdGFiPGJyPg0KRHVtcGluZyBzeW1ib2wgdGFibGUgZm9yIDkxIG1v ZHVsZXMuPGJyPg0KU3ltdGFiLCBmaWxlID0gR2RiU3ltcy9CaW4vWDY0X0NMQU5HUERCL0dkYlN5 bXMuZGxsLCBudW1fc3ltYm9scyA9IDA8YnI+DQpTeW10YWIsIGZpbGUgPSAvVXNlcnMvdXNlci9E b2N1bWVudHMvVWVmaVdvcmtzcGFjZS9CdWlsZC9Pdm1mWDY0L05PT1BUX0NMQU5HUERCL1g2NC9N ZGVNb2R1bGVQa2cvQ29yZS9EeGUvRHhlTWFpbi9ERUJVRy9EeGVDb3JlLmRsbCwgbnVtX3N5bWJv bHMgPSAwPGJyPg0KU3ltdGFiLCBmaWxlID0gL1VzZXJzL3VzZXIvRG9jdW1lbnRzL1VlZmlXb3Jr c3BhY2UvQnVpbGQvT3ZtZlg2NC9OT09QVF9DTEFOR1BEQi9YNjQvTWRlTW9kdWxlUGtnL1VuaXZl cnNhbC9EZXZpY2VQYXRoRHhlL0RldmljZVBhdGhEeGUvREVCVUcvRGV2aWNlUGF0aER4ZS5kbGws IG51bV9zeW1ib2xzID0gMDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjku MHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj7igKY8bzpw PjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48 c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVv dDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9w Pg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMi IHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7 LHNhbnMtc2VyaWYiPlRoZSBzbGlkZXMgYXJlIGNvcnJlY3QsIGJ1dCB0aGVyZSBhcmUgdHdvIG51 YW5jZXMgdGhhdCBjb2xsaWRlIHdpdGggaXQuPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+ DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJm b250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2Vy aWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2Zv bnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj4xLiBUaGVyZSBhcmUg bXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBnbG9iYWxzIHdpdGggdGhlIHNhbWUgbmFtZSAoZS5n LiBnQlMpLCBidXQgZm9yIHNvbWUgcmVhc29uIExMREIgYWx3YXlzIHRyaWVzIHRvIHByaW50IHRo ZSBnbG9iYWxzIGZyb20gdGhlIGZpcnN0IG1vZHVsZS4NCiBUaGlzIGhhcHBlbnMgZXZlbiB3aGVu IEkgYW0gc291cmNlLWxldmVsIGRlYnVnZ2luZywgYW5kIEkgc2VlIGEgZ0JTIHN5bWJvbCBmcm9t IGFub3RoZXIgbW9kdWxlIChlLmcuIER4ZUNvcmUpIHVzZWQgcmlnaHQgYXQgdGhlIHNhbWUgbGlu ZS4gV2l0aCBHREIgdGhlIGNsb3Nlc3Qgc3ltYm9sIGlzIHVzZWQsIGJ1dCB3aXRoIExMREIgaXQg aXMgYWx3YXlzIGNvbWluZyBmcm9tIHRoZSBmaXJzdCBtb2R1bGUuIEkgdHJpZWQgY2hlY2tpbmcg ZXhwciBoZWxwDQogdG8gZmluZCB3aGV0aGVyIEkgY2FuIHBhc3MgaXQgYSBtb2R1bGUgZXhwbGlj aXRseSwgYnV0IGFsc28gZmFpbGVkLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRp dj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1z aXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48 bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Js b2NrcXVvdGU+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMi IHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7 LHNhbnMtc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXpl OjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj5Vc3Vh bGx5IHdoYXQgaGFwcGVucyB3aXRoIGxsZGIgaXMgeW91IGdldCB0aGUgZ2xvYmFsIHRoYXQgaXMg aW4gc2NvcGUgZm9yIHRoZSBjdXJyZW50IGZyYW1lLiZuYnNwOzxvOnA+PC9vOnA+PC9zcGFuPjwv cD4NCjwvZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxl PSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMt c2VyaWYiPjxiciBzdHlsZT0iY2FyZXQtY29sb3I6IHJnYigwLCAwLCAwKTtmb250LXZhcmlhbnQt Y2Fwczogbm9ybWFsO3RleHQtYWxpZ246c3RhcnQ7LXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDog MHB4O3dvcmQtc3BhY2luZzowcHgiPg0KPGJyPg0KPC9zcGFuPjxzcGFuIGxhbmc9IkVOLVVTIj48 bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8YmxvY2txdW90ZSBzdHlsZT0ibWFyZ2luLXRvcDo1LjBw dDttYXJnaW4tYm90dG9tOjUuMHB0Ij4NCjxkaXY+DQo8ZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQt ZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj4yLiAmbmJzcDtUbyBiZSBh YmxlIHRvIGdldCBFRkkgdHlwZXMgdG8gbG9jYXRlIHRoZSBFRklfU1lTVEVNX1RBQkxFX1BPSU5U RVIgSSBhZGQgYSBkdW1teSBHZGJTeW1zIGltYWdlLCB3aGljaCBpcyBub3QgbG9hZGVkIHRvIHRo ZSBmaXJtd2FyZS4gU28gYmFzaWNhbGx5IEkgY2Fubm90DQogc2xpZGUgd2hhdCBpcyBub3QgaW4g dGhlIG1lbW9yeSwgYW5kIHRoaXMgaXMgYWxzbyBteSBmaXJzdCBpbWFnZS4gSSB0cmllZCBkZWxl dGluZyBpdCBhbnlob3csIGJ1dCBpdCBmYWlsZWQgZm9yIG1lLjxvOnA+PC9vOnA+PC9zcGFuPjwv cD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVT IiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90 OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjwvZGl2 Pg0KPC9kaXY+DQo8L2Jsb2NrcXVvdGU+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNw YW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7 SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4N CjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBz dHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90Oyxz YW5zLXNlcmlmIj5JJ3ZlIG5vdCB1c2VkIHRoZSBmYWtlIGltYWdlIHRvIGdldCB0aGluZ3MgZG9u ZSBzbyBJIGNhbid0IHNwZWFrIHRvIHRoYXQuIEkgaGF2ZSB1c2VkIGEgZmFrZSB0YXJnZXQgc28g SSBjb3VsZCBoYXZlIFhJUCBQRUlNIGFuZCBzaGFkb3dlZCBQRUlNIGFkZHJlc3MgYXZhaWxhYmxl DQogYXQgdGhlIHNhbWUgdGltZS4gWW91IGNhbid0IGhhdmUgYSBtb2R1bGUgbG9hZGVkIGF0IDIg YWRkcmVzc2VzIGF0IHRoZSBzYW1lIHRpbWUgaW4gbGxsZGIuIEJ1dCB5b3UgbWlnaHQgYmUgYWJs ZSB0byB1c2UgYSBmYWtlIHRhcmdldCBmb3IgeW91ciBmYWtlIHN0dWZmPzxvOnA+PC9vOnA+PC9z cGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9 IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGlj YSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4N CjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZv bnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJp ZiI+SnVzdCBpbiBjYXNlOjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjku MHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZu YnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1z b05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1m YW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPiZuYnNwOyAmbmJzcDsgJm5i c3A7ICZuYnNwOyAmbmJzcDsgIyBjcmVhdGUgYSBmYWthIHRhcmdldCB0byBzdG9yZSBpbmZvIGFi b3V0IHN5bWJvbHM8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtm b250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+Jm5ic3A7ICZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBQZWlYaXBUYXJnZXQgPSB0YXJnZXQuZGVidWdnZXIuQ3Jl YXRlVGFyZ2V0IChOb25lLCAmcXVvdDtpMzg2LWFwcGxlLW1hY29zeCZxdW90OywgJnF1b3Q7cmVt b3RlLW1hY29zeCZxdW90OywgVHJ1ZSwgZXJyb3IpPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9k aXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxl PSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMt c2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0 O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj4mbmJzcDsgJm5i c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICMgbWFrZSBzdXJlIHRoZSBnZGItcmVtb3RlICZuYnNw O2Nvbm5lY3Rpb24gdGFyZ2V0IGlzIHRoZSBhY3RpdmUgdGFyZ2V0PG86cD48L286cD48L3NwYW4+ PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4t VVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1 b3Q7LHNhbnMtc2VyaWYiPiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgdGFyZ2V0 LmRlYnVnZ2VyLlNldFNlbGVjdGVkVGFyZ2V0ICh0YXJnZXQpPG86cD48L286cD48L3NwYW4+PC9w Pg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMi IHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7 LHNhbnMtc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPC9kaXY+ DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6 ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PGJy IHN0eWxlPSJjYXJldC1jb2xvcjogcmdiKDAsIDAsIDApO2ZvbnQtdmFyaWFudC1jYXBzOiBub3Jt YWw7dGV4dC1hbGlnbjpzdGFydDstd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHg7d29yZC1z cGFjaW5nOjBweCI+DQo8YnI+DQo8L3NwYW4+PHNwYW4gbGFuZz0iRU4tVVMiPjxvOnA+PC9vOnA+ PC9zcGFuPjwvcD4NCjxibG9ja3F1b3RlIHN0eWxlPSJtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1i b3R0b206NS4wcHQiPg0KPGRpdj4NCjxkaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1 b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPihsbGRiKSZuYnNwO2ltYWdlIGR1bXAgc2Vj dGlvbnM8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNv Tm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZh bWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+RHVtcGluZyBzZWN0aW9ucyBm b3IgOTEgbW9kdWxlcy48YnI+DQpTZWN0aW9ucyBmb3IgJ0dkYlN5bXMvQmluL1g2NF9DTEFOR1BE Qi9HZGJTeW1zLmRsbCcgKHg4Nl82NCk6PGJyPg0KJm5ic3A7Jm5ic3A7U2VjdElEJm5ic3A7Jm5i c3A7ICZuYnNwOyZuYnNwO1R5cGUmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i c3A7ICZuYnNwOyZuYnNwO0xvYWQgQWRkcmVzcyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i c3A7ICZuYnNwOyAmbmJzcDsmbmJzcDtQZXJtIEZpbGUgT2ZmLiZuYnNwOyZuYnNwO0ZpbGUgU2l6 ZSZuYnNwOyZuYnNwO0ZsYWdzJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDtTZWN0aW9uIE5hbWU8 YnI+DQombmJzcDsmbmJzcDstLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJm5ic3A7Jm5ic3A7LS0tLSAtLS0tLS0tLS0tIC0t LS0tLS0tLS0gLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPGJyPg0KJm5i c3A7Jm5ic3A7MHhmZmZmZmZmZmZmZmZmZmZmIGNvbnRhaW5lciZuYnNwOyAmbmJzcDsgJm5ic3A7 ICZuYnNwOyZuYnNwO1sweDAwMDAwMDAwMDAwMDAwMDAtMHgwMDAwMDAwMDAwMDA2ZWMwKSogLS0t Jm5ic3A7Jm5ic3A7MHgwMDAwMDAwMCAweDAwMDAwMDAwIDB4MDAwMDAwMDAgR2RiU3ltcy5kbGwu PGJyPg0KJm5ic3A7Jm5ic3A7MHgwMDAwMDAwMSBjb2RlJm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJz cDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDtbMHgwMDAwMDAwMDAwMDAwMjIwLTB4MDAwMDAw MDAwMDAwNWJkNikqIC0tLSZuYnNwOyZuYnNwOzB4MDAwMDAyMjAgMHgwMDAwNTljMCAweDYwMDAw MDIwIEdkYlN5bXMuZGxsLi4udGV4dDxicj4NCiZuYnNwOyZuYnNwOzB4MDAwMDAwMDIgZGF0YSZu YnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7WzB4MDAw MDAwMDAwMDAwNWJlMC0weDAwMDAwMDAwMDAwMDZkNzkpKiAtLS0mbmJzcDsmbmJzcDsweDAwMDA1 YmUwIDB4MDAwMDExYTAgMHg0MDAwMDA0MCBHZGJTeW1zLmRsbC4uLnJkYXRhPGJyPg0KJm5ic3A7 Jm5ic3A7MHgwMDAwMDAwMyBkYXRhJm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu YnNwOyAmbmJzcDsmbmJzcDtbMHgwMDAwMDAwMDAwMDA2ZDgwLTB4MDAwMDAwMDAwMDAwNmUzMCkq IC0tLSZuYnNwOyZuYnNwOzB4MDAwMDZkODAgMHgwMDAwMDA2MCAweGMwMDAwMDQwIEdkYlN5bXMu ZGxsLi4uZGF0YTxicj4NCiZuYnNwOyZuYnNwOzB4MDAwMDAwMDQgcmVndWxhciZuYnNwOyAmbmJz cDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDtbMHgwMDAwMDAwMDAwMDA2ZTQwLTB4MDAwMDAw MDAwMDAwNmVhNCkqIC0tLSZuYnNwOyZuYnNwOzB4MDAwMDZkZTAgMHgwMDAwMDA4MCAweDQyMDAw MDQwIEdkYlN5bXMuZGxsLi4ucmVsb2M8YnI+DQpTZWN0aW9ucyBmb3IgJy9Vc2Vycy91c2VyL0Rv Y3VtZW50cy9VZWZpV29ya3NwYWNlL0J1aWxkL092bWZYNjQvTk9PUFRfQ0xBTkdQREIvWDY0L01k ZU1vZHVsZVBrZy9Db3JlL0R4ZS9EeGVNYWluL0RFQlVHL0R4ZUNvcmUuZGxsJyAoeDg2XzY0KTo8 YnI+DQombmJzcDsmbmJzcDtTZWN0SUQmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7VHlwZSZuYnNw OyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7TG9hZCBBZGRy ZXNzJm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwO1Bl cm0gRmlsZSBPZmYuJm5ic3A7Jm5ic3A7RmlsZSBTaXplJm5ic3A7Jm5ic3A7RmxhZ3MmbmJzcDsg Jm5ic3A7ICZuYnNwOyZuYnNwO1NlY3Rpb24gTmFtZTxicj4NCiZuYnNwOyZuYnNwOy0tLS0tLS0t LS0gLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0mbmJzcDsmbmJzcDstLS0tIC0tLS0tLS0tLS0gLS0tLS0tLS0tLSAtLS0tLS0tLS0tIC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08YnI+DQombmJzcDsmbmJzcDsweGZmZmZmZmZmZmZmZmZm ZmYgY29udGFpbmVyJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7WzB4MDAwMDAwMDAw MDAwMDAwMC0weDAwMDAwMDAwMDAwNTIzYTApKiAtLS0mbmJzcDsmbmJzcDsweDAwMDAwMDAwIDB4 MDAwMDAwMDAgMHgwMDAwMDAwMCBEeGVDb3JlLmRsbC48YnI+DQombmJzcDsmbmJzcDsweDAwMDAw MDAxIGNvZGUmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZu YnNwO1sweDAwMDAwMDAwN2ZlMWIyMjAtMHgwMDAwMDAwMDdmZTYxZTM0KSZuYnNwOyZuYnNwOy0t LSZuYnNwOyZuYnNwOzB4MDAwMDAyMjAgMHgwMDA0NmMyMCAweDYwMDAwMDIwIER4ZUNvcmUuZGxs Li4udGV4dDxicj4NCiZuYnNwOyZuYnNwOzB4MDAwMDAwMDIgZGF0YSZuYnNwOyZuYnNwOyAmbmJz cDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7WzB4MDAwMDAwMDA3ZmU2MWU0MC0w eDAwMDAwMDAwN2ZlNjgwNjUpJm5ic3A7Jm5ic3A7LS0tJm5ic3A7Jm5ic3A7MHgwMDA0NmU0MCAw eDAwMDA2MjQwIDB4NDAwMDAwNDAgRHhlQ29yZS5kbGwuLi5yZGF0YTxicj4NCiZuYnNwOyZuYnNw OzB4MDAwMDAwMDMgZGF0YSZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsg Jm5ic3A7Jm5ic3A7WzB4MDAwMDAwMDA3ZmU2ODA4MC0weDAwMDAwMDAwN2ZlNmQxNjApJm5ic3A7 Jm5ic3A7LS0tJm5ic3A7Jm5ic3A7MHgwMDA0ZDA4MCAweDAwMDAxOGEwIDB4YzAwMDAwNDAgRHhl Q29yZS5kbGwuLi5kYXRhPGJyPg0KJm5ic3A7Jm5ic3A7MHgwMDAwMDAwNCByZWd1bGFyJm5ic3A7 ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwO1sweDAwMDAwMDAwN2ZlNmQxNjAtMHgw MDAwMDAwMDdmZTZkMzk4KSZuYnNwOyZuYnNwOy0tLSZuYnNwOyZuYnNwOzB4MDAwNGU5MjAgMHgw MDAwMDI0MCAweDQyMDAwMDQwIER4ZUNvcmUuZGxsLi4ucmVsb2M8YnI+DQpTZWN0aW9ucyBmb3Ig Jy9Vc2Vycy91c2VyL0RvY3VtZW50cy9VZWZpV29ya3NwYWNlL0J1aWxkL092bWZYNjQvTk9PUFRf Q0xBTkdQREIvWDY0L01kZU1vZHVsZVBrZy9Vbml2ZXJzYWwvRGV2aWNlUGF0aER4ZS9EZXZpY2VQ YXRoRHhlL0RFQlVHL0RldmljZVBhdGhEeGUuZGxsJyAoeDg2XzY0KTo8YnI+DQombmJzcDsmbmJz cDtTZWN0SUQmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7VHlwZSZuYnNwOyZuYnNwOyAmbmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7TG9hZCBBZGRyZXNzJm5ic3A7Jm5ic3A7 ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwO1Blcm0gRmlsZSBPZmYuJm5i c3A7Jm5ic3A7RmlsZSBTaXplJm5ic3A7Jm5ic3A7RmxhZ3MmbmJzcDsgJm5ic3A7ICZuYnNwOyZu YnNwO1NlY3Rpb24gTmFtZTxicj4NCiZuYnNwOyZuYnNwOy0tLS0tLS0tLS0gLS0tLS0tLS0tLS0t LS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0mbmJzcDsmbmJzcDst LS0tIC0tLS0tLS0tLS0gLS0tLS0tLS0tLSAtLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS08YnI+DQombmJzcDsmbmJzcDsweGZmZmZmZmZmZmZmZmZmZmYgY29udGFpbmVyJm5i c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7WzB4MDAwMDAwMDAwMDAwMDAwMC0weDAwMDAw MDAwMDAwMTQ0MjApKiAtLS0mbmJzcDsmbmJzcDsweDAwMDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAw MDAwMCBEZXZpY2VQYXRoRHhlLmRsbC48YnI+DQombmJzcDsmbmJzcDsweDAwMDAwMDAxIGNvZGUm bmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwO1sweDAw MDAwMDAwN2Y5ODYyMjAtMHgwMDAwMDAwMDdmOTk2Y2M2KSZuYnNwOyZuYnNwOy0tLSZuYnNwOyZu YnNwOzB4MDAwMDAyMjAgMHgwMDAxMGFjMCAweDYwMDAwMDIwIERldmljZVBhdGhEeGUuZGxsLi4u dGV4dDxicj4NCiZuYnNwOyZuYnNwOzB4MDAwMDAwMDIgZGF0YSZuYnNwOyZuYnNwOyAmbmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7WzB4MDAwMDAwMDA3Zjk5NmNlMC0weDAw MDAwMDAwN2Y5OTliMDQpJm5ic3A7Jm5ic3A7LS0tJm5ic3A7Jm5ic3A7MHgwMDAxMGNlMCAweDAw MDAyZTQwIDB4NDAwMDAwNDAgRGV2aWNlUGF0aER4ZS5kbGwuLi5yZGF0YTxicj4NCiZuYnNwOyZu YnNwOzB4MDAwMDAwMDMgZGF0YSZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz cDsgJm5ic3A7Jm5ic3A7WzB4MDAwMDAwMDA3Zjk5OWIyMC0weDAwMDAwMDAwN2Y5OWExYTIpJm5i c3A7Jm5ic3A7LS0tJm5ic3A7Jm5ic3A7MHgwMDAxM2IyMCAweDAwMDAwNjYwIDB4YzAwMDAwNDAg RGV2aWNlUGF0aER4ZS5kbGwuLi5kYXRhPGJyPg0KJm5ic3A7Jm5ic3A7MHgwMDAwMDAwNCByZWd1 bGFyJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwO1sweDAwMDAwMDAwN2Y5 OWExYzAtMHgwMDAwMDAwMDdmOTlhNDA0KSZuYnNwOyZuYnNwOy0tLSZuYnNwOyZuYnNwOzB4MDAw MTQxODAgMHgwMDAwMDI2MCAweDQyMDAwMDQwIERldmljZVBhdGhEeGUuZGxs4oCmcmVsb2M8YnI+ DQrigKY8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNv Tm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZh bWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD4mbmJzcDs8L286cD48 L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFu Zz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0 aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPlNvLCBhbGwgaW4gYWxsLCB1bmlxdWUgZ2xvYmFsIHZhcmlh YmxlcyB3b3JrLCBidXQgdGhlcmUgaXMgbm8gd2F5IHRvIGFjY2VzcyBkdXBsaWNhdGluZyB2YXJp YWJsZXMuIFRoZXkgZWl0aGVyIHJlc29sdmUgdG8gR2RiU3ltcyBvciBqdXN0IGNhdXNlIGEgY3Jh c2g6PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05v cm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1p bHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9z cGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9 IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGlj YSZxdW90OyxzYW5zLXNlcmlmIj4obGxkYikmbmJzcDtwIG1EZWJ1Z0luZm9UYWJsZUhlYWRlcjxi cj4NCihFRklfREVCVUdfSU1BR0VfSU5GT19UQUJMRV9IRUFERVIpICQwID0gezxicj4NCiZuYnNw OyZuYnNwO1VwZGF0ZVN0YXR1cyA9IDI8YnI+DQombmJzcDsmbmJzcDtUYWJsZVNpemUgPSA5Mjxi cj4NCiZuYnNwOyZuYnNwO0VmaURlYnVnSW1hZ2VJbmZvVGFibGUgPSAweDAwMDAwMDAwN2Y4MTQw MTg8YnI+DQp9PGJyPg0KKGxsZGIpJm5ic3A7cCBnQlM8YnI+DQplcnJvcjogQ291bGRuJ3QgbWF0 ZXJpYWxpemU6IGNvdWxkbid0IGdldCB0aGUgdmFsdWUgb2YgdmFyaWFibGUgOjpnQlM6IHJlYWQg bWVtb3J5IGZyb20gMHg2ZGY4IGZhaWxlZDxicj4NCmVycm9yOiBlcnJvcmVkIG91dCBpbiBEb0V4 ZWN1dGUsIGNvdWxkbid0IFByZXBhcmVUb0V4ZWN1dGVKSVRFeHByZXNzaW9uPGJyPg0KKGxsZGIp Jm5ic3A7cCBnRWZpR2xvYmFsVmFyaWFibGVHdWlkPGJyPg0KMCZuYnNwOyZuYnNwO2xpYkxMVk0u ZHlsaWImbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzB4MDAw MDAwMDEwZTUyZWU2OCBsbHZtOjpzeXM6OlByaW50U3RhY2tUcmFjZShsbHZtOjpyYXdfb3N0cmVh bSZhbXA7KSAmIzQzOyA0MDxicj4NCjEmbmJzcDsmbmJzcDtsaWJMTFZNLmR5bGliJm5ic3A7ICZu YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsweDAwMDAwMDAxMGU1MmYyNjIg U2lnbmFsSGFuZGxlcihpbnQpICYjNDM7IDE4ODxicj4NCjImbmJzcDsmbmJzcDtsaWJzeXN0ZW1f cGxhdGZvcm0uZHlsaWIgMHgwMDAwN2ZmZjZjYTU2NDJkIF9zaWd0cmFtcCAmIzQzOyAyOTxicj4N Ci4uLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29O b3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFt aWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwv c3Bhbj48L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Jsb2NrcXVvdGU+DQo8ZGl2Pg0K PHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6 OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxvOnA+ Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3Jt YWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5 OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj5JZiB5b3Ugd2FudCB0byBpbnNwZWN0 IGdsb2JhbHMgSSB0aGluayB0aGlzIGxvZ2ljIHdvcmtzIHRvIGdldCB5b3UgZGF0YSwgeW91IHdv dWxkIG5lZWQgdG8gcHJpbnQgaXQgb3V0IGV0Yy4mbmJzcDs8bzpwPjwvbzpwPjwvc3Bhbj48L3A+ DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIg c3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDss c2Fucy1zZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0K PHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6 OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPlNCVmFs dWVMaXN0ID0gbGxkYi50YXJnZXQuRmluZEdsb2JhbFZhcmlhYmxlcyAoJnF1b3Q7Z1NUJnF1b3Q7 LCAxMDI0KTxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQt ZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj5mb3IgU0JWYWx1ZSBpbiBT QlZhbHVlTGlzdDo8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIj48c3BhbiBjbGFzcz0iYXBwbGUtdGFiLXNwYW4iPjxzcGFuIGxhbmc9IkVO LVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZx dW90OyxzYW5zLXNlcmlmIj4mbmJzcDsmbmJzcDsNCjwvc3Bhbj48L3NwYW4+PHNwYW4gbGFuZz0i RU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNh JnF1b3Q7LHNhbnMtc2VyaWYiPk1vZHVsZSA9IFNCVmFsdWUuR2V0QWRkcmVzcygpLkdldE1vZHVs ZSgpJm5ic3A7PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9u dC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPiZuYnNwOyAmbmJzcDsg Jm5ic3A7ICZuYnNwOyBNb2R1bGVTdHIgPSBTQlZhbHVlLkdldEFkZHJlc3MoKS5HZXRNb2R1bGUo KS5HZXRGaWxlU3BlYygpLkdldEZpbGVuYW1lKCk8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rp dj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9 ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1z ZXJpZiI+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IFN0YXJ0ID0gaW50IChTQlZhbHVlLkdl dExvY2F0aW9uKCksIDApPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4w cHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPiZuYnNwOyAm bmJzcDsgJm5ic3A7ICZuYnNwOyBFbmQgPSBTdGFydCAmIzQzOyBTQlZhbHVlLkdldEJ5dGVTaXpl KCkgLSAxPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1z b05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1m YW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPiZuYnNwOyAmbmJzcDsgJm5i c3A7ICZuYnNwOyZuYnNwOzwvc3Bhbj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6 ZTo4LjVwdDtmb250LWZhbWlseTomcXVvdDtNZW5sbyZxdW90OyxzZXJpZiI+U0JEZWNsYXJhdGlv biA9Jm5ic3A7PC9zcGFuPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0 O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj5TQlZhbHVlLkdl dERlY2xhcmF0aW9uKCk8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBw dDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+Jm5ic3A7ICZu YnNwOyAmbmJzcDsgJm5ic3A7IENvbHVtbiA9Jm5ic3A7PC9zcGFuPjxzcGFuIGxhbmc9IkVOLVVT IiBzdHlsZT0iZm9udC1zaXplOjguNXB0O2ZvbnQtZmFtaWx5OiZxdW90O01lbmxvJnF1b3Q7LHNl cmlmIj5TQkRlY2xhcmF0aW9uLjwvc3Bhbj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQt c2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+ R2V0Q29sdW1uKCk8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtm b250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD4mbmJzcDs8 L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNw YW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7 SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPkkgd3JvdGUgYSBjb21tYW5kIGluIHRoZSBlYXJs eSBkYXlzIHRvIGR1bXAgb3V0IGFsbCB0aGUgaW5zdGFuY2VzIG9mIGEgZ2xvYmFsLiZuYnNwOzxv OnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi PjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZx dW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48 L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1V UyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVv dDssc2Fucy1zZXJpZiI+WW91IGNhbiBhbHNvIHRyeSAobGxkYikgaW1hZ2UgbG9va3VwIC1BdiAt LW5hbWUgZ1NUPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWls eTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PGJyIHN0eWxlPSJjYXJldC1jb2xv cjogcmdiKDAsIDAsIDApO2ZvbnQtdmFyaWFudC1jYXBzOiBub3JtYWw7dGV4dC1hbGlnbjpzdGFy dDstd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHg7d29yZC1zcGFjaW5nOjBweCI+DQo8YnI+ DQo8L3NwYW4+PHNwYW4gbGFuZz0iRU4tVVMiPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxibG9j a3F1b3RlIHN0eWxlPSJtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQiPg0KPGRp dj4NCjxkaXY+DQo8ZGl2Pg0KPGJsb2NrcXVvdGUgc3R5bGU9Im1hcmdpbi10b3A6NS4wcHQ7bWFy Z2luLWJvdHRvbTo1LjBwdCI+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFu Zz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0 aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPllvdSBjYW4gdGVsbCBsbGRiIHRvIHVzZSB0aGUgb2xkZXIg UHl0aG9uIGxpa2UgdGhpcyAoZnJvbSB0aGUgVGVybWluYWwuYXBwKTo8bzpwPjwvbzpwPjwvc3Bh bj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJF Ti1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2Em cXVvdDssc2Fucy1zZXJpZiI+JCZuYnNwO2RlZmF1bHRzIHdyaXRlIGNvbS5hcHBsZS5kdC5sbGRi IERlZmF1bHRQeXRob25WZXJzaW9uIDI8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjwv YmxvY2txdW90ZT4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHls ZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5z LXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBw dDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+VGhhbmtzLCB0 aGF0IGhlbHBlZCBxdWl0ZSBhIGJpdCwgYnV0IGZvciBzb21lIHJlYXNvbiBYY29kZSB2ZXJzaW9u IHN0aWxsIGNyYXNoZXMgbW9yZSBmb3IgbWUuIEkgYXR0YWNoZWQgYSBjb3VwbGUgb2Ygc3RhY2sg dHJhY2VzIGlmIHlvdSBmZWVsIGxpa2UgaGF2aW5nIGEgbG9vaywNCiBidXQgb25jZSBhZ2FpbiBp dCBzZWVtcyB0aGF0IGl0IGlzIGFsbCBhYm91dCB0aGUgUERCIHBsdWdpbi48bzpwPjwvbzpwPjwv c3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5n PSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRp Y2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+ DQo8ZGl2Pg0KPGJsb2NrcXVvdGUgc3R5bGU9Im1hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRv bTo1LjBwdCI+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMi IHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7 LHNhbnMtc2VyaWYiPkZvciB0aGUgbWFjT1MgQVBJIGNsYW5nIGVtaXRzIGZyYW1lIHBvaW50ZXJz LCBzbyB5b3UgY2FuIHdhbGsgdGhlIHN0YWNrIHdpdGhvdXQgc3ltYm9scy4gWW91IGNvdWxkIHRy eSBhZGRpbmcgdGhlIGNvbXBpbGVyIGZsYWcgdG8gZW1pdCB0aGUgZnJhbWUgcG9pbnRlcnMuJm5i c3A7PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8L2Jsb2NrcXVvdGU+DQo8ZGl2Pg0K PGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9u dC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlm Ij48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8 L2Rpdj4NCjwvZGl2Pg0KPC9ibG9ja3F1b3RlPg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi PjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZx dW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48 L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1V UyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVv dDssc2Fucy1zZXJpZiI+VGhpcyBpcyBlYXN5IGVub3VnaCB0byBjaGVjayBhcyAlcnBiIGlzIHRo ZSBmcmFtZSBwb2ludGVyIHNvIGl0IHdpbGwgZ2V0IHNhdmVkL3Jlc3RvcmVkIG9uIGZ1bmN0aW9u IGVudHJ5L2V4aXQuJm5ic3A7PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtm b250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PGJyIHN0eWxlPSJj YXJldC1jb2xvcjogcmdiKDAsIDAsIDApO2ZvbnQtdmFyaWFudC1jYXBzOiBub3JtYWw7dGV4dC1h bGlnbjpzdGFydDstd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHg7d29yZC1zcGFjaW5nOjBw eCI+DQo8YnI+DQo8L3NwYW4+PHNwYW4gbGFuZz0iRU4tVVMiPjxvOnA+PC9vOnA+PC9zcGFuPjwv cD4NCjxibG9ja3F1b3RlIHN0eWxlPSJtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4w cHQiPg0KPGRpdj4NCjxkaXY+DQo8ZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxz cGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90 O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj5JIGFtIHByZXR0eSBzdXJlIHN0YWNrIGZyYW1l cyBhcmUgbm90IGRpc2FibGVkIHdpdGggVUVGSSwgYXMgc29tZXRpbWVzIGJhY2t0cmFjaW5nIHdv cmtzIGp1c3QgZmluZS4gVG8gbWUgaXQgbG9va3MgbGlrZSBkZWJ1ZyBpbmZvcm1hdGlvbiBwYXJz aW5nIHJhbmRvbWx5IGJyZWFrcw0KIGluIExMREIsIGFuZCBvbmNlIGl0IGhhcHBlbnMgaXQgZm9y Z2V0cyBhYm91dCBvdGhlciBpbWFnZXM6PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8 ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250 LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYi PjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQt ZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj4obGxkYikmbmJzcDtiIENv cmVMb2NhdGVIYW5kbGVCdWZmZXI8YnI+DQpCcmVha3BvaW50IDI6IHdoZXJlID0gRHhlQ29yZS5k bGxgQ29yZUxvY2F0ZUhhbmRsZUJ1ZmZlciAmIzQzOyAzMSBhdCBMb2NhdGUuYzo2NDksIGFkZHJl c3MgPSAweDAwMDAwMDAwN2ZlMzZlNGY8YnI+DQoobGxkYikmbmJzcDtjPGJyPg0KUHJvY2VzcyAx IHJlc3VtaW5nPGJyPg0KUHJvY2VzcyAxIHN0b3BwZWQ8YnI+DQoqIHRocmVhZCAjMSwgc3RvcCBy ZWFzb24gPSZuYnNwO2JyZWFrcG9pbnQgMi4xPGJyPg0KJm5ic3A7ICZuYnNwOyZuYnNwO2ZyYW1l ICMwOiZuYnNwOzB4MDAwMDAwMDA3ZmUzNmU0ZiZuYnNwO0R4ZUNvcmUuZGxsYENvcmVMb2NhdGVI YW5kbGVCdWZmZXIoU2VhcmNoVHlwZT1CeVByb3RvY29sLCBQcm90b2NvbD0weDAwMDAwMDAwN2Y5 NzgxNjAsIFNlYXJjaEtleT0weDAwMDAwMDAwMDAwMDAwMDAsIE51bWJlckhhbmRsZXM9MHgwMDAw MDAwMDdmZTE5ZmQ4LCZuYnNwO0J1ZmZlcj0weDAwMDAwMDAwN2ZlMTlmYzApIGF0Jm5ic3A7TG9j YXRlLmM6NjQ5PGJyPg0KJm5ic3A7ICZuYnNwOzY0NiZuYnNwOzxzcGFuIGNsYXNzPSJhcHBsZS10 YWItc3BhbiI+Jm5ic3A7Jm5ic3A7IDwvc3Bhbj4mbmJzcDsmbmJzcDtFRklfU1RBVFVTJm5ic3A7 ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwO1N0YXR1czs8YnI+DQombmJzcDsgJm5i c3A7NjQ3Jm5ic3A7PHNwYW4gY2xhc3M9ImFwcGxlLXRhYi1zcGFuIj4mbmJzcDsmbmJzcDsgPC9z cGFuPiZuYnNwOyZuYnNwO1VJTlROJm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu YnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7QnVmZmVyU2l6ZTs8YnI+DQombmJzcDsgJm5ic3A7NjQ4 Jm5ic3A7PHNwYW4gY2xhc3M9ImFwcGxlLXRhYi1zcGFuIj4mbmJzcDsmbmJzcDsgPC9zcGFuPjxi cj4NCi0mZ3Q7IDY0OSZuYnNwOzxzcGFuIGNsYXNzPSJhcHBsZS10YWItc3BhbiI+Jm5ic3A7IDwv c3Bhbj4mbmJzcDsmbmJzcDtpZiZuYnNwOyhOdW1iZXJIYW5kbGVzID09IE5VTEwpIHs8YnI+DQom bmJzcDsgJm5ic3A7NjUwJm5ic3A7PHNwYW4gY2xhc3M9ImFwcGxlLXRhYi1zcGFuIj4mbmJzcDsm bmJzcDsgPC9zcGFuPiZuYnNwOyAmbmJzcDsmbmJzcDtyZXR1cm4mbmJzcDtFRklfSU5WQUxJRF9Q QVJBTUVURVI7PGJyPg0KJm5ic3A7ICZuYnNwOzY1MSZuYnNwOzxzcGFuIGNsYXNzPSJhcHBsZS10 YWItc3BhbiI+Jm5ic3A7Jm5ic3A7IDwvc3Bhbj4mbmJzcDsmbmJzcDt9PGJyPg0KJm5ic3A7ICZu YnNwOzY1MiZuYnNwOzxzcGFuIGNsYXNzPSJhcHBsZS10YWItc3BhbiI+Jm5ic3A7Jm5ic3A7IDwv c3Bhbj48YnI+DQoobGxkYikmbmJzcDtidDxicj4NCiogdGhyZWFkICMxLCBzdG9wIHJlYXNvbiA9 Jm5ic3A7YnJlYWtwb2ludCAyLjE8YnI+DQombmJzcDsmbmJzcDsqIGZyYW1lICMwOiZuYnNwOzB4 MDAwMDAwMDA3ZmUzNmU0ZiZuYnNwO0R4ZUNvcmUuZGxsYENvcmVMb2NhdGVIYW5kbGVCdWZmZXIo U2VhcmNoVHlwZT1CeVByb3RvY29sLCBQcm90b2NvbD0weDAwMDAwMDAwN2Y5NzgxNjAsIFNlYXJj aEtleT0weDAwMDAwMDAwMDAwMDAwMDAsIE51bWJlckhhbmRsZXM9MHgwMDAwMDAwMDdmZTE5ZmQ4 LCZuYnNwO0J1ZmZlcj0weDAwMDAwMDAwN2ZlMTlmYzApIGF0Jm5ic3A7TG9jYXRlLmM6NjQ5PGJy Pg0KJm5ic3A7ICZuYnNwOyZuYnNwO2ZyYW1lICMxOiZuYnNwOzB4MDAwMDAwMDA3ZmUzNjgxNiZu YnNwO0R4ZUNvcmUuZGxsYENvcmVMb2NhdGVEZXZpY2VQYXRoKFByb3RvY29sPTB4MDAwMDAwMDA3 Zjk3ODE2MCwgRGV2aWNlUGF0aD0weDAwMDAwMDAwN2ZlMWEwNjAsIERldmljZT0weDAwMDAwMDAw N2ZlMWEwNjgpIGF0Jm5ic3A7TG9jYXRlLmM6NDY2PGJyPg0KJm5ic3A7ICZuYnNwOyZuYnNwO2Zy YW1lICMyOiZuYnNwOzB4MDAwMDAwMDA3Zjk3NDc5YSZuYnNwO1NlY3VyaXR5U3R1YkR4ZS5kbGw8 bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFs Ij48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTom cXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+ PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4t VVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1 b3Q7LHNhbnMtc2VyaWYiPuKAlOKAlOKAlDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0K PGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9u dC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlm Ij48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3Jt YWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5 OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj4obGxkYikmbmJzcDtiIENvcHlNZW08 YnI+DQpCcmVha3BvaW50IDM6IDcwIGxvY2F0aW9ucy48YnI+DQoobGxkYikmbmJzcDtjPGJyPg0K UHJvY2VzcyAxIHJlc3VtaW5nPGJyPg0KUHJvY2VzcyAxIHN0b3BwZWQ8YnI+DQoqIHRocmVhZCAj MSwgc3RvcCByZWFzb24gPSZuYnNwO2JyZWFrcG9pbnQgMi41MyAzLjUzPGJyPg0KJm5ic3A7ICZu YnNwOyZuYnNwO2ZyYW1lICMwOiZuYnNwOzB4MDAwMDAwMDA3ZTVjMTNiMyZuYnNwO01ucER4ZS5k bGxgQ29weU1lbShEZXN0aW5hdGlvbkJ1ZmZlcj0weDAwMDAwMDAwN2ZlMTliNTAsIFNvdXJjZUJ1 ZmZlcj0weDAwMDAwMDAwN2UyYWE0NzAsIExlbmd0aD02NTYpIGF0Jm5ic3A7Q29weU1lbVdyYXBw ZXIuYzo0Nzxicj4NCiZuYnNwOyAmbmJzcDs0NCZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJhcHBs ZS10YWItc3BhbiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj4mbmJzcDsmbmJzcDtJTiBVSU5U TiZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7TGVuZ3RoPGJyPg0KJm5ic3A7ICZuYnNw OzQ1Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImFwcGxlLXRhYi1zcGFuIj4mbmJzcDsmbmJzcDsm bmJzcDsgPC9zcGFuPiZuYnNwOyZuYnNwOyk8YnI+DQombmJzcDsgJm5ic3A7NDYmbmJzcDsmbmJz cDs8c3BhbiBjbGFzcz0iYXBwbGUtdGFiLXNwYW4iPiZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+ ezxicj4NCi0mZ3Q7IDQ3Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImFwcGxlLXRhYi1zcGFuIj4m bmJzcDsmbmJzcDsgPC9zcGFuPiZuYnNwOyZuYnNwO2lmJm5ic3A7KExlbmd0aCA9PSZuYnNwOzAp IHs8YnI+DQombmJzcDsgJm5ic3A7NDgmbmJzcDsmbmJzcDs8c3BhbiBjbGFzcz0iYXBwbGUtdGFi LXNwYW4iPiZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+Jm5ic3A7ICZuYnNwOyZuYnNwO3JldHVy biZuYnNwO0Rlc3RpbmF0aW9uQnVmZmVyOzxicj4NCiZuYnNwOyAmbmJzcDs0OSZuYnNwOyZuYnNw OzxzcGFuIGNsYXNzPSJhcHBsZS10YWItc3BhbiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj4m bmJzcDsmbmJzcDt9PGJyPg0KJm5ic3A7ICZuYnNwOzUwJm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9 ImFwcGxlLXRhYi1zcGFuIj4mbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPiZuYnNwOyZuYnNwO0FT U0VSVCAoKExlbmd0aCAtJm5ic3A7MSkgJmx0Oz0gKE1BWF9BRERSRVNTIC0gKFVJTlROKURlc3Rp bmF0aW9uQnVmZmVyKSk7PGJyPg0KKGxsZGIpJm5ic3A7YnQ8YnI+DQoqIHRocmVhZCAjMSwgc3Rv cCByZWFzb24gPSZuYnNwO2JyZWFrcG9pbnQgMi41MyAzLjUzPGJyPg0KJm5ic3A7Jm5ic3A7KiBm cmFtZSAjMDombmJzcDsweDAwMDAwMDAwN2U1YzEzYjMmbmJzcDtNbnBEeGUuZGxsYENvcHlNZW0o RGVzdGluYXRpb25CdWZmZXI9MHgwMDAwMDAwMDdmZTE5YjUwLCBTb3VyY2VCdWZmZXI9MHgwMDAw MDAwMDdlMmFhNDcwLCBMZW5ndGg9NjU2KSBhdCZuYnNwO0NvcHlNZW1XcmFwcGVyLmM6NDc8YnI+ DQoobGxkYikmbmJzcDtmaW5pc2g8YnI+DQplcnJvcjogQ291bGQgbm90IGNyZWF0ZSByZXR1cm4g YWRkcmVzcyBicmVha3BvaW50Ljxicj4NCihsbGRiKSZuYnNwO248YnI+DQpQcm9jZXNzIDEgc3Rv cHBlZDxicj4NCiogdGhyZWFkICMxLCBzdG9wIHJlYXNvbiA9Jm5ic3A7c3RlcCBvdmVyPGJyPg0K Jm5ic3A7ICZuYnNwOyZuYnNwO2ZyYW1lICMwOiZuYnNwOzB4MDAwMDAwMDA3ZTVjMTNjZSZuYnNw O01ucER4ZS5kbGxgQ29weU1lbShEZXN0aW5hdGlvbkJ1ZmZlcj0weDAwMDAwMDAwN2ZlMTliNTAs IFNvdXJjZUJ1ZmZlcj0weDAwMDAwMDAwN2UyYWE0NzAsIExlbmd0aD02NTYpIGF0Jm5ic3A7Q29w eU1lbVdyYXBwZXIuYzo1MDxicj4NCiZuYnNwOyAmbmJzcDs0NyZuYnNwOyZuYnNwOzxzcGFuIGNs YXNzPSJhcHBsZS10YWItc3BhbiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj4mbmJzcDsmbmJz cDtpZiZuYnNwOyhMZW5ndGggPT0mbmJzcDswKSB7PGJyPg0KJm5ic3A7ICZuYnNwOzQ4Jm5ic3A7 Jm5ic3A7PHNwYW4gY2xhc3M9ImFwcGxlLXRhYi1zcGFuIj4mbmJzcDsmbmJzcDsmbmJzcDsgPC9z cGFuPiZuYnNwOyAmbmJzcDsmbmJzcDtyZXR1cm4mbmJzcDtEZXN0aW5hdGlvbkJ1ZmZlcjs8YnI+ DQombmJzcDsgJm5ic3A7NDkmbmJzcDsmbmJzcDs8c3BhbiBjbGFzcz0iYXBwbGUtdGFiLXNwYW4i PiZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+Jm5ic3A7Jm5ic3A7fTxicj4NCi0mZ3Q7IDUwJm5i c3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImFwcGxlLXRhYi1zcGFuIj4mbmJzcDsmbmJzcDsgPC9zcGFu PiZuYnNwOyZuYnNwO0FTU0VSVCAoKExlbmd0aCAtJm5ic3A7MSkgJmx0Oz0gKE1BWF9BRERSRVNT IC0gKFVJTlROKURlc3RpbmF0aW9uQnVmZmVyKSk7PGJyPg0KJm5ic3A7ICZuYnNwOzUxJm5ic3A7 Jm5ic3A7PHNwYW4gY2xhc3M9ImFwcGxlLXRhYi1zcGFuIj4mbmJzcDsmbmJzcDsmbmJzcDsgPC9z cGFuPiZuYnNwOyZuYnNwO0FTU0VSVCAoKExlbmd0aCAtJm5ic3A7MSkgJmx0Oz0gKE1BWF9BRERS RVNTIC0gKFVJTlROKVNvdXJjZUJ1ZmZlcikpOzxicj4NCiZuYnNwOyAmbmJzcDs1MiZuYnNwOyZu YnNwOzxzcGFuIGNsYXNzPSJhcHBsZS10YWItc3BhbiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bh bj48YnI+DQombmJzcDsgJm5ic3A7NTMmbmJzcDsmbmJzcDs8c3BhbiBjbGFzcz0iYXBwbGUtdGFi LXNwYW4iPiZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+Jm5ic3A7Jm5ic3A7aWYmbmJzcDsoRGVz dGluYXRpb25CdWZmZXIgPT0gU291cmNlQnVmZmVyKSB7PGJyPg0KKGxsZGIpJm5ic3A7Jm5ic3A7 PGJyPg0KLi4uPGJyPg0KUHJvY2VzcyAxIHN0b3BwZWQ8YnI+DQoqIHRocmVhZCAjMSwgc3RvcCBy ZWFzb24gPSZuYnNwO3N0ZXAgb3Zlcjxicj4NCiZuYnNwOyAmbmJzcDsmbmJzcDtmcmFtZSAjMDom bmJzcDsweDAwMDAwMDAwN2U1YzE0YjQmbmJzcDtNbnBEeGUuZGxsYENvcHlNZW0oRGVzdGluYXRp b25CdWZmZXI9MHgwMDAwMDAwMDdmZTE5YjUwLCBTb3VyY2VCdWZmZXI9MHgwMDAwMDAwMDdlMmFh NDcwLCBMZW5ndGg9NjU2KSBhdCZuYnNwO0NvcHlNZW1XcmFwcGVyLmM6NTc8YnI+DQombmJzcDsg Jm5ic3A7NTQmbmJzcDsmbmJzcDs8c3BhbiBjbGFzcz0iYXBwbGUtdGFiLXNwYW4iPiZuYnNwOyZu YnNwOyZuYnNwOyA8L3NwYW4+Jm5ic3A7ICZuYnNwOyZuYnNwO3JldHVybiZuYnNwO0Rlc3RpbmF0 aW9uQnVmZmVyOzxicj4NCiZuYnNwOyAmbmJzcDs1NSZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJh cHBsZS10YWItc3BhbiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj4mbmJzcDsmbmJzcDt9PGJy Pg0KJm5ic3A7ICZuYnNwOzU2Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImFwcGxlLXRhYi1zcGFu Ij4mbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPiZuYnNwOyZuYnNwO3JldHVybiZuYnNwO0ludGVy bmFsTWVtQ29weU1lbSAoRGVzdGluYXRpb25CdWZmZXIsIFNvdXJjZUJ1ZmZlciwgTGVuZ3RoKTs8 YnI+DQotJmd0OyA1NyZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJhcHBsZS10YWItc3BhbiI+Jm5i c3A7Jm5ic3A7IDwvc3Bhbj59PGJyPg0KKGxsZGIpJm5ic3A7Jm5ic3A7PGJyPg0KUHJvY2VzcyAx IHN0b3BwZWQ8YnI+DQoqIHRocmVhZCAjMSwgc3RvcCByZWFzb24gPSZuYnNwO3N0ZXAgb3Zlcjxi cj4NCiZuYnNwOyAmbmJzcDsmbmJzcDtmcmFtZSAjMDombmJzcDsweDAwMDAwMDAwN2U1YzcyNmUm bmJzcDtNbnBEeGUuZGxsPGJyPg0KLSZndDsmbmJzcDsmbmJzcDsweDdlNWM3MjZlOiBtb3YmbmJz cDsgJm5ic3A7Jm5ic3A7cmF4LCBxd29yZCBwdHIgW3JzcCAmIzQzOyAweDYwXTxicj4NCiZuYnNw OyAmbmJzcDsmbmJzcDsweDdlNWM3MjczOiBjbXAmbmJzcDsgJm5ic3A7Jm5ic3A7Ynl0ZSBwdHIg W3JheCAmIzQzOyAweDY4XSwgMHgwPGJyPg0KJm5ic3A7ICZuYnNwOyZuYnNwOzB4N2U1YzcyNzc6 IGpuZSZuYnNwOyAmbmJzcDsmbmJzcDsweDdlNWM3MjkxPGJyPg0KJm5ic3A7ICZuYnNwOyZuYnNw OzB4N2U1YzcyN2Q6IG1vdmFicyByYXgsIC0weDdmZmZmZmZmZmZmZmZmZWQ8YnI+DQoobGxkYikm bmJzcDtidDxicj4NCiogdGhyZWFkICMxLCBzdG9wIHJlYXNvbiA9Jm5ic3A7c3RlcCBvdmVyPG86 cD48L286cD48L3NwYW4+PC9wPg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxh bmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZl dGljYSZxdW90OyxzYW5zLXNlcmlmIj4mbmJzcDsmbmJzcDsqIGZyYW1lICMwOiZuYnNwOzB4MDAw MDAwMDA3ZTVjNzI2ZSZuYnNwO01ucER4ZS5kbGwmbmJzcDs8bzpwPjwvbzpwPjwvc3Bhbj48L3A+ DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9 IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGlj YSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4N CjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZv bnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJp ZiI+4oCU4oCU4oCUPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xh c3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7 Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxvOnA+Jm5ic3A7 PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxz cGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90 O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj4obGxkYikmbmJzcDtjPGJyPg0KUHJvY2VzcyAx IHJlc3VtaW5nPGJyPg0KUHJvY2VzcyAxIHN0b3BwZWQ8YnI+DQoqIHRocmVhZCAjMSwgc3RvcCBy ZWFzb24gPSZuYnNwO3NpZ25hbCBTSUdJTlQ8YnI+DQombmJzcDsgJm5ic3A7Jm5ic3A7ZnJhbWUg IzA6Jm5ic3A7MHgwMDAwMDAwMDdmZTRkNzJlJm5ic3A7RHhlQ29yZS5kbGw8YnI+DQotJmd0OyZu YnNwOyZuYnNwOzB4N2ZlNGQ3MmU6IGNtcCZuYnNwOyAmbmJzcDsmbmJzcDthbCwgMHgwPGJyPg0K Jm5ic3A7ICZuYnNwOyZuYnNwOzB4N2ZlNGQ3MzA6IGplJm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNw OzB4N2ZlNGQ3NjU8YnI+DQombmJzcDsgJm5ic3A7Jm5ic3A7MHg3ZmU0ZDczNjogbW92Jm5ic3A7 ICZuYnNwOyZuYnNwO3JjeCwgcXdvcmQgcHRyIFtyc3AgJiM0MzsgMHgyMF08YnI+DQombmJzcDsg Jm5ic3A7Jm5ic3A7MHg3ZmU0ZDczYjogY2FsbCZuYnNwOyZuYnNwOyZuYnNwOzB4N2ZlNGM0YjA8 YnI+DQoobGxkYikmbmJzcDtidDxicj4NCiogdGhyZWFkICMxLCBzdG9wIHJlYXNvbiA9Jm5ic3A7 c2lnbmFsIFNJR0lOVDxicj4NCiZuYnNwOyZuYnNwOyogZnJhbWUgIzA6Jm5ic3A7MHgwMDAwMDAw MDdmZTRkNzJlJm5ic3A7RHhlQ29yZS5kbGw8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4N CjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZv bnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJp ZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPGJsb2NrcXVv dGUgc3R5bGU9Im1hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCI+DQo8ZGl2Pg0K PHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6 OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPk9uIG1h Y09TIHRoZSBNYWNoLU8gYW5kIGRTWU0gaGF2ZSBhIFVVSUQgKGR3YXJmZHVtcCAtdSkgdGhhdCBp cyBpbmRleGVkIGJ5IFNwb3RsaWdodCAobWRmaW5kICZxdW90O2NvbV9hcHBsZV94Y29kZV9kc3lt X3V1aWRzID09IComcXVvdDspIFsyXTxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRp dj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1z aXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj5U aGlzIHNob3VsZCBiZSB0aGUgVVVJRCBpbiB0aGUgZGVidWcgZGlyZWN0b3J5IGVudHJ5IGFuZCB5 b3UgY2FuIHVzZSB0aGF0IHRvIGxvb2t1cCB0aGUgc3ltYm9scyBsaWtlIHRoaXM6PG86cD48L286 cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4g bGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVs dmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwv ZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHls ZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5z LXNlcmlmIj5tb2R1bGUgPSB0YXJnZXQuQWRkTW9kdWxlIChOb25lLCBOb25lLCB1dWlkKTxvOnA+ PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxz cGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90 O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj5TQkVycm9yID0gdGFyZ2V0LlNldE1vZHVsZUxv YWRBZGRyZXNzIChtb2R1bGUsIExvYWRBZGRyZXNzICYjNDM7IFRlQWRqdXN0KTxvOnA+PC9vOnA+ PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxh bmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZl dGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rp dj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9 ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1z ZXJpZiI+QWxzbyBsbGRiIGhhcyBidWlsdCBpbiBoZWxwIGZvciBjb21tYW5kcywgYnV0IGl0IGlz IGtpbmQgb2YgdGVyc2Ugc2luY2UgaXQgaXMgYXV0b2dlbmVyYXRlZCBmcm9tIHRoZSBDJiM0Mzsm IzQzOyBzd2lnLiZuYnNwOzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxk aXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQt c2l6ZTo4LjVwdDtmb250LWZhbWlseTomcXVvdDtNZW5sbyZxdW90OyxzZXJpZjtjb2xvcjojQUVB RUFFIj4obGxkYikmbmJzcDs8L3NwYW4+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNp emU6OC41cHQ7Zm9udC1mYW1pbHk6JnF1b3Q7TWVubG8mcXVvdDssc2VyaWYiPnNjcmlwdCBoZWxw IChsbGRiLnRhcmdldC5BZGRNb2R1bGUpPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8 ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250 LXNpemU6OC41cHQ7Zm9udC1mYW1pbHk6JnF1b3Q7TWVubG8mcXVvdDssc2VyaWYiPkhlbHAgb24g bWV0aG9kIEFkZE1vZHVsZSBpbiBtb2R1bGUgbGxkYjo8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8 L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5 bGU9ImZvbnQtc2l6ZTo4LjVwdDtmb250LWZhbWlseTomcXVvdDtNZW5sbyZxdW90OyxzZXJpZiI+ PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1z b05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OC41cHQ7Zm9udC1m YW1pbHk6JnF1b3Q7TWVubG8mcXVvdDssc2VyaWYiPkFkZE1vZHVsZShzZWxmLCAqYXJncykgbWV0 aG9kIG9mIGxsZGIuU0JUYXJnZXQgaW5zdGFuY2U8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rp dj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9 ImZvbnQtc2l6ZTo4LjVwdDtmb250LWZhbWlseTomcXVvdDtNZW5sbyZxdW90OyxzZXJpZiI+Jm5i c3A7ICZuYnNwOyBBZGRNb2R1bGUoU0JUYXJnZXQgc2VsZiwgU0JNb2R1bGUgbW9kdWxlKSAtJmd0 OyBib29sPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1z b05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OC41cHQ7Zm9udC1m YW1pbHk6JnF1b3Q7TWVubG8mcXVvdDssc2VyaWYiPiZuYnNwOyAmbmJzcDsgQWRkTW9kdWxlKFNC VGFyZ2V0IHNlbGYsIGNoYXIgY29uc3QgKiBwYXRoLCBjaGFyIGNvbnN0ICogdHJpcGxlLCBjaGFy IGNvbnN0ICogdXVpZCkgLSZndDsgU0JNb2R1bGU8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rp dj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9 ImZvbnQtc2l6ZTo4LjVwdDtmb250LWZhbWlseTomcXVvdDtNZW5sbyZxdW90OyxzZXJpZiI+Jm5i c3A7ICZuYnNwOyBBZGRNb2R1bGUoU0JUYXJnZXQgc2VsZiwgY2hhciBjb25zdCAqIHBhdGgsIGNo YXIgY29uc3QgKiB0cmlwbGUsIGNoYXIgY29uc3QgKiB1dWlkX2NzdHIsIGNoYXIgY29uc3QgKiBz eW1maWxlKSAtJmd0OyBTQk1vZHVsZTxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRp dj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1z aXplOjguNXB0O2ZvbnQtZmFtaWx5OiZxdW90O01lbmxvJnF1b3Q7LHNlcmlmIj4mbmJzcDsgJm5i c3A7IEFkZE1vZHVsZShTQlRhcmdldCBzZWxmLCBTQk1vZHVsZVNwZWMgbW9kdWxlX3NwZWMpIC0m Z3Q7IFNCTW9kdWxlPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xh c3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7 Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxicj4NCjxicj4N CjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3Jt YWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5 OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj5UaGUgbWluaW11bSAmbmJzcDt5b3Ug bmVlZCB0byBzeW1ib2xpY2F0ZSBhIGZyYW1lIGlzIHV1aWQsIExvYWRBZGRyZXNzLCBhbmQgUEMu Jm5ic3A7PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXY+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBw dDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD4mbmJz cDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1 b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPlsxXSZuYnNwOzxhIGhyZWY9Imh0dHA6Ly9s bGRiLmxsdm0ub3JnL3VzZS9tYXAuaHRtbCI+aHR0cDovL2xsZGIubGx2bS5vcmcvdXNlL21hcC5o dG1sPC9hPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQt ZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj5bMl0mbmJzcDs8YSBocmVm PSJodHRwOi8vbGxkYi5sbHZtLm9yZy91c2Uvc3ltYm9scy5odG1sIj5odHRwOi8vbGxkYi5sbHZt Lm9yZy91c2Uvc3ltYm9scy5odG1sPC9hPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0K PC9ibG9ja3F1b3RlPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0 eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNh bnMtc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjku MHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj5UaGFua3Mg Zm9yIHRoZSBsaW5rcyBhZ2Fpbi4gWWVzLCBJIGFtIHVzaW5nIHNvbWUgb2YgdGhlc2UsIGFuZCBp biBmYWN0IGZvciBHREIgdGhhdOKAmXMgcHJldHR5IG11Y2ggd2hhdCBJIGRpZCB3aGVuIEkgd29y a2VkIHdpdGggWENPREU1LiBJdCBpcyB2ZXJ5IGxpa2VseSB0aGF0DQogd2hlbiBJIGdldCB0byBj b21wbGV0ZSBMTERCIHN1cHBvcnQgZm9yIFhDT0RFNSBpdCB3aWxsIHdvcmsgcXVpdGUgZmluZSB0 b28uIEJ1dCBJIGFtIGFscmVhZHkgaGFwcHkgd2l0aCBYQ09ERTUgaGVyZSwgYW5kIG1ha2luZyBp dCBldmVuIGJldHRlciB3aWxsIG9ubHkgaGVscCBteXNlbGYsIGJ1dCBub3Qgb3RoZXIgcGVvcGxl IHdpdGggZS5nLiBMaW51eCBvciBwZW9wbGUgdGhhdCB3YW50IG1lIHRvIHVzZSB0aGUgc2FtZSBj b21waWxlciB3aXRoDQogdGhlbS48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+ DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6 ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86 cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ibG9j a3F1b3RlPg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBz dHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90Oyxz YW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5 LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+VGhhbmtz IGZvciBsb29raW5nIG91dCBmb3Igb3RoZXJzLiZuYnNwOzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4N CjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBz dHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90Oyxz YW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5 LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+VGhhbmtz LDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3Jt YWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5 OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bh bj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJF Ti1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2Em cXVvdDssc2Fucy1zZXJpZiI+QW5kcmV3IEZpc2g8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rp dj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1z aXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48 YnIgc3R5bGU9ImNhcmV0LWNvbG9yOiByZ2IoMCwgMCwgMCk7Zm9udC12YXJpYW50LWNhcHM6IG5v cm1hbDt0ZXh0LWFsaWduOnN0YXJ0Oy13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweDt3b3Jk LXNwYWNpbmc6MHB4Ij4NCjxicj4NCjwvc3Bhbj48c3BhbiBsYW5nPSJFTi1VUyI+PG86cD48L286 cD48L3NwYW4+PC9wPg0KPGJsb2NrcXVvdGUgc3R5bGU9Im1hcmdpbi10b3A6NS4wcHQ7bWFyZ2lu LWJvdHRvbTo1LjBwdCI+DQo8ZGl2Pg0KPGRpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFs Ij48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTom cXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+QmVzdCByZWdhcmRzLDxvOnA+PC9vOnA+ PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxh bmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZl dGljYSZxdW90OyxzYW5zLXNlcmlmIj5WaXRhbHk8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rp dj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9 ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1z ZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXY+ DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJm b250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2Vy aWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxibG9ja3F1 b3RlIHN0eWxlPSJtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQiPg0KPGRpdj4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXpl OjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj4yMSDQ vNCw0YDRgtCwIDIwMjAg0LMuLCDQsiAyMDoxMywgQW5kcmV3IEZpc2ggJmx0OzxhIGhyZWY9Im1h aWx0bzphZmlzaEBhcHBsZS5jb20iPmFmaXNoQGFwcGxlLmNvbTwvYT4mZ3Q7INC90LDQv9C40YHQ sNC7KNCwKTo8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3Jt YWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5 OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bh bj48L3A+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0 eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNh bnMtc2VyaWYiPjxicj4NCjxiciBzdHlsZT0iY2FyZXQtY29sb3I6IHJnYigwLCAwLCAwKTtmb250 LXZhcmlhbnQtY2Fwczogbm9ybWFsO3RleHQtYWxpZ246c3RhcnQ7LXdlYmtpdC10ZXh0LXN0cm9r ZS13aWR0aDogMHB4O3dvcmQtc3BhY2luZzowcHgiPg0KPGJyPg0KPG86cD48L286cD48L3NwYW4+ PC9wPg0KPGJsb2NrcXVvdGUgc3R5bGU9Im1hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1 LjBwdCI+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0 eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNh bnMtc2VyaWYiPk9uIE1hciAyMSwgMjAyMCwgYXQgMzoyOCBBTSwgVml0YWx5IENoZXB0c292ICZs dDs8YSBocmVmPSJtYWlsdG86Y2hlcHRzb3ZAaXNwcmFzLnJ1Ij5jaGVwdHNvdkBpc3ByYXMucnU8 L2E+Jmd0OyB3cm90ZTo8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQt ZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpw Pjwvc3Bhbj48L3A+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4t VVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1 b3Q7LHNhbnMtc2VyaWYiPkhlbGxvLDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxkaXY+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBw dDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD4mbmJz cDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1 b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPkFuZHJleSwgdGhhbmtzIGZvciB0aGUgaGlu dCwgaXQgd2FzIHZlcnkgaGVscGZ1bC4gSSByZXdyb3RlIHRoZSBHREIgc2NyaXB0cyB0byB3b3Jr IHdpdGggTExEQlsxXSBhbmQgd2FzIGFibGUgdG8gZGVidWcgT1ZNRiBidWlsdCB3aXRoIENMQU5H UERCLiBXaGlsZSBpdCBpcyBzdGlsbA0KIHF1aXRlIGRpcnR5LCBhdCB0aGUgdmVyeSBsZWFzdCBp dCB3b3Jrcy48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0i TXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250 LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD4mbmJzcDs8L286 cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4g bGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVs dmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPlVuZm9ydHVuYXRlbHkgdGhlIGV4cGVyaWVuY2Ugd2Fz IGNsb3NlIHRvIHRlcnJpYmxlLiBJIG1heSBjZXJ0YWlubHkgZG8gc29tZXRoaW5nIHdyb25nLCBi dXQgaXQgaXMgY2xlYXIgdGhhdCBQREIgYW5kIExMREIgZG8gbm90IHN1cHBvcnQgZWFjaCBvdGhl ciB3ZWxsIGVub3VnaC4NCiBBZnRlciBzcGVuZGluZyBzZXZlcmFsIGhvdXJzIG9uIHBsYXlpbmcg d2l0aCB0aGUgdG9vbHMgbXkgY29uY2x1c2lvbiBpcyB0aGF0IExMREIgaXMgc2ltcGx5IG5vdCBz dWl0ZWQgZm9yIFVFRkkgUERCIGRlYnVnZ2luZywgYW5kIHdlIHJlYWxseSB3YW50IERXQVJGICZu YnNwO2FzIHRoZXJlIGlzIG5vIG90aGVyIG9wZW5zb3VyY2UgZGVidWdnZXIgdGhhdCBzdXBwb3J0 cyBQREIgb24gbWFjT1MgYW5kIExpbnV4PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8 ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250 LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYi PjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQt ZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj5JbiBjYXNlIHNvbWVib2R5 IGtub3dzIHdvcmthcm91bmRzIGhlcmUgYXJlIHRoZSBpc3N1ZXMgSSBmYWNlZDo8bzpwPjwvbzpw Pjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBs YW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2 ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9k aXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxl PSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMt c2VyaWYiPjEuIEFsbCBpbnRlZ2VyIGFsaWFzIHR5cGVkZWZzIGFyZSBkaXNjYXJkZWQgaW4gZmF2 b3VyIG9mIHVuZGVybHlpbmcgdHlwZXMuIFRoaXMgd2F5IEVGSV9TVEFUVVMgYW5kIEVGSV9UUEwg YmVjb21lIHVuc2lnbmVkIGxvbmcgbG9uZywgQ0hBUjggYmVjb21lcyBjaGFyLCBhbmQNCiBDSEFS MTYgYmVjb21lcyB1bnNpZ25lZCBzaG9ydC4gSXQgZG9lcyBub3QgbG9vayBsaWtlIExMREIgaGFz IHRoZSBvcmlnaW5hbCB0eXBlcyBhbnl3aGVyZSBhdCBhbGwsIGFuZCBpdCBhbHNvIGRvZXMgbm90 IGhhdmUgdGhlbSByZWdpc3RlcmVkLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRp dj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1z aXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48 bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNv Tm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZh bWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+Jm5ic3A7ICZuYnNwOyZuYnNw O2ZyYW1lICMwOiZuYnNwOzB4MDAwMDAwMDA3ZmUyNDJhYSZuYnNwO0R4ZUNvcmUuZGxsYENvcmVB bGxvY2F0ZVBvb2xQYWdlc0koUG9vbFR5cGU9RWZpQm9vdFNlcnZpY2VzRGF0YSwgTm9QYWdlcz0x LCBHcmFudWxhcml0eT00MDk2LCBOZWVkR3VhcmQ9J1wwJykgYXQmbmJzcDtQb29sLmM6MzIyPGJy Pg0KJm5ic3A7ICZuYnNwOzMxOSZuYnNwOzxzcGFuIGNsYXNzPSJhcHBsZS10YWItc3BhbiI+Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj4mbmJzcDsgJm5i c3A7Jm5ic3A7cmV0dXJuJm5ic3A7TlVMTDs8YnI+DQombmJzcDsgJm5ic3A7MzIwJm5ic3A7PHNw YW4gY2xhc3M9ImFwcGxlLXRhYi1zcGFuIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsgPC9zcGFuPiZuYnNwOyZuYnNwO308YnI+DQombmJzcDsgJm5ic3A7MzIxJm5i c3A7PHNwYW4gY2xhc3M9ImFwcGxlLXRhYi1zcGFuIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxicj4NCi0mZ3Q7IDMyMiZuYnNwOzxzcGFuIGNsYXNz PSJhcHBsZS10YWItc3BhbiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwv c3Bhbj4mbmJzcDsmbmJzcDtCdWZmZXIgPSBDb3JlQWxsb2NhdGVQb29sUGFnZXMgKFBvb2xUeXBl LCBOb1BhZ2VzLCBHcmFudWxhcml0eSwgTmVlZEd1YXJkKTs8YnI+DQombmJzcDsgJm5ic3A7MzIz Jm5ic3A7PHNwYW4gY2xhc3M9ImFwcGxlLXRhYi1zcGFuIj4gPC9zcGFuPiZuYnNwOyZuYnNwO0Nv cmVSZWxlYXNlTWVtb3J5TG9jayAoKTs8YnI+DQombmJzcDsgJm5ic3A7MzI0Jm5ic3A7PHNwYW4g Y2xhc3M9ImFwcGxlLXRhYi1zcGFuIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsgPC9zcGFuPjxicj4NCiZuYnNwOyAmbmJzcDszMjUmbmJzcDs8c3BhbiBjbGFzcz0i YXBwbGUtdGFiLXNwYW4iPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyA8L3NwYW4+Jm5ic3A7Jm5ic3A7aWYmbmJzcDsoQnVmZmVyICE9IE5VTEwpIHs8YnI+DQoobGxk YikmbmJzcDtwIFN0YXR1czxicj4NCih1bnNpZ25lZCBsb25nIGxvbmcpICQzID0gMDxvOnA+PC9v OnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFu IGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hl bHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8 L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5 bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fu cy1zZXJpZiI+U3RydWN0dXJlcyB3b3JrIG1vcmUgb3IgbGVzcyBmaW5lLCBidXQgZm9yIHNpbXBs ZXIgdHlwZXMgbGlrZSBzdHJpbmdzIHdlIGFyZSBvdXQgb2YgZXZlbiBwb3RlbnRpYWwgcHJldHR5 LXByaW50aW5nLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2Zv bnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwv bzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ibG9ja3F1b3RlPg0KPGRpdj4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjku MHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZu YnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFs Ij48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTom cXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+Vml0YWx5LDxvOnA+PC9vOnA+PC9zcGFu PjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVO LVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZx dW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxk aXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQt c2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+ WW91IGNhbiB0ZWFjaCBsbGRiIGFib3V0IHR5cGVzLiBUaGVyZSBpcyBzb21lIGV4YW1wbGUgY29k ZSBoZXJlOiZuYnNwOzxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90aWFub2NvcmUvZWRrMi9i bG9iL21hc3Rlci9FbXVsYXRvclBrZy9Vbml4L2xsZGJlZmkucHkiPmh0dHBzOi8vZ2l0aHViLmNv bS90aWFub2NvcmUvZWRrMi9ibG9iL21hc3Rlci9FbXVsYXRvclBrZy9Vbml4L2xsZGJlZmkucHk8 L2E+PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48 c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVv dDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PGJyIHN0eWxlPSJjYXJldC1jb2xvcjogcmdi KDAsIDAsIDApO2ZvbnQtdmFyaWFudC1jYXBzOiBub3JtYWw7dGV4dC1hbGlnbjpzdGFydDstd2Vi a2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHg7d29yZC1zcGFjaW5nOjBweCI+DQo8YnI+DQo8bzpw PjwvbzpwPjwvc3Bhbj48L3A+DQo8YmxvY2txdW90ZSBzdHlsZT0ibWFyZ2luLXRvcDo1LjBwdDtt YXJnaW4tYm90dG9tOjUuMHB0Ij4NCjxkaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1 b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjIuIEdsb2JhbCB2YXJpYWJsZXMgYXJlIG5v dCBhY2Nlc3NpYmxlLiBJIGFtIG5vdCBzdXJlIHdoYXQgaGFwcGVucywgYnV0IHRoZXkgZWl0aGVy IHNlZW0gdG8gbm90IHJlbG9jYXRlIG9yIGNvbmZsaWN0IHdpdGggdGhlIG90aGVyIG5hbWVzOjxv OnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi PjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZx dW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48 L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1V UyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVv dDssc2Fucy1zZXJpZiI+KGxsZGIpJm5ic3A7cCBnU1Q8YnI+DQplcnJvcjogQ291bGRuJ3QgbWF0 ZXJpYWxpemU6IGNvdWxkbid0IGdldCB0aGUgdmFsdWUgb2YgdmFyaWFibGUgOjpnU1Q6IHJlYWQg bWVtb3J5IGZyb20gMHg2ZTE4IGZhaWxlZDxicj4NCmVycm9yOiBlcnJvcmVkIG91dCBpbiBEb0V4 ZWN1dGUsIGNvdWxkbid0IFByZXBhcmVUb0V4ZWN1dGVKSVRFeHByZXNzaW9uPGJyPg0KKGxsZGIp Jm5ic3A7cCAmYW1wO2dTVDxicj4NCmVycm9yOiBDb3VsZG4ndCBtYXRlcmlhbGl6ZTogY291bGRu J3QgZ2V0IHRoZSB2YWx1ZSBvZiB2YXJpYWJsZSA6OmdTVDogcmVhZCBtZW1vcnkgZnJvbSAweDZl MTggZmFpbGVkPGJyPg0KZXJyb3I6IGVycm9yZWQgb3V0IGluIERvRXhlY3V0ZSwgY291bGRuJ3Qg UHJlcGFyZVRvRXhlY3V0ZUpJVEV4cHJlc3Npb248bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rp dj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9 ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1z ZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvYmxv Y2txdW90ZT4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIg c3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDss c2Fucy1zZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0K PHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6 OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPlRoYXQg aXMgc3RyYW5nZSBhcyBnbG9iYWxzIHVzdWFsbHkgd29yayBiZXN0PyBUaGUgY29tbW9uIGlzc3Vl IEkndmUgc2VlbiBpcyBnZXR0aW5nIHRoZSBzbGlkZSB3cm9uZy4gVGhlIEVGSSBtb2R1bGVzIGFy ZSBsaW5rZWQgYXQgYSB2YWx1ZSBuZWFyIHplcm8gYW5kIHJlbG9jYXRlZA0KIGludG8gbWVtb3J5 LCBzbyB0aGUgc2xpZGUgcmVwcmVzZW50cyB0aGF0IGFkanVzdG1lbnQuJm5ic3A7PG86cD48L286 cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4g bGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVs dmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwv ZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHls ZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5z LXNlcmlmIj5Zb3UgY2FuIHVzZSBgaW1hZ2UgZHVtcCBzZWN0aW9uc2AgYW5kIGAmbmJzcDtpbWFn ZSBkdW1wIHN5bXRhYmAgdG8gc2VlIGxsZGIncyB2aWV3IG9mIHN5bWJvbHMuIE1vcmUgaW5mbyBo ZXJlIFsxXS4mbmJzcDs8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQt ZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48YnIgc3R5bGU9ImNhcmV0 LWNvbG9yOiByZ2IoMCwgMCwgMCk7Zm9udC12YXJpYW50LWNhcHM6IG5vcm1hbDt0ZXh0LWFsaWdu OnN0YXJ0Oy13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweDt3b3JkLXNwYWNpbmc6MHB4Ij4N Cjxicj4NCjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxibG9ja3F1b3RlIHN0eWxlPSJtYXJnaW4t dG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQiPg0KPGRpdj4NCjxkaXY+DQo8cCBjbGFzcz0i TXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250 LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+My4gUXVpdGUgYSBudW1i ZXIgb2YgY3Jhc2hlcy48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBw dDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD4mbmJz cDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1 b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPkluIG1vc3QgY2FzZXMgYXV0b2NvbXBsZXRp b24gYnkgdGFiIHByZXNzIGNhdXNlcyBhIGNyYXNoLiBFLmcuPG86cD48L286cD48L3NwYW4+PC9w Pg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMi IHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7 LHNhbnMtc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXpl OjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj5iIEkm bHQ7VEFCJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2Zv bnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwv bzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3Bh biBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtI ZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+U28gd2lsbCBkbyBwcmludGluZyBvZiBhIEdVSUQs IGUuZy4mbmJzcDs8L3NwYW4+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4w cHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhIE5ldWUmcXVvdDsiPnAgZ0VmaUdsb2JhbFZh cmlhYmxlR3VpZC48L3NwYW4+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4w cHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxvOnA+PC9v OnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFu IGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hl bHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8 L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5 bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EgTmV1ZSZxdW90 OyI+VGhpcyBtYXkgaGF2ZSB0byBkbyB3aXRoIFB5dGhvbiBjb21wYXRpYmlsaXR5IGFzIFhjb2Rl IDExIExMREIgdGhhdCB1c2VzIFB5dGhvbiAzIGdlbmVyYWxseSBjcmFzaGVzIG1vcmUgb2Z0ZW4g dGhhbiBNYWNQb3J0cyBMTERCIDkuMC4mbmJzcDtTdXJwcmlzaW5nbHkmbmJzcDs8L3NwYW4+PHNw YW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7 SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPnN0cnVjdHVyZXMNCiB3b3JrIG1vcmUgb3IgbGVz cyBmaW5lLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQt ZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpw Pjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ibG9ja3F1b3RlPg0KPGRpdj4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0 O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNw OzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48 c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVv dDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+WW91IGNhbiB0ZWxsIGxsZGIgdG8gdXNlIHRo ZSBvbGRlciBQeXRob24gbGlrZSB0aGlzIChmcm9tIHRoZSBUZXJtaW5hbC5hcHApOjxvOnA+PC9v OnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFu IGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hl bHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj4kJm5ic3A7ZGVmYXVsdHMgd3JpdGUgY29tLmFwcGxl LmR0LmxsZGIgRGVmYXVsdFB5dGhvblZlcnNpb24gMjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwv ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250 LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYi PjxiciBzdHlsZT0iY2FyZXQtY29sb3I6IHJnYigwLCAwLCAwKTtmb250LXZhcmlhbnQtY2Fwczog bm9ybWFsO3RleHQtYWxpZ246c3RhcnQ7LXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4O3dv cmQtc3BhY2luZzowcHgiPg0KPGJyPg0KPG86cD48L286cD48L3NwYW4+PC9wPg0KPGJsb2NrcXVv dGUgc3R5bGU9Im1hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCI+DQo8ZGl2Pg0K PGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9u dC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSBOZXVlJnF1b3Q7Ij40LiBD dHJsJiM0MztDIGRvZXMgbm90IHByb2R1Y2UgYSB2YWxpZCBiYWNrdHJhY2UuIFdoZW4gSSBicmVh ayB3aXRoIGEgYnJlYWtwb2ludCwgSSBzZWUgYSBwcm9wZXIgc3RhY2t0cmFjZSB3aXRoIG1vcmUg dGhhbiBvbmUgZW50cnksIHdpdGggZnVuY3Rpb24gcHJvdG90eXBlcyBhbmQgdmFsdWVzLg0KIFdo ZW4gSSBicmVhayB3aXRoIEN0cmwmIzQzO0MgSSBvbmx5IHNlZSBzb21lIHdlaXJkIGJhY2t0cmFj ZSB3aXRoIG1vc3Qgb2YgdGhlIGVudHJpZXMgbWlzc2luZyByZWdhcmRsZXNzIG9mIGZyYW1lIHBv c2l0aW9uOjwvc3Bhbj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtm b250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD48L286cD48 L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFu Zz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0 aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2 Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0i Zm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSBOZXVlJnF1b3Q7Ij4o bGxkYikmbmJzcDtidDxicj4NCiogdGhyZWFkICMxLCBzdG9wIHJlYXNvbiA9Jm5ic3A7c2lnbmFs IFNJR1RSQVA8YnI+DQombmJzcDsmbmJzcDsqIGZyYW1lICMwOiZuYnNwOzB4MDAwMDAwMDA3ZmU0 YzVmMyZuYnNwO0R4ZUNvcmUuZGxsPC9zcGFuPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9u dC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlm Ij48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWls eTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3Nw YW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0i RU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNh IE5ldWUmcXVvdDsiPlByb2JhYmx5IG1vcmUgYW5kIGFsbCB0aGUgdW5pbnR1aXRpdmUgc3R1ZmYg bGlrZSB0aGUgbGFjayBvZiBtb3JlIGZ1bmN0aW9uYWwgVFVJLCBidXQgaXQgaXMgaGFyZCB0byBy ZW1lbWJlciBhbGwgdGhlIHRyaWFscy48L3NwYW4+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJm b250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2Vy aWYiPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29O b3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFt aWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwv c3Bhbj48L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ibG9ja3F1b3RlPg0KPGRpdj4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2Zv bnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwv bzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3Bh biBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtI ZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+Rm9yIHRoZSBtYWNPUyBBUEkgY2xhbmcgZW1pdHMg ZnJhbWUgcG9pbnRlcnMsIHNvIHlvdSBjYW4gd2FsayB0aGUgc3RhY2sgd2l0aG91dCBzeW1ib2xz LiBZb3UgY291bGQgdHJ5IGFkZGluZyB0aGUgY29tcGlsZXIgZmxhZyB0byBlbWl0IHRoZSBmcmFt ZSBwb2ludGVycy4mbmJzcDs8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5 LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD4m bmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1h bCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6 JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFu PjwvcD4NCjwvZGl2Pg0KPGJsb2NrcXVvdGUgc3R5bGU9Im1hcmdpbi10b3A6NS4wcHQ7bWFyZ2lu LWJvdHRvbTo1LjBwdDtmb250LXZhcmlhbnQtY2Fwczogbm9ybWFsO3RleHQtYWxpZ246c3RhcnQ7 LXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4O3dvcmQtc3BhY2luZzowcHgiPg0KPGRpdj4N CjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZv bnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJp ZiI+WzFdJm5ic3A7PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FjaWRhbnRoZXJhL09wZW5D b3JlUGtnL2Jsb2IvbWFzdGVyL0RlYnVnL1NjcmlwdHMvbGxkYl91ZWZpLnB5Ij5odHRwczovL2dp dGh1Yi5jb20vYWNpZGFudGhlcmEvT3BlbkNvcmVQa2cvYmxvYi9tYXN0ZXIvRGVidWcvU2NyaXB0 cy9sbGRiX3VlZmkucHk8L2E+PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0K PHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6 OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxvOnA+ Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Jsb2NrcXVvdGU+DQo8 ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250 LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYi PjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQt ZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj5PbiBtYWNPUyB0aGUgTWFj aC1PIGFuZCBkU1lNIGhhdmUgYSBVVUlEIChkd2FyZmR1bXAgLXUpIHRoYXQgaXMgaW5kZXhlZCBi eSBTcG90bGlnaHQgKG1kZmluZCAmcXVvdDtjb21fYXBwbGVfeGNvZGVfZHN5bV91dWlkcyA9PSAq JnF1b3Q7KSBbMl08bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtm b250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+VGhpcyBzaG91bGQg YmUgdGhlIFVVSUQgaW4gdGhlIGRlYnVnIGRpcmVjdG9yeSBlbnRyeSBhbmQgeW91IGNhbiB1c2Ug dGhhdCB0byBsb29rdXAgdGhlIHN5bWJvbHMgbGlrZSB0aGlzOjxvOnA+PC9vOnA+PC9zcGFuPjwv cD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVT IiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90 OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+ DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6 ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+bW9k dWxlID0gdGFyZ2V0LkFkZE1vZHVsZSAoTm9uZSwgTm9uZSwgdXVpZCk8bzpwPjwvbzpwPjwvc3Bh bj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJF Ti1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2Em cXVvdDssc2Fucy1zZXJpZiI+U0JFcnJvciA9IHRhcmdldC5TZXRNb2R1bGVMb2FkQWRkcmVzcyAo bW9kdWxlLCBMb2FkQWRkcmVzcyAmIzQzOyBUZUFkanVzdCk8bzpwPjwvbzpwPjwvc3Bhbj48L3A+ DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIg c3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDss c2Fucy1zZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0K PHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6 OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPkFsc28g bGxkYiBoYXMgYnVpbHQgaW4gaGVscCBmb3IgY29tbWFuZHMsIGJ1dCBpdCBpcyBraW5kIG9mIHRl cnNlIHNpbmNlIGl0IGlzIGF1dG9nZW5lcmF0ZWQgZnJvbSB0aGUgQyYjNDM7JiM0Mzsgc3dpZy4m bmJzcDs8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8ZGl2Pg0KPHAgY2xh c3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OC41cHQ7 Zm9udC1mYW1pbHk6JnF1b3Q7TWVubG8mcXVvdDssc2VyaWY7Y29sb3I6Izc0NzQ3NCI+KGxsZGIp PHNwYW4gY2xhc3M9ImFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48 c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo4LjVwdDtmb250LWZhbWlseTomcXVv dDtNZW5sbyZxdW90OyxzZXJpZiI+c2NyaXB0IGhlbHAgKGxsZGIudGFyZ2V0LkFkZE1vZHVsZSk8 bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFs Ij48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo4LjVwdDtmb250LWZhbWlseTom cXVvdDtNZW5sbyZxdW90OyxzZXJpZiI+SGVscCBvbiBtZXRob2QgQWRkTW9kdWxlIGluIG1vZHVs ZSBsbGRiOjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjguNXB0O2ZvbnQt ZmFtaWx5OiZxdW90O01lbmxvJnF1b3Q7LHNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48 L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1V UyIgc3R5bGU9ImZvbnQtc2l6ZTo4LjVwdDtmb250LWZhbWlseTomcXVvdDtNZW5sbyZxdW90Oyxz ZXJpZiI+QWRkTW9kdWxlKHNlbGYsICphcmdzKSBtZXRob2Qgb2YgbGxkYi5TQlRhcmdldCBpbnN0 YW5jZTxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29O b3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjguNXB0O2ZvbnQtZmFt aWx5OiZxdW90O01lbmxvJnF1b3Q7LHNlcmlmIj4mbmJzcDsgJm5ic3A7IEFkZE1vZHVsZShTQlRh cmdldCBzZWxmLCBTQk1vZHVsZSBtb2R1bGUpIC0mZ3Q7IGJvb2w8bzpwPjwvbzpwPjwvc3Bhbj48 L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1V UyIgc3R5bGU9ImZvbnQtc2l6ZTo4LjVwdDtmb250LWZhbWlseTomcXVvdDtNZW5sbyZxdW90Oyxz ZXJpZiI+Jm5ic3A7ICZuYnNwOyBBZGRNb2R1bGUoU0JUYXJnZXQgc2VsZiwgY2hhciBjb25zdCAq IHBhdGgsIGNoYXIgY29uc3QgKiB0cmlwbGUsIGNoYXIgY29uc3QgKiB1dWlkKSAtJmd0OyBTQk1v ZHVsZTxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29O b3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjguNXB0O2ZvbnQtZmFt aWx5OiZxdW90O01lbmxvJnF1b3Q7LHNlcmlmIj4mbmJzcDsgJm5ic3A7IEFkZE1vZHVsZShTQlRh cmdldCBzZWxmLCBjaGFyIGNvbnN0ICogcGF0aCwgY2hhciBjb25zdCAqIHRyaXBsZSwgY2hhciBj b25zdCAqIHV1aWRfY3N0ciwgY2hhciBjb25zdCAqIHN5bWZpbGUpIC0mZ3Q7IFNCTW9kdWxlPG86 cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OC41cHQ7Zm9udC1mYW1pbHk6JnF1 b3Q7TWVubG8mcXVvdDssc2VyaWYiPiZuYnNwOyAmbmJzcDsgQWRkTW9kdWxlKFNCVGFyZ2V0IHNl bGYsIFNCTW9kdWxlU3BlYyBtb2R1bGVfc3BlYykgLSZndDsgU0JNb2R1bGU8bzpwPjwvbzpwPjwv c3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5n PSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRp Y2EmcXVvdDssc2Fucy1zZXJpZiI+PGJyPg0KPGJyPg0KPG86cD48L286cD48L3NwYW4+PC9wPg0K PC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0 eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNh bnMtc2VyaWYiPlRoZSBtaW5pbXVtICZuYnNwO3lvdSBuZWVkIHRvIHN5bWJvbGljYXRlIGEgZnJh bWUgaXMgdXVpZCwgTG9hZEFkZHJlc3MsIGFuZCBQQy4mbmJzcDs8bzpwPjwvbzpwPjwvc3Bhbj48 L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxh bmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZl dGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rp dj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9 ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1z ZXJpZiI+WzFdPHNwYW4gY2xhc3M9ImFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFu PjxhIGhyZWY9Imh0dHA6Ly9sbGRiLmxsdm0ub3JnL3VzZS9tYXAuaHRtbCI+aHR0cDovL2xsZGIu bGx2bS5vcmcvdXNlL21hcC5odG1sPC9hPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0K PGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9u dC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlm Ij5bMl0mbmJzcDs8YSBocmVmPSJodHRwOi8vbGxkYi5sbHZtLm9yZy91c2Uvc3ltYm9scy5odG1s Ij5odHRwOi8vbGxkYi5sbHZtLm9yZy91c2Uvc3ltYm9scy5odG1sPC9hPjxvOnA+PC9vOnA+PC9z cGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9 IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGlj YSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4N CjxkaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0 eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNh bnMtc2VyaWYiPlRoYW5rcyw8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5 LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD4m bmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1h bCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6 JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPkFuZHJldyBGaXNoPG86cD48L286cD48 L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFu Zz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0 aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2 Pg0KPC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9 ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1z ZXJpZiI+PGJyIHN0eWxlPSJjYXJldC1jb2xvcjogcmdiKDAsIDAsIDApO2ZvbnQtdmFyaWFudC1j YXBzOiBub3JtYWw7dGV4dC1hbGlnbjpzdGFydDstd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAw cHg7d29yZC1zcGFjaW5nOjBweCI+DQo8YnI+DQo8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8Ymxv Y2txdW90ZSBzdHlsZT0ibWFyZ2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Ij4NCjxk aXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxl PSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMt c2VyaWYiPkJlc3Qgd2lzaGVzLDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXpl OjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj5WaXRh bHk8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWls eTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3Nw YW4+PC9wPg0KPGRpdj4NCjxibG9ja3F1b3RlIHN0eWxlPSJtYXJnaW4tdG9wOjUuMHB0O21hcmdp bi1ib3R0b206NS4wcHQiPg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9 IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGlj YSZxdW90OyxzYW5zLXNlcmlmIj4yMCDQvNCw0YDRgtCwIDIwMjAg0LMuLCDQsiAyMjoxNCwgQW5k cmV3IEZpc2ggJmx0OzxhIGhyZWY9Im1haWx0bzphZmlzaEBhcHBsZS5jb20iPmFmaXNoQGFwcGxl LmNvbTwvYT4mZ3Q7INC90LDQv9C40YHQsNC7KNCwKTo8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8 L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9u dC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlm Ij48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1h bCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6 JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxicj4NCjxiciBzdHlsZT0iY2FyZXQt Y29sb3I6IHJnYigwLCAwLCAwKTtmb250LXZhcmlhbnQtY2Fwczogbm9ybWFsO3RleHQtYWxpZ246 c3RhcnQ7LXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4O3dvcmQtc3BhY2luZzowcHgiPg0K PGJyPg0KPG86cD48L286cD48L3NwYW4+PC9wPg0KPGJsb2NrcXVvdGUgc3R5bGU9Im1hcmdpbi10 b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCI+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1h bCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6 JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPk9uIE1hciAyMCwgMjAyMCwgYXQgODox MyBBTSwgVml0YWx5IENoZXB0c292ICZsdDs8YSBocmVmPSJtYWlsdG86Y2hlcHRzb3ZAaXNwcmFz LnJ1Ij5jaGVwdHNvdkBpc3ByYXMucnU8L2E+Jmd0OyB3cm90ZTo8bzpwPjwvbzpwPjwvc3Bhbj48 L3A+DQo8L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHls ZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5z LXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8ZGl2Pg0KPGRpdj4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0 O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj5IZWxsbyw8bzpw PjwvbzpwPjwvc3Bhbj48L3A+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFu Zz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0 aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2 Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0i Zm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNl cmlmIj5XZSBub3RpY2VkIHRoYXQgdGhlIG9yaWdpbmFsIGJ1Z3ppbGxhLCB3aGljaCBpbnRlbmRl ZCB0byBhZGQgbmV3IExMVk0gdG9vbGNoYWluIHN1cHBvcnRbMV0sIGFsc28gd2FudGVkIHRvIGJy aW5nIEVMRiBmb3JtYXQgc3VwcG9ydCB3aXRoIERXQVJGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4m bmJzcDtGb3INCiBzb21lIHJlYXNvbiB0aGlzIGRpZCBub3QgbWFrZSBpdHMgd2F5IGludG8gRURL IElJLCBhbmQgd2UgYXJlIGN1cnJlbnRseSB3b25kZXJpbmcsIGhvdyBjYW4gb25lIGRlYnVnIGJp bmFyaWVzIGJ1aWx0IHdpdGggTExWTSA5LjAuPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+ DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJm b250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2Vy aWYiPjxicj4NCjxicj4NCjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjku MHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj5Gb3IgbWFj T1MgYW5kIFhDT0RFNSB0b29sY2hhaW4gd2UgdXNlIEdEQiBzY3JpcHRzIGJhc2VkIG9uJm5ic3A7 QW5kcmVpIFdhcmtlbnRpbuKAmXMgd29yaywgd2hpY2ggYWxsb3cgdXMgdG8gaW50ZWdyYXRlIHdp dGggUUVNVSBhbmQgVk13YXJlWzJdLiBJdCBpcyBsaWtlbHkgdGhhdCB0aGV5DQogc2hvdWxkIHdv cmsgd2l0aCBsaXR0bGUgdG8gbm8gd29yayBvbiBMaW51eCB3aXRoIENMQU5HMzgvR0NDNSB3aXRo IEdEQiBvbmNlIGFnYWluLiBIb3dldmVyLCBDTEFOR1BEQiBhcHBhcmVudGx5IGlzIHVzaW5nIFBE QiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHdoaWNoIEkgYmVsaWV2ZSBpcyBub3QgaGFuZGxlZCB3 aXRoIEdEQi48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0i TXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250 LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD4mbmJzcDs8L286 cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4g bGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVs dmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPkNvdWxkIHlvdSBwbGVhc2UgcHJvdmlkZSB0aGUgZGV0 YWlscyBvbiB0aGUgbWF0dGVyIGFuZCBsZXQgdXMga25vdyBhYm91dCB0aGUgcmVjb21tZW5kZWQg cm91dGU/PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1z b05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1m YW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPuKAlCBJcyBkcm9wcGluZyBD TEFOR0VMRiBqdXN0IGEgdGVtcG9yYXJ5IG1lYXN1cmUgYW5kIGl0IHNob3VsZCBiZSByZXN1Ym1p dHRlZCBhZ2Fpbj88bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtm b250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+4oCUJm5ic3A7U2hv dWxkIExMREIsIHdoaWNoIHNlZW1zIHRvIGJlIGF3YXJlIG9mIFBEQiwgYmUgdXNlZCBpbnN0ZWFk IG9mIEdEQiwgd2hlbiBidWlsZGluZyB3aXRoIENMQU5HUERCPyBJZiBzbywgZGlkIGFueWJvZHkg dHJ5IHRoYXQ/PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9u dC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxicj4NCjxicj4NCjxv OnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvYmxvY2txdW90 ZT4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9 ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1z ZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xh c3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7 Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPlZpdGFseSw8bzpw PjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48 c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVv dDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9w Pg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMi IHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7 LHNhbnMtc2VyaWYiPkkndmUgbm90IHRyaWVkIHRoZSBDTEFOR1BEQiBwYXRoLCBidXQgaWYgeW91 IHdhbnQgdG8gY29ubmVjdCBsbGRiIHRvIFFFTVUgeW91IG5lZWQgdG8gc2V0ICZuYnNwO3BsdWdp bi5wcm9jZXNzLmdkYi1yZW1vdGUudGFyZ2V0LWRlZmluaXRpb24tZmlsZSBbMV0gdG8gWzJdLiZu YnNwOzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29O b3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFt aWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwv c3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5n PSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRp Y2EmcXVvdDssc2Fucy1zZXJpZiI+WzFdJm5ic3A7Jm5ic3A7bGxkYiAtbyAmcXVvdDtzZXR0aW5n cyBzZXQgcGx1Z2luLnByb2Nlc3MuZ2RiLXJlbW90ZS50YXJnZXQtZGVmaW5pdGlvbi1maWxlIHg4 Nl82NF90YXJnZXRfZGVmaW5pdGlvbi5weSZxdW90OyAtbyAmcXVvdDtnZGItcmVtb3RlIDkwMDAm cXVvdDs8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNv Tm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZh bWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+WzJdPHNwYW4gY2xhc3M9ImFw cGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9sbHZtLW1pcnJvci9sbGRiL2Jsb2IvbWFzdGVyL2V4YW1wbGVzL3B5dGhvbi94ODZfNjRf dGFyZ2V0X2RlZmluaXRpb24ucHkiPmh0dHBzOi8vZ2l0aHViLmNvbS9sbHZtLW1pcnJvci9sbGRi L2Jsb2IvbWFzdGVyL2V4YW1wbGVzL3B5dGhvbi94ODZfNjRfdGFyZ2V0X2RlZmluaXRpb24ucHk8 L2E+PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05v cm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1p bHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9z cGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9 IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGlj YSZxdW90OyxzYW5zLXNlcmlmIj5UaGFua3MsPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+ DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJm b250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2Vy aWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2Zv bnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj5BbmRyZXcgRmlzaDxv OnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4g bGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVs dmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxiciBzdHlsZT0iY2FyZXQtY29sb3I6IHJnYigwLCAw LCAwKTtmb250LXZhcmlhbnQtY2Fwczogbm9ybWFsO3RleHQtYWxpZ246c3RhcnQ7LXdlYmtpdC10 ZXh0LXN0cm9rZS13aWR0aDogMHB4O3dvcmQtc3BhY2luZzowcHgiPg0KPGJyPg0KPG86cD48L286 cD48L3NwYW4+PC9wPg0KPGJsb2NrcXVvdGUgc3R5bGU9Im1hcmdpbi10b3A6NS4wcHQ7bWFyZ2lu LWJvdHRvbTo1LjBwdCI+DQo8ZGl2Pg0KPGRpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFs Ij48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTom cXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+VGhhbmtzITxvOnA+PC9vOnA+PC9zcGFu PjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVO LVVTIiBzdHlsZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZx dW90OyxzYW5zLXNlcmlmIj48YnI+DQo8YnI+DQo8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rp dj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9 ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1z ZXJpZiI+QmVzdCByZWdhcmRzLDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXpl OjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5zLXNlcmlmIj5WaXRh bHk8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWls eTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3Nw YW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0i RU4tVVMiIHN0eWxlPSJmb250LXNpemU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNh JnF1b3Q7LHNhbnMtc2VyaWYiPlsxXSZuYnNwOzxhIGhyZWY9Imh0dHBzOi8vYnVnemlsbGEudGlh bm9jb3JlLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTYwMyI+aHR0cHM6Ly9idWd6aWxsYS50aWFub2Nv cmUub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjAzPC9hPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwv ZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHls ZT0iZm9udC1zaXplOjkuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OyxzYW5z LXNlcmlmIj5bMl0mbmJzcDs8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYWNpZGFudGhlcmEv T3BlbkNvcmVQa2cvYmxvYi9tYXN0ZXIvRGVidWcvU2NyaXB0cy9nZGJfdWVmaS5weSI+aHR0cHM6 Ly9naXRodWIuY29tL2FjaWRhbnRoZXJhL09wZW5Db3JlUGtnL2Jsb2IvbWFzdGVyL0RlYnVnL1Nj cmlwdHMvZ2RiX3VlZmkucHk8L2E+PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2 Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNp emU6OS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LHNhbnMtc2VyaWYiPjxv OnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvYmxv Y2txdW90ZT4NCjwvZGl2Pg0KPC9ibG9ja3F1b3RlPg0KPC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWls eTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3Nw YW4+PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvYmxvY2txdW90ZT4NCjwvZGl2Pg0KPC9ibG9ja3F1 b3RlPg0KPC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5 bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fu cy1zZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8cCBjbGFzcz0i TXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250 LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+Jmx0O2NyYXNoZXMudHh0 Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPC9ibG9ja3F1b3RlPg0KPC9kaXY+ DQo8L2Jsb2NrcXVvdGU+DQo8L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9 IkVOLVVTIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIj48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvYm9k eT4NCjwvaHRtbD4NCg== --_000_86c6477b5a354eb98ae4e637a764dc5dintelcom_-- From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.ispras.ru (mail.ispras.ru [83.149.199.45]) by mx.groups.io with SMTP id smtpd.web12.10957.1585142423652665305 for ; Wed, 25 Mar 2020 06:20:25 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: ispras.ru, ip: 83.149.199.45, mailfrom: cheptsov@ispras.ru) Received: from [127.0.0.1] (unknown [31.204.145.169]) by mail.ispras.ru (Postfix) with ESMTPSA id D7771725C0; Wed, 25 Mar 2020 16:20:14 +0300 (MSK) From: "Vitaly Cheptsov" Message-Id: <0D3D4386-606F-473E-9686-BC0A1C08D46E@ispras.ru> Mime-Version: 1.0 (Mac OS X Mail 13.4 \(3608.80.23.2.2\)) Subject: Re: [edk2-devel] CLANGPDB binary debugging Date: Wed, 25 Mar 2020 16:20:06 +0300 In-Reply-To: <86c6477b5a354eb98ae4e637a764dc5d@intel.com> Cc: "devel@edk2.groups.io" , Andrew Fish , =?utf-8?Q?Marvin_H=C3=A4user?= To: "Gao, Liming" References: <9804C565-0C9E-4778-92A7-06EA6AD8D694@ispras.ru> <7E18AD8F-9A44-45FE-A8C8-CE06A6328930@apple.com> <63396616-D8CF-4135-B967-772C1E6136BD@apple.com> <5C8DD065-0140-428B-A146-999A5694BC99@ispras.ru> <3D39F81F-6EBC-4079-8FC0-0112D756F0EB@ispras.ru> <86c6477b5a354eb98ae4e637a764dc5d@intel.com> X-Mailer: Apple Mail (2.3608.80.23.2.2) X-Groupsio-MsgNum: 56292 Content-Type: multipart/signed; boundary="Apple-Mail=_D2FB297D-3399-4E97-814F-6314E8A8B2CD"; protocol="application/pgp-signature"; micalg=pgp-sha512 --Apple-Mail=_D2FB297D-3399-4E97-814F-6314E8A8B2CD Content-Type: multipart/alternative; boundary="Apple-Mail=_20A622B7-7708-4A3C-BA59-ACC83EE9DCEB" --Apple-Mail=_20A622B7-7708-4A3C-BA59-ACC83EE9DCEB Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Liming, The issue with CLANG38 is that it uses LD BFD, a GNU linker, which is not = distributed with LLVM. This makes CLANG38 to be unusable on e.g. macOS or o= ther BSD systems, where GNU linker is not used. Making CLANG38 somehow work= with LLD (e.g. by somehow providing it an environment variable to use ld.l= ld) should most likely solve the issue, but I am not positive how to addres= s it best. Best regards, Vitaly > 25 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0=B2 16:16, Gao, Limin= g =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB(=D0=B0)= : >=20 > Vitaly: > Thanks for your further investigation with LLDB. Now, we have two CLANG= tool chain. CLANGPDB and CLANG38. CLANGPDB works with LLVM9.0 or above to = generate PE image with PDB debug symbol. CLANG38 can also be used to genera= te ELF image and convert to PE image with DWARF debug symbol on Linux host.= So, these two chains cover both usage models. We don=E2=80=99t need to int= roduce new CLANGDWARF tool chain. For LLDB issue on PDB debug symbol, I sug= gest to report them in LLVM. >=20 > Besides, LLVM10.0 is just released. >=20 > Thanks > Liming > From: devel@edk2.groups.io > On Behalf Of Vitaly Cheptsov > Sent: 2020=E5=B9=B43=E6=9C=8823=E6=97=A5 17:10 > To: Andrew Fish >; Gao, Liming = > > Cc: devel@edk2.groups.io ; Marvin H=C3=A4us= er > > Subject: Re: [edk2-devel] CLANGPDB binary debugging >=20 > Andrew, >=20 > I investigated further and was able to make some progress. I got rid of = PDB, and changed debug information generation to DWARF[1]. This resolved mo= st of LLDB crashes and made pretty-printing work just fine as type aliases = like EFI_STATUS now work correctly (I am still to commit this). Unfortunate= ly there are several downsides. Dead code stripping in LLD linker is broken= when generating PE with DWARF, so I had to patch it[2]. Debug link impleme= ntation in llvm-objcopy is also quite ugly, we do not get MTOC or anything = alike[3], just some section with a random name containing base filename. >=20 > I can submit a more proper patch to EDK II properly implementing CLANGDW= ARF toolchain instead of patching CLANGPDB like in [1], but it is questiona= ble whether it is worth it. LLVM 10 will land very soon, and the necessary = LLD patches[2] will definitely not make their way in this release. We will = have to wait for LLVM 11 at the very least, and I am not sure I am ready to= drive llvm-objcopy changes either. Liming, what do you think? >=20 > I've not used the fake image to get things done so I can't speak to that= . I have used a fake target so I could have XIP PEIM and shadowed PEIM addr= ess available at the same time. You can't have a module loaded at 2 address= es at the same time in llldb. But you might be able to use a fake target fo= r your fake stuff? >=20 > Just in case: >=20 > # create a faka target to store info about symbols > PeiXipTarget =3D target.debugger.CreateTarget (None, "i386-app= le-macosx", "remote-macosx", True, error) >=20 > # make sure the gdb-remote connection target is the active ta= rget > target.debugger.SetSelectedTarget (target) >=20 > Yes, that was actually a smart idea. I initially did it that way, as I h= ad mixing Mach-O and PE triples, but later removed, which was actually a mi= stake. Now I have a fake target for GdbSyms and a proper target for other i= mages[4]. This somewhat solves the issue with invalid addresses for gST, as= gST from DxeCore is now picked. However, I cannot access global variables = from other modules for some reason still. >=20 > If you want to inspect globals I think this logic works to get you data,= you would need to print it out etc. >=20 > SBValueList =3D lldb.target.FindGlobalVariables ("gST", 1024) > for SBValue in SBValueList: > Module =3D SBValue.GetAddress().GetModule() > ModuleStr =3D SBValue.GetAddress().GetModule().GetFileSpec().Get= Filename() > Start =3D int (SBValue.GetLocation(), 0) > End =3D Start + SBValue.GetByteSize() - 1 > SBDeclaration =3D SBValue.GetDeclaration() > Column =3D SBDeclaration.GetColumn() >=20 > I wrote a command in the early days to dump out all the instances of a g= lobal. >=20 > You can also try (lldb) image lookup -Av --name gST >=20 > Something is really weird, gST from the first image shows, but lldb beli= eves that it does not exist. lldb.target.FindGlobalVariables ("gST", 1024) = also returns an empty list. >=20 > I noticed that LLDB shows invalid type for gST in the symtab, there also= is no address. I started to wonder whether this is the cause and decided t= o check XCODE5, as the the issue could have been with PE format. Unfortunat= ely even after I tried XCODE5 support with LLDB, I got exactly the same pro= blem. I am quite clueless what is going on. Below I included two transcript= s: for CLANGDWARF and XCODE5. >=20 > (lldb) p gST > (EFI_SYSTEM_TABLE *) $0 =3D 0x000000007f9ee018 > (lldb) p *gST > (EFI_SYSTEM_TABLE) $1 =3D { > Hdr =3D (Signature =3D 0x5453595320494249, Revision =3D 0x00020046, He= aderSize =3D 0x00000078, CRC32 =3D 0x3d5e9b5d, Reserved =3D 0x00000000) > FirmwareVendor =3D 0x000000007f9e9c98 > FirmwareRevision =3D 0x00010000 > ConsoleInHandle =3D 0x000000007ed58f18 > ConIn =3D 0x000000007e6edcb8 > ConsoleOutHandle =3D 0x000000007ed57018 > ConOut =3D 0x000000007e6ede40 > StandardErrorHandle =3D 0x000000007ed57a98 > StdErr =3D 0x000000007e6ee030 > RuntimeServices =3D 0x000000007f9eeb98 > BootServices =3D 0x000000007fe689e8 > NumberOfTableEntries =3D 0x000000000000000a > ConfigurationTable =3D 0x000000007f9eec98 > } > (lldb) image lookup -Av --name gST > (lldb) image dump sections > Dumping sections for 90 modules. > Sections for '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_CL= ANGPDB/X64/DxeCore.debug' (x86_64): > SectID Type Load Address P= erm File Off. File Size Flags Section Name > ---------- ---------------- --------------------------------------- -= --- ---------- ---------- ---------- ---------------------------- > 0xffffffffffffffff container [0x000000007fe1b000-0x000000007ff3= 8ac0) --- 0x00000000 0x00000000 0x00000000 DxeCore.debug. > 0x00000001 code [0x000000007fe1b320-0x000000007fe61f34) -= -- 0x00000320 0x00046c20 0x60000020 DxeCore.debug...text > 0x00000002 data [0x000000007fe61f40-0x000000007fe680f1) -= -- 0x00046f40 0x000061c0 0x40000040 DxeCore.debug...rdata > 0x00000003 data [0x000000007fe68100-0x000000007fe6d1e0) -= -- 0x0004d100 0x000018a0 0xc0000040 DxeCore.debug...data > 0x00000004 regular [0x000000007fe6d1e0-0x000000007fe6d424) -= -- 0x0004e9a0 0x00000260 0x42000040 DxeCore.debug...reloc > 0x00000005 dwarf-abbrev [0x000000007fe6d440-0x000000007fe74059) -= -- 0x0004ec00 0x00006c20 0x42000040 DxeCore.debug...debug_abbrev > 0x00000006 dwarf-info [0x000000007fe74060-0x000000007fec1355) -= -- 0x00055820 0x0004d300 0x42000040 DxeCore.debug...debug_info > 0x00000007 dwarf-line [0x000000007fec1360-0x000000007fef9fd4) -= -- 0x000a2b20 0x00038c80 0x42000040 DxeCore.debug...debug_line > 0x00000008 dwarf-macinfo [0x000000007fef9fe0-0x000000007fefa056) -= -- 0x000db7a0 0x00000080 0x42000040 DxeCore.debug...debug_macinfo > 0x00000009 dwarf-ranges [0x000000007fefa060-0x000000007feff610) -= -- 0x000db820 0x000055c0 0x42000040 DxeCore.debug...debug_ranges > 0x0000000a dwarf-str [0x000000007feff620-0x000000007ff38abd) -= -- 0x000e0de0 0x000394a0 0x42000040 DxeCore.debug...debug_str > Sections for '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_CL= ANGPDB/X64/DevicePathDxe.debug' (x86_64): > SectID Type Load Address P= erm File Off. File Size Flags Section Name > ---------- ---------------- --------------------------------------- -= --- ---------- ---------- ---------- ---------------------------- > 0xffffffffffffffff container [0x000000007f986000-0x000000007f9c= b0a0) --- 0x00000000 0x00000000 0x00000000 DevicePathDxe.debug. > 0x00000001 code [0x000000007f986320-0x000000007f996dc6) -= -- 0x00000320 0x00010ac0 0x60000020 DevicePathDxe.debug...text > 0x00000002 data [0x000000007f996de0-0x000000007f999b75) -= -- 0x00010de0 0x00002da0 0x40000040 DevicePathDxe.debug...rdata > 0x00000003 data [0x000000007f999b80-0x000000007f99a202) -= -- 0x00013b80 0x00000660 0xc0000040 DevicePathDxe.debug...data > 0x00000004 regular [0x000000007f99a220-0x000000007f99a464) -= -- 0x000141e0 0x00000260 0x42000040 DevicePathDxe.debug...reloc > 0x00000005 dwarf-abbrev [0x000000007f99a480-0x000000007f99bd09) -= -- 0x00014440 0x000018a0 0x42000040 DevicePathDxe.debug...debug_abbrev > 0x00000006 dwarf-info [0x000000007f99bd20-0x000000007f9ad8b7) -= -- 0x00015ce0 0x00011ba0 0x42000040 DevicePathDxe.debug...debug_info > 0x00000007 dwarf-line [0x000000007f9ad8c0-0x000000007f9bc1f7) -= -- 0x00027880 0x0000e940 0x42000040 DevicePathDxe.debug...debug_line > 0x00000008 dwarf-macinfo [0x000000007f9bc200-0x000000007f9bc223) -= -- 0x000361c0 0x00000040 0x42000040 DevicePathDxe.debug...debug_macinfo > 0x00000009 dwarf-ranges [0x000000007f9bc240-0x000000007f9be020) -= -- 0x00036200 0x00001de0 0x42000040 DevicePathDxe.debug...debug_ranges > 0x0000000a dwarf-str [0x000000007f9be020-0x000000007f9cb099) -= -- 0x00037fe0 0x0000d080 0x42000040 DevicePathDxe.debug...debug_str > =E2=80=A6 > (lldb) image dump symtab > Dumping symbol table for 90 modules. > Symtab, file =3D /Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT= _CLANGPDB/X64/DxeCore.debug, num_symbols =3D 4343: > Debug symbol > |Synthetic symbol > ||Externally Visible > ||| > Index UserID DSX Type File Address/Value Load Address = Size Flags Name > ------- ------ --- --------------- ------------------ ------------------= ------------------ ---------- ---------------------------------- > [ 0] 4294967295 Invalid 0x0000000000000000 0x000000007fe1= b000 0x000000000000003a 0x00000000 .text > [ 1] 4294967295 Invalid 0x0000000000000000 = 0x0000000000000000 0x00000000 .data > [ 2] 4294967295 Invalid 0x0000000000001898 = 0x0000000000000000 0x00000000 .bss > [ 3] 4294967295 Invalid 0x0000000000046bc0 0x000000007fe6= 1bc0 0x0000000000000374 0x00000000 .text$_ModuleEntryPoint > [ 4] 4294967295 Code 0x0000000000046bc0 0x000000007fe6= 1bc0 0x0000000000000374 0x00000000 _ModuleEntryPoint > [ 5] 4294967295 Invalid 0x0000000000001b08 = 0x0000000000000000 0x00000000 .bss$gHobList > [ 6] 4294967295 Invalid 0x0000000000001b08 = 0x0000000000000000 0x00000000 gHobList > [ 7] 4294967295 Invalid 0x0000000000000000 = 0x0000000000000000 0x00000000 .rdata > [ 8] 4294967295 Invalid 0x0000000000000000 = 0x0000000000000000 0x00000000 .str > [ 9] 4294967295 Invalid 0x0000000000000058 = 0x0000000000000000 0x00000000 .rdata > [ 10] 4294967295 Invalid 0x0000000000000058 = 0x0000000000000000 0x00000000 .str.1 > [ 11] 4294967295 Invalid 0x0000000000000000 = 0x0000000000000000 0x00000000 .debug_str > [ 12] 4294967295 Invalid 0x0000000000000000 = 0x0000000000000000 0x00000000 .debug_abbrev > [ 13] 4294967295 Invalid 0x0000000000000000 = 0x0000000000000000 0x00000000 .debug_info > [ 14] 4294967295 Invalid 0x0000000000000000 = 0x0000000000000000 0x00000000 .debug_ranges > [ 15] 4294967295 Invalid 0x0000000000000000 = 0x0000000000000000 0x00000000 .debug_macinfo > [ 16] 4294967295 Invalid 0x0000000000000000 = 0x0000000000000000 0x00000000 .debug_line > [ 17] 4294967295 Code 0x000000000003f680 0x000000007fe5= a680 0x0000000000000020 0x00000000 ProcessModuleEntryPointList > [ 18] 4294967295 Code 0x0000000000023130 0x000000007fe3= e130 0x0000000000000020 0x00000000 DebugAssertEnabled > [ 19] 4294967295 Code 0x0000000000023060 0x000000007fe3= e060 0x00000000000000d0 0x00000000 DebugAssert > [ 20] 4294967295 Code 0x0000000000022150 0x000000007fe3= d150 0x0000000000000020 0x00000000 CpuDeadLoop > [ 21] 4294967295 Invalid 0x0000000000000000 0x000000007fe1= b000 0x000000000000003a 0x00000000 .text > [ 22] 4294967295 Invalid 0x0000000000000000 = 0x0000000000000000 0x00000000 .data > [ 23] 4294967295 Invalid 0x0000000000001898 = 0x0000000000000000 0x00000000 .bss > [ 24] 4294967295 Invalid 0x000000000003f240 0x000000007fe5= a240 0x0000000000000440 0x00000000 .text$ProcessLibraryConstructorList > [ 25] 4294967295 Code 0x000000000003f240 0x000000007fe5= a240 0x0000000000000440 0x00000000 ProcessLibraryConstructorList > [ 26] 4294967295 Invalid 0x000000000003f680 0x000000007fe5= a680 0x0000000000000020 0x00000000 .text$ProcessModuleEntryPointList > [ 27] 4294967295 Invalid 0x0000000000000070 = 0x0000000000000000 0x00000000 .data$gEfiCallerIdGuid > [ 28] 4294967295 Invalid 0x0000000000000070 = 0x0000000000000000 0x00000000 gEfiCallerIdGuid > [ 29] 4294967295 Invalid 0x0000000000000148 = 0x0000000000000000 0x00000000 .data$gEfiEventMemoryMapChangeGuid > [ 30] 4294967295 Invalid 0x0000000000000148 = 0x0000000000000000 0x00000000 gEfiEventMemoryMapChangeGuid > [ 31] 4294967295 Invalid 0x0000000000000168 = 0x0000000000000000 0x00000000 .data$gEfiEventVirtualAddressChangeGuid > [ 32] 4294967295 Invalid 0x0000000000000168 = 0x0000000000000000 0x00000000 gEfiEventVirtualAddressChangeGuid > [ 33] 4294967295 Invalid 0x0000000000000138 = 0x0000000000000000 0x00000000 .data$gEfiEventExitBootServicesGuid > [ 34] 4294967295 Invalid 0x0000000000000138 = 0x0000000000000000 0x00000000 gEfiEventExitBootServicesGuid > =E2=80=A6. > [ 303] 4294967295 Invalid 0x0000000000001b60 = 0x0000000000000000 0x00000000 .bss$gST > [ 304] 4294967295 Invalid 0x0000000000001b60 = 0x0000000000000000 0x00000000 gST > [ 305] 4294967295 Invalid 0x00000000000018a0 = 0x0000000000000000 0x00000000 .bss$gBS > [ 306] 4294967295 Invalid 0x00000000000018a0 = 0x0000000000000000 0x00000000 gBS > =E2=80=A6 >=20 > =E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94= = =E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94 >=20 > (lldb) p gST > (EFI_SYSTEM_TABLE *) $2 =3D 0x000000007fbee018 > (lldb) p &gST > (EFI_SYSTEM_TABLE **) $4 =3D 0x000000007fe6d788 > (lldb) p *gST > (EFI_SYSTEM_TABLE) $3 =3D { > Hdr =3D (Signature =3D 0x5453595320494249, Revision =3D 0x00020046, He= aderSize =3D 0x00000078, CRC32 =3D 0x5355dbe2, Reserved =3D 0x00000000) > FirmwareVendor =3D 0x000000007fbe9c98 > FirmwareRevision =3D 0x00010000 > ConsoleInHandle =3D 0x000000007ede5a98 > ConIn =3D 0x000000007e95f640 > ConsoleOutHandle =3D 0x000000007ede4e98 > ConOut =3D 0x000000007e95f800 > StandardErrorHandle =3D 0x000000007ede4b98 > StdErr =3D 0x000000007e95f910 > RuntimeServices =3D 0x000000007fbeeb98 > BootServices =3D 0x000000007fe6cde8 > NumberOfTableEntries =3D 0x0000000000000009 > ConfigurationTable =3D 0x000000007fbeec98 > } > (lldb) image lookup -Av --name gST > (lldb) image dump sections > Dumping sections for 88 modules. > Sections for '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_XC= ODE5/X64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll' (x86_64): > SectID Type Load Address P= erm File Off. File Size Flags Section Name > ---------- ---------------- --------------------------------------- -= --- ---------- ---------- ---------- ---------------------------- > 0x00000100 container [0x000000007fe26240-0x000000007fe6bb40) r= -x 0x000004a0 0x00045900 0x00000000 DxeCore.dll.__TEXT > 0x00000001 code [0x000000007fe26240-0x000000007fe65bd8) r= -x 0x000004a0 0x0003f998 0x80000400 DxeCore.dll.__TEXT.__text > 0x00000002 data-cstr [0x000000007fe65bd8-0x000000007fe6ba23) r= -x 0x0003fe38 0x00005e4b 0x00000002 DxeCore.dll.__TEXT.__cstring > 0x00000003 regular [0x000000007fe6ba24-0x000000007fe6ba6c) r= -x 0x00045c84 0x00000048 0x00000000 DxeCore.dll.__TEXT.__ustring > 0x00000004 regular [0x000000007fe6ba70-0x000000007fe6bb40) r= -x 0x00045cd0 0x000000d0 0x00000000 DxeCore.dll.__TEXT.__const > 0x00000200 container [0x000000007fe6bb40-0x000000007fe70e60) r= w- 0x00045da0 0x00001ae0 0x00000000 DxeCore.dll.__DATA > 0x00000005 regular [0x000000007fe6bb40-0x000000007fe6bd58) r= w- 0x00045da0 0x00000218 0x00000000 DxeCore.dll.__DATA.__const > 0x00000006 data [0x000000007fe6bd60-0x000000007fe6d610) r= w- 0x00045fc0 0x000018b0 0x00000000 DxeCore.dll.__DATA.__data > 0x00000007 zero-fill [0x000000007fe6d610-0x000000007fe70e20) r= w- 0x00000000 0x00000000 0x00000001 DxeCore.dll.__DATA.__common > 0x00000008 zero-fill [0x000000007fe70e20-0x000000007fe70e58) r= w- 0x00000000 0x00000000 0x00000001 DxeCore.dll.__DATA.__bss > 0x00000100 container [0x000000000004b000-0x00000000000ef000)* r= w- 0x00001000 0x000a3a74 0x00000000 DxeCore.dll.__DWARF > 0x00000001 dwarf-line [0x000000000004b000-0x00000000000723fb)* r= w- 0x00001000 0x000273fb 0x00000000 DxeCore.dll.__DWARF.__debug_line > 0x00000002 dwarf-pubnames [0x00000000000723fb-0x0000000000078429)* r= w- 0x000283fb 0x0000602e 0x00000000 DxeCore.dll.__DWARF.__debug_pubnames > 0x00000003 dwarf-pubtypes [0x0000000000078429-0x000000000008b915)* r= w- 0x0002e429 0x000134ec 0x00000000 DxeCore.dll.__DWARF.__debug_pubtypes > 0x00000004 dwarf-aranges [0x000000000008b915-0x000000000008ea65)* r= w- 0x00041915 0x00003150 0x00000000 DxeCore.dll.__DWARF.__debug_aranges > 0x00000005 dwarf-info [0x000000000008ea65-0x00000000000c78bf)* r= w- 0x00044a65 0x00038e5a 0x00000000 DxeCore.dll.__DWARF.__debug_info > 0x00000006 dwarf-frame [0x00000000000c78bf-0x00000000000cc697)* r= w- 0x0007d8bf 0x00004dd8 0x00000000 DxeCore.dll.__DWARF.__debug_frame > 0x00000007 dwarf-ranges [0x00000000000cc697-0x00000000000cc757)* r= w- 0x00082697 0x000000c0 0x00000000 DxeCore.dll.__DWARF.__debug_ranges > 0x00000008 dwarf-abbrev [0x00000000000cc757-0x00000000000cca9b)* r= w- 0x00082757 0x00000344 0x00000000 DxeCore.dll.__DWARF.__debug_abbrev > 0x00000009 dwarf-str [0x00000000000cca9b-0x00000000000dcc05)* r= w- 0x00082a9b 0x0001016a 0x00000000 DxeCore.dll.__DWARF.__debug_str > 0x0000000a apple-names [0x00000000000dcc05-0x00000000000e2439)* r= w- 0x00092c05 0x00005834 0x00000000 DxeCore.dll.__DWARF.__apple_names > 0x0000000b apple-namespaces [0x00000000000e2439-0x00000000000e245d)* r= w- 0x00098439 0x00000024 0x00000000 DxeCore.dll.__DWARF.__apple_namespac > 0x0000000c apple-types [0x00000000000e245d-0x00000000000eea50)* r= w- 0x0009845d 0x0000c5f3 0x00000000 DxeCore.dll.__DWARF.__apple_types > 0x0000000d apple-objc [0x00000000000eea50-0x00000000000eea74)* r= w- 0x000a4a50 0x00000024 0x00000000 DxeCore.dll.__DWARF.__apple_objc > Sections for '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_XC= ODE5/X64/MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe/DEBUG/DevicePat= hDxe.dll' (x86_64): > =E2=80=A6 > (lldb) image dump symtab > Dumping symbol table for 88 modules. > Symtab, file =3D /Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT= _XCODE5/X64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll, num_symbols = =3D 1203: > Debug symbol > |Synthetic symbol > ||Externally Visible > ||| > Index UserID DSX Type File Address/Value Load Address = Size Flags Name > ------- ------ --- --------------- ------------------ ------------------= ------------------ ---------- ---------------------------------- > [ 0] 118 D SourceFile 0x0000000000000000 = Sibling -> [ 20] 0x00640000 /Users/user/Documents/UefiPackages/MdeModule= Pkg/Core/Dxe/SectionExtraction/CoreSectionExtraction.c > [ 1] 120 D ObjectFile 0x000000005e78588d = 0x0000000000000000 0x00660001 /Users/user/Documents/UefiWorkspace/Build/Ov= mfX64/NOOPT_XCODE5/X64/MdeModulePkg/Core/Dxe/DxeMain/OUTPUT/DxeCore.lib(Cor= eSectionExtraction.obj) > [ 2] 122 D X Code 0x0000000000000240 0x000000007fe26240= 0x0000000000000260 0x000f0000 CustomGuidedSectionExtract > [ 3] 126 D X Code 0x00000000000004a0 0x000000007fe264a0= 0x0000000000000110 0x000f0000 InitializeSectionExtraction > [ 4] 130 D X Code 0x00000000000005b0 0x000000007fe265b0= 0x0000000000000140 0x000f0000 IsValidSectionStream > [ 5] 134 D X Code 0x00000000000006f0 0x000000007fe266f0= 0x0000000000000180 0x000f0000 OpenSectionStreamEx > [ 6] 138 D X Code 0x0000000000000870 0x000000007fe26870= 0x0000000000000070 0x000f0000 OpenSectionStream > [ 7] 142 D X Code 0x00000000000008e0 0x000000007fe268e0= 0x0000000000000100 0x000f0000 ChildIsType > =E2=80=A6 > [ 831] 2470 D X Code 0x00000000000306b0 0x000000007fe566b0= 0x00000000000000f4 0x000f0000 UefiBootServicesTableLibConstructor > [ 832] 2473 D X Data 0x0000000000047780 0x000000007fe6d780= 0x0000000000000008 0x000f0000 gImageHandle > [ 833] 2474 D X Data 0x0000000000047788 0x000000007fe6d788= 0x0000000000000008 0x000f0000 gST > [ 834] 2475 D X Data 0x0000000000047790 0x000000007fe6d790= 0x0000000000000008 0x000f0000 gBS > =E2=80=A6 >=20 > This is easy enough to check as %rpb is the frame pointer so it will get= saved/restored on function entry/exit. >=20 > Actually it is fine. I happened to break in the interrupt routine, which= was not mapped for a particular image. After I stepped a little, it soon r= eached the debug symbols: >=20 > (lldb) bt all > * thread #1, stop reason =3D instruction step over > * frame #0: 0x000000007fe49f3c DxeCore.dll`CoreRestoreTpl(NewTpl=3D0x0= 000000000000008) at Tpl.c:102:12 > frame #1: 0x000000007e518c95 > thread #2 > frame #0: 0x000000007fb3ff88 CpuDxe.dll`CpuSleep + 1 > frame #1: 0x000000007fb4d719 CpuDxe.dll`ApWakeupFunction(ExchangeInf= o=3D0x0000000000087198, ApIndex=3D0x0000000000000001) at MpLib.c:768:9 > frame #2: 0x000000007fb2d151 > thread #3 > frame #0: 0x000000007fb3ff88 CpuDxe.dll`CpuSleep + 1 > frame #1: 0x000000007fb4d719 CpuDxe.dll`ApWakeupFunction(ExchangeInf= o=3D0x0000000000087198, ApIndex=3D0x0000000000000002) at MpLib.c:768:9 > frame #2: 0x000000007fb2d151 > thread #4 > frame #0: 0x000000007fb3ff88 CpuDxe.dll`CpuSleep + 1 > frame #1: 0x000000007fb4d719 CpuDxe.dll`ApWakeupFunction(ExchangeInf= o=3D0x0000000000087198, ApIndex=3D0x0000000000000003) at MpLib.c:768:9 > frame #2: 0x000000007fb2d151 >=20 > Best wishes, > Vitaly >=20 > [1] https://github.com/acidanthera/OpenCorePkg/blob/7684a9f/Debug/ClangD= warf.patch > [2] https://bugs.llvm.org/show_bug.cgi?id=3D45273 > [3] https://bugs.llvm.org/show_bug.cgi?id=3D45277 > [4] https://github.com/acidanthera/OpenCorePkg/commit/3e5f3f3f9a8d3f1978= 34bbfcf5029f771df89754 >=20 >=20 > 22 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0=B2 00:06, Andrew Fis= h > =D0=BD=D0=B0=D0=BF=D0=B8=D1=81= = =D0=B0=D0=BB(=D0=B0): >=20 >=20 >=20 >=20 > On Mar 21, 2020, at 11:36 AM, Vitaly Cheptsov > wrote: >=20 > Andrew, >=20 > Thanks once again, but unfortunately it is not that simple. Below I answ= ered inline explaining the particular issues, which mostly seem to be speci= fic to CLANGPDB. LLVM stack emits PDB debug files, and even though LLDB doe= s support them to some level, it is unlikely that this will be working well= enough soon. We should really stick to more or less native debug formats, = ideally those that have proper open specifications, on all platforms, and f= or Unix that=E2=80=99s DWARF. >=20 >=20 > Vitaly, >=20 > I understand and I use the Xcode clang and not the CLANGPDB, but I use l= ldb a lot I was just trying to point out what works with Xcode. >=20 >=20 >=20 > I am pretty sure LLVM can be taught to emit DWARF debug information even= for PE files. Perhaps we can either make some option or provide a separate= toolchain for this? Another way would be recovering CLANGELF as originally= suggested. >=20 >=20 > There was a bug recently in the x86_64-pc-win32-macho triple and we had= to add -gdwarf to force it emit dwarf. Not sure what that compiler flag wo= uld do to CLANGPDB but it is worth a try? Last flag wins for the compiler. >=20 >=20 >=20 > You can teach lldb about types. There is some example code here: https:/= /github.com/tianocore/edk2/blob/master/EmulatorPkg/Unix/lldbefi.py >=20 > This code works just fine with LLDB and DWARF (e.g. XCODE5), though I ha= ve not yet completed these changes for my scripts for LLDB, only for GDB. H= owever, with CLANGPDB generated files it is not functional. The reason for = this is because LLDB is unaware of the underlying type, i.e. it does not kn= ow what is EFI_STATUS or UINT32. I can implement pretty-printing when LLDB = knows about a typedef, but it is not possible to do this when the debug inf= ormation is already gone or not parsed: >=20 > (lldb) p Status > (unsigned long long) $1 =3D 0 > (lldb) p &Status > (unsigned long long *) $2 =3D 0x000000007fe19ad8 > (lldb) p (EFI_STATUS)Status > error: use of undeclared identifier 'EFI_STATUS' >=20 > Just in case I tried using exactly your code, and other stuff like sourc= e level debugging works just fine and symbolication works fine, so it shoul= d be some bug with PDB in particular. >=20 >=20 > That is strange as globals usually work best? The common issue I've seen= is getting the slide wrong. The EFI modules are linked at a value near zer= o and relocated into memory, so the slide represents that adjustment. >=20 > You can use `image dump sections` and ` image dump symtab` to see lldb's= view of symbols. More info here [1]. >=20 > Yes, this one is a bit complicated, once again due to PDB most likely. I= t knows about global symbols, but does not list them in symtab: >=20 > (lldb) image dump symtab > Dumping symbol table for 91 modules. > Symtab, file =3D GdbSyms/Bin/X64_CLANGPDB/GdbSyms.dll, num_symbols =3D 0 > Symtab, file =3D /Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT= _CLANGPDB/X64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll, num_symbols = = =3D 0 > Symtab, file =3D /Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT= _CLANGPDB/X64/MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe/DEBUG/Devi= cePathDxe.dll, num_symbols =3D 0 > =E2=80=A6 >=20 > The slides are correct, but there are two nuances that collide with it. >=20 > 1. There are multiple instances of the globals with the same name (e.g. = gBS), but for some reason LLDB always tries to print the globals from the f= irst module. This happens even when I am source-level debugging, and I see = a gBS symbol from another module (e.g. DxeCore) used right at the same line= . With GDB the closest symbol is used, but with LLDB it is always coming fr= om the first module. I tried checking expr help to find whether I can pass = it a module explicitly, but also failed. >=20 >=20 > Usually what happens with lldb is you get the global that is in scope fo= r the current frame. >=20 >=20 > 2. To be able to get EFI types to locate the EFI_SYSTEM_TABLE_POINTER I= add a dummy GdbSyms image, which is not loaded to the firmware. So basical= ly I cannot slide what is not in the memory, and this is also my first imag= e. I tried deleting it anyhow, but it failed for me. >=20 >=20 > I've not used the fake image to get things done so I can't speak to that= . I have used a fake target so I could have XIP PEIM and shadowed PEIM addr= ess available at the same time. You can't have a module loaded at 2 address= es at the same time in llldb. But you might be able to use a fake target fo= r your fake stuff? >=20 > Just in case: >=20 > # create a faka target to store info about symbols > PeiXipTarget =3D target.debugger.CreateTarget (None, "i386-app= le-macosx", "remote-macosx", True, error) >=20 > # make sure the gdb-remote connection target is the active ta= rget > target.debugger.SetSelectedTarget (target) >=20 >=20 >=20 > (lldb) image dump sections > Dumping sections for 91 modules. > Sections for 'GdbSyms/Bin/X64_CLANGPDB/GdbSyms.dll' (x86_64): > SectID Type Load Address P= erm File Off. File Size Flags Section Name > ---------- ---------------- --------------------------------------- -= --- ---------- ---------- ---------- ---------------------------- > 0xffffffffffffffff container [0x0000000000000000-0x000000000000= 6ec0)* --- 0x00000000 0x00000000 0x00000000 GdbSyms.dll. > 0x00000001 code [0x0000000000000220-0x0000000000005bd6)* -= -- 0x00000220 0x000059c0 0x60000020 GdbSyms.dll...text > 0x00000002 data [0x0000000000005be0-0x0000000000006d79)* -= -- 0x00005be0 0x000011a0 0x40000040 GdbSyms.dll...rdata > 0x00000003 data [0x0000000000006d80-0x0000000000006e30)* -= -- 0x00006d80 0x00000060 0xc0000040 GdbSyms.dll...data > 0x00000004 regular [0x0000000000006e40-0x0000000000006ea4)* -= -- 0x00006de0 0x00000080 0x42000040 GdbSyms.dll...reloc > Sections for '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_CL= ANGPDB/X64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll' (x86_64): > SectID Type Load Address P= erm File Off. File Size Flags Section Name > ---------- ---------------- --------------------------------------- -= --- ---------- ---------- ---------- ---------------------------- > 0xffffffffffffffff container [0x0000000000000000-0x000000000005= 23a0)* --- 0x00000000 0x00000000 0x00000000 DxeCore.dll. > 0x00000001 code [0x000000007fe1b220-0x000000007fe61e34) -= -- 0x00000220 0x00046c20 0x60000020 DxeCore.dll...text > 0x00000002 data [0x000000007fe61e40-0x000000007fe68065) -= -- 0x00046e40 0x00006240 0x40000040 DxeCore.dll...rdata > 0x00000003 data [0x000000007fe68080-0x000000007fe6d160) -= -- 0x0004d080 0x000018a0 0xc0000040 DxeCore.dll...data > 0x00000004 regular [0x000000007fe6d160-0x000000007fe6d398) -= -- 0x0004e920 0x00000240 0x42000040 DxeCore.dll...reloc > Sections for '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_CL= ANGPDB/X64/MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe/DEBUG/DeviceP= athDxe.dll' (x86_64): > SectID Type Load Address P= erm File Off. File Size Flags Section Name > ---------- ---------------- --------------------------------------- -= --- ---------- ---------- ---------- ---------------------------- > 0xffffffffffffffff container [0x0000000000000000-0x000000000001= 4420)* --- 0x00000000 0x00000000 0x00000000 DevicePathDxe.dll. > 0x00000001 code [0x000000007f986220-0x000000007f996cc6) -= -- 0x00000220 0x00010ac0 0x60000020 DevicePathDxe.dll...text > 0x00000002 data [0x000000007f996ce0-0x000000007f999b04) -= -- 0x00010ce0 0x00002e40 0x40000040 DevicePathDxe.dll...rdata > 0x00000003 data [0x000000007f999b20-0x000000007f99a1a2) -= -- 0x00013b20 0x00000660 0xc0000040 DevicePathDxe.dll...data > 0x00000004 regular [0x000000007f99a1c0-0x000000007f99a404) -= -- 0x00014180 0x00000260 0x42000040 DevicePathDxe.dll=E2=80=A6reloc > =E2=80=A6 >=20 > So, all in all, unique global variables work, but there is no way to acc= ess duplicating variables. They either resolve to GdbSyms or just cause a c= rash: >=20 > (lldb) p mDebugInfoTableHeader > (EFI_DEBUG_IMAGE_INFO_TABLE_HEADER) $0 =3D { > UpdateStatus =3D 2 > TableSize =3D 92 > EfiDebugImageInfoTable =3D 0x000000007f814018 > } > (lldb) p gBS > error: Couldn't materialize: couldn't get the value of variable ::gBS: r= ead memory from 0x6df8 failed > error: errored out in DoExecute, couldn't PrepareToExecuteJITExpression > (lldb) p gEfiGlobalVariableGuid > 0 libLLVM.dylib 0x000000010e52ee68 llvm::sys::PrintStackTrac= e(llvm::raw_ostream&) + 40 > 1 libLLVM.dylib 0x000000010e52f262 SignalHandler(int) + 188 > 2 libsystem_platform.dylib 0x00007fff6ca5642d _sigtramp + 29 > ... >=20 >=20 > If you want to inspect globals I think this logic works to get you data,= you would need to print it out etc. >=20 > SBValueList =3D lldb.target.FindGlobalVariables ("gST", 1024) > for SBValue in SBValueList: > Module =3D SBValue.GetAddress().GetModule() > ModuleStr =3D SBValue.GetAddress().GetModule().GetFileSpec().Get= Filename() > Start =3D int (SBValue.GetLocation(), 0) > End =3D Start + SBValue.GetByteSize() - 1 > SBDeclaration =3D SBValue.GetDeclaration() > Column =3D SBDeclaration.GetColumn() >=20 > I wrote a command in the early days to dump out all the instances of a g= lobal. >=20 > You can also try (lldb) image lookup -Av --name gST >=20 >=20 > You can tell lldb to use the older Python like this (from the Terminal.a= pp): > $ defaults write com.apple.dt.lldb DefaultPythonVersion 2 >=20 > Thanks, that helped quite a bit, but for some reason Xcode version still= crashes more for me. I attached a couple of stack traces if you feel like = having a look, but once again it seems that it is all about the PDB plugin. >=20 > For the macOS API clang emits frame pointers, so you can walk the stack = without symbols. You could try adding the compiler flag to emit the frame p= ointers. >=20 >=20 > This is easy enough to check as %rpb is the frame pointer so it will get= saved/restored on function entry/exit. >=20 >=20 > I am pretty sure stack frames are not disabled with UEFI, as sometimes b= acktracing works just fine. To me it looks like debug information parsing r= andomly breaks in LLDB, and once it happens it forgets about other images: >=20 > (lldb) b CoreLocateHandleBuffer > Breakpoint 2: where =3D DxeCore.dll`CoreLocateHandleBuffer + 31 at Locat= e.c:649, address =3D 0x000000007fe36e4f > (lldb) c > Process 1 resuming > Process 1 stopped > * thread #1, stop reason =3D breakpoint 2.1 > frame #0: 0x000000007fe36e4f DxeCore.dll`CoreLocateHandleBuffer(Sear= chType=3DByProtocol, Protocol=3D0x000000007f978160, SearchKey=3D0x000000000= 0000000, NumberHandles=3D0x000000007fe19fd8, Buffer=3D0x000000007fe19fc0) a= t Locate.c:649 > 646 EFI_STATUS Status; > 647 UINTN BufferSize; > 648 > -> 649 if (NumberHandles =3D=3D NULL) { > 650 return EFI_INVALID_PARAMETER; > 651 } > 652 > (lldb) bt > * thread #1, stop reason =3D breakpoint 2.1 > * frame #0: 0x000000007fe36e4f DxeCore.dll`CoreLocateHandleBuffer(Sear= chType=3DByProtocol, Protocol=3D0x000000007f978160, SearchKey=3D0x000000000= 0000000, NumberHandles=3D0x000000007fe19fd8, Buffer=3D0x000000007fe19fc0) a= t Locate.c:649 > frame #1: 0x000000007fe36816 DxeCore.dll`CoreLocateDevicePath(Protoc= ol=3D0x000000007f978160, DevicePath=3D0x000000007fe1a060, Device=3D0x000000= 007fe1a068) at Locate.c:466 > frame #2: 0x000000007f97479a SecurityStubDxe.dll >=20 > =E2=80=94=E2=80=94=E2=80=94 >=20 > (lldb) b CopyMem > Breakpoint 3: 70 locations. > (lldb) c > Process 1 resuming > Process 1 stopped > * thread #1, stop reason =3D breakpoint 2.53 3.53 > frame #0: 0x000000007e5c13b3 MnpDxe.dll`CopyMem(DestinationBuffer=3D= 0x000000007fe19b50, SourceBuffer=3D0x000000007e2aa470, Length=3D656) at Cop= yMemWrapper.c:47 > 44 IN UINTN Length > 45 ) > 46 { > -> 47 if (Length =3D=3D 0) { > 48 return DestinationBuffer; > 49 } > 50 ASSERT ((Length - 1) <=3D (MAX_ADDRESS - (UINTN)Destination= Buffer)); > (lldb) bt > * thread #1, stop reason =3D breakpoint 2.53 3.53 > * frame #0: 0x000000007e5c13b3 MnpDxe.dll`CopyMem(DestinationBuffer=3D= 0x000000007fe19b50, SourceBuffer=3D0x000000007e2aa470, Length=3D656) at Cop= yMemWrapper.c:47 > (lldb) finish > error: Could not create return address breakpoint. > (lldb) n > Process 1 stopped > * thread #1, stop reason =3D step over > frame #0: 0x000000007e5c13ce MnpDxe.dll`CopyMem(DestinationBuffer=3D= 0x000000007fe19b50, SourceBuffer=3D0x000000007e2aa470, Length=3D656) at Cop= yMemWrapper.c:50 > 47 if (Length =3D=3D 0) { > 48 return DestinationBuffer; > 49 } > -> 50 ASSERT ((Length - 1) <=3D (MAX_ADDRESS - (UINTN)DestinationB= uffer)); > 51 ASSERT ((Length - 1) <=3D (MAX_ADDRESS - (UINTN)SourceBuffe= r)); > 52 > 53 if (DestinationBuffer =3D=3D SourceBuffer) { > (lldb) > ... > Process 1 stopped > * thread #1, stop reason =3D step over > frame #0: 0x000000007e5c14b4 MnpDxe.dll`CopyMem(DestinationBuffer=3D= 0x000000007fe19b50, SourceBuffer=3D0x000000007e2aa470, Length=3D656) at Cop= yMemWrapper.c:57 > 54 return DestinationBuffer; > 55 } > 56 return InternalMemCopyMem (DestinationBuffer, SourceBuffer,= Length); > -> 57 } > (lldb) > Process 1 stopped > * thread #1, stop reason =3D step over > frame #0: 0x000000007e5c726e MnpDxe.dll > -> 0x7e5c726e: mov rax, qword ptr [rsp + 0x60] > 0x7e5c7273: cmp byte ptr [rax + 0x68], 0x0 > 0x7e5c7277: jne 0x7e5c7291 > 0x7e5c727d: movabs rax, -0x7fffffffffffffed > (lldb) bt > * thread #1, stop reason =3D step over > * frame #0: 0x000000007e5c726e MnpDxe.dll >=20 > =E2=80=94=E2=80=94=E2=80=94 >=20 > (lldb) c > Process 1 resuming > Process 1 stopped > * thread #1, stop reason =3D signal SIGINT > frame #0: 0x000000007fe4d72e DxeCore.dll > -> 0x7fe4d72e: cmp al, 0x0 > 0x7fe4d730: je 0x7fe4d765 > 0x7fe4d736: mov rcx, qword ptr [rsp + 0x20] > 0x7fe4d73b: call 0x7fe4c4b0 > (lldb) bt > * thread #1, stop reason =3D signal SIGINT > * frame #0: 0x000000007fe4d72e DxeCore.dll >=20 > On macOS the Mach-O and dSYM have a UUID (dwarfdump -u) that is indexed = by Spotlight (mdfind "com_apple_xcode_dsym_uuids =3D=3D *") [2] > This should be the UUID in the debug directory entry and you can use tha= t to lookup the symbols like this: >=20 > module =3D target.AddModule (None, None, uuid) > SBError =3D target.SetModuleLoadAddress (module, LoadAddress + TeAdjust) >=20 > Also lldb has built in help for commands, but it is kind of terse since = it is autogenerated from the C++ swig. > (lldb) script help (lldb.target.AddModule) > Help on method AddModule in module lldb: >=20 > AddModule(self, *args) method of lldb.SBTarget instance > AddModule(SBTarget self, SBModule module) -> bool > AddModule(SBTarget self, char const * path, char const * triple, cha= r const * uuid) -> SBModule > AddModule(SBTarget self, char const * path, char const * triple, cha= r const * uuid_cstr, char const * symfile) -> SBModule > AddModule(SBTarget self, SBModuleSpec module_spec) -> SBModule >=20 >=20 > The minimum you need to symbolicate a frame is uuid, LoadAddress, and P= C. >=20 > [1] http://lldb.llvm.org/use/map.html > [2] http://lldb.llvm.org/use/symbols.html >=20 > Thanks for the links again. Yes, I am using some of these, and in fact f= or GDB that=E2=80=99s pretty much what I did when I worked with XCODE5. It = is very likely that when I get to complete LLDB support for XCODE5 it will = work quite fine too. But I am already happy with XCODE5 here, and making it= even better will only help myself, but not other people with e.g. Linux or= people that want me to use the same compiler with them. >=20 >=20 > Thanks for looking out for others. >=20 > Thanks, >=20 > Andrew Fish >=20 >=20 > Best regards, > Vitaly >=20 >=20 > 21 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0=B2 20:13, Andrew Fis= h > =D0=BD=D0=B0=D0=BF=D0=B8=D1=81= = =D0=B0=D0=BB(=D0=B0): >=20 >=20 >=20 >=20 > On Mar 21, 2020, at 3:28 AM, Vitaly Cheptsov > wrote: >=20 > Hello, >=20 > Andrey, thanks for the hint, it was very helpful. I rewrote the GDB scri= pts to work with LLDB[1] and was able to debug OVMF built with CLANGPDB. Wh= ile it is still quite dirty, at the very least it works. >=20 > Unfortunately the experience was close to terrible. I may certainly do s= omething wrong, but it is clear that PDB and LLDB do not support each other= well enough. After spending several hours on playing with the tools my con= clusion is that LLDB is simply not suited for UEFI PDB debugging, and we re= ally want DWARF as there is no other opensource debugger that supports PDB= on macOS and Linux >=20 > In case somebody knows workarounds here are the issues I faced: >=20 > 1. All integer alias typedefs are discarded in favour of underlying type= s. This way EFI_STATUS and EFI_TPL become unsigned long long, CHAR8 becomes= char, and CHAR16 becomes unsigned short. It does not look like LLDB has th= e original types anywhere at all, and it also does not have them registered= . >=20 > frame #0: 0x000000007fe242aa DxeCore.dll`CoreAllocatePoolPagesI(Pool= Type=3DEfiBootServicesData, NoPages=3D1, Granularity=3D4096, NeedGuard=3D'\= 0') at Pool.c:322 > 319 return NULL; > 320 } > 321 > -> 322 Buffer =3D CoreAllocatePoolPages (PoolType, NoPages, Gra= nularity, NeedGuard); > 323 CoreReleaseMemoryLock (); > 324 > 325 if (Buffer !=3D NULL) { > (lldb) p Status > (unsigned long long) $3 =3D 0 >=20 > Structures work more or less fine, but for simpler types like strings we= are out of even potential pretty-printing. >=20 >=20 > Vitaly, >=20 > You can teach lldb about types. There is some example code here: https:/= /github.com/tianocore/edk2/blob/master/EmulatorPkg/Unix/lldbefi.py >=20 >=20 > 2. Global variables are not accessible. I am not sure what happens, but = they either seem to not relocate or conflict with the other names: >=20 > (lldb) p gST > error: Couldn't materialize: couldn't get the value of variable ::gST: r= ead memory from 0x6e18 failed > error: errored out in DoExecute, couldn't PrepareToExecuteJITExpression > (lldb) p &gST > error: Couldn't materialize: couldn't get the value of variable ::gST: r= ead memory from 0x6e18 failed > error: errored out in DoExecute, couldn't PrepareToExecuteJITExpression >=20 >=20 > That is strange as globals usually work best? The common issue I've seen= is getting the slide wrong. The EFI modules are linked at a value near zer= o and relocated into memory, so the slide represents that adjustment. >=20 > You can use `image dump sections` and ` image dump symtab` to see lldb's= view of symbols. More info here [1]. >=20 >=20 > 3. Quite a number of crashes. >=20 > In most cases autocompletion by tab press causes a crash. E.g. >=20 > b I >=20 > So will do printing of a GUID, e.g. p gEfiGlobalVariableGuid. >=20 > This may have to do with Python compatibility as Xcode 11 LLDB that uses= Python 3 generally crashes more often than MacPorts LLDB 9.0. Surprisingly= structures work more or less fine. >=20 >=20 > You can tell lldb to use the older Python like this (from the Terminal.a= pp): > $ defaults write com.apple.dt.lldb DefaultPythonVersion 2 >=20 >=20 > 4. Ctrl+C does not produce a valid backtrace. When I break with a breakp= oint, I see a proper stacktrace with more than one entry, with function pro= totypes and values. When I break with Ctrl+C I only see some weird backtrac= e with most of the entries missing regardless of frame position: >=20 > (lldb) bt > * thread #1, stop reason =3D signal SIGTRAP > * frame #0: 0x000000007fe4c5f3 DxeCore.dll >=20 > Probably more and all the unintuitive stuff like the lack of more functi= onal TUI, but it is hard to remember all the trials. >=20 >=20 > For the macOS API clang emits frame pointers, so you can walk the stack = without symbols. You could try adding the compiler flag to emit the frame p= ointers. >=20 >=20 > [1] https://github.com/acidanthera/OpenCorePkg/blob/master/Debug/Scripts= /lldb_uefi.py >=20 >=20 > On macOS the Mach-O and dSYM have a UUID (dwarfdump -u) that is indexed = by Spotlight (mdfind "com_apple_xcode_dsym_uuids =3D=3D *") [2] > This should be the UUID in the debug directory entry and you can use tha= t to lookup the symbols like this: >=20 > module =3D target.AddModule (None, None, uuid) > SBError =3D target.SetModuleLoadAddress (module, LoadAddress + TeAdjust) >=20 > Also lldb has built in help for commands, but it is kind of terse since = it is autogenerated from the C++ swig. > (lldb) script help (lldb.target.AddModule) > Help on method AddModule in module lldb: >=20 > AddModule(self, *args) method of lldb.SBTarget instance > AddModule(SBTarget self, SBModule module) -> bool > AddModule(SBTarget self, char const * path, char const * triple, cha= r const * uuid) -> SBModule > AddModule(SBTarget self, char const * path, char const * triple, cha= r const * uuid_cstr, char const * symfile) -> SBModule > AddModule(SBTarget self, SBModuleSpec module_spec) -> SBModule >=20 >=20 > The minimum you need to symbolicate a frame is uuid, LoadAddress, and P= C. >=20 > [1] http://lldb.llvm.org/use/map.html > [2] http://lldb.llvm.org/use/symbols.html >=20 > Thanks, >=20 > Andrew Fish >=20 >=20 >=20 > Best wishes, > Vitaly >=20 > 20 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0=B2 22:14, Andrew Fis= h > =D0=BD=D0=B0=D0=BF=D0=B8=D1=81= = =D0=B0=D0=BB(=D0=B0): >=20 >=20 >=20 >=20 > On Mar 20, 2020, at 8:13 AM, Vitaly Cheptsov > wrote: >=20 > Hello, >=20 > We noticed that the original bugzilla, which intended to add new LLVM to= olchain support[1], also wanted to bring ELF format support with DWARF debu= gging information. For some reason this did not make its way into EDK II, a= nd we are currently wondering, how can one debug binaries built with LLVM 9= .0. >=20 >=20 > For macOS and XCODE5 toolchain we use GDB scripts based on Andrei Warken= tin=E2=80=99s work, which allow us to integrate with QEMU and VMware[2]. It= is likely that they should work with little to no work on Linux with CLANG= 38/GCC5 with GDB once again. However, CLANGPDB apparently is using PDB debu= gging information, which I believe is not handled with GDB. >=20 > Could you please provide the details on the matter and let us know about= the recommended route? > =E2=80=94 Is dropping CLANGELF just a temporary measure and it should be= resubmitted again? > =E2=80=94 Should LLDB, which seems to be aware of PDB, be used instead o= f GDB, when building with CLANGPDB? If so, did anybody try that? >=20 >=20 >=20 > Vitaly, >=20 > I've not tried the CLANGPDB path, but if you want to connect lldb to QEM= U you need to set plugin.process.gdb-remote.target-definition-file [1] to = [2]. >=20 > [1] lldb -o "settings set plugin.process.gdb-remote.target-definition-f= ile x86_64_target_definition.py" -o "gdb-remote 9000" > [2] https://github.com/llvm-mirror/lldb/blob/master/examples/python/x86_= 64_target_definition.py >=20 > Thanks, >=20 > Andrew Fish >=20 >=20 > Thanks! >=20 >=20 > Best regards, > Vitaly >=20 > [1] https://bugzilla.tianocore.org/show_bug.cgi?id=3D1603 > [2] https://github.com/acidanthera/OpenCorePkg/blob/master/Debug/Scripts= /gdb_uefi.py >=20 >=20 >=20 > >=20 >=20 --Apple-Mail=_20A622B7-7708-4A3C-BA59-ACC83EE9DCEB Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8 Liming,
The issue with CLANG38 is that it uses L= D BFD, a GNU linker, which is not distributed with LLVM. This makes CLANG38= to be unusable on e.g. macOS or other BSD systems, where GNU linker is not= used. Making CLANG38 somehow work with LLD (e.g. by somehow providing it a= n environment variable to use ld.lld) should most likely solve the issue, b= ut I am not positive how to address it best.

Best regards,
Vitaly

25 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0=B2 16:16, Gao, = Liming <liming.gao@in= tel.com> =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB(=D0=B0):
= Vitaly:
 Tha= nks for your further investigation with LLDB. Now, we have two CLANG tool c= hain. CLANGPDB and CLANG38. CLANGPDB works with LLVM9.0 or above to generat= e PE image with PDB debug symbol. CLANG38 can also be used to generate ELF = image and convert to PE image with DWARF debug symbol on Linux host. So, th= ese two chains cover both usage models. We don=E2=80=99t need to introduce = new CLANGDWARF tool chain. For LLDB issue on PDB debug symbol, I suggest to= report them in LLVM. 
=  
 Besides, LLVM10.0 is= just released.
=  
Thanks
Liming
F= rom:&nbs= p;devel@edk2.groups.io <devel@ed= k2.groups.io> On Behalf Of Vitaly Cheptsov
Sent: 2020
=E5=B9=B43=E6=9C=8823=E6=97=A5 17:10
To: Andrew Fish &l= t;afish@apple.com>; Gao, Liming <liming.gao@intel.com>
C= c: devel@edk2.groups.io; Marvin H=C3=A4user <mhaeuser@outlook.de>
Subject: Re: [edk2-devel] CLANG= PDB binary debugging
 <= /div>
Andrew,=
 
I investigated further and was ab= le to make some progress. I got rid of PDB, and changed debug information g= eneration to DWARF[1]. This resolved most of LLDB crashes and made pretty-p= rinting work just fine as type aliases like EFI_STATUS now work correctly (= I am still to commit this). Unfortunately there are several downsides. Dead= code stripping in LLD linker is broken when generating PE with DWARF, so I= had to patch it[2]. Debug link implementation in llvm-objcopy is also quit= e ugly, we do not get MTOC or anything alike[3], just some section with a r= andom name containing base filename.
 
I can submit a more proper patch to EDK II proper= ly implementing CLANGDWARF toolchain instead of patching CLANGPDB like in [= 1], but it is questionable whether it is worth it. LLVM 10 will land very s= oon, and the necessary LLD patches[2] will definitely not make their way in= this release. We will have to wait for LLVM 11 at the very least, and I am= not sure I am ready to drive llvm-objcopy changes either. Liming, what do = you think?
 <= /div>
I've not used the fake image to get things done so I can't speak = to that. I have used a fake target so I could have XIP PEIM and shadowed PE= IM address available at the same time. You can't have a module loaded at 2 = addresses at the same time in llldb. But you might be able to use a fake ta= rget for your fake stuff?
 = ;
Just in case:
&nb= sp;
=           # create= a faka target to store info about symbols
&nbs= p;         PeiXipTarget =3D target.debugger.CreateTarge= t (None, "i386-apple-macosx", "remote-macosx", True, error)=
 
       =   # make sure the gdb-remote  connection target is the active ta= rget
          target.= debugger.SetSelectedTarget (target)
 
Yes, that was actually a smart idea. I initially= did it that way, as I had mixing Mach-O and PE triples, but later removed,= which was actually a mistake. Now I have a fake target for GdbSyms and a p= roper target for other images[4]. This somewhat solves the issue with inval= id addresses for gST, as gST from DxeCore is now picked. However, I cannot = access global variables from other modules for some reason still.
 
If yo= u want to inspect globals I think this logic works to get you data, you wou= ld need to print it out etc. 
=
 
SBValueList =3D lldb.target.FindGlobalVariables (= "gST", 1024)
for SBValue in SBValueList:
Module =3D SBValue.GetAddress().GetModule() 
        ModuleStr =3D SBValu= e.GetAddress().GetModule().GetFileSpec().GetFilename()
        Start =3D int (SBValue.GetLocation(), 0= )
        End =3D Start + S= BValue.GetByteSize() - 1
      =   SBDeclaration =3D SBValue.GetDeclaration()
&nbs= p;       Column =3D SBDeclaration= .GetColumn()
 
I wrote a command in the early da= ys to dump out all the instances of a global. 
 
You can also try (lldb) image loo= kup -Av --name gST
 
Something is really weird, gST from the first ima= ge shows, but lldb believes that it does not exist. lldb.target.FindGlobalVariables ("gST", 1024) also returns an emp= ty list.
 
I noticed that LLDB shows invalid type for gST in the symtab, there = also is no address. I started to wonder whether this is the cause and decid= ed to check XCODE5, as the the issue could have been with PE format. Unfort= unately even after I tried XCODE5 support = with LLDB, I got exactly the same problem. I am quite clueless what is goin= g on. Below I included two transcripts: for CLANGDWARF and XCODE5.
=  
(lldb)&n= bsp;p gST
(EFI_SYSTEM_TABLE *) $0 =3D 0x000000007f9ee018
(lldb) p *gST
(EFI_SYSTEM_TABLE)= $1 =3D {
  Hdr =3D (Signature =3D 0x54535953204942= 49, Revision =3D 0x00020046, HeaderSize =3D 0x00000078, CRC32 =3D 0x3d5e9b5= d, Reserved =3D 0x00000000)
  FirmwareVendor =3D 0x= 000000007f9e9c98
  FirmwareRevision =3D 0x00010000<= br class=3D"">  ConsoleInHandle =3D 0x000000007ed58f18
  ConIn =3D 0x000000007e6edcb8
  C= onsoleOutHandle =3D 0x000000007ed57018
  ConOut =3D= 0x000000007e6ede40
  StandardErrorHandle =3D 0x000= 000007ed57a98
  StdErr =3D 0x000000007e6ee030
  RuntimeServices =3D 0x000000007f9eeb98
&= nbsp; BootServices =3D 0x000000007fe689e8
  Nu= mberOfTableEntries =3D 0x000000000000000a
  Configu= rationTable =3D 0x000000007f9eec98
}
(lldb)&nbs= p;image lookup -Av --name gST
(lldb) image dump sections=
Dumping sections for 90 modules.
Sections for = '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_CLANGPDB/X64/DxeCo= re.debug' (x86_64):
  SectID    &nbs= p;Type             Load Address&nbs= p;                    &nb= sp;       Perm File Off.  File Size &nbs= p;Flags      Section Name
  ---= ------- ---------------- ---------------------------------------  = ;---- ---------- ---------- ---------- ----------------------------
  0xffffffffffffffff container       &= nbsp;[0x000000007fe1b000-0x000000007ff38ac0)  ---  0x00= 000000 0x00000000 0x00000000 DxeCore.debug.
  0x000= 00001 code             [0x000000007= fe1b320-0x000000007fe61f34)  ---  0x00000320 0x00046c20= 0x60000020 DxeCore.debug...text
  0x00000002 data&= nbsp;            [0x000000007fe61f40-0x0= 00000007fe680f1)  ---  0x00046f40 0x000061c0 0x40000040= DxeCore.debug...rdata
  0x00000003 data  = ;           [0x000000007fe68100-0x000000007fe= 6d1e0)  ---  0x0004d100 0x000018a0 0xc0000040 DxeCore.d= ebug...data
  0x00000004 regular     = ;     [0x000000007fe6d1e0-0x000000007fe6d424)  ---=   0x0004e9a0 0x00000260 0x42000040 DxeCore.debug...reloc
  0x00000005 dwarf-abbrev     [0x00000= 0007fe6d440-0x000000007fe74059)  ---  0x0004ec00 0x0000= 6c20 0x42000040 DxeCore.debug...debug_abbrev
  0x00= 000006 dwarf-info       [0x000000007fe74060-0x0000= 00007fec1355)  ---  0x00055820 0x0004d300 0x42000040 Dx= eCore.debug...debug_info
  0x00000007 dwarf-line&nb= sp;      [0x000000007fec1360-0x000000007fef9fd4) &= nbsp;---  0x000a2b20 0x00038c80 0x42000040 DxeCore.debug...debug_= line
  0x00000008 dwarf-macinfo    [= 0x000000007fef9fe0-0x000000007fefa056)  ---  0x000db7a0= 0x00000080 0x42000040 DxeCore.debug...debug_macinfo
 &n= bsp;0x00000009 dwarf-ranges     [0x000000007fefa060-0x0= 00000007feff610)  ---  0x000db820 0x000055c0 0x42000040= DxeCore.debug...debug_ranges
  0x0000000a dwarf-st= r        [0x000000007feff620-0x000000007ff38abd)&n= bsp; ---  0x000e0de0 0x000394a0 0x42000040 DxeCore.debug...d= ebug_str
Sections for '/Users/user/Documents/UefiWorkspace/Bu= ild/OvmfX64/NOOPT_CLANGPDB/X64/DevicePathDxe.debug' (x86_64):
  SectID     Type       =       Load Address         &nb= sp;                   Per= m File Off.  File Size  Flags      = Section Name
  ---------- ---------------- --------= -------------------------------  ---- ---------- ---------- -----= ----- ----------------------------
  0xffffffffffff= ffff container        [0x000000007f986000-0x000000= 007f9cb0a0)  ---  0x00000000 0x00000000 0x00000000 Devi= cePathDxe.debug.
  0x00000001 code   &nbs= p;         [0x000000007f986320-0x000000007f996dc6)=   ---  0x00000320 0x00010ac0 0x60000020 DevicePathDxe.d= ebug...text
  0x00000002 data     &n= bsp;       [0x000000007f996de0-0x000000007f999b75) = ; ---  0x00010de0 0x00002da0 0x40000040 DevicePathDxe.debug.= ..rdata
  0x00000003 data      =       [0x000000007f999b80-0x000000007f99a202) &nb= sp;---  0x00013b80 0x00000660 0xc0000040 DevicePathDxe.debug...da= ta
  0x00000004 regular        =   [0x000000007f99a220-0x000000007f99a464)  --- &nb= sp;0x000141e0 0x00000260 0x42000040 DevicePathDxe.debug...reloc
  0x00000005 dwarf-abbrev     [0x000000007= f99a480-0x000000007f99bd09)  ---  0x00014440 0x000018a0= 0x42000040 DevicePathDxe.debug...debug_abbrev
  0x= 00000006 dwarf-info       [0x000000007f99bd20-0x00= 0000007f9ad8b7)  ---  0x00015ce0 0x00011ba0 0x42000040 = DevicePathDxe.debug...debug_info
  0x00000007 dwarf= -line       [0x000000007f9ad8c0-0x000000007f9bc1f7= )  ---  0x00027880 0x0000e940 0x42000040 DevicePathDxe.= debug...debug_line
  0x00000008 dwarf-macinfo =   [0x000000007f9bc200-0x000000007f9bc223)  --- &n= bsp;0x000361c0 0x00000040 0x42000040 DevicePathDxe.debug...debug_macinfo  0x00000009 dwarf-ranges     [0x= 000000007f9bc240-0x000000007f9be020)  ---  0x00036200 0= x00001de0 0x42000040 DevicePathDxe.debug...debug_ranges
 = ; 0x0000000a dwarf-str        [0x000000007f9b= e020-0x000000007f9cb099)  ---  0x00037fe0 0x0000d080 0x= 42000040 DevicePathDxe.debug...debug_str
=
=E2=80= = =A6
(lldb) image dump symtab
Dumping symbol table for 90 modules.
Symtab, file =3D /User= s/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_CLANGPDB/X64/DxeCore.deb= ug, num_symbols =3D 4343:
          =      Debug symbol
        =        |Synthetic symbol
    &n= bsp;          ||Externally Visible
&= nbsp;              |||
Ind= ex   UserID DSX Type           = ; File Address/Value Load Address       Size&= nbsp;              Flags  &nbs= p;   Name
------- ------ --- --------------- ------= ------------ ------------------ ------------------ ---------- -------------= ---------------------
[    0] 4294967295 =     Invalid         0x00000000= 00000000 0x000000007fe1b000 0x000000000000003a 0x00000000 .text
[    1] 4294967295     Invalid &= nbsp;       0x0000000000000000      &nbs= p;             0x0000000000000000 0x0000= 0000 .data
[    2] 4294967295   &nbs= p; Invalid         0x0000000000001898&nb= sp;                   0x0= 000000000000000 0x00000000 .bss
[    3] 429496= 7295     Invalid         = 0x0000000000046bc0 0x000000007fe61bc0 0x0000000000000374 0x00000000 .text$_= ModuleEntryPoint
[    4] 4294967295  = ;   Code            0x00000000= 00046bc0 0x000000007fe61bc0 0x0000000000000374 0x00000000 _ModuleEntryPoint=
[    5] 4294967295     In= valid         0x0000000000001b08   =                 0x00000000000= 00000 0x00000000 .bss$gHobList
[    6] 4294967= 295     Invalid         0= x0000000000001b08                &n= bsp;   0x0000000000000000 0x00000000 gHobList
[&nbs= p;   7] 4294967295     Invalid   &n= bsp;     0x0000000000000000         = ;           0x0000000000000000 0x00000000 .rd= ata
[    8] 4294967295     = ;Invalid         0x0000000000000000  &nb= sp;                 0x00000000= 00000000 0x00000000 .str
[    9] 4294967295&nb= sp;    Invalid         0x00000= 00000000058                  &= nbsp; 0x0000000000000000 0x00000000 .rdata
[  =  10] 4294967295     Invalid     &nb= sp;   0x0000000000000058           =         0x0000000000000000 0x00000000 .str.1
[   11] 4294967295     Invalid=          0x0000000000000000    &nbs= p;               0x0000000000000000= 0x00000000 .debug_str
[   12] 4294967295 = ;    Invalid         0x0000000= 000000000                  &nb= sp; 0x0000000000000000 0x00000000 .debug_abbrev
[ &= nbsp; 13] 4294967295     Invalid    = ;     0x0000000000000000          &= nbsp;         0x0000000000000000 0x00000000 .debug= _info
[   14] 4294967295    &nb= sp;Invalid         0x0000000000000000  &= nbsp;                 0x000000= 0000000000 0x00000000 .debug_ranges
[   15] 42= 94967295     Invalid        &n= bsp;0x0000000000000000              &nbs= p;     0x0000000000000000 0x00000000 .debug_macinfo
[   16] 4294967295     Invalid&nb= sp;        0x0000000000000000      =               0x0000000000000000 0x= 00000000 .debug_line
[   17] 4294967295 &= nbsp;   Code            0x0000= 00000003f680 0x000000007fe5a680 0x0000000000000020 0x00000000 ProcessModule= EntryPointList
[   18] 4294967295   =   Code            0x0000000000= 023130 0x000000007fe3e130 0x0000000000000020 0x00000000 DebugAssertEnabled<= br class=3D"">[   19] 4294967295     Cod= e            0x0000000000023060 0x000000= 007fe3e060 0x00000000000000d0 0x00000000 DebugAssert
[ &= nbsp; 20] 4294967295     Code      =       0x0000000000022150 0x000000007fe3d150 0x000000000= 0000020 0x00000000 CpuDeadLoop
[   21] 4294967= 295     Invalid         0= x0000000000000000 0x000000007fe1b000 0x000000000000003a 0x00000000 .text[   22] 4294967295     Inval= id         0x0000000000000000    &n= bsp;               0x00000000000000= 00 0x00000000 .data
[   23] 4294967295 &n= bsp;   Invalid         0x0000000000= 001898                   =  0x0000000000000000 0x00000000 .bss
[   2= 4] 4294967295     Invalid       &nb= sp; 0x000000000003f240 0x000000007fe5a240 0x0000000000000440 0x0000000= 0 .text$ProcessLibraryConstructorList
[   25] = 4294967295     Code          &= nbsp; 0x000000000003f240 0x000000007fe5a240 0x0000000000000440 0x00000= 000 ProcessLibraryConstructorList
[   26] 4294= 967295     Invalid        &nbs= p;0x000000000003f680 0x000000007fe5a680 0x0000000000000020 0x00000000 .text= $ProcessModuleEntryPointList
[   27] 429496729= 5     Invalid         0x0= 000000000000070                &nbs= p;   0x0000000000000000 0x00000000 .data$gEfiCallerIdGuid
[   28] 4294967295     Invalid&nb= sp;        0x0000000000000070      =               0x0000000000000000 0x= 00000000 gEfiCallerIdGuid
[   29] 4294967295&n= bsp;    Invalid         0x0000= 000000000148                  =   0x0000000000000000 0x00000000 .data$gEfiEventMemoryMapChangeGui= d
[   30] 4294967295     I= nvalid         0x0000000000000148   = ;                 0x0000000000= 000000 0x00000000 gEfiEventMemoryMapChangeGuid
[  &= nbsp;31] 4294967295     Invalid     &nbs= p;   0x0000000000000168            =         0x0000000000000000 0x00000000 .data$gEfiEv= entVirtualAddressChangeGuid
[   32] 4294967295=      Invalid         0x00= 00000000000168                 = ;   0x0000000000000000 0x00000000 gEfiEventVirtualAddressChangeGu= id
[   33] 4294967295     = Invalid         0x0000000000000138  &nbs= p;                 0x000000000= 0000000 0x00000000 .data$gEfiEventExitBootServicesGuid
[ = ;  34] 4294967295     Invalid   &nb= sp;     0x0000000000000138         =           0x0000000000000000 0x00000000 gEfi= EventExitBootServicesGuid
=E2=80=A6.
[  303] 4294967295     Invalid &n= bsp;       0x0000000000001b60       = ;             0x0000000000000000 0x00000= 000 .bss$gST
[  304] 4294967295    &= nbsp;Invalid         0x0000000000001b60 =                   0x0000= 000000000000 0x00000000 gST
[  305] 4294967295 = ;    Invalid         0x0000000= 0000018a0                  &nb= sp; 0x0000000000000000 0x00000000 .bss$gBS
[  = 306] 4294967295     Invalid       &= nbsp; 0x00000000000018a0            &nbs= p;       0x0000000000000000 0x00000000 gBS
=E2=80=A6
 =
= = =E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94= =E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94
 
(lldb) p gST=
(EFI_SYSTEM_TABLE *) $2 =3D 0x000000007fbee018
(lldb) p &gST
(EFI_SYSTEM_= TABLE **) $4 =3D 0x000000007fe6d788
(lldb) p *gST
(EFI_SYSTEM_TABLE) $3 =3D {<= br class=3D"">  Hdr =3D (Signature =3D 0x5453595320494249, Revisi= on =3D 0x00020046, HeaderSize =3D 0x00000078, CRC32 =3D 0x5355dbe2, Reserve= d =3D 0x00000000)
  FirmwareVendor =3D 0x000000007f= be9c98
  FirmwareRevision =3D 0x00010000
  ConsoleInHandle =3D 0x000000007ede5a98
&nb= sp; ConIn =3D 0x000000007e95f640
  ConsoleOutH= andle =3D 0x000000007ede4e98
  ConOut =3D 0x0000000= 07e95f800
  StandardErrorHandle =3D 0x000000007ede4= b98
  StdErr =3D 0x000000007e95f910
&= nbsp; RuntimeServices =3D 0x000000007fbeeb98
  = ;BootServices =3D 0x000000007fe6cde8
  NumberOfTabl= eEntries =3D 0x0000000000000009
  ConfigurationTabl= e =3D 0x000000007fbeec98
}
(lldb) image lo= okup -Av --name gST
(lldb) image dump sections
Dumping sections for 88 modules.
Sections for '/Users/= user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_XCODE5/X64/MdeModulePkg/Co= re/Dxe/DxeMain/DEBUG/DxeCore.dll' (x86_64):
  SectI= D     Type           &nbs= p; Load Address               =               Perm File Off. &= nbsp;File Size  Flags      Section Name
  ---------- ---------------- --------------------------= -------------  ---- ---------- ---------- ---------- ------------= ----------------
  0x00000100 container   = ;     [0x000000007fe26240-0x000000007fe6bb40)  r-x=   0x000004a0 0x00045900 0x00000000 DxeCore.dll.__TEXT
  0x00000001 code           &nbs= p; [0x000000007fe26240-0x000000007fe65bd8)  r-x  0= x000004a0 0x0003f998 0x80000400 DxeCore.dll.__TEXT.__text
&nb= sp; 0x00000002 data-cstr        [0x000000007f= e65bd8-0x000000007fe6ba23)  r-x  0x0003fe38 0x00005e4b = 0x00000002 DxeCore.dll.__TEXT.__cstring
  0x0000000= 3 regular          [0x000000007fe6ba24-0x0000= 00007fe6ba6c)  r-x  0x00045c84 0x00000048 0x00000000 Dx= eCore.dll.__TEXT.__ustring
  0x00000004 regular&nbs= p;         [0x000000007fe6ba70-0x000000007fe6bb40)=   r-x  0x00045cd0 0x000000d0 0x00000000 DxeCore.dll.__T= EXT.__const
  0x00000200 container    &nb= sp;   [0x000000007fe6bb40-0x000000007fe70e60)  rw- = ; 0x00045da0 0x00001ae0 0x00000000 DxeCore.dll.__DATA
&n= bsp; 0x00000005 regular          [0x0000= 00007fe6bb40-0x000000007fe6bd58)  rw-  0x00045da0 0x000= 00218 0x00000000 DxeCore.dll.__DATA.__const
  0x000= 00006 data             [0x000000007= fe6bd60-0x000000007fe6d610)  rw-  0x00045fc0 0x000018b0= 0x00000000 DxeCore.dll.__DATA.__data
  0x00000007 = zero-fill        [0x000000007fe6d610-0x000000007fe= 70e20)  rw-  0x00000000 0x00000000 0x00000001 DxeCore.d= ll.__DATA.__common
  0x00000008 zero-fill  &nb= sp;     [0x000000007fe70e20-0x000000007fe70e58)  r= w-  0x00000000 0x00000000 0x00000001 DxeCore.dll.__DATA.__bss
  0x00000100 container        = ;[0x000000000004b000-0x00000000000ef000)* rw-  0x00001000 0x000a3= a74 0x00000000 DxeCore.dll.__DWARF
  0x00000001 dwa= rf-line       [0x000000000004b000-0x00000000000723= fb)* rw-  0x00001000 0x000273fb 0x00000000 DxeCore.dll.__DWARF.__= debug_line
  0x00000002 dwarf-pubnames  &= nbsp;[0x00000000000723fb-0x0000000000078429)* rw-  0x000283fb 0x0= 000602e 0x00000000 DxeCore.dll.__DWARF.__debug_pubnames
 = ; 0x00000003 dwarf-pubtypes   [0x0000000000078429-0x000= 000000008b915)* rw-  0x0002e429 0x000134ec 0x00000000 DxeCore.dll= .__DWARF.__debug_pubtypes
  0x00000004 dwarf-arange= s    [0x000000000008b915-0x000000000008ea65)* rw-  = ;0x00041915 0x00003150 0x00000000 DxeCore.dll.__DWARF.__debug_aranges
  0x00000005 dwarf-info       [= 0x000000000008ea65-0x00000000000c78bf)* rw-  0x00044a65 0x00038e5= a 0x00000000 DxeCore.dll.__DWARF.__debug_info
  0x0= 0000006 dwarf-frame      [0x00000000000c78bf-0x00000000= 000cc697)* rw-  0x0007d8bf 0x00004dd8 0x00000000 DxeCore.dll.__DW= ARF.__debug_frame
  0x00000007 dwarf-ranges &n= bsp;   [0x00000000000cc697-0x00000000000cc757)* rw-  0x= 00082697 0x000000c0 0x00000000 DxeCore.dll.__DWARF.__debug_ranges
  0x00000008 dwarf-abbrev     [0x00000= 000000cc757-0x00000000000cca9b)* rw-  0x00082757 0x00000344 0x000= 00000 DxeCore.dll.__DWARF.__debug_abbrev
  0x000000= 09 dwarf-str        [0x00000000000cca9b-0x00000000= 000dcc05)* rw-  0x00082a9b 0x0001016a 0x00000000 DxeCore.dll.__DW= ARF.__debug_str
  0x0000000a apple-names  &nbs= p;   [0x00000000000dcc05-0x00000000000e2439)* rw-  0x00= 092c05 0x00005834 0x00000000 DxeCore.dll.__DWARF.__apple_names
  0x0000000b apple-namespaces [0x00000000000e2439-0x00000000000= e245d)* rw-  0x00098439 0x00000024 0x00000000 DxeCore.dll.__DWARF= .__apple_namespac
  0x0000000c apple-types  &n= bsp;   [0x00000000000e245d-0x00000000000eea50)* rw-  0x= 0009845d 0x0000c5f3 0x00000000 DxeCore.dll.__DWARF.__apple_types
  0x0000000d apple-objc       [0x= 00000000000eea50-0x00000000000eea74)* rw-  0x000a4a50 0x00000024 = 0x00000000 DxeCore.dll.__DWARF.__apple_objc
Sections for '/Us= ers/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_XCODE5/X64/MdeModulePk= g/Universal/DevicePathDxe/DevicePathDxe/DEBUG/DevicePathDxe.dll' (x86_64):<= o:p class=3D"">
=E2=80=A6
(lldb)&nb= sp;image dump symtab
Dumping symbol table for 88 modules.
Symtab, file =3D /Users/user/Documents/UefiWorkspace/Build/OvmfX= 64/NOOPT_XCODE5/X64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll, num_sy= mbols =3D 1203:
            &nb= sp;  Debug symbol
          &nb= sp;    |Synthetic symbol
       = ;        ||Externally Visible
  &nbs= p;            |||
Index &n= bsp; UserID DSX Type            Fil= e Address/Value Load Address       Size  = ;             Flags     &= nbsp;Name
------- ------ --- --------------- ----------------= -- ------------------ ------------------ ---------- -----------------------= -----------
[    0]    118 D&nb= sp;  SourceFile      0x0000000000000000 =                   Siblin= g -> [   20] 0x00640000 /Users/user/Documents/UefiPa= ckages/MdeModulePkg/Core/Dxe/SectionExtraction/CoreSectionExtraction.c
[    1]    120 D   O= bjectFile      0x000000005e78588d      &= nbsp;             0x0000000000000000 0x0= 0660001 /Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_XCODE5= /X64/MdeModulePkg/Core/Dxe/DxeMain/OUTPUT/DxeCore.lib(CoreSectionExtraction= .obj)
[    2]    122 D X Code&n= bsp;           0x0000000000000240 0x000000007= fe26240 0x0000000000000260 0x000f0000 CustomGuidedSectionExtract
[    3]    126 D X Code    &= nbsp;       0x00000000000004a0 0x000000007fe264a0 0x000= 0000000000110 0x000f0000 InitializeSectionExtraction
[  =   4]    130 D X Code        &n= bsp;   0x00000000000005b0 0x000000007fe265b0 0x0000000000000140 0= x000f0000 IsValidSectionStream
[    5]  &= nbsp; 134 D X Code            0x000= 00000000006f0 0x000000007fe266f0 0x0000000000000180 0x000f0000 OpenSectionS= treamEx
[    6]    138 D X Code=             0x0000000000000870 0x0000000= 07fe26870 0x0000000000000070 0x000f0000 OpenSectionStream
[&n= bsp;   7]    142 D X Code      &nbs= p;     0x00000000000008e0 0x000000007fe268e0 0x0000000000000= 100 0x000f0000 ChildIsType
=E2=80=A6
[  831]   2470 D X Code     =       0x00000000000306b0 0x000000007fe566b0 0x00000000= 000000f4 0x000f0000 UefiBootServicesTableLibConstructor
[&nbs= p; 832]   2473 D X Data        &nbs= p;   0x0000000000047780 0x000000007fe6d780 0x0000000000000008 0x0= 00f0000 gImageHandle
[  833]   2474 = D X Data            0x0000000000047788 0= x000000007fe6d788 0x0000000000000008 0x000f0000 gST
[ &n= bsp;834]   2475 D X Data          &= nbsp; 0x0000000000047790 0x000000007fe6d790 0x0000000000000008 0x000f0= 000 gBS
=E2=80=A6
 
This is easy enough to chec= k as %rpb is the frame pointer so it will get saved/restored on function en= try/exit. 
 
Actually it is fine. I happened to break in the interrupt routine, which w= as not mapped for a particular image. After I stepped a little, it soon rea= ched the debug symbols:
 = ;
(lldb) bt all
* thread #1, stop reason =3D= instruction step over
  * frame #0: 0x000000007fe4= 9f3c DxeCore.dll`CoreRestoreTpl(NewTpl=3D0x0000000000000008) at Tpl.c:102:1= 2
    frame #1: 0x000000007e518c95
  thread #2
    frame #0: 0x00000= 0007fb3ff88 CpuDxe.dll`CpuSleep + 1
    frame = #1: 0x000000007fb4d719 CpuDxe.dll`ApWakeupFunction(ExchangeInfo=3D0x0000000= 000087198, ApIndex=3D0x0000000000000001) at MpLib.c:768:9
&nb= sp;   frame #2: 0x000000007fb2d151
  thre= ad #3
    frame #0: 0x000000007fb3ff88 CpuDxe.= dll`CpuSleep + 1
    frame #1: 0x000000007fb4d= 719 CpuDxe.dll`ApWakeupFunction(ExchangeInfo=3D0x0000000000087198, ApIndex= =3D0x0000000000000002) at MpLib.c:768:9
    f= rame #2: 0x000000007fb2d151
  thread #4
    frame #0: 0x000000007fb3ff88 CpuDxe.dll`CpuSleep + 1<= br class=3D"">    frame #1: 0x000000007fb4d719 CpuDxe.dll`Ap= WakeupFunction(ExchangeInfo=3D0x0000000000087198, ApIndex=3D0x0000000000000= 003) at MpLib.c:768:9
    frame #2: 0x00000000= 7fb2d151
 <= /div>
B= est wishes,
Vitaly=
=  


=
22 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., =D0=B2 00= :06, Andrew Fish <afish@apple.com> =D0=BD= =D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB(=D0=B0):=
=  



=
On Mar 21, 2020, at 11:36 AM, Vitaly C= heptsov <cheptsov@ispras.ru> wrote:
 
Andrew,
 
=
Thanks once again, but un= fortunately it is not that simple. Below I answered inline explaining = the particular issues, which mostly seem to be specific to CLANGPDB. LLVM stack emits PDB debug= files, and even though LLDB does support them to some level, it is unlikel= y that this will be working well enough soon. We should really stick to mor= e or less native debug formats, ideally those that have proper open specifi= cations, on all platforms, and for Unix that=E2=80=99s DWARF.
 
 
Vitaly,
 
I understand and I use the Xcode clang a= nd not the CLANGPDB, but I use lldb a lot I was just trying to point out wh= at works with Xcode. 
 


I am pretty sure LLVM can be= taught to emit DWARF debug information even for PE files. Perhaps we can e= ither make some option or provide a separate toolchain for this? Another wa= y would be recovering CLANGELF as originally suggested.
 
 
= There was a bug recently in the  x86_64-pc-win32-macho triple and= we had to add -gdwarf to force it emit dwarf. Not sure what that comp= iler flag would do to CLANGPDB but it is worth a try? Last flag wins for th= e compiler. 
<= div style=3D"margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: SimSun= ;" class=3D""> 
<= /div>


You can teach lldb= about types. There is some example code here: https://github.com/tianoc= ore/edk2/blob/master/EmulatorPkg/Unix/lldbefi.py<= /span>
 
This code works just fine with LLDB and DWARF (e.g. XCODE5), t= hough I have not yet completed these changes for my scripts for LLDB, only = for GDB. However, with CLANGPDB generated files it is not functional. The r= eason for this is because LLDB is unaware of the underlying type, i.e. it d= oes not know what is EFI_STATUS or UINT32. I can implement pretty-printing = when LLDB knows about a typedef, but it is not possible to do this when the= debug information is already gone or not parsed:
 
(lldb) p Status
(unsigned long long) $1 =3D 0(lldb) p &Status
(unsigned long long *) $2 = =3D 0x000000007fe19ad8
(lldb) p (EFI_STATUS)Status
error: use of undeclared identifier 'EFI_STATUS'
 
=
Just in case I tried using exactly your c= ode, and other stuff like source level debugging works just fine and symbol= ication works fine, so it should be some bug with PDB in particular.


=
That i= s strange as globals usually work best? The common issue I've seen is getti= ng the slide wrong. The EFI modules are linked at a value near zero and rel= ocated into memory, so the slide represents that adjustment. 
 
You can use `image dump sections` and `&nbs= p;image dump symtab` to see lldb's view of symbols. More info here [1].&nbs= p;
 
Yes, this one is a bit complicated, on= ce again due to PDB most likely. It knows about global symbols, but does no= t list them in symtab:
 
(lldb) = image dump symtab
Dumping symbol table for 91 modules.
Symtab, file =3D GdbSyms/Bin/X64_CLANGPDB/GdbSyms.dll, num_symbols = = =3D 0
Symtab, file =3D /Users/user/Documents/UefiWorkspace/B= uild/OvmfX64/NOOPT_CLANGPDB/X64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore= .dll, num_symbols =3D 0
Symtab, file =3D /Users/user/Document= s/UefiWorkspace/Build/OvmfX64/NOOPT_CLANGPDB/X64/MdeModulePkg/Universal/Dev= icePathDxe/DevicePathDxe/DEBUG/DevicePathDxe.dll, num_symbols =3D 0
=E2=80=A6
 
The slides are cor= rect, but there are two nuances that collide with it.=
 
1. There are multiple instances of the globals with the sam= e name (e.g. gBS), but for some reason LLDB always tries to print the globa= ls from the first module. This happens even when I am source-level debuggin= g, and I see a gBS symbol from another module (e.g. DxeCore) used right at = the same line. With GDB the closest symbol is used, but with LLDB it is alw= ays coming from the first module. I tried checking expr help to find whethe= r I can pass it a module explicitly, but also failed.=
 
 
Usually what= happens with lldb is you get the global that is in scope for the current f= rame. 


2.  To be able to get EFI types to locate = the EFI_SYSTEM_TABLE_POINTER I add a dummy GdbSyms image, which is not load= ed to the firmware. So basically I cannot slide what is not in the memory, = and this is also my first image. I tried deleting it anyhow, but it failed = for me.
 
 
I've not used the fake image to get things done so I ca= n't speak to that. I have used a fake target so I could have XIP PEIM and s= hadowed PEIM address available at the same time. You can't have a module lo= aded at 2 addresses at the same time in llldb. But you might be able to use= a fake target for your fake stuff?
 
Ju= st in case:
 
<= div class=3D"">
  &nb= sp;       # create a faka target to store info about symbols=
          PeiXipTarget =3D target.= debugger.CreateTarget (None, "i386-apple-macosx", "remote-macosx", True, er= ror)
 
         = ; # make sure the gdb-remote  connection target is the active target
          target.debugger.SetSelecte= dTarget (target)
 


(lldb) im= age dump sections
<= div style=3D"margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: SimSun= ;" class=3D"">Dumping sections for 91 modules.
Sections for 'GdbSyms/Bin/X64_CLANGPDB/GdbSyms.dll' (x86_64):
  SectID     Type     =         Load Address       &nb= sp;                    &n= bsp;Perm File Off.  File Size  Flags     = ; Section Name
  ---------- ---------------- -= --------------------------------------  ---- ---------- ---------= - ---------- ----------------------------
  0xfffff= fffffffffff container        [0x0000000000000000-0= x0000000000006ec0)* ---  0x00000000 0x00000000 0x00000000 GdbSyms= .dll.
  0x00000001 code       &= nbsp;     [0x0000000000000220-0x0000000000005bd6)* --- =  0x00000220 0x000059c0 0x60000020 GdbSyms.dll...text
&nb= sp; 0x00000002 data            &nbs= p;[0x0000000000005be0-0x0000000000006d79)* ---  0x00005be0 0x0000= 11a0 0x40000040 GdbSyms.dll...rdata
  0x00000003 da= ta             [0x0000000000006d80-= 0x0000000000006e30)* ---  0x00006d80 0x00000060 0xc0000040 GdbSym= s.dll...data
  0x00000004 regular    &nbs= p;     [0x0000000000006e40-0x0000000000006ea4)* --- &nb= sp;0x00006de0 0x00000080 0x42000040 GdbSyms.dll...reloc
Secti= ons for '/Users/user/Documents/UefiWorkspace/Build/OvmfX64/NOOPT_CLANGPDB/X= 64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll' (x86_64):
  SectID     Type       =       Load Address         &nb= sp;                   Per= m File Off.  File Size  Flags      = Section Name
  ---------- ---------------- --------= -------------------------------  ---- ---------- ---------- -----= ----- ----------------------------
  0xffffffffffff= ffff container        [0x0000000000000000-0x000000= 00000523a0)* ---  0x00000000 0x00000000 0x00000000 DxeCore.dll.  0x00000001 code         &= nbsp;   [0x000000007fe1b220-0x000000007fe61e34)  ---&nb= sp; 0x00000220 0x00046c20 0x60000020 DxeCore.dll...text
=   0x00000002 data            &= nbsp;[0x000000007fe61e40-0x000000007fe68065)  ---  0x00= 046e40 0x00006240 0x40000040 DxeCore.dll...rdata
  = 0x00000003 data             [0x0000= 00007fe68080-0x000000007fe6d160)  ---  0x0004d080 0x000= 018a0 0xc0000040 DxeCore.dll...data
  0x00000004 re= gular          [0x000000007fe6d160-0x00000000= 7fe6d398)  ---  0x0004e920 0x00000240 0x42000040 DxeCor= e.dll...reloc
Sections for '/Users/user/Documents/UefiWorkspa= ce/Build/OvmfX64/NOOPT_CLANGPDB/X64/MdeModulePkg/Universal/DevicePathDxe/De= vicePathDxe/DEBUG/DevicePathDxe.dll' (x86_64):
  Se= ctID     Type           &= nbsp; Load Address             &nbs= p;               Perm File Off.&nbs= p; File Size  Flags      Section Name  ---------- ---------------- -----------------------= ----------------  ---- ---------- ---------- ---------- ---------= -------------------
  0xffffffffffffffff container&= nbsp;       [0x0000000000000000-0x0000000000014420)* --= -  0x00000000 0x00000000 0x00000000 DevicePathDxe.dll.
  0x00000001 code           =   [0x000000007f986220-0x000000007f996cc6)  --- &nb= sp;0x00000220 0x00010ac0 0x60000020 DevicePathDxe.dll...text
=   0x00000002 data            &= nbsp;[0x000000007f996ce0-0x000000007f999b04)  ---  0x00= 010ce0 0x00002e40 0x40000040 DevicePathDxe.dll...rdata
 =  0x00000003 data             [= 0x000000007f999b20-0x000000007f99a1a2)  ---  0x00013b20= 0x00000660 0xc0000040 DevicePathDxe.dll...data
  0= x00000004 regular          [0x000000007f99a1c= 0-0x000000007f99a404)  ---  0x00014180 0x00000260 0x420= 00040 DevicePathDxe.dll=E2=80=A6reloc
=E2=80=A6
 
So, all in all, unique global variables work, but= there is no way to access duplicating variables. They either resolve to Gd= bSyms or just cause a crash:
 
(lldb)=  p mDebugInfoTableHeader
(EFI_DEBUG_IMAGE_INFO_TABLE_HEA= DER) $0 =3D {
  UpdateStatus =3D 2
&n= bsp; TableSize =3D 92
  EfiDebugImageInfoTable= =3D 0x000000007f814018
}
(lldb) p gBS
error: Couldn't materialize: couldn't get the value of variable = ::gBS: read memory from 0x6df8 failed
error: errored out in D= oExecute, couldn't PrepareToExecuteJITExpression
(lldb) = p gEfiGlobalVariableGuid
0  libLLVM.dylib  &nb= sp;         0x000000010e52ee68 llvm::sys::PrintSta= ckTrace(llvm::raw_ostream&) + 40
1  libLLVM.dyl= ib            0x000000010e52f262 SignalH= andler(int) + 188
2  libsystem_platform.dylib 0x000= 07fff6ca5642d _sigtramp + 29
...
=
 
=
 
=
If you want to insp= ect globals I think this logic works to get you data, you would need to pri= nt it out etc. 
 
SBValueList =3D l= ldb.target.FindGlobalVariables ("gST", 1024)
for SBValue in = SBValueList:
   Module =3D SBValue.GetAddress().GetModule() 
&nb= sp;       ModuleStr =3D SBValue.GetAddress().GetModule().Get= FileSpec().GetFilename()
        Start = = =3D int (SBValue.GetLocation(), 0)
      &nb= sp; End =3D Start + SBValue.GetByteSize() - 1<= /div>
    =     SBDeclaration =3D SBValue.GetDeclaration()
      &n= bsp; Column =3D SBDeclaration.GetColumn()
=
 
=
I wrote a command i= n the early days to dump out all the instances of a global. 
 
You can also try (lldb) image lookup -Av --= name gST


You can tell lldb to use the older= Python like this (from the Terminal.app):
$ defaults w= rite com.apple.dt.lldb DefaultPythonVersion 2<= /div>
&= nbsp;
Thanks, that helped quite a bit, but for some reason Xcode version s= till crashes more for me. I attached a couple of stack traces if you feel l= ike having a look, but once again it seems that it is all about the PDB plu= gin.
 
For the macOS API clan= g emits frame pointers, so you can walk the stack without symbols. You coul= d try adding the compiler flag to emit the frame pointers. 
 
 
This is easy enough to check as %= rpb is the frame pointer so it will get saved/restored on function entry/ex= it. 


I am pretty sure stack frames a= re not disabled with UEFI, as sometimes backtracing works just fine. To me = it looks like debug information parsing randomly breaks in LLDB, and once i= t happens it forgets about other images:
=
&nb= sp;
(lldb) b CoreLocateHandleBuffer
Breakpoint 2: where = =3D DxeCore.dll`CoreLocateHandleBuffer + 31 at Locate.c:649, address =3D 0= x000000007fe36e4f
(lldb) c
Process 1 resum= ing
Process 1 stopped
* thread #1, stop reason = = =3D breakpoint 2.1
    frame #0: 0x= 000000007fe36e4f DxeCore.dll`CoreLocateHandleBuffer(SearchType=3DByPro= tocol, Protocol=3D0x000000007f978160, SearchKey=3D0x0000000000000000, Numbe= rHandles=3D0x000000007fe19fd8, Buffer=3D0x000000007fe19fc0) at Lo= cate.c:649
   646    &n= bsp; EFI_STATUS          Status;
   647    
  UINTN&nb= sp;              BufferSize;
   648    
->= ; 649     if (NumberHandles =3D=3D NU= LL) {
   650 &n= bsp;    =   return EFI_INVALID_PARAMETER;
   6= 51      }
   = 652    
(lldb) bt
* thread #1, stop reason =3D breakpoint 2.1
 = ; * frame #0: 0x000000007fe36e4f DxeCore.dll`CoreLocateHandl= eBuffer(SearchType=3DByProtocol, Protocol=3D0x000000007f978160, SearchKey= =3D0x0000000000000000, NumberHandles=3D0x000000007fe19fd8, Buffer=3D0= x000000007fe19fc0) at Locate.c:649
    fr= ame #1: 0x000000007fe36816 DxeCore.dll`CoreLocateDevicePath(Proto= col=3D0x000000007f978160, DevicePath=3D0x000000007fe1a060, Device=3D0x00000= 0007fe1a068) at Locate.c:466
    frame #2= : 0x000000007f97479a SecurityStubDxe.dll
 
=E2=80=94=E2=80=94=E2=80=94
=  
(lldb)&nbs= p;b CopyMem
Breakpoint 3: 70 locations.
(lldb)&= nbsp;c
Process 1 resuming
Process 1 stopped
* thread #1, stop reason =3D breakpoint 2.53 3.53
    frame #0: 0x000000007e5c13b3 MnpDxe.dll= `CopyMem(DestinationBuffer=3D0x000000007fe19b50, SourceBuffer=3D0x000000007= e2aa470, Length=3D656) at CopyMemWrapper.c:47
  &nb= sp;44        IN UINTN =       Length
   45  <= span class=3D"apple-tab-span">    
  )
   46&= nbsp;     {
-> 47 &n= bsp;     if (Length =3D=3D 0) {<= br class=3D"">   48  &nb= sp;   &n= bsp;   return DestinationBuffer;
   = 49        }
   50    &nbs= p;   ASS= ERT ((Length - 1) <=3D (MAX_ADDRESS - (UINTN)DestinationBuffer));(lldb) bt
* thread #1, stop reason =3D = ;breakpoint 2.53 3.53
  * frame #0: 0x00000000= 7e5c13b3 MnpDxe.dll`CopyMem(DestinationBuffer=3D0x000000007fe19b50, So= urceBuffer=3D0x000000007e2aa470, Length=3D656) at CopyMemWrapper.c:47<= br class=3D"">(lldb) finish
error: Could not create retu= rn address breakpoint.
(lldb) n
Process 1 = stopped
* thread #1, stop reason =3D step over
    frame #0: 0x000000007e5c13ce MnpDxe.dll= `CopyMem(DestinationBuffer=3D0x000000007fe19b50, SourceBuffer=3D0x000000007= e2aa470, Length=3D656) at CopyMemWrapper.c:50
  &nb= sp;47        if (Lengt= h =3D=3D 0) {
   48     &nb= sp;    return DestinationBuffer;
   49   &nbs= p;   &nb= sp;}
-> 50   = ;   &nbs= p;ASSERT ((Length - 1) <=3D (MAX_ADDRESS - (UINTN)DestinationBuffer= ));
   51        ASSERT ((Length - 1) <=3D (MAX_ADDRESS - (UINTN)Sourc= eBuffer));
   52      
   53        if (DestinationBuffer =3D=3D SourceBuffer) {
(lldb)  
...
Process 1 stopp= ed
* thread #1, stop reason =3D step over
=     frame #0: 0x000000007e5c14b4 MnpDxe.dll`CopyMe= m(DestinationBuffer=3D0x000000007fe19b50, SourceBuffer=3D0x000000007e2aa470= , Length=3D656) at CopyMemWrapper.c:57
   54&n= bsp;         return De= stinationBuffer;
   55      = ;  }
   56      
  return InternalMemCopyMem (Dest= inationBuffer, SourceBuffer, Length);
-> 57     
}
(lldb)  
Pro= cess 1 stopped
* thread #1, stop reason =3D step over    frame #0: 0x000000007e5c726e MnpDx= e.dll
->  0x7e5c726e: mov    rax,= qword ptr [rsp + 0x60]
    0x7e5c7273: cmp&nb= sp;   byte ptr [rax + 0x68], 0x0
    = ;0x7e5c7277: jne    0x7e5c7291
   &n= bsp;0x7e5c727d: movabs rax, -0x7fffffffffffffed
(lldb) b= t
* thread #1, stop reason =3D step over=
 =  * frame #0: 0x000000007e5c726e MnpDxe.dll 
 
=E2=80=94=E2=80=94=E2=80=94
 
(lldb) c
Process 1 resumingProcess 1 stopped
* thread #1, stop reason =3D&nb= sp;signal SIGINT
    frame #0: 0x00000000= 7fe4d72e DxeCore.dll
->  0x7fe4d72e: cmp&nb= sp;   al, 0x0
    0x7fe4d730: je&nbs= p;    0x7fe4d765
    0x7fe4d736= : mov    rcx, qword ptr [rsp + 0x20]
  &n= bsp; 0x7fe4d73b: call   0x7fe4c4b0
(lldb)=  bt
* thread #1, stop reason =3D signal SIGINT
  * frame #0: 0x000000007fe4d72e DxeCore.dll<= o:p class=3D"">
 
On macOS the Mach-O and dSY= M have a UUID (dwarfdump -u) that is indexed by Spotlight (mdfind "com_appl= e_xcode_dsym_uuids =3D=3D *") [2]
<= div class=3D"">
This should be the UUID in= the debug directory entry and you can use that to lookup the symbols like = this:
 
module =3D target.AddModule (Non= e, None, uuid)
SBError =3D target.SetModuleLoadAddress (modu= le, LoadAddress + TeAdjust)
 
Also lldb = has built in help for commands, but it is kind of terse since it is autogen= erated from the C++ swig. 
(lldb) script help (lldb.target.AddModule)<= o:p class=3D"">
Help on method AddModule in module lldb:
&n= bsp;
Add= Module(self, *args) method of lldb.SBTarget instance<= /span>
   = AddModule(SBTarget self, SBModule module) -> bool=
   = AddModule(SBTarget self, char const * path, char const * triple, char cons= t * uuid) -> SBModule
    AddModule(SBTarget self, ch= ar const * path, char const * triple, char const * uuid_cstr, char const * = symfile) -> SBModule
    AddModule(SBTarget self, SB= ModuleSpec module_spec) -> SBModule


The minimum  you need to symbolicate a frame= is uuid, LoadAddress, and PC. 
&= nbsp;
 <= /o:p>
T= hanks for the links again. Yes, I am using some of these, and in fact for G= DB that=E2=80=99s pretty much what I did when I worked with XCODE5. It is v= ery likely that when I get to complete LLDB support for XCODE5 it will work= quite fine too. But I am already happy with XCODE5 here, and making it eve= n better will only help myself, but not other people with e.g. Linux or peo= ple that want me to use the same compiler with them.<= /span>
 
 
Thanks for l= ooking out for others. 
 
Thanks= ,
 
Andrew Fish<= /span>


Best r= egards,
Vitaly
 
 
21 =D0=BC=D0=B0=D1=80= =D1=82=D0=B0 2020 =D0=B3., =D0=B2 20:13, Andrew Fish <afish@apple.com> =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB(= =D0=B0):
 



On Mar 21, 2020= , at 3:28 AM, Vitaly Cheptsov <cheptsov@ispras.= ru> wrote:
 
<= div style=3D"margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: SimSun= ;" class=3D"">Hello,
<= div class=3D"">
 
Andr= ey, thanks for the hint, it was very helpful. I rewrote the GDB scripts to = work with LLDB[1] and was able to debug OVMF built with CLANGPDB. While it = is still quite dirty, at the very least it works.
 
Unfortunately the experience was close to terrible. I may cert= ainly do something wrong, but it is clear that PDB and LLDB do not support = each other well enough. After spending several hours on playing with the to= ols my conclusion is that LLDB is simply not suited for UEFI PDB debugging,= and we really want DWARF  as there is no other opensource debugger th= at supports PDB on macOS and Linux
=
 
In = case somebody knows workarounds here are the issues I faced:
 
1. All integer alias typedefs are discarded in fa= vour of underlying types. This way EFI_STATUS and EFI_TPL become unsigned l= ong long, CHAR8 becomes char, and CHAR16 becomes unsigned short. It does no= t look like LLDB has the original types anywhere at all, and it also does n= ot have them registered.
 
   = ; frame #0: 0x000000007fe242aa DxeCore.dll`CoreAllocatePoolP= agesI(PoolType=3DEfiBootServicesData, NoPages=3D1, Granularity=3D4096, Need= Guard=3D'\0') at Pool.c:322
   319             return=  NULL;
   320           }
   321&n= bsp;      &nbs= p; 
= -> 322      = ;   &nbs= p;Buffer =3D CoreAllocatePoolPages (PoolType, NoPages, Granularity, NeedGua= rd);
   323  
  CoreRele= aseMemoryLock ();
   324         
   325           if (B= uffer !=3D NULL) {
(lldb) p Status
(unsign= ed long long) $3 =3D 0
 
Structures w= ork more or less fine, but for simpler types like strings we are out of eve= n potential pretty-printing.
 
 
Vitaly,
<= /div>
&nbs= p;
You can teach lldb about types. There is some example code here: https= ://github.com/tianocore/edk2/blob/master/EmulatorPkg/Unix/lldbefi.py

2. Global variables are not accessible. I a= m not sure what happens, but they either seem to not relocate or conflict w= ith the other names:
 
(lldb) p gST=
error: Couldn't materialize: couldn't get the value of varia= ble ::gST: read memory from 0x6e18 failed
error: errored out = in DoExecute, couldn't PrepareToExecuteJITExpression
(lldb)&n= bsp;p &gST
error: Couldn't materialize: couldn't get the = value of variable ::gST: read memory from 0x6e18 failed
error= : errored out in DoExecute, couldn't PrepareToExecuteJITExpression
 
 
Th= at is strange as globals usually work best? The common issue I've seen is g= etting the slide wrong. The EFI modules are linked at a value near zero and= relocated into memory, so the slide represents that adjustment. 
 
<= div style=3D"margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: SimSun= ;" class=3D"">You can use `image dump sections` and `&nb= sp;image dump symtab` to see lldb's view of symbols. More info here [1].&nb= sp;


3. Quite a number of crashes.
 
<= div style=3D"margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: SimSun= ;" class=3D"">In most cases autocompletion by tab press = causes a crash. E.g.
 
b I<TAB>
 
So will do printing of a GUID, e.g. = ;p gEfiGlobalVariableGuid.
 
This may have to do wi= th Python compatibility as Xcode 11 LLDB that uses Python 3 generally crash= es more often than MacPorts LLDB 9.0. Surprisingly structures work more or less fine.=
 
 
=
You can tell lldb to use = the older Python like this (from the Terminal.app):
$ = ;defaults write com.apple.dt.lldb DefaultPythonVersion 2


4. Ctrl+C does not produce a valid backtrace. When I b= reak with a breakpoint, I see a proper stacktrace with more than one entry,= with function prototypes and values. When I break with Ctrl+C I only see s= ome weird backtrace with most of the entries missing regardless of frame po= sition:
<= div class=3D"">
 
(lldb) bt
* thread #1, stop reason =3D signal SIGT= RAP
  * frame #0: 0x000000007fe4c5f3 DxeC= ore.dll
<= div class=3D"">
 
Probably more and all the unintuitive stuff like the lack of more function= al TUI, but it is hard to remember all the trials.
 
&= nbsp;
For the macOS API clang emits frame pointers, so you can walk the st= ack without symbols. You could try adding the compiler flag to emit the fra= me pointers. 
=
 
=
&nb= sp;
 
On macOS t= he Mach-O and dSYM have a UUID (dwarfdump -u) that is indexed by Spotlight = (mdfind "com_apple_xcode_dsym_uuids =3D=3D *") [2]
This s= hould be the UUID in the debug directory entry and you can use that to look= up the symbols like this:
 
module =3D t= arget.AddModule (None, None, uuid)
=
SBError =3D target.SetMod= uleLoadAddress (module, LoadAddress + TeAdjust)
 
Also lldb has built in help for commands, but it is kind of te= rse since it is autogenerated from the C++ swig. 
(lldb)=  script help (lldb.target.AddModule)
Help on method AddModule in module lldb:
 <= /o:p>
AddModul= e(self, *args) method of lldb.SBTarget instance
    AddMo= dule(SBTarget self, SBModule module) -> bool
    AddMo= dule(SBTarget self, char const * path, char const * triple, char const * uu= id) -> SBModule
=
    AddModule(SBTarget self, char cons= t * path, char const * triple, char const * uuid_cstr, char const * symfile= ) -> SBModule
    AddModule(SBTarget self, SBModuleSpe= c module_spec) -> SBModule


=
The minimum  you need to symbolicate a frame is uuid, = LoadAddress, and PC. 
 
 
Thanks,<= /o:p>
<= o:p class=3D""> 
Andrew Fish
 


<= o:p class=3D"">
Best wishes,
Vitaly
 
20 =D0=BC=D0=B0=D1=80=D1=82=D0=B0 2020 =D0=B3., = =D0=B2 22:14, Andrew Fish <afish@apple.com>= ; =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB(=D0=B0):=
 =



On Mar 20, 2020, at 8:13 AM, Vitaly Cheptsov &= lt;cheptsov@ispras.ru> wrote:
 
<= span lang=3D"EN-US" style=3D"font-size: 9pt; font-family: Helvetica, sans-s= erif;" class=3D"">Hello,
=
 
=
We noticed that the= original bugzilla, which intended to add new LLVM toolchain support[1], al= so wanted to bring ELF format support with DWARF debugging information.&nbs= p;For some reason this did not make its way into EDK II, and we are current= ly wondering, how can one debug binaries built with LLVM 9.0.


For macOS and XCODE5 toolch= ain we use GDB scripts based on Andrei Warkentin=E2=80=99s work, which= allow us to integrate with QEMU and VMware[2]. It is likely that they shou= ld work with little to no work on Linux with CLANG38/GCC5 with GDB once aga= in. However, CLANGPDB apparently is using PDB debugging information, which = I believe is not handled with GDB.
=
 
Cou= ld you please provide the details on the matter and let us know about the r= ecommended route?
<= div style=3D"margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: SimSun= ;" class=3D"">=E2=80=94 Is dropping CLANGELF just a temp= orary measure and it should be resubmitted again?
=E2=80=94&= nbsp;Should LLDB, which seems to be aware of PDB, be used instead of GDB, w= hen building with CLANGPDB? If so, did anybody try that?

<= /div>
 
Vitaly,
 
I've not tri= ed the CLANGPDB path, but if you want to connect lldb to QEMU you need to s= et  plugin.process.gdb-remote.target-definition-file [1] to [2]. =
 
[1]  lldb -o "settings s= et plugin.process.gdb-remote.target-definition-file x86_64_target_definitio= n.py" -o "gdb-remote 9000"
 
Thanks,
 
Andrew Fis= h

=
Thanks!=
=

Best regards,=
= Vitaly
 
<= div style=3D"margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: SimSun= ;" class=3D"">[2] https://github.com/acidanthe= ra/OpenCorePkg/blob/master/Debug/Scripts/gdb_uefi.py
 
=
 =
 
=
<crashes.txt>=
 
=
--Apple-Mail=_20A622B7-7708-4A3C-BA59-ACC83EE9DCEB-- --Apple-Mail=_D2FB297D-3399-4E97-814F-6314E8A8B2CD Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=signature.asc Content-Type: application/pgp-signature; name=signature.asc Content-Description: Message signed with OpenPGP -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEsLABAI5Y5VbvBdmpL8K2O86Eyz4FAl57WoYACgkQL8K2O86E yz4pSg/+Lxism345wSz8n+Ji6be85PjPYpWbDpdTFpTgp5mr8Ba6kuKiwqFeNpkI ntpRD5NYVp8vS85r55OFfiRdHU6PWOHeY0NZMMRg0quCxArqsv9s77GHZo9V2dV7 Ob2piNszDdJHdfrE4LivC/9WvwCpwuQYiHVm3hDjKhr52/ZjMWArL8IPqoYx7yyV G0WJMmpKtwdYsDbrNs163gCaXbJPQ8aXXLuWBKT4ownNGrgmbCNjOpdO9HHznzdk a7fXX+dJHCuv+nZiMkoK8JzCwju32BvshhriZ+dFYc3VUa0yEfWRjGbXKfSzSRME +pFkXWTZLHXDJ9WFJm9+KSO30hFteV2jry6n5aCXgKN3GMibCZ+s/QptEeelWFSf ugbPDaG3NfOg2TFSvsxz/4ZpLAnrvInEhSlu60NrKd64Qa0rA5zpSmnnWQtji33m k1jMoKGn7US6+MTooQ5Qa2i/fZnMN60JSj3zWiu3NyFRAcalZHNJp55XhzjbEg07 OA2fXmjZGhmKEfbQONJlhMeabhoeAgnd2LHclmqohKHMKyw3hUMVWplIQykPp5S3 DcsI9KpECB/bfu7UV+ooQUCyeOCvL7ps3AuHaJbuIiap0Z/mjWOb5U3pmIa5lA/E ssle1ClIrE6LJtTXuXzuOYptnwwQ6deLOzaB6vgJKP13yxC60mw= =4J1E -----END PGP SIGNATURE----- --Apple-Mail=_D2FB297D-3399-4E97-814F-6314E8A8B2CD--