From unknown Tue Jun 17 01:27:50 2025 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.509 (Entity 5.509) Content-Type: text/plain; charset=utf-8 From: bug#41465 <41465@debbugs.gnu.org> To: bug#41465 <41465@debbugs.gnu.org> Subject: Status: 28.0.50 (but also earlier versions); etags asserion error (with too many files?) Reply-To: bug#41465 <41465@debbugs.gnu.org> Date: Tue, 17 Jun 2025 08:27:50 +0000 retitle 41465 28.0.50 (but also earlier versions); etags asserion error (wi= th too many files?) reassign 41465 emacs submitter 41465 Gregor Zattler severity 41465 normal thanks From debbugs-submit-bounces@debbugs.gnu.org Fri May 22 15:32:08 2020 Received: (at submit) by debbugs.gnu.org; 22 May 2020 19:32:08 +0000 Received: from localhost ([127.0.0.1]:60455 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jcDOq-0004xK-Ib for submit@debbugs.gnu.org; Fri, 22 May 2020 15:32:08 -0400 Received: from lists.gnu.org ([209.51.188.17]:33966) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jcDOp-0004xC-7b for submit@debbugs.gnu.org; Fri, 22 May 2020 15:32:07 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:60600) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jcDOo-0000Qa-Tf for bug-gnu-emacs@gnu.org; Fri, 22 May 2020 15:32:07 -0400 Received: from mout.gmx.net ([212.227.15.15]:54721) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jcDOn-0001VD-OG for bug-gnu-emacs@gnu.org; Fri, 22 May 2020 15:32:06 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1590175921; bh=sHklZMky7SD7ARx24rLxz0tqZ1wVPF7zpkMvcVQry1w=; h=X-UI-Sender-Class:From:To:Subject:Date; b=aepkoqcDIIrn9Gma2I5M9je69BBXicMZi9VYxxrxiZUGcmpIVI9TwXQoMcXuBUiuF vCPAHMZMwHdKCzlmzJ3hO2dxksBjqnHguEM0HiLoMavqONOATdeSYAnT4Z9dkjWl1u qENc+uZC8faO0MiTuOnw48vey4v4+0Bzy1sje5kQ= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from no.workgroup ([46.94.158.150]) by mail.gmx.com (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MDQeK-1jmdWB08Gc-00AUVv; Fri, 22 May 2020 21:32:01 +0200 From: Gregor Zattler To: bug-gnu-emacs@gnu.org Subject: 28.0.50 (but also earlier versions); etags asserion error (with too many files?) Date: Fri, 22 May 2020 21:31:57 +0200 Message-ID: <87sgfr936a.fsf@no.workgroup> MIME-Version: 1.0 Content-Type: text/plain X-Provags-ID: V03:K1:H5IYHwUpIhJ+/6jhe+3lQ7wU0Sk6STY+13GeXzGIubeqCSKgV0P iwpqjkFgA2rgIlIB4uwd04fMLlH5UJcRCZRiX1QGZgN1IJu06FoSZiPxzN03qB/gvdBUmM5 rf/bQYZrN6lpX4WwAwkFq3yqd5hoVylCKWcLpsdwCrhUQ7mHWDfThhg75F+b2RfP6YsjnK5 NJRzWqF369P33jMP7g33g== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:69tYBklaDeM=:Zd5aOX74wD8SF77o5eOdYS jSmGSnqvAlpjUiEpON0hu4EaDNVqmELCqQAzMmQlo/Otc6xVU2RhCqlIU7Hj0Rs0XhPTs+2aG T18QXhH7b1wGCJSYx239uasPFnNbtAtDVUH4X09oLcnHT8NxfwEtlC18viHVsjfoRSNQH9Wmi lIXOabhV6d0F0zk/PKx4l8JHp77XhDKcAT+91SxE9nZ0z8u0Y8x/F+TOOc/8GO3rLLBE6ISwM NmHH0MUBltER9l+UQ07usrKmr7WESN85mQ1LlDYkBcVR6vWB7xJEFa16XTiMc5cjMjUAhpqAT Xc0CnIzqQhZhKwbB/ypE7b/gCpMIO43T3bL9F4H1MpiBsmcQuPGbevDAc9hi2up7TXjcpTzQR Nd4sQFoWYjzuY0UPsZdkjegsnuQ5DJDn6ICPCbOE2lEBkuXHNAUO6dTogtI19mKgnishGxHw8 K+gOk726Al+V03s5zbUlhAkDVNx+T1C0swjgGJMWADkydGHVUqKJitAbOaTCT+I+ZjHB4PuPV xewV6gUZLE1aIgJ5TCs+Z1DK8/80tClsAzOux2MIBQSU9OqSmS0q57nqjgMhZsjmodX6QVVyV QrMbi4klYwnswG6yYtMNqHnMXNp4GSBGECKu3YQivzPxYwO8w+sJiviDz+j1qjPCG84u2ujrY js/MJxS72/DnBm95MeJMkvubIY5TZddkTdexfxMRhXAtaCoBFmLTa29ZuxshsIf/HGm/qgor2 aiGMyYadQ6kxwOlb1oxq1itCj00TiOTgeTNcw6bxM7uEtWCarm1w/fnmcWK9DzcqioN9slRSI vxd3jRoIkqqjHaYBr2+H8GiFxz3jr2Ocqr3F/rKRIGDPflozdI37qdj1zv/pvs7sFE9JOrhx1 qkcp5y71TTZ3HMNkY21K3GgnpGdfyr2q1Ot8nfSHbnH2Ig0dEJgWjiM1EjzAqCzvbPcooqRKq PZjv8BrknvrHfeAdhMh8wOG3Y8ee1hvHA8tPr4pTU0QcxZFNvVvlufrCH4twQ+FXdkkeWoP2L DJ67q4gaC1h6+1qEu8GQeOpMZMB+/3SvzikLA2nVfBtPw/B3auwp4OlzAO3/tFAlapXzJZl/V /uDcYr4+klqgJAUgdoene+POWGN2iCXJ6y36G2Tbh8tNofVwfadQY7uY6M5Cq0QiZklBtq2f/ 9TLzCU0NHwKBNTq1GJcwz1eilon103YEjwXSJB1kJJrOJUHAFEznbTbfed4CNUTYOA+qrocG8 TpmX+hgVuhsAi6p/X Content-Transfer-Encoding: quoted-printable Received-SPF: pass client-ip=212.227.15.15; envelope-from=telegraph@gmx.net; helo=mout.gmx.net X-detected-operating-system: by eggs.gnu.org: First seen = 2020/05/22 15:32:01 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_PASS=-0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-Spam-Score: 0.6 (/) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.4 (--) Dear emacs developers, I get an assertion error when executing the following line (from a cron job of mine): grfz@no:~/src$ find ~/src -type f -print0 | egrep -zZ '(\.el|\.c|\.h)(\.gz= )?$' | xargs -0r etags etags: etags.c:1987: pfnote: Assertion `name =3D=3D NULL || name[0] !=3D '= \0'' failed. xargs: etags: terminated by signal 6 125 (master *) grfz@no:~/src$ This happens with etags from debian buster, as with etags build from emacs-27 branch of emacs git repo, as with etags build from feature/native-comp branch. Under ~/src there is also the linux kernel git repo. There is no assertion error if I filter it out: $ find . -type f -print0 | egrep -vzZ linux | egrep -zZ '(\.el|\.c|\.h)(\.= gz)?$' | xargs -0r etags 0 (master *) grfz@no:~/src$ There is also no assertion error if I filter for .el files only: 125 (master *) grfz@no:~/src$ find ~/src -type f -print0 | egrep -zZ '(\.e= l)(\.gz)?$' | xargs -0r etags 0 (master *) grfz@no:~/src$ Therefore I assume this somehow is related to the number of files. Ciao; Gregor =2D- -... --- .-. . -.. ..--.. ...-.- From debbugs-submit-bounces@debbugs.gnu.org Fri May 22 17:39:09 2020 Received: (at 41465) by debbugs.gnu.org; 22 May 2020 21:39:09 +0000 Received: from localhost ([127.0.0.1]:60589 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jcFNl-0001fy-E7 for submit@debbugs.gnu.org; Fri, 22 May 2020 17:39:09 -0400 Received: from mail-wm1-f43.google.com ([209.85.128.43]:37811) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jcFNi-0001fS-Me for 41465@debbugs.gnu.org; Fri, 22 May 2020 17:39:07 -0400 Received: by mail-wm1-f43.google.com with SMTP id f5so3035950wmh.2 for <41465@debbugs.gnu.org>; Fri, 22 May 2020 14:39:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=ihtZX155+VKNvck/dXeuMqL1yHpcxaJYStyQH+tbLFY=; b=KyOgQL0USfR71QRBQouLqaYyEYfLKDFNLkHYrIjj9V7NpiKEaetP8UHsTJtcxE77tw VTwX7GQEvBpW0W0brmfj7PPEYN/2ThqS0TimNgjYoYTcVZ9G7Ii9OpO+Q6UT6a64W/qI 7pCqouUELTYA65pBm9OZUNk6o8gL/9EEWvpyDlTAgUPv63zvFtbOUQkR5nf5/UgICU/I AD2M9OOLm4+zRt6WVBYBpldLBmIi/Tqv1KHc+/odu+G4Eux6TwqlMWov7W0bBVVqGq9X 0LCxR6f2WaHoaAgSxPq+VCb5s1v9MCjOlzSgvt8N3wXizD6O1mfAobX1cO/KaNKElYBe jEpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=ihtZX155+VKNvck/dXeuMqL1yHpcxaJYStyQH+tbLFY=; b=bjiESzAnmC0kkDKdDYcWxi5Z9JHxq6VS/jmHXWKAZZdAdznPEGlVcE+sFXqnobb9Lm bxi3QNey0/hf3xVPkUp98dgSgD9Dny7HpvRg06tYr4J9KODeS7Uc+uh1P+1AGnmNWfLf 93VhfszPZ79m4wW6ZM1R2bWTc5lRg/gKoRbk3w2JesD1J4M8Thq9Q1g1cBiwBx3enSvP MTqmF0z+S4uz181puKglQjvnjn2xkVRbyXmYj1MnHyvKqnBblRByRqRNvenxrlBzEqL2 L2dPMTpfqsqMMCQlmSzNOOAts7nhYlOXqFMvuIRi+QeHfYaTxY/PwmInlgkR3sIgEj1b DYcQ== X-Gm-Message-State: AOAM532+XYH3Cyk/AJqzrZiDnI/3PHz6jbSCUOE9maQ+DBdC7aW2JOz0 Dzo7GwC7IYqene+PwM2zTNPVfvuW X-Google-Smtp-Source: ABdhPJwAWKTkB3iEMobRDMX6Ei5iHISOX4zf+z23eBdIGrlTSnYJ93RXTzouvXawD6Rvi/4HcBR6+Q== X-Received: by 2002:a7b:c741:: with SMTP id w1mr14660639wmk.63.1590183540500; Fri, 22 May 2020 14:39:00 -0700 (PDT) Received: from [192.168.0.3] ([66.205.73.129]) by smtp.googlemail.com with ESMTPSA id d126sm11329555wmd.32.2020.05.22.14.38.59 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 22 May 2020 14:39:00 -0700 (PDT) Subject: Re: bug#41465: 28.0.50 (but also earlier versions); etags asserion error (with too many files?) To: Gregor Zattler , 41465@debbugs.gnu.org References: <87sgfr936a.fsf@no.workgroup> From: Dmitry Gutov Message-ID: <7a33e971-a8fa-99d2-3067-cac00ebbaebb@yandex.ru> Date: Sat, 23 May 2020 00:38:58 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: <87sgfr936a.fsf@no.workgroup> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Score: 0.5 (/) X-Debbugs-Envelope-To: 41465 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.5 (/) Hi! On 22.05.2020 22:31, Gregor Zattler wrote: > Dear emacs developers, > > I get an assertion error when executing the following line > (from a cron job of mine): > > grfz@no:~/src$ find ~/src -type f -print0 | egrep -zZ '(\.el|\.c|\.h)(\.gz)?$' | xargs -0r etags > etags: etags.c:1987: pfnote: Assertion `name == NULL || name[0] != '\0'' failed. > xargs: etags: terminated by signal 6 > 125 (master *) grfz@no:~/src$ Looking at the code, it seems more likely the problem is because we're failing to parse some particular piece of code. So if you can determine which file fails to parse, and send us an example, that should help fix it. From debbugs-submit-bounces@debbugs.gnu.org Sat May 23 04:34:29 2020 Received: (at 41465) by debbugs.gnu.org; 23 May 2020 08:34:29 +0000 Received: from localhost ([127.0.0.1]:33363 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jcPbx-0003BS-La for submit@debbugs.gnu.org; Sat, 23 May 2020 04:34:29 -0400 Received: from mout.gmx.net ([212.227.15.15]:53479) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jcPbv-0003BD-CK for 41465@debbugs.gnu.org; Sat, 23 May 2020 04:34:27 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1590222860; bh=uovGXP21QQZ4K20BRxOXJ7yHerpoK0DDRcxjDIKBSOA=; h=X-UI-Sender-Class:From:To:Subject:In-Reply-To:References:Date; b=AsK3le55ggC1H7z+R0dg/hDHtXXfwLgmCK7jgWb4qqSFKH/srfWFone79SL51Sxf9 9DNphtlHLnlPCMXxDkJHaF4ynDqFks0HXGS+gINY0pXAaA50cCdcprr6Qi/AhuoF6/ YYD/pe1/zok4Q+Tvbg17yWjTYxTFDRtM+/1y8taE= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from no.workgroup ([46.94.158.150]) by mail.gmx.com (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MPXd2-1jPiJi0eFG-00MdNj; Sat, 23 May 2020 10:34:20 +0200 From: Gregor Zattler To: Dmitry Gutov , 41465@debbugs.gnu.org Subject: Re: bug#41465: 28.0.50 (but also earlier versions); etags asserion error (with too many files?) In-Reply-To: <7a33e971-a8fa-99d2-3067-cac00ebbaebb@yandex.ru> References: <87sgfr936a.fsf@no.workgroup> <7a33e971-a8fa-99d2-3067-cac00ebbaebb@yandex.ru> Date: Sat, 23 May 2020 10:34:15 +0200 Message-ID: <87pnavt5h4.fsf@no.workgroup> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Provags-ID: V03:K1:GNiwCHWj07jbeewHDbwoIhepv0t8Jq6eNdHN9ZW2Rfq2OU3Jv5C vbH14PCYWlOi1ds+XovfGtkW/GEKCqjQyoj23ITxMacc4PBbkI2R9uV0gSO3SYBisZCWDDp geri+5+GQmyZab63UCKpV+2h0+/pE801AcGy3hvPuksRadt/jKxgn6qNeF+AUt146pgCLjx rlCzlHi5aUdK+aRTe1Qqw== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:lnDjVNpZV80=:OSUNeoU9a5BFNvZ/tF3RcF JJI1YzK55YvmBoAfS62zZ9VYIv3x5fTgXc6jCx+brVj1UhXbtZ6EmxYlxmXLJUpZyXXIvsQjo kgFKRNHyJ57g6i5RtZLuhH1+/Gs4SYh//yMVe6INBPvf8qprvlE1sXKHScE32NhfCX4zzgkXU WbKTLRVgxf4dbUQDKsi97ukv2/jA8Rb8wVHj6iCInplV9P3vMMh4Jdh+V/ow1msYewz9BG8Zj drUOXyCDKsx5RZfRJ/VtaMHUB+qHiLLj4k5R0awW3MMj/18nG7LFatJLw/EYYuKS77PB67Yib 9QQ4JBfy8f2m3usX+U999Iymqafwx7amk85NP6V6G7I1RgtNVBf+YXq1nSy71RqWXcMQtlSd7 85cjnCtbahYTVPo/wJqW4z8JFejqwTwIINeNoKEsoVS2YXQ2IhxNQ2CXKNt4ysI+AGu77Drrz VCHwAek+SctczW0I27RTpea7TWmE7GpDIPhMssMPD0b2tRIvH7uZuevxm0HsdEpuEtAeZrADn f1iHIRxcKGiPymKvkJEH330CFiX5T8k3wU90hoUW1gtXxEAhqjfJ6FxqW+bso9vmTE/O2HBnV k2YXCdERJ4MSWSYrErqhMW0tvlvXwKW2lou1xkAwJOJb0Vxo95LNF25y/QCwwrdwREt5C4CeV hqfv3de0fGA30TpEnauE/LUX43lXaAzIGIqclIpXQKVuFMeC9SsvE80YClHefNK0CCPOvCkNB L5hdQPFgTpvPAs0efCo1jTNt8DQt/qCb7vILQsjYJ32E6Oe1Eq78nweyqSHeHT3csKkFfFYAv 9OUHKwE6D8AC3IuvzZZGTrcCqy0KqCd7o08Vmla7CYW8xKg/f+VYjn6+Nysj9EZBzxV7hCi8P AeL2/wEsxDluwuf0rbnXZGJ2sLUDSejgB7di76i4cRvlt9KSASXxKeEShBw89hjp60CPBfLI2 dZ4lLv2Kqxy5WeKP6ISwoOdCodxcxM3kWAcYdf7WTJWoW7Xz9hdqcKk6AvG0akg+PuvN2pux/ rxWfqeMWxAfIZOjfE48u7eUNcaKpRKTKymvTe+EHsBh5zCxjCmBdIXbDXtOEu68/VyrGItwo2 +g+P+50u9klFLIYGJ41hgfwvIq+v/TRzAU07/SqWh5W9VNpMlth4UiafcvqIcLKoICna15Ikl XmxdZlEnVKiVTA7xDUgVAaSWEvB/fykbHtmCDg2vQif0b8cTdunwevXdionFkTTw4B3MOHC59 6XXfDxKuRkPICcgj7lWNibC1ng68QoKX3RP2BiA== X-Debbugs-Envelope-To: 41465 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" --=-=-= Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Hi Dmitry, * Dmitry Gutov [2020-05-23; 00:38]: > On 22.05.2020 22:31, Gregor Zattler wrote: >> etags: etags.c:1987: pfnote: Assertion `name =3D=3D NULL || name[0] != =3D '\0'' failed. >> xargs: etags: terminated by signal 6 >> 125 (master *) grfz@no:~/src$ > > Looking at the code, it seems more likely the problem is because we're > failing to parse some particular piece of code. > > So if you can determine which file fails to parse, and send us an > example, that should help fix it. OK, your right, I did: 0 (master=3D) grfz@no:~/src/linux$ find . -type f -print0 | egrep -zZ -- '= (\.el|\.c|\.h)(\.gz)?$' | xargs -0IXXXXX sh -c "etags XXXXX || echo XXXXX" etags: etags.c:1987: pfnote: Assertion `name =3D=3D NULL || name[0] !=3D '= \0'' failed. Aborted ./sound/soc/codecs/cs43130.c etags: etags.c:1987: pfnote: Assertion `name =3D=3D NULL || name[0] !=3D '= \0'' failed. Aborted ./include/net/mac80211.h 0 (master=3D) grfz@no:~/src/linux$ I attach these two files. Thanks for looking into this; Gregor =2D- -... --- .-. . -.. ..--.. ...-.- --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=cs43130.c Content-Transfer-Encoding: base64 Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQovKgogKiBjczQzMTMwLmMg IC0tICBDUzQzMTMwIEFMU0EgU29jIEF1ZGlvIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgMjAxNyBD aXJydXMgTG9naWMsIEluYy4KICoKICogQXV0aG9yczogTGkgWHUgPGxpLnh1QGNpcnJ1cy5jb20+ CiAqLwojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJh bS5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNp bmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvZ3Bpby5oPgojaW5jbHVkZSA8 bGludXgvZ3Bpby9jb25zdW1lci5oPgojaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+ CiNpbmNsdWRlIDxsaW51eC9wbS5oPgojaW5jbHVkZSA8bGludXgvaTJjLmg+CiNpbmNsdWRlIDxs aW51eC9vZl9kZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgojaW5jbHVkZSA8bGlu dXgvc2xhYi5oPgojaW5jbHVkZSA8c291bmQvY29yZS5oPgojaW5jbHVkZSA8c291bmQvcGNtLmg+ CiNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KI2lu Y2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiNpbmNs dWRlIDxzb3VuZC90bHYuaD4KI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KI2luY2x1ZGUgPGxp bnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgojaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgoj aW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CiNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiNp bmNsdWRlIDxsaW51eC9tdXRleC5oPgojaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiNpbmNs dWRlIDxzb3VuZC9qYWNrLmg+CgojaW5jbHVkZSAiY3M0MzEzMC5oIgoKc3RhdGljIGNvbnN0IHN0 cnVjdCByZWdfZGVmYXVsdCBjczQzMTMwX3JlZ19kZWZhdWx0c1tdID0gewoJe0NTNDMxMzBfU1lT X0NMS19DVExfMSwgMHgwNn0sCgl7Q1M0MzEzMF9TUF9TUkFURSwgMHgwMX0sCgl7Q1M0MzEzMF9T UF9CSVRTSVpFLCAweDA1fSwKCXtDUzQzMTMwX1BBRF9JTlRfQ0ZHLCAweDAzfSwKCXtDUzQzMTMw X1BXRE5fQ1RMLCAweEZFfSwKCXtDUzQzMTMwX0NSWVNUQUxfU0VULCAweDA0fSwKCXtDUzQzMTMw X1BMTF9TRVRfMSwgMHgwMH0sCgl7Q1M0MzEzMF9QTExfU0VUXzIsIDB4MDB9LAoJe0NTNDMxMzBf UExMX1NFVF8zLCAweDAwfSwKCXtDUzQzMTMwX1BMTF9TRVRfNCwgMHgwMH0sCgl7Q1M0MzEzMF9Q TExfU0VUXzUsIDB4NDB9LAoJe0NTNDMxMzBfUExMX1NFVF82LCAweDEwfSwKCXtDUzQzMTMwX1BM TF9TRVRfNywgMHg4MH0sCgl7Q1M0MzEzMF9QTExfU0VUXzgsIDB4MDN9LAoJe0NTNDMxMzBfUExM X1NFVF85LCAweDAyfSwKCXtDUzQzMTMwX1BMTF9TRVRfMTAsIDB4MDJ9LAoJe0NTNDMxMzBfQ0xL T1VUX0NUTCwgMHgwMH0sCgl7Q1M0MzEzMF9BU1BfTlVNXzEsIDB4MDF9LAoJe0NTNDMxMzBfQVNQ X05VTV8yLCAweDAwfSwKCXtDUzQzMTMwX0FTUF9ERU5fMSwgMHgwOH0sCgl7Q1M0MzEzMF9BU1Bf REVOXzIsIDB4MDB9LAoJe0NTNDMxMzBfQVNQX0xSQ0tfSElfVElNRV8xLCAweDFGfSwKCXtDUzQz MTMwX0FTUF9MUkNLX0hJX1RJTUVfMiwgMHgwMH0sCgl7Q1M0MzEzMF9BU1BfTFJDS19QRVJJT0Rf MSwgMHgzRn0sCgl7Q1M0MzEzMF9BU1BfTFJDS19QRVJJT0RfMiwgMHgwMH0sCgl7Q1M0MzEzMF9B U1BfQ0xPQ0tfQ09ORiwgMHgwQ30sCgl7Q1M0MzEzMF9BU1BfRlJBTUVfQ09ORiwgMHgwQX0sCgl7 Q1M0MzEzMF9YU1BfTlVNXzEsIDB4MDF9LAoJe0NTNDMxMzBfWFNQX05VTV8yLCAweDAwfSwKCXtD UzQzMTMwX1hTUF9ERU5fMSwgMHgwMn0sCgl7Q1M0MzEzMF9YU1BfREVOXzIsIDB4MDB9LAoJe0NT NDMxMzBfWFNQX0xSQ0tfSElfVElNRV8xLCAweDFGfSwKCXtDUzQzMTMwX1hTUF9MUkNLX0hJX1RJ TUVfMiwgMHgwMH0sCgl7Q1M0MzEzMF9YU1BfTFJDS19QRVJJT0RfMSwgMHgzRn0sCgl7Q1M0MzEz MF9YU1BfTFJDS19QRVJJT0RfMiwgMHgwMH0sCgl7Q1M0MzEzMF9YU1BfQ0xPQ0tfQ09ORiwgMHgw Q30sCgl7Q1M0MzEzMF9YU1BfRlJBTUVfQ09ORiwgMHgwQX0sCgl7Q1M0MzEzMF9BU1BfQ0hfMV9M T0MsIDB4MDB9LAoJe0NTNDMxMzBfQVNQX0NIXzJfTE9DLCAweDAwfSwKCXtDUzQzMTMwX0FTUF9D SF8xX1NaX0VOLCAweDA2fSwKCXtDUzQzMTMwX0FTUF9DSF8yX1NaX0VOLCAweDBFfSwKCXtDUzQz MTMwX1hTUF9DSF8xX0xPQywgMHgwMH0sCgl7Q1M0MzEzMF9YU1BfQ0hfMl9MT0MsIDB4MDB9LAoJ e0NTNDMxMzBfWFNQX0NIXzFfU1pfRU4sIDB4MDZ9LAoJe0NTNDMxMzBfWFNQX0NIXzJfU1pfRU4s IDB4MEV9LAoJe0NTNDMxMzBfRFNEX1ZPTF9CLCAweDc4fSwKCXtDUzQzMTMwX0RTRF9WT0xfQSwg MHg3OH0sCgl7Q1M0MzEzMF9EU0RfUEFUSF9DVExfMSwgMHhBOH0sCgl7Q1M0MzEzMF9EU0RfSU5U X0NGRywgMHgwMH0sCgl7Q1M0MzEzMF9EU0RfUEFUSF9DVExfMiwgMHgwMn0sCgl7Q1M0MzEzMF9E U0RfUENNX01JWF9DVEwsIDB4MDB9LAoJe0NTNDMxMzBfRFNEX1BBVEhfQ1RMXzMsIDB4NDB9LAoJ e0NTNDMxMzBfSFBfT1VUX0NUTF8xLCAweDMwfSwKCXtDUzQzMTMwX1BDTV9GSUxUX09QVCwgMHgw Mn0sCgl7Q1M0MzEzMF9QQ01fVk9MX0IsIDB4Nzh9LAoJe0NTNDMxMzBfUENNX1ZPTF9BLCAweDc4 fSwKCXtDUzQzMTMwX1BDTV9QQVRIX0NUTF8xLCAweEE4fSwKCXtDUzQzMTMwX1BDTV9QQVRIX0NU TF8yLCAweDAwfSwKCXtDUzQzMTMwX0NMQVNTX0hfQ1RMLCAweDFFfSwKCXtDUzQzMTMwX0hQX0RF VEVDVCwgMHgwNH0sCgl7Q1M0MzEzMF9IUF9MT0FEXzEsIDB4MDB9LAoJe0NTNDMxMzBfSFBfTUVB U19MT0FEXzEsIDB4MDB9LAoJe0NTNDMxMzBfSFBfTUVBU19MT0FEXzIsIDB4MDB9LAoJe0NTNDMx MzBfSU5UX01BU0tfMSwgMHhGRn0sCgl7Q1M0MzEzMF9JTlRfTUFTS18yLCAweEZGfSwKCXtDUzQz MTMwX0lOVF9NQVNLXzMsIDB4RkZ9LAoJe0NTNDMxMzBfSU5UX01BU0tfNCwgMHhGRn0sCgl7Q1M0 MzEzMF9JTlRfTUFTS181LCAweEZGfSwKfTsKCnN0YXRpYyBib29sIGNzNDMxMzBfdm9sYXRpbGVf cmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQp7Cglzd2l0Y2gg KHJlZykgewoJY2FzZSBDUzQzMTMwX0lOVF9TVEFUVVNfMSAuLi4gQ1M0MzEzMF9JTlRfU1RBVFVT XzU6CgljYXNlIENTNDMxMzBfSFBfRENfU1RBVF8xIC4uLiBDUzQzMTMwX0hQX0RDX1NUQVRfMjoK CWNhc2UgQ1M0MzEzMF9IUF9BQ19TVEFUXzEgLi4uIENTNDMxMzBfSFBfQUNfU1RBVF8yOgoJCXJl dHVybiB0cnVlOwoJZGVmYXVsdDoKCQlyZXR1cm4gZmFsc2U7Cgl9Cn0KCnN0YXRpYyBib29sIGNz NDMxMzBfcmVhZGFibGVfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQg cmVnKQp7Cglzd2l0Y2ggKHJlZykgewoJY2FzZSBDUzQzMTMwX0RFVklEX0FCIC4uLiBDUzQzMTMw X1NZU19DTEtfQ1RMXzE6CgljYXNlIENTNDMxMzBfU1BfU1JBVEUgLi4uIENTNDMxMzBfUEFEX0lO VF9DRkc6CgljYXNlIENTNDMxMzBfUFdETl9DVEw6CgljYXNlIENTNDMxMzBfQ1JZU1RBTF9TRVQ6 CgljYXNlIENTNDMxMzBfUExMX1NFVF8xIC4uLiBDUzQzMTMwX1BMTF9TRVRfNToKCWNhc2UgQ1M0 MzEzMF9QTExfU0VUXzY6CgljYXNlIENTNDMxMzBfUExMX1NFVF83OgoJY2FzZSBDUzQzMTMwX1BM TF9TRVRfODoKCWNhc2UgQ1M0MzEzMF9QTExfU0VUXzk6CgljYXNlIENTNDMxMzBfUExMX1NFVF8x MDoKCWNhc2UgQ1M0MzEzMF9DTEtPVVRfQ1RMOgoJY2FzZSBDUzQzMTMwX0FTUF9OVU1fMSAuLi4g Q1M0MzEzMF9BU1BfRlJBTUVfQ09ORjoKCWNhc2UgQ1M0MzEzMF9YU1BfTlVNXzEgLi4uIENTNDMx MzBfWFNQX0ZSQU1FX0NPTkY6CgljYXNlIENTNDMxMzBfQVNQX0NIXzFfTE9DOgoJY2FzZSBDUzQz MTMwX0FTUF9DSF8yX0xPQzoKCWNhc2UgQ1M0MzEzMF9BU1BfQ0hfMV9TWl9FTjoKCWNhc2UgQ1M0 MzEzMF9BU1BfQ0hfMl9TWl9FTjoKCWNhc2UgQ1M0MzEzMF9YU1BfQ0hfMV9MT0M6CgljYXNlIENT NDMxMzBfWFNQX0NIXzJfTE9DOgoJY2FzZSBDUzQzMTMwX1hTUF9DSF8xX1NaX0VOOgoJY2FzZSBD UzQzMTMwX1hTUF9DSF8yX1NaX0VOOgoJY2FzZSBDUzQzMTMwX0RTRF9WT0xfQiAuLi4gQ1M0MzEz MF9EU0RfUEFUSF9DVExfMzoKCWNhc2UgQ1M0MzEzMF9IUF9PVVRfQ1RMXzE6CgljYXNlIENTNDMx MzBfUENNX0ZJTFRfT1BUIC4uLiBDUzQzMTMwX1BDTV9QQVRIX0NUTF8yOgoJY2FzZSBDUzQzMTMw X0NMQVNTX0hfQ1RMOgoJY2FzZSBDUzQzMTMwX0hQX0RFVEVDVDoKCWNhc2UgQ1M0MzEzMF9IUF9T VEFUVVM6CgljYXNlIENTNDMxMzBfSFBfTE9BRF8xOgoJY2FzZSBDUzQzMTMwX0hQX01FQVNfTE9B RF8xOgoJY2FzZSBDUzQzMTMwX0hQX01FQVNfTE9BRF8yOgoJY2FzZSBDUzQzMTMwX0hQX0RDX1NU QVRfMToKCWNhc2UgQ1M0MzEzMF9IUF9EQ19TVEFUXzI6CgljYXNlIENTNDMxMzBfSFBfQUNfU1RB VF8xOgoJY2FzZSBDUzQzMTMwX0hQX0FDX1NUQVRfMjoKCWNhc2UgQ1M0MzEzMF9IUF9MT0FEX1NU QVQ6CgljYXNlIENTNDMxMzBfSU5UX1NUQVRVU18xIC4uLiBDUzQzMTMwX0lOVF9TVEFUVVNfNToK CWNhc2UgQ1M0MzEzMF9JTlRfTUFTS18xIC4uLiBDUzQzMTMwX0lOVF9NQVNLXzU6CgkJcmV0dXJu IHRydWU7CglkZWZhdWx0OgoJCXJldHVybiBmYWxzZTsKCX0KfQoKc3RhdGljIGJvb2wgY3M0MzEz MF9wcmVjaW91c19yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcp CnsKCXN3aXRjaCAocmVnKSB7CgljYXNlIENTNDMxMzBfSU5UX1NUQVRVU18xIC4uLiBDUzQzMTMw X0lOVF9TVEFUVVNfNToKCQlyZXR1cm4gdHJ1ZTsKCWRlZmF1bHQ6CgkJcmV0dXJuIGZhbHNlOwoJ fQp9CgpzdHJ1Y3QgY3M0MzEzMF9wbGxfcGFyYW1zIHsKCXVuc2lnbmVkIGludCBwbGxfaW47Cgl1 OCBzY2xrX3ByZWRpdjsKCXU4IHBsbF9kaXZfaW50OwoJdTMyIHBsbF9kaXZfZnJhYzsKCXU4IHBs bF9tb2RlOwoJdTggcGxsX2Rpdm91dDsKCXVuc2lnbmVkIGludCBwbGxfb3V0OwoJdTggcGxsX2Nh bF9yYXRpbzsKfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgY3M0MzEzMF9wbGxfcGFyYW1zIHBsbF9y YXRpb190YWJsZVtdID0gewoJezk2MDAwMDAsIDB4MDIsIDB4NDksIDB4ODAwMDAwLCAweDAwLCAw eDA4LCAyMjU3OTIwMCwgMTUxfSwKCXs5NjAwMDAwLCAweDAyLCAweDUwLCAweDAwMDAwMCwgMHgw MCwgMHgwOCwgMjQ1NzYwMDAsIDE2NH0sCgoJezExMjg5NjAwLCAweDAyLCAwWDQwLCAwLCAweDAx LCAweDA4LCAyMjU3OTIwMCwgMTI4fSwKCXsxMTI4OTYwMCwgMHgwMiwgMHg0NCwgMHgwNkY3MDAs IDB4MCwgMHgwOCwgMjQ1NzYwMDAsIDEzOX0sCgoJezEyMDAwMDAwLCAweDAyLCAweDQ5LCAweDgw MDAwMCwgMHgwMCwgMHgwQSwgMjI1NzkyMDAsIDEyMH0sCgl7MTIwMDAwMDAsIDB4MDIsIDB4NDAs IDB4MDAwMDAwLCAweDAwLCAweDA4LCAyNDU3NjAwMCwgMTMxfSwKCgl7MTIyODgwMDAsIDB4MDIs IDB4NDksIDB4ODAwMDAwLCAweDAxLCAweDBBLCAyMjU3OTIwMCwgMTE4fSwKCXsxMjI4ODAwMCwg MHgwMiwgMHg0MCwgMHgwMDAwMDAsIDB4MDEsIDB4MDgsIDI0NTc2MDAwLCAxMjh9LAoKCXsxMzAw MDAwMCwgMHgwMiwgMHg0NSwgMHg3OTc2ODAsIDB4MDEsIDB4MEEsIDIyNTc5MjAwLCAxMTF9LAoJ ezEzMDAwMDAwLCAweDAyLCAweDNDLCAweDdFQTk0MCwgMHgwMSwgMHgwOCwgMjQ1NzYwMDAsIDEy MX0sCgoJezE5MjAwMDAwLCAweDAzLCAweDQ5LCAweDgwMDAwMCwgMHgwMCwgMHgwOCwgMjI1Nzky MDAsIDE1MX0sCgl7MTkyMDAwMDAsIDB4MDMsIDB4NTAsIDB4MDAwMDAwLCAweDAwLCAweDA4LCAy NDU3NjAwMCwgMTY0fSwKCgl7MjI1NzkyMDAsIDAsIDAsIDAsIDAsIDAsIDIyNTc5MjAwLCAwfSwK CXsyMjU3OTIwMCwgMHgwMywgMHg0NCwgMHgwNkY3MDAsIDB4MDAsIDB4MDgsIDI0NTc2MDAwLCAx Mzl9LAoKCXsyNDAwMDAwMCwgMHgwMywgMHg0OSwgMHg4MDAwMDAsIDB4MDAsIDB4MEEsIDIyNTc5 MjAwLCAxMjB9LAoJezI0MDAwMDAwLCAweDAzLCAweDQwLCAweDAwMDAwMCwgMHgwMCwgMHgwOCwg MjQ1NzYwMDAsIDEzMX0sCgoJezI0NTc2MDAwLCAweDAzLCAweDQ5LCAweDgwMDAwMCwgMHgwMSwg MHgwQSwgMjI1NzkyMDAsIDExOH0sCgl7MjQ1NzYwMDAsIDAsIDAsIDAsIDAsIDAsIDI0NTc2MDAw LCAwfSwKCgl7MjYwMDAwMDAsIDB4MDMsIDB4NDUsIDB4Nzk3NjgwLCAweDAxLCAweDBBLCAyMjU3 OTIwMCwgMTExfSwKCXsyNjAwMDAwMCwgMHgwMywgMHgzQywgMHg3RUE5NDAsIDB4MDEsIDB4MDgs IDI0NTc2MDAwLCAxMjF9LAp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCBjczQzMTMwX3BsbF9wYXJh bXMgKmNzNDMxMzBfZ2V0X3BsbF90YWJsZSgKCQl1bnNpZ25lZCBpbnQgZnJlcV9pbiwgdW5zaWdu ZWQgaW50IGZyZXFfb3V0KQp7CglpbnQgaTsKCglmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShw bGxfcmF0aW9fdGFibGUpOyBpKyspIHsKCQlpZiAocGxsX3JhdGlvX3RhYmxlW2ldLnBsbF9pbiA9 PSBmcmVxX2luICYmCgkJICAgIHBsbF9yYXRpb190YWJsZVtpXS5wbGxfb3V0ID09IGZyZXFfb3V0 KQoJCQlyZXR1cm4gJnBsbF9yYXRpb190YWJsZVtpXTsKCX0KCglyZXR1cm4gTlVMTDsKfQoKc3Rh dGljIGludCBjczQzMTMwX3BsbF9jb25maWcoc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21w b25lbnQpCnsKCXN0cnVjdCBjczQzMTMwX3ByaXZhdGUgKmNzNDMxMzAgPSBzbmRfc29jX2NvbXBv bmVudF9nZXRfZHJ2ZGF0YShjb21wb25lbnQpOwoJY29uc3Qgc3RydWN0IGNzNDMxMzBfcGxsX3Bh cmFtcyAqcGxsX2VudHJ5OwoKCWRldl9kYmcoY29tcG9uZW50LT5kZXYsICJjczQzMTMwLT5tY2xr ID0gJXUsIGNzNDMxMzAtPm1jbGtfaW50ID0gJXVcbiIsCgkJY3M0MzEzMC0+bWNsaywgY3M0MzEz MC0+bWNsa19pbnQpOwoKCXBsbF9lbnRyeSA9IGNzNDMxMzBfZ2V0X3BsbF90YWJsZShjczQzMTMw LT5tY2xrLCBjczQzMTMwLT5tY2xrX2ludCk7CglpZiAoIXBsbF9lbnRyeSkKCQlyZXR1cm4gLUVJ TlZBTDsKCglpZiAocGxsX2VudHJ5LT5wbGxfY2FsX3JhdGlvID09IDApIHsKCQlyZWdtYXBfdXBk YXRlX2JpdHMoY3M0MzEzMC0+cmVnbWFwLCBDUzQzMTMwX1BMTF9TRVRfMSwKCQkJCSAgIENTNDMx MzBfUExMX1NUQVJUX01BU0ssIDApOwoKCQljczQzMTMwLT5wbGxfYnlwYXNzID0gdHJ1ZTsKCQly ZXR1cm4gMDsKCX0KCgljczQzMTMwLT5wbGxfYnlwYXNzID0gZmFsc2U7CgoJcmVnbWFwX3VwZGF0 ZV9iaXRzKGNzNDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9QTExfU0VUXzIsCgkJCSAgIENTNDMxMzBf UExMX0RJVl9EQVRBX01BU0ssCgkJCSAgIHBsbF9lbnRyeS0+cGxsX2Rpdl9mcmFjID4+CgkJCSAg IENTNDMxMzBfUExMX0RJVl9GUkFDXzBfREFUQV9TSElGVCk7CglyZWdtYXBfdXBkYXRlX2JpdHMo Y3M0MzEzMC0+cmVnbWFwLCBDUzQzMTMwX1BMTF9TRVRfMywKCQkJICAgQ1M0MzEzMF9QTExfRElW X0RBVEFfTUFTSywKCQkJICAgcGxsX2VudHJ5LT5wbGxfZGl2X2ZyYWMgPj4KCQkJICAgQ1M0MzEz MF9QTExfRElWX0ZSQUNfMV9EQVRBX1NISUZUKTsKCXJlZ21hcF91cGRhdGVfYml0cyhjczQzMTMw LT5yZWdtYXAsIENTNDMxMzBfUExMX1NFVF80LAoJCQkgICBDUzQzMTMwX1BMTF9ESVZfREFUQV9N QVNLLAoJCQkgICBwbGxfZW50cnktPnBsbF9kaXZfZnJhYyA+PgoJCQkgICBDUzQzMTMwX1BMTF9E SVZfRlJBQ18yX0RBVEFfU0hJRlQpOwoJcmVnbWFwX3dyaXRlKGNzNDMxMzAtPnJlZ21hcCwgQ1M0 MzEzMF9QTExfU0VUXzUsCgkJICAgICBwbGxfZW50cnktPnBsbF9kaXZfaW50KTsKCXJlZ21hcF93 cml0ZShjczQzMTMwLT5yZWdtYXAsIENTNDMxMzBfUExMX1NFVF82LCBwbGxfZW50cnktPnBsbF9k aXZvdXQpOwoJcmVnbWFwX3dyaXRlKGNzNDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9QTExfU0VUXzcs CgkJICAgICBwbGxfZW50cnktPnBsbF9jYWxfcmF0aW8pOwoJcmVnbWFwX3VwZGF0ZV9iaXRzKGNz NDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9QTExfU0VUXzgsCgkJCSAgIENTNDMxMzBfUExMX01PREVf TUFTSywKCQkJICAgcGxsX2VudHJ5LT5wbGxfbW9kZSA8PCBDUzQzMTMwX1BMTF9NT0RFX1NISUZU KTsKCXJlZ21hcF93cml0ZShjczQzMTMwLT5yZWdtYXAsIENTNDMxMzBfUExMX1NFVF85LAoJCSAg ICAgcGxsX2VudHJ5LT5zY2xrX3ByZWRpdik7CglyZWdtYXBfdXBkYXRlX2JpdHMoY3M0MzEzMC0+ cmVnbWFwLCBDUzQzMTMwX1BMTF9TRVRfMSwKCQkJICAgQ1M0MzEzMF9QTExfU1RBUlRfTUFTSywg MSk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgY3M0MzEzMF9zZXRfcGxsKHN0cnVjdCBzbmRf c29jX2NvbXBvbmVudCAqY29tcG9uZW50LCBpbnQgcGxsX2lkLCBpbnQgc291cmNlLAoJCQkgICB1 bnNpZ25lZCBpbnQgZnJlcV9pbiwgdW5zaWduZWQgaW50IGZyZXFfb3V0KQp7CglpbnQgcmV0ID0g MDsKCXN0cnVjdCBjczQzMTMwX3ByaXZhdGUgKmNzNDMxMzAgPSBzbmRfc29jX2NvbXBvbmVudF9n ZXRfZHJ2ZGF0YShjb21wb25lbnQpOwoKCXN3aXRjaCAoZnJlcV9pbikgewoJY2FzZSA5NjAwMDAw OgoJY2FzZSAxMTI4OTYwMDoKCWNhc2UgMTIwMDAwMDA6CgljYXNlIDEyMjg4MDAwOgoJY2FzZSAx MzAwMDAwMDoKCWNhc2UgMTkyMDAwMDA6CgljYXNlIDIyNTc5MjAwOgoJY2FzZSAyNDAwMDAwMDoK CWNhc2UgMjQ1NzYwMDA6CgljYXNlIDI2MDAwMDAwOgoJCWNzNDMxMzAtPm1jbGsgPSBmcmVxX2lu OwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlkZXZfZXJyKGNvbXBvbmVudC0+ZGV2LAoJCQkidW5zdXBw b3J0ZWQgcGxsIGlucHV0IHJlZmVyZW5jZSBjbG9jazolZFxuIiwgZnJlcV9pbik7CgkJcmV0dXJu IC1FSU5WQUw7Cgl9CgoJc3dpdGNoIChmcmVxX291dCkgewoJY2FzZSAyMjU3OTIwMDoKCQljczQz MTMwLT5tY2xrX2ludCA9IGZyZXFfb3V0OwoJCWJyZWFrOwoJY2FzZSAyNDU3NjAwMDoKCQljczQz MTMwLT5tY2xrX2ludCA9IGZyZXFfb3V0OwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlkZXZfZXJyKGNv bXBvbmVudC0+ZGV2LAoJCQkidW5zdXBwb3J0ZWQgcGxsIG91dHB1dCByZWYgY2xvY2s6ICV1XG4i LCBmcmVxX291dCk7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJcmV0ID0gY3M0MzEzMF9wbGxfY29u ZmlnKGNvbXBvbmVudCk7CglkZXZfZGJnKGNvbXBvbmVudC0+ZGV2LCAiY3M0MzEzMC0+cGxsX2J5 cGFzcyA9ICVkIiwgY3M0MzEzMC0+cGxsX2J5cGFzcyk7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMg aW50IGNzNDMxMzBfY2hhbmdlX2Nsa3NyYyhzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXBv bmVudCwKCQkJCSBlbnVtIGNzNDMxMzBfbWNsa19zcmNfc2VsIHNyYykKewoJaW50IHJldDsKCXN0 cnVjdCBjczQzMTMwX3ByaXZhdGUgKmNzNDMxMzAgPSBzbmRfc29jX2NvbXBvbmVudF9nZXRfZHJ2 ZGF0YShjb21wb25lbnQpOwoJaW50IG1jbGtfaW50X2RlY29kZWQ7CgoJaWYgKHNyYyA9PSBjczQz MTMwLT5tY2xrX2ludF9zcmMpIHsKCQkvKiBjbGsgc291cmNlIGhhcyBub3QgY2hhbmdlZCAqLwoJ CXJldHVybiAwOwoJfQoKCXN3aXRjaCAoY3M0MzEzMC0+bWNsa19pbnQpIHsKCWNhc2UgQ1M0MzEz MF9NQ0xLXzIyTToKCQltY2xrX2ludF9kZWNvZGVkID0gQ1M0MzEzMF9NQ0xLXzIyUDU7CgkJYnJl YWs7CgljYXNlIENTNDMxMzBfTUNMS18yNE06CgkJbWNsa19pbnRfZGVjb2RlZCA9IENTNDMxMzBf TUNMS18yNFA1OwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlkZXZfZXJyKGNvbXBvbmVudC0+ZGV2LCAi SW52YWxpZCBNQ0xLIElOVCBmcmVxOiAldVxuIiwgY3M0MzEzMC0+bWNsa19pbnQpOwoJCXJldHVy biAtRUlOVkFMOwoJfQoKCXN3aXRjaCAoc3JjKSB7CgljYXNlIENTNDMxMzBfTUNMS19TUkNfRVhU OgoJCWNzNDMxMzAtPnBsbF9ieXBhc3MgPSB0cnVlOwoJCWNzNDMxMzAtPm1jbGtfaW50X3NyYyA9 IENTNDMxMzBfTUNMS19TUkNfRVhUOwoJCWlmIChjczQzMTMwLT54dGFsX2liaWFzID09IENTNDMx MzBfWFRBTF9VTlVTRUQpIHsKCQkJcmVnbWFwX3VwZGF0ZV9iaXRzKGNzNDMxMzAtPnJlZ21hcCwg Q1M0MzEzMF9QV0ROX0NUTCwKCQkJCQkgICBDUzQzMTMwX1BETl9YVEFMX01BU0ssCgkJCQkJICAg MSA8PCBDUzQzMTMwX1BETl9YVEFMX1NISUZUKTsKCQl9IGVsc2UgewoJCQlyZWluaXRfY29tcGxl dGlvbigmY3M0MzEzMC0+eHRhbF9yZHkpOwoJCQlyZWdtYXBfdXBkYXRlX2JpdHMoY3M0MzEzMC0+ cmVnbWFwLCBDUzQzMTMwX0lOVF9NQVNLXzEsCgkJCQkJICAgQ1M0MzEzMF9YVEFMX1JEWV9JTlRf TUFTSywgMCk7CgkJCXJlZ21hcF91cGRhdGVfYml0cyhjczQzMTMwLT5yZWdtYXAsIENTNDMxMzBf UFdETl9DVEwsCgkJCQkJICAgQ1M0MzEzMF9QRE5fWFRBTF9NQVNLLCAwKTsKCQkJcmV0ID0gd2Fp dF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjczQzMTMwLT54dGFsX3JkeSwKCQkJCQkJCSAgbXNl Y3NfdG9famlmZmllcygxMDApKTsKCQkJcmVnbWFwX3VwZGF0ZV9iaXRzKGNzNDMxMzAtPnJlZ21h cCwgQ1M0MzEzMF9JTlRfTUFTS18xLAoJCQkJCSAgIENTNDMxMzBfWFRBTF9SRFlfSU5UX01BU0ss CgkJCQkJICAgMSA8PCBDUzQzMTMwX1hUQUxfUkRZX0lOVF9TSElGVCk7CgkJCWlmIChyZXQgPT0g MCkgewoJCQkJZGV2X2Vycihjb21wb25lbnQtPmRldiwgIlRpbWVvdXQgd2FpdGluZyBmb3IgWFRB TF9SRUFEWSBpbnRlcnJ1cHRcbiIpOwoJCQkJcmV0dXJuIC1FVElNRURPVVQ7CgkJCX0KCQl9CgoJ CXJlZ21hcF91cGRhdGVfYml0cyhjczQzMTMwLT5yZWdtYXAsIENTNDMxMzBfU1lTX0NMS19DVExf MSwKCQkJCSAgIENTNDMxMzBfTUNMS19TUkNfU0VMX01BU0ssCgkJCQkgICBzcmMgPDwgQ1M0MzEz MF9NQ0xLX1NSQ19TRUxfU0hJRlQpOwoJCXJlZ21hcF91cGRhdGVfYml0cyhjczQzMTMwLT5yZWdt YXAsIENTNDMxMzBfU1lTX0NMS19DVExfMSwKCQkJCSAgIENTNDMxMzBfTUNMS19JTlRfTUFTSywK CQkJCSAgIG1jbGtfaW50X2RlY29kZWQgPDwgQ1M0MzEzMF9NQ0xLX0lOVF9TSElGVCk7CgkJdXNs ZWVwX3JhbmdlKDE1MCwgMjAwKTsKCgkJcmVnbWFwX3VwZGF0ZV9iaXRzKGNzNDMxMzAtPnJlZ21h cCwgQ1M0MzEzMF9QV0ROX0NUTCwKCQkJCSAgIENTNDMxMzBfUEROX1BMTF9NQVNLLAoJCQkJICAg MSA8PCBDUzQzMTMwX1BETl9QTExfU0hJRlQpOwoJCWJyZWFrOwoJY2FzZSBDUzQzMTMwX01DTEtf U1JDX1BMTDoKCQljczQzMTMwLT5wbGxfYnlwYXNzID0gZmFsc2U7CgkJY3M0MzEzMC0+bWNsa19p bnRfc3JjID0gQ1M0MzEzMF9NQ0xLX1NSQ19QTEw7CgkJaWYgKGNzNDMxMzAtPnh0YWxfaWJpYXMg PT0gQ1M0MzEzMF9YVEFMX1VOVVNFRCkgewoJCQlyZWdtYXBfdXBkYXRlX2JpdHMoY3M0MzEzMC0+ cmVnbWFwLCBDUzQzMTMwX1BXRE5fQ1RMLAoJCQkJCSAgIENTNDMxMzBfUEROX1hUQUxfTUFTSywK CQkJCQkgICAxIDw8IENTNDMxMzBfUEROX1hUQUxfU0hJRlQpOwoJCX0gZWxzZSB7CgkJCXJlaW5p dF9jb21wbGV0aW9uKCZjczQzMTMwLT54dGFsX3JkeSk7CgkJCXJlZ21hcF91cGRhdGVfYml0cyhj czQzMTMwLT5yZWdtYXAsIENTNDMxMzBfSU5UX01BU0tfMSwKCQkJCQkgICBDUzQzMTMwX1hUQUxf UkRZX0lOVF9NQVNLLCAwKTsKCQkJcmVnbWFwX3VwZGF0ZV9iaXRzKGNzNDMxMzAtPnJlZ21hcCwg Q1M0MzEzMF9QV0ROX0NUTCwKCQkJCQkgICBDUzQzMTMwX1BETl9YVEFMX01BU0ssIDApOwoJCQly ZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmNzNDMxMzAtPnh0YWxfcmR5LAoJCQkJ CQkJICBtc2Vjc190b19qaWZmaWVzKDEwMCkpOwoJCQlyZWdtYXBfdXBkYXRlX2JpdHMoY3M0MzEz MC0+cmVnbWFwLCBDUzQzMTMwX0lOVF9NQVNLXzEsCgkJCQkJICAgQ1M0MzEzMF9YVEFMX1JEWV9J TlRfTUFTSywKCQkJCQkgICAxIDw8IENTNDMxMzBfWFRBTF9SRFlfSU5UX1NISUZUKTsKCQkJaWYg KHJldCA9PSAwKSB7CgkJCQlkZXZfZXJyKGNvbXBvbmVudC0+ZGV2LCAiVGltZW91dCB3YWl0aW5n IGZvciBYVEFMX1JFQURZIGludGVycnVwdFxuIik7CgkJCQlyZXR1cm4gLUVUSU1FRE9VVDsKCQkJ fQoJCX0KCgkJcmVpbml0X2NvbXBsZXRpb24oJmNzNDMxMzAtPnBsbF9yZHkpOwoJCXJlZ21hcF91 cGRhdGVfYml0cyhjczQzMTMwLT5yZWdtYXAsIENTNDMxMzBfSU5UX01BU0tfMSwKCQkJCSAgIENT NDMxMzBfUExMX1JEWV9JTlRfTUFTSywgMCk7CgkJcmVnbWFwX3VwZGF0ZV9iaXRzKGNzNDMxMzAt PnJlZ21hcCwgQ1M0MzEzMF9QV0ROX0NUTCwKCQkJCSAgIENTNDMxMzBfUEROX1BMTF9NQVNLLCAw KTsKCQlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmNzNDMxMzAtPnBsbF9yZHks CgkJCQkJCSAgbXNlY3NfdG9famlmZmllcygxMDApKTsKCQlyZWdtYXBfdXBkYXRlX2JpdHMoY3M0 MzEzMC0+cmVnbWFwLCBDUzQzMTMwX0lOVF9NQVNLXzEsCgkJCQkgICBDUzQzMTMwX1BMTF9SRFlf SU5UX01BU0ssCgkJCQkgICAxIDw8IENTNDMxMzBfUExMX1JEWV9JTlRfU0hJRlQpOwoJCWlmIChy ZXQgPT0gMCkgewoJCQlkZXZfZXJyKGNvbXBvbmVudC0+ZGV2LCAiVGltZW91dCB3YWl0aW5nIGZv ciBQTExfUkVBRFkgaW50ZXJydXB0XG4iKTsKCQkJcmV0dXJuIC1FVElNRURPVVQ7CgkJfQoKCQly ZWdtYXBfdXBkYXRlX2JpdHMoY3M0MzEzMC0+cmVnbWFwLCBDUzQzMTMwX1NZU19DTEtfQ1RMXzEs CgkJCQkgICBDUzQzMTMwX01DTEtfU1JDX1NFTF9NQVNLLAoJCQkJICAgc3JjIDw8IENTNDMxMzBf TUNMS19TUkNfU0VMX1NISUZUKTsKCQlyZWdtYXBfdXBkYXRlX2JpdHMoY3M0MzEzMC0+cmVnbWFw LCBDUzQzMTMwX1NZU19DTEtfQ1RMXzEsCgkJCQkgICBDUzQzMTMwX01DTEtfSU5UX01BU0ssCgkJ CQkgICBtY2xrX2ludF9kZWNvZGVkIDw8IENTNDMxMzBfTUNMS19JTlRfU0hJRlQpOwoJCXVzbGVl cF9yYW5nZSgxNTAsIDIwMCk7CgkJYnJlYWs7CgljYXNlIENTNDMxMzBfTUNMS19TUkNfUkNPOgoJ CWNzNDMxMzAtPm1jbGtfaW50X3NyYyA9IENTNDMxMzBfTUNMS19TUkNfUkNPOwoKCQlyZWdtYXBf dXBkYXRlX2JpdHMoY3M0MzEzMC0+cmVnbWFwLCBDUzQzMTMwX1NZU19DTEtfQ1RMXzEsCgkJCQkg ICBDUzQzMTMwX01DTEtfU1JDX1NFTF9NQVNLLAoJCQkJICAgc3JjIDw8IENTNDMxMzBfTUNMS19T UkNfU0VMX1NISUZUKTsKCQlyZWdtYXBfdXBkYXRlX2JpdHMoY3M0MzEzMC0+cmVnbWFwLCBDUzQz MTMwX1NZU19DTEtfQ1RMXzEsCgkJCQkgICBDUzQzMTMwX01DTEtfSU5UX01BU0ssCgkJCQkgICBD UzQzMTMwX01DTEtfMjJQNSA8PCBDUzQzMTMwX01DTEtfSU5UX1NISUZUKTsKCQl1c2xlZXBfcmFu Z2UoMTUwLCAyMDApOwoKCQlyZWdtYXBfdXBkYXRlX2JpdHMoY3M0MzEzMC0+cmVnbWFwLCBDUzQz MTMwX1BXRE5fQ1RMLAoJCQkJICAgQ1M0MzEzMF9QRE5fWFRBTF9NQVNLLAoJCQkJICAgMSA8PCBD UzQzMTMwX1BETl9YVEFMX1NISUZUKTsKCQlyZWdtYXBfdXBkYXRlX2JpdHMoY3M0MzEzMC0+cmVn bWFwLCBDUzQzMTMwX1BXRE5fQ1RMLAoJCQkJICAgQ1M0MzEzMF9QRE5fUExMX01BU0ssCgkJCQkg ICAxIDw8IENTNDMxMzBfUEROX1BMTF9TSElGVCk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCWRldl9l cnIoY29tcG9uZW50LT5kZXYsICJJbnZhbGlkIE1DTEsgc291cmNlIHZhbHVlXG4iKTsKCQlyZXR1 cm4gLUVJTlZBTDsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGNvbnN0IHN0cnVjdCBjczQzMTMw X2JpdHdpZHRoX21hcCBjczQzMTMwX2JpdHdpZHRoX3RhYmxlW10gPSB7Cgl7OCwJQ1M0MzEzMF9T UF9CSVRfU0laRV84LAlDUzQzMTMwX0NIX0JJVF9TSVpFXzh9LAoJezE2LAlDUzQzMTMwX1NQX0JJ VF9TSVpFXzE2LCBDUzQzMTMwX0NIX0JJVF9TSVpFXzE2fSwKCXsyNCwJQ1M0MzEzMF9TUF9CSVRf U0laRV8yNCwgQ1M0MzEzMF9DSF9CSVRfU0laRV8yNH0sCgl7MzIsCUNTNDMxMzBfU1BfQklUX1NJ WkVfMzIsIENTNDMxMzBfQ0hfQklUX1NJWkVfMzJ9LAp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCBj czQzMTMwX2JpdHdpZHRoX21hcCAqY3M0MzEzMF9nZXRfYml0d2lkdGhfdGFibGUoCgkJCQl1bnNp Z25lZCBpbnQgYml0d2lkdGgpCnsKCWludCBpOwoKCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpF KGNzNDMxMzBfYml0d2lkdGhfdGFibGUpOyBpKyspIHsKCQlpZiAoY3M0MzEzMF9iaXR3aWR0aF90 YWJsZVtpXS5iaXR3aWR0aCA9PSBiaXR3aWR0aCkKCQkJcmV0dXJuICZjczQzMTMwX2JpdHdpZHRo X3RhYmxlW2ldOwoJfQoKCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgaW50IGNzNDMxMzBfc2V0X2Jp dHdpZHRoKGludCBkYWlfaWQsIHVuc2lnbmVkIGludCBiaXR3aWR0aF9kYWksCgkJCSAgc3RydWN0 IHJlZ21hcCAqcmVnbWFwKQp7Cgljb25zdCBzdHJ1Y3QgY3M0MzEzMF9iaXR3aWR0aF9tYXAgKmJ3 X21hcDsKCglid19tYXAgPSBjczQzMTMwX2dldF9iaXR3aWR0aF90YWJsZShiaXR3aWR0aF9kYWkp OwoJaWYgKCFid19tYXApCgkJcmV0dXJuIC1FSU5WQUw7CgoJc3dpdGNoIChkYWlfaWQpIHsKCWNh c2UgQ1M0MzEzMF9BU1BfUENNX0RBSToKCWNhc2UgQ1M0MzEzMF9BU1BfRE9QX0RBSToKCQlyZWdt YXBfdXBkYXRlX2JpdHMocmVnbWFwLCBDUzQzMTMwX0FTUF9DSF8xX1NaX0VOLAoJCQkJICAgQ1M0 MzEzMF9DSF9CSVRTSVpFX01BU0ssIGJ3X21hcC0+Y2hfYml0KTsKCQlyZWdtYXBfdXBkYXRlX2Jp dHMocmVnbWFwLCBDUzQzMTMwX0FTUF9DSF8yX1NaX0VOLAoJCQkJICAgQ1M0MzEzMF9DSF9CSVRT SVpFX01BU0ssIGJ3X21hcC0+Y2hfYml0KTsKCQlyZWdtYXBfdXBkYXRlX2JpdHMocmVnbWFwLCBD UzQzMTMwX1NQX0JJVFNJWkUsCgkJCQkgICBDUzQzMTMwX0FTUF9CSVRTSVpFX01BU0ssIGJ3X21h cC0+c3BfYml0KTsKCQlicmVhazsKCWNhc2UgQ1M0MzEzMF9YU1BfRE9QX0RBSToKCQlyZWdtYXBf dXBkYXRlX2JpdHMocmVnbWFwLCBDUzQzMTMwX1hTUF9DSF8xX1NaX0VOLAoJCQkJICAgQ1M0MzEz MF9DSF9CSVRTSVpFX01BU0ssIGJ3X21hcC0+Y2hfYml0KTsKCQlyZWdtYXBfdXBkYXRlX2JpdHMo cmVnbWFwLCBDUzQzMTMwX1hTUF9DSF8yX1NaX0VOLAoJCQkJICAgQ1M0MzEzMF9DSF9CSVRTSVpF X01BU0ssIGJ3X21hcC0+Y2hfYml0KTsKCQlyZWdtYXBfdXBkYXRlX2JpdHMocmVnbWFwLCBDUzQz MTMwX1NQX0JJVFNJWkUsCgkJCQkgICBDUzQzMTMwX1hTUF9CSVRTSVpFX01BU0ssIGJ3X21hcC0+ c3BfYml0IDw8CgkJCQkgICBDUzQzMTMwX1hTUF9CSVRTSVpFX1NISUZUKTsKCQlicmVhazsKCWRl ZmF1bHQ6CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBjb25zdCBz dHJ1Y3QgY3M0MzEzMF9yYXRlX21hcCBjczQzMTMwX3JhdGVfdGFibGVbXSA9IHsKCXszMjAwMCwJ CUNTNDMxMzBfQVNQX1NQUkFURV8zMkt9LAoJezQ0MTAwLAkJQ1M0MzEzMF9BU1BfU1BSQVRFXzQ0 XzFLfSwKCXs0ODAwMCwJCUNTNDMxMzBfQVNQX1NQUkFURV80OEt9LAoJezg4MjAwLAkJQ1M0MzEz MF9BU1BfU1BSQVRFXzg4XzJLfSwKCXs5NjAwMCwJCUNTNDMxMzBfQVNQX1NQUkFURV85Nkt9LAoJ ezE3NjQwMCwJQ1M0MzEzMF9BU1BfU1BSQVRFXzE3Nl80S30sCgl7MTkyMDAwLAlDUzQzMTMwX0FT UF9TUFJBVEVfMTkyS30sCgl7MzUyODAwLAlDUzQzMTMwX0FTUF9TUFJBVEVfMzUyXzhLfSwKCXsz ODQwMDAsCUNTNDMxMzBfQVNQX1NQUkFURV8zODRLfSwKfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3Qg Y3M0MzEzMF9yYXRlX21hcCAqY3M0MzEzMF9nZXRfcmF0ZV90YWJsZShpbnQgZnMpCnsKCWludCBp OwoKCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNzNDMxMzBfcmF0ZV90YWJsZSk7IGkrKykg ewoJCWlmIChjczQzMTMwX3JhdGVfdGFibGVbaV0uZnMgPT0gZnMpCgkJCXJldHVybiAmY3M0MzEz MF9yYXRlX3RhYmxlW2ldOwoJfQoKCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgY29uc3Qgc3RydWN0 IGNzNDMxMzBfY2xrX2dlbiAqY3M0MzEzMF9nZXRfY2xrX2dlbihpbnQgbWNsa19pbnQsIGludCBm cywKCQljb25zdCBzdHJ1Y3QgY3M0MzEzMF9jbGtfZ2VuICpjbGtfZ2VuX3RhYmxlLCBpbnQgbGVu X2Nsa19nZW5fdGFibGUpCnsKCWludCBpOwoKCWZvciAoaSA9IDA7IGkgPCBsZW5fY2xrX2dlbl90 YWJsZTsgaSsrKSB7CgkJaWYgKGNsa19nZW5fdGFibGVbaV0ubWNsa19pbnQgPT0gbWNsa19pbnQg JiYKCQkgICAgY2xrX2dlbl90YWJsZVtpXS5mcyA9PSBmcykKCQkJcmV0dXJuICZjbGtfZ2VuX3Rh YmxlW2ldOwoJfQoKCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgaW50IGNzNDMxMzBfc2V0X3NwX2Zt dChpbnQgZGFpX2lkLCB1bnNpZ25lZCBpbnQgYml0d2lkdGhfc2NsaywKCQkJICAgICAgc3RydWN0 IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCgkJCSAgICAgIHN0cnVjdCBjczQzMTMwX3ByaXZh dGUgKmNzNDMxMzApCnsKCXUxNiBmcm1fc2l6ZTsKCXUxNiBoaV9zaXplOwoJdTggZnJtX2RlbGF5 OwoJdTggZnJtX3BoYXNlOwoJdTggZnJtX2RhdGE7Cgl1OCBzY2xrX2VkZ2U7Cgl1OCBscmNrX2Vk Z2U7Cgl1OCBjbGtfZGF0YTsKCXU4IGxvY19jaDE7Cgl1OCBsb2NfY2gyOwoJdTggZGFpX21vZGVf dmFsOwoJY29uc3Qgc3RydWN0IGNzNDMxMzBfY2xrX2dlbiAqY2xrX2dlbjsKCglzd2l0Y2ggKGNz NDMxMzAtPmRhaXNbZGFpX2lkXS5kYWlfZm9ybWF0KSB7CgljYXNlIFNORF9TT0NfREFJRk1UX0ky UzoKCQloaV9zaXplID0gYml0d2lkdGhfc2NsazsKCQlmcm1fZGVsYXkgPSAyOwoJCWZybV9waGFz ZSA9IDA7CgkJYnJlYWs7CgljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKCQloaV9zaXplID0g Yml0d2lkdGhfc2NsazsKCQlmcm1fZGVsYXkgPSAyOwoJCWZybV9waGFzZSA9IDE7CgkJYnJlYWs7 CgljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgoJCWhpX3NpemUgPSAxOwoJCWZybV9kZWxheSA9 IDI7CgkJZnJtX3BoYXNlID0gMTsKCQlicmVhazsKCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6 CgkJaGlfc2l6ZSA9IDE7CgkJZnJtX2RlbGF5ID0gMDsKCQlmcm1fcGhhc2UgPSAxOwoJCWJyZWFr OwoJZGVmYXVsdDoKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCglzd2l0Y2ggKGNzNDMxMzAtPmRhaXNb ZGFpX2lkXS5kYWlfbW9kZSkgewoJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgoJCWRhaV9t b2RlX3ZhbCA9IDA7CgkJYnJlYWs7CgljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CgkJZGFp X21vZGVfdmFsID0gMTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJ ZnJtX3NpemUgPSBiaXR3aWR0aF9zY2xrICogcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CglzY2xr X2VkZ2UgPSAxOwoJbHJja19lZGdlID0gMDsKCWxvY19jaDEgPSAwOwoJbG9jX2NoMiA9IGJpdHdp ZHRoX3NjbGsgKiAocGFyYW1zX2NoYW5uZWxzKHBhcmFtcykgLSAxKTsKCglmcm1fZGF0YSA9IGZy bV9kZWxheSAmIENTNDMxMzBfU1BfRlNEX01BU0s7Cglmcm1fZGF0YSB8PSAoZnJtX3BoYXNlIDw8 IENTNDMxMzBfU1BfU1RQX1NISUZUKSAmIENTNDMxMzBfU1BfU1RQX01BU0s7CgoJY2xrX2RhdGEg PSBscmNrX2VkZ2UgJiBDUzQzMTMwX1NQX0xDUE9MX0lOX01BU0s7CgljbGtfZGF0YSB8PSAobHJj a19lZGdlIDw8IENTNDMxMzBfU1BfTENQT0xfT1VUX1NISUZUKSAmCgkJICAgIENTNDMxMzBfU1Bf TENQT0xfT1VUX01BU0s7CgljbGtfZGF0YSB8PSAoc2Nsa19lZGdlIDw8IENTNDMxMzBfU1BfU0NQ T0xfSU5fU0hJRlQpICYKCQkgICAgQ1M0MzEzMF9TUF9TQ1BPTF9JTl9NQVNLOwoJY2xrX2RhdGEg fD0gKHNjbGtfZWRnZSA8PCBDUzQzMTMwX1NQX1NDUE9MX09VVF9TSElGVCkgJgoJCSAgICBDUzQz MTMwX1NQX1NDUE9MX09VVF9NQVNLOwoJY2xrX2RhdGEgfD0gKGRhaV9tb2RlX3ZhbCA8PCBDUzQz MTMwX1NQX01PREVfU0hJRlQpICYKCQkgICAgQ1M0MzEzMF9TUF9NT0RFX01BU0s7CgoJc3dpdGNo IChkYWlfaWQpIHsKCWNhc2UgQ1M0MzEzMF9BU1BfUENNX0RBSToKCWNhc2UgQ1M0MzEzMF9BU1Bf RE9QX0RBSToKCQlyZWdtYXBfdXBkYXRlX2JpdHMoY3M0MzEzMC0+cmVnbWFwLCBDUzQzMTMwX0FT UF9MUkNLX1BFUklPRF8xLAoJCQlDUzQzMTMwX1NQX0xDUFJfREFUQV9NQVNLLCAoZnJtX3NpemUg LSAxKSA+PgoJCQlDUzQzMTMwX1NQX0xDUFJfTFNCX0RBVEFfU0hJRlQpOwoJCXJlZ21hcF91cGRh dGVfYml0cyhjczQzMTMwLT5yZWdtYXAsIENTNDMxMzBfQVNQX0xSQ0tfUEVSSU9EXzIsCgkJCUNT NDMxMzBfU1BfTENQUl9EQVRBX01BU0ssIChmcm1fc2l6ZSAtIDEpID4+CgkJCUNTNDMxMzBfU1Bf TENQUl9NU0JfREFUQV9TSElGVCk7CgkJcmVnbWFwX3VwZGF0ZV9iaXRzKGNzNDMxMzAtPnJlZ21h cCwgQ1M0MzEzMF9BU1BfTFJDS19ISV9USU1FXzEsCgkJCUNTNDMxMzBfU1BfTENISV9EQVRBX01B U0ssIChoaV9zaXplIC0gMSkgPj4KCQkJQ1M0MzEzMF9TUF9MQ0hJX0xTQl9EQVRBX1NISUZUKTsK CQlyZWdtYXBfdXBkYXRlX2JpdHMoY3M0MzEzMC0+cmVnbWFwLCBDUzQzMTMwX0FTUF9MUkNLX0hJ X1RJTUVfMiwKCQkJQ1M0MzEzMF9TUF9MQ0hJX0RBVEFfTUFTSywgKGhpX3NpemUgLSAxKSA+PgoJ CQlDUzQzMTMwX1NQX0xDSElfTVNCX0RBVEFfU0hJRlQpOwoJCXJlZ21hcF93cml0ZShjczQzMTMw LT5yZWdtYXAsIENTNDMxMzBfQVNQX0ZSQU1FX0NPTkYsIGZybV9kYXRhKTsKCQlyZWdtYXBfd3Jp dGUoY3M0MzEzMC0+cmVnbWFwLCBDUzQzMTMwX0FTUF9DSF8xX0xPQywgbG9jX2NoMSk7CgkJcmVn bWFwX3dyaXRlKGNzNDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9BU1BfQ0hfMl9MT0MsIGxvY19jaDIp OwoJCXJlZ21hcF91cGRhdGVfYml0cyhjczQzMTMwLT5yZWdtYXAsIENTNDMxMzBfQVNQX0NIXzFf U1pfRU4sCgkJCUNTNDMxMzBfQ0hfRU5fTUFTSywgMSA8PCBDUzQzMTMwX0NIX0VOX1NISUZUKTsK CQlyZWdtYXBfdXBkYXRlX2JpdHMoY3M0MzEzMC0+cmVnbWFwLCBDUzQzMTMwX0FTUF9DSF8yX1Na X0VOLAoJCQlDUzQzMTMwX0NIX0VOX01BU0ssIDEgPDwgQ1M0MzEzMF9DSF9FTl9TSElGVCk7CgkJ cmVnbWFwX3dyaXRlKGNzNDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9BU1BfQ0xPQ0tfQ09ORiwgY2xr X2RhdGEpOwoJCWJyZWFrOwoJY2FzZSBDUzQzMTMwX1hTUF9ET1BfREFJOgoJCXJlZ21hcF91cGRh dGVfYml0cyhjczQzMTMwLT5yZWdtYXAsIENTNDMxMzBfWFNQX0xSQ0tfUEVSSU9EXzEsCgkJCUNT NDMxMzBfU1BfTENQUl9EQVRBX01BU0ssIChmcm1fc2l6ZSAtIDEpID4+CgkJCUNTNDMxMzBfU1Bf TENQUl9MU0JfREFUQV9TSElGVCk7CgkJcmVnbWFwX3VwZGF0ZV9iaXRzKGNzNDMxMzAtPnJlZ21h cCwgQ1M0MzEzMF9YU1BfTFJDS19QRVJJT0RfMiwKCQkJQ1M0MzEzMF9TUF9MQ1BSX0RBVEFfTUFT SywgKGZybV9zaXplIC0gMSkgPj4KCQkJQ1M0MzEzMF9TUF9MQ1BSX01TQl9EQVRBX1NISUZUKTsK CQlyZWdtYXBfdXBkYXRlX2JpdHMoY3M0MzEzMC0+cmVnbWFwLCBDUzQzMTMwX1hTUF9MUkNLX0hJ X1RJTUVfMSwKCQkJQ1M0MzEzMF9TUF9MQ0hJX0RBVEFfTUFTSywgKGhpX3NpemUgLSAxKSA+PgoJ CQlDUzQzMTMwX1NQX0xDSElfTFNCX0RBVEFfU0hJRlQpOwoJCXJlZ21hcF91cGRhdGVfYml0cyhj czQzMTMwLT5yZWdtYXAsIENTNDMxMzBfWFNQX0xSQ0tfSElfVElNRV8yLAoJCQlDUzQzMTMwX1NQ X0xDSElfREFUQV9NQVNLLCAoaGlfc2l6ZSAtIDEpID4+CgkJCUNTNDMxMzBfU1BfTENISV9NU0Jf REFUQV9TSElGVCk7CgkJcmVnbWFwX3dyaXRlKGNzNDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9YU1Bf RlJBTUVfQ09ORiwgZnJtX2RhdGEpOwoJCXJlZ21hcF93cml0ZShjczQzMTMwLT5yZWdtYXAsIENT NDMxMzBfWFNQX0NIXzFfTE9DLCBsb2NfY2gxKTsKCQlyZWdtYXBfd3JpdGUoY3M0MzEzMC0+cmVn bWFwLCBDUzQzMTMwX1hTUF9DSF8yX0xPQywgbG9jX2NoMik7CgkJcmVnbWFwX3VwZGF0ZV9iaXRz KGNzNDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9YU1BfQ0hfMV9TWl9FTiwKCQkJQ1M0MzEzMF9DSF9F Tl9NQVNLLCAxIDw8IENTNDMxMzBfQ0hfRU5fU0hJRlQpOwoJCXJlZ21hcF91cGRhdGVfYml0cyhj czQzMTMwLT5yZWdtYXAsIENTNDMxMzBfWFNQX0NIXzJfU1pfRU4sCgkJCUNTNDMxMzBfQ0hfRU5f TUFTSywgMSA8PCBDUzQzMTMwX0NIX0VOX1NISUZUKTsKCQlyZWdtYXBfd3JpdGUoY3M0MzEzMC0+ cmVnbWFwLCBDUzQzMTMwX1hTUF9DTE9DS19DT05GLCBjbGtfZGF0YSk7CgkJYnJlYWs7CglkZWZh dWx0OgoJCXJldHVybiAtRUlOVkFMOwoJfQoKCXN3aXRjaCAoZnJtX3NpemUpIHsKCWNhc2UgMTY6 CgkJY2xrX2dlbiA9IGNzNDMxMzBfZ2V0X2Nsa19nZW4oY3M0MzEzMC0+bWNsa19pbnQsCgkJCQkJ ICAgICAgcGFyYW1zX3JhdGUocGFyYW1zKSwKCQkJCQkgICAgICBjczQzMTMwXzE2X2Nsa19nZW4s CgkJCQkJICAgICAgQVJSQVlfU0laRShjczQzMTMwXzE2X2Nsa19nZW4pKTsKCQlicmVhazsKCWNh c2UgMzI6CgkJY2xrX2dlbiA9IGNzNDMxMzBfZ2V0X2Nsa19nZW4oY3M0MzEzMC0+bWNsa19pbnQs CgkJCQkJICAgICAgcGFyYW1zX3JhdGUocGFyYW1zKSwKCQkJCQkgICAgICBjczQzMTMwXzMyX2Ns a19nZW4sCgkJCQkJICAgICAgQVJSQVlfU0laRShjczQzMTMwXzMyX2Nsa19nZW4pKTsKCQlicmVh azsKCWNhc2UgNDg6CgkJY2xrX2dlbiA9IGNzNDMxMzBfZ2V0X2Nsa19nZW4oY3M0MzEzMC0+bWNs a19pbnQsCgkJCQkJICAgICAgcGFyYW1zX3JhdGUocGFyYW1zKSwKCQkJCQkgICAgICBjczQzMTMw XzQ4X2Nsa19nZW4sCgkJCQkJICAgICAgQVJSQVlfU0laRShjczQzMTMwXzQ4X2Nsa19nZW4pKTsK CQlicmVhazsKCWNhc2UgNjQ6CgkJY2xrX2dlbiA9IGNzNDMxMzBfZ2V0X2Nsa19nZW4oY3M0MzEz MC0+bWNsa19pbnQsCgkJCQkJICAgICAgcGFyYW1zX3JhdGUocGFyYW1zKSwKCQkJCQkgICAgICBj czQzMTMwXzY0X2Nsa19nZW4sCgkJCQkJICAgICAgQVJSQVlfU0laRShjczQzMTMwXzY0X2Nsa19n ZW4pKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJaWYgKCFjbGtf Z2VuKQoJCXJldHVybiAtRUlOVkFMOwoKCXN3aXRjaCAoZGFpX2lkKSB7CgljYXNlIENTNDMxMzBf QVNQX1BDTV9EQUk6CgljYXNlIENTNDMxMzBfQVNQX0RPUF9EQUk6CgkJcmVnbWFwX3dyaXRlKGNz NDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9BU1BfREVOXzEsCgkJCSAgICAgKGNsa19nZW4tPmRlbiAm IENTNDMxMzBfU1BfTV9MU0JfREFUQV9NQVNLKSA+PgoJCQkgICAgIENTNDMxMzBfU1BfTV9MU0Jf REFUQV9TSElGVCk7CgkJcmVnbWFwX3dyaXRlKGNzNDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9BU1Bf REVOXzIsCgkJCSAgICAgKGNsa19nZW4tPmRlbiAmIENTNDMxMzBfU1BfTV9NU0JfREFUQV9NQVNL KSA+PgoJCQkgICAgIENTNDMxMzBfU1BfTV9NU0JfREFUQV9TSElGVCk7CgkJcmVnbWFwX3dyaXRl KGNzNDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9BU1BfTlVNXzEsCgkJCSAgICAgKGNsa19nZW4tPm51 bSAmIENTNDMxMzBfU1BfTl9MU0JfREFUQV9NQVNLKSA+PgoJCQkgICAgIENTNDMxMzBfU1BfTl9M U0JfREFUQV9TSElGVCk7CgkJcmVnbWFwX3dyaXRlKGNzNDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9B U1BfTlVNXzIsCgkJCSAgICAgKGNsa19nZW4tPm51bSAmIENTNDMxMzBfU1BfTl9NU0JfREFUQV9N QVNLKSA+PgoJCQkgICAgIENTNDMxMzBfU1BfTl9NU0JfREFUQV9TSElGVCk7CgkJYnJlYWs7Cglj YXNlIENTNDMxMzBfWFNQX0RPUF9EQUk6CgkJcmVnbWFwX3dyaXRlKGNzNDMxMzAtPnJlZ21hcCwg Q1M0MzEzMF9YU1BfREVOXzEsCgkJCSAgICAgKGNsa19nZW4tPmRlbiAmIENTNDMxMzBfU1BfTV9M U0JfREFUQV9NQVNLKSA+PgoJCQkgICAgIENTNDMxMzBfU1BfTV9MU0JfREFUQV9TSElGVCk7CgkJ cmVnbWFwX3dyaXRlKGNzNDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9YU1BfREVOXzIsCgkJCSAgICAg KGNsa19nZW4tPmRlbiAmIENTNDMxMzBfU1BfTV9NU0JfREFUQV9NQVNLKSA+PgoJCQkgICAgIENT NDMxMzBfU1BfTV9NU0JfREFUQV9TSElGVCk7CgkJcmVnbWFwX3dyaXRlKGNzNDMxMzAtPnJlZ21h cCwgQ1M0MzEzMF9YU1BfTlVNXzEsCgkJCSAgICAgKGNsa19nZW4tPm51bSAmIENTNDMxMzBfU1Bf Tl9MU0JfREFUQV9NQVNLKSA+PgoJCQkgICAgIENTNDMxMzBfU1BfTl9MU0JfREFUQV9TSElGVCk7 CgkJcmVnbWFwX3dyaXRlKGNzNDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9YU1BfTlVNXzIsCgkJCSAg ICAgKGNsa19nZW4tPm51bSAmIENTNDMxMzBfU1BfTl9NU0JfREFUQV9NQVNLKSA+PgoJCQkgICAg IENTNDMxMzBfU1BfTl9NU0JfREFUQV9TSElGVCk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldHVy biAtRUlOVkFMOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGNzNDMxMzBfcGNtX2RzZF9t aXgoYm9vbCBlbiwgc3RydWN0IHJlZ21hcCAqcmVnbWFwKQp7CglpZiAoZW4pIHsKCQlyZWdtYXBf dXBkYXRlX2JpdHMocmVnbWFwLCBDUzQzMTMwX0RTRF9QQ01fTUlYX0NUTCwKCQkJCSAgIENTNDMx MzBfTUlYX1BDTV9QUkVQX01BU0ssCgkJCQkgICAxIDw8IENTNDMxMzBfTUlYX1BDTV9QUkVQX1NI SUZUKTsKCQl1c2xlZXBfcmFuZ2UoNjAwMCwgNjA1MCk7CgkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJl Z21hcCwgQ1M0MzEzMF9EU0RfUENNX01JWF9DVEwsCgkJCQkgICBDUzQzMTMwX01JWF9QQ01fRFNE X01BU0ssCgkJCQkgICAxIDw8IENTNDMxMzBfTUlYX1BDTV9EU0RfU0hJRlQpOwoJfSBlbHNlIHsK CQlyZWdtYXBfdXBkYXRlX2JpdHMocmVnbWFwLCBDUzQzMTMwX0RTRF9QQ01fTUlYX0NUTCwKCQkJ CSAgIENTNDMxMzBfTUlYX1BDTV9EU0RfTUFTSywKCQkJCSAgIDAgPDwgQ1M0MzEzMF9NSVhfUENN X0RTRF9TSElGVCk7CgkJdXNsZWVwX3JhbmdlKDE2MDAsIDE2NTApOwoJCXJlZ21hcF91cGRhdGVf Yml0cyhyZWdtYXAsIENTNDMxMzBfRFNEX1BDTV9NSVhfQ1RMLAoJCQkJICAgQ1M0MzEzMF9NSVhf UENNX1BSRVBfTUFTSywKCQkJCSAgIDAgPDwgQ1M0MzEzMF9NSVhfUENNX1BSRVBfU0hJRlQpOwoJ fQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGNzNDMxMzBfZHNkX2h3X3BhcmFtcyhzdHJ1Y3Qg c25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKCQkJCSBzdHJ1Y3Qgc25kX3BjbV9od19wYXJh bXMgKnBhcmFtcywKCQkJCSBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKewoJc3RydWN0IHNuZF9z b2NfY29tcG9uZW50ICpjb21wb25lbnQgPSBkYWktPmNvbXBvbmVudDsKCXN0cnVjdCBjczQzMTMw X3ByaXZhdGUgKmNzNDMxMzAgPSBzbmRfc29jX2NvbXBvbmVudF9nZXRfZHJ2ZGF0YShjb21wb25l bnQpOwoJdW5zaWduZWQgaW50IHJlcXVpcmVkX2NsazsKCXU4IGRzZF9zcGVlZDsKCgltdXRleF9s b2NrKCZjczQzMTMwLT5jbGtfbXV0ZXgpOwoJaWYgKCFjczQzMTMwLT5jbGtfcmVxKSB7CgkJLyog bm8gREFJIGlzIGN1cnJlbnRseSB1c2luZyBjbGsgKi8KCQlpZiAoIShDUzQzMTMwX01DTEtfMjJN ICUgcGFyYW1zX3JhdGUocGFyYW1zKSkpCgkJCXJlcXVpcmVkX2NsayA9IENTNDMxMzBfTUNMS18y Mk07CgkJZWxzZQoJCQlyZXF1aXJlZF9jbGsgPSBDUzQzMTMwX01DTEtfMjRNOwoKCQljczQzMTMw X3NldF9wbGwoY29tcG9uZW50LCAwLCAwLCBjczQzMTMwLT5tY2xrLCByZXF1aXJlZF9jbGspOwoJ CWlmIChjczQzMTMwLT5wbGxfYnlwYXNzKQoJCQljczQzMTMwX2NoYW5nZV9jbGtzcmMoY29tcG9u ZW50LCBDUzQzMTMwX01DTEtfU1JDX0VYVCk7CgkJZWxzZQoJCQljczQzMTMwX2NoYW5nZV9jbGtz cmMoY29tcG9uZW50LCBDUzQzMTMwX01DTEtfU1JDX1BMTCk7Cgl9CgoJY3M0MzEzMC0+Y2xrX3Jl cSsrOwoJaWYgKGNzNDMxMzAtPmNsa19yZXEgPT0gMikKCQljczQzMTMwX3BjbV9kc2RfbWl4KHRy dWUsIGNzNDMxMzAtPnJlZ21hcCk7CgltdXRleF91bmxvY2soJmNzNDMxMzAtPmNsa19tdXRleCk7 CgoJc3dpdGNoIChwYXJhbXNfcmF0ZShwYXJhbXMpKSB7CgljYXNlIDE3NjQwMDoKCQlkc2Rfc3Bl ZWQgPSAwOwoJCWJyZWFrOwoJY2FzZSAzNTI4MDA6CgkJZHNkX3NwZWVkID0gMTsKCQlicmVhazsK CWRlZmF1bHQ6CgkJZGV2X2Vycihjb21wb25lbnQtPmRldiwgIlJhdGUoJXUpIG5vdCBzdXBwb3J0 ZWRcbiIsCgkJCXBhcmFtc19yYXRlKHBhcmFtcykpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCWlm IChjczQzMTMwLT5kYWlzW2RhaS0+aWRdLmRhaV9tb2RlID09IFNORF9TT0NfREFJRk1UX0NCTV9D Rk0pCgkJcmVnbWFwX3VwZGF0ZV9iaXRzKGNzNDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9EU0RfSU5U X0NGRywKCQkJCSAgIENTNDMxMzBfRFNEX01BU1RFUiwgQ1M0MzEzMF9EU0RfTUFTVEVSKTsKCWVs c2UKCQlyZWdtYXBfdXBkYXRlX2JpdHMoY3M0MzEzMC0+cmVnbWFwLCBDUzQzMTMwX0RTRF9JTlRf Q0ZHLAoJCQkJICAgQ1M0MzEzMF9EU0RfTUFTVEVSLCAwKTsKCglyZWdtYXBfdXBkYXRlX2JpdHMo Y3M0MzEzMC0+cmVnbWFwLCBDUzQzMTMwX0RTRF9QQVRIX0NUTF8yLAoJCQkgICBDUzQzMTMwX0RT RF9TUEVFRF9NQVNLLAoJCQkgICBkc2Rfc3BlZWQgPDwgQ1M0MzEzMF9EU0RfU1BFRURfU0hJRlQp OwoJcmVnbWFwX3VwZGF0ZV9iaXRzKGNzNDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9EU0RfUEFUSF9D VExfMiwKCQkJICAgQ1M0MzEzMF9EU0RfU1JDX01BU0ssIENTNDMxMzBfRFNEX1NSQ19EU0QgPDwK CQkJICAgQ1M0MzEzMF9EU0RfU1JDX1NISUZUKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBj czQzMTMwX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKCQkJ CSBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKCQkJCSBzdHJ1Y3Qgc25kX3NvY19k YWkgKmRhaSkKewoJc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQgPSBkYWktPmNv bXBvbmVudDsKCXN0cnVjdCBjczQzMTMwX3ByaXZhdGUgKmNzNDMxMzAgPSBzbmRfc29jX2NvbXBv bmVudF9nZXRfZHJ2ZGF0YShjb21wb25lbnQpOwoJY29uc3Qgc3RydWN0IGNzNDMxMzBfcmF0ZV9t YXAgKnJhdGVfbWFwOwoJdW5zaWduZWQgaW50IHNjbGsgPSBjczQzMTMwLT5kYWlzW2RhaS0+aWRd LnNjbGs7Cgl1bnNpZ25lZCBpbnQgYml0d2lkdGhfc2NsazsKCXVuc2lnbmVkIGludCBiaXR3aWR0 aF9kYWkgPSAodW5zaWduZWQgaW50KShwYXJhbXNfd2lkdGgocGFyYW1zKSk7Cgl1bnNpZ25lZCBp bnQgcmVxdWlyZWRfY2xrOwoJdTggZHNkX3NwZWVkOwoKCW11dGV4X2xvY2soJmNzNDMxMzAtPmNs a19tdXRleCk7CglpZiAoIWNzNDMxMzAtPmNsa19yZXEpIHsKCQkvKiBubyBEQUkgaXMgY3VycmVu dGx5IHVzaW5nIGNsayAqLwoJCWlmICghKENTNDMxMzBfTUNMS18yMk0gJSBwYXJhbXNfcmF0ZShw YXJhbXMpKSkKCQkJcmVxdWlyZWRfY2xrID0gQ1M0MzEzMF9NQ0xLXzIyTTsKCQllbHNlCgkJCXJl cXVpcmVkX2NsayA9IENTNDMxMzBfTUNMS18yNE07CgoJCWNzNDMxMzBfc2V0X3BsbChjb21wb25l bnQsIDAsIDAsIGNzNDMxMzAtPm1jbGssIHJlcXVpcmVkX2Nsayk7CgkJaWYgKGNzNDMxMzAtPnBs bF9ieXBhc3MpCgkJCWNzNDMxMzBfY2hhbmdlX2Nsa3NyYyhjb21wb25lbnQsIENTNDMxMzBfTUNM S19TUkNfRVhUKTsKCQllbHNlCgkJCWNzNDMxMzBfY2hhbmdlX2Nsa3NyYyhjb21wb25lbnQsIENT NDMxMzBfTUNMS19TUkNfUExMKTsKCX0KCgljczQzMTMwLT5jbGtfcmVxKys7CglpZiAoY3M0MzEz MC0+Y2xrX3JlcSA9PSAyKQoJCWNzNDMxMzBfcGNtX2RzZF9taXgodHJ1ZSwgY3M0MzEzMC0+cmVn bWFwKTsKCW11dGV4X3VubG9jaygmY3M0MzEzMC0+Y2xrX211dGV4KTsKCglzd2l0Y2ggKGRhaS0+ aWQpIHsKCWNhc2UgQ1M0MzEzMF9BU1BfRE9QX0RBSToKCWNhc2UgQ1M0MzEzMF9YU1BfRE9QX0RB SToKCQkvKiBEb1AgYml0d2lkdGggaXMgYWx3YXlzIDI0LWJpdCAqLwoJCWJpdHdpZHRoX2RhaSA9 IDI0OwoJCXNjbGsgPSBwYXJhbXNfcmF0ZShwYXJhbXMpICogYml0d2lkdGhfZGFpICoKCQkgICAg ICAgcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CgoJCXN3aXRjaCAocGFyYW1zX3JhdGUocGFyYW1z KSkgewoJCWNhc2UgMTc2NDAwOgoJCQlkc2Rfc3BlZWQgPSAwOwoJCQlicmVhazsKCQljYXNlIDM1 MjgwMDoKCQkJZHNkX3NwZWVkID0gMTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJZGV2X2Vycihj b21wb25lbnQtPmRldiwgIlJhdGUoJXUpIG5vdCBzdXBwb3J0ZWRcbiIsCgkJCQlwYXJhbXNfcmF0 ZShwYXJhbXMpKTsKCQkJcmV0dXJuIC1FSU5WQUw7CgkJfQoKCQlyZWdtYXBfdXBkYXRlX2JpdHMo Y3M0MzEzMC0+cmVnbWFwLCBDUzQzMTMwX0RTRF9QQVRIX0NUTF8yLAoJCQkJICAgQ1M0MzEzMF9E U0RfU1BFRURfTUFTSywKCQkJCSAgIGRzZF9zcGVlZCA8PCBDUzQzMTMwX0RTRF9TUEVFRF9TSElG VCk7CgkJYnJlYWs7CgljYXNlIENTNDMxMzBfQVNQX1BDTV9EQUk6CgkJcmF0ZV9tYXAgPSBjczQz MTMwX2dldF9yYXRlX3RhYmxlKHBhcmFtc19yYXRlKHBhcmFtcykpOwoJCWlmICghcmF0ZV9tYXAp CgkJCXJldHVybiAtRUlOVkFMOwoKCQlyZWdtYXBfd3JpdGUoY3M0MzEzMC0+cmVnbWFwLCBDUzQz MTMwX1NQX1NSQVRFLCByYXRlX21hcC0+dmFsKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJZGV2X2Vy cihjb21wb25lbnQtPmRldiwgIkludmFsaWQgREFJICglZClcbiIsIGRhaS0+aWQpOwoJCXJldHVy biAtRUlOVkFMOwoJfQoKCXN3aXRjaCAoZGFpLT5pZCkgewoJY2FzZSBDUzQzMTMwX0FTUF9ET1Bf REFJOgoJCXJlZ21hcF91cGRhdGVfYml0cyhjczQzMTMwLT5yZWdtYXAsIENTNDMxMzBfRFNEX1BB VEhfQ1RMXzIsCgkJCQkgICBDUzQzMTMwX0RTRF9TUkNfTUFTSywgQ1M0MzEzMF9EU0RfU1JDX0FT UCA8PAoJCQkJICAgQ1M0MzEzMF9EU0RfU1JDX1NISUZUKTsKCQlicmVhazsKCWNhc2UgQ1M0MzEz MF9YU1BfRE9QX0RBSToKCQlyZWdtYXBfdXBkYXRlX2JpdHMoY3M0MzEzMC0+cmVnbWFwLCBDUzQz MTMwX0RTRF9QQVRIX0NUTF8yLAoJCQkJICAgQ1M0MzEzMF9EU0RfU1JDX01BU0ssIENTNDMxMzBf RFNEX1NSQ19YU1AgPDwKCQkJCSAgIENTNDMxMzBfRFNEX1NSQ19TSElGVCk7CgkJYnJlYWs7Cgl9 CgoJaWYgKCFzY2xrICYmIGNzNDMxMzAtPmRhaXNbZGFpLT5pZF0uZGFpX21vZGUgPT0gU05EX1NP Q19EQUlGTVRfQ0JNX0NGTSkKCQkvKiBDYWxjdWxhdGUgU0NMSyBpbiBtYXN0ZXIgbW9kZSBpZiB1 bmFzc2lnbmVkICovCgkJc2NsayA9IHBhcmFtc19yYXRlKHBhcmFtcykgKiBiaXR3aWR0aF9kYWkg KgoJCSAgICAgICBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKCglpZiAoIXNjbGspIHsKCQkvKiBh dCB0aGlzIHBvaW50LCBTQ0xLIG11c3QgYmUgc2V0ICovCgkJZGV2X2Vycihjb21wb25lbnQtPmRl diwgIlNDTEsgZnJlcSBpcyBub3Qgc2V0XG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgliaXR3 aWR0aF9zY2xrID0gKHNjbGsgLyBwYXJhbXNfcmF0ZShwYXJhbXMpKSAvIHBhcmFtc19jaGFubmVs cyhwYXJhbXMpOwoJaWYgKGJpdHdpZHRoX3NjbGsgPCBiaXR3aWR0aF9kYWkpIHsKCQlkZXZfZXJy KGNvbXBvbmVudC0+ZGV2LCAiRm9ybWF0IG5vdCBzdXBwb3J0ZWQ6IFNDTEsgZnJlcSBpcyB0b28g bG93XG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCglkZXZfZGJnKGNvbXBvbmVudC0+ZGV2LAoJ CSJzY2xrID0gJXUsIGZzID0gJWQsIGJpdHdpZHRoX2RhaSA9ICV1XG4iLAoJCXNjbGssIHBhcmFt c19yYXRlKHBhcmFtcyksIGJpdHdpZHRoX2RhaSk7CgoJZGV2X2RiZyhjb21wb25lbnQtPmRldiwK CQkiYml0d2lkdGhfc2NsayA9ICV1LCBudW1fY2ggPSAldVxuIiwKCQliaXR3aWR0aF9zY2xrLCBw YXJhbXNfY2hhbm5lbHMocGFyYW1zKSk7CgoJY3M0MzEzMF9zZXRfYml0d2lkdGgoZGFpLT5pZCwg Yml0d2lkdGhfZGFpLCBjczQzMTMwLT5yZWdtYXApOwoJY3M0MzEzMF9zZXRfc3BfZm10KGRhaS0+ aWQsIGJpdHdpZHRoX3NjbGssIHBhcmFtcywgY3M0MzEzMCk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRp YyBpbnQgY3M0MzEzMF9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFt LAoJCQkgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKewoJc3RydWN0IHNuZF9zb2NfY29tcG9u ZW50ICpjb21wb25lbnQgPSBkYWktPmNvbXBvbmVudDsKCXN0cnVjdCBjczQzMTMwX3ByaXZhdGUg KmNzNDMxMzAgPSBzbmRfc29jX2NvbXBvbmVudF9nZXRfZHJ2ZGF0YShjb21wb25lbnQpOwoKCW11 dGV4X2xvY2soJmNzNDMxMzAtPmNsa19tdXRleCk7CgljczQzMTMwLT5jbGtfcmVxLS07CglpZiAo IWNzNDMxMzAtPmNsa19yZXEpIHsKCQkvKiBubyBEQUkgaXMgY3VycmVudGx5IHVzaW5nIGNsayAq LwoJCWNzNDMxMzBfY2hhbmdlX2Nsa3NyYyhjb21wb25lbnQsIENTNDMxMzBfTUNMS19TUkNfUkNP KTsKCQljczQzMTMwX3BjbV9kc2RfbWl4KGZhbHNlLCBjczQzMTMwLT5yZWdtYXApOwoJfQoJbXV0 ZXhfdW5sb2NrKCZjczQzMTMwLT5jbGtfbXV0ZXgpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgY29u c3QgREVDTEFSRV9UTFZfREJfU0NBTEUocGNtX3ZvbF90bHYsIC0xMjc1MCwgNTAsIDEpOwoKc3Rh dGljIGNvbnN0IGNoYXIgKiBjb25zdCBwY21fY2hfdGV4dFtdID0gewoJIkxlZnQtUmlnaHQgQ2gi LAoJIkxlZnQtTGVmdCBDaCIsCgkiUmlnaHQtTGVmdCBDaCIsCgkiUmlnaHQtUmlnaHQgQ2giLAp9 OwoKc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfc2VxdWVuY2UgcGNtX2NoX2VuX3NlcVtdID0gewoJ e0NTNDMxMzBfRFhEMSwgMHg5OX0sCgl7MHgxODAwMDUsIDB4OEN9LAoJezB4MTgwMDA3LCAweEFC fSwKCXsweDE4MDAxNSwgMHgzMX0sCgl7MHgxODAwMTcsIDB4QjJ9LAoJezB4MTgwMDI1LCAweDMw fSwKCXsweDE4MDAyNywgMHg4NH0sCgl7MHgxODAwMzUsIDB4OUN9LAoJezB4MTgwMDM3LCAweEFF fSwKCXsweDE4MDAwRCwgMHgyNH0sCgl7MHgxODAwMEYsIDB4QTN9LAoJezB4MTgwMDFELCAweDA1 fSwKCXsweDE4MDAxRiwgMHhENH0sCgl7MHgxODAwMkQsIDB4MEJ9LAoJezB4MTgwMDJGLCAweEM3 fSwKCXsweDE4MDAzRCwgMHg3MX0sCgl7MHgxODAwM0YsIDB4RTd9LAoJe0NTNDMxMzBfRFhEMSwg MH0sCn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19zZXF1ZW5jZSBwY21fY2hfZGlzX3NlcVtd ID0gewoJe0NTNDMxMzBfRFhEMSwgMHg5OX0sCgl7MHgxODAwMDUsIDB4MjR9LAoJezB4MTgwMDA3 LCAweEEzfSwKCXsweDE4MDAxNSwgMHgwNX0sCgl7MHgxODAwMTcsIDB4RDR9LAoJezB4MTgwMDI1 LCAweDBCfSwKCXsweDE4MDAyNywgMHhDN30sCgl7MHgxODAwMzUsIDB4NzF9LAoJezB4MTgwMDM3 LCAweEU3fSwKCXsweDE4MDAwRCwgMHg4Q30sCgl7MHgxODAwMEYsIDB4QUJ9LAoJezB4MTgwMDFE LCAweDMxfSwKCXsweDE4MDAxRiwgMHhCMn0sCgl7MHgxODAwMkQsIDB4MzB9LAoJezB4MTgwMDJG LCAweDg0fSwKCXsweDE4MDAzRCwgMHg5Q30sCgl7MHgxODAwM0YsIDB4QUV9LAoJe0NTNDMxMzBf RFhEMSwgMH0sCn07CgpzdGF0aWMgaW50IGNzNDMxMzBfcGNtX2NoX2dldChzdHJ1Y3Qgc25kX2tj b250cm9sICprY29udHJvbCwKCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNv bnRyb2wpCnsKCXJldHVybiBzbmRfc29jX2dldF9lbnVtX2RvdWJsZShrY29udHJvbCwgdWNvbnRy b2wpOwp9CgpzdGF0aWMgaW50IGNzNDMxMzBfcGNtX2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9s ICprY29udHJvbCwKCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wp CnsKCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJp dmF0ZV92YWx1ZTsKCXVuc2lnbmVkIGludCAqaXRlbSA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJh dGVkLml0ZW07CglzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXBvbmVudCA9IHNuZF9zb2Nf a2NvbnRyb2xfY29tcG9uZW50KGtjb250cm9sKTsKCXN0cnVjdCBjczQzMTMwX3ByaXZhdGUgKmNz NDMxMzAgPSBzbmRfc29jX2NvbXBvbmVudF9nZXRfZHJ2ZGF0YShjb21wb25lbnQpOwoJdW5zaWdu ZWQgaW50IHZhbDsKCglpZiAoaXRlbVswXSA+PSBlLT5pdGVtcykKCQlyZXR1cm4gLUVJTlZBTDsK CXZhbCA9IHNuZF9zb2NfZW51bV9pdGVtX3RvX3ZhbChlLCBpdGVtWzBdKSA8PCBlLT5zaGlmdF9s OwoKCXN3aXRjaCAoY3M0MzEzMC0+ZGV2X2lkKSB7CgljYXNlIENTNDMxMzFfQ0hJUF9JRDoKCWNh c2UgQ1M0MzE5OF9DSElQX0lEOgoJCWlmICh2YWwgPj0gMikKCQkJcmVnbWFwX211bHRpX3JlZ193 cml0ZShjczQzMTMwLT5yZWdtYXAsIHBjbV9jaF9lbl9zZXEsCgkJCQkJICAgICAgIEFSUkFZX1NJ WkUocGNtX2NoX2VuX3NlcSkpOwoJCWVsc2UKCQkJcmVnbWFwX211bHRpX3JlZ193cml0ZShjczQz MTMwLT5yZWdtYXAsIHBjbV9jaF9kaXNfc2VxLAoJCQkJCSAgICAgICBBUlJBWV9TSVpFKHBjbV9j aF9kaXNfc2VxKSk7CgkJYnJlYWs7Cgl9CgoJcmV0dXJuIHNuZF9zb2NfcHV0X2VudW1fZG91Ymxl KGtjb250cm9sLCB1Y29udHJvbCk7Cn0KCnN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwY21f Y2hfZW51bSwgQ1M0MzEzMF9QQ01fUEFUSF9DVExfMiwgMCwKCQkJICAgIHBjbV9jaF90ZXh0KTsK CnN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNtX3NwZF90ZXh0c1tdID0gewoJIkZhc3QiLAoJ IlNsb3ciLAp9OwoKc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHBjbV9zcGRfZW51bSwgQ1M0 MzEzMF9QQ01fRklMVF9PUFQsIDcsCgkJCSAgICBwY21fc3BkX3RleHRzKTsKCnN0YXRpYyBjb25z dCBjaGFyICogY29uc3QgZHNkX3RleHRzW10gPSB7CgkiT2ZmIiwKCSJCQ0tBIE1vZGUiLAoJIkJD S0QgTW9kZSIsCn07CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGRzZF92YWx1ZXNbXSA9IHsK CUNTNDMxMzBfRFNEX1NSQ19EU0QsCglDUzQzMTMwX0RTRF9TUkNfQVNQLAoJQ1M0MzEzMF9EU0Rf U1JDX1hTUCwKfTsKCnN0YXRpYyBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTChkc2RfZW51bSwg Q1M0MzEzMF9EU0RfSU5UX0NGRywgMCwgMHgwMywKCQkJCSAgZHNkX3RleHRzLCBkc2RfdmFsdWVz KTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjczQzMTMwX3NuZF9jb250 cm9sc1tdID0gewoJU09DX0RPVUJMRV9SX1RMVigiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsCgkJ CSBDUzQzMTMwX1BDTV9WT0xfQSwgQ1M0MzEzMF9QQ01fVk9MX0IsIDAsIDB4RkYsIDEsCgkJCSBw Y21fdm9sX3RsdiksCglTT0NfRE9VQkxFX1JfVExWKCJNYXN0ZXIgRFNEIFBsYXliYWNrIFZvbHVt ZSIsCgkJCSBDUzQzMTMwX0RTRF9WT0xfQSwgQ1M0MzEzMF9EU0RfVk9MX0IsIDAsIDB4RkYsIDEs CgkJCSBwY21fdm9sX3RsdiksCglTT0NfRU5VTV9FWFQoIlBDTSBDaCBTZWxlY3QiLCBwY21fY2hf ZW51bSwgY3M0MzEzMF9wY21fY2hfZ2V0LAoJCSAgICAgY3M0MzEzMF9wY21fY2hfcHV0KSwKCVNP Q19FTlVNKCJQQ00gRmlsdGVyIFNwZWVkIiwgcGNtX3NwZF9lbnVtKSwKCVNPQ19TSU5HTEUoIlBD TSBQaGFzZSBDb21wZW5zYXRpb24iLCBDUzQzMTMwX1BDTV9GSUxUX09QVCwgNiwgMSwgMCksCglT T0NfU0lOR0xFKCJQQ00gTm9ub3ZlcnNhbXBsZSBFbXVsYXRlIiwgQ1M0MzEzMF9QQ01fRklMVF9P UFQsIDUsIDEsIDApLAoJU09DX1NJTkdMRSgiUENNIEhpZ2gtcGFzcyBGaWx0ZXIiLCBDUzQzMTMw X1BDTV9GSUxUX09QVCwgMSwgMSwgMCksCglTT0NfU0lOR0xFKCJQQ00gRGUtZW1waGFzaXMgRmls dGVyIiwgQ1M0MzEzMF9QQ01fRklMVF9PUFQsIDAsIDEsIDApLAoJU09DX0VOVU0oIkRTRCBQaGFz ZSBNb2R1bGF0aW9uIiwgZHNkX2VudW0pLAp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfc2Vx dWVuY2UgcGNtX3NlcVtdID0gewoJe0NTNDMxMzBfRFhEMSwgMHg5OX0sCgl7Q1M0MzEzMF9EWEQ3 LCAweDAxfSwKCXtDUzQzMTMwX0RYRDgsIDB9LAoJe0NTNDMxMzBfRFhEOSwgMHgwMX0sCgl7Q1M0 MzEzMF9EWEQzLCAweDEyfSwKCXtDUzQzMTMwX0RYRDQsIDB9LAoJe0NTNDMxMzBfRFhEMTAsIDB4 Mjh9LAoJe0NTNDMxMzBfRFhEMTEsIDB4Mjh9LAoJe0NTNDMxMzBfRFhEMSwgMH0sCn07CgpzdGF0 aWMgY29uc3Qgc3RydWN0IHJlZ19zZXF1ZW5jZSBkc2Rfc2VxW10gPSB7Cgl7Q1M0MzEzMF9EWEQx LCAweDk5fSwKCXtDUzQzMTMwX0RYRDcsIDB4MDF9LAoJe0NTNDMxMzBfRFhEOCwgMH0sCgl7Q1M0 MzEzMF9EWEQ5LCAweDAxfSwKCXtDUzQzMTMwX0RYRDMsIDB4MTJ9LAoJe0NTNDMxMzBfRFhENCwg MH0sCgl7Q1M0MzEzMF9EWEQxMCwgMHgxRX0sCgl7Q1M0MzEzMF9EWEQxMSwgMHgyMH0sCgl7Q1M0 MzEzMF9EWEQxLCAwfSwKfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX3NlcXVlbmNlIHBvcF9m cmVlX3NlcVtdID0gewoJe0NTNDMxMzBfRFhEMSwgMHg5OX0sCgl7Q1M0MzEzMF9EWEQxMiwgMHgw QX0sCgl7Q1M0MzEzMF9EWEQxLCAwfSwKfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX3NlcXVl bmNlIHBvcF9mcmVlX3NlcTJbXSA9IHsKCXtDUzQzMTMwX0RYRDEsIDB4OTl9LAoJe0NTNDMxMzBf RFhEMTMsIDB4MjB9LAoJe0NTNDMxMzBfRFhEMSwgMH0sCn07CgpzdGF0aWMgY29uc3Qgc3RydWN0 IHJlZ19zZXF1ZW5jZSBtdXRlX3NlcVtdID0gewoJe0NTNDMxMzBfRFhEMSwgMHg5OX0sCgl7Q1M0 MzEzMF9EWEQzLCAweDEyfSwKCXtDUzQzMTMwX0RYRDUsIDB4MDJ9LAoJe0NTNDMxMzBfRFhENCwg MHgxMn0sCgl7Q1M0MzEzMF9EWEQxLCAwfSwKfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX3Nl cXVlbmNlIHVubXV0ZV9zZXFbXSA9IHsKCXtDUzQzMTMwX0RYRDEsIDB4OTl9LAoJe0NTNDMxMzBf RFhEMywgMHgxMH0sCgl7Q1M0MzEzMF9EWEQ1LCAwfSwKCXtDUzQzMTMwX0RYRDQsIDB4MTZ9LAoJ e0NTNDMxMzBfRFhEMSwgMH0sCn07CgpzdGF0aWMgaW50IGNzNDMxMzBfZHNkX2V2ZW50KHN0cnVj dCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAoJCQkgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICpr Y29udHJvbCwgaW50IGV2ZW50KQp7CglzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXBvbmVu dCA9IHNuZF9zb2NfZGFwbV90b19jb21wb25lbnQody0+ZGFwbSk7CglzdHJ1Y3QgY3M0MzEzMF9w cml2YXRlICpjczQzMTMwID0gc25kX3NvY19jb21wb25lbnRfZ2V0X2RydmRhdGEoY29tcG9uZW50 KTsKCglzd2l0Y2ggKGV2ZW50KSB7CgljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgoJCXN3aXRj aCAoY3M0MzEzMC0+ZGV2X2lkKSB7CgkJY2FzZSBDUzQzMTMwX0NISVBfSUQ6CgkJY2FzZSBDUzQz OTlfQ0hJUF9JRDoKCQkJcmVnbWFwX211bHRpX3JlZ193cml0ZShjczQzMTMwLT5yZWdtYXAsIGRz ZF9zZXEsCgkJCQkJICAgICAgIEFSUkFZX1NJWkUoZHNkX3NlcSkpOwoJCQlicmVhazsKCQl9CgkJ YnJlYWs7CgljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKCQlyZWdtYXBfdXBkYXRlX2JpdHMo Y3M0MzEzMC0+cmVnbWFwLCBDUzQzMTMwX0RTRF9QQVRIX0NUTF8xLAoJCQkJICAgQ1M0MzEzMF9N VVRFX01BU0ssIDApOwoJCXN3aXRjaCAoY3M0MzEzMC0+ZGV2X2lkKSB7CgkJY2FzZSBDUzQzMTMw X0NISVBfSUQ6CgkJY2FzZSBDUzQzOTlfQ0hJUF9JRDoKCQkJcmVnbWFwX211bHRpX3JlZ193cml0 ZShjczQzMTMwLT5yZWdtYXAsIHVubXV0ZV9zZXEsCgkJCQkJICAgICAgIEFSUkFZX1NJWkUodW5t dXRlX3NlcSkpOwoJCQlicmVhazsKCQl9CgkJYnJlYWs7CgljYXNlIFNORF9TT0NfREFQTV9QUkVf UE1EOgoJCXN3aXRjaCAoY3M0MzEzMC0+ZGV2X2lkKSB7CgkJY2FzZSBDUzQzMTMwX0NISVBfSUQ6 CgkJY2FzZSBDUzQzOTlfQ0hJUF9JRDoKCQkJcmVnbWFwX211bHRpX3JlZ193cml0ZShjczQzMTMw LT5yZWdtYXAsIG11dGVfc2VxLAoJCQkJCSAgICAgICBBUlJBWV9TSVpFKG11dGVfc2VxKSk7CgkJ CXJlZ21hcF91cGRhdGVfYml0cyhjczQzMTMwLT5yZWdtYXAsCgkJCQkJICAgQ1M0MzEzMF9EU0Rf UEFUSF9DVExfMSwKCQkJCQkgICBDUzQzMTMwX01VVEVfTUFTSywgQ1M0MzEzMF9NVVRFX0VOKTsK CQkJLyoKCQkJICogRFNEIFBvd2VyIERvd24gU2VxdWVuY2UKCQkJICogQWNjb3JkaW5nIHRvIERl c2lnbiwgMTMwbXMgaXMgcHJlZmVycmVkLgoJCQkgKi8KCQkJbXNsZWVwKDEzMCk7CgkJCWJyZWFr OwoJCWNhc2UgQ1M0MzEzMV9DSElQX0lEOgoJCWNhc2UgQ1M0MzE5OF9DSElQX0lEOgoJCQlyZWdt YXBfdXBkYXRlX2JpdHMoY3M0MzEzMC0+cmVnbWFwLAoJCQkJCSAgIENTNDMxMzBfRFNEX1BBVEhf Q1RMXzEsCgkJCQkJICAgQ1M0MzEzMF9NVVRFX01BU0ssIENTNDMxMzBfTVVURV9FTik7CgkJCWJy ZWFrOwoJCX0KCQlicmVhazsKCWRlZmF1bHQ6CgkJZGV2X2Vycihjb21wb25lbnQtPmRldiwgIklu dmFsaWQgZXZlbnQgPSAweCV4XG4iLCBldmVudCk7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CglyZXR1 cm4gMDsKfQoKc3RhdGljIGludCBjczQzMTMwX3BjbV9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBt X3dpZGdldCAqdywKCQkJICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBl dmVudCkKewoJc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQgPSBzbmRfc29jX2Rh cG1fdG9fY29tcG9uZW50KHctPmRhcG0pOwoJc3RydWN0IGNzNDMxMzBfcHJpdmF0ZSAqY3M0MzEz MCA9IHNuZF9zb2NfY29tcG9uZW50X2dldF9kcnZkYXRhKGNvbXBvbmVudCk7CgoJc3dpdGNoIChl dmVudCkgewoJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKCQlzd2l0Y2ggKGNzNDMxMzAtPmRl dl9pZCkgewoJCWNhc2UgQ1M0MzEzMF9DSElQX0lEOgoJCWNhc2UgQ1M0Mzk5X0NISVBfSUQ6CgkJ CXJlZ21hcF9tdWx0aV9yZWdfd3JpdGUoY3M0MzEzMC0+cmVnbWFwLCBwY21fc2VxLAoJCQkJCSAg ICAgICBBUlJBWV9TSVpFKHBjbV9zZXEpKTsKCQkJYnJlYWs7CgkJfQoJCWJyZWFrOwoJY2FzZSBT TkRfU09DX0RBUE1fUE9TVF9QTVU6CgkJcmVnbWFwX3VwZGF0ZV9iaXRzKGNzNDMxMzAtPnJlZ21h cCwgQ1M0MzEzMF9QQ01fUEFUSF9DVExfMSwKCQkJCSAgIENTNDMxMzBfTVVURV9NQVNLLCAwKTsK CQlzd2l0Y2ggKGNzNDMxMzAtPmRldl9pZCkgewoJCWNhc2UgQ1M0MzEzMF9DSElQX0lEOgoJCWNh c2UgQ1M0Mzk5X0NISVBfSUQ6CgkJCXJlZ21hcF9tdWx0aV9yZWdfd3JpdGUoY3M0MzEzMC0+cmVn bWFwLCB1bm11dGVfc2VxLAoJCQkJCSAgICAgICBBUlJBWV9TSVpFKHVubXV0ZV9zZXEpKTsKCQkJ YnJlYWs7CgkJfQoJCWJyZWFrOwoJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKCQlzd2l0Y2gg KGNzNDMxMzAtPmRldl9pZCkgewoJCWNhc2UgQ1M0MzEzMF9DSElQX0lEOgoJCWNhc2UgQ1M0Mzk5 X0NISVBfSUQ6CgkJCXJlZ21hcF9tdWx0aV9yZWdfd3JpdGUoY3M0MzEzMC0+cmVnbWFwLCBtdXRl X3NlcSwKCQkJCQkgICAgICAgQVJSQVlfU0laRShtdXRlX3NlcSkpOwoJCQlyZWdtYXBfdXBkYXRl X2JpdHMoY3M0MzEzMC0+cmVnbWFwLAoJCQkJCSAgIENTNDMxMzBfUENNX1BBVEhfQ1RMXzEsCgkJ CQkJICAgQ1M0MzEzMF9NVVRFX01BU0ssIENTNDMxMzBfTVVURV9FTik7CgkJCS8qCgkJCSAqIFBD TSBQb3dlciBEb3duIFNlcXVlbmNlCgkJCSAqIEFjY29yZGluZyB0byBEZXNpZ24sIDEzMG1zIGlz IHByZWZlcnJlZC4KCQkJICovCgkJCW1zbGVlcCgxMzApOwoJCQlicmVhazsKCQljYXNlIENTNDMx MzFfQ0hJUF9JRDoKCQljYXNlIENTNDMxOThfQ0hJUF9JRDoKCQkJcmVnbWFwX3VwZGF0ZV9iaXRz KGNzNDMxMzAtPnJlZ21hcCwKCQkJCQkgICBDUzQzMTMwX1BDTV9QQVRIX0NUTF8xLAoJCQkJCSAg IENTNDMxMzBfTVVURV9NQVNLLCBDUzQzMTMwX01VVEVfRU4pOwoJCQlicmVhazsKCQl9CgkJYnJl YWs7CglkZWZhdWx0OgoJCWRldl9lcnIoY29tcG9uZW50LT5kZXYsICJJbnZhbGlkIGV2ZW50ID0g MHgleFxuIiwgZXZlbnQpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRp YyBjb25zdCBzdHJ1Y3QgcmVnX3NlcXVlbmNlIGRhY19wb3N0cG11X3NlcVtdID0gewoJe0NTNDMx MzBfRFhEOSwgMHgwQ30sCgl7Q1M0MzEzMF9EWEQzLCAweDEwfSwKCXtDUzQzMTMwX0RYRDQsIDB4 MjB9LAp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfc2VxdWVuY2UgZGFjX3Bvc3RwbWRfc2Vx W10gPSB7Cgl7Q1M0MzEzMF9EWEQxLCAweDk5fSwKCXtDUzQzMTMwX0RYRDYsIDB4MDF9LAoJe0NT NDMxMzBfRFhEMSwgMH0sCn07CgpzdGF0aWMgaW50IGNzNDMxMzBfZGFjX2V2ZW50KHN0cnVjdCBz bmRfc29jX2RhcG1fd2lkZ2V0ICp3LAoJCQkgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250 cm9sLCBpbnQgZXZlbnQpCnsKCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50ID0g c25kX3NvY19kYXBtX3RvX2NvbXBvbmVudCh3LT5kYXBtKTsKCXN0cnVjdCBjczQzMTMwX3ByaXZh dGUgKmNzNDMxMzAgPSBzbmRfc29jX2NvbXBvbmVudF9nZXRfZHJ2ZGF0YShjb21wb25lbnQpOwoK CXN3aXRjaCAoZXZlbnQpIHsKCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CgkJc3dpdGNoIChj czQzMTMwLT5kZXZfaWQpIHsKCQljYXNlIENTNDMxMzBfQ0hJUF9JRDoKCQljYXNlIENTNDM5OV9D SElQX0lEOgoJCQlyZWdtYXBfbXVsdGlfcmVnX3dyaXRlKGNzNDMxMzAtPnJlZ21hcCwgcG9wX2Zy ZWVfc2VxLAoJCQkJCSAgICAgICBBUlJBWV9TSVpFKHBvcF9mcmVlX3NlcSkpOwoJCQlicmVhazsK CQljYXNlIENTNDMxMzFfQ0hJUF9JRDoKCQljYXNlIENTNDMxOThfQ0hJUF9JRDoKCQkJcmVnbWFw X211bHRpX3JlZ193cml0ZShjczQzMTMwLT5yZWdtYXAsIHBvcF9mcmVlX3NlcTIsCgkJCQkJICAg ICAgIEFSUkFZX1NJWkUocG9wX2ZyZWVfc2VxMikpOwoJCQlicmVhazsKCQl9CgkJYnJlYWs7Cglj YXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDEwMDUwKTsK CgkJcmVnbWFwX3dyaXRlKGNzNDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9EWEQxLCAweDk5KTsKCgkJ c3dpdGNoIChjczQzMTMwLT5kZXZfaWQpIHsKCQljYXNlIENTNDMxMzBfQ0hJUF9JRDoKCQljYXNl IENTNDM5OV9DSElQX0lEOgoJCQlyZWdtYXBfbXVsdGlfcmVnX3dyaXRlKGNzNDMxMzAtPnJlZ21h cCwgZGFjX3Bvc3RwbXVfc2VxLAoJCQkJCSAgICAgICBBUlJBWV9TSVpFKGRhY19wb3N0cG11X3Nl cSkpOwoJCQkvKgoJCQkgKiBQZXIgZGF0YXNoZWV0LCBTZWMuIFBDTSBQb3dlci1VcCBTZXF1ZW5j ZS4KCQkJICogQWNjb3JkaW5nIHRvIERlc2lnbiwgQ1M0MzEzMF9EWEQxMiBtdXN0IGJlIDAgdG8g bWVldAoJCQkgKiBUSEROIGFuZCBEeW5hbWljIFJhbmdlIHNwZWMuCgkJCSAqLwoJCQltc2xlZXAo MTAwMCk7CgkJCXJlZ21hcF93cml0ZShjczQzMTMwLT5yZWdtYXAsIENTNDMxMzBfRFhEMTIsIDAp OwoJCQlicmVhazsKCQljYXNlIENTNDMxMzFfQ0hJUF9JRDoKCQljYXNlIENTNDMxOThfQ0hJUF9J RDoKCQkJdXNsZWVwX3JhbmdlKDEyMDAwLCAxMjAxMCk7CgkJCXJlZ21hcF93cml0ZShjczQzMTMw LT5yZWdtYXAsIENTNDMxMzBfRFhEMTMsIDApOwoJCQlicmVhazsKCQl9CgoJCXJlZ21hcF93cml0 ZShjczQzMTMwLT5yZWdtYXAsIENTNDMxMzBfRFhEMSwgMCk7CgkJYnJlYWs7CgljYXNlIFNORF9T T0NfREFQTV9QT1NUX1BNRDoKCQlzd2l0Y2ggKGNzNDMxMzAtPmRldl9pZCkgewoJCWNhc2UgQ1M0 MzEzMF9DSElQX0lEOgoJCWNhc2UgQ1M0Mzk5X0NISVBfSUQ6CgkJCXJlZ21hcF9tdWx0aV9yZWdf d3JpdGUoY3M0MzEzMC0+cmVnbWFwLCBkYWNfcG9zdHBtZF9zZXEsCgkJCQkJICAgICAgIEFSUkFZ X1NJWkUoZGFjX3Bvc3RwbWRfc2VxKSk7CgkJCWJyZWFrOwoJCX0KCQlicmVhazsKCWRlZmF1bHQ6 CgkJZGV2X2Vycihjb21wb25lbnQtPmRldiwgIkludmFsaWQgREFDIGV2ZW50ID0gMHgleFxuIiwg ZXZlbnQpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBjb25zdCBz dHJ1Y3QgcmVnX3NlcXVlbmNlIGhwaW5fcHJlcG1kX3NlcVtdID0gewoJe0NTNDMxMzBfRFhEMSwg MHg5OX0sCgl7Q1M0MzEzMF9EWEQxNSwgMHg2NH0sCgl7Q1M0MzEzMF9EWEQxNCwgMH0sCgl7Q1M0 MzEzMF9EWEQyLCAwfSwKCXtDUzQzMTMwX0RYRDEsIDB9LAp9OwoKc3RhdGljIGNvbnN0IHN0cnVj dCByZWdfc2VxdWVuY2UgaHBpbl9wb3N0cG11X3NlcVtdID0gewoJe0NTNDMxMzBfRFhEMSwgMHg5 OX0sCgl7Q1M0MzEzMF9EWEQyLCAxfSwKCXtDUzQzMTMwX0RYRDE0LCAweERDfSwKCXtDUzQzMTMw X0RYRDE1LCAweEU0fSwKCXtDUzQzMTMwX0RYRDEsIDB9LAp9OwoKc3RhdGljIGludCBjczQzMTMw X2hwaW5fZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCgkJCSAgICAgIHN0cnVj dCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCnsKCXN0cnVjdCBzbmRfc29jX2Nv bXBvbmVudCAqY29tcG9uZW50ID0gc25kX3NvY19kYXBtX3RvX2NvbXBvbmVudCh3LT5kYXBtKTsK CXN0cnVjdCBjczQzMTMwX3ByaXZhdGUgKmNzNDMxMzAgPSBzbmRfc29jX2NvbXBvbmVudF9nZXRf ZHJ2ZGF0YShjb21wb25lbnQpOwoKCXN3aXRjaCAoZXZlbnQpIHsKCWNhc2UgU05EX1NPQ19EQVBN X1BPU1RfUE1EOgoJCXJlZ21hcF9tdWx0aV9yZWdfd3JpdGUoY3M0MzEzMC0+cmVnbWFwLCBocGlu X3ByZXBtZF9zZXEsCgkJCQkgICAgICAgQVJSQVlfU0laRShocGluX3ByZXBtZF9zZXEpKTsKCQli cmVhazsKCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CgkJcmVnbWFwX211bHRpX3JlZ193cml0 ZShjczQzMTMwLT5yZWdtYXAsIGhwaW5fcG9zdHBtdV9zZXEsCgkJCQkgICAgICAgQVJSQVlfU0la RShocGluX3Bvc3RwbXVfc2VxKSk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCWRldl9lcnIoY29tcG9u ZW50LT5kZXYsICJJbnZhbGlkIEhQSU4gZXZlbnQgPSAweCV4XG4iLCBldmVudCk7CgkJcmV0dXJu IC1FSU5WQUw7Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2Rh cG1fd2lkZ2V0IGRpZ2l0YWxfaHBfd2lkZ2V0c1tdID0gewoJU05EX1NPQ19EQVBNX09VVFBVVCgi SFBPVVRBIiksCglTTkRfU09DX0RBUE1fT1VUUFVUKCJIUE9VVEIiKSwKCglTTkRfU09DX0RBUE1f QUlGX0lOX0UoIkFTUElOIFBDTSIsIE5VTEwsIDAsIENTNDMxMzBfUFdETl9DVEwsCgkJCSAgICAg IENTNDMxMzBfUEROX0FTUF9TSElGVCwgMSwgY3M0MzEzMF9wY21fZXZlbnQsCgkJCSAgICAgIChT TkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CgkJCSAgICAgICBT TkRfU09DX0RBUE1fUFJFX1BNRCkpLAoKCVNORF9TT0NfREFQTV9BSUZfSU5fRSgiQVNQSU4gRG9Q IiwgTlVMTCwgMCwgQ1M0MzEzMF9QV0ROX0NUTCwKCQkJICAgICAgQ1M0MzEzMF9QRE5fQVNQX1NI SUZULCAxLCBjczQzMTMwX2RzZF9ldmVudCwKCQkJICAgICAgKFNORF9TT0NfREFQTV9QUkVfUE1V IHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKCQkJICAgICAgIFNORF9TT0NfREFQTV9QUkVfUE1E KSksCgoJU05EX1NPQ19EQVBNX0FJRl9JTl9FKCJYU1BJTiBEb1AiLCBOVUxMLCAwLCBDUzQzMTMw X1BXRE5fQ1RMLAoJCQkgICAgICBDUzQzMTMwX1BETl9YU1BfU0hJRlQsIDEsIGNzNDMxMzBfZHNk X2V2ZW50LAoJCQkgICAgICAoU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9T VF9QTVUgfAoJCQkgICAgICAgU05EX1NPQ19EQVBNX1BSRV9QTUQpKSwKCglTTkRfU09DX0RBUE1f QUlGX0lOX0UoIlhTUElOIERTRCIsIE5VTEwsIDAsIENTNDMxMzBfUFdETl9DVEwsCgkJCSAgICAg IENTNDMxMzBfUEROX0RTRElGX1NISUZULCAxLCBjczQzMTMwX2RzZF9ldmVudCwKCQkJICAgICAg KFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKCQkJICAgICAg IFNORF9TT0NfREFQTV9QUkVfUE1EKSksCgoJU05EX1NPQ19EQVBNX0RBQygiRFNEIiwgTlVMTCwg Q1M0MzEzMF9EU0RfUEFUSF9DVExfMiwKCQkJIENTNDMxMzBfRFNEX0VOX1NISUZULCAwKSwKCglT TkRfU09DX0RBUE1fREFDX0UoIkhpRmkgREFDIiwgTlVMTCwgQ1M0MzEzMF9QV0ROX0NUTCwKCQkJ ICAgQ1M0MzEzMF9QRE5fSFBfU0hJRlQsIDEsIGNzNDMxMzBfZGFjX2V2ZW50LAoJCQkgICAoU05E X1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAoJCQkgICAgU05EX1NP Q19EQVBNX1BPU1RfUE1EKSksCn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93 aWRnZXQgYW5hbG9nX2hwX3dpZGdldHNbXSA9IHsKCVNORF9TT0NfREFQTV9EQUNfRSgiQW5hbG9n IFBsYXliYWNrIiwgTlVMTCwgQ1M0MzEzMF9IUF9PVVRfQ1RMXzEsCgkJCSAgIENTNDMxMzBfSFBf SU5fRU5fU0hJRlQsIDAsIGNzNDMxMzBfaHBpbl9ldmVudCwKCQkJICAgKFNORF9TT0NfREFQTV9Q UkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSksCn07CgpzdGF0aWMgc3RydWN0IHNuZF9z b2NfZGFwbV93aWRnZXQgYWxsX2hwX3dpZGdldHNbCgkJCUFSUkFZX1NJWkUoZGlnaXRhbF9ocF93 aWRnZXRzKSArCgkJCUFSUkFZX1NJWkUoYW5hbG9nX2hwX3dpZGdldHMpXTsKCnN0YXRpYyBjb25z dCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGRpZ2l0YWxfaHBfcm91dGVzW10gPSB7Cgl7IkFT UElOIFBDTSIsIE5VTEwsICJBU1AgUENNIFBsYXliYWNrIn0sCgl7IkFTUElOIERvUCIsIE5VTEws ICJBU1AgRG9QIFBsYXliYWNrIn0sCgl7IlhTUElOIERvUCIsIE5VTEwsICJYU1AgRG9QIFBsYXli YWNrIn0sCgl7IlhTUElOIERTRCIsIE5VTEwsICJYU1AgRFNEIFBsYXliYWNrIn0sCgl7IkRTRCIs IE5VTEwsICJBU1BJTiBEb1AifSwKCXsiRFNEIiwgTlVMTCwgIlhTUElOIERvUCJ9LAoJeyJEU0Qi LCBOVUxMLCAiWFNQSU4gRFNEIn0sCgl7IkhpRmkgREFDIiwgTlVMTCwgIkFTUElOIFBDTSJ9LAoJ eyJIaUZpIERBQyIsIE5VTEwsICJEU0QifSwKCXsiSFBPVVRBIiwgTlVMTCwgIkhpRmkgREFDIn0s Cgl7IkhQT1VUQiIsIE5VTEwsICJIaUZpIERBQyJ9LAp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCBz bmRfc29jX2RhcG1fcm91dGUgYW5hbG9nX2hwX3JvdXRlc1tdID0gewoJeyJIUE9VVEEiLCBOVUxM LCAiQW5hbG9nIFBsYXliYWNrIn0sCgl7IkhQT1VUQiIsIE5VTEwsICJBbmFsb2cgUGxheWJhY2si fSwKfTsKCnN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGFsbF9ocF9yb3V0ZXNbCgkJ CUFSUkFZX1NJWkUoZGlnaXRhbF9ocF9yb3V0ZXMpICsKCQkJQVJSQVlfU0laRShhbmFsb2dfaHBf cm91dGVzKV07CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNzNDMxMzBfYXNwX3NyY19yYXRl c1tdID0gewoJMzIwMDAsIDQ0MTAwLCA0ODAwMCwgODgyMDAsIDk2MDAwLCAxNzY0MDAsIDE5MjAw MCwgMzUyODAwLCAzODQwMDAKfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19jb25z dHJhaW50X2xpc3QgY3M0MzEzMF9hc3BfY29uc3RyYWludHMgPSB7CgkuY291bnQJPSBBUlJBWV9T SVpFKGNzNDMxMzBfYXNwX3NyY19yYXRlcyksCgkubGlzdAk9IGNzNDMxMzBfYXNwX3NyY19yYXRl cywKfTsKCnN0YXRpYyBpbnQgY3M0MzEzMF9wY21fc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJz dHJlYW0gKnN1YnN0cmVhbSwKCQkJICAgICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQp7Cgly ZXR1cm4gc25kX3BjbV9od19jb25zdHJhaW50X2xpc3Qoc3Vic3RyZWFtLT5ydW50aW1lLCAwLAoJ CQkJCSAgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCgkJCQkJICAmY3M0MzEzMF9hc3BfY29uc3Ry YWludHMpOwp9CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNzNDMxMzBfZG9wX3NyY19yYXRl c1tdID0gewoJMTc2NDAwLCAzNTI4MDAsCn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21f aHdfY29uc3RyYWludF9saXN0IGNzNDMxMzBfZG9wX2NvbnN0cmFpbnRzID0gewoJLmNvdW50CT0g QVJSQVlfU0laRShjczQzMTMwX2RvcF9zcmNfcmF0ZXMpLAoJLmxpc3QJPSBjczQzMTMwX2RvcF9z cmNfcmF0ZXMsCn07CgpzdGF0aWMgaW50IGNzNDMxMzBfZG9wX3N0YXJ0dXAoc3RydWN0IHNuZF9w Y21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCgkJCSAgICAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRh aSkKewoJcmV0dXJuIHNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHN1YnN0cmVhbS0+cnVudGlt ZSwgMCwKCQkJCQkgIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAoJCQkJCSAgJmNzNDMxMzBfZG9w X2NvbnN0cmFpbnRzKTsKfQoKc3RhdGljIGludCBjczQzMTMwX3BjbV9zZXRfZm10KHN0cnVjdCBz bmRfc29jX2RhaSAqY29kZWNfZGFpLCB1bnNpZ25lZCBpbnQgZm10KQp7CglzdHJ1Y3Qgc25kX3Nv Y19jb21wb25lbnQgKmNvbXBvbmVudCA9IGNvZGVjX2RhaS0+Y29tcG9uZW50OwoJc3RydWN0IGNz NDMxMzBfcHJpdmF0ZSAqY3M0MzEzMCA9IHNuZF9zb2NfY29tcG9uZW50X2dldF9kcnZkYXRhKGNv bXBvbmVudCk7CgoJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgewoJ Y2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgoJCWNzNDMxMzAtPmRhaXNbY29kZWNfZGFpLT5p ZF0uZGFpX21vZGUgPSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOwoJCWJyZWFrOwoJY2FzZSBTTkRf U09DX0RBSUZNVF9DQk1fQ0ZNOgoJCWNzNDMxMzAtPmRhaXNbY29kZWNfZGFpLT5pZF0uZGFpX21v ZGUgPSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlkZXZfZXJy KGNvbXBvbmVudC0+ZGV2LCAidW5zdXBwb3J0ZWQgbW9kZVxuIik7CgkJcmV0dXJuIC1FSU5WQUw7 Cgl9CgoJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSykgewoJY2FzZSBT TkRfU09DX0RBSUZNVF9JMlM6CgkJY3M0MzEzMC0+ZGFpc1tjb2RlY19kYWktPmlkXS5kYWlfZm9y bWF0ID0gU05EX1NPQ19EQUlGTVRfSTJTOwoJCWJyZWFrOwoJY2FzZSBTTkRfU09DX0RBSUZNVF9M RUZUX0o6CgkJY3M0MzEzMC0+ZGFpc1tjb2RlY19kYWktPmlkXS5kYWlfZm9ybWF0ID0gU05EX1NP Q19EQUlGTVRfTEVGVF9KOwoJCWJyZWFrOwoJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQToKCQlj czQzMTMwLT5kYWlzW2NvZGVjX2RhaS0+aWRdLmRhaV9mb3JtYXQgPSBTTkRfU09DX0RBSUZNVF9E U1BfQTsKCQlicmVhazsKCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6CgkJY3M0MzEzMC0+ZGFp c1tjb2RlY19kYWktPmlkXS5kYWlfZm9ybWF0ID0gU05EX1NPQ19EQUlGTVRfRFNQX0I7CgkJYnJl YWs7CglkZWZhdWx0OgoJCWRldl9lcnIoY29tcG9uZW50LT5kZXYsCgkJCSJ1bnN1cHBvcnRlZCBh dWRpbyBmb3JtYXRcbiIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCWRldl9kYmcoY29tcG9uZW50 LT5kZXYsICJkYWlfaWQgPSAlZCwgIGRhaV9tb2RlID0gJXUsIGRhaV9mb3JtYXQgPSAldVxuIiwK CQljb2RlY19kYWktPmlkLAoJCWNzNDMxMzAtPmRhaXNbY29kZWNfZGFpLT5pZF0uZGFpX21vZGUs CgkJY3M0MzEzMC0+ZGFpc1tjb2RlY19kYWktPmlkXS5kYWlfZm9ybWF0KTsKCglyZXR1cm4gMDsK fQoKc3RhdGljIGludCBjczQzMTMwX2RzZF9zZXRfZm10KHN0cnVjdCBzbmRfc29jX2RhaSAqY29k ZWNfZGFpLCB1bnNpZ25lZCBpbnQgZm10KQp7CglzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNv bXBvbmVudCA9IGNvZGVjX2RhaS0+Y29tcG9uZW50OwoJc3RydWN0IGNzNDMxMzBfcHJpdmF0ZSAq Y3M0MzEzMCA9IHNuZF9zb2NfY29tcG9uZW50X2dldF9kcnZkYXRhKGNvbXBvbmVudCk7CgoJc3dp dGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgewoJY2FzZSBTTkRfU09DX0RB SUZNVF9DQlNfQ0ZTOgoJCWNzNDMxMzAtPmRhaXNbY29kZWNfZGFpLT5pZF0uZGFpX21vZGUgPSBT TkRfU09DX0RBSUZNVF9DQlNfQ0ZTOwoJCWJyZWFrOwoJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1f Q0ZNOgoJCWNzNDMxMzAtPmRhaXNbY29kZWNfZGFpLT5pZF0uZGFpX21vZGUgPSBTTkRfU09DX0RB SUZNVF9DQk1fQ0ZNOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlkZXZfZXJyKGNvbXBvbmVudC0+ZGV2 LCAiVW5zdXBwb3J0ZWQgREFJIGZvcm1hdC5cbiIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCWRl dl9kYmcoY29tcG9uZW50LT5kZXYsICJkYWlfbW9kZSA9IDB4JXhcbiIsCgkJY3M0MzEzMC0+ZGFp c1tjb2RlY19kYWktPmlkXS5kYWlfbW9kZSk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgY3M0 MzEzMF9zZXRfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLAoJCQkJICBpbnQg Y2xrX2lkLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKewoJc3RydWN0IHNuZF9zb2NfY29t cG9uZW50ICpjb21wb25lbnQgPSBjb2RlY19kYWktPmNvbXBvbmVudDsKCXN0cnVjdCBjczQzMTMw X3ByaXZhdGUgKmNzNDMxMzAgPSBzbmRfc29jX2NvbXBvbmVudF9nZXRfZHJ2ZGF0YShjb21wb25l bnQpOwoKCWNzNDMxMzAtPmRhaXNbY29kZWNfZGFpLT5pZF0uc2NsayA9IGZyZXE7CglkZXZfZGJn KGNvbXBvbmVudC0+ZGV2LCAiZGFpX2lkID0gJWQsICBzY2xrID0gJXVcbiIsIGNvZGVjX2RhaS0+ aWQsCgkJY3M0MzEzMC0+ZGFpc1tjb2RlY19kYWktPmlkXS5zY2xrKTsKCglyZXR1cm4gMDsKfQoK c3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgY3M0MzEzMF9wY21fb3BzID0gewoJ LnN0YXJ0dXAJPSBjczQzMTMwX3BjbV9zdGFydHVwLAoJLmh3X3BhcmFtcwk9IGNzNDMxMzBfaHdf cGFyYW1zLAoJLmh3X2ZyZWUJPSBjczQzMTMwX2h3X2ZyZWUsCgkuc2V0X3N5c2Nsawk9IGNzNDMx MzBfc2V0X3N5c2NsaywKCS5zZXRfZm10CT0gY3M0MzEzMF9wY21fc2V0X2ZtdCwKfTsKCnN0YXRp YyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIGNzNDMxMzBfZG9wX29wcyA9IHsKCS5zdGFy dHVwCT0gY3M0MzEzMF9kb3Bfc3RhcnR1cCwKCS5od19wYXJhbXMJPSBjczQzMTMwX2h3X3BhcmFt cywKCS5od19mcmVlCT0gY3M0MzEzMF9od19mcmVlLAoJLnNldF9zeXNjbGsJPSBjczQzMTMwX3Nl dF9zeXNjbGssCgkuc2V0X2ZtdAk9IGNzNDMxMzBfcGNtX3NldF9mbXQsCn07CgpzdGF0aWMgY29u c3Qgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBjczQzMTMwX2RzZF9vcHMgPSB7Cgkuc3RhcnR1cCAg ICAgICAgPSBjczQzMTMwX2RvcF9zdGFydHVwLAoJLmh3X3BhcmFtcwk9IGNzNDMxMzBfZHNkX2h3 X3BhcmFtcywKCS5od19mcmVlCT0gY3M0MzEzMF9od19mcmVlLAoJLnNldF9mbXQJPSBjczQzMTMw X2RzZF9zZXRfZm10LAp9OwoKc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgY3M0MzEz MF9kYWlbXSA9IHsKCXsKCQkubmFtZSA9ICJjczQzMTMwLWFzcC1wY20iLAoJCS5pZCA9IENTNDMx MzBfQVNQX1BDTV9EQUksCgkJLnBsYXliYWNrID0gewoJCQkuc3RyZWFtX25hbWUgPSAiQVNQIFBD TSBQbGF5YmFjayIsCgkJCS5jaGFubmVsc19taW4gPSAxLAoJCQkuY2hhbm5lbHNfbWF4ID0gMiwK CQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfS05PVCwKCQkJLmZvcm1hdHMgPSBDUzQzMTMwX1BD TV9GT1JNQVRTLAoJCX0sCgkJLm9wcyA9ICZjczQzMTMwX3BjbV9vcHMsCgkJLnN5bW1ldHJpY19y YXRlcyA9IDEsCgl9LAoJewoJCS5uYW1lID0gImNzNDMxMzAtYXNwLWRvcCIsCgkJLmlkID0gQ1M0 MzEzMF9BU1BfRE9QX0RBSSwKCQkucGxheWJhY2sgPSB7CgkJCS5zdHJlYW1fbmFtZSA9ICJBU1Ag RG9QIFBsYXliYWNrIiwKCQkJLmNoYW5uZWxzX21pbiA9IDEsCgkJCS5jaGFubmVsc19tYXggPSAy LAoJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9LTk9ULAoJCQkuZm9ybWF0cyA9IENTNDMxMzBf RE9QX0ZPUk1BVFMsCgkJfSwKCQkub3BzID0gJmNzNDMxMzBfZG9wX29wcywKCQkuc3ltbWV0cmlj X3JhdGVzID0gMSwKCX0sCgl7CgkJLm5hbWUgPSAiY3M0MzEzMC14c3AtZG9wIiwKCQkuaWQgPSBD UzQzMTMwX1hTUF9ET1BfREFJLAoJCS5wbGF5YmFjayA9IHsKCQkJLnN0cmVhbV9uYW1lID0gIlhT UCBEb1AgUGxheWJhY2siLAoJCQkuY2hhbm5lbHNfbWluID0gMSwKCQkJLmNoYW5uZWxzX21heCA9 IDIsCgkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFX0tOT1QsCgkJCS5mb3JtYXRzID0gQ1M0MzEz MF9ET1BfRk9STUFUUywKCQl9LAoJCS5vcHMgPSAmY3M0MzEzMF9kb3Bfb3BzLAoJCS5zeW1tZXRy aWNfcmF0ZXMgPSAxLAoJfSwKCXsKCQkubmFtZSA9ICJjczQzMTMwLXhzcC1kc2QiLAoJCS5pZCA9 IENTNDMxMzBfWFNQX0RTRF9EQUksCgkJLnBsYXliYWNrID0gewoJCQkuc3RyZWFtX25hbWUgPSAi WFNQIERTRCBQbGF5YmFjayIsCgkJCS5jaGFubmVsc19taW4gPSAxLAoJCQkuY2hhbm5lbHNfbWF4 ID0gMiwKCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfS05PVCwKCQkJLmZvcm1hdHMgPSBDUzQz MTMwX0RPUF9GT1JNQVRTLAoJCX0sCgkJLm9wcyA9ICZjczQzMTMwX2RzZF9vcHMsCgl9LAoKfTsK CnN0YXRpYyBpbnQgY3M0MzEzMF9jb21wb25lbnRfc2V0X3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19j b21wb25lbnQgKmNvbXBvbmVudCwKCQkJCSAgICBpbnQgY2xrX2lkLCBpbnQgc291cmNlLCB1bnNp Z25lZCBpbnQgZnJlcSwKCQkJCSAgICBpbnQgZGlyKQp7CglzdHJ1Y3QgY3M0MzEzMF9wcml2YXRl ICpjczQzMTMwID0gc25kX3NvY19jb21wb25lbnRfZ2V0X2RydmRhdGEoY29tcG9uZW50KTsKCglk ZXZfZGJnKGNvbXBvbmVudC0+ZGV2LCAiY2xrX2lkID0gJWQsIHNvdXJjZSA9ICVkLCBmcmVxID0g JWQsIGRpciA9ICVkXG4iLAoJCWNsa19pZCwgc291cmNlLCBmcmVxLCBkaXIpOwoKCXN3aXRjaCAo ZnJlcSkgewoJY2FzZSBDUzQzMTMwX01DTEtfMjJNOgoJY2FzZSBDUzQzMTMwX01DTEtfMjRNOgoJ CWNzNDMxMzAtPm1jbGsgPSBmcmVxOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlkZXZfZXJyKGNvbXBv bmVudC0+ZGV2LCAiSW52YWxpZCBNQ0xLIElOVCBmcmVxOiAldVxuIiwgZnJlcSk7CgkJcmV0dXJu IC1FSU5WQUw7Cgl9CgoJaWYgKHNvdXJjZSA9PSBDUzQzMTMwX01DTEtfU1JDX0VYVCkgewoJCWNz NDMxMzAtPnBsbF9ieXBhc3MgPSB0cnVlOwoJfSBlbHNlIHsKCQlkZXZfZXJyKGNvbXBvbmVudC0+ ZGV2LCAiSW52YWxpZCBNQ0xLIHNvdXJjZVxuIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJcmV0 dXJuIDA7Cn0KCnN0YXRpYyBpbmxpbmUgdTE2IGNzNDMxMzBfZ2V0X2FjX3JlZ192YWwodTE2IGFj X2ZyZXEpCnsKCS8qIEFDIGZyZXEgaXMgY291bnRlZCBpbiA1Ljk0SHogc3RlcC4gKi8KCXJldHVy biBhY19mcmVxIC8gNjsKfQoKc3RhdGljIGludCBjczQzMTMwX3Nob3dfZGMoc3RydWN0IGRldmlj ZSAqZGV2LCBjaGFyICpidWYsIHU4IGNoKQp7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0g dG9faTJjX2NsaWVudChkZXYpOwoJc3RydWN0IGNzNDMxMzBfcHJpdmF0ZSAqY3M0MzEzMCA9IGky Y19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoKCWlmICghY3M0MzEzMC0+aHBsb2FkX2RvbmUpCgkJ cmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIk5PX0hQTE9BRFxuIik7CgllbHNlCgkJ cmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLAoJCQkJIGNzNDMxMzAtPmhw bG9hZF9kY1tjaF0pOwp9CgpzdGF0aWMgc3NpemVfdCBjczQzMTMwX3Nob3dfZGNfbChzdHJ1Y3Qg ZGV2aWNlICpkZXYsCgkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1 ZikKewoJcmV0dXJuIGNzNDMxMzBfc2hvd19kYyhkZXYsIGJ1ZiwgSFBfTEVGVCk7Cn0KCnN0YXRp YyBzc2l6ZV90IGNzNDMxMzBfc2hvd19kY19yKHN0cnVjdCBkZXZpY2UgKmRldiwKCQkJCSBzdHJ1 Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQp7CglyZXR1cm4gY3M0MzEzMF9z aG93X2RjKGRldiwgYnVmLCBIUF9SSUdIVCk7Cn0KCnN0YXRpYyB1MTYgY29uc3QgY3M0MzEzMF9h Y19mcmVxW0NTNDMxMzBfQUNfRlJFUV0gPSB7CgkyNCwKCTQzLAoJOTMsCgkyMDAsCgk0MzEsCgk5 MjgsCgkyMDAwLAoJNDMwOSwKCTkyODMsCgkyMDAwMCwKfTsKCnN0YXRpYyBpbnQgY3M0MzEzMF9z aG93X2FjKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCB1OCBjaCkKewoJaW50IGksIGog PSAwLCB0bXA7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYp OwoJc3RydWN0IGNzNDMxMzBfcHJpdmF0ZSAqY3M0MzEzMCA9IGkyY19nZXRfY2xpZW50ZGF0YShj bGllbnQpOwoKCWlmIChjczQzMTMwLT5ocGxvYWRfZG9uZSAmJiBjczQzMTMwLT5hY19tZWFzKSB7 CgkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3M0MzEzMF9hY19mcmVxKTsgaSsrKSB7CgkJ CXRtcCA9IHNjbnByaW50ZihidWYgKyBqLCBQQUdFX1NJWkUgLSBqLCAiJXVcbiIsCgkJCQkJY3M0 MzEzMC0+aHBsb2FkX2FjW2ldW2NoXSk7CgkJCWlmICghdG1wKQoJCQkJYnJlYWs7CgoJCQlqICs9 IHRtcDsKCQl9CgoJCXJldHVybiBqOwoJfSBlbHNlIHsKCQlyZXR1cm4gc2NucHJpbnRmKGJ1Ziwg UEFHRV9TSVpFLCAiTk9fSFBMT0FEXG4iKTsKCX0KfQoKc3RhdGljIHNzaXplX3QgY3M0MzEzMF9z aG93X2FjX2woc3RydWN0IGRldmljZSAqZGV2LAoJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRl ICphdHRyLCBjaGFyICpidWYpCnsKCXJldHVybiBjczQzMTMwX3Nob3dfYWMoZGV2LCBidWYsIEhQ X0xFRlQpOwp9CgpzdGF0aWMgc3NpemVfdCBjczQzMTMwX3Nob3dfYWNfcihzdHJ1Y3QgZGV2aWNl ICpkZXYsCgkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKewoJ cmV0dXJuIGNzNDMxMzBfc2hvd19hYyhkZXYsIGJ1ZiwgSFBfUklHSFQpOwp9CgpzdGF0aWMgREVW SUNFX0FUVFIoaHBsb2FkX2RjX2wsIDA0NDQsIGNzNDMxMzBfc2hvd19kY19sLCBOVUxMKTsKc3Rh dGljIERFVklDRV9BVFRSKGhwbG9hZF9kY19yLCAwNDQ0LCBjczQzMTMwX3Nob3dfZGNfciwgTlVM TCk7CnN0YXRpYyBERVZJQ0VfQVRUUihocGxvYWRfYWNfbCwgMDQ0NCwgY3M0MzEzMF9zaG93X2Fj X2wsIE5VTEwpOwpzdGF0aWMgREVWSUNFX0FUVFIoaHBsb2FkX2FjX3IsIDA0NDQsIGNzNDMxMzBf c2hvd19hY19yLCBOVUxMKTsKCnN0YXRpYyBzdHJ1Y3QgcmVnX3NlcXVlbmNlIGhwX2VuX2NhbF9z ZXFbXSA9IHsKCXtDUzQzMTMwX0lOVF9NQVNLXzQsIENTNDMxMzBfSU5UX01BU0tfQUxMfSwKCXtD UzQzMTMwX0hQX01FQVNfTE9BRF8xLCAwfSwKCXtDUzQzMTMwX0hQX01FQVNfTE9BRF8yLCAwfSwK CXtDUzQzMTMwX0lOVF9NQVNLXzQsIDB9LAoJe0NTNDMxMzBfRFhEMSwgMHg5OX0sCgl7Q1M0MzEz MF9EWEQxNiwgMHhCQn0sCgl7Q1M0MzEzMF9EWEQxMiwgMHgwMX0sCgl7Q1M0MzEzMF9EWEQxOSwg MHhDQn0sCgl7Q1M0MzEzMF9EWEQxNywgMHg5NX0sCgl7Q1M0MzEzMF9EWEQxOCwgMHgwQn0sCgl7 Q1M0MzEzMF9EWEQxLCAwfSwKCXtDUzQzMTMwX0hQX0xPQURfMSwgMHg4MH0sCn07CgpzdGF0aWMg c3RydWN0IHJlZ19zZXF1ZW5jZSBocF9lbl9jYWxfc2VxMltdID0gewoJe0NTNDMxMzBfSU5UX01B U0tfNCwgQ1M0MzEzMF9JTlRfTUFTS19BTEx9LAoJe0NTNDMxMzBfSFBfTUVBU19MT0FEXzEsIDB9 LAoJe0NTNDMxMzBfSFBfTUVBU19MT0FEXzIsIDB9LAoJe0NTNDMxMzBfSU5UX01BU0tfNCwgMH0s Cgl7Q1M0MzEzMF9IUF9MT0FEXzEsIDB4ODB9LAp9OwoKc3RhdGljIHN0cnVjdCByZWdfc2VxdWVu Y2UgaHBfZGlzX2NhbF9zZXFbXSA9IHsKCXtDUzQzMTMwX0hQX0xPQURfMSwgMHg4MH0sCgl7Q1M0 MzEzMF9EWEQxLCAweDk5fSwKCXtDUzQzMTMwX0RYRDEyLCAwfSwKCXtDUzQzMTMwX0RYRDEsIDB9 LAoJe0NTNDMxMzBfSFBfTE9BRF8xLCAwfSwKfTsKCnN0YXRpYyBzdHJ1Y3QgcmVnX3NlcXVlbmNl IGhwX2Rpc19jYWxfc2VxMltdID0gewoJe0NTNDMxMzBfSFBfTE9BRF8xLCAweDgwfSwKCXtDUzQz MTMwX0hQX0xPQURfMSwgMH0sCn07CgpzdGF0aWMgc3RydWN0IHJlZ19zZXF1ZW5jZSBocF9kY19j aF9sX3NlcVtdID0gewoJe0NTNDMxMzBfRFhEMSwgMHg5OX0sCgl7Q1M0MzEzMF9EWEQxOSwgMHgw QX0sCgl7Q1M0MzEzMF9EWEQxNywgMHg5M30sCgl7Q1M0MzEzMF9EWEQxOCwgMHgwQX0sCgl7Q1M0 MzEzMF9EWEQxLCAwfSwKCXtDUzQzMTMwX0hQX0xPQURfMSwgMHg4MH0sCgl7Q1M0MzEzMF9IUF9M T0FEXzEsIDB4ODF9LAp9OwoKc3RhdGljIHN0cnVjdCByZWdfc2VxdWVuY2UgaHBfZGNfY2hfbF9z ZXEyW10gPSB7Cgl7Q1M0MzEzMF9IUF9MT0FEXzEsIDB4ODB9LAoJe0NTNDMxMzBfSFBfTE9BRF8x LCAweDgxfSwKfTsKCnN0YXRpYyBzdHJ1Y3QgcmVnX3NlcXVlbmNlIGhwX2RjX2NoX3Jfc2VxW10g PSB7Cgl7Q1M0MzEzMF9EWEQxLCAweDk5fSwKCXtDUzQzMTMwX0RYRDE5LCAweDhBfSwKCXtDUzQz MTMwX0RYRDE3LCAweDE1fSwKCXtDUzQzMTMwX0RYRDE4LCAweDA2fSwKCXtDUzQzMTMwX0RYRDEs IDB9LAoJe0NTNDMxMzBfSFBfTE9BRF8xLCAweDkwfSwKCXtDUzQzMTMwX0hQX0xPQURfMSwgMHg5 MX0sCn07CgpzdGF0aWMgc3RydWN0IHJlZ19zZXF1ZW5jZSBocF9kY19jaF9yX3NlcTJbXSA9IHsK CXtDUzQzMTMwX0hQX0xPQURfMSwgMHg5MH0sCgl7Q1M0MzEzMF9IUF9MT0FEXzEsIDB4OTF9LAp9 OwoKc3RhdGljIHN0cnVjdCByZWdfc2VxdWVuY2UgaHBfYWNfY2hfbF9zZXFbXSA9IHsKCXtDUzQz MTMwX0RYRDEsIDB4OTl9LAoJe0NTNDMxMzBfRFhEMTksIDB4MEF9LAoJe0NTNDMxMzBfRFhEMTcs IDB4OTN9LAoJe0NTNDMxMzBfRFhEMTgsIDB4MEF9LAoJe0NTNDMxMzBfRFhEMSwgMH0sCgl7Q1M0 MzEzMF9IUF9MT0FEXzEsIDB4ODB9LAoJe0NTNDMxMzBfSFBfTE9BRF8xLCAweDgyfSwKfTsKCnN0 YXRpYyBzdHJ1Y3QgcmVnX3NlcXVlbmNlIGhwX2FjX2NoX2xfc2VxMltdID0gewoJe0NTNDMxMzBf SFBfTE9BRF8xLCAweDgwfSwKCXtDUzQzMTMwX0hQX0xPQURfMSwgMHg4Mn0sCn07CgpzdGF0aWMg c3RydWN0IHJlZ19zZXF1ZW5jZSBocF9hY19jaF9yX3NlcVtdID0gewoJe0NTNDMxMzBfRFhEMSwg MHg5OX0sCgl7Q1M0MzEzMF9EWEQxOSwgMHg4QX0sCgl7Q1M0MzEzMF9EWEQxNywgMHgxNX0sCgl7 Q1M0MzEzMF9EWEQxOCwgMHgwNn0sCgl7Q1M0MzEzMF9EWEQxLCAwfSwKCXtDUzQzMTMwX0hQX0xP QURfMSwgMHg5MH0sCgl7Q1M0MzEzMF9IUF9MT0FEXzEsIDB4OTJ9LAp9OwoKc3RhdGljIHN0cnVj dCByZWdfc2VxdWVuY2UgaHBfYWNfY2hfcl9zZXEyW10gPSB7Cgl7Q1M0MzEzMF9IUF9MT0FEXzEs IDB4OTB9LAoJe0NTNDMxMzBfSFBfTE9BRF8xLCAweDkyfSwKfTsKCnN0YXRpYyBzdHJ1Y3QgcmVn X3NlcXVlbmNlIGhwX2Nsbl9zZXFbXSA9IHsKCXtDUzQzMTMwX0lOVF9NQVNLXzQsIENTNDMxMzBf SU5UX01BU0tfQUxMfSwKCXtDUzQzMTMwX0hQX01FQVNfTE9BRF8xLCAwfSwKCXtDUzQzMTMwX0hQ X01FQVNfTE9BRF8yLCAwfSwKfTsKCnN0cnVjdCByZWdfc2VxdWVuY2VzIHsKCXN0cnVjdCByZWdf c2VxdWVuY2UJKnNlcTsKCWludAkJCXNpemU7Cgl1bnNpZ25lZCBpbnQJCW1zazsKfTsKCnN0YXRp YyBzdHJ1Y3QgcmVnX3NlcXVlbmNlcyBocGxvYWRfc2VxMVtdID0gewoJewoJCS5zZXEJPSBocF9l bl9jYWxfc2VxLAoJCS5zaXplCT0gQVJSQVlfU0laRShocF9lbl9jYWxfc2VxKSwKCQkubXNrCT0g Q1M0MzEzMF9IUExPQURfT05fSU5ULAoJfSwKCXsKCQkuc2VxCT0gaHBfZGNfY2hfbF9zZXEsCgkJ LnNpemUJPSBBUlJBWV9TSVpFKGhwX2RjX2NoX2xfc2VxKSwKCQkubXNrCT0gQ1M0MzEzMF9IUExP QURfRENfSU5ULAoJfSwKCXsKCQkuc2VxCT0gaHBfYWNfY2hfbF9zZXEsCgkJLnNpemUJPSBBUlJB WV9TSVpFKGhwX2FjX2NoX2xfc2VxKSwKCQkubXNrCT0gQ1M0MzEzMF9IUExPQURfQUNfSU5ULAoJ fSwKCXsKCQkuc2VxCT0gaHBfZGlzX2NhbF9zZXEsCgkJLnNpemUJPSBBUlJBWV9TSVpFKGhwX2Rp c19jYWxfc2VxKSwKCQkubXNrCT0gQ1M0MzEzMF9IUExPQURfT0ZGX0lOVCwKCX0sCgl7CgkJLnNl cQk9IGhwX2VuX2NhbF9zZXEsCgkJLnNpemUJPSBBUlJBWV9TSVpFKGhwX2VuX2NhbF9zZXEpLAoJ CS5tc2sJPSBDUzQzMTMwX0hQTE9BRF9PTl9JTlQsCgl9LAoJewoJCS5zZXEJPSBocF9kY19jaF9y X3NlcSwKCQkuc2l6ZQk9IEFSUkFZX1NJWkUoaHBfZGNfY2hfcl9zZXEpLAoJCS5tc2sJPSBDUzQz MTMwX0hQTE9BRF9EQ19JTlQsCgl9LAoJewoJCS5zZXEJPSBocF9hY19jaF9yX3NlcSwKCQkuc2l6 ZQk9IEFSUkFZX1NJWkUoaHBfYWNfY2hfcl9zZXEpLAoJCS5tc2sJPSBDUzQzMTMwX0hQTE9BRF9B Q19JTlQsCgl9LAp9OwoKc3RhdGljIHN0cnVjdCByZWdfc2VxdWVuY2VzIGhwbG9hZF9zZXEyW10g PSB7Cgl7CgkJLnNlcQk9IGhwX2VuX2NhbF9zZXEyLAoJCS5zaXplCT0gQVJSQVlfU0laRShocF9l bl9jYWxfc2VxMiksCgkJLm1zawk9IENTNDMxMzBfSFBMT0FEX09OX0lOVCwKCX0sCgl7CgkJLnNl cQk9IGhwX2RjX2NoX2xfc2VxMiwKCQkuc2l6ZQk9IEFSUkFZX1NJWkUoaHBfZGNfY2hfbF9zZXEy KSwKCQkubXNrCT0gQ1M0MzEzMF9IUExPQURfRENfSU5ULAoJfSwKCXsKCQkuc2VxCT0gaHBfYWNf Y2hfbF9zZXEyLAoJCS5zaXplCT0gQVJSQVlfU0laRShocF9hY19jaF9sX3NlcTIpLAoJCS5tc2sJ PSBDUzQzMTMwX0hQTE9BRF9BQ19JTlQsCgl9LAoJewoJCS5zZXEJPSBocF9kaXNfY2FsX3NlcTIs CgkJLnNpemUJPSBBUlJBWV9TSVpFKGhwX2Rpc19jYWxfc2VxMiksCgkJLm1zawk9IENTNDMxMzBf SFBMT0FEX09GRl9JTlQsCgl9LAoJewoJCS5zZXEJPSBocF9lbl9jYWxfc2VxMiwKCQkuc2l6ZQk9 IEFSUkFZX1NJWkUoaHBfZW5fY2FsX3NlcTIpLAoJCS5tc2sJPSBDUzQzMTMwX0hQTE9BRF9PTl9J TlQsCgl9LAoJewoJCS5zZXEJPSBocF9kY19jaF9yX3NlcTIsCgkJLnNpemUJPSBBUlJBWV9TSVpF KGhwX2RjX2NoX3Jfc2VxMiksCgkJLm1zawk9IENTNDMxMzBfSFBMT0FEX0RDX0lOVCwKCX0sCgl7 CgkJLnNlcQk9IGhwX2FjX2NoX3Jfc2VxMiwKCQkuc2l6ZQk9IEFSUkFZX1NJWkUoaHBfYWNfY2hf cl9zZXEyKSwKCQkubXNrCT0gQ1M0MzEzMF9IUExPQURfQUNfSU5ULAoJfSwKfTsKCnN0YXRpYyBp bnQgY3M0MzEzMF91cGRhdGVfaHBsb2FkKHVuc2lnbmVkIGludCBtc2ssIGludCBhY19pZHgsCgkJ CQkgc3RydWN0IGNzNDMxMzBfcHJpdmF0ZSAqY3M0MzEzMCkKewoJYm9vbCBsZWZ0X2NoID0gdHJ1 ZTsKCXVuc2lnbmVkIGludCByZWc7Cgl1MzIgYWRkcjsKCXUxNiBpbXBlZGFuY2U7CglzdHJ1Y3Qg c25kX3NvY19jb21wb25lbnQgKmNvbXBvbmVudCA9IGNzNDMxMzAtPmNvbXBvbmVudDsKCglzd2l0 Y2ggKG1zaykgewoJY2FzZSBDUzQzMTMwX0hQTE9BRF9EQ19JTlQ6CgljYXNlIENTNDMxMzBfSFBM T0FEX0FDX0lOVDoKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIDA7Cgl9CgoJcmVnbWFwX3Jl YWQoY3M0MzEzMC0+cmVnbWFwLCBDUzQzMTMwX0hQX0xPQURfMSwgJnJlZyk7CglpZiAocmVnICYg Q1M0MzEzMF9IUExPQURfQ0hOX1NFTCkKCQlsZWZ0X2NoID0gZmFsc2U7CgoJaWYgKG1zayA9PSBD UzQzMTMwX0hQTE9BRF9EQ19JTlQpCgkJYWRkciA9IENTNDMxMzBfSFBfRENfU1RBVF8xOwoJZWxz ZQoJCWFkZHIgPSBDUzQzMTMwX0hQX0FDX1NUQVRfMTsKCglyZWdtYXBfcmVhZChjczQzMTMwLT5y ZWdtYXAsIGFkZHIsICZyZWcpOwoJaW1wZWRhbmNlID0gcmVnID4+IDM7CglyZWdtYXBfcmVhZChj czQzMTMwLT5yZWdtYXAsIGFkZHIgKyAxLCAmcmVnKTsKCWltcGVkYW5jZSB8PSByZWcgPDwgNTsK CglpZiAobXNrID09IENTNDMxMzBfSFBMT0FEX0RDX0lOVCkgewoJCWlmIChsZWZ0X2NoKQoJCQlj czQzMTMwLT5ocGxvYWRfZGNbSFBfTEVGVF0gPSBpbXBlZGFuY2U7CgkJZWxzZQoJCQljczQzMTMw LT5ocGxvYWRfZGNbSFBfUklHSFRdID0gaW1wZWRhbmNlOwoKCQlkZXZfZGJnKGNvbXBvbmVudC0+ ZGV2LCAiSFAgREMgaW1wZWRhbmNlIChDaCAldSk6ICV1XG4iLCAhbGVmdF9jaCwKCQkJaW1wZWRh bmNlKTsKCX0gZWxzZSB7CgkJaWYgKGxlZnRfY2gpCgkJCWNzNDMxMzAtPmhwbG9hZF9hY1thY19p ZHhdW0hQX0xFRlRdID0gaW1wZWRhbmNlOwoJCWVsc2UKCQkJY3M0MzEzMC0+aHBsb2FkX2FjW2Fj X2lkeF1bSFBfUklHSFRdID0gaW1wZWRhbmNlOwoKCQlkZXZfZGJnKGNvbXBvbmVudC0+ZGV2LCAi SFAgQUMgKCV1IEh6KSBpbXBlZGFuY2UgKENoICV1KTogJXVcbiIsCgkJCWNzNDMxMzAtPmFjX2Zy ZXFbYWNfaWR4XSwgIWxlZnRfY2gsIGltcGVkYW5jZSk7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRp YyBpbnQgY3M0MzEzMF9ocGxvYWRfcHJvYyhzdHJ1Y3QgY3M0MzEzMF9wcml2YXRlICpjczQzMTMw LAoJCQkgICAgICAgc3RydWN0IHJlZ19zZXF1ZW5jZSAqc2VxLCBpbnQgc2VxX3NpemUsCgkJCSAg ICAgICB1bnNpZ25lZCBpbnQgcnNsdF9tc2ssIGludCBhY19pZHgpCnsKCWludCByZXQ7Cgl1bnNp Z25lZCBpbnQgbXNrOwoJdTE2IGFjX3JlZ192YWw7CglzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQg KmNvbXBvbmVudCA9IGNzNDMxMzAtPmNvbXBvbmVudDsKCglyZWluaXRfY29tcGxldGlvbigmY3M0 MzEzMC0+aHBsb2FkX2V2dCk7CgoJaWYgKHJzbHRfbXNrID09IENTNDMxMzBfSFBMT0FEX0FDX0lO VCkgewoJCWFjX3JlZ192YWwgPSBjczQzMTMwX2dldF9hY19yZWdfdmFsKGNzNDMxMzAtPmFjX2Zy ZXFbYWNfaWR4XSk7CgkJcmVnbWFwX3VwZGF0ZV9iaXRzKGNzNDMxMzAtPnJlZ21hcCwgQ1M0MzEz MF9IUF9MT0FEXzEsCgkJCQkgICBDUzQzMTMwX0hQTE9BRF9BQ19TVEFSVCwgMCk7CgkJcmVnbWFw X3VwZGF0ZV9iaXRzKGNzNDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9IUF9NRUFTX0xPQURfMSwKCQkJ CSAgIENTNDMxMzBfSFBfTUVBU19MT0FEX01BU0ssCgkJCQkgICBhY19yZWdfdmFsID4+IENTNDMx MzBfSFBfTUVBU19MT0FEXzFfU0hJRlQpOwoJCXJlZ21hcF91cGRhdGVfYml0cyhjczQzMTMwLT5y ZWdtYXAsIENTNDMxMzBfSFBfTUVBU19MT0FEXzIsCgkJCQkgICBDUzQzMTMwX0hQX01FQVNfTE9B RF9NQVNLLAoJCQkJICAgYWNfcmVnX3ZhbCA+PiBDUzQzMTMwX0hQX01FQVNfTE9BRF8yX1NISUZU KTsKCX0KCglyZWdtYXBfbXVsdGlfcmVnX3dyaXRlKGNzNDMxMzAtPnJlZ21hcCwgc2VxLAoJCQkg ICAgICAgc2VxX3NpemUpOwoKCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY3M0 MzEzMC0+aHBsb2FkX2V2dCwKCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOwoJcmVnbWFw X3JlYWQoY3M0MzEzMC0+cmVnbWFwLCBDUzQzMTMwX0lOVF9NQVNLXzQsICZtc2spOwoJaWYgKCFy ZXQpIHsKCQlkZXZfZXJyKGNvbXBvbmVudC0+ZGV2LCAiVGltZW91dCB3YWl0aW5nIGZvciBIUExP QUQgaW50ZXJydXB0XG4iKTsKCQlyZXR1cm4gLTE7Cgl9CgoJZGV2X2RiZyhjb21wb25lbnQtPmRl diwgIkhQIGxvYWQgc3RhdDogJXgsIElOVF9NQVNLXzQ6ICV4XG4iLAoJCWNzNDMxMzAtPmhwbG9h ZF9zdGF0LCBtc2spOwoJaWYgKChjczQzMTMwLT5ocGxvYWRfc3RhdCAmIChDUzQzMTMwX0hQTE9B RF9OT19EQ19JTlQgfAoJCQkJICAgICBDUzQzMTMwX0hQTE9BRF9VTlBMVUdfSU5UIHwKCQkJCSAg ICAgQ1M0MzEzMF9IUExPQURfT09SX0lOVCkpIHx8CgkgICAgIShjczQzMTMwLT5ocGxvYWRfc3Rh dCAmIHJzbHRfbXNrKSkgewoJCWRldl9kYmcoY29tcG9uZW50LT5kZXYsICJIUCBsb2FkIG1lYXN1 cmUgZmFpbGVkXG4iKTsKCQlyZXR1cm4gLTE7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBjb25z dCBzdHJ1Y3QgcmVnX3NlcXVlbmNlIGh2X3NlcVtdWzJdID0gewoJewoJCXtDUzQzMTMwX0NMQVNT X0hfQ1RMLCAweDFDfSwKCQl7Q1M0MzEzMF9IUF9PVVRfQ1RMXzEsIDB4MTB9LAoJfSwKCXsKCQl7 Q1M0MzEzMF9DTEFTU19IX0NUTCwgMHgxRX0sCgkJe0NTNDMxMzBfSFBfT1VUX0NUTF8xLCAweDIw fSwKCX0sCgl7CgkJe0NTNDMxMzBfQ0xBU1NfSF9DVEwsIDB4MUV9LAoJCXtDUzQzMTMwX0hQX09V VF9DVExfMSwgMHgzMH0sCgl9LAp9OwoKc3RhdGljIGludCBjczQzMTMwX3NldF9odihzdHJ1Y3Qg cmVnbWFwICpyZWdtYXAsIHUxNiBocGxvYWRfZGMsCgkJCSAgY29uc3QgdTE2ICpkY190aHJlc2hv bGQpCnsKCWludCBpOwoKCWZvciAoaSA9IDA7IGkgPCBDUzQzMTMwX0RDX1RIUkVTSE9MRDsgaSsr KSB7CgkJaWYgKGhwbG9hZF9kYyA8PSBkY190aHJlc2hvbGRbaV0pCgkJCWJyZWFrOwoJfQoKCXJl Z21hcF9tdWx0aV9yZWdfd3JpdGUocmVnbWFwLCBodl9zZXFbaV0sIEFSUkFZX1NJWkUoaHZfc2Vx W2ldKSk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIGNzNDMxMzBfaW1wX21lYXMoc3RydWN0 IHdvcmtfc3RydWN0ICp3aykKewoJdW5zaWduZWQgaW50IHJlZywgc2VxX3NpemU7CglpbnQgaSwg cmV0LCBhY19pZHg7CglzdHJ1Y3QgY3M0MzEzMF9wcml2YXRlICpjczQzMTMwOwoJc3RydWN0IHNu ZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQ7CglzdHJ1Y3QgcmVnX3NlcXVlbmNlcyAqaHBsb2Fk X3NlcTsKCgljczQzMTMwID0gY29udGFpbmVyX29mKHdrLCBzdHJ1Y3QgY3M0MzEzMF9wcml2YXRl LCB3b3JrKTsKCWNvbXBvbmVudCA9IGNzNDMxMzAtPmNvbXBvbmVudDsKCglpZiAoIWNzNDMxMzAt Pm1jbGspCgkJcmV0dXJuOwoKCWNzNDMxMzAtPmhwbG9hZF9kb25lID0gZmFsc2U7CgoJbXV0ZXhf bG9jaygmY3M0MzEzMC0+Y2xrX211dGV4KTsKCWlmICghY3M0MzEzMC0+Y2xrX3JlcSkgewoJCS8q IGNsayBub3QgaW4gdXNlICovCgkJY3M0MzEzMF9zZXRfcGxsKGNvbXBvbmVudCwgMCwgMCwgY3M0 MzEzMC0+bWNsaywgQ1M0MzEzMF9NQ0xLXzIyTSk7CgkJaWYgKGNzNDMxMzAtPnBsbF9ieXBhc3Mp CgkJCWNzNDMxMzBfY2hhbmdlX2Nsa3NyYyhjb21wb25lbnQsIENTNDMxMzBfTUNMS19TUkNfRVhU KTsKCQllbHNlCgkJCWNzNDMxMzBfY2hhbmdlX2Nsa3NyYyhjb21wb25lbnQsIENTNDMxMzBfTUNM S19TUkNfUExMKTsKCX0KCgljczQzMTMwLT5jbGtfcmVxKys7CgltdXRleF91bmxvY2soJmNzNDMx MzAtPmNsa19tdXRleCk7CgoJcmVnbWFwX3JlYWQoY3M0MzEzMC0+cmVnbWFwLCBDUzQzMTMwX0lO VF9TVEFUVVNfNCwgJnJlZyk7CgoJc3dpdGNoIChjczQzMTMwLT5kZXZfaWQpIHsKCWNhc2UgQ1M0 MzEzMF9DSElQX0lEOgoJCWhwbG9hZF9zZXEgPSBocGxvYWRfc2VxMTsKCQlzZXFfc2l6ZSA9IEFS UkFZX1NJWkUoaHBsb2FkX3NlcTEpOwoJCWJyZWFrOwoJY2FzZSBDUzQzMTMxX0NISVBfSUQ6CgkJ aHBsb2FkX3NlcSA9IGhwbG9hZF9zZXEyOwoJCXNlcV9zaXplID0gQVJSQVlfU0laRShocGxvYWRf c2VxMik7CgkJYnJlYWs7CglkZWZhdWx0OgoJCVdBUk4oMSwgIkludmFsaWQgZGV2X2lkIGZvciBt ZWFzOiAlZCIsIGNzNDMxMzAtPmRldl9pZCk7CgkJcmV0dXJuOwoJfQoKCWkgPSAwOwoJYWNfaWR4 ID0gMDsKCXdoaWxlIChpIDwgc2VxX3NpemUpIHsKCQlyZXQgPSBjczQzMTMwX2hwbG9hZF9wcm9j KGNzNDMxMzAsIGhwbG9hZF9zZXFbaV0uc2VxLAoJCQkJCSAgaHBsb2FkX3NlcVtpXS5zaXplLAoJ CQkJCSAgaHBsb2FkX3NlcVtpXS5tc2ssIGFjX2lkeCk7CgkJaWYgKHJldCA8IDApCgkJCWdvdG8g ZXhpdDsKCgkJY3M0MzEzMF91cGRhdGVfaHBsb2FkKGhwbG9hZF9zZXFbaV0ubXNrLCBhY19pZHgs IGNzNDMxMzApOwoKCQlpZiAoY3M0MzEzMC0+YWNfbWVhcyAmJgoJCSAgICBocGxvYWRfc2VxW2ld Lm1zayA9PSBDUzQzMTMwX0hQTE9BRF9BQ19JTlQgJiYKCQkgICAgYWNfaWR4IDwgQ1M0MzEzMF9B Q19GUkVRIC0gMSkgewoJCQlhY19pZHgrKzsKCQl9IGVsc2UgewoJCQlhY19pZHggPSAwOwoJCQlp Kys7CgkJfQoJfQoJY3M0MzEzMC0+aHBsb2FkX2RvbmUgPSB0cnVlOwoKCWlmIChjczQzMTMwLT5o cGxvYWRfZGNbSFBfTEVGVF0gPj0gQ1M0MzEzMF9MSU5FT1VUX0xPQUQpCgkJc25kX3NvY19qYWNr X3JlcG9ydCgmY3M0MzEzMC0+amFjaywgQ1M0MzEzMF9KQUNLX0xJTkVPVVQsCgkJCQkgICAgQ1M0 MzEzMF9KQUNLX01BU0spOwoJZWxzZQoJCXNuZF9zb2NfamFja19yZXBvcnQoJmNzNDMxMzAtPmph Y2ssIENTNDMxMzBfSkFDS19IRUFEUEhPTkUsCgkJCQkgICAgQ1M0MzEzMF9KQUNLX01BU0spOwoK CWRldl9kYmcoY29tcG9uZW50LT5kZXYsICJTZXQgSFAgb3V0cHV0IGNvbnRyb2wuIERDIHRocmVz aG9sZFxuIik7Cglmb3IgKGkgPSAwOyBpIDwgQ1M0MzEzMF9EQ19USFJFU0hPTEQ7IGkrKykKCQlk ZXZfZGJnKGNvbXBvbmVudC0+ZGV2LCAiREMgdGhyZXNob2xkWyVkXTogJXUuXG4iLCBpLAoJCQlj czQzMTMwLT5kY190aHJlc2hvbGRbaV0pOwoKCWNzNDMxMzBfc2V0X2h2KGNzNDMxMzAtPnJlZ21h cCwgY3M0MzEzMC0+aHBsb2FkX2RjW0hQX0xFRlRdLAoJCSAgICAgICBjczQzMTMwLT5kY190aHJl c2hvbGQpOwoKZXhpdDoKCXN3aXRjaCAoY3M0MzEzMC0+ZGV2X2lkKSB7CgljYXNlIENTNDMxMzBf Q0hJUF9JRDoKCQljczQzMTMwX2hwbG9hZF9wcm9jKGNzNDMxMzAsIGhwX2Rpc19jYWxfc2VxLAoJ CQkJICAgIEFSUkFZX1NJWkUoaHBfZGlzX2NhbF9zZXEpLAoJCQkJICAgIENTNDMxMzBfSFBMT0FE X09GRl9JTlQsIGFjX2lkeCk7CgkJYnJlYWs7CgljYXNlIENTNDMxMzFfQ0hJUF9JRDoKCQljczQz MTMwX2hwbG9hZF9wcm9jKGNzNDMxMzAsIGhwX2Rpc19jYWxfc2VxMiwKCQkJCSAgICBBUlJBWV9T SVpFKGhwX2Rpc19jYWxfc2VxMiksCgkJCQkgICAgQ1M0MzEzMF9IUExPQURfT0ZGX0lOVCwgYWNf aWR4KTsKCQlicmVhazsKCX0KCglyZWdtYXBfbXVsdGlfcmVnX3dyaXRlKGNzNDMxMzAtPnJlZ21h cCwgaHBfY2xuX3NlcSwKCQkJICAgICAgIEFSUkFZX1NJWkUoaHBfY2xuX3NlcSkpOwoKCW11dGV4 X2xvY2soJmNzNDMxMzAtPmNsa19tdXRleCk7CgljczQzMTMwLT5jbGtfcmVxLS07CgkvKiBjbGsg bm90IGluIHVzZSAqLwoJaWYgKCFjczQzMTMwLT5jbGtfcmVxKQoJCWNzNDMxMzBfY2hhbmdlX2Ns a3NyYyhjb21wb25lbnQsIENTNDMxMzBfTUNMS19TUkNfUkNPKTsKCW11dGV4X3VubG9jaygmY3M0 MzEzMC0+Y2xrX211dGV4KTsKfQoKc3RhdGljIGlycXJldHVybl90IGNzNDMxMzBfaXJxX3RocmVh ZChpbnQgaXJxLCB2b2lkICpkYXRhKQp7CglzdHJ1Y3QgY3M0MzEzMF9wcml2YXRlICpjczQzMTMw ID0gKHN0cnVjdCBjczQzMTMwX3ByaXZhdGUgKilkYXRhOwoJc3RydWN0IHNuZF9zb2NfY29tcG9u ZW50ICpjb21wb25lbnQgPSBjczQzMTMwLT5jb21wb25lbnQ7Cgl1bnNpZ25lZCBpbnQgc3RpY2tp ZXNbQ1M0MzEzMF9OVU1fSU5UXTsKCXVuc2lnbmVkIGludCBpcnFfb2NjdXJyZW5jZSA9IDA7Cgl1 bnNpZ25lZCBpbnQgbWFza3NbQ1M0MzEzMF9OVU1fSU5UXTsKCWludCBpLCBqOwoKCWZvciAoaSA9 IDA7IGkgPCBBUlJBWV9TSVpFKHN0aWNraWVzKTsgaSsrKSB7CgkJcmVnbWFwX3JlYWQoY3M0MzEz MC0+cmVnbWFwLCBDUzQzMTMwX0lOVF9TVEFUVVNfMSArIGksCgkJCSAgICAmc3RpY2tpZXNbaV0p OwoJCXJlZ21hcF9yZWFkKGNzNDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9JTlRfTUFTS18xICsgaSwK CQkJICAgICZtYXNrc1tpXSk7Cgl9CgoJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RpY2tp ZXMpOyBpKyspIHsKCQlzdGlja2llc1tpXSA9IHN0aWNraWVzW2ldICYgKH5tYXNrc1tpXSk7CgkJ Zm9yIChqID0gMDsgaiA8IDg7IGorKykKCQkJaXJxX29jY3VycmVuY2UgKz0gKHN0aWNraWVzW2ld ID4+IGopICYgMTsKCX0KCWRldl9kYmcoY29tcG9uZW50LT5kZXYsICJudW1iZXIgb2YgaW50ZXJy dXB0cyBvY2N1cnJlZCAoJXUpXG4iLAoJCWlycV9vY2N1cnJlbmNlKTsKCglpZiAoIWlycV9vY2N1 cnJlbmNlKQoJCXJldHVybiBJUlFfTk9ORTsKCglpZiAoc3RpY2tpZXNbMF0gJiBDUzQzMTMwX1hU QUxfUkRZX0lOVCkgewoJCWNvbXBsZXRlKCZjczQzMTMwLT54dGFsX3JkeSk7CgkJcmV0dXJuIElS UV9IQU5ETEVEOwoJfQoKCWlmIChzdGlja2llc1swXSAmIENTNDMxMzBfUExMX1JEWV9JTlQpIHsK CQljb21wbGV0ZSgmY3M0MzEzMC0+cGxsX3JkeSk7CgkJcmV0dXJuIElSUV9IQU5ETEVEOwoJfQoK CWlmIChzdGlja2llc1szXSAmIENTNDMxMzBfSFBMT0FEX05PX0RDX0lOVCkgewoJCWNzNDMxMzAt PmhwbG9hZF9zdGF0ID0gc3RpY2tpZXNbM107CgkJZGV2X2Vycihjb21wb25lbnQtPmRldiwKCQkJ IkRDIGxvYWQgaGFzIG5vdCBjb21wbGV0ZWQgYmVmb3JlIEFDIGxvYWQgKCV4KVxuIiwKCQkJY3M0 MzEzMC0+aHBsb2FkX3N0YXQpOwoJCWNvbXBsZXRlKCZjczQzMTMwLT5ocGxvYWRfZXZ0KTsKCQly ZXR1cm4gSVJRX0hBTkRMRUQ7Cgl9CgoJaWYgKHN0aWNraWVzWzNdICYgQ1M0MzEzMF9IUExPQURf VU5QTFVHX0lOVCkgewoJCWNzNDMxMzAtPmhwbG9hZF9zdGF0ID0gc3RpY2tpZXNbM107CgkJZGV2 X2Vycihjb21wb25lbnQtPmRldiwgIkhQIHVucGx1Z2dlZCBkdXJpbmcgbWVhc3VyZW1lbnQgKCV4 KVxuIiwKCQkJY3M0MzEzMC0+aHBsb2FkX3N0YXQpOwoJCWNvbXBsZXRlKCZjczQzMTMwLT5ocGxv YWRfZXZ0KTsKCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Cgl9CgoJaWYgKHN0aWNraWVzWzNdICYgQ1M0 MzEzMF9IUExPQURfT09SX0lOVCkgewoJCWNzNDMxMzAtPmhwbG9hZF9zdGF0ID0gc3RpY2tpZXNb M107CgkJZGV2X2Vycihjb21wb25lbnQtPmRldiwgIkhQIGxvYWQgb3V0IG9mIHJhbmdlICgleClc biIsCgkJCWNzNDMxMzAtPmhwbG9hZF9zdGF0KTsKCQljb21wbGV0ZSgmY3M0MzEzMC0+aHBsb2Fk X2V2dCk7CgkJcmV0dXJuIElSUV9IQU5ETEVEOwoJfQoKCWlmIChzdGlja2llc1szXSAmIENTNDMx MzBfSFBMT0FEX0FDX0lOVCkgewoJCWNzNDMxMzAtPmhwbG9hZF9zdGF0ID0gc3RpY2tpZXNbM107 CgkJZGV2X2RiZyhjb21wb25lbnQtPmRldiwgIkhQIEFDIGxvYWQgbWVhc3VyZW1lbnQgZG9uZSAo JXgpXG4iLAoJCQljczQzMTMwLT5ocGxvYWRfc3RhdCk7CgkJY29tcGxldGUoJmNzNDMxMzAtPmhw bG9hZF9ldnQpOwoJCXJldHVybiBJUlFfSEFORExFRDsKCX0KCglpZiAoc3RpY2tpZXNbM10gJiBD UzQzMTMwX0hQTE9BRF9EQ19JTlQpIHsKCQljczQzMTMwLT5ocGxvYWRfc3RhdCA9IHN0aWNraWVz WzNdOwoJCWRldl9kYmcoY29tcG9uZW50LT5kZXYsICJIUCBEQyBsb2FkIG1lYXN1cmVtZW50IGRv bmUgKCV4KVxuIiwKCQkJY3M0MzEzMC0+aHBsb2FkX3N0YXQpOwoJCWNvbXBsZXRlKCZjczQzMTMw LT5ocGxvYWRfZXZ0KTsKCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Cgl9CgoJaWYgKHN0aWNraWVzWzNd ICYgQ1M0MzEzMF9IUExPQURfT05fSU5UKSB7CgkJY3M0MzEzMC0+aHBsb2FkX3N0YXQgPSBzdGlj a2llc1szXTsKCQlkZXZfZGJnKGNvbXBvbmVudC0+ZGV2LCAiSFAgbG9hZCBzdGF0ZSBtYWNoaW5l IG9uIGRvbmUgKCV4KVxuIiwKCQkJY3M0MzEzMC0+aHBsb2FkX3N0YXQpOwoJCWNvbXBsZXRlKCZj czQzMTMwLT5ocGxvYWRfZXZ0KTsKCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Cgl9CgoJaWYgKHN0aWNr aWVzWzNdICYgQ1M0MzEzMF9IUExPQURfT0ZGX0lOVCkgewoJCWNzNDMxMzAtPmhwbG9hZF9zdGF0 ID0gc3RpY2tpZXNbM107CgkJZGV2X2RiZyhjb21wb25lbnQtPmRldiwgIkhQIGxvYWQgc3RhdGUg bWFjaGluZSBvZmYgZG9uZSAoJXgpXG4iLAoJCQljczQzMTMwLT5ocGxvYWRfc3RhdCk7CgkJY29t cGxldGUoJmNzNDMxMzAtPmhwbG9hZF9ldnQpOwoJCXJldHVybiBJUlFfSEFORExFRDsKCX0KCglp ZiAoc3RpY2tpZXNbMF0gJiBDUzQzMTMwX1hUQUxfRVJSX0lOVCkgewoJCWRldl9lcnIoY29tcG9u ZW50LT5kZXYsICJDcnlzdGFsIGVycjogY2xvY2sgaXMgbm90IHJ1bm5pbmdcbiIpOwoJCXJldHVy biBJUlFfSEFORExFRDsKCX0KCglpZiAoc3RpY2tpZXNbMF0gJiBDUzQzMTMwX0hQX1VOUExVR19J TlQpIHsKCQlkZXZfZGJnKGNvbXBvbmVudC0+ZGV2LCAiSFAgdW5wbHVnZ2VkXG4iKTsKCQljczQz MTMwLT5ocGxvYWRfZG9uZSA9IGZhbHNlOwoJCXNuZF9zb2NfamFja19yZXBvcnQoJmNzNDMxMzAt PmphY2ssIDAsIENTNDMxMzBfSkFDS19NQVNLKTsKCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Cgl9CgoJ aWYgKHN0aWNraWVzWzBdICYgQ1M0MzEzMF9IUF9QTFVHX0lOVCkgewoJCWlmIChjczQzMTMwLT5k Y19tZWFzICYmICFjczQzMTMwLT5ocGxvYWRfZG9uZSAmJgoJCSAgICAhd29ya19idXN5KCZjczQz MTMwLT53b3JrKSkgewoJCQlkZXZfZGJnKGNvbXBvbmVudC0+ZGV2LCAiSFAgbG9hZCBxdWV1ZSB3 b3JrXG4iKTsKCQkJcXVldWVfd29yayhjczQzMTMwLT53cSwgJmNzNDMxMzAtPndvcmspOwoJCX0K CgkJc25kX3NvY19qYWNrX3JlcG9ydCgmY3M0MzEzMC0+amFjaywgU05EX0pBQ0tfTUVDSEFOSUNB TCwKCQkJCSAgICBDUzQzMTMwX0pBQ0tfTUFTSyk7CgkJcmV0dXJuIElSUV9IQU5ETEVEOwoJfQoK CXJldHVybiBJUlFfTk9ORTsKfQoKc3RhdGljIGludCBjczQzMTMwX3Byb2JlKHN0cnVjdCBzbmRf c29jX2NvbXBvbmVudCAqY29tcG9uZW50KQp7CglpbnQgcmV0OwoJc3RydWN0IGNzNDMxMzBfcHJp dmF0ZSAqY3M0MzEzMCA9IHNuZF9zb2NfY29tcG9uZW50X2dldF9kcnZkYXRhKGNvbXBvbmVudCk7 CglzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29tcG9uZW50LT5jYXJkOwoJdW5zaWduZWQg aW50IHJlZzsKCgljczQzMTMwLT5jb21wb25lbnQgPSBjb21wb25lbnQ7CgoJaWYgKGNzNDMxMzAt Pnh0YWxfaWJpYXMgIT0gQ1M0MzEzMF9YVEFMX1VOVVNFRCkgewoJCXJlZ21hcF91cGRhdGVfYml0 cyhjczQzMTMwLT5yZWdtYXAsIENTNDMxMzBfQ1JZU1RBTF9TRVQsCgkJCQkgICBDUzQzMTMwX1hU QUxfSUJJQVNfTUFTSywKCQkJCSAgIGNzNDMxMzAtPnh0YWxfaWJpYXMpOwoJCXJlZ21hcF91cGRh dGVfYml0cyhjczQzMTMwLT5yZWdtYXAsIENTNDMxMzBfSU5UX01BU0tfMSwKCQkJCSAgIENTNDMx MzBfWFRBTF9FUlJfSU5ULCAwKTsKCX0KCglyZXQgPSBzbmRfc29jX2NhcmRfamFja19uZXcoY2Fy ZCwgIkhlYWRwaG9uZSIsIENTNDMxMzBfSkFDS19NQVNLLAoJCQkJICAgICZjczQzMTMwLT5qYWNr LCBOVUxMLCAwKTsKCWlmIChyZXQgPCAwKSB7CgkJZGV2X2Vycihjb21wb25lbnQtPmRldiwgIkNh bm5vdCBjcmVhdGUgamFja1xuIik7CgkJcmV0dXJuIHJldDsKCX0KCgljczQzMTMwLT5ocGxvYWRf ZG9uZSA9IGZhbHNlOwoJaWYgKGNzNDMxMzAtPmRjX21lYXMpIHsKCQlyZXQgPSBkZXZpY2VfY3Jl YXRlX2ZpbGUoY29tcG9uZW50LT5kZXYsICZkZXZfYXR0cl9ocGxvYWRfZGNfbCk7CgkJaWYgKHJl dCA8IDApCgkJCXJldHVybiByZXQ7CgoJCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZShjb21wb25l bnQtPmRldiwgJmRldl9hdHRyX2hwbG9hZF9kY19yKTsKCQlpZiAocmV0IDwgMCkKCQkJcmV0dXJu IHJldDsKCgkJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKGNvbXBvbmVudC0+ZGV2LCAmZGV2X2F0 dHJfaHBsb2FkX2FjX2wpOwoJCWlmIChyZXQgPCAwKQoJCQlyZXR1cm4gcmV0OwoKCQlyZXQgPSBk ZXZpY2VfY3JlYXRlX2ZpbGUoY29tcG9uZW50LT5kZXYsICZkZXZfYXR0cl9ocGxvYWRfYWNfcik7 CgkJaWYgKHJldCA8IDApCgkJCXJldHVybiByZXQ7CgoJCWNzNDMxMzAtPndxID0gY3JlYXRlX3Np bmdsZXRocmVhZF93b3JrcXVldWUoImNzNDMxMzBfaHAiKTsKCQlpZiAoIWNzNDMxMzAtPndxKQoJ CQlyZXR1cm4gLUVOT01FTTsKCQlJTklUX1dPUksoJmNzNDMxMzAtPndvcmssIGNzNDMxMzBfaW1w X21lYXMpOwoJfQoKCXJlZ21hcF9yZWFkKGNzNDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9JTlRfU1RB VFVTXzEsICZyZWcpOwoJcmVnbWFwX3JlYWQoY3M0MzEzMC0+cmVnbWFwLCBDUzQzMTMwX0hQX1NU QVRVUywgJnJlZyk7CglyZWdtYXBfdXBkYXRlX2JpdHMoY3M0MzEzMC0+cmVnbWFwLCBDUzQzMTMw X0lOVF9NQVNLXzEsCgkJCSAgIENTNDMxMzBfSFBfUExVR19JTlQgfCBDUzQzMTMwX0hQX1VOUExV R19JTlQsIDApOwoJcmVnbWFwX3VwZGF0ZV9iaXRzKGNzNDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9I UF9ERVRFQ1QsCgkJCSAgIENTNDMxMzBfSFBfREVURUNUX0NUUkxfTUFTSywgMCk7CglyZWdtYXBf dXBkYXRlX2JpdHMoY3M0MzEzMC0+cmVnbWFwLCBDUzQzMTMwX0hQX0RFVEVDVCwKCQkJICAgQ1M0 MzEzMF9IUF9ERVRFQ1RfQ1RSTF9NQVNLLAoJCQkgICBDUzQzMTMwX0hQX0RFVEVDVF9DVFJMX01B U0spOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50X2RyaXZl ciBzb2NfY29tcG9uZW50X2Rldl9jczQzMTMwID0gewoJLnByb2JlCQkJPSBjczQzMTMwX3Byb2Jl LAoJLmNvbnRyb2xzCQk9IGNzNDMxMzBfc25kX2NvbnRyb2xzLAoJLm51bV9jb250cm9scwkJPSBB UlJBWV9TSVpFKGNzNDMxMzBfc25kX2NvbnRyb2xzKSwKCS5zZXRfc3lzY2xrCQk9IGNzNDMxMzBf Y29tcG9uZW50X3NldF9zeXNjbGssCgkuc2V0X3BsbAkJPSBjczQzMTMwX3NldF9wbGwsCgkuaWRs ZV9iaWFzX29uCQk9IDEsCgkudXNlX3BtZG93bl90aW1lCT0gMSwKCS5lbmRpYW5uZXNzCQk9IDEs Cgkubm9uX2xlZ2FjeV9kYWlfbmFtaW5nCT0gMSwKfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVn bWFwX2NvbmZpZyBjczQzMTMwX3JlZ21hcCA9IHsKCS5yZWdfYml0cwkJPSAyNCwKCS5wYWRfYml0 cwkJPSA4LAoJLnZhbF9iaXRzCQk9IDgsCgoJLm1heF9yZWdpc3RlcgkJPSBDUzQzMTMwX0xBU1RS RUcsCgkucmVnX2RlZmF1bHRzCQk9IGNzNDMxMzBfcmVnX2RlZmF1bHRzLAoJLm51bV9yZWdfZGVm YXVsdHMJPSBBUlJBWV9TSVpFKGNzNDMxMzBfcmVnX2RlZmF1bHRzKSwKCS5yZWFkYWJsZV9yZWcJ CT0gY3M0MzEzMF9yZWFkYWJsZV9yZWdpc3RlciwKCS5wcmVjaW91c19yZWcJCT0gY3M0MzEzMF9w cmVjaW91c19yZWdpc3RlciwKCS52b2xhdGlsZV9yZWcJCT0gY3M0MzEzMF92b2xhdGlsZV9yZWdp c3RlciwKCS5jYWNoZV90eXBlCQk9IFJFR0NBQ0hFX1JCVFJFRSwKCS8qIG5lZWRlZCBmb3IgcmVn Y2FjaGVfc3luYyAqLwoJLnVzZV9zaW5nbGVfcmVhZAk9IHRydWUsCgkudXNlX3NpbmdsZV93cml0 ZQk9IHRydWUsCn07CgpzdGF0aWMgdTE2IGNvbnN0IGNzNDMxMzBfZGNfdGhyZXNob2xkW0NTNDMx MzBfRENfVEhSRVNIT0xEXSA9IHsKCTUwLAoJMTIwLAp9OwoKc3RhdGljIGludCBjczQzMTMwX2hh bmRsZV9kZXZpY2VfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2NsaWVudCwKCQkJCSAgICAg IHN0cnVjdCBjczQzMTMwX3ByaXZhdGUgKmNzNDMxMzApCnsKCXN0cnVjdCBkZXZpY2Vfbm9kZSAq bnAgPSBpMmNfY2xpZW50LT5kZXYub2Zfbm9kZTsKCXVuc2lnbmVkIGludCB2YWw7CglpbnQgaTsK CglpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJjaXJydXMseHRhbC1pYmlhcyIsICZ2YWwp IDwgMCkgewoJCS8qIENyeXN0YWwgaXMgdW51c2VkLiBTeXN0ZW0gY2xvY2sgaXMgdXNlZCBmb3Ig ZXh0ZXJuYWwgTUNMSyAqLwoJCWNzNDMxMzAtPnh0YWxfaWJpYXMgPSBDUzQzMTMwX1hUQUxfVU5V U0VEOwoJCXJldHVybiAwOwoJfQoKCXN3aXRjaCAodmFsKSB7CgljYXNlIDE6CgkJY3M0MzEzMC0+ eHRhbF9pYmlhcyA9IENTNDMxMzBfWFRBTF9JQklBU183XzVVQTsKCQlicmVhazsKCWNhc2UgMjoK CQljczQzMTMwLT54dGFsX2liaWFzID0gQ1M0MzEzMF9YVEFMX0lCSUFTXzEyXzVVQTsKCQlicmVh azsKCWNhc2UgMzoKCQljczQzMTMwLT54dGFsX2liaWFzID0gQ1M0MzEzMF9YVEFMX0lCSUFTXzE1 VUE7CgkJYnJlYWs7CglkZWZhdWx0OgoJCWRldl9lcnIoJmkyY19jbGllbnQtPmRldiwKCQkJIklu dmFsaWQgY2lycnVzLHh0YWwtaWJpYXMgdmFsdWU6ICVkXG4iLCB2YWwpOwoJCXJldHVybiAtRUlO VkFMOwoJfQoKCWNzNDMxMzAtPmRjX21lYXMgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJj aXJydXMsZGMtbWVhc3VyZSIpOwoJY3M0MzEzMC0+YWNfbWVhcyA9IG9mX3Byb3BlcnR5X3JlYWRf Ym9vbChucCwgImNpcnJ1cyxhYy1tZWFzdXJlIik7CgoJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTE2 X2FycmF5KG5wLCAiY2lycnVzLGFjLWZyZXEiLCBjczQzMTMwLT5hY19mcmVxLAoJCQkJCUNTNDMx MzBfQUNfRlJFUSkgPCAwKSB7CgkJZm9yIChpID0gMDsgaSA8IENTNDMxMzBfQUNfRlJFUTsgaSsr KQoJCQljczQzMTMwLT5hY19mcmVxW2ldID0gY3M0MzEzMF9hY19mcmVxW2ldOwoJfQoKCWlmIChv Zl9wcm9wZXJ0eV9yZWFkX3UxNl9hcnJheShucCwgImNpcnJ1cyxkYy10aHJlc2hvbGQiLAoJCQkJ ICAgICAgIGNzNDMxMzAtPmRjX3RocmVzaG9sZCwKCQkJCSAgICAgICBDUzQzMTMwX0RDX1RIUkVT SE9MRCkgPCAwKSB7CgkJZm9yIChpID0gMDsgaSA8IENTNDMxMzBfRENfVEhSRVNIT0xEOyBpKysp CgkJCWNzNDMxMzAtPmRjX3RocmVzaG9sZFtpXSA9IGNzNDMxMzBfZGNfdGhyZXNob2xkW2ldOwoJ fQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGNzNDMxMzBfaTJjX3Byb2JlKHN0cnVjdCBpMmNf Y2xpZW50ICpjbGllbnQsCgkJCSAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQp7 CglzdHJ1Y3QgY3M0MzEzMF9wcml2YXRlICpjczQzMTMwOwoJaW50IHJldDsKCXVuc2lnbmVkIGlu dCBkZXZpZCA9IDA7Cgl1bnNpZ25lZCBpbnQgcmVnOwoJaW50IGk7CgoJY3M0MzEzMCA9IGRldm1f a3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqY3M0MzEzMCksIEdGUF9LRVJORUwpOwoJaWYg KCFjczQzMTMwKQoJCXJldHVybiAtRU5PTUVNOwoKCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQs IGNzNDMxMzApOwoKCWNzNDMxMzAtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVu dCwgJmNzNDMxMzBfcmVnbWFwKTsKCWlmIChJU19FUlIoY3M0MzEzMC0+cmVnbWFwKSkgewoJCXJl dCA9IFBUUl9FUlIoY3M0MzEzMC0+cmVnbWFwKTsKCQlyZXR1cm4gcmV0OwoJfQoKCWlmIChjbGll bnQtPmRldi5vZl9ub2RlKSB7CgkJcmV0ID0gY3M0MzEzMF9oYW5kbGVfZGV2aWNlX2RhdGEoY2xp ZW50LCBjczQzMTMwKTsKCQlpZiAocmV0ICE9IDApCgkJCXJldHVybiByZXQ7Cgl9Cglmb3IgKGkg PSAwOyBpIDwgQVJSQVlfU0laRShjczQzMTMwLT5zdXBwbGllcyk7IGkrKykKCQljczQzMTMwLT5z dXBwbGllc1tpXS5zdXBwbHkgPSBjczQzMTMwX3N1cHBseV9uYW1lc1tpXTsKCglyZXQgPSBkZXZt X3JlZ3VsYXRvcl9idWxrX2dldCgmY2xpZW50LT5kZXYsCgkJCQkgICAgICBBUlJBWV9TSVpFKGNz NDMxMzAtPnN1cHBsaWVzKSwKCQkJCSAgICAgIGNzNDMxMzAtPnN1cHBsaWVzKTsKCWlmIChyZXQg IT0gMCkgewoJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3Qgc3VwcGxp ZXM6ICVkXG4iLCByZXQpOwoJCXJldHVybiByZXQ7Cgl9CglyZXQgPSByZWd1bGF0b3JfYnVsa19l bmFibGUoQVJSQVlfU0laRShjczQzMTMwLT5zdXBwbGllcyksCgkJCQkgICAgY3M0MzEzMC0+c3Vw cGxpZXMpOwoJaWYgKHJldCAhPSAwKSB7CgkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQg dG8gZW5hYmxlIHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKCQlyZXR1cm4gcmV0OwoJfQoKCWNzNDMx MzAtPnJlc2V0X2dwaW8gPSBkZXZtX2dwaW9kX2dldF9vcHRpb25hbCgmY2xpZW50LT5kZXYsCgkJ CQkJCSAgICAgICJyZXNldCIsIEdQSU9EX09VVF9MT1cpOwoJaWYgKElTX0VSUihjczQzMTMwLT5y ZXNldF9ncGlvKSkKCQlyZXR1cm4gUFRSX0VSUihjczQzMTMwLT5yZXNldF9ncGlvKTsKCglncGlv ZF9zZXRfdmFsdWVfY2Fuc2xlZXAoY3M0MzEzMC0+cmVzZXRfZ3BpbywgMSk7CgoJdXNsZWVwX3Jh bmdlKDIwMDAsIDIwNTApOwoKCXJldCA9IHJlZ21hcF9yZWFkKGNzNDMxMzAtPnJlZ21hcCwgQ1M0 MzEzMF9ERVZJRF9BQiwgJnJlZyk7CgoJZGV2aWQgPSAocmVnICYgMHhGRikgPDwgMTI7CglyZXQg PSByZWdtYXBfcmVhZChjczQzMTMwLT5yZWdtYXAsIENTNDMxMzBfREVWSURfQ0QsICZyZWcpOwoJ ZGV2aWQgfD0gKHJlZyAmIDB4RkYpIDw8IDQ7CglyZXQgPSByZWdtYXBfcmVhZChjczQzMTMwLT5y ZWdtYXAsIENTNDMxMzBfREVWSURfRSwgJnJlZyk7CglkZXZpZCB8PSAocmVnICYgMHhGMCkgPj4g NDsKCglzd2l0Y2ggKGRldmlkKSB7CgljYXNlIENTNDMxMzBfQ0hJUF9JRDoKCWNhc2UgQ1M0Mzk5 X0NISVBfSUQ6CgljYXNlIENTNDMxMzFfQ0hJUF9JRDoKCWNhc2UgQ1M0MzE5OF9DSElQX0lEOgoJ CWJyZWFrOwoJZGVmYXVsdDoKCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKCQkJIkNTNDMxMzAgRGV2 aWNlIElEICVYLiBFeHBlY3RlZCBJRCAlWCwgJVgsICVYIG9yICVYXG4iLAoJCQlkZXZpZCwgQ1M0 MzEzMF9DSElQX0lELCBDUzQzOTlfQ0hJUF9JRCwKCQkJQ1M0MzEzMV9DSElQX0lELCBDUzQzMTk4 X0NISVBfSUQpOwoJCXJldCA9IC1FTk9ERVY7CgkJZ290byBlcnI7Cgl9CgoJY3M0MzEzMC0+ZGV2 X2lkID0gZGV2aWQ7CglyZXQgPSByZWdtYXBfcmVhZChjczQzMTMwLT5yZWdtYXAsIENTNDMxMzBf UkVWX0lELCAmcmVnKTsKCWlmIChyZXQgPCAwKSB7CgkJZGV2X2VycigmY2xpZW50LT5kZXYsICJH ZXQgUmV2aXNpb24gSUQgZmFpbGVkXG4iKTsKCQlnb3RvIGVycjsKCX0KCglkZXZfaW5mbygmY2xp ZW50LT5kZXYsCgkJICJDaXJydXMgTG9naWMgQ1M0MzEzMCAoJXgpLCBSZXZpc2lvbjogJTAyWFxu IiwgZGV2aWQsCgkJIHJlZyAmIDB4RkYpOwoKCW11dGV4X2luaXQoJmNzNDMxMzAtPmNsa19tdXRl eCk7CgoJaW5pdF9jb21wbGV0aW9uKCZjczQzMTMwLT54dGFsX3JkeSk7Cglpbml0X2NvbXBsZXRp b24oJmNzNDMxMzAtPnBsbF9yZHkpOwoJaW5pdF9jb21wbGV0aW9uKCZjczQzMTMwLT5ocGxvYWRf ZXZ0KTsKCglyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKCZjbGllbnQtPmRldiwgY2xp ZW50LT5pcnEsCgkJCQkJTlVMTCwgY3M0MzEzMF9pcnFfdGhyZWFkLAoJCQkJCUlSUUZfT05FU0hP VCB8IElSUUZfVFJJR0dFUl9MT1csCgkJCQkJImNzNDMxMzAiLCBjczQzMTMwKTsKCWlmIChyZXQg IT0gMCkgewoJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgSVJROiAl ZFxuIiwgcmV0KTsKCQlyZXR1cm4gcmV0OwoJfQoKCWNzNDMxMzAtPm1jbGtfaW50X3NyYyA9IENT NDMxMzBfTUNMS19TUkNfUkNPOwoKCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KCZj bGllbnQtPmRldiwgMTAwKTsKCXBtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKCZjbGllbnQtPmRl dik7CglwbV9ydW50aW1lX3NldF9hY3RpdmUoJmNsaWVudC0+ZGV2KTsKCXBtX3J1bnRpbWVfZW5h YmxlKCZjbGllbnQtPmRldik7CgoJc3dpdGNoIChjczQzMTMwLT5kZXZfaWQpIHsKCWNhc2UgQ1M0 MzEzMF9DSElQX0lEOgoJY2FzZSBDUzQzMTMxX0NISVBfSUQ6CgkJbWVtY3B5KGFsbF9ocF93aWRn ZXRzLCBkaWdpdGFsX2hwX3dpZGdldHMsCgkJICAgICAgIHNpemVvZihkaWdpdGFsX2hwX3dpZGdl dHMpKTsKCQltZW1jcHkoYWxsX2hwX3dpZGdldHMgKyBBUlJBWV9TSVpFKGRpZ2l0YWxfaHBfd2lk Z2V0cyksCgkJICAgICAgIGFuYWxvZ19ocF93aWRnZXRzLCBzaXplb2YoYW5hbG9nX2hwX3dpZGdl dHMpKTsKCQltZW1jcHkoYWxsX2hwX3JvdXRlcywgZGlnaXRhbF9ocF9yb3V0ZXMsCgkJICAgICAg IHNpemVvZihkaWdpdGFsX2hwX3JvdXRlcykpOwoJCW1lbWNweShhbGxfaHBfcm91dGVzICsgQVJS QVlfU0laRShkaWdpdGFsX2hwX3JvdXRlcyksCgkJICAgICAgIGFuYWxvZ19ocF9yb3V0ZXMsIHNp emVvZihhbmFsb2dfaHBfcm91dGVzKSk7CgoJCXNvY19jb21wb25lbnRfZGV2X2NzNDMxMzAuZGFw bV93aWRnZXRzID0KCQkJYWxsX2hwX3dpZGdldHM7CgkJc29jX2NvbXBvbmVudF9kZXZfY3M0MzEz MC5udW1fZGFwbV93aWRnZXRzID0KCQkJQVJSQVlfU0laRShhbGxfaHBfd2lkZ2V0cyk7CgkJc29j X2NvbXBvbmVudF9kZXZfY3M0MzEzMC5kYXBtX3JvdXRlcyA9CgkJCWFsbF9ocF9yb3V0ZXM7CgkJ c29jX2NvbXBvbmVudF9kZXZfY3M0MzEzMC5udW1fZGFwbV9yb3V0ZXMgPQoJCQlBUlJBWV9TSVpF KGFsbF9ocF9yb3V0ZXMpOwoJCWJyZWFrOwoJY2FzZSBDUzQzMTk4X0NISVBfSUQ6CgljYXNlIENT NDM5OV9DSElQX0lEOgoJCXNvY19jb21wb25lbnRfZGV2X2NzNDMxMzAuZGFwbV93aWRnZXRzID0K CQkJZGlnaXRhbF9ocF93aWRnZXRzOwoJCXNvY19jb21wb25lbnRfZGV2X2NzNDMxMzAubnVtX2Rh cG1fd2lkZ2V0cyA9CgkJCUFSUkFZX1NJWkUoZGlnaXRhbF9ocF93aWRnZXRzKTsKCQlzb2NfY29t cG9uZW50X2Rldl9jczQzMTMwLmRhcG1fcm91dGVzID0KCQkJZGlnaXRhbF9ocF9yb3V0ZXM7CgkJ c29jX2NvbXBvbmVudF9kZXZfY3M0MzEzMC5udW1fZGFwbV9yb3V0ZXMgPQoJCQlBUlJBWV9TSVpF KGRpZ2l0YWxfaHBfcm91dGVzKTsKCQlicmVhazsKCX0KCglyZXQgPSBkZXZtX3NuZF9zb2NfcmVn aXN0ZXJfY29tcG9uZW50KCZjbGllbnQtPmRldiwKCQkJCSAgICAgJnNvY19jb21wb25lbnRfZGV2 X2NzNDMxMzAsCgkJCQkgICAgIGNzNDMxMzBfZGFpLCBBUlJBWV9TSVpFKGNzNDMxMzBfZGFpKSk7 CglpZiAocmV0IDwgMCkgewoJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAoJCQkic25kX3NvY19yZWdp c3Rlcl9jb21wb25lbnQgZmFpbGVkIHdpdGggcmV0ID0gJWRcbiIsIHJldCk7CgkJZ290byBlcnI7 Cgl9CgoJcmVnbWFwX3VwZGF0ZV9iaXRzKGNzNDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9QQURfSU5U X0NGRywKCQkJICAgQ1M0MzEzMF9BU1BfM1NUX01BU0ssIDApOwoJcmVnbWFwX3VwZGF0ZV9iaXRz KGNzNDMxMzAtPnJlZ21hcCwgQ1M0MzEzMF9QQURfSU5UX0NGRywKCQkJICAgQ1M0MzEzMF9YU1Bf M1NUX01BU0ssIDApOwoKCXJldHVybiAwOwplcnI6CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50 IGNzNDMxMzBfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQp7CglzdHJ1Y3Qg Y3M0MzEzMF9wcml2YXRlICpjczQzMTMwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CgoJ aWYgKGNzNDMxMzAtPnh0YWxfaWJpYXMgIT0gQ1M0MzEzMF9YVEFMX1VOVVNFRCkKCQlyZWdtYXBf dXBkYXRlX2JpdHMoY3M0MzEzMC0+cmVnbWFwLCBDUzQzMTMwX0lOVF9NQVNLXzEsCgkJCQkgICBD UzQzMTMwX1hUQUxfRVJSX0lOVCwKCQkJCSAgIDEgPDwgQ1M0MzEzMF9YVEFMX0VSUl9JTlRfU0hJ RlQpOwoKCXJlZ21hcF91cGRhdGVfYml0cyhjczQzMTMwLT5yZWdtYXAsIENTNDMxMzBfSU5UX01B U0tfMSwKCQkJICAgQ1M0MzEzMF9IUF9QTFVHX0lOVCB8IENTNDMxMzBfSFBfVU5QTFVHX0lOVCwK CQkJICAgQ1M0MzEzMF9IUF9QTFVHX0lOVCB8IENTNDMxMzBfSFBfVU5QTFVHX0lOVCk7CgoJaWYg KGNzNDMxMzAtPmRjX21lYXMpIHsKCQljYW5jZWxfd29ya19zeW5jKCZjczQzMTMwLT53b3JrKTsK CQlmbHVzaF93b3JrcXVldWUoY3M0MzEzMC0+d3EpOwoKCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmNs aWVudC0+ZGV2LCAmZGV2X2F0dHJfaHBsb2FkX2RjX2wpOwoJCWRldmljZV9yZW1vdmVfZmlsZSgm Y2xpZW50LT5kZXYsICZkZXZfYXR0cl9ocGxvYWRfZGNfcik7CgkJZGV2aWNlX3JlbW92ZV9maWxl KCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2hwbG9hZF9hY19sKTsKCQlkZXZpY2VfcmVtb3ZlX2Zp bGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaHBsb2FkX2FjX3IpOwoJfQoKCWdwaW9kX3NldF92 YWx1ZV9jYW5zbGVlcChjczQzMTMwLT5yZXNldF9ncGlvLCAwKTsKCglwbV9ydW50aW1lX2Rpc2Fi bGUoJmNsaWVudC0+ZGV2KTsKCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQ1M0MzEzMF9OVU1fU1VQ UExJRVMsIGNzNDMxMzAtPnN1cHBsaWVzKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBfX21h eWJlX3VudXNlZCBjczQzMTMwX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCnsK CXN0cnVjdCBjczQzMTMwX3ByaXZhdGUgKmNzNDMxMzAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsK CglpZiAoY3M0MzEzMC0+eHRhbF9pYmlhcyAhPSBDUzQzMTMwX1hUQUxfVU5VU0VEKQoJCXJlZ21h cF91cGRhdGVfYml0cyhjczQzMTMwLT5yZWdtYXAsIENTNDMxMzBfSU5UX01BU0tfMSwKCQkJCSAg IENTNDMxMzBfWFRBTF9FUlJfSU5ULAoJCQkJICAgMSA8PCBDUzQzMTMwX1hUQUxfRVJSX0lOVF9T SElGVCk7CgoJcmVnY2FjaGVfY2FjaGVfb25seShjczQzMTMwLT5yZWdtYXAsIHRydWUpOwoJcmVn Y2FjaGVfbWFya19kaXJ0eShjczQzMTMwLT5yZWdtYXApOwoKCWdwaW9kX3NldF92YWx1ZV9jYW5z bGVlcChjczQzMTMwLT5yZXNldF9ncGlvLCAwKTsKCglyZWd1bGF0b3JfYnVsa19kaXNhYmxlKENT NDMxMzBfTlVNX1NVUFBMSUVTLCBjczQzMTMwLT5zdXBwbGllcyk7CgoJcmV0dXJuIDA7Cn0KCnN0 YXRpYyBpbnQgX19tYXliZV91bnVzZWQgY3M0MzEzMF9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2 aWNlICpkZXYpCnsKCXN0cnVjdCBjczQzMTMwX3ByaXZhdGUgKmNzNDMxMzAgPSBkZXZfZ2V0X2Ry dmRhdGEoZGV2KTsKCWludCByZXQ7CgoJcmV0ID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKENTNDMx MzBfTlVNX1NVUFBMSUVTLCBjczQzMTMwLT5zdXBwbGllcyk7CglpZiAocmV0ICE9IDApIHsKCQlk ZXZfZXJyKGRldiwgIkZhaWxlZCB0byBlbmFibGUgc3VwcGxpZXM6ICVkXG4iLCByZXQpOwoJCXJl dHVybiByZXQ7Cgl9CgoJcmVnY2FjaGVfY2FjaGVfb25seShjczQzMTMwLT5yZWdtYXAsIGZhbHNl KTsKCglncGlvZF9zZXRfdmFsdWVfY2Fuc2xlZXAoY3M0MzEzMC0+cmVzZXRfZ3BpbywgMSk7CgoJ dXNsZWVwX3JhbmdlKDIwMDAsIDIwNTApOwoKCXJldCA9IHJlZ2NhY2hlX3N5bmMoY3M0MzEzMC0+ cmVnbWFwKTsKCWlmIChyZXQgIT0gMCkgewoJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlc3Rv cmUgcmVnaXN0ZXIgY2FjaGVcbiIpOwoJCWdvdG8gZXJyOwoJfQoKCWlmIChjczQzMTMwLT54dGFs X2liaWFzICE9IENTNDMxMzBfWFRBTF9VTlVTRUQpCgkJcmVnbWFwX3VwZGF0ZV9iaXRzKGNzNDMx MzAtPnJlZ21hcCwgQ1M0MzEzMF9JTlRfTUFTS18xLAoJCQkJICAgQ1M0MzEzMF9YVEFMX0VSUl9J TlQsIDApOwoKCXJldHVybiAwOwplcnI6CglyZWdjYWNoZV9jYWNoZV9vbmx5KGNzNDMxMzAtPnJl Z21hcCwgdHJ1ZSk7CglyZWd1bGF0b3JfYnVsa19kaXNhYmxlKENTNDMxMzBfTlVNX1NVUFBMSUVT LCBjczQzMTMwLT5zdXBwbGllcyk7CgoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGNvbnN0IHN0cnVj dCBkZXZfcG1fb3BzIGNzNDMxMzBfcnVudGltZV9wbSA9IHsKCVNFVF9SVU5USU1FX1BNX09QUyhj czQzMTMwX3J1bnRpbWVfc3VzcGVuZCwgY3M0MzEzMF9ydW50aW1lX3Jlc3VtZSwKCQkJICAgTlVM TCkKfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNzNDMxMzBfb2ZfbWF0Y2hb XSA9IHsKCXsuY29tcGF0aWJsZSA9ICJjaXJydXMsY3M0MzEzMCIsfSwKCXsuY29tcGF0aWJsZSA9 ICJjaXJydXMsY3M0Mzk5Iix9LAoJey5jb21wYXRpYmxlID0gImNpcnJ1cyxjczQzMTMxIix9LAoJ ey5jb21wYXRpYmxlID0gImNpcnJ1cyxjczQzMTk4Iix9LAoJe30sCn07CgpNT0RVTEVfREVWSUNF X1RBQkxFKG9mLCBjczQzMTMwX29mX21hdGNoKTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2Rl dmljZV9pZCBjczQzMTMwX2kyY19pZFtdID0gewoJeyJjczQzMTMwIiwgMH0sCgl7ImNzNDM5OSIs IDB9LAoJeyJjczQzMTMxIiwgMH0sCgl7ImNzNDMxOTgiLCAwfSwKCXt9Cn07CgpNT0RVTEVfREVW SUNFX1RBQkxFKGkyYywgY3M0MzEzMF9pMmNfaWQpOwoKc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVy IGNzNDMxMzBfaTJjX2RyaXZlciA9IHsKCS5kcml2ZXIgPSB7CgkJLm5hbWUJCT0gImNzNDMxMzAi LAoJCS5vZl9tYXRjaF90YWJsZQk9IGNzNDMxMzBfb2ZfbWF0Y2gsCgkJLnBtICAgICAgICAgICAg ID0gJmNzNDMxMzBfcnVudGltZV9wbSwKCX0sCgkuaWRfdGFibGUJPSBjczQzMTMwX2kyY19pZCwK CS5wcm9iZQkJPSBjczQzMTMwX2kyY19wcm9iZSwKCS5yZW1vdmUJCT0gY3M0MzEzMF9pMmNfcmVt b3ZlLAp9OwoKbW9kdWxlX2kyY19kcml2ZXIoY3M0MzEzMF9pMmNfZHJpdmVyKTsKCk1PRFVMRV9B VVRIT1IoIkxpIFh1IDxsaS54dUBjaXJydXMuY29tPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIkNp cnJ1cyBMb2dpYyBDUzQzMTMwIEFMU0EgU29DIENvZGVjIERyaXZlciIpOwpNT0RVTEVfTElDRU5T RSgiR1BMIik7Cg== --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=mac80211.h Content-Transfer-Encoding: base64 LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqLwovKgogKiBtYWM4MDIx MSA8LT4gZHJpdmVyIGludGVyZmFjZQogKgogKiBDb3B5cmlnaHQgMjAwMi0yMDA1LCBEZXZpY2Vz Y2FwZSBTb2Z0d2FyZSwgSW5jLgogKiBDb3B5cmlnaHQgMjAwNi0yMDA3CUppcmkgQmVuYyA8amJl bmNAc3VzZS5jej4KICogQ29weXJpZ2h0IDIwMDctMjAxMAlKb2hhbm5lcyBCZXJnIDxqb2hhbm5l c0BzaXBzb2x1dGlvbnMubmV0PgogKiBDb3B5cmlnaHQgMjAxMy0yMDE0ICBJbnRlbCBNb2JpbGUg Q29tbXVuaWNhdGlvbnMgR21iSAogKiBDb3B5cmlnaHQgKEMpIDIwMTUgLSAyMDE3IEludGVsIERl dXRzY2hsYW5kIEdtYkgKICogQ29weXJpZ2h0IChDKSAyMDE4IC0gMjAxOSBJbnRlbCBDb3Jwb3Jh dGlvbgogKi8KCiNpZm5kZWYgTUFDODAyMTFfSAojZGVmaW5lIE1BQzgwMjExX0gKCiNpbmNsdWRl IDxsaW51eC9idWcuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgv aWZfZXRoZXIuaD4KI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgojaW5jbHVkZSA8bGludXgvaWVl ZTgwMjExLmg+CiNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KI2luY2x1ZGUgPG5ldC9jb2RlbC5o PgojaW5jbHVkZSA8bmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oPgojaW5jbHVkZSA8YXNtL3VuYWxp Z25lZC5oPgoKLyoqCiAqIERPQzogSW50cm9kdWN0aW9uCiAqCiAqIG1hYzgwMjExIGlzIHRoZSBM aW51eCBzdGFjayBmb3IgODAyLjExIGhhcmR3YXJlIHRoYXQgaW1wbGVtZW50cwogKiBvbmx5IHBh cnRpYWwgZnVuY3Rpb25hbGl0eSBpbiBoYXJkLSBvciBmaXJtd2FyZS4gVGhpcyBkb2N1bWVudAog KiBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBtYWM4MDIxMSBhbmQgbG93LWxldmVsIGhh cmR3YXJlCiAqIGRyaXZlcnMuCiAqLwoKLyoqCiAqIERPQzogQ2FsbGluZyBtYWM4MDIxMSBmcm9t IGludGVycnVwdHMKICoKICogT25seSBpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUoKSBhbmQg aWVlZTgwMjExX3J4X2lycXNhZmUoKSBjYW4gYmUKICogY2FsbGVkIGluIGhhcmR3YXJlIGludGVy cnVwdCBjb250ZXh0LiBUaGUgbG93LWxldmVsIGRyaXZlciBtdXN0IG5vdCBjYWxsIGFueQogKiBv dGhlciBmdW5jdGlvbnMgaW4gaGFyZHdhcmUgaW50ZXJydXB0IGNvbnRleHQuIElmIHRoZXJlIGlz IGEgbmVlZCBmb3Igc3VjaAogKiBjYWxsLCB0aGUgbG93LWxldmVsIGRyaXZlciBzaG91bGQgZmly c3QgQUNLIHRoZSBpbnRlcnJ1cHQgYW5kIHBlcmZvcm0gdGhlCiAqIElFRUUgODAyLjExIGNvZGUg Y2FsbCBhZnRlciB0aGlzLCBlLmcuIGZyb20gYSBzY2hlZHVsZWQgd29ya3F1ZXVlIG9yIGV2ZW4K ICogdGFza2xldCBmdW5jdGlvbi4KICoKICogTk9URTogSWYgdGhlIGRyaXZlciBvcHRzIHRvIHVz ZSB0aGUgX2lycXNhZmUoKSBmdW5jdGlvbnMsIGl0IG1heSBub3QgYWxzbwogKgkgdXNlIHRoZSBu b24tSVJRLXNhZmUgZnVuY3Rpb25zIQogKi8KCi8qKgogKiBET0M6IFdhcm5pbmcKICoKICogSWYg eW91J3JlIHJlYWRpbmcgdGhpcyBkb2N1bWVudCBhbmQgbm90IHRoZSBoZWFkZXIgZmlsZSBpdHNl bGYsIGl0IHdpbGwKICogYmUgaW5jb21wbGV0ZSBiZWNhdXNlIG5vdCBhbGwgZG9jdW1lbnRhdGlv biBoYXMgYmVlbiBjb252ZXJ0ZWQgeWV0LgogKi8KCi8qKgogKiBET0M6IEZyYW1lIGZvcm1hdAog KgogKiBBcyBhIGdlbmVyYWwgcnVsZSwgd2hlbiBmcmFtZXMgYXJlIHBhc3NlZCBiZXR3ZWVuIG1h YzgwMjExIGFuZCB0aGUgZHJpdmVyLAogKiB0aGV5IHN0YXJ0IHdpdGggdGhlIElFRUUgODAyLjEx IGhlYWRlciBhbmQgaW5jbHVkZSB0aGUgc2FtZSBvY3RldHMgdGhhdCBhcmUKICogc2VudCBvdmVy IHRoZSBhaXIgZXhjZXB0IGZvciB0aGUgRkNTIHdoaWNoIHNob3VsZCBiZSBjYWxjdWxhdGVkIGJ5 IHRoZQogKiBoYXJkd2FyZS4KICoKICogVGhlcmUgYXJlLCBob3dldmVyLCB2YXJpb3VzIGV4Y2Vw dGlvbnMgdG8gdGhpcyBydWxlIGZvciBhZHZhbmNlZCBmZWF0dXJlczoKICoKICogVGhlIGZpcnN0 IGV4Y2VwdGlvbiBpcyBmb3IgaGFyZHdhcmUgZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBvZmZs b2FkCiAqIHdoZXJlIHRoZSBJVi9JQ1YgbWF5IG9yIG1heSBub3QgYmUgZ2VuZXJhdGVkIGluIGhh cmR3YXJlLgogKgogKiBTZWNvbmRseSwgd2hlbiB0aGUgaGFyZHdhcmUgaGFuZGxlcyBmcmFnbWVu dGF0aW9uLCB0aGUgZnJhbWUgaGFuZGVkIHRvCiAqIHRoZSBkcml2ZXIgZnJvbSBtYWM4MDIxMSBp cyB0aGUgTVNEVSwgbm90IHRoZSBNUERVLgogKi8KCi8qKgogKiBET0M6IG1hYzgwMjExIHdvcmtx dWV1ZQogKgogKiBtYWM4MDIxMSBwcm92aWRlcyBpdHMgb3duIHdvcmtxdWV1ZSBmb3IgZHJpdmVy cyBhbmQgaW50ZXJuYWwgbWFjODAyMTEgdXNlLgogKiBUaGUgd29ya3F1ZXVlIGlzIGEgc2luZ2xl IHRocmVhZGVkIHdvcmtxdWV1ZSBhbmQgY2FuIG9ubHkgYmUgYWNjZXNzZWQgYnkKICogaGVscGVy cyBmb3Igc2FuaXR5IGNoZWNraW5nLiBEcml2ZXJzIG11c3QgZW5zdXJlIGFsbCB3b3JrIGFkZGVk IG9udG8gdGhlCiAqIG1hYzgwMjExIHdvcmtxdWV1ZSBzaG91bGQgYmUgY2FuY2VsbGVkIG9uIHRo ZSBkcml2ZXIgc3RvcCgpIGNhbGxiYWNrLgogKgogKiBtYWM4MDIxMSB3aWxsIGZsdXNoZWQgdGhl IHdvcmtxdWV1ZSB1cG9uIGludGVyZmFjZSByZW1vdmFsIGFuZCBkdXJpbmcKICogc3VzcGVuZC4K ICoKICogQWxsIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSBtYWM4MDIxMSB3b3JrcXVldWUgbXVzdCBu b3QgYWNxdWlyZSB0aGUgUlROTCBsb2NrLgogKgogKi8KCi8qKgogKiBET0M6IG1hYzgwMjExIHNv ZnR3YXJlIHR4IHF1ZXVlaW5nCiAqCiAqIG1hYzgwMjExIHByb3ZpZGVzIGFuIG9wdGlvbmFsIGlu dGVybWVkaWF0ZSBxdWV1ZWluZyBpbXBsZW1lbnRhdGlvbiBkZXNpZ25lZAogKiB0byBhbGxvdyB0 aGUgZHJpdmVyIHRvIGtlZXAgaGFyZHdhcmUgcXVldWVzIHNob3J0IGFuZCBwcm92aWRlIHNvbWUg ZmFpcm5lc3MKICogYmV0d2VlbiBkaWZmZXJlbnQgc3RhdGlvbnMvaW50ZXJmYWNlcy4KICogSW4g dGhpcyBtb2RlbCwgdGhlIGRyaXZlciBwdWxscyBkYXRhIGZyYW1lcyBmcm9tIHRoZSBtYWM4MDIx MSBxdWV1ZSBpbnN0ZWFkCiAqIG9mIGxldHRpbmcgbWFjODAyMTEgcHVzaCB0aGVtIHZpYSBkcnZf dHgoKS4KICogT3RoZXIgZnJhbWVzIChlLmcuIGNvbnRyb2wgb3IgbWFuYWdlbWVudCkgYXJlIHN0 aWxsIHB1c2hlZCB1c2luZyBkcnZfdHgoKS4KICoKICogRHJpdmVycyBpbmRpY2F0ZSB0aGF0IHRo ZXkgdXNlIHRoaXMgbW9kZWwgYnkgaW1wbGVtZW50aW5nIHRoZSAud2FrZV90eF9xdWV1ZQogKiBk cml2ZXIgb3BlcmF0aW9uLgogKgogKiBJbnRlcm1lZGlhdGUgcXVldWVzIChzdHJ1Y3QgaWVlZTgw MjExX3R4cSkgYXJlIGtlcHQgcGVyLXN0YSBwZXItdGlkLCB3aXRoCiAqIGFub3RoZXIgcGVyLXN0 YSBmb3Igbm9uLWRhdGEvbm9uLW1nbXQgYW5kIGJ1ZmZlcmFibGUgbWFuYWdlbWVudCBmcmFtZXMs IGFuZAogKiBhIHNpbmdsZSBwZXItdmlmIHF1ZXVlIGZvciBtdWx0aWNhc3QgZGF0YSBmcmFtZXMu CiAqCiAqIFRoZSBkcml2ZXIgaXMgZXhwZWN0ZWQgdG8gaW5pdGlhbGl6ZSBpdHMgcHJpdmF0ZSBw ZXItcXVldWUgZGF0YSBmb3Igc3RhdGlvbnMKICogYW5kIGludGVyZmFjZXMgaW4gdGhlIC5hZGRf aW50ZXJmYWNlIGFuZCAuc3RhX2FkZCBvcHMuCiAqCiAqIFRoZSBkcml2ZXIgY2FuJ3QgYWNjZXNz IHRoZSBxdWV1ZSBkaXJlY3RseS4gVG8gZGVxdWV1ZSBhIGZyYW1lIGZyb20gYQogKiB0eHEsIGl0 IGNhbGxzIGllZWU4MDIxMV90eF9kZXF1ZXVlKCkuIFdoZW5ldmVyIG1hYzgwMjExIGFkZHMgYSBu ZXcgZnJhbWUgdG8gYQogKiBxdWV1ZSwgaXQgY2FsbHMgdGhlIC53YWtlX3R4X3F1ZXVlIGRyaXZl ciBvcC4KICoKICogRHJpdmVycyBjYW4gb3B0aW9uYWxseSBkZWxlZ2F0ZSByZXNwb25zaWJpbGl0 eSBmb3Igc2NoZWR1bGluZyBxdWV1ZXMgdG8KICogbWFjODAyMTEsIHRvIHRha2UgYWR2YW50YWdl IG9mIGFpcnRpbWUgZmFpcm5lc3MgYWNjb3VudGluZy4gSW4gdGhpcyBjYXNlLCB0bwogKiBvYnRh aW4gdGhlIG5leHQgcXVldWUgdG8gcHVsbCBmcmFtZXMgZnJvbSwgdGhlIGRyaXZlciBjYWxscwog KiBpZWVlODAyMTFfbmV4dF90eHEoKS4gVGhlIGRyaXZlciBpcyB0aGVuIGV4cGVjdGVkIHRvIHJl dHVybiB0aGUgdHhxIHVzaW5nCiAqIGllZWU4MDIxMV9yZXR1cm5fdHhxKCkuCiAqCiAqIEZvciBB UCBwb3dlcnNhdmUgVElNIGhhbmRsaW5nLCB0aGUgZHJpdmVyIG9ubHkgbmVlZHMgdG8gaW5kaWNh dGUgaWYgaXQgaGFzCiAqIGJ1ZmZlcmVkIHBhY2tldHMgaW4gdGhlIGRyaXZlciBzcGVjaWZpYyBk YXRhIHN0cnVjdHVyZXMgYnkgY2FsbGluZwogKiBpZWVlODAyMTFfc3RhX3NldF9idWZmZXJlZCgp LiBGb3IgZnJhbWVzIGJ1ZmZlcmVkIGluIHRoZSBpZWVlODAyMTFfdHhxCiAqIHN0cnVjdCwgbWFj ODAyMTEgc2V0cyB0aGUgYXBwcm9wcmlhdGUgVElNIFBWQiBiaXRzIGFuZCBjYWxscwogKiAucmVs ZWFzZV9idWZmZXJlZF9mcmFtZXMoKS4KICogSW4gdGhhdCBjYWxsYmFjayB0aGUgZHJpdmVyIGlz IHRoZXJlZm9yZSBleHBlY3RlZCB0byByZWxlYXNlIGl0cyBvd24KICogYnVmZmVyZWQgZnJhbWVz IGFuZCBhZnRlcndhcmRzIGFsc28gZnJhbWVzIGZyb20gdGhlIGllZWU4MDIxMV90eHEgKG9idGFp bmVkCiAqIHZpYSB0aGUgdXN1YWwgaWVlZTgwMjExX3R4X2RlcXVldWUpLgogKi8KCnN0cnVjdCBk ZXZpY2U7CgovKioKICogZW51bSBpZWVlODAyMTFfbWF4X3F1ZXVlcyAtIG1heGltdW0gbnVtYmVy IG9mIHF1ZXVlcwogKgogKiBASUVFRTgwMjExX01BWF9RVUVVRVM6IE1heGltdW0gbnVtYmVyIG9m IHJlZ3VsYXIgZGV2aWNlIHF1ZXVlcy4KICogQElFRUU4MDIxMV9NQVhfUVVFVUVfTUFQOiBiaXRt YXAgd2l0aCBtYXhpbXVtIHF1ZXVlcyBzZXQKICovCmVudW0gaWVlZTgwMjExX21heF9xdWV1ZXMg ewoJSUVFRTgwMjExX01BWF9RVUVVRVMgPQkJMTYsCglJRUVFODAyMTFfTUFYX1FVRVVFX01BUCA9 CUJJVChJRUVFODAyMTFfTUFYX1FVRVVFUykgLSAxLAp9OwoKI2RlZmluZSBJRUVFODAyMTFfSU5W QUxfSFdfUVVFVUUJMHhmZgoKLyoqCiAqIGVudW0gaWVlZTgwMjExX2FjX251bWJlcnMgLSBBQyBu dW1iZXJzIGFzIHVzZWQgaW4gbWFjODAyMTEKICogQElFRUU4MDIxMV9BQ19WTzogdm9pY2UKICog QElFRUU4MDIxMV9BQ19WSTogdmlkZW8KICogQElFRUU4MDIxMV9BQ19CRTogYmVzdCBlZmZvcnQK ICogQElFRUU4MDIxMV9BQ19CSzogYmFja2dyb3VuZAogKi8KZW51bSBpZWVlODAyMTFfYWNfbnVt YmVycyB7CglJRUVFODAyMTFfQUNfVk8JCT0gMCwKCUlFRUU4MDIxMV9BQ19WSQkJPSAxLAoJSUVF RTgwMjExX0FDX0JFCQk9IDIsCglJRUVFODAyMTFfQUNfQksJCT0gMywKfTsKCi8qKgogKiBzdHJ1 Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyAtIHRyYW5zbWl0IHF1ZXVlIGNvbmZpZ3VyYXRp b24KICoKICogVGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGluIHRoaXMgc3RydWN0dXJlIGlzIHJl cXVpcmVkIGZvciBRb1MKICogdHJhbnNtaXQgcXVldWUgY29uZmlndXJhdGlvbi4gQ2YuIElFRUUg ODAyLjExIDcuMy4yLjI5LgogKgogKiBAYWlmczogYXJiaXRyYXRpb24gaW50ZXJmcmFtZSBzcGFj ZSBbMC4uMjU1XQogKiBAY3dfbWluOiBtaW5pbXVtIGNvbnRlbnRpb24gd2luZG93IFthIHZhbHVl IG9mIHRoZSBmb3JtCiAqCTJebi0xIGluIHRoZSByYW5nZSAxLi4zMjc2N10KICogQGN3X21heDog bWF4aW11bSBjb250ZW50aW9uIHdpbmRvdyBbbGlrZSBAY3dfbWluXQogKiBAdHhvcDogbWF4aW11 bSBidXJzdCB0aW1lIGluIHVuaXRzIG9mIDMyIHVzZWNzLCAwIG1lYW5pbmcgZGlzYWJsZWQKICog QGFjbTogaXMgbWFuZGF0b3J5IGFkbWlzc2lvbiBjb250cm9sIHJlcXVpcmVkIGZvciB0aGUgYWNj ZXNzIGNhdGVnb3J5CiAqIEB1YXBzZDogaXMgVS1BUFNEIG1vZGUgZW5hYmxlZCBmb3IgdGhlIHF1 ZXVlCiAqIEBtdV9lZGNhOiBpcyB0aGUgTVUgRURDQSBjb25maWd1cmVkCiAqIEBtdV9lZGNhX3Bh cmFtX3JlYzogTVUgRURDQSBQYXJhbWV0ZXIgUmVjb3JkIGZvciBIRQogKi8Kc3RydWN0IGllZWU4 MDIxMV90eF9xdWV1ZV9wYXJhbXMgewoJdTE2IHR4b3A7Cgl1MTYgY3dfbWluOwoJdTE2IGN3X21h eDsKCXU4IGFpZnM7Cglib29sIGFjbTsKCWJvb2wgdWFwc2Q7Cglib29sIG11X2VkY2E7CglzdHJ1 Y3QgaWVlZTgwMjExX2hlX211X2VkY2FfcGFyYW1fYWNfcmVjIG11X2VkY2FfcGFyYW1fcmVjOwp9 OwoKc3RydWN0IGllZWU4MDIxMV9sb3dfbGV2ZWxfc3RhdHMgewoJdW5zaWduZWQgaW50IGRvdDEx QUNLRmFpbHVyZUNvdW50OwoJdW5zaWduZWQgaW50IGRvdDExUlRTRmFpbHVyZUNvdW50OwoJdW5z aWduZWQgaW50IGRvdDExRkNTRXJyb3JDb3VudDsKCXVuc2lnbmVkIGludCBkb3QxMVJUU1N1Y2Nl c3NDb3VudDsKfTsKCi8qKgogKiBlbnVtIGllZWU4MDIxMV9jaGFuY3R4X2NoYW5nZSAtIGNoYW5n ZSBmbGFnIGZvciBjaGFubmVsIGNvbnRleHQKICogQElFRUU4MDIxMV9DSEFOQ1RYX0NIQU5HRV9X SURUSDogVGhlIGNoYW5uZWwgd2lkdGggY2hhbmdlZAogKiBASUVFRTgwMjExX0NIQU5DVFhfQ0hB TkdFX1JYX0NIQUlOUzogVGhlIG51bWJlciBvZiBSWCBjaGFpbnMgY2hhbmdlZAogKiBASUVFRTgw MjExX0NIQU5DVFhfQ0hBTkdFX1JBREFSOiByYWRhciBkZXRlY3Rpb24gZmxhZyBjaGFuZ2VkCiAq IEBJRUVFODAyMTFfQ0hBTkNUWF9DSEFOR0VfQ0hBTk5FTDogc3dpdGNoZWQgdG8gYW5vdGhlciBv cGVyYXRpbmcgY2hhbm5lbCwKICoJdGhpcyBpcyB1c2VkIG9ubHkgd2l0aCBjaGFubmVsIHN3aXRj aGluZyB3aXRoIENTQQogKiBASUVFRTgwMjExX0NIQU5DVFhfQ0hBTkdFX01JTl9XSURUSDogVGhl IG1pbiByZXF1aXJlZCBjaGFubmVsIHdpZHRoIGNoYW5nZWQKICovCmVudW0gaWVlZTgwMjExX2No YW5jdHhfY2hhbmdlIHsKCUlFRUU4MDIxMV9DSEFOQ1RYX0NIQU5HRV9XSURUSAkJPSBCSVQoMCks CglJRUVFODAyMTFfQ0hBTkNUWF9DSEFOR0VfUlhfQ0hBSU5TCT0gQklUKDEpLAoJSUVFRTgwMjEx X0NIQU5DVFhfQ0hBTkdFX1JBREFSCQk9IEJJVCgyKSwKCUlFRUU4MDIxMV9DSEFOQ1RYX0NIQU5H RV9DSEFOTkVMCT0gQklUKDMpLAoJSUVFRTgwMjExX0NIQU5DVFhfQ0hBTkdFX01JTl9XSURUSAk9 IEJJVCg0KSwKfTsKCi8qKgogKiBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHhfY29uZiAtIGNoYW5u ZWwgY29udGV4dCB0aGF0IHZpZnMgbWF5IGJlIHR1bmVkIHRvCiAqCiAqIFRoaXMgaXMgdGhlIGRy aXZlci12aXNpYmxlIHBhcnQuIFRoZSBpZWVlODAyMTFfY2hhbmN0eAogKiB0aGF0IGNvbnRhaW5z IGl0IGlzIHZpc2libGUgaW4gbWFjODAyMTEgb25seS4KICoKICogQGRlZjogdGhlIGNoYW5uZWwg ZGVmaW5pdGlvbgogKiBAbWluX2RlZjogdGhlIG1pbmltdW0gY2hhbm5lbCBkZWZpbml0aW9uIGN1 cnJlbnRseSByZXF1aXJlZC4KICogQHJ4X2NoYWluc19zdGF0aWM6IFRoZSBudW1iZXIgb2YgUlgg Y2hhaW5zIHRoYXQgbXVzdCBhbHdheXMgYmUKICoJYWN0aXZlIG9uIHRoZSBjaGFubmVsIHRvIHJl Y2VpdmUgTUlNTyB0cmFuc21pc3Npb25zCiAqIEByeF9jaGFpbnNfZHluYW1pYzogVGhlIG51bWJl ciBvZiBSWCBjaGFpbnMgdGhhdCBtdXN0IGJlIGVuYWJsZWQKICoJYWZ0ZXIgUlRTL0NUUyBoYW5k c2hha2UgdG8gcmVjZWl2ZSBTTVBTIE1JTU8gdHJhbnNtaXNzaW9uczsKICoJdGhpcyB3aWxsIGFs d2F5cyBiZSA+PSBAcnhfY2hhaW5zX3N0YXRpYy4KICogQHJhZGFyX2VuYWJsZWQ6IHdoZXRoZXIg cmFkYXIgZGV0ZWN0aW9uIGlzIGVuYWJsZWQgb24gdGhpcyBjaGFubmVsLgogKiBAZHJ2X3ByaXY6 IGRhdGEgYXJlYSBmb3IgZHJpdmVyIHVzZSwgd2lsbCBhbHdheXMgYmUgYWxpZ25lZCB0bwogKglz aXplb2Yodm9pZCAqKSwgc2l6ZSBpcyBkZXRlcm1pbmVkIGluIGh3IGluZm9ybWF0aW9uLgogKi8K c3RydWN0IGllZWU4MDIxMV9jaGFuY3R4X2NvbmYgewoJc3RydWN0IGNmZzgwMjExX2NoYW5fZGVm IGRlZjsKCXN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiBtaW5fZGVmOwoKCXU4IHJ4X2NoYWluc19z dGF0aWMsIHJ4X2NoYWluc19keW5hbWljOwoKCWJvb2wgcmFkYXJfZW5hYmxlZDsKCgl1OCBkcnZf cHJpdlswXSBfX2FsaWduZWQoc2l6ZW9mKHZvaWQgKikpOwp9OwoKLyoqCiAqIGVudW0gaWVlZTgw MjExX2NoYW5jdHhfc3dpdGNoX21vZGUgLSBjaGFubmVsIGNvbnRleHQgc3dpdGNoIG1vZGUKICog QENIQU5DVFhfU1dNT0RFX1JFQVNTSUdOX1ZJRjogQm90aCBvbGQgYW5kIG5ldyBjb250ZXh0cyBh bHJlYWR5CiAqCWV4aXN0IChhbmQgd2lsbCBjb250aW51ZSB0byBleGlzdCksIGJ1dCB0aGUgdmly dHVhbCBpbnRlcmZhY2UKICoJbmVlZHMgdG8gYmUgc3dpdGNoZWQgZnJvbSBvbmUgdG8gdGhlIG90 aGVyLgogKiBAQ0hBTkNUWF9TV01PREVfU1dBUF9DT05URVhUUzogVGhlIG9sZCBjb250ZXh0IGV4 aXN0cyBidXQgd2lsbCBzdG9wCiAqICAgICAgdG8gZXhpc3Qgd2l0aCB0aGlzIGNhbGwsIHRoZSBu ZXcgY29udGV4dCBkb2Vzbid0IGV4aXN0IGJ1dAogKiAgICAgIHdpbGwgYmUgYWN0aXZlIGFmdGVy IHRoaXMgY2FsbCwgdGhlIHZpcnR1YWwgaW50ZXJmYWNlIHN3aXRjaGVzCiAqICAgICAgZnJvbSB0 aGUgb2xkIHRvIHRoZSBuZXcgKG5vdGUgdGhhdCB0aGUgZHJpdmVyIG1heSBvZiBjb3Vyc2UKICog ICAgICBpbXBsZW1lbnQgdGhpcyBhcyBhbiBvbi10aGUtZmx5IGNoYW5kZWYgc3dpdGNoIG9mIHRo ZSBleGlzdGluZwogKiAgICAgIGhhcmR3YXJlIGNvbnRleHQsIGJ1dCB0aGUgbWFjODAyMTEgcG9p bnRlciBmb3IgdGhlIG9sZCBjb250ZXh0CiAqICAgICAgd2lsbCBjZWFzZSB0byBleGlzdCBhbmQg b25seSB0aGUgbmV3IG9uZSB3aWxsIGxhdGVyIGJlIHVzZWQKICogICAgICBmb3IgY2hhbmdlcy9y ZW1vdmFsLikKICovCmVudW0gaWVlZTgwMjExX2NoYW5jdHhfc3dpdGNoX21vZGUgewoJQ0hBTkNU WF9TV01PREVfUkVBU1NJR05fVklGLAoJQ0hBTkNUWF9TV01PREVfU1dBUF9DT05URVhUUywKfTsK Ci8qKgogKiBzdHJ1Y3QgaWVlZTgwMjExX3ZpZl9jaGFuY3R4X3N3aXRjaCAtIHZpZiBjaGFuY3R4 IHN3aXRjaCBpbmZvcm1hdGlvbgogKgogKiBUaGlzIGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHBh c3MgaW5mb3JtYXRpb24gYWJvdXQgYSB2aWYgdGhhdAogKiBuZWVkcyB0byBzd2l0Y2ggZnJvbSBv bmUgY2hhbmN0eCB0byBhbm90aGVyLiAgVGhlCiAqICZpZWVlODAyMTFfY2hhbmN0eF9zd2l0Y2hf bW9kZSBkZWZpbmVzIGhvdyB0aGUgc3dpdGNoIHNob3VsZCBiZQogKiBkb25lLgogKgogKiBAdmlm OiB0aGUgdmlmIHRoYXQgc2hvdWxkIGJlIHN3aXRjaGVkIGZyb20gb2xkX2N0eCB0byBuZXdfY3R4 CiAqIEBvbGRfY3R4OiB0aGUgb2xkIGNvbnRleHQgdG8gd2hpY2ggdGhlIHZpZiB3YXMgYXNzaWdu ZWQKICogQG5ld19jdHg6IHRoZSBuZXcgY29udGV4dCB0byB3aGljaCB0aGUgdmlmIG11c3QgYmUg YXNzaWduZWQKICovCnN0cnVjdCBpZWVlODAyMTFfdmlmX2NoYW5jdHhfc3dpdGNoIHsKCXN0cnVj dCBpZWVlODAyMTFfdmlmICp2aWY7CglzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHhfY29uZiAqb2xk X2N0eDsKCXN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eF9jb25mICpuZXdfY3R4Owp9OwoKLyoqCiAq IGVudW0gaWVlZTgwMjExX2Jzc19jaGFuZ2UgLSBCU1MgY2hhbmdlIG5vdGlmaWNhdGlvbiBmbGFn cwogKgogKiBUaGVzZSBmbGFncyBhcmUgdXNlZCB3aXRoIHRoZSBic3NfaW5mb19jaGFuZ2VkKCkg Y2FsbGJhY2sKICogdG8gaW5kaWNhdGUgd2hpY2ggQlNTIHBhcmFtZXRlciBjaGFuZ2VkLgogKgog KiBAQlNTX0NIQU5HRURfQVNTT0M6IGFzc29jaWF0aW9uIHN0YXR1cyBjaGFuZ2VkIChhc3NvY2lh dGVkL2Rpc2Fzc29jaWF0ZWQpLAogKglhbHNvIGltcGxpZXMgYSBjaGFuZ2UgaW4gdGhlIEFJRC4K ICogQEJTU19DSEFOR0VEX0VSUF9DVFNfUFJPVDogQ1RTIHByb3RlY3Rpb24gY2hhbmdlZAogKiBA QlNTX0NIQU5HRURfRVJQX1BSRUFNQkxFOiBwcmVhbWJsZSBjaGFuZ2VkCiAqIEBCU1NfQ0hBTkdF RF9FUlBfU0xPVDogc2xvdCB0aW1pbmcgY2hhbmdlZAogKiBAQlNTX0NIQU5HRURfSFQ6IDgwMi4x MW4gcGFyYW1ldGVycyBjaGFuZ2VkCiAqIEBCU1NfQ0hBTkdFRF9CQVNJQ19SQVRFUzogQmFzaWMg cmF0ZXNldCBjaGFuZ2VkCiAqIEBCU1NfQ0hBTkdFRF9CRUFDT05fSU5UOiBCZWFjb24gaW50ZXJ2 YWwgY2hhbmdlZAogKiBAQlNTX0NIQU5HRURfQlNTSUQ6IEJTU0lEIGNoYW5nZWQsIGZvciB3aGF0 ZXZlcgogKglyZWFzb24gKElCU1MgYW5kIG1hbmFnZWQgbW9kZSkKICogQEJTU19DSEFOR0VEX0JF QUNPTjogQmVhY29uIGRhdGEgY2hhbmdlZCwgcmV0cmlldmUKICoJbmV3IGJlYWNvbiAoYmVhY29u aW5nIG1vZGVzKQogKiBAQlNTX0NIQU5HRURfQkVBQ09OX0VOQUJMRUQ6IEJlYWNvbmluZyBzaG91 bGQgYmUKICoJZW5hYmxlZC9kaXNhYmxlZCAoYmVhY29uaW5nIG1vZGVzKQogKiBAQlNTX0NIQU5H RURfQ1FNOiBDb25uZWN0aW9uIHF1YWxpdHkgbW9uaXRvciBjb25maWcgY2hhbmdlZAogKiBAQlNT X0NIQU5HRURfSUJTUzogSUJTUyBqb2luIHN0YXR1cyBjaGFuZ2VkCiAqIEBCU1NfQ0hBTkdFRF9B UlBfRklMVEVSOiBIYXJkd2FyZSBBUlAgZmlsdGVyIGFkZHJlc3MgbGlzdCBvciBzdGF0ZSBjaGFu Z2VkLgogKiBAQlNTX0NIQU5HRURfUU9TOiBRb1MgZm9yIHRoaXMgYXNzb2NpYXRpb24gd2FzIGVu YWJsZWQvZGlzYWJsZWQuIE5vdGUKICoJdGhhdCBpdCBpcyBvbmx5IGV2ZXIgZGlzYWJsZWQgZm9y IHN0YXRpb24gbW9kZS4KICogQEJTU19DSEFOR0VEX0lETEU6IElkbGUgY2hhbmdlZCBmb3IgdGhp cyBCU1MvaW50ZXJmYWNlLgogKiBAQlNTX0NIQU5HRURfU1NJRDogU1NJRCBjaGFuZ2VkIGZvciB0 aGlzIEJTUyAoQVAgYW5kIElCU1MgbW9kZSkKICogQEJTU19DSEFOR0VEX0FQX1BST0JFX1JFU1A6 IFByb2JlIFJlc3BvbnNlIGNoYW5nZWQgZm9yIHRoaXMgQlNTIChBUCBtb2RlKQogKiBAQlNTX0NI QU5HRURfUFM6IFBTIGNoYW5nZWQgZm9yIHRoaXMgQlNTIChTVEEgbW9kZSkKICogQEJTU19DSEFO R0VEX1RYUE9XRVI6IFRYIHBvd2VyIHNldHRpbmcgY2hhbmdlZCBmb3IgdGhpcyBpbnRlcmZhY2UK ICogQEJTU19DSEFOR0VEX1AyUF9QUzogUDJQIHBvd2Vyc2F2ZSBzZXR0aW5ncyAoQ1RXaW5kb3cs IG9wcG9ydHVuaXN0aWMgUFMpCiAqCWNoYW5nZWQKICogQEJTU19DSEFOR0VEX0JFQUNPTl9JTkZP OiBEYXRhIGZyb20gdGhlIEFQJ3MgYmVhY29uIGJlY2FtZSBhdmFpbGFibGU6CiAqCWN1cnJlbnRs eSBkdGltX3BlcmlvZCBvbmx5IGlzIHVuZGVyIGNvbnNpZGVyYXRpb24uCiAqIEBCU1NfQ0hBTkdF RF9CQU5EV0lEVEg6IFRoZSBiYW5kd2lkdGggdXNlZCBieSB0aGlzIGludGVyZmFjZSBjaGFuZ2Vk LAogKglub3RlIHRoYXQgdGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIGl0IGNoYW5nZXMgYWZ0ZXIg dGhlIGNoYW5uZWwKICoJY29udGV4dCBoYWQgYmVlbiBhc3NpZ25lZC4KICogQEJTU19DSEFOR0VE X09DQjogT0NCIGpvaW4gc3RhdHVzIGNoYW5nZWQKICogQEJTU19DSEFOR0VEX01VX0dST1VQUzog VkhUIE1VLU1JTU8gZ3JvdXAgaWQgb3IgdXNlciBwb3NpdGlvbiBjaGFuZ2VkCiAqIEBCU1NfQ0hB TkdFRF9LRUVQX0FMSVZFOiBrZWVwIGFsaXZlIG9wdGlvbnMgKGlkbGUgcGVyaW9kIG9yIHByb3Rl Y3RlZAogKglrZWVwIGFsaXZlKSBjaGFuZ2VkLgogKiBAQlNTX0NIQU5HRURfTUNBU1RfUkFURTog TXVsdGljYXN0IFJhdGUgc2V0dGluZyBjaGFuZ2VkIGZvciB0aGlzIGludGVyZmFjZQogKiBAQlNT X0NIQU5HRURfRlRNX1JFU1BPTkRFUjogZmluZSB0aW1pbmcgbWVhc3VyZW1lbnQgcmVxdWVzdCBy ZXNwb25kZXIKICoJZnVuY3Rpb25hbGl0eSBjaGFuZ2VkIGZvciB0aGlzIEJTUyAoQVAgbW9kZSku CiAqIEBCU1NfQ0hBTkdFRF9UV1Q6IFRXVCBzdGF0dXMgY2hhbmdlZAogKiBAQlNTX0NIQU5HRURf SEVfT0JTU19QRDogT0JTUyBQYWNrZXQgRGV0ZWN0aW9uIHN0YXR1cyBjaGFuZ2VkLgogKiBAQlNT X0NIQU5HRURfSEVfQlNTX0NPTE9SOiBCU1MgQ29sb3IgaGFzIGNoYW5nZWQKICoKICovCmVudW0g aWVlZTgwMjExX2Jzc19jaGFuZ2UgewoJQlNTX0NIQU5HRURfQVNTT0MJCT0gMTw8MCwKCUJTU19D SEFOR0VEX0VSUF9DVFNfUFJPVAk9IDE8PDEsCglCU1NfQ0hBTkdFRF9FUlBfUFJFQU1CTEUJPSAx PDwyLAoJQlNTX0NIQU5HRURfRVJQX1NMT1QJCT0gMTw8MywKCUJTU19DSEFOR0VEX0hUCQkJPSAx PDw0LAoJQlNTX0NIQU5HRURfQkFTSUNfUkFURVMJCT0gMTw8NSwKCUJTU19DSEFOR0VEX0JFQUNP Tl9JTlQJCT0gMTw8NiwKCUJTU19DSEFOR0VEX0JTU0lECQk9IDE8PDcsCglCU1NfQ0hBTkdFRF9C RUFDT04JCT0gMTw8OCwKCUJTU19DSEFOR0VEX0JFQUNPTl9FTkFCTEVECT0gMTw8OSwKCUJTU19D SEFOR0VEX0NRTQkJCT0gMTw8MTAsCglCU1NfQ0hBTkdFRF9JQlNTCQk9IDE8PDExLAoJQlNTX0NI QU5HRURfQVJQX0ZJTFRFUgkJPSAxPDwxMiwKCUJTU19DSEFOR0VEX1FPUwkJCT0gMTw8MTMsCglC U1NfQ0hBTkdFRF9JRExFCQk9IDE8PDE0LAoJQlNTX0NIQU5HRURfU1NJRAkJPSAxPDwxNSwKCUJT U19DSEFOR0VEX0FQX1BST0JFX1JFU1AJPSAxPDwxNiwKCUJTU19DSEFOR0VEX1BTCQkJPSAxPDwx NywKCUJTU19DSEFOR0VEX1RYUE9XRVIJCT0gMTw8MTgsCglCU1NfQ0hBTkdFRF9QMlBfUFMJCT0g MTw8MTksCglCU1NfQ0hBTkdFRF9CRUFDT05fSU5GTwkJPSAxPDwyMCwKCUJTU19DSEFOR0VEX0JB TkRXSURUSAkJPSAxPDwyMSwKCUJTU19DSEFOR0VEX09DQiAgICAgICAgICAgICAgICAgPSAxPDwy MiwKCUJTU19DSEFOR0VEX01VX0dST1VQUwkJPSAxPDwyMywKCUJTU19DSEFOR0VEX0tFRVBfQUxJ VkUJCT0gMTw8MjQsCglCU1NfQ0hBTkdFRF9NQ0FTVF9SQVRFCQk9IDE8PDI1LAoJQlNTX0NIQU5H RURfRlRNX1JFU1BPTkRFUgk9IDE8PDI2LAoJQlNTX0NIQU5HRURfVFdUCQkJPSAxPDwyNywKCUJT U19DSEFOR0VEX0hFX09CU1NfUEQJCT0gMTw8MjgsCglCU1NfQ0hBTkdFRF9IRV9CU1NfQ09MT1IJ PSAxPDwyOSwKCgkvKiB3aGVuIGFkZGluZyBoZXJlLCBtYWtlIHN1cmUgdG8gY2hhbmdlIGllZWU4 MDIxMV9yZWNvbmZpZyAqLwp9OwoKLyoKICogVGhlIG1heGltdW0gbnVtYmVyIG9mIElQdjQgYWRk cmVzc2VzIGxpc3RlZCBmb3IgQVJQIGZpbHRlcmluZy4gSWYgdGhlIG51bWJlcgogKiBvZiBhZGRy ZXNzZXMgZm9yIGFuIGludGVyZmFjZSBpbmNyZWFzZSBiZXlvbmQgdGhpcyB2YWx1ZSwgaGFyZHdh cmUgQVJQCiAqIGZpbHRlcmluZyB3aWxsIGJlIGRpc2FibGVkLgogKi8KI2RlZmluZSBJRUVFODAy MTFfQlNTX0FSUF9BRERSX0xJU1RfTEVOIDQKCi8qKgogKiBlbnVtIGllZWU4MDIxMV9ldmVudF90 eXBlIC0gZXZlbnQgdG8gYmUgbm90aWZpZWQgdG8gdGhlIGxvdyBsZXZlbCBkcml2ZXIKICogQFJT U0lfRVZFTlQ6IEFQJ3MgcnNzaSBjcm9zc2VkIHRoZSBhIHRocmVzaG9sZCBzZXQgYnkgdGhlIGRy aXZlci4KICogQE1MTUVfRVZFTlQ6IGV2ZW50IHJlbGF0ZWQgdG8gTUxNRQogKiBAQkFSX1JYX0VW RU5UOiBhIEJBUiB3YXMgcmVjZWl2ZWQKICogQEJBX0ZSQU1FX1RJTUVPVVQ6IEZyYW1lcyB3ZXJl IHJlbGVhc2VkIGZyb20gdGhlIHJlb3JkZXJpbmcgYnVmZmVyIGJlY2F1c2UKICoJdGhleSB0aW1l ZCBvdXQuIFRoaXMgd29uJ3QgYmUgY2FsbGVkIGZvciBlYWNoIGZyYW1lIHJlbGVhc2VkLCBidXQg b25seQogKglvbmNlIGVhY2ggdGltZSB0aGUgdGltZW91dCB0cmlnZ2Vycy4KICovCmVudW0gaWVl ZTgwMjExX2V2ZW50X3R5cGUgewoJUlNTSV9FVkVOVCwKCU1MTUVfRVZFTlQsCglCQVJfUlhfRVZF TlQsCglCQV9GUkFNRV9USU1FT1VULAp9OwoKLyoqCiAqIGVudW0gaWVlZTgwMjExX3Jzc2lfZXZl bnRfZGF0YSAtIHJlbGV2YW50IHdoZW4gZXZlbnQgdHlwZSBpcyAlUlNTSV9FVkVOVAogKiBAUlNT SV9FVkVOVF9ISUdIOiBBUCdzIHJzc2kgd2VudCBiZWxvdyB0aGUgdGhyZXNob2xkIHNldCBieSB0 aGUgZHJpdmVyLgogKiBAUlNTSV9FVkVOVF9MT1c6IEFQJ3MgcnNzaSB3ZW50IGFib3ZlIHRoZSB0 aHJlc2hvbGQgc2V0IGJ5IHRoZSBkcml2ZXIuCiAqLwplbnVtIGllZWU4MDIxMV9yc3NpX2V2ZW50 X2RhdGEgewoJUlNTSV9FVkVOVF9ISUdILAoJUlNTSV9FVkVOVF9MT1csCn07CgovKioKICogc3Ry dWN0IGllZWU4MDIxMV9yc3NpX2V2ZW50IC0gZGF0YSBhdHRhY2hlZCB0byBhbiAlUlNTSV9FVkVO VAogKiBAZGF0YTogU2VlICZlbnVtIGllZWU4MDIxMV9yc3NpX2V2ZW50X2RhdGEKICovCnN0cnVj dCBpZWVlODAyMTFfcnNzaV9ldmVudCB7CgllbnVtIGllZWU4MDIxMV9yc3NpX2V2ZW50X2RhdGEg ZGF0YTsKfTsKCi8qKgogKiBlbnVtIGllZWU4MDIxMV9tbG1lX2V2ZW50X2RhdGEgLSByZWxldmFu dCB3aGVuIGV2ZW50IHR5cGUgaXMgJU1MTUVfRVZFTlQKICogQEFVVEhfRVZFTlQ6IHRoZSBNTE1F IG9wZXJhdGlvbiBpcyBhdXRoZW50aWNhdGlvbgogKiBAQVNTT0NfRVZFTlQ6IHRoZSBNTE1FIG9w ZXJhdGlvbiBpcyBhc3NvY2lhdGlvbgogKiBAREVBVVRIX1JYX0VWRU5UOiBkZWF1dGggcmVjZWl2 ZWQuLgogKiBAREVBVVRIX1RYX0VWRU5UOiBkZWF1dGggc2VudC4KICovCmVudW0gaWVlZTgwMjEx X21sbWVfZXZlbnRfZGF0YSB7CglBVVRIX0VWRU5ULAoJQVNTT0NfRVZFTlQsCglERUFVVEhfUlhf RVZFTlQsCglERUFVVEhfVFhfRVZFTlQsCn07CgovKioKICogZW51bSBpZWVlODAyMTFfbWxtZV9l dmVudF9zdGF0dXMgLSByZWxldmFudCB3aGVuIGV2ZW50IHR5cGUgaXMgJU1MTUVfRVZFTlQKICog QE1MTUVfU1VDQ0VTUzogdGhlIE1MTUUgb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHku CiAqIEBNTE1FX0RFTklFRDogdGhlIE1MTUUgb3BlcmF0aW9uIHdhcyBkZW5pZWQgYnkgdGhlIHBl ZXIuCiAqIEBNTE1FX1RJTUVPVVQ6IHRoZSBNTE1FIG9wZXJhdGlvbiB0aW1lZCBvdXQuCiAqLwpl bnVtIGllZWU4MDIxMV9tbG1lX2V2ZW50X3N0YXR1cyB7CglNTE1FX1NVQ0NFU1MsCglNTE1FX0RF TklFRCwKCU1MTUVfVElNRU9VVCwKfTsKCi8qKgogKiBzdHJ1Y3QgaWVlZTgwMjExX21sbWVfZXZl bnQgLSBkYXRhIGF0dGFjaGVkIHRvIGFuICVNTE1FX0VWRU5UCiAqIEBkYXRhOiBTZWUgJmVudW0g aWVlZTgwMjExX21sbWVfZXZlbnRfZGF0YQogKiBAc3RhdHVzOiBTZWUgJmVudW0gaWVlZTgwMjEx X21sbWVfZXZlbnRfc3RhdHVzCiAqIEByZWFzb246IHRoZSByZWFzb24gY29kZSBpZiBhcHBsaWNh YmxlCiAqLwpzdHJ1Y3QgaWVlZTgwMjExX21sbWVfZXZlbnQgewoJZW51bSBpZWVlODAyMTFfbWxt ZV9ldmVudF9kYXRhIGRhdGE7CgllbnVtIGllZWU4MDIxMV9tbG1lX2V2ZW50X3N0YXR1cyBzdGF0 dXM7Cgl1MTYgcmVhc29uOwp9OwoKLyoqCiAqIHN0cnVjdCBpZWVlODAyMTFfYmFfZXZlbnQgLSBk YXRhIGF0dGFjaGVkIGZvciBCbG9ja0FjayByZWxhdGVkIGV2ZW50cwogKiBAc3RhOiBwb2ludGVy IHRvIHRoZSAmaWVlZTgwMjExX3N0YSB0byB3aGljaCB0aGlzIGV2ZW50IHJlbGF0ZXMKICogQHRp ZDogdGhlIHRpZAogKiBAc3NuOiB0aGUgc3RhcnRpbmcgc2VxdWVuY2UgbnVtYmVyIChmb3IgJUJB Ul9SWF9FVkVOVCkKICovCnN0cnVjdCBpZWVlODAyMTFfYmFfZXZlbnQgewoJc3RydWN0IGllZWU4 MDIxMV9zdGEgKnN0YTsKCXUxNiB0aWQ7Cgl1MTYgc3NuOwp9OwoKLyoqCiAqIHN0cnVjdCBpZWVl ODAyMTFfZXZlbnQgLSBldmVudCB0byBiZSBzZW50IHRvIHRoZSBkcml2ZXIKICogQHR5cGU6IFRo ZSBldmVudCBpdHNlbGYuIFNlZSAmZW51bSBpZWVlODAyMTFfZXZlbnRfdHlwZS4KICogQHJzc2k6 IHJlbGV2YW50IGlmICZ0eXBlIGlzICVSU1NJX0VWRU5UCiAqIEBtbG1lOiByZWxldmFudCBpZiAm dHlwZSBpcyAlQVVUSF9FVkVOVAogKiBAYmE6IHJlbGV2YW50IGlmICZ0eXBlIGlzICVCQVJfUlhf RVZFTlQgb3IgJUJBX0ZSQU1FX1RJTUVPVVQKICogQHU6dW5pb24gaG9sZGluZyB0aGUgZmllbGRz IGFib3ZlCiAqLwpzdHJ1Y3QgaWVlZTgwMjExX2V2ZW50IHsKCWVudW0gaWVlZTgwMjExX2V2ZW50 X3R5cGUgdHlwZTsKCXVuaW9uIHsKCQlzdHJ1Y3QgaWVlZTgwMjExX3Jzc2lfZXZlbnQgcnNzaTsK CQlzdHJ1Y3QgaWVlZTgwMjExX21sbWVfZXZlbnQgbWxtZTsKCQlzdHJ1Y3QgaWVlZTgwMjExX2Jh X2V2ZW50IGJhOwoJfSB1Owp9OwoKLyoqCiAqIHN0cnVjdCBpZWVlODAyMTFfbXVfZ3JvdXBfZGF0 YSAtIFNUQSdzIFZIVCBNVS1NSU1PIGdyb3VwIGRhdGEKICoKICogVGhpcyBzdHJ1Y3R1cmUgZGVz Y3JpYmVzIHRoZSBncm91cCBpZCBkYXRhIG9mIFZIVCBNVS1NSU1PCiAqCiAqIEBtZW1iZXJzaGlw OiA2NCBiaXRzIGFycmF5IC0gYSBiaXQgaXMgc2V0IGlmIHN0YXRpb24gaXMgbWVtYmVyIG9mIHRo ZSBncm91cAogKiBAcG9zaXRpb246IDIgYml0cyBwZXIgZ3JvdXAgaWQgaW5kaWNhdGluZyB0aGUg cG9zaXRpb24gaW4gdGhlIGdyb3VwCiAqLwpzdHJ1Y3QgaWVlZTgwMjExX211X2dyb3VwX2RhdGEg ewoJdTggbWVtYmVyc2hpcFtXTEFOX01FTUJFUlNISVBfTEVOXTsKCXU4IHBvc2l0aW9uW1dMQU5f VVNFUl9QT1NJVElPTl9MRU5dOwp9OwoKLyoqCiAqIHN0cnVjdCBpZWVlODAyMTFfZnRtX3Jlc3Bv bmRlcl9wYXJhbXMgLSBGVE0gcmVzcG9uZGVyIHBhcmFtZXRlcnMKICoKICogQGxjaTogTENJIHN1 YmVsZW1lbnQgY29udGVudAogKiBAY2l2aWNsb2M6IENJVklDIGxvY2F0aW9uIHN1YmVsZW1lbnQg Y29udGVudAogKiBAbGNpX2xlbjogTENJIGRhdGEgbGVuZ3RoCiAqIEBjaXZpY2xvY19sZW46IENp dmljIGRhdGEgbGVuZ3RoCiAqLwpzdHJ1Y3QgaWVlZTgwMjExX2Z0bV9yZXNwb25kZXJfcGFyYW1z IHsKCWNvbnN0IHU4ICpsY2k7Cgljb25zdCB1OCAqY2l2aWNsb2M7CglzaXplX3QgbGNpX2xlbjsK CXNpemVfdCBjaXZpY2xvY19sZW47Cn07CgovKioKICogc3RydWN0IGllZWU4MDIxMV9ic3NfY29u ZiAtIGhvbGRzIHRoZSBCU1MncyBjaGFuZ2luZyBwYXJhbWV0ZXJzCiAqCiAqIFRoaXMgc3RydWN0 dXJlIGtlZXBzIGluZm9ybWF0aW9uIGFib3V0IGEgQlNTIChhbmQgYW4gYXNzb2NpYXRpb24KICog dG8gdGhhdCBCU1MpIHRoYXQgY2FuIGNoYW5nZSBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoZSBC U1MuCiAqCiAqIEBodGNfdHJpZ19iYXNlZF9wa3RfZXh0OiBkZWZhdWx0IFBFIGluIDR1cyB1bml0 cywgaWYgQlNTIHN1cHBvcnRzIEhFCiAqIEBtdWx0aV9zdGFfYmFja18zMmJpdDogc3VwcG9ydHMg QkEgYml0bWFwIG9mIDMyLWJpdHMgaW4gTXVsdGktU1RBIEJBQ0sKICogQHVvcmFfZXhpc3RzOiBp cyB0aGUgVU9SQSBlbGVtZW50IGFkdmVydGlzZWQgYnkgQVAKICogQGFja19lbmFibGVkOiBpbmRp Y2F0ZXMgc3VwcG9ydCB0byByZWNlaXZlIGEgbXVsdGktVElEIHRoYXQgc29saWNpdHMgZWl0aGVy CiAqCUFDSywgQkFDSyBvciBib3RoCiAqIEB1b3JhX29jd19yYW5nZTogVU9SQSBlbGVtZW50J3Mg T0NXIFJhbmdlIGZpZWxkCiAqIEBmcmFtZV90aW1lX3J0c190aDogSEUgZHVyYXRpb24gUlRTIHRo cmVzaG9sZCwgaW4gdW5pdHMgb2YgMzJ1cwogKiBAaGVfc3VwcG9ydDogZG9lcyB0aGlzIEJTUyBz dXBwb3J0IEhFCiAqIEB0d3RfcmVxdWVzdGVyOiBkb2VzIHRoaXMgQlNTIHN1cHBvcnQgVFdUIHJl cXVlc3RlciAocmVsZXZhbnQgZm9yIG1hbmFnZWQKICoJbW9kZSBvbmx5LCBzZXQgaWYgdGhlIEFQ IGFkdmVydGlzZXMgVFdUIHJlc3BvbmRlciByb2xlKQogKiBAdHd0X3Jlc3BvbmRlcjogZG9lcyB0 aGlzIEJTUyBzdXBwb3J0IFRXVCByZXF1ZXN0ZXIgKHJlbGV2YW50IGZvciBtYW5hZ2VkCiAqCW1v ZGUgb25seSwgc2V0IGlmIHRoZSBBUCBhZHZlcnRpc2VzIFRXVCByZXNwb25kZXIgcm9sZSkKICog QGFzc29jOiBhc3NvY2lhdGlvbiBzdGF0dXMKICogQGlic3Nfam9pbmVkOiBpbmRpY2F0ZXMgd2hl dGhlciB0aGlzIHN0YXRpb24gaXMgcGFydCBvZiBhbiBJQlNTCiAqCW9yIG5vdAogKiBAaWJzc19j cmVhdG9yOiBpbmRpY2F0ZXMgaWYgYSBuZXcgSUJTUyBuZXR3b3JrIGlzIGJlaW5nIGNyZWF0ZWQK ICogQGFpZDogYXNzb2NpYXRpb24gSUQgbnVtYmVyLCB2YWxpZCBvbmx5IHdoZW4gQGFzc29jIGlz IHRydWUKICogQHVzZV9jdHNfcHJvdDogdXNlIENUUyBwcm90ZWN0aW9uCiAqIEB1c2Vfc2hvcnRf cHJlYW1ibGU6IHVzZSA4MDIuMTFiIHNob3J0IHByZWFtYmxlCiAqIEB1c2Vfc2hvcnRfc2xvdDog dXNlIHNob3J0IHNsb3QgdGltZSAob25seSByZWxldmFudCBmb3IgRVJQKQogKiBAZHRpbV9wZXJp b2Q6IG51bSBvZiBiZWFjb25zIGJlZm9yZSB0aGUgbmV4dCBEVElNLCBmb3IgYmVhY29uaW5nLAog Kgl2YWxpZCBpbiBzdGF0aW9uIG1vZGUgb25seSBpZiBhZnRlciB0aGUgZHJpdmVyIHdhcyBub3Rp ZmllZAogKgl3aXRoIHRoZSAlQlNTX0NIQU5HRURfQkVBQ09OX0lORk8gZmxhZywgd2lsbCBiZSBu b24temVybyB0aGVuLgogKiBAc3luY190c2Y6IGxhc3QgYmVhY29uJ3MvcHJvYmUgcmVzcG9uc2Un cyBUU0YgdGltZXN0YW1wIChjb3VsZCBiZSBvbGQKICoJYXMgaXQgbWF5IGhhdmUgYmVlbiByZWNl aXZlZCBkdXJpbmcgc2Nhbm5pbmcgbG9uZyBhZ28pLiBJZiB0aGUKICoJSFcgZmxhZyAlSUVFRTgw MjExX0hXX1RJTUlOR19CRUFDT05fT05MWSBpcyBzZXQsIHRoZW4gdGhpcyBjYW4KICoJb25seSBj b21lIGZyb20gYSBiZWFjb24sIGJ1dCBtaWdodCBub3QgYmVjb21lIHZhbGlkIHVudGlsIGFmdGVy CiAqCWFzc29jaWF0aW9uIHdoZW4gYSBiZWFjb24gaXMgcmVjZWl2ZWQgKHdoaWNoIGlzIG5vdGlm aWVkIHdpdGggdGhlCiAqCSVCU1NfQ0hBTkdFRF9EVElNIGZsYWcuKS4gU2VlIGFsc28gc3luY19k dGltX2NvdW50IGltcG9ydGFudCBub3RpY2UuCiAqIEBzeW5jX2RldmljZV90czogdGhlIGRldmlj ZSB0aW1lc3RhbXAgY29ycmVzcG9uZGluZyB0byB0aGUgc3luY190c2YsCiAqCXRoZSBkcml2ZXIv ZGV2aWNlIGNhbiB1c2UgdGhpcyB0byBjYWxjdWxhdGUgc3luY2hyb25pc2F0aW9uCiAqCShzZWUg QHN5bmNfdHNmKS4gU2VlIGFsc28gc3luY19kdGltX2NvdW50IGltcG9ydGFudCBub3RpY2UuCiAq IEBzeW5jX2R0aW1fY291bnQ6IE9ubHkgdmFsaWQgd2hlbiAlSUVFRTgwMjExX0hXX1RJTUlOR19C RUFDT05fT05MWQogKglpcyByZXF1ZXN0ZWQsIHNlZSBAc3luY190c2YvQHN5bmNfZGV2aWNlX3Rz LgogKglJTVBPUlRBTlQ6IFRoZXNlIHRocmVlIHN5bmNfKiBwYXJhbWV0ZXJzIHdvdWxkIHBvc3Np Ymx5IGJlIG91dCBvZiBzeW5jCiAqCWJ5IHRoZSB0aW1lIHRoZSBkcml2ZXIgd2lsbCB1c2UgdGhl bS4gVGhlIHN5bmNocm9uaXplZCB2aWV3IGlzIGN1cnJlbnRseQogKglndWFyYW50ZWVkIG9ubHkg aW4gY2VydGFpbiBjYWxsYmFja3MuCiAqIEBiZWFjb25faW50OiBiZWFjb24gaW50ZXJ2YWwKICog QGFzc29jX2NhcGFiaWxpdHk6IGNhcGFiaWxpdGllcyB0YWtlbiBmcm9tIGFzc29jIHJlc3AKICog QGJhc2ljX3JhdGVzOiBiaXRtYXAgb2YgYmFzaWMgcmF0ZXMsIGVhY2ggYml0IHN0YW5kcyBmb3Ig YW4KICoJaW5kZXggaW50byB0aGUgcmF0ZSB0YWJsZSBjb25maWd1cmVkIGJ5IHRoZSBkcml2ZXIg aW4KICoJdGhlIGN1cnJlbnQgYmFuZC4KICogQGJlYWNvbl9yYXRlOiBhc3NvY2lhdGVkIEFQJ3Mg YmVhY29uIFRYIHJhdGUKICogQG1jYXN0X3JhdGU6IHBlci1iYW5kIG11bHRpY2FzdCByYXRlIGlu ZGV4ICsgMSAoMDogZGlzYWJsZWQpCiAqIEBic3NpZDogVGhlIEJTU0lEIGZvciB0aGlzIEJTUwog KiBAZW5hYmxlX2JlYWNvbjogd2hldGhlciBiZWFjb25pbmcgc2hvdWxkIGJlIGVuYWJsZWQgb3Ig bm90CiAqIEBjaGFuZGVmOiBDaGFubmVsIGRlZmluaXRpb24gZm9yIHRoaXMgQlNTIC0tIHRoZSBo YXJkd2FyZSBtaWdodCBiZQogKgljb25maWd1cmVkIGEgaGlnaGVyIGJhbmR3aWR0aCB0aGFuIHRo aXMgQlNTIHVzZXMsIGZvciBleGFtcGxlLgogKiBAbXVfZ3JvdXA6IFZIVCBNVS1NSU1PIGdyb3Vw IG1lbWJlcnNoaXAgZGF0YQogKiBAaHRfb3BlcmF0aW9uX21vZGU6IEhUIG9wZXJhdGlvbiBtb2Rl IGxpa2UgaW4gJnN0cnVjdCBpZWVlODAyMTFfaHRfb3BlcmF0aW9uLgogKglUaGlzIGZpZWxkIGlz IG9ubHkgdmFsaWQgd2hlbiB0aGUgY2hhbm5lbCBpcyBhIHdpZGUgSFQvVkhUIGNoYW5uZWwuCiAq CU5vdGUgdGhhdCB3aXRoIFRETFMgdGhpcyBjYW4gYmUgdGhlIGNhc2UgKGNoYW5uZWwgaXMgSFQs IHByb3RlY3Rpb24gbXVzdAogKgliZSB1c2VkIGZyb20gdGhpcyBmaWVsZCkgZXZlbiB3aGVuIHRo ZSBCU1MgYXNzb2NpYXRpb24gaXNuJ3QgdXNpbmcgSFQuCiAqIEBjcW1fcnNzaV90aG9sZDogQ29u bmVjdGlvbiBxdWFsaXR5IG1vbml0b3IgUlNTSSB0aHJlc2hvbGQsIGEgemVybyB2YWx1ZQogKglp bXBsaWVzIGRpc2FibGVkLiBBcyB3aXRoIHRoZSBjZmc4MDIxMSBjYWxsYmFjaywgYSBjaGFuZ2Ug aGVyZSBzaG91bGQKICoJY2F1c2UgYW4gZXZlbnQgdG8gYmUgc2VudCBpbmRpY2F0aW5nIHdoZXJl IHRoZSBjdXJyZW50IHZhbHVlIGlzIGluCiAqCXJlbGF0aW9uIHRvIHRoZSBuZXdseSBjb25maWd1 cmVkIHRocmVzaG9sZC4KICogQGNxbV9yc3NpX2xvdzogQ29ubmVjdGlvbiBxdWFsaXR5IG1vbml0 b3IgUlNTSSBsb3dlciB0aHJlc2hvbGQsIGEgemVybyB2YWx1ZQogKglpbXBsaWVzIGRpc2FibGVk LiAgVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSBtZWNoYW5pc20gdG8gdGhlIHNpbmdsZQogKgl0aHJl c2hvbGQgZXZlbnQgYW5kIGNhbid0IGJlIGVuYWJsZWQgc2ltdWx0YW5lb3VzbHkgd2l0aCBpdC4K ICogQGNxbV9yc3NpX2hpZ2g6IENvbm5lY3Rpb24gcXVhbGl0eSBtb25pdG9yIFJTU0kgdXBwZXIg dGhyZXNob2xkLgogKiBAY3FtX3Jzc2lfaHlzdDogQ29ubmVjdGlvbiBxdWFsaXR5IG1vbml0b3Ig UlNTSSBoeXN0ZXJlc2lzCiAqIEBhcnBfYWRkcl9saXN0OiBMaXN0IG9mIElQdjQgYWRkcmVzc2Vz IGZvciBoYXJkd2FyZSBBUlAgZmlsdGVyaW5nLiBUaGUKICoJbWF5IGZpbHRlciBBUlAgcXVlcmll cyB0YXJnZXRlZCBmb3Igb3RoZXIgYWRkcmVzc2VzIHRoYW4gbGlzdGVkIGhlcmUuCiAqCVRoZSBk cml2ZXIgbXVzdCBhbGxvdyBBUlAgcXVlcmllcyB0YXJnZXRlZCBmb3IgYWxsIGFkZHJlc3MgbGlz dGVkIGhlcmUKICoJdG8gcGFzcyB0aHJvdWdoLiBBbiBlbXB0eSBsaXN0IGltcGxpZXMgbm8gQVJQ IHF1ZXJpZXMgbmVlZCB0byBwYXNzLgogKiBAYXJwX2FkZHJfY250OiBOdW1iZXIgb2YgYWRkcmVz c2VzIGN1cnJlbnRseSBvbiB0aGUgbGlzdC4gTm90ZSB0aGF0IHRoaXMKICoJbWF5IGJlIGxhcmdl ciB0aGFuICVJRUVFODAyMTFfQlNTX0FSUF9BRERSX0xJU1RfTEVOICh0aGUgYXJwX2FkZHJfbGlz dAogKglhcnJheSBzaXplKSwgaXQncyB1cCB0byB0aGUgZHJpdmVyIHdoYXQgdG8gZG8gaW4gdGhh dCBjYXNlLgogKiBAcW9zOiBUaGlzIGlzIGEgUW9TLWVuYWJsZWQgQlNTLgogKiBAaWRsZTogVGhp cyBpbnRlcmZhY2UgaXMgaWRsZS4gVGhlcmUncyBhbHNvIGEgZ2xvYmFsIGlkbGUgZmxhZyBpbiB0 aGUKICoJaGFyZHdhcmUgY29uZmlnIHdoaWNoIG1heSBiZSBtb3JlIGFwcHJvcHJpYXRlIGRlcGVu ZGluZyBvbiB3aGF0CiAqCXlvdXIgZHJpdmVyL2RldmljZSBuZWVkcyB0byBkby4KICogQHBzOiBw b3dlci1zYXZlIG1vZGUgKFNUQSBvbmx5KS4gVGhpcyBmbGFnIGlzIE5PVCBhZmZlY3RlZCBieQog KglvZmZjaGFubmVsL2R5bmFtaWNfcHMgb3BlcmF0aW9ucy4KICogQHNzaWQ6IFRoZSBTU0lEIG9m IHRoZSBjdXJyZW50IHZpZi4gVmFsaWQgaW4gQVAgYW5kIElCU1MgbW9kZS4KICogQHNzaWRfbGVu OiBMZW5ndGggb2YgU1NJRCBnaXZlbiBpbiBAc3NpZC4KICogQGhpZGRlbl9zc2lkOiBUaGUgU1NJ RCBvZiB0aGUgY3VycmVudCB2aWYgaXMgaGlkZGVuLiBPbmx5IHZhbGlkIGluIEFQLW1vZGUuCiAq IEB0eHBvd2VyOiBUWCBwb3dlciBpbiBkQm0uICBJTlRfTUlOIG1lYW5zIG5vdCBjb25maWd1cmVk LgogKiBAdHhwb3dlcl90eXBlOiBUWCBwb3dlciBhZGp1c3RtZW50IHVzZWQgdG8gY29udHJvbCBw ZXIgcGFja2V0IFRyYW5zbWl0CiAqCVBvd2VyIENvbnRyb2wgKFRQQykgaW4gbG93ZXIgZHJpdmVy IGZvciB0aGUgY3VycmVudCB2aWYuIEluIHBhcnRpY3VsYXIKICoJVFBDIGlzIGVuYWJsZWQgaWYg dmFsdWUgcGFzc2VkIGluICV0eHBvd2VyX3R5cGUgaXMKICoJTkw4MDIxMV9UWF9QT1dFUl9MSU1J VEVEIChhbGxvdyB1c2luZyBsZXNzIHRoYW4gc3BlY2lmaWVkIGZyb20KICoJdXNlcnNwYWNlKSwg d2hlcmVhcyBUUEMgaXMgZGlzYWJsZWQgaWYgJXR4cG93ZXJfdHlwZSBpcyBzZXQgdG8KICoJTkw4 MDIxMV9UWF9QT1dFUl9GSVhFRCAodXNlIHZhbHVlIGNvbmZpZ3VyZWQgZnJvbSB1c2Vyc3BhY2Up CiAqIEBwMnBfbm9hX2F0dHI6IFAyUCBOb0EgYXR0cmlidXRlIGZvciBQMlAgcG93ZXJzYXZlCiAq IEBhbGxvd19wMnBfZ29fcHM6IGluZGljYXRpb24gZm9yIEFQIG9yIFAyUCBHTyBpbnRlcmZhY2Us IHdoZXRoZXIgaXQncyBhbGxvd2VkCiAqCXRvIHVzZSBQMlAgUFMgbWVjaGFuaXNtIG9yIG5vdC4g QVAvUDJQIEdPIGlzIG5vdCBhbGxvd2VkIHRvIHVzZSBQMlAgUFMKICoJaWYgaXQgaGFzIGFzc29j aWF0ZWQgY2xpZW50cyB3aXRob3V0IFAyUCBQUyBzdXBwb3J0LgogKiBAbWF4X2lkbGVfcGVyaW9k OiB0aGUgdGltZSBwZXJpb2QgZHVyaW5nIHdoaWNoIHRoZSBzdGF0aW9uIGNhbiByZWZyYWluIGZy b20KICoJdHJhbnNtaXR0aW5nIGZyYW1lcyB0byBpdHMgYXNzb2NpYXRlZCBBUCB3aXRob3V0IGJl aW5nIGRpc2Fzc29jaWF0ZWQuCiAqCUluIHVuaXRzIG9mIDEwMDAgVFVzLiBaZXJvIHZhbHVlIGlu ZGljYXRlcyB0aGF0IHRoZSBBUCBkaWQgbm90IGluY2x1ZGUKICoJYSAodmFsaWQpIEJTUyBNYXgg SWRsZSBQZXJpb2QgRWxlbWVudC4KICogQHByb3RlY3RlZF9rZWVwX2FsaXZlOiBpZiBzZXQsIGlu ZGljYXRlcyB0aGF0IHRoZSBzdGF0aW9uIHNob3VsZCBzZW5kIGFuIFJTTgogKglwcm90ZWN0ZWQg ZnJhbWUgdG8gdGhlIEFQIHRvIHJlc2V0IHRoZSBpZGxlIHRpbWVyIGF0IHRoZSBBUCBmb3IgdGhl CiAqCXN0YXRpb24uCiAqIEBmdG1fcmVzcG9uZGVyOiB3aGV0aGVyIHRvIGVuYWJsZSBvciBkaXNh YmxlIGZpbmUgdGltaW5nIG1lYXN1cmVtZW50IEZUTQogKglyZXNwb25kZXIgZnVuY3Rpb25hbGl0 eS4KICogQGZ0bXJfcGFyYW1zOiBjb25maWd1cmFibGUgbGNpL2NpdmljIHBhcmFtZXRlciB3aGVu IGVuYWJsaW5nIEZUTSByZXNwb25kZXIuCiAqIEBub250cmFuc21pdHRlZDogdGhpcyBCU1MgaXMg YSBub250cmFuc21pdHRlZCBCU1MgcHJvZmlsZQogKiBAdHJhbnNtaXR0ZXJfYnNzaWQ6IHRoZSBh ZGRyZXNzIG9mIHRyYW5zbWl0dGVyIEFQCiAqIEBic3NpZF9pbmRleDogaW5kZXggaW5zaWRlIHRo ZSBtdWx0aXBsZSBCU1NJRCBzZXQKICogQGJzc2lkX2luZGljYXRvcjogMl5ic3NpZF9pbmRpY2F0 b3IgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIEFQcyBpbiBzZXQKICogQGVtYV9hcDogQVAgc3Vw cG9ydHMgZW5oYW5jZW1lbnRzIG9mIGRpc2NvdmVyeSBhbmQgYWR2ZXJ0aXNlbWVudCBvZgogKglu b250cmFuc21pdHRlZCBCU1NJRHMKICogQHByb2ZpbGVfcGVyaW9kaWNpdHk6IHRoZSBsZWFzdCBu dW1iZXIgb2YgYmVhY29uIGZyYW1lcyBuZWVkIHRvIGJlIHJlY2VpdmVkCiAqCWluIG9yZGVyIHRv IGRpc2NvdmVyIGFsbCB0aGUgbm9udHJhbnNtaXR0ZWQgQlNTSURzIGluIHRoZSBzZXQuCiAqIEBo ZV9vcGVyYXRpb246IEhFIG9wZXJhdGlvbiBpbmZvcm1hdGlvbiBvZiB0aGUgQVAgd2UgYXJlIGNv bm5lY3RlZCB0bwogKiBAaGVfb2Jzc19wZDogT0JTUyBQYWNrZXQgRGV0ZWN0aW9uIHBhcmFtZXRl cnMuCiAqIEBoZV9ic3NfY29sb3I6IEJTUyBjb2xvcmluZyBzZXR0aW5ncywgaWYgQlNTIHN1cHBv cnRzIEhFCiAqLwpzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mIHsKCWNvbnN0IHU4ICpic3NpZDsK CXU4IGh0Y190cmlnX2Jhc2VkX3BrdF9leHQ7Cglib29sIG11bHRpX3N0YV9iYWNrXzMyYml0OwoJ Ym9vbCB1b3JhX2V4aXN0czsKCWJvb2wgYWNrX2VuYWJsZWQ7Cgl1OCB1b3JhX29jd19yYW5nZTsK CXUxNiBmcmFtZV90aW1lX3J0c190aDsKCWJvb2wgaGVfc3VwcG9ydDsKCWJvb2wgdHd0X3JlcXVl c3RlcjsKCWJvb2wgdHd0X3Jlc3BvbmRlcjsKCS8qIGFzc29jaWF0aW9uIHJlbGF0ZWQgZGF0YSAq LwoJYm9vbCBhc3NvYywgaWJzc19qb2luZWQ7Cglib29sIGlic3NfY3JlYXRvcjsKCXUxNiBhaWQ7 CgkvKiBlcnAgcmVsYXRlZCBkYXRhICovCglib29sIHVzZV9jdHNfcHJvdDsKCWJvb2wgdXNlX3No b3J0X3ByZWFtYmxlOwoJYm9vbCB1c2Vfc2hvcnRfc2xvdDsKCWJvb2wgZW5hYmxlX2JlYWNvbjsK CXU4IGR0aW1fcGVyaW9kOwoJdTE2IGJlYWNvbl9pbnQ7Cgl1MTYgYXNzb2NfY2FwYWJpbGl0eTsK CXU2NCBzeW5jX3RzZjsKCXUzMiBzeW5jX2RldmljZV90czsKCXU4IHN5bmNfZHRpbV9jb3VudDsK CXUzMiBiYXNpY19yYXRlczsKCXN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqYmVhY29uX3JhdGU7Cglp bnQgbWNhc3RfcmF0ZVtOVU1fTkw4MDIxMV9CQU5EU107Cgl1MTYgaHRfb3BlcmF0aW9uX21vZGU7 CglzMzIgY3FtX3Jzc2lfdGhvbGQ7Cgl1MzIgY3FtX3Jzc2lfaHlzdDsKCXMzMiBjcW1fcnNzaV9s b3c7CglzMzIgY3FtX3Jzc2lfaGlnaDsKCXN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiBjaGFuZGVm OwoJc3RydWN0IGllZWU4MDIxMV9tdV9ncm91cF9kYXRhIG11X2dyb3VwOwoJX19iZTMyIGFycF9h ZGRyX2xpc3RbSUVFRTgwMjExX0JTU19BUlBfQUREUl9MSVNUX0xFTl07CglpbnQgYXJwX2FkZHJf Y250OwoJYm9vbCBxb3M7Cglib29sIGlkbGU7Cglib29sIHBzOwoJdTggc3NpZFtJRUVFODAyMTFf TUFYX1NTSURfTEVOXTsKCXNpemVfdCBzc2lkX2xlbjsKCWJvb2wgaGlkZGVuX3NzaWQ7CglpbnQg dHhwb3dlcjsKCWVudW0gbmw4MDIxMV90eF9wb3dlcl9zZXR0aW5nIHR4cG93ZXJfdHlwZTsKCXN0 cnVjdCBpZWVlODAyMTFfcDJwX25vYV9hdHRyIHAycF9ub2FfYXR0cjsKCWJvb2wgYWxsb3dfcDJw X2dvX3BzOwoJdTE2IG1heF9pZGxlX3BlcmlvZDsKCWJvb2wgcHJvdGVjdGVkX2tlZXBfYWxpdmU7 Cglib29sIGZ0bV9yZXNwb25kZXI7CglzdHJ1Y3QgaWVlZTgwMjExX2Z0bV9yZXNwb25kZXJfcGFy YW1zICpmdG1yX3BhcmFtczsKCS8qIE11bHRpcGxlIEJTU0lEIGRhdGEgKi8KCWJvb2wgbm9udHJh bnNtaXR0ZWQ7Cgl1OCB0cmFuc21pdHRlcl9ic3NpZFtFVEhfQUxFTl07Cgl1OCBic3NpZF9pbmRl eDsKCXU4IGJzc2lkX2luZGljYXRvcjsKCWJvb2wgZW1hX2FwOwoJdTggcHJvZmlsZV9wZXJpb2Rp Y2l0eTsKCXN0cnVjdCBpZWVlODAyMTFfaGVfb3BlcmF0aW9uIGhlX29wZXJhdGlvbjsKCXN0cnVj dCBpZWVlODAyMTFfaGVfb2Jzc19wZCBoZV9vYnNzX3BkOwoJc3RydWN0IGNmZzgwMjExX2hlX2Jz c19jb2xvciBoZV9ic3NfY29sb3I7Cn07CgovKioKICogZW51bSBtYWM4MDIxMV90eF9pbmZvX2Zs YWdzIC0gZmxhZ3MgdG8gZGVzY3JpYmUgdHJhbnNtaXNzaW9uIGluZm9ybWF0aW9uL3N0YXR1cwog KgogKiBUaGVzZSBmbGFncyBhcmUgdXNlZCB3aXRoIHRoZSBAZmxhZ3MgbWVtYmVyIG9mICZpZWVl ODAyMTFfdHhfaW5mby4KICoKICogQElFRUU4MDIxMV9UWF9DVExfUkVRX1RYX1NUQVRVUzogcmVx dWlyZSBUWCBzdGF0dXMgY2FsbGJhY2sgZm9yIHRoaXMgZnJhbWUuCiAqIEBJRUVFODAyMTFfVFhf Q1RMX0FTU0lHTl9TRVE6IFRoZSBkcml2ZXIgaGFzIHRvIGFzc2lnbiBhIHNlcXVlbmNlCiAqCW51 bWJlciB0byB0aGlzIGZyYW1lLCB0YWtpbmcgY2FyZSBvZiBub3Qgb3ZlcndyaXRpbmcgdGhlIGZy YWdtZW50CiAqCW51bWJlciBhbmQgaW5jcmVhc2luZyB0aGUgc2VxdWVuY2UgbnVtYmVyIG9ubHkg d2hlbiB0aGUKICoJSUVFRTgwMjExX1RYX0NUTF9GSVJTVF9GUkFHTUVOVCBmbGFnIGlzIHNldC4g bWFjODAyMTEgd2lsbCBwcm9wZXJseQogKglhc3NpZ24gc2VxdWVuY2UgbnVtYmVycyB0byBRb1Mt ZGF0YSBmcmFtZXMgYnV0IGNhbm5vdCBkbyBzbyBjb3JyZWN0bHkKICoJZm9yIG5vbi1Rb1MtZGF0 YSBhbmQgbWFuYWdlbWVudCBmcmFtZXMgYmVjYXVzZSBiZWFjb25zIG5lZWQgdGhlbSBmcm9tCiAq CXRoYXQgY291bnRlciBhcyB3ZWxsIGFuZCBtYWM4MDIxMSBjYW5ub3QgZ3VhcmFudGVlIHByb3Bl ciBzZXF1ZW5jaW5nLgogKglJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgZHJpdmVyIHNob3VsZCBp bnN0cnVjdCB0aGUgaGFyZHdhcmUgdG8KICoJYXNzaWduIGEgc2VxdWVuY2UgbnVtYmVyIHRvIHRo ZSBmcmFtZSBvciBhc3NpZ24gb25lIGl0c2VsZi4gQ2YuIElFRUUKICoJODAyLjExLTIwMDcgNy4x LjMuNC4xIHBhcmFncmFwaCAzLiBUaGlzIGZsYWcgd2lsbCBhbHdheXMgYmUgc2V0IGZvcgogKgli ZWFjb25zIGFuZCBhbHdheXMgYmUgY2xlYXIgZm9yIGZyYW1lcyB3aXRob3V0IGEgc2VxdWVuY2Ug bnVtYmVyIGZpZWxkLgogKiBASUVFRTgwMjExX1RYX0NUTF9OT19BQ0s6IHRlbGwgdGhlIGxvdyBs ZXZlbCBub3QgdG8gd2FpdCBmb3IgYW4gYWNrCiAqIEBJRUVFODAyMTFfVFhfQ1RMX0NMRUFSX1BT X0ZJTFQ6IGNsZWFyIHBvd2Vyc2F2ZSBmaWx0ZXIgZm9yIGRlc3RpbmF0aW9uCiAqCXN0YXRpb24K ICogQElFRUU4MDIxMV9UWF9DVExfRklSU1RfRlJBR01FTlQ6IHRoaXMgaXMgYSBmaXJzdCBmcmFn bWVudCBvZiB0aGUgZnJhbWUKICogQElFRUU4MDIxMV9UWF9DVExfU0VORF9BRlRFUl9EVElNOiBz ZW5kIHRoaXMgZnJhbWUgYWZ0ZXIgRFRJTSBiZWFjb24KICogQElFRUU4MDIxMV9UWF9DVExfQU1Q RFU6IHRoaXMgZnJhbWUgc2hvdWxkIGJlIHNlbnQgYXMgcGFydCBvZiBhbiBBLU1QRFUKICogQElF RUU4MDIxMV9UWF9DVExfSU5KRUNURUQ6IEZyYW1lIHdhcyBpbmplY3RlZCwgaW50ZXJuYWwgdG8g bWFjODAyMTEuCiAqIEBJRUVFODAyMTFfVFhfU1RBVF9UWF9GSUxURVJFRDogVGhlIGZyYW1lIHdh cyBub3QgdHJhbnNtaXR0ZWQKICoJYmVjYXVzZSB0aGUgZGVzdGluYXRpb24gU1RBIHdhcyBpbiBw b3dlcnNhdmUgbW9kZS4gTm90ZSB0aGF0IHRvCiAqCWF2b2lkIHJhY2UgY29uZGl0aW9ucywgdGhl IGZpbHRlciBtdXN0IGJlIHNldCBieSB0aGUgaGFyZHdhcmUgb3IKICoJZmlybXdhcmUgdXBvbiBy ZWNlaXZpbmcgYSBmcmFtZSB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBzdGF0aW9uCiAqCXdlbnQg dG8gc2xlZXAgKG11c3QgYmUgZG9uZSBvbiBkZXZpY2UgdG8gZmlsdGVyIGZyYW1lcyBhbHJlYWR5 IG9uCiAqCXRoZSBxdWV1ZSkgYW5kIG1heSBvbmx5IGJlIHVuc2V0IGFmdGVyIG1hYzgwMjExIGdp dmVzIHRoZSBPSyBmb3IKICoJdGhhdCBieSBzZXR0aW5nIHRoZSBJRUVFODAyMTFfVFhfQ1RMX0NM RUFSX1BTX0ZJTFQgKHNlZSBhYm92ZSksCiAqCXNpbmNlIG9ubHkgdGhlbiBpcyBpdCBndWFyYW50 ZWVkIHRoYXQgbm8gbW9yZSBmcmFtZXMgYXJlIGluIHRoZQogKgloYXJkd2FyZSBxdWV1ZS4KICog QElFRUU4MDIxMV9UWF9TVEFUX0FDSzogRnJhbWUgd2FzIGFja25vd2xlZGdlZAogKiBASUVFRTgw MjExX1RYX1NUQVRfQU1QRFU6IFRoZSBmcmFtZSB3YXMgYWdncmVnYXRlZCwgc28gc3RhdHVzCiAq IAlpcyBmb3IgdGhlIHdob2xlIGFnZ3JlZ2F0aW9uLgogKiBASUVFRTgwMjExX1RYX1NUQVRfQU1Q RFVfTk9fQkFDSzogbm8gYmxvY2sgYWNrIHdhcyByZXR1cm5lZCwKICogCXNvIGNvbnNpZGVyIHVz aW5nIGJsb2NrIGFjayByZXF1ZXN0IChCQVIpLgogKiBASUVFRTgwMjExX1RYX0NUTF9SQVRFX0NU UkxfUFJPQkU6IGludGVybmFsIHRvIG1hYzgwMjExLCBjYW4gYmUKICoJc2V0IGJ5IHJhdGUgY29u dHJvbCBhbGdvcml0aG1zIHRvIGluZGljYXRlIHByb2JlIHJhdGUsIHdpbGwKICoJYmUgY2xlYXJl ZCBmb3IgZnJhZ21lbnRlZCBmcmFtZXMgKGV4Y2VwdCBvbiB0aGUgbGFzdCBmcmFnbWVudCkKICog QElFRUU4MDIxMV9UWF9JTlRGTF9PRkZDSEFOX1RYX09LOiBJbnRlcm5hbCB0byBtYWM4MDIxMS4g VXNlZCB0byBpbmRpY2F0ZQogKgl0aGF0IGEgZnJhbWUgY2FuIGJlIHRyYW5zbWl0dGVkIHdoaWxl IHRoZSBxdWV1ZXMgYXJlIHN0b3BwZWQgZm9yCiAqCW9mZi1jaGFubmVsIG9wZXJhdGlvbi4KICog QElFRUU4MDIxMV9UWF9JTlRGTF9ORUVEX1RYUFJPQ0VTU0lORzogY29tcGxldGVseSBpbnRlcm5h bCB0byBtYWM4MDIxMSwKICoJdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgcGVuZGluZyBmcmFtZSBy ZXF1aXJlcyBUWCBwcm9jZXNzaW5nIGJlZm9yZQogKglpdCBjYW4gYmUgc2VudCBvdXQuCiAqIEBJ RUVFODAyMTFfVFhfSU5URkxfUkVUUklFRDogY29tcGxldGVseSBpbnRlcm5hbCB0byBtYWM4MDIx MSwKICoJdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgZnJhbWUgd2FzIGFscmVhZHkgcmV0cmllZCBk dWUgdG8gUFMKICogQElFRUU4MDIxMV9UWF9JTlRGTF9ET05UX0VOQ1JZUFQ6IGNvbXBsZXRlbHkg aW50ZXJuYWwgdG8gbWFjODAyMTEsCiAqCXVzZWQgdG8gaW5kaWNhdGUgZnJhbWUgc2hvdWxkIG5v dCBiZSBlbmNyeXB0ZWQKICogQElFRUU4MDIxMV9UWF9DVExfTk9fUFNfQlVGRkVSOiBUaGlzIGZy YW1lIGlzIGEgcmVzcG9uc2UgdG8gYSBwb2xsCiAqCWZyYW1lIChQUy1Qb2xsIG9yIHVBUFNEKSBv ciBhIG5vbi1idWZmZXJhYmxlIE1NUERVIGFuZCBtdXN0CiAqCWJlIHNlbnQgYWx0aG91Z2ggdGhl IHN0YXRpb24gaXMgaW4gcG93ZXJzYXZlIG1vZGUuCiAqIEBJRUVFODAyMTFfVFhfQ1RMX01PUkVf RlJBTUVTOiBNb3JlIGZyYW1lcyB3aWxsIGJlIHBhc3NlZCB0byB0aGUKICoJdHJhbnNtaXQgZnVu Y3Rpb24gYWZ0ZXIgdGhlIGN1cnJlbnQgZnJhbWUsIHRoaXMgY2FuIGJlIHVzZWQKICoJYnkgZHJp dmVycyB0byBraWNrIHRoZSBETUEgcXVldWUgb25seSBpZiB1bnNldCBvciB3aGVuIHRoZQogKglx dWV1ZSBnZXRzIGZ1bGwuCiAqIEBJRUVFODAyMTFfVFhfSU5URkxfUkVUUkFOU01JU1NJT046IFRo aXMgZnJhbWUgaXMgYmVpbmcgcmV0cmFuc21pdHRlZAogKglhZnRlciBUWCBzdGF0dXMgYmVjYXVz ZSB0aGUgZGVzdGluYXRpb24gd2FzIGFzbGVlcCwgaXQgbXVzdCBub3QKICoJYmUgbW9kaWZpZWQg YWdhaW4gKG5vIHNlcW5vIGFzc2lnbm1lbnQsIGNyeXB0bywgZXRjLikKICogQElFRUU4MDIxMV9U WF9JTlRGTF9NTE1FX0NPTk5fVFg6IFRoaXMgZnJhbWUgd2FzIHRyYW5zbWl0dGVkIGJ5IHRoZSBN TE1FCiAqCWNvZGUgZm9yIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudCwgdGhpcyBpbmRpY2F0ZXMg dGhhdCBpdHMgc3RhdHVzCiAqCXNob3VsZCBraWNrIHRoZSBNTE1FIHN0YXRlIG1hY2hpbmUuCiAq IEBJRUVFODAyMTFfVFhfSU5URkxfTkw4MDIxMV9GUkFNRV9UWDogRnJhbWUgd2FzIHJlcXVlc3Rl ZCB0aHJvdWdoIG5sODAyMTEKICoJTUxNRSBjb21tYW5kIChpbnRlcm5hbCB0byBtYWM4MDIxMSB0 byBmaWd1cmUgb3V0IHdoZXRoZXIgdG8gc2VuZCBUWAogKglzdGF0dXMgdG8gdXNlciBzcGFjZSkK ICogQElFRUU4MDIxMV9UWF9DVExfTERQQzogdGVsbHMgdGhlIGRyaXZlciB0byB1c2UgTERQQyBm b3IgdGhpcyBmcmFtZQogKiBASUVFRTgwMjExX1RYX0NUTF9TVEJDOiBFbmFibGVzIFNwYWNlLVRp bWUgQmxvY2sgQ29kaW5nIChTVEJDKSBmb3IgdGhpcwogKglmcmFtZSBhbmQgc2VsZWN0cyB0aGUg bWF4aW11bSBudW1iZXIgb2Ygc3RyZWFtcyB0aGF0IGl0IGNhbiB1c2UuCiAqIEBJRUVFODAyMTFf VFhfQ1RMX1RYX09GRkNIQU46IE1hcmtzIHRoaXMgcGFja2V0IHRvIGJlIHRyYW5zbWl0dGVkIG9u CiAqCXRoZSBvZmYtY2hhbm5lbCBjaGFubmVsIHdoZW4gYSByZW1haW4tb24tY2hhbm5lbCBvZmZs b2FkIGlzIGRvbmUKICoJaW4gaGFyZHdhcmUgLS0gbm9ybWFsIHBhY2tldHMgc3RpbGwgZmxvdyBh bmQgYXJlIGV4cGVjdGVkIHRvIGJlCiAqCWhhbmRsZWQgcHJvcGVybHkgYnkgdGhlIGRldmljZS4K ICogQElFRUU4MDIxMV9UWF9JTlRGTF9US0lQX01JQ19GQUlMVVJFOiBNYXJrcyB0aGlzIHBhY2tl dCB0byBiZSB1c2VkIGZvciBUS0lQCiAqCXRlc3RpbmcuIEl0IHdpbGwgYmUgc2VudCBvdXQgd2l0 aCBpbmNvcnJlY3QgTWljaGFlbCBNSUMga2V5IHRvIGFsbG93CiAqCVRLSVAgY291bnRlcm1lYXN1 cmVzIHRvIGJlIHRlc3RlZC4KICogQElFRUU4MDIxMV9UWF9DVExfTk9fQ0NLX1JBVEU6IFRoaXMg ZnJhbWUgd2lsbCBiZSBzZW50IGF0IG5vbiBDQ0sgcmF0ZS4KICoJVGhpcyBmbGFnIGlzIGFjdHVh bGx5IHVzZWQgZm9yIG1hbmFnZW1lbnQgZnJhbWUgZXNwZWNpYWxseSBmb3IgUDJQCiAqCWZyYW1l cyBub3QgYmVpbmcgc2VudCBhdCBDQ0sgcmF0ZSBpbiAyR0h6IGJhbmQuCiAqIEBJRUVFODAyMTFf VFhfU1RBVFVTX0VPU1A6IFRoaXMgcGFja2V0IG1hcmtzIHRoZSBlbmQgb2Ygc2VydmljZSBwZXJp b2QsCiAqCXdoZW4gaXRzIHN0YXR1cyBpcyByZXBvcnRlZCB0aGUgc2VydmljZSBwZXJpb2QgZW5k cy4gRm9yIGZyYW1lcyBpbgogKglhbiBTUCB0aGF0IG1hYzgwMjExIHRyYW5zbWl0cywgaXQgaXMg YWxyZWFkeSBzZXQ7IGZvciBkcml2ZXIgZnJhbWVzCiAqCXRoZSBkcml2ZXIgbWF5IHNldCB0aGlz IGZsYWcuIEl0IGlzIGFsc28gdXNlZCB0byBkbyB0aGUgc2FtZSBmb3IKICoJUFMtUG9sbCByZXNw b25zZXMuCiAqIEBJRUVFODAyMTFfVFhfQ1RMX1VTRV9NSU5SQVRFOiBUaGlzIGZyYW1lIHdpbGwg YmUgc2VudCBhdCBsb3dlc3QgcmF0ZS4KICoJVGhpcyBmbGFnIGlzIHVzZWQgdG8gc2VuZCBudWxs ZnVuYyBmcmFtZSBhdCBtaW5pbXVtIHJhdGUgd2hlbgogKgl0aGUgbnVsbGZ1bmMgaXMgdXNlZCBm b3IgY29ubmVjdGlvbiBtb25pdG9yaW5nIHB1cnBvc2UuCiAqIEBJRUVFODAyMTFfVFhfQ1RMX0RP TlRGUkFHOiBEb24ndCBmcmFnbWVudCB0aGlzIHBhY2tldCBldmVuIGlmIGl0CiAqCXdvdWxkIGJl IGZyYWdtZW50ZWQgYnkgc2l6ZSAodGhpcyBpcyBvcHRpb25hbCwgb25seSB1c2VkIGZvcgogKglt b25pdG9yIGluamVjdGlvbikuCiAqIEBJRUVFODAyMTFfVFhfU1RBVF9OT0FDS19UUkFOU01JVFRF RDogQSBmcmFtZSB0aGF0IHdhcyBtYXJrZWQgd2l0aAogKglJRUVFODAyMTFfVFhfQ1RMX05PX0FD SyBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdHJhbnNtaXR0ZWQgd2l0aG91dAogKglhbnkgZXJyb3Jz IChsaWtlIGlzc3VlcyBzcGVjaWZpYyB0byB0aGUgZHJpdmVyL0hXKS4KICoJVGhpcyBmbGFnIG11 c3Qgbm90IGJlIHNldCBmb3IgZnJhbWVzIHRoYXQgZG9uJ3QgcmVxdWVzdCBuby1hY2sKICoJYmVo YXZpb3VyIHdpdGggSUVFRTgwMjExX1RYX0NUTF9OT19BQ0suCiAqCiAqIE5vdGU6IElmIHlvdSBo YXZlIHRvIGFkZCBuZXcgZmxhZ3MgdG8gdGhlIGVudW1lcmF0aW9uLCB0aGVuIGRvbid0CiAqCSBm b3JnZXQgdG8gdXBkYXRlICVJRUVFODAyMTFfVFhfVEVNUE9SQVJZX0ZMQUdTIHdoZW4gbmVjZXNz YXJ5LgogKi8KZW51bSBtYWM4MDIxMV90eF9pbmZvX2ZsYWdzIHsKCUlFRUU4MDIxMV9UWF9DVExf UkVRX1RYX1NUQVRVUwkJPSBCSVQoMCksCglJRUVFODAyMTFfVFhfQ1RMX0FTU0lHTl9TRVEJCT0g QklUKDEpLAoJSUVFRTgwMjExX1RYX0NUTF9OT19BQ0sJCQk9IEJJVCgyKSwKCUlFRUU4MDIxMV9U WF9DVExfQ0xFQVJfUFNfRklMVAkJPSBCSVQoMyksCglJRUVFODAyMTFfVFhfQ1RMX0ZJUlNUX0ZS QUdNRU5UCQk9IEJJVCg0KSwKCUlFRUU4MDIxMV9UWF9DVExfU0VORF9BRlRFUl9EVElNCT0gQklU KDUpLAoJSUVFRTgwMjExX1RYX0NUTF9BTVBEVQkJCT0gQklUKDYpLAoJSUVFRTgwMjExX1RYX0NU TF9JTkpFQ1RFRAkJPSBCSVQoNyksCglJRUVFODAyMTFfVFhfU1RBVF9UWF9GSUxURVJFRAkJPSBC SVQoOCksCglJRUVFODAyMTFfVFhfU1RBVF9BQ0sJCQk9IEJJVCg5KSwKCUlFRUU4MDIxMV9UWF9T VEFUX0FNUERVCQkJPSBCSVQoMTApLAoJSUVFRTgwMjExX1RYX1NUQVRfQU1QRFVfTk9fQkFDSwkJ PSBCSVQoMTEpLAoJSUVFRTgwMjExX1RYX0NUTF9SQVRFX0NUUkxfUFJPQkUJPSBCSVQoMTIpLAoJ SUVFRTgwMjExX1RYX0lOVEZMX09GRkNIQU5fVFhfT0sJPSBCSVQoMTMpLAoJSUVFRTgwMjExX1RY X0lOVEZMX05FRURfVFhQUk9DRVNTSU5HCT0gQklUKDE0KSwKCUlFRUU4MDIxMV9UWF9JTlRGTF9S RVRSSUVECQk9IEJJVCgxNSksCglJRUVFODAyMTFfVFhfSU5URkxfRE9OVF9FTkNSWVBUCQk9IEJJ VCgxNiksCglJRUVFODAyMTFfVFhfQ1RMX05PX1BTX0JVRkZFUgkJPSBCSVQoMTcpLAoJSUVFRTgw MjExX1RYX0NUTF9NT1JFX0ZSQU1FUwkJPSBCSVQoMTgpLAoJSUVFRTgwMjExX1RYX0lOVEZMX1JF VFJBTlNNSVNTSU9OCT0gQklUKDE5KSwKCUlFRUU4MDIxMV9UWF9JTlRGTF9NTE1FX0NPTk5fVFgJ CT0gQklUKDIwKSwKCUlFRUU4MDIxMV9UWF9JTlRGTF9OTDgwMjExX0ZSQU1FX1RYCT0gQklUKDIx KSwKCUlFRUU4MDIxMV9UWF9DVExfTERQQwkJCT0gQklUKDIyKSwKCUlFRUU4MDIxMV9UWF9DVExf U1RCQwkJCT0gQklUKDIzKSB8IEJJVCgyNCksCglJRUVFODAyMTFfVFhfQ1RMX1RYX09GRkNIQU4J CT0gQklUKDI1KSwKCUlFRUU4MDIxMV9UWF9JTlRGTF9US0lQX01JQ19GQUlMVVJFCT0gQklUKDI2 KSwKCUlFRUU4MDIxMV9UWF9DVExfTk9fQ0NLX1JBVEUJCT0gQklUKDI3KSwKCUlFRUU4MDIxMV9U WF9TVEFUVVNfRU9TUAkJPSBCSVQoMjgpLAoJSUVFRTgwMjExX1RYX0NUTF9VU0VfTUlOUkFURQkJ PSBCSVQoMjkpLAoJSUVFRTgwMjExX1RYX0NUTF9ET05URlJBRwkJPSBCSVQoMzApLAoJSUVFRTgw MjExX1RYX1NUQVRfTk9BQ0tfVFJBTlNNSVRURUQJPSBCSVQoMzEpLAp9OwoKI2RlZmluZSBJRUVF ODAyMTFfVFhfQ1RMX1NUQkNfU0hJRlQJCTIzCgovKioKICogZW51bSBtYWM4MDIxMV90eF9jb250 cm9sX2ZsYWdzIC0gZmxhZ3MgdG8gZGVzY3JpYmUgdHJhbnNtaXQgY29udHJvbAogKgogKiBASUVF RTgwMjExX1RYX0NUUkxfUE9SVF9DVFJMX1BST1RPOiB0aGlzIGZyYW1lIGlzIGEgcG9ydCBjb250 cm9sCiAqCXByb3RvY29sIGZyYW1lIChlLmcuIEVBUCkKICogQElFRUU4MDIxMV9UWF9DVFJMX1BT X1JFU1BPTlNFOiBUaGlzIGZyYW1lIGlzIGEgcmVzcG9uc2UgdG8gYSBwb2xsCiAqCWZyYW1lIChQ Uy1Qb2xsIG9yIHVBUFNEKS4KICogQElFRUU4MDIxMV9UWF9DVFJMX1JBVEVfSU5KRUNUOiBUaGlz IGZyYW1lIGlzIGluamVjdGVkIHdpdGggcmF0ZSBpbmZvcm1hdGlvbgogKiBASUVFRTgwMjExX1RY X0NUUkxfQU1TRFU6IFRoaXMgZnJhbWUgaXMgYW4gQS1NU0RVIGZyYW1lCiAqIEBJRUVFODAyMTFf VFhfQ1RSTF9GQVNUX1hNSVQ6IFRoaXMgZnJhbWUgaXMgZ29pbmcgdGhyb3VnaCB0aGUgZmFzdF94 bWl0IHBhdGgKICogQElFRUU4MDIxMV9UWF9DVFJMX1NLSVBfTVBBVEhfTE9PS1VQOiBUaGlzIGZy YW1lIHNraXBzIG1lc2ggcGF0aCBsb29rdXAKICoKICogVGhlc2UgZmxhZ3MgYXJlIHVzZWQgaW4g dHhfaW5mby0+Y29udHJvbC5mbGFncy4KICovCmVudW0gbWFjODAyMTFfdHhfY29udHJvbF9mbGFn cyB7CglJRUVFODAyMTFfVFhfQ1RSTF9QT1JUX0NUUkxfUFJPVE8JPSBCSVQoMCksCglJRUVFODAy MTFfVFhfQ1RSTF9QU19SRVNQT05TRQkJPSBCSVQoMSksCglJRUVFODAyMTFfVFhfQ1RSTF9SQVRF X0lOSkVDVAkJPSBCSVQoMiksCglJRUVFODAyMTFfVFhfQ1RSTF9BTVNEVQkJCT0gQklUKDMpLAoJ SUVFRTgwMjExX1RYX0NUUkxfRkFTVF9YTUlUCQk9IEJJVCg0KSwKCUlFRUU4MDIxMV9UWF9DVFJM X1NLSVBfTVBBVEhfTE9PS1VQCT0gQklUKDUpLAoJSUVFRTgwMjExX1RYX0NUUkxfSFdfODAyMTFf RU5DQVAJPSBCSVQoNiksCn07CgovKgogKiBUaGlzIGRlZmluaXRpb24gaXMgdXNlZCBhcyBhIG1h c2sgdG8gY2xlYXIgYWxsIHRlbXBvcmFyeSBmbGFncywgd2hpY2ggYXJlCiAqIHNldCBieSB0aGUg dHggaGFuZGxlcnMgZm9yIGVhY2ggdHJhbnNtaXNzaW9uIGF0dGVtcHQgYnkgdGhlIG1hYzgwMjEx IHN0YWNrLgogKi8KI2RlZmluZSBJRUVFODAyMTFfVFhfVEVNUE9SQVJZX0ZMQUdTIChJRUVFODAy MTFfVFhfQ1RMX05PX0FDSyB8CQkgICAgICBcCglJRUVFODAyMTFfVFhfQ1RMX0NMRUFSX1BTX0ZJ TFQgfCBJRUVFODAyMTFfVFhfQ1RMX0ZJUlNUX0ZSQUdNRU5UIHwgICAgXAoJSUVFRTgwMjExX1RY X0NUTF9TRU5EX0FGVEVSX0RUSU0gfCBJRUVFODAyMTFfVFhfQ1RMX0FNUERVIHwJICAgICAgXAoJ SUVFRTgwMjExX1RYX1NUQVRfVFhfRklMVEVSRUQgfAlJRUVFODAyMTFfVFhfU1RBVF9BQ0sgfAkJ ICAgICAgXAoJSUVFRTgwMjExX1RYX1NUQVRfQU1QRFUgfCBJRUVFODAyMTFfVFhfU1RBVF9BTVBE VV9OT19CQUNLIHwJICAgICAgXAoJSUVFRTgwMjExX1RYX0NUTF9SQVRFX0NUUkxfUFJPQkUgfCBJ RUVFODAyMTFfVFhfQ1RMX05PX1BTX0JVRkZFUiB8ICAgIFwKCUlFRUU4MDIxMV9UWF9DVExfTU9S RV9GUkFNRVMgfCBJRUVFODAyMTFfVFhfQ1RMX0xEUEMgfAkJICAgICAgXAoJSUVFRTgwMjExX1RY X0NUTF9TVEJDIHwgSUVFRTgwMjExX1RYX1NUQVRVU19FT1NQKQoKLyoqCiAqIGVudW0gbWFjODAy MTFfcmF0ZV9jb250cm9sX2ZsYWdzIC0gcGVyLXJhdGUgZmxhZ3Mgc2V0IGJ5IHRoZQogKglSYXRl IENvbnRyb2wgYWxnb3JpdGhtLgogKgogKiBUaGVzZSBmbGFncyBhcmUgc2V0IGJ5IHRoZSBSYXRl IGNvbnRyb2wgYWxnb3JpdGhtIGZvciBlYWNoIHJhdGUgZHVyaW5nIHR4LAogKiBpbiB0aGUgQGZs YWdzIG1lbWJlciBvZiBzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUuCiAqCiAqIEBJRUVFODAyMTFf VFhfUkNfVVNFX1JUU19DVFM6IFVzZSBSVFMvQ1RTIGV4Y2hhbmdlIGZvciB0aGlzIHJhdGUuCiAq IEBJRUVFODAyMTFfVFhfUkNfVVNFX0NUU19QUk9URUNUOiBDVFMtdG8tc2VsZiBwcm90ZWN0aW9u IGlzIHJlcXVpcmVkLgogKglUaGlzIGlzIHNldCBpZiB0aGUgY3VycmVudCBCU1MgcmVxdWlyZXMg RVJQIHByb3RlY3Rpb24uCiAqIEBJRUVFODAyMTFfVFhfUkNfVVNFX1NIT1JUX1BSRUFNQkxFOiBV c2Ugc2hvcnQgcHJlYW1ibGUuCiAqIEBJRUVFODAyMTFfVFhfUkNfTUNTOiBIVCByYXRlLgogKiBA SUVFRTgwMjExX1RYX1JDX1ZIVF9NQ1M6IFZIVCBNQ1MgcmF0ZSwgaW4gdGhpcyBjYXNlIHRoZSBp ZHggZmllbGQgaXMgc3BsaXQKICoJaW50byBhIGhpZ2hlciA0IGJpdHMgKE5zcykgYW5kIGxvd2Vy IDQgYml0cyAoTUNTIG51bWJlcikKICogQElFRUU4MDIxMV9UWF9SQ19HUkVFTl9GSUVMRDogSW5k aWNhdGVzIHdoZXRoZXIgdGhpcyByYXRlIHNob3VsZCBiZSB1c2VkIGluCiAqCUdyZWVuZmllbGQg bW9kZS4KICogQElFRUU4MDIxMV9UWF9SQ180MF9NSFpfV0lEVEg6IEluZGljYXRlcyBpZiB0aGUg Q2hhbm5lbCBXaWR0aCBzaG91bGQgYmUgNDAgTUh6LgogKiBASUVFRTgwMjExX1RYX1JDXzgwX01I Wl9XSURUSDogSW5kaWNhdGVzIDgwIE1IeiB0cmFuc21pc3Npb24KICogQElFRUU4MDIxMV9UWF9S Q18xNjBfTUhaX1dJRFRIOiBJbmRpY2F0ZXMgMTYwIE1IeiB0cmFuc21pc3Npb24KICoJKDgwKzgw IGlzbid0IHN1cHBvcnRlZCB5ZXQpCiAqIEBJRUVFODAyMTFfVFhfUkNfRFVQX0RBVEE6IFRoZSBm cmFtZSBzaG91bGQgYmUgdHJhbnNtaXR0ZWQgb24gYm90aCBvZiB0aGUKICoJYWRqYWNlbnQgMjAg TUh6IGNoYW5uZWxzLCBpZiB0aGUgY3VycmVudCBjaGFubmVsIHR5cGUgaXMKICoJTkw4MDIxMV9D SEFOX0hUNDBNSU5VUyBvciBOTDgwMjExX0NIQU5fSFQ0MFBMVVMuCiAqIEBJRUVFODAyMTFfVFhf UkNfU0hPUlRfR0k6IFNob3J0IEd1YXJkIGludGVydmFsIHNob3VsZCBiZSB1c2VkIGZvciB0aGlz IHJhdGUuCiAqLwplbnVtIG1hYzgwMjExX3JhdGVfY29udHJvbF9mbGFncyB7CglJRUVFODAyMTFf VFhfUkNfVVNFX1JUU19DVFMJCT0gQklUKDApLAoJSUVFRTgwMjExX1RYX1JDX1VTRV9DVFNfUFJP VEVDVAkJPSBCSVQoMSksCglJRUVFODAyMTFfVFhfUkNfVVNFX1NIT1JUX1BSRUFNQkxFCT0gQklU KDIpLAoKCS8qIHJhdGUgaW5kZXggaXMgYW4gSFQvVkhUIE1DUyBpbnN0ZWFkIG9mIGFuIGluZGV4 ICovCglJRUVFODAyMTFfVFhfUkNfTUNTCQkJPSBCSVQoMyksCglJRUVFODAyMTFfVFhfUkNfR1JF RU5fRklFTEQJCT0gQklUKDQpLAoJSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSAkJPSBCSVQo NSksCglJRUVFODAyMTFfVFhfUkNfRFVQX0RBVEEJCT0gQklUKDYpLAoJSUVFRTgwMjExX1RYX1JD X1NIT1JUX0dJCQk9IEJJVCg3KSwKCUlFRUU4MDIxMV9UWF9SQ19WSFRfTUNTCQkJPSBCSVQoOCks CglJRUVFODAyMTFfVFhfUkNfODBfTUhaX1dJRFRICQk9IEJJVCg5KSwKCUlFRUU4MDIxMV9UWF9S Q18xNjBfTUhaX1dJRFRICQk9IEJJVCgxMCksCn07CgoKLyogdGhlcmUgYXJlIDQwIGJ5dGVzIGlm IHlvdSBkb24ndCBuZWVkIHRoZSByYXRlc2V0IHRvIGJlIGtlcHQgKi8KI2RlZmluZSBJRUVFODAy MTFfVFhfSU5GT19EUklWRVJfREFUQV9TSVpFIDQwCgovKiBpZiB5b3UgZG8gbmVlZCB0aGUgcmF0 ZXNldCwgdGhlbiB5b3UgaGF2ZSBsZXNzIHNwYWNlICovCiNkZWZpbmUgSUVFRTgwMjExX1RYX0lO Rk9fUkFURV9EUklWRVJfREFUQV9TSVpFIDI0CgovKiBtYXhpbXVtIG51bWJlciBvZiByYXRlIHN0 YWdlcyAqLwojZGVmaW5lIElFRUU4MDIxMV9UWF9NQVhfUkFURVMJNAoKLyogbWF4aW11bSBudW1i ZXIgb2YgcmF0ZSB0YWJsZSBlbnRyaWVzICovCiNkZWZpbmUgSUVFRTgwMjExX1RYX1JBVEVfVEFC TEVfU0laRQk0CgovKioKICogc3RydWN0IGllZWU4MDIxMV90eF9yYXRlIC0gcmF0ZSBzZWxlY3Rp b24vc3RhdHVzCiAqCiAqIEBpZHg6IHJhdGUgaW5kZXggdG8gYXR0ZW1wdCB0byBzZW5kIHdpdGgK ICogQGZsYWdzOiByYXRlIGNvbnRyb2wgZmxhZ3MgKCZlbnVtIG1hYzgwMjExX3JhdGVfY29udHJv bF9mbGFncykKICogQGNvdW50OiBudW1iZXIgb2YgdHJpZXMgaW4gdGhpcyByYXRlIGJlZm9yZSBn b2luZyB0byB0aGUgbmV4dCByYXRlCiAqCiAqIEEgdmFsdWUgb2YgLTEgZm9yIEBpZHggaW5kaWNh dGVzIGFuIGludmFsaWQgcmF0ZSBhbmQsIGlmIHVzZWQKICogaW4gYW4gYXJyYXkgb2YgcmV0cnkg cmF0ZXMsIHRoYXQgbm8gbW9yZSByYXRlcyBzaG91bGQgYmUgdHJpZWQuCiAqCiAqIFdoZW4gdXNl ZCBmb3IgdHJhbnNtaXQgc3RhdHVzIHJlcG9ydGluZywgdGhlIGRyaXZlciBzaG91bGQKICogYWx3 YXlzIHJlcG9ydCB0aGUgcmF0ZSBhbG9uZyB3aXRoIHRoZSBmbGFncyBpdCB1c2VkLgogKgogKiAm c3RydWN0IGllZWU4MDIxMV90eF9pbmZvIGNvbnRhaW5zIGFuIGFycmF5IG9mIHRoZXNlIHN0cnVj dHMKICogaW4gdGhlIGNvbnRyb2wgaW5mb3JtYXRpb24sIGFuZCBpdCB3aWxsIGJlIGZpbGxlZCBi eSB0aGUgcmF0ZQogKiBjb250cm9sIGFsZ29yaXRobSBhY2NvcmRpbmcgdG8gd2hhdCBzaG91bGQg YmUgc2VudC4gRm9yIGV4YW1wbGUsCiAqIGlmIHRoaXMgYXJyYXkgY29udGFpbnMsIGluIHRoZSBm b3JtYXQgeyA8aWR4PiwgPGNvdW50PiB9IHRoZQogKiBpbmZvcm1hdGlvbjo6CiAqCiAqICAgIHsg MywgMiB9LCB7IDIsIDIgfSwgeyAxLCA0IH0sIHsgLTEsIDAgfSwgeyAtMSwgMCB9CiAqCiAqIHRo ZW4gdGhpcyBtZWFucyB0aGF0IHRoZSBmcmFtZSBzaG91bGQgYmUgdHJhbnNtaXR0ZWQKICogdXAg dG8gdHdpY2UgYXQgcmF0ZSAzLCB1cCB0byB0d2ljZSBhdCByYXRlIDIsIGFuZCB1cCB0byBmb3Vy CiAqIHRpbWVzIGF0IHJhdGUgMSBpZiBpdCBkb2Vzbid0IGdldCBhY2tub3dsZWRnZWQuIFNheSBp dCBnZXRzCiAqIGFja25vd2xlZGdlZCBieSB0aGUgcGVlciBhZnRlciB0aGUgZmlmdGggYXR0ZW1w dCwgdGhlIHN0YXR1cwogKiBpbmZvcm1hdGlvbiBzaG91bGQgdGhlbiBjb250YWluOjoKICoKICog ICB7IDMsIDIgfSwgeyAyLCAyIH0sIHsgMSwgMSB9LCB7IC0xLCAwIH0gLi4uCiAqCiAqIHNpbmNl IGl0IHdhcyB0cmFuc21pdHRlZCB0d2ljZSBhdCByYXRlIDMsIHR3aWNlIGF0IHJhdGUgMgogKiBh bmQgb25jZSBhdCByYXRlIDEgYWZ0ZXIgd2hpY2ggd2UgcmVjZWl2ZWQgYW4gYWNrbm93bGVkZ2Vt ZW50LgogKi8Kc3RydWN0IGllZWU4MDIxMV90eF9yYXRlIHsKCXM4IGlkeDsKCXUxNiBjb3VudDo1 LAoJICAgIGZsYWdzOjExOwp9IF9fcGFja2VkOwoKI2RlZmluZSBJRUVFODAyMTFfTUFYX1RYX1JF VFJZCQkzMQoKc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9yYXRlX3NldF92aHQoc3RydWN0 IGllZWU4MDIxMV90eF9yYXRlICpyYXRlLAoJCQkJCSAgdTggbWNzLCB1OCBuc3MpCnsKCVdBUk5f T04obWNzICYgfjB4Rik7CglXQVJOX09OKChuc3MgLSAxKSAmIH4weDcpOwoJcmF0ZS0+aWR4ID0g KChuc3MgLSAxKSA8PCA0KSB8IG1jczsKfQoKc3RhdGljIGlubGluZSB1OAppZWVlODAyMTFfcmF0 ZV9nZXRfdmh0X21jcyhjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgKnJhdGUpCnsKCXJl dHVybiByYXRlLT5pZHggJiAweEY7Cn0KCnN0YXRpYyBpbmxpbmUgdTgKaWVlZTgwMjExX3JhdGVf Z2V0X3ZodF9uc3MoY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eF9yYXRlICpyYXRlKQp7CglyZXR1 cm4gKHJhdGUtPmlkeCA+PiA0KSArIDE7Cn0KCi8qKgogKiBzdHJ1Y3QgaWVlZTgwMjExX3R4X2lu Zm8gLSBza2IgdHJhbnNtaXQgaW5mb3JtYXRpb24KICoKICogVGhpcyBzdHJ1Y3R1cmUgaXMgcGxh Y2VkIGluIHNrYi0+Y2IgZm9yIHRocmVlIHVzZXM6CiAqICAoMSkgbWFjODAyMTEgVFggY29udHJv bCAtIG1hYzgwMjExIHRlbGxzIHRoZSBkcml2ZXIgd2hhdCB0byBkbwogKiAgKDIpIGRyaXZlciBp bnRlcm5hbCB1c2UgKGlmIGFwcGxpY2FibGUpCiAqICAoMykgVFggc3RhdHVzIGluZm9ybWF0aW9u IC0gZHJpdmVyIHRlbGxzIG1hYzgwMjExIHdoYXQgaGFwcGVuZWQKICoKICogQGZsYWdzOiB0cmFu c21pdCBpbmZvIGZsYWdzLCBkZWZpbmVkIGFib3ZlCiAqIEBiYW5kOiB0aGUgYmFuZCB0byB0cmFu c21pdCBvbiAodXNlIGZvciBjaGVja2luZyBmb3IgcmFjZXMpCiAqIEBod19xdWV1ZTogSFcgcXVl dWUgdG8gcHV0IHRoZSBmcmFtZSBvbiwgc2tiX2dldF9xdWV1ZV9tYXBwaW5nKCkgZ2l2ZXMgdGhl IEFDCiAqIEBhY2tfZnJhbWVfaWQ6IGludGVybmFsIGZyYW1lIElEIGZvciBUWCBzdGF0dXMsIHVz ZWQgaW50ZXJuYWxseQogKiBAdHhfdGltZV9lc3Q6IFRYIHRpbWUgZXN0aW1hdGUgaW4gdW5pdHMg b2YgNHVzLCB1c2VkIGludGVybmFsbHkKICogQGNvbnRyb2w6IHVuaW9uIHBhcnQgZm9yIGNvbnRy b2wgZGF0YQogKiBAY29udHJvbC5yYXRlczogVFggcmF0ZXMgYXJyYXkgdG8gdHJ5CiAqIEBjb250 cm9sLnJ0c19jdHNfcmF0ZV9pZHg6IHJhdGUgZm9yIFJUUyBvciBDVFMKICogQGNvbnRyb2wudXNl X3J0czogdXNlIFJUUwogKiBAY29udHJvbC51c2VfY3RzX3Byb3Q6IHVzZSBSVFMvQ1RTCiAqIEBj b250cm9sLnNob3J0X3ByZWFtYmxlOiB1c2Ugc2hvcnQgcHJlYW1ibGUgKENDSyBvbmx5KQogKiBA Y29udHJvbC5za2lwX3RhYmxlOiBza2lwIGV4dGVybmFsbHkgY29uZmlndXJlZCByYXRlIHRhYmxl CiAqIEBjb250cm9sLmppZmZpZXM6IHRpbWVzdGFtcCBmb3IgZXhwaXJ5IG9uIHBvd2Vyc2F2ZSBj bGllbnRzCiAqIEBjb250cm9sLnZpZjogdmlydHVhbCBpbnRlcmZhY2UgKG1heSBiZSBOVUxMKQog KiBAY29udHJvbC5od19rZXk6IGtleSB0byBlbmNyeXB0IHdpdGggKG1heSBiZSBOVUxMKQogKiBA Y29udHJvbC5mbGFnczogY29udHJvbCBmbGFncywgc2VlICZlbnVtIG1hYzgwMjExX3R4X2NvbnRy b2xfZmxhZ3MKICogQGNvbnRyb2wuZW5xdWV1ZV90aW1lOiBlbnF1ZXVlIHRpbWUgKGZvciBpVFhR cykKICogQGRyaXZlcl9yYXRlczogYWxpYXMgdG8gQGNvbnRyb2wucmF0ZXMgdG8gcmVzZXJ2ZSBz cGFjZQogKiBAcGFkOiBwYWRkaW5nCiAqIEByYXRlX2RyaXZlcl9kYXRhOiBkcml2ZXIgdXNlIGFy ZWEgaWYgZHJpdmVyIG5lZWRzIEBjb250cm9sLnJhdGVzCiAqIEBzdGF0dXM6IHVuaW9uIHBhcnQg Zm9yIHN0YXR1cyBkYXRhCiAqIEBzdGF0dXMucmF0ZXM6IGF0dGVtcHRlZCByYXRlcwogKiBAc3Rh dHVzLmFja19zaWduYWw6IEFDSyBzaWduYWwKICogQHN0YXR1cy5hbXBkdV9hY2tfbGVuOiBBTVBE VSBhY2sgbGVuZ3RoCiAqIEBzdGF0dXMuYW1wZHVfbGVuOiBBTVBEVSBsZW5ndGgKICogQHN0YXR1 cy5hbnRlbm5hOiAobGVnYWN5LCBrZXB0IG9ubHkgZm9yIGl3bGVnYWN5KQogKiBAc3RhdHVzLnR4 X3RpbWU6IGFpcnRpbWUgY29uc3VtZWQgZm9yIHRyYW5zbWlzc2lvbgogKiBAc3RhdHVzLmlzX3Zh bGlkX2Fja19zaWduYWw6IEFDSyBzaWduYWwgaXMgdmFsaWQKICogQHN0YXR1cy5zdGF0dXNfZHJp dmVyX2RhdGE6IGRyaXZlciB1c2UgYXJlYQogKiBAYWNrOiB1bmlvbiBwYXJ0IGZvciBwdXJlIEFD SyBkYXRhCiAqIEBhY2suY29va2llOiBjb29raWUgZm9yIHRoZSBBQ0sKICogQGRyaXZlcl9kYXRh OiBhcnJheSBvZiBkcml2ZXJfZGF0YSBwb2ludGVycwogKiBAYW1wZHVfYWNrX2xlbjogbnVtYmVy IG9mIGFja2VkIGFnZ3JlZ2F0ZWQgZnJhbWVzLgogKiAJcmVsZXZhbnQgb25seSBpZiBJRUVFODAy MTFfVFhfU1RBVF9BTVBEVSB3YXMgc2V0LgogKiBAYW1wZHVfbGVuOiBudW1iZXIgb2YgYWdncmVn YXRlZCBmcmFtZXMuCiAqIAlyZWxldmFudCBvbmx5IGlmIElFRUU4MDIxMV9UWF9TVEFUX0FNUERV IHdhcyBzZXQuCiAqIEBhY2tfc2lnbmFsOiBzaWduYWwgc3RyZW5ndGggb2YgdGhlIEFDSyBmcmFt ZQogKi8Kc3RydWN0IGllZWU4MDIxMV90eF9pbmZvIHsKCS8qIGNvbW1vbiBpbmZvcm1hdGlvbiAq LwoJdTMyIGZsYWdzOwoJdTMyIGJhbmQ6MywKCSAgICBhY2tfZnJhbWVfaWQ6MTMsCgkgICAgaHdf cXVldWU6NCwKCSAgICB0eF90aW1lX2VzdDoxMDsKCS8qIDIgZnJlZSBiaXRzICovCgoJdW5pb24g ewoJCXN0cnVjdCB7CgkJCXVuaW9uIHsKCQkJCS8qIHJhdGUgY29udHJvbCAqLwoJCQkJc3RydWN0 IHsKCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgcmF0ZXNbCgkJCQkJCUlFRUU4MDIxMV9U WF9NQVhfUkFURVNdOwoJCQkJCXM4IHJ0c19jdHNfcmF0ZV9pZHg7CgkJCQkJdTggdXNlX3J0czox OwoJCQkJCXU4IHVzZV9jdHNfcHJvdDoxOwoJCQkJCXU4IHNob3J0X3ByZWFtYmxlOjE7CgkJCQkJ dTggc2tpcF90YWJsZToxOwoJCQkJCS8qIDIgYnl0ZXMgZnJlZSAqLwoJCQkJfTsKCQkJCS8qIG9u bHkgbmVlZGVkIGJlZm9yZSByYXRlIGNvbnRyb2wgKi8KCQkJCXVuc2lnbmVkIGxvbmcgamlmZmll czsKCQkJfTsKCQkJLyogTkI6IHZpZiBjYW4gYmUgTlVMTCBmb3IgaW5qZWN0ZWQgZnJhbWVzICov CgkJCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWY7CgkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2Nv bmYgKmh3X2tleTsKCQkJdTMyIGZsYWdzOwoJCQljb2RlbF90aW1lX3QgZW5xdWV1ZV90aW1lOwoJ CX0gY29udHJvbDsKCQlzdHJ1Y3QgewoJCQl1NjQgY29va2llOwoJCX0gYWNrOwoJCXN0cnVjdCB7 CgkJCXN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZSByYXRlc1tJRUVFODAyMTFfVFhfTUFYX1JBVEVT XTsKCQkJczMyIGFja19zaWduYWw7CgkJCXU4IGFtcGR1X2Fja19sZW47CgkJCXU4IGFtcGR1X2xl bjsKCQkJdTggYW50ZW5uYTsKCQkJdTE2IHR4X3RpbWU7CgkJCWJvb2wgaXNfdmFsaWRfYWNrX3Np Z25hbDsKCQkJdm9pZCAqc3RhdHVzX2RyaXZlcl9kYXRhWzE5IC8gc2l6ZW9mKHZvaWQgKildOwoJ CX0gc3RhdHVzOwoJCXN0cnVjdCB7CgkJCXN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZSBkcml2ZXJf cmF0ZXNbCgkJCQlJRUVFODAyMTFfVFhfTUFYX1JBVEVTXTsKCQkJdTggcGFkWzRdOwoKCQkJdm9p ZCAqcmF0ZV9kcml2ZXJfZGF0YVsKCQkJCUlFRUU4MDIxMV9UWF9JTkZPX1JBVEVfRFJJVkVSX0RB VEFfU0laRSAvIHNpemVvZih2b2lkICopXTsKCQl9OwoJCXZvaWQgKmRyaXZlcl9kYXRhWwoJCQlJ RUVFODAyMTFfVFhfSU5GT19EUklWRVJfREFUQV9TSVpFIC8gc2l6ZW9mKHZvaWQgKildOwoJfTsK fTsKCnN0YXRpYyBpbmxpbmUgdTE2CmllZWU4MDIxMV9pbmZvX3NldF90eF90aW1lX2VzdChzdHJ1 Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sIHUxNiB0eF90aW1lX2VzdCkKewoJLyogV2Ugb25s eSBoYXZlIDEwIGJpdHMgaW4gdHhfdGltZV9lc3QsIHNvIHN0b3JlIGFpcnRpbWUKCSAqIGluIGlu Y3JlbWVudHMgb2YgNHVzIGFuZCBjbGFtcCB0aGUgbWF4aW11bSB0byAyKioxMi0xCgkgKi8KCWlu Zm8tPnR4X3RpbWVfZXN0ID0gbWluX3QodTE2LCB0eF90aW1lX2VzdCwgNDA5NSkgPj4gMjsKCXJl dHVybiBpbmZvLT50eF90aW1lX2VzdCA8PCAyOwp9CgpzdGF0aWMgaW5saW5lIHUxNgppZWVlODAy MTFfaW5mb19nZXRfdHhfdGltZV9lc3Qoc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvKQp7 CglyZXR1cm4gaW5mby0+dHhfdGltZV9lc3QgPDwgMjsKfQoKLyoqCiAqIHN0cnVjdCBpZWVlODAy MTFfdHhfc3RhdHVzIC0gZXh0ZW5kZWQgdHggc3RhdHVzIGluZm8gZm9yIHJhdGUgY29udHJvbAog KgogKiBAc3RhOiBTdGF0aW9uIHRoYXQgdGhlIHBhY2tldCB3YXMgdHJhbnNtaXR0ZWQgZm9yCiAq IEBpbmZvOiBCYXNpYyB0eCBzdGF0dXMgaW5mb3JtYXRpb24KICogQHNrYjogUGFja2V0IHNrYiAo Y2FuIGJlIE5VTEwgaWYgbm90IHByb3ZpZGVkIGJ5IHRoZSBkcml2ZXIpCiAqIEByYXRlOiBUaGUg VFggcmF0ZSB0aGF0IHdhcyB1c2VkIHdoZW4gc2VuZGluZyB0aGUgcGFja2V0CiAqLwpzdHJ1Y3Qg aWVlZTgwMjExX3R4X3N0YXR1cyB7CglzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhOwoJc3RydWN0 IGllZWU4MDIxMV90eF9pbmZvICppbmZvOwoJc3RydWN0IHNrX2J1ZmYgKnNrYjsKCXN0cnVjdCBy YXRlX2luZm8gKnJhdGU7Cn07CgovKioKICogc3RydWN0IGllZWU4MDIxMV9zY2FuX2llcyAtIGRl c2NyaXB0b3JzIGZvciBkaWZmZXJlbnQgYmxvY2tzIG9mIElFcwogKgogKiBUaGlzIHN0cnVjdHVy ZSBpcyB1c2VkIHRvIHBvaW50IHRvIGRpZmZlcmVudCBibG9ja3Mgb2YgSUVzIGluIEhXIHNjYW4K ICogYW5kIHNjaGVkdWxlZCBzY2FuLiBUaGVzZSBibG9ja3MgY29udGFpbiB0aGUgSUVzIHBhc3Nl ZCBieSB1c2Vyc3BhY2UKICogYW5kIHRoZSBvbmVzIGdlbmVyYXRlZCBieSBtYWM4MDIxMS4KICoK ICogQGllczogcG9pbnRlcnMgdG8gYmFuZCBzcGVjaWZpYyBJRXMuCiAqIEBsZW46IGxlbmd0aHMg b2YgYmFuZF9zcGVjaWZpYyBJRXMuCiAqIEBjb21tb25faWVzOiBJRXMgZm9yIGFsbCBiYW5kcyAo ZXNwZWNpYWxseSB2ZW5kb3Igc3BlY2lmaWMgb25lcykKICogQGNvbW1vbl9pZV9sZW46IGxlbmd0 aCBvZiB0aGUgY29tbW9uX2llcwogKi8Kc3RydWN0IGllZWU4MDIxMV9zY2FuX2llcyB7Cgljb25z dCB1OCAqaWVzW05VTV9OTDgwMjExX0JBTkRTXTsKCXNpemVfdCBsZW5bTlVNX05MODAyMTFfQkFO RFNdOwoJY29uc3QgdTggKmNvbW1vbl9pZXM7CglzaXplX3QgY29tbW9uX2llX2xlbjsKfTsKCgpz dGF0aWMgaW5saW5lIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqSUVFRTgwMjExX1NLQl9DQihz dHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglyZXR1cm4gKHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAq KXNrYi0+Y2I7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKklF RUU4MDIxMV9TS0JfUlhDQihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglyZXR1cm4gKHN0cnVjdCBp ZWVlODAyMTFfcnhfc3RhdHVzICopc2tiLT5jYjsKfQoKLyoqCiAqIGllZWU4MDIxMV90eF9pbmZv X2NsZWFyX3N0YXR1cyAtIGNsZWFyIFRYIHN0YXR1cwogKgogKiBAaW5mbzogVGhlICZzdHJ1Y3Qg aWVlZTgwMjExX3R4X2luZm8gdG8gYmUgY2xlYXJlZC4KICoKICogV2hlbiB0aGUgZHJpdmVyIHBh c3NlcyBhbiBza2IgYmFjayB0byBtYWM4MDIxMSwgaXQgbXVzdCByZXBvcnQKICogYSBudW1iZXIg b2YgdGhpbmdzIGluIFRYIHN0YXR1cy4gVGhpcyBmdW5jdGlvbiBjbGVhcnMgZXZlcnl0aGluZwog KiBpbiB0aGUgVFggc3RhdHVzIGJ1dCB0aGUgcmF0ZSBjb250cm9sIGluZm9ybWF0aW9uIChpdCBk b2VzIGNsZWFyCiAqIHRoZSBjb3VudCBzaW5jZSB5b3UgbmVlZCB0byBmaWxsIHRoYXQgaW4gYW55 d2F5KS4KICoKICogTk9URTogWW91IGNhbiBvbmx5IHVzZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdSBk byBOT1QgdXNlCiAqCSBpbmZvLT5kcml2ZXJfZGF0YSEgVXNlIGluZm8tPnJhdGVfZHJpdmVyX2Rh dGEKICoJIGluc3RlYWQgaWYgeW91IG5lZWQgb25seSB0aGUgbGVzcyBzcGFjZSB0aGF0IGFsbG93 cy4KICovCnN0YXRpYyBpbmxpbmUgdm9pZAppZWVlODAyMTFfdHhfaW5mb19jbGVhcl9zdGF0dXMo c3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvKQp7CglpbnQgaTsKCglCVUlMRF9CVUdfT04o b2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV90eF9pbmZvLCBzdGF0dXMucmF0ZXMpICE9CgkJICAg ICBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8sIGNvbnRyb2wucmF0ZXMpKTsKCUJV SUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8sIHN0YXR1cy5yYXRl cykgIT0KCQkgICAgIG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbywgZHJpdmVyX3Jh dGVzKSk7CglCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV90eF9pbmZvLCBz dGF0dXMucmF0ZXMpICE9IDgpOwoJLyogY2xlYXIgdGhlIHJhdGUgY291bnRzICovCglmb3IgKGkg PSAwOyBpIDwgSUVFRTgwMjExX1RYX01BWF9SQVRFUzsgaSsrKQoJCWluZm8tPnN0YXR1cy5yYXRl c1tpXS5jb3VudCA9IDA7CgoJQlVJTERfQlVHX09OKAoJICAgIG9mZnNldG9mKHN0cnVjdCBpZWVl ODAyMTFfdHhfaW5mbywgc3RhdHVzLmFja19zaWduYWwpICE9IDIwKTsKCW1lbXNldCgmaW5mby0+ c3RhdHVzLmFtcGR1X2Fja19sZW4sIDAsCgkgICAgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFf dHhfaW5mbykgLQoJICAgICAgIG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbywgc3Rh dHVzLmFtcGR1X2Fja19sZW4pKTsKfQoKCi8qKgogKiBlbnVtIG1hYzgwMjExX3J4X2ZsYWdzIC0g cmVjZWl2ZSBmbGFncwogKgogKiBUaGVzZSBmbGFncyBhcmUgdXNlZCB3aXRoIHRoZSBAZmxhZyBt ZW1iZXIgb2YgJnN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzLgogKiBAUlhfRkxBR19NTUlDX0VS Uk9SOiBNaWNoYWVsIE1JQyBlcnJvciB3YXMgcmVwb3J0ZWQgb24gdGhpcyBmcmFtZS4KICoJVXNl IHRvZ2V0aGVyIHdpdGggJVJYX0ZMQUdfTU1JQ19TVFJJUFBFRC4KICogQFJYX0ZMQUdfREVDUllQ VEVEOiBUaGlzIGZyYW1lIHdhcyBkZWNyeXB0ZWQgaW4gaGFyZHdhcmUuCiAqIEBSWF9GTEFHX01N SUNfU1RSSVBQRUQ6IHRoZSBNaWNoYWVsIE1JQyBpcyBzdHJpcHBlZCBvZmYgdGhpcyBmcmFtZSwK ICoJdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGRvbmUgYnkgdGhlIGhhcmR3YXJlLgogKiBAUlhfRkxB R19JVl9TVFJJUFBFRDogVGhlIElWIGFuZCBJQ1YgYXJlIHN0cmlwcGVkIGZyb20gdGhpcyBmcmFt ZS4KICoJSWYgdGhpcyBmbGFnIGlzIHNldCwgdGhlIHN0YWNrIGNhbm5vdCBkbyBhbnkgcmVwbGF5 IGRldGVjdGlvbgogKgloZW5jZSB0aGUgZHJpdmVyIG9yIGhhcmR3YXJlIHdpbGwgaGF2ZSB0byBk byB0aGF0LgogKiBAUlhfRkxBR19QTl9WQUxJREFURUQ6IEN1cnJlbnRseSBvbmx5IHZhbGlkIGZv ciBDQ01QL0dDTVAgZnJhbWVzLCB0aGlzCiAqCWZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIFBOIHdh cyB2ZXJpZmllZCBmb3IgcmVwbGF5IHByb3RlY3Rpb24uCiAqCU5vdGUgdGhhdCB0aGlzIGZsYWcg aXMgYWxzbyBjdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgd2hlbiBhIGZyYW1lCiAqCWlzIGFsc28g ZGVjcnlwdGVkIChpZS4gQFJYX0ZMQUdfREVDUllQVEVEIG11c3QgYmUgc2V0KQogKiBAUlhfRkxB R19EVVBfVkFMSURBVEVEOiBUaGUgZHJpdmVyIHNob3VsZCBzZXQgdGhpcyBmbGFnIGlmIGl0IGRp ZAogKglkZS1kdXBsaWNhdGlvbiBieSBpdHNlbGYuCiAqIEBSWF9GTEFHX0ZBSUxFRF9GQ1NfQ1JD OiBTZXQgdGhpcyBmbGFnIGlmIHRoZSBGQ1MgY2hlY2sgZmFpbGVkIG9uCiAqCXRoZSBmcmFtZS4K ICogQFJYX0ZMQUdfRkFJTEVEX1BMQ1BfQ1JDOiBTZXQgdGhpcyBmbGFnIGlmIHRoZSBQQ0xQIGNo ZWNrIGZhaWxlZCBvbgogKgl0aGUgZnJhbWUuCiAqIEBSWF9GTEFHX01BQ1RJTUVfU1RBUlQ6IFRo ZSB0aW1lc3RhbXAgcGFzc2VkIGluIHRoZSBSWCBzdGF0dXMgKEBtYWN0aW1lCiAqCWZpZWxkKSBp cyB2YWxpZCBhbmQgY29udGFpbnMgdGhlIHRpbWUgdGhlIGZpcnN0IHN5bWJvbCBvZiB0aGUgTVBE VQogKgl3YXMgcmVjZWl2ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG1vbml0b3IgbW9kZSBhbmQgZm9y IHByb3BlciBJQlNTCiAqCW1lcmdpbmcuCiAqIEBSWF9GTEFHX01BQ1RJTUVfRU5EOiBUaGUgdGlt ZXN0YW1wIHBhc3NlZCBpbiB0aGUgUlggc3RhdHVzIChAbWFjdGltZQogKglmaWVsZCkgaXMgdmFs aWQgYW5kIGNvbnRhaW5zIHRoZSB0aW1lIHRoZSBsYXN0IHN5bWJvbCBvZiB0aGUgTVBEVQogKgko aW5jbHVkaW5nIEZDUykgd2FzIHJlY2VpdmVkLgogKiBAUlhfRkxBR19NQUNUSU1FX1BMQ1BfU1RB UlQ6IFRoZSB0aW1lc3RhbXAgcGFzc2VkIGluIHRoZSBSWCBzdGF0dXMgKEBtYWN0aW1lCiAqCWZp ZWxkKSBpcyB2YWxpZCBhbmQgY29udGFpbnMgdGhlIHRpbWUgdGhlIFNZTkMgcHJlYW1ibGUgd2Fz IHJlY2VpdmVkLgogKiBAUlhfRkxBR19OT19TSUdOQUxfVkFMOiBUaGUgc2lnbmFsIHN0cmVuZ3Ro IHZhbHVlIGlzIG5vdCBwcmVzZW50LgogKglWYWxpZCBvbmx5IGZvciBkYXRhIGZyYW1lcyAobWFp bmx5IEEtTVBEVSkKICogQFJYX0ZMQUdfQU1QRFVfREVUQUlMUzogQS1NUERVIGRldGFpbHMgYXJl IGtub3duLCBpbiBwYXJ0aWN1bGFyIHRoZSByZWZlcmVuY2UKICoJbnVtYmVyIChAYW1wZHVfcmVm ZXJlbmNlKSBtdXN0IGJlIHBvcHVsYXRlZCBhbmQgYmUgYSBkaXN0aW5jdCBudW1iZXIgZm9yCiAq CWVhY2ggQS1NUERVCiAqIEBSWF9GTEFHX0FNUERVX0xBU1RfS05PV046IGxhc3Qgc3ViZnJhbWUg aXMga25vd24sIHNob3VsZCBiZSBzZXQgb24gYWxsCiAqCXN1YmZyYW1lcyBvZiBhIHNpbmdsZSBB LU1QRFUKICogQFJYX0ZMQUdfQU1QRFVfSVNfTEFTVDogdGhpcyBzdWJmcmFtZSBpcyB0aGUgbGFz dCBzdWJmcmFtZSBvZiB0aGUgQS1NUERVCiAqIEBSWF9GTEFHX0FNUERVX0RFTElNX0NSQ19FUlJP UjogQSBkZWxpbWl0ZXIgQ1JDIGVycm9yIGhhcyBiZWVuIGRldGVjdGVkCiAqCW9uIHRoaXMgc3Vi ZnJhbWUKICogQFJYX0ZMQUdfQU1QRFVfREVMSU1fQ1JDX0tOT1dOOiBUaGUgZGVsaW1pdGVyIENS QyBmaWVsZCBpcyBrbm93biAodGhlIENSQwogKglpcyBzdG9yZWQgaW4gdGhlIEBhbXBkdV9kZWxp bWl0ZXJfY3JjIGZpZWxkKQogKiBAUlhfRkxBR19NSUNfU1RSSVBQRUQ6IFRoZSBtaWMgd2FzIHN0 cmlwcGVkIG9mIHRoaXMgcGFja2V0LiBEZWNyeXB0aW9uIHdhcwogKglkb25lIGJ5IHRoZSBoYXJk d2FyZQogKiBAUlhfRkxBR19PTkxZX01PTklUT1I6IFJlcG9ydCBmcmFtZSBvbmx5IHRvIG1vbml0 b3IgaW50ZXJmYWNlcyB3aXRob3V0CiAqCXByb2Nlc3NpbmcgaXQgaW4gYW55IHJlZ3VsYXIgd2F5 LgogKglUaGlzIGlzIHVzZWZ1bCBpZiBkcml2ZXJzIG9mZmxvYWQgc29tZSBmcmFtZXMgYnV0IHN0 aWxsIHdhbnQgdG8gcmVwb3J0CiAqCXRoZW0gZm9yIHNuaWZmaW5nIHB1cnBvc2VzLgogKiBAUlhf RkxBR19TS0lQX01PTklUT1I6IFByb2Nlc3MgYW5kIHJlcG9ydCBmcmFtZSB0byBhbGwgaW50ZXJm YWNlcyBleGNlcHQKICoJbW9uaXRvciBpbnRlcmZhY2VzLgogKglUaGlzIGlzIHVzZWZ1bCBpZiBk cml2ZXJzIG9mZmxvYWQgc29tZSBmcmFtZXMgYnV0IHN0aWxsIHdhbnQgdG8gcmVwb3J0CiAqCXRo ZW0gZm9yIHNuaWZmaW5nIHB1cnBvc2VzLgogKiBAUlhfRkxBR19BTVNEVV9NT1JFOiBTb21lIGRy aXZlcnMgbWF5IHByZWZlciB0byByZXBvcnQgc2VwYXJhdGUgQS1NU0RVCiAqCXN1YmZyYW1lcyBp bnN0ZWFkIG9mIGEgb25lIGh1Z2UgZnJhbWUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCiAqCUFs bCwgYnV0IHRoZSBsYXN0IE1TRFUgZnJvbSBhbiBBLU1TRFUgc2hvdWxkIGhhdmUgdGhpcyBmbGFn IHNldC4gRS5nLgogKglpZiBhbiBBLU1TRFUgaGFzIDMgZnJhbWVzLCB0aGUgZmlyc3QgMiBtdXN0 IGhhdmUgdGhlIGZsYWcgc2V0LCB3aGlsZQogKgl0aGUgM3JkIChsYXN0KSBvbmUgbXVzdCBub3Qg aGF2ZSB0aGlzIGZsYWcgc2V0LiBUaGUgZmxhZyBpcyB1c2VkIHRvCiAqCWRlYWwgd2l0aCByZXRy YW5zbWlzc2lvbi9kdXBsaWNhdGlvbiByZWNvdmVyeSBwcm9wZXJseSBzaW5jZSBBLU1TRFUKICoJ c3ViZnJhbWVzIHNoYXJlIHRoZSBzYW1lIHNlcXVlbmNlIG51bWJlci4gUmVwb3J0ZWQgc3ViZnJh bWVzIGNhbiBiZQogKgllaXRoZXIgcmVndWxhciBNU0RVIG9yIHNpbmdseSBBLU1TRFVzLiBTdWJm cmFtZXMgbXVzdCBub3QgYmUKICoJaW50ZXJsZWF2ZWQgd2l0aCBvdGhlciBmcmFtZXMuCiAqIEBS WF9GTEFHX1JBRElPVEFQX1ZFTkRPUl9EQVRBOiBUaGlzIGZyYW1lIGNvbnRhaW5zIHZlbmRvci1z cGVjaWZpYwogKglyYWRpb3RhcCBkYXRhIGluIHRoZSBza2ItPmRhdGEgKGJlZm9yZSB0aGUgZnJh bWUpIGFzIGRlc2NyaWJlZCBieQogKgl0aGUgJnN0cnVjdCBpZWVlODAyMTFfdmVuZG9yX3JhZGlv dGFwLgogKiBAUlhfRkxBR19BTExPV19TQU1FX1BOOiBBbGxvdyB0aGUgc2FtZSBQTiBhcyBzYW1l IHBhY2tldCBiZWZvcmUuCiAqCVRoaXMgaXMgdXNlZCBmb3IgQU1TRFUgc3ViZnJhbWVzIHdoaWNo IGNhbiBoYXZlIHRoZSBzYW1lIFBOIGFzCiAqCXRoZSBmaXJzdCBzdWJmcmFtZS4KICogQFJYX0ZM QUdfSUNWX1NUUklQUEVEOiBUaGUgSUNWIGlzIHN0cmlwcGVkIGZyb20gdGhpcyBmcmFtZS4gQ1JD IGNoZWNraW5nIG11c3QKICoJYmUgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCiAqIEBSWF9GTEFHX0FN UERVX0VPRl9CSVQ6IFZhbHVlIG9mIHRoZSBFT0YgYml0IGluIHRoZSBBLU1QRFUgZGVsaW1pdGVy IGZvciB0aGlzCiAqCWZyYW1lCiAqIEBSWF9GTEFHX0FNUERVX0VPRl9CSVRfS05PV046IFRoZSBF T0YgdmFsdWUgaXMga25vd24KICogQFJYX0ZMQUdfUkFESU9UQVBfSEU6IEhFIHJhZGlvdGFwIGRh dGEgaXMgcHJlc2VudAogKgkoJnN0cnVjdCBpZWVlODAyMTFfcmFkaW90YXBfaGUsIG1hYzgwMjEx IHdpbGwgZmlsbCBpbgogKgkKICoJIC0gREFUQTNfREFUQV9NQ1MKICoJIC0gREFUQTNfREFUQV9E Q00KICoJIC0gREFUQTNfQ09ESU5HCiAqCSAtIERBVEE1X0dJCiAqCSAtIERBVEE1X0RBVEFfQldf UlVfQUxMT0MKICoJIC0gREFUQTZfTlNUUwogKgkgLSBEQVRBM19TVEJDCiAqCQogKglmcm9tIHRo ZSBSWCBpbmZvIGRhdGEsIHNvIGxlYXZlIHRob3NlIHplcm9lZCB3aGVuIGJ1aWxkaW5nIHRoaXMg ZGF0YSkKICogQFJYX0ZMQUdfUkFESU9UQVBfSEVfTVU6IEhFIE1VIHJhZGlvdGFwIGRhdGEgaXMg cHJlc2VudAogKgkoJnN0cnVjdCBpZWVlODAyMTFfcmFkaW90YXBfaGVfbXUpCiAqIEBSWF9GTEFH X1JBRElPVEFQX0xTSUc6IEwtU0lHIHJhZGlvdGFwIGRhdGEgaXMgcHJlc2VudAogKiBAUlhfRkxB R19OT19QU0RVOiB1c2UgdGhlIGZyYW1lIG9ubHkgZm9yIHJhZGlvdGFwIHJlcG9ydGluZywgd2l0 aAogKgl0aGUgIjAtbGVuZ3RoIFBTRFUiIGZpZWxkIGluY2x1ZGVkIHRoZXJlLiAgVGhlIHZhbHVl IGZvciBpdCBpcwogKglpbiAmc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMuICBOb3RlIHRoYXQg aWYgdGhpcyB2YWx1ZSBpc24ndAogKglrbm93biB0aGUgZnJhbWUgc2hvdWxkbid0IGJlIHJlcG9y dGVkLgogKi8KZW51bSBtYWM4MDIxMV9yeF9mbGFncyB7CglSWF9GTEFHX01NSUNfRVJST1IJCT0g QklUKDApLAoJUlhfRkxBR19ERUNSWVBURUQJCT0gQklUKDEpLAoJUlhfRkxBR19NQUNUSU1FX1BM Q1BfU1RBUlQJPSBCSVQoMiksCglSWF9GTEFHX01NSUNfU1RSSVBQRUQJCT0gQklUKDMpLAoJUlhf RkxBR19JVl9TVFJJUFBFRAkJPSBCSVQoNCksCglSWF9GTEFHX0ZBSUxFRF9GQ1NfQ1JDCQk9IEJJ VCg1KSwKCVJYX0ZMQUdfRkFJTEVEX1BMQ1BfQ1JDIAk9IEJJVCg2KSwKCVJYX0ZMQUdfTUFDVElN RV9TVEFSVAkJPSBCSVQoNyksCglSWF9GTEFHX05PX1NJR05BTF9WQUwJCT0gQklUKDgpLAoJUlhf RkxBR19BTVBEVV9ERVRBSUxTCQk9IEJJVCg5KSwKCVJYX0ZMQUdfUE5fVkFMSURBVEVECQk9IEJJ VCgxMCksCglSWF9GTEFHX0RVUF9WQUxJREFURUQJCT0gQklUKDExKSwKCVJYX0ZMQUdfQU1QRFVf TEFTVF9LTk9XTgk9IEJJVCgxMiksCglSWF9GTEFHX0FNUERVX0lTX0xBU1QJCT0gQklUKDEzKSwK CVJYX0ZMQUdfQU1QRFVfREVMSU1fQ1JDX0VSUk9SCT0gQklUKDE0KSwKCVJYX0ZMQUdfQU1QRFVf REVMSU1fQ1JDX0tOT1dOCT0gQklUKDE1KSwKCVJYX0ZMQUdfTUFDVElNRV9FTkQJCT0gQklUKDE2 KSwKCVJYX0ZMQUdfT05MWV9NT05JVE9SCQk9IEJJVCgxNyksCglSWF9GTEFHX1NLSVBfTU9OSVRP UgkJPSBCSVQoMTgpLAoJUlhfRkxBR19BTVNEVV9NT1JFCQk9IEJJVCgxOSksCglSWF9GTEFHX1JB RElPVEFQX1ZFTkRPUl9EQVRBCT0gQklUKDIwKSwKCVJYX0ZMQUdfTUlDX1NUUklQUEVECQk9IEJJ VCgyMSksCglSWF9GTEFHX0FMTE9XX1NBTUVfUE4JCT0gQklUKDIyKSwKCVJYX0ZMQUdfSUNWX1NU UklQUEVECQk9IEJJVCgyMyksCglSWF9GTEFHX0FNUERVX0VPRl9CSVQJCT0gQklUKDI0KSwKCVJY X0ZMQUdfQU1QRFVfRU9GX0JJVF9LTk9XTgk9IEJJVCgyNSksCglSWF9GTEFHX1JBRElPVEFQX0hF CQk9IEJJVCgyNiksCglSWF9GTEFHX1JBRElPVEFQX0hFX01VCQk9IEJJVCgyNyksCglSWF9GTEFH X1JBRElPVEFQX0xTSUcJCT0gQklUKDI4KSwKCVJYX0ZMQUdfTk9fUFNEVQkJCT0gQklUKDI5KSwK fTsKCi8qKgogKiBlbnVtIG1hYzgwMjExX3J4X2VuY29kaW5nX2ZsYWdzIC0gTUNTICYgYmFuZHdp ZHRoIGZsYWdzCiAqCiAqIEBSWF9FTkNfRkxBR19TSE9SVFBSRTogU2hvcnQgcHJlYW1ibGUgd2Fz IHVzZWQgZm9yIHRoaXMgZnJhbWUKICogQFJYX0VOQ19GTEFHX1NIT1JUX0dJOiBTaG9ydCBndWFy ZCBpbnRlcnZhbCB3YXMgdXNlZAogKiBAUlhfRU5DX0ZMQUdfSFRfR0Y6IFRoaXMgZnJhbWUgd2Fz IHJlY2VpdmVkIGluIGEgSFQtZ3JlZW5maWVsZCB0cmFuc21pc3Npb24sCiAqCWlmIHRoZSBkcml2 ZXIgZmlsbHMgdGhpcyB2YWx1ZSBpdCBzaG91bGQgYWRkCiAqCSVJRUVFODAyMTFfUkFESU9UQVBf TUNTX0hBVkVfRk1UCiAqCXRvIEBody5yYWRpb3RhcF9tY3NfZGV0YWlscyB0byBhZHZlcnRpc2Ug dGhhdCBmYWN0LgogKiBAUlhfRU5DX0ZMQUdfTERQQzogTERQQyB3YXMgdXNlZAogKiBAUlhfRU5D X0ZMQUdfU1RCQ19NQVNLOiBTVEJDIDIgYml0IGJpdG1hc2suIDEgLSBOc3M9MSwgMiAtIE5zcz0y LCAzIC0gTnNzPTMKICogQFJYX0VOQ19GTEFHX0JGOiBwYWNrZXQgd2FzIGJlYW1mb3JtZWQKICov CmVudW0gbWFjODAyMTFfcnhfZW5jb2RpbmdfZmxhZ3MgewoJUlhfRU5DX0ZMQUdfU0hPUlRQUkUJ CT0gQklUKDApLAoJUlhfRU5DX0ZMQUdfU0hPUlRfR0kJCT0gQklUKDIpLAoJUlhfRU5DX0ZMQUdf SFRfR0YJCT0gQklUKDMpLAoJUlhfRU5DX0ZMQUdfU1RCQ19NQVNLCQk9IEJJVCg0KSB8IEJJVCg1 KSwKCVJYX0VOQ19GTEFHX0xEUEMJCT0gQklUKDYpLAoJUlhfRU5DX0ZMQUdfQkYJCQk9IEJJVCg3 KSwKfTsKCiNkZWZpbmUgUlhfRU5DX0ZMQUdfU1RCQ19TSElGVAkJNAoKZW51bSBtYWM4MDIxMV9y eF9lbmNvZGluZyB7CglSWF9FTkNfTEVHQUNZID0gMCwKCVJYX0VOQ19IVCwKCVJYX0VOQ19WSFQs CglSWF9FTkNfSEUsCn07CgovKioKICogc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgLSByZWNl aXZlIHN0YXR1cwogKgogKiBUaGUgbG93LWxldmVsIGRyaXZlciBzaG91bGQgcHJvdmlkZSB0aGlz IGluZm9ybWF0aW9uICh0aGUgc3Vic2V0CiAqIHN1cHBvcnRlZCBieSBoYXJkd2FyZSkgdG8gdGhl IDgwMi4xMSBjb2RlIHdpdGggZWFjaCByZWNlaXZlZAogKiBmcmFtZSwgaW4gdGhlIHNrYidzIGNv bnRyb2wgYnVmZmVyIChjYikuCiAqCiAqIEBtYWN0aW1lOiB2YWx1ZSBpbiBtaWNyb3NlY29uZHMg b2YgdGhlIDY0LWJpdCBUaW1lIFN5bmNocm9uaXphdGlvbiBGdW5jdGlvbgogKiAJKFRTRikgdGlt ZXIgd2hlbiB0aGUgZmlyc3QgZGF0YSBzeW1ib2wgKE1QRFUpIGFycml2ZWQgYXQgdGhlIGhhcmR3 YXJlLgogKiBAYm9vdHRpbWVfbnM6IENMT0NLX0JPT1RUSU1FIHRpbWVzdGFtcCB0aGUgZnJhbWUg d2FzIHJlY2VpdmVkIGF0LCB0aGlzIGlzCiAqCW5lZWRlZCBvbmx5IGZvciBiZWFjb25zIGFuZCBw cm9iZSByZXNwb25zZXMgdGhhdCB1cGRhdGUgdGhlIHNjYW4gY2FjaGUuCiAqIEBkZXZpY2VfdGlt ZXN0YW1wOiBhcmJpdHJhcnkgdGltZXN0YW1wIGZvciB0aGUgZGV2aWNlLCBtYWM4MDIxMSBkb2Vz bid0IHVzZQogKglpdCBidXQgY2FuIHN0b3JlIGl0IGFuZCBwYXNzIGl0IGJhY2sgdG8gdGhlIGRy aXZlciBmb3Igc3luY2hyb25pc2F0aW9uCiAqIEBiYW5kOiB0aGUgYWN0aXZlIGJhbmQgd2hlbiB0 aGlzIGZyYW1lIHdhcyByZWNlaXZlZAogKiBAZnJlcTogZnJlcXVlbmN5IHRoZSByYWRpbyB3YXMg dHVuZWQgdG8gd2hlbiByZWNlaXZpbmcgdGhpcyBmcmFtZSwgaW4gTUh6CiAqCVRoaXMgZmllbGQg bXVzdCBiZSBzZXQgZm9yIG1hbmFnZW1lbnQgZnJhbWVzLCBidXQgaXNuJ3Qgc3RyaWN0bHkgbmVl ZGVkCiAqCWZvciBkYXRhIChvdGhlcikgZnJhbWVzIC0gZm9yIHRob3NlIGl0IG9ubHkgYWZmZWN0 cyByYWRpb3RhcCByZXBvcnRpbmcuCiAqIEBzaWduYWw6IHNpZ25hbCBzdHJlbmd0aCB3aGVuIHJl Y2VpdmluZyB0aGlzIGZyYW1lLCBlaXRoZXIgaW4gZEJtLCBpbiBkQiBvcgogKgl1bnNwZWNpZmll ZCBkZXBlbmRpbmcgb24gdGhlIGhhcmR3YXJlIGNhcGFiaWxpdGllcyBmbGFncwogKglASUVFRTgw MjExX0hXX1NJR05BTF8qCiAqIEBjaGFpbnM6IGJpdG1hc2sgb2YgcmVjZWl2ZSBjaGFpbnMgZm9y IHdoaWNoIHNlcGFyYXRlIHNpZ25hbCBzdHJlbmd0aAogKgl2YWx1ZXMgd2VyZSBmaWxsZWQuCiAq IEBjaGFpbl9zaWduYWw6IHBlci1jaGFpbiBzaWduYWwgc3RyZW5ndGgsIGluIGRCbSAodW5saWtl IEBzaWduYWwsIGRvZXNuJ3QKICoJc3VwcG9ydCBkQiBvciB1bnNwZWNpZmllZCB1bml0cykKICog QGFudGVubmE6IGFudGVubmEgdXNlZAogKiBAcmF0ZV9pZHg6IGluZGV4IG9mIGRhdGEgcmF0ZSBp bnRvIGJhbmQncyBzdXBwb3J0ZWQgcmF0ZXMgb3IgTUNTIGluZGV4IGlmCiAqCUhUIG9yIFZIVCBp cyB1c2VkICglUlhfRkxBR19IVC8lUlhfRkxBR19WSFQpCiAqIEBuc3M6IG51bWJlciBvZiBzdHJl YW1zIChWSFQgYW5kIEhFIG9ubHkpCiAqIEBmbGFnOiAlUlhfRkxBR19cKgogKiBAZW5jb2Rpbmc6 ICZlbnVtIG1hYzgwMjExX3J4X2VuY29kaW5nCiAqIEBidzogJmVudW0gcmF0ZV9pbmZvX2J3CiAq IEBlbmNfZmxhZ3M6IHVzZXMgYml0cyBmcm9tICZlbnVtIG1hYzgwMjExX3J4X2VuY29kaW5nX2Zs YWdzCiAqIEBoZV9ydTogSEUgUlUsIGZyb20gJmVudW0gbmw4MDIxMV9oZV9ydV9hbGxvYwogKiBA aGVfZ2k6IEhFIEdJLCBmcm9tICZlbnVtIG5sODAyMTFfaGVfZ2kKICogQGhlX2RjbTogSEUgRENN IHZhbHVlCiAqIEByeF9mbGFnczogaW50ZXJuYWwgUlggZmxhZ3MgZm9yIG1hYzgwMjExCiAqIEBh bXBkdV9yZWZlcmVuY2U6IEEtTVBEVSByZWZlcmVuY2UgbnVtYmVyLCBtdXN0IGJlIGEgZGlmZmVy ZW50IHZhbHVlIGZvcgogKgllYWNoIEEtTVBEVSBidXQgdGhlIHNhbWUgZm9yIGVhY2ggc3ViZnJh bWUgd2l0aGluIG9uZSBBLU1QRFUKICogQGFtcGR1X2RlbGltaXRlcl9jcmM6IEEtTVBEVSBkZWxp bWl0ZXIgQ1JDCiAqIEB6ZXJvX2xlbmd0aF9wc2R1X3R5cGU6IHJhZGlvdGFwIHR5cGUgb2YgdGhl IDAtbGVuZ3RoIFBTRFUKICovCnN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzIHsKCXU2NCBtYWN0 aW1lOwoJdTY0IGJvb3R0aW1lX25zOwoJdTMyIGRldmljZV90aW1lc3RhbXA7Cgl1MzIgYW1wZHVf cmVmZXJlbmNlOwoJdTMyIGZsYWc7Cgl1MTYgZnJlcTsKCXU4IGVuY19mbGFnczsKCXU4IGVuY29k aW5nOjIsIGJ3OjMsIGhlX3J1OjM7Cgl1OCBoZV9naToyLCBoZV9kY206MTsKCXU4IHJhdGVfaWR4 OwoJdTggbnNzOwoJdTggcnhfZmxhZ3M7Cgl1OCBiYW5kOwoJdTggYW50ZW5uYTsKCXM4IHNpZ25h bDsKCXU4IGNoYWluczsKCXM4IGNoYWluX3NpZ25hbFtJRUVFODAyMTFfTUFYX0NIQUlOU107Cgl1 OCBhbXBkdV9kZWxpbWl0ZXJfY3JjOwoJdTggemVyb19sZW5ndGhfcHNkdV90eXBlOwp9OwoKLyoq CiAqIHN0cnVjdCBpZWVlODAyMTFfdmVuZG9yX3JhZGlvdGFwIC0gdmVuZG9yIHJhZGlvdGFwIGRh dGEgaW5mb3JtYXRpb24KICogQHByZXNlbnQ6IHByZXNlbmNlIGJpdG1hcCBmb3IgdGhpcyB2ZW5k b3IgbmFtZXNwYWNlCiAqCSh0aGlzIGNvdWxkIGJlIGV4dGVuZGVkIGluIHRoZSBmdXR1cmUgaWYg YW55IHZlbmRvciBuZWVkcyBtb3JlCiAqCSBiaXRzLCB0aGUgcmFkaW90YXAgc3BlYyBkb2VzIGFs bG93IGZvciB0aGF0KQogKiBAYWxpZ246IHJhZGlvdGFwIHZlbmRvciBuYW1lc3BhY2UgYWxpZ25t ZW50LiBUaGlzIGRlZmluZXMgdGhlIG5lZWRlZAogKglhbGlnbm1lbnQgZm9yIHRoZSBAZGF0YSBm aWVsZCBiZWxvdywgbm90IGZvciB0aGUgdmVuZG9yIG5hbWVzcGFjZQogKglkZXNjcmlwdGlvbiBp dHNlbGYgKHdoaWNoIGhhcyBhIGZpeGVkIDItYnl0ZSBhbGlnbm1lbnQpCiAqCU11c3QgYmUgYSBw b3dlciBvZiB0d28sIGFuZCBiZSBzZXQgdG8gYXQgbGVhc3QgMSEKICogQG91aTogcmFkaW90YXAg dmVuZG9yIG5hbWVzcGFjZSBPVUkKICogQHN1Ym5zOiByYWRpb3RhcCB2ZW5kb3Igc3ViIG5hbWVz cGFjZQogKiBAbGVuOiByYWRpb3RhcCB2ZW5kb3Igc3ViIG5hbWVzcGFjZSBza2lwIGxlbmd0aCwg aWYgYWxpZ25tZW50IGlzIGRvbmUKICoJdGhlbiB0aGF0J3MgYWRkZWQgdG8gdGhpcywgaS5lLiB0 aGlzIGlzIG9ubHkgdGhlIGxlbmd0aCBvZiB0aGUKICoJQGRhdGEgZmllbGQuCiAqIEBwYWQ6IG51 bWJlciBvZiBieXRlcyBvZiBwYWRkaW5nIGFmdGVyIHRoZSBAZGF0YSwgdGhpcyBleGlzdHMgc28g dGhhdAogKgl0aGUgc2tiIGRhdGEgYWxpZ25tZW50IGNhbiBiZSBwcmVzZXJ2ZWQgZXZlbiBpZiB0 aGUgZGF0YSBoYXMgb2RkCiAqCWxlbmd0aAogKiBAZGF0YTogdGhlIGFjdHVhbCB2ZW5kb3IgbmFt ZXNwYWNlIGRhdGEKICoKICogVGhpcyBzdHJ1Y3QsIGluY2x1ZGluZyB0aGUgdmVuZG9yIGRhdGEs IGdvZXMgaW50byB0aGUgc2tiLT5kYXRhIGJlZm9yZQogKiB0aGUgODAyLjExIGhlYWRlci4gSXQn cyBzcGxpdCB1cCBpbiBtYWM4MDIxMSB1c2luZyB0aGUgYWxpZ24vb3VpL3N1Ym5zCiAqIGRhdGEu CiAqLwpzdHJ1Y3QgaWVlZTgwMjExX3ZlbmRvcl9yYWRpb3RhcCB7Cgl1MzIgcHJlc2VudDsKCXU4 IGFsaWduOwoJdTggb3VpWzNdOwoJdTggc3VibnM7Cgl1OCBwYWQ7Cgl1MTYgbGVuOwoJdTggZGF0 YVtdOwp9IF9fcGFja2VkOwoKLyoqCiAqIGVudW0gaWVlZTgwMjExX2NvbmZfZmxhZ3MgLSBjb25m aWd1cmF0aW9uIGZsYWdzCiAqCiAqIEZsYWdzIHRvIGRlZmluZSBQSFkgY29uZmlndXJhdGlvbiBv cHRpb25zCiAqCiAqIEBJRUVFODAyMTFfQ09ORl9NT05JVE9SOiB0aGVyZSdzIGEgbW9uaXRvciBp bnRlcmZhY2UgcHJlc2VudCAtLSB1c2UgdGhpcwogKgl0byBkZXRlcm1pbmUgZm9yIGV4YW1wbGUg d2hldGhlciB0byBjYWxjdWxhdGUgdGltZXN0YW1wcyBmb3IgcGFja2V0cwogKglvciBub3QsIGRv IG5vdCB1c2UgaW5zdGVhZCBvZiBmaWx0ZXIgZmxhZ3MhCiAqIEBJRUVFODAyMTFfQ09ORl9QUzog RW5hYmxlIDgwMi4xMSBwb3dlciBzYXZlIG1vZGUgKG1hbmFnZWQgbW9kZSBvbmx5KS4KICoJVGhp cyBpcyB0aGUgcG93ZXIgc2F2ZSBtb2RlIGRlZmluZWQgYnkgSUVFRSA4MDIuMTEtMjAwNyBzZWN0 aW9uIDExLjIsCiAqCW1lYW5pbmcgdGhhdCB0aGUgaGFyZHdhcmUgc3RpbGwgd2FrZXMgdXAgZm9y IGJlYWNvbnMsIGlzIGFibGUgdG8KICoJdHJhbnNtaXQgZnJhbWVzIGFuZCByZWNlaXZlIHRoZSBw b3NzaWJsZSBhY2tub3dsZWRnbWVudCBmcmFtZXMuCiAqCU5vdCB0byBiZSBjb25mdXNlZCB3aXRo IGhhcmR3YXJlIHNwZWNpZmljIHdha2V1cC9zbGVlcCBzdGF0ZXMsCiAqCWRyaXZlciBpcyByZXNw b25zaWJsZSBmb3IgdGhhdC4gU2VlIHRoZSBzZWN0aW9uICJQb3dlcnNhdmUgc3VwcG9ydCIKICoJ Zm9yIG1vcmUuCiAqIEBJRUVFODAyMTFfQ09ORl9JRExFOiBUaGUgZGV2aWNlIGlzIHJ1bm5pbmcs IGJ1dCBpZGxlOyBpZiB0aGUgZmxhZyBpcyBzZXQKICoJdGhlIGRyaXZlciBzaG91bGQgYmUgcHJl cGFyZWQgdG8gaGFuZGxlIGNvbmZpZ3VyYXRpb24gcmVxdWVzdHMgYnV0CiAqCW1heSB0dXJuIHRo ZSBkZXZpY2Ugb2ZmIGFzIG11Y2ggYXMgcG9zc2libGUuIFR5cGljYWxseSwgdGhpcyBmbGFnIHdp bGwKICoJYmUgc2V0IHdoZW4gYW4gaW50ZXJmYWNlIGlzIHNldCBVUCBidXQgbm90IGFzc29jaWF0 ZWQgb3Igc2Nhbm5pbmcsIGJ1dAogKglpdCBjYW4gYWxzbyBiZSB1bnNldCBpbiB0aGF0IGNhc2Ug d2hlbiBtb25pdG9yIGludGVyZmFjZXMgYXJlIGFjdGl2ZS4KICogQElFRUU4MDIxMV9DT05GX09G RkNIQU5ORUw6IFRoZSBkZXZpY2UgaXMgY3VycmVudGx5IG5vdCBvbiBpdHMgbWFpbgogKglvcGVy YXRpbmcgY2hhbm5lbC4KICovCmVudW0gaWVlZTgwMjExX2NvbmZfZmxhZ3MgewoJSUVFRTgwMjEx X0NPTkZfTU9OSVRPUgkJPSAoMTw8MCksCglJRUVFODAyMTFfQ09ORl9QUwkJPSAoMTw8MSksCglJ RUVFODAyMTFfQ09ORl9JRExFCQk9ICgxPDwyKSwKCUlFRUU4MDIxMV9DT05GX09GRkNIQU5ORUwJ PSAoMTw8MyksCn07CgoKLyoqCiAqIGVudW0gaWVlZTgwMjExX2NvbmZfY2hhbmdlZCAtIGRlbm90 ZXMgd2hpY2ggY29uZmlndXJhdGlvbiBjaGFuZ2VkCiAqCiAqIEBJRUVFODAyMTFfQ09ORl9DSEFO R0VfTElTVEVOX0lOVEVSVkFMOiB0aGUgbGlzdGVuIGludGVydmFsIGNoYW5nZWQKICogQElFRUU4 MDIxMV9DT05GX0NIQU5HRV9NT05JVE9SOiB0aGUgbW9uaXRvciBmbGFnIGNoYW5nZWQKICogQElF RUU4MDIxMV9DT05GX0NIQU5HRV9QUzogdGhlIFBTIGZsYWcgb3IgZHluYW1pYyBQUyB0aW1lb3V0 IGNoYW5nZWQKICogQElFRUU4MDIxMV9DT05GX0NIQU5HRV9QT1dFUjogdGhlIFRYIHBvd2VyIGNo YW5nZWQKICogQElFRUU4MDIxMV9DT05GX0NIQU5HRV9DSEFOTkVMOiB0aGUgY2hhbm5lbC9jaGFu bmVsX3R5cGUgY2hhbmdlZAogKiBASUVFRTgwMjExX0NPTkZfQ0hBTkdFX1JFVFJZX0xJTUlUUzog cmV0cnkgbGltaXRzIGNoYW5nZWQKICogQElFRUU4MDIxMV9DT05GX0NIQU5HRV9JRExFOiBJZGxl IGZsYWcgY2hhbmdlZAogKiBASUVFRTgwMjExX0NPTkZfQ0hBTkdFX1NNUFM6IFNwYXRpYWwgbXVs dGlwbGV4aW5nIHBvd2Vyc2F2ZSBtb2RlIGNoYW5nZWQKICoJTm90ZSB0aGF0IHRoaXMgaXMgb25s eSB2YWxpZCBpZiBjaGFubmVsIGNvbnRleHRzIGFyZSBub3QgdXNlZCwKICoJb3RoZXJ3aXNlIGVh Y2ggY2hhbm5lbCBjb250ZXh0IGhhcyB0aGUgbnVtYmVyIG9mIGNoYWlucyBsaXN0ZWQuCiAqLwpl bnVtIGllZWU4MDIxMV9jb25mX2NoYW5nZWQgewoJSUVFRTgwMjExX0NPTkZfQ0hBTkdFX1NNUFMJ CT0gQklUKDEpLAoJSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0xJU1RFTl9JTlRFUlZBTAk9IEJJVCgy KSwKCUlFRUU4MDIxMV9DT05GX0NIQU5HRV9NT05JVE9SCQk9IEJJVCgzKSwKCUlFRUU4MDIxMV9D T05GX0NIQU5HRV9QUwkJPSBCSVQoNCksCglJRUVFODAyMTFfQ09ORl9DSEFOR0VfUE9XRVIJCT0g QklUKDUpLAoJSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwJCT0gQklUKDYpLAoJSUVFRTgw MjExX0NPTkZfQ0hBTkdFX1JFVFJZX0xJTUlUUwk9IEJJVCg3KSwKCUlFRUU4MDIxMV9DT05GX0NI QU5HRV9JRExFCQk9IEJJVCg4KSwKfTsKCi8qKgogKiBlbnVtIGllZWU4MDIxMV9zbXBzX21vZGUg LSBzcGF0aWFsIG11bHRpcGxleGluZyBwb3dlciBzYXZlIG1vZGUKICoKICogQElFRUU4MDIxMV9T TVBTX0FVVE9NQVRJQzogYXV0b21hdGljCiAqIEBJRUVFODAyMTFfU01QU19PRkY6IG9mZgogKiBA SUVFRTgwMjExX1NNUFNfU1RBVElDOiBzdGF0aWMKICogQElFRUU4MDIxMV9TTVBTX0RZTkFNSUM6 IGR5bmFtaWMKICogQElFRUU4MDIxMV9TTVBTX05VTV9NT0RFUzogaW50ZXJuYWwsIGRvbid0IHVz ZQogKi8KZW51bSBpZWVlODAyMTFfc21wc19tb2RlIHsKCUlFRUU4MDIxMV9TTVBTX0FVVE9NQVRJ QywKCUlFRUU4MDIxMV9TTVBTX09GRiwKCUlFRUU4MDIxMV9TTVBTX1NUQVRJQywKCUlFRUU4MDIx MV9TTVBTX0RZTkFNSUMsCgoJLyoga2VlcCBsYXN0ICovCglJRUVFODAyMTFfU01QU19OVU1fTU9E RVMsCn07CgovKioKICogc3RydWN0IGllZWU4MDIxMV9jb25mIC0gY29uZmlndXJhdGlvbiBvZiB0 aGUgZGV2aWNlCiAqCiAqIFRoaXMgc3RydWN0IGluZGljYXRlcyBob3cgdGhlIGRyaXZlciBzaGFs bCBjb25maWd1cmUgdGhlIGhhcmR3YXJlLgogKgogKiBAZmxhZ3M6IGNvbmZpZ3VyYXRpb24gZmxh Z3MgZGVmaW5lZCBhYm92ZQogKgogKiBAbGlzdGVuX2ludGVydmFsOiBsaXN0ZW4gaW50ZXJ2YWwg aW4gdW5pdHMgb2YgYmVhY29uIGludGVydmFsCiAqIEBwc19kdGltX3BlcmlvZDogVGhlIERUSU0g cGVyaW9kIG9mIHRoZSBBUCB3ZSdyZSBjb25uZWN0ZWQgdG8sIGZvciB1c2UKICoJaW4gcG93ZXIg c2F2aW5nLiBQb3dlciBzYXZpbmcgd2lsbCBub3QgYmUgZW5hYmxlZCB1bnRpbCBhIGJlYWNvbgog KgloYXMgYmVlbiByZWNlaXZlZCBhbmQgdGhlIERUSU0gcGVyaW9kIGlzIGtub3duLgogKiBAZHlu YW1pY19wc190aW1lb3V0OiBUaGUgZHluYW1pYyBwb3dlcnNhdmUgdGltZW91dCAoaW4gbXMpLCBz ZWUgdGhlCiAqCXBvd2Vyc2F2ZSBkb2N1bWVudGF0aW9uIGJlbG93LiBUaGlzIHZhcmlhYmxlIGlz IHZhbGlkIG9ubHkgd2hlbgogKgl0aGUgQ09ORl9QUyBmbGFnIGlzIHNldC4KICoKICogQHBvd2Vy X2xldmVsOiByZXF1ZXN0ZWQgdHJhbnNtaXQgcG93ZXIgKGluIGRCbSksIGJhY2t3YXJkIGNvbXBh dGliaWxpdHkKICoJdmFsdWUgb25seSB0aGF0IGlzIHNldCB0byB0aGUgbWluaW11bSBvZiBhbGwg aW50ZXJmYWNlcwogKgogKiBAY2hhbmRlZjogdGhlIGNoYW5uZWwgZGVmaW5pdGlvbiB0byB0dW5l IHRvCiAqIEByYWRhcl9lbmFibGVkOiB3aGV0aGVyIHJhZGFyIGRldGVjdGlvbiBpcyBlbmFibGVk CiAqCiAqIEBsb25nX2ZyYW1lX21heF90eF9jb3VudDogTWF4aW11bSBudW1iZXIgb2YgdHJhbnNt aXNzaW9ucyBmb3IgYSAibG9uZyIgZnJhbWUKICoJKGEgZnJhbWUgbm90IFJUUyBwcm90ZWN0ZWQp LCBjYWxsZWQgImRvdDExTG9uZ1JldHJ5TGltaXQiIGluIDgwMi4xMSwKICoJYnV0IGFjdHVhbGx5 IG1lYW5zIHRoZSBudW1iZXIgb2YgdHJhbnNtaXNzaW9ucyBub3QgdGhlIG51bWJlciBvZiByZXRy aWVzCiAqIEBzaG9ydF9mcmFtZV9tYXhfdHhfY291bnQ6IE1heGltdW0gbnVtYmVyIG9mIHRyYW5z bWlzc2lvbnMgZm9yIGEgInNob3J0IgogKglmcmFtZSwgY2FsbGVkICJkb3QxMVNob3J0UmV0cnlM aW1pdCIgaW4gODAyLjExLCBidXQgYWN0dWFsbHkgbWVhbnMgdGhlCiAqCW51bWJlciBvZiB0cmFu c21pc3Npb25zIG5vdCB0aGUgbnVtYmVyIG9mIHJldHJpZXMKICoKICogQHNtcHNfbW9kZTogc3Bh dGlhbCBtdWx0aXBsZXhpbmcgcG93ZXJzYXZlIG1vZGU7IG5vdGUgdGhhdAogKgklSUVFRTgwMjEx X1NNUFNfU1RBVElDIGlzIHVzZWQgd2hlbiB0aGUgZGV2aWNlIGlzIG5vdAogKgljb25maWd1cmVk IGZvciBhbiBIVCBjaGFubmVsLgogKglOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IHZhbGlkIGlmIGNo YW5uZWwgY29udGV4dHMgYXJlIG5vdCB1c2VkLAogKglvdGhlcndpc2UgZWFjaCBjaGFubmVsIGNv bnRleHQgaGFzIHRoZSBudW1iZXIgb2YgY2hhaW5zIGxpc3RlZC4KICovCnN0cnVjdCBpZWVlODAy MTFfY29uZiB7Cgl1MzIgZmxhZ3M7CglpbnQgcG93ZXJfbGV2ZWwsIGR5bmFtaWNfcHNfdGltZW91 dDsKCgl1MTYgbGlzdGVuX2ludGVydmFsOwoJdTggcHNfZHRpbV9wZXJpb2Q7CgoJdTggbG9uZ19m cmFtZV9tYXhfdHhfY291bnQsIHNob3J0X2ZyYW1lX21heF90eF9jb3VudDsKCglzdHJ1Y3QgY2Zn ODAyMTFfY2hhbl9kZWYgY2hhbmRlZjsKCWJvb2wgcmFkYXJfZW5hYmxlZDsKCWVudW0gaWVlZTgw MjExX3NtcHNfbW9kZSBzbXBzX21vZGU7Cn07CgovKioKICogc3RydWN0IGllZWU4MDIxMV9jaGFu bmVsX3N3aXRjaCAtIGhvbGRzIHRoZSBjaGFubmVsIHN3aXRjaCBkYXRhCiAqCiAqIFRoZSBpbmZv cm1hdGlvbiBwcm92aWRlZCBpbiB0aGlzIHN0cnVjdHVyZSBpcyByZXF1aXJlZCBmb3IgY2hhbm5l bCBzd2l0Y2gKICogb3BlcmF0aW9uLgogKgogKiBAdGltZXN0YW1wOiB2YWx1ZSBpbiBtaWNyb3Nl Y29uZHMgb2YgdGhlIDY0LWJpdCBUaW1lIFN5bmNocm9uaXphdGlvbgogKglGdW5jdGlvbiAoVFNG KSB0aW1lciB3aGVuIHRoZSBmcmFtZSBjb250YWluaW5nIHRoZSBjaGFubmVsIHN3aXRjaAogKglh bm5vdW5jZW1lbnQgd2FzIHJlY2VpdmVkLiBUaGlzIGlzIHNpbXBseSB0aGUgcngubWFjdGltZSBw YXJhbWV0ZXIKICoJdGhlIGRyaXZlciBwYXNzZWQgaW50byBtYWM4MDIxMS4KICogQGRldmljZV90 aW1lc3RhbXA6IGFyYml0cmFyeSB0aW1lc3RhbXAgZm9yIHRoZSBkZXZpY2UsIHRoaXMgaXMgdGhl CiAqCXJ4LmRldmljZV90aW1lc3RhbXAgcGFyYW1ldGVyIHRoZSBkcml2ZXIgcGFzc2VkIHRvIG1h YzgwMjExLgogKiBAYmxvY2tfdHg6IEluZGljYXRlcyB3aGV0aGVyIHRyYW5zbWlzc2lvbiBtdXN0 IGJlIGJsb2NrZWQgYmVmb3JlIHRoZQogKglzY2hlZHVsZWQgY2hhbm5lbCBzd2l0Y2gsIGFzIGlu ZGljYXRlZCBieSB0aGUgQVAuCiAqIEBjaGFuZGVmOiB0aGUgbmV3IGNoYW5uZWwgdG8gc3dpdGNo IHRvCiAqIEBjb3VudDogdGhlIG51bWJlciBvZiBUQlRUJ3MgdW50aWwgdGhlIGNoYW5uZWwgc3dp dGNoIGV2ZW50CiAqIEBkZWxheTogbWF4aW11bSBkZWxheSBiZXR3ZWVuIHRoZSB0aW1lIHRoZSBB UCB0cmFuc21pdHRlZCB0aGUgbGFzdCBiZWFjb24gaW4KICAqCWN1cnJlbnQgY2hhbm5lbCBhbmQg dGhlIGV4cGVjdGVkIHRpbWUgb2YgdGhlIGZpcnN0IGJlYWNvbiBpbiB0aGUgbmV3CiAgKgljaGFu bmVsLCBleHByZXNzZWQgaW4gVFUuCiAqLwpzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfc3dpdGNo IHsKCXU2NCB0aW1lc3RhbXA7Cgl1MzIgZGV2aWNlX3RpbWVzdGFtcDsKCWJvb2wgYmxvY2tfdHg7 CglzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgY2hhbmRlZjsKCXU4IGNvdW50OwoJdTMyIGRlbGF5 Owp9OwoKLyoqCiAqIGVudW0gaWVlZTgwMjExX3ZpZl9mbGFncyAtIHZpcnR1YWwgaW50ZXJmYWNl IGZsYWdzCiAqCiAqIEBJRUVFODAyMTFfVklGX0JFQUNPTl9GSUxURVI6IHRoZSBkZXZpY2UgcGVy Zm9ybXMgYmVhY29uIGZpbHRlcmluZwogKglvbiB0aGlzIHZpcnR1YWwgaW50ZXJmYWNlIHRvIGF2 b2lkIHVubmVjZXNzYXJ5IENQVSB3YWtldXBzCiAqIEBJRUVFODAyMTFfVklGX1NVUFBPUlRTX0NR TV9SU1NJOiB0aGUgZGV2aWNlIGNhbiBkbyBjb25uZWN0aW9uIHF1YWxpdHkKICoJbW9uaXRvcmlu ZyBvbiB0aGlzIHZpcnR1YWwgaW50ZXJmYWNlIC0tIGkuZS4gaXQgY2FuIG1vbml0b3IKICoJY29u bmVjdGlvbiBxdWFsaXR5IHJlbGF0ZWQgcGFyYW1ldGVycywgc3VjaCBhcyB0aGUgUlNTSSBsZXZl bCBhbmQKICoJcHJvdmlkZSBub3RpZmljYXRpb25zIGlmIGNvbmZpZ3VyZWQgdHJpZ2dlciBsZXZl bHMgYXJlIHJlYWNoZWQuCiAqIEBJRUVFODAyMTFfVklGX1NVUFBPUlRTX1VBUFNEOiBUaGUgZGV2 aWNlIGNhbiBkbyBVLUFQU0QgZm9yIHRoaXMKICoJaW50ZXJmYWNlLiBUaGlzIGZsYWcgc2hvdWxk IGJlIHNldCBkdXJpbmcgaW50ZXJmYWNlIGFkZGl0aW9uLAogKglidXQgbWF5IGJlIHNldC9jbGVh cmVkIGFzIGxhdGUgYXMgYXV0aGVudGljYXRpb24gdG8gYW4gQVAuIEl0IGlzCiAqCW9ubHkgdmFs aWQgZm9yIG1hbmFnZWQvc3RhdGlvbiBtb2RlIGludGVyZmFjZXMuCiAqIEBJRUVFODAyMTFfVklG X0dFVF9OT0FfVVBEQVRFOiByZXF1ZXN0IHRvIGhhbmRsZSBOT0EgYXR0cmlidXRlcwogKglhbmQg c2VuZCBQMlBfUFMgbm90aWZpY2F0aW9uIHRvIHRoZSBkcml2ZXIgaWYgTk9BIGNoYW5nZWQsIGV2 ZW4KICoJdGhpcyBpcyBub3QgcHVyZSBQMlAgdmlmLgogKi8KZW51bSBpZWVlODAyMTFfdmlmX2Zs YWdzIHsKCUlFRUU4MDIxMV9WSUZfQkVBQ09OX0ZJTFRFUgkJPSBCSVQoMCksCglJRUVFODAyMTFf VklGX1NVUFBPUlRTX0NRTV9SU1NJCQk9IEJJVCgxKSwKCUlFRUU4MDIxMV9WSUZfU1VQUE9SVFNf VUFQU0QJCT0gQklUKDIpLAoJSUVFRTgwMjExX1ZJRl9HRVRfTk9BX1VQREFURQkJPSBCSVQoMyks Cn07CgovKioKICogc3RydWN0IGllZWU4MDIxMV92aWYgLSBwZXItaW50ZXJmYWNlIGRhdGEKICoK ICogRGF0YSBpbiB0aGlzIHN0cnVjdHVyZSBpcyBjb250aW51YWxseSBwcmVzZW50IGZvciBkcml2 ZXIKICogdXNlIGR1cmluZyB0aGUgbGlmZSBvZiBhIHZpcnR1YWwgaW50ZXJmYWNlLgogKgogKiBA dHlwZTogdHlwZSBvZiB0aGlzIHZpcnR1YWwgaW50ZXJmYWNlCiAqIEBic3NfY29uZjogQlNTIGNv bmZpZ3VyYXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlLCBlaXRoZXIgb3VyIG93bgogKglvciB0aGUg QlNTIHdlJ3JlIGFzc29jaWF0ZWQgdG8KICogQGFkZHI6IGFkZHJlc3Mgb2YgdGhpcyBpbnRlcmZh Y2UKICogQHAycDogaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBBUCBvciBTVEEgaW50ZXJmYWNlIGlz IGEgcDJwCiAqCWludGVyZmFjZSwgaS5lLiBhIEdPIG9yIHAycC1zdGEgcmVzcGVjdGl2ZWx5CiAq IEBjc2FfYWN0aXZlOiBtYXJrcyB3aGV0aGVyIGEgY2hhbm5lbCBzd2l0Y2ggaXMgZ29pbmcgb24u IEludGVybmFsbHkgaXQgaXMKICoJd3JpdGUtcHJvdGVjdGVkIGJ5IHNkYXRhX2xvY2sgYW5kIGxv Y2FsLT5tdHggc28gaG9sZGluZyBlaXRoZXIgaXMgZmluZQogKglmb3IgcmVhZCBhY2Nlc3MuCiAq IEBtdV9taW1vX293bmVyOiBpbmRpY2F0ZXMgaW50ZXJmYWNlIG93bnMgTVUtTUlNTyBjYXBhYmls aXR5CiAqIEBkcml2ZXJfZmxhZ3M6IGZsYWdzL2NhcGFiaWxpdGllcyB0aGUgZHJpdmVyIGhhcyBm b3IgdGhpcyBpbnRlcmZhY2UsCiAqCXRoZXNlIG5lZWQgdG8gYmUgc2V0IChvciBjbGVhcmVkKSB3 aGVuIHRoZSBpbnRlcmZhY2UgaXMgYWRkZWQKICoJb3IsIGlmIHN1cHBvcnRlZCBieSB0aGUgZHJp dmVyLCB0aGUgaW50ZXJmYWNlIHR5cGUgaXMgY2hhbmdlZAogKglhdCBydW50aW1lLCBtYWM4MDIx MSB3aWxsIG5ldmVyIHRvdWNoIHRoaXMgZmllbGQKICogQGh3X3F1ZXVlOiBoYXJkd2FyZSBxdWV1 ZSBmb3IgZWFjaCBBQwogKiBAY2FiX3F1ZXVlOiBjb250ZW50LWFmdGVyLWJlYWNvbiAoRFRJTSBi ZWFjb24gcmVhbGx5KSBxdWV1ZSwgQVAgbW9kZSBvbmx5CiAqIEBjaGFuY3R4X2NvbmY6IFRoZSBj aGFubmVsIGNvbnRleHQgdGhpcyBpbnRlcmZhY2UgaXMgYXNzaWduZWQgdG8sIG9yICVOVUxMCiAq CXdoZW4gaXQgaXMgbm90IGFzc2lnbmVkLiBUaGlzIHBvaW50ZXIgaXMgUkNVLXByb3RlY3RlZCBk dWUgdG8gdGhlIFRYCiAqCXBhdGggbmVlZGluZyB0byBhY2Nlc3MgaXQ7IGV2ZW4gdGhvdWdoIHRo ZSBuZXRkZXYgY2FycmllciB3aWxsIGFsd2F5cwogKgliZSBvZmYgd2hlbiBpdCBpcyAlTlVMTCB0 aGVyZSBjYW4gc3RpbGwgYmUgcmFjZXMgYW5kIHBhY2tldHMgY291bGQgYmUKICoJcHJvY2Vzc2Vk IGFmdGVyIGl0IHN3aXRjaGVzIGJhY2sgdG8gJU5VTEwuCiAqIEBkZWJ1Z2ZzX2RpcjogZGVidWdm cyBkZW50cnksIGNhbiBiZSB1c2VkIGJ5IGRyaXZlcnMgdG8gY3JlYXRlIG93biBwZXIKICoJaW50 ZXJmYWNlIGRlYnVnIGZpbGVzLiBOb3RlIHRoYXQgaXQgd2lsbCBiZSBOVUxMIGZvciB0aGUgdmly dHVhbAogKgltb25pdG9yIGludGVyZmFjZSAoaWYgdGhhdCBpcyByZXF1ZXN0ZWQuKQogKiBAcHJv YmVfcmVxX3JlZzogcHJvYmUgcmVxdWVzdHMgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIG1hYzgwMjEx IGZvciB0aGlzCiAqCWludGVyZmFjZS4KICogQGRydl9wcml2OiBkYXRhIGFyZWEgZm9yIGRyaXZl ciB1c2UsIHdpbGwgYWx3YXlzIGJlIGFsaWduZWQgdG8KICoJc2l6ZW9mKHZvaWQgXCopLgogKiBA dHhxOiB0aGUgbXVsdGljYXN0IGRhdGEgVFggcXVldWUgKGlmIGRyaXZlciB1c2VzIHRoZSBUWFEg YWJzdHJhY3Rpb24pCiAqIEB0eHFzX3N0b3BwZWQ6IHBlciBBQyBmbGFnIHRvIGluZGljYXRlIHRo YXQgaW50ZXJtZWRpYXRlIFRYUXMgYXJlIHN0b3BwZWQsCiAqCXByb3RlY3RlZCBieSBmcS0+bG9j ay4KICovCnN0cnVjdCBpZWVlODAyMTFfdmlmIHsKCWVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZTsK CXN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgYnNzX2NvbmY7Cgl1OCBhZGRyW0VUSF9BTEVOXSBf X2FsaWduZWQoMik7Cglib29sIHAycDsKCWJvb2wgY3NhX2FjdGl2ZTsKCWJvb2wgbXVfbWltb19v d25lcjsKCgl1OCBjYWJfcXVldWU7Cgl1OCBod19xdWV1ZVtJRUVFODAyMTFfTlVNX0FDU107CgoJ c3RydWN0IGllZWU4MDIxMV90eHEgKnR4cTsKCglzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHhfY29u ZiBfX3JjdSAqY2hhbmN0eF9jb25mOwoKCXUzMiBkcml2ZXJfZmxhZ3M7CgojaWZkZWYgQ09ORklH X01BQzgwMjExX0RFQlVHRlMKCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZGlyOwojZW5kaWYKCgl1 bnNpZ25lZCBpbnQgcHJvYmVfcmVxX3JlZzsKCglib29sIHR4cXNfc3RvcHBlZFtJRUVFODAyMTFf TlVNX0FDU107CgoJLyogbXVzdCBiZSBsYXN0ICovCgl1OCBkcnZfcHJpdlswXSBfX2FsaWduZWQo c2l6ZW9mKHZvaWQgKikpOwp9OwoKc3RhdGljIGlubGluZSBib29sIGllZWU4MDIxMV92aWZfaXNf bWVzaChzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQp7CiNpZmRlZiBDT05GSUdfTUFDODAyMTFf TUVTSAoJcmV0dXJuIHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOwojZW5k aWYKCXJldHVybiBmYWxzZTsKfQoKLyoqCiAqIHdkZXZfdG9faWVlZTgwMjExX3ZpZiAtIHJldHVy biBhIHZpZiBzdHJ1Y3QgZnJvbSBhIHdkZXYKICogQHdkZXY6IHRoZSB3ZGV2IHRvIGdldCB0aGUg dmlmIGZvcgogKgogKiBUaGlzIGNhbiBiZSB1c2VkIGJ5IG1hYzgwMjExIGRyaXZlcnMgd2l0aCBk aXJlY3QgY2ZnODAyMTEgQVBJcwogKiAobGlrZSB0aGUgdmVuZG9yIGNvbW1hbmRzKSB0aGF0IGdl dCBhIHdkZXYuCiAqCiAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gJU5VTEwg aWYgdGhlIGdpdmVuIHdkZXYgaXNuJ3QKICogYXNzb2NpYXRlZCB3aXRoIGEgdmlmIHRoYXQgdGhl IGRyaXZlciBrbm93cyBhYm91dCAoZS5nLiBtb25pdG9yCiAqIG9yIEFQX1ZMQU4gaW50ZXJmYWNl cy4pCiAqLwpzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqd2Rldl90b19pZWVlODAyMTFfdmlmKHN0cnVj dCB3aXJlbGVzc19kZXYgKndkZXYpOwoKLyoqCiAqIGllZWU4MDIxMV92aWZfdG9fd2RldiAtIHJl dHVybiBhIHdkZXYgc3RydWN0IGZyb20gYSB2aWYKICogQHZpZjogdGhlIHZpZiB0byBnZXQgdGhl IHdkZXYgZm9yCiAqCiAqIFRoaXMgY2FuIGJlIHVzZWQgYnkgbWFjODAyMTEgZHJpdmVycyB3aXRo IGRpcmVjdCBjZmc4MDIxMSBBUElzCiAqIChsaWtlIHRoZSB2ZW5kb3IgY29tbWFuZHMpIHRoYXQg bmVlZHMgdG8gZ2V0IHRoZSB3ZGV2IGZvciBhIHZpZi4KICoKICogTm90ZSB0aGF0IHRoaXMgZnVu Y3Rpb24gbWF5IHJldHVybiAlTlVMTCBpZiB0aGUgZ2l2ZW4gd2RldiBpc24ndAogKiBhc3NvY2lh dGVkIHdpdGggYSB2aWYgdGhhdCB0aGUgZHJpdmVyIGtub3dzIGFib3V0IChlLmcuIG1vbml0b3IK ICogb3IgQVBfVkxBTiBpbnRlcmZhY2VzLikKICovCnN0cnVjdCB3aXJlbGVzc19kZXYgKmllZWU4 MDIxMV92aWZfdG9fd2RldihzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKCi8qKgogKiBlbnVt IGllZWU4MDIxMV9rZXlfZmxhZ3MgLSBrZXkgZmxhZ3MKICoKICogVGhlc2UgZmxhZ3MgYXJlIHVz ZWQgZm9yIGNvbW11bmljYXRpb24gYWJvdXQga2V5cyBiZXR3ZWVuIHRoZSBkcml2ZXIKICogYW5k IG1hYzgwMjExLCB3aXRoIHRoZSBAZmxhZ3MgcGFyYW1ldGVyIG9mICZzdHJ1Y3QgaWVlZTgwMjEx X2tleV9jb25mLgogKgogKiBASUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWOiBUaGlzIGZs YWcgc2hvdWxkIGJlIHNldCBieSB0aGUKICoJZHJpdmVyIHRvIGluZGljYXRlIHRoYXQgaXQgcmVx dWlyZXMgSVYgZ2VuZXJhdGlvbiBmb3IgdGhpcwogKglwYXJ0aWN1bGFyIGtleS4gU2V0dGluZyB0 aGlzIGZsYWcgZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbiB0aGF0IFNLQnMKICoJd2lsbCBoYXZl IHN1ZmZpY2llbnQgdGFpbHJvb20gZm9yIElDViBvciBNSUMuCiAqIEBJRUVFODAyMTFfS0VZX0ZM QUdfR0VORVJBVEVfTU1JQzogVGhpcyBmbGFnIHNob3VsZCBiZSBzZXQgYnkKICoJdGhlIGRyaXZl ciBmb3IgYSBUS0lQIGtleSBpZiBpdCByZXF1aXJlcyBNaWNoYWVsIE1JQwogKglnZW5lcmF0aW9u IGluIHNvZnR3YXJlLgogKiBASUVFRTgwMjExX0tFWV9GTEFHX1BBSVJXSVNFOiBTZXQgYnkgbWFj ODAyMTEsIHRoaXMgZmxhZyBpbmRpY2F0ZXMKICoJdGhhdCB0aGUga2V5IGlzIHBhaXJ3aXNlIHJh dGhlciB0aGVuIGEgc2hhcmVkIGtleS4KICogQElFRUU4MDIxMV9LRVlfRkxBR19TV19NR01UX1RY OiBUaGlzIGZsYWcgc2hvdWxkIGJlIHNldCBieSB0aGUgZHJpdmVyIGZvciBhCiAqCUNDTVAvR0NN UCBrZXkgaWYgaXQgcmVxdWlyZXMgQ0NNUC9HQ01QIGVuY3J5cHRpb24gb2YgbWFuYWdlbWVudCBm cmFtZXMKICoJKE1GUCkgdG8gYmUgZG9uZSBpbiBzb2Z0d2FyZS4KICogQElFRUU4MDIxMV9LRVlf RkxBR19QVVRfSVZfU1BBQ0U6IFRoaXMgZmxhZyBzaG91bGQgYmUgc2V0IGJ5IHRoZSBkcml2ZXIK ICoJaWYgc3BhY2Ugc2hvdWxkIGJlIHByZXBhcmVkIGZvciB0aGUgSVYsIGJ1dCB0aGUgSVYKICoJ aXRzZWxmIHNob3VsZCBub3QgYmUgZ2VuZXJhdGVkLiBEbyBub3Qgc2V0IHRvZ2V0aGVyIHdpdGgK ICoJQElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JViBvbiB0aGUgc2FtZSBrZXkuIFNldHRp bmcgdGhpcyBmbGFnIGRvZXMKICoJbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdCBTS0JzIHdpbGwg aGF2ZSBzdWZmaWNpZW50IHRhaWxyb29tIGZvciBJQ1Ygb3IKICoJTUlDLgogKiBASUVFRTgwMjEx X0tFWV9GTEFHX1JYX01HTVQ6IFRoaXMga2V5IHdpbGwgYmUgdXNlZCB0byBkZWNyeXB0IHJlY2Vp dmVkCiAqCW1hbmFnZW1lbnQgZnJhbWVzLiBUaGUgZmxhZyBjYW4gaGVscCBkcml2ZXJzIHRoYXQg aGF2ZSBhIGhhcmR3YXJlCiAqCWNyeXB0byBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXNuJ3QgZGVh bCB3aXRoIG1hbmFnZW1lbnQgZnJhbWVzCiAqCXByb3Blcmx5IGJ5IGFsbG93aW5nIHRoZW0gdG8g bm90IHVwbG9hZCB0aGUga2V5cyB0byBoYXJkd2FyZSBhbmQKICoJZmFsbCBiYWNrIHRvIHNvZnR3 YXJlIGNyeXB0by4gTm90ZSB0aGF0IHRoaXMgZmxhZyBkZWFscyBvbmx5IHdpdGgKICoJUlgsIGlm IHlvdXIgY3J5cHRvIGVuZ2luZSBjYW4ndCBkZWFsIHdpdGggVFggeW91IGNhbiBhbHNvIHNldCB0 aGUKICoJJUlFRUU4MDIxMV9LRVlfRkxBR19TV19NR01UX1RYIGZsYWcgdG8gZW5jcnlwdCBzdWNo IGZyYW1lcyBpbiBTVy4KICogQElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVl9NR01UOiBU aGlzIGZsYWcgc2hvdWxkIGJlIHNldCBieSB0aGUKICoJZHJpdmVyIGZvciBhIENDTVAvR0NNUCBr ZXkgdG8gaW5kaWNhdGUgdGhhdCBpcyByZXF1aXJlcyBJViBnZW5lcmF0aW9uCiAqCW9ubHkgZm9y IG1hbmFnZW1lbnQgZnJhbWVzIChNRlApLgogKiBASUVFRTgwMjExX0tFWV9GTEFHX1JFU0VSVkVf VEFJTFJPT006IFRoaXMgZmxhZyBzaG91bGQgYmUgc2V0IGJ5IHRoZQogKglkcml2ZXIgZm9yIGEg a2V5IHRvIGluZGljYXRlIHRoYXQgc3VmZmljaWVudCB0YWlscm9vbSBtdXN0IGFsd2F5cwogKgli ZSByZXNlcnZlZCBmb3IgSUNWIG9yIE1JQywgZXZlbiB3aGVuIEhXIGVuY3J5cHRpb24gaXMgZW5h YmxlZC4KICogQElFRUU4MDIxMV9LRVlfRkxBR19QVVRfTUlDX1NQQUNFOiBUaGlzIGZsYWcgc2hv dWxkIGJlIHNldCBieSB0aGUgZHJpdmVyIGZvcgogKglhIFRLSVAga2V5IGlmIGl0IG9ubHkgcmVx dWlyZXMgTUlDIHNwYWNlLiBEbyBub3Qgc2V0IHRvZ2V0aGVyIHdpdGgKICoJQElFRUU4MDIxMV9L RVlfRkxBR19HRU5FUkFURV9NTUlDIG9uIHRoZSBzYW1lIGtleS4KICogQElFRUU4MDIxMV9LRVlf RkxBR19OT19BVVRPX1RYOiBLZXkgbmVlZHMgZXhwbGljaXQgVHggYWN0aXZhdGlvbi4KICogQElF RUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9NTUlFOiBUaGlzIGZsYWcgc2hvdWxkIGJlIHNldCBi eSB0aGUgZHJpdmVyCiAqCWZvciBhIEFFU19DTUFDIGtleSB0byBpbmRpY2F0ZSB0aGF0IGl0IHJl cXVpcmVzIHNlcXVlbmNlIG51bWJlcgogKglnZW5lcmF0aW9uIG9ubHkKICovCmVudW0gaWVlZTgw MjExX2tleV9mbGFncyB7CglJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVZfTUdNVAk9IEJJ VCgwKSwKCUlFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVgkJPSBCSVQoMSksCglJRUVFODAy MTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQwk9IEJJVCgyKSwKCUlFRUU4MDIxMV9LRVlfRkxBR19Q QUlSV0lTRQkJPSBCSVQoMyksCglJRUVFODAyMTFfS0VZX0ZMQUdfU1dfTUdNVF9UWAkJPSBCSVQo NCksCglJRUVFODAyMTFfS0VZX0ZMQUdfUFVUX0lWX1NQQUNFCQk9IEJJVCg1KSwKCUlFRUU4MDIx MV9LRVlfRkxBR19SWF9NR01UCQk9IEJJVCg2KSwKCUlFRUU4MDIxMV9LRVlfRkxBR19SRVNFUlZF X1RBSUxST09NCT0gQklUKDcpLAoJSUVFRTgwMjExX0tFWV9GTEFHX1BVVF9NSUNfU1BBQ0UJPSBC SVQoOCksCglJRUVFODAyMTFfS0VZX0ZMQUdfTk9fQVVUT19UWAkJPSBCSVQoOSksCglJRUVFODAy MTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JRQk9IEJJVCgxMCksCn07CgovKioKICogc3RydWN0IGll ZWU4MDIxMV9rZXlfY29uZiAtIGtleSBpbmZvcm1hdGlvbgogKgogKiBUaGlzIGtleSBpbmZvcm1h dGlvbiBpcyBnaXZlbiBieSBtYWM4MDIxMSB0byB0aGUgZHJpdmVyIGJ5CiAqIHRoZSBzZXRfa2V5 KCkgY2FsbGJhY2sgaW4gJnN0cnVjdCBpZWVlODAyMTFfb3BzLgogKgogKiBAaHdfa2V5X2lkeDog VG8gYmUgc2V0IGJ5IHRoZSBkcml2ZXIsIHRoaXMgaXMgdGhlIGtleSBpbmRleCB0aGUgZHJpdmVy CiAqCXdhbnRzIHRvIGJlIGdpdmVuIHdoZW4gYSBmcmFtZSBpcyB0cmFuc21pdHRlZCBhbmQgbmVl ZHMgdG8gYmUKICoJZW5jcnlwdGVkIGluIGhhcmR3YXJlLgogKiBAY2lwaGVyOiBUaGUga2V5J3Mg Y2lwaGVyIHN1aXRlIHNlbGVjdG9yLgogKiBAdHhfcG46IFBOIHVzZWQgZm9yIFRYIGtleXMsIG1h eSBiZSB1c2VkIGJ5IHRoZSBkcml2ZXIgYXMgd2VsbCBpZiBpdAogKgluZWVkcyB0byBkbyBzb2Z0 d2FyZSBQTiBhc3NpZ25tZW50IGJ5IGl0c2VsZiAoZS5nLiBkdWUgdG8gVFNPKQogKiBAZmxhZ3M6 IGtleSBmbGFncywgc2VlICZlbnVtIGllZWU4MDIxMV9rZXlfZmxhZ3MuCiAqIEBrZXlpZHg6IHRo ZSBrZXkgaW5kZXggKDAtMykKICogQGtleWxlbjoga2V5IG1hdGVyaWFsIGxlbmd0aAogKiBAa2V5 OiBrZXkgbWF0ZXJpYWwuIEZvciBBTEdfVEtJUCB0aGUga2V5IGlzIGVuY29kZWQgYXMgYSAyNTYt Yml0ICgzMiBieXRlKQogKiAJZGF0YSBibG9jazoKICogCS0gVGVtcG9yYWwgRW5jcnlwdGlvbiBL ZXkgKDEyOCBiaXRzKQogKiAJLSBUZW1wb3JhbCBBdXRoZW50aWNhdG9yIFR4IE1JQyBLZXkgKDY0 IGJpdHMpCiAqIAktIFRlbXBvcmFsIEF1dGhlbnRpY2F0b3IgUnggTUlDIEtleSAoNjQgYml0cykK ICogQGljdl9sZW46IFRoZSBJQ1YgbGVuZ3RoIGZvciB0aGlzIGtleSB0eXBlCiAqIEBpdl9sZW46 IFRoZSBJViBsZW5ndGggZm9yIHRoaXMga2V5IHR5cGUKICovCnN0cnVjdCBpZWVlODAyMTFfa2V5 X2NvbmYgewoJYXRvbWljNjRfdCB0eF9wbjsKCXUzMiBjaXBoZXI7Cgl1OCBpY3ZfbGVuOwoJdTgg aXZfbGVuOwoJdTggaHdfa2V5X2lkeDsKCXM4IGtleWlkeDsKCXUxNiBmbGFnczsKCXU4IGtleWxl bjsKCXU4IGtleVswXTsKfTsKCiNkZWZpbmUgSUVFRTgwMjExX01BWF9QTl9MRU4JMTYKCiNkZWZp bmUgVEtJUF9QTl9UT19JVjE2KHBuKSAoKHUxNikocG4gJiAweGZmZmYpKQojZGVmaW5lIFRLSVBf UE5fVE9fSVYzMihwbikgKCh1MzIpKChwbiA+PiAxNikgJiAweGZmZmZmZmZmKSkKCi8qKgogKiBz dHJ1Y3QgaWVlZTgwMjExX2tleV9zZXEgLSBrZXkgc2VxdWVuY2UgY291bnRlcgogKgogKiBAdGtp cDogVEtJUCBkYXRhLCBjb250YWluaW5nIElWMzIgYW5kIElWMTYgaW4gaG9zdCBieXRlIG9yZGVy CiAqIEBjY21wOiBQTiBkYXRhLCBtb3N0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKGJpZyBlbmRp YW4sCiAqCXJldmVyc2Ugb3JkZXIgdGhhbiBpbiBwYWNrZXQpCiAqIEBhZXNfY21hYzogUE4gZGF0 YSwgbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0IChiaWcgZW5kaWFuLAogKglyZXZlcnNlIG9y ZGVyIHRoYW4gaW4gcGFja2V0KQogKiBAYWVzX2dtYWM6IFBOIGRhdGEsIG1vc3Qgc2lnbmlmaWNh bnQgYnl0ZSBmaXJzdCAoYmlnIGVuZGlhbiwKICoJcmV2ZXJzZSBvcmRlciB0aGFuIGluIHBhY2tl dCkKICogQGdjbXA6IFBOIGRhdGEsIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCAoYmlnIGVu ZGlhbiwKICoJcmV2ZXJzZSBvcmRlciB0aGFuIGluIHBhY2tldCkKICogQGh3OiBkYXRhIGZvciBI Vy1vbmx5IChlLmcuIGNpcGhlciBzY2hlbWUpIGtleXMKICovCnN0cnVjdCBpZWVlODAyMTFfa2V5 X3NlcSB7Cgl1bmlvbiB7CgkJc3RydWN0IHsKCQkJdTMyIGl2MzI7CgkJCXUxNiBpdjE2OwoJCX0g dGtpcDsKCQlzdHJ1Y3QgewoJCQl1OCBwbls2XTsKCQl9IGNjbXA7CgkJc3RydWN0IHsKCQkJdTgg cG5bNl07CgkJfSBhZXNfY21hYzsKCQlzdHJ1Y3QgewoJCQl1OCBwbls2XTsKCQl9IGFlc19nbWFj OwoJCXN0cnVjdCB7CgkJCXU4IHBuWzZdOwoJCX0gZ2NtcDsKCQlzdHJ1Y3QgewoJCQl1OCBzZXFb SUVFRTgwMjExX01BWF9QTl9MRU5dOwoJCQl1OCBzZXFfbGVuOwoJCX0gaHc7Cgl9Owp9OwoKLyoq CiAqIHN0cnVjdCBpZWVlODAyMTFfY2lwaGVyX3NjaGVtZSAtIGNpcGhlciBzY2hlbWUKICoKICog VGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgYSBjaXBoZXIgc2NoZW1lIGluZm9ybWF0aW9uIGRlZmlu aW5nCiAqIHRoZSBzZWN1cmUgcGFja2V0IGNyeXB0byBoYW5kbGluZy4KICoKICogQGNpcGhlcjog YSBjaXBoZXIgc3VpdGUgc2VsZWN0b3IKICogQGlmdHlwZTogYSBjaXBoZXIgaWZ0eXBlIGJpdCBt YXNrIGluZGljYXRpbmcgYW4gYWxsb3dlZCBjaXBoZXIgdXNhZ2UKICogQGhkcl9sZW46IGEgbGVu Z3RoIG9mIGEgc2VjdXJpdHkgaGVhZGVyIHVzZWQgdGhlIGNpcGhlcgogKiBAcG5fbGVuOiBhIGxl bmd0aCBvZiBhIHBhY2tldCBudW1iZXIgaW4gdGhlIHNlY3VyaXR5IGhlYWRlcgogKiBAcG5fb2Zm OiBhbiBvZmZzZXQgb2YgcG4gZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWN1cml0eSBoZWFk ZXIKICogQGtleV9pZHhfb2ZmOiBhbiBvZmZzZXQgb2Yga2V5IGluZGV4IGJ5dGUgaW4gdGhlIHNl Y3VyaXR5IGhlYWRlcgogKiBAa2V5X2lkeF9tYXNrOiBhIGJpdCBtYXNrIG9mIGtleV9pZHggYml0 cwogKiBAa2V5X2lkeF9zaGlmdDogYSBiaXQgc2hpZnQgbmVlZGVkIHRvIGdldCBrZXlfaWR4CiAq ICAgICBrZXlfaWR4IHZhbHVlIGNhbGN1bGF0aW9uOgogKiAgICAgIChzZWNfaGVhZGVyX2Jhc2Vb a2V5X2lkeF9vZmZdICYga2V5X2lkeF9tYXNrKSA+PiBrZXlfaWR4X3NoaWZ0CiAqIEBtaWNfbGVu OiBhIG1pYyBsZW5ndGggaW4gYnl0ZXMKICovCnN0cnVjdCBpZWVlODAyMTFfY2lwaGVyX3NjaGVt ZSB7Cgl1MzIgY2lwaGVyOwoJdTE2IGlmdHlwZTsKCXU4IGhkcl9sZW47Cgl1OCBwbl9sZW47Cgl1 OCBwbl9vZmY7Cgl1OCBrZXlfaWR4X29mZjsKCXU4IGtleV9pZHhfbWFzazsKCXU4IGtleV9pZHhf c2hpZnQ7Cgl1OCBtaWNfbGVuOwp9OwoKLyoqCiAqIGVudW0gc2V0X2tleV9jbWQgLSBrZXkgY29t bWFuZAogKgogKiBVc2VkIHdpdGggdGhlIHNldF9rZXkoKSBjYWxsYmFjayBpbiAmc3RydWN0IGll ZWU4MDIxMV9vcHMsIHRoaXMKICogaW5kaWNhdGVzIHdoZXRoZXIgYSBrZXkgaXMgYmVpbmcgcmVt b3ZlZCBvciBhZGRlZC4KICoKICogQFNFVF9LRVk6IGEga2V5IGlzIHNldAogKiBARElTQUJMRV9L RVk6IGEga2V5IG11c3QgYmUgZGlzYWJsZWQKICovCmVudW0gc2V0X2tleV9jbWQgewoJU0VUX0tF WSwgRElTQUJMRV9LRVksCn07CgovKioKICogZW51bSBpZWVlODAyMTFfc3RhX3N0YXRlIC0gc3Rh dGlvbiBzdGF0ZQogKgogKiBASUVFRTgwMjExX1NUQV9OT1RFWElTVDogc3RhdGlvbiBkb2Vzbid0 IGV4aXN0IGF0IGFsbCwKICoJdGhpcyBpcyBhIHNwZWNpYWwgc3RhdGUgZm9yIGFkZC9yZW1vdmUg dHJhbnNpdGlvbnMKICogQElFRUU4MDIxMV9TVEFfTk9ORTogc3RhdGlvbiBleGlzdHMgd2l0aG91 dCBzcGVjaWFsIHN0YXRlCiAqIEBJRUVFODAyMTFfU1RBX0FVVEg6IHN0YXRpb24gaXMgYXV0aGVu dGljYXRlZAogKiBASUVFRTgwMjExX1NUQV9BU1NPQzogc3RhdGlvbiBpcyBhc3NvY2lhdGVkCiAq IEBJRUVFODAyMTFfU1RBX0FVVEhPUklaRUQ6IHN0YXRpb24gaXMgYXV0aG9yaXplZCAoODAyLjFY KQogKi8KZW51bSBpZWVlODAyMTFfc3RhX3N0YXRlIHsKCS8qIE5PVEU6IFRoZXNlIG5lZWQgdG8g YmUgb3JkZXJlZCBjb3JyZWN0bHkhICovCglJRUVFODAyMTFfU1RBX05PVEVYSVNULAoJSUVFRTgw MjExX1NUQV9OT05FLAoJSUVFRTgwMjExX1NUQV9BVVRILAoJSUVFRTgwMjExX1NUQV9BU1NPQywK CUlFRUU4MDIxMV9TVEFfQVVUSE9SSVpFRCwKfTsKCi8qKgogKiBlbnVtIGllZWU4MDIxMV9zdGFf cnhfYmFuZHdpZHRoIC0gc3RhdGlvbiBSWCBiYW5kd2lkdGgKICogQElFRUU4MDIxMV9TVEFfUlhf QldfMjA6IHN0YXRpb24gY2FuIG9ubHkgcmVjZWl2ZSAyMCBNSHoKICogQElFRUU4MDIxMV9TVEFf UlhfQldfNDA6IHN0YXRpb24gY2FuIHJlY2VpdmUgdXAgdG8gNDAgTUh6CiAqIEBJRUVFODAyMTFf U1RBX1JYX0JXXzgwOiBzdGF0aW9uIGNhbiByZWNlaXZlIHVwIHRvIDgwIE1IegogKiBASUVFRTgw MjExX1NUQV9SWF9CV18xNjA6IHN0YXRpb24gY2FuIHJlY2VpdmUgdXAgdG8gMTYwIE1IegogKgko aW5jbHVkaW5nIDgwKzgwIE1IeikKICoKICogSW1wbGVtZW50YXRpb24gbm90ZTogMjAgbXVzdCBi ZSB6ZXJvIHRvIGJlIGluaXRpYWxpemVkCiAqCWNvcnJlY3RseSwgdGhlIHZhbHVlcyBtdXN0IGJl IHNvcnRlZC4KICovCmVudW0gaWVlZTgwMjExX3N0YV9yeF9iYW5kd2lkdGggewoJSUVFRTgwMjEx X1NUQV9SWF9CV18yMCA9IDAsCglJRUVFODAyMTFfU1RBX1JYX0JXXzQwLAoJSUVFRTgwMjExX1NU QV9SWF9CV184MCwKCUlFRUU4MDIxMV9TVEFfUlhfQldfMTYwLAp9OwoKLyoqCiAqIHN0cnVjdCBp ZWVlODAyMTFfc3RhX3JhdGVzIC0gc3RhdGlvbiByYXRlIHNlbGVjdGlvbiB0YWJsZQogKgogKiBA cmN1X2hlYWQ6IFJDVSBoZWFkIHVzZWQgZm9yIGZyZWVpbmcgdGhlIHRhYmxlIG9uIHVwZGF0ZQog KiBAcmF0ZTogdHJhbnNtaXQgcmF0ZXMvZmxhZ3MgdG8gYmUgdXNlZCBieSBkZWZhdWx0LgogKglP dmVycmlkaW5nIGVudHJpZXMgcGVyLXBhY2tldCBpcyBwb3NzaWJsZSBieSB1c2luZyBjYiB0eCBj b250cm9sLgogKi8Kc3RydWN0IGllZWU4MDIxMV9zdGFfcmF0ZXMgewoJc3RydWN0IHJjdV9oZWFk IHJjdV9oZWFkOwoJc3RydWN0IHsKCQlzOCBpZHg7CgkJdTggY291bnQ7CgkJdTggY291bnRfY3Rz OwoJCXU4IGNvdW50X3J0czsKCQl1MTYgZmxhZ3M7Cgl9IHJhdGVbSUVFRTgwMjExX1RYX1JBVEVf VEFCTEVfU0laRV07Cn07CgovKioKICogc3RydWN0IGllZWU4MDIxMV9zdGFfdHhwd3IgLSBzdGF0 aW9uIHR4cG93ZXIgY29uZmlndXJhdGlvbgogKgogKiBVc2VkIHRvIGNvbmZpZ3VyZSB0eHBvd2Vy IGZvciBzdGF0aW9uLgogKgogKiBAcG93ZXI6IGluZGljYXRlcyB0aGUgdHggcG93ZXIsIGluIGRC bSwgdG8gYmUgdXNlZCB3aGVuIHNlbmRpbmcgZGF0YSBmcmFtZXMKICoJdG8gdGhlIFNUQS4KICog QHR5cGU6IEluIHBhcnRpY3VsYXIgaWYgVFBDICV0eXBlIGlzIE5MODAyMTFfVFhfUE9XRVJfTElN SVRFRCB0aGVuIHR4IHBvd2VyCiAqCXdpbGwgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHNwZWNp ZmllZCBmcm9tIHVzZXJzcGFjZSwgd2hlcmVhcyBpZiBUUEMKICoJJXR5cGUgaXMgTkw4MDIxMV9U WF9QT1dFUl9BVVRPTUFUSUMgdGhlbiBpdCBpbmRpY2F0ZXMgZGVmYXVsdCB0eCBwb3dlci4KICoJ Tkw4MDIxMV9UWF9QT1dFUl9GSVhFRCBpcyBub3QgYSB2YWxpZCBjb25maWd1cmF0aW9uIG9wdGlv biBmb3IKICoJcGVyIHBlZXIgVFBDLgogKi8Kc3RydWN0IGllZWU4MDIxMV9zdGFfdHhwd3IgewoJ czE2IHBvd2VyOwoJZW51bSBubDgwMjExX3R4X3Bvd2VyX3NldHRpbmcgdHlwZTsKfTsKCi8qKgog KiBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAtIHN0YXRpb24gdGFibGUgZW50cnkKICoKICogQSBzdGF0 aW9uIHRhYmxlIGVudHJ5IHJlcHJlc2VudHMgYSBzdGF0aW9uIHdlIGFyZSBwb3NzaWJseQogKiBj b21tdW5pY2F0aW5nIHdpdGguIFNpbmNlIHN0YXRpb25zIGFyZSBSQ1UtbWFuYWdlZCBpbgogKiBt YWM4MDIxMSwgYW55IGllZWU4MDIxMV9zdGEgcG9pbnRlciB5b3UgZ2V0IGFjY2VzcyB0byBtdXN0 CiAqIGVpdGhlciBiZSBwcm90ZWN0ZWQgYnkgcmN1X3JlYWRfbG9jaygpIGV4cGxpY2l0bHkgb3Ig aW1wbGljaXRseSwKICogb3IgeW91IG11c3QgdGFrZSBnb29kIGNhcmUgdG8gbm90IHVzZSBzdWNo IGEgcG9pbnRlciBhZnRlciBhCiAqIGNhbGwgdG8geW91ciBzdGFfcmVtb3ZlIGNhbGxiYWNrIHRo YXQgcmVtb3ZlZCBpdC4KICoKICogQGFkZHI6IE1BQyBhZGRyZXNzCiAqIEBhaWQ6IEFJRCB3ZSBh c3NpZ25lZCB0byB0aGUgc3RhdGlvbiBpZiB3ZSdyZSBhbiBBUAogKiBAc3VwcF9yYXRlczogQml0 bWFwIG9mIHN1cHBvcnRlZCByYXRlcyAocGVyIGJhbmQpCiAqIEBodF9jYXA6IEhUIGNhcGFiaWxp dGllcyBvZiB0aGlzIFNUQTsgcmVzdHJpY3RlZCB0byBvdXIgb3duIGNhcGFiaWxpdGllcwogKiBA dmh0X2NhcDogVkhUIGNhcGFiaWxpdGllcyBvZiB0aGlzIFNUQTsgcmVzdHJpY3RlZCB0byBvdXIg b3duIGNhcGFiaWxpdGllcwogKiBAaGVfY2FwOiBIRSBjYXBhYmlsaXRpZXMgb2YgdGhpcyBTVEEK ICogQG1heF9yeF9hZ2dyZWdhdGlvbl9zdWJmcmFtZXM6IG1heGltYWwgYW1vdW50IG9mIGZyYW1l cyBpbiBhIHNpbmdsZSBBTVBEVQogKgl0aGF0IHRoaXMgc3RhdGlvbiBpcyBhbGxvd2VkIHRvIHRy YW5zbWl0IHRvIHVzLgogKglDYW4gYmUgbW9kaWZpZWQgYnkgZHJpdmVyLgogKiBAd21lOiBpbmRp Y2F0ZXMgd2hldGhlciB0aGUgU1RBIHN1cHBvcnRzIFFvUy9XTUUgKGlmIGxvY2FsIGRldmljZXMg ZG9lcywKICoJb3RoZXJ3aXNlIGFsd2F5cyBmYWxzZSkKICogQGRydl9wcml2OiBkYXRhIGFyZWEg Zm9yIGRyaXZlciB1c2UsIHdpbGwgYWx3YXlzIGJlIGFsaWduZWQgdG8KICoJc2l6ZW9mKHZvaWQg XCopLCBzaXplIGlzIGRldGVybWluZWQgaW4gaHcgaW5mb3JtYXRpb24uCiAqIEB1YXBzZF9xdWV1 ZXM6IGJpdG1hcCBvZiBxdWV1ZXMgY29uZmlndXJlZCBmb3IgdWFwc2QuIE9ubHkgdmFsaWQKICoJ aWYgd21lIGlzIHN1cHBvcnRlZC4gVGhlIGJpdHMgb3JkZXIgaXMgbGlrZSBpbgogKglJRUVFODAy MTFfV01NX0lFX1NUQV9RT1NJTkZPX0FDXyouCiAqIEBtYXhfc3A6IG1heCBTZXJ2aWNlIFBlcmlv ZC4gT25seSB2YWxpZCBpZiB3bWUgaXMgc3VwcG9ydGVkLgogKiBAYmFuZHdpZHRoOiBjdXJyZW50 IGJhbmR3aWR0aCB0aGUgc3RhdGlvbiBjYW4gcmVjZWl2ZSB3aXRoCiAqIEByeF9uc3M6IGluIEhU L1ZIVCwgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNwYXRpYWwgc3RyZWFtcyB0aGUKICoJc3RhdGlv biBjYW4gcmVjZWl2ZSBhdCB0aGUgbW9tZW50LCBjaGFuZ2VkIGJ5IG9wZXJhdGluZyBtb2RlCiAq CW5vdGlmaWNhdGlvbnMgYW5kIGNhcGFiaWxpdGllcy4gVGhlIHZhbHVlIGlzIG9ubHkgdmFsaWQg YWZ0ZXIKICoJdGhlIHN0YXRpb24gbW92ZXMgdG8gYXNzb2NpYXRlZCBzdGF0ZS4KICogQHNtcHNf bW9kZTogY3VycmVudCBTTVBTIG1vZGUgKG9mZiwgc3RhdGljIG9yIGR5bmFtaWMpCiAqIEByYXRl czogcmF0ZSBjb250cm9sIHNlbGVjdGlvbiB0YWJsZQogKiBAdGRsczogaW5kaWNhdGVzIHdoZXRo ZXIgdGhlIFNUQSBpcyBhIFRETFMgcGVlcgogKiBAdGRsc19pbml0aWF0b3I6IGluZGljYXRlcyB0 aGUgU1RBIGlzIGFuIGluaXRpYXRvciBvZiB0aGUgVERMUyBsaW5rLiBPbmx5CiAqCXZhbGlkIGlm IHRoZSBTVEEgaXMgYSBURExTIHBlZXIgaW4gdGhlIGZpcnN0IHBsYWNlLgogKiBAbWZwOiBpbmRp Y2F0ZXMgd2hldGhlciB0aGUgU1RBIHVzZXMgbWFuYWdlbWVudCBmcmFtZSBwcm90ZWN0aW9uIG9y IG5vdC4KICogQG1heF9hbXNkdV9zdWJmcmFtZXM6IGluZGljYXRlcyB0aGUgbWF4aW1hbCBudW1i ZXIgb2YgTVNEVXMgaW4gYSBzaW5nbGUKICoJQS1NU0RVLiBUYWtlbiBmcm9tIHRoZSBFeHRlbmRl ZCBDYXBhYmlsaXRpZXMgZWxlbWVudC4gMCBtZWFucwogKgl1bmxpbWl0ZWQuCiAqIEBzdXBwb3J0 X3AycF9wczogaW5kaWNhdGVzIHdoZXRoZXIgdGhlIFNUQSBzdXBwb3J0cyBQMlAgUFMgbWVjaGFu aXNtIG9yIG5vdC4KICogQG1heF9yY19hbXNkdV9sZW46IE1heGltdW0gQS1NU0RVIHNpemUgaW4g Ynl0ZXMgcmVjb21tZW5kZWQgYnkgcmF0ZSBjb250cm9sLgogKiBAbWF4X3RpZF9hbXNkdV9sZW46 IE1heGltdW0gQS1NU0RVIHNpemUgaW4gYnl0ZXMgZm9yIHRoaXMgVElECiAqIEB0eHB3cjogdGhl IHN0YXRpb24gdHggcG93ZXIgY29uZmlndXJhdGlvbgogKiBAdHhxOiBwZXItVElEIGRhdGEgVFgg cXVldWVzIChpZiBkcml2ZXIgdXNlcyB0aGUgVFhRIGFic3RyYWN0aW9uKTsgbm90ZSB0aGF0CiAq CXRoZSBsYXN0IGVudHJ5ICglSUVFRTgwMjExX05VTV9USURTKSBpcyB1c2VkIGZvciBub24tZGF0 YSBmcmFtZXMKICovCnN0cnVjdCBpZWVlODAyMTFfc3RhIHsKCXUzMiBzdXBwX3JhdGVzW05VTV9O TDgwMjExX0JBTkRTXTsKCXU4IGFkZHJbRVRIX0FMRU5dOwoJdTE2IGFpZDsKCXN0cnVjdCBpZWVl ODAyMTFfc3RhX2h0X2NhcCBodF9jYXA7CglzdHJ1Y3QgaWVlZTgwMjExX3N0YV92aHRfY2FwIHZo dF9jYXA7CglzdHJ1Y3QgaWVlZTgwMjExX3N0YV9oZV9jYXAgaGVfY2FwOwoJdTE2IG1heF9yeF9h Z2dyZWdhdGlvbl9zdWJmcmFtZXM7Cglib29sIHdtZTsKCXU4IHVhcHNkX3F1ZXVlczsKCXU4IG1h eF9zcDsKCXU4IHJ4X25zczsKCWVudW0gaWVlZTgwMjExX3N0YV9yeF9iYW5kd2lkdGggYmFuZHdp ZHRoOwoJZW51bSBpZWVlODAyMTFfc21wc19tb2RlIHNtcHNfbW9kZTsKCXN0cnVjdCBpZWVlODAy MTFfc3RhX3JhdGVzIF9fcmN1ICpyYXRlczsKCWJvb2wgdGRsczsKCWJvb2wgdGRsc19pbml0aWF0 b3I7Cglib29sIG1mcDsKCXU4IG1heF9hbXNkdV9zdWJmcmFtZXM7CgoJLyoqCgkgKiBAbWF4X2Ft c2R1X2xlbjoKCSAqIGluZGljYXRlcyB0aGUgbWF4aW1hbCBsZW5ndGggb2YgYW4gQS1NU0RVIGlu IGJ5dGVzLgoJICogVGhpcyBmaWVsZCBpcyBhbHdheXMgdmFsaWQgZm9yIHBhY2tldHMgd2l0aCBh IFZIVCBwcmVhbWJsZS4KCSAqIEZvciBwYWNrZXRzIHdpdGggYSBIVCBwcmVhbWJsZSwgYWRkaXRp b25hbCBsaW1pdHMgYXBwbHk6CgkgKgoJICogKiBJZiB0aGUgc2tiIGlzIHRyYW5zbWl0dGVkIGFz IHBhcnQgb2YgYSBCQSBhZ3JlZW1lbnQsIHRoZQoJICogICBBLU1TRFUgbWF4aW1hbCBzaXplIGlz IG1pbihtYXhfYW1zZHVfbGVuLCA0MDY1KSBieXRlcy4KCSAqICogSWYgdGhlIHNrYiBpcyBub3Qg cGFydCBvZiBhIEJBIGFncmVlbWVudCwgdGhlIEEtTVNEVSBtYXhpbWFsCgkgKiAgIHNpemUgaXMg bWluKG1heF9hbXNkdV9sZW4sIDc5MzUpIGJ5dGVzLgoJICoKCSAqIEJvdGggYWRkaXRpb25hbCBI VCBsaW1pdHMgbXVzdCBiZSBlbmZvcmNlZCBieSB0aGUgbG93IGxldmVsCgkgKiBkcml2ZXIuIFRo aXMgaXMgZGVmaW5lZCBieSB0aGUgc3BlYyAoSUVFRSA4MDIuMTEtMjAxMiBzZWN0aW9uCgkgKiA4 LjMuMi4yIE5PVEUgMikuCgkgKi8KCXUxNiBtYXhfYW1zZHVfbGVuOwoJYm9vbCBzdXBwb3J0X3Ay cF9wczsKCXUxNiBtYXhfcmNfYW1zZHVfbGVuOwoJdTE2IG1heF90aWRfYW1zZHVfbGVuW0lFRUU4 MDIxMV9OVU1fVElEU107CglzdHJ1Y3QgaWVlZTgwMjExX3N0YV90eHB3ciB0eHB3cjsKCglzdHJ1 Y3QgaWVlZTgwMjExX3R4cSAqdHhxW0lFRUU4MDIxMV9OVU1fVElEUyArIDFdOwoKCS8qIG11c3Qg YmUgbGFzdCAqLwoJdTggZHJ2X3ByaXZbMF0gX19hbGlnbmVkKHNpemVvZih2b2lkICopKTsKfTsK Ci8qKgogKiBlbnVtIHN0YV9ub3RpZnlfY21kIC0gc3RhIG5vdGlmeSBjb21tYW5kCiAqCiAqIFVz ZWQgd2l0aCB0aGUgc3RhX25vdGlmeSgpIGNhbGxiYWNrIGluICZzdHJ1Y3QgaWVlZTgwMjExX29w cywgdGhpcwogKiBpbmRpY2F0ZXMgaWYgYW4gYXNzb2NpYXRlZCBzdGF0aW9uIG1hZGUgYSBwb3dl ciBzdGF0ZSB0cmFuc2l0aW9uLgogKgogKiBAU1RBX05PVElGWV9TTEVFUDogYSBzdGF0aW9uIGlz IG5vdyBzbGVlcGluZwogKiBAU1RBX05PVElGWV9BV0FLRTogYSBzbGVlcGluZyBzdGF0aW9uIHdv a2UgdXAKICovCmVudW0gc3RhX25vdGlmeV9jbWQgewoJU1RBX05PVElGWV9TTEVFUCwgU1RBX05P VElGWV9BV0FLRSwKfTsKCi8qKgogKiBzdHJ1Y3QgaWVlZTgwMjExX3R4X2NvbnRyb2wgLSBUWCBj b250cm9sIGRhdGEKICoKICogQHN0YTogc3RhdGlvbiB0YWJsZSBlbnRyeSwgdGhpcyBzdGEgcG9p bnRlciBtYXkgYmUgTlVMTCBhbmQKICogCWl0IGlzIG5vdCBhbGxvd2VkIHRvIGNvcHkgdGhlIHBv aW50ZXIsIGR1ZSB0byBSQ1UuCiAqLwpzdHJ1Y3QgaWVlZTgwMjExX3R4X2NvbnRyb2wgewoJc3Ry dWN0IGllZWU4MDIxMV9zdGEgKnN0YTsKfTsKCi8qKgogKiBzdHJ1Y3QgaWVlZTgwMjExX3R4cSAt IFNvZnR3YXJlIGludGVybWVkaWF0ZSB0eCBxdWV1ZQogKgogKiBAdmlmOiAmc3RydWN0IGllZWU4 MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNlIGNhbGxiYWNrLgogKiBAc3Rh OiBzdGF0aW9uIHRhYmxlIGVudHJ5LCAlTlVMTCBmb3IgcGVyLXZpZiBxdWV1ZQogKiBAdGlkOiB0 aGUgVElEIGZvciB0aGlzIHF1ZXVlICh1bnVzZWQgZm9yIHBlci12aWYgcXVldWUpLAogKgklSUVF RTgwMjExX05VTV9USURTIGZvciBub24tZGF0YSAoaWYgZW5hYmxlZCkKICogQGFjOiB0aGUgQUMg Zm9yIHRoaXMgcXVldWUKICogQGRydl9wcml2OiBkcml2ZXIgcHJpdmF0ZSBhcmVhLCBzaXplZCBi eSBody0+dHhxX2RhdGFfc2l6ZQogKgogKiBUaGUgZHJpdmVyIGNhbiBvYnRhaW4gcGFja2V0cyBm cm9tIHRoaXMgcXVldWUgYnkgY2FsbGluZwogKiBpZWVlODAyMTFfdHhfZGVxdWV1ZSgpLgogKi8K c3RydWN0IGllZWU4MDIxMV90eHEgewoJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsKCXN0cnVj dCBpZWVlODAyMTFfc3RhICpzdGE7Cgl1OCB0aWQ7Cgl1OCBhYzsKCgkvKiBtdXN0IGJlIGxhc3Qg Ki8KCXU4IGRydl9wcml2WzBdIF9fYWxpZ25lZChzaXplb2Yodm9pZCAqKSk7Cn07CgovKioKICog ZW51bSBpZWVlODAyMTFfaHdfZmxhZ3MgLSBoYXJkd2FyZSBmbGFncwogKgogKiBUaGVzZSBmbGFn cyBhcmUgdXNlZCB0byBpbmRpY2F0ZSBoYXJkd2FyZSBjYXBhYmlsaXRpZXMgdG8KICogdGhlIHN0 YWNrLiBHZW5lcmFsbHksIGZsYWdzIGhlcmUgc2hvdWxkIGhhdmUgdGhlaXIgbWVhbmluZwogKiBk b25lIGluIGEgd2F5IHRoYXQgdGhlIHNpbXBsZXN0IGhhcmR3YXJlIGRvZXNuJ3QgbmVlZCBzZXR0 aW5nCiAqIGFueSBwYXJ0aWN1bGFyIGZsYWdzLiBUaGVyZSBhcmUgc29tZSBleGNlcHRpb25zIHRv IHRoaXMgcnVsZSwKICogaG93ZXZlciwgc28geW91IGFyZSBhZHZpc2VkIHRvIHJldmlldyB0aGVz ZSBmbGFncyBjYXJlZnVsbHkuCiAqCiAqIEBJRUVFODAyMTFfSFdfSEFTX1JBVEVfQ09OVFJPTDoK ICoJVGhlIGhhcmR3YXJlIG9yIGZpcm13YXJlIGluY2x1ZGVzIHJhdGUgY29udHJvbCwgYW5kIGNh bm5vdCBiZQogKgljb250cm9sbGVkIGJ5IHRoZSBzdGFjay4gQXMgc3VjaCwgbm8gcmF0ZSBjb250 cm9sIGFsZ29yaXRobQogKglzaG91bGQgYmUgaW5zdGFudGlhdGVkLCBhbmQgdGhlIFRYIHJhdGUg cmVwb3J0ZWQgdG8gdXNlcnNwYWNlCiAqCXdpbGwgYmUgdGFrZW4gZnJvbSB0aGUgVFggc3RhdHVz IGluc3RlYWQgb2YgdGhlIHJhdGUgY29udHJvbAogKglhbGdvcml0aG0uCiAqCU5vdGUgdGhhdCB0 aGlzIHJlcXVpcmVzIHRoYXQgdGhlIGRyaXZlciBpbXBsZW1lbnQgYSBudW1iZXIgb2YKICoJY2Fs bGJhY2tzIHNvIGl0IGhhcyB0aGUgY29ycmVjdCBpbmZvcm1hdGlvbiwgaXQgbmVlZHMgdG8gaGF2 ZQogKgl0aGUgQHNldF9ydHNfdGhyZXNob2xkIGNhbGxiYWNrIGFuZCBtdXN0IGxvb2sgYXQgdGhl IEJTUyBjb25maWcKICoJQHVzZV9jdHNfcHJvdCBmb3IgRy9OIHByb3RlY3Rpb24sIEB1c2Vfc2hv cnRfc2xvdCBmb3Igc2xvdAogKgl0aW1pbmcgaW4gMi40IEdIeiBhbmQgQHVzZV9zaG9ydF9wcmVh bWJsZSBmb3IgcHJlYW1ibGVzIGZvcgogKglDQ0sgZnJhbWVzLgogKgogKiBASUVFRTgwMjExX0hX X1JYX0lOQ0xVREVTX0ZDUzoKICoJSW5kaWNhdGVzIHRoYXQgcmVjZWl2ZWQgZnJhbWVzIHBhc3Nl ZCB0byB0aGUgc3RhY2sgaW5jbHVkZQogKgl0aGUgRkNTIGF0IHRoZSBlbmQuCiAqCiAqIEBJRUVF ODAyMTFfSFdfSE9TVF9CUk9BRENBU1RfUFNfQlVGRkVSSU5HOgogKglTb21lIHdpcmVsZXNzIExB TiBjaGlwc2V0cyBidWZmZXIgYnJvYWRjYXN0L211bHRpY2FzdCBmcmFtZXMKICoJZm9yIHBvd2Vy IHNhdmluZyBzdGF0aW9ucyBpbiB0aGUgaGFyZHdhcmUvZmlybXdhcmUgYW5kIG90aGVycwogKgly ZWx5IG9uIHRoZSBob3N0IHN5c3RlbSBmb3Igc3VjaCBidWZmZXJpbmcuIFRoaXMgb3B0aW9uIGlz IHVzZWQKICoJdG8gY29uZmlndXJlIHRoZSBJRUVFIDgwMi4xMSB1cHBlciBsYXllciB0byBidWZm ZXIgYnJvYWRjYXN0IGFuZAogKgltdWx0aWNhc3QgZnJhbWVzIHdoZW4gdGhlcmUgYXJlIHBvd2Vy IHNhdmluZyBzdGF0aW9ucyBzbyB0aGF0CiAqCXRoZSBkcml2ZXIgY2FuIGZldGNoIHRoZW0gd2l0 aCBpZWVlODAyMTFfZ2V0X2J1ZmZlcmVkX2JjKCkuCiAqCiAqIEBJRUVFODAyMTFfSFdfU0lHTkFM X1VOU1BFQzoKICoJSGFyZHdhcmUgY2FuIHByb3ZpZGUgc2lnbmFsIHZhbHVlcyBidXQgd2UgZG9u J3Qga25vdyBpdHMgdW5pdHMuIFdlCiAqCWV4cGVjdCB2YWx1ZXMgYmV0d2VlbiAwIGFuZCBAbWF4 X3NpZ25hbC4KICoJSWYgcG9zc2libGUgcGxlYXNlIHByb3ZpZGUgZEIgb3IgZEJtIGluc3RlYWQu CiAqCiAqIEBJRUVFODAyMTFfSFdfU0lHTkFMX0RCTToKICoJSGFyZHdhcmUgZ2l2ZXMgc2lnbmFs IHZhbHVlcyBpbiBkQm0sIGRlY2liZWwgZGlmZmVyZW5jZSBmcm9tCiAqCW9uZSBtaWxsaXdhdHQu IFRoaXMgaXMgdGhlIHByZWZlcnJlZCBtZXRob2Qgc2luY2UgaXQgaXMgc3RhbmRhcmRpemVkCiAq CWJldHdlZW4gZGlmZmVyZW50IGRldmljZXMuIEBtYXhfc2lnbmFsIGRvZXMgbm90IG5lZWQgdG8g YmUgc2V0LgogKgogKiBASUVFRTgwMjExX0hXX1NQRUNUUlVNX01HTVQ6CiAqIAlIYXJkd2FyZSBz dXBwb3J0cyBzcGVjdHJ1bSBtYW5hZ2VtZW50IGRlZmluZWQgaW4gODAyLjExaAogKiAJTWVhc3Vy ZW1lbnQsIENoYW5uZWwgU3dpdGNoLCBRdWlldGluZywgVFBDCiAqCiAqIEBJRUVFODAyMTFfSFdf QU1QRFVfQUdHUkVHQVRJT046CiAqCUhhcmR3YXJlIHN1cHBvcnRzIDExbiBBLU1QRFUgYWdncmVn YXRpb24uCiAqCiAqIEBJRUVFODAyMTFfSFdfU1VQUE9SVFNfUFM6CiAqCUhhcmR3YXJlIGhhcyBw b3dlciBzYXZlIHN1cHBvcnQgKGkuZS4gY2FuIGdvIHRvIHNsZWVwKS4KICoKICogQElFRUU4MDIx MV9IV19QU19OVUxMRlVOQ19TVEFDSzoKICoJSGFyZHdhcmUgcmVxdWlyZXMgbnVsbGZ1bmMgZnJh bWUgaGFuZGxpbmcgaW4gc3RhY2ssIGltcGxpZXMKICoJc3RhY2sgc3VwcG9ydCBmb3IgZHluYW1p YyBQUy4KICoKICogQElFRUU4MDIxMV9IV19TVVBQT1JUU19EWU5BTUlDX1BTOgogKglIYXJkd2Fy ZSBoYXMgc3VwcG9ydCBmb3IgZHluYW1pYyBQUy4KICoKICogQElFRUU4MDIxMV9IV19NRlBfQ0FQ QUJMRToKICoJSGFyZHdhcmUgc3VwcG9ydHMgbWFuYWdlbWVudCBmcmFtZSBwcm90ZWN0aW9uIChN RlAsIElFRUUgODAyLjExdykuCiAqCiAqIEBJRUVFODAyMTFfSFdfUkVQT1JUU19UWF9BQ0tfU1RB VFVTOgogKglIYXJkd2FyZSBjYW4gcHJvdmlkZSBhY2sgc3RhdHVzIHJlcG9ydHMgb2YgVHggZnJh bWVzIHRvCiAqCXRoZSBzdGFjay4KICoKICogQElFRUU4MDIxMV9IV19DT05ORUNUSU9OX01PTklU T1I6CiAqCVRoZSBoYXJkd2FyZSBwZXJmb3JtcyBpdHMgb3duIGNvbm5lY3Rpb24gbW9uaXRvcmlu ZywgaW5jbHVkaW5nCiAqCXBlcmlvZGljIGtlZXAtYWxpdmVzIHRvIHRoZSBBUCBhbmQgcHJvYmlu ZyB0aGUgQVAgb24gYmVhY29uIGxvc3MuCiAqCiAqIEBJRUVFODAyMTFfSFdfTkVFRF9EVElNX0JF Rk9SRV9BU1NPQzoKICoJVGhpcyBkZXZpY2UgbmVlZHMgdG8gZ2V0IGRhdGEgZnJvbSBiZWFjb24g YmVmb3JlIGFzc29jaWF0aW9uIChpLmUuCiAqCWR0aW1fcGVyaW9kKS4KICoKICogQElFRUU4MDIx MV9IV19TVVBQT1JUU19QRVJfU1RBX0dUSzogVGhlIGRldmljZSdzIGNyeXB0byBlbmdpbmUgc3Vw cG9ydHMKICoJcGVyLXN0YXRpb24gR1RLcyBhcyB1c2VkIGJ5IElCU1MgUlNOIG9yIGR1cmluZyBm YXN0IHRyYW5zaXRpb24uIElmCiAqCXRoZSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IHBlci1zdGF0 aW9uIEdUS3MsIGJ1dCBjYW4gYmUgYXNrZWQgbm90CiAqCXRvIGRlY3J5cHQgZ3JvdXAgYWRkcmVz c2VkIGZyYW1lcywgdGhlbiBJQlNTIFJTTiBzdXBwb3J0IGlzIHN0aWxsCiAqCXBvc3NpYmxlIGJ1 dCBzb2Z0d2FyZSBjcnlwdG8gd2lsbCBiZSB1c2VkLiBBZHZlcnRpc2UgdGhlIHdpcGh5IGZsYWcK ICoJb25seSBpbiB0aGF0IGNhc2UuCiAqCiAqIEBJRUVFODAyMTFfSFdfQVBfTElOS19QUzogV2hl biBvcGVyYXRpbmcgaW4gQVAgbW9kZSB0aGUgZGV2aWNlCiAqCWF1dG9ub21vdXNseSBtYW5hZ2Vz IHRoZSBQUyBzdGF0dXMgb2YgY29ubmVjdGVkIHN0YXRpb25zLiBXaGVuCiAqCXRoaXMgZmxhZyBp cyBzZXQgbWFjODAyMTEgd2lsbCBub3QgdHJpZ2dlciBQUyBtb2RlIGZvciBjb25uZWN0ZWQKICoJ c3RhdGlvbnMgYmFzZWQgb24gdGhlIFBNIGJpdCBvZiBpbmNvbWluZyBmcmFtZXMuCiAqCVVzZSBp ZWVlODAyMTFfc3RhcnRfcHMoKS9pZWVlODAyMV9lbmRfcHMoKSB0byBtYW51YWxseSBjb25maWd1 cmUKICoJdGhlIFBTIG1vZGUgb2YgY29ubmVjdGVkIHN0YXRpb25zLgogKgogKiBASUVFRTgwMjEx X0hXX1RYX0FNUERVX1NFVFVQX0lOX0hXOiBUaGUgZGV2aWNlIGhhbmRsZXMgVFggQS1NUERVIHNl c3Npb24KICoJc2V0dXAgc3RyaWN0bHkgaW4gSFcuIG1hYzgwMjExIHNob3VsZCBub3QgYXR0ZW1w dCB0byBkbyB0aGlzIGluCiAqCXNvZnR3YXJlLgogKgogKiBASUVFRTgwMjExX0hXX1dBTlRfTU9O SVRPUl9WSUY6IFRoZSBkcml2ZXIgd291bGQgbGlrZSB0byBiZSBpbmZvcm1lZCBvZgogKglhIHZp cnR1YWwgbW9uaXRvciBpbnRlcmZhY2Ugd2hlbiBtb25pdG9yIGludGVyZmFjZXMgYXJlIHRoZSBv bmx5CiAqCWFjdGl2ZSBpbnRlcmZhY2VzLgogKgogKiBASUVFRTgwMjExX0hXX05PX0FVVE9fVklG OiBUaGUgZHJpdmVyIHdvdWxkIGxpa2UgZm9yIG5vIHdsYW5YIHRvCiAqCWJlIGNyZWF0ZWQuICBJ dCBpcyBleHBlY3RlZCB1c2VyLXNwYWNlIHdpbGwgY3JlYXRlIHZpZnMgYXMKICoJZGVzaXJlZCAo YW5kIHRodXMgaGF2ZSB0aGVtIG5hbWVkIGFzIGRlc2lyZWQpLgogKgogKiBASUVFRTgwMjExX0hX X1NXX0NSWVBUT19DT05UUk9MOiBUaGUgZHJpdmVyIHdhbnRzIHRvIGNvbnRyb2wgd2hpY2ggb2Yg dGhlCiAqCWNyeXB0byBhbGdvcml0aG1zIGNhbiBiZSBkb25lIGluIHNvZnR3YXJlIC0gc28gZG9u J3QgYXV0b21hdGljYWxseQogKgl0cnkgdG8gZmFsbCBiYWNrIHRvIGl0IGlmIGhhcmR3YXJlIGNy eXB0byBmYWlscywgYnV0IGRvIHNvIG9ubHkgaWYKICoJdGhlIGRyaXZlciByZXR1cm5zIDEuIFRo aXMgYWxzbyBmb3JjZXMgdGhlIGRyaXZlciB0byBhZHZlcnRpc2UgaXRzCiAqCXN1cHBvcnRlZCBj aXBoZXIgc3VpdGVzLgogKgogKiBASUVFRTgwMjExX0hXX1NVUFBPUlRfRkFTVF9YTUlUOiBUaGUg ZHJpdmVyL2hhcmR3YXJlIHN1cHBvcnRzIGZhc3QteG1pdCwKICoJdGhpcyBjdXJyZW50bHkgcmVx dWlyZXMgb25seSB0aGUgYWJpbGl0eSB0byBjYWxjdWxhdGUgdGhlIGR1cmF0aW9uCiAqCWZvciBm cmFtZXMuCiAqCiAqIEBJRUVFODAyMTFfSFdfUVVFVUVfQ09OVFJPTDogVGhlIGRyaXZlciB3YW50 cyB0byBjb250cm9sIHBlci1pbnRlcmZhY2UKICoJcXVldWUgbWFwcGluZyBpbiBvcmRlciB0byB1 c2UgZGlmZmVyZW50IHF1ZXVlcyAobm90IGp1c3Qgb25lIHBlciBBQykKICoJZm9yIGRpZmZlcmVu dCB2aXJ0dWFsIGludGVyZmFjZXMuIFNlZSB0aGUgZG9jIHNlY3Rpb24gb24gSFcgcXVldWUKICoJ Y29udHJvbCBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBASUVFRTgwMjExX0hXX1NVUFBPUlRTX1JD X1RBQkxFOiBUaGUgZHJpdmVyIHN1cHBvcnRzIHVzaW5nIGEgcmF0ZQogKglzZWxlY3Rpb24gdGFi bGUgcHJvdmlkZWQgYnkgdGhlIHJhdGUgY29udHJvbCBhbGdvcml0aG0uCiAqCiAqIEBJRUVFODAy MTFfSFdfUDJQX0RFVl9BRERSX0ZPUl9JTlRGOiBVc2UgdGhlIFAyUCBEZXZpY2UgYWRkcmVzcyBm b3IgYW55CiAqCVAyUCBJbnRlcmZhY2UuIFRoaXMgd2lsbCBiZSBob25vdXJlZCBldmVuIGlmIG1v cmUgdGhhbiBvbmUgaW50ZXJmYWNlCiAqCWlzIHN1cHBvcnRlZC4KICoKICogQElFRUU4MDIxMV9I V19USU1JTkdfQkVBQ09OX09OTFk6IFVzZSBzeW5jIHRpbWluZyBmcm9tIGJlYWNvbiBmcmFtZXMK ICoJb25seSwgdG8gYWxsb3cgZ2V0dGluZyBUQlRUIG9mIGEgRFRJTSBiZWFjb24uCiAqCiAqIEBJ RUVFODAyMTFfSFdfU1VQUE9SVFNfSFRfQ0NLX1JBVEVTOiBIYXJkd2FyZSBzdXBwb3J0cyBtaXhp bmcgSFQvQ0NLIHJhdGVzCiAqCWFuZCBjYW4gY29wZSB3aXRoIENDSyByYXRlcyBpbiBhbiBhZ2dy ZWdhdGlvbiBzZXNzaW9uIChlLmcuIGJ5IG5vdAogKgl1c2luZyBhZ2dyZWdhdGlvbiBmb3Igc3Vj aCBmcmFtZXMuKQogKgogKiBASUVFRTgwMjExX0hXX0NIQU5DVFhfU1RBX0NTQTogU3VwcG9ydCA4 MDIuMTFoIGJhc2VkIGNoYW5uZWwtc3dpdGNoIChDU0EpCiAqCWZvciBhIHNpbmdsZSBhY3RpdmUg Y2hhbm5lbCB3aGlsZSB1c2luZyBjaGFubmVsIGNvbnRleHRzLiBXaGVuIHN1cHBvcnQKICoJaXMg bm90IGVuYWJsZWQgdGhlIGRlZmF1bHQgYWN0aW9uIGlzIHRvIGRpc2Nvbm5lY3Qgd2hlbiBnZXR0 aW5nIHRoZQogKglDU0EgZnJhbWUuCiAqCiAqIEBJRUVFODAyMTFfSFdfU1VQUE9SVFNfQ0xPTkVE X1NLQlM6IFRoZSBkcml2ZXIgd2lsbCBuZXZlciBtb2RpZnkgdGhlIHBheWxvYWQKICoJb3IgdGFp bHJvb20gb2YgVFggc2ticyB3aXRob3V0IGNvcHlpbmcgdGhlbSBmaXJzdC4KICoKICogQElFRUU4 MDIxMV9IV19TSU5HTEVfU0NBTl9PTl9BTExfQkFORFM6IFRoZSBIVyBzdXBwb3J0cyBzY2Fubmlu ZyBvbiBhbGwgYmFuZHMKICoJaW4gb25lIGNvbW1hbmQsIG1hYzgwMjExIGRvZXNuJ3QgaGF2ZSB0 byBydW4gc2VwYXJhdGUgc2NhbnMgcGVyIGJhbmQuCiAqCiAqIEBJRUVFODAyMTFfSFdfVERMU19X SURFUl9CVzogVGhlIGRldmljZS9kcml2ZXIgc3VwcG9ydHMgd2lkZXIgYmFuZHdpZHRoCiAqCXRo YW4gdGhlbiBCU1MgYmFuZHdpZHRoIGZvciBhIFRETFMgbGluayBvbiB0aGUgYmFzZSBjaGFubmVs LgogKgogKiBASUVFRTgwMjExX0hXX1NVUFBPUlRTX0FNU0RVX0lOX0FNUERVOiBUaGUgZHJpdmVy IHN1cHBvcnRzIHJlY2VpdmluZyBBLU1TRFVzCiAqCXdpdGhpbiBBLU1QRFUuCiAqCiAqIEBJRUVF ODAyMTFfSFdfQkVBQ09OX1RYX1NUQVRVUzogVGhlIGRldmljZS9kcml2ZXIgcHJvdmlkZXMgVFgg c3RhdHVzCiAqCWZvciBzZW50IGJlYWNvbnMuCiAqCiAqIEBJRUVFODAyMTFfSFdfTkVFRFNfVU5J UVVFX1NUQV9BRERSOiBIYXJkd2FyZSAob3IgZHJpdmVyKSByZXF1aXJlcyB0aGF0IGVhY2gKICoJ c3RhdGlvbiBoYXMgYSB1bmlxdWUgYWRkcmVzcywgaS5lLiBlYWNoIHN0YXRpb24gZW50cnkgY2Fu IGJlIGlkZW50aWZpZWQKICoJYnkganVzdCBpdHMgTUFDIGFkZHJlc3M7IHRoaXMgcHJldmVudHMs IGZvciBleGFtcGxlLCB0aGUgc2FtZSBzdGF0aW9uCiAqCWZyb20gY29ubmVjdGluZyB0byB0d28g dmlydHVhbCBBUCBpbnRlcmZhY2VzIGF0IHRoZSBzYW1lIHRpbWUuCiAqCiAqIEBJRUVFODAyMTFf SFdfU1VQUE9SVFNfUkVPUkRFUklOR19CVUZGRVI6IEhhcmR3YXJlIChvciBkcml2ZXIpIG1hbmFn ZXMgdGhlCiAqCXJlb3JkZXJpbmcgYnVmZmVyIGludGVybmFsbHksIGd1YXJhbnRlZWluZyBtYWM4 MDIxMSByZWNlaXZlcyBmcmFtZXMgaW4KICoJb3JkZXIgYW5kIGRvZXMgbm90IG5lZWQgdG8gbWFu YWdlIGl0cyBvd24gcmVvcmRlciBidWZmZXIgb3IgQkEgc2Vzc2lvbgogKgl0aW1lb3V0LgogKgog KiBASUVFRTgwMjExX0hXX1VTRVNfUlNTOiBUaGUgZGV2aWNlIHVzZXMgUlNTIGFuZCB0aHVzIHJl cXVpcmVzIHBhcmFsbGVsIFJYLAogKgl3aGljaCBpbXBsaWVzIHVzaW5nIHBlci1DUFUgc3RhdGlv biBzdGF0aXN0aWNzLgogKgogKiBASUVFRTgwMjExX0hXX1RYX0FNU0RVOiBIYXJkd2FyZSAob3Ig ZHJpdmVyKSBzdXBwb3J0cyBzb2Z0d2FyZSBhZ2dyZWdhdGVkCiAqCUEtTVNEVSBmcmFtZXMuIFJl cXVpcmVzIHNvZnR3YXJlIHR4IHF1ZXVlaW5nIGFuZCBmYXN0LXhtaXQgc3VwcG9ydC4KICoJV2hl biBub3QgdXNpbmcgbWluc3RyZWwvbWluc3RyZWxfaHQgcmF0ZSBjb250cm9sLCB0aGUgZHJpdmVy IG11c3QKICoJbGltaXQgdGhlIG1heGltdW0gQS1NU0RVIHNpemUgYmFzZWQgb24gdGhlIGN1cnJl bnQgdHggcmF0ZSBieSBzZXR0aW5nCiAqCW1heF9yY19hbXNkdV9sZW4gaW4gc3RydWN0IGllZWU4 MDIxMV9zdGEuCiAqCiAqIEBJRUVFODAyMTFfSFdfVFhfRlJBR19MSVNUOiBIYXJkd2FyZSAob3Ig ZHJpdmVyKSBzdXBwb3J0cyBzZW5kaW5nIGZyYWdfbGlzdAogKglza2JzLCBuZWVkZWQgZm9yIHpl cm8tY29weSBzb2Z0d2FyZSBBLU1TRFUuCiAqCiAqIEBJRUVFODAyMTFfSFdfUkVQT1JUU19MT1df QUNLOiBUaGUgZHJpdmVyIChvciBmaXJtd2FyZSkgcmVwb3J0cyBsb3cgYWNrIGV2ZW50CiAqCWJ5 IGllZWU4MDIxMV9yZXBvcnRfbG93X2FjaygpIGJhc2VkIG9uIGl0cyBvd24gYWxnb3JpdGhtLiBG b3Igc3VjaAogKglkcml2ZXJzLCBtYWM4MDIxMSBwYWNrZXQgbG9zcyBtZWNoYW5pc20gd2lsbCBu b3QgYmUgdHJpZ2dlcmVkIGFuZCBkcml2ZXIKICoJaXMgY29tcGxldGVseSBkZXBlbmRpbmcgb24g ZmlybXdhcmUgZXZlbnQgZm9yIHN0YXRpb24ga2lja291dC4KICoKICogQElFRUU4MDIxMV9IV19T VVBQT1JUU19UWF9GUkFHOiBIYXJkd2FyZSBkb2VzIGZyYWdtZW50YXRpb24gYnkgaXRzZWxmLgog KglUaGUgc3RhY2sgd2lsbCBub3QgZG8gZnJhZ21lbnRhdGlvbi4KICoJVGhlIGNhbGxiYWNrIGZv ciBAc2V0X2ZyYWdfdGhyZXNob2xkIHNob3VsZCBiZSBzZXQgYXMgd2VsbC4KICoKICogQElFRUU4 MDIxMV9IV19TVVBQT1JUU19URExTX0JVRkZFUl9TVEE6IEhhcmR3YXJlIHN1cHBvcnRzIGJ1ZmZl ciBTVEEgb24KICoJVERMUyBsaW5rcy4KICoKICogQElFRUU4MDIxMV9IV19ERUFVVEhfTkVFRF9N R0RfVFhfUFJFUDogVGhlIGRyaXZlciByZXF1aXJlcyB0aGUKICoJbWdkX3ByZXBhcmVfdHgoKSBj YWxsYmFjayB0byBiZSBjYWxsZWQgYmVmb3JlIHRyYW5zbWlzc2lvbiBvZiBhCiAqCWRlYXV0aGVu dGljYXRpb24gZnJhbWUgaW4gY2FzZSB0aGUgYXNzb2NpYXRpb24gd2FzIGNvbXBsZXRlZCBidXQg bm8KICoJYmVhY29uIHdhcyBoZWFyZC4gVGhpcyBpcyByZXF1aXJlZCBpbiBtdWx0aS1jaGFubmVs IHNjZW5hcmlvcywgd2hlcmUgdGhlCiAqCXZpcnR1YWwgaW50ZXJmYWNlIG1pZ2h0IG5vdCBiZSBn aXZlbiBhaXIgdGltZSBmb3IgdGhlIHRyYW5zbWlzc2lvbiBvZgogKgl0aGUgZnJhbWUsIGFzIGl0 IGlzIG5vdCBzeW5jZWQgd2l0aCB0aGUgQVAvUDJQIEdPIHlldCwgYW5kIHRodXMgdGhlCiAqCWRl YXV0aGVudGljYXRpb24gZnJhbWUgbWlnaHQgbm90IGJlIHRyYW5zbWl0dGVkLgogKgogKiBASUVF RTgwMjExX0hXX0RPRVNOVF9TVVBQT1JUX1FPU19ORFA6IFRoZSBkcml2ZXIgKG9yIGZpcm13YXJl KSBkb2Vzbid0CiAqCXN1cHBvcnQgUW9TIE5EUCBmb3IgQVAgcHJvYmluZyAtIHRoYXQncyBtb3N0 IGxpa2VseSBhIGRyaXZlciBidWcuCiAqCiAqIEBJRUVFODAyMTFfSFdfQlVGRl9NTVBEVV9UWFE6 IHVzZSB0aGUgVFhRIGZvciBidWZmZXJhYmxlIE1NUERVcywgdGhpcyBvZgogKgljb3Vyc2UgcmVx dWlyZXMgdGhlIGRyaXZlciB0byB1c2UgVFhRcyB0byBzdGFydCB3aXRoLgogKgogKiBASUVFRTgw MjExX0hXX1NVUFBPUlRTX1ZIVF9FWFRfTlNTX0JXOiAoSGFyZHdhcmUpIHJhdGUgY29udHJvbCBz dXBwb3J0cyBWSFQKICoJZXh0ZW5kZWQgTlNTIEJXIChkb3QxMVZIVEV4dGVuZGVkTlNTQldDYXBh YmxlKS4gVGhpcyBmbGFnIHdpbGwgYmUgc2V0IGlmCiAqCXRoZSBzZWxlY3RlZCByYXRlIGNvbnRy b2wgYWxnb3JpdGhtIHNldHMgJVJBVEVfQ1RSTF9DQVBBX1ZIVF9FWFRfTlNTX0JXCiAqCWJ1dCBp ZiB0aGUgcmF0ZSBjb250cm9sIGlzIGJ1aWx0LWluIHRoZW4gaXQgbXVzdCBiZSBzZXQgYnkgdGhl IGRyaXZlci4KICoJU2VlIGFsc28gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgZmxhZy4KICoK ICogQElFRUU4MDIxMV9IV19TVEFfTU1QRFVfVFhROiB1c2UgdGhlIGV4dHJhIG5vbi1USUQgcGVy LXN0YXRpb24gVFhRIGZvciBhbGwKICoJTU1QRFVzIG9uIHN0YXRpb24gaW50ZXJmYWNlcy4gVGhp cyBvZiBjb3Vyc2UgcmVxdWlyZXMgdGhlIGRyaXZlciB0byB1c2UKICoJVFhRcyB0byBzdGFydCB3 aXRoLgogKgogKiBASUVFRTgwMjExX0hXX1RYX1NUQVRVU19OT19BTVBEVV9MRU46IERyaXZlciBk b2VzIG5vdCByZXBvcnQgYWNjdXJhdGUgQS1NUERVCiAqCWxlbmd0aCBpbiB0eCBzdGF0dXMgaW5m b3JtYXRpb24KICoKICogQElFRUU4MDIxMV9IV19TVVBQT1JUU19NVUxUSV9CU1NJRDogSGFyZHdh cmUgc3VwcG9ydHMgbXVsdGkgQlNTSUQKICoKICogQElFRUU4MDIxMV9IV19TVVBQT1JUU19PTkxZ X0hFX01VTFRJX0JTU0lEOiBIYXJkd2FyZSBzdXBwb3J0cyBtdWx0aSBCU1NJRAogKglvbmx5IGZv ciBIRSBBUHMuIEFwcGxpZXMgaWYgQElFRUU4MDIxMV9IV19TVVBQT1JUU19NVUxUSV9CU1NJRCBp cyBzZXQuCiAqCiAqIEBJRUVFODAyMTFfSFdfQU1QRFVfS0VZQk9SREVSX1NVUFBPUlQ6IFRoZSBj YXJkIGFuZCBkcml2ZXIgaXMgb25seQogKglhZ2dyZWdhdGluZyBNUERVcyB3aXRoIHRoZSBzYW1l IGtleWlkLCBhbGxvd2luZyBtYWM4MDIxMSB0byBrZWVwIFR4CiAqCUEtTVBEVSBzZXNzaW9ucyBh Y3RpdmUgd2hpbGUgcmVrZXlpbmcgd2l0aCBFeHRlbmRlZCBLZXkgSUQuCiAqCiAqIEBOVU1fSUVF RTgwMjExX0hXX0ZMQUdTOiBudW1iZXIgb2YgaGFyZHdhcmUgZmxhZ3MsIHVzZWQgZm9yIHNpemlu ZyBhcnJheXMKICovCmVudW0gaWVlZTgwMjExX2h3X2ZsYWdzIHsKCUlFRUU4MDIxMV9IV19IQVNf UkFURV9DT05UUk9MLAoJSUVFRTgwMjExX0hXX1JYX0lOQ0xVREVTX0ZDUywKCUlFRUU4MDIxMV9I V19IT1NUX0JST0FEQ0FTVF9QU19CVUZGRVJJTkcsCglJRUVFODAyMTFfSFdfU0lHTkFMX1VOU1BF QywKCUlFRUU4MDIxMV9IV19TSUdOQUxfREJNLAoJSUVFRTgwMjExX0hXX05FRURfRFRJTV9CRUZP UkVfQVNTT0MsCglJRUVFODAyMTFfSFdfU1BFQ1RSVU1fTUdNVCwKCUlFRUU4MDIxMV9IV19BTVBE VV9BR0dSRUdBVElPTiwKCUlFRUU4MDIxMV9IV19TVVBQT1JUU19QUywKCUlFRUU4MDIxMV9IV19Q U19OVUxMRlVOQ19TVEFDSywKCUlFRUU4MDIxMV9IV19TVVBQT1JUU19EWU5BTUlDX1BTLAoJSUVF RTgwMjExX0hXX01GUF9DQVBBQkxFLAoJSUVFRTgwMjExX0hXX1dBTlRfTU9OSVRPUl9WSUYsCglJ RUVFODAyMTFfSFdfTk9fQVVUT19WSUYsCglJRUVFODAyMTFfSFdfU1dfQ1JZUFRPX0NPTlRST0ws CglJRUVFODAyMTFfSFdfU1VQUE9SVF9GQVNUX1hNSVQsCglJRUVFODAyMTFfSFdfUkVQT1JUU19U WF9BQ0tfU1RBVFVTLAoJSUVFRTgwMjExX0hXX0NPTk5FQ1RJT05fTU9OSVRPUiwKCUlFRUU4MDIx MV9IV19RVUVVRV9DT05UUk9MLAoJSUVFRTgwMjExX0hXX1NVUFBPUlRTX1BFUl9TVEFfR1RLLAoJ SUVFRTgwMjExX0hXX0FQX0xJTktfUFMsCglJRUVFODAyMTFfSFdfVFhfQU1QRFVfU0VUVVBfSU5f SFcsCglJRUVFODAyMTFfSFdfU1VQUE9SVFNfUkNfVEFCTEUsCglJRUVFODAyMTFfSFdfUDJQX0RF Vl9BRERSX0ZPUl9JTlRGLAoJSUVFRTgwMjExX0hXX1RJTUlOR19CRUFDT05fT05MWSwKCUlFRUU4 MDIxMV9IV19TVVBQT1JUU19IVF9DQ0tfUkFURVMsCglJRUVFODAyMTFfSFdfQ0hBTkNUWF9TVEFf Q1NBLAoJSUVFRTgwMjExX0hXX1NVUFBPUlRTX0NMT05FRF9TS0JTLAoJSUVFRTgwMjExX0hXX1NJ TkdMRV9TQ0FOX09OX0FMTF9CQU5EUywKCUlFRUU4MDIxMV9IV19URExTX1dJREVSX0JXLAoJSUVF RTgwMjExX0hXX1NVUFBPUlRTX0FNU0RVX0lOX0FNUERVLAoJSUVFRTgwMjExX0hXX0JFQUNPTl9U WF9TVEFUVVMsCglJRUVFODAyMTFfSFdfTkVFRFNfVU5JUVVFX1NUQV9BRERSLAoJSUVFRTgwMjEx X0hXX1NVUFBPUlRTX1JFT1JERVJJTkdfQlVGRkVSLAoJSUVFRTgwMjExX0hXX1VTRVNfUlNTLAoJ SUVFRTgwMjExX0hXX1RYX0FNU0RVLAoJSUVFRTgwMjExX0hXX1RYX0ZSQUdfTElTVCwKCUlFRUU4 MDIxMV9IV19SRVBPUlRTX0xPV19BQ0ssCglJRUVFODAyMTFfSFdfU1VQUE9SVFNfVFhfRlJBRywK CUlFRUU4MDIxMV9IV19TVVBQT1JUU19URExTX0JVRkZFUl9TVEEsCglJRUVFODAyMTFfSFdfREVB VVRIX05FRURfTUdEX1RYX1BSRVAsCglJRUVFODAyMTFfSFdfRE9FU05UX1NVUFBPUlRfUU9TX05E UCwKCUlFRUU4MDIxMV9IV19CVUZGX01NUERVX1RYUSwKCUlFRUU4MDIxMV9IV19TVVBQT1JUU19W SFRfRVhUX05TU19CVywKCUlFRUU4MDIxMV9IV19TVEFfTU1QRFVfVFhRLAoJSUVFRTgwMjExX0hX X1RYX1NUQVRVU19OT19BTVBEVV9MRU4sCglJRUVFODAyMTFfSFdfU1VQUE9SVFNfTVVMVElfQlNT SUQsCglJRUVFODAyMTFfSFdfU1VQUE9SVFNfT05MWV9IRV9NVUxUSV9CU1NJRCwKCUlFRUU4MDIx MV9IV19BTVBEVV9LRVlCT1JERVJfU1VQUE9SVCwKCgkvKiBrZWVwIGxhc3QsIG9idmlvdXNseSAq LwoJTlVNX0lFRUU4MDIxMV9IV19GTEFHUwp9OwoKLyoqCiAqIHN0cnVjdCBpZWVlODAyMTFfaHcg LSBoYXJkd2FyZSBpbmZvcm1hdGlvbiBhbmQgc3RhdGUKICoKICogVGhpcyBzdHJ1Y3R1cmUgY29u dGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIGhhcmR3YXJlCiAqIGluZm9ybWF0aW9uIGZvciBh biA4MDIuMTEgUEhZLgogKgogKiBAd2lwaHk6IFRoaXMgcG9pbnRzIHRvIHRoZSAmc3RydWN0IHdp cGh5IGFsbG9jYXRlZCBmb3IgdGhpcwogKgk4MDIuMTEgUEhZLiBZb3UgbXVzdCBmaWxsIGluIHRo ZSBAcGVybV9hZGRyIGFuZCBAZGV2CiAqCW1lbWJlcnMgb2YgdGhpcyBzdHJ1Y3R1cmUgdXNpbmcg U0VUX0lFRUU4MDIxMV9ERVYoKQogKglhbmQgU0VUX0lFRUU4MDIxMV9QRVJNX0FERFIoKS4gQWRk aXRpb25hbGx5LCBhbGwgc3VwcG9ydGVkCiAqCWJhbmRzICh3aXRoIGNoYW5uZWxzLCBiaXRyYXRl cykgYXJlIHJlZ2lzdGVyZWQgaGVyZS4KICoKICogQGNvbmY6ICZzdHJ1Y3QgaWVlZTgwMjExX2Nv bmYsIGRldmljZSBjb25maWd1cmF0aW9uLCBkb24ndCB1c2UuCiAqCiAqIEBwcml2OiBwb2ludGVy IHRvIHByaXZhdGUgYXJlYSB0aGF0IHdhcyBhbGxvY2F0ZWQgZm9yIGRyaXZlciB1c2UKICoJYWxv bmcgd2l0aCB0aGlzIHN0cnVjdHVyZS4KICoKICogQGZsYWdzOiBoYXJkd2FyZSBmbGFncywgc2Vl ICZlbnVtIGllZWU4MDIxMV9od19mbGFncy4KICoKICogQGV4dHJhX3R4X2hlYWRyb29tOiBoZWFk cm9vbSB0byByZXNlcnZlIGluIGVhY2ggdHJhbnNtaXQgc2tiCiAqCWZvciB1c2UgYnkgdGhlIGRy aXZlciAoZS5nLiBmb3IgdHJhbnNtaXQgaGVhZGVycy4pCiAqCiAqIEBleHRyYV9iZWFjb25fdGFp bHJvb206IHRhaWxyb29tIHRvIHJlc2VydmUgaW4gZWFjaCBiZWFjb24gdHggc2tiLgogKglDYW4g YmUgdXNlZCBieSBkcml2ZXJzIHRvIGFkZCBleHRyYSBJRXMuCiAqCiAqIEBtYXhfc2lnbmFsOiBN YXhpbXVtIHZhbHVlIGZvciBzaWduYWwgKHJzc2kpIGluIFJYIGluZm9ybWF0aW9uLCB1c2VkCiAq CW9ubHkgd2hlbiBASUVFRTgwMjExX0hXX1NJR05BTF9VTlNQRUMgb3IgQElFRUU4MDIxMV9IV19T SUdOQUxfREIKICoKICogQG1heF9saXN0ZW5faW50ZXJ2YWw6IG1heCBsaXN0ZW4gaW50ZXJ2YWwg aW4gdW5pdHMgb2YgYmVhY29uIGludGVydmFsCiAqCXRoYXQgSFcgc3VwcG9ydHMKICoKICogQHF1 ZXVlczogbnVtYmVyIG9mIGF2YWlsYWJsZSBoYXJkd2FyZSB0cmFuc21pdCBxdWV1ZXMgZm9yCiAq CWRhdGEgcGFja2V0cy4gV01NL1FvUyByZXF1aXJlcyBhdCBsZWFzdCBmb3VyLCB0aGVzZQogKglx dWV1ZXMgbmVlZCB0byBoYXZlIGNvbmZpZ3VyYWJsZSBhY2Nlc3MgcGFyYW1ldGVycy4KICoKICog QHJhdGVfY29udHJvbF9hbGdvcml0aG06IHJhdGUgY29udHJvbCBhbGdvcml0aG0gZm9yIHRoaXMg aGFyZHdhcmUuCiAqCUlmIHVuc2V0IChOVUxMKSwgdGhlIGRlZmF1bHQgYWxnb3JpdGhtIHdpbGwg YmUgdXNlZC4gTXVzdCBiZQogKglzZXQgYmVmb3JlIGNhbGxpbmcgaWVlZTgwMjExX3JlZ2lzdGVy X2h3KCkuCiAqCiAqIEB2aWZfZGF0YV9zaXplOiBzaXplIChpbiBieXRlcykgb2YgdGhlIGRydl9w cml2IGRhdGEgYXJlYQogKgl3aXRoaW4gJnN0cnVjdCBpZWVlODAyMTFfdmlmLgogKiBAc3RhX2Rh dGFfc2l6ZTogc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBkcnZfcHJpdiBkYXRhIGFyZWEKICoJd2l0 aGluICZzdHJ1Y3QgaWVlZTgwMjExX3N0YS4KICogQGNoYW5jdHhfZGF0YV9zaXplOiBzaXplIChp biBieXRlcykgb2YgdGhlIGRydl9wcml2IGRhdGEgYXJlYQogKgl3aXRoaW4gJnN0cnVjdCBpZWVl ODAyMTFfY2hhbmN0eF9jb25mLgogKiBAdHhxX2RhdGFfc2l6ZTogc2l6ZSAoaW4gYnl0ZXMpIG9m IHRoZSBkcnZfcHJpdiBkYXRhIGFyZWEKICoJd2l0aGluIEBzdHJ1Y3QgaWVlZTgwMjExX3R4cS4K ICoKICogQG1heF9yYXRlczogbWF4aW11bSBudW1iZXIgb2YgYWx0ZXJuYXRlIHJhdGUgcmV0cnkg c3RhZ2VzIHRoZSBodwogKgljYW4gaGFuZGxlLgogKiBAbWF4X3JlcG9ydF9yYXRlczogbWF4aW11 bSBudW1iZXIgb2YgYWx0ZXJuYXRlIHJhdGUgcmV0cnkgc3RhZ2VzCiAqCXRoZSBodyBjYW4gcmVw b3J0IGJhY2suCiAqIEBtYXhfcmF0ZV90cmllczogbWF4aW11bSBudW1iZXIgb2YgdHJpZXMgZm9y IGVhY2ggc3RhZ2UKICoKICogQG1heF9yeF9hZ2dyZWdhdGlvbl9zdWJmcmFtZXM6IG1heGltdW0g YnVmZmVyIHNpemUgKG51bWJlciBvZgogKglzdWItZnJhbWVzKSB0byBiZSB1c2VkIGZvciBBLU1Q RFUgYmxvY2sgYWNrIHJlY2VpdmVyCiAqCWFnZ3JlZ2F0aW9uLgogKglUaGlzIGlzIG9ubHkgcmVs ZXZhbnQgaWYgdGhlIGRldmljZSBoYXMgcmVzdHJpY3Rpb25zIG9uIHRoZQogKgludW1iZXIgb2Yg c3ViZnJhbWVzLCBpZiBpdCByZWxpZXMgb24gbWFjODAyMTEgdG8gZG8gcmVvcmRlcmluZwogKglp dCBzaG91bGRuJ3QgYmUgc2V0LgogKgogKiBAbWF4X3R4X2FnZ3JlZ2F0aW9uX3N1YmZyYW1lczog bWF4aW11bSBudW1iZXIgb2Ygc3ViZnJhbWVzIGluIGFuCiAqCWFnZ3JlZ2F0ZSBhbiBIVC9IRSBk ZXZpY2Ugd2lsbCB0cmFuc21pdC4gSW4gSFQgQWRkQkEgd2UnbGwKICoJYWR2ZXJ0aXNlIGEgY29u c3RhbnQgdmFsdWUgb2YgNjQgYXMgc29tZSBvbGRlciBBUHMgY3Jhc2ggaWYKICoJdGhlIHdpbmRv dyBzaXplIGlzIHNtYWxsZXIgKGFuIGV4YW1wbGUgaXMgTGlua1N5cyBXUlQxMjBOCiAqCXdpdGgg RlcgdjEuMC4wNyBidWlsZCAwMDIgSnVuIDE4IDIwMTIpLgogKglGb3IgQWRkQkEgdG8gSEUgY2Fw YWJsZSBwZWVycyB0aGlzIHZhbHVlIHdpbGwgYmUgdXNlZC4KICoKICogQG1heF90eF9mcmFnbWVu dHM6IG1heGltdW0gbnVtYmVyIG9mIHR4IGJ1ZmZlcnMgcGVyIChBKS1NU0RVLCBzdW0KICoJb2Yg MSArIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgZm9yIGVhY2ggc2tiIGluIHRoZSBmcmFnX2xp c3QuCiAqCiAqIEBvZmZjaGFubmVsX3R4X2h3X3F1ZXVlOiBIVyBxdWV1ZSBJRCB0byB1c2UgZm9y IG9mZmNoYW5uZWwgVFgKICoJKGlmICVJRUVFODAyMTFfSFdfUVVFVUVfQ09OVFJPTCBpcyBzZXQp CiAqCiAqIEByYWRpb3RhcF9tY3NfZGV0YWlsczogbGlzdHMgd2hpY2ggTUNTIGluZm9ybWF0aW9u IGNhbiB0aGUgSFcKICoJcmVwb3J0cywgYnkgZGVmYXVsdCBpdCBpcyBzZXQgdG8gX01DUywgX0dJ IGFuZCBfQlcgYnV0IGRvZXNuJ3QKICoJaW5jbHVkZSBfRk1ULiBVc2UgJUlFRUU4MDIxMV9SQURJ T1RBUF9NQ1NfSEFWRV9cKiB2YWx1ZXMsIG9ubHkKICoJYWRkaW5nIF9CVyBpcyBzdXBwb3J0ZWQg dG9kYXkuCiAqCiAqIEByYWRpb3RhcF92aHRfZGV0YWlsczogbGlzdHMgd2hpY2ggVkhUIE1DUyBp bmZvcm1hdGlvbiB0aGUgSFcgcmVwb3J0cywKICoJdGhlIGRlZmF1bHQgaXMgX0dJIHwgX0JBTkRX SURUSC4KICoJVXNlIHRoZSAlSUVFRTgwMjExX1JBRElPVEFQX1ZIVF9LTk9XTl9cKiB2YWx1ZXMu CiAqCiAqIEByYWRpb3RhcF9oZTogSEUgcmFkaW90YXAgdmFsaWRpdHkgZmxhZ3MKICoKICogQHJh ZGlvdGFwX3RpbWVzdGFtcDogSW5mb3JtYXRpb24gZm9yIHRoZSByYWRpb3RhcCB0aW1lc3RhbXAg ZmllbGQ7IGlmIHRoZQogKglAdW5pdHNfcG9zIG1lbWJlciBpcyBzZXQgdG8gYSBub24tbmVnYXRp dmUgdmFsdWUgdGhlbiB0aGUgdGltZXN0YW1wCiAqCWZpZWxkIHdpbGwgYmUgYWRkZWQgYW5kIHBv cHVsYXRlZCBmcm9tIHRoZSAmc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMKICoJZGV2aWNlX3Rp bWVzdGFtcC4KICogQHJhZGlvdGFwX3RpbWVzdGFtcC51bml0c19wb3M6IE11c3QgYmUgc2V0IHRv IGEgY29tYmluYXRpb24gb2YgYQogKglJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QX1VOSVRf KiBhbmQgYQogKglJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QX1NQT1NfKiB2YWx1ZS4KICog QHJhZGlvdGFwX3RpbWVzdGFtcC5hY2N1cmFjeTogSWYgbm9uLW5lZ2F0aXZlLCBmaWxscyB0aGUg YWNjdXJhY3kgaW4gdGhlCiAqCXJhZGlvdGFwIGZpZWxkIGFuZCB0aGUgYWNjdXJhY3kga25vd24g ZmxhZyB3aWxsIGJlIHNldC4KICoKICogQG5ldGRldl9mZWF0dXJlczogbmV0ZGV2IGZlYXR1cmVz IHRvIGJlIHNldCBpbiBlYWNoIG5ldGRldiBjcmVhdGVkCiAqCWZyb20gdGhpcyBIVy4gTm90ZSB0 aGF0IG5vdCBhbGwgZmVhdHVyZXMgYXJlIHVzYWJsZSB3aXRoIG1hYzgwMjExLAogKglvdGhlciBm ZWF0dXJlcyB3aWxsIGJlIHJlamVjdGVkIGR1cmluZyBIVyByZWdpc3RyYXRpb24uCiAqCiAqIEB1 YXBzZF9xdWV1ZXM6IFRoaXMgYml0bWFwIGlzIGluY2x1ZGVkIGluIChyZSlhc3NvY2lhdGlvbiBm cmFtZSB0byBpbmRpY2F0ZQogKglmb3IgZWFjaCBhY2Nlc3MgY2F0ZWdvcnkgaWYgaXQgaXMgdUFQ U0QgdHJpZ2dlci1lbmFibGVkIGFuZCBkZWxpdmVyeS0KICoJZW5hYmxlZC4gVXNlIElFRUU4MDIx MV9XTU1fSUVfU1RBX1FPU0lORk9fQUNfKiB0byBzZXQgdGhpcyBiaXRtYXAuCiAqCUVhY2ggYml0 IGNvcnJlc3BvbmRzIHRvIGRpZmZlcmVudCBBQy4gVmFsdWUgJzEnIGluIHNwZWNpZmljIGJpdCBt ZWFucwogKgl0aGF0IGNvcnJlc3BvbmRpbmcgQUMgaXMgYm90aCB0cmlnZ2VyLSBhbmQgZGVsaXZl cnktZW5hYmxlZC4gJzAnIG1lYW5zCiAqCW5laXRoZXIgZW5hYmxlZC4KICoKICogQHVhcHNkX21h eF9zcF9sZW46IG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGJ1ZmZlcmVkIGZyYW1lcyB0aGUgV01N IEFQIG1heQogKglkZWxpdmVyIHRvIGEgV01NIFNUQSBkdXJpbmcgYW55IFNlcnZpY2UgUGVyaW9k IHRyaWdnZXJlZCBieSB0aGUgV01NIFNUQS4KICoJVXNlIElFRUU4MDIxMV9XTU1fSUVfU1RBX1FP U0lORk9fU1BfKiBmb3IgY29ycmVjdCB2YWx1ZXMuCiAqCiAqIEBuX2NpcGhlcl9zY2hlbWVzOiBh IHNpemUgb2YgYW4gYXJyYXkgb2YgY2lwaGVyIHNjaGVtZXMgZGVmaW5pdGlvbnMuCiAqIEBjaXBo ZXJfc2NoZW1lczogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNpcGhlciBzY2hlbWUgZGVmaW5p dGlvbnMKICoJc3VwcG9ydGVkIGJ5IEhXLgogKiBAbWF4X25hbl9kZV9lbnRyaWVzOiBtYXhpbXVt IG51bWJlciBvZiBOQU4gREUgZnVuY3Rpb25zIHN1cHBvcnRlZCBieSB0aGUKICoJZGV2aWNlLgog KgogKiBAdHhfc2tfcGFjaW5nX3NoaWZ0OiBQYWNpbmcgc2hpZnQgdG8gc2V0IG9uIFRDUCBzb2Nr ZXRzIHdoZW4gZnJhbWVzIGZyb20KICoJdGhlbSBhcmUgZW5jb3VudGVyZWQuIFRoZSBkZWZhdWx0 IHNob3VsZCB0eXBpY2FsbHkgbm90IGJlIGNoYW5nZWQsCiAqCXVubGVzcyB0aGUgZHJpdmVyIGhh cyBnb29kIHJlYXNvbnMgZm9yIG5lZWRpbmcgbW9yZSBidWZmZXJzLgogKgogKiBAd2VpZ2h0X211 bHRpcGxpZXI6IERyaXZlciBzcGVjaWZpYyBhaXJ0aW1lIHdlaWdodCBtdWx0aXBsaWVyIHVzZWQg d2hpbGUKICoJcmVmaWxsaW5nIGRlZmljaXQgb2YgZWFjaCBUWFEuCiAqCiAqIEBtYXhfbXR1OiB0 aGUgbWF4IG10dSBjb3VsZCBiZSBzZXQuCiAqLwpzdHJ1Y3QgaWVlZTgwMjExX2h3IHsKCXN0cnVj dCBpZWVlODAyMTFfY29uZiBjb25mOwoJc3RydWN0IHdpcGh5ICp3aXBoeTsKCWNvbnN0IGNoYXIg KnJhdGVfY29udHJvbF9hbGdvcml0aG07Cgl2b2lkICpwcml2OwoJdW5zaWduZWQgbG9uZyBmbGFn c1tCSVRTX1RPX0xPTkdTKE5VTV9JRUVFODAyMTFfSFdfRkxBR1MpXTsKCXVuc2lnbmVkIGludCBl eHRyYV90eF9oZWFkcm9vbTsKCXVuc2lnbmVkIGludCBleHRyYV9iZWFjb25fdGFpbHJvb207Cglp bnQgdmlmX2RhdGFfc2l6ZTsKCWludCBzdGFfZGF0YV9zaXplOwoJaW50IGNoYW5jdHhfZGF0YV9z aXplOwoJaW50IHR4cV9kYXRhX3NpemU7Cgl1MTYgcXVldWVzOwoJdTE2IG1heF9saXN0ZW5faW50 ZXJ2YWw7CglzOCBtYXhfc2lnbmFsOwoJdTggbWF4X3JhdGVzOwoJdTggbWF4X3JlcG9ydF9yYXRl czsKCXU4IG1heF9yYXRlX3RyaWVzOwoJdTE2IG1heF9yeF9hZ2dyZWdhdGlvbl9zdWJmcmFtZXM7 Cgl1MTYgbWF4X3R4X2FnZ3JlZ2F0aW9uX3N1YmZyYW1lczsKCXU4IG1heF90eF9mcmFnbWVudHM7 Cgl1OCBvZmZjaGFubmVsX3R4X2h3X3F1ZXVlOwoJdTggcmFkaW90YXBfbWNzX2RldGFpbHM7Cgl1 MTYgcmFkaW90YXBfdmh0X2RldGFpbHM7CglzdHJ1Y3QgewoJCWludCB1bml0c19wb3M7CgkJczE2 IGFjY3VyYWN5OwoJfSByYWRpb3RhcF90aW1lc3RhbXA7CgluZXRkZXZfZmVhdHVyZXNfdCBuZXRk ZXZfZmVhdHVyZXM7Cgl1OCB1YXBzZF9xdWV1ZXM7Cgl1OCB1YXBzZF9tYXhfc3BfbGVuOwoJdTgg bl9jaXBoZXJfc2NoZW1lczsKCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfY2lwaGVyX3NjaGVtZSAq Y2lwaGVyX3NjaGVtZXM7Cgl1OCBtYXhfbmFuX2RlX2VudHJpZXM7Cgl1OCB0eF9za19wYWNpbmdf c2hpZnQ7Cgl1OCB3ZWlnaHRfbXVsdGlwbGllcjsKCXUzMiBtYXhfbXR1Owp9OwoKc3RhdGljIGlu bGluZSBib29sIF9pZWVlODAyMTFfaHdfY2hlY2soc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCgkJ CQkgICAgICAgZW51bSBpZWVlODAyMTFfaHdfZmxhZ3MgZmxnKQp7CglyZXR1cm4gdGVzdF9iaXQo ZmxnLCBody0+ZmxhZ3MpOwp9CiNkZWZpbmUgaWVlZTgwMjExX2h3X2NoZWNrKGh3LCBmbGcpCV9p ZWVlODAyMTFfaHdfY2hlY2soaHcsIElFRUU4MDIxMV9IV18jI2ZsZykKCnN0YXRpYyBpbmxpbmUg dm9pZCBfaWVlZTgwMjExX2h3X3NldChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJCSAgICAg ZW51bSBpZWVlODAyMTFfaHdfZmxhZ3MgZmxnKQp7CglyZXR1cm4gX19zZXRfYml0KGZsZywgaHct PmZsYWdzKTsKfQojZGVmaW5lIGllZWU4MDIxMV9od19zZXQoaHcsIGZsZykJX2llZWU4MDIxMV9o d19zZXQoaHcsIElFRUU4MDIxMV9IV18jI2ZsZykKCi8qKgogKiBzdHJ1Y3QgaWVlZTgwMjExX3Nj YW5fcmVxdWVzdCAtIGh3IHNjYW4gcmVxdWVzdAogKgogKiBAaWVzOiBwb2ludGVycyBkaWZmZXJl bnQgcGFydHMgb2YgSUVzIChpbiByZXEuaWUpCiAqIEByZXE6IGNmZzgwMjExIHJlcXVlc3QuCiAq LwpzdHJ1Y3QgaWVlZTgwMjExX3NjYW5fcmVxdWVzdCB7CglzdHJ1Y3QgaWVlZTgwMjExX3NjYW5f aWVzIGllczsKCgkvKiBLZWVwIGxhc3QgKi8KCXN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3Qg cmVxOwp9OwoKLyoqCiAqIHN0cnVjdCBpZWVlODAyMTFfdGRsc19jaF9zd19wYXJhbXMgLSBURExT IGNoYW5uZWwgc3dpdGNoIHBhcmFtZXRlcnMKICoKICogQHN0YTogcGVlciB0aGlzIFRETFMgY2hh bm5lbC1zd2l0Y2ggcmVxdWVzdC9yZXNwb25zZSBjYW1lIGZyb20KICogQGNoYW5kZWY6IGNoYW5u ZWwgcmVmZXJlbmNlZCBpbiBhIFRETFMgY2hhbm5lbC1zd2l0Y2ggcmVxdWVzdAogKiBAYWN0aW9u X2NvZGU6IHNlZSAmZW51bSBpZWVlODAyMTFfdGRsc19hY3Rpb25jb2RlCiAqIEBzdGF0dXM6IGNo YW5uZWwtc3dpdGNoIHJlc3BvbnNlIHN0YXR1cwogKiBAdGltZXN0YW1wOiB0aW1lIGF0IHdoaWNo IHRoZSBmcmFtZSB3YXMgcmVjZWl2ZWQKICogQHN3aXRjaF90aW1lOiBzd2l0Y2gtdGltaW5nIHBh cmFtZXRlciByZWNlaXZlZCBpbiB0aGUgZnJhbWUKICogQHN3aXRjaF90aW1lb3V0OiBzd2l0Y2gt dGltaW5nIHBhcmFtZXRlciByZWNlaXZlZCBpbiB0aGUgZnJhbWUKICogQHRtcGxfc2tiOiBURExT IHN3aXRjaC1jaGFubmVsIHJlc3BvbnNlIHRlbXBsYXRlCiAqIEBjaF9zd190bV9pZTogb2Zmc2V0 IG9mIHRoZSBjaGFubmVsLXN3aXRjaCB0aW1pbmcgSUUgaW5zaWRlIEB0bXBsX3NrYgogKi8Kc3Ry dWN0IGllZWU4MDIxMV90ZGxzX2NoX3N3X3BhcmFtcyB7CglzdHJ1Y3QgaWVlZTgwMjExX3N0YSAq c3RhOwoJc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjaGFuZGVmOwoJdTggYWN0aW9uX2NvZGU7 Cgl1MzIgc3RhdHVzOwoJdTMyIHRpbWVzdGFtcDsKCXUxNiBzd2l0Y2hfdGltZTsKCXUxNiBzd2l0 Y2hfdGltZW91dDsKCXN0cnVjdCBza19idWZmICp0bXBsX3NrYjsKCXUzMiBjaF9zd190bV9pZTsK fTsKCi8qKgogKiB3aXBoeV90b19pZWVlODAyMTFfaHcgLSByZXR1cm4gYSBtYWM4MDIxMSBkcml2 ZXIgaHcgc3RydWN0IGZyb20gYSB3aXBoeQogKgogKiBAd2lwaHk6IHRoZSAmc3RydWN0IHdpcGh5 IHdoaWNoIHdlIHdhbnQgdG8gcXVlcnkKICoKICogbWFjODAyMTEgZHJpdmVycyBjYW4gdXNlIHRo aXMgdG8gZ2V0IHRvIHRoZWlyIHJlc3BlY3RpdmUKICogJnN0cnVjdCBpZWVlODAyMTFfaHcuIERy aXZlcnMgd2lzaGluZyB0byBnZXQgdG8gdGhlaXIgb3duIHByaXZhdGUKICogc3RydWN0dXJlIGNh biB0aGVuIGFjY2VzcyBpdCB2aWEgaHctPnByaXYuIE5vdGUgdGhhdCBtYWM4MDIxMTEgZHJpdmVy cyBzaG91bGQKICogbm90IHVzZSB3aXBoeV9wcml2KCkgdG8gdHJ5IHRvIGdldCB0aGVpciBwcml2 YXRlIGRyaXZlciBzdHJ1Y3R1cmUgYXMgdGhpcwogKiBpcyBhbHJlYWR5IHVzZWQgaW50ZXJuYWxs eSBieSBtYWM4MDIxMS4KICoKICogUmV0dXJuOiBUaGUgbWFjODAyMTEgZHJpdmVyIGh3IHN0cnVj dCBvZiBAd2lwaHkuCiAqLwpzdHJ1Y3QgaWVlZTgwMjExX2h3ICp3aXBoeV90b19pZWVlODAyMTFf aHcoc3RydWN0IHdpcGh5ICp3aXBoeSk7CgovKioKICogU0VUX0lFRUU4MDIxMV9ERVYgLSBzZXQg ZGV2aWNlIGZvciA4MDIuMTEgaGFyZHdhcmUKICoKICogQGh3OiB0aGUgJnN0cnVjdCBpZWVlODAy MTFfaHcgdG8gc2V0IHRoZSBkZXZpY2UgZm9yCiAqIEBkZXY6IHRoZSAmc3RydWN0IGRldmljZSBv ZiB0aGlzIDgwMi4xMSBkZXZpY2UKICovCnN0YXRpYyBpbmxpbmUgdm9pZCBTRVRfSUVFRTgwMjEx X0RFVihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGRldmljZSAqZGV2KQp7CglzZXRf d2lwaHlfZGV2KGh3LT53aXBoeSwgZGV2KTsKfQoKLyoqCiAqIFNFVF9JRUVFODAyMTFfUEVSTV9B RERSIC0gc2V0IHRoZSBwZXJtYW5lbnQgTUFDIGFkZHJlc3MgZm9yIDgwMi4xMSBoYXJkd2FyZQog KgogKiBAaHc6IHRoZSAmc3RydWN0IGllZWU4MDIxMV9odyB0byBzZXQgdGhlIE1BQyBhZGRyZXNz IGZvcgogKiBAYWRkcjogdGhlIGFkZHJlc3MgdG8gc2V0CiAqLwpzdGF0aWMgaW5saW5lIHZvaWQg U0VUX0lFRUU4MDIxMV9QRVJNX0FERFIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGNvbnN0IHU4 ICphZGRyKQp7CgltZW1jcHkoaHctPndpcGh5LT5wZXJtX2FkZHIsIGFkZHIsIEVUSF9BTEVOKTsK fQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKgppZWVlODAyMTFfZ2V0X3R4 X3JhdGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCgkJICAgICAgY29uc3Qgc3RydWN0 IGllZWU4MDIxMV90eF9pbmZvICpjKQp7CglpZiAoV0FSTl9PTl9PTkNFKGMtPmNvbnRyb2wucmF0 ZXNbMF0uaWR4IDwgMCkpCgkJcmV0dXJuIE5VTEw7CglyZXR1cm4gJmh3LT53aXBoeS0+YmFuZHNb Yy0+YmFuZF0tPmJpdHJhdGVzW2MtPmNvbnRyb2wucmF0ZXNbMF0uaWR4XTsKfQoKc3RhdGljIGlu bGluZSBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKgppZWVlODAyMTFfZ2V0X3J0c19jdHNfcmF0ZShj b25zdCBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJICAgY29uc3Qgc3RydWN0IGllZWU4MDIx MV90eF9pbmZvICpjKQp7CglpZiAoYy0+Y29udHJvbC5ydHNfY3RzX3JhdGVfaWR4IDwgMCkKCQly ZXR1cm4gTlVMTDsKCXJldHVybiAmaHctPndpcGh5LT5iYW5kc1tjLT5iYW5kXS0+Yml0cmF0ZXNb Yy0+Y29udHJvbC5ydHNfY3RzX3JhdGVfaWR4XTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgaWVl ZTgwMjExX3JhdGUgKgppZWVlODAyMTFfZ2V0X2FsdF9yZXRyeV9yYXRlKGNvbnN0IHN0cnVjdCBp ZWVlODAyMTFfaHcgKmh3LAoJCQkgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAq YywgaW50IGlkeCkKewoJaWYgKGMtPmNvbnRyb2wucmF0ZXNbaWR4ICsgMV0uaWR4IDwgMCkKCQly ZXR1cm4gTlVMTDsKCXJldHVybiAmaHctPndpcGh5LT5iYW5kc1tjLT5iYW5kXS0+Yml0cmF0ZXNb Yy0+Y29udHJvbC5yYXRlc1tpZHggKyAxXS5pZHhdOwp9CgovKioKICogaWVlZTgwMjExX2ZyZWVf dHhza2IgLSBmcmVlIFRYIHNrYgogKiBAaHc6IHRoZSBoYXJkd2FyZQogKiBAc2tiOiB0aGUgc2ti CiAqCiAqIEZyZWUgYSB0cmFuc21pdCBza2IuIFVzZSB0aGlzIGZ1bmN0aW9uIHdoZW4gc29tZSBm YWlsdXJlCiAqIHRvIHRyYW5zbWl0IGhhcHBlbmVkIGFuZCB0aHVzIHN0YXR1cyBjYW5ub3QgYmUg cmVwb3J0ZWQuCiAqLwp2b2lkIGllZWU4MDIxMV9mcmVlX3R4c2tiKHN0cnVjdCBpZWVlODAyMTFf aHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKCi8qKgogKiBET0M6IEhhcmR3YXJlIGNyeXB0 byBhY2NlbGVyYXRpb24KICoKICogbWFjODAyMTEgaXMgY2FwYWJsZSBvZiB0YWtpbmcgYWR2YW50 YWdlIG9mIG1hbnkgaGFyZHdhcmUKICogYWNjZWxlcmF0aW9uIGRlc2lnbnMgZm9yIGVuY3J5cHRp b24gYW5kIGRlY3J5cHRpb24gb3BlcmF0aW9ucy4KICoKICogVGhlIHNldF9rZXkoKSBjYWxsYmFj ayBpbiB0aGUgJnN0cnVjdCBpZWVlODAyMTFfb3BzIGZvciBhIGdpdmVuCiAqIGRldmljZSBpcyBj YWxsZWQgdG8gZW5hYmxlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBvZiBlbmNyeXB0aW9uIGFuZAog KiBkZWNyeXB0aW9uLiBUaGUgY2FsbGJhY2sgdGFrZXMgYSBAc3RhIHBhcmFtZXRlciB0aGF0IHdp bGwgYmUgTlVMTAogKiBmb3IgZGVmYXVsdCBrZXlzIG9yIGtleXMgdXNlZCBmb3IgdHJhbnNtaXNz aW9uIG9ubHksIG9yIHBvaW50IHRvCiAqIHRoZSBzdGF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUg cGVlciBmb3IgaW5kaXZpZHVhbCBrZXlzLgogKiBNdWx0aXBsZSB0cmFuc21pc3Npb24ga2V5cyB3 aXRoIHRoZSBzYW1lIGtleSBpbmRleCBtYXkgYmUgdXNlZCB3aGVuCiAqIFZMQU5zIGFyZSBjb25m aWd1cmVkIGZvciBhbiBhY2Nlc3MgcG9pbnQuCiAqCiAqIFdoZW4gdHJhbnNtaXR0aW5nLCB0aGUg VFggY29udHJvbCBkYXRhIHdpbGwgdXNlIHRoZSBAaHdfa2V5X2lkeAogKiBzZWxlY3RlZCBieSB0 aGUgZHJpdmVyIGJ5IG1vZGlmeWluZyB0aGUgJnN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYKICog cG9pbnRlZCB0byBieSB0aGUgQGtleSBwYXJhbWV0ZXIgdG8gdGhlIHNldF9rZXkoKSBmdW5jdGlv bi4KICoKICogVGhlIHNldF9rZXkoKSBjYWxsIGZvciB0aGUgJVNFVF9LRVkgY29tbWFuZCBzaG91 bGQgcmV0dXJuIDAgaWYKICogdGhlIGtleSBpcyBub3cgaW4gdXNlLCAtJUVPUE5PVFNVUFAgb3Ig LSVFTk9TUEMgaWYgaXQgY291bGRuJ3QgYmUKICogYWRkZWQ7IGlmIHlvdSByZXR1cm4gMCB0aGVu IGh3X2tleV9pZHggbXVzdCBiZSBhc3NpZ25lZCB0byB0aGUKICogaGFyZHdhcmUga2V5IGluZGV4 LCB5b3UgYXJlIGZyZWUgdG8gdXNlIHRoZSBmdWxsIHU4IHJhbmdlLgogKgogKiBOb3RlIHRoYXQg aW4gdGhlIGNhc2UgdGhhdCB0aGUgQElFRUU4MDIxMV9IV19TV19DUllQVE9fQ09OVFJPTCBmbGFn IGlzCiAqIHNldCwgbWFjODAyMTEgd2lsbCBub3QgYXV0b21hdGljYWxseSBmYWxsIGJhY2sgdG8g c29mdHdhcmUgY3J5cHRvIGlmCiAqIGVuYWJsaW5nIGhhcmR3YXJlIGNyeXB0byBmYWlsZWQuIFRo ZSBzZXRfa2V5KCkgY2FsbCBtYXkgYWxzbyByZXR1cm4gdGhlCiAqIHZhbHVlIDEgdG8gcGVybWl0 IHRoaXMgc3BlY2lmaWMga2V5L2FsZ29yaXRobSB0byBiZSBkb25lIGluIHNvZnR3YXJlLgogKgog KiBXaGVuIHRoZSBjbWQgaXMgJURJU0FCTEVfS0VZIHRoZW4gaXQgbXVzdCBzdWNjZWVkLgogKgog KiBOb3RlIHRoYXQgaXQgaXMgcGVybWlzc2libGUgdG8gbm90IGRlY3J5cHQgYSBmcmFtZSBldmVu IGlmIGEga2V5CiAqIGZvciBpdCBoYXMgYmVlbiB1cGxvYWRlZCB0byBoYXJkd2FyZSwgdGhlIHN0 YWNrIHdpbGwgbm90IG1ha2UgYW55CiAqIGRlY2lzaW9uIGJhc2VkIG9uIHdoZXRoZXIgYSBrZXkg aGFzIGJlZW4gdXBsb2FkZWQgb3Igbm90IGJ1dCByYXRoZXIKICogYmFzZWQgb24gdGhlIHJlY2Vp dmUgZmxhZ3MuCiAqCiAqIFRoZSAmc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiBzdHJ1Y3R1cmUg cG9pbnRlZCB0byBieSB0aGUgQGtleQogKiBwYXJhbWV0ZXIgaXMgZ3VhcmFudGVlZCB0byBiZSB2 YWxpZCB1bnRpbCBhbm90aGVyIGNhbGwgdG8gc2V0X2tleSgpCiAqIHJlbW92ZXMgaXQsIGJ1dCBp dCBjYW4gb25seSBiZSB1c2VkIGFzIGEgY29va2llIHRvIGRpZmZlcmVudGlhdGUKICoga2V5cy4K ICoKICogSW4gVEtJUCBzb21lIEhXIG5lZWQgdG8gYmUgcHJvdmlkZWQgYSBwaGFzZSAxIGtleSwg Zm9yIFJYIGRlY3J5cHRpb24KICogYWNjZWxlcmF0aW9uIChpLmUuIGl3bHdpZmkpLiBUaG9zZSBk cml2ZXJzIHNob3VsZCBwcm92aWRlIHVwZGF0ZV90a2lwX2tleQogKiBoYW5kbGVyLgogKiBUaGUg dXBkYXRlX3RraXBfa2V5KCkgY2FsbCB1cGRhdGVzIHRoZSBkcml2ZXIgd2l0aCB0aGUgbmV3IHBo YXNlIDEga2V5LgogKiBUaGlzIGhhcHBlbnMgZXZlcnkgdGltZSB0aGUgaXYxNiB3cmFwcyBhcm91 bmQgKGV2ZXJ5IDY1NTM2IHBhY2tldHMpLiBUaGUKICogc2V0X2tleSgpIGNhbGwgd2lsbCBoYXBw ZW4gb25seSBvbmNlIGZvciBlYWNoIGtleSAodW5sZXNzIHRoZSBBUCBkaWQKICogcmVrZXlpbmcp LCBpdCB3aWxsIG5vdCBpbmNsdWRlIGEgdmFsaWQgcGhhc2UgMSBrZXkuIFRoZSB2YWxpZCBwaGFz ZSAxIGtleSBpcwogKiBwcm92aWRlZCBieSB1cGRhdGVfdGtpcF9rZXkgb25seS4gVGhlIHRyaWdn ZXIgdGhhdCBtYWtlcyBtYWM4MDIxMSBjYWxsIHRoaXMKICogaGFuZGxlciBpcyBzb2Z0d2FyZSBk ZWNyeXB0aW9uIHdpdGggd3JhcCBhcm91bmQgb2YgaXYxNi4KICoKICogVGhlIHNldF9kZWZhdWx0 X3VuaWNhc3Rfa2V5KCkgY2FsbCB1cGRhdGVzIHRoZSBkZWZhdWx0IFdFUCBrZXkgaW5kZXgKICog Y29uZmlndXJlZCB0byB0aGUgaGFyZHdhcmUgZm9yIFdFUCBlbmNyeXB0aW9uIHR5cGUuIFRoaXMg aXMgcmVxdWlyZWQKICogZm9yIGRldmljZXMgdGhhdCBzdXBwb3J0IG9mZmxvYWQgb2YgZGF0YSBw YWNrZXRzIChlLmcuIEFSUCByZXNwb25zZXMpLgogKgogKiBNYWM4MDIxMSBkcml2ZXJzIHNob3Vs ZCBzZXQgdGhlIEBOTDgwMjExX0VYVF9GRUFUVVJFX0NBTl9SRVBMQUNFX1BUSzAgZmxhZwogKiB3 aGVuIHRoZXkgYXJlIGFibGUgdG8gcmVwbGFjZSBpbi11c2UgUFRLIGtleXMgYWNjb3JkaW5nIHRv IHRvIGZvbGxvd2luZwogKiByZXF1aXJlbWVudHM6CiAqIDEpIFRoZXkgZG8gbm90IGhhbmQgb3Zl ciBmcmFtZXMgZGVjcnlwdGVkIHdpdGggdGhlIG9sZCBrZXkgdG8KICAgICAgbWFjODAyMTEgb25j ZSB0aGUgY2FsbCB0byBzZXRfa2V5KCkgd2l0aCBjb21tYW5kICVESVNBQkxFX0tFWSBoYXMgYmVl bgogICAgICBjb21wbGV0ZWQgd2hlbiBhbHNvIHNldHRpbmcgQElFRUU4MDIxMV9LRVlfRkxBR19H RU5FUkFURV9JViBmb3IgYW55IGtleSwKICAgMikgZWl0aGVyIGRyb3Agb3IgY29udGludWUgdG8g dXNlIHRoZSBvbGQga2V5IGZvciBhbnkgb3V0Z29pbmcgZnJhbWVzIHF1ZXVlZAogICAgICBhdCB0 aGUgdGltZSBvZiB0aGUga2V5IGRlbGV0aW9uIChpbmNsdWRpbmcgcmUtdHJhbnNtaXRzKSwKICAg MykgbmV2ZXIgc2VuZCBvdXQgYSBmcmFtZSBxdWV1ZWQgcHJpb3IgdG8gdGhlIHNldF9rZXkoKSAl U0VUX0tFWSBjb21tYW5kCiAgICAgIGVuY3J5cHRlZCB3aXRoIHRoZSBuZXcga2V5IGFuZAogICA0 KSBuZXZlciBzZW5kIG91dCBhIGZyYW1lIHVuZW5jcnlwdGVkIHdoZW4gaXQgc2hvdWxkIGJlIGVu Y3J5cHRlZC4KICAgTWFjODAyMTEgd2lsbCBub3QgcXVldWUgYW55IG5ldyBmcmFtZXMgZm9yIGEg ZGVsZXRlZCBrZXkgdG8gdGhlIGRyaXZlci4KICovCgovKioKICogRE9DOiBQb3dlcnNhdmUgc3Vw cG9ydAogKgogKiBtYWM4MDIxMSBoYXMgc3VwcG9ydCBmb3IgdmFyaW91cyBwb3dlcnNhdmUgaW1w bGVtZW50YXRpb25zLgogKgogKiBGaXJzdCwgaXQgY2FuIHN1cHBvcnQgaGFyZHdhcmUgdGhhdCBo YW5kbGVzIGFsbCBwb3dlcnNhdmluZyBieSBpdHNlbGYsCiAqIHN1Y2ggaGFyZHdhcmUgc2hvdWxk IHNpbXBseSBzZXQgdGhlICVJRUVFODAyMTFfSFdfU1VQUE9SVFNfUFMgaGFyZHdhcmUKICogZmxh Zy4gSW4gdGhhdCBjYXNlLCBpdCB3aWxsIGJlIHRvbGQgYWJvdXQgdGhlIGRlc2lyZWQgcG93ZXJz YXZlIG1vZGUKICogd2l0aCB0aGUgJUlFRUU4MDIxMV9DT05GX1BTIGZsYWcgZGVwZW5kaW5nIG9u IHRoZSBhc3NvY2lhdGlvbiBzdGF0dXMuCiAqIFRoZSBoYXJkd2FyZSBtdXN0IHRha2UgY2FyZSBv ZiBzZW5kaW5nIG51bGxmdW5jIGZyYW1lcyB3aGVuIG5lY2Vzc2FyeSwKICogaS5lLiB3aGVuIGVu dGVyaW5nIGFuZCBsZWF2aW5nIHBvd2Vyc2F2ZSBtb2RlLiBUaGUgaGFyZHdhcmUgaXMgcmVxdWly ZWQKICogdG8gbG9vayBhdCB0aGUgQUlEIGluIGJlYWNvbnMgYW5kIHNpZ25hbCB0byB0aGUgQVAg dGhhdCBpdCB3b2tlIHVwIHdoZW4KICogaXQgZmluZHMgdHJhZmZpYyBkaXJlY3RlZCB0byBpdC4K ICoKICogJUlFRUU4MDIxMV9DT05GX1BTIGZsYWcgZW5hYmxlZCBtZWFucyB0aGF0IHRoZSBwb3dl cnNhdmUgbW9kZSBkZWZpbmVkIGluCiAqIElFRUUgODAyLjExLTIwMDcgc2VjdGlvbiAxMS4yIGlz IGVuYWJsZWQuIFRoaXMgaXMgbm90IHRvIGJlIGNvbmZ1c2VkCiAqIHdpdGggaGFyZHdhcmUgd2Fr ZXVwIGFuZCBzbGVlcCBzdGF0ZXMuIERyaXZlciBpcyByZXNwb25zaWJsZSBmb3Igd2FraW5nCiAq IHVwIHRoZSBoYXJkd2FyZSBiZWZvcmUgaXNzdWluZyBjb21tYW5kcyB0byB0aGUgaGFyZHdhcmUg YW5kIHB1dHRpbmcgaXQKICogYmFjayB0byBzbGVlcCBhdCBhcHByb3ByaWF0ZSB0aW1lcy4KICoK ICogV2hlbiBQUyBpcyBlbmFibGVkLCBoYXJkd2FyZSBuZWVkcyB0byB3YWtldXAgZm9yIGJlYWNv bnMgYW5kIHJlY2VpdmUgdGhlCiAqIGJ1ZmZlcmVkIG11bHRpY2FzdC9icm9hZGNhc3QgZnJhbWVz IGFmdGVyIHRoZSBiZWFjb24uIEFsc28gaXQgbXVzdCBiZQogKiBwb3NzaWJsZSB0byBzZW5kIGZy YW1lcyBhbmQgcmVjZWl2ZSB0aGUgYWNrbm93bGVkbWVudCBmcmFtZS4KICoKICogT3RoZXIgaGFy ZHdhcmUgZGVzaWducyBjYW5ub3Qgc2VuZCBudWxsZnVuYyBmcmFtZXMgYnkgdGhlbXNlbHZlcyBh bmQgYWxzbwogKiBuZWVkIHNvZnR3YXJlIHN1cHBvcnQgZm9yIHBhcnNpbmcgdGhlIFRJTSBiaXRt YXAuIFRoaXMgaXMgYWxzbyBzdXBwb3J0ZWQKICogYnkgbWFjODAyMTEgYnkgY29tYmluaW5nIHRo ZSAlSUVFRTgwMjExX0hXX1NVUFBPUlRTX1BTIGFuZAogKiAlSUVFRTgwMjExX0hXX1BTX05VTExG VU5DX1NUQUNLIGZsYWdzLiBUaGUgaGFyZHdhcmUgaXMgb2YgY291cnNlIHN0aWxsCiAqIHJlcXVp cmVkIHRvIHBhc3MgdXAgYmVhY29ucy4gVGhlIGhhcmR3YXJlIGlzIHN0aWxsIHJlcXVpcmVkIHRv IGhhbmRsZQogKiB3YWtpbmcgdXAgZm9yIG11bHRpY2FzdCB0cmFmZmljOyBpZiBpdCBjYW5ub3Qg dGhlIGRyaXZlciBtdXN0IGhhbmRsZSB0aGF0CiAqIGFzIGJlc3QgYXMgaXQgY2FuLCBtYWM4MDIx MSBpcyB0b28gc2xvdyB0byBkbyB0aGF0LgogKgogKiBEeW5hbWljIHBvd2Vyc2F2ZSBpcyBhbiBl eHRlbnNpb24gdG8gbm9ybWFsIHBvd2Vyc2F2ZSBpbiB3aGljaCB0aGUKICogaGFyZHdhcmUgc3Rh eXMgYXdha2UgZm9yIGEgdXNlci1zcGVjaWZpZWQgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgc2VuZGlu ZyBhCiAqIGZyYW1lIHNvIHRoYXQgcmVwbHkgZnJhbWVzIG5lZWQgbm90IGJlIGJ1ZmZlcmVkIGFu ZCB0aGVyZWZvcmUgZGVsYXllZCB0bwogKiB0aGUgbmV4dCB3YWtldXAuIEl0J3MgY29tcHJvbWlz ZSBvZiBnZXR0aW5nIGdvb2QgZW5vdWdoIGxhdGVuY3kgd2hlbgogKiB0aGVyZSdzIGRhdGEgdHJh ZmZpYyBhbmQgc3RpbGwgc2F2aW5nIHNpZ25pZmljYW50bHkgcG93ZXIgaW4gaWRsZQogKiBwZXJp b2RzLgogKgogKiBEeW5hbWljIHBvd2Vyc2F2ZSBpcyBzaW1wbHkgc3VwcG9ydGVkIGJ5IG1hYzgw MjExIGVuYWJsaW5nIGFuZCBkaXNhYmxpbmcKICogUFMgYmFzZWQgb24gdHJhZmZpYy4gRHJpdmVy IG5lZWRzIHRvIG9ubHkgc2V0ICVJRUVFODAyMTFfSFdfU1VQUE9SVFNfUFMKICogZmxhZyBhbmQg bWFjODAyMTEgd2lsbCBoYW5kbGUgZXZlcnl0aGluZyBhdXRvbWF0aWNhbGx5LiBBZGRpdGlvbmFs bHksCiAqIGhhcmR3YXJlIGhhdmluZyBzdXBwb3J0IGZvciB0aGUgZHluYW1pYyBQUyBmZWF0dXJl IG1heSBzZXQgdGhlCiAqICVJRUVFODAyMTFfSFdfU1VQUE9SVFNfRFlOQU1JQ19QUyBmbGFnIHRv IGluZGljYXRlIHRoYXQgaXQgY2FuIHN1cHBvcnQKICogZHluYW1pYyBQUyBtb2RlIGl0c2VsZi4g VGhlIGRyaXZlciBuZWVkcyB0byBsb29rIGF0IHRoZQogKiBAZHluYW1pY19wc190aW1lb3V0IGhh cmR3YXJlIGNvbmZpZ3VyYXRpb24gdmFsdWUgYW5kIHVzZSBpdCB0aGF0IHZhbHVlCiAqIHdoZW5l dmVyICVJRUVFODAyMTFfQ09ORl9QUyBpcyBzZXQuIEluIHRoaXMgY2FzZSBtYWM4MDIxMSB3aWxs IGRpc2FibGUKICogZHluYW1pYyBQUyBmZWF0dXJlIGluIHN0YWNrIGFuZCB3aWxsIGp1c3Qga2Vl cCAlSUVFRTgwMjExX0NPTkZfUFMKICogZW5hYmxlZCB3aGVuZXZlciB1c2VyIGhhcyBlbmFibGVk IHBvd2Vyc2F2ZS4KICoKICogRHJpdmVyIGluZm9ybXMgVS1BUFNEIGNsaWVudCBzdXBwb3J0IGJ5 IGVuYWJsaW5nCiAqICVJRUVFODAyMTFfVklGX1NVUFBPUlRTX1VBUFNEIGZsYWcuIFRoZSBtb2Rl IGlzIGNvbmZpZ3VyZWQgdGhyb3VnaCB0aGUKICogdWFwc2QgcGFyYW1ldGVyIGluIGNvbmZfdHgo KSBvcGVyYXRpb24uIEhhcmR3YXJlIG5lZWRzIHRvIHNlbmQgdGhlIFFvUwogKiBOdWxsZnVuYyBm cmFtZXMgYW5kIHN0YXkgYXdha2UgdW50aWwgdGhlIHNlcnZpY2UgcGVyaW9kIGhhcyBlbmRlZC4g VG8KICogdXRpbGl6ZSBVLUFQU0QsIGR5bmFtaWMgcG93ZXJzYXZlIGlzIGRpc2FibGVkIGZvciB2 b2lwIEFDIGFuZCBhbGwgZnJhbWVzCiAqIGZyb20gdGhhdCBBQyBhcmUgdHJhbnNtaXR0ZWQgd2l0 aCBwb3dlcnNhdmUgZW5hYmxlZC4KICoKICogTm90ZTogVS1BUFNEIGNsaWVudCBtb2RlIGlzIG5v dCB5ZXQgc3VwcG9ydGVkIHdpdGgKICogJUlFRUU4MDIxMV9IV19QU19OVUxMRlVOQ19TVEFDSy4K ICovCgovKioKICogRE9DOiBCZWFjb24gZmlsdGVyIHN1cHBvcnQKICoKICogU29tZSBoYXJkd2Fy ZSBoYXZlIGJlYWNvbiBmaWx0ZXIgc3VwcG9ydCB0byByZWR1Y2UgaG9zdCBjcHUgd2FrZXVwcwog KiB3aGljaCB3aWxsIHJlZHVjZSBzeXN0ZW0gcG93ZXIgY29uc3VtcHRpb24uIEl0IHVzdWFsbHkg d29ya3Mgc28gdGhhdAogKiB0aGUgZmlybXdhcmUgY3JlYXRlcyBhIGNoZWNrc3VtIG9mIHRoZSBi ZWFjb24gYnV0IG9taXRzIGFsbCBjb25zdGFudGx5CiAqIGNoYW5naW5nIGVsZW1lbnRzIChUU0Ys IFRJTSBldGMpLiBXaGVuZXZlciB0aGUgY2hlY2tzdW0gY2hhbmdlcyB0aGUKICogYmVhY29uIGlz IGZvcndhcmRlZCB0byB0aGUgaG9zdCwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUganVzdCBkcm9wcGVk LiBUaGF0CiAqIHdheSB0aGUgaG9zdCB3aWxsIG9ubHkgcmVjZWl2ZSBiZWFjb25zIHdoZXJlIHNv bWUgcmVsZXZhbnQgaW5mb3JtYXRpb24KICogKGZvciBleGFtcGxlIEVSUCBwcm90ZWN0aW9uIG9y IFdNTSBzZXR0aW5ncykgaGF2ZSBjaGFuZ2VkLgogKgogKiBCZWFjb24gZmlsdGVyIHN1cHBvcnQg aXMgYWR2ZXJ0aXNlZCB3aXRoIHRoZSAlSUVFRTgwMjExX1ZJRl9CRUFDT05fRklMVEVSCiAqIGlu dGVyZmFjZSBjYXBhYmlsaXR5LiBUaGUgZHJpdmVyIG5lZWRzIHRvIGVuYWJsZSBiZWFjb24gZmls dGVyIHN1cHBvcnQKICogd2hlbmV2ZXIgcG93ZXIgc2F2ZSBpcyBlbmFibGVkLCB0aGF0IGlzICVJ RUVFODAyMTFfQ09ORl9QUyBpcyBzZXQuIFdoZW4KICogcG93ZXIgc2F2ZSBpcyBlbmFibGVkLCB0 aGUgc3RhY2sgd2lsbCBub3QgY2hlY2sgZm9yIGJlYWNvbiBsb3NzIGFuZCB0aGUKICogZHJpdmVy IG5lZWRzIHRvIG5vdGlmeSBhYm91dCBsb3NzIG9mIGJlYWNvbnMgd2l0aCBpZWVlODAyMTFfYmVh Y29uX2xvc3MoKS4KICoKICogVGhlIHRpbWUgKG9yIG51bWJlciBvZiBiZWFjb25zIG1pc3NlZCkg dW50aWwgdGhlIGZpcm13YXJlIG5vdGlmaWVzIHRoZQogKiBkcml2ZXIgb2YgYSBiZWFjb24gbG9z cyBldmVudCAod2hpY2ggaW4gdHVybiBjYXVzZXMgdGhlIGRyaXZlciB0byBjYWxsCiAqIGllZWU4 MDIxMV9iZWFjb25fbG9zcygpKSBzaG91bGQgYmUgY29uZmlndXJhYmxlIGFuZCB3aWxsIGJlIGNv bnRyb2xsZWQKICogYnkgbWFjODAyMTEgYW5kIHRoZSByb2FtaW5nIGFsZ29yaXRobSBpbiB0aGUg ZnV0dXJlLgogKgogKiBTaW5jZSB0aGVyZSBtYXkgYmUgY29uc3RhbnRseSBjaGFuZ2luZyBpbmZv cm1hdGlvbiBlbGVtZW50cyB0aGF0IG5vdGhpbmcKICogaW4gdGhlIHNvZnR3YXJlIHN0YWNrIGNh cmVzIGFib3V0LCB3ZSB3aWxsLCBpbiB0aGUgZnV0dXJlLCBoYXZlIG1hYzgwMjExCiAqIHRlbGwg dGhlIGRyaXZlciB3aGljaCBpbmZvcm1hdGlvbiBlbGVtZW50cyBhcmUgaW50ZXJlc3RpbmcgaW4g dGhlIHNlbnNlCiAqIHRoYXQgd2Ugd2FudCB0byBzZWUgY2hhbmdlcyBpbiB0aGVtLiBUaGlzIHdp bGwgaW5jbHVkZQogKgogKiAgLSBhIGxpc3Qgb2YgaW5mb3JtYXRpb24gZWxlbWVudCBJRHMKICog IC0gYSBsaXN0IG9mIE9VSXMgZm9yIHRoZSB2ZW5kb3IgaW5mb3JtYXRpb24gZWxlbWVudAogKgog KiBJZGVhbGx5LCB0aGUgaGFyZHdhcmUgd291bGQgZmlsdGVyIG91dCBhbnkgYmVhY29ucyB3aXRo b3V0IGNoYW5nZXMgaW4gdGhlCiAqIHJlcXVlc3RlZCBlbGVtZW50cywgYnV0IGlmIGl0IGNhbm5v dCBzdXBwb3J0IHRoYXQgaXQgbWF5LCBhdCB0aGUgZXhwZW5zZQogKiBvZiBzb21lIGVmZmljaWVu Y3ksIGZpbHRlciBvdXQgb25seSBhIHN1YnNldC4gRm9yIGV4YW1wbGUsIGlmIHRoZSBkZXZpY2UK ICogZG9lc24ndCBzdXBwb3J0IGNoZWNraW5nIGZvciBPVUlzIGl0IHNob3VsZCBwYXNzIHVwIGFs bCBjaGFuZ2VzIGluIGFsbAogKiB2ZW5kb3IgaW5mb3JtYXRpb24gZWxlbWVudHMuCiAqCiAqIE5v dGUgdGhhdCBjaGFuZ2UsIGZvciB0aGUgc2FrZSBvZiBzaW1wbGlmaWNhdGlvbiwgYWxzbyBpbmNs dWRlcyBpbmZvcm1hdGlvbgogKiBlbGVtZW50cyBhcHBlYXJpbmcgb3IgZGlzYXBwZWFyaW5nIGZy b20gdGhlIGJlYWNvbi4KICoKICogU29tZSBoYXJkd2FyZSBzdXBwb3J0cyBhbiAiaWdub3JlIGxp c3QiIGluc3RlYWQsIGp1c3QgbWFrZSBzdXJlIG5vdGhpbmcKICogdGhhdCB3YXMgcmVxdWVzdGVk IGlzIG9uIHRoZSBpZ25vcmUgbGlzdCwgYW5kIGluY2x1ZGUgY29tbW9ubHkgY2hhbmdpbmcKICog aW5mb3JtYXRpb24gZWxlbWVudCBJRHMgaW4gdGhlIGlnbm9yZSBsaXN0LCBmb3IgZXhhbXBsZSAx MSAoQlNTIGxvYWQpIGFuZAogKiB0aGUgdmFyaW91cyB2ZW5kb3ItYXNzaWduZWQgSUVzIHdpdGgg dW5rbm93biBjb250ZW50cyAoMTI4LCAxMjksIDEzMy0xMzYsCiAqIDE0OSwgMTUwLCAxNTUsIDE1 NiwgMTczLCAxNzYsIDE3OCwgMTc5LCAyMTkpOyBmb3IgZm9yd2FyZCBjb21wYXRpYmlsaXR5CiAq IGl0IGNvdWxkIGFsc28gaW5jbHVkZSBzb21lIGN1cnJlbnRseSB1bnVzZWQgSURzLgogKgogKgog KiBJbiBhZGRpdGlvbiB0byB0aGVzZSBjYXBhYmlsaXRpZXMsIGhhcmR3YXJlIHNob3VsZCBzdXBw b3J0IG5vdGlmeWluZyB0aGUKICogaG9zdCBvZiBjaGFuZ2VzIGluIHRoZSBiZWFjb24gUlNTSS4g VGhpcyBpcyByZWxldmFudCB0byBpbXBsZW1lbnQgcm9hbWluZwogKiB3aGVuIG5vIHRyYWZmaWMg aXMgZmxvd2luZyAod2hlbiB0cmFmZmljIGlzIGZsb3dpbmcgd2Ugc2VlIHRoZSBSU1NJIG9mCiAq IHRoZSByZWNlaXZlZCBkYXRhIHBhY2tldHMpLiBUaGlzIGNhbiBjb25zaXN0IGluIG5vdGlmeWlu ZyB0aGUgaG9zdCB3aGVuCiAqIHRoZSBSU1NJIGNoYW5nZXMgc2lnbmlmaWNhbnRseSBvciB3aGVu IGl0IGRyb3BzIGJlbG93IG9yIHJpc2VzIGFib3ZlCiAqIGNvbmZpZ3VyYWJsZSB0aHJlc2hvbGRz LiBJbiB0aGUgZnV0dXJlIHRoZXNlIHRocmVzaG9sZHMgd2lsbCBhbHNvIGJlCiAqIGNvbmZpZ3Vy ZWQgYnkgbWFjODAyMTEgKHdoaWNoIGdldHMgdGhlbSBmcm9tIHVzZXJzcGFjZSkgdG8gaW1wbGVt ZW50CiAqIHRoZW0gYXMgdGhlIHJvYW1pbmcgYWxnb3JpdGhtIHJlcXVpcmVzLgogKgogKiBJZiB0 aGUgaGFyZHdhcmUgY2Fubm90IGltcGxlbWVudCB0aGlzLCB0aGUgZHJpdmVyIHNob3VsZCBhc2sg aXQgdG8KICogcGVyaW9kaWNhbGx5IHBhc3MgYmVhY29uIGZyYW1lcyB0byB0aGUgaG9zdCBzbyB0 aGF0IHNvZnR3YXJlIGNhbiBkbyB0aGUKICogc2lnbmFsIHN0cmVuZ3RoIHRocmVzaG9sZCBjaGVj a2luZy4KICovCgovKioKICogRE9DOiBTcGF0aWFsIG11bHRpcGxleGluZyBwb3dlciBzYXZlCiAq CiAqIFNNUFMgKFNwYXRpYWwgbXVsdGlwbGV4aW5nIHBvd2VyIHNhdmUpIGlzIGEgbWVjaGFuaXNt IHRvIGNvbnNlcnZlCiAqIHBvd2VyIGluIGFuIDgwMi4xMW4gaW1wbGVtZW50YXRpb24uIEZvciBk ZXRhaWxzIG9uIHRoZSBtZWNoYW5pc20KICogYW5kIHJhdGlvbmFsZSwgcGxlYXNlIHJlZmVyIHRv IDgwMi4xMSAoYXMgYW1lbmRlZCBieSA4MDIuMTFuLTIwMDkpCiAqICIxMS4yLjMgU00gcG93ZXIg c2F2ZSIuCiAqCiAqIFRoZSBtYWM4MDIxMSBpbXBsZW1lbnRhdGlvbiBpcyBjYXBhYmxlIG9mIHNl bmRpbmcgYWN0aW9uIGZyYW1lcwogKiB0byB1cGRhdGUgdGhlIEFQIGFib3V0IHRoZSBzdGF0aW9u J3MgU01QUyBtb2RlLCBhbmQgd2lsbCBpbnN0cnVjdAogKiB0aGUgZHJpdmVyIHRvIGVudGVyIHRo ZSBzcGVjaWZpYyBtb2RlLiBJdCB3aWxsIGFsc28gYW5ub3VuY2UgdGhlCiAqIHJlcXVlc3RlZCBT TVBTIG1vZGUgZHVyaW5nIHRoZSBhc3NvY2lhdGlvbiBoYW5kc2hha2UuIEhhcmR3YXJlCiAqIHN1 cHBvcnQgZm9yIHRoaXMgZmVhdHVyZSBpcyByZXF1aXJlZCwgYW5kIGNhbiBiZSBpbmRpY2F0ZWQg YnkKICogaGFyZHdhcmUgZmxhZ3MuCiAqCiAqIFRoZSBkZWZhdWx0IG1vZGUgd2lsbCBiZSAiYXV0 b21hdGljIiwgd2hpY2ggbmw4MDIxMS9jZmc4MDIxMQogKiBkZWZpbmVzIHRvIGJlIGR5bmFtaWMg U01QUyBpbiAocmVndWxhcikgcG93ZXJzYXZlLCBhbmQgU01QUwogKiB0dXJuZWQgb2ZmIG90aGVy d2lzZS4KICoKICogVG8gc3VwcG9ydCB0aGlzIGZlYXR1cmUsIHRoZSBkcml2ZXIgbXVzdCBzZXQg dGhlIGFwcHJvcHJpYXRlCiAqIGhhcmR3YXJlIHN1cHBvcnQgZmxhZ3MsIGFuZCBoYW5kbGUgdGhl IFNNUFMgZmxhZyB0byB0aGUgY29uZmlnKCkKICogb3BlcmF0aW9uLiBJdCB3aWxsIHRoZW4gd2l0 aCB0aGlzIG1lY2hhbmlzbSBiZSBpbnN0cnVjdGVkIHRvCiAqIGVudGVyIHRoZSByZXF1ZXN0ZWQg U01QUyBtb2RlIHdoaWxlIGFzc29jaWF0ZWQgdG8gYW4gSFQgQVAuCiAqLwoKLyoqCiAqIERPQzog RnJhbWUgZmlsdGVyaW5nCiAqCiAqIG1hYzgwMjExIHJlcXVpcmVzIHRvIHNlZSBtYW55IG1hbmFn ZW1lbnQgZnJhbWVzIGZvciBwcm9wZXIKICogb3BlcmF0aW9uLCBhbmQgdXNlcnMgbWF5IHdhbnQg dG8gc2VlIG1hbnkgbW9yZSBmcmFtZXMgd2hlbgogKiBpbiBtb25pdG9yIG1vZGUuIEhvd2V2ZXIs IGZvciBiZXN0IENQVSB1c2FnZSBhbmQgcG93ZXIgY29uc3VtcHRpb24sCiAqIGhhdmluZyBhcyBm ZXcgZnJhbWVzIGFzIHBvc3NpYmxlIHBlcmNvbGF0ZSB0aHJvdWdoIHRoZSBzdGFjayBpcwogKiBk ZXNpcmFibGUuIEhlbmNlLCB0aGUgaGFyZHdhcmUgc2hvdWxkIGZpbHRlciBhcyBtdWNoIGFzIHBv c3NpYmxlLgogKgogKiBUbyBhY2hpZXZlIHRoaXMsIG1hYzgwMjExIHVzZXMgZmlsdGVyIGZsYWdz IChzZWUgYmVsb3cpIHRvIHRlbGwKICogdGhlIGRyaXZlcidzIGNvbmZpZ3VyZV9maWx0ZXIoKSBm dW5jdGlvbiB3aGljaCBmcmFtZXMgc2hvdWxkIGJlCiAqIHBhc3NlZCB0byBtYWM4MDIxMSBhbmQg d2hpY2ggc2hvdWxkIGJlIGZpbHRlcmVkIG91dC4KICoKICogQmVmb3JlIGNvbmZpZ3VyZV9maWx0 ZXIoKSBpcyBpbnZva2VkLCB0aGUgcHJlcGFyZV9tdWx0aWNhc3QoKQogKiBjYWxsYmFjayBpcyBp bnZva2VkIHdpdGggdGhlIHBhcmFtZXRlcnMgQG1jX2NvdW50IGFuZCBAbWNfbGlzdAogKiBmb3Ig dGhlIGNvbWJpbmVkIG11bHRpY2FzdCBhZGRyZXNzIGxpc3Qgb2YgYWxsIHZpcnR1YWwgaW50ZXJm YWNlcy4KICogSXQncyB1c2UgaXMgb3B0aW9uYWwsIGFuZCBpdCByZXR1cm5zIGEgdTY0IHRoYXQg aXMgcGFzc2VkIHRvCiAqIGNvbmZpZ3VyZV9maWx0ZXIoKS4gQWRkaXRpb25hbGx5LCBjb25maWd1 cmVfZmlsdGVyKCkgaGFzIHRoZQogKiBhcmd1bWVudHMgQGNoYW5nZWRfZmxhZ3MgdGVsbGluZyB3 aGljaCBmbGFncyB3ZXJlIGNoYW5nZWQgYW5kCiAqIEB0b3RhbF9mbGFncyB3aXRoIHRoZSBuZXcg ZmxhZyBzdGF0ZXMuCiAqCiAqIElmIHlvdXIgZGV2aWNlIGhhcyBubyBtdWx0aWNhc3QgYWRkcmVz cyBmaWx0ZXJzIHlvdXIgZHJpdmVyIHdpbGwKICogbmVlZCB0byBjaGVjayBib3RoIHRoZSAlRklG X0FMTE1VTFRJIGZsYWcgYW5kIHRoZSBAbWNfY291bnQKICogcGFyYW1ldGVyIHRvIHNlZSB3aGV0 aGVyIG11bHRpY2FzdCBmcmFtZXMgc2hvdWxkIGJlIGFjY2VwdGVkCiAqIG9yIGRyb3BwZWQuCiAq CiAqIEFsbCB1bnN1cHBvcnRlZCBmbGFncyBpbiBAdG90YWxfZmxhZ3MgbXVzdCBiZSBjbGVhcmVk LgogKiBIYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGEgZmxhZyBpZiBpdCBpcyBpbmNhcGFibGUg b2YgX3Bhc3NpbmdfCiAqIHRoZSBmcmFtZSB0byB0aGUgc3RhY2suIE90aGVyd2lzZSB0aGUgZHJp dmVyIG11c3QgaWdub3JlCiAqIHRoZSBmbGFnLCBidXQgbm90IGNsZWFyIGl0LgogKiBZb3UgbXVz dCBfb25seV8gY2xlYXIgdGhlIGZsYWcgKGFubm91bmNlIG5vIHN1cHBvcnQgZm9yIHRoZQogKiBm bGFnIHRvIG1hYzgwMjExKSBpZiB5b3UgYXJlIG5vdCBhYmxlIHRvIHBhc3MgdGhlIHBhY2tldCB0 eXBlCiAqIHRvIHRoZSBzdGFjayAoc28gdGhlIGhhcmR3YXJlIGFsd2F5cyBmaWx0ZXJzIGl0KS4K ICogU28gZm9yIGV4YW1wbGUsIHlvdSBzaG91bGQgY2xlYXIgQEZJRl9DT05UUk9MLCBpZiB5b3Vy IGhhcmR3YXJlCiAqIGFsd2F5cyBmaWx0ZXJzIGNvbnRyb2wgZnJhbWVzLiBJZiB5b3VyIGhhcmR3 YXJlIGFsd2F5cyBwYXNzZXMKICogY29udHJvbCBmcmFtZXMgdG8gdGhlIGtlcm5lbCBhbmQgaXMg aW5jYXBhYmxlIG9mIGZpbHRlcmluZyB0aGVtLAogKiB5b3UgZG8gX25vdF8gY2xlYXIgdGhlIEBG SUZfQ09OVFJPTCBmbGFnLgogKiBUaGlzIHJ1bGUgYXBwbGllcyB0byBhbGwgb3RoZXIgRklGIGZs YWdzIGFzIHdlbGwuCiAqLwoKLyoqCiAqIERPQzogQVAgc3VwcG9ydCBmb3IgcG93ZXJzYXZpbmcg Y2xpZW50cwogKgogKiBJbiBvcmRlciB0byBpbXBsZW1lbnQgQVAgYW5kIFAyUCBHTyBtb2Rlcywg bWFjODAyMTEgaGFzIHN1cHBvcnQgZm9yCiAqIGNsaWVudCBwb3dlcnNhdmluZywgYm90aCAibGVn YWN5IiBQUyAoUFMtUG9sbC9udWxsIGRhdGEpIGFuZCB1QVBTRC4KICogVGhlcmUgY3VycmVudGx5 IGlzIG5vIHN1cHBvcnQgZm9yIHNBUFNELgogKgogKiBUaGVyZSBpcyBvbmUgYXNzdW1wdGlvbiB0 aGF0IG1hYzgwMjExIG1ha2VzLCBuYW1lbHkgdGhhdCBhIGNsaWVudAogKiB3aWxsIG5vdCBwb2xs IHdpdGggUFMtUG9sbCBhbmQgdHJpZ2dlciB3aXRoIHVBUFNEIGF0IHRoZSBzYW1lIHRpbWUuCiAq IEJvdGggYXJlIHN1cHBvcnRlZCwgYW5kIGJvdGggY2FuIGJlIHVzZWQgYnkgdGhlIHNhbWUgY2xp ZW50LCBidXQKICogdGhleSBjYW4ndCBiZSB1c2VkIGNvbmN1cnJlbnRseSBieSB0aGUgc2FtZSBj bGllbnQuIFRoaXMgc2ltcGxpZmllcwogKiB0aGUgZHJpdmVyIGNvZGUuCiAqCiAqIFRoZSBmaXJz dCB0aGluZyB0byBrZWVwIGluIG1pbmQgaXMgdGhhdCB0aGVyZSBpcyBhIGZsYWcgZm9yIGNvbXBs ZXRlCiAqIGRyaXZlciBpbXBsZW1lbnRhdGlvbjogJUlFRUU4MDIxMV9IV19BUF9MSU5LX1BTLiBJ ZiB0aGlzIGZsYWcgaXMgc2V0LAogKiBtYWM4MDIxMSBleHBlY3RzIHRoZSBkcml2ZXIgdG8gaGFu ZGxlIG1vc3Qgb2YgdGhlIHN0YXRlIG1hY2hpbmUgZm9yCiAqIHBvd2Vyc2F2aW5nIGNsaWVudHMg YW5kIHdpbGwgaWdub3JlIHRoZSBQTSBiaXQgaW4gaW5jb21pbmcgZnJhbWVzLgogKiBEcml2ZXJz IHRoZW4gdXNlIGllZWU4MDIxMV9zdGFfcHNfdHJhbnNpdGlvbigpIHRvIGluZm9ybSBtYWM4MDIx MSBvZgogKiBzdGF0aW9ucycgcG93ZXJzYXZlIHRyYW5zaXRpb25zLiBJbiB0aGlzIG1vZGUsIG1h YzgwMjExIGFsc28gZG9lc24ndAogKiBoYW5kbGUgUFMtUG9sbC91QVBTRC4KICoKICogSW4gdGhl IG1vZGUgd2l0aG91dCAlSUVFRTgwMjExX0hXX0FQX0xJTktfUFMsIG1hYzgwMjExIHdpbGwgY2hl Y2sgdGhlCiAqIFBNIGJpdCBpbiBpbmNvbWluZyBmcmFtZXMgZm9yIGNsaWVudCBwb3dlcnNhdmUg dHJhbnNpdGlvbnMuIFdoZW4gYQogKiBzdGF0aW9uIGdvZXMgdG8gc2xlZXAsIHdlIHdpbGwgc3Rv cCB0cmFuc21pdHRpbmcgdG8gaXQuIFRoZXJlIGlzLAogKiBob3dldmVyLCBhIHJhY2UgY29uZGl0 aW9uOiBhIHN0YXRpb24gbWlnaHQgZ28gdG8gc2xlZXAgd2hpbGUgdGhlcmUgaXMKICogZGF0YSBi dWZmZXJlZCBvbiBoYXJkd2FyZSBxdWV1ZXMuIElmIHRoZSBkZXZpY2UgaGFzIHN1cHBvcnQgZm9y IHRoaXMKICogaXQgd2lsbCByZWplY3QgZnJhbWVzLCBhbmQgdGhlIGRyaXZlciBzaG91bGQgZ2l2 ZSB0aGUgZnJhbWVzIGJhY2sgdG8KICogbWFjODAyMTEgd2l0aCB0aGUgJUlFRUU4MDIxMV9UWF9T VEFUX1RYX0ZJTFRFUkVEIGZsYWcgc2V0IHdoaWNoIHdpbGwKICogY2F1c2UgbWFjODAyMTEgdG8g cmV0cnkgdGhlIGZyYW1lIHdoZW4gdGhlIHN0YXRpb24gd2FrZXMgdXAuIFRoZQogKiBkcml2ZXIg aXMgYWxzbyBub3RpZmllZCBvZiBwb3dlcnNhdmUgdHJhbnNpdGlvbnMgYnkgY2FsbGluZyBpdHMK ICogQHN0YV9ub3RpZnkgY2FsbGJhY2suCiAqCiAqIFdoZW4gdGhlIHN0YXRpb24gaXMgYXNsZWVw LCBpdCBoYXMgdGhyZWUgY2hvaWNlczogaXQgY2FuIHdha2UgdXAsCiAqIGl0IGNhbiBQUy1Qb2xs LCBvciBpdCBjYW4gcG9zc2libHkgc3RhcnQgYSB1QVBTRCBzZXJ2aWNlIHBlcmlvZC4KICogV2Fr aW5nIHVwIGlzIGltcGxlbWVudGVkIGJ5IHNpbXBseSB0cmFuc21pdHRpbmcgYWxsIGJ1ZmZlcmVk IChhbmQKICogZmlsdGVyZWQpIGZyYW1lcyB0byB0aGUgc3RhdGlvbi4gVGhpcyBpcyB0aGUgZWFz aWVzdCBjYXNlLiBXaGVuCiAqIHRoZSBzdGF0aW9uIHNlbmRzIGEgUFMtUG9sbCBvciBhIHVBUFNE IHRyaWdnZXIgZnJhbWUsIG1hYzgwMjExCiAqIHdpbGwgaW5mb3JtIHRoZSBkcml2ZXIgb2YgdGhp cyB3aXRoIHRoZSBAYWxsb3dfYnVmZmVyZWRfZnJhbWVzCiAqIGNhbGxiYWNrOyB0aGlzIGNhbGxi YWNrIGlzIG9wdGlvbmFsLiBtYWM4MDIxMSB3aWxsIHRoZW4gdHJhbnNtaXQKICogdGhlIGZyYW1l cyBhcyB1c3VhbCBhbmQgc2V0IHRoZSAlSUVFRTgwMjExX1RYX0NUTF9OT19QU19CVUZGRVIKICog b24gZWFjaCBmcmFtZS4gVGhlIGxhc3QgZnJhbWUgaW4gdGhlIHNlcnZpY2UgcGVyaW9kIChvciB0 aGUgb25seQogKiByZXNwb25zZSB0byBhIFBTLVBvbGwpIGFsc28gaGFzICVJRUVFODAyMTFfVFhf U1RBVFVTX0VPU1Agc2V0IHRvCiAqIGluZGljYXRlIHRoYXQgaXQgZW5kcyB0aGUgc2VydmljZSBw ZXJpb2Q7IGFzIHRoaXMgZnJhbWUgbXVzdCBoYXZlCiAqIFRYIHN0YXR1cyByZXBvcnQgaXQgYWxz byBzZXRzICVJRUVFODAyMTFfVFhfQ1RMX1JFUV9UWF9TVEFUVVMuCiAqIFdoZW4gVFggc3RhdHVz IGlzIHJlcG9ydGVkIGZvciB0aGlzIGZyYW1lLCB0aGUgc2VydmljZSBwZXJpb2QgaXMKICogbWFy a2VkIGhhcyBoYXZpbmcgZW5kZWQgYW5kIGEgbmV3IG9uZSBjYW4gYmUgc3RhcnRlZCBieSB0aGUg cGVlci4KICoKICogQWRkaXRpb25hbGx5LCBub24tYnVmZmVyYWJsZSBNTVBEVXMgY2FuIGFsc28g YmUgdHJhbnNtaXR0ZWQgYnkKICogbWFjODAyMTEgd2l0aCB0aGUgJUlFRUU4MDIxMV9UWF9DVExf Tk9fUFNfQlVGRkVSIHNldCBpbiB0aGVtLgogKgogKiBBbm90aGVyIHJhY2UgY29uZGl0aW9uIGNh biBoYXBwZW4gb24gc29tZSBkZXZpY2VzIGxpa2UgaXdsd2lmaQogKiB3aGVuIHRoZXJlIGFyZSBm cmFtZXMgcXVldWVkIGZvciB0aGUgc3RhdGlvbiBhbmQgaXQgd2FrZXMgdXAKICogb3IgcG9sbHM7 IHRoZSBmcmFtZXMgdGhhdCBhcmUgYWxyZWFkeSBxdWV1ZWQgY291bGQgZW5kIHVwIGJlaW5nCiAq IHRyYW5zbWl0dGVkIGZpcnN0IGluc3RlYWQsIGNhdXNpbmcgcmVvcmRlcmluZyBhbmQvb3Igd3Jv bmcKICogcHJvY2Vzc2luZyBvZiB0aGUgRU9TUC4gVGhlIGNhdXNlIGlzIHRoYXQgYWxsb3dpbmcg ZnJhbWVzIHRvIGJlCiAqIHRyYW5zbWl0dGVkIHRvIGEgY2VydGFpbiBzdGF0aW9uIGlzIG91dC1v Zi1iYW5kIGNvbW11bmljYXRpb24gdG8KICogdGhlIGRldmljZS4gVG8gYWxsb3cgdGhpcyBwcm9i bGVtIHRvIGJlIHNvbHZlZCwgdGhlIGRyaXZlciBjYW4KICogY2FsbCBpZWVlODAyMTFfc3RhX2Js b2NrX2F3YWtlKCkgaWYgZnJhbWVzIGFyZSBidWZmZXJlZCB3aGVuIGl0CiAqIGlzIG5vdGlmaWVk IHRoYXQgdGhlIHN0YXRpb24gd2VudCB0byBzbGVlcC4gV2hlbiBhbGwgdGhlc2UgZnJhbWVzCiAq IGhhdmUgYmVlbiBmaWx0ZXJlZCAoc2VlIGFib3ZlKSwgaXQgbXVzdCBjYWxsIHRoZSBmdW5jdGlv biBhZ2FpbgogKiB0byBpbmRpY2F0ZSB0aGF0IHRoZSBzdGF0aW9uIGlzIG5vIGxvbmdlciBibG9j a2VkLgogKgogKiBJZiB0aGUgZHJpdmVyIGJ1ZmZlcnMgZnJhbWVzIGluIHRoZSBkcml2ZXIgZm9y IGFnZ3JlZ2F0aW9uIGluIGFueQogKiB3YXksIGl0IG11c3QgdXNlIHRoZSBpZWVlODAyMTFfc3Rh X3NldF9idWZmZXJlZCgpIGNhbGwgd2hlbiBpdCBpcwogKiBub3RpZmllZCBvZiB0aGUgc3RhdGlv biBnb2luZyB0byBzbGVlcCB0byBpbmZvcm0gbWFjODAyMTEgb2YgYW55CiAqIFRJRHMgdGhhdCBo YXZlIGZyYW1lcyBidWZmZXJlZC4gTm90ZSB0aGF0IHdoZW4gYSBzdGF0aW9uIHdha2VzIHVwCiAq IHRoaXMgaW5mb3JtYXRpb24gaXMgcmVzZXQgKGhlbmNlIHRoZSByZXF1aXJlbWVudCB0byBjYWxs IGl0IHdoZW4KICogaW5mb3JtZWQgb2YgdGhlIHN0YXRpb24gZ29pbmcgdG8gc2xlZXApLiBUaGVu LCB3aGVuIGEgc2VydmljZQogKiBwZXJpb2Qgc3RhcnRzIGZvciBhbnkgcmVhc29uLCBAcmVsZWFz ZV9idWZmZXJlZF9mcmFtZXMgaXMgY2FsbGVkCiAqIHdpdGggdGhlIG51bWJlciBvZiBmcmFtZXMg dG8gYmUgcmVsZWFzZWQgYW5kIHdoaWNoIFRJRHMgdGhleSBhcmUKICogdG8gY29tZSBmcm9tLiBJ biB0aGlzIGNhc2UsIHRoZSBkcml2ZXIgaXMgcmVzcG9uc2libGUgZm9yIHNldHRpbmcKICogdGhl IEVPU1AgKGZvciB1QVBTRCkgYW5kIE1PUkVfREFUQSBiaXRzIGluIHRoZSByZWxlYXNlZCBmcmFt ZXMsCiAqIHRvIGhlbHAgdGhlIEBtb3JlX2RhdGEgcGFyYW1ldGVyIGlzIHBhc3NlZCB0byB0ZWxs IHRoZSBkcml2ZXIgaWYKICogdGhlcmUgaXMgbW9yZSBkYXRhIG9uIG90aGVyIFRJRHMgLS0gdGhl IFRJRHMgdG8gcmVsZWFzZSBmcmFtZXMKICogZnJvbSBhcmUgaWdub3JlZCBzaW5jZSBtYWM4MDIx MSBkb2Vzbid0IGtub3cgaG93IG1hbnkgZnJhbWVzIHRoZQogKiBidWZmZXJzIGZvciB0aG9zZSBU SURzIGNvbnRhaW4uCiAqCiAqIElmIHRoZSBkcml2ZXIgYWxzbyBpbXBsZW1lbnQgR08gbW9kZSwg d2hlcmUgYWJzZW5jZSBwZXJpb2RzIG1heQogKiBzaG9ydGVuIHNlcnZpY2UgcGVyaW9kcyAob3Ig YWJvcnQgUFMtUG9sbCByZXNwb25zZXMpLCBpdCBtdXN0CiAqIGZpbHRlciB0aG9zZSByZXNwb25z ZSBmcmFtZXMgZXhjZXB0IGluIHRoZSBjYXNlIG9mIGZyYW1lcyB0aGF0CiAqIGFyZSBidWZmZXJl ZCBpbiB0aGUgZHJpdmVyIC0tIHRob3NlIG11c3QgcmVtYWluIGJ1ZmZlcmVkIHRvIGF2b2lkCiAq IHJlb3JkZXJpbmcuIEJlY2F1c2UgaXQgaXMgcG9zc2libGUgdGhhdCBubyBmcmFtZXMgYXJlIHJl bGVhc2VkCiAqIGluIHRoaXMgY2FzZSwgdGhlIGRyaXZlciBtdXN0IGNhbGwgaWVlZTgwMjExX3N0 YV9lb3NwKCkKICogdG8gaW5kaWNhdGUgdG8gbWFjODAyMTEgdGhhdCB0aGUgc2VydmljZSBwZXJp b2QgZW5kZWQgYW55d2F5LgogKgogKiBGaW5hbGx5LCBpZiBmcmFtZXMgZnJvbSBtdWx0aXBsZSBU SURzIGFyZSByZWxlYXNlZCBmcm9tIG1hYzgwMjExCiAqIGJ1dCB0aGUgZHJpdmVyIG1pZ2h0IHJl b3JkZXIgdGhlbSwgaXQgbXVzdCBjbGVhciAmIHNldCB0aGUgZmxhZ3MKICogYXBwcm9wcmlhdGVs eSAob25seSB0aGUgbGFzdCBmcmFtZSBtYXkgaGF2ZSAlSUVFRTgwMjExX1RYX1NUQVRVU19FT1NQ KQogKiBhbmQgYWxzbyB0YWtlIGNhcmUgb2YgdGhlIEVPU1AgYW5kIE1PUkVfREFUQSBiaXRzIGlu IHRoZSBmcmFtZS4KICogVGhlIGRyaXZlciBtYXkgYWxzbyB1c2UgaWVlZTgwMjExX3N0YV9lb3Nw KCkgaW4gdGhpcyBjYXNlLgogKgogKiBOb3RlIHRoYXQgaWYgdGhlIGRyaXZlciBldmVyIGJ1ZmZl cnMgZnJhbWVzIG90aGVyIHRoYW4gUW9TLWRhdGEKICogZnJhbWVzLCBpdCBtdXN0IHRha2UgY2Fy ZSB0byBuZXZlciBzZW5kIGEgbm9uLVFvUy1kYXRhIGZyYW1lIGFzCiAqIHRoZSBsYXN0IGZyYW1l IGluIGEgc2VydmljZSBwZXJpb2QsIGFkZGluZyBhIFFvUy1udWxsZGF0YSBmcmFtZQogKiBhZnRl ciBhIG5vbi1Rb1MtZGF0YSBmcmFtZSBpZiBuZWVkZWQuCiAqLwoKLyoqCiAqIERPQzogSFcgcXVl dWUgY29udHJvbAogKgogKiBCZWZvcmUgSFcgcXVldWUgY29udHJvbCB3YXMgaW50cm9kdWNlZCwg bWFjODAyMTEgb25seSBoYWQgYSBzaW5nbGUgc3RhdGljCiAqIGFzc2lnbm1lbnQgb2YgcGVyLWlu dGVyZmFjZSBBQyBzb2Z0d2FyZSBxdWV1ZXMgdG8gaGFyZHdhcmUgcXVldWVzLiBUaGlzCiAqIHdh cyBwcm9ibGVtYXRpYyBmb3IgYSBmZXcgcmVhc29uczoKICogMSkgb2ZmLWNoYW5uZWwgdHJhbnNt aXNzaW9ucyBtaWdodCBnZXQgc3R1Y2sgYmVoaW5kIG90aGVyIGZyYW1lcwogKiAyKSBtdWx0aXBs ZSB2aXJ0dWFsIGludGVyZmFjZXMgY291bGRuJ3QgYmUgaGFuZGxlZCBjb3JyZWN0bHkKICogMykg YWZ0ZXItRFRJTSBmcmFtZXMgY291bGQgZ2V0IHN0dWNrIGJlaGluZCBvdGhlciBmcmFtZXMKICoK ICogVG8gc29sdmUgdGhpcywgaGFyZHdhcmUgdHlwaWNhbGx5IHVzZXMgbXVsdGlwbGUgZGlmZmVy ZW50IHF1ZXVlcyBmb3IgYWxsCiAqIHRoZSBkaWZmZXJlbnQgdXNhZ2VzLCBhbmQgdGhpcyBuZWVk cyB0byBiZSBwcm9wYWdhdGVkIGludG8gbWFjODAyMTEgc28gaXQKICogd29uJ3QgaGF2ZSB0aGUg c2FtZSBwcm9ibGVtIHdpdGggdGhlIHNvZnR3YXJlIHF1ZXVlcy4KICoKICogVGhlcmVmb3JlLCBt YWM4MDIxMSBub3cgb2ZmZXJzIHRoZSAlSUVFRTgwMjExX0hXX1FVRVVFX0NPTlRST0wgY2FwYWJp bGl0eQogKiBmbGFnIHRoYXQgdGVsbHMgaXQgdGhhdCB0aGUgZHJpdmVyIGltcGxlbWVudHMgaXRz IG93biBxdWV1ZSBjb250cm9sLiBUbyBkbwogKiBzbywgdGhlIGRyaXZlciB3aWxsIHNldCB1cCB0 aGUgdmFyaW91cyBxdWV1ZXMgaW4gZWFjaCAmc3RydWN0IGllZWU4MDIxMV92aWYKICogYW5kIHRo ZSBvZmZjaGFubmVsIHF1ZXVlIGluICZzdHJ1Y3QgaWVlZTgwMjExX2h3LiBJbiByZXNwb25zZSwg bWFjODAyMTEgd2lsbAogKiB1c2UgdGhvc2UgcXVldWUgSURzIGluIHRoZSBod19xdWV1ZSBmaWVs ZCBvZiAmc3RydWN0IGllZWU4MDIxMV90eF9pbmZvIGFuZAogKiBpZiBuZWNlc3Nhcnkgd2lsbCBx dWV1ZSB0aGUgZnJhbWUgb24gdGhlIHJpZ2h0IHNvZnR3YXJlIHF1ZXVlIHRoYXQgbWlycm9ycwog KiB0aGUgaGFyZHdhcmUgcXVldWUuCiAqIEFkZGl0aW9uYWxseSwgdGhlIGRyaXZlciBoYXMgdG8g dGhlbiB1c2UgdGhlc2UgSFcgcXVldWUgSURzIGZvciB0aGUgcXVldWUKICogbWFuYWdlbWVudCBm dW5jdGlvbnMgKGllZWU4MDIxMV9zdG9wX3F1ZXVlKCkgZXQgYWwuKQogKgogKiBUaGUgZHJpdmVy IGlzIGZyZWUgdG8gc2V0IHVwIHRoZSBxdWV1ZSBtYXBwaW5ncyBhcyBuZWVkZWQsIG11bHRpcGxl IHZpcnR1YWwKICogaW50ZXJmYWNlcyBtYXkgbWFwIHRvIHRoZSBzYW1lIGhhcmR3YXJlIHF1ZXVl cyBpZiBuZWVkZWQuIFRoZSBzZXR1cCBoYXMgdG8KICogaGFwcGVuIGR1cmluZyBhZGRfaW50ZXJm YWNlIG9yIGNoYW5nZV9pbnRlcmZhY2UgY2FsbGJhY2tzLiBGb3IgZXhhbXBsZSwgYQogKiBkcml2 ZXIgc3VwcG9ydGluZyBzdGF0aW9uK3N0YXRpb24gYW5kIHN0YXRpb24rQVAgbW9kZXMgbWlnaHQg ZGVjaWRlIHRvIGhhdmUKICogMTAgaGFyZHdhcmUgcXVldWVzIHRvIGhhbmRsZSBkaWZmZXJlbnQg c2NlbmFyaW9zOgogKgogKiA0IEFDIEhXIHF1ZXVlcyBmb3IgMXN0IHZpZjogMCwgMSwgMiwgMwog KiA0IEFDIEhXIHF1ZXVlcyBmb3IgMm5kIHZpZjogNCwgNSwgNiwgNwogKiBhZnRlci1EVElNIHF1 ZXVlIGZvciBBUDogICA4CiAqIG9mZi1jaGFubmVsIHF1ZXVlOiAgICAgICAgIDkKICoKICogSXQg d291bGQgdGhlbiBzZXQgdXAgdGhlIGhhcmR3YXJlIGxpa2UgdGhpczoKICogICBody5vZmZjaGFu bmVsX3R4X2h3X3F1ZXVlID0gOQogKgogKiBhbmQgdGhlIGZpcnN0IHZpcnR1YWwgaW50ZXJmYWNl IHRoYXQgaXMgYWRkZWQgYXMgZm9sbG93czoKICogICB2aWYuaHdfcXVldWVbSUVFRTgwMjExX0FD X1ZPXSA9IDAKICogICB2aWYuaHdfcXVldWVbSUVFRTgwMjExX0FDX1ZJXSA9IDEKICogICB2aWYu aHdfcXVldWVbSUVFRTgwMjExX0FDX0JFXSA9IDIKICogICB2aWYuaHdfcXVldWVbSUVFRTgwMjEx X0FDX0JLXSA9IDMKICogICB2aWYuY2FiX3F1ZXVlID0gOCAvLyBpZiBBUCBtb2RlLCBvdGhlcndp c2UgJUlFRUU4MDIxMV9JTlZBTF9IV19RVUVVRQogKiBhbmQgdGhlIHNlY29uZCB2aXJ0dWFsIGlu dGVyZmFjZSB3aXRoIDQtNy4KICoKICogSWYgcXVldWUgNiBnZXRzIGZ1bGwsIGZvciBleGFtcGxl LCBtYWM4MDIxMSB3b3VsZCBvbmx5IHN0b3AgdGhlIHNlY29uZAogKiB2aXJ0dWFsIGludGVyZmFj ZSdzIEJFIHF1ZXVlIHNpbmNlIHZpcnR1YWwgaW50ZXJmYWNlIHF1ZXVlcyBhcmUgcGVyIEFDLgog KgogKiBOb3RlIHRoYXQgdGhlIHZpZi5jYWJfcXVldWUgdmFsdWUgc2hvdWxkIGJlIHNldCB0byAl SUVFRTgwMjExX0lOVkFMX0hXX1FVRVVFCiAqIHdoZW5ldmVyIHRoZSBxdWV1ZSBpcyBub3QgdXNl ZCAoaS5lLiB0aGUgaW50ZXJmYWNlIGlzIG5vdCBpbiBBUCBtb2RlKSBpZiB0aGUKICogcXVldWUg Y291bGQgcG90ZW50aWFsbHkgYmUgc2hhcmVkIHNpbmNlIG1hYzgwMjExIHdpbGwgbG9vayBhdCBj YWJfcXVldWUgd2hlbgogKiBhIHF1ZXVlIGlzIHN0b3BwZWQvd29rZW4gZXZlbiBpZiB0aGUgaW50 ZXJmYWNlIGlzIG5vdCBpbiBBUCBtb2RlLgogKi8KCi8qKgogKiBlbnVtIGllZWU4MDIxMV9maWx0 ZXJfZmxhZ3MgLSBoYXJkd2FyZSBmaWx0ZXIgZmxhZ3MKICoKICogVGhlc2UgZmxhZ3MgZGV0ZXJt aW5lIHdoYXQgdGhlIGZpbHRlciBpbiBoYXJkd2FyZSBzaG91bGQgYmUKICogcHJvZ3JhbW1lZCB0 byBsZXQgdGhyb3VnaCBhbmQgd2hhdCBzaG91bGQgbm90IGJlIHBhc3NlZCB0byB0aGUKICogc3Rh Y2suIEl0IGlzIGFsd2F5cyBzYWZlIHRvIHBhc3MgbW9yZSBmcmFtZXMgdGhhbiByZXF1ZXN0ZWQs CiAqIGJ1dCB0aGlzIGhhcyBuZWdhdGl2ZSBpbXBhY3Qgb24gcG93ZXIgY29uc3VtcHRpb24uCiAq CiAqIEBGSUZfQUxMTVVMVEk6IHBhc3MgYWxsIG11bHRpY2FzdCBmcmFtZXMsIHRoaXMgaXMgdXNl ZCBpZiByZXF1ZXN0ZWQKICoJYnkgdGhlIHVzZXIgb3IgaWYgdGhlIGhhcmR3YXJlIGlzIG5vdCBj YXBhYmxlIG9mIGZpbHRlcmluZyBieQogKgltdWx0aWNhc3QgYWRkcmVzcy4KICoKICogQEZJRl9G Q1NGQUlMOiBwYXNzIGZyYW1lcyB3aXRoIGZhaWxlZCBGQ1MgKGJ1dCB5b3UgbmVlZCB0byBzZXQg dGhlCiAqCSVSWF9GTEFHX0ZBSUxFRF9GQ1NfQ1JDIGZvciB0aGVtKQogKgogKiBARklGX1BMQ1BG QUlMOiBwYXNzIGZyYW1lcyB3aXRoIGZhaWxlZCBQTENQIENSQyAoYnV0IHlvdSBuZWVkIHRvIHNl dAogKgl0aGUgJVJYX0ZMQUdfRkFJTEVEX1BMQ1BfQ1JDIGZvciB0aGVtCiAqCiAqIEBGSUZfQkNO X1BSQlJFU1BfUFJPTUlTQzogVGhpcyBmbGFnIGlzIHNldCBkdXJpbmcgc2Nhbm5pbmcgdG8gaW5k aWNhdGUKICoJdG8gdGhlIGhhcmR3YXJlIHRoYXQgaXQgc2hvdWxkIG5vdCBmaWx0ZXIgYmVhY29u cyBvciBwcm9iZSByZXNwb25zZXMKICoJYnkgQlNTSUQuIEZpbHRlcmluZyB0aGVtIGNhbiBncmVh dGx5IHJlZHVjZSB0aGUgYW1vdW50IG9mIHByb2Nlc3NpbmcKICoJbWFjODAyMTEgbmVlZHMgdG8g ZG8gYW5kIHRoZSBhbW91bnQgb2YgQ1BVIHdha2V1cHMsIHNvIHlvdSBzaG91bGQKICoJaG9ub3Vy IHRoaXMgZmxhZyBpZiBwb3NzaWJsZS4KICoKICogQEZJRl9DT05UUk9MOiBwYXNzIGNvbnRyb2wg ZnJhbWVzIChleGNlcHQgZm9yIFBTIFBvbGwpIGFkZHJlc3NlZCB0byB0aGlzCiAqCXN0YXRpb24K ICoKICogQEZJRl9PVEhFUl9CU1M6IHBhc3MgZnJhbWVzIGRlc3RpbmVkIHRvIG90aGVyIEJTU2Vz CiAqCiAqIEBGSUZfUFNQT0xMOiBwYXNzIFBTIFBvbGwgZnJhbWVzCiAqCiAqIEBGSUZfUFJPQkVf UkVROiBwYXNzIHByb2JlIHJlcXVlc3QgZnJhbWVzCiAqLwplbnVtIGllZWU4MDIxMV9maWx0ZXJf ZmxhZ3MgewoJRklGX0FMTE1VTFRJCQk9IDE8PDEsCglGSUZfRkNTRkFJTAkJPSAxPDwyLAoJRklG X1BMQ1BGQUlMCQk9IDE8PDMsCglGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQwk9IDE8PDQsCglGSUZf Q09OVFJPTAkJPSAxPDw1LAoJRklGX09USEVSX0JTUwkJPSAxPDw2LAoJRklGX1BTUE9MTAkJPSAx PDw3LAoJRklGX1BST0JFX1JFUQkJPSAxPDw4LAp9OwoKLyoqCiAqIGVudW0gaWVlZTgwMjExX2Ft cGR1X21sbWVfYWN0aW9uIC0gQS1NUERVIGFjdGlvbnMKICoKICogVGhlc2UgZmxhZ3MgYXJlIHVz ZWQgd2l0aCB0aGUgYW1wZHVfYWN0aW9uKCkgY2FsbGJhY2sgaW4KICogJnN0cnVjdCBpZWVlODAy MTFfb3BzIHRvIGluZGljYXRlIHdoaWNoIGFjdGlvbiBpcyBuZWVkZWQuCiAqCiAqIE5vdGUgdGhh dCBkcml2ZXJzIE1VU1QgYmUgYWJsZSB0byBkZWFsIHdpdGggYSBUWCBhZ2dyZWdhdGlvbgogKiBz ZXNzaW9uIGJlaW5nIHN0b3BwZWQgZXZlbiBiZWZvcmUgdGhleSBPSydlZCBzdGFydGluZyBpdCBi eQogKiBjYWxsaW5nIGllZWU4MDIxMV9zdGFydF90eF9iYV9jYl9pcnFzYWZlLCBiZWNhdXNlIHRo ZSBwZWVyCiAqIG1pZ2h0IHJlY2VpdmUgdGhlIGFkZEJBIGZyYW1lIGFuZCBzZW5kIGEgZGVsQkEg cmlnaHQgYXdheSEKICoKICogQElFRUU4MDIxMV9BTVBEVV9SWF9TVEFSVDogc3RhcnQgUlggYWdn cmVnYXRpb24KICogQElFRUU4MDIxMV9BTVBEVV9SWF9TVE9QOiBzdG9wIFJYIGFnZ3JlZ2F0aW9u CiAqIEBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlQ6IHN0YXJ0IFRYIGFnZ3JlZ2F0aW9uLCB0aGUg ZHJpdmVyIG11c3QgZWl0aGVyCiAqCWNhbGwgaWVlZTgwMjExX3N0YXJ0X3R4X2JhX2NiX2lycXNh ZmUoKSBvciByZXR1cm4gdGhlIHNwZWNpYWwKICoJc3RhdHVzICVJRUVFODAyMTFfQU1QRFVfVFhf U1RBUlRfSU1NRURJQVRFLgogKiBASUVFRTgwMjExX0FNUERVX1RYX09QRVJBVElPTkFMOiBUWCBh Z2dyZWdhdGlvbiBoYXMgYmVjb21lIG9wZXJhdGlvbmFsCiAqIEBJRUVFODAyMTFfQU1QRFVfVFhf U1RPUF9DT05UOiBzdG9wIFRYIGFnZ3JlZ2F0aW9uIGJ1dCBjb250aW51ZSB0cmFuc21pdHRpbmcK ICoJcXVldWVkIHBhY2tldHMsIG5vdyB1bmFnZ3JlZ2F0ZWQuIEFmdGVyIGFsbCBwYWNrZXRzIGFy ZSB0cmFuc21pdHRlZCB0aGUKICoJZHJpdmVyIGhhcyB0byBjYWxsIGllZWU4MDIxMV9zdG9wX3R4 X2JhX2NiX2lycXNhZmUoKS4KICogQElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QX0ZMVVNIOiBzdG9w IFRYIGFnZ3JlZ2F0aW9uIGFuZCBmbHVzaCBhbGwgcGFja2V0cywKICoJY2FsbGVkIHdoZW4gdGhl IHN0YXRpb24gaXMgcmVtb3ZlZC4gVGhlcmUncyBubyBuZWVkIG9yIHJlYXNvbiB0byBjYWxsCiAq CWllZWU4MDIxMV9zdG9wX3R4X2JhX2NiX2lycXNhZmUoKSBpbiB0aGlzIGNhc2UgYXMgbWFjODAy MTEgYXNzdW1lcyB0aGUKICoJc2Vzc2lvbiBpcyBnb25lIGFuZCByZW1vdmVzIHRoZSBzdGF0aW9u LgogKiBASUVFRTgwMjExX0FNUERVX1RYX1NUT1BfRkxVU0hfQ09OVDogY2FsbGVkIHdoZW4gVFgg YWdncmVnYXRpb24gaXMgc3RvcHBlZAogKglidXQgdGhlIGRyaXZlciBoYXNuJ3QgY2FsbGVkIGll ZWU4MDIxMV9zdG9wX3R4X2JhX2NiX2lycXNhZmUoKSB5ZXQgYW5kCiAqCW5vdyB0aGUgY29ubmVj dGlvbiBpcyBkcm9wcGVkIGFuZCB0aGUgc3RhdGlvbiB3aWxsIGJlIHJlbW92ZWQuIERyaXZlcnMK ICoJc2hvdWxkIGNsZWFuIHVwIGFuZCBkcm9wIHJlbWFpbmluZyBwYWNrZXRzIHdoZW4gdGhpcyBp cyBjYWxsZWQuCiAqLwplbnVtIGllZWU4MDIxMV9hbXBkdV9tbG1lX2FjdGlvbiB7CglJRUVFODAy MTFfQU1QRFVfUlhfU1RBUlQsCglJRUVFODAyMTFfQU1QRFVfUlhfU1RPUCwKCUlFRUU4MDIxMV9B TVBEVV9UWF9TVEFSVCwKCUlFRUU4MDIxMV9BTVBEVV9UWF9TVE9QX0NPTlQsCglJRUVFODAyMTFf QU1QRFVfVFhfU1RPUF9GTFVTSCwKCUlFRUU4MDIxMV9BTVBEVV9UWF9TVE9QX0ZMVVNIX0NPTlQs CglJRUVFODAyMTFfQU1QRFVfVFhfT1BFUkFUSU9OQUwsCn07CgojZGVmaW5lIElFRUU4MDIxMV9B TVBEVV9UWF9TVEFSVF9JTU1FRElBVEUgMQoKLyoqCiAqIHN0cnVjdCBpZWVlODAyMTFfYW1wZHVf cGFyYW1zIC0gQU1QRFUgYWN0aW9uIHBhcmFtZXRlcnMKICoKICogQGFjdGlvbjogdGhlIGFtcGR1 IGFjdGlvbiwgdmFsdWUgZnJvbSAlaWVlZTgwMjExX2FtcGR1X21sbWVfYWN0aW9uLgogKiBAc3Rh OiBwZWVyIG9mIHRoaXMgQU1QRFUgc2Vzc2lvbgogKiBAdGlkOiB0aWQgb2YgdGhlIEJBIHNlc3Np b24KICogQHNzbjogc3RhcnQgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBzZXNzaW9uLiBUWC9SWF9T VE9QIGNhbiBwYXNzIDAuIFdoZW4KICoJYWN0aW9uIGlzIHNldCB0byAlSUVFRTgwMjExX0FNUERV X1JYX1NUQVJUIHRoZSBkcml2ZXIgcGFzc2VzIGJhY2sgdGhlCiAqCWFjdHVhbCBzc24gdmFsdWUg dXNlZCB0byBzdGFydCB0aGUgc2Vzc2lvbiBhbmQgd3JpdGVzIHRoZSB2YWx1ZSBoZXJlLgogKiBA YnVmX3NpemU6IHJlb3JkZXIgYnVmZmVyIHNpemUgIChudW1iZXIgb2Ygc3ViZnJhbWVzKS4gVmFs aWQgb25seSB3aGVuIHRoZQogKglhY3Rpb24gaXMgc2V0IHRvICVJRUVFODAyMTFfQU1QRFVfUlhf U1RBUlQgb3IKICoJJUlFRUU4MDIxMV9BTVBEVV9UWF9PUEVSQVRJT05BTAogKiBAYW1zZHU6IGlu ZGljYXRlcyB0aGUgcGVlcidzIGFiaWxpdHkgdG8gcmVjZWl2ZSBBLU1TRFUgd2l0aGluIEEtTVBE VS4KICoJdmFsaWQgd2hlbiB0aGUgYWN0aW9uIGlzIHNldCB0byAlSUVFRTgwMjExX0FNUERVX1RY X09QRVJBVElPTkFMCiAqIEB0aW1lb3V0OiBCQSBzZXNzaW9uIHRpbWVvdXQuIFZhbGlkIG9ubHkg d2hlbiB0aGUgYWN0aW9uIGlzIHNldCB0bwogKgklSUVFRTgwMjExX0FNUERVX1JYX1NUQVJUCiAq LwpzdHJ1Y3QgaWVlZTgwMjExX2FtcGR1X3BhcmFtcyB7CgllbnVtIGllZWU4MDIxMV9hbXBkdV9t bG1lX2FjdGlvbiBhY3Rpb247CglzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhOwoJdTE2IHRpZDsK CXUxNiBzc247Cgl1MTYgYnVmX3NpemU7Cglib29sIGFtc2R1OwoJdTE2IHRpbWVvdXQ7Cn07Cgov KioKICogZW51bSBpZWVlODAyMTFfZnJhbWVfcmVsZWFzZV90eXBlIC0gZnJhbWUgcmVsZWFzZSBy ZWFzb24KICogQElFRUU4MDIxMV9GUkFNRV9SRUxFQVNFX1BTUE9MTDogZnJhbWUgcmVsZWFzZWQg Zm9yIFBTLVBvbGwKICogQElFRUU4MDIxMV9GUkFNRV9SRUxFQVNFX1VBUFNEOiBmcmFtZShzKSBy ZWxlYXNlZCBkdWUgdG8KICoJZnJhbWUgcmVjZWl2ZWQgb24gdHJpZ2dlci1lbmFibGVkIEFDCiAq LwplbnVtIGllZWU4MDIxMV9mcmFtZV9yZWxlYXNlX3R5cGUgewoJSUVFRTgwMjExX0ZSQU1FX1JF TEVBU0VfUFNQT0xMLAoJSUVFRTgwMjExX0ZSQU1FX1JFTEVBU0VfVUFQU0QsCn07CgovKioKICog ZW51bSBpZWVlODAyMTFfcmF0ZV9jb250cm9sX2NoYW5nZWQgLSBmbGFncyB0byBpbmRpY2F0ZSB3 aGF0IGNoYW5nZWQKICoKICogQElFRUU4MDIxMV9SQ19CV19DSEFOR0VEOiBUaGUgYmFuZHdpZHRo IHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhbnNtaXQKICoJdG8gdGhpcyBzdGF0aW9uIGNoYW5nZWQu IFRoZSBhY3R1YWwgYmFuZHdpZHRoIGlzIGluIHRoZSBzdGF0aW9uCiAqCWluZm9ybWF0aW9uIC0t IGZvciBIVDIwLzQwIHRoZSBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MAogKglmbGFn IGNoYW5nZXMsIGZvciBIVCBhbmQgVkhUIHRoZSBiYW5kd2lkdGggZmllbGQgY2hhbmdlcy4KICog QElFRUU4MDIxMV9SQ19TTVBTX0NIQU5HRUQ6IFRoZSBTTVBTIHN0YXRlIG9mIHRoZSBzdGF0aW9u IGNoYW5nZWQuCiAqIEBJRUVFODAyMTFfUkNfU1VQUF9SQVRFU19DSEFOR0VEOiBUaGUgc3VwcG9y dGVkIHJhdGUgc2V0IG9mIHRoaXMgcGVlcgogKgljaGFuZ2VkIChpbiBJQlNTIG1vZGUpIGR1ZSB0 byBkaXNjb3ZlcmluZyBtb3JlIGluZm9ybWF0aW9uIGFib3V0CiAqCXRoZSBwZWVyLgogKiBASUVF RTgwMjExX1JDX05TU19DSEFOR0VEOiBOX1NTIChudW1iZXIgb2Ygc3BhdGlhbCBzdHJlYW1zKSB3 YXMgY2hhbmdlZAogKglieSB0aGUgcGVlcgogKi8KZW51bSBpZWVlODAyMTFfcmF0ZV9jb250cm9s X2NoYW5nZWQgewoJSUVFRTgwMjExX1JDX0JXX0NIQU5HRUQJCT0gQklUKDApLAoJSUVFRTgwMjEx X1JDX1NNUFNfQ0hBTkdFRAk9IEJJVCgxKSwKCUlFRUU4MDIxMV9SQ19TVVBQX1JBVEVTX0NIQU5H RUQJPSBCSVQoMiksCglJRUVFODAyMTFfUkNfTlNTX0NIQU5HRUQJPSBCSVQoMyksCn07CgovKioK ICogZW51bSBpZWVlODAyMTFfcm9jX3R5cGUgLSByZW1haW4gb24gY2hhbm5lbCB0eXBlCiAqCiAq IFdpdGggdGhlIHN1cHBvcnQgZm9yIG11bHRpIGNoYW5uZWwgY29udGV4dHMgYW5kIG11bHRpIGNo YW5uZWwgb3BlcmF0aW9ucywKICogcmVtYWluIG9uIGNoYW5uZWwgb3BlcmF0aW9ucyBtaWdodCBi ZSBsaW1pdGVkL2RlZmVycmVkL2Fib3J0ZWQgYnkgb3RoZXIKICogZmxvd3Mvb3BlcmF0aW9ucyB3 aGljaCBoYXZlIGhpZ2hlciBwcmlvcml0eSAoYW5kIHZpY2UgdmVyc2EpLgogKiBTcGVjaWZ5aW5n IHRoZSBST0MgdHlwZSBjYW4gYmUgdXNlZCBieSBkZXZpY2VzIHRvIHByaW9yaXRpemUgdGhlIFJP QwogKiBvcGVyYXRpb25zIGNvbXBhcmVkIHRvIG90aGVyIG9wZXJhdGlvbnMvZmxvd3MuCiAqCiAq IEBJRUVFODAyMTFfUk9DX1RZUEVfTk9STUFMOiBUaGVyZSBhcmUgbm8gc3BlY2lhbCByZXF1aXJl bWVudHMgZm9yIHRoaXMgUk9DLgogKiBASUVFRTgwMjExX1JPQ19UWVBFX01HTVRfVFg6IFRoZSBy ZW1haW4gb24gY2hhbm5lbCByZXF1ZXN0IGlzIHJlcXVpcmVkCiAqCWZvciBzZW5kaW5nIG1hbmFn ZW1lbnQgZnJhbWVzIG9mZmNoYW5uZWwuCiAqLwplbnVtIGllZWU4MDIxMV9yb2NfdHlwZSB7CglJ RUVFODAyMTFfUk9DX1RZUEVfTk9STUFMID0gMCwKCUlFRUU4MDIxMV9ST0NfVFlQRV9NR01UX1RY LAp9OwoKLyoqCiAqIGVudW0gaWVlZTgwMjExX3JlY29uZmlnX2NvbXBsZXRlX3R5cGUgLSByZWNv bmZpZyB0eXBlCiAqCiAqIFRoaXMgZW51bSBpcyB1c2VkIGJ5IHRoZSByZWNvbmZpZ19jb21wbGV0 ZSgpIGNhbGxiYWNrIHRvIGluZGljYXRlIHdoYXQKICogcmVjb25maWd1cmF0aW9uIHR5cGUgd2Fz IGNvbXBsZXRlZC4KICoKICogQElFRUU4MDIxMV9SRUNPTkZJR19UWVBFX1JFU1RBUlQ6IGh3IHJl c3RhcnQgdHlwZQogKgkoYWxzbyBkdWUgdG8gcmVzdW1lKCkgY2FsbGJhY2sgcmV0dXJuaW5nIDEp CiAqIEBJRUVFODAyMTFfUkVDT05GSUdfVFlQRV9TVVNQRU5EOiBzdXNwZW5kIHR5cGUgKHJlZ2Fy ZGxlc3MKICoJb2Ygd293bGFuIGNvbmZpZ3VyYXRpb24pCiAqLwplbnVtIGllZWU4MDIxMV9yZWNv bmZpZ190eXBlIHsKCUlFRUU4MDIxMV9SRUNPTkZJR19UWVBFX1JFU1RBUlQsCglJRUVFODAyMTFf UkVDT05GSUdfVFlQRV9TVVNQRU5ELAp9OwoKLyoqCiAqIHN0cnVjdCBpZWVlODAyMTFfb3BzIC0g Y2FsbGJhY2tzIGZyb20gbWFjODAyMTEgdG8gdGhlIGRyaXZlcgogKgogKiBUaGlzIHN0cnVjdHVy ZSBjb250YWlucyB2YXJpb3VzIGNhbGxiYWNrcyB0aGF0IHRoZSBkcml2ZXIgbWF5CiAqIGhhbmRs ZSBvciwgaW4gc29tZSBjYXNlcywgbXVzdCBoYW5kbGUsIGZvciBleGFtcGxlIHRvIGNvbmZpZ3Vy ZQogKiB0aGUgaGFyZHdhcmUgdG8gYSBuZXcgY2hhbm5lbCBvciB0byB0cmFuc21pdCBhIGZyYW1l LgogKgogKiBAdHg6IEhhbmRsZXIgdGhhdCA4MDIuMTEgbW9kdWxlIGNhbGxzIGZvciBlYWNoIHRy YW5zbWl0dGVkIGZyYW1lLgogKglza2IgY29udGFpbnMgdGhlIGJ1ZmZlciBzdGFydGluZyBmcm9t IHRoZSBJRUVFIDgwMi4xMSBoZWFkZXIuCiAqCVRoZSBsb3ctbGV2ZWwgZHJpdmVyIHNob3VsZCBz ZW5kIHRoZSBmcmFtZSBvdXQgYmFzZWQgb24KICoJY29uZmlndXJhdGlvbiBpbiB0aGUgVFggY29u dHJvbCBkYXRhLiBUaGlzIGhhbmRsZXIgc2hvdWxkLAogKglwcmVmZXJhYmx5LCBuZXZlciBmYWls IGFuZCBzdG9wIHF1ZXVlcyBhcHByb3ByaWF0ZWx5LgogKglNdXN0IGJlIGF0b21pYy4KICoKICog QHN0YXJ0OiBDYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCBuZXRkZXZpY2UgYXR0YWNoZWQgdG8gdGhl IGhhcmR3YXJlCiAqCWlzIGVuYWJsZWQuIFRoaXMgc2hvdWxkIHR1cm4gb24gdGhlIGhhcmR3YXJl IGFuZCBtdXN0IHR1cm4gb24KICoJZnJhbWUgcmVjZXB0aW9uIChmb3IgcG9zc2libHkgZW5hYmxl ZCBtb25pdG9yIGludGVyZmFjZXMuKQogKglSZXR1cm5zIG5lZ2F0aXZlIGVycm9yIGNvZGVzLCB0 aGVzZSBtYXkgYmUgc2VlbiBpbiB1c2Vyc3BhY2UsCiAqCW9yIHplcm8uCiAqCVdoZW4gdGhlIGRl dmljZSBpcyBzdGFydGVkIGl0IHNob3VsZCBub3QgaGF2ZSBhIE1BQyBhZGRyZXNzCiAqCXRvIGF2 b2lkIGFja25vd2xlZGdpbmcgZnJhbWVzIGJlZm9yZSBhIG5vbi1tb25pdG9yIGRldmljZQogKglp cyBhZGRlZC4KICoJTXVzdCBiZSBpbXBsZW1lbnRlZCBhbmQgY2FuIHNsZWVwLgogKgogKiBAc3Rv cDogQ2FsbGVkIGFmdGVyIGxhc3QgbmV0ZGV2aWNlIGF0dGFjaGVkIHRvIHRoZSBoYXJkd2FyZQog KglpcyBkaXNhYmxlZC4gVGhpcyBzaG91bGQgdHVybiBvZmYgdGhlIGhhcmR3YXJlIChhdCBsZWFz dAogKglpdCBtdXN0IHR1cm4gb2ZmIGZyYW1lIHJlY2VwdGlvbi4pCiAqCU1heSBiZSBjYWxsZWQg cmlnaHQgYWZ0ZXIgYWRkX2ludGVyZmFjZSBpZiB0aGF0IHJlamVjdHMKICoJYW4gaW50ZXJmYWNl LiBJZiB5b3UgYWRkZWQgYW55IHdvcmsgb250byB0aGUgbWFjODAyMTEgd29ya3F1ZXVlCiAqCXlv dSBzaG91bGQgZW5zdXJlIHRvIGNhbmNlbCBpdCBvbiB0aGlzIGNhbGxiYWNrLgogKglNdXN0IGJl IGltcGxlbWVudGVkIGFuZCBjYW4gc2xlZXAuCiAqCiAqIEBzdXNwZW5kOiBTdXNwZW5kIHRoZSBk ZXZpY2U7IG1hYzgwMjExIGl0c2VsZiB3aWxsIHF1aWVzY2UgYmVmb3JlIGFuZAogKglzdG9wIHRy YW5zbWl0dGluZyBhbmQgZG9pbmcgYW55IG90aGVyIGNvbmZpZ3VyYXRpb24sIGFuZCB0aGVuCiAq CWFzayB0aGUgZGV2aWNlIHRvIHN1c3BlbmQuIFRoaXMgaXMgb25seSBpbnZva2VkIHdoZW4gV29X TEFOIGlzCiAqCWNvbmZpZ3VyZWQsIG90aGVyd2lzZSB0aGUgZGV2aWNlIGlzIGRlY29uZmlndXJl ZCBjb21wbGV0ZWx5IGFuZAogKglyZWNvbmZpZ3VyZWQgYXQgcmVzdW1lIHRpbWUuCiAqCVRoZSBk cml2ZXIgbWF5IGFsc28gaW1wb3NlIHNwZWNpYWwgY29uZGl0aW9ucyB1bmRlciB3aGljaCBpdAog Kgl3YW50cyB0byB1c2UgdGhlICJub3JtYWwiIHN1c3BlbmQgKGRlY29uZmlndXJlKSwgc2F5IGlm IGl0IG9ubHkKICoJc3VwcG9ydHMgV29XTEFOIHdoZW4gdGhlIGRldmljZSBpcyBhc3NvY2lhdGVk LiBJbiB0aGlzIGNhc2UsIGl0CiAqCW11c3QgcmV0dXJuIDEgZnJvbSB0aGlzIGZ1bmN0aW9uLgog KgogKiBAcmVzdW1lOiBJZiBXb1dMQU4gd2FzIGNvbmZpZ3VyZWQsIHRoaXMgaW5kaWNhdGVzIHRo YXQgbWFjODAyMTEgaXMKICoJbm93IHJlc3VtaW5nIGl0cyBvcGVyYXRpb24sIGFmdGVyIHRoaXMg dGhlIGRldmljZSBtdXN0IGJlIGZ1bGx5CiAqCWZ1bmN0aW9uYWwgYWdhaW4uIElmIHRoaXMgcmV0 dXJucyBhbiBlcnJvciwgdGhlIG9ubHkgd2F5IG91dCBpcwogKgl0byBhbHNvIHVucmVnaXN0ZXIg dGhlIGRldmljZS4gSWYgaXQgcmV0dXJucyAxLCB0aGVuIG1hYzgwMjExCiAqCXdpbGwgYWxzbyBn byB0aHJvdWdoIHRoZSByZWd1bGFyIGNvbXBsZXRlIHJlc3RhcnQgb24gcmVzdW1lLgogKgogKiBA c2V0X3dha2V1cDogRW5hYmxlIG9yIGRpc2FibGUgd2FrZXVwIHdoZW4gV29XTEFOIGNvbmZpZ3Vy YXRpb24gaXMKICoJbW9kaWZpZWQuIFRoZSByZWFzb24gaXMgdGhhdCBkZXZpY2Vfc2V0X3dha2V1 cF9lbmFibGUoKSBpcwogKglzdXBwb3NlZCB0byBiZSBjYWxsZWQgd2hlbiB0aGUgY29uZmlndXJh dGlvbiBjaGFuZ2VzLCBub3Qgb25seQogKglpbiBzdXNwZW5kKCkuCiAqCiAqIEBhZGRfaW50ZXJm YWNlOiBDYWxsZWQgd2hlbiBhIG5ldGRldmljZSBhdHRhY2hlZCB0byB0aGUgaGFyZHdhcmUgaXMK ICoJZW5hYmxlZC4gQmVjYXVzZSBpdCBpcyBub3QgY2FsbGVkIGZvciBtb25pdG9yIG1vZGUgZGV2 aWNlcywgQHN0YXJ0CiAqCWFuZCBAc3RvcCBtdXN0IGJlIGltcGxlbWVudGVkLgogKglUaGUgZHJp dmVyIHNob3VsZCBwZXJmb3JtIGFueSBpbml0aWFsaXphdGlvbiBpdCBuZWVkcyBiZWZvcmUKICoJ dGhlIGRldmljZSBjYW4gYmUgZW5hYmxlZC4gVGhlIGluaXRpYWwgY29uZmlndXJhdGlvbiBmb3Ig dGhlCiAqCWludGVyZmFjZSBpcyBnaXZlbiBpbiB0aGUgY29uZiBwYXJhbWV0ZXIuCiAqCVRoZSBj YWxsYmFjayBtYXkgcmVmdXNlIHRvIGFkZCBhbiBpbnRlcmZhY2UgYnkgcmV0dXJuaW5nIGEKICoJ bmVnYXRpdmUgZXJyb3IgY29kZSAod2hpY2ggd2lsbCBiZSBzZWVuIGluIHVzZXJzcGFjZS4pCiAq CU11c3QgYmUgaW1wbGVtZW50ZWQgYW5kIGNhbiBzbGVlcC4KICoKICogQGNoYW5nZV9pbnRlcmZh Y2U6IENhbGxlZCB3aGVuIGEgbmV0ZGV2aWNlIGNoYW5nZXMgdHlwZS4gVGhpcyBjYWxsYmFjawog KglpcyBvcHRpb25hbCwgYnV0IG9ubHkgaWYgaXQgaXMgc3VwcG9ydGVkIGNhbiBpbnRlcmZhY2Ug dHlwZXMgYmUKICoJc3dpdGNoZWQgd2hpbGUgdGhlIGludGVyZmFjZSBpcyBVUC4gVGhlIGNhbGxi YWNrIG1heSBzbGVlcC4KICoJTm90ZSB0aGF0IHdoaWxlIGFuIGludGVyZmFjZSBpcyBiZWluZyBz d2l0Y2hlZCwgaXQgd2lsbCBub3QgYmUKICoJZm91bmQgYnkgdGhlIGludGVyZmFjZSBpdGVyYXRp b24gY2FsbGJhY2tzLgogKgogKiBAcmVtb3ZlX2ludGVyZmFjZTogTm90aWZpZXMgYSBkcml2ZXIg dGhhdCBhbiBpbnRlcmZhY2UgaXMgZ29pbmcgZG93bi4KICoJVGhlIEBzdG9wIGNhbGxiYWNrIGlz IGNhbGxlZCBhZnRlciB0aGlzIGlmIGl0IGlzIHRoZSBsYXN0IGludGVyZmFjZQogKglhbmQgbm8g bW9uaXRvciBpbnRlcmZhY2VzIGFyZSBwcmVzZW50LgogKglXaGVuIGFsbCBpbnRlcmZhY2VzIGFy ZSByZW1vdmVkLCB0aGUgTUFDIGFkZHJlc3MgaW4gdGhlIGhhcmR3YXJlCiAqCW11c3QgYmUgY2xl YXJlZCBzbyB0aGUgZGV2aWNlIG5vIGxvbmdlciBhY2tub3dsZWRnZXMgcGFja2V0cywKICoJdGhl IG1hY19hZGRyIG1lbWJlciBvZiB0aGUgY29uZiBzdHJ1Y3R1cmUgaXMsIGhvd2V2ZXIsIHNldCB0 byB0aGUKICoJTUFDIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBnb2luZyBhd2F5LgogKglIZW5jZSwg dGhpcyBjYWxsYmFjayBtdXN0IGJlIGltcGxlbWVudGVkLiBJdCBjYW4gc2xlZXAuCiAqCiAqIEBj b25maWc6IEhhbmRsZXIgZm9yIGNvbmZpZ3VyYXRpb24gcmVxdWVzdHMuIElFRUUgODAyLjExIGNv ZGUgY2FsbHMgdGhpcwogKglmdW5jdGlvbiB0byBjaGFuZ2UgaGFyZHdhcmUgY29uZmlndXJhdGlv biwgZS5nLiwgY2hhbm5lbC4KICoJVGhpcyBmdW5jdGlvbiBzaG91bGQgbmV2ZXIgZmFpbCBidXQg cmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKICoJaWYgaXQgZG9lcy4gVGhlIGNhbGxiYWNr IGNhbiBzbGVlcC4KICoKICogQGJzc19pbmZvX2NoYW5nZWQ6IEhhbmRsZXIgZm9yIGNvbmZpZ3Vy YXRpb24gcmVxdWVzdHMgcmVsYXRlZCB0byBCU1MKICoJcGFyYW1ldGVycyB0aGF0IG1heSB2YXJ5 IGR1cmluZyBCU1MncyBsaWZlc3BhbiwgYW5kIG1heSBhZmZlY3QgbG93CiAqCWxldmVsIGRyaXZl ciAoZS5nLiBhc3NvYy9kaXNhc3NvYyBzdGF0dXMsIGVycCBwYXJhbWV0ZXJzKS4KICoJVGhpcyBm dW5jdGlvbiBzaG91bGQgbm90IGJlIHVzZWQgaWYgbm8gQlNTIGhhcyBiZWVuIHNldCwgdW5sZXNz CiAqCWZvciBhc3NvY2lhdGlvbiBpbmRpY2F0aW9uLiBUaGUgQGNoYW5nZWQgcGFyYW1ldGVyIGlu ZGljYXRlcyB3aGljaAogKglvZiB0aGUgYnNzIHBhcmFtZXRlcnMgaGFzIGNoYW5nZWQgd2hlbiBh IGNhbGwgaXMgbWFkZS4gVGhlIGNhbGxiYWNrCiAqCWNhbiBzbGVlcC4KICoKICogQHByZXBhcmVf bXVsdGljYXN0OiBQcmVwYXJlIGZvciBtdWx0aWNhc3QgZmlsdGVyIGNvbmZpZ3VyYXRpb24uCiAq CVRoaXMgY2FsbGJhY2sgaXMgb3B0aW9uYWwsIGFuZCBpdHMgcmV0dXJuIHZhbHVlIGlzIHBhc3Nl ZAogKgl0byBjb25maWd1cmVfZmlsdGVyKCkuIFRoaXMgY2FsbGJhY2sgbXVzdCBiZSBhdG9taWMu CiAqCiAqIEBjb25maWd1cmVfZmlsdGVyOiBDb25maWd1cmUgdGhlIGRldmljZSdzIFJYIGZpbHRl ci4KICoJU2VlIHRoZSBzZWN0aW9uICJGcmFtZSBmaWx0ZXJpbmciIGZvciBtb3JlIGluZm9ybWF0 aW9uLgogKglUaGlzIGNhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgYW5kIGNhbiBzbGVlcC4K ICoKICogQGNvbmZpZ19pZmFjZV9maWx0ZXI6IENvbmZpZ3VyZSB0aGUgaW50ZXJmYWNlJ3MgUlgg ZmlsdGVyLgogKglUaGlzIGNhbGxiYWNrIGlzIG9wdGlvbmFsIGFuZCBpcyB1c2VkIHRvIGNvbmZp Z3VyZSB3aGljaCBmcmFtZXMKICoJc2hvdWxkIGJlIHBhc3NlZCB0byBtYWM4MDIxMS4gVGhlIGZp bHRlcl9mbGFncyBpcyB0aGUgY29tYmluYXRpb24KICoJb2YgRklGXyogZmxhZ3MuIFRoZSBjaGFu Z2VkX2ZsYWdzIGlzIGEgYml0IG1hc2sgdGhhdCBpbmRpY2F0ZXMKICoJd2hpY2ggZmxhZ3MgYXJl IGNoYW5nZWQuCiAqCVRoaXMgY2FsbGJhY2sgY2FuIHNsZWVwLgogKgogKiBAc2V0X3RpbTogU2V0 IFRJTSBiaXQuIG1hYzgwMjExIGNhbGxzIHRoaXMgZnVuY3Rpb24gd2hlbiBhIFRJTSBiaXQKICog CW11c3QgYmUgc2V0IG9yIGNsZWFyZWQgZm9yIGEgZ2l2ZW4gU1RBLiBNdXN0IGJlIGF0b21pYy4K ICoKICogQHNldF9rZXk6IFNlZSB0aGUgc2VjdGlvbiAiSGFyZHdhcmUgY3J5cHRvIGFjY2VsZXJh dGlvbiIKICoJVGhpcyBjYWxsYmFjayBpcyBvbmx5IGNhbGxlZCBiZXR3ZWVuIGFkZF9pbnRlcmZh Y2UgYW5kCiAqCXJlbW92ZV9pbnRlcmZhY2UgY2FsbHMsIGkuZS4gd2hpbGUgdGhlIGdpdmVuIHZp cnR1YWwgaW50ZXJmYWNlCiAqCWlzIGVuYWJsZWQuCiAqCVJldHVybnMgYSBuZWdhdGl2ZSBlcnJv ciBjb2RlIGlmIHRoZSBrZXkgY2FuJ3QgYmUgYWRkZWQuCiAqCVRoZSBjYWxsYmFjayBjYW4gc2xl ZXAuCiAqCiAqIEB1cGRhdGVfdGtpcF9rZXk6IFNlZSB0aGUgc2VjdGlvbiAiSGFyZHdhcmUgY3J5 cHRvIGFjY2VsZXJhdGlvbiIKICogCVRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgaW4gdGhl IGNvbnRleHQgb2YgUnguIENhbGxlZCBmb3IgZHJpdmVycwogKiAJd2hpY2ggc2V0IElFRUU4MDIx MV9LRVlfRkxBR19US0lQX1JFUV9SWF9QMV9LRVkuCiAqCVRoZSBjYWxsYmFjayBtdXN0IGJlIGF0 b21pYy4KICoKICogQHNldF9yZWtleV9kYXRhOiBJZiB0aGUgZGV2aWNlIHN1cHBvcnRzIEdUSyBy ZWtleWluZywgZm9yIGV4YW1wbGUgd2hpbGUgdGhlCiAqCWhvc3QgaXMgc3VzcGVuZGVkLCBpdCBj YW4gYXNzaWduIHRoaXMgY2FsbGJhY2sgdG8gcmV0cmlldmUgdGhlIGRhdGEKICoJbmVjZXNzYXJ5 IHRvIGRvIEdUSyByZWtleWluZywgdGhpcyBpcyB0aGUgS0VLLCBLQ0sgYW5kIHJlcGxheSBjb3Vu dGVyLgogKglBZnRlciByZWtleWluZyB3YXMgZG9uZSBpdCBzaG91bGQgKGZvciBleGFtcGxlIGR1 cmluZyByZXN1bWUpIG5vdGlmeQogKgl1c2Vyc3BhY2Ugb2YgdGhlIG5ldyByZXBsYXkgY291bnRl ciB1c2luZyBpZWVlODAyMTFfZ3RrX3Jla2V5X25vdGlmeSgpLgogKgogKiBAc2V0X2RlZmF1bHRf dW5pY2FzdF9rZXk6IFNldCB0aGUgZGVmYXVsdCAodW5pY2FzdCkga2V5IGluZGV4LCB1c2VmdWwg Zm9yCiAqCVdFUCB3aGVuIHRoZSBkZXZpY2Ugc2VuZHMgZGF0YSBwYWNrZXRzIGF1dG9ub21vdXNs eSwgZS5nLiBmb3IgQVJQCiAqCW9mZmxvYWRpbmcuIFRoZSBpbmRleCBjYW4gYmUgMC0zLCBvciAt MSBmb3IgdW5zZXR0aW5nIGl0LgogKgogKiBAaHdfc2NhbjogQXNrIHRoZSBoYXJkd2FyZSB0byBz ZXJ2aWNlIHRoZSBzY2FuIHJlcXVlc3QsIG5vIG5lZWQgdG8gc3RhcnQKICoJdGhlIHNjYW4gc3Rh dGUgbWFjaGluZSBpbiBzdGFjay4gVGhlIHNjYW4gbXVzdCBob25vdXIgdGhlIGNoYW5uZWwKICoJ Y29uZmlndXJhdGlvbiBkb25lIGJ5IHRoZSByZWd1bGF0b3J5IGFnZW50IGluIHRoZSB3aXBoeSdz CiAqCXJlZ2lzdGVyZWQgYmFuZHMuIFRoZSBoYXJkd2FyZSAob3IgdGhlIGRyaXZlcikgbmVlZHMg dG8gbWFrZSBzdXJlCiAqCXRoYXQgcG93ZXIgc2F2ZSBpcyBkaXNhYmxlZC4KICoJVGhlIEByZXEg aWUvaWVfbGVuIG1lbWJlcnMgYXJlIHJld3JpdHRlbiBieSBtYWM4MDIxMSB0byBjb250YWluIHRo ZQogKgllbnRpcmUgSUVzIGFmdGVyIHRoZSBTU0lELCBzbyB0aGF0IGRyaXZlcnMgbmVlZCBub3Qg bG9vayBhdCB0aGVzZQogKglhdCBhbGwgYnV0IGp1c3Qgc2VuZCB0aGVtIGFmdGVyIHRoZSBTU0lE IC0tIG1hYzgwMjExIGluY2x1ZGVzIHRoZQogKgkoZXh0ZW5kZWQpIHN1cHBvcnRlZCByYXRlcyBh bmQgSFQgaW5mb3JtYXRpb24gKHdoZXJlIGFwcGxpY2FibGUpLgogKglXaGVuIHRoZSBzY2FuIGZp bmlzaGVzLCBpZWVlODAyMTFfc2Nhbl9jb21wbGV0ZWQoKSBtdXN0IGJlIGNhbGxlZDsKICoJbm90 ZSB0aGF0IGl0IGFsc28gbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgc2NhbiBjYW5ub3QgZmluaXNo IGR1ZSB0bwogKglhbnkgZXJyb3IgdW5sZXNzIHRoaXMgY2FsbGJhY2sgcmV0dXJuZWQgYSBuZWdh dGl2ZSBlcnJvciBjb2RlLgogKglUaGlzIGNhbGxiYWNrIGlzIGFsc28gYWxsb3dlZCB0byByZXR1 cm4gdGhlIHNwZWNpYWwgcmV0dXJuIHZhbHVlIDEsCiAqCXRoaXMgaW5kaWNhdGVzIHRoYXQgaGFy ZHdhcmUgc2NhbiBpc24ndCBkZXNpcmFibGUgcmlnaHQgbm93IGFuZCBhCiAqCXNvZnR3YXJlIHNj YW4gc2hvdWxkIGJlIGRvbmUgaW5zdGVhZC4gQSBkcml2ZXIgd2lzaGluZyB0byB1c2UgdGhpcwog KgljYXBhYmlsaXR5IG11c3QgZW5zdXJlIGl0cyAoaGFyZHdhcmUpIHNjYW4gY2FwYWJpbGl0aWVz IGFyZW4ndAogKglhZHZlcnRpc2VkIGFzIG1vcmUgY2FwYWJsZSB0aGFuIG1hYzgwMjExJ3Mgc29m dHdhcmUgc2NhbiBpcy4KICoJVGhlIGNhbGxiYWNrIGNhbiBzbGVlcC4KICoKICogQGNhbmNlbF9o d19zY2FuOiBBc2sgdGhlIGxvdy1sZXZlbCB0cCBjYW5jZWwgdGhlIGFjdGl2ZSBodyBzY2FuLgog KglUaGUgZHJpdmVyIHNob3VsZCBhc2sgdGhlIGhhcmR3YXJlIHRvIGNhbmNlbCB0aGUgc2NhbiAo aWYgcG9zc2libGUpLAogKglidXQgdGhlIHNjYW4gd2lsbCBiZSBjb21wbGV0ZWQgb25seSBhZnRl ciB0aGUgZHJpdmVyIHdpbGwgY2FsbAogKglpZWVlODAyMTFfc2Nhbl9jb21wbGV0ZWQoKS4KICoJ VGhpcyBjYWxsYmFjayBpcyBuZWVkZWQgZm9yIHdvd2xhbiwgdG8gcHJldmVudCBlbnF1ZXVlaW5n IGEgbmV3CiAqCXNjYW5fd29yayBhZnRlciB0aGUgbG93LWxldmVsIGRyaXZlciB3YXMgYWxyZWFk eSBzdXNwZW5kZWQuCiAqCVRoZSBjYWxsYmFjayBjYW4gc2xlZXAuCiAqCiAqIEBzY2hlZF9zY2Fu X3N0YXJ0OiBBc2sgdGhlIGhhcmR3YXJlIHRvIHN0YXJ0IHNjYW5uaW5nIHJlcGVhdGVkbHkgYXQK ICoJc3BlY2lmaWMgaW50ZXJ2YWxzLiAgVGhlIGRyaXZlciBtdXN0IGNhbGwgdGhlCiAqCWllZWU4 MDIxMV9zY2hlZF9zY2FuX3Jlc3VsdHMoKSBmdW5jdGlvbiB3aGVuZXZlciBpdCBmaW5kcyByZXN1 bHRzLgogKglUaGlzIHByb2Nlc3Mgd2lsbCBjb250aW51ZSB1bnRpbCBzY2hlZF9zY2FuX3N0b3Ag aXMgY2FsbGVkLgogKgogKiBAc2NoZWRfc2Nhbl9zdG9wOiBUZWxsIHRoZSBoYXJkd2FyZSB0byBz dG9wIGFuIG9uZ29pbmcgc2NoZWR1bGVkIHNjYW4uCiAqCUluIHRoaXMgY2FzZSwgaWVlZTgwMjEx X3NjaGVkX3NjYW5fc3RvcHBlZCgpIG11c3Qgbm90IGJlIGNhbGxlZC4KICoKICogQHN3X3NjYW5f c3RhcnQ6IE5vdGlmaWVyIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGp1c3QgYmVmb3JlIGEgc29m dHdhcmUgc2NhbgogKglpcyBzdGFydGVkLiBDYW4gYmUgTlVMTCwgaWYgdGhlIGRyaXZlciBkb2Vz bid0IG5lZWQgdGhpcyBub3RpZmljYXRpb24uCiAqCVRoZSBtYWNfYWRkciBwYXJhbWV0ZXIgYWxs b3dzIHN1cHBvcnRpbmcgTkw4MDIxMV9TQ0FOX0ZMQUdfUkFORE9NX0FERFIsCiAqCXRoZSBkcml2 ZXIgbWF5IHNldCB0aGUgTkw4MDIxMV9GRUFUVVJFX1NDQU5fUkFORE9NX01BQ19BRERSIGZsYWcg aWYgaXQKICoJY2FuIHVzZSB0aGlzIHBhcmFtZXRlci4gVGhlIGNhbGxiYWNrIGNhbiBzbGVlcC4K ICoKICogQHN3X3NjYW5fY29tcGxldGU6IE5vdGlmaWVyIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVk IGp1c3QgYWZ0ZXIgYQogKglzb2Z0d2FyZSBzY2FuIGZpbmlzaGVkLiBDYW4gYmUgTlVMTCwgaWYg dGhlIGRyaXZlciBkb2Vzbid0IG5lZWQKICoJdGhpcyBub3RpZmljYXRpb24uCiAqCVRoZSBjYWxs YmFjayBjYW4gc2xlZXAuCiAqCiAqIEBnZXRfc3RhdHM6IFJldHVybiBsb3ctbGV2ZWwgc3RhdGlz dGljcy4KICogCVJldHVybnMgemVybyBpZiBzdGF0aXN0aWNzIGFyZSBhdmFpbGFibGUuCiAqCVRo ZSBjYWxsYmFjayBjYW4gc2xlZXAuCiAqCiAqIEBnZXRfa2V5X3NlcTogSWYgeW91ciBkZXZpY2Ug aW1wbGVtZW50cyBlbmNyeXB0aW9uIGluIGhhcmR3YXJlIGFuZCBkb2VzCiAqCUlWL1BOIGFzc2ln bm1lbnQgdGhlbiB0aGlzIGNhbGxiYWNrIHNob3VsZCBiZSBwcm92aWRlZCB0byByZWFkIHRoZQog KglJVi9QTiBmb3IgdGhlIGdpdmVuIGtleSBmcm9tIGhhcmR3YXJlLgogKglUaGUgY2FsbGJhY2sg bXVzdCBiZSBhdG9taWMuCiAqCiAqIEBzZXRfZnJhZ190aHJlc2hvbGQ6IENvbmZpZ3VyYXRpb24g b2YgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQuIEFzc2lnbiB0aGlzCiAqCWlmIHRoZSBkZXZpY2Ug ZG9lcyBmcmFnbWVudGF0aW9uIGJ5IGl0c2VsZi4gTm90ZSB0aGF0IHRvIHByZXZlbnQgdGhlCiAq CXN0YWNrIGZyb20gZG9pbmcgZnJhZ21lbnRhdGlvbiBJRUVFODAyMTFfSFdfU1VQUE9SVFNfVFhf RlJBRwogKglzaG91bGQgYmUgc2V0IGFzIHdlbGwuCiAqCVRoZSBjYWxsYmFjayBjYW4gc2xlZXAu CiAqCiAqIEBzZXRfcnRzX3RocmVzaG9sZDogQ29uZmlndXJhdGlvbiBvZiBSVFMgdGhyZXNob2xk IChpZiBkZXZpY2UgbmVlZHMgaXQpCiAqCVRoZSBjYWxsYmFjayBjYW4gc2xlZXAuCiAqCiAqIEBz dGFfYWRkOiBOb3RpZmllcyBsb3cgbGV2ZWwgZHJpdmVyIGFib3V0IGFkZGl0aW9uIG9mIGFuIGFz c29jaWF0ZWQgc3RhdGlvbiwKICoJQVAsIElCU1MvV0RTL21lc2ggcGVlciBldGMuIFRoaXMgY2Fs bGJhY2sgY2FuIHNsZWVwLgogKgogKiBAc3RhX3JlbW92ZTogTm90aWZpZXMgbG93IGxldmVsIGRy aXZlciBhYm91dCByZW1vdmFsIG9mIGFuIGFzc29jaWF0ZWQKICoJc3RhdGlvbiwgQVAsIElCU1Mv V0RTL21lc2ggcGVlciBldGMuIE5vdGUgdGhhdCBhZnRlciB0aGUgY2FsbGJhY2sKICoJcmV0dXJu cyBpdCBpc24ndCBzYWZlIHRvIHVzZSB0aGUgcG9pbnRlciwgbm90IGV2ZW4gUkNVIHByb3RlY3Rl ZDsKICoJbm8gUkNVIGdyYWNlIHBlcmlvZCBpcyBndWFyYW50ZWVkIGJldHdlZW4gcmV0dXJuaW5n IGhlcmUgYW5kIGZyZWVpbmcKICoJdGhlIHN0YXRpb24uIFNlZSBAc3RhX3ByZV9yY3VfcmVtb3Zl IGlmIG5lZWRlZC4KICoJVGhpcyBjYWxsYmFjayBjYW4gc2xlZXAuCiAqCiAqIEBzdGFfYWRkX2Rl YnVnZnM6IERyaXZlcnMgY2FuIHVzZSB0aGlzIGNhbGxiYWNrIHRvIGFkZCBkZWJ1Z2ZzIGZpbGVz CiAqCXdoZW4gYSBzdGF0aW9uIGlzIGFkZGVkIHRvIG1hYzgwMjExJ3Mgc3RhdGlvbiBsaXN0LiBU aGlzIGNhbGxiYWNrCiAqCXNob3VsZCBiZSB3aXRoaW4gYSBDT05GSUdfTUFDODAyMTFfREVCVUdG UyBjb25kaXRpb25hbC4gVGhpcwogKgljYWxsYmFjayBjYW4gc2xlZXAuCiAqCiAqIEBzdGFfbm90 aWZ5OiBOb3RpZmllcyBsb3cgbGV2ZWwgZHJpdmVyIGFib3V0IHBvd2VyIHN0YXRlIHRyYW5zaXRp b24gb2YgYW4KICoJYXNzb2NpYXRlZCBzdGF0aW9uLCBBUCwgIElCU1MvV0RTL21lc2ggcGVlciBl dGMuIEZvciBhIFZJRiBvcGVyYXRpbmcKICoJaW4gQVAgbW9kZSwgdGhpcyBjYWxsYmFjayB3aWxs IG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgZmxhZwogKgklSUVFRTgwMjExX0hXX0FQX0xJTktfUFMg aXMgc2V0LiBNdXN0IGJlIGF0b21pYy4KICoKICogQHN0YV9zZXRfdHhwd3I6IENvbmZpZ3VyZSB0 aGUgc3RhdGlvbiB0eCBwb3dlci4gVGhpcyBjYWxsYmFjayBzZXQgdGhlIHR4CiAqCXBvd2VyIGZv ciB0aGUgc3RhdGlvbi4KICoJVGhpcyBjYWxsYmFjayBjYW4gc2xlZXAuCiAqCiAqIEBzdGFfc3Rh dGU6IE5vdGlmaWVzIGxvdyBsZXZlbCBkcml2ZXIgYWJvdXQgc3RhdGUgdHJhbnNpdGlvbiBvZiBh CiAqCXN0YXRpb24gKHdoaWNoIGNhbiBiZSB0aGUgQVAsIGEgY2xpZW50LCBJQlNTL1dEUy9tZXNo IHBlZXIgZXRjLikKICoJVGhpcyBjYWxsYmFjayBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBA c3RhX2FkZC9Ac3RhX3JlbW92ZS4KICoJSXQgbXVzdCBub3QgZmFpbCBmb3IgZG93biB0cmFuc2l0 aW9ucyBidXQgbWF5IGZhaWwgZm9yIHRyYW5zaXRpb25zCiAqCXVwIHRoZSBsaXN0IG9mIHN0YXRl cy4gQWxzbyBub3RlIHRoYXQgYWZ0ZXIgdGhlIGNhbGxiYWNrIHJldHVybnMgaXQKICoJaXNuJ3Qg c2FmZSB0byB1c2UgdGhlIHBvaW50ZXIsIG5vdCBldmVuIFJDVSBwcm90ZWN0ZWQgLSBubyBSQ1Ug Z3JhY2UKICoJcGVyaW9kIGlzIGd1YXJhbnRlZWQgYmV0d2VlbiByZXR1cm5pbmcgaGVyZSBhbmQg ZnJlZWluZyB0aGUgc3RhdGlvbi4KICoJU2VlIEBzdGFfcHJlX3JjdV9yZW1vdmUgaWYgbmVlZGVk LgogKglUaGUgY2FsbGJhY2sgY2FuIHNsZWVwLgogKgogKiBAc3RhX3ByZV9yY3VfcmVtb3ZlOiBO b3RpZnkgZHJpdmVyIGFib3V0IHN0YXRpb24gcmVtb3ZhbCBiZWZvcmUgUkNVCiAqCXN5bmNocm9u aXNhdGlvbi4gVGhpcyBpcyB1c2VmdWwgaWYgYSBkcml2ZXIgbmVlZHMgdG8gaGF2ZSBzdGF0aW9u CiAqCXBvaW50ZXJzIHByb3RlY3RlZCB1c2luZyBSQ1UsIGl0IGNhbiB0aGVuIHVzZSB0aGlzIGNh bGwgdG8gY2xlYXIKICoJdGhlIHBvaW50ZXJzIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgYW4gUkNV IGdyYWNlIHBlcmlvZCB0byBlbGFwc2UKICoJaW4gQHN0YV9zdGF0ZS4KICoJVGhlIGNhbGxiYWNr IGNhbiBzbGVlcC4KICoKICogQHN0YV9yY191cGRhdGU6IE5vdGlmaWVzIHRoZSBkcml2ZXIgb2Yg Y2hhbmdlcyB0byB0aGUgYml0cmF0ZXMgdGhhdCBjYW4gYmUKICoJdXNlZCB0byB0cmFuc21pdCB0 byB0aGUgc3RhdGlvbi4gVGhlIGNoYW5nZXMgYXJlIGFkdmVydGlzZWQgd2l0aCBiaXRzCiAqCWZy b20gJmVudW0gaWVlZTgwMjExX3JhdGVfY29udHJvbF9jaGFuZ2VkIGFuZCB0aGUgdmFsdWVzIGFy ZSByZWZsZWN0ZWQKICoJaW4gdGhlIHN0YXRpb24gZGF0YS4gVGhpcyBjYWxsYmFjayBzaG91bGQg b25seSBiZSB1c2VkIHdoZW4gdGhlIGRyaXZlcgogKgl1c2VzIGhhcmR3YXJlIHJhdGUgY29udHJv bCAoJUlFRUU4MDIxMV9IV19IQVNfUkFURV9DT05UUk9MKSBzaW5jZQogKglvdGhlcndpc2UgdGhl IHJhdGUgY29udHJvbCBhbGdvcml0aG0gaXMgbm90aWZpZWQgZGlyZWN0bHkuCiAqCU11c3QgYmUg YXRvbWljLgogKiBAc3RhX3JhdGVfdGJsX3VwZGF0ZTogTm90aWZpZXMgdGhlIGRyaXZlciB0aGF0 IHRoZSByYXRlIHRhYmxlIGNoYW5nZWQuIFRoaXMKICoJaXMgb25seSB1c2VkIGlmIHRoZSBjb25m aWd1cmVkIHJhdGUgY29udHJvbCBhbGdvcml0aG0gYWN0dWFsbHkgdXNlcwogKgl0aGUgbmV3IHJh dGUgdGFibGUgQVBJLCBhbmQgaXMgdGhlcmVmb3JlIG9wdGlvbmFsLiBNdXN0IGJlIGF0b21pYy4K ICoKICogQHN0YV9zdGF0aXN0aWNzOiBHZXQgc3RhdGlzdGljcyBmb3IgdGhpcyBzdGF0aW9uLiBG b3IgZXhhbXBsZSB3aXRoIGJlYWNvbgogKglmaWx0ZXJpbmcsIHRoZSBzdGF0aXN0aWNzIGtlcHQg YnkgbWFjODAyMTEgbWlnaHQgbm90IGJlIGFjY3VyYXRlLCBzbwogKglsZXQgdGhlIGRyaXZlciBw cmUtZmlsbCB0aGUgc3RhdGlzdGljcy4gVGhlIGRyaXZlciBjYW4gZmlsbCBtb3N0IG9mCiAqCXRo ZSB2YWx1ZXMgKGluZGljYXRpbmcgd2hpY2ggYnkgc2V0dGluZyB0aGUgZmlsbGVkIGJpdG1hcCks IGJ1dCBub3QKICoJYWxsIG9mIHRoZW0gbWFrZSBzZW5zZSAtIHNlZSB0aGUgc291cmNlIGZvciB3 aGljaCBvbmVzIGFyZSBwb3NzaWJsZS4KICoJU3RhdGlzdGljcyB0aGF0IHRoZSBkcml2ZXIgZG9l c24ndCBmaWxsIHdpbGwgYmUgZmlsbGVkIGJ5IG1hYzgwMjExLgogKglUaGUgY2FsbGJhY2sgY2Fu IHNsZWVwLgogKgogKiBAY29uZl90eDogQ29uZmlndXJlIFRYIHF1ZXVlIHBhcmFtZXRlcnMgKEVE Q0YgKGFpZnMsIGN3X21pbiwgY3dfbWF4KSwKICoJYnVyc3RpbmcpIGZvciBhIGhhcmR3YXJlIFRY IHF1ZXVlLgogKglSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogKglU aGUgY2FsbGJhY2sgY2FuIHNsZWVwLgogKgogKiBAZ2V0X3RzZjogR2V0IHRoZSBjdXJyZW50IFRT RiB0aW1lciB2YWx1ZSBmcm9tIGZpcm13YXJlL2hhcmR3YXJlLiBDdXJyZW50bHksCiAqCXRoaXMg aXMgb25seSB1c2VkIGZvciBJQlNTIG1vZGUgQlNTSUQgbWVyZ2luZyBhbmQgZGVidWdnaW5nLiBJ cyBub3QgYQogKglyZXF1aXJlZCBmdW5jdGlvbi4KICoJVGhlIGNhbGxiYWNrIGNhbiBzbGVlcC4K ICoKICogQHNldF90c2Y6IFNldCB0aGUgVFNGIHRpbWVyIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUg aW4gdGhlIGZpcm13YXJlL2hhcmR3YXJlLgogKglDdXJyZW50bHksIHRoaXMgaXMgb25seSB1c2Vk IGZvciBJQlNTIG1vZGUgZGVidWdnaW5nLiBJcyBub3QgYQogKglyZXF1aXJlZCBmdW5jdGlvbi4K ICoJVGhlIGNhbGxiYWNrIGNhbiBzbGVlcC4KICoKICogQG9mZnNldF90c2Y6IE9mZnNldCB0aGUg VFNGIHRpbWVyIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUgaW4gdGhlCiAqCWZpcm13YXJlL2hhcmR3 YXJlLiAgUHJlZmVycmVkIHRvIHNldF90c2YgYXMgaXQgYXZvaWRzIGRlbGF5IGJldHdlZW4KICoJ Y2FsbGluZyBzZXRfdHNmKCkgYW5kIGhhcmR3YXJlIGdldHRpbmcgcHJvZ3JhbW1lZCwgd2hpY2gg d2lsbCBzaG93IHVwCiAqCWFzIFRTRiBkZWxheS4gSXMgbm90IGEgcmVxdWlyZWQgZnVuY3Rpb24u CiAqCVRoZSBjYWxsYmFjayBjYW4gc2xlZXAuCiAqCiAqIEByZXNldF90c2Y6IFJlc2V0IHRoZSBU U0YgdGltZXIgYW5kIGFsbG93IGZpcm13YXJlL2hhcmR3YXJlIHRvIHN5bmNocm9uaXplCiAqCXdp dGggb3RoZXIgU1RBcyBpbiB0aGUgSUJTUy4gVGhpcyBpcyBvbmx5IHVzZWQgaW4gSUJTUyBtb2Rl LiBUaGlzCiAqCWZ1bmN0aW9uIGlzIG9wdGlvbmFsIGlmIHRoZSBmaXJtd2FyZS9oYXJkd2FyZSB0 YWtlcyBmdWxsIGNhcmUgb2YKICoJVFNGIHN5bmNocm9uaXphdGlvbi4KICoJVGhlIGNhbGxiYWNr IGNhbiBzbGVlcC4KICoKICogQHR4X2xhc3RfYmVhY29uOiBEZXRlcm1pbmUgd2hldGhlciB0aGUg bGFzdCBJQlNTIGJlYWNvbiB3YXMgc2VudCBieSB1cy4KICoJVGhpcyBpcyBuZWVkZWQgb25seSBm b3IgSUJTUyBtb2RlIGFuZCB0aGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gaXMKICoJdXNlZCB0 byBkZXRlcm1pbmUgd2hldGhlciB0byByZXBseSB0byBQcm9iZSBSZXF1ZXN0cy4KICoJUmV0dXJu cyBub24temVybyBpZiB0aGlzIGRldmljZSBzZW50IHRoZSBsYXN0IGJlYWNvbi4KICoJVGhlIGNh bGxiYWNrIGNhbiBzbGVlcC4KICoKICogQGdldF9zdXJ2ZXk6IFJldHVybiBwZXItY2hhbm5lbCBz dXJ2ZXkgaW5mb3JtYXRpb24KICoKICogQHJma2lsbF9wb2xsOiBQb2xsIHJma2lsbCBoYXJkd2Fy ZSBzdGF0ZS4gSWYgeW91IG5lZWQgdGhpcywgeW91IGFsc28KICoJbmVlZCB0byBzZXQgd2lwaHkt PnJma2lsbF9wb2xsIHRvICV0cnVlIGJlZm9yZSByZWdpc3RyYXRpb24sCiAqCWFuZCBuZWVkIHRv IGNhbGwgd2lwaHlfcmZraWxsX3NldF9od19zdGF0ZSgpIGluIHRoZSBjYWxsYmFjay4KICoJVGhl IGNhbGxiYWNrIGNhbiBzbGVlcC4KICoKICogQHNldF9jb3ZlcmFnZV9jbGFzczogU2V0IHNsb3Qg dGltZSBmb3IgZ2l2ZW4gY292ZXJhZ2UgY2xhc3MgYXMgc3BlY2lmaWVkCiAqCWluIElFRUUgODAy LjExLTIwMDcgc2VjdGlvbiAxNy4zLjguNiBhbmQgbW9kaWZ5IEFDSyB0aW1lb3V0CiAqCWFjY29y ZGluZ2x5OyBjb3ZlcmFnZSBjbGFzcyBlcXVhbHMgdG8gLTEgdG8gZW5hYmxlIEFDSyB0aW1lb3V0 CiAqCWVzdGltYXRpb24gYWxnb3JpdGhtIChkeW5hY2spLiBUbyBkaXNhYmxlIGR5bmFjayBzZXQg dmFsaWQgdmFsdWUgZm9yCiAqCWNvdmVyYWdlIGNsYXNzLiBUaGlzIGNhbGxiYWNrIGlzIG5vdCBy ZXF1aXJlZCBhbmQgbWF5IHNsZWVwLgogKgogKiBAdGVzdG1vZGVfY21kOiBJbXBsZW1lbnQgYSBj Zmc4MDIxMSB0ZXN0IG1vZGUgY29tbWFuZC4gVGhlIHBhc3NlZCBAdmlmIG1heQogKgliZSAlTlVM TC4gVGhlIGNhbGxiYWNrIGNhbiBzbGVlcC4KICogQHRlc3Rtb2RlX2R1bXA6IEltcGxlbWVudCBh IGNmZzgwMjExIHRlc3QgbW9kZSBkdW1wLiBUaGUgY2FsbGJhY2sgY2FuIHNsZWVwLgogKgogKiBA Zmx1c2g6IEZsdXNoIGFsbCBwZW5kaW5nIGZyYW1lcyBmcm9tIHRoZSBoYXJkd2FyZSBxdWV1ZSwg bWFraW5nIHN1cmUKICoJdGhhdCB0aGUgaGFyZHdhcmUgcXVldWVzIGFyZSBlbXB0eS4gVGhlIEBx dWV1ZXMgcGFyYW1ldGVyIGlzIGEgYml0bWFwCiAqCW9mIHF1ZXVlcyB0byBmbHVzaCwgd2hpY2gg aXMgdXNlZnVsIGlmIGRpZmZlcmVudCB2aXJ0dWFsIGludGVyZmFjZXMKICoJdXNlIGRpZmZlcmVu dCBoYXJkd2FyZSBxdWV1ZXM7IGl0IG1heSBhbHNvIGluZGljYXRlIGFsbCBxdWV1ZXMuCiAqCUlm IHRoZSBwYXJhbWV0ZXIgQGRyb3AgaXMgc2V0IHRvICV0cnVlLCBwZW5kaW5nIGZyYW1lcyBtYXkg YmUgZHJvcHBlZC4KICoJTm90ZSB0aGF0IHZpZiBjYW4gYmUgTlVMTC4KICoJVGhlIGNhbGxiYWNr IGNhbiBzbGVlcC4KICoKICogQGNoYW5uZWxfc3dpdGNoOiBEcml2ZXJzIHRoYXQgbmVlZCAob3Ig d2FudCkgdG8gb2ZmbG9hZCB0aGUgY2hhbm5lbAogKglzd2l0Y2ggb3BlcmF0aW9uIGZvciBDU0Fz IHJlY2VpdmVkIGZyb20gdGhlIEFQIG1heSBpbXBsZW1lbnQgdGhpcwogKgljYWxsYmFjay4gVGhl eSBtdXN0IHRoZW4gY2FsbCBpZWVlODAyMTFfY2hzd2l0Y2hfZG9uZSgpIHRvIGluZGljYXRlCiAq CWNvbXBsZXRpb24gb2YgdGhlIGNoYW5uZWwgc3dpdGNoLgogKgogKiBAc2V0X2FudGVubmE6IFNl dCBhbnRlbm5hIGNvbmZpZ3VyYXRpb24gKHR4X2FudCwgcnhfYW50KSBvbiB0aGUgZGV2aWNlLgog KglQYXJhbWV0ZXJzIGFyZSBiaXRtYXBzIG9mIGFsbG93ZWQgYW50ZW5uYXMgdG8gdXNlIGZvciBU WC9SWC4gRHJpdmVycyBtYXkKICoJcmVqZWN0IFRYL1JYIG1hc2sgY29tYmluYXRpb25zIHRoZXkg Y2Fubm90IHN1cHBvcnQgYnkgcmV0dXJuaW5nIC1FSU5WQUwKICoJKGFsc28gc2VlIG5sODAyMTEu aCBATkw4MDIxMV9BVFRSX1dJUEhZX0FOVEVOTkFfVFgpLgogKgogKiBAZ2V0X2FudGVubmE6IEdl dCBjdXJyZW50IGFudGVubmEgY29uZmlndXJhdGlvbiBmcm9tIGRldmljZSAodHhfYW50LCByeF9h bnQpLgogKgogKiBAcmVtYWluX29uX2NoYW5uZWw6IFN0YXJ0cyBhbiBvZmYtY2hhbm5lbCBwZXJp b2Qgb24gdGhlIGdpdmVuIGNoYW5uZWwsIG11c3QKICoJY2FsbCBiYWNrIHRvIGllZWU4MDIxMV9y ZWFkeV9vbl9jaGFubmVsKCkgd2hlbiBvbiB0aGF0IGNoYW5uZWwuIE5vdGUKICoJdGhhdCBub3Jt YWwgY2hhbm5lbCB0cmFmZmljIGlzIG5vdCBzdG9wcGVkIGFzIHRoaXMgaXMgaW50ZW5kZWQgZm9y IGh3CiAqCW9mZmxvYWQuIEZyYW1lcyB0byB0cmFuc21pdCBvbiB0aGUgb2ZmLWNoYW5uZWwgY2hh bm5lbCBhcmUgdHJhbnNtaXR0ZWQKICoJbm9ybWFsbHkgZXhjZXB0IGZvciB0aGUgJUlFRUU4MDIx MV9UWF9DVExfVFhfT0ZGQ0hBTiBmbGFnLiBXaGVuIHRoZQogKglkdXJhdGlvbiAod2hpY2ggd2ls bCBhbHdheXMgYmUgbm9uLXplcm8pIGV4cGlyZXMsIHRoZSBkcml2ZXIgbXVzdCBjYWxsCiAqCWll ZWU4MDIxMV9yZW1haW5fb25fY2hhbm5lbF9leHBpcmVkKCkuCiAqCU5vdGUgdGhhdCB0aGlzIGNh bGxiYWNrIG1heSBiZSBjYWxsZWQgd2hpbGUgdGhlIGRldmljZSBpcyBpbiBJRExFIGFuZAogKglt dXN0IGJlIGFjY2VwdGVkIGluIHRoaXMgY2FzZS4KICoJVGhpcyBjYWxsYmFjayBtYXkgc2xlZXAu CiAqIEBjYW5jZWxfcmVtYWluX29uX2NoYW5uZWw6IFJlcXVlc3RzIHRoYXQgYW4gb25nb2luZyBv ZmYtY2hhbm5lbCBwZXJpb2QgaXMKICoJYWJvcnRlZCBiZWZvcmUgaXQgZXhwaXJlcy4gVGhpcyBj YWxsYmFjayBtYXkgc2xlZXAuCiAqCiAqIEBzZXRfcmluZ3BhcmFtOiBTZXQgdHggYW5kIHJ4IHJp bmcgc2l6ZXMuCiAqCiAqIEBnZXRfcmluZ3BhcmFtOiBHZXQgdHggYW5kIHJ4IHJpbmcgY3VycmVu dCBhbmQgbWF4aW11bSBzaXplcy4KICoKICogQHR4X2ZyYW1lc19wZW5kaW5nOiBDaGVjayBpZiB0 aGVyZSBpcyBhbnkgcGVuZGluZyBmcmFtZSBpbiB0aGUgaGFyZHdhcmUKICoJcXVldWVzIGJlZm9y ZSBlbnRlcmluZyBwb3dlciBzYXZlLgogKgogKiBAc2V0X2JpdHJhdGVfbWFzazogU2V0IGEgbWFz ayBvZiByYXRlcyB0byBiZSB1c2VkIGZvciByYXRlIGNvbnRyb2wgc2VsZWN0aW9uCiAqCXdoZW4g dHJhbnNtaXR0aW5nIGEgZnJhbWUuIEN1cnJlbnRseSBvbmx5IGxlZ2FjeSByYXRlcyBhcmUgaGFu ZGxlZC4KICoJVGhlIGNhbGxiYWNrIGNhbiBzbGVlcC4KICogQGV2ZW50X2NhbGxiYWNrOiBOb3Rp ZnkgZHJpdmVyIGFib3V0IGFueSBldmVudCBpbiBtYWM4MDIxMS4gU2VlCiAqCSZlbnVtIGllZWU4 MDIxMV9ldmVudF90eXBlIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzLgogKglUaGUgY2FsbGJhY2sg bXVzdCBiZSBhdG9taWMuCiAqCiAqIEByZWxlYXNlX2J1ZmZlcmVkX2ZyYW1lczogUmVsZWFzZSBi dWZmZXJlZCBmcmFtZXMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbgogKglwYXJhbWV0ZXJzLiBJbiB0 aGUgY2FzZSB3aGVyZSB0aGUgZHJpdmVyIGJ1ZmZlcnMgc29tZSBmcmFtZXMgZm9yCiAqCXNsZWVw aW5nIHN0YXRpb25zIG1hYzgwMjExIHdpbGwgdXNlIHRoaXMgY2FsbGJhY2sgdG8gdGVsbCB0aGUg ZHJpdmVyCiAqCXRvIHJlbGVhc2Ugc29tZSBmcmFtZXMsIGVpdGhlciBmb3IgUFMtcG9sbCBvciB1 QVBTRC4KICoJTm90ZSB0aGF0IGlmIHRoZSBAbW9yZV9kYXRhIHBhcmFtZXRlciBpcyAlZmFsc2Ug dGhlIGRyaXZlciBtdXN0IGNoZWNrCiAqCWlmIHRoZXJlIGFyZSBtb3JlIGZyYW1lcyBvbiB0aGUg Z2l2ZW4gVElEcywgYW5kIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4KICoJdGhlIGZyYW1lcyBiZWlu ZyByZWxlYXNlZCB0aGVuIGl0IG11c3Qgc3RpbGwgc2V0IHRoZSBtb3JlLWRhdGEgYml0IGluCiAq CXRoZSBmcmFtZS4gSWYgdGhlIEBtb3JlX2RhdGEgcGFyYW1ldGVyIGlzICV0cnVlLCB0aGVuIG9m IGNvdXJzZSB0aGUKICoJbW9yZS1kYXRhIGJpdCBtdXN0IGFsd2F5cyBiZSBzZXQuCiAqCVRoZSBA dGlkcyBwYXJhbWV0ZXIgdGVsbHMgdGhlIGRyaXZlciB3aGljaCBUSURzIHRvIHJlbGVhc2UgZnJh bWVzCiAqCWZyb20sIGZvciBQUy1wb2xsIGl0IHdpbGwgYWx3YXlzIGhhdmUgb25seSBhIHNpbmds ZSBiaXQgc2V0LgogKglJbiB0aGUgY2FzZSB0aGlzIGlzIHVzZWQgZm9yIGEgUFMtcG9sbCBpbml0 aWF0ZWQgcmVsZWFzZSwgdGhlCiAqCUBudW1fZnJhbWVzIHBhcmFtZXRlciB3aWxsIGFsd2F5cyBi ZSAxIHNvIGNvZGUgY2FuIGJlIHNoYXJlZC4gSW4KICoJdGhpcyBjYXNlIHRoZSBkcml2ZXIgbXVz dCBhbHNvIHNldCAlSUVFRTgwMjExX1RYX1NUQVRVU19FT1NQIGZsYWcKICoJb24gdGhlIFRYIHN0 YXR1cyAoYW5kIG11c3QgcmVwb3J0IFRYIHN0YXR1cykgc28gdGhhdCB0aGUgUFMtcG9sbAogKglw ZXJpb2QgaXMgcHJvcGVybHkgZW5kZWQuIFRoaXMgaXMgdXNlZCB0byBhdm9pZCBzZW5kaW5nIG11 bHRpcGxlCiAqCXJlc3BvbnNlcyBmb3IgYSByZXRyaWVkIFBTLXBvbGwgZnJhbWUuCiAqCUluIHRo ZSBjYXNlIHRoaXMgaXMgdXNlZCBmb3IgdUFQU0QsIHRoZSBAbnVtX2ZyYW1lcyBwYXJhbWV0ZXIg bWF5IGJlCiAqCWJpZ2dlciB0aGFuIG9uZSwgYnV0IHRoZSBkcml2ZXIgbWF5IHNlbmQgZmV3ZXIg ZnJhbWVzIChpdCBtdXN0IHNlbmQKICoJYXQgbGVhc3Qgb25lLCBob3dldmVyKS4gSW4gdGhpcyBj YXNlIGl0IGlzIGFsc28gcmVzcG9uc2libGUgZm9yCiAqCXNldHRpbmcgdGhlIEVPU1AgZmxhZyBp biB0aGUgUW9TIGhlYWRlciBvZiB0aGUgZnJhbWVzLiBBbHNvLCB3aGVuIHRoZQogKglzZXJ2aWNl IHBlcmlvZCBlbmRzLCB0aGUgZHJpdmVyIG11c3Qgc2V0ICVJRUVFODAyMTFfVFhfU1RBVFVTX0VP U1AKICoJb24gdGhlIGxhc3QgZnJhbWUgaW4gdGhlIFNQLiBBbHRlcm5hdGl2ZWx5LCBpdCBtYXkg Y2FsbCB0aGUgZnVuY3Rpb24KICoJaWVlZTgwMjExX3N0YV9lb3NwKCkgdG8gaW5mb3JtIG1hYzgw MjExIG9mIHRoZSBlbmQgb2YgdGhlIFNQLgogKglUaGlzIGNhbGxiYWNrIG11c3QgYmUgYXRvbWlj LgogKiBAYWxsb3dfYnVmZmVyZWRfZnJhbWVzOiBQcmVwYXJlIGRldmljZSB0byBhbGxvdyB0aGUg Z2l2ZW4gbnVtYmVyIG9mIGZyYW1lcwogKgl0byBnbyBvdXQgdG8gdGhlIGdpdmVuIHN0YXRpb24u IFRoZSBmcmFtZXMgd2lsbCBiZSBzZW50IGJ5IG1hYzgwMjExCiAqCXZpYSB0aGUgdXN1YWwgVFgg cGF0aCBhZnRlciB0aGlzIGNhbGwuIFRoZSBUWCBpbmZvcm1hdGlvbiBmb3IgZnJhbWVzCiAqCXJl bGVhc2VkIHdpbGwgYWxzbyBoYXZlIHRoZSAlSUVFRTgwMjExX1RYX0NUTF9OT19QU19CVUZGRVIg ZmxhZyBzZXQKICoJYW5kIHRoZSBsYXN0IG9uZSB3aWxsIGFsc28gaGF2ZSAlSUVFRTgwMjExX1RY X1NUQVRVU19FT1NQIHNldC4gSW4gY2FzZQogKglmcmFtZXMgZnJvbSBtdWx0aXBsZSBUSURzIGFy ZSByZWxlYXNlZCBhbmQgdGhlIGRyaXZlciBtaWdodCByZW9yZGVyCiAqCXRoZW0gYmV0d2VlbiB0 aGUgVElEcywgaXQgbXVzdCBzZXQgdGhlICVJRUVFODAyMTFfVFhfU1RBVFVTX0VPU1AgZmxhZwog KglvbiB0aGUgbGFzdCBmcmFtZSBhbmQgY2xlYXIgaXQgb24gYWxsIG90aGVycyBhbmQgYWxzbyBo YW5kbGUgdGhlIEVPU1AKICoJYml0IGluIHRoZSBRb1MgaGVhZGVyIGNvcnJlY3RseS4gQWx0ZXJu YXRpdmVseSwgaXQgY2FuIGFsc28gY2FsbCB0aGUKICoJaWVlZTgwMjExX3N0YV9lb3NwKCkgZnVu Y3Rpb24uCiAqCVRoZSBAdGlkcyBwYXJhbWV0ZXIgaXMgYSBiaXRtYXAgYW5kIHRlbGxzIHRoZSBk cml2ZXIgd2hpY2ggVElEcyB0aGUKICoJZnJhbWVzIHdpbGwgYmUgb247IGl0IHdpbGwgYXQgbW9z dCBoYXZlIHR3byBiaXRzIHNldC4KICoJVGhpcyBjYWxsYmFjayBtdXN0IGJlIGF0b21pYy4KICoK ICogQGdldF9ldF9zc2V0X2NvdW50OiAgRXRodG9vbCBBUEkgdG8gZ2V0IHN0cmluZy1zZXQgY291 bnQuCiAqCiAqIEBnZXRfZXRfc3RhdHM6ICBFdGh0b29sIEFQSSB0byBnZXQgYSBzZXQgb2YgdTY0 IHN0YXRzLgogKgogKiBAZ2V0X2V0X3N0cmluZ3M6ICBFdGh0b29sIEFQSSB0byBnZXQgYSBzZXQg b2Ygc3RyaW5ncyB0byBkZXNjcmliZSBzdGF0cwogKglhbmQgcGVyaGFwcyBvdGhlciBzdXBwb3J0 ZWQgdHlwZXMgb2YgZXRodG9vbCBkYXRhLXNldHMuCiAqCiAqIEBtZ2RfcHJlcGFyZV90eDogUHJl cGFyZSBmb3IgdHJhbnNtaXR0aW5nIGEgbWFuYWdlbWVudCBmcmFtZSBmb3IgYXNzb2NpYXRpb24K ICoJYmVmb3JlIGFzc29jaWF0ZWQuIEluIG11bHRpLWNoYW5uZWwgc2NlbmFyaW9zLCBhIHZpcnR1 YWwgaW50ZXJmYWNlIGlzCiAqCWJvdW5kIHRvIGEgY2hhbm5lbCBiZWZvcmUgaXQgaXMgYXNzb2Np YXRlZCwgYnV0IGFzIGl0IGlzbid0IGFzc29jaWF0ZWQKICoJeWV0IGl0IG5lZWQgbm90IG5lY2Vz c2FyaWx5IGJlIGdpdmVuIGFpcnRpbWUsIGluIHBhcnRpY3VsYXIgc2luY2UgYW55CiAqCXRyYW5z bWlzc2lvbiB0byBhIFAyUCBHTyBuZWVkcyB0byBiZSBzeW5jaHJvbml6ZWQgYWdhaW5zdCB0aGUg R08ncwogKglwb3dlcnNhdmUgc3RhdGUuIG1hYzgwMjExIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9u IGJlZm9yZSB0cmFuc21pdHRpbmcgYQogKgltYW5hZ2VtZW50IGZyYW1lIHByaW9yIHRvIGhhdmlu ZyBzdWNjZXNzZnVsbHkgYXNzb2NpYXRlZCB0byBhbGxvdyB0aGUKICoJZHJpdmVyIHRvIGdpdmUg aXQgY2hhbm5lbCB0aW1lIGZvciB0aGUgdHJhbnNtaXNzaW9uLCB0byBnZXQgYSByZXNwb25zZQog KglhbmQgdG8gYmUgYWJsZSB0byBzeW5jaHJvbml6ZSB3aXRoIHRoZSBHTy4KICoJRm9yIGRyaXZl cnMgdGhhdCBzZXQgJUlFRUU4MDIxMV9IV19ERUFVVEhfTkVFRF9NR0RfVFhfUFJFUCwgbWFjODAy MTEKICoJd291bGQgYWxzbyBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIHRyYW5zbWl0dGluZyBh IGRlYXV0aGVudGljYXRpb24KICoJZnJhbWUgaW4gY2FzZSB0aGF0IG5vIGJlYWNvbiB3YXMgaGVh cmQgZnJvbSB0aGUgQVAvUDJQIEdPLgogKglUaGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgYmVm b3JlIGVhY2ggdHJhbnNtaXNzaW9uIGFuZCB1cG9uIHJldHVybgogKgltYWM4MDIxMSB3aWxsIHRy YW5zbWl0IHRoZSBmcmFtZSByaWdodCBhd2F5LgogKiAgICAgIElmIGR1cmF0aW9uIGlzIGdyZWF0 ZXIgdGhhbiB6ZXJvLCBtYWM4MDIxMSBoaW50cyB0byB0aGUgZHJpdmVyIHRoZQogKiAgICAgIGR1 cmF0aW9uIGZvciB3aGljaCB0aGUgb3BlcmF0aW9uIGlzIHJlcXVlc3RlZC4KICoJVGhlIGNhbGxi YWNrIGlzIG9wdGlvbmFsIGFuZCBjYW4gKHNob3VsZCEpIHNsZWVwLgogKgogKiBAbWdkX3Byb3Rl Y3RfdGRsc19kaXNjb3ZlcjogUHJvdGVjdCBhIFRETFMgZGlzY292ZXJ5IHNlc3Npb24uIEFmdGVy IHNlbmRpbmcKICoJYSBURExTIGRpc2NvdmVyeS1yZXF1ZXN0LCB3ZSBleHBlY3QgYSByZXBseSB0 byBhcnJpdmUgb24gdGhlIEFQJ3MKICoJY2hhbm5lbC4gV2UgbXVzdCBzdGF5IG9uIHRoZSBjaGFu bmVsIChubyBQU00sIHNjYW4sIGV0Yy4pLCBzaW5jZSBhIFRETFMKICoJc2V0dXAtcmVzcG9uc2Ug aXMgYSBkaXJlY3QgcGFja2V0IG5vdCBidWZmZXJlZCBieSB0aGUgQVAuCiAqCW1hYzgwMjExIHdp bGwgY2FsbCB0aGlzIGZ1bmN0aW9uIGp1c3QgYmVmb3JlIHRoZSB0cmFuc21pc3Npb24gb2YgYSBU RExTCiAqCWRpc2NvdmVyeS1yZXF1ZXN0LiBUaGUgcmVjb21tZW5kZWQgcGVyaW9kIG9mIHByb3Rl Y3Rpb24gaXMgYXQgbGVhc3QKICoJMiAqIChEVElNIHBlcmlvZCkuCiAqCVRoZSBjYWxsYmFjayBp cyBvcHRpb25hbCBhbmQgY2FuIHNsZWVwLgogKgogKiBAYWRkX2NoYW5jdHg6IE5vdGlmaWVzIGRl dmljZSBkcml2ZXIgYWJvdXQgbmV3IGNoYW5uZWwgY29udGV4dCBjcmVhdGlvbi4KICoJVGhpcyBj YWxsYmFjayBtYXkgc2xlZXAuCiAqIEByZW1vdmVfY2hhbmN0eDogTm90aWZpZXMgZGV2aWNlIGRy aXZlciBhYm91dCBjaGFubmVsIGNvbnRleHQgZGVzdHJ1Y3Rpb24uCiAqCVRoaXMgY2FsbGJhY2sg bWF5IHNsZWVwLgogKiBAY2hhbmdlX2NoYW5jdHg6IE5vdGlmaWVzIGRldmljZSBkcml2ZXIgYWJv dXQgY2hhbm5lbCBjb250ZXh0IGNoYW5nZXMgdGhhdAogKgltYXkgaGFwcGVuIHdoZW4gY29tYmlu aW5nIGRpZmZlcmVudCB2aXJ0dWFsIGludGVyZmFjZXMgb24gdGhlIHNhbWUKICoJY2hhbm5lbCBj b250ZXh0IHdpdGggZGlmZmVyZW50IHNldHRpbmdzCiAqCVRoaXMgY2FsbGJhY2sgbWF5IHNsZWVw LgogKiBAYXNzaWduX3ZpZl9jaGFuY3R4OiBOb3RpZmllcyBkZXZpY2UgZHJpdmVyIGFib3V0IGNo YW5uZWwgY29udGV4dCBiZWluZyBib3VuZAogKgl0byB2aWYuIFBvc3NpYmxlIHVzZSBpcyBmb3Ig aHcgcXVldWUgcmVtYXBwaW5nLgogKglUaGlzIGNhbGxiYWNrIG1heSBzbGVlcC4KICogQHVuYXNz aWduX3ZpZl9jaGFuY3R4OiBOb3RpZmllcyBkZXZpY2UgZHJpdmVyIGFib3V0IGNoYW5uZWwgY29u dGV4dCBiZWluZwogKgl1bmJvdW5kIGZyb20gdmlmLgogKglUaGlzIGNhbGxiYWNrIG1heSBzbGVl cC4KICogQHN3aXRjaF92aWZfY2hhbmN0eDogc3dpdGNoIGEgbnVtYmVyIG9mIHZpZnMgZnJvbSBv bmUgY2hhbmN0eCB0bwogKglhbm90aGVyLCBhcyBzcGVjaWZpZWQgaW4gdGhlIGxpc3Qgb2YKICoJ QGllZWU4MDIxMV92aWZfY2hhbmN0eF9zd2l0Y2ggcGFzc2VkIHRvIHRoZSBkcml2ZXIsIGFjY29y ZGluZwogKgl0byB0aGUgbW9kZSBkZWZpbmVkIGluICZpZWVlODAyMTFfY2hhbmN0eF9zd2l0Y2hf bW9kZS4KICoJVGhpcyBjYWxsYmFjayBtYXkgc2xlZXAuCiAqCiAqIEBzdGFydF9hcDogU3RhcnQg b3BlcmF0aW9uIG9uIHRoZSBBUCBpbnRlcmZhY2UsIHRoaXMgaXMgY2FsbGVkIGFmdGVyIGFsbCB0 aGUKICoJaW5mb3JtYXRpb24gaW4gYnNzX2NvbmYgaXMgc2V0IGFuZCBiZWFjb24gY2FuIGJlIHJl dHJpZXZlZC4gQSBjaGFubmVsCiAqCWNvbnRleHQgaXMgYm91bmQgYmVmb3JlIHRoaXMgaXMgY2Fs bGVkLiBOb3RlIHRoYXQgaWYgdGhlIGRyaXZlciB1c2VzCiAqCXNvZnR3YXJlIHNjYW4gb3IgUk9D LCB0aGlzIChhbmQgQHN0b3BfYXApIGlzbid0IGNhbGxlZCB3aGVuIHRoZSBBUCBpcwogKglqdXN0 ICJwYXVzZWQiIGZvciBzY2FubmluZy9ST0MsIHdoaWNoIGlzIGluZGljYXRlZCBieSB0aGUgYmVh Y29uIGJlaW5nCiAqCWRpc2FibGVkL2VuYWJsZWQgdmlhIEBic3NfaW5mb19jaGFuZ2VkLgogKiBA c3RvcF9hcDogU3RvcCBvcGVyYXRpb24gb24gdGhlIEFQIGludGVyZmFjZS4KICoKICogQHJlY29u ZmlnX2NvbXBsZXRlOiBDYWxsZWQgYWZ0ZXIgYSBjYWxsIHRvIGllZWU4MDIxMV9yZXN0YXJ0X2h3 KCkgYW5kCiAqCWR1cmluZyByZXN1bWUsIHdoZW4gdGhlIHJlY29uZmlndXJhdGlvbiBoYXMgY29t cGxldGVkLgogKglUaGlzIGNhbiBoZWxwIHRoZSBkcml2ZXIgaW1wbGVtZW50IHRoZSByZWNvbmZp Z3VyYXRpb24gc3RlcCAoYW5kCiAqCWluZGljYXRlIG1hYzgwMjExIGlzIHJlYWR5IHRvIHJlY2Vp dmUgZnJhbWVzKS4KICoJVGhpcyBjYWxsYmFjayBtYXkgc2xlZXAuCiAqCiAqIEBpcHY2X2FkZHJf Y2hhbmdlOiBJUHY2IGFkZHJlc3MgYXNzaWdubWVudCBvbiB0aGUgZ2l2ZW4gaW50ZXJmYWNlIGNo YW5nZWQuCiAqCUN1cnJlbnRseSwgdGhpcyBpcyBvbmx5IGNhbGxlZCBmb3IgbWFuYWdlZCBvciBQ MlAgY2xpZW50IGludGVyZmFjZXMuCiAqCVRoaXMgY2FsbGJhY2sgaXMgb3B0aW9uYWw7IGl0IG11 c3Qgbm90IHNsZWVwLgogKgogKiBAY2hhbm5lbF9zd2l0Y2hfYmVhY29uOiBTdGFydHMgYSBjaGFu bmVsIHN3aXRjaCB0byBhIG5ldyBjaGFubmVsLgogKglCZWFjb25zIGFyZSBtb2RpZmllZCB0byBp bmNsdWRlIENTQSBvciBFQ1NBIElFcyBiZWZvcmUgY2FsbGluZyB0aGlzCiAqCWZ1bmN0aW9uLiBU aGUgY29ycmVzcG9uZGluZyBjb3VudCBmaWVsZHMgaW4gdGhlc2UgSUVzIG11c3QgYmUKICoJZGVj cmVtZW50ZWQsIGFuZCB3aGVuIHRoZXkgcmVhY2ggMSB0aGUgZHJpdmVyIG11c3QgY2FsbAogKglp ZWVlODAyMTFfY3NhX2ZpbmlzaCgpLiBEcml2ZXJzIHdoaWNoIHVzZSBpZWVlODAyMTFfYmVhY29u X2dldCgpCiAqCWdldCB0aGUgY3NhIGNvdW50ZXIgZGVjcmVtZW50ZWQgYnkgbWFjODAyMTEsIGJ1 dCBtdXN0IGNoZWNrIGlmIGl0IGlzCiAqCTEgdXNpbmcgaWVlZTgwMjExX2NzYV9pc19jb21wbGV0 ZSgpIGFmdGVyIHRoZSBiZWFjb24gaGFzIGJlZW4KICoJdHJhbnNtaXR0ZWQgYW5kIHRoZW4gY2Fs bCBpZWVlODAyMTFfY3NhX2ZpbmlzaCgpLgogKglJZiB0aGUgQ1NBIGNvdW50IHN0YXJ0cyBhcyB6 ZXJvIG9yIDEsIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgYmUgY2FsbGVkLAogKglzaW5jZSB0aGVy ZSB3b24ndCBiZSBhbnkgdGltZSB0byBiZWFjb24gYmVmb3JlIHRoZSBzd2l0Y2ggYW55d2F5Lgog KiBAcHJlX2NoYW5uZWxfc3dpdGNoOiBUaGlzIGlzIGFuIG9wdGlvbmFsIGNhbGxiYWNrIHRoYXQg aXMgY2FsbGVkCiAqCWJlZm9yZSBhIGNoYW5uZWwgc3dpdGNoIHByb2NlZHVyZSBpcyBzdGFydGVk IChpZS4gd2hlbiBhIFNUQQogKglnZXRzIGEgQ1NBIG9yIGEgdXNlcnNwYWNlIGluaXRpYXRlZCBj aGFubmVsLXN3aXRjaCksIGFsbG93aW5nCiAqCXRoZSBkcml2ZXIgdG8gcHJlcGFyZSBmb3IgdGhl IGNoYW5uZWwgc3dpdGNoLgogKiBAcG9zdF9jaGFubmVsX3N3aXRjaDogVGhpcyBpcyBhbiBvcHRp b25hbCBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZAogKglhZnRlciBhIGNoYW5uZWwgc3dpdGNoIHBy b2NlZHVyZSBpcyBjb21wbGV0ZWQsIGFsbG93aW5nIHRoZQogKglkcml2ZXIgdG8gZ28gYmFjayB0 byBhIG5vcm1hbCBjb25maWd1cmF0aW9uLgogKiBAYWJvcnRfY2hhbm5lbF9zd2l0Y2g6IFRoaXMg aXMgYW4gb3B0aW9uYWwgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQKICoJd2hlbiBjaGFubmVsIHN3 aXRjaCBwcm9jZWR1cmUgd2FzIGNvbXBsZXRlZCwgYWxsb3dpbmcgdGhlCiAqCWRyaXZlciB0byBn byBiYWNrIHRvIGEgbm9ybWFsIGNvbmZpZ3VyYXRpb24uCiAqIEBjaGFubmVsX3N3aXRjaF9yeF9i ZWFjb246IFRoaXMgaXMgYW4gb3B0aW9uYWwgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQKICoJd2hl biBjaGFubmVsIHN3aXRjaCBwcm9jZWR1cmUgaXMgaW4gcHJvZ3Jlc3MgYW5kIGFkZGl0aW9uYWwg YmVhY29uIHdpdGgKICoJQ1NBIElFIHdhcyByZWNlaXZlZCwgYWxsb3dpbmcgZHJpdmVyIHRvIHRy YWNrIGNoYW5nZXMgaW4gY291bnQuCiAqIEBqb2luX2lic3M6IEpvaW4gYW4gSUJTUyAob24gYW4g SUJTUyBpbnRlcmZhY2UpOyB0aGlzIGlzIGNhbGxlZCBhZnRlciBhbGwKICoJaW5mb3JtYXRpb24g aW4gYnNzX2NvbmYgaXMgc2V0IHVwIGFuZCB0aGUgYmVhY29uIGNhbiBiZSByZXRyaWV2ZWQuIEEK ICoJY2hhbm5lbCBjb250ZXh0IGlzIGJvdW5kIGJlZm9yZSB0aGlzIGlzIGNhbGxlZC4KICogQGxl YXZlX2lic3M6IExlYXZlIHRoZSBJQlNTIGFnYWluLgogKgogKiBAZ2V0X2V4cGVjdGVkX3Rocm91 Z2hwdXQ6IGV4dHJhY3QgdGhlIGV4cGVjdGVkIHRocm91Z2hwdXQgdG93YXJkcyB0aGUKICoJc3Bl Y2lmaWVkIHN0YXRpb24uIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBleHByZXNzZWQgaW4gS2Jwcy4g SXQgcmV0dXJucyAwCiAqCWlmIHRoZSBSQyBhbGdvcml0aG0gZG9lcyBub3QgaGF2ZSBwcm9wZXIg ZGF0YSB0byBwcm92aWRlLgogKgogKiBAZ2V0X3R4cG93ZXI6IGdldCBjdXJyZW50IG1heGltdW0g dHggcG93ZXIgKGluIGRCbSkgYmFzZWQgb24gY29uZmlndXJhdGlvbgogKglhbmQgaGFyZHdhcmUg bGltaXRzLgogKgogKiBAdGRsc19jaGFubmVsX3N3aXRjaDogU3RhcnQgY2hhbm5lbC1zd2l0Y2hp bmcgd2l0aCBhIFRETFMgcGVlci4gVGhlIGRyaXZlcgogKglpcyByZXNwb25zaWJsZSBmb3IgY29u dGludWFsbHkgaW5pdGlhdGluZyBjaGFubmVsLXN3aXRjaGluZyBvcGVyYXRpb25zCiAqCWFuZCBy ZXR1cm5pbmcgdG8gdGhlIGJhc2UgY2hhbm5lbCBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBB UC4gVGhlCiAqCWRyaXZlciByZWNlaXZlcyBhIGNoYW5uZWwtc3dpdGNoIHJlcXVlc3QgdGVtcGxh dGUgYW5kIHRoZSBsb2NhdGlvbiBvZgogKgl0aGUgc3dpdGNoLXRpbWluZyBJRSB3aXRoaW4gdGhl IHRlbXBsYXRlIGFzIHBhcnQgb2YgdGhlIGludm9jYXRpb24uCiAqCVRoZSB0ZW1wbGF0ZSBpcyB2 YWxpZCBvbmx5IHdpdGhpbiB0aGUgY2FsbCwgYW5kIHRoZSBkcml2ZXIgY2FuCiAqCW9wdGlvbmFs bHkgY29weSB0aGUgc2tiIGZvciBmdXJ0aGVyIHJlLXVzZS4KICogQHRkbHNfY2FuY2VsX2NoYW5u ZWxfc3dpdGNoOiBTdG9wIGNoYW5uZWwtc3dpdGNoaW5nIHdpdGggYSBURExTIHBlZXIuIEJvdGgK ICoJcGVlcnMgbXVzdCBiZSBvbiB0aGUgYmFzZSBjaGFubmVsIHdoZW4gdGhlIGNhbGwgY29tcGxl dGVzLgogKiBAdGRsc19yZWN2X2NoYW5uZWxfc3dpdGNoOiBhIFRETFMgY2hhbm5lbC1zd2l0Y2gg cmVsYXRlZCBmcmFtZSAocmVxdWVzdCBvcgogKglyZXNwb25zZSkgaGFzIGJlZW4gcmVjZWl2ZWQg ZnJvbSBhIHJlbW90ZSBwZWVyLiBUaGUgZHJpdmVyIGdldHMKICoJcGFyYW1ldGVycyBwYXJzZWQg ZnJvbSB0aGUgaW5jb21pbmcgZnJhbWUgYW5kIG1heSB1c2UgdGhlbSB0byBjb250aW51ZQogKglh biBvbmdvaW5nIGNoYW5uZWwtc3dpdGNoIG9wZXJhdGlvbi4gSW4gYWRkaXRpb24sIGEgY2hhbm5l bC1zd2l0Y2gKICoJcmVzcG9uc2UgdGVtcGxhdGUgaXMgcHJvdmlkZWQsIHRvZ2V0aGVyIHdpdGgg dGhlIGxvY2F0aW9uIG9mIHRoZQogKglzd2l0Y2gtdGltaW5nIElFIHdpdGhpbiB0aGUgdGVtcGxh dGUuIFRoZSBza2IgY2FuIG9ubHkgYmUgdXNlZCB3aXRoaW4KICoJdGhlIGZ1bmN0aW9uIGNhbGwu CiAqCiAqIEB3YWtlX3R4X3F1ZXVlOiBDYWxsZWQgd2hlbiBuZXcgcGFja2V0cyBoYXZlIGJlZW4g YWRkZWQgdG8gdGhlIHF1ZXVlLgogKiBAc3luY19yeF9xdWV1ZXM6IFByb2Nlc3MgYWxsIHBlbmRp bmcgZnJhbWVzIGluIFJTUyBxdWV1ZXMuIFRoaXMgaXMgYQogKglzeW5jaHJvbml6YXRpb24gd2hp Y2ggaXMgbmVlZGVkIGluIGNhc2UgZHJpdmVyIGhhcyBpbiBpdHMgUlNTIHF1ZXVlcwogKglwZW5k aW5nIGZyYW1lcyB0aGF0IHdlcmUgcmVjZWl2ZWQgcHJpb3IgdG8gdGhlIGNvbnRyb2wgcGF0aCBh Y3Rpb24KICoJY3VycmVudGx5IHRha2VuIChlLmcuIGRpc2Fzc29jaWF0aW9uKSBidXQgYXJlIG5v dCBwcm9jZXNzZWQgeWV0LgogKgogKiBAc3RhcnRfbmFuOiBqb2luIGFuIGV4aXN0aW5nIE5BTiBj bHVzdGVyLCBvciBjcmVhdGUgYSBuZXcgb25lLgogKiBAc3RvcF9uYW46IGxlYXZlIHRoZSBOQU4g Y2x1c3Rlci4KICogQG5hbl9jaGFuZ2VfY29uZjogY2hhbmdlIE5BTiBjb25maWd1cmF0aW9uLiBU aGUgZGF0YSBpbiBjZmc4MDIxMV9uYW5fY29uZgogKgljb250YWlucyBmdWxsIG5ldyBjb25maWd1 cmF0aW9uIGFuZCBjaGFuZ2VzIHNwZWNpZnkgd2hpY2ggcGFyYW1ldGVycwogKglhcmUgY2hhbmdl ZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGxhc3QgTkFOIGNvbmZpZy4KICoJVGhlIGRyaXZlciBnZXRz IGJvdGggZnVsbCBjb25maWd1cmF0aW9uIGFuZCB0aGUgY2hhbmdlZCBwYXJhbWV0ZXJzIHNpbmNl CiAqCXNvbWUgZGV2aWNlcyBtYXkgbmVlZCB0aGUgZnVsbCBjb25maWd1cmF0aW9uIHdoaWxlIG90 aGVycyBuZWVkIG9ubHkgdGhlCiAqCWNoYW5nZWQgcGFyYW1ldGVycy4KICogQGFkZF9uYW5fZnVu YzogQWRkIGEgTkFOIGZ1bmN0aW9uLiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gVGhlIGRhdGEgaW4K ICoJY2ZnODAyMTFfbmFuX2Z1bmMgbXVzdCBub3QgYmUgcmVmZXJlbmNlZCBvdXRzaWRlIHRoZSBz Y29wZSBvZgogKgl0aGlzIGNhbGwuCiAqIEBkZWxfbmFuX2Z1bmM6IFJlbW92ZSBhIE5BTiBmdW5j dGlvbi4gVGhlIGRyaXZlciBtdXN0IGNhbGwKICoJaWVlZTgwMjExX25hbl9mdW5jX3Rlcm1pbmF0 ZWQoKSB3aXRoCiAqCU5MODAyMTFfTkFOX0ZVTkNfVEVSTV9SRUFTT05fVVNFUl9SRVFVRVNUIHJl YXNvbiBjb2RlIHVwb24gcmVtb3ZhbC4KICogQGNhbl9hZ2dyZWdhdGVfaW5fYW1zZHU6IENhbGxl ZCBpbiBvcmRlciB0byBkZXRlcm1pbmUgaWYgSFcgc3VwcG9ydHMKICoJYWdncmVnYXRpbmcgdHdv IHNwZWNpZmljIGZyYW1lcyBpbiB0aGUgc2FtZSBBLU1TRFUuIFRoZSByZWxhdGlvbgogKgliZXR3 ZWVuIHRoZSBza2JzIHNob3VsZCBiZSBzeW1tZXRyaWMgYW5kIHRyYW5zaXRpdmUuIE5vdGUgdGhh dCB3aGlsZQogKglza2IgaXMgYWx3YXlzIGEgcmVhbCBmcmFtZSwgaGVhZCBtYXkgb3IgbWF5IG5v dCBiZSBhbiBBLU1TRFUuCiAqIEBnZXRfZnRtX3Jlc3BvbmRlcl9zdGF0czogUmV0cmlldmUgRlRN IHJlc3BvbmRlciBzdGF0aXN0aWNzLCBpZiBhdmFpbGFibGUuCiAqCVN0YXRpc3RpY3Mgc2hvdWxk IGJlIGN1bXVsYXRpdmUsIGN1cnJlbnRseSBubyB3YXkgdG8gcmVzZXQgaXMgcHJvdmlkZWQuCiAq CiAqIEBzdGFydF9wbXNyOiBzdGFydCBwZWVyIG1lYXN1cmVtZW50IChlLmcuIEZUTSkgKHRoaXMg Y2FsbCBjYW4gc2xlZXApCiAqIEBhYm9ydF9wbXNyOiBhYm9ydCBwZWVyIG1lYXN1cmVtZW50ICh0 aGlzIGNhbGwgY2FuIHNsZWVwKQogKiBAc2V0X3RpZF9jb25maWc6IEFwcGx5IFRJRCBzcGVjaWZp YyBjb25maWd1cmF0aW9ucy4gVGhpcyBjYWxsYmFjayBtYXkgc2xlZXAuCiAqIEByZXNldF90aWRf Y29uZmlnOiBSZXNldCBUSUQgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmb3IgdGhlIHBlZXIuCiAq CVRoaXMgY2FsbGJhY2sgbWF5IHNsZWVwLgogKi8Kc3RydWN0IGllZWU4MDIxMV9vcHMgewoJdm9p ZCAoKnR4KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3R4 X2NvbnRyb2wgKmNvbnRyb2wsCgkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CglpbnQgKCpzdGFy dCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwoJdm9pZCAoKnN0b3ApKHN0cnVjdCBpZWVlODAy MTFfaHcgKmh3KTsKI2lmZGVmIENPTkZJR19QTQoJaW50ICgqc3VzcGVuZCkoc3RydWN0IGllZWU4 MDIxMV9odyAqaHcsIHN0cnVjdCBjZmc4MDIxMV93b3dsYW4gKndvd2xhbik7CglpbnQgKCpyZXN1 bWUpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKCXZvaWQgKCpzZXRfd2FrZXVwKShzdHJ1Y3Qg aWVlZTgwMjExX2h3ICpodywgYm9vbCBlbmFibGVkKTsKI2VuZGlmCglpbnQgKCphZGRfaW50ZXJm YWNlKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3Zp ZiAqdmlmKTsKCWludCAoKmNoYW5nZV9pbnRlcmZhY2UpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3 LAoJCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKCQkJCWVudW0gbmw4MDIxMV9pZnR5cGUg bmV3X3R5cGUsIGJvb2wgcDJwKTsKCXZvaWQgKCpyZW1vdmVfaW50ZXJmYWNlKShzdHJ1Y3QgaWVl ZTgwMjExX2h3ICpodywKCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKCWludCAoKmNv bmZpZykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBjaGFuZ2VkKTsKCXZvaWQgKCpic3Nf aW5mb19jaGFuZ2VkKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJCSBzdHJ1Y3QgaWVlZTgw MjExX3ZpZiAqdmlmLAoJCQkJIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmluZm8sCgkJCQkg dTMyIGNoYW5nZWQpOwoKCWludCAoKnN0YXJ0X2FwKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywg c3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Cgl2b2lkICgqc3RvcF9hcCkoc3RydWN0IGllZWU4 MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwoKCXU2NCAoKnByZXBhcmVf bXVsdGljYXN0KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJCSBzdHJ1Y3QgbmV0ZGV2X2h3 X2FkZHJfbGlzdCAqbWNfbGlzdCk7Cgl2b2lkICgqY29uZmlndXJlX2ZpbHRlcikoc3RydWN0IGll ZWU4MDIxMV9odyAqaHcsCgkJCQkgdW5zaWduZWQgaW50IGNoYW5nZWRfZmxhZ3MsCgkJCQkgdW5z aWduZWQgaW50ICp0b3RhbF9mbGFncywKCQkJCSB1NjQgbXVsdGljYXN0KTsKCXZvaWQgKCpjb25m aWdfaWZhY2VfZmlsdGVyKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJCSAgICBzdHJ1Y3Qg aWVlZTgwMjExX3ZpZiAqdmlmLAoJCQkJICAgIHVuc2lnbmVkIGludCBmaWx0ZXJfZmxhZ3MsCgkJ CQkgICAgdW5zaWduZWQgaW50IGNoYW5nZWRfZmxhZ3MpOwoJaW50ICgqc2V0X3RpbSkoc3RydWN0 IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCgkJICAgICAgIGJv b2wgc2V0KTsKCWludCAoKnNldF9rZXkpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBlbnVtIHNl dF9rZXlfY21kIGNtZCwKCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgc3RydWN0 IGllZWU4MDIxMV9zdGEgKnN0YSwKCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAq a2V5KTsKCXZvaWQgKCp1cGRhdGVfdGtpcF9rZXkpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJ CQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKCQkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2Nv bmYgKmNvbmYsCgkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAoJCQkJdTMyIGl2MzIsIHUx NiAqcGhhc2Uxa2V5KTsKCXZvaWQgKCpzZXRfcmVrZXlfZGF0YSkoc3RydWN0IGllZWU4MDIxMV9o dyAqaHcsCgkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAoJCQkgICAgICAgc3Ry dWN0IGNmZzgwMjExX2d0a19yZWtleV9kYXRhICpkYXRhKTsKCXZvaWQgKCpzZXRfZGVmYXVsdF91 bmljYXN0X2tleSkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCgkJCQkJc3RydWN0IGllZWU4MDIx MV92aWYgKnZpZiwgaW50IGlkeCk7CglpbnQgKCpod19zY2FuKShzdHJ1Y3QgaWVlZTgwMjExX2h3 ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKCQkgICAgICAgc3RydWN0IGllZWU4MDIx MV9zY2FuX3JlcXVlc3QgKnJlcSk7Cgl2b2lkICgqY2FuY2VsX2h3X3NjYW4pKHN0cnVjdCBpZWVl ODAyMTFfaHcgKmh3LAoJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CglpbnQg KCpzY2hlZF9zY2FuX3N0YXJ0KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJCXN0cnVjdCBp ZWVlODAyMTFfdmlmICp2aWYsCgkJCQlzdHJ1Y3QgY2ZnODAyMTFfc2NoZWRfc2Nhbl9yZXF1ZXN0 ICpyZXEsCgkJCQlzdHJ1Y3QgaWVlZTgwMjExX3NjYW5faWVzICppZXMpOwoJaW50ICgqc2NoZWRf c2Nhbl9zdG9wKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJICAgICAgIHN0cnVjdCBpZWVl ODAyMTFfdmlmICp2aWYpOwoJdm9pZCAoKnN3X3NjYW5fc3RhcnQpKHN0cnVjdCBpZWVlODAyMTFf aHcgKmh3LAoJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAoJCQkgICAgICBjb25z dCB1OCAqbWFjX2FkZHIpOwoJdm9pZCAoKnN3X3NjYW5fY29tcGxldGUpKHN0cnVjdCBpZWVlODAy MTFfaHcgKmh3LAoJCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwoJaW50ICgqZ2V0X3N0 YXRzKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJIHN0cnVjdCBpZWVlODAyMTFfbG93X2xl dmVsX3N0YXRzICpzdGF0cyk7Cgl2b2lkICgqZ2V0X2tleV9zZXEpKHN0cnVjdCBpZWVlODAyMTFf aHcgKmh3LAoJCQkgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5LAoJCQkgICAgc3Ry dWN0IGllZWU4MDIxMV9rZXlfc2VxICpzZXEpOwoJaW50ICgqc2V0X2ZyYWdfdGhyZXNob2xkKShz dHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIHZhbHVlKTsKCWludCAoKnNldF9ydHNfdGhyZXNo b2xkKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIHZhbHVlKTsKCWludCAoKnN0YV9hZGQp KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAoJCSAg ICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKCWludCAoKnN0YV9yZW1vdmUpKHN0cnVj dCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAoJCQkgIHN0cnVj dCBpZWVlODAyMTFfc3RhICpzdGEpOwojaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKCXZv aWQgKCpzdGFfYWRkX2RlYnVnZnMpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkJc3RydWN0 IGllZWU4MDIxMV92aWYgKnZpZiwKCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCgkJCQlz dHJ1Y3QgZGVudHJ5ICpkaXIpOwojZW5kaWYKCXZvaWQgKCpzdGFfbm90aWZ5KShzdHJ1Y3QgaWVl ZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKCQkJZW51bSBzdGFfbm90 aWZ5X2NtZCwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSk7CglpbnQgKCpzdGFfc2V0X3R4cHdy KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAq dmlmLAoJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOwoJaW50ICgqc3RhX3N0YXRl KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKCQkJ IHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCgkJCSBlbnVtIGllZWU4MDIxMV9zdGFfc3RhdGUg b2xkX3N0YXRlLAoJCQkgZW51bSBpZWVlODAyMTFfc3RhX3N0YXRlIG5ld19zdGF0ZSk7Cgl2b2lk ICgqc3RhX3ByZV9yY3VfcmVtb3ZlKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJCSAgIHN0 cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCgkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3Rh KTsKCXZvaWQgKCpzdGFfcmNfdXBkYXRlKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJICAg ICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9z dGEgKnN0YSwKCQkJICAgICAgdTMyIGNoYW5nZWQpOwoJdm9pZCAoKnN0YV9yYXRlX3RibF91cGRh dGUpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlm ICp2aWYsCgkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSk7Cgl2b2lkICgqc3RhX3N0 YXRpc3RpY3MpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkgICAgICAgc3RydWN0IGllZWU4 MDIxMV92aWYgKnZpZiwKCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCgkJCSAg ICAgICBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbyk7CglpbnQgKCpjb25mX3R4KShzdHJ1Y3Qg aWVlZTgwMjExX2h3ICpodywKCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgdTE2 IGFjLAoJCSAgICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyAqcGFy YW1zKTsKCXU2NCAoKmdldF90c2YpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVl ZTgwMjExX3ZpZiAqdmlmKTsKCXZvaWQgKCpzZXRfdHNmKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpo dywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKCQkJdTY0IHRzZik7Cgl2b2lkICgqb2Zmc2V0 X3RzZikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYs CgkJCSAgIHM2NCBvZmZzZXQpOwoJdm9pZCAoKnJlc2V0X3RzZikoc3RydWN0IGllZWU4MDIxMV9o dyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwoJaW50ICgqdHhfbGFzdF9iZWFjb24p KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKCgkvKioKCSAqIEBhbXBkdV9hY3Rpb246CgkgKiBQ ZXJmb3JtIGEgY2VydGFpbiBBLU1QRFUgYWN0aW9uLgoJICogVGhlIFJBL1RJRCBjb21iaW5hdGlv biBkZXRlcm1pbmVzIHRoZSBkZXN0aW5hdGlvbiBhbmQgVElEIHdlIHdhbnQKCSAqIHRoZSBhbXBk dSBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkIGZvci4gVGhlIGFjdGlvbiBpcyBkZWZpbmVkIHRocm91 Z2gKCSAqIGllZWU4MDIxMV9hbXBkdV9tbG1lX2FjdGlvbi4KCSAqIFdoZW4gdGhlIGFjdGlvbiBp cyBzZXQgdG8gJUlFRUU4MDIxMV9BTVBEVV9UWF9PUEVSQVRJT05BTCB0aGUgZHJpdmVyCgkgKiBt YXkgbmVpdGhlciBzZW5kIGFnZ3JlZ2F0ZXMgY29udGFpbmluZyBtb3JlIHN1YmZyYW1lcyB0aGFu IEBidWZfc2l6ZQoJICogbm9yIHNlbmQgYWdncmVnYXRlcyBpbiBhIHdheSB0aGF0IGxvc3QgZnJh bWVzIHdvdWxkIGV4Y2VlZCB0aGUKCSAqIGJ1ZmZlciBzaXplLiBJZiBqdXN0IGxpbWl0aW5nIHRo ZSBhZ2dyZWdhdGUgc2l6ZSwgdGhpcyB3b3VsZCBiZQoJICogcG9zc2libGUgd2l0aCBhIGJ1Zl9z aXplIG9mIDg6CgkgKgoJICogLSBgYFRYOiAxLi4uLi43YGAKCSAqIC0gYGBSWDogIDIuLi4uN2Bg IChsb3N0IGZyYW1lICMxKQoJICogLSBgYFRYOiAgICAgICAgOC4uMS4uLmBgCgkgKgoJICogd2hp Y2ggaXMgaW52YWxpZCBzaW5jZSAjMSB3YXMgbm93IHJlLXRyYW5zbWl0dGVkIHdlbGwgcGFzdCB0 aGUKCSAqIGJ1ZmZlciBzaXplIG9mIDguIENvcnJlY3Qgd2F5cyB0byByZXRyYW5zbWl0ICMxIHdv dWxkIGJlOgoJICoKCSAqIC0gYGBUWDogICAgICAgIDEgICBvcmBgCgkgKiAtIGBgVFg6ICAgICAg ICAxOCAgb3JgYAoJICogLSBgYFRYOiAgICAgICAgODFgYAoJICoKCSAqIEV2ZW4gYGAxODlgYCB3 b3VsZCBiZSB3cm9uZyBzaW5jZSAxIGNvdWxkIGJlIGxvc3QgYWdhaW4uCgkgKgoJICogUmV0dXJu cyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4gVGhlIGRyaXZlciBtYXkgcmV0dXJu CgkgKiAlSUVFRTgwMjExX0FNUERVX1RYX1NUQVJUX0lNTUVESUFURSBmb3IgJUlFRUU4MDIxMV9B TVBEVV9UWF9TVEFSVAoJICogaWYgdGhlIHNlc3Npb24gY2FuIHN0YXJ0IGltbWVkaWF0ZWx5LgoJ ICoKCSAqIFRoZSBjYWxsYmFjayBjYW4gc2xlZXAuCgkgKi8KCWludCAoKmFtcGR1X2FjdGlvbiko c3RydWN0IGllZWU4MDIxMV9odyAqaHcsCgkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlm LAoJCQkgICAgc3RydWN0IGllZWU4MDIxMV9hbXBkdV9wYXJhbXMgKnBhcmFtcyk7CglpbnQgKCpn ZXRfc3VydmV5KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgaW50IGlkeCwKCQlzdHJ1Y3Qgc3Vy dmV5X2luZm8gKnN1cnZleSk7Cgl2b2lkICgqcmZraWxsX3BvbGwpKHN0cnVjdCBpZWVlODAyMTFf aHcgKmh3KTsKCXZvaWQgKCpzZXRfY292ZXJhZ2VfY2xhc3MpKHN0cnVjdCBpZWVlODAyMTFfaHcg Kmh3LCBzMTYgY292ZXJhZ2VfY2xhc3MpOwojaWZkZWYgQ09ORklHX05MODAyMTFfVEVTVE1PREUK CWludCAoKnRlc3Rtb2RlX2NtZCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVl ODAyMTFfdmlmICp2aWYsCgkJCSAgICB2b2lkICpkYXRhLCBpbnQgbGVuKTsKCWludCAoKnRlc3Rt b2RlX2R1bXApKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAoJ CQkgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKCQkJICAgICB2b2lkICpkYXRhLCBp bnQgbGVuKTsKI2VuZGlmCgl2b2lkICgqZmx1c2gpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBz dHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAoJCSAgICAgIHUzMiBxdWV1ZXMsIGJvb2wgZHJvcCk7 Cgl2b2lkICgqY2hhbm5lbF9zd2l0Y2gpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkgICAg ICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFf Y2hhbm5lbF9zd2l0Y2ggKmNoX3N3aXRjaCk7CglpbnQgKCpzZXRfYW50ZW5uYSkoc3RydWN0IGll ZWU4MDIxMV9odyAqaHcsIHUzMiB0eF9hbnQsIHUzMiByeF9hbnQpOwoJaW50ICgqZ2V0X2FudGVu bmEpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgKnR4X2FudCwgdTMyICpyeF9hbnQpOwoK CWludCAoKnJlbWFpbl9vbl9jaGFubmVsKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJCSBz dHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAoJCQkJIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAq Y2hhbiwKCQkJCSBpbnQgZHVyYXRpb24sCgkJCQkgZW51bSBpZWVlODAyMTFfcm9jX3R5cGUgdHlw ZSk7CglpbnQgKCpjYW5jZWxfcmVtYWluX29uX2NoYW5uZWwpKHN0cnVjdCBpZWVlODAyMTFfaHcg Kmh3LAoJCQkJCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwoJaW50ICgqc2V0X3JpbmdwYXJh bSkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiB0eCwgdTMyIHJ4KTsKCXZvaWQgKCpnZXRf cmluZ3BhcmFtKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJICAgICAgdTMyICp0eCwgdTMy ICp0eF9tYXgsIHUzMiAqcngsIHUzMiAqcnhfbWF4KTsKCWJvb2wgKCp0eF9mcmFtZXNfcGVuZGlu Zykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwoJaW50ICgqc2V0X2JpdHJhdGVfbWFzaykoc3Ry dWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCgkJCQljb25z dCBzdHJ1Y3QgY2ZnODAyMTFfYml0cmF0ZV9tYXNrICptYXNrKTsKCXZvaWQgKCpldmVudF9jYWxs YmFjaykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCgkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjEx X3ZpZiAqdmlmLAoJCQkgICAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ldmVudCAqZXZlbnQp OwoKCXZvaWQgKCphbGxvd19idWZmZXJlZF9mcmFtZXMpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3 LAoJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKCQkJCSAgICAgIHUxNiB0aWRz LCBpbnQgbnVtX2ZyYW1lcywKCQkJCSAgICAgIGVudW0gaWVlZTgwMjExX2ZyYW1lX3JlbGVhc2Vf dHlwZSByZWFzb24sCgkJCQkgICAgICBib29sIG1vcmVfZGF0YSk7Cgl2b2lkICgqcmVsZWFzZV9i dWZmZXJlZF9mcmFtZXMpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkJCXN0cnVjdCBpZWVl ODAyMTFfc3RhICpzdGEsCgkJCQkJdTE2IHRpZHMsIGludCBudW1fZnJhbWVzLAoJCQkJCWVudW0g aWVlZTgwMjExX2ZyYW1lX3JlbGVhc2VfdHlwZSByZWFzb24sCgkJCQkJYm9vbCBtb3JlX2RhdGEp OwoKCWludAkoKmdldF9ldF9zc2V0X2NvdW50KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJ CSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgaW50IHNzZXQpOwoJdm9pZAkoKmdldF9l dF9zdGF0cykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCgkJCQlzdHJ1Y3QgaWVlZTgwMjExX3Zp ZiAqdmlmLAoJCQkJc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1NjQgKmRhdGEpOwoJdm9p ZAkoKmdldF9ldF9zdHJpbmdzKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJCSAgc3RydWN0 IGllZWU4MDIxMV92aWYgKnZpZiwKCQkJCSAgdTMyIHNzZXQsIHU4ICpkYXRhKTsKCgl2b2lkCSgq bWdkX3ByZXBhcmVfdHgpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkJICBzdHJ1Y3QgaWVl ZTgwMjExX3ZpZiAqdmlmLAoJCQkJICB1MTYgZHVyYXRpb24pOwoKCXZvaWQJKCptZ2RfcHJvdGVj dF90ZGxzX2Rpc2NvdmVyKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJCQkgICAgIHN0cnVj dCBpZWVlODAyMTFfdmlmICp2aWYpOwoKCWludCAoKmFkZF9jaGFuY3R4KShzdHJ1Y3QgaWVlZTgw MjExX2h3ICpodywKCQkJICAgc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4X2NvbmYgKmN0eCk7Cgl2 b2lkICgqcmVtb3ZlX2NoYW5jdHgpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkgICAgICAg c3RydWN0IGllZWU4MDIxMV9jaGFuY3R4X2NvbmYgKmN0eCk7Cgl2b2lkICgqY2hhbmdlX2NoYW5j dHgpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9j aGFuY3R4X2NvbmYgKmN0eCwKCQkJICAgICAgIHUzMiBjaGFuZ2VkKTsKCWludCAoKmFzc2lnbl92 aWZfY2hhbmN0eCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCgkJCQkgIHN0cnVjdCBpZWVlODAy MTFfdmlmICp2aWYsCgkJCQkgIHN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eF9jb25mICpjdHgpOwoJ dm9pZCAoKnVuYXNzaWduX3ZpZl9jaGFuY3R4KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJ CSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKCQkJCSAgICAgc3RydWN0IGllZWU4MDIx MV9jaGFuY3R4X2NvbmYgKmN0eCk7CglpbnQgKCpzd2l0Y2hfdmlmX2NoYW5jdHgpKHN0cnVjdCBp ZWVlODAyMTFfaHcgKmh3LAoJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZl9jaGFuY3R4X3N3aXRj aCAqdmlmcywKCQkJCSAgaW50IG5fdmlmcywKCQkJCSAgZW51bSBpZWVlODAyMTFfY2hhbmN0eF9z d2l0Y2hfbW9kZSBtb2RlKTsKCgl2b2lkICgqcmVjb25maWdfY29tcGxldGUpKHN0cnVjdCBpZWVl ODAyMTFfaHcgKmh3LAoJCQkJICBlbnVtIGllZWU4MDIxMV9yZWNvbmZpZ190eXBlIHJlY29uZmln X3R5cGUpOwoKI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCgl2b2lkICgqaXB2Nl9hZGRyX2No YW5nZSkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCgkJCQkgc3RydWN0IGllZWU4MDIxMV92aWYg KnZpZiwKCQkJCSBzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KTsKI2VuZGlmCgl2b2lkICgqY2hhbm5l bF9zd2l0Y2hfYmVhY29uKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJCSAgICAgIHN0cnVj dCBpZWVlODAyMTFfdmlmICp2aWYsCgkJCQkgICAgICBzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYg KmNoYW5kZWYpOwoJaW50ICgqcHJlX2NoYW5uZWxfc3dpdGNoKShzdHJ1Y3QgaWVlZTgwMjExX2h3 ICpodywKCQkJCSAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKCQkJCSAgc3RydWN0IGllZWU4 MDIxMV9jaGFubmVsX3N3aXRjaCAqY2hfc3dpdGNoKTsKCglpbnQgKCpwb3N0X2NoYW5uZWxfc3dp dGNoKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlm ICp2aWYpOwoJdm9pZCAoKmFib3J0X2NoYW5uZWxfc3dpdGNoKShzdHJ1Y3QgaWVlZTgwMjExX2h3 ICpodywKCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Cgl2b2lkICgqY2hhbm5l bF9zd2l0Y2hfcnhfYmVhY29uKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJCQkgc3RydWN0 IGllZWU4MDIxMV92aWYgKnZpZiwKCQkJCQkgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3N3aXRj aCAqY2hfc3dpdGNoKTsKCglpbnQgKCpqb2luX2lic3MpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3 LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKCXZvaWQgKCpsZWF2ZV9pYnNzKShzdHJ1Y3Qg aWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Cgl1MzIgKCpnZXRf ZXhwZWN0ZWRfdGhyb3VnaHB1dCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCgkJCQkgICAgICAg c3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSk7CglpbnQgKCpnZXRfdHhwb3dlcikoc3RydWN0IGll ZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCgkJCSAgIGludCAqZGJt KTsKCglpbnQgKCp0ZGxzX2NoYW5uZWxfc3dpdGNoKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywK CQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCgkJCQkgICBzdHJ1Y3QgaWVlZTgwMjEx X3N0YSAqc3RhLCB1OCBvcGVyX2NsYXNzLAoJCQkJICAgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVm ICpjaGFuZGVmLAoJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnRtcGxfc2tiLCB1MzIgY2hfc3dfdG1f aWUpOwoJdm9pZCAoKnRkbHNfY2FuY2VsX2NoYW5uZWxfc3dpdGNoKShzdHJ1Y3QgaWVlZTgwMjEx X2h3ICpodywKCQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAoJCQkJCSAgIHN0cnVj dCBpZWVlODAyMTFfc3RhICpzdGEpOwoJdm9pZCAoKnRkbHNfcmVjdl9jaGFubmVsX3N3aXRjaCko c3RydWN0IGllZWU4MDIxMV9odyAqaHcsCgkJCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYs CgkJCQkJIHN0cnVjdCBpZWVlODAyMTFfdGRsc19jaF9zd19wYXJhbXMgKnBhcmFtcyk7CgoJdm9p ZCAoKndha2VfdHhfcXVldWUpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkgICAgICBzdHJ1 Y3QgaWVlZTgwMjExX3R4cSAqdHhxKTsKCXZvaWQgKCpzeW5jX3J4X3F1ZXVlcykoc3RydWN0IGll ZWU4MDIxMV9odyAqaHcpOwoKCWludCAoKnN0YXJ0X25hbikoc3RydWN0IGllZWU4MDIxMV9odyAq aHcsCgkJCSBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAoJCQkgc3RydWN0IGNmZzgwMjExX25h bl9jb25mICpjb25mKTsKCWludCAoKnN0b3BfbmFuKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywK CQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CglpbnQgKCpuYW5fY2hhbmdlX2NvbmYpKHN0 cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZp ZiwKCQkJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9uYW5fY29uZiAqY29uZiwgdTMyIGNoYW5nZXMp OwoJaW50ICgqYWRkX25hbl9mdW5jKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJICAgIHN0 cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCgkJCSAgICBjb25zdCBzdHJ1Y3QgY2ZnODAyMTFfbmFu X2Z1bmMgKm5hbl9mdW5jKTsKCXZvaWQgKCpkZWxfbmFuX2Z1bmMpKHN0cnVjdCBpZWVlODAyMTFf aHcgKmh3LAoJCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKCQkJICAgIHU4IGluc3Rh bmNlX2lkKTsKCWJvb2wgKCpjYW5fYWdncmVnYXRlX2luX2Ftc2R1KShzdHJ1Y3QgaWVlZTgwMjEx X2h3ICpodywKCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqaGVhZCwKCQkJCSAgICAgICBzdHJ1 Y3Qgc2tfYnVmZiAqc2tiKTsKCWludCAoKmdldF9mdG1fcmVzcG9uZGVyX3N0YXRzKShzdHJ1Y3Qg aWVlZTgwMjExX2h3ICpodywKCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAoJ CQkJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9mdG1fcmVzcG9uZGVyX3N0YXRzICpmdG1fc3RhdHMp OwoJaW50ICgqc3RhcnRfcG1zcikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVl ODAyMTFfdmlmICp2aWYsCgkJCSAgc3RydWN0IGNmZzgwMjExX3Btc3JfcmVxdWVzdCAqcmVxdWVz dCk7Cgl2b2lkICgqYWJvcnRfcG1zcikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBp ZWVlODAyMTFfdmlmICp2aWYsCgkJCSAgIHN0cnVjdCBjZmc4MDIxMV9wbXNyX3JlcXVlc3QgKnJl cXVlc3QpOwoJaW50ICgqc2V0X3RpZF9jb25maWcpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJ CQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAoJCQkgICAgICBzdHJ1Y3QgaWVlZTgw MjExX3N0YSAqc3RhLAoJCQkgICAgICBzdHJ1Y3QgY2ZnODAyMTFfdGlkX2NvbmZpZyAqdGlkX2Nv bmYpOwoJaW50ICgqcmVzZXRfdGlkX2NvbmZpZykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCgkJ CQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAoJCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0 YSwgdTggdGlkcyk7Cn07CgovKioKICogaWVlZTgwMjExX2FsbG9jX2h3X25tIC0gQWxsb2NhdGUg YSBuZXcgaGFyZHdhcmUgZGV2aWNlCiAqCiAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgb25jZSBmb3Ig ZWFjaCBoYXJkd2FyZSBkZXZpY2UuIFRoZSByZXR1cm5lZCBwb2ludGVyCiAqIG11c3QgYmUgdXNl ZCB0byByZWZlciB0byB0aGlzIGRldmljZSB3aGVuIGNhbGxpbmcgb3RoZXIgZnVuY3Rpb25zLgog KiBtYWM4MDIxMSBhbGxvY2F0ZXMgYSBwcml2YXRlIGRhdGEgYXJlYSBmb3IgdGhlIGRyaXZlciBw b2ludGVkIHRvIGJ5CiAqIEBwcml2IGluICZzdHJ1Y3QgaWVlZTgwMjExX2h3LCB0aGUgc2l6ZSBv ZiB0aGlzIGFyZWEgaXMgZ2l2ZW4gYXMKICogQHByaXZfZGF0YV9sZW4uCiAqCiAqIEBwcml2X2Rh dGFfbGVuOiBsZW5ndGggb2YgcHJpdmF0ZSBkYXRhCiAqIEBvcHM6IGNhbGxiYWNrcyBmb3IgdGhp cyBkZXZpY2UKICogQHJlcXVlc3RlZF9uYW1lOiBSZXF1ZXN0ZWQgbmFtZSBmb3IgdGhpcyBkZXZp Y2UuCiAqCU5VTEwgaXMgdmFsaWQgdmFsdWUsIGFuZCBtZWFucyB1c2UgdGhlIGRlZmF1bHQgbmFt aW5nIChwaHklZCkKICoKICogUmV0dXJuOiBBIHBvaW50ZXIgdG8gdGhlIG5ldyBoYXJkd2FyZSBk ZXZpY2UsIG9yICVOVUxMIG9uIGVycm9yLgogKi8Kc3RydWN0IGllZWU4MDIxMV9odyAqaWVlZTgw MjExX2FsbG9jX2h3X25tKHNpemVfdCBwcml2X2RhdGFfbGVuLAoJCQkJCSAgIGNvbnN0IHN0cnVj dCBpZWVlODAyMTFfb3BzICpvcHMsCgkJCQkJICAgY29uc3QgY2hhciAqcmVxdWVzdGVkX25hbWUp OwoKLyoqCiAqIGllZWU4MDIxMV9hbGxvY19odyAtIEFsbG9jYXRlIGEgbmV3IGhhcmR3YXJlIGRl dmljZQogKgogKiBUaGlzIG11c3QgYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2ggaGFyZHdhcmUgZGV2 aWNlLiBUaGUgcmV0dXJuZWQgcG9pbnRlcgogKiBtdXN0IGJlIHVzZWQgdG8gcmVmZXIgdG8gdGhp cyBkZXZpY2Ugd2hlbiBjYWxsaW5nIG90aGVyIGZ1bmN0aW9ucy4KICogbWFjODAyMTEgYWxsb2Nh dGVzIGEgcHJpdmF0ZSBkYXRhIGFyZWEgZm9yIHRoZSBkcml2ZXIgcG9pbnRlZCB0byBieQogKiBA cHJpdiBpbiAmc3RydWN0IGllZWU4MDIxMV9odywgdGhlIHNpemUgb2YgdGhpcyBhcmVhIGlzIGdp dmVuIGFzCiAqIEBwcml2X2RhdGFfbGVuLgogKgogKiBAcHJpdl9kYXRhX2xlbjogbGVuZ3RoIG9m IHByaXZhdGUgZGF0YQogKiBAb3BzOiBjYWxsYmFja3MgZm9yIHRoaXMgZGV2aWNlCiAqCiAqIFJl dHVybjogQSBwb2ludGVyIHRvIHRoZSBuZXcgaGFyZHdhcmUgZGV2aWNlLCBvciAlTlVMTCBvbiBl cnJvci4KICovCnN0YXRpYyBpbmxpbmUKc3RydWN0IGllZWU4MDIxMV9odyAqaWVlZTgwMjExX2Fs bG9jX2h3KHNpemVfdCBwcml2X2RhdGFfbGVuLAoJCQkJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFf b3BzICpvcHMpCnsKCXJldHVybiBpZWVlODAyMTFfYWxsb2NfaHdfbm0ocHJpdl9kYXRhX2xlbiwg b3BzLCBOVUxMKTsKfQoKLyoqCiAqIGllZWU4MDIxMV9yZWdpc3Rlcl9odyAtIFJlZ2lzdGVyIGhh cmR3YXJlIGRldmljZQogKgogKiBZb3UgbXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGFu eSBvdGhlciBmdW5jdGlvbnMgaW4KICogbWFjODAyMTEuIE5vdGUgdGhhdCBiZWZvcmUgYSBoYXJk d2FyZSBjYW4gYmUgcmVnaXN0ZXJlZCwgeW91CiAqIG5lZWQgdG8gZmlsbCB0aGUgY29udGFpbmVk IHdpcGh5J3MgaW5mb3JtYXRpb24uCiAqCiAqIEBodzogdGhlIGRldmljZSB0byByZWdpc3RlciBh cyByZXR1cm5lZCBieSBpZWVlODAyMTFfYWxsb2NfaHcoKQogKgogKiBSZXR1cm46IDAgb24gc3Vj Y2Vzcy4gQW4gZXJyb3IgY29kZSBvdGhlcndpc2UuCiAqLwppbnQgaWVlZTgwMjExX3JlZ2lzdGVy X2h3KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKCi8qKgogKiBzdHJ1Y3QgaWVlZTgwMjExX3Rw dF9ibGluayAtIHRocm91Z2hwdXQgYmxpbmsgZGVzY3JpcHRpb24KICogQHRocm91Z2hwdXQ6IHRo cm91Z2hwdXQgaW4gS2JpdC9zZWMKICogQGJsaW5rX3RpbWU6IGJsaW5rIHRpbWUgaW4gbWlsbGlz ZWNvbmRzCiAqCShmdWxsIGN5Y2xlLCBpZS4gb25lIG9mZiArIG9uZSBvbiBwZXJpb2QpCiAqLwpz dHJ1Y3QgaWVlZTgwMjExX3RwdF9ibGluayB7CglpbnQgdGhyb3VnaHB1dDsKCWludCBibGlua190 aW1lOwp9OwoKLyoqCiAqIGVudW0gaWVlZTgwMjExX3RwdF9sZWRfdHJpZ2dlcl9mbGFncyAtIHRo cm91Z2hwdXQgdHJpZ2dlciBmbGFncwogKiBASUVFRTgwMjExX1RQVF9MRURUUklHX0ZMX1JBRElP OiBlbmFibGUgYmxpbmtpbmcgd2l0aCByYWRpbwogKiBASUVFRTgwMjExX1RQVF9MRURUUklHX0ZM X1dPUks6IGVuYWJsZSBibGlua2luZyB3aGVuIHdvcmtpbmcKICogQElFRUU4MDIxMV9UUFRfTEVE VFJJR19GTF9DT05ORUNURUQ6IGVuYWJsZSBibGlua2luZyB3aGVuIGF0IGxlYXN0IG9uZQogKglp bnRlcmZhY2UgaXMgY29ubmVjdGVkIGluIHNvbWUgd2F5LCBpbmNsdWRpbmcgYmVpbmcgYW4gQVAK ICovCmVudW0gaWVlZTgwMjExX3RwdF9sZWRfdHJpZ2dlcl9mbGFncyB7CglJRUVFODAyMTFfVFBU X0xFRFRSSUdfRkxfUkFESU8JCT0gQklUKDApLAoJSUVFRTgwMjExX1RQVF9MRURUUklHX0ZMX1dP UksJCT0gQklUKDEpLAoJSUVFRTgwMjExX1RQVF9MRURUUklHX0ZMX0NPTk5FQ1RFRAk9IEJJVCgy KSwKfTsKCiNpZmRlZiBDT05GSUdfTUFDODAyMTFfTEVEUwpjb25zdCBjaGFyICpfX2llZWU4MDIx MV9nZXRfdHhfbGVkX25hbWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwpjb25zdCBjaGFyICpf X2llZWU4MDIxMV9nZXRfcnhfbGVkX25hbWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwpjb25z dCBjaGFyICpfX2llZWU4MDIxMV9nZXRfYXNzb2NfbGVkX25hbWUoc3RydWN0IGllZWU4MDIxMV9o dyAqaHcpOwpjb25zdCBjaGFyICpfX2llZWU4MDIxMV9nZXRfcmFkaW9fbGVkX25hbWUoc3RydWN0 IGllZWU4MDIxMV9odyAqaHcpOwpjb25zdCBjaGFyICoKX19pZWVlODAyMTFfY3JlYXRlX3RwdF9s ZWRfdHJpZ2dlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJCSAgIHVuc2lnbmVkIGludCBm bGFncywKCQkJCSAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHB0X2JsaW5rICpibGlua190YWJs ZSwKCQkJCSAgIHVuc2lnbmVkIGludCBibGlua190YWJsZV9sZW4pOwojZW5kaWYKLyoqCiAqIGll ZWU4MDIxMV9nZXRfdHhfbGVkX25hbWUgLSBnZXQgbmFtZSBvZiBUWCBMRUQKICoKICogbWFjODAy MTEgY3JlYXRlcyBhIHRyYW5zbWl0IExFRCB0cmlnZ2VyIGZvciBlYWNoIHdpcmVsZXNzIGhhcmR3 YXJlCiAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gZHJpdmUgTEVEcyBpZiB5b3VyIGRyaXZlciByZWdp c3RlcnMgYSBMRUQgZGV2aWNlLgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG5hbWUgKG9y ICVOVUxMIGlmIG5vdCBjb25maWd1cmVkIGZvciBMRURzKQogKiBvZiB0aGUgdHJpZ2dlciBzbyB5 b3UgY2FuIGF1dG9tYXRpY2FsbHkgbGluayB0aGUgTEVEIGRldmljZS4KICoKICogQGh3OiB0aGUg aGFyZHdhcmUgdG8gZ2V0IHRoZSBMRUQgdHJpZ2dlciBuYW1lIGZvcgogKgogKiBSZXR1cm46IFRo ZSBuYW1lIG9mIHRoZSBMRUQgdHJpZ2dlci4gJU5VTEwgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIExF RHMuCiAqLwpzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmllZWU4MDIxMV9nZXRfdHhfbGVkX25h bWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCnsKI2lmZGVmIENPTkZJR19NQUM4MDIxMV9MRURT CglyZXR1cm4gX19pZWVlODAyMTFfZ2V0X3R4X2xlZF9uYW1lKGh3KTsKI2Vsc2UKCXJldHVybiBO VUxMOwojZW5kaWYKfQoKLyoqCiAqIGllZWU4MDIxMV9nZXRfcnhfbGVkX25hbWUgLSBnZXQgbmFt ZSBvZiBSWCBMRUQKICoKICogbWFjODAyMTEgY3JlYXRlcyBhIHJlY2VpdmUgTEVEIHRyaWdnZXIg Zm9yIGVhY2ggd2lyZWxlc3MgaGFyZHdhcmUKICogdGhhdCBjYW4gYmUgdXNlZCB0byBkcml2ZSBM RURzIGlmIHlvdXIgZHJpdmVyIHJlZ2lzdGVycyBhIExFRCBkZXZpY2UuCiAqIFRoaXMgZnVuY3Rp b24gcmV0dXJucyB0aGUgbmFtZSAob3IgJU5VTEwgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIExFRHMp CiAqIG9mIHRoZSB0cmlnZ2VyIHNvIHlvdSBjYW4gYXV0b21hdGljYWxseSBsaW5rIHRoZSBMRUQg ZGV2aWNlLgogKgogKiBAaHc6IHRoZSBoYXJkd2FyZSB0byBnZXQgdGhlIExFRCB0cmlnZ2VyIG5h bWUgZm9yCiAqCiAqIFJldHVybjogVGhlIG5hbWUgb2YgdGhlIExFRCB0cmlnZ2VyLiAlTlVMTCBp ZiBub3QgY29uZmlndXJlZCBmb3IgTEVEcy4KICovCnN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAq aWVlZTgwMjExX2dldF9yeF9sZWRfbmFtZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKewojaWZk ZWYgQ09ORklHX01BQzgwMjExX0xFRFMKCXJldHVybiBfX2llZWU4MDIxMV9nZXRfcnhfbGVkX25h bWUoaHcpOwojZWxzZQoJcmV0dXJuIE5VTEw7CiNlbmRpZgp9CgovKioKICogaWVlZTgwMjExX2dl dF9hc3NvY19sZWRfbmFtZSAtIGdldCBuYW1lIG9mIGFzc29jaWF0aW9uIExFRAogKgogKiBtYWM4 MDIxMSBjcmVhdGVzIGEgYXNzb2NpYXRpb24gTEVEIHRyaWdnZXIgZm9yIGVhY2ggd2lyZWxlc3Mg aGFyZHdhcmUKICogdGhhdCBjYW4gYmUgdXNlZCB0byBkcml2ZSBMRURzIGlmIHlvdXIgZHJpdmVy IHJlZ2lzdGVycyBhIExFRCBkZXZpY2UuCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbmFt ZSAob3IgJU5VTEwgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIExFRHMpCiAqIG9mIHRoZSB0cmlnZ2Vy IHNvIHlvdSBjYW4gYXV0b21hdGljYWxseSBsaW5rIHRoZSBMRUQgZGV2aWNlLgogKgogKiBAaHc6 IHRoZSBoYXJkd2FyZSB0byBnZXQgdGhlIExFRCB0cmlnZ2VyIG5hbWUgZm9yCiAqCiAqIFJldHVy bjogVGhlIG5hbWUgb2YgdGhlIExFRCB0cmlnZ2VyLiAlTlVMTCBpZiBub3QgY29uZmlndXJlZCBm b3IgTEVEcy4KICovCnN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqaWVlZTgwMjExX2dldF9hc3Nv Y19sZWRfbmFtZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKewojaWZkZWYgQ09ORklHX01BQzgw MjExX0xFRFMKCXJldHVybiBfX2llZWU4MDIxMV9nZXRfYXNzb2NfbGVkX25hbWUoaHcpOwojZWxz ZQoJcmV0dXJuIE5VTEw7CiNlbmRpZgp9CgovKioKICogaWVlZTgwMjExX2dldF9yYWRpb19sZWRf bmFtZSAtIGdldCBuYW1lIG9mIHJhZGlvIExFRAogKgogKiBtYWM4MDIxMSBjcmVhdGVzIGEgcmFk aW8gY2hhbmdlIExFRCB0cmlnZ2VyIGZvciBlYWNoIHdpcmVsZXNzIGhhcmR3YXJlCiAqIHRoYXQg Y2FuIGJlIHVzZWQgdG8gZHJpdmUgTEVEcyBpZiB5b3VyIGRyaXZlciByZWdpc3RlcnMgYSBMRUQg ZGV2aWNlLgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG5hbWUgKG9yICVOVUxMIGlmIG5v dCBjb25maWd1cmVkIGZvciBMRURzKQogKiBvZiB0aGUgdHJpZ2dlciBzbyB5b3UgY2FuIGF1dG9t YXRpY2FsbHkgbGluayB0aGUgTEVEIGRldmljZS4KICoKICogQGh3OiB0aGUgaGFyZHdhcmUgdG8g Z2V0IHRoZSBMRUQgdHJpZ2dlciBuYW1lIGZvcgogKgogKiBSZXR1cm46IFRoZSBuYW1lIG9mIHRo ZSBMRUQgdHJpZ2dlci4gJU5VTEwgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIExFRHMuCiAqLwpzdGF0 aWMgaW5saW5lIGNvbnN0IGNoYXIgKmllZWU4MDIxMV9nZXRfcmFkaW9fbGVkX25hbWUoc3RydWN0 IGllZWU4MDIxMV9odyAqaHcpCnsKI2lmZGVmIENPTkZJR19NQUM4MDIxMV9MRURTCglyZXR1cm4g X19pZWVlODAyMTFfZ2V0X3JhZGlvX2xlZF9uYW1lKGh3KTsKI2Vsc2UKCXJldHVybiBOVUxMOwoj ZW5kaWYKfQoKLyoqCiAqIGllZWU4MDIxMV9jcmVhdGVfdHB0X2xlZF90cmlnZ2VyIC0gY3JlYXRl IHRocm91Z2hwdXQgTEVEIHRyaWdnZXIKICogQGh3OiB0aGUgaGFyZHdhcmUgdG8gY3JlYXRlIHRo ZSB0cmlnZ2VyIGZvcgogKiBAZmxhZ3M6IHRyaWdnZXIgZmxhZ3MsIHNlZSAmZW51bSBpZWVlODAy MTFfdHB0X2xlZF90cmlnZ2VyX2ZsYWdzCiAqIEBibGlua190YWJsZTogdGhlIGJsaW5rIHRhYmxl IC0tIG5lZWRzIHRvIGJlIG9yZGVyZWQgYnkgdGhyb3VnaHB1dAogKiBAYmxpbmtfdGFibGVfbGVu OiBzaXplIG9mIHRoZSBibGluayB0YWJsZQogKgogKiBSZXR1cm46ICVOVUxMIChpbiBjYXNlIG9m IGVycm9yLCBvciBpZiBubyBMRUQgdHJpZ2dlcnMgYXJlCiAqIGNvbmZpZ3VyZWQpIG9yIHRoZSBu YW1lIG9mIHRoZSBuZXcgdHJpZ2dlci4KICoKICogTm90ZTogVGhpcyBmdW5jdGlvbiBtdXN0IGJl IGNhbGxlZCBiZWZvcmUgaWVlZTgwMjExX3JlZ2lzdGVyX2h3KCkuCiAqLwpzdGF0aWMgaW5saW5l IGNvbnN0IGNoYXIgKgppZWVlODAyMTFfY3JlYXRlX3RwdF9sZWRfdHJpZ2dlcihzdHJ1Y3QgaWVl ZTgwMjExX2h3ICpodywgdW5zaWduZWQgaW50IGZsYWdzLAoJCQkJIGNvbnN0IHN0cnVjdCBpZWVl ODAyMTFfdHB0X2JsaW5rICpibGlua190YWJsZSwKCQkJCSB1bnNpZ25lZCBpbnQgYmxpbmtfdGFi bGVfbGVuKQp7CiNpZmRlZiBDT05GSUdfTUFDODAyMTFfTEVEUwoJcmV0dXJuIF9faWVlZTgwMjEx X2NyZWF0ZV90cHRfbGVkX3RyaWdnZXIoaHcsIGZsYWdzLCBibGlua190YWJsZSwKCQkJCQkJICBi bGlua190YWJsZV9sZW4pOwojZWxzZQoJcmV0dXJuIE5VTEw7CiNlbmRpZgp9CgovKioKICogaWVl ZTgwMjExX3VucmVnaXN0ZXJfaHcgLSBVbnJlZ2lzdGVyIGEgaGFyZHdhcmUgZGV2aWNlCiAqCiAq IFRoaXMgZnVuY3Rpb24gaW5zdHJ1Y3RzIG1hYzgwMjExIHRvIGZyZWUgYWxsb2NhdGVkIHJlc291 cmNlcwogKiBhbmQgdW5yZWdpc3RlciBuZXRkZXZpY2VzIGZyb20gdGhlIG5ldHdvcmtpbmcgc3Vi c3lzdGVtLgogKgogKiBAaHc6IHRoZSBoYXJkd2FyZSB0byB1bnJlZ2lzdGVyCiAqLwp2b2lkIGll ZWU4MDIxMV91bnJlZ2lzdGVyX2h3KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKCi8qKgogKiBp ZWVlODAyMTFfZnJlZV9odyAtIGZyZWUgaGFyZHdhcmUgZGVzY3JpcHRvcgogKgogKiBUaGlzIGZ1 bmN0aW9uIGZyZWVzIGV2ZXJ5dGhpbmcgdGhhdCB3YXMgYWxsb2NhdGVkLCBpbmNsdWRpbmcgdGhl CiAqIHByaXZhdGUgZGF0YSBmb3IgdGhlIGRyaXZlci4gWW91IG11c3QgY2FsbCBpZWVlODAyMTFf dW5yZWdpc3Rlcl9odygpCiAqIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCiAqCiAqIEBo dzogdGhlIGhhcmR3YXJlIHRvIGZyZWUKICovCnZvaWQgaWVlZTgwMjExX2ZyZWVfaHcoc3RydWN0 IGllZWU4MDIxMV9odyAqaHcpOwoKLyoqCiAqIGllZWU4MDIxMV9yZXN0YXJ0X2h3IC0gcmVzdGFy dCBoYXJkd2FyZSBjb21wbGV0ZWx5CiAqCiAqIENhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSBo YXJkd2FyZSB3YXMgcmVzdGFydGVkIGZvciBzb21lIHJlYXNvbgogKiAoaGFyZHdhcmUgZXJyb3Is IC4uLikgYW5kIHRoZSBkcml2ZXIgaXMgdW5hYmxlIHRvIHJlc3RvcmUgaXRzIHN0YXRlCiAqIGJ5 IGl0c2VsZi4gbWFjODAyMTEgYXNzdW1lcyB0aGF0IGF0IHRoaXMgcG9pbnQgdGhlIGRyaXZlci9o YXJkd2FyZQogKiBpcyBjb21wbGV0ZWx5IHVuaW5pdGlhbGlzZWQgYW5kIHN0b3BwZWQsIGl0IHN0 YXJ0cyB0aGUgcHJvY2VzcyBieQogKiBjYWxsaW5nIHRoZSAtPnN0YXJ0KCkgb3BlcmF0aW9uLiBU aGUgZHJpdmVyIHdpbGwgbmVlZCB0byByZXNldCBhbGwKICogaW50ZXJuYWwgc3RhdGUgdGhhdCBp dCBoYXMgcHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgogKgogKiBAaHc6IHRoZSBoYXJk d2FyZSB0byByZXN0YXJ0CiAqLwp2b2lkIGllZWU4MDIxMV9yZXN0YXJ0X2h3KHN0cnVjdCBpZWVl ODAyMTFfaHcgKmh3KTsKCi8qKgogKiBpZWVlODAyMTFfcnhfbmFwaSAtIHJlY2VpdmUgZnJhbWUg ZnJvbSBOQVBJIGNvbnRleHQKICoKICogVXNlIHRoaXMgZnVuY3Rpb24gdG8gaGFuZCByZWNlaXZl ZCBmcmFtZXMgdG8gbWFjODAyMTEuIFRoZSByZWNlaXZlCiAqIGJ1ZmZlciBpbiBAc2tiIG11c3Qg c3RhcnQgd2l0aCBhbiBJRUVFIDgwMi4xMSBoZWFkZXIuIEluIGNhc2Ugb2YgYQogKiBwYWdlZCBA c2tiIGlzIHVzZWQsIHRoZSBkcml2ZXIgaXMgcmVjb21tZW5kZWQgdG8gcHV0IHRoZSBpZWVlODAy MTEKICogaGVhZGVyIG9mIHRoZSBmcmFtZSBvbiB0aGUgbGluZWFyIHBhcnQgb2YgdGhlIEBza2Ig dG8gYXZvaWQgbWVtb3J5CiAqIGFsbG9jYXRpb24gYW5kL29yIG1lbWNweSBieSB0aGUgc3RhY2su CiAqCiAqIFRoaXMgZnVuY3Rpb24gbWF5IG5vdCBiZSBjYWxsZWQgaW4gSVJRIGNvbnRleHQuIENh bGxzIHRvIHRoaXMgZnVuY3Rpb24KICogZm9yIGEgc2luZ2xlIGhhcmR3YXJlIG11c3QgYmUgc3lu Y2hyb25pemVkIGFnYWluc3QgZWFjaCBvdGhlci4gQ2FsbHMgdG8KICogdGhpcyBmdW5jdGlvbiwg aWVlZTgwMjExX3J4X25pKCkgYW5kIGllZWU4MDIxMV9yeF9pcnFzYWZlKCkgbWF5IG5vdCBiZQog KiBtaXhlZCBmb3IgYSBzaW5nbGUgaGFyZHdhcmUuIE11c3Qgbm90IHJ1biBjb25jdXJyZW50bHkg d2l0aAogKiBpZWVlODAyMTFfdHhfc3RhdHVzKCkgb3IgaWVlZTgwMjExX3R4X3N0YXR1c19uaSgp LgogKgogKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggQkhzIGRpc2FibGVkLgog KgogKiBAaHc6IHRoZSBoYXJkd2FyZSB0aGlzIGZyYW1lIGNhbWUgaW4gb24KICogQHN0YTogdGhl IHN0YXRpb24gdGhlIGZyYW1lIHdhcyByZWNlaXZlZCBmcm9tLCBvciAlTlVMTAogKiBAc2tiOiB0 aGUgYnVmZmVyIHRvIHJlY2VpdmUsIG93bmVkIGJ5IG1hYzgwMjExIGFmdGVyIHRoaXMgY2FsbAog KiBAbmFwaTogdGhlIE5BUEkgY29udGV4dAogKi8Kdm9pZCBpZWVlODAyMTFfcnhfbmFwaShzdHJ1 Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKCQkgICAgICAg c3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpKTsKCi8qKgogKiBp ZWVlODAyMTFfcnggLSByZWNlaXZlIGZyYW1lCiAqCiAqIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGhh bmQgcmVjZWl2ZWQgZnJhbWVzIHRvIG1hYzgwMjExLiBUaGUgcmVjZWl2ZQogKiBidWZmZXIgaW4g QHNrYiBtdXN0IHN0YXJ0IHdpdGggYW4gSUVFRSA4MDIuMTEgaGVhZGVyLiBJbiBjYXNlIG9mIGEK ICogcGFnZWQgQHNrYiBpcyB1c2VkLCB0aGUgZHJpdmVyIGlzIHJlY29tbWVuZGVkIHRvIHB1dCB0 aGUgaWVlZTgwMjExCiAqIGhlYWRlciBvZiB0aGUgZnJhbWUgb24gdGhlIGxpbmVhciBwYXJ0IG9m IHRoZSBAc2tiIHRvIGF2b2lkIG1lbW9yeQogKiBhbGxvY2F0aW9uIGFuZC9vciBtZW1jcHkgYnkg dGhlIHN0YWNrLgogKgogKiBUaGlzIGZ1bmN0aW9uIG1heSBub3QgYmUgY2FsbGVkIGluIElSUSBj b250ZXh0LiBDYWxscyB0byB0aGlzIGZ1bmN0aW9uCiAqIGZvciBhIHNpbmdsZSBoYXJkd2FyZSBt dXN0IGJlIHN5bmNocm9uaXplZCBhZ2FpbnN0IGVhY2ggb3RoZXIuIENhbGxzIHRvCiAqIHRoaXMg ZnVuY3Rpb24sIGllZWU4MDIxMV9yeF9uaSgpIGFuZCBpZWVlODAyMTFfcnhfaXJxc2FmZSgpIG1h eSBub3QgYmUKICogbWl4ZWQgZm9yIGEgc2luZ2xlIGhhcmR3YXJlLiBNdXN0IG5vdCBydW4gY29u Y3VycmVudGx5IHdpdGgKICogaWVlZTgwMjExX3R4X3N0YXR1cygpIG9yIGllZWU4MDIxMV90eF9z dGF0dXNfbmkoKS4KICoKICogSW4gcHJvY2VzcyBjb250ZXh0IHVzZSBpbnN0ZWFkIGllZWU4MDIx MV9yeF9uaSgpLgogKgogKiBAaHc6IHRoZSBoYXJkd2FyZSB0aGlzIGZyYW1lIGNhbWUgaW4gb24K ICogQHNrYjogdGhlIGJ1ZmZlciB0byByZWNlaXZlLCBvd25lZCBieSBtYWM4MDIxMSBhZnRlciB0 aGlzIGNhbGwKICovCnN0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfcngoc3RydWN0IGllZWU4 MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCnsKCWllZWU4MDIxMV9yeF9uYXBpKGh3 LCBOVUxMLCBza2IsIE5VTEwpOwp9CgovKioKICogaWVlZTgwMjExX3J4X2lycXNhZmUgLSByZWNl aXZlIGZyYW1lCiAqCiAqIExpa2UgaWVlZTgwMjExX3J4KCkgYnV0IGNhbiBiZSBjYWxsZWQgaW4g SVJRIGNvbnRleHQKICogKGludGVybmFsbHkgZGVmZXJzIHRvIGEgdGFza2xldC4pCiAqCiAqIENh bGxzIHRvIHRoaXMgZnVuY3Rpb24sIGllZWU4MDIxMV9yeCgpIG9yIGllZWU4MDIxMV9yeF9uaSgp IG1heSBub3QKICogYmUgbWl4ZWQgZm9yIGEgc2luZ2xlIGhhcmR3YXJlLk11c3Qgbm90IHJ1biBj b25jdXJyZW50bHkgd2l0aAogKiBpZWVlODAyMTFfdHhfc3RhdHVzKCkgb3IgaWVlZTgwMjExX3R4 X3N0YXR1c19uaSgpLgogKgogKiBAaHc6IHRoZSBoYXJkd2FyZSB0aGlzIGZyYW1lIGNhbWUgaW4g b24KICogQHNrYjogdGhlIGJ1ZmZlciB0byByZWNlaXZlLCBvd25lZCBieSBtYWM4MDIxMSBhZnRl ciB0aGlzIGNhbGwKICovCnZvaWQgaWVlZTgwMjExX3J4X2lycXNhZmUoc3RydWN0IGllZWU4MDIx MV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpOwoKLyoqCiAqIGllZWU4MDIxMV9yeF9uaSAt IHJlY2VpdmUgZnJhbWUgKGluIHByb2Nlc3MgY29udGV4dCkKICoKICogTGlrZSBpZWVlODAyMTFf cngoKSBidXQgY2FuIGJlIGNhbGxlZCBpbiBwcm9jZXNzIGNvbnRleHQKICogKGludGVybmFsbHkg ZGlzYWJsZXMgYm90dG9tIGhhbHZlcykuCiAqCiAqIENhbGxzIHRvIHRoaXMgZnVuY3Rpb24sIGll ZWU4MDIxMV9yeCgpIGFuZCBpZWVlODAyMTFfcnhfaXJxc2FmZSgpIG1heQogKiBub3QgYmUgbWl4 ZWQgZm9yIGEgc2luZ2xlIGhhcmR3YXJlLiBNdXN0IG5vdCBydW4gY29uY3VycmVudGx5IHdpdGgK ICogaWVlZTgwMjExX3R4X3N0YXR1cygpIG9yIGllZWU4MDIxMV90eF9zdGF0dXNfbmkoKS4KICoK ICogQGh3OiB0aGUgaGFyZHdhcmUgdGhpcyBmcmFtZSBjYW1lIGluIG9uCiAqIEBza2I6IHRoZSBi dWZmZXIgdG8gcmVjZWl2ZSwgb3duZWQgYnkgbWFjODAyMTEgYWZ0ZXIgdGhpcyBjYWxsCiAqLwpz dGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX3J4X25pKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3 LAoJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJbG9jYWxfYmhfZGlzYWJsZSgpOwoJaWVl ZTgwMjExX3J4KGh3LCBza2IpOwoJbG9jYWxfYmhfZW5hYmxlKCk7Cn0KCi8qKgogKiBpZWVlODAy MTFfc3RhX3BzX3RyYW5zaXRpb24gLSBQUyB0cmFuc2l0aW9uIGZvciBjb25uZWN0ZWQgc3RhCiAq CiAqIFdoZW4gb3BlcmF0aW5nIGluIEFQIG1vZGUgd2l0aCB0aGUgJUlFRUU4MDIxMV9IV19BUF9M SU5LX1BTCiAqIGZsYWcgc2V0LCB1c2UgdGhpcyBmdW5jdGlvbiB0byBpbmZvcm0gbWFjODAyMTEg YWJvdXQgYSBjb25uZWN0ZWQgc3RhdGlvbgogKiBlbnRlcmluZy9sZWF2aW5nIFBTIG1vZGUuCiAq CiAqIFRoaXMgZnVuY3Rpb24gbWF5IG5vdCBiZSBjYWxsZWQgaW4gSVJRIGNvbnRleHQgb3Igd2l0 aCBzb2Z0aXJxcyBlbmFibGVkLgogKgogKiBDYWxscyB0byB0aGlzIGZ1bmN0aW9uIGZvciBhIHNp bmdsZSBoYXJkd2FyZSBtdXN0IGJlIHN5bmNocm9uaXplZCBhZ2FpbnN0CiAqIGVhY2ggb3RoZXIu CiAqCiAqIEBzdGE6IGN1cnJlbnRseSBjb25uZWN0ZWQgc3RhCiAqIEBzdGFydDogc3RhcnQgb3Ig c3RvcCBQUwogKgogKiBSZXR1cm46IDAgb24gc3VjY2Vzcy4gLUVJTlZBTCB3aGVuIHRoZSByZXF1 ZXN0ZWQgUFMgbW9kZSBpcyBhbHJlYWR5IHNldC4KICovCmludCBpZWVlODAyMTFfc3RhX3BzX3Ry YW5zaXRpb24oc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgYm9vbCBzdGFydCk7CgovKioKICog aWVlZTgwMjExX3N0YV9wc190cmFuc2l0aW9uX25pIC0gUFMgdHJhbnNpdGlvbiBmb3IgY29ubmVj dGVkIHN0YQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW4gcHJvY2VzcyBj b250ZXh0KQogKgogKiBMaWtlIGllZWU4MDIxMV9zdGFfcHNfdHJhbnNpdGlvbigpIGJ1dCBjYW4g YmUgY2FsbGVkIGluIHByb2Nlc3MgY29udGV4dAogKiAoaW50ZXJuYWxseSBkaXNhYmxlcyBib3R0 b20gaGFsdmVzKS4gQ29uY3VycmVudCBjYWxsIHJlc3RyaWN0aW9uIHN0aWxsCiAqIGFwcGxpZXMu CiAqCiAqIEBzdGE6IGN1cnJlbnRseSBjb25uZWN0ZWQgc3RhCiAqIEBzdGFydDogc3RhcnQgb3Ig c3RvcCBQUwogKgogKiBSZXR1cm46IExpa2UgaWVlZTgwMjExX3N0YV9wc190cmFuc2l0aW9uKCku CiAqLwpzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfc3RhX3BzX3RyYW5zaXRpb25fbmkoc3Ry dWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKCQkJCQkJICBib29sIHN0YXJ0KQp7CglpbnQgcmV0OwoK CWxvY2FsX2JoX2Rpc2FibGUoKTsKCXJldCA9IGllZWU4MDIxMV9zdGFfcHNfdHJhbnNpdGlvbihz dGEsIHN0YXJ0KTsKCWxvY2FsX2JoX2VuYWJsZSgpOwoKCXJldHVybiByZXQ7Cn0KCi8qKgogKiBp ZWVlODAyMTFfc3RhX3BzcG9sbCAtIFBTLVBvbGwgZnJhbWUgcmVjZWl2ZWQKICogQHN0YTogY3Vy cmVudGx5IGNvbm5lY3RlZCBzdGF0aW9uCiAqCiAqIFdoZW4gb3BlcmF0aW5nIGluIEFQIG1vZGUg d2l0aCB0aGUgJUlFRUU4MDIxMV9IV19BUF9MSU5LX1BTIGZsYWcgc2V0LAogKiB1c2UgdGhpcyBm dW5jdGlvbiB0byBpbmZvcm0gbWFjODAyMTEgdGhhdCBhIFBTLVBvbGwgZnJhbWUgZnJvbSBhCiAq IGNvbm5lY3RlZCBzdGF0aW9uIHdhcyByZWNlaXZlZC4KICogVGhpcyBtdXN0IGJlIHVzZWQgaW4g Y29uanVuY3Rpb24gd2l0aCBpZWVlODAyMTFfc3RhX3BzX3RyYW5zaXRpb24oKQogKiBhbmQgcG9z c2libHkgaWVlZTgwMjExX3N0YV91YXBzZF90cmlnZ2VyKCk7IGNhbGxzIHRvIGFsbCB0aHJlZSBt dXN0CiAqIGJlIHNlcmlhbGl6ZWQuCiAqLwp2b2lkIGllZWU4MDIxMV9zdGFfcHNwb2xsKHN0cnVj dCBpZWVlODAyMTFfc3RhICpzdGEpOwoKLyoqCiAqIGllZWU4MDIxMV9zdGFfdWFwc2RfdHJpZ2dl ciAtIChwb3RlbnRpYWwpIFUtQVBTRCB0cmlnZ2VyIGZyYW1lIHJlY2VpdmVkCiAqIEBzdGE6IGN1 cnJlbnRseSBjb25uZWN0ZWQgc3RhdGlvbgogKiBAdGlkOiBUSUQgb2YgdGhlIHJlY2VpdmVkIChw b3RlbnRpYWwpIHRyaWdnZXIgZnJhbWUKICoKICogV2hlbiBvcGVyYXRpbmcgaW4gQVAgbW9kZSB3 aXRoIHRoZSAlSUVFRTgwMjExX0hXX0FQX0xJTktfUFMgZmxhZyBzZXQsCiAqIHVzZSB0aGlzIGZ1 bmN0aW9uIHRvIGluZm9ybSBtYWM4MDIxMSB0aGF0IGEgKHBvdGVudGlhbCkgdHJpZ2dlciBmcmFt ZQogKiBmcm9tIGEgY29ubmVjdGVkIHN0YXRpb24gd2FzIHJlY2VpdmVkLgogKiBUaGlzIG11c3Qg YmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGllZWU4MDIxMV9zdGFfcHNfdHJhbnNpdGlvbigp CiAqIGFuZCBwb3NzaWJseSBpZWVlODAyMTFfc3RhX3BzcG9sbCgpOyBjYWxscyB0byBhbGwgdGhy ZWUgbXVzdCBiZQogKiBzZXJpYWxpemVkLgogKiAlSUVFRTgwMjExX05VTV9USURTIGNhbiBiZSBw YXNzZWQgYXMgdGhlIHRpZCBpZiB0aGUgdGlkIGlzIHVua25vd24uCiAqIEluIHRoaXMgY2FzZSwg bWFjODAyMTEgd2lsbCBub3QgY2hlY2sgdGhhdCB0aGlzIHRpZCBtYXBzIHRvIGFuIEFDCiAqIHRo YXQgaXMgdHJpZ2dlciBlbmFibGVkIGFuZCBhc3N1bWUgdGhhdCB0aGUgY2FsbGVyIGRpZCB0aGUg cHJvcGVyCiAqIGNoZWNrcy4KICovCnZvaWQgaWVlZTgwMjExX3N0YV91YXBzZF90cmlnZ2VyKHN0 cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4IHRpZCk7CgovKgogKiBUaGUgVFggaGVhZHJvb20g cmVzZXJ2ZWQgYnkgbWFjODAyMTEgZm9yIGl0cyBvd24gdHhfc3RhdHVzIGZ1bmN0aW9ucy4KICog VGhpcyBpcyBlbm91Z2ggZm9yIHRoZSByYWRpb3RhcCBoZWFkZXIuCiAqLwojZGVmaW5lIElFRUU4 MDIxMV9UWF9TVEFUVVNfSEVBRFJPT00JQUxJR04oMTQsIDQpCgovKioKICogaWVlZTgwMjExX3N0 YV9zZXRfYnVmZmVyZWQgLSBpbmZvcm0gbWFjODAyMTEgYWJvdXQgZHJpdmVyLWJ1ZmZlcmVkIGZy YW1lcwogKiBAc3RhOiAmc3RydWN0IGllZWU4MDIxMV9zdGEgcG9pbnRlciBmb3IgdGhlIHNsZWVw aW5nIHN0YXRpb24KICogQHRpZDogdGhlIFRJRCB0aGF0IGhhcyBidWZmZXJlZCBmcmFtZXMKICog QGJ1ZmZlcmVkOiBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgZnJhbWVzIGFyZSBidWZmZXJlZCBm b3IgdGhpcyBUSUQKICoKICogSWYgYSBkcml2ZXIgYnVmZmVycyBmcmFtZXMgZm9yIGEgcG93ZXJz YXZlIHN0YXRpb24gaW5zdGVhZCBvZiBwYXNzaW5nCiAqIHRoZW0gYmFjayB0byBtYWM4MDIxMSBm b3IgcmV0cmFuc21pc3Npb24sIHRoZSBzdGF0aW9uIG1heSBzdGlsbCBuZWVkCiAqIHRvIGJlIHRv bGQgdGhhdCB0aGVyZSBhcmUgYnVmZmVyZWQgZnJhbWVzIHZpYSB0aGUgVElNIGJpdC4KICoKICog VGhpcyBmdW5jdGlvbiBpbmZvcm1zIG1hYzgwMjExIHdoZXRoZXIgb3Igbm90IHRoZXJlIGFyZSBm cmFtZXMgdGhhdCBhcmUKICogYnVmZmVyZWQgaW4gdGhlIGRyaXZlciBmb3IgYSBnaXZlbiBUSUQ7 IG1hYzgwMjExIGNhbiB0aGVuIHVzZSB0aGlzIGRhdGEKICogdG8gc2V0IHRoZSBUSU0gYml0IChO T1RFOiBUaGlzIG1heSBjYWxsIGJhY2sgaW50byB0aGUgZHJpdmVyJ3Mgc2V0X3RpbQogKiBjYWxs ISBCZXdhcmUgb2YgdGhlIGxvY2tpbmchKQogKgogKiBJZiBhbGwgZnJhbWVzIGFyZSByZWxlYXNl ZCB0byB0aGUgc3RhdGlvbiAoZHVlIHRvIFBTLXBvbGwgb3IgdUFQU0QpCiAqIHRoZW4gdGhlIGRy aXZlciBuZWVkcyB0byBpbmZvcm0gbWFjODAyMTEgdGhhdCB0aGVyZSBubyBsb25nZXIgYXJlCiAq IGZyYW1lcyBidWZmZXJlZC4gSG93ZXZlciwgd2hlbiB0aGUgc3RhdGlvbiB3YWtlcyB1cCBtYWM4 MDIxMSBhc3N1bWVzCiAqIHRoYXQgYWxsIGJ1ZmZlcmVkIGZyYW1lcyB3aWxsIGJlIHRyYW5zbWl0 dGVkIGFuZCBjbGVhcnMgdGhpcyBkYXRhLAogKiBkcml2ZXJzIG5lZWQgdG8gbWFrZSBzdXJlIHRo ZXkgaW5mb3JtIG1hYzgwMjExIGFib3V0IGFsbCBidWZmZXJlZAogKiBmcmFtZXMgb24gdGhlIHNs ZWVwIHRyYW5zaXRpb24gKHN0YV9ub3RpZnkoKSB3aXRoICVTVEFfTk9USUZZX1NMRUVQKS4KICoK ICogTm90ZSB0aGF0IHRlY2huaWNhbGx5IG1hYzgwMjExIG9ubHkgbmVlZHMgdG8ga25vdyB0aGlz IHBlciBBQywgbm90IHBlcgogKiBUSUQsIGJ1dCBzaW5jZSBkcml2ZXIgYnVmZmVyaW5nIHdpbGwg aW5ldml0YWJseSBoYXBwZW4gcGVyIFRJRCAoc2luY2UKICogaXQgaXMgcmVsYXRlZCB0byBhZ2dy ZWdhdGlvbikgaXQgaXMgZWFzaWVyIHRvIG1ha2UgbWFjODAyMTEgbWFwIHRoZQogKiBUSUQgdG8g dGhlIEFDIGFzIHJlcXVpcmVkIGluc3RlYWQgb2Yga2VlcGluZyB0cmFjayBpbiBhbGwgZHJpdmVy cyB0aGF0CiAqIHVzZSB0aGlzIEFQSS4KICovCnZvaWQgaWVlZTgwMjExX3N0YV9zZXRfYnVmZmVy ZWQoc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKCQkJCXU4IHRpZCwgYm9vbCBidWZmZXJlZCk7 CgovKioKICogaWVlZTgwMjExX2dldF90eF9yYXRlcyAtIGdldCB0aGUgc2VsZWN0ZWQgdHJhbnNt aXQgcmF0ZXMgZm9yIGEgcGFja2V0CiAqCiAqIENhbGwgdGhpcyBmdW5jdGlvbiBpbiBhIGRyaXZl ciB3aXRoIHBlci1wYWNrZXQgcmF0ZSBzZWxlY3Rpb24gc3VwcG9ydAogKiB0byBjb21iaW5lIHRo ZSByYXRlIGluZm8gaW4gdGhlIHBhY2tldCB0eCBpbmZvIHdpdGggdGhlIG1vc3QgcmVjZW50CiAq IHJhdGUgc2VsZWN0aW9uIHRhYmxlIGZvciB0aGUgc3RhdGlvbiBlbnRyeS4KICoKICogQHZpZjog JnN0cnVjdCBpZWVlODAyMTFfdmlmIHBvaW50ZXIgZnJvbSB0aGUgYWRkX2ludGVyZmFjZSBjYWxs YmFjay4KICogQHN0YTogdGhlIHJlY2VpdmVyIHN0YXRpb24gdG8gd2hpY2ggdGhpcyBwYWNrZXQg aXMgc2VudC4KICogQHNrYjogdGhlIGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkLgogKiBAZGVzdDog YnVmZmVyIGZvciBleHRyYWN0ZWQgcmF0ZS9yZXRyeSBpbmZvcm1hdGlvbgogKiBAbWF4X3JhdGVz OiBtYXhpbXVtIG51bWJlciBvZiByYXRlcyB0byBmZXRjaAogKi8Kdm9pZCBpZWVlODAyMTFfZ2V0 X3R4X3JhdGVzKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCgkJCSAgICBzdHJ1Y3QgaWVlZTgw MjExX3N0YSAqc3RhLAoJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKCQkJICAgIHN0cnVjdCBp ZWVlODAyMTFfdHhfcmF0ZSAqZGVzdCwKCQkJICAgIGludCBtYXhfcmF0ZXMpOwoKLyoqCiAqIGll ZWU4MDIxMV9zdGFfc2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQgLSBzZXQgdGhlIGV4cGVjdGVkIHRw dCBmb3IgYSBzdGF0aW9uCiAqCiAqIENhbGwgdGhpcyBmdW5jdGlvbiB0byBub3RpZnkgbWFjODAy MTEgYWJvdXQgYSBjaGFuZ2UgaW4gZXhwZWN0ZWQgdGhyb3VnaHB1dAogKiB0byBhIHN0YXRpb24u IEEgZHJpdmVyIGZvciBhIGRldmljZSB0aGF0IGRvZXMgcmF0ZSBjb250cm9sIGluIGZpcm13YXJl IGNhbgogKiBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiB0aGUgZXhwZWN0ZWQgdGhyb3VnaHB1dCBl c3RpbWF0ZSB0b3dhcmRzIGEgc3RhdGlvbgogKiBjaGFuZ2VzLiBUaGUgaW5mb3JtYXRpb24gaXMg dXNlZCB0byB0dW5lIHRoZSBDb0RlbCBBUU0gYXBwbGllZCB0byB0cmFmZmljCiAqIGdvaW5nIHRv d2FyZHMgdGhhdCBzdGF0aW9uICh3aGljaCBjYW4gb3RoZXJ3aXNlIGJlIHRvbyBhZ2dyZXNzaXZl IGFuZCBjYXVzZQogKiBzbG93IHN0YXRpb25zIHRvIHN0YXJ2ZSkuCiAqCiAqIEBwdWJzdGE6IHRo ZSBzdGF0aW9uIHRvIHNldCB0aHJvdWdocHV0IGZvci4KICogQHRocjogdGhlIGN1cnJlbnQgZXhw ZWN0ZWQgdGhyb3VnaHB1dCBpbiBrYnBzLgogKi8Kdm9pZCBpZWVlODAyMTFfc3RhX3NldF9leHBl Y3RlZF90aHJvdWdocHV0KHN0cnVjdCBpZWVlODAyMTFfc3RhICpwdWJzdGEsCgkJCQkJICAgdTMy IHRocik7CgovKioKICogaWVlZTgwMjExX3R4X3JhdGVfdXBkYXRlIC0gdHJhbnNtaXQgcmF0ZSB1 cGRhdGUgY2FsbGJhY2sKICoKICogRHJpdmVycyBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9ucyB3 aXRoIGEgbm9uLU5VTEwgcHViIHN0YQogKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGluIGRy aXZlcnMgdGhhdCBkb2VzIG5vdCBoYXZlIHByb3Zpc2lvbgogKiBpbiB1cGRhdGluZyB0aGUgdHgg cmF0ZSBpbiBkYXRhIHBhdGguCiAqCiAqIEBodzogdGhlIGhhcmR3YXJlIHRoZSBmcmFtZSB3YXMg dHJhbnNtaXR0ZWQgYnkKICogQHB1YnN0YTogdGhlIHN0YXRpb24gdG8gdXBkYXRlIHRoZSB0eCBy YXRlIGZvci4KICogQGluZm86IHR4IHN0YXR1cyBpbmZvcm1hdGlvbgogKi8Kdm9pZCBpZWVlODAy MTFfdHhfcmF0ZV91cGRhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCgkJCSAgICAgIHN0cnVj dCBpZWVlODAyMTFfc3RhICpwdWJzdGEsCgkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5m byAqaW5mbyk7CgovKioKICogaWVlZTgwMjExX3R4X3N0YXR1cyAtIHRyYW5zbWl0IHN0YXR1cyBj YWxsYmFjawogKgogKiBDYWxsIHRoaXMgZnVuY3Rpb24gZm9yIGFsbCB0cmFuc21pdHRlZCBmcmFt ZXMgYWZ0ZXIgdGhleSBoYXZlIGJlZW4KICogdHJhbnNtaXR0ZWQuIEl0IGlzIHBlcm1pc3NpYmxl IHRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZm9yCiAqIG11bHRpY2FzdCBmcmFtZXMgYnV0IHRo aXMgY2FuIGFmZmVjdCBzdGF0aXN0aWNzLgogKgogKiBUaGlzIGZ1bmN0aW9uIG1heSBub3QgYmUg Y2FsbGVkIGluIElSUSBjb250ZXh0LiBDYWxscyB0byB0aGlzIGZ1bmN0aW9uCiAqIGZvciBhIHNp bmdsZSBoYXJkd2FyZSBtdXN0IGJlIHN5bmNocm9uaXplZCBhZ2FpbnN0IGVhY2ggb3RoZXIuIENh bGxzCiAqIHRvIHRoaXMgZnVuY3Rpb24sIGllZWU4MDIxMV90eF9zdGF0dXNfbmkoKSBhbmQgaWVl ZTgwMjExX3R4X3N0YXR1c19pcnFzYWZlKCkKICogbWF5IG5vdCBiZSBtaXhlZCBmb3IgYSBzaW5n bGUgaGFyZHdhcmUuIE11c3Qgbm90IHJ1biBjb25jdXJyZW50bHkgd2l0aAogKiBpZWVlODAyMTFf cngoKSBvciBpZWVlODAyMTFfcnhfbmkoKS4KICoKICogQGh3OiB0aGUgaGFyZHdhcmUgdGhlIGZy YW1lIHdhcyB0cmFuc21pdHRlZCBieQogKiBAc2tiOiB0aGUgZnJhbWUgdGhhdCB3YXMgdHJhbnNt aXR0ZWQsIG93bmVkIGJ5IG1hYzgwMjExIGFmdGVyIHRoaXMgY2FsbAogKi8Kdm9pZCBpZWVlODAy MTFfdHhfc3RhdHVzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkgc3RydWN0IHNrX2J1ZmYg KnNrYik7CgovKioKICogaWVlZTgwMjExX3R4X3N0YXR1c19leHQgLSBleHRlbmRlZCB0cmFuc21p dCBzdGF0dXMgY2FsbGJhY2sKICoKICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBhcyBhIHJl cGxhY2VtZW50IGZvciBpZWVlODAyMTFfdHhfc3RhdHVzCiAqIGluIGRyaXZlcnMgdGhhdCBtYXkg d2FudCB0byBwcm92aWRlIGV4dHJhIGluZm9ybWF0aW9uIHRoYXQgZG9lcyBub3QKICogZml0IGlu dG8gJnN0cnVjdCBpZWVlODAyMTFfdHhfaW5mby4KICoKICogQ2FsbHMgdG8gdGhpcyBmdW5jdGlv biBmb3IgYSBzaW5nbGUgaGFyZHdhcmUgbXVzdCBiZSBzeW5jaHJvbml6ZWQKICogYWdhaW5zdCBl YWNoIG90aGVyLiBDYWxscyB0byB0aGlzIGZ1bmN0aW9uLCBpZWVlODAyMTFfdHhfc3RhdHVzX25p KCkKICogYW5kIGllZWU4MDIxMV90eF9zdGF0dXNfaXJxc2FmZSgpIG1heSBub3QgYmUgbWl4ZWQg Zm9yIGEgc2luZ2xlIGhhcmR3YXJlLgogKgogKiBAaHc6IHRoZSBoYXJkd2FyZSB0aGUgZnJhbWUg d2FzIHRyYW5zbWl0dGVkIGJ5CiAqIEBzdGF0dXM6IHR4IHN0YXR1cyBpbmZvcm1hdGlvbgogKi8K dm9pZCBpZWVlODAyMTFfdHhfc3RhdHVzX2V4dChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJ ICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X3N0YXR1cyAqc3RhdHVzKTsKCi8qKgogKiBpZWVlODAy MTFfdHhfc3RhdHVzX25vc2tiIC0gdHJhbnNtaXQgc3RhdHVzIGNhbGxiYWNrIHdpdGhvdXQgc2ti CiAqCiAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYXMgYSByZXBsYWNlbWVudCBmb3IgaWVl ZTgwMjExX3R4X3N0YXR1cwogKiBpbiBkcml2ZXJzIHRoYXQgY2Fubm90IHJlbGlhYmx5IG1hcCB0 eCBzdGF0dXMgaW5mb3JtYXRpb24gYmFjayB0bwogKiBzcGVjaWZpYyBza2JzLgogKgogKiBDYWxs cyB0byB0aGlzIGZ1bmN0aW9uIGZvciBhIHNpbmdsZSBoYXJkd2FyZSBtdXN0IGJlIHN5bmNocm9u aXplZAogKiBhZ2FpbnN0IGVhY2ggb3RoZXIuIENhbGxzIHRvIHRoaXMgZnVuY3Rpb24sIGllZWU4 MDIxMV90eF9zdGF0dXNfbmkoKQogKiBhbmQgaWVlZTgwMjExX3R4X3N0YXR1c19pcnFzYWZlKCkg bWF5IG5vdCBiZSBtaXhlZCBmb3IgYSBzaW5nbGUgaGFyZHdhcmUuCiAqCiAqIEBodzogdGhlIGhh cmR3YXJlIHRoZSBmcmFtZSB3YXMgdHJhbnNtaXR0ZWQgYnkKICogQHN0YTogdGhlIHJlY2VpdmVy IHN0YXRpb24gdG8gd2hpY2ggdGhpcyBwYWNrZXQgaXMgc2VudAogKgkoTlVMTCBmb3IgbXVsdGlj YXN0IHBhY2tldHMpCiAqIEBpbmZvOiB0eCBzdGF0dXMgaW5mb3JtYXRpb24KICovCnN0YXRpYyBp bmxpbmUgdm9pZCBpZWVlODAyMTFfdHhfc3RhdHVzX25vc2tiKHN0cnVjdCBpZWVlODAyMTFfaHcg Kmh3LAoJCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKCQkJCQkgICAgIHN0cnVj dCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbykKewoJc3RydWN0IGllZWU4MDIxMV90eF9zdGF0dXMg c3RhdHVzID0gewoJCS5zdGEgPSBzdGEsCgkJLmluZm8gPSBpbmZvLAoJfTsKCglpZWVlODAyMTFf dHhfc3RhdHVzX2V4dChodywgJnN0YXR1cyk7Cn0KCi8qKgogKiBpZWVlODAyMTFfdHhfc3RhdHVz X25pIC0gdHJhbnNtaXQgc3RhdHVzIGNhbGxiYWNrIChpbiBwcm9jZXNzIGNvbnRleHQpCiAqCiAq IExpa2UgaWVlZTgwMjExX3R4X3N0YXR1cygpIGJ1dCBjYW4gYmUgY2FsbGVkIGluIHByb2Nlc3Mg Y29udGV4dC4KICoKICogQ2FsbHMgdG8gdGhpcyBmdW5jdGlvbiwgaWVlZTgwMjExX3R4X3N0YXR1 cygpIGFuZAogKiBpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUoKSBtYXkgbm90IGJlIG1peGVk CiAqIGZvciBhIHNpbmdsZSBoYXJkd2FyZS4KICoKICogQGh3OiB0aGUgaGFyZHdhcmUgdGhlIGZy YW1lIHdhcyB0cmFuc21pdHRlZCBieQogKiBAc2tiOiB0aGUgZnJhbWUgdGhhdCB3YXMgdHJhbnNt aXR0ZWQsIG93bmVkIGJ5IG1hYzgwMjExIGFmdGVyIHRoaXMgY2FsbAogKi8Kc3RhdGljIGlubGlu ZSB2b2lkIGllZWU4MDIxMV90eF9zdGF0dXNfbmkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCgkJ CQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7Cglsb2NhbF9iaF9kaXNhYmxlKCk7CglpZWVlODAy MTFfdHhfc3RhdHVzKGh3LCBza2IpOwoJbG9jYWxfYmhfZW5hYmxlKCk7Cn0KCi8qKgogKiBpZWVl ODAyMTFfdHhfc3RhdHVzX2lycXNhZmUgLSBJUlEtc2FmZSB0cmFuc21pdCBzdGF0dXMgY2FsbGJh Y2sKICoKICogTGlrZSBpZWVlODAyMTFfdHhfc3RhdHVzKCkgYnV0IGNhbiBiZSBjYWxsZWQgaW4g SVJRIGNvbnRleHQKICogKGludGVybmFsbHkgZGVmZXJzIHRvIGEgdGFza2xldC4pCiAqCiAqIENh bGxzIHRvIHRoaXMgZnVuY3Rpb24sIGllZWU4MDIxMV90eF9zdGF0dXMoKSBhbmQKICogaWVlZTgw MjExX3R4X3N0YXR1c19uaSgpIG1heSBub3QgYmUgbWl4ZWQgZm9yIGEgc2luZ2xlIGhhcmR3YXJl LgogKgogKiBAaHc6IHRoZSBoYXJkd2FyZSB0aGUgZnJhbWUgd2FzIHRyYW5zbWl0dGVkIGJ5CiAq IEBza2I6IHRoZSBmcmFtZSB0aGF0IHdhcyB0cmFuc21pdHRlZCwgb3duZWQgYnkgbWFjODAyMTEg YWZ0ZXIgdGhpcyBjYWxsCiAqLwp2b2lkIGllZWU4MDIxMV90eF9zdGF0dXNfaXJxc2FmZShzdHJ1 Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKCi8qKgogKiBp ZWVlODAyMTFfdHhfc3RhdHVzXzgwMjMgLSB0cmFuc21pdCBzdGF0dXMgY2FsbGJhY2sgZm9yIDgw Mi4zIGZyYW1lIGZvcm1hdAogKgogKiBDYWxsIHRoaXMgZnVuY3Rpb24gZm9yIGFsbCB0cmFuc21p dHRlZCBkYXRhIGZyYW1lcyBhZnRlciB0aGVpciB0cmFuc21pdAogKiBjb21wbGV0aW9uLiBUaGlz IGNhbGxiYWNrIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmb3IgZGF0YSBmcmFtZXMgd2hpY2gKICog YXJlIGFyZSB1c2luZyBkcml2ZXIncyAob3IgaGFyZHdhcmUncykgb2ZmbG9hZCBjYXBhYmlsaXR5 IG9mIGVuY2FwL2RlY2FwCiAqIDgwMi4xMSBmcmFtZXMuCiAqCiAqIFRoaXMgZnVuY3Rpb24gbWF5 IG5vdCBiZSBjYWxsZWQgaW4gSVJRIGNvbnRleHQuIENhbGxzIHRvIHRoaXMgZnVuY3Rpb24KICog Zm9yIGEgc2luZ2xlIGhhcmR3YXJlIG11c3QgYmUgc3luY2hyb25pemVkIGFnYWluc3QgZWFjaCBv dGhlciBhbmQgYWxsCiAqIGNhbGxzIGluIHRoZSBzYW1lIHR4IHN0YXR1cyBmYW1pbHkuCiAqCiAq IEBodzogdGhlIGhhcmR3YXJlIHRoZSBmcmFtZSB3YXMgdHJhbnNtaXR0ZWQgYnkKICogQHZpZjog dGhlIGludGVyZmFjZSBmb3Igd2hpY2ggdGhlIGZyYW1lIHdhcyB0cmFuc21pdHRlZAogKiBAc2ti OiB0aGUgZnJhbWUgdGhhdCB3YXMgdHJhbnNtaXR0ZWQsIG93bmVkIGJ5IG1hYzgwMjExIGFmdGVy IHRoaXMgY2FsbAogKi8Kdm9pZCBpZWVlODAyMTFfdHhfc3RhdHVzXzgwMjMoc3RydWN0IGllZWU4 MDIxMV9odyAqaHcsCgkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAoJCQkgICAg ICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CgovKioKICogaWVlZTgwMjExX3JlcG9ydF9sb3dfYWNr IC0gcmVwb3J0IG5vbi1yZXNwb25kaW5nIHN0YXRpb24KICoKICogV2hlbiBvcGVyYXRpbmcgaW4g QVAtbW9kZSwgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHJlcG9ydCBhIG5vbi1yZXNwb25kaW5nCiAq IGNvbm5lY3RlZCBTVEEuCiAqCiAqIEBzdGE6IHRoZSBub24tcmVzcG9uZGluZyBjb25uZWN0ZWQg c3RhCiAqIEBudW1fcGFja2V0czogbnVtYmVyIG9mIHBhY2tldHMgc2VudCB0byBAc3RhIHdpdGhv dXQgYSByZXNwb25zZQogKi8Kdm9pZCBpZWVlODAyMTFfcmVwb3J0X2xvd19hY2soc3RydWN0IGll ZWU4MDIxMV9zdGEgKnN0YSwgdTMyIG51bV9wYWNrZXRzKTsKCiNkZWZpbmUgSUVFRTgwMjExX01B WF9DU0FfQ09VTlRFUlNfTlVNIDIKCi8qKgogKiBzdHJ1Y3QgaWVlZTgwMjExX211dGFibGVfb2Zm c2V0cyAtIG11dGFibGUgYmVhY29uIG9mZnNldHMKICogQHRpbV9vZmZzZXQ6IHBvc2l0aW9uIG9m IFRJTSBlbGVtZW50CiAqIEB0aW1fbGVuZ3RoOiBzaXplIG9mIFRJTSBlbGVtZW50CiAqIEBjc2Ff Y291bnRlcl9vZmZzOiBhcnJheSBvZiBJRUVFODAyMTFfTUFYX0NTQV9DT1VOVEVSU19OVU0gb2Zm c2V0cwogKgl0byBDU0EgY291bnRlcnMuICBUaGlzIGFycmF5IGNhbiBjb250YWluIHplcm8gdmFs dWVzIHdoaWNoCiAqCXNob3VsZCBiZSBpZ25vcmVkLgogKi8Kc3RydWN0IGllZWU4MDIxMV9tdXRh YmxlX29mZnNldHMgewoJdTE2IHRpbV9vZmZzZXQ7Cgl1MTYgdGltX2xlbmd0aDsKCgl1MTYgY3Nh X2NvdW50ZXJfb2Zmc1tJRUVFODAyMTFfTUFYX0NTQV9DT1VOVEVSU19OVU1dOwp9OwoKLyoqCiAq IGllZWU4MDIxMV9iZWFjb25fZ2V0X3RlbXBsYXRlIC0gYmVhY29uIHRlbXBsYXRlIGdlbmVyYXRp b24gZnVuY3Rpb24KICogQGh3OiBwb2ludGVyIG9idGFpbmVkIGZyb20gaWVlZTgwMjExX2FsbG9j X2h3KCkuCiAqIEB2aWY6ICZzdHJ1Y3QgaWVlZTgwMjExX3ZpZiBwb2ludGVyIGZyb20gdGhlIGFk ZF9pbnRlcmZhY2UgY2FsbGJhY2suCiAqIEBvZmZzOiAmc3RydWN0IGllZWU4MDIxMV9tdXRhYmxl X29mZnNldHMgcG9pbnRlciB0byBzdHJ1Y3QgdGhhdCB3aWxsCiAqCXJlY2VpdmUgdGhlIG9mZnNl dHMgdGhhdCBtYXkgYmUgdXBkYXRlZCBieSB0aGUgZHJpdmVyLgogKgogKiBJZiB0aGUgZHJpdmVy IGltcGxlbWVudHMgYmVhY29uaW5nIG1vZGVzLCBpdCBtdXN0IHVzZSB0aGlzIGZ1bmN0aW9uIHRv CiAqIG9idGFpbiB0aGUgYmVhY29uIHRlbXBsYXRlLgogKgogKiBUaGlzIGZ1bmN0aW9uIHNob3Vs ZCBiZSB1c2VkIGlmIHRoZSBiZWFjb24gZnJhbWVzIGFyZSBnZW5lcmF0ZWQgYnkgdGhlCiAqIGRl dmljZSwgYW5kIHRoZW4gdGhlIGRyaXZlciBtdXN0IHVzZSB0aGUgcmV0dXJuZWQgYmVhY29uIGFz IHRoZSB0ZW1wbGF0ZQogKiBUaGUgZHJpdmVyIG9yIHRoZSBkZXZpY2UgYXJlIHJlc3BvbnNpYmxl IHRvIHVwZGF0ZSB0aGUgRFRJTSBhbmQsIHdoZW4KICogYXBwbGljYWJsZSwgdGhlIENTQSBjb3Vu dC4KICoKICogVGhlIGRyaXZlciBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB0aGUgcmV0dXJu ZWQgc2tiLgogKgogKiBSZXR1cm46IFRoZSBiZWFjb24gdGVtcGxhdGUuICVOVUxMIG9uIGVycm9y LgogKi8Kc3RydWN0IHNrX2J1ZmYgKgppZWVlODAyMTFfYmVhY29uX2dldF90ZW1wbGF0ZShzdHJ1 Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwK CQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9tdXRhYmxlX29mZnNldHMgKm9mZnMpOwoKLyoqCiAq IGllZWU4MDIxMV9iZWFjb25fZ2V0X3RpbSAtIGJlYWNvbiBnZW5lcmF0aW9uIGZ1bmN0aW9uCiAq IEBodzogcG9pbnRlciBvYnRhaW5lZCBmcm9tIGllZWU4MDIxMV9hbGxvY19odygpLgogKiBAdmlm OiAmc3RydWN0IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNlIGNh bGxiYWNrLgogKiBAdGltX29mZnNldDogcG9pbnRlciB0byB2YXJpYWJsZSB0aGF0IHdpbGwgcmVj ZWl2ZSB0aGUgVElNIElFIG9mZnNldC4KICoJU2V0IHRvIDAgaWYgaW52YWxpZCAoaW4gbm9uLUFQ IG1vZGVzKS4KICogQHRpbV9sZW5ndGg6IHBvaW50ZXIgdG8gdmFyaWFibGUgdGhhdCB3aWxsIHJl Y2VpdmUgdGhlIFRJTSBJRSBsZW5ndGgsCiAqCShpbmNsdWRpbmcgdGhlIElEIGFuZCBsZW5ndGgg Ynl0ZXMhKS4KICoJU2V0IHRvIDAgaWYgaW52YWxpZCAoaW4gbm9uLUFQIG1vZGVzKS4KICoKICog SWYgdGhlIGRyaXZlciBpbXBsZW1lbnRzIGJlYWNvbmluZyBtb2RlcywgaXQgbXVzdCB1c2UgdGhp cyBmdW5jdGlvbiB0bwogKiBvYnRhaW4gdGhlIGJlYWNvbiBmcmFtZS4KICoKICogSWYgdGhlIGJl YWNvbiBmcmFtZXMgYXJlIGdlbmVyYXRlZCBieSB0aGUgaG9zdCBzeXN0ZW0gKGkuZS4sIG5vdCBp bgogKiBoYXJkd2FyZS9maXJtd2FyZSksIHRoZSBkcml2ZXIgdXNlcyB0aGlzIGZ1bmN0aW9uIHRv IGdldCBlYWNoIGJlYWNvbgogKiBmcmFtZSBmcm9tIG1hYzgwMjExIC0tIGl0IGlzIHJlc3BvbnNp YmxlIGZvciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gZXhhY3RseQogKiBvbmNlIGJlZm9yZSB0aGUg YmVhY29uIGlzIG5lZWRlZCAoZS5nLiBiYXNlZCBvbiBoYXJkd2FyZSBpbnRlcnJ1cHQpLgogKgog KiBUaGUgZHJpdmVyIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHRoZSByZXR1cm5lZCBza2Iu CiAqCiAqIFJldHVybjogVGhlIGJlYWNvbiB0ZW1wbGF0ZS4gJU5VTEwgb24gZXJyb3IuCiAqLwpz dHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2JlYWNvbl9nZXRfdGltKHN0cnVjdCBpZWVlODAyMTFf aHcgKmh3LAoJCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAoJCQkJCSB1MTYgKnRpbV9v ZmZzZXQsIHUxNiAqdGltX2xlbmd0aCk7CgovKioKICogaWVlZTgwMjExX2JlYWNvbl9nZXQgLSBi ZWFjb24gZ2VuZXJhdGlvbiBmdW5jdGlvbgogKiBAaHc6IHBvaW50ZXIgb2J0YWluZWQgZnJvbSBp ZWVlODAyMTFfYWxsb2NfaHcoKS4KICogQHZpZjogJnN0cnVjdCBpZWVlODAyMTFfdmlmIHBvaW50 ZXIgZnJvbSB0aGUgYWRkX2ludGVyZmFjZSBjYWxsYmFjay4KICoKICogU2VlIGllZWU4MDIxMV9i ZWFjb25fZ2V0X3RpbSgpLgogKgogKiBSZXR1cm46IFNlZSBpZWVlODAyMTFfYmVhY29uX2dldF90 aW0oKS4KICovCnN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9iZWFjb25f Z2V0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3Zp ZiAqdmlmKQp7CglyZXR1cm4gaWVlZTgwMjExX2JlYWNvbl9nZXRfdGltKGh3LCB2aWYsIE5VTEws IE5VTEwpOwp9CgovKioKICogaWVlZTgwMjExX2NzYV91cGRhdGVfY291bnRlciAtIHJlcXVlc3Qg bWFjODAyMTEgdG8gZGVjcmVtZW50IHRoZSBjc2EgY291bnRlcgogKiBAdmlmOiAmc3RydWN0IGll ZWU4MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNlIGNhbGxiYWNrLgogKgog KiBUaGUgY3NhIGNvdW50ZXIgc2hvdWxkIGJlIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBiZWFjb24gdHJh bnNtaXNzaW9uLgogKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbXBsaWNpdGx5IHdoZW4KICog aWVlZTgwMjExX2JlYWNvbl9nZXQvaWVlZTgwMjExX2JlYWNvbl9nZXRfdGltIGFyZSBjYWxsZWQs IGhvd2V2ZXIgaWYgdGhlCiAqIGJlYWNvbiBmcmFtZXMgYXJlIGdlbmVyYXRlZCBieSB0aGUgZGV2 aWNlLCB0aGUgZHJpdmVyIHNob3VsZCBjYWxsIHRoaXMKICogZnVuY3Rpb24gYWZ0ZXIgZWFjaCBi ZWFjb24gdHJhbnNtaXNzaW9uIHRvIHN5bmMgbWFjODAyMTEncyBjc2EgY291bnRlcnMuCiAqCiAq IFJldHVybjogbmV3IGNzYSBjb3VudGVyIHZhbHVlCiAqLwp1OCBpZWVlODAyMTFfY3NhX3VwZGF0 ZV9jb3VudGVyKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwoKLyoqCiAqIGllZWU4MDIxMV9j c2Ffc2V0X2NvdW50ZXIgLSByZXF1ZXN0IG1hYzgwMjExIHRvIHNldCBjc2EgY291bnRlcgogKiBA dmlmOiAmc3RydWN0IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNl IGNhbGxiYWNrLgogKiBAY291bnRlcjogdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGNvdW50ZXIKICoK ICogVGhlIGNzYSBjb3VudGVyIGNhbiBiZSBjaGFuZ2VkIGJ5IHRoZSBkZXZpY2UsIHRoaXMgQVBJ IHNob3VsZCBiZQogKiB1c2VkIGJ5IHRoZSBkZXZpY2UgZHJpdmVyIHRvIHVwZGF0ZSBjc2EgY291 bnRlciBpbiBtYWM4MDIxMS4KICoKICogSXQgc2hvdWxkIG5ldmVyIGJlIHVzZWQgdG9nZXRoZXIg d2l0aCBpZWVlODAyMTFfY3NhX3VwZGF0ZV9jb3VudGVyKCksCiAqIGFzIGl0IHdpbGwgY2F1c2Ug YSByYWNlIGNvbmRpdGlvbiBhcm91bmQgdGhlIGNvdW50ZXIgdmFsdWUuCiAqLwp2b2lkIGllZWU4 MDIxMV9jc2Ffc2V0X2NvdW50ZXIoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgdTggY291bnRl cik7CgovKioKICogaWVlZTgwMjExX2NzYV9maW5pc2ggLSBub3RpZnkgbWFjODAyMTEgYWJvdXQg Y2hhbm5lbCBzd2l0Y2gKICogQHZpZjogJnN0cnVjdCBpZWVlODAyMTFfdmlmIHBvaW50ZXIgZnJv bSB0aGUgYWRkX2ludGVyZmFjZSBjYWxsYmFjay4KICoKICogQWZ0ZXIgYSBjaGFubmVsIHN3aXRj aCBhbm5vdW5jZW1lbnQgd2FzIHNjaGVkdWxlZCBhbmQgdGhlIGNvdW50ZXIgaW4gdGhpcwogKiBh bm5vdW5jZW1lbnQgaGl0cyAxLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJ5IHRoZSBk cml2ZXIgdG8KICogbm90aWZ5IG1hYzgwMjExIHRoYXQgdGhlIGNoYW5uZWwgY2FuIGJlIGNoYW5n ZWQuCiAqLwp2b2lkIGllZWU4MDIxMV9jc2FfZmluaXNoKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2 aWYpOwoKLyoqCiAqIGllZWU4MDIxMV9jc2FfaXNfY29tcGxldGUgLSBmaW5kIG91dCBpZiBjb3Vu dGVycyByZWFjaGVkIDEKICogQHZpZjogJnN0cnVjdCBpZWVlODAyMTFfdmlmIHBvaW50ZXIgZnJv bSB0aGUgYWRkX2ludGVyZmFjZSBjYWxsYmFjay4KICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5z IHdoZXRoZXIgdGhlIGNoYW5uZWwgc3dpdGNoIGNvdW50ZXJzIHJlYWNoZWQgemVyby4KICovCmJv b2wgaWVlZTgwMjExX2NzYV9pc19jb21wbGV0ZShzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsK CgovKioKICogaWVlZTgwMjExX3Byb2JlcmVzcF9nZXQgLSByZXRyaWV2ZSBhIFByb2JlIFJlc3Bv bnNlIHRlbXBsYXRlCiAqIEBodzogcG9pbnRlciBvYnRhaW5lZCBmcm9tIGllZWU4MDIxMV9hbGxv Y19odygpLgogKiBAdmlmOiAmc3RydWN0IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBh ZGRfaW50ZXJmYWNlIGNhbGxiYWNrLgogKgogKiBDcmVhdGVzIGEgUHJvYmUgUmVzcG9uc2UgdGVt cGxhdGUgd2hpY2ggY2FuLCBmb3IgZXhhbXBsZSwgYmUgdXBsb2FkZWQgdG8KICogaGFyZHdhcmUu IFRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIHNob3VsZCBiZSBzZXQgYnkgdGhlIGNhbGxlci4KICoK ICogQ2FuIG9ubHkgYmUgY2FsbGVkIGluIEFQIG1vZGUuCiAqCiAqIFJldHVybjogVGhlIFByb2Jl IFJlc3BvbnNlIHRlbXBsYXRlLiAlTlVMTCBvbiBlcnJvci4KICovCnN0cnVjdCBza19idWZmICpp ZWVlODAyMTFfcHJvYmVyZXNwX2dldChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJCQlzdHJ1 Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKCi8qKgogKiBpZWVlODAyMTFfcHNwb2xsX2dldCAtIHJl dHJpZXZlIGEgUFMgUG9sbCB0ZW1wbGF0ZQogKiBAaHc6IHBvaW50ZXIgb2J0YWluZWQgZnJvbSBp ZWVlODAyMTFfYWxsb2NfaHcoKS4KICogQHZpZjogJnN0cnVjdCBpZWVlODAyMTFfdmlmIHBvaW50 ZXIgZnJvbSB0aGUgYWRkX2ludGVyZmFjZSBjYWxsYmFjay4KICoKICogQ3JlYXRlcyBhIFBTIFBv bGwgYSB0ZW1wbGF0ZSB3aGljaCBjYW4sIGZvciBleGFtcGxlLCB1cGxvYWRlZCB0bwogKiBoYXJk d2FyZS4gVGhlIHRlbXBsYXRlIG11c3QgYmUgdXBkYXRlZCBhZnRlciBhc3NvY2lhdGlvbiBzbyB0 aGF0IGNvcnJlY3QKICogQUlELCBCU1NJRCBhbmQgTUFDIGFkZHJlc3MgaXMgdXNlZC4KICoKICog Tm90ZTogQ2FsbGVyIChvciBoYXJkd2FyZSkgaXMgcmVzcG9uc2libGUgZm9yIHNldHRpbmcgdGhl CiAqICZJRUVFODAyMTFfRkNUTF9QTSBiaXQuCiAqCiAqIFJldHVybjogVGhlIFBTIFBvbGwgdGVt cGxhdGUuICVOVUxMIG9uIGVycm9yLgogKi8Kc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9wc3Bv bGxfZ2V0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjEx X3ZpZiAqdmlmKTsKCi8qKgogKiBpZWVlODAyMTFfbnVsbGZ1bmNfZ2V0IC0gcmV0cmlldmUgYSBu dWxsZnVuYyB0ZW1wbGF0ZQogKiBAaHc6IHBvaW50ZXIgb2J0YWluZWQgZnJvbSBpZWVlODAyMTFf YWxsb2NfaHcoKS4KICogQHZpZjogJnN0cnVjdCBpZWVlODAyMTFfdmlmIHBvaW50ZXIgZnJvbSB0 aGUgYWRkX2ludGVyZmFjZSBjYWxsYmFjay4KICogQHFvc19vazogUW9TIE5EUCBpcyBhY2NlcHRh YmxlIHRvIHRoZSBjYWxsZXIsIHRoaXMgc2hvdWxkIGJlIHNldAogKglpZiBhdCBhbGwgcG9zc2li bGUKICoKICogQ3JlYXRlcyBhIE51bGxmdW5jIHRlbXBsYXRlIHdoaWNoIGNhbiwgZm9yIGV4YW1w bGUsIHVwbG9hZGVkIHRvCiAqIGhhcmR3YXJlLiBUaGUgdGVtcGxhdGUgbXVzdCBiZSB1cGRhdGVk IGFmdGVyIGFzc29jaWF0aW9uIHNvIHRoYXQgY29ycmVjdAogKiBCU1NJRCBhbmQgYWRkcmVzcyBp cyB1c2VkLgogKgogKiBJZiBAcW9zX25kcCBpcyBzZXQgYW5kIHRoZSBhc3NvY2lhdGlvbiBpcyB0 byBhbiBBUCB3aXRoIFFvUy9XTU0sIHRoZQogKiByZXR1cm5lZCBwYWNrZXQgd2lsbCBiZSBRb1Mg TkRQLgogKgogKiBOb3RlOiBDYWxsZXIgKG9yIGhhcmR3YXJlKSBpcyByZXNwb25zaWJsZSBmb3Ig c2V0dGluZyB0aGUKICogJklFRUU4MDIxMV9GQ1RMX1BNIGJpdCBhcyB3ZWxsIGFzIER1cmF0aW9u IGFuZCBTZXF1ZW5jZSBDb250cm9sIGZpZWxkcy4KICoKICogUmV0dXJuOiBUaGUgbnVsbGZ1bmMg dGVtcGxhdGUuICVOVUxMIG9uIGVycm9yLgogKi8Kc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9u dWxsZnVuY19nZXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCgkJCQkgICAgICAgc3RydWN0IGll ZWU4MDIxMV92aWYgKnZpZiwKCQkJCSAgICAgICBib29sIHFvc19vayk7CgovKioKICogaWVlZTgw MjExX3Byb2JlcmVxX2dldCAtIHJldHJpZXZlIGEgUHJvYmUgUmVxdWVzdCB0ZW1wbGF0ZQogKiBA aHc6IHBvaW50ZXIgb2J0YWluZWQgZnJvbSBpZWVlODAyMTFfYWxsb2NfaHcoKS4KICogQHNyY19h ZGRyOiBzb3VyY2UgTUFDIGFkZHJlc3MKICogQHNzaWQ6IFNTSUQgYnVmZmVyCiAqIEBzc2lkX2xl bjogbGVuZ3RoIG9mIFNTSUQKICogQHRhaWxyb29tOiB0YWlscm9vbSB0byByZXNlcnZlIGF0IGVu ZCBvZiBTS0IgZm9yIElFcwogKgogKiBDcmVhdGVzIGEgUHJvYmUgUmVxdWVzdCB0ZW1wbGF0ZSB3 aGljaCBjYW4sIGZvciBleGFtcGxlLCBiZSB1cGxvYWRlZCB0bwogKiBoYXJkd2FyZS4KICoKICog UmV0dXJuOiBUaGUgUHJvYmUgUmVxdWVzdCB0ZW1wbGF0ZS4gJU5VTEwgb24gZXJyb3IuCiAqLwpz dHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX3Byb2JlcmVxX2dldChzdHJ1Y3QgaWVlZTgwMjExX2h3 ICpodywKCQkJCSAgICAgICBjb25zdCB1OCAqc3JjX2FkZHIsCgkJCQkgICAgICAgY29uc3QgdTgg KnNzaWQsIHNpemVfdCBzc2lkX2xlbiwKCQkJCSAgICAgICBzaXplX3QgdGFpbHJvb20pOwoKLyoq CiAqIGllZWU4MDIxMV9ydHNfZ2V0IC0gUlRTIGZyYW1lIGdlbmVyYXRpb24gZnVuY3Rpb24KICog QGh3OiBwb2ludGVyIG9idGFpbmVkIGZyb20gaWVlZTgwMjExX2FsbG9jX2h3KCkuCiAqIEB2aWY6 ICZzdHJ1Y3QgaWVlZTgwMjExX3ZpZiBwb2ludGVyIGZyb20gdGhlIGFkZF9pbnRlcmZhY2UgY2Fs bGJhY2suCiAqIEBmcmFtZTogcG9pbnRlciB0byB0aGUgZnJhbWUgdGhhdCBpcyBnb2luZyB0byBi ZSBwcm90ZWN0ZWQgYnkgdGhlIFJUUy4KICogQGZyYW1lX2xlbjogdGhlIGZyYW1lIGxlbmd0aCAo aW4gb2N0ZXRzKS4KICogQGZyYW1lX3R4Y3RsOiAmc3RydWN0IGllZWU4MDIxMV90eF9pbmZvIG9m IHRoZSBmcmFtZS4KICogQHJ0czogVGhlIGJ1ZmZlciB3aGVyZSB0byBzdG9yZSB0aGUgUlRTIGZy YW1lLgogKgogKiBJZiB0aGUgUlRTIGZyYW1lcyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBob3N0IHN5 c3RlbSAoaS5lLiwgbm90IGluCiAqIGhhcmR3YXJlL2Zpcm13YXJlKSwgdGhlIGxvdy1sZXZlbCBk cml2ZXIgdXNlcyB0aGlzIGZ1bmN0aW9uIHRvIHJlY2VpdmUKICogdGhlIG5leHQgUlRTIGZyYW1l IGZyb20gdGhlIDgwMi4xMSBjb2RlLiBUaGUgbG93LWxldmVsIGlzIHJlc3BvbnNpYmxlCiAqIGZv ciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGFuZCBSVFMgZnJhbWUgaXMgbmVlZGVkLgog Ki8Kdm9pZCBpZWVlODAyMTFfcnRzX2dldChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0 IGllZWU4MDIxMV92aWYgKnZpZiwKCQkgICAgICAgY29uc3Qgdm9pZCAqZnJhbWUsIHNpemVfdCBm cmFtZV9sZW4sCgkJICAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqZnJhbWVf dHhjdGwsCgkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfcnRzICpydHMpOwoKLyoqCiAqIGllZWU4 MDIxMV9ydHNfZHVyYXRpb24gLSBHZXQgdGhlIGR1cmF0aW9uIGZpZWxkIGZvciBhbiBSVFMgZnJh bWUKICogQGh3OiBwb2ludGVyIG9idGFpbmVkIGZyb20gaWVlZTgwMjExX2FsbG9jX2h3KCkuCiAq IEB2aWY6ICZzdHJ1Y3QgaWVlZTgwMjExX3ZpZiBwb2ludGVyIGZyb20gdGhlIGFkZF9pbnRlcmZh Y2UgY2FsbGJhY2suCiAqIEBmcmFtZV9sZW46IHRoZSBsZW5ndGggb2YgdGhlIGZyYW1lIHRoYXQg aXMgZ29pbmcgdG8gYmUgcHJvdGVjdGVkIGJ5IHRoZSBSVFMuCiAqIEBmcmFtZV90eGN0bDogJnN0 cnVjdCBpZWVlODAyMTFfdHhfaW5mbyBvZiB0aGUgZnJhbWUuCiAqCiAqIElmIHRoZSBSVFMgaXMg Z2VuZXJhdGVkIGluIGZpcm13YXJlLCBidXQgdGhlIGhvc3Qgc3lzdGVtIG11c3QgcHJvdmlkZQog KiB0aGUgZHVyYXRpb24gZmllbGQsIHRoZSBsb3ctbGV2ZWwgZHJpdmVyIHVzZXMgdGhpcyBmdW5j dGlvbiB0byByZWNlaXZlCiAqIHRoZSBkdXJhdGlvbiBmaWVsZCB2YWx1ZSBpbiBsaXR0bGUtZW5k aWFuIGJ5dGVvcmRlci4KICoKICogUmV0dXJuOiBUaGUgZHVyYXRpb24uCiAqLwpfX2xlMTYgaWVl ZTgwMjExX3J0c19kdXJhdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJICAgICAgc3Ry dWN0IGllZWU4MDIxMV92aWYgKnZpZiwgc2l6ZV90IGZyYW1lX2xlbiwKCQkJICAgICAgY29uc3Qg c3RydWN0IGllZWU4MDIxMV90eF9pbmZvICpmcmFtZV90eGN0bCk7CgovKioKICogaWVlZTgwMjEx X2N0c3Rvc2VsZl9nZXQgLSBDVFMtdG8tc2VsZiBmcmFtZSBnZW5lcmF0aW9uIGZ1bmN0aW9uCiAq IEBodzogcG9pbnRlciBvYnRhaW5lZCBmcm9tIGllZWU4MDIxMV9hbGxvY19odygpLgogKiBAdmlm OiAmc3RydWN0IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNlIGNh bGxiYWNrLgogKiBAZnJhbWU6IHBvaW50ZXIgdG8gdGhlIGZyYW1lIHRoYXQgaXMgZ29pbmcgdG8g YmUgcHJvdGVjdGVkIGJ5IHRoZSBDVFMtdG8tc2VsZi4KICogQGZyYW1lX2xlbjogdGhlIGZyYW1l IGxlbmd0aCAoaW4gb2N0ZXRzKS4KICogQGZyYW1lX3R4Y3RsOiAmc3RydWN0IGllZWU4MDIxMV90 eF9pbmZvIG9mIHRoZSBmcmFtZS4KICogQGN0czogVGhlIGJ1ZmZlciB3aGVyZSB0byBzdG9yZSB0 aGUgQ1RTLXRvLXNlbGYgZnJhbWUuCiAqCiAqIElmIHRoZSBDVFMtdG8tc2VsZiBmcmFtZXMgYXJl IGdlbmVyYXRlZCBieSB0aGUgaG9zdCBzeXN0ZW0gKGkuZS4sIG5vdCBpbgogKiBoYXJkd2FyZS9m aXJtd2FyZSksIHRoZSBsb3ctbGV2ZWwgZHJpdmVyIHVzZXMgdGhpcyBmdW5jdGlvbiB0byByZWNl aXZlCiAqIHRoZSBuZXh0IENUUy10by1zZWxmIGZyYW1lIGZyb20gdGhlIDgwMi4xMSBjb2RlLiBU aGUgbG93LWxldmVsIGlzIHJlc3BvbnNpYmxlCiAqIGZvciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24g YmVmb3JlIGFuZCBDVFMtdG8tc2VsZiBmcmFtZSBpcyBuZWVkZWQuCiAqLwp2b2lkIGllZWU4MDIx MV9jdHN0b3NlbGZfZ2V0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkgICAgIHN0cnVjdCBp ZWVlODAyMTFfdmlmICp2aWYsCgkJCSAgICAgY29uc3Qgdm9pZCAqZnJhbWUsIHNpemVfdCBmcmFt ZV9sZW4sCgkJCSAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICpmcmFtZV90eGN0 bCwKCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2N0cyAqY3RzKTsKCi8qKgogKiBpZWVlODAyMTFf Y3RzdG9zZWxmX2R1cmF0aW9uIC0gR2V0IHRoZSBkdXJhdGlvbiBmaWVsZCBmb3IgYSBDVFMtdG8t c2VsZiBmcmFtZQogKiBAaHc6IHBvaW50ZXIgb2J0YWluZWQgZnJvbSBpZWVlODAyMTFfYWxsb2Nf aHcoKS4KICogQHZpZjogJnN0cnVjdCBpZWVlODAyMTFfdmlmIHBvaW50ZXIgZnJvbSB0aGUgYWRk X2ludGVyZmFjZSBjYWxsYmFjay4KICogQGZyYW1lX2xlbjogdGhlIGxlbmd0aCBvZiB0aGUgZnJh bWUgdGhhdCBpcyBnb2luZyB0byBiZSBwcm90ZWN0ZWQgYnkgdGhlIENUUy10by1zZWxmLgogKiBA ZnJhbWVfdHhjdGw6ICZzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gb2YgdGhlIGZyYW1lLgogKgog KiBJZiB0aGUgQ1RTLXRvLXNlbGYgaXMgZ2VuZXJhdGVkIGluIGZpcm13YXJlLCBidXQgdGhlIGhv c3Qgc3lzdGVtIG11c3QgcHJvdmlkZQogKiB0aGUgZHVyYXRpb24gZmllbGQsIHRoZSBsb3ctbGV2 ZWwgZHJpdmVyIHVzZXMgdGhpcyBmdW5jdGlvbiB0byByZWNlaXZlCiAqIHRoZSBkdXJhdGlvbiBm aWVsZCB2YWx1ZSBpbiBsaXR0bGUtZW5kaWFuIGJ5dGVvcmRlci4KICoKICogUmV0dXJuOiBUaGUg ZHVyYXRpb24uCiAqLwpfX2xlMTYgaWVlZTgwMjExX2N0c3Rvc2VsZl9kdXJhdGlvbihzdHJ1Y3Qg aWVlZTgwMjExX2h3ICpodywKCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAoJCQkJ ICAgIHNpemVfdCBmcmFtZV9sZW4sCgkJCQkgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eF9p bmZvICpmcmFtZV90eGN0bCk7CgovKioKICogaWVlZTgwMjExX2dlbmVyaWNfZnJhbWVfZHVyYXRp b24gLSBDYWxjdWxhdGUgdGhlIGR1cmF0aW9uIGZpZWxkIGZvciBhIGZyYW1lCiAqIEBodzogcG9p bnRlciBvYnRhaW5lZCBmcm9tIGllZWU4MDIxMV9hbGxvY19odygpLgogKiBAdmlmOiAmc3RydWN0 IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNlIGNhbGxiYWNrLgog KiBAYmFuZDogdGhlIGJhbmQgdG8gY2FsY3VsYXRlIHRoZSBmcmFtZSBkdXJhdGlvbiBvbgogKiBA ZnJhbWVfbGVuOiB0aGUgbGVuZ3RoIG9mIHRoZSBmcmFtZS4KICogQHJhdGU6IHRoZSByYXRlIGF0 IHdoaWNoIHRoZSBmcmFtZSBpcyBnb2luZyB0byBiZSB0cmFuc21pdHRlZC4KICoKICogQ2FsY3Vs YXRlIHRoZSBkdXJhdGlvbiBmaWVsZCBvZiBzb21lIGdlbmVyaWMgZnJhbWUsIGdpdmVuIGl0cwog KiBsZW5ndGggYW5kIHRyYW5zbWlzc2lvbiByYXRlIChpbiAxMDBrYnBzKS4KICoKICogUmV0dXJu OiBUaGUgZHVyYXRpb24uCiAqLwpfX2xlMTYgaWVlZTgwMjExX2dlbmVyaWNfZnJhbWVfZHVyYXRp b24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCgkJCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZp ZiwKCQkJCQllbnVtIG5sODAyMTFfYmFuZCBiYW5kLAoJCQkJCXNpemVfdCBmcmFtZV9sZW4sCgkJ CQkJc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlKTsKCi8qKgogKiBpZWVlODAyMTFfZ2V0X2J1 ZmZlcmVkX2JjIC0gYWNjZXNzaW5nIGJ1ZmZlcmVkIGJyb2FkY2FzdCBhbmQgbXVsdGljYXN0IGZy YW1lcwogKiBAaHc6IHBvaW50ZXIgYXMgb2J0YWluZWQgZnJvbSBpZWVlODAyMTFfYWxsb2NfaHco KS4KICogQHZpZjogJnN0cnVjdCBpZWVlODAyMTFfdmlmIHBvaW50ZXIgZnJvbSB0aGUgYWRkX2lu dGVyZmFjZSBjYWxsYmFjay4KICoKICogRnVuY3Rpb24gZm9yIGFjY2Vzc2luZyBidWZmZXJlZCBi cm9hZGNhc3QgYW5kIG11bHRpY2FzdCBmcmFtZXMuIElmCiAqIGhhcmR3YXJlL2Zpcm13YXJlIGRv ZXMgbm90IGltcGxlbWVudCBidWZmZXJpbmcgb2YgYnJvYWRjYXN0L211bHRpY2FzdAogKiBmcmFt ZXMgd2hlbiBwb3dlciBzYXZpbmcgaXMgdXNlZCwgODAyLjExIGNvZGUgYnVmZmVycyB0aGVtIGlu IHRoZSBob3N0CiAqIG1lbW9yeS4gVGhlIGxvdy1sZXZlbCBkcml2ZXIgdXNlcyB0aGlzIGZ1bmN0 aW9uIHRvIGZldGNoIG5leHQgYnVmZmVyZWQKICogZnJhbWUuIEluIG1vc3QgY2FzZXMsIHRoaXMg aXMgdXNlZCB3aGVuIGdlbmVyYXRpbmcgYmVhY29uIGZyYW1lLgogKgogKiBSZXR1cm46IEEgcG9p bnRlciB0byB0aGUgbmV4dCBidWZmZXJlZCBza2Igb3IgTlVMTCBpZiBubyBtb3JlIGJ1ZmZlcmVk CiAqIGZyYW1lcyBhcmUgYXZhaWxhYmxlLgogKgogKiBOb3RlOiBidWZmZXJlZCBmcmFtZXMgYXJl IHJldHVybmVkIG9ubHkgYWZ0ZXIgRFRJTSBiZWFjb24gZnJhbWUgd2FzCiAqIGdlbmVyYXRlZCB3 aXRoIGllZWU4MDIxMV9iZWFjb25fZ2V0KCkgYW5kIHRoZSBsb3ctbGV2ZWwgZHJpdmVyIG11c3Qg dGh1cwogKiBjYWxsIGllZWU4MDIxMV9iZWFjb25fZ2V0KCkgZmlyc3QuIGllZWU4MDIxMV9nZXRf YnVmZmVyZWRfYmMoKSByZXR1cm5zCiAqIE5VTEwgaWYgdGhlIHByZXZpb3VzIGdlbmVyYXRlZCBi ZWFjb24gd2FzIG5vdCBEVElNLCBzbyB0aGUgbG93LWxldmVsIGRyaXZlcgogKiBkb2VzIG5vdCBu ZWVkIHRvIGNoZWNrIGZvciBEVElNIGJlYWNvbnMgc2VwYXJhdGVseSBhbmQgc2hvdWxkIGJlIGFi bGUgdG8KICogdXNlIGNvbW1vbiBjb2RlIGZvciBhbGwgYmVhY29ucy4KICovCnN0cnVjdCBza19i dWZmICoKaWVlZTgwMjExX2dldF9idWZmZXJlZF9iYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywg c3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CgovKioKICogaWVlZTgwMjExX2dldF90a2lwX3Ax a19pdiAtIGdldCBhIFRLSVAgcGhhc2UgMSBrZXkgZm9yIElWMzIKICoKICogVGhpcyBmdW5jdGlv biByZXR1cm5zIHRoZSBUS0lQIHBoYXNlIDEga2V5IGZvciB0aGUgZ2l2ZW4gSVYzMi4KICoKICog QGtleWNvbmY6IHRoZSBwYXJhbWV0ZXIgcGFzc2VkIHdpdGggdGhlIHNldCBrZXkKICogQGl2MzI6 IElWMzIgdG8gZ2V0IHRoZSBQMUsgZm9yCiAqIEBwMWs6IGEgYnVmZmVyIHRvIHdoaWNoIHRoZSBr ZXkgd2lsbCBiZSB3cml0dGVuLCBhcyA1IHUxNiB2YWx1ZXMKICovCnZvaWQgaWVlZTgwMjExX2dl dF90a2lwX3Axa19pdihzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAoJCQkgICAg ICAgdTMyIGl2MzIsIHUxNiAqcDFrKTsKCi8qKgogKiBpZWVlODAyMTFfZ2V0X3RraXBfcDFrIC0g Z2V0IGEgVEtJUCBwaGFzZSAxIGtleQogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFRL SVAgcGhhc2UgMSBrZXkgZm9yIHRoZSBJVjMyIHRha2VuCiAqIGZyb20gdGhlIGdpdmVuIHBhY2tl dC4KICoKICogQGtleWNvbmY6IHRoZSBwYXJhbWV0ZXIgcGFzc2VkIHdpdGggdGhlIHNldCBrZXkK ICogQHNrYjogdGhlIHBhY2tldCB0byB0YWtlIHRoZSBJVjMyIHZhbHVlIGZyb20gdGhhdCB3aWxs IGJlIGVuY3J5cHRlZAogKgl3aXRoIHRoaXMgUDFLCiAqIEBwMWs6IGEgYnVmZmVyIHRvIHdoaWNo IHRoZSBrZXkgd2lsbCBiZSB3cml0dGVuLCBhcyA1IHUxNiB2YWx1ZXMKICovCnN0YXRpYyBpbmxp bmUgdm9pZCBpZWVlODAyMTFfZ2V0X3RraXBfcDFrKHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYg KmtleWNvbmYsCgkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MTYgKnAxaykKewoJc3RydWN0 IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsK CWNvbnN0IHU4ICpkYXRhID0gKHU4ICopaGRyICsgaWVlZTgwMjExX2hkcmxlbihoZHItPmZyYW1l X2NvbnRyb2wpOwoJdTMyIGl2MzIgPSBnZXRfdW5hbGlnbmVkX2xlMzIoJmRhdGFbNF0pOwoKCWll ZWU4MDIxMV9nZXRfdGtpcF9wMWtfaXYoa2V5Y29uZiwgaXYzMiwgcDFrKTsKfQoKLyoqCiAqIGll ZWU4MDIxMV9nZXRfdGtpcF9yeF9wMWsgLSBnZXQgYSBUS0lQIHBoYXNlIDEga2V5IGZvciBSWAog KgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFRLSVAgcGhhc2UgMSBrZXkgZm9yIHRoZSBn aXZlbiBJVjMyCiAqIGFuZCB0cmFuc21pdHRlciBhZGRyZXNzLgogKgogKiBAa2V5Y29uZjogdGhl IHBhcmFtZXRlciBwYXNzZWQgd2l0aCB0aGUgc2V0IGtleQogKiBAdGE6IFRBIHRoYXQgd2lsbCBi ZSB1c2VkIHdpdGggdGhlIGtleQogKiBAaXYzMjogSVYzMiB0byBnZXQgdGhlIFAxSyBmb3IKICog QHAxazogYSBidWZmZXIgdG8gd2hpY2ggdGhlIGtleSB3aWxsIGJlIHdyaXR0ZW4sIGFzIDUgdTE2 IHZhbHVlcwogKi8Kdm9pZCBpZWVlODAyMTFfZ2V0X3RraXBfcnhfcDFrKHN0cnVjdCBpZWVlODAy MTFfa2V5X2NvbmYgKmtleWNvbmYsCgkJCSAgICAgICBjb25zdCB1OCAqdGEsIHUzMiBpdjMyLCB1 MTYgKnAxayk7CgovKioKICogaWVlZTgwMjExX2dldF90a2lwX3AyayAtIGdldCBhIFRLSVAgcGhh c2UgMiBrZXkKICoKICogVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgVEtJUCBSQzQga2V5IGZv ciB0aGUgSVYgdmFsdWVzCiAqIGluIHRoZSBwYWNrZXQuCiAqCiAqIEBrZXljb25mOiB0aGUgcGFy YW1ldGVyIHBhc3NlZCB3aXRoIHRoZSBzZXQga2V5CiAqIEBza2I6IHRoZSBwYWNrZXQgdG8gdGFr ZSB0aGUgSVYzMi9JVjE2IHZhbHVlcyBmcm9tIHRoYXQgd2lsbCBiZQogKgllbmNyeXB0ZWQgd2l0 aCB0aGlzIGtleQogKiBAcDJrOiBhIGJ1ZmZlciB0byB3aGljaCB0aGUga2V5IHdpbGwgYmUgd3Jp dHRlbiwgMTYgYnl0ZXMKICovCnZvaWQgaWVlZTgwMjExX2dldF90a2lwX3AyayhzdHJ1Y3QgaWVl ZTgwMjExX2tleV9jb25mICprZXljb25mLAoJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTgg KnAyayk7CgovKioKICogaWVlZTgwMjExX3RraXBfYWRkX2l2IC0gd3JpdGUgVEtJUCBJViBhbmQg RXh0LiBJViB0byBwb3MKICoKICogQHBvczogc3RhcnQgb2YgY3J5cHRvIGhlYWRlcgogKiBAa2V5 Y29uZjogdGhlIHBhcmFtZXRlciBwYXNzZWQgd2l0aCB0aGUgc2V0IGtleQogKiBAcG46IFBOIHRv IGFkZAogKgogKiBSZXR1cm5zOiBwb2ludGVyIHRvIHRoZSBvY3RldCBmb2xsb3dpbmcgSVZzIChp LmUuIGJlZ2lubmluZyBvZgogKiB0aGUgcGFja2V0IHBheWxvYWQpCiAqCiAqIFRoaXMgZnVuY3Rp b24gd3JpdGVzIHRoZSB0a2lwIElWIHZhbHVlIHRvIHBvcyAod2hpY2ggc2hvdWxkCiAqIHBvaW50 IHRvIHRoZSBjcnlwdG8gaGVhZGVyKQogKi8KdTggKmllZWU4MDIxMV90a2lwX2FkZF9pdih1OCAq cG9zLCBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLCB1NjQgcG4pOwoKLyoqCiAq IGllZWU4MDIxMV9nZXRfa2V5X3J4X3NlcSAtIGdldCBrZXkgUlggc2VxdWVuY2UgY291bnRlcgog KgogKiBAa2V5Y29uZjogdGhlIHBhcmFtZXRlciBwYXNzZWQgd2l0aCB0aGUgc2V0IGtleQogKiBA dGlkOiBUaGUgVElELCBvciAtMSBmb3IgdGhlIG1hbmFnZW1lbnQgZnJhbWUgdmFsdWUgKENDTVAv R0NNUCBvbmx5KTsKICoJdGhlIHZhbHVlIG9uIFRJRCAwIGlzIGFsc28gdXNlZCBmb3Igbm9uLVFv UyBmcmFtZXMuIEZvcgogKglDTUFDLCBvbmx5IFRJRCAwIGlzIHZhbGlkLgogKiBAc2VxOiBidWZm ZXIgdG8gcmVjZWl2ZSB0aGUgc2VxdWVuY2UgZGF0YQogKgogKiBUaGlzIGZ1bmN0aW9uIGFsbG93 cyBhIGRyaXZlciB0byByZXRyaWV2ZSB0aGUgY3VycmVudCBSWCBJVi9QTnMKICogZm9yIHRoZSBn aXZlbiBrZXkuIEl0IG11c3Qgbm90IGJlIGNhbGxlZCBpZiBJViBjaGVja2luZyBpcyBkb25lCiAq IGJ5IHRoZSBkZXZpY2UgYW5kIG5vdCBieSBtYWM4MDIxMS4KICoKICogTm90ZSB0aGF0IHRoaXMg ZnVuY3Rpb24gbWF5IG9ubHkgYmUgY2FsbGVkIHdoZW4gbm8gUlggcHJvY2Vzc2luZwogKiBjYW4g YmUgZG9uZSBjb25jdXJyZW50bHkuCiAqLwp2b2lkIGllZWU4MDIxMV9nZXRfa2V5X3J4X3NlcShz dHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAoJCQkgICAgICBpbnQgdGlkLCBzdHJ1 Y3QgaWVlZTgwMjExX2tleV9zZXEgKnNlcSk7CgovKioKICogaWVlZTgwMjExX3NldF9rZXlfcnhf c2VxIC0gc2V0IGtleSBSWCBzZXF1ZW5jZSBjb3VudGVyCiAqCiAqIEBrZXljb25mOiB0aGUgcGFy YW1ldGVyIHBhc3NlZCB3aXRoIHRoZSBzZXQga2V5CiAqIEB0aWQ6IFRoZSBUSUQsIG9yIC0xIGZv ciB0aGUgbWFuYWdlbWVudCBmcmFtZSB2YWx1ZSAoQ0NNUC9HQ01QIG9ubHkpOwogKgl0aGUgdmFs dWUgb24gVElEIDAgaXMgYWxzbyB1c2VkIGZvciBub24tUW9TIGZyYW1lcy4gRm9yCiAqCUNNQUMs IG9ubHkgVElEIDAgaXMgdmFsaWQuCiAqIEBzZXE6IG5ldyBzZXF1ZW5jZSBkYXRhCiAqCiAqIFRo aXMgZnVuY3Rpb24gYWxsb3dzIGEgZHJpdmVyIHRvIHNldCB0aGUgY3VycmVudCBSWCBJVi9QTnMg Zm9yIHRoZQogKiBnaXZlbiBrZXkuIFRoaXMgaXMgdXNlZnVsIHdoZW4gcmVzdW1pbmcgZnJvbSBX b1dMQU4gc2xlZXAgYW5kIEdUSwogKiByZWtleSBtYXkgaGF2ZSBiZWVuIGRvbmUgd2hpbGUgc3Vz cGVuZGVkLiBJdCBzaG91bGQgbm90IGJlIGNhbGxlZAogKiBpZiBJViBjaGVja2luZyBpcyBkb25l IGJ5IHRoZSBkZXZpY2UgYW5kIG5vdCBieSBtYWM4MDIxMS4KICoKICogTm90ZSB0aGF0IHRoaXMg ZnVuY3Rpb24gbWF5IG9ubHkgYmUgY2FsbGVkIHdoZW4gbm8gUlggcHJvY2Vzc2luZwogKiBjYW4g YmUgZG9uZSBjb25jdXJyZW50bHkuCiAqLwp2b2lkIGllZWU4MDIxMV9zZXRfa2V5X3J4X3NlcShz dHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAoJCQkgICAgICBpbnQgdGlkLCBzdHJ1 Y3QgaWVlZTgwMjExX2tleV9zZXEgKnNlcSk7CgovKioKICogaWVlZTgwMjExX3JlbW92ZV9rZXkg LSByZW1vdmUgdGhlIGdpdmVuIGtleQogKiBAa2V5Y29uZjogdGhlIHBhcmFtZXRlciBwYXNzZWQg d2l0aCB0aGUgc2V0IGtleQogKgogKiBSZW1vdmUgdGhlIGdpdmVuIGtleS4gSWYgdGhlIGtleSB3 YXMgdXBsb2FkZWQgdG8gdGhlIGhhcmR3YXJlIGF0IHRoZQogKiB0aW1lIHRoaXMgZnVuY3Rpb24g aXMgY2FsbGVkLCBpdCBpcyBub3QgZGVsZXRlZCBpbiB0aGUgaGFyZHdhcmUgYnV0CiAqIGluc3Rl YWQgYXNzdW1lZCB0byBoYXZlIGJlZW4gcmVtb3ZlZCBhbHJlYWR5LgogKgogKiBOb3RlIHRoYXQg ZHVlIHRvIGxvY2tpbmcgY29uc2lkZXJhdGlvbnMgdGhpcyBmdW5jdGlvbiBjYW4gKGN1cnJlbnRs eSkKICogb25seSBiZSBjYWxsZWQgZHVyaW5nIGtleSBpdGVyYXRpb24gKGllZWU4MDIxMV9pdGVy X2tleXMoKS4pCiAqLwp2b2lkIGllZWU4MDIxMV9yZW1vdmVfa2V5KHN0cnVjdCBpZWVlODAyMTFf a2V5X2NvbmYgKmtleWNvbmYpOwoKLyoqCiAqIGllZWU4MDIxMV9ndGtfcmVrZXlfYWRkIC0gYWRk IGEgR1RLIGtleSBmcm9tIHJla2V5aW5nIGR1cmluZyBXb1dMQU4KICogQHZpZjogdGhlIHZpcnR1 YWwgaW50ZXJmYWNlIHRvIGFkZCB0aGUga2V5IG9uCiAqIEBrZXljb25mOiBuZXcga2V5IGRhdGEK ICoKICogV2hlbiBHVEsgcmVrZXlpbmcgd2FzIGRvbmUgd2hpbGUgdGhlIHN5c3RlbSB3YXMgc3Vz cGVuZGVkLCAoYSkgbmV3CiAqIGtleShzKSB3aWxsIGJlIGF2YWlsYWJsZS4gVGhlc2Ugd2lsbCBi ZSBuZWVkZWQgYnkgbWFjODAyMTEgZm9yIHByb3BlcgogKiBSWCBwcm9jZXNzaW5nLCBzbyB0aGlz IGZ1bmN0aW9uIGFsbG93cyBzZXR0aW5nIHRoZW0uCiAqCiAqIFRoZSBmdW5jdGlvbiByZXR1cm5z IHRoZSBuZXdseSBhbGxvY2F0ZWQga2V5IHN0cnVjdHVyZSwgd2hpY2ggd2lsbAogKiBoYXZlIHNp bWlsYXIgY29udGVudHMgdG8gdGhlIHBhc3NlZCBrZXkgY29uZmlndXJhdGlvbiBidXQgcG9pbnQg dG8KICogbWFjODAyMTEtb3duZWQgbWVtb3J5LiBJbiBjYXNlIG9mIGVycm9ycywgdGhlIGZ1bmN0 aW9uIHJldHVybnMgYW4KICogRVJSX1BUUigpLCB1c2UgSVNfRVJSKCkgZXRjLgogKgogKiBOb3Rl IHRoYXQgdGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoZSBrZXkgaXNuJ3QgYWRkZWQgdG8gaGFyZHdh cmUKICogYWNjZWxlcmF0aW9uLCBzbyBubyBUWCB3aWxsIGJlIGRvbmUgd2l0aCB0aGUga2V5LiBT aW5jZSBpdCdzIGEgR1RLCiAqIG9uIG1hbmFnZWQgKHN0YXRpb24pIG5ldHdvcmtzLCB0aGlzIGlz IHRydWUgYW55d2F5LiBJZiB0aGUgZHJpdmVyCiAqIGNhbGxzIHRoaXMgZnVuY3Rpb24gZnJvbSB0 aGUgcmVzdW1lIGNhbGxiYWNrIGFuZCBzdWJzZXF1ZW50bHkgdXNlcwogKiB0aGUgcmV0dXJuIGNv ZGUgMSB0byByZWNvbmZpZ3VyZSB0aGUgZGV2aWNlLCB0aGlzIGtleSB3aWxsIGJlIHBhcnQKICog b2YgdGhlIHJlY29uZmlndXJhdGlvbi4KICoKICogTm90ZSB0aGF0IHRoZSBkcml2ZXIgc2hvdWxk IGFsc28gY2FsbCBpZWVlODAyMTFfc2V0X2tleV9yeF9zZXEoKQogKiBmb3IgdGhlIG5ldyBrZXkg Zm9yIGVhY2ggVElEIHRvIHNldCB1cCBzZXF1ZW5jZSBjb3VudGVycyBwcm9wZXJseS4KICoKICog SU1QT1JUQU5UOiBJZiB0aGlzIHJlcGxhY2VzIGEga2V5IHRoYXQgaXMgcHJlc2VudCBpbiB0aGUg aGFyZHdhcmUsCiAqIHRoZW4gaXQgd2lsbCBhdHRlbXB0IHRvIHJlbW92ZSBpdCBkdXJpbmcgdGhp cyBjYWxsLiBJbiBtYW55IGNhc2VzCiAqIHRoaXMgaXNuJ3Qgd2hhdCB5b3Ugd2FudCwgc28gY2Fs bCBpZWVlODAyMTFfcmVtb3ZlX2tleSgpIGZpcnN0IGZvcgogKiB0aGUga2V5IHRoYXQncyBiZWlu ZyByZXBsYWNlZC4KICovCnN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKgppZWVlODAyMTFfZ3Rr X3Jla2V5X2FkZChzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAoJCQlzdHJ1Y3QgaWVlZTgwMjEx X2tleV9jb25mICprZXljb25mKTsKCi8qKgogKiBpZWVlODAyMTFfZ3RrX3Jla2V5X25vdGlmeSAt IG5vdGlmeSB1c2Vyc3BhY2Ugc3VwcGxpY2FudCBvZiByZWtleWluZwogKiBAdmlmOiB2aXJ0dWFs IGludGVyZmFjZSB0aGUgcmVrZXlpbmcgd2FzIGRvbmUgb24KICogQGJzc2lkOiBUaGUgQlNTSUQg b2YgdGhlIEFQLCBmb3IgY2hlY2tpbmcgYXNzb2NpYXRpb24KICogQHJlcGxheV9jdHI6IHRoZSBu ZXcgcmVwbGF5IGNvdW50ZXIgYWZ0ZXIgR1RLIHJla2V5aW5nCiAqIEBnZnA6IGFsbG9jYXRpb24g ZmxhZ3MKICovCnZvaWQgaWVlZTgwMjExX2d0a19yZWtleV9ub3RpZnkoc3RydWN0IGllZWU4MDIx MV92aWYgKnZpZiwgY29uc3QgdTggKmJzc2lkLAoJCQkJY29uc3QgdTggKnJlcGxheV9jdHIsIGdm cF90IGdmcCk7CgovKioKICogaWVlZTgwMjExX3dha2VfcXVldWUgLSB3YWtlIHNwZWNpZmljIHF1 ZXVlCiAqIEBodzogcG9pbnRlciBhcyBvYnRhaW5lZCBmcm9tIGllZWU4MDIxMV9hbGxvY19odygp LgogKiBAcXVldWU6IHF1ZXVlIG51bWJlciAoY291bnRlZCBmcm9tIHplcm8pLgogKgogKiBEcml2 ZXJzIHNob3VsZCB1c2UgdGhpcyBmdW5jdGlvbiBpbnN0ZWFkIG9mIG5ldGlmX3dha2VfcXVldWUu CiAqLwp2b2lkIGllZWU4MDIxMV93YWtlX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBp bnQgcXVldWUpOwoKLyoqCiAqIGllZWU4MDIxMV9zdG9wX3F1ZXVlIC0gc3RvcCBzcGVjaWZpYyBx dWV1ZQogKiBAaHc6IHBvaW50ZXIgYXMgb2J0YWluZWQgZnJvbSBpZWVlODAyMTFfYWxsb2NfaHco KS4KICogQHF1ZXVlOiBxdWV1ZSBudW1iZXIgKGNvdW50ZWQgZnJvbSB6ZXJvKS4KICoKICogRHJp dmVycyBzaG91bGQgdXNlIHRoaXMgZnVuY3Rpb24gaW5zdGVhZCBvZiBuZXRpZl9zdG9wX3F1ZXVl LgogKi8Kdm9pZCBpZWVlODAyMTFfc3RvcF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywg aW50IHF1ZXVlKTsKCi8qKgogKiBpZWVlODAyMTFfcXVldWVfc3RvcHBlZCAtIHRlc3Qgc3RhdHVz IG9mIHRoZSBxdWV1ZQogKiBAaHc6IHBvaW50ZXIgYXMgb2J0YWluZWQgZnJvbSBpZWVlODAyMTFf YWxsb2NfaHcoKS4KICogQHF1ZXVlOiBxdWV1ZSBudW1iZXIgKGNvdW50ZWQgZnJvbSB6ZXJvKS4K ICoKICogRHJpdmVycyBzaG91bGQgdXNlIHRoaXMgZnVuY3Rpb24gaW5zdGVhZCBvZiBuZXRpZl9z dG9wX3F1ZXVlLgogKgogKiBSZXR1cm46ICV0cnVlIGlmIHRoZSBxdWV1ZSBpcyBzdG9wcGVkLiAl ZmFsc2Ugb3RoZXJ3aXNlLgogKi8KCmludCBpZWVlODAyMTFfcXVldWVfc3RvcHBlZChzdHJ1Y3Qg aWVlZTgwMjExX2h3ICpodywgaW50IHF1ZXVlKTsKCi8qKgogKiBpZWVlODAyMTFfc3RvcF9xdWV1 ZXMgLSBzdG9wIGFsbCBxdWV1ZXMKICogQGh3OiBwb2ludGVyIGFzIG9idGFpbmVkIGZyb20gaWVl ZTgwMjExX2FsbG9jX2h3KCkuCiAqCiAqIERyaXZlcnMgc2hvdWxkIHVzZSB0aGlzIGZ1bmN0aW9u IGluc3RlYWQgb2YgbmV0aWZfc3RvcF9xdWV1ZS4KICovCnZvaWQgaWVlZTgwMjExX3N0b3BfcXVl dWVzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKCi8qKgogKiBpZWVlODAyMTFfd2FrZV9xdWV1 ZXMgLSB3YWtlIGFsbCBxdWV1ZXMKICogQGh3OiBwb2ludGVyIGFzIG9idGFpbmVkIGZyb20gaWVl ZTgwMjExX2FsbG9jX2h3KCkuCiAqCiAqIERyaXZlcnMgc2hvdWxkIHVzZSB0aGlzIGZ1bmN0aW9u IGluc3RlYWQgb2YgbmV0aWZfd2FrZV9xdWV1ZS4KICovCnZvaWQgaWVlZTgwMjExX3dha2VfcXVl dWVzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKCi8qKgogKiBpZWVlODAyMTFfc2Nhbl9jb21w bGV0ZWQgLSBjb21wbGV0ZWQgaGFyZHdhcmUgc2NhbgogKgogKiBXaGVuIGhhcmR3YXJlIHNjYW4g b2ZmbG9hZCBpcyB1c2VkIChpLmUuIHRoZSBod19zY2FuKCkgY2FsbGJhY2sgaXMKICogYXNzaWdu ZWQpIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgY2FsbGVkIGJ5IHRoZSBkcml2ZXIgdG8gbm90 aWZ5CiAqIG1hYzgwMjExIHRoYXQgdGhlIHNjYW4gZmluaXNoZWQuIFRoaXMgZnVuY3Rpb24gY2Fu IGJlIGNhbGxlZCBmcm9tCiAqIGFueSBjb250ZXh0LCBpbmNsdWRpbmcgaGFyZGlycSBjb250ZXh0 LgogKgogKiBAaHc6IHRoZSBoYXJkd2FyZSB0aGF0IGZpbmlzaGVkIHRoZSBzY2FuCiAqIEBpbmZv OiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGxldGVkIHNjYW4KICovCnZvaWQgaWVlZTgwMjEx X3NjYW5fY29tcGxldGVkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkgICAgICBzdHJ1Y3Qg Y2ZnODAyMTFfc2Nhbl9pbmZvICppbmZvKTsKCi8qKgogKiBpZWVlODAyMTFfc2NoZWRfc2Nhbl9y ZXN1bHRzIC0gZ290IHJlc3VsdHMgZnJvbSBzY2hlZHVsZWQgc2NhbgogKgogKiBXaGVuIGEgc2No ZWR1bGVkIHNjYW4gaXMgcnVubmluZywgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSBjYWxsZWQg YnkgdGhlCiAqIGRyaXZlciB3aGVuZXZlciB0aGVyZSBhcmUgbmV3IHNjYW4gcmVzdWx0cyBhdmFp bGFibGUuCiAqCiAqIEBodzogdGhlIGhhcmR3YXJlIHRoYXQgaXMgcGVyZm9ybWluZyBzY2hlZHVs ZWQgc2NhbnMKICovCnZvaWQgaWVlZTgwMjExX3NjaGVkX3NjYW5fcmVzdWx0cyhzdHJ1Y3QgaWVl ZTgwMjExX2h3ICpodyk7CgovKioKICogaWVlZTgwMjExX3NjaGVkX3NjYW5fc3RvcHBlZCAtIGlu Zm9ybSB0aGF0IHRoZSBzY2hlZHVsZWQgc2NhbiBoYXMgc3RvcHBlZAogKgogKiBXaGVuIGEgc2No ZWR1bGVkIHNjYW4gaXMgcnVubmluZywgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGJ5CiAq IHRoZSBkcml2ZXIgaWYgaXQgbmVlZHMgdG8gc3RvcCB0aGUgc2NhbiB0byBwZXJmb3JtIGFub3Ro ZXIgdGFzay4KICogVXN1YWwgc2NlbmFyaW9zIGFyZSBkcml2ZXJzIHRoYXQgY2Fubm90IGNvbnRp bnVlIHRoZSBzY2hlZHVsZWQgc2NhbgogKiB3aGlsZSBhc3NvY2lhdGluZywgZm9yIGluc3RhbmNl LgogKgogKiBAaHc6IHRoZSBoYXJkd2FyZSB0aGF0IGlzIHBlcmZvcm1pbmcgc2NoZWR1bGVkIHNj YW5zCiAqLwp2b2lkIGllZWU4MDIxMV9zY2hlZF9zY2FuX3N0b3BwZWQoc3RydWN0IGllZWU4MDIx MV9odyAqaHcpOwoKLyoqCiAqIGVudW0gaWVlZTgwMjExX2ludGVyZmFjZV9pdGVyYXRpb25fZmxh Z3MgLSBpbnRlcmZhY2UgaXRlcmF0aW9uIGZsYWdzCiAqIEBJRUVFODAyMTFfSUZBQ0VfSVRFUl9O T1JNQUw6IEl0ZXJhdGUgb3ZlciBhbGwgaW50ZXJmYWNlcyB0aGF0IGhhdmUKICoJYmVlbiBhZGRl ZCB0byB0aGUgZHJpdmVyOyBIb3dldmVyLCBub3RlIHRoYXQgZHVyaW5nIGhhcmR3YXJlCiAqCXJl Y29uZmlndXJhdGlvbiAoYWZ0ZXIgcmVzdGFydF9odykgaXQgd2lsbCBpdGVyYXRlIG92ZXIgYSBu ZXcKICoJaW50ZXJmYWNlIGFuZCBvdmVyIGFsbCB0aGUgZXhpc3RpbmcgaW50ZXJmYWNlcyBldmVu IGlmIHRoZXkKICoJaGF2ZW4ndCBiZWVuIHJlLWFkZGVkIHRvIHRoZSBkcml2ZXIgeWV0LgogKiBA SUVFRTgwMjExX0lGQUNFX0lURVJfUkVTVU1FX0FMTDogRHVyaW5nIHJlc3VtZSwgaXRlcmF0ZSBv dmVyIGFsbAogKglpbnRlcmZhY2VzLCBldmVuIGlmIHRoZXkgaGF2ZW4ndCBiZWVuIHJlLWFkZGVk IHRvIHRoZSBkcml2ZXIgeWV0LgogKiBASUVFRTgwMjExX0lGQUNFX0lURVJfQUNUSVZFOiBJdGVy YXRlIG9ubHkgYWN0aXZlIGludGVyZmFjZXMgKG5ldGRldiBpcyB1cCkuCiAqLwplbnVtIGllZWU4 MDIxMV9pbnRlcmZhY2VfaXRlcmF0aW9uX2ZsYWdzIHsKCUlFRUU4MDIxMV9JRkFDRV9JVEVSX05P Uk1BTAk9IDAsCglJRUVFODAyMTFfSUZBQ0VfSVRFUl9SRVNVTUVfQUxMCT0gQklUKDApLAoJSUVF RTgwMjExX0lGQUNFX0lURVJfQUNUSVZFCT0gQklUKDEpLAp9OwoKLyoqCiAqIGllZWU4MDIxMV9p dGVyYXRlX2ludGVyZmFjZXMgLSBpdGVyYXRlIGludGVyZmFjZXMKICoKICogVGhpcyBmdW5jdGlv biBpdGVyYXRlcyBvdmVyIHRoZSBpbnRlcmZhY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuCiAq IGhhcmR3YXJlIGFuZCBjYWxscyB0aGUgY2FsbGJhY2sgZm9yIHRoZW0uIFRoaXMgaW5jbHVkZXMg YWN0aXZlIGFzIHdlbGwgYXMKICogaW5hY3RpdmUgaW50ZXJmYWNlcy4gVGhpcyBmdW5jdGlvbiBh bGxvd3MgdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIHRvIHNsZWVwLgogKiBXaWxsIGl0ZXJhdGUgb3Zl ciBhIG5ldyBpbnRlcmZhY2UgZHVyaW5nIGFkZF9pbnRlcmZhY2UoKS4KICoKICogQGh3OiB0aGUg aGFyZHdhcmUgc3RydWN0IG9mIHdoaWNoIHRoZSBpbnRlcmZhY2VzIHNob3VsZCBiZSBpdGVyYXRl ZCBvdmVyCiAqIEBpdGVyX2ZsYWdzOiBpdGVyYXRpb24gZmxhZ3MsIHNlZSAmZW51bSBpZWVlODAy MTFfaW50ZXJmYWNlX2l0ZXJhdGlvbl9mbGFncwogKiBAaXRlcmF0b3I6IHRoZSBpdGVyYXRvciBm dW5jdGlvbiB0byBjYWxsCiAqIEBkYXRhOiBmaXJzdCBhcmd1bWVudCBvZiB0aGUgaXRlcmF0b3Ig ZnVuY3Rpb24KICovCnZvaWQgaWVlZTgwMjExX2l0ZXJhdGVfaW50ZXJmYWNlcyhzdHJ1Y3QgaWVl ZTgwMjExX2h3ICpodywgdTMyIGl0ZXJfZmxhZ3MsCgkJCQkgIHZvaWQgKCppdGVyYXRvcikodm9p ZCAqZGF0YSwgdTggKm1hYywKCQkJCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiksCgkJ CQkgIHZvaWQgKmRhdGEpOwoKLyoqCiAqIGllZWU4MDIxMV9pdGVyYXRlX2FjdGl2ZV9pbnRlcmZh Y2VzIC0gaXRlcmF0ZSBhY3RpdmUgaW50ZXJmYWNlcwogKgogKiBUaGlzIGZ1bmN0aW9uIGl0ZXJh dGVzIG92ZXIgdGhlIGludGVyZmFjZXMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4KICogaGFyZHdh cmUgdGhhdCBhcmUgY3VycmVudGx5IGFjdGl2ZSBhbmQgY2FsbHMgdGhlIGNhbGxiYWNrIGZvciB0 aGVtLgogKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gdG8gc2xl ZXAsIHdoZW4gdGhlIGl0ZXJhdG9yCiAqIGZ1bmN0aW9uIGlzIGF0b21pYyBAaWVlZTgwMjExX2l0 ZXJhdGVfYWN0aXZlX2ludGVyZmFjZXNfYXRvbWljIGNhbgogKiBiZSB1c2VkLgogKiBEb2VzIG5v dCBpdGVyYXRlIG92ZXIgYSBuZXcgaW50ZXJmYWNlIGR1cmluZyBhZGRfaW50ZXJmYWNlKCkuCiAq CiAqIEBodzogdGhlIGhhcmR3YXJlIHN0cnVjdCBvZiB3aGljaCB0aGUgaW50ZXJmYWNlcyBzaG91 bGQgYmUgaXRlcmF0ZWQgb3ZlcgogKiBAaXRlcl9mbGFnczogaXRlcmF0aW9uIGZsYWdzLCBzZWUg JmVudW0gaWVlZTgwMjExX2ludGVyZmFjZV9pdGVyYXRpb25fZmxhZ3MKICogQGl0ZXJhdG9yOiB0 aGUgaXRlcmF0b3IgZnVuY3Rpb24gdG8gY2FsbAogKiBAZGF0YTogZmlyc3QgYXJndW1lbnQgb2Yg dGhlIGl0ZXJhdG9yIGZ1bmN0aW9uCiAqLwpzdGF0aWMgaW5saW5lIHZvaWQKaWVlZTgwMjExX2l0 ZXJhdGVfYWN0aXZlX2ludGVyZmFjZXMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBpdGVy X2ZsYWdzLAoJCQkJICAgIHZvaWQgKCppdGVyYXRvcikodm9pZCAqZGF0YSwgdTggKm1hYywKCQkJ CQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKSwKCQkJCSAgICB2b2lkICpkYXRhKQp7 CglpZWVlODAyMTFfaXRlcmF0ZV9pbnRlcmZhY2VzKGh3LAoJCQkJICAgICBpdGVyX2ZsYWdzIHwg SUVFRTgwMjExX0lGQUNFX0lURVJfQUNUSVZFLAoJCQkJICAgICBpdGVyYXRvciwgZGF0YSk7Cn0K Ci8qKgogKiBpZWVlODAyMTFfaXRlcmF0ZV9hY3RpdmVfaW50ZXJmYWNlc19hdG9taWMgLSBpdGVy YXRlIGFjdGl2ZSBpbnRlcmZhY2VzCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXRlcmF0ZXMgb3ZlciB0 aGUgaW50ZXJmYWNlcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbgogKiBoYXJkd2FyZSB0aGF0IGFy ZSBjdXJyZW50bHkgYWN0aXZlIGFuZCBjYWxscyB0aGUgY2FsbGJhY2sgZm9yIHRoZW0uCiAqIFRo aXMgZnVuY3Rpb24gcmVxdWlyZXMgdGhlIGl0ZXJhdG9yIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJl IGF0b21pYywKICogaWYgdGhhdCBpcyBub3QgZGVzaXJlZCwgdXNlIEBpZWVlODAyMTFfaXRlcmF0 ZV9hY3RpdmVfaW50ZXJmYWNlcyBpbnN0ZWFkLgogKiBEb2VzIG5vdCBpdGVyYXRlIG92ZXIgYSBu ZXcgaW50ZXJmYWNlIGR1cmluZyBhZGRfaW50ZXJmYWNlKCkuCiAqCiAqIEBodzogdGhlIGhhcmR3 YXJlIHN0cnVjdCBvZiB3aGljaCB0aGUgaW50ZXJmYWNlcyBzaG91bGQgYmUgaXRlcmF0ZWQgb3Zl cgogKiBAaXRlcl9mbGFnczogaXRlcmF0aW9uIGZsYWdzLCBzZWUgJmVudW0gaWVlZTgwMjExX2lu dGVyZmFjZV9pdGVyYXRpb25fZmxhZ3MKICogQGl0ZXJhdG9yOiB0aGUgaXRlcmF0b3IgZnVuY3Rp b24gdG8gY2FsbCwgY2Fubm90IHNsZWVwCiAqIEBkYXRhOiBmaXJzdCBhcmd1bWVudCBvZiB0aGUg aXRlcmF0b3IgZnVuY3Rpb24KICovCnZvaWQgaWVlZTgwMjExX2l0ZXJhdGVfYWN0aXZlX2ludGVy ZmFjZXNfYXRvbWljKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkJCQl1MzIgaXRlcl9mbGFn cywKCQkJCQkJdm9pZCAoKml0ZXJhdG9yKSh2b2lkICpkYXRhLAoJCQkJCQkgICAgdTggKm1hYywK CQkJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpLAoJCQkJCQl2b2lkICpkYXRhKTsK Ci8qKgogKiBpZWVlODAyMTFfaXRlcmF0ZV9hY3RpdmVfaW50ZXJmYWNlc19ydG5sIC0gaXRlcmF0 ZSBhY3RpdmUgaW50ZXJmYWNlcwogKgogKiBUaGlzIGZ1bmN0aW9uIGl0ZXJhdGVzIG92ZXIgdGhl IGludGVyZmFjZXMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4KICogaGFyZHdhcmUgdGhhdCBhcmUg Y3VycmVudGx5IGFjdGl2ZSBhbmQgY2FsbHMgdGhlIGNhbGxiYWNrIGZvciB0aGVtLgogKiBUaGlz IHZlcnNpb24gY2FuIG9ubHkgYmUgdXNlZCB3aGlsZSBob2xkaW5nIHRoZSBSVE5MLgogKgogKiBA aHc6IHRoZSBoYXJkd2FyZSBzdHJ1Y3Qgb2Ygd2hpY2ggdGhlIGludGVyZmFjZXMgc2hvdWxkIGJl IGl0ZXJhdGVkIG92ZXIKICogQGl0ZXJfZmxhZ3M6IGl0ZXJhdGlvbiBmbGFncywgc2VlICZlbnVt IGllZWU4MDIxMV9pbnRlcmZhY2VfaXRlcmF0aW9uX2ZsYWdzCiAqIEBpdGVyYXRvcjogdGhlIGl0 ZXJhdG9yIGZ1bmN0aW9uIHRvIGNhbGwsIGNhbm5vdCBzbGVlcAogKiBAZGF0YTogZmlyc3QgYXJn dW1lbnQgb2YgdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uCiAqLwp2b2lkIGllZWU4MDIxMV9pdGVyYXRl X2FjdGl2ZV9pbnRlcmZhY2VzX3J0bmwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCgkJCQkJICAg ICAgdTMyIGl0ZXJfZmxhZ3MsCgkJCQkJICAgICAgdm9pZCAoKml0ZXJhdG9yKSh2b2lkICpkYXRh LAoJCQkJCQl1OCAqbWFjLAoJCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKSwKCQkJCQkg ICAgICB2b2lkICpkYXRhKTsKCi8qKgogKiBpZWVlODAyMTFfaXRlcmF0ZV9zdGF0aW9uc19hdG9t aWMgLSBpdGVyYXRlIHN0YXRpb25zCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXRlcmF0ZXMgb3ZlciBh bGwgc3RhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4KICogaGFyZHdhcmUgdGhhdCBhcmUg Y3VycmVudGx5IHVwbG9hZGVkIHRvIHRoZSBkcml2ZXIgYW5kIGNhbGxzIHRoZSBjYWxsYmFjawog KiBmdW5jdGlvbiBmb3IgdGhlbS4KICogVGhpcyBmdW5jdGlvbiByZXF1aXJlcyB0aGUgaXRlcmF0 b3IgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgYXRvbWljLAogKgogKiBAaHc6IHRoZSBoYXJkd2Fy ZSBzdHJ1Y3Qgb2Ygd2hpY2ggdGhlIGludGVyZmFjZXMgc2hvdWxkIGJlIGl0ZXJhdGVkIG92ZXIK ICogQGl0ZXJhdG9yOiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gdG8gY2FsbCwgY2Fubm90IHNsZWVw CiAqIEBkYXRhOiBmaXJzdCBhcmd1bWVudCBvZiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24KICovCnZv aWQgaWVlZTgwMjExX2l0ZXJhdGVfc3RhdGlvbnNfYXRvbWljKHN0cnVjdCBpZWVlODAyMTFfaHcg Kmh3LAoJCQkJICAgICAgIHZvaWQgKCppdGVyYXRvcikodm9pZCAqZGF0YSwKCQkJCQkJc3RydWN0 IGllZWU4MDIxMV9zdGEgKnN0YSksCgkJCQkgICAgICAgdm9pZCAqZGF0YSk7Ci8qKgogKiBpZWVl ODAyMTFfcXVldWVfd29yayAtIGFkZCB3b3JrIG9udG8gdGhlIG1hYzgwMjExIHdvcmtxdWV1ZQog KgogKiBEcml2ZXJzIGFuZCBtYWM4MDIxMSB1c2UgdGhpcyB0byBhZGQgd29yayBvbnRvIHRoZSBt YWM4MDIxMSB3b3JrcXVldWUuCiAqIFRoaXMgaGVscGVyIGVuc3VyZXMgZHJpdmVycyBhcmUgbm90 IHF1ZXVlaW5nIHdvcmsgd2hlbiB0aGV5IHNob3VsZCBub3QgYmUuCiAqCiAqIEBodzogdGhlIGhh cmR3YXJlIHN0cnVjdCBmb3IgdGhlIGludGVyZmFjZSB3ZSBhcmUgYWRkaW5nIHdvcmsgZm9yCiAq IEB3b3JrOiB0aGUgd29yayB3ZSB3YW50IHRvIGFkZCBvbnRvIHRoZSBtYWM4MDIxMSB3b3JrcXVl dWUKICovCnZvaWQgaWVlZTgwMjExX3F1ZXVlX3dvcmsoc3RydWN0IGllZWU4MDIxMV9odyAqaHcs IHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CgovKioKICogaWVlZTgwMjExX3F1ZXVlX2RlbGF5 ZWRfd29yayAtIGFkZCB3b3JrIG9udG8gdGhlIG1hYzgwMjExIHdvcmtxdWV1ZQogKgogKiBEcml2 ZXJzIGFuZCBtYWM4MDIxMSB1c2UgdGhpcyB0byBxdWV1ZSBkZWxheWVkIHdvcmsgb250byB0aGUg bWFjODAyMTEKICogd29ya3F1ZXVlLgogKgogKiBAaHc6IHRoZSBoYXJkd2FyZSBzdHJ1Y3QgZm9y IHRoZSBpbnRlcmZhY2Ugd2UgYXJlIGFkZGluZyB3b3JrIGZvcgogKiBAZHdvcms6IGRlbGF5YWJs ZSB3b3JrIHRvIHF1ZXVlIG9udG8gdGhlIG1hYzgwMjExIHdvcmtxdWV1ZQogKiBAZGVsYXk6IG51 bWJlciBvZiBqaWZmaWVzIHRvIHdhaXQgYmVmb3JlIHF1ZXVlaW5nCiAqLwp2b2lkIGllZWU4MDIx MV9xdWV1ZV9kZWxheWVkX3dvcmsoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCgkJCQkgIHN0cnVj dCBkZWxheWVkX3dvcmsgKmR3b3JrLAoJCQkJICB1bnNpZ25lZCBsb25nIGRlbGF5KTsKCi8qKgog KiBpZWVlODAyMTFfc3RhcnRfdHhfYmFfc2Vzc2lvbiAtIFN0YXJ0IGEgdHggQmxvY2sgQWNrIHNl c3Npb24uCiAqIEBzdGE6IHRoZSBzdGF0aW9uIGZvciB3aGljaCB0byBzdGFydCBhIEJBIHNlc3Np b24KICogQHRpZDogdGhlIFRJRCB0byBCQSBvbi4KICogQHRpbWVvdXQ6IHNlc3Npb24gdGltZW91 dCB2YWx1ZSAoaW4gVFVzKQogKgogKiBSZXR1cm46IHN1Y2Nlc3MgaWYgYWRkQkEgcmVxdWVzdCB3 YXMgc2VudCwgZmFpbHVyZSBvdGhlcndpc2UKICoKICogQWx0aG91Z2ggbWFjODAyMTEvbG93IGxl dmVsIGRyaXZlci91c2VyIHNwYWNlIGFwcGxpY2F0aW9uIGNhbiBlc3RpbWF0ZQogKiB0aGUgbmVl ZCB0byBzdGFydCBhZ2dyZWdhdGlvbiBvbiBhIGNlcnRhaW4gUkEvVElELCB0aGUgc2Vzc2lvbiBs ZXZlbAogKiB3aWxsIGJlIG1hbmFnZWQgYnkgdGhlIG1hYzgwMjExLgogKi8KaW50IGllZWU4MDIx MV9zdGFydF90eF9iYV9zZXNzaW9uKHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQs CgkJCQkgIHUxNiB0aW1lb3V0KTsKCi8qKgogKiBpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2JfaXJx c2FmZSAtIGxvdyBsZXZlbCBkcml2ZXIgcmVhZHkgdG8gYWdncmVnYXRlLgogKiBAdmlmOiAmc3Ry dWN0IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNlIGNhbGxiYWNr CiAqIEByYTogcmVjZWl2ZXIgYWRkcmVzcyBvZiB0aGUgQkEgc2Vzc2lvbiByZWNpcGllbnQuCiAq IEB0aWQ6IHRoZSBUSUQgdG8gQkEgb24uCiAqCiAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxs ZWQgYnkgbG93IGxldmVsIGRyaXZlciBvbmNlIGl0IGhhcwogKiBmaW5pc2hlZCB3aXRoIHByZXBh cmF0aW9ucyBmb3IgdGhlIEJBIHNlc3Npb24uIEl0IGNhbiBiZSBjYWxsZWQKICogZnJvbSBhbnkg Y29udGV4dC4KICovCnZvaWQgaWVlZTgwMjExX3N0YXJ0X3R4X2JhX2NiX2lycXNhZmUoc3RydWN0 IGllZWU4MDIxMV92aWYgKnZpZiwgY29uc3QgdTggKnJhLAoJCQkJICAgICAgdTE2IHRpZCk7Cgov KioKICogaWVlZTgwMjExX3N0b3BfdHhfYmFfc2Vzc2lvbiAtIFN0b3AgYSBCbG9jayBBY2sgc2Vz c2lvbi4KICogQHN0YTogdGhlIHN0YXRpb24gd2hvc2UgQkEgc2Vzc2lvbiB0byBzdG9wCiAqIEB0 aWQ6IHRoZSBUSUQgdG8gc3RvcCBCQS4KICoKICogUmV0dXJuOiBuZWdhdGl2ZSBlcnJvciBpZiB0 aGUgVElEIGlzIGludmFsaWQsIG9yIG5vIGFnZ3JlZ2F0aW9uIGFjdGl2ZQogKgogKiBBbHRob3Vn aCBtYWM4MDIxMS9sb3cgbGV2ZWwgZHJpdmVyL3VzZXIgc3BhY2UgYXBwbGljYXRpb24gY2FuIGVz dGltYXRlCiAqIHRoZSBuZWVkIHRvIHN0b3AgYWdncmVnYXRpb24gb24gYSBjZXJ0YWluIFJBL1RJ RCwgdGhlIHNlc3Npb24gbGV2ZWwKICogd2lsbCBiZSBtYW5hZ2VkIGJ5IHRoZSBtYWM4MDIxMS4K ICovCmludCBpZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKHN0cnVjdCBpZWVlODAyMTFfc3Rh ICpzdGEsIHUxNiB0aWQpOwoKLyoqCiAqIGllZWU4MDIxMV9zdG9wX3R4X2JhX2NiX2lycXNhZmUg LSBsb3cgbGV2ZWwgZHJpdmVyIHJlYWR5IHRvIHN0b3AgYWdncmVnYXRlLgogKiBAdmlmOiAmc3Ry dWN0IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNlIGNhbGxiYWNr CiAqIEByYTogcmVjZWl2ZXIgYWRkcmVzcyBvZiB0aGUgQkEgc2Vzc2lvbiByZWNpcGllbnQuCiAq IEB0aWQ6IHRoZSBkZXNpcmVkIFRJRCB0byBCQSBvbi4KICoKICogVGhpcyBmdW5jdGlvbiBtdXN0 IGJlIGNhbGxlZCBieSBsb3cgbGV2ZWwgZHJpdmVyIG9uY2UgaXQgaGFzCiAqIGZpbmlzaGVkIHdp dGggcHJlcGFyYXRpb25zIGZvciB0aGUgQkEgc2Vzc2lvbiB0ZWFyIGRvd24uIEl0CiAqIGNhbiBi ZSBjYWxsZWQgZnJvbSBhbnkgY29udGV4dC4KICovCnZvaWQgaWVlZTgwMjExX3N0b3BfdHhfYmFf Y2JfaXJxc2FmZShzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBjb25zdCB1OCAqcmEsCgkJCQkg ICAgIHUxNiB0aWQpOwoKLyoqCiAqIGllZWU4MDIxMV9maW5kX3N0YSAtIGZpbmQgYSBzdGF0aW9u CiAqCiAqIEB2aWY6IHZpcnR1YWwgaW50ZXJmYWNlIHRvIGxvb2sgZm9yIHN0YXRpb24gb24KICog QGFkZHI6IHN0YXRpb24ncyBhZGRyZXNzCiAqCiAqIFJldHVybjogVGhlIHN0YXRpb24sIGlmIGZv dW5kLiAlTlVMTCBvdGhlcndpc2UuCiAqCiAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBj YWxsZWQgdW5kZXIgUkNVIGxvY2sgYW5kIHRoZQogKiByZXN1bHRpbmcgcG9pbnRlciBpcyBvbmx5 IHZhbGlkIHVuZGVyIFJDVSBsb2NrIGFzIHdlbGwuCiAqLwpzdHJ1Y3QgaWVlZTgwMjExX3N0YSAq aWVlZTgwMjExX2ZpbmRfc3RhKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCgkJCQkJIGNvbnN0 IHU4ICphZGRyKTsKCi8qKgogKiBpZWVlODAyMTFfZmluZF9zdGFfYnlfaWZhZGRyIC0gZmluZCBh IHN0YXRpb24gb24gaGFyZHdhcmUKICoKICogQGh3OiBwb2ludGVyIGFzIG9idGFpbmVkIGZyb20g aWVlZTgwMjExX2FsbG9jX2h3KCkKICogQGFkZHI6IHJlbW90ZSBzdGF0aW9uJ3MgYWRkcmVzcwog KiBAbG9jYWxhZGRyOiBsb2NhbCBhZGRyZXNzICh2aWYtPnNkYXRhLT52aWYuYWRkcikuIFVzZSBO VUxMIGZvciAnYW55Jy4KICoKICogUmV0dXJuOiBUaGUgc3RhdGlvbiwgaWYgZm91bmQuICVOVUxM IG90aGVyd2lzZS4KICoKICogTm90ZTogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB1bmRl ciBSQ1UgbG9jayBhbmQgdGhlCiAqIHJlc3VsdGluZyBwb2ludGVyIGlzIG9ubHkgdmFsaWQgdW5k ZXIgUkNVIGxvY2sgYXMgd2VsbC4KICoKICogTk9URTogWW91IG1heSBwYXNzIE5VTEwgZm9yIGxv Y2FsYWRkciwgYnV0IHRoZW4geW91IHdpbGwganVzdCBnZXQKICogICAgICB0aGUgZmlyc3QgU1RB IHRoYXQgbWF0Y2hlcyB0aGUgcmVtb3RlIGFkZHJlc3MgJ2FkZHInLgogKiAgICAgIFdlIGNhbiBo YXZlIG11bHRpcGxlIFNUQSBhc3NvY2lhdGVkIHdpdGggbXVsdGlwbGUKICogICAgICBsb2dpY2Fs IHN0YXRpb25zIChlLmcuIGNvbnNpZGVyIGEgc3RhdGlvbiBjb25uZWN0aW5nIHRvIGFub3RoZXIK ICogICAgICBCU1NJRCBvbiB0aGUgc2FtZSBBUCBoYXJkd2FyZSB3aXRob3V0IGRpc2Nvbm5lY3Rp bmcgZmlyc3QpLgogKiAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhv ZCB3aXRoIGxvY2FsYWRkciBOVUxMCiAqICAgICAgaXMgbm90IHJlbGlhYmxlLgogKgogKiBETyBO T1QgVVNFIFRISVMgRlVOQ1RJT04gd2l0aCBsb2NhbGFkZHIgTlVMTCBpZiBhdCBhbGwgcG9zc2li bGUuCiAqLwpzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqaWVlZTgwMjExX2ZpbmRfc3RhX2J5X2lmYWRk cihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJCQkgICAgICAgY29uc3QgdTggKmFkZHIsCgkJ CQkJICAgICAgIGNvbnN0IHU4ICpsb2NhbGFkZHIpOwoKLyoqCiAqIGllZWU4MDIxMV9zdGFfYmxv Y2tfYXdha2UgLSBibG9jayBzdGF0aW9uIGZyb20gd2FraW5nIHVwCiAqIEBodzogdGhlIGhhcmR3 YXJlCiAqIEBwdWJzdGE6IHRoZSBzdGF0aW9uCiAqIEBibG9jazogd2hldGhlciB0byBibG9jayBv ciB1bmJsb2NrCiAqCiAqIFNvbWUgZGV2aWNlcyByZXF1aXJlIHRoYXQgYWxsIGZyYW1lcyB0aGF0 IGFyZSBvbiB0aGUgcXVldWVzCiAqIGZvciBhIHNwZWNpZmljIHN0YXRpb24gdGhhdCB3ZW50IHRv IHNsZWVwIGFyZSBmbHVzaGVkIGJlZm9yZQogKiBhIHBvbGwgcmVzcG9uc2Ugb3IgZnJhbWVzIGFm dGVyIHRoZSBzdGF0aW9uIHdva2UgdXAgY2FuIGJlCiAqIGRlbGl2ZXJlZCB0byB0aGF0IGl0LiBO b3RlIHRoYXQgc3VjaCBmcmFtZXMgbXVzdCBiZSByZWplY3RlZAogKiBieSB0aGUgZHJpdmVyIGFz IGZpbHRlcmVkLCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBzdGF0dXMgZmxhZy4KICoKICogVGhpcyBm dW5jdGlvbiBhbGxvd3MgaW1wbGVtZW50aW5nIHRoaXMgbW9kZSBpbiBhIHJhY2UtZnJlZQogKiBt YW5uZXIuCiAqCiAqIFRvIGRvIHRoaXMsIGEgZHJpdmVyIG11c3Qga2VlcCB0cmFjayBvZiB0aGUg bnVtYmVyIG9mIGZyYW1lcwogKiBzdGlsbCBlbnF1ZXVlZCBmb3IgYSBzcGVjaWZpYyBzdGF0aW9u LiBJZiB0aGlzIG51bWJlciBpcyBub3QKICogemVybyB3aGVuIHRoZSBzdGF0aW9uIGdvZXMgdG8g c2xlZXAsIHRoZSBkcml2ZXIgbXVzdCBjYWxsCiAqIHRoaXMgZnVuY3Rpb24gdG8gZm9yY2UgbWFj ODAyMTEgdG8gY29uc2lkZXIgdGhlIHN0YXRpb24gdG8KICogYmUgYXNsZWVwIHJlZ2FyZGxlc3Mg b2YgdGhlIHN0YXRpb24ncyBhY3R1YWwgc3RhdGUuIE9uY2UgdGhlCiAqIG51bWJlciBvZiBvdXRz dGFuZGluZyBmcmFtZXMgcmVhY2hlcyB6ZXJvLCB0aGUgZHJpdmVyIG11c3QKICogY2FsbCB0aGlz IGZ1bmN0aW9uIGFnYWluIHRvIHVuYmxvY2sgdGhlIHN0YXRpb24uIFRoYXQgd2lsbAogKiBjYXVz ZSBtYWM4MDIxMSB0byBiZSBhYmxlIHRvIHNlbmQgcHMtcG9sbCByZXNwb25zZXMsIGFuZCBpZgog KiB0aGUgc3RhdGlvbiBxdWVyaWVkIGluIHRoZSBtZWFudGltZSB0aGVuIGZyYW1lcyB3aWxsIGFs c28KICogYmUgc2VudCBvdXQgYXMgYSByZXN1bHQgb2YgdGhpcy4gQWRkaXRpb25hbGx5LCB0aGUg ZHJpdmVyCiAqIHdpbGwgYmUgbm90aWZpZWQgdGhhdCB0aGUgc3RhdGlvbiB3b2tlIHVwIHNvbWUg dGltZSBhZnRlcgogKiBpdCBpcyB1bmJsb2NrZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUg c3RhdGlvbiBhY3R1YWxseQogKiB3b2tlIHVwIHdoaWxlIGJsb2NrZWQgb3Igbm90LgogKi8Kdm9p ZCBpZWVlODAyMTFfc3RhX2Jsb2NrX2F3YWtlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkg ICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnB1YnN0YSwgYm9vbCBibG9jayk7CgovKioKICog aWVlZTgwMjExX3N0YV9lb3NwIC0gbm90aWZ5IG1hYzgwMjExIGFib3V0IGVuZCBvZiBTUAogKiBA cHVic3RhOiB0aGUgc3RhdGlvbgogKgogKiBXaGVuIGEgZGV2aWNlIHRyYW5zbWl0cyBmcmFtZXMg aW4gYSB3YXkgdGhhdCBpdCBjYW4ndCB0ZWxsCiAqIG1hYzgwMjExIGluIHRoZSBUWCBzdGF0dXMg YWJvdXQgdGhlIEVPU1AsIGl0IG11c3QgY2xlYXIgdGhlCiAqICVJRUVFODAyMTFfVFhfU1RBVFVT X0VPU1AgYml0IGFuZCBjYWxsIHRoaXMgZnVuY3Rpb24gaW5zdGVhZC4KICogVGhpcyBhcHBsaWVz IGZvciBQUy1Qb2xsIGFzIHdlbGwgYXMgdUFQU0QuCiAqCiAqIE5vdGUgdGhhdCBqdXN0IGxpa2Ug d2l0aCBfdHhfc3RhdHVzKCkgYW5kIF9yeCgpIGRyaXZlcnMgbXVzdAogKiBub3QgbWl4IGNhbGxz IHRvIGlycXNhZmUvbm9uLWlycXNhZmUgdmVyc2lvbnMsIHRoaXMgZnVuY3Rpb24KICogbXVzdCBu b3QgYmUgbWl4ZWQgd2l0aCB0aG9zZSBlaXRoZXIuIFVzZSB0aGUgYWxsIGlycXNhZmUsIG9yCiAq IGFsbCBub24taXJxc2FmZSwgZG9uJ3QgbWl4IQogKgogKiBOQjogdGhlIF9pcnFzYWZlIHZlcnNp b24gb2YgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGV4aXN0LCBubwogKiAgICAgZHJpdmVyIG5lZWRz IGl0IHJpZ2h0IG5vdy4gRG9uJ3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGlmCiAqICAgICB5b3UnZCBu ZWVkIHRoZSBfaXJxc2FmZSB2ZXJzaW9uLCBsb29rIGF0IHRoZSBnaXQgaGlzdG9yeQogKiAgICAg YW5kIHJlc3RvcmUgdGhlIF9pcnFzYWZlIHZlcnNpb24hCiAqLwp2b2lkIGllZWU4MDIxMV9zdGFf ZW9zcChzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqcHVic3RhKTsKCi8qKgogKiBpZWVlODAyMTFfc2Vu ZF9lb3NwX251bGxmdW5jIC0gYXNrIG1hYzgwMjExIHRvIHNlbmQgTkRQIHdpdGggRU9TUAogKiBA cHVic3RhOiB0aGUgc3RhdGlvbgogKiBAdGlkOiB0aGUgdGlkIG9mIHRoZSBORFAKICoKICogU29t ZXRpbWVzIHRoZSBkZXZpY2UgdW5kZXJzdGFuZHMgdGhhdCBpdCBuZWVkcyB0byBjbG9zZQogKiB0 aGUgU2VydmljZSBQZXJpb2QgdW5leHBlY3RlZGx5LiBUaGlzIGNhbiBoYXBwZW4gd2hlbgogKiBz ZW5kaW5nIGZyYW1lcyB0aGF0IGFyZSBmaWxsaW5nIGhvbGVzIGluIHRoZSBCQSB3aW5kb3cuCiAq IEluIHRoaXMgY2FzZSwgdGhlIGRldmljZSBjYW4gYXNrIG1hYzgwMjExIHRvIHNlbmQgYQogKiBO dWxsZnVuYyBmcmFtZSB3aXRoIEVPU1Agc2V0LiBXaGVuIHRoYXQgaGFwcGVucywgdGhlCiAqIGRy aXZlciBtdXN0IGhhdmUgY2FsbGVkIGllZWU4MDIxMV9zdGFfc2V0X2J1ZmZlcmVkKCkgdG8KICog bGV0IG1hYzgwMjExIGtub3cgdGhhdCB0aGVyZSBhcmUgbm8gYnVmZmVyZWQgZnJhbWVzIGFueQog KiBtb3JlLCBvdGhlcndpc2UgbWFjODAyMTEgd2lsbCBnZXQgdGhlIG1vcmVfZGF0YSBiaXQgd3Jv bmcuCiAqIFRoZSBsb3cgbGV2ZWwgZHJpdmVyIG11c3QgaGF2ZSBtYWRlIHN1cmUgdGhhdCB0aGUg ZnJhbWUKICogd2lsbCBiZSBzZW50IGRlc3BpdGUgdGhlIHN0YXRpb24gYmVpbmcgaW4gcG93ZXIt c2F2ZS4KICogTWFjODAyMTEgd29uJ3QgY2FsbCBhbGxvd19idWZmZXJlZF9mcmFtZXMoKS4KICog Tm90ZSB0aGF0IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgZG9lc24ndCBleGVtcHQgdGhlIGRyaXZl cgogKiBmcm9tIGNsb3NpbmcgdGhlIEVPU1AgcHJvcGVybHksIGl0IHdpbGwgc3RpbGwgaGF2ZSB0 byBjYWxsCiAqIGllZWU4MDIxMV9zdGFfZW9zcCB3aGVuIHRoZSBORFAgaXMgc2VudC4KICovCnZv aWQgaWVlZTgwMjExX3NlbmRfZW9zcF9udWxsZnVuYyhzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqcHVi c3RhLCBpbnQgdGlkKTsKCi8qKgogKiBpZWVlODAyMTFfc3RhX3JlZ2lzdGVyX2FpcnRpbWUgLSBy ZWdpc3RlciBhaXJ0aW1lIHVzYWdlIGZvciBhIHN0YS90aWQKICoKICogUmVnaXN0ZXIgYWlydGlt ZSB1c2FnZSBmb3IgYSBnaXZlbiBzdGEgb24gYSBnaXZlbiB0aWQuIFRoZSBkcml2ZXIgY2FuIGNh bGwKICogdGhpcyBmdW5jdGlvbiB0byBub3RpZnkgbWFjODAyMTEgdGhhdCBhIHN0YXRpb24gdXNl ZCBhIGNlcnRhaW4gYW1vdW50IG9mCiAqIGFpcnRpbWUuIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBi ZSB1c2VkIGJ5IHRoZSBUWFEgc2NoZWR1bGVyIHRvIHNjaGVkdWxlCiAqIHN0YXRpb25zIGluIGEg d2F5IHRoYXQgZW5zdXJlcyBhaXJ0aW1lIGZhaXJuZXNzLgogKgogKiBUaGUgcmVwb3J0ZWQgYWly dGltZSBzaG91bGQgYXMgYSBtaW5pbXVtIGluY2x1ZGUgYWxsIHRpbWUgdGhhdCBpcyBzcGVudAog KiB0cmFuc21pdHRpbmcgdG8gdGhlIHJlbW90ZSBzdGF0aW9uLCBpbmNsdWRpbmcgb3ZlcmhlYWQg YW5kIHBhZGRpbmcsIGJ1dCBub3QKICogaW5jbHVkaW5nIHRpbWUgc3BlbnQgd2FpdGluZyBmb3Ig YSBUWE9QLiBJZiB0aGUgdGltZSBpcyBub3QgcmVwb3J0ZWQgYnkgdGhlCiAqIGhhcmR3YXJlIGl0 IGNhbiBpbiBzb21lIGNhc2VzIGJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcmF0ZSBhbmQga25vd24g ZnJhbWUKICogY29tcG9zaXRpb24uIFdoZW4gcG9zc2libGUsIHRoZSB0aW1lIHNob3VsZCBpbmNs dWRlIGFueSBmYWlsZWQgdHJhbnNtaXNzaW9uCiAqIGF0dGVtcHRzLgogKgogKiBUaGUgZHJpdmVy IGNhbiBlaXRoZXIgY2FsbCB0aGlzIGZ1bmN0aW9uIHN5bmNocm9ub3VzbHkgZm9yIGV2ZXJ5IHBh Y2tldCBvcgogKiBhZ2dyZWdhdGUsIG9yIGFzeW5jaHJvbm91c2x5IGFzIGFpcnRpbWUgdXNhZ2Ug aW5mb3JtYXRpb24gYmVjb21lcyBhdmFpbGFibGUuCiAqIFRYIGFuZCBSWCBhaXJ0aW1lIGNhbiBi ZSByZXBvcnRlZCB0b2dldGhlciwgb3Igc2VwYXJhdGVseSBieSBzZXR0aW5nIG9uZSBvZgogKiB0 aGVtIHRvIDAuCiAqCiAqIEBwdWJzdGE6IHRoZSBzdGF0aW9uCiAqIEB0aWQ6IHRoZSBUSUQgdG8g cmVnaXN0ZXIgYWlydGltZSBmb3IKICogQHR4X2FpcnRpbWU6IGFpcnRpbWUgdXNlZCBkdXJpbmcg VFggKGluIHVzZWMpCiAqIEByeF9haXJ0aW1lOiBhaXJ0aW1lIHVzZWQgZHVyaW5nIFJYIChpbiB1 c2VjKQogKi8Kdm9pZCBpZWVlODAyMTFfc3RhX3JlZ2lzdGVyX2FpcnRpbWUoc3RydWN0IGllZWU4 MDIxMV9zdGEgKnB1YnN0YSwgdTggdGlkLAoJCQkJICAgIHUzMiB0eF9haXJ0aW1lLCB1MzIgcnhf YWlydGltZSk7CgovKioKICogaWVlZTgwMjExX3R4cV9haXJ0aW1lX2NoZWNrIC0gY2hlY2sgaWYg YSB0eHEgY2FuIHNlbmQgZnJhbWUgdG8gZGV2aWNlCiAqCiAqIEBodzogcG9pbnRlciBvYnRhaW5l ZCBmcm9tIGllZWU4MDIxMV9hbGxvY19odygpCiAqIEB0eHE6IHBvaW50ZXIgb2J0YWluZWQgZnJv bSBzdGF0aW9uIG9yIHZpcnR1YWwgaW50ZXJmYWNlCiAqCiAqIFJldHVybiB0cnVlIGlmIHRoZSBB UUwncyBhaXJ0aW1lIGxpbWl0IGhhcyBub3QgYmVlbiByZWFjaGVkIGFuZCB0aGUgdHhxIGNhbgog KiBjb250aW51ZSB0byBzZW5kIG1vcmUgcGFja2V0cyB0byB0aGUgZGV2aWNlLiBPdGhlcndpc2Ug cmV0dXJuIGZhbHNlLgogKi8KYm9vbAppZWVlODAyMTFfdHhxX2FpcnRpbWVfY2hlY2soc3RydWN0 IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdHhxICp0eHEpOwoKLyoqCiAqIGll ZWU4MDIxMV9pdGVyX2tleXMgLSBpdGVyYXRlIGtleXMgcHJvZ3JhbW1lZCBpbnRvIHRoZSBkZXZp Y2UKICogQGh3OiBwb2ludGVyIG9idGFpbmVkIGZyb20gaWVlZTgwMjExX2FsbG9jX2h3KCkKICog QHZpZjogdmlydHVhbCBpbnRlcmZhY2UgdG8gaXRlcmF0ZSwgbWF5IGJlICVOVUxMIGZvciBhbGwK ICogQGl0ZXI6IGl0ZXJhdG9yIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2gg a2V5CiAqIEBpdGVyX2RhdGE6IGN1c3RvbSBkYXRhIHRvIHBhc3MgdG8gdGhlIGl0ZXJhdG9yIGZ1 bmN0aW9uCiAqCiAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaXRlcmF0ZSBhbGwgdGhl IGtleXMga25vd24gdG8KICogbWFjODAyMTEsIGV2ZW4gdGhvc2UgdGhhdCB3ZXJlbid0IHByZXZp b3VzbHkgcHJvZ3JhbW1lZCBpbnRvCiAqIHRoZSBkZXZpY2UuIFRoaXMgaXMgaW50ZW5kZWQgZm9y IHVzZSBpbiBXb1dMQU4gaWYgdGhlIGRldmljZQogKiBuZWVkcyByZXByb2dyYW1taW5nIG9mIHRo ZSBrZXlzIGR1cmluZyBzdXNwZW5kLiBOb3RlIHRoYXQgZHVlCiAqIHRvIGxvY2tpbmcgcmVhc29u cywgaXQgaXMgYWxzbyBvbmx5IHNhZmUgdG8gY2FsbCB0aGlzIGF0IGZldwogKiBzcG90cyBzaW5j ZSBpdCBtdXN0IGhvbGQgdGhlIFJUTkwgYW5kIGJlIGFibGUgdG8gc2xlZXAuCiAqCiAqIFRoZSBv cmRlciBpbiB3aGljaCB0aGUga2V5cyBhcmUgaXRlcmF0ZWQgbWF0Y2hlcyB0aGUgb3JkZXIKICog aW4gd2hpY2ggdGhleSB3ZXJlIG9yaWdpbmFsbHkgaW5zdGFsbGVkIGFuZCBoYW5kZWQgdG8gdGhl CiAqIHNldF9rZXkgY2FsbGJhY2suCiAqLwp2b2lkIGllZWU4MDIxMV9pdGVyX2tleXMoc3RydWN0 IGllZWU4MDIxMV9odyAqaHcsCgkJCSBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAoJCQkgdm9p ZCAoKml0ZXIpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkJICAgICAgc3RydWN0IGllZWU4 MDIxMV92aWYgKnZpZiwKCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCgkJCQkg ICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXksCgkJCQkgICAgICB2b2lkICpkYXRh KSwKCQkJIHZvaWQgKml0ZXJfZGF0YSk7CgovKioKICogaWVlZTgwMjExX2l0ZXJfa2V5c19yY3Ug LSBpdGVyYXRlIGtleXMgcHJvZ3JhbW1lZCBpbnRvIHRoZSBkZXZpY2UKICogQGh3OiBwb2ludGVy IG9idGFpbmVkIGZyb20gaWVlZTgwMjExX2FsbG9jX2h3KCkKICogQHZpZjogdmlydHVhbCBpbnRl cmZhY2UgdG8gaXRlcmF0ZSwgbWF5IGJlICVOVUxMIGZvciBhbGwKICogQGl0ZXI6IGl0ZXJhdG9y IGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2gga2V5CiAqIEBpdGVyX2RhdGE6 IGN1c3RvbSBkYXRhIHRvIHBhc3MgdG8gdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uCiAqCiAqIFRoaXMg ZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaXRlcmF0ZSBhbGwgdGhlIGtleXMga25vd24gdG8KICog bWFjODAyMTEsIGV2ZW4gdGhvc2UgdGhhdCB3ZXJlbid0IHByZXZpb3VzbHkgcHJvZ3JhbW1lZCBp bnRvCiAqIHRoZSBkZXZpY2UuIE5vdGUgdGhhdCBkdWUgdG8gbG9ja2luZyByZWFzb25zLCBrZXlz IG9mIHN0YXRpb24KICogaW4gcmVtb3ZhbCBwcm9jZXNzIHdpbGwgYmUgc2tpcHBlZC4KICoKICog VGhpcyBmdW5jdGlvbiByZXF1aXJlcyBiZWluZyBjYWxsZWQgaW4gYW4gUkNVIGNyaXRpY2FsIHNl Y3Rpb24sCiAqIGFuZCB0aHVzIGl0ZXIgbXVzdCBiZSBhdG9taWMuCiAqLwp2b2lkIGllZWU4MDIx MV9pdGVyX2tleXNfcmN1KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkgICAgIHN0cnVjdCBp ZWVlODAyMTFfdmlmICp2aWYsCgkJCSAgICAgdm9pZCAoKml0ZXIpKHN0cnVjdCBpZWVlODAyMTFf aHcgKmh3LAoJCQkJCSAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKCQkJCQkgIHN0cnVjdCBp ZWVlODAyMTFfc3RhICpzdGEsCgkJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXks CgkJCQkJICB2b2lkICpkYXRhKSwKCQkJICAgICB2b2lkICppdGVyX2RhdGEpOwoKLyoqCiAqIGll ZWU4MDIxMV9pdGVyX2NoYW5fY29udGV4dHNfYXRvbWljIC0gaXRlcmF0ZSBjaGFubmVsIGNvbnRl eHRzCiAqIEBodzogcG9pbnRlciBvYnRhaW5lZCBmcm9tIGllZWU4MDIxMV9hbGxvY19odygpLgog KiBAaXRlcjogaXRlcmF0b3IgZnVuY3Rpb24KICogQGl0ZXJfZGF0YTogZGF0YSBwYXNzZWQgdG8g aXRlcmF0b3IgZnVuY3Rpb24KICoKICogSXRlcmF0ZSBhbGwgYWN0aXZlIGNoYW5uZWwgY29udGV4 dHMuIFRoaXMgZnVuY3Rpb24gaXMgYXRvbWljIGFuZAogKiBkb2Vzbid0IGFjcXVpcmUgYW55IGxv Y2tzIGludGVybmFsbHkgdGhhdCBtaWdodCBiZSBoZWxkIGluIG90aGVyCiAqIHBsYWNlcyB3aGls ZSBjYWxsaW5nIGludG8gdGhlIGRyaXZlci4KICoKICogVGhlIGl0ZXJhdG9yIHdpbGwgbm90IGZp bmQgYSBjb250ZXh0IHRoYXQncyBiZWluZyBhZGRlZCAoZHVyaW5nCiAqIHRoZSBkcml2ZXIgY2Fs bGJhY2sgdG8gYWRkIGl0KSBidXQgd2lsbCBmaW5kIGl0IHdoaWxlIGl0J3MgYmVpbmcKICogcmVt b3ZlZC4KICoKICogTm90ZSB0aGF0IGR1cmluZyBoYXJkd2FyZSByZXN0YXJ0LCBhbGwgY29udGV4 dHMgdGhhdCBleGlzdGVkCiAqIGJlZm9yZSB0aGUgcmVzdGFydCBhcmUgY29uc2lkZXJlZCBhbHJl YWR5IHByZXNlbnQgc28gd2lsbCBiZQogKiBmb3VuZCB3aGlsZSBpdGVyYXRpbmcsIHdoZXRoZXIg dGhleSd2ZSBiZWVuIHJlLWFkZGVkIGFscmVhZHkKICogb3Igbm90LgogKi8Kdm9pZCBpZWVlODAy MTFfaXRlcl9jaGFuX2NvbnRleHRzX2F0b21pYygKCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJ dm9pZCAoKml0ZXIpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCSAgICAgc3RydWN0IGllZWU4 MDIxMV9jaGFuY3R4X2NvbmYgKmNoYW5jdHhfY29uZiwKCQkgICAgIHZvaWQgKmRhdGEpLAoJdm9p ZCAqaXRlcl9kYXRhKTsKCi8qKgogKiBpZWVlODAyMTFfYXBfcHJvYmVyZXFfZ2V0IC0gcmV0cmll dmUgYSBQcm9iZSBSZXF1ZXN0IHRlbXBsYXRlCiAqIEBodzogcG9pbnRlciBvYnRhaW5lZCBmcm9t IGllZWU4MDIxMV9hbGxvY19odygpLgogKiBAdmlmOiAmc3RydWN0IGllZWU4MDIxMV92aWYgcG9p bnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNlIGNhbGxiYWNrLgogKgogKiBDcmVhdGVzIGEgUHJv YmUgUmVxdWVzdCB0ZW1wbGF0ZSB3aGljaCBjYW4sIGZvciBleGFtcGxlLCBiZSB1cGxvYWRlZCB0 bwogKiBoYXJkd2FyZS4gVGhlIHRlbXBsYXRlIGlzIGZpbGxlZCB3aXRoIGJzc2lkLCBzc2lkIGFu ZCBzdXBwb3J0ZWQgcmF0ZQogKiBpbmZvcm1hdGlvbi4gVGhpcyBmdW5jdGlvbiBtdXN0IG9ubHkg YmUgY2FsbGVkIGZyb20gd2l0aGluIHRoZQogKiAuYnNzX2luZm9fY2hhbmdlZCBjYWxsYmFjayBm dW5jdGlvbiBhbmQgb25seSBpbiBtYW5hZ2VkIG1vZGUuIFRoZSBmdW5jdGlvbgogKiBpcyBvbmx5 IHVzZWZ1bCB3aGVuIHRoZSBpbnRlcmZhY2UgaXMgYXNzb2NpYXRlZCwgb3RoZXJ3aXNlIGl0IHdp bGwgcmV0dXJuCiAqICVOVUxMLgogKgogKiBSZXR1cm46IFRoZSBQcm9iZSBSZXF1ZXN0IHRlbXBs YXRlLiAlTlVMTCBvbiBlcnJvci4KICovCnN0cnVjdCBza19idWZmICppZWVlODAyMTFfYXBfcHJv YmVyZXFfZ2V0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkJCSAgc3RydWN0IGllZWU4MDIx MV92aWYgKnZpZik7CgovKioKICogaWVlZTgwMjExX2JlYWNvbl9sb3NzIC0gaW5mb3JtIGhhcmR3 YXJlIGRvZXMgbm90IHJlY2VpdmUgYmVhY29ucwogKgogKiBAdmlmOiAmc3RydWN0IGllZWU4MDIx MV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNlIGNhbGxiYWNrLgogKgogKiBXaGVu IGJlYWNvbiBmaWx0ZXJpbmcgaXMgZW5hYmxlZCB3aXRoICVJRUVFODAyMTFfVklGX0JFQUNPTl9G SUxURVIgYW5kCiAqICVJRUVFODAyMTFfQ09ORl9QUyBpcyBzZXQsIHRoZSBkcml2ZXIgbmVlZHMg dG8gaW5mb3JtIHdoZW5ldmVyIHRoZQogKiBoYXJkd2FyZSBpcyBub3QgcmVjZWl2aW5nIGJlYWNv bnMgd2l0aCB0aGlzIGZ1bmN0aW9uLgogKi8Kdm9pZCBpZWVlODAyMTFfYmVhY29uX2xvc3Moc3Ry dWN0IGllZWU4MDIxMV92aWYgKnZpZik7CgovKioKICogaWVlZTgwMjExX2Nvbm5lY3Rpb25fbG9z cyAtIGluZm9ybSBoYXJkd2FyZSBoYXMgbG9zdCBjb25uZWN0aW9uIHRvIHRoZSBBUAogKgogKiBA dmlmOiAmc3RydWN0IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNl IGNhbGxiYWNrLgogKgogKiBXaGVuIGJlYWNvbiBmaWx0ZXJpbmcgaXMgZW5hYmxlZCB3aXRoICVJ RUVFODAyMTFfVklGX0JFQUNPTl9GSUxURVIsIGFuZAogKiAlSUVFRTgwMjExX0NPTkZfUFMgYW5k ICVJRUVFODAyMTFfSFdfQ09OTkVDVElPTl9NT05JVE9SIGFyZSBzZXQsIHRoZSBkcml2ZXIKICog bmVlZHMgdG8gaW5mb3JtIGlmIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBBUCBoYXMgYmVlbiBsb3N0 LgogKiBUaGUgZnVuY3Rpb24gbWF5IGFsc28gYmUgY2FsbGVkIGlmIHRoZSBjb25uZWN0aW9uIG5l ZWRzIHRvIGJlIHRlcm1pbmF0ZWQKICogZm9yIHNvbWUgb3RoZXIgcmVhc29uLCBldmVuIGlmICVJ RUVFODAyMTFfSFdfQ09OTkVDVElPTl9NT05JVE9SIGlzbid0IHNldC4KICoKICogVGhpcyBmdW5j dGlvbiB3aWxsIGNhdXNlIGltbWVkaWF0ZSBjaGFuZ2UgdG8gZGlzYXNzb2NpYXRlZCBzdGF0ZSwK ICogd2l0aG91dCBjb25uZWN0aW9uIHJlY292ZXJ5IGF0dGVtcHRzLgogKi8Kdm9pZCBpZWVlODAy MTFfY29ubmVjdGlvbl9sb3NzKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwoKLyoqCiAqIGll ZWU4MDIxMV9yZXN1bWVfZGlzY29ubmVjdCAtIGRpc2Nvbm5lY3QgZnJvbSBBUCBhZnRlciByZXN1 bWUKICoKICogQHZpZjogJnN0cnVjdCBpZWVlODAyMTFfdmlmIHBvaW50ZXIgZnJvbSB0aGUgYWRk X2ludGVyZmFjZSBjYWxsYmFjay4KICoKICogSW5zdHJ1Y3RzIG1hYzgwMjExIHRvIGRpc2Nvbm5l Y3QgZnJvbSB0aGUgQVAgYWZ0ZXIgcmVzdW1lLgogKiBEcml2ZXJzIGNhbiB1c2UgdGhpcyBhZnRl ciBXb1dMQU4gaWYgdGhleSBrbm93IHRoYXQgdGhlCiAqIGNvbm5lY3Rpb24gY2Fubm90IGJlIGtl cHQgdXAsIGZvciBleGFtcGxlIGJlY2F1c2Uga2V5cyB3ZXJlCiAqIHVzZWQgd2hpbGUgdGhlIGRl dmljZSB3YXMgYXNsZWVwIGJ1dCB0aGUgcmVwbGF5IGNvdW50ZXJzIG9yCiAqIHNpbWlsYXIgY2Fu bm90IGJlIHJldHJpZXZlZCBmcm9tIHRoZSBkZXZpY2UgZHVyaW5nIHJlc3VtZS4KICoKICogTm90 ZSB0aGF0IGR1ZSB0byBpbXBsZW1lbnRhdGlvbiBpc3N1ZXMsIGlmIHRoZSBkcml2ZXIgdXNlcwog KiB0aGUgcmVjb25maWd1cmF0aW9uIGZ1bmN0aW9uYWxpdHkgZHVyaW5nIHJlc3VtZSB0aGUgaW50 ZXJmYWNlCiAqIHdpbGwgc3RpbGwgYmUgYWRkZWQgYXMgYXNzb2NpYXRlZCBmaXJzdCBkdXJpbmcg cmVzdW1lIGFuZCB0aGVuCiAqIGRpc2Nvbm5lY3Qgbm9ybWFsbHkgbGF0ZXIuCiAqCiAqIFRoaXMg ZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIHJlc3VtZSBjYWxsYmFjayBhbmQK ICogdGhlIGRyaXZlciBtdXN0IG5vdCBiZSBob2xkaW5nIGFueSBvZiBpdHMgb3duIGxvY2tzIHdo aWxlIGl0CiAqIGNhbGxzIHRoaXMgZnVuY3Rpb24sIG9yIGF0IGxlYXN0IG5vdCBhbnkgbG9ja3Mg aXQgbmVlZHMgaW4gdGhlCiAqIGtleSBjb25maWd1cmF0aW9uIHBhdGhzIChpZiBpdCBzdXBwb3J0 cyBIVyBjcnlwdG8pLgogKi8Kdm9pZCBpZWVlODAyMTFfcmVzdW1lX2Rpc2Nvbm5lY3Qoc3RydWN0 IGllZWU4MDIxMV92aWYgKnZpZik7CgovKioKICogaWVlZTgwMjExX2NxbV9yc3NpX25vdGlmeSAt IGluZm9ybSBhIGNvbmZpZ3VyZWQgY29ubmVjdGlvbiBxdWFsaXR5IG1vbml0b3JpbmcKICoJcnNz aSB0aHJlc2hvbGQgdHJpZ2dlcmVkCiAqCiAqIEB2aWY6ICZzdHJ1Y3QgaWVlZTgwMjExX3ZpZiBw b2ludGVyIGZyb20gdGhlIGFkZF9pbnRlcmZhY2UgY2FsbGJhY2suCiAqIEByc3NpX2V2ZW50OiB0 aGUgUlNTSSB0cmlnZ2VyIGV2ZW50IHR5cGUKICogQHJzc2lfbGV2ZWw6IG5ldyBSU1NJIGxldmVs IHZhbHVlIG9yIDAgaWYgbm90IGF2YWlsYWJsZQogKiBAZ2ZwOiBjb250ZXh0IGZsYWdzCiAqCiAq IFdoZW4gdGhlICVJRUVFODAyMTFfVklGX1NVUFBPUlRTX0NRTV9SU1NJIGlzIHNldCwgYW5kIGEg Y29ubmVjdGlvbiBxdWFsaXR5CiAqIG1vbml0b3JpbmcgaXMgY29uZmlndXJlZCB3aXRoIGFuIHJz c2kgdGhyZXNob2xkLCB0aGUgZHJpdmVyIHdpbGwgaW5mb3JtCiAqIHdoZW5ldmVyIHRoZSByc3Np IGxldmVsIHJlYWNoZXMgdGhlIHRocmVzaG9sZC4KICovCnZvaWQgaWVlZTgwMjExX2NxbV9yc3Np X25vdGlmeShzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAoJCQkgICAgICAgZW51bSBubDgwMjEx X2NxbV9yc3NpX3RocmVzaG9sZF9ldmVudCByc3NpX2V2ZW50LAoJCQkgICAgICAgczMyIHJzc2lf bGV2ZWwsCgkJCSAgICAgICBnZnBfdCBnZnApOwoKLyoqCiAqIGllZWU4MDIxMV9jcW1fYmVhY29u X2xvc3Nfbm90aWZ5IC0gaW5mb3JtIENRTSBvZiBiZWFjb24gbG9zcwogKgogKiBAdmlmOiAmc3Ry dWN0IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNlIGNhbGxiYWNr LgogKiBAZ2ZwOiBjb250ZXh0IGZsYWdzCiAqLwp2b2lkIGllZWU4MDIxMV9jcW1fYmVhY29uX2xv c3Nfbm90aWZ5KHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIGdmcF90IGdmcCk7CgovKioKICog aWVlZTgwMjExX3JhZGFyX2RldGVjdGVkIC0gaW5mb3JtIHRoYXQgYSByYWRhciB3YXMgZGV0ZWN0 ZWQKICoKICogQGh3OiBwb2ludGVyIGFzIG9idGFpbmVkIGZyb20gaWVlZTgwMjExX2FsbG9jX2h3 KCkKICovCnZvaWQgaWVlZTgwMjExX3JhZGFyX2RldGVjdGVkKHN0cnVjdCBpZWVlODAyMTFfaHcg Kmh3KTsKCi8qKgogKiBpZWVlODAyMTFfY2hzd2l0Y2hfZG9uZSAtIENvbXBsZXRlIGNoYW5uZWwg c3dpdGNoIHByb2Nlc3MKICogQHZpZjogJnN0cnVjdCBpZWVlODAyMTFfdmlmIHBvaW50ZXIgZnJv bSB0aGUgYWRkX2ludGVyZmFjZSBjYWxsYmFjay4KICogQHN1Y2Nlc3M6IG1ha2UgdGhlIGNoYW5u ZWwgc3dpdGNoIHN1Y2Nlc3NmdWwgb3Igbm90CiAqCiAqIENvbXBsZXRlIHRoZSBjaGFubmVsIHN3 aXRjaCBwb3N0LXByb2Nlc3M6IHNldCB0aGUgbmV3IG9wZXJhdGlvbmFsIGNoYW5uZWwKICogYW5k IHdha2UgdXAgdGhlIHN1c3BlbmRlZCBxdWV1ZXMuCiAqLwp2b2lkIGllZWU4MDIxMV9jaHN3aXRj aF9kb25lKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIGJvb2wgc3VjY2Vzcyk7CgovKioKICog aWVlZTgwMjExX3JlcXVlc3Rfc21wcyAtIHJlcXVlc3QgU00gUFMgdHJhbnNpdGlvbgogKiBAdmlm OiAmc3RydWN0IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNlIGNh bGxiYWNrLgogKiBAc21wc19tb2RlOiBuZXcgU00gUFMgbW9kZQogKgogKiBUaGlzIGFsbG93cyB0 aGUgZHJpdmVyIHRvIHJlcXVlc3QgYW4gU00gUFMgdHJhbnNpdGlvbiBpbiBtYW5hZ2VkCiAqIG1v ZGUuIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIGRyaXZlciBoYXMgbW9yZSBpbmZvcm1hdGlvbiB0 aGFuCiAqIHRoZSBzdGFjayBhYm91dCBwb3NzaWJsZSBpbnRlcmZlcmVuY2UsIGZvciBleGFtcGxl IGJ5IGJsdWV0b290aC4KICovCnZvaWQgaWVlZTgwMjExX3JlcXVlc3Rfc21wcyhzdHJ1Y3QgaWVl ZTgwMjExX3ZpZiAqdmlmLAoJCQkgICAgZW51bSBpZWVlODAyMTFfc21wc19tb2RlIHNtcHNfbW9k ZSk7CgovKioKICogaWVlZTgwMjExX3JlYWR5X29uX2NoYW5uZWwgLSBub3RpZmljYXRpb24gb2Yg cmVtYWluLW9uLWNoYW5uZWwgc3RhcnQKICogQGh3OiBwb2ludGVyIGFzIG9idGFpbmVkIGZyb20g aWVlZTgwMjExX2FsbG9jX2h3KCkKICovCnZvaWQgaWVlZTgwMjExX3JlYWR5X29uX2NoYW5uZWwo c3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwoKLyoqCiAqIGllZWU4MDIxMV9yZW1haW5fb25fY2hh bm5lbF9leHBpcmVkIC0gcmVtYWluX29uX2NoYW5uZWwgZHVyYXRpb24gZXhwaXJlZAogKiBAaHc6 IHBvaW50ZXIgYXMgb2J0YWluZWQgZnJvbSBpZWVlODAyMTFfYWxsb2NfaHcoKQogKi8Kdm9pZCBp ZWVlODAyMTFfcmVtYWluX29uX2NoYW5uZWxfZXhwaXJlZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpo dyk7CgovKioKICogaWVlZTgwMjExX3N0b3BfcnhfYmFfc2Vzc2lvbiAtIGNhbGxiYWNrIHRvIHN0 b3AgZXhpc3RpbmcgQkEgc2Vzc2lvbnMKICoKICogaW4gb3JkZXIgbm90IHRvIGhhcm0gdGhlIHN5 c3RlbSBwZXJmb3JtYW5jZSBhbmQgdXNlciBleHBlcmllbmNlLCB0aGUgZGV2aWNlCiAqIG1heSBy ZXF1ZXN0IG5vdCB0byBhbGxvdyBhbnkgcnggYmEgc2Vzc2lvbiBhbmQgdGVhciBkb3duIGV4aXN0 aW5nIHJ4IGJhCiAqIHNlc3Npb25zIGJhc2VkIG9uIHN5c3RlbSBjb25zdHJhaW50cyBzdWNoIGFz IHBlcmlvZGljIEJUIGFjdGl2aXR5IHRoYXQgbmVlZHMKICogdG8gbGltaXQgd2xhbiBhY3Rpdml0 eSAoZWcuc2NvIG9yIGEyZHApLiIKICogaW4gc3VjaCBjYXNlcywgdGhlIGludGVudGlvbiBpcyB0 byBsaW1pdCB0aGUgZHVyYXRpb24gb2YgdGhlIHJ4IHBwZHUgYW5kCiAqIHRoZXJlZm9yZSBwcmV2 ZW50IHRoZSBwZWVyIGRldmljZSB0byB1c2UgYS1tcGR1IGFnZ3JlZ2F0aW9uLgogKgogKiBAdmlm OiAmc3RydWN0IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNlIGNh bGxiYWNrLgogKiBAYmFfcnhfYml0bWFwOiBCaXQgbWFwIG9mIG9wZW4gcnggYmEgcGVyIHRpZAog KiBAYWRkcjogJiB0byBic3NpZCBtYWMgYWRkcmVzcwogKi8Kdm9pZCBpZWVlODAyMTFfc3RvcF9y eF9iYV9zZXNzaW9uKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHUxNiBiYV9yeF9iaXRtYXAs CgkJCQkgIGNvbnN0IHU4ICphZGRyKTsKCi8qKgogKiBpZWVlODAyMTFfbWFya19yeF9iYV9maWx0 ZXJlZF9mcmFtZXMgLSBtb3ZlIFJYIEJBIHdpbmRvdyBhbmQgbWFyayBmaWx0ZXJlZAogKiBAcHVi c3RhOiBzdGF0aW9uIHN0cnVjdAogKiBAdGlkOiB0aGUgc2Vzc2lvbidzIFRJRAogKiBAc3NuOiBz dGFydGluZyBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGJpdG1hcCwgYWxsIGZyYW1lcyBiZWZvcmUg dGhpcyBhcmUKICoJYXNzdW1lZCB0byBiZSBvdXQgb2YgdGhlIHdpbmRvdyBhZnRlciB0aGUgY2Fs bAogKiBAZmlsdGVyZWQ6IGJpdG1hcCBvZiBmaWx0ZXJlZCBmcmFtZXMsIEJJVCgwKSBpcyB0aGUg QHNzbiBlbnRyeSBldGMuCiAqIEByZWNlaXZlZF9tcGR1czogbnVtYmVyIG9mIHJlY2VpdmVkIG1w ZHVzIGluIGZpcm13YXJlCiAqCiAqIFRoaXMgZnVuY3Rpb24gbW92ZXMgdGhlIEJBIHdpbmRvdyBh bmQgcmVsZWFzZXMgYWxsIGZyYW1lcyBiZWZvcmUgQHNzbiwgYW5kCiAqIG1hcmtzIGZyYW1lcyBt YXJrZWQgaW4gdGhlIGJpdG1hcCBhcyBoYXZpbmcgYmVlbiBmaWx0ZXJlZC4gQWZ0ZXJ3YXJkcywg aXQKICogY2hlY2tzIGlmIGFueSBmcmFtZXMgaW4gdGhlIHdpbmRvdyBzdGFydGluZyBmcm9tIEBz c24gY2FuIG5vdyBiZSByZWxlYXNlZAogKiAoaW4gY2FzZSB0aGV5IHdlcmUgb25seSB3YWl0aW5n IGZvciBmcmFtZXMgdGhhdCB3ZXJlIGZpbHRlcmVkLikKICovCnZvaWQgaWVlZTgwMjExX21hcmtf cnhfYmFfZmlsdGVyZWRfZnJhbWVzKHN0cnVjdCBpZWVlODAyMTFfc3RhICpwdWJzdGEsIHU4IHRp ZCwKCQkJCQkgIHUxNiBzc24sIHU2NCBmaWx0ZXJlZCwKCQkJCQkgIHUxNiByZWNlaXZlZF9tcGR1 cyk7CgovKioKICogaWVlZTgwMjExX3NlbmRfYmFyIC0gc2VuZCBhIEJsb2NrQWNrUmVxIGZyYW1l CiAqCiAqIGNhbiBiZSB1c2VkIHRvIGZsdXNoIHBlbmRpbmcgZnJhbWVzIGZyb20gdGhlIHBlZXIn cyBhZ2dyZWdhdGlvbiByZW9yZGVyCiAqIGJ1ZmZlci4KICoKICogQHZpZjogJnN0cnVjdCBpZWVl ODAyMTFfdmlmIHBvaW50ZXIgZnJvbSB0aGUgYWRkX2ludGVyZmFjZSBjYWxsYmFjay4KICogQHJh OiB0aGUgcGVlcidzIGRlc3RpbmF0aW9uIGFkZHJlc3MKICogQHRpZDogdGhlIFRJRCBvZiB0aGUg YWdncmVnYXRpb24gc2Vzc2lvbgogKiBAc3NuOiB0aGUgbmV3IHN0YXJ0aW5nIHNlcXVlbmNlIG51 bWJlciBmb3IgdGhlIHJlY2VpdmVyCiAqLwp2b2lkIGllZWU4MDIxMV9zZW5kX2JhcihzdHJ1Y3Qg aWVlZTgwMjExX3ZpZiAqdmlmLCB1OCAqcmEsIHUxNiB0aWQsIHUxNiBzc24pOwoKLyoqCiAqIGll ZWU4MDIxMV9tYW5hZ2VfcnhfYmFfb2ZmbCAtIGhlbHBlciB0byBxdWV1ZSBhbiBSWCBCQSB3b3Jr CiAqIEB2aWY6ICZzdHJ1Y3QgaWVlZTgwMjExX3ZpZiBwb2ludGVyIGZyb20gdGhlIGFkZF9pbnRl cmZhY2UgY2FsbGJhY2sKICogQGFkZHI6IHN0YXRpb24gbWFjIGFkZHJlc3MKICogQHRpZDogdGhl IHJ4IHRpZAogKi8Kdm9pZCBpZWVlODAyMTFfbWFuYWdlX3J4X2JhX29mZmwoc3RydWN0IGllZWU4 MDIxMV92aWYgKnZpZiwgY29uc3QgdTggKmFkZHIsCgkJCQkgdW5zaWduZWQgaW50IHRpZCk7Cgov KioKICogaWVlZTgwMjExX3N0YXJ0X3J4X2JhX3Nlc3Npb25fb2ZmbCAtIHN0YXJ0IGEgUnggQkEg c2Vzc2lvbgogKgogKiBTb21lIGRldmljZSBkcml2ZXJzIG1heSBvZmZsb2FkIHBhcnQgb2YgdGhl IFJ4IGFnZ3JlZ2F0aW9uIGZsb3cgaW5jbHVkaW5nCiAqIEFkZEJhL0RlbEJhIG5lZ290aWF0aW9u IGJ1dCBtYXkgb3RoZXJ3aXNlIGJlIGluY2FwYWJsZSBvZiBmdWxsIFJ4CiAqIHJlb3JkZXJpbmcu CiAqCiAqIENyZWF0ZSBzdHJ1Y3R1cmVzIHJlc3BvbnNpYmxlIGZvciByZW9yZGVyaW5nIHNvIGRl dmljZSBkcml2ZXJzIG1heSBjYWxsIGhlcmUKICogd2hlbiB0aGV5IGNvbXBsZXRlIEFkZEJhIG5l Z290aWF0aW9uLgogKgogKiBAdmlmOiAmc3RydWN0IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9t IHRoZSBhZGRfaW50ZXJmYWNlIGNhbGxiYWNrCiAqIEBhZGRyOiBzdGF0aW9uIG1hYyBhZGRyZXNz CiAqIEB0aWQ6IHRoZSByeCB0aWQKICovCnN0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfc3Rh cnRfcnhfYmFfc2Vzc2lvbl9vZmZsKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCgkJCQkJCSAg ICAgIGNvbnN0IHU4ICphZGRyLCB1MTYgdGlkKQp7CglpZiAoV0FSTl9PTih0aWQgPj0gSUVFRTgw MjExX05VTV9USURTKSkKCQlyZXR1cm47CglpZWVlODAyMTFfbWFuYWdlX3J4X2JhX29mZmwodmlm LCBhZGRyLCB0aWQpOwp9CgovKioKICogaWVlZTgwMjExX3N0b3BfcnhfYmFfc2Vzc2lvbl9vZmZs IC0gc3RvcCBhIFJ4IEJBIHNlc3Npb24KICoKICogU29tZSBkZXZpY2UgZHJpdmVycyBtYXkgb2Zm bG9hZCBwYXJ0IG9mIHRoZSBSeCBhZ2dyZWdhdGlvbiBmbG93IGluY2x1ZGluZwogKiBBZGRCYS9E ZWxCYSBuZWdvdGlhdGlvbiBidXQgbWF5IG90aGVyd2lzZSBiZSBpbmNhcGFibGUgb2YgZnVsbCBS eAogKiByZW9yZGVyaW5nLgogKgogKiBEZXN0cm95IHN0cnVjdHVyZXMgcmVzcG9uc2libGUgZm9y IHJlb3JkZXJpbmcgc28gZGV2aWNlIGRyaXZlcnMgbWF5IGNhbGwgaGVyZQogKiB3aGVuIHRoZXkg Y29tcGxldGUgRGVsQmEgbmVnb3RpYXRpb24uCiAqCiAqIEB2aWY6ICZzdHJ1Y3QgaWVlZTgwMjEx X3ZpZiBwb2ludGVyIGZyb20gdGhlIGFkZF9pbnRlcmZhY2UgY2FsbGJhY2sKICogQGFkZHI6IHN0 YXRpb24gbWFjIGFkZHJlc3MKICogQHRpZDogdGhlIHJ4IHRpZAogKi8Kc3RhdGljIGlubGluZSB2 b2lkIGllZWU4MDIxMV9zdG9wX3J4X2JhX3Nlc3Npb25fb2ZmbChzdHJ1Y3QgaWVlZTgwMjExX3Zp ZiAqdmlmLAoJCQkJCQkgICAgIGNvbnN0IHU4ICphZGRyLCB1MTYgdGlkKQp7CglpZiAoV0FSTl9P Tih0aWQgPj0gSUVFRTgwMjExX05VTV9USURTKSkKCQlyZXR1cm47CglpZWVlODAyMTFfbWFuYWdl X3J4X2JhX29mZmwodmlmLCBhZGRyLCB0aWQgKyBJRUVFODAyMTFfTlVNX1RJRFMpOwp9CgovKioK ICogaWVlZTgwMjExX3J4X2JhX3RpbWVyX2V4cGlyZWQgLSBzdG9wIGEgUnggQkEgc2Vzc2lvbiBk dWUgdG8gdGltZW91dAogKgogKiBTb21lIGRldmljZSBkcml2ZXJzIGRvIG5vdCBvZmZsb2FkIEFk ZEJhL0RlbEJhIG5lZ290aWF0aW9uLCBidXQgaGFuZGxlIHJ4CiAqIGJ1ZmZlciByZW9yZGluZyBp bnRlcm5hbGx5LCBhbmQgdGhlcmVmb3JlIGFsc28gaGFuZGxlIHRoZSBzZXNzaW9uIHRpbWVyLgog KgogKiBUcmlnZ2VyIHRoZSB0aW1lb3V0IGZsb3csIHdoaWNoIHNlbmRzIGEgRGVsQmEuCiAqCiAq IEB2aWY6ICZzdHJ1Y3QgaWVlZTgwMjExX3ZpZiBwb2ludGVyIGZyb20gdGhlIGFkZF9pbnRlcmZh Y2UgY2FsbGJhY2sKICogQGFkZHI6IHN0YXRpb24gbWFjIGFkZHJlc3MKICogQHRpZDogdGhlIHJ4 IHRpZAogKi8Kdm9pZCBpZWVlODAyMTFfcnhfYmFfdGltZXJfZXhwaXJlZChzdHJ1Y3QgaWVlZTgw MjExX3ZpZiAqdmlmLAoJCQkJICAgY29uc3QgdTggKmFkZHIsIHVuc2lnbmVkIGludCB0aWQpOwoK LyogUmF0ZSBjb250cm9sIEFQSSAqLwoKLyoqCiAqIHN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZV9j b250cm9sIC0gcmF0ZSBjb250cm9sIGluZm9ybWF0aW9uIGZvci9mcm9tIFJDIGFsZ28KICoKICog QGh3OiBUaGUgaGFyZHdhcmUgdGhlIGFsZ29yaXRobSBpcyBpbnZva2VkIGZvci4KICogQHNiYW5k OiBUaGUgYmFuZCB0aGlzIGZyYW1lIGlzIGJlaW5nIHRyYW5zbWl0dGVkIG9uLgogKiBAYnNzX2Nv bmY6IHRoZSBjdXJyZW50IEJTUyBjb25maWd1cmF0aW9uCiAqIEBza2I6IHRoZSBza2IgdGhhdCB3 aWxsIGJlIHRyYW5zbWl0dGVkLCB0aGUgY29udHJvbCBpbmZvcm1hdGlvbiBpbiBpdCBuZWVkcwog Kgl0byBiZSBmaWxsZWQgaW4KICogQHJlcG9ydGVkX3JhdGU6IFRoZSByYXRlIGNvbnRyb2wgYWxn b3JpdGhtIGNhbiBmaWxsIHRoaXMgaW4gdG8gaW5kaWNhdGUKICoJd2hpY2ggcmF0ZSBzaG91bGQg YmUgcmVwb3J0ZWQgdG8gdXNlcnNwYWNlIGFzIHRoZSBjdXJyZW50IHJhdGUgYW5kCiAqCXVzZWQg Zm9yIHJhdGUgY2FsY3VsYXRpb25zIGluIHRoZSBtZXNoIG5ldHdvcmsuCiAqIEBydHM6IHdoZXRo ZXIgUlRTIHdpbGwgYmUgdXNlZCBmb3IgdGhpcyBmcmFtZSBiZWNhdXNlIGl0IGlzIGxvbmdlciB0 aGFuIHRoZQogKglSVFMgdGhyZXNob2xkCiAqIEBzaG9ydF9wcmVhbWJsZTogd2hldGhlciBtYWM4 MDIxMSB3aWxsIHJlcXVlc3Qgc2hvcnQtcHJlYW1ibGUgdHJhbnNtaXNzaW9uCiAqCWlmIHRoZSBz ZWxlY3RlZCByYXRlIHN1cHBvcnRzIGl0CiAqIEByYXRlX2lkeF9tYXNrOiB1c2VyLXJlcXVlc3Rl ZCAobGVnYWN5KSByYXRlIG1hc2sKICogQHJhdGVfaWR4X21jc19tYXNrOiB1c2VyLXJlcXVlc3Rl ZCBNQ1MgcmF0ZSBtYXNrIChOVUxMIGlmIG5vdCBpbiB1c2UpCiAqIEBic3M6IHdoZXRoZXIgdGhp cyBmcmFtZSBpcyBzZW50IG91dCBpbiBBUCBvciBJQlNTIG1vZGUKICovCnN0cnVjdCBpZWVlODAy MTFfdHhfcmF0ZV9jb250cm9sIHsKCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwoJc3RydWN0IGll ZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CglzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25m ICpic3NfY29uZjsKCXN0cnVjdCBza19idWZmICpza2I7CglzdHJ1Y3QgaWVlZTgwMjExX3R4X3Jh dGUgcmVwb3J0ZWRfcmF0ZTsKCWJvb2wgcnRzLCBzaG9ydF9wcmVhbWJsZTsKCXUzMiByYXRlX2lk eF9tYXNrOwoJdTggKnJhdGVfaWR4X21jc19tYXNrOwoJYm9vbCBic3M7Cn07CgovKioKICogZW51 bSByYXRlX2NvbnRyb2xfY2FwYWJpbGl0aWVzIC0gcmF0ZSBjb250cm9sIGNhcGFiaWxpdGllcwog Ki8KZW51bSByYXRlX2NvbnRyb2xfY2FwYWJpbGl0aWVzIHsKCS8qKgoJICogQFJBVEVfQ1RSTF9D QVBBX1ZIVF9FWFRfTlNTX0JXOgoJICogU3VwcG9ydCBmb3IgZXh0ZW5kZWQgTlNTIEJXIHN1cHBv cnQgKGRvdDExVkhURXh0ZW5kZWROU1NDYXBhYmxlKQoJICogTm90ZSB0aGF0IHRoaXMgaXMgb25s eSBsb29rZWQgYXQgaWYgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGNoYWlucwoJICogdGhhdCB0aGUg QVAgdXNlcyBpcyA8IHRoZSBudW1iZXIgb2YgVFggY2hhaW5zIHRoZSBoYXJkd2FyZSBoYXMsCgkg KiBvdGhlcndpc2UgdGhlIE5TUyBkaWZmZXJlbmNlIGRvZXNuJ3QgYm90aGVyIHVzLgoJICovCglS QVRFX0NUUkxfQ0FQQV9WSFRfRVhUX05TU19CVyA9IEJJVCgwKSwKfTsKCnN0cnVjdCByYXRlX2Nv bnRyb2xfb3BzIHsKCXVuc2lnbmVkIGxvbmcgY2FwYTsKCWNvbnN0IGNoYXIgKm5hbWU7Cgl2b2lk ICooKmFsbG9jKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGRlbnRyeSAqZGVidWdm c2Rpcik7Cgl2b2lkICgqZnJlZSkodm9pZCAqcHJpdik7CgoJdm9pZCAqKCphbGxvY19zdGEpKHZv aWQgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGdmcF90IGdmcCk7Cgl2b2lkICgq cmF0ZV9pbml0KSh2b2lkICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpz YmFuZCwKCQkJICBzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWYsCgkJCSAgc3RydWN0 IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqcHJpdl9zdGEpOwoJdm9pZCAoKnJhdGVfdXBkYXRl KSh2b2lkICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKCQkJ ICAgIHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqY2hhbmRlZiwKCQkJICAgIHN0cnVjdCBpZWVl ODAyMTFfc3RhICpzdGEsIHZvaWQgKnByaXZfc3RhLAoJCQkgICAgdTMyIGNoYW5nZWQpOwoJdm9p ZCAoKmZyZWVfc3RhKSh2b2lkICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAoJCQkg dm9pZCAqcHJpdl9zdGEpOwoKCXZvaWQgKCp0eF9zdGF0dXNfZXh0KSh2b2lkICpwcml2LAoJCQkg ICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKCQkJICAgICAgdm9p ZCAqcHJpdl9zdGEsIHN0cnVjdCBpZWVlODAyMTFfdHhfc3RhdHVzICpzdCk7Cgl2b2lkICgqdHhf c3RhdHVzKSh2b2lkICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFu ZCwKCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSwKCQkJICBz dHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKCXZvaWQgKCpnZXRfcmF0ZSkodm9pZCAqcHJpdiwgc3RydWN0 IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqcHJpdl9zdGEsCgkJCSBzdHJ1Y3QgaWVlZTgwMjEx X3R4X3JhdGVfY29udHJvbCAqdHhyYyk7CgoJdm9pZCAoKmFkZF9zdGFfZGVidWdmcykodm9pZCAq cHJpdiwgdm9pZCAqcHJpdl9zdGEsCgkJCQlzdHJ1Y3QgZGVudHJ5ICpkaXIpOwoKCXUzMiAoKmdl dF9leHBlY3RlZF90aHJvdWdocHV0KSh2b2lkICpwcml2X3N0YSk7Cn07CgpzdGF0aWMgaW5saW5l IGludCByYXRlX3N1cHBvcnRlZChzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAoJCQkJIGVudW0g bmw4MDIxMV9iYW5kIGJhbmQsCgkJCQkgaW50IGluZGV4KQp7CglyZXR1cm4gKHN0YSA9PSBOVUxM IHx8IHN0YS0+c3VwcF9yYXRlc1tiYW5kXSAmIEJJVChpbmRleCkpOwp9CgpzdGF0aWMgaW5saW5l IHM4CnJhdGVfbG93ZXN0X2luZGV4KHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNi YW5kLAoJCSAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKewoJaW50IGk7CgoJZm9yIChpID0g MDsgaSA8IHNiYW5kLT5uX2JpdHJhdGVzOyBpKyspCgkJaWYgKHJhdGVfc3VwcG9ydGVkKHN0YSwg c2JhbmQtPmJhbmQsIGkpKQoJCQlyZXR1cm4gaTsKCgkvKiB3YXJuIHdoZW4gd2UgY2Fubm90IGZp bmQgYSByYXRlLiAqLwoJV0FSTl9PTl9PTkNFKDEpOwoKCS8qIGFuZCByZXR1cm4gMCAodGhlIGxv d2VzdCBpbmRleCkgKi8KCXJldHVybiAwOwp9CgpzdGF0aWMgaW5saW5lCmJvb2wgcmF0ZV91c2Fi bGVfaW5kZXhfZXhpc3RzKHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAoJ CQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQp7Cgl1bnNpZ25lZCBpbnQgaTsKCglm b3IgKGkgPSAwOyBpIDwgc2JhbmQtPm5fYml0cmF0ZXM7IGkrKykKCQlpZiAocmF0ZV9zdXBwb3J0 ZWQoc3RhLCBzYmFuZC0+YmFuZCwgaSkpCgkJCXJldHVybiB0cnVlOwoJcmV0dXJuIGZhbHNlOwp9 CgovKioKICogcmF0ZV9jb250cm9sX3NldF9yYXRlcyAtIHBhc3MgdGhlIHN0YSByYXRlIHNlbGVj dGlvbiB0byBtYWM4MDIxMS9kcml2ZXIKICoKICogV2hlbiBub3QgZG9pbmcgYSByYXRlIGNvbnRy b2wgcHJvYmUgdG8gdGVzdCByYXRlcywgcmF0ZSBjb250cm9sIHNob3VsZCBwYXNzCiAqIGl0cyBy YXRlIHNlbGVjdGlvbiB0byBtYWM4MDIxMS4gSWYgdGhlIGRyaXZlciBzdXBwb3J0cyByZWNlaXZp bmcgYSBzdGF0aW9uCiAqIHJhdGUgdGFibGUsIGl0IHdpbGwgdXNlIGl0IHRvIGVuc3VyZSB0aGF0 IGZyYW1lcyBhcmUgYWx3YXlzIHNlbnQgYmFzZWQgb24KICogdGhlIG1vc3QgcmVjZW50IHJhdGUg Y29udHJvbCBtb2R1bGUgZGVjaXNpb24uCiAqCiAqIEBodzogcG9pbnRlciBhcyBvYnRhaW5lZCBm cm9tIGllZWU4MDIxMV9hbGxvY19odygpCiAqIEBwdWJzdGE6ICZzdHJ1Y3QgaWVlZTgwMjExX3N0 YSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgZGVzdGluYXRpb24uCiAqIEByYXRlczogbmV3IHR4IHJh dGUgc2V0IHRvIGJlIHVzZWQgZm9yIHRoaXMgc3RhdGlvbi4KICovCmludCByYXRlX2NvbnRyb2xf c2V0X3JhdGVzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkgICBzdHJ1Y3QgaWVlZTgwMjEx X3N0YSAqcHVic3RhLAoJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9yYXRlcyAqcmF0ZXMpOwoK aW50IGllZWU4MDIxMV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IHJhdGVfY29u dHJvbF9vcHMgKm9wcyk7CnZvaWQgaWVlZTgwMjExX3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKGNv bnN0IHN0cnVjdCByYXRlX2NvbnRyb2xfb3BzICpvcHMpOwoKc3RhdGljIGlubGluZSBib29sCmNv bmZfaXNfaHQyMChzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYpCnsKCXJldHVybiBjb25mLT5j aGFuZGVmLndpZHRoID09IE5MODAyMTFfQ0hBTl9XSURUSF8yMDsKfQoKc3RhdGljIGlubGluZSBi b29sCmNvbmZfaXNfaHQ0MF9taW51cyhzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYpCnsKCXJl dHVybiBjb25mLT5jaGFuZGVmLndpZHRoID09IE5MODAyMTFfQ0hBTl9XSURUSF80MCAmJgoJICAg ICAgIGNvbmYtPmNoYW5kZWYuY2VudGVyX2ZyZXExIDwgY29uZi0+Y2hhbmRlZi5jaGFuLT5jZW50 ZXJfZnJlcTsKfQoKc3RhdGljIGlubGluZSBib29sCmNvbmZfaXNfaHQ0MF9wbHVzKHN0cnVjdCBp ZWVlODAyMTFfY29uZiAqY29uZikKewoJcmV0dXJuIGNvbmYtPmNoYW5kZWYud2lkdGggPT0gTkw4 MDIxMV9DSEFOX1dJRFRIXzQwICYmCgkgICAgICAgY29uZi0+Y2hhbmRlZi5jZW50ZXJfZnJlcTEg PiBjb25mLT5jaGFuZGVmLmNoYW4tPmNlbnRlcl9mcmVxOwp9CgpzdGF0aWMgaW5saW5lIGJvb2wK Y29uZl9pc19odDQwKHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZikKewoJcmV0dXJuIGNvbmYt PmNoYW5kZWYud2lkdGggPT0gTkw4MDIxMV9DSEFOX1dJRFRIXzQwOwp9CgpzdGF0aWMgaW5saW5l IGJvb2wKY29uZl9pc19odChzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYpCnsKCXJldHVybiAo Y29uZi0+Y2hhbmRlZi53aWR0aCAhPSBOTDgwMjExX0NIQU5fV0lEVEhfNSkgJiYKCQkoY29uZi0+ Y2hhbmRlZi53aWR0aCAhPSBOTDgwMjExX0NIQU5fV0lEVEhfMTApICYmCgkJKGNvbmYtPmNoYW5k ZWYud2lkdGggIT0gTkw4MDIxMV9DSEFOX1dJRFRIXzIwX05PSFQpOwp9CgpzdGF0aWMgaW5saW5l IGVudW0gbmw4MDIxMV9pZnR5cGUKaWVlZTgwMjExX2lmdHlwZV9wMnAoZW51bSBubDgwMjExX2lm dHlwZSB0eXBlLCBib29sIHAycCkKewoJaWYgKHAycCkgewoJCXN3aXRjaCAodHlwZSkgewoJCWNh c2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKCQkJcmV0dXJuIE5MODAyMTFfSUZUWVBFX1AyUF9D TElFTlQ7CgkJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKCQkJcmV0dXJuIE5MODAyMTFfSUZUWVBF X1AyUF9HTzsKCQlkZWZhdWx0OgoJCQlicmVhazsKCQl9Cgl9CglyZXR1cm4gdHlwZTsKfQoKc3Rh dGljIGlubGluZSBlbnVtIG5sODAyMTFfaWZ0eXBlCmllZWU4MDIxMV92aWZfdHlwZV9wMnAoc3Ry dWN0IGllZWU4MDIxMV92aWYgKnZpZikKewoJcmV0dXJuIGllZWU4MDIxMV9pZnR5cGVfcDJwKHZp Zi0+dHlwZSwgdmlmLT5wMnApOwp9CgovKioKICogaWVlZTgwMjExX3VwZGF0ZV9tdV9ncm91cHMg LSBzZXQgdGhlIFZIVCBNVS1NSU1PIGdyb3VkIGRhdGEKICoKICogQHZpZjogdGhlIHNwZWNpZmll ZCB2aXJ0dWFsIGludGVyZmFjZQogKiBAbWVtYmVyc2hpcDogNjQgYml0cyBhcnJheSAtIGEgYml0 IGlzIHNldCBpZiBzdGF0aW9uIGlzIG1lbWJlciBvZiB0aGUgZ3JvdXAKICogQHBvc2l0aW9uOiAy IGJpdHMgcGVyIGdyb3VwIGlkIGluZGljYXRpbmcgdGhlIHBvc2l0aW9uIGluIHRoZSBncm91cAog KgogKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgZ2l2ZW4gdmlmIGlzIHZh bGlkIGFuZCB0aGUgcG9zaXRpb24gYW5kCiAqIG1lbWJlcnNoaXAgZGF0YSBpcyBvZiB0aGUgY29y cmVjdCBzaXplIGFuZCBhcmUgaW4gdGhlIHNhbWUgYnl0ZSBvcmRlciBhcyB0aGUKICogbWF0Y2hp bmcgR3JvdXBJZCBtYW5hZ2VtZW50IGZyYW1lLgogKiBDYWxscyB0byB0aGlzIGZ1bmN0aW9uIG5l ZWQgdG8gYmUgc2VyaWFsaXplZCB3aXRoIFJYIHBhdGguCiAqLwp2b2lkIGllZWU4MDIxMV91cGRh dGVfbXVfZ3JvdXBzKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCgkJCQljb25zdCB1OCAqbWVt YmVyc2hpcCwgY29uc3QgdTggKnBvc2l0aW9uKTsKCnZvaWQgaWVlZTgwMjExX2VuYWJsZV9yc3Np X3JlcG9ydHMoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKCQkJCSAgIGludCByc3NpX21pbl90 aG9sZCwKCQkJCSAgIGludCByc3NpX21heF90aG9sZCk7Cgp2b2lkIGllZWU4MDIxMV9kaXNhYmxl X3Jzc2lfcmVwb3J0cyhzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKCi8qKgogKiBpZWVlODAy MTFfYXZlX3Jzc2kgLSByZXBvcnQgdGhlIGF2ZXJhZ2UgUlNTSSBmb3IgdGhlIHNwZWNpZmllZCBp bnRlcmZhY2UKICoKICogQHZpZjogdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGludGVyZmFjZQogKgog KiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgZ2l2ZW4gdmlmIGlzIHZhbGlk LgogKgogKiBSZXR1cm46IFRoZSBhdmVyYWdlIFJTU0kgdmFsdWUgZm9yIHRoZSByZXF1ZXN0ZWQg aW50ZXJmYWNlLCBvciAwIGlmIG5vdAogKiBhcHBsaWNhYmxlLgogKi8KaW50IGllZWU4MDIxMV9h dmVfcnNzaShzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKCi8qKgogKiBpZWVlODAyMTFfcmVw b3J0X3dvd2xhbl93YWtldXAgLSByZXBvcnQgV29XTEFOIHdha2V1cAogKiBAdmlmOiB2aXJ0dWFs IGludGVyZmFjZQogKiBAd2FrZXVwOiB3YWtldXAgcmVhc29uKHMpCiAqIEBnZnA6IGFsbG9jYXRp b24gZmxhZ3MKICoKICogU2VlIGNmZzgwMjExX3JlcG9ydF93b3dsYW5fd2FrZXVwKCkuCiAqLwp2 b2lkIGllZWU4MDIxMV9yZXBvcnRfd293bGFuX3dha2V1cChzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAq dmlmLAoJCQkJICAgIHN0cnVjdCBjZmc4MDIxMV93b3dsYW5fd2FrZXVwICp3YWtldXAsCgkJCQkg ICAgZ2ZwX3QgZ2ZwKTsKCi8qKgogKiBpZWVlODAyMTFfdHhfcHJlcGFyZV9za2IgLSBwcmVwYXJl IGFuIDgwMi4xMSBza2IgZm9yIHRyYW5zbWlzc2lvbgogKiBAaHc6IHBvaW50ZXIgYXMgb2J0YWlu ZWQgZnJvbSBpZWVlODAyMTFfYWxsb2NfaHcoKQogKiBAdmlmOiB2aXJ0dWFsIGludGVyZmFjZQog KiBAc2tiOiBmcmFtZSB0byBiZSBzZW50IGZyb20gd2l0aGluIHRoZSBkcml2ZXIKICogQGJhbmQ6 IHRoZSBiYW5kIHRvIHRyYW5zbWl0IG9uCiAqIEBzdGE6IG9wdGlvbmFsIHBvaW50ZXIgdG8gZ2V0 IHRoZSBzdGF0aW9uIHRvIHNlbmQgdGhlIGZyYW1lIHRvCiAqCiAqIE5vdGU6IG11c3QgYmUgY2Fs bGVkIHVuZGVyIFJDVSBsb2NrCiAqLwpib29sIGllZWU4MDIxMV90eF9wcmVwYXJlX3NrYihzdHJ1 Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwg c3RydWN0IHNrX2J1ZmYgKnNrYiwKCQkJICAgICAgaW50IGJhbmQsIHN0cnVjdCBpZWVlODAyMTFf c3RhICoqc3RhKTsKCi8qKgogKiBzdHJ1Y3QgaWVlZTgwMjExX25vYV9kYXRhIC0gaG9sZHMgdGVt cG9yYXJ5IGRhdGEgZm9yIHRyYWNraW5nIFAyUCBOb0Egc3RhdGUKICoKICogQG5leHRfdHNmOiBU U0YgdGltZXN0YW1wIG9mIHRoZSBuZXh0IGFic2VudCBzdGF0ZSBjaGFuZ2UKICogQGhhc19uZXh0 X3RzZjogbmV4dCBhYnNlbnQgc3RhdGUgY2hhbmdlIGV2ZW50IHBlbmRpbmcKICoKICogQGFic2Vu dDogZGVzY3JpcHRvciBiaXRtYXNrLCBzZXQgaWYgR08gaXMgY3VycmVudGx5IGFic2VudAogKgog KiBwcml2YXRlOgogKgogKiBAY291bnQ6IGNvdW50IGZpZWxkcyBmcm9tIHRoZSBOb0EgZGVzY3Jp cHRvcnMKICogQGRlc2M6IGFkanVzdGVkIGRhdGEgZnJvbSB0aGUgTm9BCiAqLwpzdHJ1Y3QgaWVl ZTgwMjExX25vYV9kYXRhIHsKCXUzMiBuZXh0X3RzZjsKCWJvb2wgaGFzX25leHRfdHNmOwoKCXU4 IGFic2VudDsKCgl1OCBjb3VudFtJRUVFODAyMTFfUDJQX05PQV9ERVNDX01BWF07CglzdHJ1Y3Qg ewoJCXUzMiBzdGFydDsKCQl1MzIgZHVyYXRpb247CgkJdTMyIGludGVydmFsOwoJfSBkZXNjW0lF RUU4MDIxMV9QMlBfTk9BX0RFU0NfTUFYXTsKfTsKCi8qKgogKiBpZWVlODAyMTFfcGFyc2VfcDJw X25vYSAtIGluaXRpYWxpemUgTm9BIHRyYWNraW5nIGRhdGEgZnJvbSBQMlAgSUUKICoKICogQGF0 dHI6IFAyUCBOb0EgSUUKICogQGRhdGE6IE5vQSB0cmFja2luZyBkYXRhCiAqIEB0c2Y6IGN1cnJl bnQgVFNGIHRpbWVzdGFtcAogKgogKiBSZXR1cm46IG51bWJlciBvZiBzdWNjZXNzZnVsbHkgcGFy c2VkIGRlc2NyaXB0b3JzCiAqLwppbnQgaWVlZTgwMjExX3BhcnNlX3AycF9ub2EoY29uc3Qgc3Ry dWN0IGllZWU4MDIxMV9wMnBfbm9hX2F0dHIgKmF0dHIsCgkJCSAgICBzdHJ1Y3QgaWVlZTgwMjEx X25vYV9kYXRhICpkYXRhLCB1MzIgdHNmKTsKCi8qKgogKiBpZWVlODAyMTFfdXBkYXRlX3AycF9u b2EgLSBnZXQgbmV4dCBwZW5kaW5nIFAyUCBHTyBhYnNlbnQgc3RhdGUgY2hhbmdlCiAqCiAqIEBk YXRhOiBOb0EgdHJhY2tpbmcgZGF0YQogKiBAdHNmOiBjdXJyZW50IFRTRiB0aW1lc3RhbXAKICov CnZvaWQgaWVlZTgwMjExX3VwZGF0ZV9wMnBfbm9hKHN0cnVjdCBpZWVlODAyMTFfbm9hX2RhdGEg KmRhdGEsIHUzMiB0c2YpOwoKLyoqCiAqIGllZWU4MDIxMV90ZGxzX29wZXIgLSByZXF1ZXN0IHVz ZXJzcGFjZSB0byBwZXJmb3JtIGEgVERMUyBvcGVyYXRpb24KICogQHZpZjogdmlydHVhbCBpbnRl cmZhY2UKICogQHBlZXI6IHRoZSBwZWVyJ3MgZGVzdGluYXRpb24gYWRkcmVzcwogKiBAb3Blcjog dGhlIHJlcXVlc3RlZCBURExTIG9wZXJhdGlvbgogKiBAcmVhc29uX2NvZGU6IHJlYXNvbiBjb2Rl IGZvciB0aGUgb3BlcmF0aW9uLCB2YWxpZCBmb3IgVERMUyB0ZWFyZG93bgogKiBAZ2ZwOiBhbGxv Y2F0aW9uIGZsYWdzCiAqCiAqIFNlZSBjZmc4MDIxMV90ZGxzX29wZXJfcmVxdWVzdCgpLgogKi8K dm9pZCBpZWVlODAyMTFfdGRsc19vcGVyX3JlcXVlc3Qoc3RydWN0IGllZWU4MDIxMV92aWYgKnZp ZiwgY29uc3QgdTggKnBlZXIsCgkJCQkgZW51bSBubDgwMjExX3RkbHNfb3BlcmF0aW9uIG9wZXIs CgkJCQkgdTE2IHJlYXNvbl9jb2RlLCBnZnBfdCBnZnApOwoKLyoqCiAqIGllZWU4MDIxMV9yZXNl cnZlX3RpZCAtIHJlcXVlc3QgdG8gcmVzZXJ2ZSBhIHNwZWNpZmljIFRJRAogKgogKiBUaGVyZSBp cyBzb21ldGltZXMgYSBuZWVkIChzdWNoIGFzIGluIFRETFMpIGZvciBibG9ja2luZyB0aGUgZHJp dmVyIGZyb20KICogdXNpbmcgYSBzcGVjaWZpYyBUSUQgc28gdGhhdCB0aGUgRlcgY2FuIHVzZSBp dCBmb3IgY2VydGFpbiBvcGVyYXRpb25zIHN1Y2gKICogYXMgc2VuZGluZyBQVEkgcmVxdWVzdHMu IFRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBkcml2ZXIgZG9lc24ndCB1c2UgdGhhdCBUSUQsCiAqIHRo aXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYXMgaXQgZmx1c2hlcyBvdXQgcGFja2V0cyBvbiB0 aGlzIFRJRCBhbmQgbWFya3MKICogaXQgYXMgYmxvY2tlZCwgc28gdGhhdCBhbnkgdHJhbnNtaXQg Zm9yIHRoZSBzdGF0aW9uIG9uIHRoaXMgVElEIHdpbGwgYmUKICogcmVkaXJlY3RlZCB0byB0aGUg YWx0ZXJuYXRpdmUgVElEIGluIHRoZSBzYW1lIEFDLgogKgogKiBOb3RlIHRoYXQgdGhpcyBmdW5j dGlvbiBibG9ja3MgYW5kIG1heSBjYWxsIGJhY2sgaW50byB0aGUgZHJpdmVyLCBzbyBpdAogKiBz aG91bGQgYmUgY2FsbGVkIHdpdGhvdXQgZHJpdmVyIGxvY2tzIGhlbGQuIEFsc28gbm90ZSB0aGlz IGZ1bmN0aW9uIHNob3VsZAogKiBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBkcml2ZXIncyBAc3Rh X3N0YXRlIGNhbGxiYWNrLgogKgogKiBAc3RhOiB0aGUgc3RhdGlvbiB0byByZXNlcnZlIHRoZSBU SUQgZm9yCiAqIEB0aWQ6IHRoZSBUSUQgdG8gcmVzZXJ2ZQogKgogKiBSZXR1cm5zOiAwIG9uIHN1 Y2Nlc3MsIGVsc2Ugb24gZmFpbHVyZQogKi8KaW50IGllZWU4MDIxMV9yZXNlcnZlX3RpZChzdHJ1 Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1OCB0aWQpOwoKLyoqCiAqIGllZWU4MDIxMV91bnJlc2Vy dmVfdGlkIC0gcmVxdWVzdCB0byB1bnJlc2VydmUgYSBzcGVjaWZpYyBUSUQKICoKICogT25jZSB0 aGVyZSBpcyBubyBsb25nZXIgYW55IG5lZWQgZm9yIHJlc2VydmluZyBhIGNlcnRhaW4gVElELCB0 aGlzIGZ1bmN0aW9uCiAqIHNob3VsZCBiZSBjYWxsZWQsIGFuZCBubyBsb25nZXIgd2lsbCBwYWNr ZXRzIGhhdmUgdGhlaXIgVElEIG1vZGlmaWVkIGZvcgogKiBwcmV2ZW50aW5nIHVzZSBvZiB0aGlz IFRJRCBpbiB0aGUgZHJpdmVyLgogKgogKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBibG9ja3Mg YW5kIGFjcXVpcmVzIGEgbG9jaywgc28gaXQgc2hvdWxkIGJlIGNhbGxlZAogKiB3aXRob3V0IGRy aXZlciBsb2NrcyBoZWxkLiBBbHNvIG5vdGUgdGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBj YWxsZWQKICogZnJvbSB0aGUgZHJpdmVyJ3MgQHN0YV9zdGF0ZSBjYWxsYmFjay4KICoKICogQHN0 YTogdGhlIHN0YXRpb24KICogQHRpZDogdGhlIFRJRCB0byB1bnJlc2VydmUKICovCnZvaWQgaWVl ZTgwMjExX3VucmVzZXJ2ZV90aWQoc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTggdGlkKTsK Ci8qKgogKiBpZWVlODAyMTFfdHhfZGVxdWV1ZSAtIGRlcXVldWUgYSBwYWNrZXQgZnJvbSBhIHNv ZnR3YXJlIHR4IHF1ZXVlCiAqCiAqIEBodzogcG9pbnRlciBhcyBvYnRhaW5lZCBmcm9tIGllZWU4 MDIxMV9hbGxvY19odygpCiAqIEB0eHE6IHBvaW50ZXIgb2J0YWluZWQgZnJvbSBzdGF0aW9uIG9y IHZpcnR1YWwgaW50ZXJmYWNlLCBvciBmcm9tCiAqCWllZWU4MDIxMV9uZXh0X3R4cSgpCiAqCiAq IFJldHVybnMgdGhlIHNrYiBpZiBzdWNjZXNzZnVsLCAlTlVMTCBpZiBubyBmcmFtZSB3YXMgYXZh aWxhYmxlLgogKgogKiBOb3RlIHRoYXQgdGhpcyBtdXN0IGJlIGNhbGxlZCBpbiBhbiByY3VfcmVh ZF9sb2NrKCkgY3JpdGljYWwgc2VjdGlvbiwKICogd2hpY2ggY2FuIG9ubHkgYmUgcmVsZWFzZWQg YWZ0ZXIgdGhlIFNLQiB3YXMgaGFuZGxlZC4gU29tZSBwb2ludGVycyBpbgogKiBza2ItPmNiLCBl LmcuIHRoZSBrZXkgcG9pbnRlciwgYXJlIHByb3RlY3RlZCBieSBieSBSQ1UgYW5kIHRodXMgdGhl CiAqIGNyaXRpY2FsIHNlY3Rpb24gbXVzdCBwZXJzaXN0IG5vdCBqdXN0IGZvciB0aGUgZHVyYXRp b24gb2YgdGhpcyBjYWxsCiAqIGJ1dCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBmcmFtZSBoYW5k bGluZy4KICogSG93ZXZlciwgYWxzbyBub3RlIHRoYXQgd2hpbGUgaW4gdGhlIHdha2VfdHhfcXVl dWUoKSBtZXRob2QsCiAqIHJjdV9yZWFkX2xvY2soKSBpcyBhbHJlYWR5IGhlbGQuCiAqCiAqIHNv ZnRpcnFzIG11c3QgYWxzbyBiZSBkaXNhYmxlZCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVk LgogKiBJbiBwcm9jZXNzIGNvbnRleHQsIHVzZSBpZWVlODAyMTFfdHhfZGVxdWV1ZV9uaSgpIGlu c3RlYWQuCiAqLwpzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX3R4X2RlcXVldWUoc3RydWN0IGll ZWU4MDIxMV9odyAqaHcsCgkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhxICp0eHEpOwoKLyoq CiAqIGllZWU4MDIxMV90eF9kZXF1ZXVlX25pIC0gZGVxdWV1ZSBhIHBhY2tldCBmcm9tIGEgc29m dHdhcmUgdHggcXVldWUKICogKGluIHByb2Nlc3MgY29udGV4dCkKICoKICogTGlrZSBpZWVlODAy MTFfdHhfZGVxdWV1ZSgpIGJ1dCBjYW4gYmUgY2FsbGVkIGluIHByb2Nlc3MgY29udGV4dAogKiAo aW50ZXJuYWxseSBkaXNhYmxlcyBib3R0b20gaGFsdmVzKS4KICoKICogQGh3OiBwb2ludGVyIGFz IG9idGFpbmVkIGZyb20gaWVlZTgwMjExX2FsbG9jX2h3KCkKICogQHR4cTogcG9pbnRlciBvYnRh aW5lZCBmcm9tIHN0YXRpb24gb3IgdmlydHVhbCBpbnRlcmZhY2UsIG9yIGZyb20KICoJaWVlZTgw MjExX25leHRfdHhxKCkKICovCnN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIx MV90eF9kZXF1ZXVlX25pKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkJCQkgICAgICBzdHJ1 Y3QgaWVlZTgwMjExX3R4cSAqdHhxKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoKCWxvY2FsX2Jo X2Rpc2FibGUoKTsKCXNrYiA9IGllZWU4MDIxMV90eF9kZXF1ZXVlKGh3LCB0eHEpOwoJbG9jYWxf YmhfZW5hYmxlKCk7CgoJcmV0dXJuIHNrYjsKfQoKLyoqCiAqIGllZWU4MDIxMV9uZXh0X3R4cSAt IGdldCBuZXh0IHR4IHF1ZXVlIHRvIHB1bGwgcGFja2V0cyBmcm9tCiAqCiAqIEBodzogcG9pbnRl ciBhcyBvYnRhaW5lZCBmcm9tIGllZWU4MDIxMV9hbGxvY19odygpCiAqIEBhYzogQUMgbnVtYmVy IHRvIHJldHVybiBwYWNrZXRzIGZyb20uCiAqCiAqIFJldHVybnMgdGhlIG5leHQgdHhxIGlmIHN1 Y2Nlc3NmdWwsICVOVUxMIGlmIG5vIHF1ZXVlIGlzIGVsaWdpYmxlLiBJZiBhIHR4cQogKiBpcyBy ZXR1cm5lZCwgaXQgc2hvdWxkIGJlIHJldHVybmVkIHdpdGggaWVlZTgwMjExX3JldHVybl90eHEo KSBhZnRlciB0aGUKICogZHJpdmVyIGhhcyBmaW5pc2hlZCBzY2hlZHVsaW5nIGl0LgogKi8Kc3Ry dWN0IGllZWU4MDIxMV90eHEgKmllZWU4MDIxMV9uZXh0X3R4cShzdHJ1Y3QgaWVlZTgwMjExX2h3 ICpodywgdTggYWMpOwoKLyoqCiAqIGllZWU4MDIxMV90eHFfc2NoZWR1bGVfc3RhcnQgLSBzdGFy dCBuZXcgc2NoZWR1bGluZyByb3VuZCBmb3IgVFhRcwogKgogKiBAaHc6IHBvaW50ZXIgYXMgb2J0 YWluZWQgZnJvbSBpZWVlODAyMTFfYWxsb2NfaHcoKQogKiBAYWM6IEFDIG51bWJlciB0byBhY3F1 aXJlIGxvY2tzIGZvcgogKgogKiBTaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBpZWVlODAyMTFfbmV4 dF90eHEoKSBvciBpZWVlODAyMTFfcmV0dXJuX3R4cSgpLgogKiBUaGUgZHJpdmVyIG11c3Qgbm90 IGNhbGwgbXVsdGlwbGUgVFhRIHNjaGVkdWxpbmcgcm91bmRzIGNvbmN1cnJlbnRseS4KICovCnZv aWQgaWVlZTgwMjExX3R4cV9zY2hlZHVsZV9zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywg dTggYWMpOwoKLyogKGRlcHJlY2F0ZWQpICovCnN0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFf dHhxX3NjaGVkdWxlX2VuZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggYWMpCnsKfQoKdm9p ZCBfX2llZWU4MDIxMV9zY2hlZHVsZV90eHEoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCgkJCSAg ICAgIHN0cnVjdCBpZWVlODAyMTFfdHhxICp0eHEsIGJvb2wgZm9yY2UpOwoKLyoqCiAqIGllZWU4 MDIxMV9zY2hlZHVsZV90eHEgLSBzY2hlZHVsZSBhIFRYUSBmb3IgdHJhbnNtaXNzaW9uCiAqCiAq IEBodzogcG9pbnRlciBhcyBvYnRhaW5lZCBmcm9tIGllZWU4MDIxMV9hbGxvY19odygpCiAqIEB0 eHE6IHBvaW50ZXIgb2J0YWluZWQgZnJvbSBzdGF0aW9uIG9yIHZpcnR1YWwgaW50ZXJmYWNlCiAq CiAqIFNjaGVkdWxlcyBhIFRYUSBmb3IgdHJhbnNtaXNzaW9uIGlmIGl0IGlzIG5vdCBhbHJlYWR5 IHNjaGVkdWxlZCwKICogZXZlbiBpZiBtYWM4MDIxMSBkb2VzIG5vdCBoYXZlIGFueSBwYWNrZXRz IGJ1ZmZlcmVkLgogKgogKiBUaGUgZHJpdmVyIG1heSBjYWxsIHRoaXMgZnVuY3Rpb24gaWYgaXQg aGFzIGJ1ZmZlcmVkIHBhY2tldHMgZm9yCiAqIHRoaXMgVFhRIGludGVybmFsbHkuCiAqLwpzdGF0 aWMgaW5saW5lIHZvaWQKaWVlZTgwMjExX3NjaGVkdWxlX3R4cShzdHJ1Y3QgaWVlZTgwMjExX2h3 ICpodywgc3RydWN0IGllZWU4MDIxMV90eHEgKnR4cSkKewoJX19pZWVlODAyMTFfc2NoZWR1bGVf dHhxKGh3LCB0eHEsIHRydWUpOwp9CgovKioKICogaWVlZTgwMjExX3JldHVybl90eHEgLSByZXR1 cm4gYSBUWFEgcHJldmlvdXNseSBhY3F1aXJlZCBieSBpZWVlODAyMTFfbmV4dF90eHEoKQogKgog KiBAaHc6IHBvaW50ZXIgYXMgb2J0YWluZWQgZnJvbSBpZWVlODAyMTFfYWxsb2NfaHcoKQogKiBA dHhxOiBwb2ludGVyIG9idGFpbmVkIGZyb20gc3RhdGlvbiBvciB2aXJ0dWFsIGludGVyZmFjZQog KiBAZm9yY2U6IHNjaGVkdWxlIHR4cSBldmVuIGlmIG1hYzgwMjExIGRvZXMgbm90IGhhdmUgYW55 IGJ1ZmZlcmVkIHBhY2tldHMuCiAqCiAqIFRoZSBkcml2ZXIgbWF5IHNldCBmb3JjZT10cnVlIGlm IGl0IGhhcyBidWZmZXJlZCBwYWNrZXRzIGZvciB0aGlzIFRYUQogKiBpbnRlcm5hbGx5LgogKi8K c3RhdGljIGlubGluZSB2b2lkCmllZWU4MDIxMV9yZXR1cm5fdHhxKHN0cnVjdCBpZWVlODAyMTFf aHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3R4cSAqdHhxLAoJCSAgICAgYm9vbCBmb3JjZSkKewoJ X19pZWVlODAyMTFfc2NoZWR1bGVfdHhxKGh3LCB0eHEsIGZvcmNlKTsKfQoKLyoqCiAqIGllZWU4 MDIxMV90eHFfbWF5X3RyYW5zbWl0IC0gY2hlY2sgd2hldGhlciBUWFEgaXMgYWxsb3dlZCB0byB0 cmFuc21pdAogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2hlY2sgd2hldGhlciBnaXZl biB0eHEgaXMgYWxsb3dlZCB0byB0cmFuc21pdCBieQogKiB0aGUgYWlydGltZSBzY2hlZHVsZXIs IGFuZCBjYW4gYmUgdXNlZCBieSBkcml2ZXJzIHRvIGFjY2VzcyB0aGUgYWlydGltZQogKiBmYWly bmVzcyBhY2NvdW50aW5nIHdpdGhvdXQgZ29pbmcgdXNpbmcgdGhlIHNjaGVkdWxpbmcgb3JkZXIg ZW5mb3JlZCBieQogKiBuZXh0X3R4cSgpLgogKgogKiBSZXR1cm5zICV0cnVlIGlmIHRoZSBhaXJ0 aW1lIHNjaGVkdWxlciB0aGlua3MgdGhlIFRYUSBzaG91bGQgYmUgYWxsb3dlZCB0bwogKiB0cmFu c21pdCwgYW5kICVmYWxzZSBpZiBpdCBzaG91bGQgYmUgdGhyb3R0bGVkLiBUaGlzIGZ1bmN0aW9u IGNhbiBhbHNvIGhhdmUKICogdGhlIHNpZGUgZWZmZWN0IG9mIHJvdGF0aW5nIHRoZSBUWFEgaW4g dGhlIHNjaGVkdWxlciByb3RhdGlvbiwgd2hpY2ggd2lsbAogKiBldmVudHVhbGx5IGJyaW5nIHRo ZSBkZWZpY2l0IHRvIHBvc2l0aXZlIGFuZCBhbGxvdyB0aGUgc3RhdGlvbiB0byB0cmFuc21pdAog KiBhZ2Fpbi4KICoKICogVGhlIEFQSSBpZWVlODAyMTFfdHhxX21heV90cmFuc21pdCgpIGFsc28g ZW5zdXJlcyB0aGF0IFRYUSBsaXN0IHdpbGwgYmUKICogYWxpZ25lZCBhZ2FpbnN0IGRyaXZlcidz IG93biByb3VuZC1yb2JpbiBzY2hlZHVsZXIgbGlzdC4gaS5lIGl0IHJvdGF0ZXMKICogdGhlIFRY USBsaXN0IHRpbGwgaXQgbWFrZXMgdGhlIHJlcXVlc3RlZCBub2RlIGJlY29tZXMgdGhlIGZpcnN0 IGVudHJ5CiAqIGluIFRYUSBsaXN0LiBUaHVzIGJvdGggdGhlIFRYUSBsaXN0IGFuZCBkcml2ZXIn cyBsaXN0IGFyZSBpbiBzeW5jLiBJZiB0aGlzCiAqIGZ1bmN0aW9uIHJldHVybnMgJXRydWUsIHRo ZSBkcml2ZXIgaXMgZXhwZWN0ZWQgdG8gc2NoZWR1bGUgcGFja2V0cwogKiBmb3IgdHJhbnNtaXNz aW9uLCBhbmQgdGhlbiByZXR1cm4gdGhlIFRYUSB0aHJvdWdoIGllZWU4MDIxMV9yZXR1cm5fdHhx KCkuCiAqCiAqIEBodzogcG9pbnRlciBhcyBvYnRhaW5lZCBmcm9tIGllZWU4MDIxMV9hbGxvY19o dygpCiAqIEB0eHE6IHBvaW50ZXIgb2J0YWluZWQgZnJvbSBzdGF0aW9uIG9yIHZpcnR1YWwgaW50 ZXJmYWNlCiAqLwpib29sIGllZWU4MDIxMV90eHFfbWF5X3RyYW5zbWl0KHN0cnVjdCBpZWVlODAy MTFfaHcgKmh3LAoJCQkJc3RydWN0IGllZWU4MDIxMV90eHEgKnR4cSk7CgovKioKICogaWVlZTgw MjExX3R4cV9nZXRfZGVwdGggLSBnZXQgcGVuZGluZyBmcmFtZS9ieXRlIGNvdW50IG9mIGdpdmVu IHR4cQogKgogKiBUaGUgdmFsdWVzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSBjb2hlcmVudCB3 aXRoIHJlZ2FyZCB0byBlYWNoIG90aGVyLCBpLmUuCiAqIHR4cSBzdGF0ZSBjYW4gY2hhbmdlIGhh bGYtd2F5IG9mIHRoaXMgZnVuY3Rpb24gYW5kIHRoZSBjYWxsZXIgbWF5IGVuZCB1cAogKiB3aXRo ICJuZXciIGZyYW1lX2NudCBhbmQgIm9sZCIgYnl0ZV9jbnQgb3IgdmljZS12ZXJzYS4KICoKICog QHR4cTogcG9pbnRlciBvYnRhaW5lZCBmcm9tIHN0YXRpb24gb3IgdmlydHVhbCBpbnRlcmZhY2UK ICogQGZyYW1lX2NudDogcG9pbnRlciB0byBzdG9yZSBmcmFtZSBjb3VudAogKiBAYnl0ZV9jbnQ6 IHBvaW50ZXIgdG8gc3RvcmUgYnl0ZSBjb3VudAogKi8Kdm9pZCBpZWVlODAyMTFfdHhxX2dldF9k ZXB0aChzdHJ1Y3QgaWVlZTgwMjExX3R4cSAqdHhxLAoJCQkgICAgIHVuc2lnbmVkIGxvbmcgKmZy YW1lX2NudCwKCQkJICAgICB1bnNpZ25lZCBsb25nICpieXRlX2NudCk7CgovKioKICogaWVlZTgw MjExX25hbl9mdW5jX3Rlcm1pbmF0ZWQgLSBub3RpZnkgYWJvdXQgTkFOIGZ1bmN0aW9uIHRlcm1p bmF0aW9uLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbm90aWZ5IG1hYzgwMjExIGFi b3V0IE5BTiBmdW5jdGlvbiB0ZXJtaW5hdGlvbi4KICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24g Y2FuJ3QgYmUgY2FsbGVkIGZyb20gaGFyZCBpcnEuCiAqCiAqIEB2aWY6ICZzdHJ1Y3QgaWVlZTgw MjExX3ZpZiBwb2ludGVyIGZyb20gdGhlIGFkZF9pbnRlcmZhY2UgY2FsbGJhY2suCiAqIEBpbnN0 X2lkOiB0aGUgbG9jYWwgaW5zdGFuY2UgaWQKICogQHJlYXNvbjogdGVybWluYXRpb24gcmVhc29u IChvbmUgb2YgdGhlIE5MODAyMTFfTkFOX0ZVTkNfVEVSTV9SRUFTT05fKikKICogQGdmcDogYWxs b2NhdGlvbiBmbGFncwogKi8Kdm9pZCBpZWVlODAyMTFfbmFuX2Z1bmNfdGVybWluYXRlZChzdHJ1 Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAoJCQkJICAgdTggaW5zdF9pZCwKCQkJCSAgIGVudW0gbmw4 MDIxMV9uYW5fZnVuY190ZXJtX3JlYXNvbiByZWFzb24sCgkJCQkgICBnZnBfdCBnZnApOwoKLyoq CiAqIGllZWU4MDIxMV9uYW5fZnVuY19tYXRjaCAtIG5vdGlmeSBhYm91dCBOQU4gZnVuY3Rpb24g bWF0Y2ggZXZlbnQuCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBub3RpZnkgbWFjODAy MTEgYWJvdXQgTkFOIGZ1bmN0aW9uIG1hdGNoLiBUaGUKICogY29va2llIGluc2lkZSB0aGUgbWF0 Y2ggc3RydWN0IHdpbGwgYmUgYXNzaWduZWQgYnkgbWFjODAyMTEuCiAqIE5vdGUgdGhhdCB0aGlz IGZ1bmN0aW9uIGNhbid0IGJlIGNhbGxlZCBmcm9tIGhhcmQgaXJxLgogKgogKiBAdmlmOiAmc3Ry dWN0IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNlIGNhbGxiYWNr LgogKiBAbWF0Y2g6IG1hdGNoIGV2ZW50IGluZm9ybWF0aW9uCiAqIEBnZnA6IGFsbG9jYXRpb24g ZmxhZ3MKICovCnZvaWQgaWVlZTgwMjExX25hbl9mdW5jX21hdGNoKHN0cnVjdCBpZWVlODAyMTFf dmlmICp2aWYsCgkJCSAgICAgIHN0cnVjdCBjZmc4MDIxMV9uYW5fbWF0Y2hfcGFyYW1zICptYXRj aCwKCQkJICAgICAgZ2ZwX3QgZ2ZwKTsKCi8qKgogKiBpZWVlODAyMTFfY2FsY19yeF9haXJ0aW1l IC0gY2FsY3VsYXRlIGVzdGltYXRlZCB0cmFuc21pc3Npb24gYWlydGltZSBmb3IgUlguCiAqCiAq IFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgZXN0aW1hdGVkIGFpcnRpbWUgdXNhZ2Ugb2Yg YSBmcmFtZSBiYXNlZCBvbiB0aGUKICogcmF0ZSBpbmZvcm1hdGlvbiBpbiB0aGUgUlggc3RhdHVz IHN0cnVjdCBhbmQgdGhlIGZyYW1lIGxlbmd0aC4KICoKICogQGh3OiBwb2ludGVyIGFzIG9idGFp bmVkIGZyb20gaWVlZTgwMjExX2FsbG9jX2h3KCkKICogQHN0YXR1czogJnN0cnVjdCBpZWVlODAy MTFfcnhfc3RhdHVzIGNvbnRhaW5pbmcgdGhlIHRyYW5zbWlzc2lvbiByYXRlCiAqICAgICAgICAg IGluZm9ybWF0aW9uLgogKiBAbGVuOiBmcmFtZSBsZW5ndGggaW4gYnl0ZXMKICovCnUzMiBpZWVl ODAyMTFfY2FsY19yeF9haXJ0aW1lKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAoJCQkgICAgICBz dHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzLAoJCQkgICAgICBpbnQgbGVuKTsKCi8q KgogKiBpZWVlODAyMTFfY2FsY190eF9haXJ0aW1lIC0gY2FsY3VsYXRlIGVzdGltYXRlZCB0cmFu c21pc3Npb24gYWlydGltZSBmb3IgVFguCiAqCiAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0 aGUgZXN0aW1hdGVkIGFpcnRpbWUgdXNhZ2Ugb2YgYSBmcmFtZSBiYXNlZCBvbiB0aGUKICogcmF0 ZSBpbmZvcm1hdGlvbiBpbiB0aGUgVFggaW5mbyBzdHJ1Y3QgYW5kIHRoZSBmcmFtZSBsZW5ndGgu CiAqCiAqIEBodzogcG9pbnRlciBhcyBvYnRhaW5lZCBmcm9tIGllZWU4MDIxMV9hbGxvY19odygp CiAqIEBpbmZvOiAmc3RydWN0IGllZWU4MDIxMV90eF9pbmZvIG9mIHRoZSBmcmFtZS4KICogQGxl bjogZnJhbWUgbGVuZ3RoIGluIGJ5dGVzCiAqLwp1MzIgaWVlZTgwMjExX2NhbGNfdHhfYWlydGlt ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9p bmZvICppbmZvLAoJCQkgICAgICBpbnQgbGVuKTsKLyoqCiAqIGllZWU4MDIxMV9zZXRfaHdfODAy MTFfZW5jYXAgLSBlbmFibGUgaGFyZHdhcmUgZW5jYXBzdWxhdGlvbiBvZmZsb2FkaW5nLgogKgog KiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbm90aWZ5IG1hYzgwMjExIHRoYXQgYSB2aWYgY2Fu IGJlIHBhc3NlZCByYXcgODAyLjMKICogZnJhbWVzLiBUaGUgZHJpdmVyIG5lZWRzIHRvIHRoZW4g aGFuZGxlIHRoZSA4MDIuMTEgZW5jYXBzdWxhdGlvbiBpbnNpZGUgdGhlCiAqIGhhcmR3YXJlIG9y IGZpcm13YXJlLgogKgogKiBAdmlmOiAmc3RydWN0IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9t IHRoZSBhZGRfaW50ZXJmYWNlIGNhbGxiYWNrLgogKiBAZW5hYmxlOiBpbmRpY2F0ZSBpZiB0aGUg ZmVhdHVyZSBzaG91bGQgYmUgdHVybmVkIG9uIG9yIG9mZgogKi8KYm9vbCBpZWVlODAyMTFfc2V0 X2h3XzgwMjExX2VuY2FwKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIGJvb2wgZW5hYmxlKTsK CiNlbmRpZiAvKiBNQUM4MDIxMV9IICovCg== --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Sat May 23 16:22:12 2020 Received: (at 41465) by debbugs.gnu.org; 23 May 2020 20:22:12 +0000 Received: from localhost ([127.0.0.1]:35806 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jcaeq-0004RZ-At for submit@debbugs.gnu.org; Sat, 23 May 2020 16:22:12 -0400 Received: from mail-wr1-f47.google.com ([209.85.221.47]:42072) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jcaeo-0004RM-5C for 41465@debbugs.gnu.org; Sat, 23 May 2020 16:22:10 -0400 Received: by mail-wr1-f47.google.com with SMTP id s8so13609421wrt.9 for <41465@debbugs.gnu.org>; Sat, 23 May 2020 13:22:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=hQT3GUIyzaS+JEnXkHZtSeJmT4ARVJJkvuW0q4WMR+M=; b=bQeeAazj2XsNt94l/mw1Nn67DOxXuteXFpHdQC9dFQAnxp6Gih9NfunSSY69Jg+ulx Ngb9GDYX79OlVcl9xQNv2VdmKc4cv7u3Bh5GnZJBuDQWD0iPOeif1yFXxhUtG5BbYIGj cyS+VWWZF0mlqZJ2W5k5al1SQKPr51GUiu2NtlYiDf8IFqRrnNkY04ZeZzmw2xXDNBSm IKdyLA5UockUYf6ccrUm+9l0RdrrZ7IayDbClgbVvUu9BZrGt8o05wsBPey4eagizwtu te4CuiYHLU3THIsoPFUb8VEMQF0v24hdbtdxZ8m7GgJJD8B0GWlG9LDqLtISCwv9R1Vz nkkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=hQT3GUIyzaS+JEnXkHZtSeJmT4ARVJJkvuW0q4WMR+M=; b=knQhqDJC4Pyfy9Pb/E4qvYOPh9QpTISUou7XNh+Q2HCG7xANb5xzljRNbHHGDbVOWT g62Aei6Eu1C/JW9A3RReMvDZJ5wwiVNXs2NWf0nrr4gGRFz7W/pGywjihr2jUZDf4kkm i9JQD76dHvZEV6iUi6t9oka5XMhW4gSIPem5lVKvMF5Zp/X730zAqtSTjWjw0iE39ER7 c4JvmR85XXXIv/gxO+Vb7fyz2sBPKeFqJI1i+rrx0UHUEjdnEWOFYa6Y5oG23dZ9p0AN PJbq6Tjst84JWHJUcHsF03S6Fj2TI98t5jS30AD2x8Oe0RzHsAMmsV1qgiOu5Wzc2GiQ WH3g== X-Gm-Message-State: AOAM532VmOEUxCq42Y+LFq+PCS8/O/NUw6XecWS2atkqTR40fNqnQKse jkMRo93vjFL5xPilNsx9OzQz8gpK X-Google-Smtp-Source: ABdhPJx+HPOWQqRNaaLZR7K0tsXyClyDIOUF7A2QlcflBAPgKXTErRBpRH02lynYfNmVYaliMNMepA== X-Received: by 2002:a5d:6584:: with SMTP id q4mr8991302wru.12.1590265323987; Sat, 23 May 2020 13:22:03 -0700 (PDT) Received: from [192.168.0.3] ([66.205.73.129]) by smtp.googlemail.com with ESMTPSA id i6sm14872024wmb.41.2020.05.23.13.22.02 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 23 May 2020 13:22:03 -0700 (PDT) Subject: Re: bug#41465: 28.0.50 (but also earlier versions); etags asserion error (with too many files?) To: Gregor Zattler , 41465@debbugs.gnu.org References: <87sgfr936a.fsf@no.workgroup> <7a33e971-a8fa-99d2-3067-cac00ebbaebb@yandex.ru> <87pnavt5h4.fsf@no.workgroup> From: Dmitry Gutov Message-ID: <6a858c86-c68a-e49d-c4a4-31928fd3390d@yandex.ru> Date: Sat, 23 May 2020 23:22:01 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: <87pnavt5h4.fsf@no.workgroup> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Score: 0.5 (/) X-Debbugs-Envelope-To: 41465 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.5 (/) On 23.05.2020 11:34, Gregor Zattler wrote: > I attach these two files. Thank you. But I couldn't reproduce the error. Do you get the same result if you run etags cs43130.c mac80211.h ? Are you sure this executable came from the Emacs tree? If you have a checkout of that development tree, can you run it from there? E.g. path/to/emacs/lib-src/emacs cs43130.c mac80211.h ? From debbugs-submit-bounces@debbugs.gnu.org Sat May 23 19:07:41 2020 Received: (at 41465) by debbugs.gnu.org; 23 May 2020 23:07:41 +0000 Received: from localhost ([127.0.0.1]:36021 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jcdEz-0008Py-Bc for submit@debbugs.gnu.org; Sat, 23 May 2020 19:07:41 -0400 Received: from mout.gmx.net ([212.227.15.18]:43955) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jcdEu-0008Ph-7T for 41465@debbugs.gnu.org; Sat, 23 May 2020 19:07:40 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1590275250; bh=9s0pFwZX4ReSQEO8md1HzbEWxFWZF/ZrvnPsxxtEukY=; h=X-UI-Sender-Class:From:To:Subject:In-Reply-To:References:Date; b=QF2Sy52orP2eDJqg222gy17mQgEGRPtYrXMjYEIczC/edqO+TB+tMqCCmAIWhtUUE nmOwJfi/rOCOsbM5EYcqvCUOPg79oYeQ6Wg/dSnvtt3IWCGyI6m1JcWjIkn10yANxR ZmW7Xs+hEVFcKP73yRyiRXX5Awvjpz4tH9zQGnTI= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from no.workgroup ([46.94.158.150]) by mail.gmx.com (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MfpSl-1j5EMK4AZN-00gEoh; Sun, 24 May 2020 01:07:30 +0200 From: Gregor Zattler To: Dmitry Gutov , 41465@debbugs.gnu.org Subject: Re: bug#41465: 28.0.50 (but also earlier versions); etags asserion error (with too many files?) In-Reply-To: <6a858c86-c68a-e49d-c4a4-31928fd3390d@yandex.ru> References: <87sgfr936a.fsf@no.workgroup> <7a33e971-a8fa-99d2-3067-cac00ebbaebb@yandex.ru> <87pnavt5h4.fsf@no.workgroup> <6a858c86-c68a-e49d-c4a4-31928fd3390d@yandex.ru> Date: Sun, 24 May 2020 01:07:26 +0200 Message-ID: <87367q1c9d.fsf@no.workgroup> MIME-Version: 1.0 Content-Type: text/plain X-Provags-ID: V03:K1:piZOI+fcBHC1VTEuXUYCwh7wYqLOi6EMOY28DbIMmz2iduQ5qog j9zdMRKpN5xnvslHHYAXZMohZ+eKOw4zDhyw5qgu4zFgVtl7UH275JNxnOKGlVOr3dGJdIf uSF8Edrl0FvgTOkRBrFNIDTXUbCsxERhAJ1RziqT3gXpMcKJKLOvvEXSGPb0gG4T5ElJuxv snLM/MZXNc+Y+CDHhjIPA== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:u7ViXpLXVTg=:a+QI5iMWdeRKxLCX9vl0D2 oExrCkXLDL8Za68P+YDvNzYe5kcgAz+AL7r8nObRcCAOON3S794dh8Uv6Xgq7VP4bziDdQOQZ PYQ0qmwLHF82EMXrdWhB+xWvgVuX9Qa/D1Iiy1zajo988YHRfaKXcqPoDDJUCzPu/DKYCzggi QsstPOrP55khjPzb0sfvqT9t+9taDnWG7qbyDYHeAgZ4zo/jZ69Oza+3CQWxgpAq7Xv8U++Bp 0Zt2cr3FALgXta2LNAYiaO0yojsrE41qMe/aLgxpm9ny2SPlvBtoyXYt8Bxnibxm+qzdQXyDu wO9k86BTtnUlFF5OfmtfFSZz9OMYpyFUgHZ4Cf6u9fGxbJTm2OTIKAtOKUPdxebg+3EY0dRTf H5tiYs5VG0j6m5PtISRUcmzbF3d5XW3rqT7TnSvBezV514lgNiSSWuBcHq6igSx2oVX6LOA8P CizPHJK7JawZUcmfPkjeDKC3btLzft1eZrWlY5J9UhqGUiHsbi4YVh8+OZ355k5sqGGqQWGQE mAm39LoaRQMGvENYQMyT3sRE7qDp/HDREnSpnsTuPQT7JSIV7n5VxQvQtOHSuE0NCLVfnnszk c6H0p0ktfijdnNMP2fOEwwjv/YGFwhDdfnk99/AALEoPyS41z42hmsHJ+cl/dNnQX1P63cYJw 14x1x6rVyTErxjkq36qIO12/q+YG0MueVdp4gyTzWUrg2lq5L90VpNd/JK+fRSSPgLTKVApfm W8JHfa3+TcHsMM9qPwTjcBcri5neqxR3IOgqIBB58BZxtleM+Cav8zHju9kfCXoDYADAIgU9h Joferd7ZrUxYzL7d1//K+/x14ud6BEeVe9EVgHQRPNhX97r06is+lo3gzYmXBCLQWeRV7I/Wn 3BX1FZW8GwbRq1Jl4flz4XrC3rYhcGrq/f1ocOKnWHq4mm7VaiPt7Q42KwaW4BlFV9hI+xpMJ 8DrjRrIxN4xxmRtfTtXSKB5KAneMFlHSaGPlK8eDC0j6YmLVvcxexX+UFnn8mLskP7dl63jZg uEubzg7V1rVHnJU2/bCi3Kx1xLJi6XJP+AX17oddEQLvnAc3dmux6WLjLvU1sSRunvBuqQwE9 fNy4F3leGS80IIm0lZENn7Yv8e4zlvny29vJR/KH7Dl06PY1/eZ6V6mEwX+eZ/M4VYIqS8lFd CFPEVbTvxEl3L0c/8JK8Yj96f6NIJTjK1+YlUueZWmhFiyuYet3YU7Hknfed9wD3msztHcROl JqDp1okRRX3WlU4I8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 41465 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Hi Dmitry, * Dmitry Gutov [2020-05-23; 23:22]: > On 23.05.2020 11:34, Gregor Zattler wrote: >> I attach these two files. > > Thank you. But I couldn't reproduce the error. > > Do you get the same result if you run > > etags cs43130.c mac80211.h > > ? > > Are you sure this executable came from the Emacs tree? If you have a > checkout of that development tree, can you run it from there? E.g. > > path/to/emacs/lib-src/emacs cs43130.c mac80211.h I did it again: 0 (master *) grfz@no:~/.cron.daily$ ~/src/emacs/lib-src/etags ~/src/linux/= sound/soc/codecs/cs43130.c etags: etags.c:1988: pfnote: Assertion `name =3D=3D NULL || name[0] !=3D '= \0'' failed. Aborted 134 (master *) grfz@no:~/.cron.daily$ /usr/bin/etags ~/src/linux//include/= net/mac80211.h etags: etags.c:1987: pfnote: Assertion `name =3D=3D NULL || name[0] !=3D '= \0'' failed. Aborted 134 (master *) grfz@no:~/.cron.daily$ This also happens with the binary from debian buster 10.4 , therefore I don't think it is caused by my specific build options, which anyway are: CFLAGS=3D'-g -O2 -fdebug-prefix-map=3D/home/grfz/src/emacs=3D. -fstack-pro= tector-strong -Wformat -Werror=3Dformat-security -Wall -fno-pie' LDFLAGS=3D'-Wl,-z,relro -no-pie' CPPFLAGS=3D'-Wdate-time -D_FORTIFY_SOURCE=3D2 ' ./configure -C --prefix=3D/usr/local/stow/emacs-snapshot --with-file-notif= ication=3Dinotify --with-cairo --without-toolkit-scroll-bars --with-x-tool= kit=3Dgtk3 --with-sound=3Dyes --without-gconf --with-mailutils --with-x=3D= yes --enable-checking=3Dyes --enable-check-lisp-object-type=3Dyes --with-n= ativecomp For me this assertion error is not a big problem since I now exclude the linux src tree from the tags creation because of emacs performance reasons. Ciao; Gregor =2D- -... --- .-. . -.. ..--.. ...-.- From debbugs-submit-bounces@debbugs.gnu.org Sat May 23 21:44:05 2020 Received: (at 41465) by debbugs.gnu.org; 24 May 2020 01:44:05 +0000 Received: from localhost ([127.0.0.1]:36098 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jcfgL-0003YF-DP for submit@debbugs.gnu.org; Sat, 23 May 2020 21:44:05 -0400 Received: from mail-wm1-f46.google.com ([209.85.128.46]:53521) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jcfgK-0003Xf-5f for 41465@debbugs.gnu.org; Sat, 23 May 2020 21:44:04 -0400 Received: by mail-wm1-f46.google.com with SMTP id u1so12209303wmn.3 for <41465@debbugs.gnu.org>; Sat, 23 May 2020 18:44:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=b7NMIQQyepQuJsqT0ki8tucDCAIx93MAe0g5ANr3l5E=; b=H+L+dWcroN1EUznbNdRwEYKHTSwpSF0Xo8THjdgie483JY/M/9z8NR8u7/9bCduqLv CKHei3r3DS8p12EVW4kY+7aFRGeqasKhooEAYEbAAKhuJmKTb3l/6+8wO5dTM6cE4T0N ElTFfqeLMGjECwxdYxd3OmEunbqu9Dr63qUrruSkKaZKucu45JbjYpHXDsQofMrJYWdI XX9Rn0x3FPhFcwJjp7uFTaXAwAZyYkKgCTfaRf18TZh9ZW8LT7wnPjt2ULkB96jtUsK9 aGhA2jsRBlqhlWaKDNfC0YjzDKgoE6+V+HdYv/cKmS14KYkj4ktUFZ/gDK+9Ay47nMYA zghQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=b7NMIQQyepQuJsqT0ki8tucDCAIx93MAe0g5ANr3l5E=; b=qZJflOiMr31NXQAOnDl13EM7J2YKRnD/XSP7sVqP/r7M4bkKyga6L66LgWtZgmNFnJ /B4pc+/2FqtiP1HiftP3BbZls++3jDpUiLKrCdnh/Z8VH8n9/H3UEhwZudMn5kz16lo1 Uuys9iKawrJ1nCzgU2YTK9Hil/jAJJXwgFDEwXWjzhklrrBDDNl52Rj3C7Bzt9p+tIyH wO2Wg2wXyGzpt6OTpmNBG8g6iD/DTRdyyQS2ERU8n0PHOanMOUZxnlqgpVfnBofAlqA/ DAwk/gIYG34WupZ2jqe7QvJ+OnEjNWJqTPpHcity9I69mO85YWV1eRVUZmJDdLMiRB3w 0BwQ== X-Gm-Message-State: AOAM533X/atceWy9p/UYJQe9URTtO0xTQtMAbhzda7p7fOk3llkXcdBH SfHIok/sb4pSyy1YTYfWSV6KSNfB X-Google-Smtp-Source: ABdhPJw5qtphCs+44qs1kg4TWiRkX2eAcTLb04r7gxLfG249oWLUTqrNxZO2MNuY1KYeWsaEMpuMPg== X-Received: by 2002:a05:600c:290f:: with SMTP id i15mr19592379wmd.153.1590284607950; Sat, 23 May 2020 18:43:27 -0700 (PDT) Received: from [192.168.0.3] ([66.205.73.129]) by smtp.googlemail.com with ESMTPSA id r3sm13378650wmh.48.2020.05.23.18.43.26 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 23 May 2020 18:43:27 -0700 (PDT) Subject: Re: bug#41465: 28.0.50 (but also earlier versions); etags asserion error (with too many files?) To: Gregor Zattler , 41465@debbugs.gnu.org References: <87sgfr936a.fsf@no.workgroup> <7a33e971-a8fa-99d2-3067-cac00ebbaebb@yandex.ru> <87pnavt5h4.fsf@no.workgroup> <6a858c86-c68a-e49d-c4a4-31928fd3390d@yandex.ru> <87367q1c9d.fsf@no.workgroup> From: Dmitry Gutov Message-ID: Date: Sun, 24 May 2020 04:43:25 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: <87367q1c9d.fsf@no.workgroup> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Score: 0.5 (/) X-Debbugs-Envelope-To: 41465 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.5 (/) On 24.05.2020 02:07, Gregor Zattler wrote: > This also happens with the binary from debian buster 10.4 , > therefore I don't think it is caused by my specific build > options, which anyway are: > > CFLAGS='-g -O2 -fdebug-prefix-map=/home/grfz/src/emacs=. -fstack-protector-strong -Wformat -Werror=format-security -Wall -fno-pie' > > LDFLAGS='-Wl,-z,relro -no-pie' > > CPPFLAGS='-Wdate-time -D_FORTIFY_SOURCE=2 ' > > ./configure -C --prefix=/usr/local/stow/emacs-snapshot --with-file-notification=inotify --with-cairo --without-toolkit-scroll-bars --with-x-toolkit=gtk3 --with-sound=yes --without-gconf --with-mailutils --with-x=yes --enable-checking=yes --enable-check-lisp-object-type=yes --with-nativecomp > > > For me this assertion error is not a big problem since I now > exclude the linux src tree from the tags creation because of > emacs performance reasons. Thanks you for that addition. Indeed, when I configure Emacs with CFLAGS='-g -O2' --enable-checking etags does abort with assertion errors you described. From debbugs-submit-bounces@debbugs.gnu.org Sun May 24 10:18:18 2020 Received: (at 41465) by debbugs.gnu.org; 24 May 2020 14:18:18 +0000 Received: from localhost ([127.0.0.1]:38409 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jcrSD-0007br-R0 for submit@debbugs.gnu.org; Sun, 24 May 2020 10:18:18 -0400 Received: from mail-wm1-f49.google.com ([209.85.128.49]:40455) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jcrSC-0007bd-DW for 41465@debbugs.gnu.org; Sun, 24 May 2020 10:18:16 -0400 Received: by mail-wm1-f49.google.com with SMTP id y5so1253351wmi.5 for <41465@debbugs.gnu.org>; Sun, 24 May 2020 07:18:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=FgN6GsCbSDctf8fZtmHgW6kBJ+COv8kbu+aXntpmarQ=; b=kUpRHURzAqiJPG65Fkp4BH1pini13K+ARLMt7Gpy8Zafy8dPsjIxr8DPv/nGzRgPBc c4gi2Ig96FX3QS+LXmJXvrkfyXfwQEhNJOxjd9iPBNkX0pWadgsrvmeuzLG9P4GU07II gM2ROp+aEA0q5P067vzVahlbSbEtKpxslOcdmS3tUBY3UjkDgLgc1bhY8bWm2Fu8C6Mq OYJpkKe143j51d+JSyF/vbMUe1G9/ARU/tS1cEs/qgpApt2H25QlsQVxMqn9Qu9CHCra ckUJTiZm9hNjZy4Ovgf4xfDqwdfgkQOOP2gJrNaerF7fTrtX1Qhly6VHbeMc1QQszdiH cfNA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:references:cc:from:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=FgN6GsCbSDctf8fZtmHgW6kBJ+COv8kbu+aXntpmarQ=; b=uU2TCJNHHmxulQh+MXMkJX06fYfw7Uzh1fK7wuV7kqNFI1cdgK6gwrc+I1PHPz9mcn V1O6v7giefBtEseTSfIqJy0EvQABlHGulVrqegX2M0e3pX1CJDrX+DHwOj2gyk9Vc6rg /tq1gnLFYXMir00pv4R9OaQ1GaxuLSXRP2g+I9ipV96NIIie03qqdGxcmhbqI8pgbtT2 TbHysf0+pFs0M/+1sFQ9pEixK0aoqCUAc0t10bajtvxilE6Oi0UtlbiVp1DOp+MmysNP skCHza6n4SLZUHA/weW72PMZ6jE9O+jwbPL2Sd8rU+/zwwg9BqlKSnIVjRyH6pNXMI9+ u0Dw== X-Gm-Message-State: AOAM531yTLLKxJ5pGJHujAP34gZjaDkDkkYlXrgKrpsx+GuAs7jyKeEj gIFf+4e+G8as0QDRCW1kGFQao49S X-Google-Smtp-Source: ABdhPJyCkoEGHkwYgT0qdBMe7vKP2Acf1gIgxBokgsGCmBwFqPinXYpKXP6/+MLIfXVIXItmU7n36Q== X-Received: by 2002:a7b:c939:: with SMTP id h25mr21113641wml.9.1590329890287; Sun, 24 May 2020 07:18:10 -0700 (PDT) Received: from [192.168.0.3] ([66.205.73.129]) by smtp.googlemail.com with ESMTPSA id y207sm16577968wmd.7.2020.05.24.07.18.08 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 24 May 2020 07:18:09 -0700 (PDT) Subject: Re: bug#41465: 28.0.50 (but also earlier versions); etags asserion error (with too many files?) To: Gregor Zattler References: <87sgfr936a.fsf@no.workgroup> <7a33e971-a8fa-99d2-3067-cac00ebbaebb@yandex.ru> <87pnavt5h4.fsf@no.workgroup> <6a858c86-c68a-e49d-c4a4-31928fd3390d@yandex.ru> <87367q1c9d.fsf@no.workgroup> <87r1v9hl9s.fsf@no.workgroup> From: Dmitry Gutov Message-ID: <5d285545-e4fe-f9bb-813f-2d2bb83a7b2d@yandex.ru> Date: Sun, 24 May 2020 17:18:07 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: <87r1v9hl9s.fsf@no.workgroup> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Score: 0.5 (/) X-Debbugs-Envelope-To: 41465 Cc: 41465@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.5 (/) Hi Gregor, Please keep the bug email in Cc. On 24.05.2020 09:58, Gregor Zattler wrote: > Hi Dmitry, > * Dmitry Gutov [2020-05-24; 04:43]: >> Thanks you for that addition. >> >> Indeed, when I configure Emacs with >> >> CFLAGS='-g -O2' --enable-checking >> >> etags does abort with assertion errors you described. > > arghs, my statement "also happens with the binary from > debian buster 10.4" was wrong. I tested with /usr/bin/etags > but forgot I that wrestled my emacs-27 build into the > alternatives system of debian. > > I tested again with > > 0 (master *) grfz@no:~$ /usr/bin/etags.emacs ~/src/linux//include/net/mac80211.h > 0 (master *) grfz@no:~$ /usr/bin/etags.emacs ~/src/linux/sound/soc/codecs/cs43130.c > > and now there are no assertion errors with these files. Makes sense. > But shouldn't there also be no assertion errors with > --enable-checking ? There shouldn't be. So it's a valuable bug report, just less urgent than we might have decided previously. I'll let our developers who know etags better handle it from here. From debbugs-submit-bounces@debbugs.gnu.org Sun May 24 11:04:40 2020 Received: (at 41465-done) by debbugs.gnu.org; 24 May 2020 15:04:40 +0000 Received: from localhost ([127.0.0.1]:38476 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jcsB6-0000Im-HA for submit@debbugs.gnu.org; Sun, 24 May 2020 11:04:40 -0400 Received: from eggs.gnu.org ([209.51.188.92]:39256) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jcsB4-0000IZ-VB for 41465-done@debbugs.gnu.org; Sun, 24 May 2020 11:04:40 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:33128) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jcsAz-0004OO-H9; Sun, 24 May 2020 11:04:33 -0400 Received: from [176.228.60.248] (port=2656 helo=home-c4e4a596f7) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1jcsAy-0007mt-SX; Sun, 24 May 2020 11:04:33 -0400 Date: Sun, 24 May 2020 18:04:42 +0300 Message-Id: <835zclxtkl.fsf@gnu.org> From: Eli Zaretskii To: Dmitry Gutov In-Reply-To: (message from Dmitry Gutov on Sun, 24 May 2020 04:43:25 +0300) Subject: Re: bug#41465: 28.0.50 (but also earlier versions); etags asserion error (with too many files?) References: <87sgfr936a.fsf@no.workgroup> <7a33e971-a8fa-99d2-3067-cac00ebbaebb@yandex.ru> <87pnavt5h4.fsf@no.workgroup> <6a858c86-c68a-e49d-c4a4-31928fd3390d@yandex.ru> <87367q1c9d.fsf@no.workgroup> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 41465-done Cc: 41465-done@debbugs.gnu.org, telegraph@gmx.net X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > From: Dmitry Gutov > Date: Sun, 24 May 2020 04:43:25 +0300 > > > For me this assertion error is not a big problem since I now > > exclude the linux src tree from the tags creation because of > > emacs performance reasons. > > Thanks you for that addition. > > Indeed, when I configure Emacs with > > CFLAGS='-g -O2' --enable-checking > > etags does abort with assertion errors you described. Thanks, I applied the trivial band-aid to fix this on the emacs-27 branch. From unknown Tue Jun 17 01:27:50 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Mon, 22 Jun 2020 11:24:07 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator