Return-Path: Delivered-To: apmail-httpd-test-dev-archive@httpd.apache.org Received: (qmail 71791 invoked by uid 500); 1 May 2002 20:53:59 -0000 Mailing-List: contact test-dev-help@httpd.apache.org; run by ezmlm Precedence: bulk Reply-To: test-dev@httpd.apache.org list-help: list-unsubscribe: list-post: Delivered-To: mailing list test-dev@httpd.apache.org Received: (qmail 71774 invoked from network); 1 May 2002 20:53:58 -0000 Sender: gregames Message-ID: <3CD063F8.7B094989@apache.org> Date: Wed, 01 May 2002 17:54:00 -0400 From: Greg Ames X-Mailer: Mozilla 4.77 [en] (X11; U; Linux 2.2.19-10mdk i686) MIME-Version: 1.0 To: test-dev@httpd.apache.org CC: Dirk-Willem van Gulik , David Hill , Sander Temme Subject: mod_specweb99 Content-Type: multipart/mixed; boundary="------------D0C47736C629AA0986AFC710" X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N --------------D0C47736C629AA0986AFC710 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit What do folks think about adding mod_specweb99 (attached) as an Apache httpd-test component? It is a module which allows you to benchmark Apache 2.0 or 1.3 using the SPECweb99 benchmarking suite, described at http://www.spec.org/osg/web99/ . While there certainly are improvements that could be made to the code, I feel it's in good enough shape now to put in a public CVS and have the benefits of many eyeballs looking at it. Several of us have been passing around tarballs, diffs, and new versions of files, but that gets hard to manage pretty quickly. Many thanks to Covalent Technologies for agreeing to donate this code to the ASF, especially to Sander Temme and Dirk-Willem van Gulik who are the authors. David Hill from Compaq has also been contributing a lot of 2.0 fixes. Greg --------------D0C47736C629AA0986AFC710 Content-Type: application/x-tar; name="specweb99.tar" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="specweb99.tar" aHR0cGQuc3BlY3dlYi5jb25mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQA MDAwMDc2NwAwMDAwNzY1ADAwMDAwMDAxMTQwADA3NDYzMzQxNDI2ADAxNDY2NwAgMAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAGdyZWdh bWVzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ3JlZ2FtZXMAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIFNhbXBsZSBjb25maWcgZmlsZQojIFhYWFgg CVVzZXIgY29uZmlndXJhYmxlIHRoaW5ncyBhdCB0aGUgZW5kLgojICAgICAgCVRoaXMgYXNz dW1lcyB3YWYvY2FkL3VwZi1nZW4gYW5kIHRoZSBwZXJsCiMJY2dpIHNjcmlwdCB0byBiZSBp biBkb2Nyb290LgojCiMKTG9hZE1vZHVsZSBzcGVjd2ViOTlfbW9kdWxlICAgbW9kX3NwZWN3 ZWI5OS5zbwoKPExvY2F0aW9uIC9zcGVjd2ViOTlnZXQ+CiAgICAgICAgU2V0SGFuZGxlciBz cGVjd2ViOTlnZXQKPC9Mb2NhdGlvbj4KCjxMb2NhdGlvbiAvc3BlY3dlYjk5Y2FkZ2V0Pgog ICAgU2V0SGFuZGxlciBzcGVjd2ViOTljYWRnZXQKPC9Mb2NhdGlvbj4KCjxMb2NhdGlvbiAv c3BlY3dlYjk5aGs+CiAgICBTZXRIYW5kbGVyIHNwZWN3ZWI5OWhrCjwvTG9jYXRpb24+Cgo8 TG9jYXRpb24gL3NwZWN3ZWI5OXBvc3Q+CiAgICBTZXRIYW5kbGVyIHNwZWN3ZWI5OXBvc3QK PC9Mb2NhdGlvbj4KCkFsaWFzCS9zcGVjd2ViOTljZ2kgL3NwZWNid2ViOTlfY2dpLnBsCgpB ZGRIYW5kbGVyIGNnaS1zY3JpcHQJIC5wbAoKPERpcmVjdG9yeSA8ZG9jcm9vdD4vc3BlY3dl Yjk5LnBsPgoJT3B0aW9ucyArRXhlY0NHSQo8L0RpcmVjdG9yeT4KCgAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATElDRU5TRS50eHQAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMDc2NwAwMDAwNzY1ADAwMDAwMDA0NzMzADA3 NDYyMjc1Mjc0ADAxMzExMgAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAB1c3RhciAgAGdyZWdhbWVzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ3Jl Z2FtZXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvKiA9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQogKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24g MS4xCiAqCiAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUg Rm91bmRhdGlvbi4gIEFsbCByaWdodHMKICogcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0 aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91 dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s bG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICoKICogMS4gUmVkaXN0cmlidXRpb25z IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAg bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj bGFpbWVyLgogKgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KICogICAgdGhl IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo ZQogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0 aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAogKiAgICBpZiBhbnksIG11 c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgogKiAgICAgICAiVGhp cyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKICogICAgICAg IEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4i CiAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4g dGhlIHNvZnR3YXJlIGl0c2VsZiwKICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQt cGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KICoKICogNC4gVGhlIG5h bWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKICog ICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQg ZnJvbSB0aGlzCiAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNz aW9uLiBGb3Igd3JpdHRlbgogKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFj aGVAYXBhY2hlLm9yZy4KICoKICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29m dHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCiAqICAgIG5vciBtYXkgIkFwYWNo ZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgogKiAgICBw ZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KICoKICogVEhJ UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1Ig SU1QTElFRAogKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg VEhFIElNUExJRUQgV0FSUkFOVElFUwogKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQogKiBESVNDTEFJTUVELiAgSU4gTk8g RVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCiAqIElUUyBD T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF TlRBTCwKICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg KElOQ0xVRElORywgQlVUIE5PVAogKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCiAqIFVTRSwgREFUQSwgT1IgUFJP RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKICog T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD VCBMSUFCSUxJVFksCiAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAogKiBPRiBUSEUgVVNFIE9GIFRISVMgU09G VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKICogU1VDSCBE QU1BR0UuCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09CiAqCiAqIFRoaXMgc29mdHdhcmUgd2FzIGNvbnRy aWJ1dGVkIGJ5IENvdmFsZW50IFRlY2hub2xvZ2llcyBJbmMsIAogKiBodHRwOi8vd3d3LmNv dmFsZW50Lm5ldC8gYXJvdW5kIEFwcmlsIDIwMDIuCiAqLwoAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAcmMuYnlyZF9hcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAADAxMDA2NDQAMDAwMDc2NwAwMDAwNzY1ADAwMDAwMDAxMDM0ADA3NDYzNTU1 NDMzADAxMzIyMwAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAB1c3RhciAgAGdyZWdhbWVzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ3JlZ2FtZXMA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIFJlbGV2YW50 IHNlY3Rpb24gZnJvbSB0aGUgcmMuKiBmaWxlcyBmb3Igc3BlY3dlYi4KIwpDTElFTlRTPTEw LjAuNDQuMlsxXXsxMC4wLjQzLjMwfSAxMC4wLjQ0LjNbMV17MTAuMC40My4zMH0gMTAuMC40 NC40WzFdezEwLjAuNDMuMzB9IDEwLjAuNDQuNVsxXXsxMC4wLjQzLjMwfSAxMC4wLjQ0LjZb MV17MTAuMC40My4zMH0gMTAuMC40NC43WzFdezEwLjAuNDMuMzB9IAoKU0VSVkVSPTEwLjAu NDQuNDAKClVSTF9ST09UPWh0dHA6Ly9AQFNFUlZFUkBACgpEWU5BTUlDX1JPT1Q9aHR0cDov L0BAU0VSVkVSQEAvc3BlY3dlYjk5Y2dpCkRZTl9HRVRfU0NSSVBUPWh0dHA6Ly9AQFNFUlZF UkBAL3NwZWN3ZWI5OWdldApEWU5fQ0FEX1NDUklQVD1odHRwOi8vQEBTRVJWRVJAQC9zcGVj d2ViOTljYWRnZXQKRFlOX1BPU1RfU0NSSVBUPWh0dHA6Ly9AQFNFUlZFUkBAL3NwZWN3ZWI5 OXBvc3QKRFlOX0NNRF9TQ1JJUFQ9aHR0cDovL0BAU0VSVkVSQEAvc3BlY3dlYjk5aGsKRFlO X0NHSV9TQ1JJUFQ9aHR0cDovL0BAU0VSVkVSQEAvc3BlY3dlYjk5Y2dpCgoAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUkVBRE1FAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMDc2NwAwMDAw NzY1ADAwMDAwMDAxMjI0ADA3NDY0MDEzNjAxADAxMjEyMQAgMAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAGdyZWdhbWVzAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAZ3JlZ2FtZXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABUaGlzIGlzIGEgbW9kdWxlIGZvciB0aGUgQXBhY2hlIHdlYiBzZXJ2 ZXIgdGhhdCBpbXBsZW1lbnRzIHRoZSBkeW5hbWljCmNvbnRlbnQgcmVxdWlyZW1lbnRzIGZv ciB0aGUgU1BFQ1dlYjk5IGJlbmNobWFyayBmcm9tIHRoZSBTdGFuZGFyZApQZXJmb3JtYW5j ZSBFdmFsdWF0aW9uIENvcnBvcmF0aW9uIDxodHRwOi8vd3d3LnNwZWMub3JnLz4uIAoKVXNl IG9mIHRoaXMgbW9kdWxlIGFuZCBkaXNjbG9zdXJlIG9mIHJ1biByZXN1bHRzIGFyZSBzdWJq ZWN0IHRvIHRoZSBSdW4KUnVsZXMgb2YgU1BFQ1dlYjk5IHdoaWNoIGNhbiBiZSBmb3VuZCBp biB0aGUgU1BFQ1dlYjk5IGRpc3RyaWJ1dGlvbi4gCgoKUmVxdWlyZW1lbnRzCgotICAgQXBh Y2hlCgotICAgU1BFQ1dlYjk5IHN1aXRlCiAgICB3YWZnZW45OSwgY2FkZ2VuOTkgYW5kIHVw Zmdlbjk5IGluc3RhbGxlZCBpbiBkb2Nyb290LgoKLSAgIEEgU1BFQ1dlYjk5IENHSSBzY3Jp cHQgb3IgcHJvZ3JhbS4gRXhhbXBsZXMgY29tZSB3aXRoIHRoZQogICAgU1BFQ1dlYjk5IGRp c3RyaWJ1dGlvbi4KCjEuMyAxLjMgdmVyc2lvbiBvZiB0aGUgbW9kdWxlOyBtb3JlIGNvbXBs ZXRlCiAgICB0aGFuIDIuMAoKMi4wIDIuMCB2ZXJzaW9uIG9mIHRoZSBtb2R1bGU7IG9ubHkg cGFydGx5CiAgICBpbXBsZW1lbnRlZC4gCgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAc3BlY3dlYjk5LTEuMy8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAADAwNDA3NTUAMDAwMDc2NwAwMDAwNzY1ADAwMDAwMDAwMDAwADA3NDY0MDEzNzE2ADAx MzM2NQAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1 c3RhciAgAGdyZWdhbWVzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ3JlZ2FtZXMAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzcGVjd2ViOTktMS4zL21v ZF9zcGVjd2ViOTkuYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDEwMDc1NQAwMDAwNzY3ADAwMDA3NjUA MDAwMDAxNjc1MTUAMDc0NjMzMzI3MDEAMDE2MjE2ACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAZ3JlZ2FtZXMAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAABncmVnYW1lcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGlj ZW5zZSwgVmVyc2lvbiAxLjEKICoKICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgVGhlIEFw YWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwogKiByZXNlcnZlZC4KICoK ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg d2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKgogKiAxLiBS ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv cHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg Zm9sbG93aW5nIGRpc2NsYWltZXIuCiAqCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGlj ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l ciBpbgogKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy b3ZpZGVkIHdpdGggdGhlCiAqICAgIGRpc3RyaWJ1dGlvbi4KICoKICogMy4gVGhlIGVuZC11 c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCiAq ICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6 CiAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5 IHRoZQogKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cu YXBhY2hlLm9yZy8pLiIKICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQg bWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAogKiAgICBpZiBhbmQgd2hlcmV2 ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgog KgogKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRh dGlvbiIgbXVzdAogKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJv ZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3 cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCiAqICAgIHBlcm1pc3Npb24sIHBsZWFz ZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgogKgogKiA1LiBQcm9kdWN0cyBkZXJpdmVk IGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKICogICAg bm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3 cml0dGVuCiAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5Z IEVYUFJFU1NFRCBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P VCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJ TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiAqIERJU0NM QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJ T04gT1IKICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO RElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVF TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFBST0NV UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKICogVVNF LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg Q0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJ R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiAqIE9GIFRIRSBV U0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU WSBPRgogKiBTVUNIIERBTUFHRS4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICoKICogVGhpcyBzb2Z0 d2FyZSB3YXMgY29udHJpYnV0ZWQgYnkgQ292YWxlbnQgVGVjaG5vbG9naWVzIEluYywgCiAq IGh0dHA6Ly93d3cuY292YWxlbnQubmV0IGFyb3VuZCBBcHJpbCAyMDAwMi4KICogCiAqIG1v ZF9zcGVjd2ViOTkuYyAtLSBBcGFjaGUgIHNwZWN3ZWI5OSBtb2R1bGUKICogc2N0ZW1tZSBK dWx5IDIwMDEKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5o PgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiNpbmNsdWRl IDxzeXMvdGltZS5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8c3lzL2ZpbGUuaD4K I2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzeXMvZmNudGwuaD4KI2luY2x1ZGUgPHVu aXN0ZC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KCiNpbmNsdWRlIDxtbS5oPgoKI2lmZGVmIFNP TEFSSVMyCiNpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgoKI2lmbmRlZiBMT0NLX1NICi8q IG5vcm1hbGx5IGluIHN5cy9maWxlLmggKGluIHVjYmluY2x1ZGUgb24gc29sYXJpcyAyKSov CiNkZWZpbmUgTE9DS19TSCAgICAgICAgIDEJLyogc2hhcmVkIGxvY2sgKi8KI2RlZmluZSBM T0NLX0VYICAgICAgICAgMgkvKiBleGNsdXNpdmUgbG9jayAqLwojZGVmaW5lIExPQ0tfTkIg ICAgICAgICA0CS8qIGRvbid0IGJsb2NrIHdoZW4gbG9ja2luZyAqLwojZGVmaW5lIExPQ0tf VU4gICAgICAgICA4CS8qIHVubG9jayAqLwojZW5kaWYKCiNpbmNsdWRlICJodHRwZC5oIgoj aW5jbHVkZSAiaHR0cF9jb3JlLmgiCiNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgojaW5jbHVk ZSAiaHR0cF9sb2cuaCIKI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKI2luY2x1ZGUgImh0 dHBfbWFpbi5oIgojaW5jbHVkZSAidXRpbF9zY3JpcHQuaCIKI2luY2x1ZGUgImFwX2NvbmZp Zy5oIgoKLyogU2V0IHRvIGF1Z21lbnQgZnN0YXQoKSBiYXNlZCAncmVzZXQnIGNoZWNrcy4g QXMgcGVyIHJ1biBydWxlcwogKiB0aGUgZmlsZSBpcyBzdGlsbCBzdGF0KCktZWQuCiAqLwoj ZGVmaW5lIFNFTUNOVFIKCiNpZmRlZiBTRU1DTlRSCiNpbmNsdWRlIDxzeXMvaXBjLmg+CiNp bmNsdWRlIDxzeXMvc2VtLmg+CiNkZWZpbmUgU0VNS0VZICg1MzY1MjAwKQp0eXBlZGVmIHVu aW9uIHNlbXVuIHsKICAgIGludCB2YWw7CiAgICBzdHJ1Y3Qgc2VtaWRfZHMgKmJ1ZjsKICAg IHVuc2lnbmVkIHNob3J0ICphcnJheTsKfSAgICAgc2VtdW47CiNlbmRpZgoKLyogTm90ZTog dmVyc2lvbiBtdXN0IGJlIG9mIHRoZSB4Lnl5IHR5cGUgLSBhcyBpdCBpcwogKiBzZW5kIG92 ZXIgdGhlIGh0dHAgcHJvdG9jb2wgd2lyZTsgd2hlcmUgeCBhbmQgeQogKiBhcmUgc2luZ2xl IDAtOSBhc2NpaSBkaWdpdHMgOi0pLiBUaGUgbmFtZSBzaG91bGQKICogYmUgYW4gQS1aYS16 MC05IHN0cmluZy4gV2hpY2ggZG9lcyBub3Qgc3RhcnQgd2l0aAogKiBhIG51bWJlciA6LSkg WW91IHdhbnQgdG8gYXZvaWQgXyBidXQgJy0nIGlzIG5vdCB0b28KICogYmFkIHVzdWFsbHku LgogKi8KI2RlZmluZSBOQU1FICJTcGVjd2ViIgojZGVmaW5lIFZFUlNJT04gIjEuMDAiCgoj aW5jbHVkZSAibW9kX3NwZWN3ZWI5OS5oIgoKbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIHNw ZWN3ZWI5OV9tb2R1bGU7CgplbnVtIGx0eXBlIHsKICAgIFNITE9DSywgRVhMT0NLLCBVTkxP Q0sKfTsKCi8qCiAqIEdsb2JhbCB2YXJpYWJsZTogcG9pbnRlciB0byBzdHJ1Y3R1cmUgdGhh dCBob2xkcyBwb2ludGVycwogKiB0byBzaGFyZSBtZW1vcnkgYnVmZmVycyBmb3IgdXNlciBw cm9maWxlcyBhbmQgY3VzdG9tIGFkIGRhdGEuCiAqLwpNTSAqZ2xvYmFsQnVmZmVyOwpidWZz ICpyZWNfYnVmZmVyOwoKI2RlZmluZSAgX3Jsb2NrKHMscixmZyxmaWxlKQkoX2RvbG9jayhz LHIsZmcsU0hMT0NLLGZpbGUpKQojZGVmaW5lICBfd2xvY2socyxyLGZnLGZpbGUpCShfZG9s b2NrKHMscixmZyxFWExPQ0ssZmlsZSkpCiNkZWZpbmUgX3VubG9jayhzLHIsZmcsZmlsZSkJ KF9kb2xvY2socyxyLGZnLFVOTE9DSyxmaWxlKSkKCi8qIG9uIHNvbWUgT1MtZXMgKGxpbnV4 KSBmd3JpdGUoMmMpL2Z3cml0ZSgyYykgc2VlbQogKiB0byBiZSBhYmxlIHRvIHJ1dHVybiB3 aXRoIEVJTlRSLgogKi8KI2RlZmluZSBfV0lOVFIoeCkgeyB3aGlsZSgoKHgpPDApICYmIChl cnJubyA9PSBFSU5UUikpIHsgLyogTk9QICovIH07IH0KCnN0YXRpYwppbnQgX2xvY2tvcChp bnQgZmQsIGVudW0gbHR5cGUgdHlwZSwgaW50IG5vYmxvY2spCnsKICAgIGludCBlOwojaWZk ZWYgU09MQVJJUzIKICAgIHN0cnVjdCBmbG9jayBsb2NrOwoKICAgIGlmICh0eXBlID09IEVY TE9DSykKCWxvY2subF90eXBlID0gRl9XUkxDSzsKICAgIGVsc2UgaWYgKHR5cGUgPT0gU0hM T0NLKQoJbG9jay5sX3R5cGUgPSBGX1JETENLOwogICAgZWxzZQoJbG9jay5sX3R5cGUgPSBG X1VOTENLOwoKICAgIGxvY2subF93aGVuY2UgPSBTRUVLX1NFVDsKICAgIGxvY2subF9zdGFy dCA9IDA7CiAgICBsb2NrLmxfbGVuID0gMDsKCiAgICAvKgogICAgICogT24gU29sYXJpcyBh bmQgSFBVWCAtIGZjbnRsIHJldHVybnMgLTEgb24gZXJyb3IgYW5kIGp1c3QgYWJvdXQgYW55 CiAgICAgKiBvdGhlciB2YWx1ZSBvbiBzdWNjZXNzLiBJLmUuIG5vdCBhbHdheXMgMC4KICAg ICAqLwogICAgX1dJTlRSKGUgPSAoZmNudGwoZmQsIChub2Jsb2NrKSA/IEZfU0VUTEsgOiBG X1NFVExLVywgJmxvY2spKSk7CgogICAgaWYgKGUgPT0gLTEpIHsKCWlmICgoZXJybm8gPSBF QUdBSU4pICYmIChub2Jsb2NrKSkKCSAgICByZXR1cm4gLTI7CglyZXR1cm4gZTsKICAgIH0K ICAgIHJldHVybiAwOwojZWxzZQogICAgaW50IGxvY2tfdHlwZTsKICAgIGlmICh0eXBlID09 IFNITE9DSykKCWxvY2tfdHlwZSA9IExPQ0tfU0g7CiAgICBpZiAodHlwZSA9PSBFWExPQ0sp Cglsb2NrX3R5cGUgPSBMT0NLX0VYOwogICAgZWxzZQoJbG9ja190eXBlID0gTE9DS19VTjsK CiAgICBpZiAobm9ibG9jaykKCWxvY2tfdHlwZSB8PSBMT0NLX05COwoKICAgIF9XSU5UUihl ID0gZmxvY2soZmQsIGxvY2tfdHlwZSkpOwogICAgaWYgKGUpIHsKCWlmICgoZXJybm8gPT0g RVdPVUxEQkxPQ0spICYmIChub2Jsb2NrKSkKCSAgICByZXR1cm4gLTI7CgllbHNlCgkgICAg cmV0dXJuIC0xOwogICAgfQojZW5kaWYKICAgIHJldHVybiAwOwp9CgovKiBnZW5lcmljIGxv Y2tpbmcKICogLSB3aGVuICdyJyBpcyBwYXNzZWQgLSB3aWxsIGRvIGEgdGltZW91dC4KICog LSB3aGVuICdzJyBpcyBwYXNzZWQgLSBkbyBhcHByb3ByaWF0ZSBsb2dnaW5nLgogKiAtIHdo ZW4gJ2ZpbGUnIGlzIHBhc3NlZCAtIGxvZ2dpbmcgd2lsbCBiZSBtb3JlIG1lYW5pbmdmdWxs CiAqLwpzdGF0aWMKaW50IF9kb2xvY2soc3RydWN0IHNlcnZlcl9yZWMgKnMsIHN0cnVjdCBy ZXF1ZXN0X3JlYyAqciwgRklMRSAqZiwgZW51bSBsdHlwZSB0eXBlLCBjaGFyICpmaWxlKQp7 CiAgICBpbnQgZmQgPSBmaWxlbm8oZik7CiAgICBpbnQgZTsKICAgIC8qCiAgICAgKiBSYXRo ZXIgdGhhbiBzaW1wbHkgdHJ5LWxvY2stYW5kLXdhaXQgLSB3ZSBmaXJzdCBjaGVjayBpZiBh IGxvY2sgd291bGQKICAgICAqIGJsb2NrIC0gYW5kIHRoZW4gc2V0IGEgdGltZW91dCBiZWZv cmUgY2FtcGluZyBvdXQgb24gdGhlIGxvY2suCiAgICAgKi8KICAgIGlmICgoZSA9IF9sb2Nr b3AoZmQsIHR5cGUsIDEpKSA9PSAtMikgewoJaWYgKHIpCgkgICAgYXBfaGFyZF90aW1lb3V0 KCJzcGVjd2ViIGxvY2siLCByKTsKCglpZiAocykKCSAgICBhcF9sb2dfZXJyb3IoQVBMT0df TUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0lORk8sIHMsCgkJCSAiQ2FtcGluZyBvdXQg JXMlcyBmb3IgYSAlcyBsb2NrIiwKCQkJIGZpbGUgPyAib24gIiA6ICIiLCBmaWxlLAoJCQkg KCh0eXBlID09IEVYTE9DSykgPyAid3JpdGUiIDogKCh0eXBlID09IFNITE9DSykgPyAicmVh ZCIgOiAidW4iKSkpOwoKCWUgPSBfbG9ja29wKGZkLCB0eXBlLCAwKTsKCglpZiAocikKCSAg ICBhcF9raWxsX3RpbWVvdXQocik7CiAgICB9CgogICAgLyogVHJhcCBib3RoIGZpcnN0L3Nl Y29uZCBmbG9jaygpIGVycm9yLiAqLwogICAgaWYgKGUpIHsKCWlmIChzKQoJICAgIGFwX2xv Z19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHMsICJGYWlsZWQgdG8gJXMiICJsb2Nr JXMlcyIsCgkJCSAoKHR5cGUgPT0gRVhMT0NLKSA/ICJ3cml0ZSAiIDogKCh0eXBlID09IFNI TE9DSykgPyAicmVhZCAiIDogInVuIikpLAoJCQkgZmlsZSA/ICI6ICIgOiAiIiwgZmlsZSk7 CglyZXR1cm4gLTE7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KgogKiByZXR1cm5IVE1MUGFnZVdpdGhGaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIGNoYXIg KnJldHVybkhUTUxQYWdlSGVhZChyZXF1ZXN0X3JlYyAqciwgaW50IGxlbikKewogICAgY2hh ciAqYnBfaGVhZDsKCiAgICAvKiBGaWxsIHVwIHRoZSBib2lsZXJwbGF0ZSB3aXRoIGluZm8g Ki8KICAgIGJwX2hlYWQgPSBhcF9wc3ByaW50ZihyLT5wb29sLCBCT0lMRVJQTEFURV9TVEFS VCwKCQkJICBhcF9nZXRfc2VydmVyX3ZlcnNpb24oKSwKCQkJICBhcF9nZXRfcmVtb3RlX2hv c3Qoci0+Y29ubmVjdGlvbiwKCQkJCQkgICAgIE5VTEwsCgkJCQkJICAgICBSRU1PVEVfTk9M T09LVVApLAoJCQkgIHItPnVyaSwKCQkJICByLT5hcmdzID8gci0+YXJncyA6ICIiKTsKCiAg ICBhcF9zZXRfY29udGVudF9sZW5ndGgociwgc3RybGVuKGJwX2hlYWQpICsgc3RybGVuKEJP SUxFUlBMQVRFX0VORCkgKyBsZW4pOwogICAgci0+Y29udGVudF90eXBlID0gInRleHQvaHRt bCI7CiAgICBhcF9zZW5kX2h0dHBfaGVhZGVyKHIpOwoKICAgIHJldHVybiBicF9oZWFkOwp9 OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqCiAqIHJldHVybkhUTUxQYWdlV2l0aE1lc3NhZ2UgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKiovCgpzdGF0aWMgdm9pZCByZXR1cm5IVE1MUGFnZVdpdGhNZXNzYWdlKHJlcXVlc3Rf cmVjICpyLCBjaGFyICpmbXQsLi4uKQp7CiAgICB2YV9saXN0IGFyZ3M7CiAgICBjaGFyICpt OwoKICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CiAgICBtID0gYXBfcHZzcHJpbnRmKHItPnBv b2wsIGZtdCwgYXJncyk7CiAgICB2YV9lbmQoYXJncyk7CgogICAgcmV0dXJuSFRNTFBhZ2VX aXRoQnVmZmVyKHIsIG0pOwp9CQkJCS8qIHJldHVybkhUTUxQYWdlV2l0aE1lc3NhZ2UgKi8K CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioKICogcmV0dXJuSFRNTFBhZ2VXaXRoQnVmZmVyICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKi8KCnN0YXRpYyB2b2lkIHJldHVybkhUTUxQYWdlV2l0aEJ1ZmZlcihyZXF1ZXN0X3Jl YyAqciwgY2hhciAqYnVmKQp7CiAgICBjaGFyICpicF9oZWFkOwoKICAgIGlmIChidWYgPT0g TlVMTCkgewoJcmV0dXJuSFRNTFBhZ2VXaXRoTWVzc2FnZShyLAoJCQkgICAgICAiRXJyb3I6 IHRyaWVkIHRvIHNlbmQgYnVmZmVyIGJ1dCBpdCBpcyBOVUxMIik7CglyZXR1cm47CiAgICB9 OwoKICAgIGJwX2hlYWQgPSByZXR1cm5IVE1MUGFnZUhlYWQociwgc3RybGVuKGJ1ZikpOwoK ICAgIGlmIChyLT5oZWFkZXJfb25seSkKCXJldHVybjsKCiAgICBhcF9oYXJkX3RpbWVvdXQo InNlbmQgaHRtbCBwYWdlIHdpdGggYnVmZmVyIiwgcik7CiAgICBhcF9ycHV0cyhicF9oZWFk LCByKTsKICAgIGFwX3JwdXRzKGJ1Ziwgcik7CQkvKiBIb3BlIHRoaXMgbWFrZXMgbm8gYXNz dW1wdGlvbnMgb24gdGhlCgkJCQkgKiBuYXR1cmUgb2YgdGhlIHN0cmluZyBpdCBzZW5kczog SSBzdXJlIGFzCgkJCQkgKiBoZWNrIGhhdmUgbm8gd2F5IG9mIGNhcmluZyEgKi8KICAgIGFw X3JwdXRzKEJPSUxFUlBMQVRFX0VORCwgcik7CgogICAgYXBfa2lsbF90aW1lb3V0KHIpOwp9 CQkJCS8qIHJldHVybkhUTUxQYWdlV2l0aEJ1ZmZlciAqLwoKc3RhdGljIHZvaWQgcmV0dXJu SFRNTFBhZ2VXaXRoRmlsZShyZXF1ZXN0X3JlYyAqciwgRklMRSAqZikKewogICAgY2hhciAq YnBfaGVhZDsKICAgIHN0cnVjdCBzdGF0IHM7CgogICAgLyoKICAgICAqIEhvdyBiaWcgaXMg dGhlIGZpbGU/IFVzZSBhIHJlZ3VsYXIgZmlsZSBzeXN0ZW0gY2FsbCBiZWNhdXNlIGFwXwog ICAgICogZG9lc24ndCBwcm92aWRlIG9uZS4KICAgICAqLwogICAgaWYgKChmc3RhdChmaWxl bm8oZiksICZzKSkpIHsKCXJldHVybkhUTUxQYWdlV2l0aE1lc3NhZ2UociwgIkVycm9yOiBG YWlsZWQgdG8gc3RhdCB0aGUgZmlsZSIpOwoJcmV0dXJuOwogICAgfQoKICAgIGJwX2hlYWQg PSByZXR1cm5IVE1MUGFnZUhlYWQociwgcy5zdF9zaXplKTsKCiAgICBpZiAoci0+aGVhZGVy X29ubHkpCglyZXR1cm47CgogICAgYXBfaGFyZF90aW1lb3V0KCJzZW5kIGh0bWwgcGFnZSB3 aXRoIGZpbGUiLCByKTsKICAgIGFwX3JwdXRzKGJwX2hlYWQsIHIpOwogICAgYXBfc2VuZF9m ZChmLCByKTsKICAgIGFwX3JwdXRzKEJPSUxFUlBMQVRFX0VORCwgcik7CiAgICBhcF9raWxs X3RpbWVvdXQocik7Cn0JCQkJLyogcmV0dXJuSFRNTFBhZ2VXaXRoRmlsZSAqLwoKCi8qKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKgogKiBjaGVja1VQRmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoK aW50MTZfdCBjaGVja1VQRmlsZShzdHJ1Y3Qgc2VydmVyX3JlYyAqc3YsIHN0cnVjdCByZXF1 ZXN0X3JlYyAqciwgc3RydWN0IHNwZWN3ZWI5OV9tb2R1bGVfZGF0YSAqIF9teSkKewogICAg c3RydWN0IHN0YXQgczsKICAgIGludDE2X3QgbnVtcmVjb3JkcywgdXBfdWlkOwogICAgaW50 IGUgPSAwOwogICAgRklMRSAqZjsKICAgIGNoYXIgdXBfcmVjb3JkW1VQUkxFTkdUSF07CiNp ZmRlZiBTRU1DTlRSCiAgICBpbnQgc2VtdmFsOwojZW5kaWYKICAgIC8qIHN0YXQgaXQsIGNv bXBhcmUgdG8gc3RvcmVkIHN0YXQgKi8KCiAgICBpZiAoc3RhdChfbXktPnVwX3BhdGgsICZz KSAhPSAwKSB7CglhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzdiwKCQkg IkNvdWxkIG5vdCBzdGF0IFVzZXIuUGVyc29uYWxpdHkgZmlsZSAnJXMnIiwgX215LT51cF9w YXRoKTsKCXJldHVybiAxOwogICAgfTsKCiAgICBpZiAoRVFNT0RUSU1FKHMsIF9teS0+dXBf bGFzdG1vZCkpIHsKI2lmZGVmIFNFTUNOVFIKCXNlbXVuIHNlbXY7CiNpZiAwCglpbnQgaWQg PSBzZW1nZXQoU0VNS0VZLCAxLCAwNjY2KTsKCWlmIChpZCA8IDApIHsKCSAgICBhcF9sb2df ZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzdiwgIkNvdWxkIG5vdCBmaW5kIHNlbSBp biBjaGVja1VQZmlsZSIpOwoJICAgIHJldHVybiAxOwoJfTsKI2VuZGlmCglpZiAoKHNlbWN0 bChTRU1LRVksIF9teS0+c2VtaWQsIEdFVFZBTCwgJnNlbXYpKSA8IDApIHsKCSAgICBhcF9s b2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzdiwgIkNvdWxkIG5vdCBnZXQgc2Vt IGluIGNoZWNrVVBmaWxlIik7CgkgICAgcmV0dXJuIDE7Cgl9OwojaWZkZWYgREVCVUcKCWFw X2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19ERUJVRyB8IEFQTE9HX05PRVJSTk8sIHN2 LAoJCSAgICAgIlNlbSBjbnRyICVkID09ICVkXG4iLCBzZW12LnZhbCwgX215LT5zZW1jbnRy KTsKI2VuZGlmCglzZW12YWwgPSBzZW12LnZhbDsKCWlmIChzZW12YWwgPT0gX215LT5zZW1j bnRyKQojZW5kaWYKCSAgICByZXR1cm4gMDsKICAgIH0KCiAgICBudW1yZWNvcmRzID0gcy5z dF9zaXplIC8gMTU7CiAgICAvKgogICAgICogQ2hlY2sgYnVmZmVyIGFycmF5IGZvciBudWxs bmVzcyBhbmQgYmlnbmVzcywgbWFrZSBpZiBuZWNlc3NhcnkuCiAgICAgKi8KICAgIGlmICgo X215LT51cCA9PSBOVUxMKSB8fCAobnVtcmVjb3JkcyA+IF9teS0+dXBfY291bnQpKSB7Cgkv KiBVc2VyIHBlcnNvbmFsaXRpZXMgYXJlIG9ubHkgMzIgYml0cyAoc2FkLCByZWFsbHkpICov CglhcF9jbGVhcl9wb29sKF9teS0+dXBfcG9vbCk7CglfbXktPnVwID0gYXBfcGFsbG9jKF9t eS0+dXBfcG9vbCwgbnVtcmVjb3JkcyAqIHNpemVvZih1X2ludDMyX3QpKTsKCV9teS0+dXBf Y291bnQgPSBudW1yZWNvcmRzOwogICAgfQogICAgLyoKICAgICAqIG9wZW4gdGhlIGZpbGUs IHdpdGggbWVtb3J5IGZyb20gdGhlIHJlcXVlc3QgcG9vbCBiZWNhdXNlIHdlIHdpbGwgbm90 CiAgICAgKiBuZWVkIGl0IHZlcnkgbG9uZy4KICAgICAqLwogICAgaWYgKChmID0gZm9wZW4o X215LT51cF9wYXRoLCAiciIpKSA9PSBOVUxMKSB7CglhcF9sb2dfZXJyb3IoQVBMT0dfTUFS SywgQVBMT0dfRVJSLCBzdiwKCQkgIkNvdWxkIG5vdCBvcGVuIFVzZXIuUGVyc29uYWxpdHkg ZmlsZSAnJXMnIiwgX215LT51cF9wYXRoKTsKCXJldHVybiAxOwogICAgfQoKICAgIGlmIChf cmxvY2soc3YsIHIsIGYsIF9teS0+dXBfcGF0aCkpIHsKCWFwX2xvZ19lcnJvcihBUExPR19N QVJLLCBBUExPR19FUlIsIHN2LAoJCSAiRmFpbGVkIHRvIGxvY2sgVXNlci5QZXJzb25hbGl0 eSBmaWxlICclcyciLCBfbXktPnVwX3BhdGgpOwoJZmNsb3NlKGYpOwoJcmV0dXJuIDE7CiAg ICB9CgogICAgLyogUmVhZCBldmVyeSByZWNvcmQsIHBhcnNlLCBwdXQgdXNlciBkZW1vZ3Jh cGhpY3MgaW4gYXJyYXkgKi8KICAgIHVwX3VpZCA9IDA7CiAgICB3aGlsZSAoMSkgewoJaW50 IGlkLCBkZW07CglfV0lOVFIoZSA9IGZyZWFkKCh2b2lkICopIHVwX3JlY29yZCwgc2l6ZW9m KHVwX3JlY29yZCksIDEsIGYpKTsKCWlmIChlICE9IDEpCgkgICAgYnJlYWs7CQkvKiBvbiBl cnJvciBvciBFT0YgKi8KCglpZiAoc3NjYW5mKHVwX3JlY29yZCwgIiVkICV4IiwgJmlkLCAm ZGVtKSAhPSAyKSB7CgkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwg c3YsICJjb3JydXB0ZWQgZW50cnkgaW4gVSBmaWxlIik7CgkgICAgZSA9IDE7Cgl9CgoJaWYg KHVwX3VpZCAhPSBpZCkgewoJICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19F UlIsIHN2LCAidXNlciBpZCBvdXQgb2Ygc3luYyBpbiBVUCBmaWxlIik7CgkgICAgZSA9IDE7 Cgl9CglfbXktPnVwW3VwX3VpZF0gPSBkZW07Cgl1cF91aWQrKzsKICAgIH07CgogICAgaWYg KGZlcnJvcihmKSkgewoJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgc3Ys ICJGYWlsZWQgcmVhZCBmcm9tIFVzZXIuUGVyc29uYWxpdHkgZmlsZSAnJXMnIiwgX215LT51 cF9wYXRoKTsKCWUgPSAxOwogICAgfQoKICAgIGlmIChfdW5sb2NrKHN2LCByLCBmLCBfbXkt PnVwX3BhdGgpKSB7CglhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzdiwg IkZhaWxlZCB0byB1bmxvY2sgVXNlci5QZXJzb25hbGl0eSBmaWxlICclcyciLCBfbXktPnVw X3BhdGgpOwoJZSA9IDE7CiAgICB9OwoKICAgIC8qIENsb3NlIGZpbGUgKi8KICAgIGZjbG9z ZShmKTsKCiAgICAvKiBTdG9yZSBsYXN0IG1vZGlmaWVkIGRhdGUgYXNzdW1pbmcgbm8gZXJy b3JzLiAqLwogICAgaWYgKCFlKSB7CglfbXktPnVwX2xhc3Rtb2QgPSBNT0RUSU1FKHMpOwoj aWZkZWYgREVCVUcKCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUcg fCBBUExPR19OT0VSUk5PLCBzdiwKCQkgICJjaGVja1VQRmlsZTogRmlsZSByZS1yZWFkLiBE YXRlPSVsZCIsIChsb25nKSBNT0RUSU1FKHMpKTsKI2VuZGlmCiAgICB9CgogICAgcmV0dXJu IGU7Cn0JCQkJLyogY2hlY2tVUEZpbGUgKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogY2hl Y2tDQURGaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmludDE2X3QgY2hlY2tDQURGaWxl KHN0cnVjdCBzZXJ2ZXJfcmVjICpzdiwgc3RydWN0IHJlcXVlc3RfcmVjICpyLCBzdHJ1Y3Qg c3BlY3dlYjk5X21vZHVsZV9kYXRhICogX215KQp7CiAgICBzdHJ1Y3Qgc3RhdCBzOwogICAg c2l6ZV90IG51bXJlY29yZHM7CiAgICBGSUxFICpmOwogICAgY2hhciBjYWRsaW5lW0NBRFJM RU5HVEhdOwogICAgdV9pbnQxNl90IGNhZF91aWQ7CiAgICBpbnQgZSA9IDA7CiNpZmRlZiBT RU1DTlRSCiAgICBpbnQgc2VtdmFsID0gMDsKI2VuZGlmCgogICAgLyogU3RhdCBpdCwgY29t cGFyZSB0byBzdG9yZWQgbW9kaWZpY2F0aW9uIHRpbWUgKi8KCiAgICBpZiAoc3RhdChfbXkt PmNhZF9wYXRoLCAmcykgIT0gMCkgewoJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9H X0VSUiwgc3YsICJGYWlsZWQgdG8gc3RhdCBDQUQgZmlsZSAnJXMnIiwgX215LT5jYWRfcGF0 aCk7CglyZXR1cm4gMTsKICAgIH07CgogICAgaWYgKEVRTU9EVElNRShzLCBfbXktPmNhZF9s YXN0bW9kKSkgewojaWZkZWYgU0VNQ05UUgoJLyogYWxzbyBjaGVjayBzZW0ncyAqLwoJc2Vt dW4gc2VtdjsKI2lmIDAKCWludCBpZCA9IHNlbWdldChTRU1LRVksIDEsIDA2NjYpOwoJaWYg KGlkIDwgMCkgewoJICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHN2 LCAiQ291bGQgbm90IGZpbmQgc2VtIGluIENBRGZpbGUiKTsKCSAgICByZXR1cm4gMTsKCX07 CiNlbmRpZgoJaWYgKChzZW1jdGwoU0VNS0VZLCBfbXktPnNlbWlkLCBHRVRWQUwsICZzZW12 KSkgPCAwKSB7CgkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgc3Ys ICJDb3VsZCBub3QgZ2V0IHNlbSBpbiBDQURmaWxlIik7CgkgICAgcmV0dXJuIDE7Cgl9Owoj aWZkZWYgREVCVUcKCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19ERUJVRyB8IEFQ TE9HX05PRVJSTk8sIHN2LAoJCSAgICAgIlNlbSBjbnRyICVkID09ICVkXG4iLCBzZW12LnZh bCwgX215LT5zZW1jbnRyKTsKI2VuZGlmCglzZW12YWwgPSBzZW12LnZhbDsKCWlmIChzZW12 YWwgPT0gX215LT5zZW1jbnRyKQojZW5kaWYKCSAgICByZXR1cm4gMDsKICAgIH0KCiAgICAv KgogICAgICogTmVlZCB0byByZWFkIGZpbGUgaW50byBtZW1vcnkgLSBhbmQgcmUtYWxsb2Nh dGUgdGhlIGFycmF5IGlmIHRoZSBzaXplCiAgICAgKiBoYXMgY2hhbmdlZC4KICAgICAqLwog ICAgbnVtcmVjb3JkcyA9IHMuc3Rfc2l6ZSAvIENBRFJMRU5HVEg7CiAgICBpZiAobnVtcmVj b3JkcyA+IF9teS0+Y2FkX2NvdW50KSB7CglhcF9jbGVhcl9wb29sKF9teS0+Y2FkX3Bvb2wp OwoJX215LT5jYWQgPSBhcF9wYWxsb2MoX215LT5jYWRfcG9vbCwgbnVtcmVjb3JkcyAqIHNp emVvZihzdHJ1Y3QgY2FkcmVjKSk7CglfbXktPmNhZF9jb3VudCA9IG51bXJlY29yZHM7CiAg ICB9CgogICAgZiA9IGZvcGVuKF9teS0+Y2FkX3BhdGgsICJyIik7CiAgICBpZiAoZiA9PSBO VUxMKSB7CglhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzdiwgIkZhaWxl ZCB0byBvcGVuIENBRCBmaWxlICclcyciLCBfbXktPmNhZF9wYXRoKTsKCXJldHVybiAxOwog ICAgfTsKCiAgICBpZiAoX3Jsb2NrKHN2LCByLCBmLCBfbXktPmNhZF9wYXRoKSkgewoJYXBf bG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgc3YsICJGYWlsZWQgdG8gbG9jayBD QUQgZmlsZSAnJXMnIiwgX215LT5jYWRfcGF0aCk7CglyZXR1cm4gMTsKICAgIH0KCiAgICBj YWRfdWlkID0gMDsKICAgIHdoaWxlIChjYWRfdWlkIDwgbnVtcmVjb3JkcykgewoJaW50IGws IGlkLCBkZW0sIGFkdywgYWRtLCBleHA7CglfV0lOVFIobCA9IGZyZWFkKGNhZGxpbmUsIENB RFJMRU5HVEgsIDEsIGYpKTsKCWlmIChsICE9IDEpCgkgICAgYnJlYWs7CQkvKiBvbiBFT0Yg YW5kIG9uIGVycm9yICovCgkvKgoJICogRGVjb2RlIEFEIGZpbGUgKHNlZSBzcGVjd2ViIHBh Z2UgLi4pCgkgKgoJICogMDEyMzQ1Njc4OS4xMjM0NTY3ODkuMTIzNDU2Nzg5LjEyMzQ1Njc4 IDAxMjM0IDAxMjM0NTY3IDAxMjM0NTY3IDAxMgoJICogMDEyMzQ1Njc4OW4gIiU1ZCAlOFgg JThYICUzZCAlMTBkXG4iLCBBZF9pZCwgQWREZW1vZ3JhcGhpY3MsCgkgKiBXZWlnaHRpbmdz LCBNaW5pbXVtX01hdGNoX1ZhbHVlLCBFeHBpcmF0aW9uX1RpbWUKCSAqCgkgKi8KCWlmIChz c2NhbmYoY2FkbGluZSwgIiVkICV4ICV4ICVkICVkIiwgJmlkLCAmZGVtLCAmYWR3LCAmYWRt LCAmZXhwKSAhPSA1KSB7CgkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VS Uiwgc3YsICJFbnRyeSBDQUQgZmlsZSBjb3JydXB0ZWQiKTsKCSAgICBjb250aW51ZTsKCX0K CglpZiAoY2FkX3VpZCAhPSBpZCkgewoJICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBB UExPR19FUlIsIHN2LCAiRW50cnkgQ0FEIGZpbGUgSWQjIG91dCBvZiBzeW5jIik7CgkgICAg Y29udGludWU7Cgl9CglfbXktPmNhZFtjYWRfdWlkXS5hZGRlbW9ncmFwaGljcyA9IGRlbTsK CV9teS0+Y2FkW2NhZF91aWRdLmdlbl93ZWlnaHRpbmdzID0gKGFkdyAmIDB4MDBmMDAwMCkg Pj4gMTY7CglfbXktPmNhZFtjYWRfdWlkXS5hZ2Vfd2VpZ2h0aW5ncyA9IChhZHcgJiAweDAw MGYwMDApID4+IDEyOwoJX215LT5jYWRbY2FkX3VpZF0ucmVnX3dlaWdodGluZ3MgPSAoYWR3 ICYgMHgwMDAwZjAwKSA+PiA4OwoJX215LT5jYWRbY2FkX3VpZF0uaW50MV93ZWlnaHRpbmdz ID0gKGFkdyAmIDB4MDAwMDBmMCkgPj4gNDsKCV9teS0+Y2FkW2NhZF91aWRdLmludDJfd2Vp Z2h0aW5ncyA9IChhZHcgJiAweDAwMDAwMGYpOwoJX215LT5jYWRbY2FkX3VpZF0ubWluaW11 bV9tYXRjaF92YWx1ZSA9IGFkbTsKCV9teS0+Y2FkW2NhZF91aWRdLmV4cGlyYXRpb25fdGlt ZSA9IGV4cDsKCWNhZF91aWQrKzsKICAgIH0KCiAgICBpZiAoZmVycm9yKGYpKSB7CglhcF9s b2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzdiwgIkZhaWxlZCB0byByZWFkIGZy b20gQ0FEIGZpbGUgJyVzJyIsIF9teS0+Y2FkX3BhdGgpOwoJZSA9IDE7CiAgICB9OwoKICAg IGlmIChfdW5sb2NrKHN2LCByLCBmLCBfbXktPmNhZF9wYXRoKSkgewoJYXBfbG9nX2Vycm9y KEFQTE9HX01BUkssIEFQTE9HX0VSUiwgc3YsICJGYWlsZWQgdG8gdW5sb2NrIHRoZSBDQUQg ZmlsZSAnJXMnIiwgX215LT5jYWRfcGF0aCk7CgllID0gMTsKICAgIH07CgogICAgZmNsb3Nl KGYpOwogICAgaWYgKCFlKSB7CglfbXktPmNhZF9sYXN0bW9kID0gTU9EVElNRShzKTsKI2lm ZGVmIERFQlVHCgkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHIHwg QVBMT0dfTk9FUlJOTywgc3YsCgkJICJjaGVja0NBREZpbGU6IEZpbGUgcmUtcmVhZC4gRGF0 ZT0lbGQiLCAobG9uZykgTU9EVElNRShzKSk7CiNlbmRpZgogICAgfQoKICAgIHJldHVybiBl Owp9CQkJCS8qIGNoZWNrQ0FERmlsZSAqLwoKCgovKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogc3Bl Y3dlYjk5X21vZHVsZV9pbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkICpzcGVjd2Vi OTlfc2VydmVyX2NyZWF0ZShwb29sICpwLCBzZXJ2ZXJfcmVjICpzKQp7CiAgICBzdHJ1Y3Qg c3BlY3dlYjk5X21vZHVsZV9kYXRhICpfbXk7CiAgICBfbXkgPSAoc3RydWN0IHNwZWN3ZWI5 OV9tb2R1bGVfZGF0YSAqKSBhcF9wY2FsbG9jKHAsIHNpemVvZihzdHJ1Y3Qgc3BlY3dlYjk5 X21vZHVsZV9kYXRhKSk7CgojaWZkZWYgU09MQVJJUzIKICAgIF9teS0+dXBfbGFzdG1vZCA9 ICh0aW1lX3QpIDBMOwogICAgX215LT5jYWRfbGFzdG1vZCA9ICh0aW1lX3QpIDBMOwojZWxz ZQogICAgX215LT51cF9sYXN0bW9kLnR2X3NlYyA9IF9teS0+dXBfbGFzdG1vZC50dl9uc2Vj ID0gMDsKICAgIF9teS0+Y2FkX2xhc3Rtb2QudHZfc2VjID0gX215LT5jYWRfbGFzdG1vZC50 dl9uc2VjID0gMDsKI2VuZGlmCgogICAgX215LT51cCA9IE5VTEw7CiAgICBfbXktPmNhZCA9 IE5VTEw7CgogICAgX215LT51cF9jb3VudCA9IDA7CiAgICBfbXktPmNhZF9jb3VudCA9IDA7 CgojaWZkZWYgU0VNQ05UUgogICAgLyoKICAgICAqIFhYWCBub3Qgc3VyZSBpZiB0aGlzIGlz IGNvcnJlY3QuIFRoZSBjb2RlIEkgc3RvbGUgdGhpcyBmcm9tIGRpZCBub3QKICAgICAqIGZv cms7IGkuZS4gd2Ugb25seSBnZXQgdGhlIHNlbSBpZCBoZXJlOyBhbmQgdGhlbiBzdG9yZSBp dC4gVGhhdCBtaWdodAogICAgICogbm90IGJlIGdvb2QgZW5vdWdoOyBpLmUuIHdlIG1pZ2h0 IGhhdmUgdG8gZG8gYSBzZW1nZXQoKSBlYWNoIHRpbWU7IG9yCiAgICAgKiBhdCBmb3JrIHRp bWUuCiAgICAgKi8KICAgIHsKCXNlbXVuIGFyZ3VtZW50OwoJLyogbWFrZSBzdXJlIHRoYXQg d2UgaGF2ZSBhIHNlbWFwaG9yZS4gKi8KCWlmICgoX215LT5zZW1pZCA9IHNlbWdldChTRU1L RVksIDEsIDA2NjYgfCBJUENfQ1JFQVQpKSA8IDApIHsKCSAgICBhcF9sb2dfZXJyb3IoQVBM T0dfTUFSSywgQVBMT0dfQ1JJVCwgcywgIkZhaWxlZCB0byBjcmVhdGUgc2VtYXBob3JlIik7 CgkgICAgcmV0dXJuIE5VTEw7Cgl9OwoKCV9teS0+c2VtY250ciA9IDA7Cglhcmd1bWVudC52 YWwgPSBfbXktPnNlbWNudHIgKyAxOwkvKiBtYWtlIHN1cmUgdGhleSBhcmUgbm90IHRoZQoJ CQkJCQkgKiBzYW1lICEgKi8KCWlmICgoc2VtY3RsKF9teS0+c2VtaWQsIDAsIFNFVFZBTCwg JmFyZ3VtZW50KSkgPCAwKSB7CgkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9H X0NSSVQsIHMsICJGYWlsZWQgdG8gc2V0IHNlbWFwaG9yZSIpOwoJICAgIHJldHVybiBOVUxM OwoJfTsKICAgIH07CiNlbmRpZgoKICAgIHJldHVybiAodm9pZCAqKSBfbXk7Cn0KCnN0YXRp YyB2b2lkIHNwZWN3ZWI5OV9tb2R1bGVfaW5pdChzZXJ2ZXJfcmVjICpzLCBhcF9wb29sICog cCkKewogICAgY2hhciBmbmFtZVsyNTVdOwoKICAgIGFwX2FkZF92ZXJzaW9uX2NvbXBvbmVu dChOQU1FICIvIiBWRVJTSU9OKTsKCiAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBM T0dfSU5GTyB8IEFQTE9HX05PRVJSTk8sIHMsCiAgICAgIE5BTUUgIi8iIFZFUlNJT04gIiBt b2R1bGU6IENvbXBpbGVkIG9uICVzIGF0ICVzIiwgX19EQVRFX18sIF9fVElNRV9fKTsKCiAg ICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfSU5GTyB8IEFQTE9HX05PRVJSTk8s IHMsICIlcyIsCgkgICAgICAiJElkOiBtb2Rfc3BlY3dlYjk5LmMsdiAxLjMgMjAwMi8wNC8x NyAyMToxNTozMCBzY3RlbW1lIEV4cCAkIik7CgogICAgLyoKICAgICAqIE1ha2UgYSBzaGFy ZWQgbWVtb3J5IGJ1ZmZlciB0byBob2xkIGFsbCBvdXIgVXNlciBQcm9maWxlIGFuZCBDdXN0 b20KICAgICAqIEFkcyBhY3Rpdml0eS4gVGhlIHNpemUgb2YgdGhpcyBidWZmZXIgaXMgaGFy ZHdpcmVkIGZvciB0aGUgbWF4aW11bQogICAgICogbnVtYmVyIG9mIFNQRUNXZWIgY29ubmVj dGlvbnMgd2UgZXhwZWN0IHRvIGhhbmRsZS4gVGhpcyBpcwogICAgICogdW5mb3J0dW5hdGUs IGJ1dCBJIGRvbid0IHJlYWxseSB3YW50IHRvIGRlYWwgd2l0aCBtdWx0aXBsZSBzaGFyZWQK ICAgICAqIG1lbW9yeSBidWZmZXJzIGF0IHRoaXMgdGltZS4KICAgICAqLwogICAgc3ByaW50 ZihmbmFtZSwgIi90bXAvc3BlY3dlYjk5YnVmLiVsZCIsIGdldHBpZCgpKTsKICAgIGdsb2Jh bEJ1ZmZlciA9IG1tX2NyZWF0ZSgKCQkJICAgICBzaXplb2YoYnVmcykgKwoJCQkgICAgIHNp emVvZih1X2ludDMyX3QpICogTUFYVVNFUlMgKwoJCQkgICAgIDM2MCAqIENBRFJMRU5HVEgs CgkJCSAgICAgZm5hbWUpOwogICAgaWYgKGdsb2JhbEJ1ZmZlciA9PSBOVUxMKSB7CgkvKiBX aGF0IGRvIHdlIGRvIGZyb20gdGhlIGluaXQ/ICovCglhcF9sb2dfZXJyb3IoQVBMT0dfTUFS SywgQVBMT0dfRU1FUkcgfCBBUExPR19OT0VSUk5PLCBzLAoJCSAgICAgIkNvdWxkbid0IGFs bG9jYXRlIHNoYXJlZCBtZW1vcnk6IG1tIGVycm9yICVzIiwKCQkgICAgIG1tX2Vycm9yKCkp OwoJZXhpdCgxKTsKICAgIH0KI2lmZGVmIERFQlVHCiAgICBhcF9sb2dfZXJyb3IoQVBMT0df TUFSSywgQVBMT0dfSU5GTyB8IEFQTE9HX05PRVJSTk8sIHMsCgkJICJBbGxvY2F0ZWQgc2hh cmVkIG1lbW9yeSBhdCAleCIsIGdsb2JhbEJ1ZmZlcik7CiAgICBtbV9kaXNwbGF5X2luZm8o Z2xvYmFsQnVmZmVyKTsKI2VuZGlmCiAgICByZWNfYnVmZmVyID0gbW1fbWFsbG9jKGdsb2Jh bEJ1ZmZlciwgc2l6ZW9mKGJ1ZnMpKTsKICAgIGlmIChyZWNfYnVmZmVyID09IE5VTEwpIHsK CWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRyB8IEFQTE9HX05PRVJSTk8s IHMsCgkgICAgICAgIkNvdWxkbid0IGFsbG9jYXRlIHJlY19idWZmZXIgaW4gc2hhcmVkIG1l bW9yeTogbW0gZXJyb3IgJXMiLAoJCSAgICAgbW1fZXJyb3IoKSk7CglleGl0KDEpOwogICAg fQogICAgcmVjX2J1ZmZlci0+Y2FkX2J1ZmZlciA9IE5VTEw7CiAgICByZWNfYnVmZmVyLT51 cF9idWZmZXIgPSBOVUxMOwoKfQkJCQkvKiBzcGVjd2ViOTlfbW9kdWxlX2luaXQgKi8KCnN0 YXRpYyB2b2lkIHNwZWN3ZWI5OV9jaGlsZF9pbml0KHNlcnZlcl9yZWMgKnMsIGFwX3Bvb2wg KiBwKQp7CiAgICBzdHJ1Y3Qgc3BlY3dlYjk5X21vZHVsZV9kYXRhICpfbXkgPQogICAgYXBf Z2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgJnNwZWN3ZWI5OV9tb2R1bGUp OwogICAgc3RydWN0IHJlcXVlc3RfcmVjIHI7CiAgICBjb25zdCBjaGFyICpkb2Nyb290OwoK ICAgIHIuc2VydmVyID0gczsKICAgIGRvY3Jvb3QgPSBhcF9kb2N1bWVudF9yb290KCZyKTsK CiAgICBfbXktPnVwX3BhdGggPSBhcF9tYWtlX2Z1bGxfcGF0aChwLCBkb2Nyb290LCAiVXNl ci5QZXJzb25hbGl0eSIpOwogICAgX215LT5jYWRfcGF0aCA9IGFwX21ha2VfZnVsbF9wYXRo KHAsIGRvY3Jvb3QsICJDdXN0b20uQWRzIik7CiAgICBfbXktPmxvZ19wYXRoID0gYXBfbWFr ZV9mdWxsX3BhdGgocCwgZG9jcm9vdCwgInBvc3QubG9nIik7CiAgICBfbXktPnVwZmdlbjk5 ID0gYXBfbWFrZV9mdWxsX3BhdGgocCwgZG9jcm9vdCwgInVwZmdlbjk5Iik7CiAgICBfbXkt PmNhZGdlbjk5ID0gYXBfbWFrZV9mdWxsX3BhdGgocCwgZG9jcm9vdCwgImNhZGdlbjk5Iik7 CgogICAgX215LT51cF9wb29sID0gYXBfbWFrZV9zdWJfcG9vbChwKTsKICAgIF9teS0+Y2Fk X3Bvb2wgPSBhcF9tYWtlX3N1Yl9wb29sKHApOwoKICAgIGlmIChzLT5uZXh0KSB7CglmcHJp bnRmKHN0ZGVyciwKCQkiV0FSTklORy0gdGhpcyBzcGVjd2ViIG1vZHVsZSBjdXJyZW50bHkg ZG9lcyBub3Qgc3VwcG9ydCB2aG9zdHMvc2VydmljZXNcbiIKCQkiU2VlICVzOiVkIGZvciB3 aGF0IHlvdSBuZWVkIHRvIGNoYW5nZS4gVGhlIHNlcnZlciB3aWxsIGNvbnRpbnVlIGFuZCBh c3N1bWVcbiIKCQkidGhlIGNvbmZpZyBvZiB0aGUgYmFzZSBzZXJ2ZXJcbiIsIF9fRklMRV9f LCBfX0xJTkVfXyArIDIpOwoKCS8qCgkgKiBSaWdodCBub3cgd2UgYXNzdW1lIHlvdSBhcmUg c3BlY3dlYmJpbmcgYSB3aG9sZSBzZXJ2ZXIgaW5zdGFsbCAtCgkgKiBhcyBvcHBvc2VkIHRv IGEgaG9zdDpwb3J0OnByb3RvY29sIGluc3RhbmNlIHRpZWQgdG8gYSB2aXJ0dWFsCgkgKiBz ZXJ2aWNlLgoJICoKCSAqIFRvIHN1cHBvcnQgdmhvc3RzIC0gdGhlIF9teSBtb2R1bGUgY29u ZmlnIG5lZWRzIHNpbXBseSB0byBiZSBtb3ZlZCB0bwoJICogdGhlIHBlciBzZXJ2ZXIgY29u ZmlnIGJsb2NrIChvciB0aGUgcGVyIGRpciBibG9jaykgYW5kIHRoZSBpbml0CgkgKiBhbmQv b3IgYW55IGFjY2VzcyB0byBpdCBuZWVkIHRvIGVpdGhlciBnbyB0aHJvdWdoIHRoZSAtPm54 dCBsaXN0CgkgKiBPUiBjYXJlZnVsbCBvdmVybGF5IG1lcmdpbmcgbmVlZHMgdG8gYmUgZG9u ZSB0byBhIHNlbnNpYmxlIGRlZmF1bHQKCSAqIGZvciBlYWNoIG9mIHRoZSBjYXNlcy4gVGhl IGN1cnJlbnQgc2ltcGxpc3RpYyAnZG9jcm9vdCcgcmVmZXJlbmNlcwoJICogYXJlIHByb3Bh Ymx5IG5vIGxvbmdlciBnb2luZyB0byB3b3JrIGFuZCB3aWxsIG5lZWQgZXhwbGljaXQgY29u ZmlnCgkgKiAoZS5nLiB0aGluayB+dXNlciBhbmQgb3RoZXIgcmVkaXJlY3QgY2FzZXMgd2l0 aCBjbG9iYmVyIHRoZQoJICogY29uY2VwdCBvZiBhIGRvY3Jvb3QpLgoJICovCiAgICB9OwoK I2lmZGVmIERFQlVHCiAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfSU5GTyB8 IEFQTE9HX05PRVJSTk8sIHMsCgkJICJDaGlsZCAlbGQgaW5pdGlhbGl6ZWQuIE1NIGF0ICV4 IGFuZCByZWNfYnVmZmVyIGF0ICV4LiIsCgkJIGdldHBpZCgpLAoJCSBnbG9iYWxCdWZmZXIs CgkJIHJlY19idWZmZXIpOwojZW5kaWYKCn0JCQkJLyogc3BlY3dlYjk5X21vZHVsZV9pbml0 ICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqCiAqIGNhbGxfc3BlY3dlYl91dGlsICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKiovCgpzdGF0aWMgaW50IGNhbGxfc3BlY3dlYl91dGlsKHZvaWQgKnJwLCBjaGls ZF9pbmZvICogcGluZm8pCnsKICAgIGNoYXIgKiplbnY7CiAgICBpbnQgY2hpbGRfcGlkOwog ICAgcmVxdWVzdF9yZWMgKnIgPSAocmVxdWVzdF9yZWMgKikgcnA7CgogICAgZW52ID0gKGNo YXIgKiopIGFwX2NyZWF0ZV9lbnZpcm9ubWVudChyLT5wb29sLCByLT5zdWJwcm9jZXNzX2Vu dik7CiAgICBhcF9lcnJvcl9sb2cyc3RkZXJyKHItPnNlcnZlcik7CiAgICBhcF9jbGVhbnVw X2Zvcl9leGVjKCk7CgogICAgaWYgKCFyLT5hcmdzKSB7CglhcF9sb2dfZXJyb3IoQVBMT0df TUFSSywgQVBMT0dfRVJSIHwgQVBMT0dfTk9FUlJOTywKCXItPnNlcnZlciwgIk5vIHJhcmdz OiAlcCAlcCIsIHItPnByZXYsIHItPnByZXYgPyByLT5wcmV2LT5wcmV2IDogMCk7CglyLT5h cmdzID0gci0+cHJldi0+YXJnczsKICAgIH07CiAgICBjaGlsZF9waWQgPSBhcF9jYWxsX2V4 ZWMociwgcGluZm8sIHItPmZpbGVuYW1lLCBlbnYsIDApOwoKI2lmZGVmIFdJTjMyCiAgICBy ZXR1cm4gKGNoaWxkX3BpZCk7CiNlbHNlCiAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywg QVBMT0dfRVJSLCByLT5zZXJ2ZXIsICJleGVjIG9mICVzIGZhaWxlZCIsIHItPmZpbGVuYW1l KTsKICAgIGV4aXQoMCk7CiAgICAvKiBOT1QgUkVBQ0hFRCAqLwogICAgcmV0dXJuICgwKTsK I2VuZGlmCn0JCQkJLyogY2FsbF9zcGVjd2ViX3V0aWwgKi8KCgovKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioKICogc3BlY3dlYjk5X2hrX2hhbmRsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBpbnQg c3BlY3dlYjk5X2hrX2hhbmRsZXIocmVxdWVzdF9yZWMgKnIpCnsKICAgIHN0cnVjdCBzcGVj d2ViOTlfbW9kdWxlX2RhdGEgKl9teSA9CiAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5z ZXJ2ZXItPm1vZHVsZV9jb25maWcsICZzcGVjd2ViOTlfbW9kdWxlKTsKICAgIEZJTEUgKmY7 CiAgICBjaGFyICpkYXRhLCAqa2V5LCAqdmFsLCAqbGluZSwgKmV4cGNvbW1hLCAqbmV3ZXhw ID0gIjx1bnNldD4iOwogICAgdGFibGUgKnRhYjsKICAgIHNpemVfdCBlcnI7CiAgICBpbnQx Nl90IG1heGxvYWQsIG1heHRocmVhZDsKICAgIGludDMyX3QgcG9pbnR0aW1lOwogICAgY2hh ciAqZXhwLCAqdXJscm9vdCwgKnJvb3RkaXI7CiAgICBjb25zdCBjaGFyICpkb2Nyb290ID0g YXBfZG9jdW1lbnRfcm9vdChyKTsKICAgIHVyaV9jb21wb25lbnRzICp1cmxyb290cmVjOwkv KiBUbyBwYXJzZSB0aGUgdXJscm9vdCBzdHJpbmcgaW50byAqLwoKICAgIGludCByZXN1bHQ7 CQkJLyogVG8ga2VlcCBtbV8odW4pbG9jayByZXN1bHQgaW4gKi8KICAgIGNoYXIgY2FkbGlu ZVtDQURSTEVOR1RIXSwgdXBfcmVjb3JkW1VQUkxFTkdUSF07CiAgICB1X2ludDE2X3QgY2Fk X3VpZCwgdXBfdWlkOwoKICAgIHNwZWN3ZWI5OV9pbmZvKHItPnNlcnZlciwKICAgICAgYXBf cHNwcmludGYoci0+cG9vbCwgIkhvdXNla2VlcGluZyByb3V0aW5lIGNhbGxlZCB3aXRoICVz Iiwgci0+YXJncykpOwoKICAgIGlmIChzdHJzdHIoci0+YXJncywgImNvbW1hbmQvRmV0Y2gi KSAhPSBOVUxMKSB7CglmID0gYXBfcGZvcGVuKHItPnBvb2wsIF9teS0+bG9nX3BhdGgsICJy Iik7CglpZiAoZiA9PSBOVUxMKSB7CgkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQ TE9HX0VSUiwgci0+c2VydmVyLCAiQ291bGQgbm8gb3BlbiBwb3N0LmxvZyBmaWxlICclcycg Zm9yIHJlYWRpbmciLCBfbXktPmxvZ19wYXRoKTsKCSAgICByZXR1cm5IVE1MUGFnZVdpdGhN ZXNzYWdlKHIsICJFcnJvcjogY291bGQgbm90IG9wZW4gcG9zdC5sb2cgZm9yIHJlYWRpbmcu Iik7CgkgICAgcmV0dXJuIE9LOwoJfQoJcmV0dXJuSFRNTFBhZ2VXaXRoRmlsZShyLCBmKTsK CWFwX3BmY2xvc2Uoci0+cG9vbCwgZik7CglyZXR1cm4gT0s7CiAgICB9CiAgICBlbHNlIGlm ICgoZGF0YSA9IHN0cnN0cihyLT5hcmdzLCAiY29tbWFuZC9SZXNldCIpKSkgewoJLyoKCSAq IDEgMDEyMzQ1Njc4OTAxMjM0CgkgKiBjb21tYW5kL1Jlc2V0Jm1heGxvYWQ9W01heExvYWRd JnB0dGltZT1bUG9pbnRUaW1lXSZtYXh0aHJlYWRzPVsKCSAqIE1heFRocmVhZHNdJmV4cD1b RXhwaXJlZExpc3RdJnVybHJvb3Q9W1VybFJvb3RdCgkgKi8KCWRhdGEgKz0gMTQ7CQkvKiBw b3NpdGlvbiBhdCBzdGFydCBvZiBhcmd1bWVudCBzdHJpbmcgKi8KCS8qIFRva2VuaXplIGFy Z3VtZW50IHN0cmluZyAqLwoJdGFiID0gYXBfbWFrZV90YWJsZShyLT5wb29sLCAwKTsKCgl3 aGlsZSAoKmRhdGEgJiYgKHZhbCA9IGFwX2dldHdvcmQoci0+cG9vbCwKCQkJCQkgIChjb25z dCBjaGFyICoqKSAmZGF0YSwKCQkJCQkgICcmJykpKSB7CgkgICAga2V5ID0gYXBfZ2V0d29y ZChyLT5wb29sLCAoY29uc3QgY2hhciAqKikgJnZhbCwgJz0nKTsKCSAgICBhcF91bmVzY2Fw ZV91cmwoa2V5KTsKCSAgICBhcF91bmVzY2FwZV91cmwodmFsKTsKCSAgICBhcF90YWJsZV9z ZXQodGFiLCBrZXksIHZhbCk7Cgl9CgkvKiBQdXQgYXJndW1lbnRzIGluIHZhcmlhYmxlcyAq LwoJbWF4bG9hZCA9IGF0b2koYXBfdGFibGVfZ2V0KHRhYiwgIm1heGxvYWQiKSk7Cglwb2lu dHRpbWUgPSBhdG9sKGFwX3RhYmxlX2dldCh0YWIsICJwdHRpbWUiKSk7CgkvKgoJICogVGhl IFJ1biBSdWxlcyBwc2V1ZG9jb2RlIGlzIGFtYml2YWxlbnQgYWJvdXQgdGhpcyB0b2tlbiBu YW1lOiB0aGUKCSAqIHBzZXVkb2NvZGUgc2F5cyAnbWF4dGhyZWFkcycgYnV0IGl0cyB0ZXN0 IGNvbW1hbmQgYSBjb3VwbGUgb2YKCSAqIGxpbmVzIGRvd24gc2F5cyAnbWF4dGhyZWFkJy4g QXNpZGUgZnJvbSB0aGUgcXVlc3Rpb24gd2hldGhlciB3ZQoJICogc2hvdWxkIGF0IGFsbCBw YXkgYXR0ZW50aW9uIHRvIHRoZSB0b2tlbiBuYW1lcywgSSdtIGdvaW5nIGFsb25nCgkgKiB3 aXRoIHdoYXQgdGhlIG1hbmFnZXIgc2NyaXB0IHNlbmRzIHdoaWNoIGlzICdtYXh0aHJlYWQn LgoJICovCgltYXh0aHJlYWQgPSBhdG9pKGFwX3RhYmxlX2dldCh0YWIsICJtYXh0aHJlYWQi KSk7CglleHAgPSBhcF9wc3ByaW50ZihyLT5wb29sLCAiJXMiLCBhcF90YWJsZV9nZXQodGFi LCAiZXhwIikpOwoJLyoKCSAqIE9LLCB0aGlzIHZleGVzIG1lLiBFdmVyeSBzaHJlZCBvZiBk b2N1bWVudGF0aW9uIGFib3V0IFNQRUNXZWIKCSAqIHNwZWFrcyBvZiBhIGNvbW1hLXNlcGFy YXRlZCBsaXN0IG9mIGV4cGlyZWQgYWRzLCBidXQgdGhlIGNhZGdlbjk5CgkgKiBwcm9ncmFt IHNlZ2ZhdWx0cyBpZiB5b3UgcGFzcyBhbnl0aGluZyBidXQgYSB3aGl0ZXNwYWNlLSBzZXBh cmF0ZWQKCSAqIGxpc3QuIFRoZSBSdW4gUnVsZXMgZXhwbGljaXRseSBzdGF0ZSB0aGF0IHRo ZSBwc2V1ZG8gY29kZSBpcyB0aGUKCSAqIGRlZmluaXRpdmUgUmVmZXJlbmNlIEJ5IFdoaWNo IFRoaXMgTW9kdWxlIFNoYWxsIEJlIENvZGVkLCB5ZXQgSQoJICogaGFkIHRvIHlhbmsgdGhl IGZvbGxvd2luZyBnZW0gZnJvbSB0aGUgcGVybCBzY3JpcHQ6CgkgKi8KCWlmICgoZXhwY29t bWEgPSBzdHJzdHIoZXhwLCAiLCIpKSAhPSBOVUxMKSB7CiNpZiBfREVCVUcKCSAgICBuZXdl eHAgPSBhcF9wc3ByaW50ZihyLT5wb29sLCAiJWQgJWQiLCBhdG9pKGV4cCksIGF0b2koZXhw Y29tbWEgKyAxKSk7CiNlbHNlCgkgICAgbmV3ZXhwID0gYXBfcHNwcmludGYoci0+cG9vbCwg IiVkICVkIiwgYXRvaShleHApLCBhdG9pKGV4cGNvbW1hICsgMSkpOwojZW5kaWYKCX07CgoJ dXJscm9vdCA9IGFwX3BzcHJpbnRmKHItPnBvb2wsICIlcyIsIGFwX3RhYmxlX2dldCh0YWIs ICJ1cmxyb290IikpOwoKCS8qCgkgKiBQcmVwOiB3ZSBnb3QgYSBVUkkgZnJvbSB0aGUgcmVx dWVzdC4gTmVlZCB0byBwYXJzZSB0aGF0LCBleHRyYWN0CgkgKiB0aGUgbG9jYWwgcGFydCBh bmQgdGFjayB0aGF0IG9udG8gZG9jcm9vdC4KCSAqLwoJdXJscm9vdHJlYyA9IGFwX3BhbGxv YyhyLT5wb29sLCBzaXplb2YodXJpX2NvbXBvbmVudHMpKTsKCWlmIChhcF9wYXJzZV91cmlf Y29tcG9uZW50cyhyLT5wb29sLCB1cmxyb290LCB1cmxyb290cmVjKSAhPUhUVFBfT0spIHsK CSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTywgci0+c2VydmVy LCAiVGhlIFVSTCBSb290ICclcycgd2FzIGludmFsaWQiLCB1cmxyb290KTsKCSAgICByZXR1 cm5IVE1MUGFnZVdpdGhNZXNzYWdlKHIsICJUaGUgVXJsUm9vdCBwYXNzZWQgd2FzIGludmFs aWQiKTsKCSAgICByZXR1cm4gT0s7Cgl9Cglyb290ZGlyID0gYXBfb3NfZXNjYXBlX3BhdGgo ci0+cG9vbCwKCQkJCSAgICBhcF9tYWtlX2Z1bGxfcGF0aChyLT5wb29sLAoJCQkJCQkgICAg ICBkb2Nyb290LAoJCQkJCQkgICAgICB1cmxyb290cmVjLT5wYXRoKSwKCQkJCSAgICAwKTsK CgkvKgoJICogUmVtb3ZlIEN1c3RvbS5BZHMgYW5kIFVzZXIuUGVyc29uYWxpdHkgZmlsZXMg YmVmb3JlIHJlZ2VuZXJhdGluZwoJICogdGhlbS4gVGhpcyB3aWxsIHJldmVhbCBhbnkgcHJv YmxlbXMgcnVubmluZyB0aGUgYXV4IHByb2dyYW1zCgkgKi8KCWlmICh1bmxpbmsoX215LT51 cF9wYXRoKSAhPSAwKSB7CgkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssCgkJCSBBUExP R19XQVJOSU5HLAoJCQkgci0+c2VydmVyLAoJCQkgIkNvdWxkIG5vdCBkZWxldGUgZmlsZSAl cyIsCgkJCSBfbXktPnVwX3BhdGgpOwoJfQoKCWlmICh1bmxpbmsoX215LT5jYWRfcGF0aCkg IT0gMCkgewoJICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLAoJCQkgQVBMT0dfV0FSTklO RywKCQkJIHItPnNlcnZlciwKCQkJICJDb3VsZCBub3QgZGVsZXRlIGZpbGUgJXMiLAoJCQkg X215LT5jYWRfcGF0aCk7Cgl9CgojaWYgMQoJewoJICAgIGludCBlOwoJICAgIGNoYXIgKmNt ZCA9IGFwX3BzcHJpbnRmKHItPnBvb2wsCgkJCQkgICAgIiVzIC1uICVkIC10ICVkIC1DICVz IiwgX215LT51cGZnZW45OSwgbWF4bG9hZCwgbWF4dGhyZWFkLCByb290ZGlyKTsKCgkgICAg YXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0lORk8gfCBBUExPR19OT0VSUk5PLCBy LT5zZXJ2ZXIsICJSdW5ubmcgJXMiLCBjbWQpOwoKCSAgICBlID0gc3lzdGVtKGNtZCk7CgoJ ICAgIHN3aXRjaCAoZSkgewoJICAgIGNhc2UgMTI3OgoJCWFwX2xvZ19lcnJvcihBUExPR19N QVJLLCBBUExPR19FUlIsIHItPnNlcnZlciwgImNvdWxkbid0IHN0YXJ0IHNoZWxsIGZvciAl cyIsIGNtZCk7CgkJcmV0dXJuSFRNTFBhZ2VXaXRoTWVzc2FnZShyLCAiQ291bGRuJ3Qgc3Bh d24gY2hpbGQgcHJvY2VzcyB1cGZnZW45OSIpOwoJCXJldHVybiBPSzsKCQlicmVhazsKCSAg ICBjYXNlIC0xOgoJCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHItPnNl cnZlciwgImNvdWxkbid0IGZvcmsoKS93YWl0cGlkKCkgZm9yICVzIiwgY21kKTsKCQlyZXR1 cm5IVE1MUGFnZVdpdGhNZXNzYWdlKHIsICJDb3VsZG4ndCBzcGF3biBjaGlsZCBwcm9jZXNz IHVwZmdlbjk5Iik7CgkJcmV0dXJuIE9LOwoJCWJyZWFrOwoJICAgIGRlZmF1bHQ6CgkJaWYg KCghKFdJRkVYSVRFRChlKSkpIHx8IChXRVhJVFNUQVRVUyhlKSkpIHsKCQkgICAgYXBfbG9n X2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgci0+c2VydmVyLCAiQ01EICVzIGZhaWxl ZCIsIGNtZCk7CgkJICAgIHJldHVybkhUTUxQYWdlV2l0aE1lc3NhZ2UociwgIkNvdWxkbid0 IHNwYXduIGNoaWxkIHByb2Nlc3MgdXBmZ2VuOTkiKTsKCQkgICAgcmV0dXJuIE9LOwoJCX0K CQlicmVhazsKCSAgICB9Cgl9Cgl7CgkgICAgaW50IGU7CgkgICAgY2hhciAqY21kID0gYXBf cHNwcmludGYoci0+cG9vbCwgIiVzIC1DICVzIC1lICVsZCAtdCAlZCAlcyIsCgkgICAgX215 LT5jYWRnZW45OSwgcm9vdGRpciwgKGxvbmcgaW50KSBwb2ludHRpbWUsIG1heHRocmVhZCwg bmV3ZXhwKTsKCgkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0lORk8gfCBB UExPR19OT0VSUk5PLCByLT5zZXJ2ZXIsICJSdW5ubmcgJXMiLCBjbWQpOwoKCSAgICBlID0g c3lzdGVtKGNtZCk7CgoJICAgIHN3aXRjaCAoZSkgewoJICAgIGNhc2UgMTI3OgoJCWFwX2xv Z19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHItPnNlcnZlciwgImNvdWxkbid0IHN0 YXJ0IHNoZWxsIGZvciAlcyIsIGNtZCk7CgkJcmV0dXJuSFRNTFBhZ2VXaXRoTWVzc2FnZShy LCAiQ291bGRuJ3Qgc3Bhd24gY2hpbGQgcHJvY2VzcyBjYWRnZW4iKTsKCQlyZXR1cm4gT0s7 CgkJYnJlYWs7CgkgICAgY2FzZSAtMToKCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBM T0dfRVJSLCByLT5zZXJ2ZXIsICJjb3VsZG4ndCBmb3JrKCkvd2FpdHBpZCgpIGZvciAlcyIs IGNtZCk7CgkJcmV0dXJuSFRNTFBhZ2VXaXRoTWVzc2FnZShyLCAiQ291bGRuJ3Qgc3Bhd24g Y2hpbGQgcHJvY2VzcyBjYWRnZW45OSIpOwoJCXJldHVybiBPSzsKCQlicmVhazsKCSAgICBk ZWZhdWx0OgoJCWlmICgoIShXSUZFWElURUQoZSkpKSB8fCAoV0VYSVRTVEFUVVMoZSkpKSB7 CgkJICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHItPnNlcnZlciwg IkNNRCAlcyBmYWlsZWQiLCBjbWQpOwoJCSAgICByZXR1cm5IVE1MUGFnZVdpdGhNZXNzYWdl KHIsICJDb3VsZG4ndCBzcGF3biBjaGlsZCBwcm9jZXNzIGNhZGdlbjk5Iik7CgkJICAgIHJl dHVybiBPSzsKCQl9CgkJYnJlYWs7CgkgICAgfQoJfQojZWxzZQoJewoJICAgIGNoYXIgKnNh dmVhcmdzOwoJICAgIC8qIENhbGwgdXBmZ2VuIGFuZCBjYWRnZW4gKi8KCSAgICByLT5maWxl bmFtZSA9IF9teS0+dXBmZ2VuOTk7CgkgICAgLyoKCSAgICAgKiBLZWVwIHJlcXVlc3QgYXJn dW1lbnRzIGFyb3VuZCwgd2UgbmVlZCB0aGVtIGZvciBldmVudHVhbCByZXNwb25zZQoJICAg ICAqLwoJICAgIHNhdmVhcmdzID0gYXBfcHN0cmR1cChyLT5wb29sLCByLT5hcmdzKTsKCgkg ICAgci0+YXJncyA9IGFwX3BzcHJpbnRmKHItPnBvb2wsCgkJCQkgICItbislZCstdCslZCst QyslcyIsCgkJCQkgIG1heGxvYWQsCgkJCQkgIG1heHRocmVhZCwKCQkJCSAgcm9vdGRpcik7 CiNpZmRlZiBERUJVRwoJICAgIHNwZWN3ZWI5OV9kZWJ1ZyhyLT5zZXJ2ZXIsIGFwX3BzcHJp bnRmKHItPnBvb2wsICJDYWxsaW5nICVzIiwKCQkJCQkJICAgci0+ZmlsZW5hbWUpKTsKI2Vu ZGlmCgkgICAgaWYgKCFhcF9ic3Bhd25fY2hpbGQoci0+cG9vbCwKCQkJCSBjYWxsX3NwZWN3 ZWJfdXRpbCwKCQkJCSAodm9pZCAqKSByLAoJCQkJIGtpbGxfYWZ0ZXJfdGltZW91dCwKCQkJ CSBOVUxMLAoJCQkJIE5VTEwsCgkJCQkgTlVMTCkpIHsKCQlhcF9sb2dfZXJyb3IoQVBMT0df TUFSSywKCQkJICAgICBBUExPR19FUlIsCgkJCSAgICAgci0+c2VydmVyLAoJCQkgICAgICJj b3VsZG4ndCBzcGF3biBjaGlsZCBwcm9jZXNzOiAlcyIsCgkJCSAgICAgci0+ZmlsZW5hbWUp OwoJCXItPmFyZ3MgPSBzYXZlYXJnczsKCQlyZXR1cm5IVE1MUGFnZVdpdGhNZXNzYWdlKHIs ICJDb3VsZG4ndCBzcGF3biBjaGlsZCBwcm9jZXNzIHVwZmdlbjk5Iik7CgkJcmV0dXJuIE9L OwoJICAgIH0KCgkgICAgci0+ZmlsZW5hbWUgPSBfbXktPmNhZGdlbjk5OwoJICAgIHItPmFy Z3MgPSBhcF9wc3ByaW50ZihyLT5wb29sLAoJCQkJICAiLUMrJXMrLWUrJWxkKy10KyVkKyVz IiwKCQkJCSAgcm9vdGRpciwKCQkJCSAgKGxvbmcgaW50KSBwb2ludHRpbWUsCgkJCQkgIG1h eHRocmVhZCwKCQkJCSAgbmV3ZXhwKTsKI2lmZGVmIERFQlVHCgkgICAgc3BlY3dlYjk5X2Rl YnVnKHItPnNlcnZlciwgYXBfcHNwcmludGYoci0+cG9vbCwgIkNhbGxpbmcgJXMiLAoJCQkJ CQkgICByLT5maWxlbmFtZSkpOwojZW5kaWYKCSAgICBpZiAoIWFwX2JzcGF3bl9jaGlsZChy LT5wb29sLAoJCQkJIGNhbGxfc3BlY3dlYl91dGlsLAoJCQkJICh2b2lkICopIHIsCgkJCQkg a2lsbF9hZnRlcl90aW1lb3V0LAoJCQkJIE5VTEwsCgkJCQkgTlVMTCwKCQkJCSBOVUxMKSkg ewoJCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLAoJCQkgICAgIEFQTE9HX0VSUiwKCQkJICAg ICByLT5zZXJ2ZXIsCgkJCSAgICAgImNvdWxkbid0IHNwYXduIGNoaWxkIHByb2Nlc3M6ICVz IiwKCQkJICAgICByLT5maWxlbmFtZSk7CgoJCXItPmFyZ3MgPSBzYXZlYXJnczsKCQlyZXR1 cm5IVE1MUGFnZVdpdGhNZXNzYWdlKHIsICJDb3VsZG4ndCBzcGF3biBjaGlsZCBwcm9jZXNz IHVwZmdlbjk5Iik7CgkJcmV0dXJuIE9LOwoJICAgIH0KCSAgICByLT5hcmdzID0gc2F2ZWFy Z3M7Cgl9CiNlbmRpZgoJLyoKCSAqIFdlIGFyZSBzbGVlcGluZyBhdCBsZWFzdCBvbmUgc2Vj b25kIC0gdG8gbWFrZSBzdXJlIHRoYXQgYW55CgkgKiBmc3RhdCgpIG9uIG10aW1lIHdpbGwg YWN0dWFsbHkgeWVpbGQgZGlmZmVyZW50IHZhbHVlcyAtIG5vIG1hdHRlcgoJICogaG93IGNs b3NlbHkgc3BhY2VkIHRoZSBSZXNldCdzIGFyZSBpc3N1ZWQuIChpbiBwYXJ0aWN1bGFyIHRo ZQoJICogc3BhY2luZyBiZXR3ZWVuIHRoZSB0ZXN0IHJlc2V0IGZvcm0gdGhlIG1hbmFnZXIg YW5kIHRoZSByZXNldCBhdAoJICogdGhlIGNvbW1lbmNpbmcgLSB3aGljaCBub3JtYWxseSBj YW4gYmUgd2l0aGluIGEgc2Vjb25kIC0gdGh1cwoJICogaGF2aW5nIGlkZW50aWNhbCBtdGlt ZSdzIG9uIHBsYXRmb3JtcyB3aXRoIHNlY29uZCBncmFudWFhcml0eQoJICogKFNvbGFyaXMs TG51eCkuCgkgKi8KCXNsZWVwKDIpOwoKLyoKICogTm93IHRoYXQgd2UgaGF2ZSBydW4gdGhl IHR3byBhdXhpbGxhcnkgcHJvZ3JhbXMsIHJlYWQKICogdGhlIHJlc3VsdHMgYmFjayBpbnRv IG91ciBzaGFyZWQgbWVtb3J5IGJ1ZmZlci4KICovCgovKgogKiBXZSB3YW50IGFic29sdXRl IGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhpcyBidWZmZXIgZHVyaW5nCiAqIHRoaXMgZXhlcmNp c2UuIFdvbmRlciB3aGF0IGFueSBvdGhlciBwcm9jZXNzZXMgZG8gd2hlbgogKiB0aGV5IHRy eSB0byByZWFkIHRoZSBidWZmZXIuIERvIHRoZXkgY2FtcCBvdXQ/CiAqIFVuZG9jdW1lbnRl ZDogbW1fbG9jayBhbmQgbW1fdW5sb2NrIHJldHVybiBUUlVFIG9yIEZBTFNFCiAqIHRoYXQg aXMgMSBvciAwOiBwcmVzdW1hYmx5IFRSVUUgb3IgMSBtZWFucyB0aGUgbG9jayB3YXMKICog YWNxdWlyZWQvcmVsZWFzZWQgY29ycmVjdGx5LgogKi8KCSAgICByZXN1bHQgPSBtbV9sb2Nr KGdsb2JhbEJ1ZmZlciwgTU1fTE9DS19SVyk7CglpZiAocmVzdWx0ID09IDApIHsKCSAgICBh cF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSIHwgQVBMT0dfTk9FUlJOTywgci0+ c2VydmVyLAoJCSAgICAgICAiTG9ja2luZyBzaGFyZWQgbWVtb3J5IHNlZ21lbnQgZmFpbGVk ISBNTSBlcnJvcjogJXMiLAoJCQkgbW1fZXJyb3IoKSk7CgkgICAgcmV0dXJuIEhUVFBfSU5U RVJOQUxfU0VSVkVSX0VSUk9SOwoJfQoKLyoKICogSWYgdGhlIEN1c3RvbSBBZHMgYnVmZmVy IGRvZXMgbm90IGV4aXN0LCBhbGxvY2F0ZSBpdC4gSWYgbm90LAogKiByZWFsbG9jYXRlLiBS ZWFsbG9jYXRpbmcgc2hvdWxkIG5vdCB1cHNldCB0aGluZ3MgYmVjYXVzZSB0aGUgc2l6ZQog KiBuZXZlciBjaGFuZ2VzLiBJZiB0aGUgbG9jYXRpb24gY2hhbmdlcywgd2UgbWlnaHQgaGF2 ZSB0byBzdG9wCiAqIGRvaW5nIHJlYWxsb2NhdGlvbiB0byBhdm9pZCBmcmFnbWVudGF0aW9u CiAqLwoJaWYgKHJlY19idWZmZXItPmNhZF9idWZmZXIgPT0gTlVMTCkgewoJICAgIHJlY19i dWZmZXItPmNhZF9idWZmZXIgPSBtbV9tYWxsb2MoZ2xvYmFsQnVmZmVyLCBDQURSTEVOR1RI ICogMzYwKTsKCSAgICBpZiAocmVjX2J1ZmZlci0+Y2FkX2J1ZmZlciA9PSBOVUxMKSB7CgkJ YXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiB8IEFQTE9HX05PRVJSTk8sIHIt PnNlcnZlciwKCQkJICAgICAiQWxsb2NhdGluZyBDQUQgYnVmZmVyIGluIHNoYXJlZCBtZW1v cnkgZmFpbGVkISBNTSBlcnJvcjogJXMiLAoJCQkgICAgIG1tX2Vycm9yKCkpOwoJCXJldHVy biBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKCSAgICB9Cgl9CgllbHNlIHsKCSAgICBy ZWNfYnVmZmVyLT5jYWRfYnVmZmVyID0gbW1fcmVhbGxvYyhnbG9iYWxCdWZmZXIsCgkJCQkJ CXJlY19idWZmZXItPmNhZF9idWZmZXIsCgkJCQkJCUNBRFJMRU5HVEggKiAzNjApOwoJICAg IGlmIChyZWNfYnVmZmVyLT5jYWRfYnVmZmVyID09IE5VTEwpIHsKCQlhcF9sb2dfZXJyb3Io QVBMT0dfTUFSSywgQVBMT0dfRVJSIHwgQVBMT0dfTk9FUlJOTywgci0+c2VydmVyLAoJCQkg ICAgICJSZWFsbG9jYXRpbmcgQ0FEIGJ1ZmZlciBpbiBzaGFyZWQgbWVtb3J5IGZhaWxlZCEg TU0gZXJyb3I6ICVzIiwKCQkJICAgICBtbV9lcnJvcigpKTsKCQlyZXR1cm4gSFRUUF9JTlRF Uk5BTF9TRVJWRVJfRVJST1I7CgkgICAgfQoJfQoKLyoKICogU2FtZSBmb3IgVXNlciBQcm9m aWxlIGFycmF5LiBUaGlzIGNoYW5nZXMgc2l6ZSBmb3IgcHJhY3RpY2FsbHkgZXZlcnkKICog cnVuLiBHZXRzIHNpemUgcGFyYW1ldGVyIGZyb20gdGhlIGNvbW1hbmQvUmVzZXQgcGFyYW1l dGVyIHN0cmluZy4KICovCglpZiAocmVjX2J1ZmZlci0+dXBfYnVmZmVyID09IE5VTEwpIHsK CSAgICByZWNfYnVmZmVyLT51cF9idWZmZXIgPSBtbV9tYWxsb2MoZ2xvYmFsQnVmZmVyLCBt YXhsb2FkICogc2l6ZW9mKHVfaW50MzJfdCkpOwoJICAgIGlmIChyZWNfYnVmZmVyLT51cF9i dWZmZXIgPT0gTlVMTCkgewoJCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIg fCBBUExPR19OT0VSUk5PLCByLT5zZXJ2ZXIsCgkJIkFsbG9jYXRpbmcgVVAgYnVmZmVyIGlu IHNoYXJlZCBtZW1vcnkgZmFpbGVkISBNTSBlcnJvcjogJXMiLAoJCQkgICAgIG1tX2Vycm9y KCkpOwoJCXJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKCSAgICB9Cgl9Cgll bHNlIHsKCSAgICByZWNfYnVmZmVyLT51cF9idWZmZXIgPSBtbV9yZWFsbG9jKGdsb2JhbEJ1 ZmZlciwKCQkJCQkgICAgICAgcmVjX2J1ZmZlci0+dXBfYnVmZmVyLAoJCQkJCSAgICAgICBt YXhsb2FkICogc2l6ZW9mKHVfaW50MzJfdCkpOwoJICAgIGlmIChyZWNfYnVmZmVyLT51cF9i dWZmZXIgPT0gTlVMTCkgewoJCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIg fCBBUExPR19OT0VSUk5PLCByLT5zZXJ2ZXIsCgkJCSAgICAgIlJlYWxsb2NhdGluZyBVUCBi dWZmZXIgaW4gc2hhcmVkIG1lbW9yeSBmYWlsZWQhIE1NIGVycm9yOiAlcyIsCgkJCSAgICAg bW1fZXJyb3IoKSk7CgkJcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwoJICAg IH0KCX0KCi8qIE9wZW4gQ0FEIGZpbGUsIHJlYWQsIHBhcnNlIGFuZCBzdHVmZiBpbnRvIGJ1 ZmZlciwgY2xvc2UuICovCglmID0gZm9wZW4oX215LT5jYWRfcGF0aCwgInIiKTsKCWlmIChm ID09IE5VTEwpIHsKCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBy LT5zZXJ2ZXIsICJGYWlsZWQgdG8gb3BlbiBDQUQgZmlsZSAnJXMnIiwgX215LT5jYWRfcGF0 aCk7CgkgICAgcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwoJfTsKCglpZiAo X3Jsb2NrKHItPnNlcnZlciwgciwgZiwgX215LT5jYWRfcGF0aCkpIHsKCSAgICBhcF9sb2df ZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLT5zZXJ2ZXIsICJGYWlsZWQgdG8gbG9j ayBDQUQgZmlsZSAnJXMnIiwgX215LT5jYWRfcGF0aCk7CgkgICAgcmV0dXJuIEhUVFBfSU5U RVJOQUxfU0VSVkVSX0VSUk9SOwoJfQoKCWNhZF91aWQgPSAwOwoJcmVzdWx0ID0gMDsKCXdo aWxlIChjYWRfdWlkIDwgTlVNQ0FEUkVDT1JEUykgewoJICAgIGludCBsLCBpZCwgZGVtLCBh ZHcsIGFkbSwgZXhwOwoJICAgIF9XSU5UUihsID0gZnJlYWQoY2FkbGluZSwgQ0FEUkxFTkdU SCwgMSwgZikpOwoJICAgIGlmIChsICE9IDEpCgkJYnJlYWs7CQkvKiBvbiBFT0YgYW5kIG9u IGVycm9yICovCgkgICAgLyoKCSAgICAgKiBEZWNvZGUgQUQgZmlsZSAoc2VlIHNwZWN3ZWIg cGFnZSAuLikKCSAgICAgKgoJICAgICAqIDAxMjM0NTY3ODkuMTIzNDU2Nzg5LjEyMzQ1Njc4 OS4xMjM0NTY3OCAwMTIzNCAwMTIzNDU2NyAwMTIzNDU2NwoJICAgICAqIDAxMiAwMTIzNDU2 Nzg5biAiJTVkICU4WCAlOFggJTNkICUxMGRcbiIsIEFkX2lkLAoJICAgICAqIEFkRGVtb2dy YXBoaWNzLCBXZWlnaHRpbmdzLCBNaW5pbXVtX01hdGNoX1ZhbHVlLAoJICAgICAqIEV4cGly YXRpb25fVGltZQoJICAgICAqCgkgICAgICovCgkgICAgaWYgKHNzY2FuZihjYWRsaW5lLCAi JWQgJXggJXggJWQgJWQiLCAmaWQsICZkZW0sICZhZHcsICZhZG0sICZleHApICE9IDUpIHsK CQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLT5zZXJ2ZXIsICJFbnRy eSBDQUQgZmlsZSBjb3JydXB0ZWQiKTsKCQljb250aW51ZTsKCSAgICB9CgoJICAgIGlmIChj YWRfdWlkICE9IGlkKSB7CgkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwg ci0+c2VydmVyLAoJCQkgICAgICJFbnRyeSBDQUQgZmlsZSBJZCMgb3V0IG9mIHN5bmMiKTsK CQljb250aW51ZTsKCSAgICB9CgkgICAgcmVjX2J1ZmZlci0+Y2FkX2J1ZmZlcltjYWRfdWlk XS5hZGRlbW9ncmFwaGljcyA9IGRlbTsKCSAgICByZWNfYnVmZmVyLT5jYWRfYnVmZmVyW2Nh ZF91aWRdLmdlbl93ZWlnaHRpbmdzID0KCQkoYWR3ICYgMHgwMGYwMDAwKSA+PiAxNjsKCSAg ICByZWNfYnVmZmVyLT5jYWRfYnVmZmVyW2NhZF91aWRdLmFnZV93ZWlnaHRpbmdzID0KCQko YWR3ICYgMHgwMDBmMDAwKSA+PiAxMjsKCSAgICByZWNfYnVmZmVyLT5jYWRfYnVmZmVyW2Nh ZF91aWRdLnJlZ193ZWlnaHRpbmdzID0KCQkoYWR3ICYgMHgwMDAwZjAwKSA+PiA4OwoJICAg IHJlY19idWZmZXItPmNhZF9idWZmZXJbY2FkX3VpZF0uaW50MV93ZWlnaHRpbmdzID0KCQko YWR3ICYgMHgwMDAwMGYwKSA+PiA0OwoJICAgIHJlY19idWZmZXItPmNhZF9idWZmZXJbY2Fk X3VpZF0uaW50Ml93ZWlnaHRpbmdzID0KCQkoYWR3ICYgMHgwMDAwMDBmKTsKCSAgICByZWNf YnVmZmVyLT5jYWRfYnVmZmVyW2NhZF91aWRdLm1pbmltdW1fbWF0Y2hfdmFsdWUgPSBhZG07 CgkgICAgcmVjX2J1ZmZlci0+Y2FkX2J1ZmZlcltjYWRfdWlkXS5leHBpcmF0aW9uX3RpbWUg PSBleHA7CgkgICAgY2FkX3VpZCsrOwoJfQoKCWlmIChmZXJyb3IoZikpIHsKCSAgICBhcF9s b2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLT5zZXJ2ZXIsICJGYWlsZWQgdG8g cmVhZCBmcm9tIENBRCBmaWxlICclcyciLCBfbXktPmNhZF9wYXRoKTsKCSAgICByZXN1bHQg PSAxOwoJfTsKCglpZiAoX3VubG9jayhyLT5zZXJ2ZXIsIHIsIGYsIF9teS0+Y2FkX3BhdGgp KSB7CgkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgci0+c2VydmVy LCAiRmFpbGVkIHRvIHVubG9jayB0aGUgQ0FEIGZpbGUgJyVzJyIsIF9teS0+Y2FkX3BhdGgp OwoJICAgIHJlc3VsdCA9IDE7Cgl9OwoKCWZjbG9zZShmKTsKCWlmIChyZXN1bHQpIHsKCSAg ICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLT5zZXJ2ZXIsCgkJCSAi RXJyb3Igb2NjdXJyZWQgZHVyaW5nIENBRCByZWFkIik7Cgl9CgoJX215LT5jYWRfY291bnQg PSBOVU1DQURSRUNPUkRTOwkvKiBJdCdzIGNvbnN0YW50LiBLZWVwaW5nIGl0IGFyb3VuZAoJ CQkJCSAqIGluIGEgdmFyaWFibGUgaXMgbm90IHJlYWxseQoJCQkJCSAqIG5lY2Vzc2FyeSBh bmQgbWlnaHQgc29tZWRheSBiZQoJCQkJCSAqIGVsbGltaW5hdGVkLiAqLwoKLyogT3BlbiBV UCBmaWxlICovCi8qIFJlYWQgbGluZXMsIHBhcnNlIGFuZCBzdHVmZiBpbnRvIGJ1ZmZlciAq LwovKiBDbG9zZSBVUCBmaWxlICovCgkvKgoJICogb3BlbiB0aGUgZmlsZSwgd2l0aCBtZW1v cnkgZnJvbSB0aGUgcmVxdWVzdCBwb29sIGJlY2F1c2Ugd2Ugd2lsbAoJICogbm90IG5lZWQg aXQgdmVyeSBsb25nLgoJICovCglpZiAoKGYgPSBmb3BlbihfbXktPnVwX3BhdGgsICJyIikp ID09IE5VTEwpIHsKCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBy LT5zZXJ2ZXIsCgkJICJDb3VsZCBub3Qgb3BlbiBVc2VyLlBlcnNvbmFsaXR5IGZpbGUgJyVz JyIsIF9teS0+dXBfcGF0aCk7CgkgICAgcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VS Uk9SOwoJfQoKCWlmIChfcmxvY2soci0+c2VydmVyLCByLCBmLCBfbXktPnVwX3BhdGgpKSB7 CgkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgci0+c2VydmVyLAoJ CSAiRmFpbGVkIHRvIGxvY2sgVXNlci5QZXJzb25hbGl0eSBmaWxlICclcyciLCBfbXktPnVw X3BhdGgpOwoJICAgIGZjbG9zZShmKTsKCSAgICByZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJW RVJfRVJST1I7Cgl9CgoJLyogUmVhZCBldmVyeSByZWNvcmQsIHBhcnNlLCBwdXQgdXNlciBk ZW1vZ3JhcGhpY3MgaW4gYXJyYXkgKi8KCXVwX3VpZCA9IDA7Cgl3aGlsZSAoMSkgewoJICAg IGludCBpZCwgZGVtOwoJICAgIF9XSU5UUihyZXN1bHQgPSBmcmVhZCgodm9pZCAqKSB1cF9y ZWNvcmQsIHNpemVvZih1cF9yZWNvcmQpLCAxLCBmKSk7CgkgICAgaWYgKHJlc3VsdCAhPSAx KQoJCWJyZWFrOwkJLyogb24gZXJyb3Igb3IgRU9GICovCgoJICAgIGlmIChzc2NhbmYodXBf cmVjb3JkLCAiJWQgJXgiLCAmaWQsICZkZW0pICE9IDIpIHsKCQlhcF9sb2dfZXJyb3IoQVBM T0dfTUFSSywgQVBMT0dfRVJSLCByLT5zZXJ2ZXIsICJjb3JydXB0ZWQgZW50cnkgaW4gVSBm aWxlIik7CgkJcmVzdWx0ID0gMTsKCSAgICB9CgoJICAgIGlmICh1cF91aWQgIT0gaWQpIHsK CQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLT5zZXJ2ZXIsICJ1c2Vy IGlkIG91dCBvZiBzeW5jIGluIFVQIGZpbGUiKTsKCQlyZXN1bHQgPSAxOwoJICAgIH0KCSAg ICByZWNfYnVmZmVyLT51cF9idWZmZXJbdXBfdWlkXSA9IGRlbTsKCSAgICB1cF91aWQrKzsK CX07CgoJaWYgKGZlcnJvcihmKSkgewoJICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBB UExPR19FUlIsIHItPnNlcnZlciwgIkZhaWxlZCByZWFkIGZyb20gVXNlci5QZXJzb25hbGl0 eSBmaWxlICclcyciLCBfbXktPnVwX3BhdGgpOwoJICAgIHJlc3VsdCA9IDE7Cgl9CgoJaWYg KF91bmxvY2soci0+c2VydmVyLCByLCBmLCBfbXktPnVwX3BhdGgpKSB7CgkgICAgYXBfbG9n X2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgci0+c2VydmVyLCAiRmFpbGVkIHRvIHVu bG9jayBVc2VyLlBlcnNvbmFsaXR5IGZpbGUgJyVzJyIsIF9teS0+dXBfcGF0aCk7CgkgICAg cmVzdWx0ID0gMTsKCX07CgoJLyogQ2xvc2UgZmlsZSAqLwoJZmNsb3NlKGYpOwoKCXJlY19i dWZmZXItPnVwX2NvdW50ID0gdXBfdWlkICsgMTsJLyogVXNlciBJRCBpcyB6ZXJvLWJhc2Vk ICovCgoKLyogV2UncmUgZG9uZSwgbGV0IHRoZSBvdGhlciBjaGlsZHJlbiBpbiBhZ2Fpbi4g Ki8KCXJlc3VsdCA9IG1tX3VubG9jayhnbG9iYWxCdWZmZXIpOwoJaWYgKHJlc3VsdCA9PSAw KSB7CgkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiB8IEFQTE9HX05P RVJSTk8sIHItPnNlcnZlciwKCQkgICAgICJVbmxvY2tpbmcgc2hhcmVkIG1lbW9yeSBzZWdt ZW50IGZhaWxlZCEgTU0gZXJyb3I6ICVzIiwKCQkJIG1tX2Vycm9yKCkpOwoJICAgIHJldHVy biBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKCX0KCi8qIFJlc2V0IHBvc3QubG9nICov CgkgICAgZiA9IGFwX3Bmb3BlbihyLT5wb29sLCBfbXktPmxvZ19wYXRoLCAidyIpOwkvKiBU cnVuY2F0ZSwgb3BlbiBmb3IKCQkJCQkJCSAqIHdyaXRpbmcgKi8KCWlmIChmID09IE5VTEwp IHsKCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLT5zZXJ2ZXIs ICJDb3VsZCBub3Qgb3BlbiBwb3N0LmxvZyAnJXMnIGZvciB3cml0aW5nIiwgX215LT5sb2df cGF0aCk7CgkgICAgcmV0dXJuSFRNTFBhZ2VXaXRoTWVzc2FnZShyLCAiRXJyb3I6IGNvdWxk bid0IG9wZW4gcG9zdC5sb2cgZm9yIHdyaXRpbmcuIik7CgkgICAgcmV0dXJuIE9LOwoJfQoJ bGluZSA9IGFwX3BzcHJpbnRmKHItPnBvb2wsICIlMTBkXG4iLCAwKTsKCV9XSU5UUihlcnIg PSBmd3JpdGUobGluZSwgc3RybGVuKGxpbmUpLCAxLCBmKSk7CglpZiAoZXJyID09IC0xKSB7 CgkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgci0+c2VydmVyLCAi Q291bGQgbm90IHdyaXRlIHRvIHBvc3QubG9nICclcyciLCBfbXktPmxvZ19wYXRoKTsKCSAg ICByZXR1cm5IVE1MUGFnZVdpdGhNZXNzYWdlKHIsICJFcnJvcjogY291bGQgbm90IHdyaXRl IHRvIHBvc3QubG9nLiIpOwoJfQoJZWxzZSB7CgkgICAgcmV0dXJuSFRNTFBhZ2VXaXRoTWVz c2FnZShyLCAiIik7CS8qIE5vIG5ld3MgaXMgZ29vZCBuZXdzLiAqLwoJfQkJCS8qIFdyaXRl ICB0byBwb3N0LmxvZyAqLwoJYXBfcGZjbG9zZShyLT5wb29sLCBmKTsKCiNpZmRlZiBTRU1D TlRSCgl7CgkgICAgc3RydWN0IHNlbWJ1ZiBvcHNbMV07CiNpZiAwCgkgICAgLyogZ2V0IG91 ciBjb3VudGVyLiAqLwoJICAgIGludCBpZDsKCSAgICBpZiAoKGlkID0gc2VtZ2V0KFNFTUtF WSwgMCwgMDY2NikpIDwgMCkgewoJCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19F UlIsIHItPnNlcnZlciwgIkNvdWxkIG5vdCBnZXQgc2VtIik7CgkJcmV0dXJuSFRNTFBhZ2VX aXRoTWVzc2FnZShyLCAiRXJyb3I6IGNvdWxkIG5vdCBnZXQgc2VtIik7CgkgICAgfTsKI2Vu ZGlmCgkgICAgLyogYW5kIGluY3JlbWVudCAqLwoJICAgIG9wc1swXS5zZW1fbnVtID0gMDsK CSAgICBvcHNbMF0uc2VtX29wID0gMTsKCSAgICBvcHNbMF0uc2VtX2ZsZyA9IDA7CgkgICAg aWYgKChzZW1vcChfbXktPnNlbWlkLCBvcHMsIDEpKSA8IDApIHsKCQlhcF9sb2dfZXJyb3Io QVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLT5zZXJ2ZXIsICJDb3VsZCBub3QgaW5jIHNlbSIp OwoJCXJldHVybkhUTUxQYWdlV2l0aE1lc3NhZ2UociwgIkVycm9yOiBjb3VsZCBub3QgZ2V0 IHNlbSIpOwoJICAgIH07CgkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0RF QlVHIHwgQVBMT0dfTk9FUlJOTywgci0+c2VydmVyLCAiSW5jZWQgdGhlIHNlbSIpOwoJfQoj ZW5kaWYKCglyZXR1cm4gT0s7CiAgICB9CQkJCS8qIFJlc2V0IENvbW1hbmQgKi8KCiAgICAv KiBGYWxsIHRocm91Z2ggKi8KICAgIHJldHVybkhUTUxQYWdlV2l0aE1lc3NhZ2UociwgIkVy cm9yOiB1bnJlY29nbml6ZWQgY29tbWFuZCAnJXMnIiwgci0+YXJncyk7CiAgICByZXR1cm4g T0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioKICogc3BlY3dlYjk5X2dldF9oYW5kbGVyICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKi8KCnN0YXRpYyBpbnQgc3BlY3dlYjk5X2dldF9oYW5kbGVyKHJlcXVlc3Rf cmVjICpyKQp7CiAgICBjaGFyICpwYXRoOwogICAgRklMRSAqdGhlZmlsZTsKICAgIGNvbnN0 IGNoYXIgKmRvY3Jvb3QgPSBhcF9kb2N1bWVudF9yb290KHIpOwogICAgLyoKICAgICAqIFRo aXMgc2hvdWxkIG5vdCBiZSB0ZXN0ZWQgZm9yIGV2ZXJ5IHJlcXVlc3QuIEV2ZW50dWFsbHks IHRoaXMgY29kZQogICAgICogd2lsbCBmaW5kIGl0cyB3YXkgdG8gdGhlIGhvdXNla2VlcGlu ZyBjb21tYW5kIGhhbmRsZXIsIGJ1dCB0aGF0IGRvZXMKICAgICAqIG5vdCBleGlzdCB5ZXQu CiAgICAgKi8KCiAgICAvKgogICAgICogQ29uc3RydWN0IHRoZSBwYXRoIHRvIG91ciBmaWxl LiBOb3RlIHRoYXQgdXNpbmcgYXBfZG9jdW1lbnRfcm9vdCgpIGlzCiAgICAgKiBub3Qgc2Vu YW5nLiBJIHNob3VsZCBkbyB0aGlzIGEgc3VicmVxdWVzdCBidXQgT1RPSCB0aGF0IHdvdWxk IHRha2UKICAgICAqIHRpbWUgYW5kIHdlIGRvbid0IGhhdmUgdGltZS4KICAgICAqLwogICAg cGF0aCA9IGFwX21ha2VfZnVsbF9wYXRoKHItPnBvb2wsIGRvY3Jvb3QsIHItPmFyZ3MpOwoK ICAgIC8qIHVzZSBhcF8gY2FsbCB0byBvcGVuIHRoZSBmaWxlICovCiAgICBpZiAoISh0aGVm aWxlID0gYXBfcGZvcGVuKHItPnBvb2wsIHBhdGgsICJyIikpKSB7CglhcF9sb2dfZXJyb3Io QVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLT5zZXJ2ZXIsCgkJICAgICAiQ291bGQgbm90IG9w ZW4gRmlsZSAnJXMnIChnZXQgaGFuZGxlcikiLCBwYXRoKTsKCXJldHVybkhUTUxQYWdlV2l0 aE1lc3NhZ2UociwgIkNvdWxkIG5vdCBvcGVuICclcyc6ICVzIiwKCQkJCSAgcGF0aCwgc3Ry ZXJyb3IoZXJybm8pKTsKCXJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKICAg IH07CgogICAgcmV0dXJuSFRNTFBhZ2VXaXRoRmlsZShyLCB0aGVmaWxlKTsKICAgIGFwX3Bm Y2xvc2Uoci0+cG9vbCwgdGhlZmlsZSk7CgogICAgcmV0dXJuIE9LOwp9CQkJCS8qIHNwZWN3 ZWI5OV9nZXRfaGFuZGxlciAqLwoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogY3VzdG9tYWRz Y2FuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKi8KCmNhZGRyX3QgY3VzdG9tYWRzY2FuKHJlcXVl c3RfcmVjICpyLCBGSUxFICpmLCBpbnQxNl90IGFkaWQpCnsKICAgIHN0cnVjdCBzdGF0IHM7 CiAgICBpbnQxNl90IGZkLCBpOwogICAgc2l6ZV90IGxlbjsKICAgIGNoYXIgKmluZGV4LCAq TiwgKlgsICpZOwogICAgY2hhciAqYnVmOwogICAgLyogcGlucG9pbnQgdGhlIGZpbGUgZnJv bSB0aGUgYWQgSUQgKi8KICAgIE4gPSBhcF9wc3ByaW50ZihyLT5wb29sLCAiJTA1ZCIsIGFk aWQgLyAzNik7CiAgICBYID0gYXBfcHNwcmludGYoci0+cG9vbCwgIiUxZCIsIChhZGlkICUg MzYpIC8gOSk7CiAgICBZID0gYXBfcHNwcmludGYoci0+cG9vbCwgIiUxZCIsIGFkaWQgJSA5 KTsKICAgIC8qIEZpbGUgaXMgYWxyZWFkeSBvcGVuICovCiAgICBmZCA9IGZpbGVubyhmKTsK ICAgIGlmIChmc3RhdChmZCwgJnMpID09IC0xKQoJcmV0dXJuIE5VTEw7CgogICAgbGVuID0g KHNpemVfdCkgcy5zdF9zaXplOwogICAgYnVmID0gYXBfcGFsbG9jKHItPnBvb2wsIGxlbiAr IDEpOwoKICAgIGlmIChsZW4pIHsKCWNoYXIgKmJ1ZnAgPSBidWY7CglpbnQgbCwgbGVmdCA9 IGxlbjsKCWRvIHsKCSAgICBsID0gcmVhZChmZCwgYnVmcCwgbGVmdCk7CgkgICAgaWYgKGwg PT0gLTEpIHsKCQlpZiAoKGVycm5vID09IEVJTlRSKSB8fCAoZXJybm8gPT0gRUFHQUlOKSkK CQkgICAgY29udGludWU7CgkJcmV0dXJuIE5VTEw7CS8qIEVycm9yIG9uIHJlYWQgKi8KCSAg ICB9CgkgICAgZWxzZSBpZiAobCA9PSAwKQoJCXJldHVybiBOVUxMOwkvKiBQcmVtYXR1cmUg ZW5kICovCgkgICAgbGVmdCAtPSBsOwoJICAgIGJ1ZnAgKz0gbDsKCX0gd2hpbGUgKGxlZnQp OwogICAgfQogICAgYnVmW2xlbl0gPSAnXDAnOwkJLyogTnVsbC10ZXJtaW5hdGUgaXQgc28g dGhhdCBldmVyeWJvZHkgZWxzZQoJCQkJICogd2hvIGhhcyB0byBoYW5kbGUgdGhpcyBrbm93 cyBob3cgbG9uZyB0aGUKCQkJCSAqIGJ1ZmZlciBpcy4gKi8KICAgIGluZGV4ID0gYnVmOwog ICAgLyoKICAgICAqIEl0IHNheXMgaW4gdGhlIHJ1biBydWxlcyB0aGF0IHdlIGFyZSB0byBz Y2FuIHVudGlsIHRoZSBlbmQgb2YgdGhlCiAgICAgKiBmaWxlLi4uIHdoYXQgaWYgdGhlcmUg YXJlIG1vcmUgdGhhbiBvbmUgb2NjdXJyZW5jZSBvZiB0aGUgYWQgKGNvbW1vbgogICAgICog ZGlzZWFzZSBvbiB0b2RheXMgd2ViIHBhZ2VzKT8KICAgICAqLwogICAgd2hpbGUgKChpbmRl eCA9IHN0cnN0cihpbmRleCwgTUFSS0VSKSkgIT0gTlVMTCkgewoJLyogVGhpcyBsYW5kcyB1 cyBhIG5ldyBpbmRleCAqLwovKiA8IVdFQjk5Q0FEPjxJTUcgU1JDPSIvZmlsZV9zZXQvZGly Tk5OTk4vY2xhc3NYX1kiPgogKiAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIz NDU2Nzg5MDEyMzQ1Njc4OQogKiAgICAgICAgICAgMSAgICAgICAgIDIgICAgICAgICAzICAg ICAgICAgNCAgICAgICAgICAqLwoJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewoJICAgICoo aW5kZXggKyAzNCArIGkpID0gTltpXTsKCX0KCSooaW5kZXggKyA0NSkgPSAqWDsKCSooaW5k ZXggKyA0NykgPSAqWTsKCWluZGV4ICs9IDUwOwkJLyogUHV0IHRoZSBpbmRleCBwYXN0IHRo aXMgbWFya2VyLCBjb250aW51ZQoJCQkJICogc2Nhbm5pbmcgKi8KICAgIH0KICAgIHJldHVy biBidWY7Cgp9CQkJCS8qIGN1c3RvbWFkc2NhbiAqLwoKCi8qKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgog KiBzcGVjd2ViOTlfY2FkZ2V0X2hhbmRsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIGludCBzcGVj d2ViOTlfY2FkZ2V0X2hhbmRsZXIocmVxdWVzdF9yZWMgKnIpCnsKICAgIHN0cnVjdCBzcGVj d2ViOTlfbW9kdWxlX2RhdGEgKl9teSA9CiAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5z ZXJ2ZXItPm1vZHVsZV9jb25maWcsICZzcGVjd2ViOTlfbW9kdWxlKTsKICAgIGNoYXIgKmNv b2tpZV9pbiwgKmNvb2tpZV9vdXQsICplbmQ7CiAgICBjb25zdCBjaGFyICpkb2Nyb290ID0g YXBfZG9jdW1lbnRfcm9vdChyKTsKICAgIGNoYXIgKmZpbGVuYW1lOwogICAgaW50MTZfdCBt eV91c2VyLCBsYXN0X2FkLCB1c2VyaW5kZXgsIGFkaW5kZXgsIGV4cGlyZWQgPSAwOwogICAg dV9pbnQzMl90IHVzZXJkZW1vZ3JhcGhpY3MsIGNvbWJpbmVkZGVtb2dyYXBoaWNzOwkvKiBp dCdzIGEgYml0bWFwICovCiAgICB1X2ludDE2X3QgYWRfd2VpZ2h0OwogICAgRklMRSAqcGFn ZTsKCiAgICAvKgogICAgICogVGhpcyBzaG91bGQgbm90IGJlIHRlc3RlZCBmb3IgZXZlcnkg cmVxdWVzdC4gRXZlbnR1YWxseSwgdGhpcyBjb2RlCiAgICAgKiB3aWxsIGZpbmQgaXRzIHdh eSB0byB0aGUgaG91c2VrZWVwaW5nIGNvbW1hbmQgaGFuZGxlciwgYnV0IHRoYXQgZG9lcwog ICAgICogbm90IGV4aXN0IHlldC4KICAgICAqLwogICAgLyogR2V0IHRoZSBjb29raWUgKi8K ICAgIGNvb2tpZV9pbiA9IChjaGFyICopIGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAi Q29va2llIik7CiNpZmRlZiBERUJVRwogICAgc3BlY3dlYjk5X2RlYnVnKHItPnNlcnZlciwg YXBfcHNwcmludGYoci0+cG9vbCwKCQkJICAgIkdvdCBjYWRnZXQgcmVxdWVzdCwgY29va2ll IGlzOiAlcyIsIGNvb2tpZV9pbikpOwojZW5kaWYKCiAgICAvKgogICAgICogWFhYIEFnYWlu LCBhcF9kb2N1bWVudF9yb290IGlzIGRlcHJlY2F0ZWQuIEkgc2hvdWxkIHByb2JhYmx5IGZp bmQgdGhlCiAgICAgKiBkb2N1bWVudCByb290IGluIG15IGluaXQgaGFuZGxlciBhbmQga2Vl cCBpdCBhcm91bmQuCiAgICAgKi8KICAgIGZpbGVuYW1lID0gYXBfbWFrZV9mdWxsX3BhdGgo ci0+cG9vbCwgZG9jcm9vdCwgci0+YXJncyk7CgojaWZkZWYgREVCVUcKICAgIGFwX2xvZ19l cnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIHItPnNlcnZl ciwKCQkgIkZ1bGwgcGF0aCBpcyAnJXMnIiwgZmlsZW5hbWUpOwojZW5kaWYKCiAgICBpZiAo KHBhZ2UgPSBhcF9wZm9wZW4oci0+cG9vbCwgZmlsZW5hbWUsICJyIikpID09IE5VTEwpIHsK CXJldHVybkhUTUxQYWdlV2l0aE1lc3NhZ2UociwgIkZpbGUgJyVzJyBub3QgZm91bmQiLCBm aWxlbmFtZSk7CglhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLT5zZXJ2 ZXIsCgkJICAgICAiQ291bGQgbm90IG9wZW4gRmlsZSAnJXMnIChjYWRnZXQgaGFuZGxlciki LCBmaWxlbmFtZSk7CglyZXR1cm4gT0s7CiAgICB9CiAgICAvKgogICAgICogUGFyc2UgQ29v a2llIHN0cmluZyBpbnRvIE15VXNlciBhbmQgTGFzdF9BZC4gVGhlIGZvcm1hdCBvZiB0aGUg Y29va2llCiAgICAgKiBpcyBhcyBmb2xsb3dzICh0aGUgb3JkZXIgb2Yga2V5cyBhbmQgdmFs dWVzIGlzIGZpeGVkKTogMSAgICAgICAgIDIgMyA0CiAgICAgKiA1IDAxMjM0NTY3ODkwMTIz NDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OQogICAgICog bXlfY29va2llPXVzZXJfaWQ9W015VXNlcl0mbGFzdF9hZD1bTGFzdF9hZF0KICAgICAqLwog ICAgaWYgKCFjb29raWVfaW4pIHsKCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19F UlIgfCBBUExPR19OT0VSUk5PLCByLT5zZXJ2ZXIsCgkJICAgICAiRXJyb3I6IGV4cGVjdGVk IGNvb2tpZSBidXQgZm91bmQgbm9uZSIpOwoJcmV0dXJuSFRNTFBhZ2VXaXRoTWVzc2FnZShy LCAiRXJyb3I6IGV4cGVjdGVkIGNvb2tpZSBidXQgZm91bmQgbm9uZSIpOwoJcmV0dXJuIEhU VFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgfQkJCQkvKiBJcyB0aGVyZSBhIGNvb2tp ZSAqLwoKICAgIC8qIFBhcnNlIHRoZSBpbmNvbWluZyBDb29raWUgZGF0YSAqLwogICAgLyog Rm9ybWF0IG9mIGlucHV0OiB1c2VyX2lkPTx4PiZsYXN0X2FkPTx5PiAqLwogICAgbXlfdXNl ciA9IHN0cnRvbChjb29raWVfaW4gKyAxOCwgJmVuZCwgMTApOwogICAgbGFzdF9hZCA9IGF0 b2koZW5kICsgOSk7CS8qIFdlIHRydXN0IHRoYXQgdGhlcmUgaXMgc29tZXRoaW5nIGJlaGlu ZAoJCQkJICogdGhlIGxhc3RfYWQgdmFsdWUgdG8gc3RvcCB0aGUgY29udmVyc2lvbiAqLwoj aWZkZWYgREVCVUcKICAgIHNwZWN3ZWI5OV9kZWJ1ZyhyLT5zZXJ2ZXIsIGFwX3BzcHJpbnRm KHItPnBvb2wsCgkJCQkJIlVzZXJJRDogJWQsIExhc3RBZDogJWQsIFZhbGlkOiAlcyIsCgkJ CQkJICAgbXlfdXNlciwKCQkJCQkgICBsYXN0X2FkLAoJCQkJCShjb29raWVfaW4gPT0gZW5k KSA/ICJubyIgOiAieWVzIikpOwojZW5kaWYKCiAgICAvKgogICAgICogQ2FsY3VsYXRlIFVz ZXJJbmRleCBpbnRvIFVzZXIuUGVyc29uYWxpdHkgZmlsZSBVc2VySW5kZXggPSBNeVVzZXIg LQogICAgICogMTAwMDAKICAgICAqLwogICAgdXNlcmluZGV4ID0gbXlfdXNlciAtIDEwMDAw OwoKICAgIC8qCiAgICAgKiBGaW5kIFVzZXIuUGVyc29uYWxpdHkgcmVjb3JkIHVzaW5nIFVz ZXJJbmRleAogICAgICovCgojaWYgMAogICAgaWYgKGNoZWNrVVBGaWxlKHItPnNlcnZlciwg ciwgX215KSkgewoJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiB8IEFQTE9H X05PRVJSTk8sIHItPnNlcnZlciwKCQkgICAgICJVc2VyIHBlcnNvbmFsaXR5IGNoZWNrIGZh aWxlZC4iKTsKCXJldHVybkhUTUxQYWdlV2l0aE1lc3NhZ2UociwgIkVycm9yOiBVc2VyIHBl cnNvbmFsaXR5IGZpbGUgY2hlY2sgZmFpbGVkLiIpOwoJcmV0dXJuIEhUVFBfSU5URVJOQUxf U0VSVkVSX0VSUk9SOwogICAgfQojZW5kaWYKCiAgICBpZiAodXNlcmluZGV4IDwgMCB8fCB1 c2VyaW5kZXggPj0gcmVjX2J1ZmZlci0+dXBfY291bnQpIHsKCS8qIENvdWxkbid0IGZpbmQg aXQsIHNvIGxldCdzIG1ha2Ugb3VyIG1hcmsgYW5kIGxlYXZlICovCiNpZmRlZiBERUJVRwoJ c3BlY3dlYjk5X2RlYnVnKHItPnNlcnZlciwgIlVzZXIgcmVjb3JkIG5vdCBmb3VuZCIpOwoj ZW5kaWYKCXJldHVybkhUTUxQYWdlV2l0aE1lc3NhZ2UociwgIlVzZXIgUmVjb3JkICVkIG5v dCBmb3VuZCAob3V0IG9mIG15IGN1cnJlbnQgcmFuZ2UgJWQgLi4gJWQpIiwKCQl1c2VyaW5k ZXggKyAxMDAwMCwgMTAwMDAsIHJlY19idWZmZXItPnVwX2NvdW50ICsgMTAwMDAgLSAxKTsK CWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIgfCBBUExPR19OT0VSUk5PLCBy LT5zZXJ2ZXIsCgkgICAgICAiVXNlciBSZWNvcmQgJWQgbm90IGZvdW5kIChvdXQgb2YgbXkg Y3VycmVudCByYW5nZSAlZCAuLiAlZCkiLAoJCXVzZXJpbmRleCArIDEwMDAwLCAxMDAwMCwg cmVjX2J1ZmZlci0+dXBfY291bnQgKyAxMDAwMCAtIDEpOwoJcmV0dXJuIE9LOwogICAgfQoK ICAgIC8qIElmIGNhc2UsIG9sZCBiZWhhdmlvdXIuIEVsc2UsIHVzZSBzaG0gYnVmZmVyICov CiNpZiAwCiAgICB1c2VyZGVtb2dyYXBoaWNzID0gX215LT51cFt1c2VyaW5kZXhdOwojZWxz ZQogICAgdXNlcmRlbW9ncmFwaGljcyA9IHJlY19idWZmZXItPnVwX2J1ZmZlclt1c2VyaW5k ZXhdOwojZW5kaWYKCiNpZiAwCiAgICBpZiAoY2hlY2tDQURGaWxlKHItPnNlcnZlciwgciwg X215KSkgewoJcmV0dXJuSFRNTFBhZ2VXaXRoTWVzc2FnZShyLCAiRXJyb3I6IEFkIGZpbGUg Y2hlY2sgZmFpbGVkLiIpOwoJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiB8 IEFQTE9HX05PRVJSTk8sIHItPnNlcnZlciwKCQkgICAgICJBZCBmaWxlIGNoZWNrIGZhaWxl ZCIpOwoJcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgfQojZW5kaWYK CiAgICBhZGluZGV4ID0gKGxhc3RfYWQgKyAxKSAlIDM2MDsKLyoKICAgIERvIEZvciBFYWNo IEFkIGluIEN1c3RvbS5BZHMgc3RhcnRpbmcgd2hlcmUgQWRfaW5kZXggPT0gQWRfaWQKKi8K ICAgIHdoaWxlICgxKSB7CiNpZiAwCgkvKiBUaGlzIGlzIHRoZSBvbGQgcGVyLXByb2Nlc3Mg YnVmZmVyIGNhc2UgKi8KCS8qIENvbWJpbmVkRGVtb2dyYXBoaWNzID0gKCBBZERlbW9ncmFw aGljcyAmIFVzZXJEZW1vZ3JhcGhpY3MgKSAqLwoJY29tYmluZWRkZW1vZ3JhcGhpY3MgPSAo X215LT5jYWRbYWRpbmRleF0uYWRkZW1vZ3JhcGhpY3MpICYgdXNlcmRlbW9ncmFwaGljczsK CS8qIEFkX3dlaWdodCA9IDAgKi8KCWFkX3dlaWdodCA9IDA7CglpZiAoY29tYmluZWRkZW1v Z3JhcGhpY3MgJiBHRU5ERVJfTUFTSykgewoJICAgIGFkX3dlaWdodCArPSBfbXktPmNhZFth ZGluZGV4XS5nZW5fd2VpZ2h0aW5nczsKCX0KCWlmIChjb21iaW5lZGRlbW9ncmFwaGljcyAm IEFHRV9HUk9VUF9NQVNLKSB7CgkgICAgYWRfd2VpZ2h0ICs9IF9teS0+Y2FkW2FkaW5kZXhd LmFnZV93ZWlnaHRpbmdzOwoJfQoJaWYgKGNvbWJpbmVkZGVtb2dyYXBoaWNzICYgUkVHSU9O X01BU0spIHsKCSAgICBhZF93ZWlnaHQgKz0gX215LT5jYWRbYWRpbmRleF0ucmVnX3dlaWdo dGluZ3M7Cgl9CglpZiAoY29tYmluZWRkZW1vZ3JhcGhpY3MgJiBJTlRFUkVTVDFfTUFTSykg ewoJICAgIGFkX3dlaWdodCArPSBfbXktPmNhZFthZGluZGV4XS5pbnQxX3dlaWdodGluZ3M7 Cgl9CglpZiAoY29tYmluZWRkZW1vZ3JhcGhpY3MgJiBJTlRFUkVTVDJfTUFTSykgewoJICAg IGFkX3dlaWdodCArPSBfbXktPmNhZFthZGluZGV4XS5pbnQyX3dlaWdodGluZ3M7Cgl9Cglp ZiAoYWRfd2VpZ2h0ID49IF9teS0+Y2FkW2FkaW5kZXhdLm1pbmltdW1fbWF0Y2hfdmFsdWUp IHsKCSAgICBicmVhazsKCX0KCWFkaW5kZXggPSAoYWRpbmRleCArIDEpICUgMzYwOwoJaWYg KGFkaW5kZXggPT0gbGFzdF9hZCkgewoJICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBB UExPR19FUlIgfCBBUExPR19OT0VSUk5PLCByLT5zZXJ2ZXIsICJBZCB0byBleHBpcmUgbm90 IGZvdW5kIik7CgkgICAgYnJlYWs7Cgl9CiAgICB9CiAgICBleHBpcmVkID0gKCh0aW1lKCh0 aW1lX3QgKikgTlVMTCkgPiBfbXktPmNhZFthZGluZGV4XS5leHBpcmF0aW9uX3RpbWUpKSA/ IDEgOiAwOwoKI2lmIERFQlVHCiAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0df SU5GTyB8IEFQTE9HX05PRVJSTk8sIHItPnNlcnZlciwKCQkgIkZvdW5kIGFkICVkIDogZXhw aXJlICVzICglZCA+ICVkKSIsCgkJIGFkaW5kZXgsIGV4cGlyZWQgPyAieWVzIiA6ICJubyIs CgkgICAgKGludCkgdGltZSgodGltZV90ICopIE5VTEwpLCBfbXktPmNhZFthZGluZGV4XS5l eHBpcmF0aW9uX3RpbWUpOwojZW5kaWYKCiNlbHNlCgkvKiBUaGlzIGlzIHRoZSBzaGFyZWQg bWVtb3J5IGNhc2UgKi8KLyogICAgICAgIENvbWJpbmVkRGVtb2dyYXBoaWNzID0gKCBBZERl bW9ncmFwaGljcyAmIFVzZXJEZW1vZ3JhcGhpY3MgKSAqLwoJY29tYmluZWRkZW1vZ3JhcGhp Y3MgPSAocmVjX2J1ZmZlci0+Y2FkX2J1ZmZlclthZGluZGV4XS5hZGRlbW9ncmFwaGljcykg JiB1c2VyZGVtb2dyYXBoaWNzOwovKiAgICAgICAgQWRfd2VpZ2h0ID0gMCAqLwoJYWRfd2Vp Z2h0ID0gMDsKCWlmIChjb21iaW5lZGRlbW9ncmFwaGljcyAmIEdFTkRFUl9NQVNLKSB7Cgkg ICAgYWRfd2VpZ2h0ICs9IHJlY19idWZmZXItPmNhZF9idWZmZXJbYWRpbmRleF0uZ2VuX3dl aWdodGluZ3M7Cgl9CglpZiAoY29tYmluZWRkZW1vZ3JhcGhpY3MgJiBBR0VfR1JPVVBfTUFT SykgewoJICAgIGFkX3dlaWdodCArPSByZWNfYnVmZmVyLT5jYWRfYnVmZmVyW2FkaW5kZXhd LmFnZV93ZWlnaHRpbmdzOwoJfQoJaWYgKGNvbWJpbmVkZGVtb2dyYXBoaWNzICYgUkVHSU9O X01BU0spIHsKCSAgICBhZF93ZWlnaHQgKz0gcmVjX2J1ZmZlci0+Y2FkX2J1ZmZlclthZGlu ZGV4XS5yZWdfd2VpZ2h0aW5nczsKCX0KCWlmIChjb21iaW5lZGRlbW9ncmFwaGljcyAmIElO VEVSRVNUMV9NQVNLKSB7CgkgICAgYWRfd2VpZ2h0ICs9IHJlY19idWZmZXItPmNhZF9idWZm ZXJbYWRpbmRleF0uaW50MV93ZWlnaHRpbmdzOwoJfQoJaWYgKGNvbWJpbmVkZGVtb2dyYXBo aWNzICYgSU5URVJFU1QyX01BU0spIHsKCSAgICBhZF93ZWlnaHQgKz0gcmVjX2J1ZmZlci0+ Y2FkX2J1ZmZlclthZGluZGV4XS5pbnQyX3dlaWdodGluZ3M7Cgl9CglpZiAoYWRfd2VpZ2h0 ID49IHJlY19idWZmZXItPmNhZF9idWZmZXJbYWRpbmRleF0ubWluaW11bV9tYXRjaF92YWx1 ZSkgewoJICAgIGJyZWFrOwoJfQoJYWRpbmRleCA9IChhZGluZGV4ICsgMSkgJSAzNjA7Cglp ZiAoYWRpbmRleCA9PSBsYXN0X2FkKSB7CgkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkss IEFQTE9HX0VSUiB8IEFQTE9HX05PRVJSTk8sIHItPnNlcnZlciwgIkFkIHRvIGV4cGlyZSBu b3QgZm91bmQiKTsKCSAgICBicmVhazsKCX0KICAgIH0KICAgIGV4cGlyZWQgPSAoKHRpbWUo KHRpbWVfdCAqKSBOVUxMKSA+IHJlY19idWZmZXItPmNhZF9idWZmZXJbYWRpbmRleF0uZXhw aXJhdGlvbl90aW1lKSkgPyAxIDogMDsKCiNpZiBERUJVRwogICAgYXBfbG9nX2Vycm9yKEFQ TE9HX01BUkssIEFQTE9HX0lORk8gfCBBUExPR19OT0VSUk5PLCByLT5zZXJ2ZXIsCgkJICJG b3VuZCBhZCAlZCA6IGV4cGlyZSAlcyAoJWQgPiAlZCkiLAoJCSBhZGluZGV4LCBleHBpcmVk ID8gInllcyIgOiAibm8iLAoJCSAoaW50KSB0aW1lKCh0aW1lX3QgKikgTlVMTCksCgkJIHJl Y19idWZmZXItPmNhZF9idWZmZXJbYWRpbmRleF0uZXhwaXJhdGlvbl90aW1lKTsKI2VuZGlm CgojZW5kaWYKCiAgICBjb29raWVfb3V0ID0gYXBfcHNwcmludGYoci0+cG9vbCwKCQkJICAg ICAiZm91bmRfY29va2llPUFkX2lkPSVkJkFkX3dlaWdodD0lZCZFeHBpcmVkPSVkIiwKCQkJ ICAgICBhZGluZGV4LAoJCQkgICAgIGFkX3dlaWdodCwKCQkJICAgICBleHBpcmVkKTsKICAg IGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJTZXQtQ29va2llIiwgY29va2llX291 dCk7CgogICAgaWYgKChzdHJzdHIoZmlsZW5hbWUsICJjbGFzczEiKSAhPSBOVUxMKSB8fAoJ KHN0cnN0cihmaWxlbmFtZSwgImNsYXNzMiIpICE9IE5VTEwpKSB7CgljYWRkcl90IGJ1ZiA9 IGN1c3RvbWFkc2NhbihyLCBwYWdlLCBhZGluZGV4KTsKCXJldHVybkhUTUxQYWdlV2l0aEJ1 ZmZlcihyLCAoY2hhciAqKSBidWYpOwogICAgfQogICAgZWxzZSB7CglyZXR1cm5IVE1MUGFn ZVdpdGhGaWxlKHIsIHBhZ2UpOwogICAgfQogICAgYXBfcGZjbG9zZShyLT5wb29sLCBwYWdl KTsKICAgIHJldHVybiBPSzsKfQkJCQkvKiBzcGVjd2ViOTlfY2FkZ2V0X2hhbmRsZXIgKi8K CgojaWYgMAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioKICogdXRpbF9wYXJzZV9jb29raWUgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKi8KCnRhYmxlICp1dGlsX3BhcnNlX2Nvb2tpZShyZXF1ZXN0X3JlYyAqcikK ewogICAgY29uc3QgY2hhciAqZGF0YSA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAi Q29va2llIik7CiAgICB0YWJsZSAqY29va2llczsKICAgIGNvbnN0IGNoYXIgKnBhaXI7CiAg ICBpZiAoIWRhdGEpCglyZXR1cm4gTlVMTDsKCiAgICBjb29raWVzID0gYXBfbWFrZV90YWJs ZShyLT5wb29sLCAyKTsKICAgIHdoaWxlICgqZGF0YSAmJiAocGFpciA9IGFwX2dldHdvcmQo ci0+cG9vbCwgJmRhdGEsICc7JykpKSB7Cgljb25zdCBjaGFyICpuYW1lLCAqdmFsdWU7Cgl3 aGlsZSAoKmRhdGEgPT0gJyAnKQoJICAgICsrZGF0YTsKCW5hbWUgPSBhcF9nZXR3b3JkKHIt PnBvb2wsICZwYWlyLCAnPScpOwoJd2hpbGUgKCpwYWlyICYmICh2YWx1ZSA9IGFwX2dldHdv cmQoci0+cG9vbCwgJnBhaXIsICcmJykpKSB7CgkgICAgYXBfdW5lc2NhcGVfdXJsKChjaGFy ICopIHZhbHVlKTsKCSAgICBhcF90YWJsZV9hZGQoY29va2llcywgbmFtZSwgdmFsdWUpOwoJ fQogICAgfQoKICAgIHJldHVybiBjb29raWVzOwp9CQkJCS8qIHV0aWxfcGFyc2VfY29va2ll cyAqLwojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBzcGVjd2ViOTlfcG9zdF9oYW5k bGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqLwpzdGF0aWMgaW50IF9sb2dfYW5kX3dyaXRlKAoJCQkgICAgICBz dHJ1Y3QgcmVxdWVzdF9yZWMgKnIsCgkJCSAgICAgIEZJTEUgKmYsIGNoYXIgKmZpbGVuYW1l LAoJCQkgICAgICBjb25zdCBjaGFyICp1cmxyb290LCBpbnQgZGlybnVtLCBpbnQgY2xhc3Nu dW0sIGludCBmaWxlbnVtLCBpbnQgY2xpZW50bnVtLCBpbnQgdWlkCikKewogICAgcGlkX3Qg cGlkOwogICAgdGltZV90IHN0YW1wOwogICAgaW50IGU7CiAgICB1X2ludDMyX3QgcmVjbnVt OwogICAgY2hhciByZWNudW1zdHJbMTJdOwkJLyogdGVuIHdpZGUgcGx1cyByZXR1cm4gcGx1 cyBcMCAqLwoKICAgIHN0YW1wID0gdGltZShOVUxMKTsKICAgIHBpZCA9IGdldHBpZCgpOwoK LyogICIlMTBkICUxMGQgJTEwZCAlNWQgJTJkICUyZCAlMTBkICUtNjAuNjBzICUxMGQgJTEw ZFxuIiwKICogICAgICBSZWNvcmROdW0sIFRpbWVTdGFtcCwgUGlkLCBEaXIjLCBDbGFzcyMs IEZpbGUjLCBDbGllbnQjLAogKiAgICAgIEZpbGVOYW1lLCBQaWQsIE15Q29va2llCiAqLwoK Ci8qICBJbmNyZW1lbnQgUG9zdExvZyBSZWNvcmRDb3VudCByZWNvcmQgYW5kIHJld3JpdGUg UG9zdExvZyovCiAgICBfV0lOVFIoZSA9IGZyZWFkKHJlY251bXN0ciwgKHNpemVfdCkgMSwg KHNpemVfdCkgMTEsIGYpKTsKICAgIGlmIChlICE9IDExKSB7CgkvKiBTY3JlYW0gYW5kIHNo b3V0ICovCglzcGVjd2ViOTlfZXJyb3Ioci0+c2VydmVyLCAiRmFpbGVkIHRvIHJlYWQgcmVj b3JkY291bnQgZnJvbSBwb3N0LmxvZyIpOwoJcmV0dXJuSFRNTFBhZ2VXaXRoTWVzc2FnZShy LCAiRmFpbGVkIHRvIHJlYWQgcmVjb3JkY291bnQgZnJvbSBwb3N0LmxvZyIpOwoJcmV0dXJu IEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgfQoKICAgIHJlY251bSA9IGF0b2wo cmVjbnVtc3RyKSArIDE7CS8qIHByb3RlY3RlZCBieSB0cmFpbGluZyByZXR1cm4gKi8KICAg IGZzZWVrKGYsIDAsIFNFRUtfU0VUKTsKICAgIGlmIChmcHJpbnRmKGYsICIlMTBkXG4iLCBy ZWNudW0pICE9IDExKSB7CglzcGVjd2ViOTlfZXJyb3Ioci0+c2VydmVyLCAiRmFpbGVkIHRv IHdyaXRlIG5ldyByZWNvcmRjb3VudCAgdG8gcG9zdC5sb2ciKTsKCXJldHVybkhUTUxQYWdl V2l0aE1lc3NhZ2UociwgIkZhaWxlZCB3cml0ZSBuZXcgcmVjb3JkY291bnQgdG8gcG9zdC5s b2ciKTsKCXJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKICAgIH0KICAgIGZm bHVzaChmKTsKCi8qICBBcHBlbmQgbmV3IFBvc3RMb2cgUmVjb3JkIHRvIGVuZCBvZiBQb3N0 TG9nKi8KICAgIGZzZWVrKGYsIDAsIFNFRUtfRU5EKTsKICAgIC8qIHdyaXRlIDEzOSBieXRl cyAqLwogICAgaWYgKGZwcmludGYoZiwgIiUxMGQgJTEwZCAlMTBkICU1ZCAlMmQgJTJkICUx MGQgJS02MC42MHMgJTEwZCAlMTBkXG4iLAoJCXJlY251bSwgKGludCkgc3RhbXAsIChpbnQp IHBpZCwgZGlybnVtLCBjbGFzc251bSwgZmlsZW51bSwKCQljbGllbnRudW0sIGZpbGVuYW1l LCAoaW50KSBwaWQsIHVpZCkgIT0gMTM5KSB7CglzcGVjd2ViOTlfZXJyb3Ioci0+c2VydmVy LCAiRmFpbGVkIHRvIHdyaXRlIHJlY29yZCB0byBwb3N0LmxvZyIpOwoJcmV0dXJuSFRNTFBh Z2VXaXRoTWVzc2FnZShyLCAiRmFpbGVkIHdyaXRlIHJlY29yZCB0byBwb3N0LmxvZyIpOwoJ cmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgfQovKiAgICBJZiB3cml0 aW5nIFBvc3RMb2cgZ2V0cyBlcnJvcnMqLwovKiAgICAgICAgUmV0dXJuIEhUTUwgUGFnZSB3 aXRoIE1lc3NhZ2UgPSBlcnJvcl9tZXNzYWdlKi8KLyogICAgRW5kaWYqLwovKiAgICAgICAg KHJlZmVyIHRvIFBvc3QgTG9nIEZvcm1hdCBzZWN0aW9uIHRvIHNlZSByZXF1aXJlZCBmb3Jt YXQpKi8KCiAgICBmZmx1c2goZik7CgogICAgcmV0dXJuIE9LOwp9CgpzdGF0aWMgaW50IHNw ZWN3ZWI5OV9wb3N0X2hhbmRsZXIocmVxdWVzdF9yZWMgKnIpCnsKICAgIHN0cnVjdCBzcGVj d2ViOTlfbW9kdWxlX2RhdGEgKl9teSA9CiAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5z ZXJ2ZXItPm1vZHVsZV9jb25maWcsICZzcGVjd2ViOTlfbW9kdWxlKTsKICAgIGludCBwb3N0 ZXJyLCBlLCBlMjsKICAgIGNvbnN0IGNoYXIgKnVybHJvb3QgPSAiPG5vbmU+IjsKICAgIGlu dCBkaXJudW0gPSAwLCBjbGFzc251bSA9IDAsIGZpbGVudW0gPSAwLCBjbGllbnRudW0gPSAw LCB1aWQgPSAwOwogICAgY2hhciAqZmlsZW5hbWU7CiAgICBjb25zdCBjaGFyICpjb29raWVf aW47CiAgICBGSUxFICpmOwogICAgY2hhciAqZGF0YSA9ICI8bm9uZT4iOwogICAgY29uc3Qg Y2hhciAqdHlwZSwgKmRvY3Jvb3Q7CiAgICBjaGFyIGFyZ3NidWZmZXJbSFVHRV9TVFJJTkdf TEVOXTsKICAgIGludCByc2l6ZSwgbGVuX3JlYWQsIHJwb3MgPSAwOwogICAgbG9uZyBsZW5n dGggPSAwOwoKICAgIGRvY3Jvb3QgPSBhcF9kb2N1bWVudF9yb290KHIpOwoKLypCZWdpbjoq LwovKiAgICBNYWtlIHN1YnN0aXR1dGlvbnMgaW4gSFRNTCByZXR1cm4gcGFnZSBmb3IgdGhl IGZvbGxvd2luZzoqLwovKiAgICAgICAgU2VydmVyX1NvZnR3YXJlKi8KLyogICAgICAgIFJl bW90ZV9BZGRyKi8KLyogICAgICAgIFNjcmlwdF9OYW1lKi8KLyogICAgICAgIFF1ZXJ5U3Ry aW5nKi8KLyogVGhlIGFib3ZlIGlzIGRvbmUgaW4gdGhlIHJldHVybkhUTUxQYWdlV2l0aC4u LiBmdW5jdGlvbnMgKi8KCi8qICAgIFBhcnNlIFBvc3RJbnB1dCAtIGEgc2FtcGxlIGZvcm1h dCBpcyBhcyBmb2xsb3dzICovCi8qICAgIChrZXlzIG1heSBiZSByZWNlaXZlZCBpbiBhbnkg b3JkZXIpOiovCi8qICAgICAgICB1cmxyb290PVt1cmxyb290XSZkaXI9W0RpciNdJmNsYXNz PVtDbGFzcyNdJm51bT1bRmlsZSNdJmNsaWVudD1bQ2xpZW50I10qLwoKICAgIHR5cGUgPSBh cF90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIkNvbnRlbnQtVHlwZSIpOwogICAgLyoKICAg ICAqIFNjcmVhbSBpbiBwcm90ZXN0IGlmIHRoZSB1c2VyIHVzZXMgdGhlIGJyb2tlbiB2ZXJz aW9uIG9mIFNQRUNXZWI5OQogICAgICogbWFuYWdlciB0aGF0IGRvZXNuJ3Qgc2VuZCB0aGUg Q29udGVudC1UeXBlIGhlYWRlci4gTm90ZSB0aGF0IHRoaXMgb25seQogICAgICogYWZmZWN0 cyB0aGUgcHJlLXJ1biB0ZXN0czogdGhlIHJlZ3VsYXIgY2xpZW50IGRvZXMgc2VuZCB0aGUg aGVhZGVyLgogICAgICovCiAgICBpZiAoKHR5cGUgPT0gTlVMTCkgfHwgKHN0cmNhc2VjbXAo dHlwZSwgREVGQVVMVF9FTkNUWVBFKSAhPSAwKSkgewoJYXBfbG9nX2Vycm9yKEFQTE9HX01B UkssCgkJICAgICBBUExPR19XQVJOSU5HIHwgQVBMT0dfTk9FUlJOTywKCQkgICAgIHItPnNl cnZlciwKCQkgICAgICJUaGUgY2xpZW50IGRpZG4ndCBzZW5kICVzIGFzIENvbnRlbnQtVHlw ZS4gVmVyc2lvbiAiCgkJICAgIjEuMDIgb2YgdGhlIFNQRUNXZWIgZG9lcyBub3QgZG8gdGhp cyBhbmQgdGh1cyB2aW9sYXRlcyAiCgkJICAgICAidGhlIEhUVFAgc3BlY2lmaWNhdGlvbi4g UGxlYXNlIGFwcGx5IHRoZSBmb2xsb3dpbmcgIgoJCSAgICAgInBhdGNoIHRvIHlvdXIgbWFu YWdlciBzY3JpcHQgYW5kIGJpdGNoIHRvIFNQRUMgdGhhdCAiCgkJICJ0aGV5IGZpeCB0aGlz OlxuJXMiLCBERUZBVUxUX0VOQ1RZUEUsIFNQRUNfTUFOQUdFUl9QQVRDSCk7CglyZXR1cm4g SFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CiAgICB9CgogICAgaWYgKGFwX3NldHVwX2Ns aWVudF9ibG9jayhyLCBSRVFVRVNUX0NIVU5LRURfRVJST1IpICE9IE9LKSB7CglhcF9sb2df ZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0VSUiwgci0+c2VydmVy LCAiQ291bGQgbm90IHNldHVwIGNsaWVudCBibG9jayIpOwoJcmV0dXJuSFRNTFBhZ2VXaXRo TWVzc2FnZShyLCAiQ291bGRuJ3Qgc2V0IHVwIGNsaWVudCBibG9jayIpOwoJcmV0dXJuIEhU VFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgfQoKICAgIGlmICghYXBfc2hvdWxkX2Ns aWVudF9ibG9jayhyKSkgewoJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJS Tk8gfCBBUExPR19FUlIsIHItPnNlcnZlciwgIk5vIFBPU1QgZGF0YSIpOwoJcmV0dXJuSFRN TFBhZ2VXaXRoTWVzc2FnZShyLCAiTm8gUE9TVCBkYXRhIik7CglyZXR1cm4gSFRUUF9JTlRF Uk5BTF9TRVJWRVJfRVJST1I7CiAgICB9CgogICAgbGVuZ3RoID0gci0+cmVtYWluaW5nOwoK ICAgIGRhdGEgPSBhcF9wY2FsbG9jKHItPnBvb2wsIGxlbmd0aCArIDEpOwoKICAgIGFwX2hh cmRfdGltZW91dCgic3BlY3dlYjk5X3Bvc3RfaGFuZGxlciByZWFkIiwgcik7CgogICAgd2hp bGUgKChsZW5fcmVhZCA9CgkgICAgYXBfZ2V0X2NsaWVudF9ibG9jayhyLCBhcmdzYnVmZmVy LCBzaXplb2YoYXJnc2J1ZmZlcikpKSA+IDApIHsKCWFwX3Jlc2V0X3RpbWVvdXQocik7Cglp ZiAoKHJwb3MgKyBsZW5fcmVhZCkgPiBsZW5ndGgpIHsKCSAgICByc2l6ZSA9IGxlbmd0aCAt IHJwb3M7Cgl9CgllbHNlIHsKCSAgICByc2l6ZSA9IGxlbl9yZWFkOwoJfQoJbWVtY3B5KChj aGFyICopIGRhdGEgKyBycG9zLCBhcmdzYnVmZmVyLCByc2l6ZSk7CglycG9zICs9IHJzaXpl OwogICAgfQogICAgYXBfa2lsbF90aW1lb3V0KHIpOwoKICAgIGRhdGFbbGVuZ3RoXSA9ICdc MCc7CgogICAgcG9zdGVyciA9IDU7CQkvKiBDb3VudGVyIHRvIG1ha2Ugc3VyZSB3ZSBnZXQg YWxsIFZBUmlhYmxlcwoJCQkJICogZnJvbSB0aGUgQ0dJIHBvc3QgKi8KICAgIHdoaWxlIChk YXRhKSB7Cgljb25zdCBjaGFyICpwID0gZGF0YTsKCglkYXRhID0gaW5kZXgocCwgJyYnIC8q IDB4MjYgKi8gKTsKCWlmIChkYXRhICE9IE5VTEwpCgkgICAgKmRhdGErKyA9ICdcMCc7CgoJ aWYgKHN0cm5jbXAocCwgInVybHJvb3Q9IiwgOCkgPT0gMCkgewoJICAgIHVybHJvb3QgPSBh cF9wc3RyZHVwKHItPnBvb2wsIHAgKyA4KTsKCSAgICBwb3N0ZXJyLS07Cgl9CgllbHNlIGlm IChzdHJuY21wKHAsICJkaXI9IiwgNCkgPT0gMCkgewoJICAgIGRpcm51bSA9IGF0b2kocCAr IDQpOwoJICAgIHBvc3RlcnItLTsKCX0KCWVsc2UgaWYgKHN0cm5jbXAocCwgImNsYXNzPSIs IDYpID09IDApIHsKCSAgICBjbGFzc251bSA9IGF0b2kocCArIDYpOwoJICAgIHBvc3RlcnIt LTsKCX0KCWVsc2UgaWYgKHN0cm5jbXAocCwgIm51bT0iLCA0KSA9PSAwKSB7CgkgICAgZmls ZW51bSA9IGF0b2kocCArIDQpOwoJICAgIHBvc3RlcnItLTsKCX0KCWVsc2UgaWYgKHN0cm5j bXAocCwgImNsaWVudD0iLCA3KSA9PSAwKSB7CgkgICAgY2xpZW50bnVtID0gYXRvaShwICsg Nyk7CgkgICAgcG9zdGVyci0tOwoJfQogICAgfQogICAgaWYgKHBvc3RlcnIgIT0gMCkgewoJ YXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19FUlIsCgkJ ICAgICByLT5zZXJ2ZXIsICJEaWQgbm90IGdldCBhbGwgUE9TVCBhcmd1bWVudHMiKTsKCXJl dHVybkhUTUxQYWdlV2l0aE1lc3NhZ2UociwgIkRpZCBub3QgZ2V0IGFsbCBQT1NUIGFyZ3Vt ZW50cyIpOwoJcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgfQoKLyog ICAgUGFyc2UgQ29va2llIHN0cmluZyB0byBnZXQgTXlDb29raWUuIFRoZSBmb3JtYXQgaXMg YXMgKi8KLyogICAgZm9sbG93cyAodGhlIG9yZGVyIG9mIHRoZSBrZXlzIGFuZCB2YWx1ZXMg aXMgZml4ZWQpOiovCiAgICAvKgogICAgICogMSAgICAgICAgIDIgICAgICAgMDEyMzQ1Njc4 OTAxMjM0NTY3ODkwMTIzCiAgICAgKiBteV9jb29raWU9dXNlcl9pZD1bTXlDb29raWVdJmxh c3RfYWQ9W0lnbm9yZWRGaWVsZF0KICAgICAqLwoKICAgIGNvb2tpZV9pbiA9IGFwX3RhYmxl X2dldChyLT5oZWFkZXJzX2luLCAiQ29va2llIik7CiAgICBpZiAoY29va2llX2luID09IE5V TEwpIHsKCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0df RVJSLCByLT5zZXJ2ZXIsICJObyBjb29raWUiKTsKCXJldHVybkhUTUxQYWdlV2l0aE1lc3Nh Z2UociwgIkludmFsaWQgQ29va2llIik7CglyZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJf RVJST1I7CiAgICB9CiAgICB1aWQgPSBhdG9pKGNvb2tpZV9pbiArIDE4KTsKCi8qICBGaWxl bmFtZSA9IFt1cmxyb290XS9kaXJbNS1kaWdpdCBEaXIjXS9jbGFzc1tDbGFzcyNdX1tGaWxl I10qLwovKiAgICAgICAgKGZvciBleGFtcGxlLCB0aGUgUE9TVCBpbnB1dCBvZiAqLwovKiAg ICAgICAgdXJscm9vdD0vc3BlY3dlYjk5L2ZpbGVfc2V0JmRpcj0wMDEyMyZjbGFzcz0xJm51 bT0xJmNsaWVudD0xMDAwMyAqLwovKiAgICAgICAgd291bGQgbWFrZSBGaWxlbmFtZSA9IC9z cGVjd2ViOTkvZmlsZV9zZXQvZGlyMDAxMjMvY2xhc3MxXzEpKi8KCiAgICBmaWxlbmFtZSA9 IGFwX21ha2VfZnVsbF9wYXRoKHItPnBvb2wsCgkJICAgIGRvY3Jvb3QsIGFwX3BzcHJpbnRm KHItPnBvb2wsICIlcy9kaXIlMDVkL2NsYXNzJTFkXyUxZCIsCgkJCQkgICAgICAgdXJscm9v dCwgZGlybnVtLCBjbGFzc251bSwgZmlsZW51bSkpOwoKICAgIC8qIERvX2F0b21pY2FsbHkg KGZvciBleGFtcGxlLCB1c2luZyBhIGZpbGUgbG9jayBvciBvdGhlciBtdXRleCk6ICovCgog ICAgZiA9IGFwX3Bmb3BlbihyLT5wb29sLCBfbXktPmxvZ19wYXRoLCAicisiKTsKICAgIGlm IChmID09IE5VTEwpIHsKCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIt PnNlcnZlciwKCQkiRmFpbGVkIHRvIG9wZW4gcG9zdC5sb2cgJyVzJyBmb3IgdXBkYXRpbmci LCBfbXktPmxvZ19wYXRoKTsKCXJldHVybkhUTUxQYWdlV2l0aE1lc3NhZ2UociwgIkZhaWxl ZCB0byBvcGVuIHBvc3QubG9nIGZpbGUgZm9yIHVwZGF0aW5nIik7CglyZXR1cm4gSFRUUF9J TlRFUk5BTF9TRVJWRVJfRVJST1I7CiAgICB9CgogICAgaWYgKChlID0gX3dsb2NrKHItPnNl cnZlciwgciwgZiwgX215LT5sb2dfcGF0aCkpICE9IDApCglyZXR1cm5IVE1MUGFnZVdpdGhN ZXNzYWdlKHIsICJGYWlsZWQgdG8gbG9jayBwb3N0LmxvZyBmaWxlIik7CgogICAgaWYgKGUg PT0gMCkKCWUgPSBfbG9nX2FuZF93cml0ZShyLCBmLCBmaWxlbmFtZSwgdXJscm9vdCwgZGly bnVtLCBjbGFzc251bSwgZmlsZW51bSwgY2xpZW50bnVtLCB1aWQpOwoKICAgIGlmICgoZTIg PSBfdW5sb2NrKHItPnNlcnZlciwgciwgZiwgX215LT5sb2dfcGF0aCkpICE9IE9LKSB7Cglp ZiAoZSA9PSAwKSB7CgkgICAgZSA9IGUyOwoJICAgIHJldHVybkhUTUxQYWdlV2l0aE1lc3Nh Z2UociwgIkZhaWxlZCB0byBsb2NrIHBvc3QubG9nIGZpbGUiKTsKCX0KICAgIH0KLyogICAg RW5kIERvX2F0b21pY2FsbHkqLwogICAgYXBfcGZjbG9zZShyLT5wb29sLCBmKTsKCiAgICBp ZiAoZSAhPSAwKQoJcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwkvKiBfbG9n X2FuZF93cml0ZSgpIHdpbGwgaGF2ZQoJCQkJCQkgKiBkaXNwbGF5ZWQgYSBwYWdlIGFscmVh ZHkgKi8KCiAgICAvKgogICAgICogZ2V0dGltZW9mZGF5KCZhZnRlcmxvY2ssIE5VTEwpOyBs b2Nrc3RyID0gYXBfcHNwcmludGYoci0+cG9vbCwgIkVudGlyZQogICAgICogbG9nZmlsZSBv cCB0b29rOiAlbGQgbWljcm9zZWNvbmRzIiwgKGFmdGVybG9jay50dl9zZWMgLQogICAgICog YmVmb3JlbG9jay50dl9zZWMpICogMTAwMDAwMCArIGFmdGVybG9jay50dl91c2VjIC0KICAg ICAqIGJlZm9yZWxvY2sudHZfdXNlYyk7IHNwZWN3ZWI5OV9pbmZvKGxvY2tzdHIpOwogICAg ICovCi8qICAgIEFjY2VzcyBmaWxlICdSb290RGlyL0ZpbGVuYW1lJyovCiAgICBmID0gYXBf cGZvcGVuKHItPnBvb2wsIGZpbGVuYW1lLCAiciIpOwovKiAgICBJZiBlcnJvciBmb3VuZCB3 aGlsZSBhY2Nlc3NpbmcgZmlsZSB0aGVuKi8KICAgIGlmIChmID09IE5VTEwpIHsKLyogICAg ICAgIFJldHVybiBIVE1MIFBhZ2Ugd2l0aCBNZXNzYWdlID0gZXJyb3JfbWVzc2FnZSovCglh cF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLT5zZXJ2ZXIsICJDb3VsZCBu b3Qgb3BlbiBGaWxlICclcycgKHBvc3QgaGFuZGxlcikiLCBmaWxlbmFtZSk7CglyZXR1cm5I VE1MUGFnZVdpdGhNZXNzYWdlKHIsICJDb3VsZCBub3Qgb3BlbiBmaWxlIik7CglyZXR1cm4g SFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CiAgICB9CgovKiAgICAgICAgQ29va2llU3Ry aW5nID0gIm15X2Nvb2tpZT08bXlDb29raWU+IgogKgogKiBYWFggICAgc2VlbXMgZnJvbSBj b2RlIGluc3BlY3Rpb24gdGhhdCB0aGlzIHJlYWxseQogKiAgICAgICAgaXMgbm90IHNldHRp bmcgYWdhaW4gdGhlIGNvb2tpZSAtIGJ1dCBhIGNoYW5nZQogKiAgICAgICAgdGhlIGNvb2tp ZSBpcyB0byBiZSBzZXQgdG8gJWQgb2YgdGhlIHVzZXIgbnVtYmVyLgogKi8KICAgIGFwX3Rh YmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJTZXQtQ29va2llIiwgYXBfcHNwcmludGYoci0+ cG9vbCwgIm15X2Nvb2tpZT0lZCIsIHVpZCkpOwoKLyogICAgICAgIFJldHVybiBIVE1MIFBh Z2Ugd2l0aCBGaWxlPSdSb290RGlyL0ZpbGVOYW1lJyBhbmQgQ29va2llPUNvb2tpZVN0cmlu ZyAqLwogICAgcmV0dXJuSFRNTFBhZ2VXaXRoRmlsZShyLCBmKTsKICAgIGFwX3BmY2xvc2Uo ci0+cG9vbCwgZik7CgogICAgcmV0dXJuIE9LOwp9CQkJCS8qIHNwZWN3ZWI5OV9wb3N0X2hh bmRsZXIgKi8KCi8qIQogIEBjb25zdCBzcGVjd2ViOTlfaGFuZGxlcnMKICBAZGlzY3Vzc2lv biBEaXNwYXRjaCBsaXN0IG9mIGhhbmRsZXIgZnVuY3Rpb24gcG9pbnRlcnMgdG8gbGV0IHRo ZSBBcGFjaGUKICBjb3JlIGtub3cgd2hpY2ggaW5jYW50YXRpb24gaXMgaGFuZGxlZCBieSB3 aGF0IGZ1bmN0aW9uCiAqLwoKc3RhdGljIGNvbnN0IGhhbmRsZXJfcmVjIHNwZWN3ZWI5OV9o YW5kbGVyc1tdID0gewogICAgeyJzcGVjd2ViOTloayIsIHNwZWN3ZWI5OV9oa19oYW5kbGVy fSwKICAgIHsic3BlY3dlYjk5Z2V0Iiwgc3BlY3dlYjk5X2dldF9oYW5kbGVyfSwKICAgIHsi c3BlY3dlYjk5Y2FkZ2V0Iiwgc3BlY3dlYjk5X2NhZGdldF9oYW5kbGVyfSwKICAgIHsic3Bl Y3dlYjk5cG9zdCIsIHNwZWN3ZWI5OV9wb3N0X2hhbmRsZXJ9LAogICAge05VTEwsIE5VTEx9 Cn07CgovKiEKICBAY29uc3Qgc3BlY3dlYjk5X21vZHVsZQogIEBkaXNjdXNzaW9uIERpc3Bh dGNoIGxpc3Qgb2YgQXBhY2hlIEFQSSBob29rIGNhbGxiYWNrcwogKi8KCm1vZHVsZSBNT0RV TEVfVkFSX0VYUE9SVCBzcGVjd2ViOTlfbW9kdWxlID0gewogICAgU1RBTkRBUkRfTU9EVUxF X1NUVUZGLAogICAgc3BlY3dlYjk5X21vZHVsZV9pbml0LAkvKiBtb2R1bGUgaW5pdGlhbGl6 ZXIgICAgICAgICAgICAgICAgICAqLwogICAgTlVMTCwJCQkvKiBjcmVhdGUgcGVyLWRpciAg ICBjb25maWcgc3RydWN0dXJlcyAqLwogICAgTlVMTCwJCQkvKiBtZXJnZSAgcGVyLWRpciAg ICBjb25maWcgc3RydWN0dXJlcyAqLwogICAgc3BlY3dlYjk5X3NlcnZlcl9jcmVhdGUsCS8q IGNyZWF0ZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmVzICovCiAgICBOVUxMLAkJCS8q IG1lcmdlICBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmVzICovCiAgICBOVUxMLAkJCS8q IHRhYmxlIG9mIGNvbmZpZyBmaWxlIGNvbW1hbmRzICAgICAgICovCiAgICBzcGVjd2ViOTlf aGFuZGxlcnMsCQkvKiBbIzhdIE1JTUUtdHlwZWQtZGlzcGF0Y2hlZCBoYW5kbGVycyAqLwog ICAgTlVMTCwJCQkvKiBbIzFdIFVSSSB0byBmaWxlbmFtZSB0cmFuc2xhdGlvbiAgICAqLwog ICAgTlVMTCwJCQkvKiBbIzRdIHZhbGlkYXRlIHVzZXIgaWQgZnJvbSByZXF1ZXN0ICAqLwog ICAgTlVMTCwJCQkvKiBbIzVdIGNoZWNrIGlmIHRoZSB1c2VyIGlzIG9rIF9oZXJlXyAqLwog ICAgTlVMTCwJCQkvKiBbIzNdIGNoZWNrIGFjY2VzcyBieSBob3N0IGFkZHJlc3MgICAqLwog ICAgTlVMTCwJCQkvKiBbIzZdIGRldGVybWluZSBNSU1FIHR5cGUgICAgICAgICAgICAqLwog ICAgTlVMTCwJCQkvKiBbIzddIHByZS1ydW4gZml4dXBzICAgICAgICAgICAgICAgICAqLwog ICAgTlVMTCwJCQkvKiBbIzldIGxvZyBhIHRyYW5zYWN0aW9uICAgICAgICAgICAgICAqLwog ICAgTlVMTCwJCQkvKiBbIzJdIGhlYWRlciBwYXJzZXIgICAgICAgICAgICAgICAgICAqLwog ICAgc3BlY3dlYjk5X2NoaWxkX2luaXQsCS8qIGNoaWxkX2luaXQgICAgICAgICAgICAgICAg ICAgICAgICAgICovCiAgICBOVUxMLAkJCS8qIGNoaWxkX2V4aXQgICAgICAgICAgICAgICAg ICAgICAgICAgICovCiAgICBOVUxMLAkJCS8qIFsjMF0gcG9zdCByZWFkLXJlcXVlc3QgICAg ICAgICAgICAgICovCiNpZmRlZiBFQVBJCiAgICBOVUxMLAkJCS8qIEVBUEk6IGFkZF9tb2R1 bGUgICAgICAgICAgICAgICAgICAgICovCiAgICBOVUxMLAkJCS8qIEVBUEk6IHJlbW92ZV9t b2R1bGUgICAgICAgICAgICAgICAgICovCiAgICBOVUxMLAkJCS8qIEVBUEk6IHJld3JpdGVf Y29tbWFuZCAgICAgICAgICAgICAgICovCiAgICBOVUxMLAkJCS8qIEVBUEk6IG5ld19jb25u ZWN0aW9uICAgICAgICAgICAgICAgICovCiNlbmRpZgp9OwoAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNw ZWN3ZWI5OS0xLjMvbW9kX3NwZWN3ZWI5OS5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNzU1ADAw MDA3NjcAMDAwMDc2NQAwMDAwMDAzMDI1MwAwNzQ2MzMzMzIyMAAwMTYyMDQAIDAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIABncmVnYW1l cwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdyZWdhbWVzAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyogPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogVGhlIEFwYWNo ZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQogKgogKiBDb3B5cmlnaHQgKGMpIDIw MDAtMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCiAq IHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBt ZXQ6CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp biB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICoKICogMi4gUmVkaXN0cmli dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln aHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv d2luZyBkaXNjbGFpbWVyIGluCiAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICogICAgZGlzdHJpYnV0aW9uLgogKgog KiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRp c3RyaWJ1dGlvbiwKICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBh Y2tub3dsZWRnbWVudDoKICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2Fy ZSBkZXZlbG9wZWQgYnkgdGhlCiAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlv biAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgogKiAgICBBbHRlcm5hdGVseSwgdGhpcyBh Y2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCiAqICAg IGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3Jt YWxseSBhcHBlYXIuCiAqCiAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBT b2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0CiAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ug b3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwogKiAgICBzb2Z0d2FyZSB3 aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KICogICAgcGVy bWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCiAqCiAqIDUuIFBy b2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJB cGFjaGUiLAogKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3 aXRob3V0IHByaW9yIHdyaXR0ZW4KICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNv ZnR3YXJlIEZvdW5kYXRpb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBB UyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKICogV0FSUkFOVElFUywgSU5D TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKICog T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T RSBBUkUKICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09G VFdBUkUgRk9VTkRBVElPTiBPUgogKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFS WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElN SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg TE9TUyBPRgogKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ VElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAogKiBPUiBUT1JUIChJ TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP VVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg VEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKiA9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQog KgogKiBUaGlzIHNvZnR3YXJlIHdhcyBjb250cmlidXRlZCBieSBDb3ZhbGVudCBUZWNobm9s b2dpZXMgSW5jLCAKICogaHR0cDovL3d3dy5jb3ZhbGVudC5uZXQgYXJvdW5kIEFwcmlsIDIw MDAyLgogKiAKICogbW9kX3NwZWN3ZWI5OS5oIC0tIEhlYWRlciBmaWxlIGZvciBBcGFjaGUg c3BlY3dlYjk5IG1vZHVsZQogKiBzY3RlbW1lIEp1bHkgMjAwMQogKi8KCiAvKgogICogISBA aGVhZGVyIG1vZF9zcGVjd2ViOTkgVGhlIG1vZF9zcGVjd2ViOTkgbW9kdWxlIGltcGxlbWVu dHMgdGhlIFNQRUNXZWI5OQogICogZHluYW1pYyBjb250ZW50IHJlcXVlc3RzLiBJdCBzaG91 bGQgd29yayB3aXRoIEFwYWNoZSAxLjMgYnkgZW5hYmxpbmcgdGhlCiAgKiByZXF1ZXN0IGhh bmRsZXJzIGluIHRoZSBBcGFjaGUgY29uZmlndXJhdGlvbiBmaWxlLiBTaW5jZSB0aGlzIG1v ZHVsZSBpcwogICogc2VsZi1jb250YWluZWQgYW5kIGNhbGxlZCBleGNsdXNpdmVseSB0aHJv dWdoIGl0cyBoYW5kbGVycywgdGhpcwogICogZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgc2Vl biBwdXJlbHkgYXMgaW50ZXJuYWwsIG5vdCB0byByZXVzZSB0aGUgc3ltYm9scwogICogaXQg ZGVzY3JpYmVzLgogICoKICAqLwoKI2lmbmRlZiBNT0RfU1BFQ1dFQjk5X0gKI2RlZmluZSBN T0RfU1BFQ1dFQjk5X0gKCiNpZmRlZiBTT0xBUklTMgojZGVmaW5lIHVfaW50MzJfdCB1aW50 MzJfdAojZGVmaW5lIHVfaW50MTZfdCB1aW50MTZfdAojZGVmaW5lIE1PRFRJTUUoYSkgKChh KS5zdF9tdGltZSkKI2RlZmluZSBFUU1PRFRJTUUoYSxiKSAgKChhKS5zdF9tdGltZSA9PSAo YikpCiNlbHNlCiNpZmRlZiBMSU5VWAojZGVmaW5lIE1PRFRJTUUoYSkgKChhKS5zdF9tdGlt ZSkKI2RlZmluZSBFUU1PRFRJTUUoYSxiKSAgKChhKS5zdF9tdGltZSA9PSAoYikpCiNlbHNl CiNkZWZpbmUgTU9EVElNRShhKSAoKGEpLnN0X210aW1lc3BlYykKI2RlZmluZSBFUU1PRFRJ TUUoYSxiKSAgKCgoYSkuc3RfbXRpbWVzcGVjLnR2X25zZWMgPT0gKGIpLnR2X25zZWMpICYm ICgoYSkuc3RfbXRpbWVzcGVjLnR2X3NlYyA9PSAoYikudHZfc2VjKSkKI2VuZGlmCQkJCS8q IExJTlVYICovCiNlbmRpZgkJCQkvKiBTT0xBUklTMiAqLwoKI2RlZmluZSBCT0lMRVJQTEFU RV9TVEFSVCBcCiI8aHRtbD5cbiJcCiI8aGVhZD48dGl0bGU+U1BFQ3dlYjk5IER5bmFtaWMg R0VUICYgUE9TVCBUZXN0PC90aXRsZT48L2hlYWQ+XG4iXAoiPGJvZHk+XG4iXAoiPHA+U0VS VkVSX1NPRlRXQVJFID0gJXNcbiJcCiI8cD5SRU1PVEVfQUREUiA9ICVzXG4iXAoiPHA+U0NS SVBUX05BTUUgPSAlc1xuIlwKIjxwPlFVRVJZX1NUUklORyA9ICVzXG4iXAoiPHByZT5cbiIK CiNkZWZpbmUgQk9JTEVSUExBVEVfRU5EICJcbjwvcHJlPlxuPC9ib2R5PjwvaHRtbD5cbiIK CiNkZWZpbmUgTUFSS0VSICI8IVdFQjk5Q0FEPjxJTUcgU1JDPVwiL2ZpbGVfc2V0L2RpciIK Ci8qIFJlY29yZCBsZW5ndGhzIGluY2x1ZGluZyBuZXdsaW5lICovCiNkZWZpbmUgVVBSTEVO R1RIICAxNQojZGVmaW5lIENBRFJMRU5HVEggMzkKCi8qIE1heGltdW0gbnVtYmVyIG9mIHVz ZXJzIHdlIG1ha2Ugc2hhcmVkIG1lbW9yeSBmb3IuICovCiNkZWZpbmUgTUFYVVNFUlMgMTUw MAovKiBOdW1iZXIgb2YgcmVjb3JkcyBpbiBDQUQgZmlsZSAqLwojZGVmaW5lIE5VTUNBRFJF Q09SRFMgMzYwCgojZGVmaW5lIEdFTkRFUl9NQVNLCSAoICAweDMgPDwgMjgpCiNkZWZpbmUg QUdFX0dST1VQX01BU0sgICAoICAweGYgPDwgMjQpCiNkZWZpbmUgUkVHSU9OX01BU0sgICAg ICAoICAweGYgPDwgMjApCiNkZWZpbmUgSU5URVJFU1QxX01BU0sgICAoMHgzZmYgPDwgMTAp CiNkZWZpbmUgSU5URVJFU1QyX01BU0sgICAoMHgzZmYgPDwgIDApCgojZGVmaW5lIEdFTkRF Ul9XVF9PRkYgICAgMTYKI2RlZmluZSBBR0VfR1JPVVBfV1RfT0ZGIDEyCiNkZWZpbmUgUkVH SU9OX1dUX09GRiAgICAgOAojZGVmaW5lIElOVEVSRVNUMV9XVF9PRkYgIDQKI2RlZmluZSBJ TlRFUkVTVDJfV1RfT0ZGICAwCgojZGVmaW5lIERFRkFVTFRfRU5DVFlQRSAiYXBwbGljYXRp b24veC13d3ctZm9ybS11cmxlbmNvZGVkIgojZGVmaW5lIFNQRUNfTUFOQUdFUl9QQVRDSCAi KioqIG1hbmFnZXIub3JpZyAgICAgICAgV2VkIEF1ZyAyMyAxNjoxOToxMiAyMDAwXG5cCi0t LSBtYW5hZ2VyICAgICBXZWQgQXVnIDIzIDE2OjIwOjE4IDIwMDBcblwKKioqKioqKioqKioq KioqXG5cCioqKiAxNjkxLDE2OTYgKioqKlxuXAotLS0gMTY5MSwxNzAwIC0tLS1cblwKICAg ICAgICAkcmVxID0gbmV3IEhUVFA6OlJlcXVlc3QgJ1BPU1QnID0+ICR1cmwgLiBcImZcIjtc blwKICAgICAgICBteSgkdXJscm9vdCkgPSAoJHVybCA9fiBtI1w/KC4qZmlsZV9zZXQvKSMp O1xuXAogICAgICAgICRyZXEtPmNvbnRlbnQoXCJjbGFzcz0xJmNsaWVudD0yJmRpcj0wMDAw NCZudW09MyZ1cmxyb290PSR1cmxyb290XCIpO1xuXAorXG5cCisgICAgICAgIyBkZGhpbGwg YWRkZWQgXG5cCisgICAgICAgJHJlcS0+aGVhZGVyKCdDb250ZW50LXR5cGUnID0+ICdhcHBs aWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcblwKKyAgICAgICAjIGVuZCBkZGhp bGwgYWRkZWRcblwKICAgICAgfVxuXAogICAgICBlbHNlIHtcblwKICAgICAgICAkcmVxID0g bmV3IEhUVFA6OlJlcXVlc3QgJ0dFVCcgPT4gJHVybDtcbiIKCgovKiBTdHJ1Y3R1cmUgdG8g aG9sZCBjdXN0b20gYWQgZGF0YSAqLwoKdHlwZWRlZiBzdHJ1Y3QgY2FkcmVjIHsKICAgIHVf aW50MzJfdCBhZGRlbW9ncmFwaGljczsKICAgIHVfaW50MzJfdCBhZ2Vfd2VpZ2h0aW5nczsK ICAgIHVfaW50MzJfdCBnZW5fd2VpZ2h0aW5nczsKICAgIHVfaW50MzJfdCByZWdfd2VpZ2h0 aW5nczsKICAgIHVfaW50MzJfdCBpbnQxX3dlaWdodGluZ3M7CiAgICB1X2ludDMyX3QgaW50 Ml93ZWlnaHRpbmdzOwogICAgdV9pbnQxNl90IG1pbmltdW1fbWF0Y2hfdmFsdWU7CiAgICB1 X2ludDMyX3QgZXhwaXJhdGlvbl90aW1lOwp9ICAgICAgY2FkcmVjOwoKdHlwZWRlZiBjYWRy ZWMgKkNBRFB0cjsKCnR5cGVkZWYgdV9pbnQzMl90ICpVUFB0cjsKCnR5cGVkZWYgc3RydWN0 IGJ1ZnMgewogICAgQ0FEUHRyIGNhZF9idWZmZXI7CiAgICBVUFB0ciB1cF9idWZmZXI7CiAg ICB1X2ludDE2X3QgdXBfY291bnQ7Cn0gICAgYnVmczsKCnR5cGVkZWYgc3RydWN0IHNwZWN3 ZWI5OV9tb2R1bGVfZGF0YSBzcGVjd2ViOTlfbW9kdWxlX2RhdGE7CgovKiBNb2R1bGUgcHJp dmF0ZSBkYXRhIHNwYWNlIC0gd2hlcmUgd2Uga2VlcCBzb21lIHBlcgogKiAodmlydHVhbD8p IHNlcnZlciBwcmVjYWxjdWxhdGVkIGRhdGEKICovCnN0cnVjdCBzcGVjd2ViOTlfbW9kdWxl X2RhdGEgewogICAgY2hhciAqbG9nX3BhdGg7CiAgICBjaGFyICpjYWRnZW45OTsKICAgIGNo YXIgKnVwZmdlbjk5OwoKI2lmZGVmIFNPTEFSSVMyCiAgICB0aW1lX3QgdXBfbGFzdG1vZDsK ICAgIHRpbWVfdCBjYWRfbGFzdG1vZDsKI2Vsc2UKICAgIHN0cnVjdCB0aW1lc3BlYyB1cF9s YXN0bW9kOwogICAgc3RydWN0IHRpbWVzcGVjIGNhZF9sYXN0bW9kOwojZW5kaWYKICAgIGNo YXIgKnVwX3BhdGg7CiAgICB1X2ludDMyX3QgKnVwOwogICAgdV9pbnQxNl90IHVwX2NvdW50 OwogICAgcG9vbCAqdXBfcG9vbDsKCiAgICBjaGFyICpjYWRfcGF0aDsKICAgIHN0cnVjdCBj YWRyZWMgKmNhZDsKICAgIHVfaW50MTZfdCBjYWRfY291bnQ7CiAgICBwb29sICpjYWRfcG9v bDsKfTsKCi8qIQogIEBmdW5jdGlvbiBzcGVjd2ViOTlfZXJyb3IKICBAZGlzY3Vzc2lvbiBX cmFwcGVyIGZvciB0aGUgYXBfbG9nX2Vycm9yIGZ1bmN0aW9uLCB3cml0ZXMgdG8gdGhlIGVy cm9yCiAgbG9nIHdpdGggQVBMT0dfRVJSIHNldmVyaXR5IHdpdGggdGhlIHNvdXJjZSBmaWxl IG5hbWUsIGxpbmUgbnVtYmVyIGFuZAogIGVycm5vIGdsb2JhbCB2YXJpYWJsZS4gTm90ZSB0 aGF0IHdlIGxvc2UgYXBfbG9nX2Vycm9yJ3Mgc3ByaW50Zi1saWtlCiAgcHJvcGVydGllcy4K ICBAcGFyYW0gbWVzcyBUaGUgbWVzc2FnZSBzdHJpbmcKICovCgojZGVmaW5lIHNwZWN3ZWI5 OV9lcnJvcihzLG1lc3MpIHsgaWYgKHMpIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBcCgkJ CQkJICAgQVBMT0dfRVJSLCBcCgkJCQkJICAgcywgKG1lc3MpKTsgZWxzZSBmcHJpbnRmKHN0 ZGVyciwobWVzcykpOyB9CgovKiEKICBAZnVuY3Rpb24gc3BlY3dlYjk5X2luZm8KICBAZGlz Y3Vzc2lvbiBXcmFwcGVyIGZvciB0aGUgYXBfbG9nX2Vycm9yIGZ1bmN0aW9uLCB3cml0ZXMg dG8gdGhlIGVycm9yCiAgbG9nIHdpdGggQVBMT0dfSU5GTyBzZXZlcml0eS4gTm90ZSB0aGF0 IHdlIGxvc2UgYXBfbG9nX2Vycm9yJ3MKICBzcHJpbnRmLWxpa2UgcHJvcGVydGllcy4KICBA cGFyYW0gbWVzcyBUaGUgbWVzc2FnZSBzdHJpbmcKICovCgojZGVmaW5lIHNwZWN3ZWI5OV9p bmZvKHMsbWVzcykgeyBpZiAocykgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIFwKCQkJCQkg IEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgXAoJCQkJCSAgcywgKG1lc3MpKTsgZWxzZSBm cHJpbnRmKHN0ZGVyciwobWVzcykpOyB9CgojaWZkZWYgREVCVUcKLyohCiAgQGZ1bmN0aW9u IHNwZWN3ZWI5OV9kZWJ1ZwogIEBkaXNjdXNzaW9uIFdyYXBwZXIgZm9yIHRoZSBhcF9sb2df ZXJyb3IgZnVuY3Rpb24sIHdyaXRlcyB0byB0aGUgZXJyb3IKICBsb2cgd2l0aCBBUExPR19E RUJVRyBzZXZlcml0eS4gTm90ZSB0aGF0IHdlIGxvc2UgYXBfbG9nX2Vycm9yJ3MKICBzcHJp bnRmLWxpa2UgcHJvcGVydGllcy4KICBAcGFyYW0gbWVzcyBUaGUgbWVzc2FnZSBzdHJpbmcK ICovCgojZGVmaW5lIHNwZWN3ZWI5OV9kZWJ1ZyhzLG1lc3MpIHsgaWYgKHMpIGFwX2xvZ19l cnJvcihBUExPR19NQVJLLCBcCgkJCQkJICAgQVBMT0dfTk9FUlJOT3xBUExPR19ERUJVRywg XAoJCQkJCSAgIHMsIChtZXNzKSk7IFwKCQkJCSAgIGVsc2UgXAoJCQkJCSAgIGZwcmludGYo c3RkZXJyLChtZXNzKSk7IFwKCQkJCX0KI2VuZGlmCgovKiBIb3VzZWtlZXBpbmcgYW5kIGlu dGVybmFsIGZ1bmN0aW9ucyAqLwoKLyohCiAgQGZ1bmN0aW9uIHJldHVybkhUTUxQYWdlV2l0 aEZpbGUKICBAZGlzY3Vzc2lvbiBTZW5kcyB0aGUgY29udGVudHMgb2YgYSBmaWxlIHRvIHRo ZSBjbGllbnQsIGVuY2Fwc3VsYXRlZCBpbgogCQkJCWJvaWxlcnBsYXRlIEhUTUwgIGFuZCBh ZG9ybmVkIHdpdGggY29udGVudC1sZW5ndGggYW5kCiAgCQkJCWNvbnRlbnQtdHlwZSBoZWFk ZXIKICBAcGFyYW0gcmVxdWVzdF9yZWMgKnIgVGhlIHJlcXVlc3Qgd2UgYXJlIGN1cnJlbnRs eSBoYW5kbGluZwogIEBwYXJhbSBGSUxFICpmIFBvaW50ZXIgdG8gdGhlIGZpbGUgc3RydWN0 dXJlLiBUaGlzIGlzIHRoZSBmaWxlIHdlIG5lZWQKIAkJCQkJICB0byByZXR1cm4uIEl0IGhh cyB0byBiZSBvcGVuIGZvciByZWFkaW5nIHdpdGggdGhlIGZpbGUKIAkJCQkJICBwb2ludGVy IGF0IHRoZSBzdGFydC4KICovCgpzdGF0aWMgdm9pZCByZXR1cm5IVE1MUGFnZVdpdGhGaWxl KHJlcXVlc3RfcmVjICpyLCBGSUxFICpmKTsKCi8qIQogIEBmdW5jdGlvbiByZXR1cm5IVE1M UGFnZVdpdGhNZXNzYWdlCiAgQGRpc2N1c3Npb24gU2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBj bGllbnQsIGVuY2Fwc3VsYXRlZCBpbiBib2lsZXJwbGF0ZSBIVE1MCiAgCQkJCWFuZCBhZG9y bmVkIHdpdGggY29udGVudC1sZW5ndGggYW5kIGNvbnRlbnQtdHlwZSBoZWFkZXIKICBAcGFy YW0gciBUaGUgcmVxdWVzdCB3ZSBhcmUgY3VycmVudGx5IGhhbmRsaW5nCiAgQHBhcmFtIG0g Rm9ybWF0IChhcyBpbiBwcmludGYpIGFuZCBvcHRpb25hbCBmdXRoZXIgcGFyYW1ldGVycy4K ICovCgpzdGF0aWMgdm9pZCByZXR1cm5IVE1MUGFnZVdpdGhNZXNzYWdlKHJlcXVlc3RfcmVj ICpyLCBjaGFyICpmbXQsLi4uKTsKCi8qIQogIEBmdW5jdGlvbiByZXR1cm5IVE1MUGFnZVdp dGhCdWZmZXIKICBAZGlzY3Vzc2lvbiBTZW5kcyBjb250ZW50cyBvZiBidWZmZXIgdG8gY2xp ZW50LCBlbmNhcHN1bGF0ZWQgaW4gYm9pbGVycGxhdGUKIAkJCQlIVE1MIGFuZCBhZG9ybmVk IHdpdGggY29udGVudC1sZW5ndGggYW5kIGNvbnRlbnQtdHlwZSBoZWFkZXIuCiAgQHBhcmFt IHIgVGhlIHJlcXVlc3Qgd2UgYXJlIGN1cnJlbnRseSBoYW5kbGluZwogIEBwYXJhbSBidWYg VGhlIGRhdGEgd2UncmUgc2VuZGluZy4gV2UgZXhwZWN0IG51bGwtdGVybWluYXRlZCBzdHJp bmcKICovCgpzdGF0aWMgdm9pZCByZXR1cm5IVE1MUGFnZVdpdGhCdWZmZXIocmVxdWVzdF9y ZWMgKnIsIGNoYXIgKmJ1Zik7CgojaWYgMAovKiEKICBAZnVuY3Rpb24gY2hlY2tVUEZpbGUK ICBAZGlzY3Vzc2lvbiBDaGVja3MgaWYgdGhlIFVzZXIuUGVyc29uYWxpdHkgZmlsZSBoYXMg YmVlbiBsb2FkZWQgaW50byBtZW1vcnkKICAgICAgICAgICAgICBhbmQsIGlmIG5vdCwgZG9l cyBzby4KICBAcGFyYW0gciBUaGUgcmVxdWVzdCB3ZSBhcmUgY3VycmVudGx5IGhhbmRsaW5n CiAgQHJlc3VsdCBTdWNjZXNzICgwKSBvciBmYWlsdXJlICghMCkuCiAqLwppbnQxNl90IGNo ZWNrVVBGaWxlKHN0cnVjdCBzcGVjd2ViOTlfbW9kdWxlX2RhdGEgKiBfbXkpOwoKLyohCiBA ZnVuY3Rpb24gY2hlY2tDQURGaWxlCiBAZGlzY3Vzc2lvbiBDaGVja3MgaWYgdGhlIEN1c3Rv bS5BZHMgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIG9uIGRpc2sgc2luY2UgdGhlCiAJICAgICBs YXN0IHRpbWUgaXQgd2FzIGxvYWRlZCBpbnRvIG1lbW9yeSBhbmQsIGlmIHNvLCByZWZyZXNo ZXMgdGhlCiAJICAgICBpbi1tZW1vcnkgY29weS4KIEBwYXJhbSByIFRoZSByZXF1ZXN0IHdl IGFyZSBjdXJyZW50bHkgaGFuZGxpbmcKIEByZXN1bHQgU3VjY2VzICgwKSBvciBmYWlsdXJl ICghMCkKICovCgppbnQxNl90IGNoZWNrQ0FERmlsZShzdHJ1Y3Qgc3BlY3dlYjk5X21vZHVs ZV9kYXRhICogX215KTsKCi8qIQogIEBmdW5jdGlvbiBjdXN0b21hZHNjYW4KICBAZGlzY3Vz c2lvbiBSZWFkcyBhIHBheWxvYWQgZmlsZSBpbnRvIG1lbW9yeSwgc2NhbnMgaXQgZm9yIGFk IHRhZ3MsIHJlcGxhY2VzCiAJCQkJYWQgZGF0YSBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8g dGhlIG1lbW9yeSBidWZmZXIKICBAcGFyYW0gciBUaGUgcmVxdWVzdCB3ZSBhcmUgY3VycmVu dGx5IGhhbmRsaW5nCiAgQHBhcmFtIGYgVGhlIHBheWxvYWQgZmlsZSB3ZSB3aWxsIHNjYW4u IFdlIGV4cGVjdCB0aGUgZmlsZSB0byBiZSBvcGVuCiAgQHBhcmFtIGFkaWQgVGhlIG51bWJl ciBvZiB0aGUgYWQgdGhhdCB3ZSB3aWxsIHN1YnN0aXR1dGUgaW50bwogCQkJCQkJICAgdGhl IHBheWxvYWQgZmlsZQogIEByZXN1bHQgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgY29u dGFpbnMgdGhlIHByb2Nlc3NlZCBwYXlsb2FkIGZpbGUgZGF0YQogKi8KI2VuZGlmCgpjYWRk cl90IGN1c3RvbWFkc2NhbihyZXF1ZXN0X3JlYyAqciwgRklMRSAqZiwgaW50MTZfdCBhZGlk KTsKCi8qIQogIEBmdW5jdGlvbiBjYWxsX3NwZWN3ZWJfdXRpbAogIEBkaXNjdXNzaW9uIENh bGxiYWNrIHJvdXRpbmUgZm9yIGFwX2JzcGF3bl9jaGlsZAogIEBwYXJhbSBycCBQcm9jZXNz IGRhdGE7IHdlIGFyZSBwYXNzZWQgdGhlIGN1cnJlbnQgcmVxdWVzdF9yZWMsCiAJCQkJCSAg IGFkYXB0ZWQgZm9yIG91ciB1c2UKICBAcGFyYW0gcGluZm8gV2luMzIgbmVlZHMgdGhpcwog IEByZXN1bHQgT24gV2luMzIsIHRoZSBwaWQgb2YgdGhlIHByb2Nlc3MgaXQgc3Bhd25lZCwg b24gdW5peCBpdCBuZXZlciByZXR1cm5zCiAqLwoKc3RhdGljIGludCBjYWxsX3NwZWN3ZWJf dXRpbCh2b2lkICpycCwgY2hpbGRfaW5mbyAqIHBpbmZvKTsKCi8qIQogIEBmdW5jdGlvbiBz cGVjd2ViOTlfbW9kdWxlX2luaXQKICBAZGlzY3Vzc2lvbiBJbml0aWFsaXphdGlvbiBvZiBt b2R1bGUgYW5kIG91ciBvd24gZGF0YSBzdHJ1Y3R1cmVzLgogIEBwYXJhbSBzIFRoZSBzZXJ2 ZXJfcmVjIG9mIHRoZSBzZXJ2ZXIgcHJvY2VzcyB0aGF0IGluaXRpYWxpemVzIHVzCiAgQHBh cmFtIHAgUG9pbnRlciB0byBhIHBvb2wgdGhhdCBsaXZlcyBhcyBsb25nIGFzIHRoZSBzZXJ2 ZXIKICovCgpzdGF0aWMgdm9pZCBzcGVjd2ViOTlfbW9kdWxlX2luaXQoc2VydmVyX3JlYyAq cywgYXBfcG9vbCAqIHApOwoKLyogQ29udGVudCBoYW5kbGVycyBmb3IgdGhlIFNQRUNXZWI5 OSBkeW5hbWljIGNvbnRlbnQgY2F0ZWdvcmllcyAqLwoKLyohCiAgQGZ1bmN0aW9uIHNwZWN3 ZWI5OV9oa19oYW5kbGVyCiAgQGRpc2N1c3Npb24gSW1wbGVtZW50cyB0aGUgU1BFQ1dlYjk5 IGhvdXNla2VlcGluZyByb3V0aW5lcwogIEBwYXJhbSByIFRoZSByZXF1ZXN0IHdlIGFyZSBj dXJyZW50bHkgaGFuZGxpbmcKICovCgpzdGF0aWMgaW50IHNwZWN3ZWI5OV9oa19oYW5kbGVy KHJlcXVlc3RfcmVjICpyKTsKCi8qIQogIEBmdW5jdGlvbiBzcGVjd2ViOTlfZ2V0X2hhbmRs ZXIKICBAZGlzY3Vzc2lvbiBJbXBsZW1lbnRzIHRoZSBTUEVDV2ViOTkgR0VUIG9wZXJhdGlv bgogIEBwYXJhbSByIFRoZSByZXF1ZXN0IHdlIGFyZSBjdXJyZW50bHkgaGFuZGxpbmcKICBA cmVzdWx0IE9LIGlmIGl0IGRvZXMgbm90IGRpZSBob3JyaWJseSB3aGljaCBzaG91bGQgbm90 IG9jY3VyIGJlY2F1c2UgaXQgZG9lcwogIGEgbG90IG9mIGl0cyBvd24gZXJyb3IgaGFuZGxp bmcKICovCgpzdGF0aWMgaW50IHNwZWN3ZWI5OV9nZXRfaGFuZGxlcihyZXF1ZXN0X3JlYyAq cik7CgovKiEKICBAZnVuY3Rpb24gc3BlY3dlYjk5X2NhZGdldF9oYW5kbGVyCiAgQGRpc2N1 c3Npb24gSGFuZGxlcyBTUEVDV2ViOTkgR0VUIHJlcXVlc3Qgd2l0aCBDdXN0b20gQWQgUm90 YXRpb24KICBAcGFyYW0gciBUaGUgcmVxdWVzdCB3ZSBhcmUgY3VycmVudGx5IGhhbmRsaW5n CiAgQHJlc3VsdCBPSyBpZiBpdCBkb2VzIG5vdCBkaWUgaG9ycmlibHkgd2hpY2ggc2hvdWxk IG5vdCBvY2N1ciBiZWNhdXNlIGl0IGRvZXMKICBhIGxvdCBvZiBpdHMgb3duIGVycm9yIGhh bmRsaW5nCiAqLwoKc3RhdGljIGludCBzcGVjd2ViOTlfY2FkZ2V0X2hhbmRsZXIocmVxdWVz dF9yZWMgKnIpOwoKLyohCiBAZnVuY3Rpb24gdXRpbF9wYXJzZV9jb29raWUKIEBkaXNjdXNz aW9uICBUaGlzIHJvdXRpbmUgY29tZXMgc3RyYWlnaHQgb3V0IG9mICdXcml0aW5nIEFwYWNo ZSBNb2R1bGVzIHdpdGgKICBQZXJsIGFuZCBDJyBieSBEb3VnIE1hY0VhY2hlcm4gYW5kIExp bmNvbG4gU3RlaW4sIHBhZ2UgNTk5LiBQYXJzZXMgdGhlIGNvb2tpZXMKICBvZiBhIHJlcXVl c3QgaW50byBhIHRhYmxlIG9mIGtleS12YWx1ZSBwYWlycy4KIEBwYXJhbSByIFRoZSBjdXJy ZW50IHJlcXVlc3QKIEByZXN1bHQgUG9pbnRlciB0byB0aGUgY29va2llIHRhYmxlCiAqLwoK dGFibGUgKnV0aWxfcGFyc2VfY29va2llKHJlcXVlc3RfcmVjICpyKTsKCi8qIQogIEBmdW5j dGlvbiBzcGVjd2ViOTlfcG9zdF9oYW5kbGVyCiAgQGRpc2N1c3Npb24gSW1wbGVtZW50cyB0 aGUgU1BFQ1dlYjk5IFBPU1Qgb3BlcmF0aW9uLgogIEBwYXJhbSByIFRoZSByZXF1ZXN0IHdl IGFyZSBjdXJyZW50bHkgaGFuZGxpbmcKICBAcmVzdWx0IE9LIGlmIGl0IGRvZXMgbm90IGRp ZSBob3JyaWJseSB3aGljaCBzaG91bGQgbm90IG9jY3VyIGJlY2F1c2UgaXQgZG9lcwogIGEg bG90IG9mIGl0cyBvd24gZXJyb3IgaGFuZGxpbmcKICovCgpzdGF0aWMgaW50IHNwZWN3ZWI5 OV9wb3N0X2hhbmRsZXIocmVxdWVzdF9yZWMgKnIpOwoKLyohCiBAZnVuY3Rpb24gc3BlY3dl Yjk5X2xvZ2dlcgogQGRpc2N1c3Npb24gV3JpdGUgdGhlIHJlc3VsdCBvZiBhIFBPU1QgdHJh bnNhY3Rpb24gdG8gdGhlIHBvc3QubG9nIGFzCiAgcmVxdWlyZWQgYnkgdGhlIFNQRUMgUnVu IFJ1bGVzLiBPbiBvdGhlciByZXF1ZXN0cywgdGhpcyBkb2VzIG5vdGhpbmcuCiAgQHBhcmFt IHIgVGhlIGN1cnJlbnQgcmVxdWVzdAogIEByZXN1bHQgT0sgaWYgb2ssIEhUVFBfSU5URVJO QUxfU0VSVkVSX0VSUk9SIGlmIHNvbWV0aGluZyB3ZW50IHNvdXRoLgogKi8KCmludCBzcGVj d2ViOTlfbG9nZ2VyKHJlcXVlc3RfcmVjICpyKTsKCiNlbmRpZgkJCQkvKiBNT0RfU1BFQ1dF Qjk5X0ggKi8KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzcGVjd2ViOTktMS4zL1JFQURNRQAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAMDEwMDY0NAAwMDAwNzY3ADAwMDA3NjUAMDAwMDAwMDA3NTYA MDc0NjMzMzMzMzMAMDE0MjUxACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAHVzdGFyICAAZ3JlZ2FtZXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn cmVnYW1lcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApC dWlsZCBwcm9jZWR1cmUKCjEuCU1ha2Ugc3VyZSBhcGFjaGUgMS4zIGlzIGNvbXBpbGVkIGFu ZCBpbnN0YWxsZWQKCjIuCUdlbmVyYXRlIGEgbWFrZSBmaWxlIHdpdGgKCgkJYXB4cyAtbiBz cGVjd2ViOTkgLWcKCjMuCU1ha2UsIEluc3RhbGwgdGhlIHNwZWN3ZWIgbW9kdWxlLgoKNC4J QWRkIHNvbWV0aGluZyBhbG9uZyB0aGUgbGluZXMgb2YKCXRoZSBodHRwZC5zcGVjd2ViLmNv bmYgdG8geW91cgoJY29uZmlndXJhdGlvbi4gKE9yIHVzZSB0aGUgaW5jbHVkZQoJZGlyZWN0 aXZlIHRvIGluY2x1ZGUgaXQpLgoKNS4JTWFrZSBzdXJlIHRoYXQgd2FmZ2VuOTksIGNhZGdl bjk5IGFuZCB1cGZnZW45OQoJYXJlIGluIHlvdXIgZG9jcm9vdC4KCjYuCU5vdGUgdGhhdCBh Y2NvcmRpbmcgdG8gdGhlIHNwZWN3ZWIgcnVsZXMKCWEgY2VydGFpbiBwZXJjZW50YWdlIG11 c3QgYmUgaGFuZGxlZCB3aXRoCglhIENHSS4gU2VlIHRoZSBlbmQgb2YgdGhlIC5jb25mIGZp bGUuCgoKAAAAAAAAAAAAAAAAAAAAAAAAc3BlY3dlYjk5LTEuMy9TVEFUVVMAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMDc2NwAwMDAwNzY1ADAwMDAwMDAwNDUyADA3 NDYzMzM0NTQwADAxNDMzMQAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAB1c3RhciAgAGdyZWdhbWVzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ3Jl Z2FtZXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKQXBy aWwgMjAwMi4KCgkxLjAwIAlGaXJzdCByb3VnaCByZWxlYXNlLgoKTWFpbiBUT0RPJ3MKCS0J U2VlIGNvZGUuCgktCU1ha2UgdGhpbmdzIG1vcmUgY29uZmlndXJhYmxlLgoKTm90ZSBvbiBj b2Rpbmcgc3R5bGU6CgoJU29tZSBvZiBpdCBpcyBkaXN0aW5jdGx5IHVuLWFwYWNoZSBsaWtl IC0gdG8gbWF0Y2ggdGhhdAoJb2YgdGhlIHNwZWN3ZWIgcnVuIHJ1bGVzIGV4YW1wbGVzLiBG dXJ0aGVybW9yZSBjZXJ0YWluCglvcHRpbWl6YXRpb25zIGFyZSBvdXQgLSBhZ2FpbiBhY2Nv cmRpbmcgdG8gdGhlIHJ1biBydWxlcy4KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNwZWN3ZWI5OS0yLjAvAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAwMDQwNzU1ADAwMDA3NjcAMDAwMDc2NQAwMDAwMDAwMDAwMAAwNzQ2 NDAxNDAwNwAwMTMzNTUAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAdXN0YXIgIABncmVnYW1lcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdyZWdh bWVzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc3BlY3dl Yjk5LTIuMC9jb25maWc1Lm00AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMDc2 NwAwMDAwNzY1ADAwMDAwMDAyNDEwADA3NDY0MDE0MDA3ADAxNTE0MwAgMAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAGdyZWdhbWVzAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAZ3JlZ2FtZXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAABkbmwgbW9kdWxlcyBlbmFibGVkIGluIHRoaXMgZGlyZWN0 b3J5IGJ5IGRlZmF1bHQKZG5sIFNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dCBmb3IgbGljZW5z ZSBpbmZvLgpkbmwgeyBzY3RlbW1lIHwgZGlya3ggfUB7IGFwYWNoZS5vcmcgfCBjb3ZhbGVu dC5uZXQgfQoKZG5sIEFQQUNIRV9NT0RVTEUobmFtZSwgaGVscHRleHRbLCBvYmplY3RzWywg c3RydWN0bmFtZVssIGRlZmF1bHRbLCBjb25maWddXV1dKQoKQVBBQ0hFX01PRFBBVEhfSU5J VChnZW5lcmF0b3JzKQoKQVBBQ0hFX01PRFVMRShzdGF0dXMsIHByb2Nlc3MvdGhyZWFkIG1v bml0b3JpbmcsICwgLCB5ZXMpCkFQQUNIRV9NT0RVTEUoYXV0b2luZGV4LCBkaXJlY3Rvcnkg bGlzdGluZywgLCAsIHllcykKQVBBQ0hFX01PRFVMRShhc2lzLCBhcy1pcyBmaWxldHlwZXMs ICwgLCB5ZXMpCkFQQUNIRV9NT0RVTEUoaW5mbywgc2VydmVyIGluZm9ybWF0aW9uLCAsICwg bW9zdCkKQVBBQ0hFX01PRFVMRShzdWV4ZWMsIHNldCB1aWQgYW5kIGdpZCBmb3Igc3Bhd25l ZCBwcm9jZXNzZXMsICwgLCBubywgWwogICAgICAgICAgICAgIG90aGVyX3RhcmdldHM9c3Vl eGVjIF0gKQoKQVBSX0FERFRPKExUX0xERkxBR1MsLWV4cG9ydC1keW5hbWljKQoKaWYgdGVz dCAiJGFwYWNoZV9jdl9tcG0iID0gIndvcmtlciIgLW8gIiRhcGFjaGVfY3ZfbXBtIiA9ICJ0 aHJlYWRlZCIgLW8gIiRhcGFjaGVfY3ZfbXBtIiA9ICJwZXJjaGlsZCI7IHRoZW4KIyBpZiB3 ZSBhcmUgdXNpbmcgYSB0aHJlYWRlZCBNUE0sIHdlIHdpbGwgZ2V0IGJldHRlciBwZXJmb3Jt YW5jZSB3aXRoCiMgbW9kX2NnaWQsIHNvIG1ha2UgaXQgdGhlIGRlZmF1bHQuCiAgICBBUEFD SEVfTU9EVUxFKGNnaWQsIENHSSBzY3JpcHRzLCAsICwgeWVzKQogICAgQVBBQ0hFX01PRFVM RShjZ2ksIENHSSBzY3JpcHRzLCAsICwgbm8pCmVsc2UKIyBpZiB3ZSBhcmUgdXNpbmcgYSBu b24tdGhyZWFkZWQgTVBNLCBpdCBtYWtlcyBsaXR0bGUgc2Vuc2UgdG8gdXNlCiMgbW9kX2Nn aWQsIGFuZCBpdCBqdXN0IG9wZW5zIHVwIGhvbGVzIHdlIGRvbid0IG5lZWQuICBNYWtlIG1v ZF9jZ2kgdGhlCiMgZGVmYXVsdAogICAgQVBBQ0hFX01PRFVMRShjZ2ksIENHSSBzY3JpcHRz LCAsICwgeWVzKQogICAgQVBBQ0hFX01PRFVMRShjZ2lkLCBDR0kgc2NyaXB0cywgLCAsIG5v KQpmaQoKZG5sIGRpcmt4QGNvdmFsZW50Lm5ldCAvIG9jdCAyMDAxCkFQQUNIRV9NT0RVTEUo c3BlY3dlYjk5LCBTcGVjV2ViOTkgYmVuY2htYXJraW5nLCAsICwgbm8pCgpBUEFDSEVfTU9E UEFUSF9GSU5JU0gKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzcGVjd2ViOTkt Mi4wL1JFQURNRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDEwMDY0NAAwMDAwNzY3ADAw MDA3NjUAMDAwMDAwMDA2MDYAMDc0NjQwMTI3NDYAMDE0MjQ0ACAwAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAZ3JlZ2FtZXMAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAABncmVnYW1lcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAE1vdmUgaW50byAuLi4vaHR0cGQtMi4wL21vZHVsZXMvZ2VuZXJh dG9ycwoKUmVydW4gYnVpbGRjb25mIGFuZCBlbmFibGUgd2l0aAoKCS4vY29uZmlndXJlIC0t ZW5hYmxlLXNwZWN3ZWI5OQoKTm90ZTogCi0gICBsYWNrcyBzb21lIG9mIHRoZSB0aW1lb3V0 L2Vycm9yIGNhdGNoaW5nIC0gQVBSIHByb2JsZW0KLSAgIGxvY2tpbmcgZGlmZmVyZW50IC0g ZHVlIHRvIEFQUgotICAgVGhpcyByZWxlYXNlIHNob3VsZCBjb21waWxlIGFnYWluc3QgQXBh Y2hlIDIuMC4zNQoKV09SSyBJTiBQUk9DRVNTCgpTZWUgdGhlIGZpbGUgTElDRU5TRS50eHQg Zm9yIGxpY2Vuc2UgaW5mby4KCntzY3RlbW1lQGNvdmFsZW50Lm5ldCB8IGRpcmt4fEB7IGFw YWNoZS5vcmcgfCBjb3ZhbGVudC5uZXQgfX0KCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc3BlY3dlYjk5LTIu MC9tb2Rfc3BlY3dlYjk5LmMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA3NTUAMDAwMDc2NwAwMDAw NzY1ADAwMDAwMTIxNDc2ADA3NDYzNTU2MjczADAxNjIyNAAgMAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAGdyZWdhbWVzAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAZ3JlZ2FtZXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBUaGUgQXBhY2hlIFNvZnR3YXJl IExpY2Vuc2UsIFZlcnNpb24gMS4xCiAqCiAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFRo ZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKICogcmVzZXJ2ZWQu CiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y bXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICoKICog MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92 ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBu b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns YWltZXIgaW4KICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs cyBwcm92aWRlZCB3aXRoIHRoZQogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqIDMuIFRoZSBl bmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9u LAogKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdt ZW50OgogKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3Bl ZCBieSB0aGUKICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8v d3d3LmFwYWNoZS5vcmcvKS4iCiAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdt ZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKICogICAgaWYgYW5kIHdo ZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVh ci4KICoKICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZv dW5kYXRpb24iIG11c3QKICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl IHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCiAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJp b3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgogKiAgICBwZXJtaXNzaW9uLCBw bGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KICoKICogNS4gUHJvZHVjdHMgZGVy aXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCiAq ICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJp b3Igd3JpdHRlbgogKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91 bmRhdGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5E IEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAogKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV VCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwogKiBPRiBNRVJDSEFO VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQogKiBE SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VO REFUSU9OIE9SCiAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAogKiBMSU1JVEVEIFRPLCBQ Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCiAq IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF VkVSIENBVVNFRCBBTkQKICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCiAqIE9SIFRPUlQgKElOQ0xVRElORyBO RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAogKiBPRiBU SEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC SUxJVFkgT0YKICogU1VDSCBEQU1BR0UuCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqCiAqIFRoaXMg c29mdHdhcmUgd2FzIGNvbnRyaWJ1dGVkIGJ5IENvdmFsZW50IFRlY2hub2xvZ2llcyBJbmMs IAogKiBodHRwOi8vd3d3LmNvdmFsZW50Lm5ldCBhcm91bmQgQXByaWwgMjAwMDIuCiAqCiAq IG1vZF9zcGVjd2ViOTkuYyAtLSBBcGFjaGUgIHNwZWN3ZWI5OSBtb2R1bGUKICogc2N0ZW1t ZSBKdWx5IDIwMDEKICoKICoge3NjdGVtbWUgfCBkaXJreCB9QHsgYXBhY2hlLm9yZyB8IGNv dmFsZW50Lm5ldCB9CiAqLwoKI2luY2x1ZGUgImh0dHBkLmgiCgojaW5jbHVkZSAiaHR0cF9j b3JlLmgiCiNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgojaW5jbHVkZSAiaHR0cF9sb2cuaCIK I2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKI2luY2x1ZGUgImh0dHBfbWFpbi5oIgoKI2lu Y2x1ZGUgImFwX2NvbmZpZy5oIgoKI2luY2x1ZGUgImFwci5oIgojaW5jbHVkZSAiYXByX3N0 cmluZ3MuaCIKI2luY2x1ZGUgImFwcl9saWIuaCIKI2luY2x1ZGUgImFwcl9maWxlX2luZm8u aCIKI2luY2x1ZGUgImFwcl90aW1lLmgiCiNpbmNsdWRlICJhcHJfdGFibGVzLmgiCiNpbmNs dWRlICJhcHJfYnVja2V0cy5oIgojaW5jbHVkZSAiYXByX3VyaS5oIgoKI2luY2x1ZGUgIm1v ZF9jb3JlLmgiCgojaWYgQVBSX0hBVkVfU1lTX1RZUEVTX0gKI2luY2x1ZGUgPHN5cy90eXBl cy5oPgojZW5kaWYKI2lmIEFQUl9IQVZFX1VOSVNURF9ICiNpbmNsdWRlIDx1bmlzdGQuaD4K I2VuZGlmCgovKiBOb3RlOiB2ZXJzaW9uIG11c3QgYmUgb2YgdGhlIHgueXkgdHlwZSAtIGFz IGl0IGlzCiAqIHNlbmQgb3ZlciB0aGUgaHR0cCBwcm90b2NvbCB3aXJlOyB3aGVyZSB4IGFu ZCB5CiAqIGFyZSBzaW5nbGUgMC05IGFzY2lpIGRpZ2l0cyA6LSkuIFRoZSBuYW1lIHNob3Vs ZAogKiBiZSBhbiBBLVphLXowLTkgc3RyaW5nLiBXaGljaCBkb2VzIG5vdCBzdGFydCB3aXRo CiAqIGEgbnVtYmVyIDotKSBZb3Ugd2FudCB0byBhdm9pZCBfIGJ1dCAnLScgaXMgbm90IHRv bwogKiBiYWQgdXN1YWxseS4uCiAqLwojZGVmaW5lIE5BTUUgIlNwZWN3ZWIiCiNkZWZpbmUg VkVSU0lPTiAiMi4wMSIKCiNpbmNsdWRlICJtb2Rfc3BlY3dlYjk5LmgiCgptb2R1bGUgQVBf TU9EVUxFX0RFQ0xBUkVfREFUQSBzcGVjd2ViOTlfbW9kdWxlOwoKdHlwZWRlZiBzdHJ1Y3Qg c3BlY3dlYjk5X21vZHVsZV9kYXRhIHNwZWN3ZWI5OV9tb2R1bGVfZGF0YTsKCi8qIE1vZHVs ZSBwcml2YXRlIGRhdGEgc3BhY2UgLSB3aGVyZSB3ZSBrZWVwIHNvbWUgcGVyCiAqICh2aXJ0 dWFsPykgc2VydmVyIHByZWNhbGN1bGF0ZWQgZGF0YQogKi8Kc3RydWN0IHNwZWN3ZWI5OV9t b2R1bGVfZGF0YSB7CiAgICBjaGFyICpsb2dfcGF0aDsKICAgIGNoYXIgKmNhZGdlbjk5Owog ICAgY2hhciAqdXBmZ2VuOTk7CgogICAgYXByX3RpbWVfdCB1cF9sYXN0bW9kOwogICAgYXBy X3RpbWVfdCBjYWRfbGFzdG1vZDsKCiAgICBhcHJfdGltZV90IGNoZWNrOwoKICAgIGNoYXIg KnVwX3BhdGg7CiAgICBhcHJfcG9vbF90ICp1cF9wb29sOwoKICAgIGFwcl9pbnQzMl90ICp1 cDsKICAgIGFwcl91aW50MTZfdCB1cF9jb3VudDsKCiAgICBjaGFyICpjYWRfcGF0aDsKICAg IGFwcl9wb29sX3QgKmNhZF9wb29sOwoKICAgIHN0cnVjdCBjYWRyZWMgKmNhZDsKICAgIGFw cl91aW50MTZfdCBjYWRfY291bnQ7Cn07CgpzdGF0aWMgY29uc3QgY2hhciBib2lsZXJwbGF0 ZV9zdGFydFtdID0gQk9JTEVSUExBVEVfU1RBUlQ7CnN0YXRpYyBjb25zdCBpbnQgYm9pbGVy cGxhdGVfc3RhcnRfbGVuID0gc2l6ZW9mKGJvaWxlcnBsYXRlX3N0YXJ0KSAtIDE7CgpzdGF0 aWMgY29uc3QgY2hhciBib2lsZXJwbGF0ZV9lbmRbXSA9IEJPSUxFUlBMQVRFX0VORDsKc3Rh dGljIGNvbnN0IGludCBib2lsZXJwbGF0ZV9lbmRfbGVuID0gc2l6ZW9mKGJvaWxlcnBsYXRl X2VuZCkgLSAxOwoKLyogVXNlIGludGVyYWwgbG9ja2luZyAtIHRoZSBtYWluIHJlYXNvbiBm b3IgZG9pbmcKICogc28gaXMgZXJyb3IgdHJhcHBpbmcgYW5kIGJlaW5nIGFibGUgdG8gd2Fy bi9pbmZvCiAqIHdoZW4gd2Ugc3BlbmQgYSBsb3Qgb2YgdGltZSBpbiBjYW1waW5nIG9uIGEg bG9jay4KICovCiNkZWZpbmUgIF9ybG9jayhzLHIsZmcsZmlsZSkgICAgKF9kb2xvY2socyxy LGZnLEFQUl9GTE9DS19TSEFSRUQsZmlsZSkpCiNkZWZpbmUgIF93bG9jayhzLHIsZmcsZmls ZSkgICAgKF9kb2xvY2socyxyLGZnLEFQUl9GTE9DS19FWENMVVNJVkUsZmlsZSkpCgovKiBn ZW5lcmljIGxvY2tpbmcKICogLSB3aGVuICdyJyBpcyBwYXNzZWQgLSB3aWxsIGRvIGEgdGlt ZW91dC4KICogLSB3aGVuICdzJyBpcyBwYXNzZWQgLSBkbyBhcHByb3ByaWF0ZSBsb2dnaW5n LgogKiAtIHdoZW4gJ2ZpbGUnIGlzIHBhc3NlZCAtIGxvZ2dpbmcgd2lsbCBiZSBtb3JlIG1l YW5pbmdmdWxsCiAqLwpzdGF0aWMgaW50IF9kb2xvY2soc3RydWN0IHNlcnZlcl9yZWMgKnMs IHN0cnVjdCByZXF1ZXN0X3JlYyAqciwgYXByX2ZpbGVfdCAqIGYsCgkJICAgICAgIGludCB0 eXBlLCBjaGFyICpmaWxlKQp7CiAgICBpbnQgZTsKICAgIC8qCiAgICAgKiAgUmF0aGVyIHRo YW4gc2ltcGx5IHRyeS1sb2NrLWFuZC13YWl0IC0gd2UgZmlyc3QgY2hlY2sKICAgICAqIGlm IGEgbG9jayB3b3VsZCBibG9jayAtIGFuZCB0aGVuIHNldCBhIHRpbWVvdXQgYmVmb3JlCiAg ICAgKiBjYW1waW5nIG91dCBvbiB0aGUgbG9jay4KICAgICAqCiAgICAgKi8KICAgIGlmICgo ZSA9IGFwcl9maWxlX2xvY2soZiwgdHlwZSB8IEFQUl9GTE9DS19OT05CTE9DSykpICE9IEFQ Ul9TVUNDRVNTKSB7CgkvKgoJICogWFhYIHRpbWVvdXRzIHJlbW92ZWQgISAgbm90IHN1cmUg aG93IHRvIGRvIHRoYXQgaW4gMi4wCgkgKi8KCWlmIChzKQoJICAgIGFwX2xvZ19lcnJvcihB UExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfSU5GTywgZSwgcywKCQkJICJDYW1w aW5nIG91dCAlcyVzIGZvciBhICVzIGxvY2siLAoJCQkgZmlsZSA/ICJvbiAiIDogIiIsIGZp bGUgPyBmaWxlIDogIiIsCgkJCSAoKHR5cGUgPT0gQVBSX0ZMT0NLX1NIQVJFRCkgPyAicmVh ZCIgOiAid3JpdGUiKSk7CgoJZSA9IGFwcl9maWxlX2xvY2soZiwgdHlwZSk7CgkvKgoJICog WFhYWCBjbGVhciB0aW1lb3V0IHJlbW92ZWQgbm90IHN1cmUgaG93IHRvIGRvIHRoYXQgaW4g Mi4wCgkgKi8KICAgIH0KCiAgICAvKiBUcmFwIGJvdGggZmlyc3Qvc2Vjb25kIGZsb2NrKCkg ZXJyb3IuICovCiAgICBpZiAoZSkgewoJaWYgKHMpCgkgICAgYXBfbG9nX2Vycm9yKEFQTE9H X01BUkssIEFQTE9HX0VSUiwgZSwgcywKCQkJICJGYWlsZWQgdG8gJXMiICJsb2NrJXMlcyIs CgkJCSAoKHR5cGUgPT0gQVBSX0ZMT0NLX1NIQVJFRCkgPyAicmVhZCIgOiAid3JpdGUiKSwK CQkJICgoZmlsZSkgPyAiOiAiIDogIiIpLCAoKGZpbGUpID8gZmlsZSA6ICIiKSk7CglyZXR1 cm4gLTE7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIGNoYXIgKnJldHVybkhUTUxQ YWdlSGVhZChyZXF1ZXN0X3JlYyAqciwgaW50IGxlbikKewogICAgY2hhciAqYnBfaGVhZDsK CiAgICAvKiBGaWxsIHVwIHRoZSBib2lsZXJwbGF0ZSB3aXRoIGluZm8gKi8KICAgIGJwX2hl YWQgPSBhcHJfcHNwcmludGYoci0+cG9vbCwgYm9pbGVycGxhdGVfc3RhcnQsCgkJCSAgIGFw X2dldF9zZXJ2ZXJfdmVyc2lvbigpLAoJCQkgICBhcF9nZXRfcmVtb3RlX2hvc3Qoci0+Y29u bmVjdGlvbiwgTlVMTCwKCQkJCQkgICAgICBSRU1PVEVfTk9MT09LVVAsIE5VTEwpLCByLT51 cmksCgkJCSAgIHItPmFyZ3MgPyByLT5hcmdzIDogIiIpOwoKICAgIGFwX3NldF9jb250ZW50 X2xlbmd0aChyLCBzdHJsZW4oYnBfaGVhZCkgKyBib2lsZXJwbGF0ZV9lbmRfbGVuICsgbGVu KTsKICAgIHItPmNvbnRlbnRfdHlwZSA9ICJ0ZXh0L2h0bWwiOwoKICAgIHJldHVybiBicF9o ZWFkOwp9CgoKc3RhdGljIHZvaWQgcmV0dXJuSFRNTFBhZ2VXaXRoQnVmZmVyKHJlcXVlc3Rf cmVjICpyLCBjaGFyICpidWYpCnsKICAgIGNoYXIgKmJwX2hlYWQ7CiAgICBjb25uX3JlYyAq YyA9IHItPmNvbm5lY3Rpb247CiAgICBhcHJfYnVja2V0X2JyaWdhZGUgKmJiOwogICAgYXBy X2J1Y2tldCAqYjEsICpiMiwgKmIzOwogICAgYXByX3N0YXR1c190IHJ2OwoKICAgIGlmIChi dWYgPT0gTlVMTCkKCWJ1ZiA9ICJFcnJvcjogdHJpZWQgdG8gc2VuZCBidWZmZXIgYnV0IGl0 IGlzIE5VTEwiOwoKICAgIGJwX2hlYWQgPSByZXR1cm5IVE1MUGFnZUhlYWQociwgc3RybGVu KGJ1ZikpOwoKICAgIGlmIChyLT5oZWFkZXJfb25seSkKCXJldHVybjsKCiAgICBiYiA9IGFw cl9icmlnYWRlX2NyZWF0ZShyLT5wb29sLCBjLT5idWNrZXRfYWxsb2MpOwoKICAgIGIxID0g YXByX2J1Y2tldF90cmFuc2llbnRfY3JlYXRlKGJwX2hlYWQsIHN0cmxlbihicF9oZWFkKSwg Yy0+YnVja2V0X2FsbG9jKTsKICAgIGIyID0gYXByX2J1Y2tldF90cmFuc2llbnRfY3JlYXRl KGJ1Ziwgc3RybGVuKGJ1ZiksIGMtPmJ1Y2tldF9hbGxvYyk7CiAgICBiMyA9IGFwcl9idWNr ZXRfaW1tb3J0YWxfY3JlYXRlKGJvaWxlcnBsYXRlX2VuZCwKCQkJCSAgYm9pbGVycGxhdGVf ZW5kX2xlbiwgYy0+YnVja2V0X2FsbG9jKTsKCiAgICBBUFJfQlJJR0FERV9JTlNFUlRfVEFJ TChiYiwgYjEpOwogICAgQVBSX0JSSUdBREVfSU5TRVJUX1RBSUwoYmIsIGIyKTsKICAgIEFQ Ul9CUklHQURFX0lOU0VSVF9UQUlMKGJiLCBiMyk7CiAgICBBUFJfQlJJR0FERV9JTlNFUlRf VEFJTChiYiwgYXByX2J1Y2tldF9lb3NfY3JlYXRlKGMtPmJ1Y2tldF9hbGxvYykpOwoKICAg IHJ2ID0gYXBfcGFzc19icmlnYWRlKHItPm91dHB1dF9maWx0ZXJzLCBiYik7CiAgICBpZiAo cnYgIT0gQVBSX1NVQ0NFU1MpIHsKCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0df RVJSLCBydiwgciwKCQkgICAgICAibW9kX3NwZWN3ZWI6IGFwX3Bhc3NfYnJpZ2FkZSBmYWls ZWQgZm9yIGJ1ZmZlciAnJXMnIiwKCQkgICAgICBidWYpOwogICAgfQp9CQkJCS8qIHJldHVy bkhUTUxQYWdlV2l0aEJ1ZmZlciAqLwoKc3RhdGljIHZvaWQgcmV0dXJuSFRNTFBhZ2VXaXRo TWVzc2FnZShyZXF1ZXN0X3JlYyAqciwgY2hhciAqZm10LC4uLikKewogICAgdmFfbGlzdCBh cmdzOwogICAgY2hhciAqbTsKCiAgICB2YV9zdGFydChhcmdzLCBmbXQpOwogICAgbSA9IGFw cl9wdnNwcmludGYoci0+cG9vbCwgZm10LCBhcmdzKTsKICAgIHZhX2VuZChhcmdzKTsKCiAg ICByZXR1cm5IVE1MUGFnZVdpdGhCdWZmZXIociwgbSk7Cn0JCQkJLyogcmV0dXJuSFRNTFBh Z2VXaXRoTWVzc2FnZSAqLwoKc3RhdGljIHZvaWQgcmV0dXJuSFRNTFBhZ2VXaXRoRmlsZShy ZXF1ZXN0X3JlYyAqciwgY2hhciAqZm5hbWUpCnsKICAgIGNoYXIgKmJwX2hlYWQ7CiAgICBz dHJ1Y3QgYXByX2ZpbmZvX3QgczsKICAgIGFwcl9maWxlX3QgKmY7CiAgICBhcHJfc3RhdHVz X3QgcnY7CiAgICBhcHJfYnVja2V0X2JyaWdhZGUgKmJiOwogICAgYXByX2J1Y2tldCAqYjEs ICpiMiwgKmIzOwogICAgYXByX29mZl90IHplcm8gPSAwOwogICAgY29ubl9yZWMgKmMgPSBy LT5jb25uZWN0aW9uOwoKICAgIGlmICgocnYgPSBhcHJfc3RhdCgmcywgZm5hbWUsIEFQUl9G SU5GT19TSVpFLCByLT5wb29sKSkgIT0gQVBSX1NVQ0NFU1MpIHsKCWFwX2xvZ19lcnJvcihB UExPR19NQVJLLCBBUExPR19FUlIsIHJ2LCByLT5zZXJ2ZXIsCgkJICAgICAiQ291bGQgbm90 IHN0YXQgZmlsZSAnJXMnIGZvciByZWFkaW5nIiwgZm5hbWUpOwoJcmV0dXJuSFRNTFBhZ2VX aXRoTWVzc2FnZShyLCAiRXJyb3I6IEZhaWxlZCB0byBzdGF0IHRoZSBmaWxlIik7CglyZXR1 cm47CiAgICB9CgogICAgYnBfaGVhZCA9IHJldHVybkhUTUxQYWdlSGVhZChyLCBzLnNpemUp OwoKICAgIGlmIChyLT5oZWFkZXJfb25seSkgCglyZXR1cm47CgogICAgYjEgPSBhcHJfYnVj a2V0X3RyYW5zaWVudF9jcmVhdGUoYnBfaGVhZCwgc3RybGVuKGJwX2hlYWQpLCBjLT5idWNr ZXRfYWxsb2MpOwoKICAgIGlmICgocnYgPQoJIGFwcl9maWxlX29wZW4oJmYsIGZuYW1lLCBB UFJfUkVBRCwgQVBSX09TX0RFRkFVTFQsCgkJICAgICAgIHItPnBvb2wpKSAhPSBBUFJfU1VD Q0VTUykgewoJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgcnYsIHItPnNl cnZlciwKCQkgICAgICJDb3VsZCBub3Qgb3BlbiBmaWxlICclcycgZm9yIHJlYWRpbmciLCBm bmFtZSk7CglyZXR1cm5IVE1MUGFnZVdpdGhNZXNzYWdlKHIsICJFcnJvcjogY291bGQgbm90 IG9wZW4gZmlsZSBmb3IgcmVhZGluZy4iKTsKCXJldHVybjsKICAgIH0KCiAgICBiYiA9IGFw cl9icmlnYWRlX2NyZWF0ZShyLT5wb29sLCBjLT5idWNrZXRfYWxsb2MpOwojaWYgQVBSX0hB U19MQVJHRV9GSUxFUwogICAgaWYgKHMuc2l6ZSA+IEFQX01BWF9TRU5ERklMRSkgewoJLyoK CSAqIEFQUl9IQVNfTEFSR0VfRklMRVMgaXNzdWU7IG11c3Qgc3BsaXQgaW50byBtdXRpcGxl IGJ1Y2tldHMsIG5vCgkgKiBncmVhdGVyIHRoYW4gTUFYKGFwcl9zaXplX3QpLCBhbmQgbW9y ZSBncmFudWxhciB0aGFuIHRoYXQgaW4gY2FzZQoJICogdGhlIGJyaWdhZGUgY29kZS9maWx0 ZXJzIGF0dGVtcHQgdG8gcmVhZCBpdCBkaXJlY3RseS4KCSAqLwoJYXByX29mZl90IGZzaXpl ID0gcy5zaXplOwoJYiA9IGFwcl9idWNrZXRfZmlsZV9jcmVhdGUoZiwgemVybywgQVBfTUFY X1NFTkRGSUxFLCByLT5wb29sKTsKCXdoaWxlIChmc2l6ZSA+IEFQX01BWF9TRU5ERklMRSkg ewoJICAgIEFQUl9CUklHQURFX0lOU0VSVF9UQUlMKGJiLCBiKTsKCSAgICBhcHJfYnVja2V0 X2NvcHkoYiwgJmIpOwoJICAgIGItPnN0YXJ0ICs9IEFQX01BWF9TRU5ERklMRTsKCSAgICBm c2l6ZSAtPSBBUF9NQVhfU0VOREZJTEU7Cgl9CgliLT5sZW5ndGggPSAoYXByX3NpemVfdCkg ZnNpemU7CS8qIFJlc2l6ZSBqdXN0IHRoZSBsYXN0IGJ1Y2tldCAqLwogICAgfQogICAgZWxz ZQojZW5kaWYKCWIyID0gYXByX2J1Y2tldF9maWxlX2NyZWF0ZShmLCB6ZXJvLCAoYXByX3Np emVfdCkgKHMuc2l6ZSksCgkJCQkgICAgci0+cG9vbCwgYy0+YnVja2V0X2FsbG9jKTsKICAg IGIzID0gYXByX2J1Y2tldF9pbW1vcnRhbF9jcmVhdGUoYm9pbGVycGxhdGVfZW5kLCAKCQkJ CSAgICBib2lsZXJwbGF0ZV9lbmRfbGVuLCBjLT5idWNrZXRfYWxsb2MpOwoKICAgIEFQUl9C UklHQURFX0lOU0VSVF9UQUlMKGJiLCBiMSk7CiAgICBBUFJfQlJJR0FERV9JTlNFUlRfVEFJ TChiYiwgYjIpOwogICAgQVBSX0JSSUdBREVfSU5TRVJUX1RBSUwoYmIsIGIzKTsKICAgIEFQ Ul9CUklHQURFX0lOU0VSVF9UQUlMKGJiLCBhcHJfYnVja2V0X2Vvc19jcmVhdGUoYy0+YnVj a2V0X2FsbG9jKSk7CgogICAgcnYgPSBhcF9wYXNzX2JyaWdhZGUoci0+b3V0cHV0X2ZpbHRl cnMsIGJiKTsKICAgIGlmIChydiAhPSBBUFJfU1VDQ0VTUykgewoJYXBfbG9nX3JlcnJvcihB UExPR19NQVJLLCBBUExPR19FUlIsIHJ2LCByLAoJCSAgICAgICJtb2Rfc3BlY3dlYjogYXBf cGFzc19icmlnYWRlIGZhaWxlZCBmb3IgJXMiLCBmbmFtZSk7CiAgICB9Cn0JCQkJLyogcmV0 dXJuSFRNTFBhZ2VXaXRoRmlsZSAqLwoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogY2hlY2tV UEZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBhcHJfaW50MTZfdAogICAg ICAgY2hlY2tVUEZpbGUoc3RydWN0IHNlcnZlcl9yZWMgKnN2LCBzdHJ1Y3QgcmVxdWVzdF9y ZWMgKnIsCgkJICAgICAgICAgIHN0cnVjdCBzcGVjd2ViOTlfbW9kdWxlX2RhdGEgKiBfbXkp CnsKICAgIGFwcl9maW5mb190IHM7CiAgICBhcHJfc3RhdHVzX3QgcnY7CiAgICBhcHJfZmls ZV90ICpmOwogICAgYXByX2ludDE2X3QgbnVtcmVjb3JkcywgdXBfdWlkOwogICAgaW50IGUg PSAwOwogICAgY2hhciB1cF9yZWNvcmRbVVBSTEVOR1RIICsgMV07CiAgICAvKiBzdGF0IGl0 LCBjb21wYXJlIHRvIHN0b3JlZCBzdGF0ICovCiAgICBhcHJfdGltZV90IG5vdzsKCiAgICBu b3cgPSB0aW1lKE5VTEwpOwogICAgaWYoX215LT5jaGVjayA9PSBub3cpIAoJcmV0dXJuIDA7 CiAgICBfbXktPmNoZWNrID09IG5vdzsKCiAgICBpZiAoKHJ2ID0gYXByX3N0YXQoJnMsIF9t eS0+dXBfcGF0aCwKCQkgICAgICAgQVBSX0ZJTkZPX1NJWkUgfCBBUFJfRklORk9fTVRJTUUs CgkJICAgICAgIHItPnBvb2wpKSAhPSBBUFJfU1VDQ0VTUykgewoJYXBfbG9nX2Vycm9yKEFQ TE9HX01BUkssIEFQTE9HX0VSUiwgcnYsIHN2LAoJCSAgICAgIkNvdWxkIG5vdCBzdGF0IFVz ZXIuUGVyc29uYWxpdHkgZmlsZSAnJXMnIiwKCQkgICAgIF9teS0+dXBfcGF0aCk7CglyZXR1 cm4gMTsKICAgIH07CgogICAgaWYgKHMubXRpbWUgPT0gX215LT51cF9sYXN0bW9kKSB7Cgly ZXR1cm4gMDsKICAgIH0KCiAgICBudW1yZWNvcmRzID0gcy5zaXplIC8gVVBSTEVOR1RIOwog ICAgLyoKICAgICAqIENoZWNrIGJ1ZmZlciBhcnJheSBmb3IgbnVsbG5lc3MgYW5kIGJpZ25l c3MsIG1ha2UgaWYgbmVjZXNzYXJ5LgogICAgICovCiAgICBpZiAoKF9teS0+dXAgPT0gTlVM TCkgfHwgKG51bXJlY29yZHMgPiBfbXktPnVwX2NvdW50KSkgewoJLyogVXNlciBwZXJzb25h bGl0aWVzIGFyZSBvbmx5IDMyIGJpdHMgKHNhZCwgcmVhbGx5KSAqLwoJYXByX3Bvb2xfY2xl YXIoX215LT51cF9wb29sKTsKCV9teS0+dXAgPSBhcHJfcGFsbG9jKF9teS0+dXBfcG9vbCwg bnVtcmVjb3JkcyAqIHNpemVvZih1X2ludDMyX3QpKTsKCV9teS0+dXBfY291bnQgPSBudW1y ZWNvcmRzOwogICAgfQogICAgLyoKICAgICAqIG9wZW4gdGhlIGZpbGUsIHdpdGggbWVtb3J5 IGZyb20gdGhlIHJlcXVlc3QgcG9vbCBiZWNhdXNlIHdlIHdpbGwKICAgICAqIG5vdCBuZWVk IGl0IHZlcnkgbG9uZy4KICAgICAqLwogICAgaWYgKChydiA9IGFwcl9maWxlX29wZW4oJmYs IF9teS0+dXBfcGF0aCwKCQkJICAgIEFQUl9SRUFELCBBUFJfT1NfREVGQVVMVCwKCQkJICAg IHItPnBvb2wpKSAhPSBBUFJfU1VDQ0VTUykgewoJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkss IEFQTE9HX0VSUiwgcnYsIHN2LAoJCSAgICAgIkNvdWxkIG5vdCBvcGVuIFVzZXIuUGVyc29u YWxpdHkgZmlsZSAnJXMnIiwKCQkgICAgIF9teS0+dXBfcGF0aCk7CglyZXR1cm4gMTsKICAg IH0KCiAgICBpZiAoX3Jsb2NrKHN2LCByLCBmLCBfbXktPnVwX3BhdGgpKSB7CglhcF9sb2df ZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBydiwgc3YsCgkJICAgICAiRmFpbGVkIHRv IGxvY2sgVXNlci5QZXJzb25hbGl0eSBmaWxlICclcyciLAoJCSAgICAgX215LT51cF9wYXRo KTsKCWFwcl9maWxlX2Nsb3NlKGYpOwoJcmV0dXJuIDE7CiAgICB9CgogICAgLyogUmVhZCBl dmVyeSByZWNvcmQsIHBhcnNlLCBwdXQgdXNlciBkZW1vZ3JhcGhpY3MgaW4gYXJyYXkgKi8K ICAgIHVwX3VpZCA9IDA7CiAgICB3aGlsZSAoMSkgewoJaW50IGlkLCBkZW07CglhcHJfc2l6 ZV90IGw7CgoJaWYgKChydiA9CgkgICAgIGFwcl9maWxlX3JlYWRfZnVsbChmLCB1cF9yZWNv cmQsIFVQUkxFTkdUSCwgJmwpKSAhPSBBUFJfU1VDQ0VTUykKCSAgICBicmVhazsKCgl1cF9y ZWNvcmRbVVBSTEVOR1RIXSA9ICdcMCc7CgoJaWYgKHNzY2FuZih1cF9yZWNvcmQsICIlZCAl eCIsICZpZCwgJmRlbSkgIT0gMikgewoJICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBB UExPR19FUlIsIHJ2LCBzdiwKCQkJICJjb3JydXB0ZWQgZW50cnkgaW4gVVAgZmlsZSIpOwoJ ICAgIGUgPSAxOwoJfQoKCWlmICh1cF91aWQgIT0gaWQpIHsKCSAgICBhcF9sb2dfZXJyb3Io QVBMT0dfTUFSSywgQVBMT0dfRVJSLCBydiwgc3YsCgkJCSAidXNlciBpZCBvdXQgb2Ygc3lu YyBpbiBVUCBmaWxlIik7CgkgICAgZSA9IDE7Cgl9CgoJX215LT51cFt1cF91aWRdID0gZGVt OwoJdXBfdWlkKys7CiAgICB9CgogICAgaWYgKCh1cF91aWQgIT0gbnVtcmVjb3JkcykgJiYg KHJ2ICE9IEFQUl9TVUNDRVNTKSkgewoJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9H X0VSUiwgcnYsIHN2LAoJCSAgICAgIkZhaWxlZCByZWFkIGZyb20gVXNlci5QZXJzb25hbGl0 eSBmaWxlICclcyciLAoJCSAgICAgX215LT51cF9wYXRoKTsKCWUrKzsKICAgIH0KCiAgICBp ZiAoYXByX2ZpbGVfdW5sb2NrKGYpICE9IEFQUl9TVUNDRVNTKSB7CglhcF9sb2dfZXJyb3Io QVBMT0dfTUFSSywgQVBMT0dfRVJSLCBydiwgc3YsCgkJICAgICAiRmFpbGVkIHRvIHVubG9j ayBVc2VyLlBlcnNvbmFsaXR5IGZpbGUgJyVzJyIsCgkJICAgICBfbXktPnVwX3BhdGgpOwoJ ZSA9IDE7CiAgICB9OwoKICAgIC8qIENsb3NlIGZpbGUgKi8KICAgIGFwcl9maWxlX2Nsb3Nl KGYpOwoKICAgIC8qIFN0b3JlIGxhc3QgbW9kaWZpZWQgZGF0ZSBhc3N1bWluZyBubyBlcnJv cnMuICovCiAgICBpZiAoZSkKCV9teS0+dXBfbGFzdG1vZCA9IDA7CiAgICBlbHNlCglfbXkt PnVwX2xhc3Rtb2QgPSBzLm10aW1lOwoKICAgIHJldHVybiBlOwp9CgoKLyoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqCiAqIGNoZWNrQ0FERmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKgogKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMg YXByX2ludDE2X3QKY2hlY2tDQURGaWxlKHN0cnVjdCBzZXJ2ZXJfcmVjICpzdiwgc3RydWN0 IHJlcXVlc3RfcmVjICpyLAoJICAgICBzdHJ1Y3Qgc3BlY3dlYjk5X21vZHVsZV9kYXRhICog X215KQp7CiAgICBhcHJfZmluZm9fdCBzOwogICAgYXByX3N0YXR1c190IHJ2OwogICAgc2l6 ZV90IG51bXJlY29yZHM7CiAgICBhcHJfZmlsZV90ICpmOwogICAgY2hhciBjYWRsaW5lW0NB RFJMRU5HVEhdOwogICAgYXByX3VpbnQxNl90IGNhZF91aWQ7CiAgICBpbnQgZSA9IDA7CiAg ICBhcHJfdGltZV90IG5vdzsKCiAgICBub3cgPSB0aW1lKE5VTEwpOwogICAgaWYoX215LT5j aGVjayA9PSBub3cpIAoJcmV0dXJuIDA7CiAgICBfbXktPmNoZWNrID09IG5vdzsKCiAgICAv KiBTdGF0IGl0LCBjb21wYXJlIHRvIHN0b3JlZCBtb2RpZmljYXRpb24gdGltZSAqLwoKICAg IGlmICgocnYgPQoJIGFwcl9zdGF0KCZzLCBfbXktPmNhZF9wYXRoLCBBUFJfRklORk9fU0la RSB8IEFQUl9GSU5GT19NVElNRSwKCQkgIHItPnBvb2wpKSAhPSBBUFJfU1VDQ0VTUykgewoJ YXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgcnYsIHN2LAoJCSAgICAgIkZh aWxlZCB0byBzdGF0IENBRCBmaWxlICclcyciLCBfbXktPmNhZF9wYXRoKTsKCXJldHVybiAx OwogICAgfTsKCiAgICBpZiAocy5tdGltZSA9PSBfbXktPmNhZF9sYXN0bW9kKSB7CglyZXR1 cm4gMDsKICAgIH0KCiAgICAvKgogICAgICogTmVlZCB0byByZWFkIGZpbGUgaW50byBtZW1v cnkgLSBhbmQgcmUtYWxsb2NhdGUgdGhlIGFycmF5IGlmIHRoZQogICAgICogc2l6ZSBoYXMg Y2hhbmdlZC4KICAgICAqLwogICAgbnVtcmVjb3JkcyA9IHMuc2l6ZSAvIENBRFJMRU5HVEg7 CiAgICBpZiAobnVtcmVjb3JkcyA+IF9teS0+Y2FkX2NvdW50KSB7CglhcHJfcG9vbF9jbGVh cihfbXktPmNhZF9wb29sKTsKCV9teS0+Y2FkID0KCSAgICBhcHJfcGFsbG9jKF9teS0+Y2Fk X3Bvb2wsIG51bXJlY29yZHMgKiBzaXplb2Yoc3RydWN0IGNhZHJlYykpOwoJX215LT5jYWRf Y291bnQgPSBudW1yZWNvcmRzOwogICAgfQoKICAgIGlmICgocnYgPSBhcHJfZmlsZV9vcGVu KCZmLCBfbXktPmNhZF9wYXRoLAoJCQkgICAgQVBSX1JFQUQsIEFQUl9PU19ERUZBVUxULAoJ CQkgICAgci0+cG9vbCkpICE9IEFQUl9TVUNDRVNTKSB7CglhcF9sb2dfZXJyb3IoQVBMT0df TUFSSywgQVBMT0dfRVJSLCBydiwgc3YsCgkJICAgICAiRmFpbGVkIHRvIG9wZW4gQ0FEIGZp bGUgJyVzJyIsIF9teS0+Y2FkX3BhdGgpOwoJcmV0dXJuIDE7CiAgICB9OwoKICAgIGlmIChf cmxvY2soc3YsIHIsIGYsIF9teS0+Y2FkX3BhdGgpKSB7CglhcF9sb2dfZXJyb3IoQVBMT0df TUFSSywgQVBMT0dfRVJSLCBydiwgc3YsCgkJICAgICAiRmFpbGVkIHRvIGxvY2sgQ0FEIGZp bGUgJyVzJyIsIF9teS0+Y2FkX3BhdGgpOwoJcmV0dXJuIDE7CiAgICB9CgogICAgY2FkX3Vp ZCA9IDA7CiAgICB3aGlsZSAoY2FkX3VpZCA8IG51bXJlY29yZHMpIHsKCWludCBpZCwgZGVt LCBhZHcsIGFkbSwgZXhwOwoJYXByX3NpemVfdCBsOwoJaWYgKChydiA9CgkgICBhcHJfZmls ZV9yZWFkX2Z1bGwoZiwgY2FkbGluZSwgQ0FEUkxFTkdUSCwgJmwpKSAhPSBBUFJfU1VDQ0VT UykgewoJICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHJ2LCBzdiwK CQkJICJGYWlsZWQgdG8gcmVhZCBmcm9tIENBRCBmaWxlICclcyciLCBfbXktPmNhZF9wYXRo KTsKCSAgICBlID0gMTsKCSAgICBicmVhazsKCX07CgkvKgoJICogRGVjb2RlIEFEIGZpbGUg KHNlZSBzcGVjd2ViIHBhZ2UgLi4pCgkgKgoJICogMDEyMzQ1Njc4OS4xMjM0NTY3ODkuMTIz NDU2Nzg5LjEyMzQ1Njc4IDAxMjM0IDAxMjM0NTY3IDAxMjM0NTY3CgkgKiAwMTIgMDEyMzQ1 Njc4OW4gIiU1ZCAlOFggJThYICUzZCAlMTBkXG4iLCBBZF9pZCwKCSAqIEFkRGVtb2dyYXBo aWNzLCBXZWlnaHRpbmdzLCBNaW5pbXVtX01hdGNoX1ZhbHVlLAoJICogRXhwaXJhdGlvbl9U aW1lCgkgKgoJICovCglpZiAoc3NjYW5mKGNhZGxpbmUsICIlZCAleCAleCAlZCAlZCIsICZp ZCwgJmRlbSwgJmFkdywgJmFkbSwgJmV4cCkgIT0KCSAgICA1KSB7CgkgICAgYXBfbG9nX2Vy cm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgcnYsIHN2LAoJCQkgIkVudHJ5IENBRCBmaWxl IGNvcnJ1cHRlZCIpOwoJICAgIGNvbnRpbnVlOwoJfQoKCWlmIChjYWRfdWlkICE9IGlkKSB7 CgkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgcnYsIHN2LAoJCQkg IkVudHJ5IENBRCBmaWxlIElkIyBvdXQgb2Ygc3luYyIpOwoJICAgIGNvbnRpbnVlOwoJfQoJ X215LT5jYWRbY2FkX3VpZF0uYWRkZW1vZ3JhcGhpY3MgPSBkZW07CglfbXktPmNhZFtjYWRf dWlkXS5nZW5fd2VpZ2h0aW5ncyA9IChhZHcgJiAweDAwZjAwMDApID4+IDE2OwoJX215LT5j YWRbY2FkX3VpZF0uYWdlX3dlaWdodGluZ3MgPSAoYWR3ICYgMHgwMDBmMDAwKSA+PiAxMjsK CV9teS0+Y2FkW2NhZF91aWRdLnJlZ193ZWlnaHRpbmdzID0gKGFkdyAmIDB4MDAwMGYwMCkg Pj4gODsKCV9teS0+Y2FkW2NhZF91aWRdLmludDFfd2VpZ2h0aW5ncyA9IChhZHcgJiAweDAw MDAwZjApID4+IDQ7CglfbXktPmNhZFtjYWRfdWlkXS5pbnQyX3dlaWdodGluZ3MgPSAoYWR3 ICYgMHgwMDAwMDBmKTsKCV9teS0+Y2FkW2NhZF91aWRdLm1pbmltdW1fbWF0Y2hfdmFsdWUg PSBhZG07CglfbXktPmNhZFtjYWRfdWlkXS5leHBpcmF0aW9uX3RpbWUgPSBleHA7CgljYWRf dWlkKys7CiAgICB9CgogICAgaWYgKGFwcl9maWxlX3VubG9jayhmKSAhPSBBUFJfU1VDQ0VT UykgewoJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgcnYsIHN2LAoJCSAg ICAgIkZhaWxlZCB0byB1bmxvY2sgdGhlIENBRCBmaWxlICclcyciLCBfbXktPmNhZF9wYXRo KTsKCWUgPSAxOwogICAgfTsKCiAgICBhcHJfZmlsZV9jbG9zZShmKTsKCiAgICBpZiAoZSkK CV9teS0+Y2FkX2xhc3Rtb2QgPSAwOwogICAgZWxzZQoJX215LT5jYWRfbGFzdG1vZCA9IHMu bXRpbWU7CgogICAgcmV0dXJuIGU7Cn0KCnN0YXRpYyB2b2lkICpzcGVjd2ViOTlfc2VydmVy X2NyZWF0ZShhcHJfcG9vbF90ICogcCwgc2VydmVyX3JlYyAqcykKewogICAgc3RydWN0IHNw ZWN3ZWI5OV9tb2R1bGVfZGF0YSAqX215OwogICAgX215ID0gKHN0cnVjdCBzcGVjd2ViOTlf bW9kdWxlX2RhdGEgKikKCWFwcl9wY2FsbG9jKHAsIHNpemVvZihzdHJ1Y3Qgc3BlY3dlYjk5 X21vZHVsZV9kYXRhKSk7CgogICAgX215LT51cF9sYXN0bW9kID0gKGFwcl90aW1lX3QpIDBM OwogICAgX215LT5jYWRfbGFzdG1vZCA9IChhcHJfdGltZV90KSAwTDsKCiAgICBfbXktPnVw ID0gTlVMTDsKICAgIF9teS0+Y2FkID0gTlVMTDsKCiAgICBfbXktPnVwX2NvdW50ID0gMDsK ICAgIF9teS0+Y2FkX2NvdW50ID0gMDsKCiAgICByZXR1cm4gKHZvaWQgKikgX215Owp9Cgpz dGF0aWMgaW50IHNwZWN3ZWI5OV9tb2R1bGVfaW5pdChhcHJfcG9vbF90ICogcCwKCQkgICAg ICAgYXByX3Bvb2xfdCAqIHBsb2csIGFwcl9wb29sX3QgKiBwdGVtcCwgc2VydmVyX3JlYyAq cykKewogICAgYXBfYWRkX3ZlcnNpb25fY29tcG9uZW50KHAsIE5BTUUgIi8iIFZFUlNJT04p OwoKICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19JTkZPIHwgQVBMT0dfTk9F UlJOTywgMCwgcywKCQkgTkFNRSAiLyIgVkVSU0lPTiAiIG1vZHVsZTogQ29tcGlsZWQgb24g JXMgYXQgJXMiLCBfX0RBVEVfXywKCQkgX19USU1FX18pOwoKICAgIGFwX2xvZ19lcnJvcihB UExPR19NQVJLLCBBUExPR19JTkZPIHwgQVBMT0dfTk9FUlJOTywgMCwgcywgIiVzIiwKCSAg ICAiJElkOiBtb2Rfc3BlY3dlYjk5LmMsdiAxLjMgMjAwMi8wNC8xNyAyMToxNjoxMSBzY3Rl bW1lIEV4cCAkIik7CgogICAgcmV0dXJuIDA7Cn0JCQkJLyogc3BlY3dlYjk5X21vZHVsZV9p bml0ICovCgpzdGF0aWMgdm9pZCBzcGVjd2ViOTlfY2hpbGRfaW5pdChhcHJfcG9vbF90ICog cCwgc2VydmVyX3JlYyAqcykKewogICAgc3RydWN0IHNwZWN3ZWI5OV9tb2R1bGVfZGF0YSAq X215ID0KCWFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsICZzcGVjd2Vi OTlfbW9kdWxlKTsKICAgIHN0cnVjdCByZXF1ZXN0X3JlYyByOwogICAgY29uc3QgY2hhciAq ZG9jcm9vdDsKCiAgICByLnNlcnZlciA9IHM7CiAgICBkb2Nyb290ID0gYXBfZG9jdW1lbnRf cm9vdCgmcik7CgogICAgX215LT5jaGVjayA9IDA7CiAgICBfbXktPnVwX3BhdGggPSBhcF9t YWtlX2Z1bGxfcGF0aChwLCBkb2Nyb290LCAiVXNlci5QZXJzb25hbGl0eSIpOwogICAgX215 LT5jYWRfcGF0aCA9IGFwX21ha2VfZnVsbF9wYXRoKHAsIGRvY3Jvb3QsICJDdXN0b20uQWRz Iik7CiAgICBfbXktPmxvZ19wYXRoID0gYXBfbWFrZV9mdWxsX3BhdGgocCwgZG9jcm9vdCwg InBvc3QubG9nIik7CiAgICBfbXktPnVwZmdlbjk5ID0gYXBfbWFrZV9mdWxsX3BhdGgocCwg ZG9jcm9vdCwgInVwZmdlbjk5Iik7CiAgICBfbXktPmNhZGdlbjk5ID0gYXBfbWFrZV9mdWxs X3BhdGgocCwgZG9jcm9vdCwgImNhZGdlbjk5Iik7CgogICAgaWYgKGFwcl9wb29sX2NyZWF0 ZSgmKF9teS0+dXBfcG9vbCksIHApICE9IEFQUl9TVUNDRVNTKQoJZXhpdChBUEVYSVRfQ0hJ TERGQVRBTCk7CgogICAgaWYgKGFwcl9wb29sX2NyZWF0ZSgmKF9teS0+Y2FkX3Bvb2wpLCBw KSAhPSBBUFJfU1VDQ0VTUykKCWV4aXQoQVBFWElUX0NISUxERkFUQUwpOwoKICAgIGlmIChz LT5uZXh0KSB7CglmcHJpbnRmKHN0ZGVyciwKCQkiV0FSTklORy0gdGhpcyBzcGVjd2ViIG1v ZHVsZSBjdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydCB2aG9zdHMvc2VydmljZXNcbiIKCQki U2VlICVzOiVkIGZvciB3aGF0IHlvdSBuZWVkIHRvIGNoYW5nZS4gVGhlIHNlcnZlciB3aWxs IGNvbnRpbnVlIGFuZCBhc3N1bWVcbiIKCQkidGhlIGNvbmZpZyBvZiB0aGUgYmFzZSBzZXJ2 ZXJcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyArIDIpOwoKCS8qCgkgKiBSaWdodCBub3cgd2Ug YXNzdW1lIHlvdSBhcmUgc3BlY3dlYmJpbmcgYSB3aG9sZSBzZXJ2ZXIgaW5zdGFsbCAtCgkg KiBhcyBvcHBvc2VkIHRvIGEgaG9zdDpwb3J0OnByb3RvY29sIGluc3RhbmNlIHRpZWQgdG8g YSB2aXJ0dWFsCgkgKiBzZXJ2aWNlLgoJICoKCSAqIFRvIHN1cHBvcnQgdmhvc3RzIC0gdGhl IF9teSBtb2R1bGUgY29uZmlnIG5lZWRzIHNpbXBseSB0byBiZSBtb3ZlZCB0bwoJICogdGhl IHBlciBzZXJ2ZXIgY29uZmlnIGJsb2NrIChvciB0aGUgcGVyIGRpciBibG9jaykgYW5kIHRo ZSBpbml0CgkgKiBhbmQvb3IgYW55IGFjY2VzcyB0byBpdCBuZWVkIHRvIGVpdGhlciBnbyB0 aHJvdWdoIHRoZSAtPm54dCBsaXN0CgkgKiBPUiBjYXJlZnVsbCBvdmVybGF5IG1lcmdpbmcg bmVlZHMgdG8gYmUgZG9uZSB0byBhIHNlbnNpYmxlIGRlZmF1bHQKCSAqIGZvciBlYWNoIG9m IHRoZSBjYXNlcy4gVGhlIGN1cnJlbnQgc2ltcGxpc3RpYyAnZG9jcm9vdCcgcmVmZXJlbmNl cwoJICogYXJlIHByb3BhYmx5IG5vIGxvbmdlciBnb2luZyB0byB3b3JrIGFuZCB3aWxsIG5l ZWQgZXhwbGljaXQgY29uZmlnCgkgKiAoZS5nLiB0aGluayB+dXNlciBhbmQgb3RoZXIgcmVk aXJlY3QgY2FzZXMgd2l0aCBjbG9iYmVyIHRoZQoJICogY29uY2VwdCBvZiBhIGRvY3Jvb3Qp LgoJICovCiAgICB9Owp9CQkJCS8qIHNwZWN3ZWI5OV9tb2R1bGVfaW5pdCAqLwoKCnN0YXRp YyBpbnQgc3BlY3dlYjk5X2hrX2hhbmRsZXIocmVxdWVzdF9yZWMgKnIpCnsKICAgIHN0cnVj dCBzcGVjd2ViOTlfbW9kdWxlX2RhdGEgKl9teSA9CglhcF9nZXRfbW9kdWxlX2NvbmZpZyhy LT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsICZzcGVjd2ViOTlfbW9kdWxlKTsKICAgIGFwcl9m aWxlX3QgKmY7CiAgICBjaGFyICpkYXRhLCAqa2V5LCAqdmFsLCAqbGluZSAgPSAiPHVuc2V0 PiI7CiAgICBhcHJfdGFibGVfdCAqdGFiOwogICAgYXByX3N0YXR1c190IHJ2OwogICAgY29u c3QgY2hhciAqbWF4bG9hZCwgKm1heHRocmVhZCwgKnBvaW50dGltZSwgKnVybHJvb3Q7CiAg ICBjaGFyICpleHAsICpyb290ZGlyLCAqc2F2ZWFyZ3M7CiAgICBjaGFyICpjbWQxLCAqY21k MiwgKmM7CiAgICBpbnQgIGNtZDFyZXMsIGNtZDJyZXM7CiAgICBjb25zdCBjaGFyICpkb2Ny b290ID0gYXBfZG9jdW1lbnRfcm9vdChyKTsKICAgIGFwcl91cmlfdCB1cmxyb290cmVjOwkv KiBUbyBwYXJzZSB0aGUgdXJscm9vdCBzdHJpbmcgaW50byAqLwoKICAgIGlmIChzdHJjbXAo ci0+aGFuZGxlciwgInNwZWN3ZWI5OWhrIikpCglyZXR1cm4gREVDTElORUQ7CgogICAgaWYg KHN0cnN0cihyLT5hcmdzLCAiY29tbWFuZC9GZXRjaCIpICE9IE5VTEwpIHsKCXJldHVybkhU TUxQYWdlV2l0aEZpbGUociwgX215LT5sb2dfcGF0aCk7CglyZXR1cm4gT0s7CiAgICB9CiAg ICBlbHNlIGlmICgoZGF0YSA9IHN0cnN0cihyLT5hcmdzLCAiY29tbWFuZC9SZXNldCIpKSkg ewoJLyoKCSAqIFdlIGFyZSBzbGVlcGluZyBhdCBsZWFzdCBvbmUgc2Vjb25kIC0gdG8gbWFr ZSBzdXJlIHRoYXQgYW55CgkgKiBmc3RhdCgpIG9uIG10aW1lIHdpbGwgYWN0dWFsbHkgeWVp bGQgZGlmZmVyZW50IHZhbHVlcyAtIG5vIG1hdHRlcgoJICogaG93IGNsb3NlbHkgc3BhY2Vk IHRoZSBSZXNldCdzIGFyZSBpc3N1ZWQuIChpbiBwYXJ0aWN1bGFyIHRoZQoJICogc3BhY2lu ZyBiZXR3ZWVuIHRoZSB0ZXN0IHJlc2V0IGZvcm0gdGhlIG1hbmFnZXIgYW5kIHRoZSByZXNl dCBhdAoJICogdGhlIGNvbW1lbmNpbmcgLSB3aGljaCBub3JtYWxseSBjYW4gYmUgd2l0aGlu IGEgc2Vjb25kIC0gdGh1cwoJICogaGF2aW5nIGlkZW50aWNhbCBtdGltZSdzIG9uIHBsYXRm b3JtcyB3aXRoIHNlY29uZCBncmFudWFhcml0eQoJICogKFNvbGFyaXMsTG51eCkuCgkgKi8K CWFwcl9zbGVlcCgyKTsKCgkvKgoJICogMSAwMTIzNDU2Nzg5MDEyMzQKCSAqIGNvbW1hbmQv UmVzZXQmbWF4bG9hZD1bTWF4TG9hZF0mcHR0aW1lPVtQb2ludFRpbWVdJm1heHRocmVhZHM9 WwoJICogTWF4VGhyZWFkc10mZXhwPVtFeHBpcmVkTGlzdF0mdXJscm9vdD1bVXJsUm9vdF0K CSAqLwoJZGF0YSArPSAxNDsJCS8qIHBvc2l0aW9uIGF0IHN0YXJ0IG9mIGFyZ3VtZW50IHN0 cmluZyAqLwoJLyogVG9rZW5pemUgYXJndW1lbnQgc3RyaW5nICovCgl0YWIgPSBhcHJfdGFi bGVfbWFrZShyLT5wb29sLCAwKTsKCgl3aGlsZSAoKmRhdGEgJiYgKHZhbCA9IGFwX2dldHdv cmQoci0+cG9vbCwKCQkJCQkgIChjb25zdCBjaGFyICoqKSAmZGF0YSwgJyYnKSkpIHsKCSAg ICBrZXkgPSBhcF9nZXR3b3JkKHItPnBvb2wsIChjb25zdCBjaGFyICoqKSAmdmFsLCAnPScp OwoJICAgIGFwX3VuZXNjYXBlX3VybChrZXkpOwoJICAgIGFwX3VuZXNjYXBlX3VybCh2YWwp OwoJICAgIGFwcl90YWJsZV9zZXQodGFiLCBrZXksIHZhbCk7Cgl9CgkvKiBQdXQgYXJndW1l bnRzIGluIHZhcmlhYmxlcyAqLwoJbWF4bG9hZCA9IGFwcl90YWJsZV9nZXQodGFiLCAibWF4 bG9hZCIpOwoJcG9pbnR0aW1lID0gYXByX3RhYmxlX2dldCh0YWIsICJwdHRpbWUiKTsKCS8q CgkgKiBUaGUgUnVuIFJ1bGVzIHBzZXVkb2NvZGUgaXMgYW1iaXZhbGVudCBhYm91dCB0aGlz IHRva2VuIG5hbWU6IHRoZQoJICogcHNldWRvY29kZSBzYXlzICdtYXh0aHJlYWRzJyBidXQg aXRzIHRlc3QgY29tbWFuZCBhIGNvdXBsZSBvZgoJICogbGluZXMgZG93biBzYXlzICdtYXh0 aHJlYWQnLiBBc2lkZSBmcm9tIHRoZSBxdWVzdGlvbiB3aGV0aGVyIHdlCgkgKiBzaG91bGQg YXQgYWxsIHBheSBhdHRlbnRpb24gdG8gdGhlIHRva2VuIG5hbWVzLCBJJ20gZ29pbmcgYWxv bmcKCSAqIHdpdGggd2hhdCB0aGUgbWFuYWdlciBzY3JpcHQgc2VuZHMgd2hpY2ggaXMgJ21h eHRocmVhZCcuCgkgKi8KCW1heHRocmVhZCA9IGFwcl90YWJsZV9nZXQodGFiLCAibWF4dGhy ZWFkIik7CgoJLyoKCSAqIE9LLCB0aGlzIHZleGVzIG1lLiBFdmVyeSBzaHJlZCBvZiBkb2N1 bWVudGF0aW9uIGFib3V0IFNQRUNXZWIKCSAqIHNwZWFrcyBvZiBhIGNvbW1hLXNlcGFyYXRl ZCBsaXN0IG9mIGV4cGlyZWQgYWRzLCBidXQgdGhlIGNhZGdlbjk5CgkgKiBwcm9ncmFtIHNl Z2ZhdWx0cyBpZiB5b3UgcGFzcyBhbnl0aGluZyBidXQgYSB3aGl0ZXNwYWNlLSBzZXBhcmF0 ZWQKCSAqIGxpc3QuIFRoZSBSdW4gUnVsZXMgZXhwbGljaXRseSBzdGF0ZSB0aGF0IHRoZSBw c2V1ZG8gY29kZSBpcyB0aGUKCSAqIGRlZmluaXRpdmUgUmVmZXJlbmNlIEJ5IFdoaWNoIFRo aXMgTW9kdWxlIFNoYWxsIEJlIENvZGVkLCB5ZXQgSQoJICogaGFkIHRvIHlhbmsgdGhlIGZv bGxvd2luZyBnZW0gZnJvbSB0aGUgcGVybCBzY3JpcHQ6CgkgKi8KCWV4cCA9IGFwcl9wc3Ry ZHVwKHItPnBvb2wsIGFwcl90YWJsZV9nZXQodGFiLCAiZXhwIikpOwoJZm9yKGM9ZXhwOypj O2MrKykKCSAgICBpZigqYyA9PSAnLCcpICpjID0gJyAnOwoKCXVybHJvb3QgPSBhcHJfdGFi bGVfZ2V0KHRhYiwgInVybHJvb3QiKTsKCgkvKgoJICogUHJlcDogd2UgZ290IGEgVVJJIGZy b20gdGhlIHJlcXVlc3QuIE5lZWQgdG8gcGFyc2UgdGhhdCwgZXh0cmFjdAoJICogdGhlIGxv Y2FsIHBhcnQgYW5kIHRhY2sgdGhhdCBvbnRvIGRvY3Jvb3QuCgkgKi8KCWlmICgocnYgPQoJ ICAgICBhcHJfdXJpX3BhcnNlKHItPnBvb2wsIHVybHJvb3QsICZ1cmxyb290cmVjKSkgIT0g QVBSX1NVQ0NFU1MpIHsKCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9F UlJOTywgcnYsIHItPnNlcnZlciwKCQkJICJUaGUgVVJMIFJvb3QgJyVzJyB3YXMgaW52YWxp ZCIsIHVybHJvb3QpOwoJICAgIHJldHVybkhUTUxQYWdlV2l0aE1lc3NhZ2UociwgIlRoZSBV cmxSb290IHBhc3NlZCB3YXMgaW52YWxpZCIpOwoJICAgIHJldHVybiBPSzsKCX0KICAgICAg ICBpZiAoIXVybHJvb3RyZWMucGF0aCkgewogICAgICAgICAgICB1cmxyb290cmVjLnBhdGgg PSAiIjsKICAgICAgICB9Cglyb290ZGlyID0gYXBfb3NfZXNjYXBlX3BhdGgoci0+cG9vbCwK CQkJCSAgICBhcF9tYWtlX2Z1bGxfcGF0aChyLT5wb29sLAoJCQkJCQkgICAgICBkb2Nyb290 LAoJCQkJCQkgICAgICB1cmxyb290cmVjLnBhdGgpLCAwKTsKCgkvKiBDYWxsIHVwZmdlbiBh bmQgY2FkZ2VuICovCgkvKgoJICogS2VlcCByZXF1ZXN0IGFyZ3VtZW50cyBhcm91bmQsIHdl IG5lZWQgdGhlbSBmb3IgZXZlbnR1YWwgcmVzcG9uc2UKCSAqLwoJc2F2ZWFyZ3MgPSBhcHJf cHN0cmR1cChyLT5wb29sLCByLT5hcmdzKTsKCgljbWQxID0gYXByX3BzcHJpbnRmKHItPnBv b2wsICIlcyAtQyAlcyAtbiAlcyAtdCAlcyIsCgkgICAgX215LT51cGZnZW45OSwgZG9jcm9v dCwgbWF4bG9hZCwgbWF4dGhyZWFkKTsKCglpZigoY21kMXJlcyA9IHN5c3RlbShjbWQxKSkg IT0gMCkgCgkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBB UExPR19FUlIsIDAsIHItPnNlcnZlciwKCQkiQ2FsbCBmYWlsZWQgJWQ9JXMiLGNtZDFyZXMs Y21kMSk7CgllbHNlCgkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJS Tk8gfCBBUExPR19ERUJVRywgMCwgci0+c2VydmVyLAoJCSJDYWxsZWQgJXMiLGNtZDEpOwoK CWNtZDIgPSBhcHJfcHNwcmludGYoci0+cG9vbCwgIiVzIC1DICVzIC1lICVzIC10ICVzICVz IiwKCSAgICBfbXktPmNhZGdlbjk5LCBkb2Nyb290LCBwb2ludHRpbWUsIG1heHRocmVhZCwg ZXhwKTsKCgljbWQycmVzID0gc3lzdGVtKGNtZDIpOwoKCWlmKChjbWQxcmVzID0gc3lzdGVt KGNtZDIpKSAhPSAwKSAKCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9F UlJOTyB8IEFQTE9HX0VSUiwgMCwgci0+c2VydmVyLAoJCSJDYWxsIGZhaWxlZCAlZD0lcyIs Y21kMnJlcyxjbWQyKTsKCWVsc2UKCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBM T0dfTk9FUlJOTyB8IEFQTE9HX0RFQlVHLCAwLCByLT5zZXJ2ZXIsCgkJIkNhbGxlZCAlcyIs Y21kMik7CgoJci0+YXJncyA9IHNhdmVhcmdzOwoJLyoKCSAqIFJlc2V0IHBvc3QubG9nIGku ZS4gVHJ1bmNhdGUsIG9wZW4gZm9yIHdyaXRpbmcKCSAqLwoJaWYgKChydiA9CgkgICAgIGFw cl9maWxlX29wZW4oJmYsIF9teS0+bG9nX3BhdGgsIAoJCQkgICBBUFJfV1JJVEUgfCBBUFJf Q1JFQVRFIHwgQVBSX1RSVU5DQVRFLAoJCQkgICBBUFJfT1NfREVGQVVMVCwgci0+cG9vbCkp ICE9IEFQUl9TVUNDRVNTKSB7CgkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9H X0VSUiwgcnYsIHItPnNlcnZlciwKCQkJICJDb3VsZCBub3Qgb3BlbiBwb3N0LmxvZyAnJXMn IGZvciB3cml0aW5nIiwKCQkJIF9teS0+bG9nX3BhdGgpOwoJICAgIHJldHVybkhUTUxQYWdl V2l0aE1lc3NhZ2UociwKCQkJICAgICAgIkVycm9yOiBjb3VsZG4ndCBvcGVuIHBvc3QubG9n IGZvciB3cml0aW5nLiIpOwoJICAgIHJldHVybiBPSzsKCX0KCglsaW5lID0gYXByX3BzcHJp bnRmKHItPnBvb2wsICIlMTBkXG4iLCAwKTsKCglpZiAoYXByX2ZpbGVfd3JpdGVfZnVsbChm LCBsaW5lLCBzdHJsZW4obGluZSksIE5VTEwpICE9IEFQUl9TVUNDRVNTKSB7CgkgICAgYXBf bG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgcnYsIHItPnNlcnZlciwKCQkJICJD b3VsZCBub3Qgd3JpdGUgdG8gcG9zdC5sb2cgJyVzJyIsIF9teS0+bG9nX3BhdGgpOwoJICAg IHJldHVybkhUTUxQYWdlV2l0aE1lc3NhZ2UociwKCQkJCSAgICAgICJFcnJvcjogY291bGQg bm90IHdyaXRlIHRvIHBvc3QubG9nLiIpOwoJfQoJZWxzZSB7CgkgICAgcmV0dXJuSFRNTFBh Z2VXaXRoTWVzc2FnZShyLCAiJXNcbiVkXG4lc1xuJWRcbiIsCgkJY21kMSxjbWQxcmVzLGNt ZDIsY21kMnJlcyk7Cgl9CgoJYXByX2ZpbGVfY2xvc2UoZik7CgoJcmV0dXJuIE9LOwogICAg fQkJCQkvKiBSZXNldCBDb21tYW5kICovCgogICAgLyogRmFsbCB0aHJvdWdoICovCiAgICBy ZXR1cm5IVE1MUGFnZVdpdGhNZXNzYWdlKHIsICJFcnJvcjogdW5yZWNvZ25pemVkIGNvbW1h bmQgJyVzJyIsIHItPmFyZ3MpOwogICAgcmV0dXJuIE9LOwp9CgoKLyoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqCiAqIHNwZWN3ZWI5OV9nZXRfaGFuZGxlciAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgaW50 IHNwZWN3ZWI5OV9nZXRfaGFuZGxlcihyZXF1ZXN0X3JlYyAqcikKewogICAgY2hhciAqcGF0 aDsKICAgIGNvbnN0IGNoYXIgKmRvY3Jvb3QgPSBhcF9kb2N1bWVudF9yb290KHIpOwoKICAg IGlmIChzdHJjbXAoci0+aGFuZGxlciwgInNwZWN3ZWI5OWdldCIpKQoJcmV0dXJuIERFQ0xJ TkVEOwogICAgLyoKICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSB0ZXN0ZWQgZm9yIGV2ZXJ5 IHJlcXVlc3QuIEV2ZW50dWFsbHksIHRoaXMgY29kZQogICAgICogd2lsbCBmaW5kIGl0cyB3 YXkgdG8gdGhlIGhvdXNla2VlcGluZyBjb21tYW5kIGhhbmRsZXIsIGJ1dCB0aGF0IGRvZXMK ICAgICAqIG5vdCBleGlzdCB5ZXQuCiAgICAgKi8KCiAgICBpZihyLT5hcmdzID09IE5VTEwp IHsKICAgICAgICByZXR1cm5IVE1MUGFnZVdpdGhNZXNzYWdlKHIsIkVycm9yOiBObyBmaWxl IGFyZ3VtZW50IHByb3ZpZGVkIik7CiAgICAgICAgcmV0dXJuIE9LOwogICAgfQoKICAgIC8q CiAgICAgKiBDb25zdHJ1Y3QgdGhlIHBhdGggdG8gb3VyIGZpbGUuIE5vdGUgdGhhdCB1c2lu ZyBhcF9kb2N1bWVudF9yb290KCkgaXMKICAgICAqIG5vdCBzZW5hbmcuIEkgc2hvdWxkIGRv IHRoaXMgYSBzdWJyZXF1ZXN0IGJ1dCBPVE9IIHRoYXQgd291bGQgdGFrZQogICAgICogdGlt ZSBhbmQgd2UgZG9uJ3QgaGF2ZSB0aW1lLgogICAgICovCiAgICBwYXRoID0gYXBfbWFrZV9m dWxsX3BhdGgoci0+cG9vbCwgZG9jcm9vdCwgci0+YXJncyk7CiAgICByZXR1cm5IVE1MUGFn ZVdpdGhGaWxlKHIsIHBhdGgpOwoKICAgIHJldHVybiBPSzsKfQkJCQkvKiBzcGVjd2ViOTlf Z2V0X2hhbmRsZXIgKi8KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGN1c3RvbWFkc2NhbiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgY2FkZHJfdCBjdXN0b21hZHNjYW4ocmVx dWVzdF9yZWMgKnIsIGNoYXIgKmZuYW1lLCBpbnQxNl90IGFkaWQpCnsKICAgIHN0cnVjdCBh cHJfZmluZm9fdCBzOwogICAgYXByX3N0YXR1c190IHJ2OwogICAgYXByX2ludDE2X3QgaTsK ICAgIGFwcl9maWxlX3QgKmY7CiAgICBhcHJfc2l6ZV90IGxlbiwgbDsKICAgIGNoYXIgKmJ1 ZjsKICAgIGNoYXIgKmluZGV4LCAqTiwgKlgsICpZOwoKICAgIE4gPSBhcHJfcHNwcmludGYo ci0+cG9vbCwgIiUwNWQiLCBhZGlkIC8gMzYpOwogICAgWCA9IGFwcl9wc3ByaW50ZihyLT5w b29sLCAiJTFkIiwgKGFkaWQgJSAzNikgLyA5KTsKICAgIFkgPSBhcHJfcHNwcmludGYoci0+ cG9vbCwgIiUxZCIsIGFkaWQgJSA5KTsKCiAgICBpZiAoKHJ2ID0gYXByX3N0YXQoJnMsIGZu YW1lLCBBUFJfRklORk9fU0laRSwgci0+cG9vbCkpICE9IEFQUl9TVUNDRVNTKQoJcmV0dXJu IE5VTEw7CgogICAgaWYgKChydiA9CgkgYXByX2ZpbGVfb3BlbigmZiwgZm5hbWUsIEFQUl9S RUFELCBBUFJfT1NfREVGQVVMVCwKCQkgICAgICAgci0+cG9vbCkpICE9IEFQUl9TVUNDRVNT KQoJcmV0dXJuIE5VTEw7CgogICAgbGVuID0gcy5zaXplOwogICAgYnVmID0gYXByX3BhbGxv YyhyLT5wb29sLCBsZW4gKyAxKTsKCiAgICBpZiAoKChydiA9IGFwcl9maWxlX3JlYWRfZnVs bChmLCBidWYsIGxlbiwgJmwpKSAhPSBBUFJfU1VDQ0VTUykKCXx8IChsICE9IGxlbikpCgly ZXR1cm4gTlVMTDsJCS8qIEVycm9yIG9uIHJlYWQgKi8KCiAgICBidWZbbGVuXSA9ICdcMCc7 CQkvKiBOdWxsLXRlcm1pbmF0ZSBpdCBzbyB0aGF0IGV2ZXJ5Ym9keSBlbHNlCgkJCQkgKiB3 aG8gaGFzIHRvIGhhbmRsZSB0aGlzIGtub3dzIGhvdyBsb25nIHRoZQoJCQkJICogYnVmZmVy IGlzLiAqLwogICAgaW5kZXggPSBidWY7CiAgICAvKgogICAgICogSXQgc2F5cyBpbiB0aGUg cnVuIHJ1bGVzIHRoYXQgd2UgYXJlIHRvIHNjYW4gdW50aWwgdGhlIGVuZCBvZiB0aGUKICAg ICAqIGZpbGUuLi4gd2hhdCBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBvY2N1cnJlbmNl IG9mIHRoZSBhZCAoY29tbW9uCiAgICAgKiBkaXNlYXNlIG9uIHRvZGF5cyB3ZWIgcGFnZXMp PwogICAgICovCiAgICB3aGlsZSAoKGluZGV4ID0gc3Ryc3RyKGluZGV4LCBNQVJLRVIpKSAh PSBOVUxMKSB7CgkvKiBUaGlzIGxhbmRzIHVzIGEgbmV3IGluZGV4ICovCi8qIDwhV0VCOTlD QUQ+PElNRyBTUkM9Ii9maWxlX3NldC9kaXJOTk5OTi9jbGFzc1hfWSI+CiAqIDAxMjM0NTY3 ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5CiAqICAgICAgICAg ICAxICAgICAgICAgMiAgICAgICAgIDMgICAgICAgICA0ICAgICAgICAgICovCglmb3IgKGkg PSAwOyBpIDwgNTsgaSsrKSB7CgkgICAgKihpbmRleCArIDM0ICsgaSkgPSBOW2ldOwoJfQoJ KihpbmRleCArIDQ1KSA9ICpYOwoJKihpbmRleCArIDQ3KSA9ICpZOwoJaW5kZXggKz0gNTA7 CQkvKiBQdXQgdGhlIGluZGV4IHBhc3QgdGhpcyBtYXJrZXIsIGNvbnRpbnVlCgkJCQkgKiBz Y2FubmluZyAqLwogICAgfQogICAgcmV0dXJuIGJ1ZjsKCn0JCQkJLyogY3VzdG9tYWRzY2Fu ICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqCiAqIHNwZWN3ZWI5OV9jYWRnZXRfaGFuZGxlciAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKiovCgpzdGF0aWMgaW50IHNwZWN3ZWI5OV9jYWRnZXRfaGFuZGxlcihyZXF1ZXN0 X3JlYyAqcikKewogICAgc3RydWN0IHNwZWN3ZWI5OV9tb2R1bGVfZGF0YSAqX215ID0KICAg IGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgJnNwZWN3 ZWI5OV9tb2R1bGUpOwogICAgY2hhciAqY29va2llX2luLCAqY29va2llX291dCwgKmVuZDsK ICAgIGNvbnN0IGNoYXIgKmRvY3Jvb3QgPSBhcF9kb2N1bWVudF9yb290KHIpOwogICAgY2hh ciAqZmlsZW5hbWU7CiAgICBpbnQxNl90IG15X3VzZXIsIGxhc3RfYWQsIHVzZXJpbmRleCwg YWRpbmRleCwgZXhwaXJlZCA9IDA7CiAgICB1X2ludDMyX3QgdXNlcmRlbW9ncmFwaGljcywg Y29tYmluZWRkZW1vZ3JhcGhpY3M7CS8qIGl0J3MgYSBiaXRtYXAgKi8KICAgIHVfaW50MTZf dCBhZF93ZWlnaHQ7CgogICAgaWYgKHN0cmNtcChyLT5oYW5kbGVyLCAic3BlY3dlYjk5Y2Fk Z2V0IikpCglyZXR1cm4gREVDTElORUQ7CiAgICAvKgogICAgICogVGhpcyBzaG91bGQgbm90 IGJlIHRlc3RlZCBmb3IgZXZlcnkgcmVxdWVzdC4gRXZlbnR1YWxseSwgdGhpcyBjb2RlCiAg ICAgKiB3aWxsIGZpbmQgaXRzIHdheSB0byB0aGUgaG91c2VrZWVwaW5nIGNvbW1hbmQgaGFu ZGxlciwgYnV0IHRoYXQgZG9lcwogICAgICogbm90IGV4aXN0IHlldC4KICAgICAqLwogICAg LyogR2V0IHRoZSBjb29raWUgKi8KICAgIGNvb2tpZV9pbiA9IChjaGFyICopIGFwcl90YWJs ZV9nZXQoci0+aGVhZGVyc19pbiwgIkNvb2tpZSIpOwojaWZkZWYgREVCVUcKICAgIHNwZWN3 ZWI5OV9kZWJ1ZyhyLT5zZXJ2ZXIsIGFwX3BzcHJpbnRmKHItPnBvb2wsCgkJCQkJIkdvdCBj YWRnZXQgcmVxdWVzdCwgY29va2llIGlzOiAlcyIsCgkJCQkJICAgY29va2llX2luKSk7CiNl bmRpZgoKICAgIC8qCiAgICAgKiBYWFggQWdhaW4sIGFwX2RvY3VtZW50X3Jvb3QgaXMgZGVw cmVjYXRlZC4gSSBzaG91bGQgcHJvYmFibHkgZmluZCB0aGUKICAgICAqIGRvY3VtZW50IHJv b3QgaW4gbXkgaW5pdCBoYW5kbGVyIGFuZCBrZWVwIGl0IGFyb3VuZC4KICAgICAqLwogICAg ZmlsZW5hbWUgPSBhcF9tYWtlX2Z1bGxfcGF0aChyLT5wb29sLCBkb2Nyb290LCByLT5hcmdz KTsKCiNpZmRlZiBERUJVRwogICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05P RVJSTk8gfCBBUExPR19ERUJVRywgci0+c2VydmVyLAoJCSAiRnVsbCBwYXRoIGlzICclcyci LCBmaWxlbmFtZSk7CiNlbmRpZgoKICAgIC8qCiAgICAgKiBQYXJzZSBDb29raWUgc3RyaW5n IGludG8gTXlVc2VyIGFuZCBMYXN0X0FkLiBUaGUgZm9ybWF0IG9mIHRoZSBjb29raWUKICAg ICAqIGlzIGFzIGZvbGxvd3MgKHRoZSBvcmRlciBvZiBrZXlzIGFuZCB2YWx1ZXMgaXMgZml4 ZWQpOiAxICAgICAgICAgMiAzIDQKICAgICAqIDUgMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIz NDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5CiAgICAgKiBteV9jb29raWU9 dXNlcl9pZD1bTXlVc2VyXSZsYXN0X2FkPVtMYXN0X2FkXQogICAgICovCiAgICBpZiAoIWNv b2tpZV9pbikgewoJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiB8IEFQTE9H X05PRVJSTk8sIDAsIHItPnNlcnZlciwKCQkgICAgICJFcnJvcjogZXhwZWN0ZWQgY29va2ll IGJ1dCBmb3VuZCBub25lIik7CglyZXR1cm5IVE1MUGFnZVdpdGhNZXNzYWdlKHIsICJFcnJv cjogZXhwZWN0ZWQgY29va2llIGJ1dCBmb3VuZCBub25lIik7CglyZXR1cm4gSFRUUF9JTlRF Uk5BTF9TRVJWRVJfRVJST1I7CiAgICB9CQkJCS8qIElzIHRoZXJlIGEgY29va2llICovCgog ICAgLyogUGFyc2UgdGhlIGluY29taW5nIENvb2tpZSBkYXRhICovCiAgICAvKiBGb3JtYXQg b2YgaW5wdXQ6IHVzZXJfaWQ9PHg+Jmxhc3RfYWQ9PHk+ICovCiAgICBteV91c2VyID0gc3Ry dG9sKGNvb2tpZV9pbiArIDE4LCAmZW5kLCAxMCk7CiAgICBsYXN0X2FkID0gYXRvaShlbmQg KyA5KTsJLyogV2UgdHJ1c3QgdGhhdCB0aGVyZSBpcyBzb21ldGhpbmcgYmVoaW5kCgkJCQkg KiB0aGUgbGFzdF9hZCB2YWx1ZSB0byBzdG9wIHRoZSBjb252ZXJzaW9uICovCiNpZmRlZiBE RUJVRwogICAgc3BlY3dlYjk5X2RlYnVnKHItPnNlcnZlciwgYXBfcHNwcmludGYoci0+cG9v bCwKCQkJCQkiVXNlcklEOiAlZCwgTGFzdEFkOiAlZCwgVmFsaWQ6ICVzIiwKCQkJCQkgICBt eV91c2VyLAoJCQkJCSAgIGxhc3RfYWQsCgkJCQkJICAgKGNvb2tpZV9pbiA9PQoJCQkJCSAg ICBlbmQpID8gIm5vIiA6ICJ5ZXMiKSk7CiNlbmRpZgoKICAgIC8qCiAgICAgKiBDYWxjdWxh dGUgVXNlckluZGV4IGludG8gVXNlci5QZXJzb25hbGl0eSBmaWxlIFVzZXJJbmRleCA9IE15 VXNlciAtCiAgICAgKiAxMDAwMAogICAgICovCiAgICB1c2VyaW5kZXggPSBteV91c2VyIC0g MTAwMDA7CgogICAgLyoKICAgICAqIEZpbmQgVXNlci5QZXJzb25hbGl0eSByZWNvcmQgdXNp bmcgVXNlckluZGV4CiAgICAgKi8KCiAgICBpZiAoY2hlY2tVUEZpbGUoci0+c2VydmVyLCBy LCBfbXkpKSB7CglhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSIHwgQVBMT0df Tk9FUlJOTywgMCwgci0+c2VydmVyLAoJCSAgICAgIlVzZXIgcGVyc29uYWxpdHkgY2hlY2sg ZmFpbGVkLiIpOwoJcmV0dXJuSFRNTFBhZ2VXaXRoTWVzc2FnZShyLAoJCQkgICAgICAiRXJy b3I6IFVzZXIgcGVyc29uYWxpdHkgZmlsZSBjaGVjayBmYWlsZWQuIik7CglyZXR1cm4gSFRU UF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CiAgICB9CgogICAgaWYgKHVzZXJpbmRleCA8IDAg fHwgdXNlcmluZGV4ID49IF9teS0+dXBfY291bnQpIHsKCS8qIENvdWxkbid0IGZpbmQgaXQs IHNvIGxldCdzIG1ha2Ugb3VyIG1hcmsgYW5kIGxlYXZlICovCiNpZmRlZiBERUJVRwoJc3Bl Y3dlYjk5X2RlYnVnKHItPnNlcnZlciwgIlVzZXIgcmVjb3JkIG5vdCBmb3VuZCIpOwojZW5k aWYKCXJldHVybkhUTUxQYWdlV2l0aE1lc3NhZ2UociwKCSAgICAgICJVc2VyIFJlY29yZCAl ZCBub3QgZm91bmQgKG91dCBvZiBteSBjdXJyZW50IHJhbmdlICVkIC4uICVkKSIsCgkJCQkg IHVzZXJpbmRleCArIDEwMDAwLCAxMDAwMCwKCQkJCSAgX215LT51cF9jb3VudCArIDEwMDAw IC0gMSk7CglhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSIHwgQVBMT0dfTk9F UlJOTywgMCwgci0+c2VydmVyLAoJICAgICAgIlVzZXIgUmVjb3JkICVkIG5vdCBmb3VuZCAo b3V0IG9mIG15IGN1cnJlbnQgcmFuZ2UgJWQgLi4gJWQpIiwKCQkgICAgIHVzZXJpbmRleCAr IDEwMDAwLCAxMDAwMCwgX215LT51cF9jb3VudCArIDEwMDAwIC0gMSk7CglyZXR1cm4gT0s7 CiAgICB9CgogICAgdXNlcmRlbW9ncmFwaGljcyA9IF9teS0+dXBbdXNlcmluZGV4XTsKCiAg ICBpZiAoY2hlY2tDQURGaWxlKHItPnNlcnZlciwgciwgX215KSkgewoJcmV0dXJuSFRNTFBh Z2VXaXRoTWVzc2FnZShyLCAiRXJyb3I6IEFkIGZpbGUgY2hlY2sgZmFpbGVkLiIpOwoJYXBf bG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiB8IEFQTE9HX05PRVJSTk8sIDAsIHIt PnNlcnZlciwKCQkgICAgICJBZCBmaWxlIGNoZWNrIGZhaWxlZCIpOwoJcmV0dXJuIEhUVFBf SU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgfQoKICAgIGFkaW5kZXggPSAobGFzdF9hZCAr IDEpICUgMzYwOwovKgogICAgRG8gRm9yIEVhY2ggQWQgaW4gQ3VzdG9tLkFkcyBzdGFydGlu ZyB3aGVyZSBBZF9pbmRleCA9PSBBZF9pZAoqLwogICAgd2hpbGUgKDEpIHsKLyogICAgICAg IENvbWJpbmVkRGVtb2dyYXBoaWNzID0gKCBBZERlbW9ncmFwaGljcyAmIFVzZXJEZW1vZ3Jh cGhpY3MgKSAqLwoJY29tYmluZWRkZW1vZ3JhcGhpY3MgPQoJICAgIChfbXktPmNhZFthZGlu ZGV4XS5hZGRlbW9ncmFwaGljcykgJiB1c2VyZGVtb2dyYXBoaWNzOwovKiAgICAgICAgQWRf d2VpZ2h0ID0gMCAqLwoJYWRfd2VpZ2h0ID0gMDsKCWlmIChjb21iaW5lZGRlbW9ncmFwaGlj cyAmIEdFTkRFUl9NQVNLKSB7CgkgICAgYWRfd2VpZ2h0ICs9IF9teS0+Y2FkW2FkaW5kZXhd Lmdlbl93ZWlnaHRpbmdzOwoJfQoJaWYgKGNvbWJpbmVkZGVtb2dyYXBoaWNzICYgQUdFX0dS T1VQX01BU0spIHsKCSAgICBhZF93ZWlnaHQgKz0gX215LT5jYWRbYWRpbmRleF0uYWdlX3dl aWdodGluZ3M7Cgl9CglpZiAoY29tYmluZWRkZW1vZ3JhcGhpY3MgJiBSRUdJT05fTUFTSykg ewoJICAgIGFkX3dlaWdodCArPSBfbXktPmNhZFthZGluZGV4XS5yZWdfd2VpZ2h0aW5nczsK CX0KCWlmIChjb21iaW5lZGRlbW9ncmFwaGljcyAmIElOVEVSRVNUMV9NQVNLKSB7CgkgICAg YWRfd2VpZ2h0ICs9IF9teS0+Y2FkW2FkaW5kZXhdLmludDFfd2VpZ2h0aW5nczsKCX0KCWlm IChjb21iaW5lZGRlbW9ncmFwaGljcyAmIElOVEVSRVNUMl9NQVNLKSB7CgkgICAgYWRfd2Vp Z2h0ICs9IF9teS0+Y2FkW2FkaW5kZXhdLmludDJfd2VpZ2h0aW5nczsKCX0KCWlmIChhZF93 ZWlnaHQgPj0gX215LT5jYWRbYWRpbmRleF0ubWluaW11bV9tYXRjaF92YWx1ZSkgewoJICAg IGJyZWFrOwoJfQoJYWRpbmRleCA9IChhZGluZGV4ICsgMSkgJSAzNjA7CglpZiAoYWRpbmRl eCA9PSBsYXN0X2FkKSB7CgkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VS UiB8IEFQTE9HX05PRVJSTk8sIDAsIHItPnNlcnZlciwKCQkJICJBZCB0byBleHBpcmUgbm90 IGZvdW5kIik7CgkgICAgYnJlYWs7Cgl9CiAgICB9CiAgICBleHBpcmVkID0KCSgodGltZSgo dGltZV90ICopIE5VTEwpID4gX215LT5jYWRbYWRpbmRleF0uZXhwaXJhdGlvbl90aW1lKSkg PyAxIDogMDsKCiAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfSU5GTyB8IEFQ TE9HX05PRVJSTk8sIDAsIHItPnNlcnZlciwKCQkgIkZvdW5kIGFkICVkIDogZXhwaXJlICVz ICglZCA+ICVkKSIsCgkJIGFkaW5kZXgsIGV4cGlyZWQgPyAieWVzIiA6ICJubyIsCgkJIChp bnQpIHRpbWUoKHRpbWVfdCAqKSBOVUxMKSwKCQkgX215LT5jYWRbYWRpbmRleF0uZXhwaXJh dGlvbl90aW1lKTsKCiAgICBjb29raWVfb3V0ID0gYXByX3BzcHJpbnRmKHItPnBvb2wsCgkJ CSAgICAiZm91bmRfY29va2llPUFkX2lkPSVkJkFkX3dlaWdodD0lZCZFeHBpcmVkPSVkIiwK CQkJICAgICAgYWRpbmRleCwgYWRfd2VpZ2h0LCBleHBpcmVkKTsKICAgIGFwcl90YWJsZV9z ZXRuKHItPmhlYWRlcnNfb3V0LCAiU2V0LUNvb2tpZSIsIGNvb2tpZV9vdXQpOwoKICAgIGlm ICgoc3Ryc3RyKGZpbGVuYW1lLCAiY2xhc3MxIikgIT0gTlVMTCkgfHwKCShzdHJzdHIoZmls ZW5hbWUsICJjbGFzczIiKSAhPSBOVUxMKSkgewoJY2FkZHJfdCBidWYgPSBjdXN0b21hZHNj YW4ociwgZmlsZW5hbWUsIGFkaW5kZXgpOwoJcmV0dXJuSFRNTFBhZ2VXaXRoQnVmZmVyKHIs IChjaGFyICopIGJ1Zik7CiAgICB9CiAgICBlbHNlIHsKCXJldHVybkhUTUxQYWdlV2l0aEZp bGUociwgZmlsZW5hbWUpOwogICAgfQogICAgcmV0dXJuIE9LOwp9CgoKc3RhdGljIGNoYXIg Kl9sb2dfYW5kX3dyaXRlKHN0cnVjdCByZXF1ZXN0X3JlYyAqciwgYXByX2ZpbGVfdCAqIGYs CgkJICAgICAgICAgICAgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnVybHJvb3QsIGlu dCBkaXJudW0sCgkJICAgICAgICAgIGludCBjbGFzc251bSwgaW50IGZpbGVudW0sIGludCBj bGllbnRudW0sIGludCB1aWQpCnsKICAgIHBpZF90IHBpZDsKICAgIHRpbWVfdCBzdGFtcDsK ICAgIHVfaW50MzJfdCByZWNudW07CiAgICBjaGFyIHJlY251bXN0clsxMl07CQkvKiB0ZW4g d2lkZSBwbHVzIHJldHVybiBwbHVzIFwwICovCiAgICBhcHJfc2l6ZV90IGw7CiAgICBhcHJf b2ZmX3QgemVybyA9IDA7CiAgICBhcHJfc3RhdHVzX3QgcnY7CgogICAgc3RhbXAgPSB0aW1l KE5VTEwpOwogICAgcGlkID0gZ2V0cGlkKCk7CgogICAgaWYgKChydiA9IGFwcl9maWxlX3Jl YWRfZnVsbChmLCByZWNudW1zdHIsIDExLCAmbCkpICE9IEFQUl9TVUNDRVNTKQoJcmV0dXJu ICJGYWlsZWQgdG8gcmVhZCByZWNvcmRjb3VudCBmcm9tIHBvc3QubG9nIjsKCiAgICByZWNu dW1zdHJbMTFdID0gJ1wwJzsKICAgIHJlY251bSA9IGF0b2wocmVjbnVtc3RyKSArIDE7Cgog ICAgaWYgKChydiA9IGFwcl9maWxlX3NlZWsoZiwgQVBSX1NFVCwgJnplcm8pKSAhPSBBUFJf U1VDQ0VTUykKCXJldHVybiAiRmFpbGVkIHRvIHNlZWsgMCB0byBwb3N0LmxvZyI7CgogICAg aWYgKChydj0oYXByX2ZpbGVfcHJpbnRmKGYsICIlMTBkIiwgcmVjbnVtKSkpIDwgMCkgCgly ZXR1cm4gIkZhaWxlZCB0byB3cml0ZSBudW0gdG8gcG9zdC5sb2ciOwoKICAgIGlmICgocnYg PSBhcHJfZmlsZV9zZWVrKGYsIEFQUl9FTkQsICZ6ZXJvKSkgIT0gQVBSX1NVQ0NFU1MpCgly ZXR1cm4gIkZhaWxlZCB0byBzZWVrIGVuZCB0byBwb3N0LmxvZyI7CgogICAgaWYgKChhcHJf ZmlsZV9wcmludGYKCSAoZiwgIiUxMGQgJTEwZCAlMTBkICU1ZCAlMmQgJTJkICUxMGQgJS02 MC42MHMgJTEwZCAlMTBkXG4iLCByZWNudW0sCgkgIChpbnQpIHN0YW1wLCAoaW50KSBwaWQs IGRpcm51bSwgY2xhc3NudW0sIGZpbGVudW0sIGNsaWVudG51bSwKCSAgZmlsZW5hbWUsIChp bnQpIHBpZCwgdWlkKSkgPCAwKQoJcmV0dXJuICJGYWlsZWQgdG8gd3JpdGUgcmVjb3JkIHRv IHBvc3QubG9nIjsKCiAgICBhcHJfZmlsZV9mbHVzaChmKTsKCiAgICByZXR1cm4gTlVMTDsK fQoKc3RhdGljIGludCBzcGVjd2ViOTlfcG9zdF9oYW5kbGVyKHJlcXVlc3RfcmVjICpyKQp7 CiAgICBzdHJ1Y3Qgc3BlY3dlYjk5X21vZHVsZV9kYXRhICpfbXkgPQogICAgYXBfZ2V0X21v ZHVsZV9jb25maWcoci0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAmc3BlY3dlYjk5X21vZHVs ZSk7CiAgICBjb25zdCBjaGFyICp1cmxyb290ID0gIjxub25lPiI7CiAgICBpbnQgZGlybnVt ID0gMCwgY2xhc3NudW0gPSAwLCBmaWxlbnVtID0gMCwgY2xpZW50bnVtID0gMCwgdWlkID0g MDsKICAgIGNoYXIgKmZpbGVuYW1lOwogICAgaW50IHBvc3RlcnI7CiAgICBjb25zdCBjaGFy ICpjb29raWVfaW47CiAgICBhcHJfZmlsZV90ICpmOwogICAgY2hhciAqZGF0YSA9ICI8bm9u ZT4iOwogICAgY29uc3QgY2hhciAqdHlwZSwgKmRvY3Jvb3Q7CiAgICBjaGFyIGFyZ3NidWZm ZXJbSFVHRV9TVFJJTkdfTEVOXTsKICAgIGludCByc2l6ZSwgbGVuX3JlYWQsIHJwb3MgPSAw OwogICAgbG9uZyBsZW5ndGggPSAwOwogICAgYXByX3N0YXR1c190IHJ2LCBydjI7CgogICAg aWYgKHN0cmNtcChyLT5oYW5kbGVyLCAic3BlY3dlYjk5cG9zdCIpKQoJcmV0dXJuIERFQ0xJ TkVEOwoKICAgIGRvY3Jvb3QgPSBhcF9kb2N1bWVudF9yb290KHIpOwoKLypCZWdpbjoqLwov KiAgICBNYWtlIHN1YnN0aXR1dGlvbnMgaW4gSFRNTCByZXR1cm4gcGFnZSBmb3IgdGhlIGZv bGxvd2luZzoqLwovKiAgICAgICAgU2VydmVyX1NvZnR3YXJlKi8KLyogICAgICAgIFJlbW90 ZV9BZGRyKi8KLyogICAgICAgIFNjcmlwdF9OYW1lKi8KLyogICAgICAgIFF1ZXJ5U3RyaW5n Ki8KLyogVGhlIGFib3ZlIGlzIGRvbmUgaW4gdGhlIHJldHVybkhUTUxQYWdlV2l0aC4uLiBm dW5jdGlvbnMgKi8KCi8qICAgIFBhcnNlIFBvc3RJbnB1dCAtIGEgc2FtcGxlIGZvcm1hdCBp cyBhcyBmb2xsb3dzICovCi8qICAgIChrZXlzIG1heSBiZSByZWNlaXZlZCBpbiBhbnkgb3Jk ZXIpOiovCi8qICAgICAgICB1cmxyb290PVt1cmxyb290XSZkaXI9W0RpciNdJmNsYXNzPVtD bGFzcyNdJm51bT1bRmlsZSNdJmNsaWVudD1bQ2xpZW50I10qLwoKICAgIHR5cGUgPSBhcHJf dGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJDb250ZW50LVR5cGUiKTsKICAgIC8qCiAgICAg KiBTY3JlYW0gaW4gcHJvdGVzdCBpZiB0aGUgdXNlciB1c2VzIHRoZSBicm9rZW4gdmVyc2lv biBvZiBTUEVDV2ViOTkKICAgICAqIG1hbmFnZXIgdGhhdCBkb2Vzbid0IHNlbmQgdGhlIENv bnRlbnQtVHlwZSBoZWFkZXIuIE5vdGUgdGhhdCB0aGlzIG9ubHkKICAgICAqIGFmZmVjdHMg dGhlIHByZS1ydW4gdGVzdHM6IHRoZSByZWd1bGFyIGNsaWVudCBkb2VzIHNlbmQgdGhlIGhl YWRlci4KICAgICAqLwogICAgaWYgKCh0eXBlID09IE5VTEwpIHx8IChzdHJjYXNlY21wKHR5 cGUsIERFRkFVTFRfRU5DVFlQRSkgIT0gMCkpIHsKCWFwX2xvZ19lcnJvcihBUExPR19NQVJL LAoJCSAgICAgQVBMT0dfV0FSTklORyB8IEFQTE9HX05PRVJSTk8sIDAsCgkJICAgICByLT5z ZXJ2ZXIsCgkJICAgICAiVGhlIGNsaWVudCBkaWRuJ3Qgc2VuZCAlcyBhcyBDb250ZW50LVR5 cGUuIFZlcnNpb24gIgoJCSAgICAgIjEuMDIgb2YgdGhlIFNQRUNXZWIgZG9lcyBub3QgZG8g dGhpcyBhbmQgdGh1cyB2aW9sYXRlcyAiCgkJICAgICAidGhlIEhUVFAgc3BlY2lmaWNhdGlv bi4gUGxlYXNlIGFwcGx5IHRoZSBmb2xsb3dpbmcgIgoJCSAgICAgInBhdGNoIHRvIHlvdXIg bWFuYWdlciBzY3JpcHQgYW5kIGJpdGNoIHRvIFNQRUMgdGhhdCAiCgkJICAgICAidGhleSBm aXggdGhpczpcbiVzIiwgREVGQVVMVF9FTkNUWVBFLAoJCSAgICAgU1BFQ19NQU5BR0VSX1BB VENIKTsKCXJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKICAgIH0KCiAgICBp ZiAoYXBfc2V0dXBfY2xpZW50X2Jsb2NrKHIsIFJFUVVFU1RfQ0hVTktFRF9FUlJPUikgIT0g T0spIHsKCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0df RVJSLCAwLCByLT5zZXJ2ZXIsCgkJICAgICAiQ291bGQgbm90IHNldHVwIGNsaWVudCBibG9j ayIpOwoJcmV0dXJuSFRNTFBhZ2VXaXRoTWVzc2FnZShyLCAiQ291bGRuJ3Qgc2V0IHVwIGNs aWVudCBibG9jayIpOwoJcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAg fQoKICAgIGlmICghYXBfc2hvdWxkX2NsaWVudF9ibG9jayhyKSkgewoJYXBfbG9nX2Vycm9y KEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19FUlIsIDAsIHItPnNlcnZlciwK CQkgICAgICJObyBQT1NUIGRhdGEiKTsKCXJldHVybkhUTUxQYWdlV2l0aE1lc3NhZ2Uociwg Ik5vIFBPU1QgZGF0YSIpOwoJcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwog ICAgfQoKICAgIGxlbmd0aCA9IHItPnJlbWFpbmluZzsKCiAgICBkYXRhID0gYXByX3BjYWxs b2Moci0+cG9vbCwgbGVuZ3RoICsgMSk7CgogICAgd2hpbGUgKChsZW5fcmVhZCA9CgkgICAg YXBfZ2V0X2NsaWVudF9ibG9jayhyLCBhcmdzYnVmZmVyLCBzaXplb2YoYXJnc2J1ZmZlcikp KSA+IDApIHsKCWlmICgocnBvcyArIGxlbl9yZWFkKSA+IGxlbmd0aCkgewoJICAgIHJzaXpl ID0gbGVuZ3RoIC0gcnBvczsKCX0KCWVsc2UgewoJICAgIHJzaXplID0gbGVuX3JlYWQ7Cgl9 CgltZW1jcHkoKGNoYXIgKikgZGF0YSArIHJwb3MsIGFyZ3NidWZmZXIsIHJzaXplKTsKCXJw b3MgKz0gcnNpemU7CiAgICB9CgogICAgZGF0YVtsZW5ndGhdID0gJ1wwJzsKCiAgICBwb3N0 ZXJyID0gNTsJCS8qIENvdW50ZXIgdG8gbWFrZSBzdXJlIHdlIGdldCBhbGwgVkFSaWFibGVz CgkJCQkgKiBmcm9tIHRoZSBDR0kgcG9zdCAqLwogICAgd2hpbGUgKGRhdGEpIHsKCWNvbnN0 IGNoYXIgKnAgPSBkYXRhOwoKCWRhdGEgPSBpbmRleChwLCAnJicgLyogMHgyNiAqLyApOwoJ aWYgKGRhdGEgIT0gTlVMTCkKCSAgICAqZGF0YSsrID0gJ1wwJzsKCglpZiAoc3RybmNtcChw LCAidXJscm9vdD0iLCA4KSA9PSAwKSB7CgkgICAgdXJscm9vdCA9IGFwcl9wc3RyZHVwKHIt PnBvb2wsIHAgKyA4KTsKCSAgICBwb3N0ZXJyLS07Cgl9CgllbHNlIGlmIChzdHJuY21wKHAs ICJkaXI9IiwgNCkgPT0gMCkgewoJICAgIGRpcm51bSA9IGF0b2kocCArIDQpOwoJICAgIHBv c3RlcnItLTsKCX0KCWVsc2UgaWYgKHN0cm5jbXAocCwgImNsYXNzPSIsIDYpID09IDApIHsK CSAgICBjbGFzc251bSA9IGF0b2kocCArIDYpOwoJICAgIHBvc3RlcnItLTsKCX0KCWVsc2Ug aWYgKHN0cm5jbXAocCwgIm51bT0iLCA0KSA9PSAwKSB7CgkgICAgZmlsZW51bSA9IGF0b2ko cCArIDQpOwoJICAgIHBvc3RlcnItLTsKCX0KCWVsc2UgaWYgKHN0cm5jbXAocCwgImNsaWVu dD0iLCA3KSA9PSAwKSB7CgkgICAgY2xpZW50bnVtID0gYXRvaShwICsgNyk7CgkgICAgcG9z dGVyci0tOwoJfQogICAgfQogICAgaWYgKHBvc3RlcnIgIT0gMCkgewoJYXBfbG9nX2Vycm9y KEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19FUlIsIDAsCgkJICAgICByLT5z ZXJ2ZXIsICJEaWQgbm90IGdldCBhbGwgUE9TVCBhcmd1bWVudHMiKTsKCXJldHVybkhUTUxQ YWdlV2l0aE1lc3NhZ2UociwgIkRpZCBub3QgZ2V0IGFsbCBQT1NUIGFyZ3VtZW50cyIpOwoJ cmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgfQoKLyogICAgUGFyc2Ug Q29va2llIHN0cmluZyB0byBnZXQgTXlDb29raWUuIFRoZSBmb3JtYXQgaXMgYXMgKi8KLyog ICAgZm9sbG93cyAodGhlIG9yZGVyIG9mIHRoZSBrZXlzIGFuZCB2YWx1ZXMgaXMgZml4ZWQp OiovCiAgICAvKgogICAgICogMSAgICAgICAgIDIgICAgICAgMDEyMzQ1Njc4OTAxMjM0NTY3 ODkwMTIzCiAgICAgKiBteV9jb29raWU9dXNlcl9pZD1bTXlDb29raWVdJmxhc3RfYWQ9W0ln bm9yZWRGaWVsZF0KICAgICAqLwoKICAgIGNvb2tpZV9pbiA9IGFwcl90YWJsZV9nZXQoci0+ aGVhZGVyc19pbiwgIkNvb2tpZSIpOwogICAgaWYgKGNvb2tpZV9pbiA9PSBOVUxMKSB7Cglh cF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0VSUiwgMCwg ci0+c2VydmVyLAoJCSAgICAgIk5vIGNvb2tpZSIpOwoJcmV0dXJuSFRNTFBhZ2VXaXRoTWVz c2FnZShyLCAiSW52YWxpZCBDb29raWUiKTsKCXJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZF Ul9FUlJPUjsKICAgIH0KICAgIHVpZCA9IGF0b2koY29va2llX2luICsgMTgpOwoKLyogIEZp bGVuYW1lID0gW3VybHJvb3RdL2Rpcls1LWRpZ2l0IERpciNdL2NsYXNzW0NsYXNzI11fW0Zp bGUjXSovCi8qICAgICAgICAoZm9yIGV4YW1wbGUsIHRoZSBQT1NUIGlucHV0IG9mICovCi8q ICAgICAgICB1cmxyb290PS9zcGVjd2ViOTkvZmlsZV9zZXQmZGlyPTAwMTIzJmNsYXNzPTEm bnVtPTEmY2xpZW50PTEwMDAzICovCi8qICAgICAgICB3b3VsZCBtYWtlIEZpbGVuYW1lID0g L3NwZWN3ZWI5OS9maWxlX3NldC9kaXIwMDEyMy9jbGFzczFfMSkqLwoKICAgIGZpbGVuYW1l ID0gYXBfbWFrZV9mdWxsX3BhdGgoci0+cG9vbCwKCQkJCSBkb2Nyb290LCBhcHJfcHNwcmlu dGYoci0+cG9vbCwKCQkJCQkJICAiJXMvZGlyJTA1ZC9jbGFzcyUxZF8lMWQiLAoJCQkJCQkg ICAgICAgdXJscm9vdCwgZGlybnVtLAoJCQkJCQkgICAgICAgY2xhc3NudW0sIGZpbGVudW0p KTsKCiAgICAvKiBEb19hdG9taWNhbGx5IChmb3IgZXhhbXBsZSwgdXNpbmcgYSBmaWxlIGxv Y2sgb3Igb3RoZXIgbXV0ZXgpOiAqLwoKICAgIGlmICgocnYgPSBhcHJfZmlsZV9vcGVuKCZm LCBfbXktPmxvZ19wYXRoLCBBUFJfUkVBRCB8IEFQUl9XUklURSwKCQkJICAgIEFQUl9PU19E RUZBVUxULCByLT5wb29sKSkgIT0gQVBSX1NVQ0NFU1MpIHsKCWFwX2xvZ19lcnJvcihBUExP R19NQVJLLCBBUExPR19FUlIsIHJ2LCByLT5zZXJ2ZXIsCgkJICAgICAiRmFpbGVkIHRvIG9w ZW4gcG9zdC5sb2cgJyVzJyBmb3IgdXBkYXRpbmciLAoJCSAgICAgX215LT5sb2dfcGF0aCk7 CglyZXR1cm5IVE1MUGFnZVdpdGhNZXNzYWdlKHIsCgkJCSAgICAgICAiRmFpbGVkIHRvIG9w ZW4gcG9zdC5sb2cgZmlsZSBmb3IgdXBkYXRpbmciKTsKCXJldHVybiBIVFRQX0lOVEVSTkFM X1NFUlZFUl9FUlJPUjsKICAgIH0KCiAgICBpZiAoKHJ2ID0gX3dsb2NrKHItPnNlcnZlciwg ciwgZiwgX215LT5sb2dfcGF0aCkpICE9IEFQUl9TVUNDRVNTKQoJcmV0dXJuSFRNTFBhZ2VX aXRoTWVzc2FnZShyLCAiRmFpbGVkIHRvIGxvY2sgcG9zdC5sb2cgZmlsZSIpOwogICAgZWxz ZSB7CgljaGFyICptc2cgPQoJX2xvZ19hbmRfd3JpdGUociwgZiwgZmlsZW5hbWUsIHVybHJv b3QsIGRpcm51bSwgY2xhc3NudW0sIGZpbGVudW0sCgkJICAgICAgIGNsaWVudG51bSwgdWlk KTsKCWlmIChtc2cpIHsKCSAgICBydiA9IEFQUl9PU19TVEFSVF9VU0VFUlI7CgkgICAgYXBf bG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgMCwgci0+c2VydmVyLCBtc2cpOwoJ ICAgIHJldHVybkhUTUxQYWdlV2l0aE1lc3NhZ2UociwgbXNnKTsKCX0KICAgIH0KCiAgICBp ZiAoKHJ2MiA9IGFwcl9maWxlX3VubG9jayhmKSkgIT0gQVBSX1NVQ0NFU1MpIHsKCWlmIChy diA9PSBBUFJfU1VDQ0VTUykgewoJICAgIHJ2ID0gcnYyOwoJICAgIGFwX2xvZ19lcnJvcihB UExPR19NQVJLLCBBUExPR19FUlIsIHJ2LCByLT5zZXJ2ZXIsCgkJCSAiRmFpbGVkIHRvIHVu bG9jayAlcyIsIGZpbGVuYW1lID8gZmlsZW5hbWUgOiAiIik7CgkgICAgcmV0dXJuSFRNTFBh Z2VXaXRoTWVzc2FnZShyLCAiRmFpbGVkIHRvIGxvY2sgdW5wb3N0LmxvZyBmaWxlIik7Cgl9 CiAgICB9CgogICAgYXByX2ZpbGVfY2xvc2UoZik7CgogICAgaWYgKHJ2ICE9IEFQUl9TVUND RVNTKQoJcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwkvKiBfbG9nX2FuZF93 cml0ZSgpIHdpbGwgaGF2ZQoJCQkJCQkgKiBkaXNwbGF5ZWQgYSBwYWdlIGFscmVhZHkgKi8K CiAgICBpZiAoKHJ2ID0gYXByX2ZpbGVfb3BlbigmZiwgZmlsZW5hbWUsIEFQUl9SRUFELAoJ CQkgICAgQVBSX09TX0RFRkFVTFQsIHItPnBvb2wpKSAhPSBBUFJfU1VDQ0VTUykgewoJYXBf bG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgcnYsIHItPnNlcnZlciwKCQkgICAg ICJDb3VsZCBub3Qgb3BlbiBGaWxlICclcycgKHBvc3QgaGFuZGxlcikiLCBmaWxlbmFtZSk7 CglyZXR1cm5IVE1MUGFnZVdpdGhNZXNzYWdlKHIsICJDb3VsZCBub3Qgb3BlbiBmaWxlIik7 CglyZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CiAgICB9CgogICAgLyoKICAg ICAqIFhYWFggRklYTUUgLSBjbG9zZSBhbmQgb3BlbiBsYXRlciBjYXVzZSBvZiBBUFIgbm90 IGhhdmluZyBhbiBmc3RhdCgpCiAgICAgKi8KICAgIGFwcl9maWxlX2Nsb3NlKGYpOwoKICAg IC8qCiAgICAgKiBDb29raWVTdHJpbmcgPSAibXlfY29va2llPTxteUNvb2tpZT4iCiAgICAg KiAKICAgICAqIFhYWCAgICBzZWVtcyBmcm9tIGNvZGUgaW5zcGVjdGlvbiB0aGF0IHRoaXMg cmVhbGx5IGlzIG5vdCBzZXR0aW5nIGFnYWluCiAgICAgKiB0aGUgY29va2llIC0gYnV0IGEg Y2hhbmdlIHRoZSBjb29raWUgaXMgdG8gYmUgc2V0IHRvICVkIG9mIHRoZSB1c2VyCiAgICAg KiBudW1iZXIuCiAgICAgKi8KICAgIGFwcl90YWJsZV9zZXRuKHItPmhlYWRlcnNfb3V0LCAi U2V0LUNvb2tpZSIsCgkJICAgYXByX3BzcHJpbnRmKHItPnBvb2wsICJteV9jb29raWU9JWQi LCB1aWQpKTsKCiAgICAvKiAKICAgICAqIFJldHVybiBIVE1MIFBhZ2Ugd2l0aCBGaWxlPSdS b290RGlyL0ZpbGVOYW1lJyBhbmQgQ29va2llPUNvb2tpZVN0cmluZwogICAgICovCiAgICBy ZXR1cm5IVE1MUGFnZVdpdGhGaWxlKHIsIGZpbGVuYW1lKTsKCiAgICByZXR1cm4gT0s7Cn0J CQkJLyogc3BlY3dlYjk5X3Bvc3RfaGFuZGxlciAqLwoKc3RhdGljIHZvaWQgcmVnaXN0ZXJf aG9va3MoYXByX3Bvb2xfdCAqIHApCnsKICAgIGFwX2hvb2tfcG9zdF9jb25maWcoc3BlY3dl Yjk5X21vZHVsZV9pbml0LCBOVUxMLCBOVUxMLCBBUFJfSE9PS19NSURETEUpOwogICAgYXBf aG9va19jaGlsZF9pbml0KHNwZWN3ZWI5OV9jaGlsZF9pbml0LCBOVUxMLCBOVUxMLCBBUFJf SE9PS19NSURETEUpOwoKICAgIGFwX2hvb2tfaGFuZGxlcihzcGVjd2ViOTlfaGtfaGFuZGxl ciwgTlVMTCwgTlVMTCwgQVBSX0hPT0tfTUlERExFKTsKICAgIGFwX2hvb2tfaGFuZGxlcihz cGVjd2ViOTlfZ2V0X2hhbmRsZXIsIE5VTEwsIE5VTEwsIEFQUl9IT09LX01JRERMRSk7CiAg ICBhcF9ob29rX2hhbmRsZXIoc3BlY3dlYjk5X2NhZGdldF9oYW5kbGVyLCBOVUxMLCBOVUxM LCBBUFJfSE9PS19NSURETEUpOwogICAgYXBfaG9va19oYW5kbGVyKHNwZWN3ZWI5OV9wb3N0 X2hhbmRsZXIsIE5VTEwsIE5VTEwsIEFQUl9IT09LX01JRERMRSk7Cgp9Cgptb2R1bGUgQVBf TU9EVUxFX0RFQ0xBUkVfREFUQSBzcGVjd2ViOTlfbW9kdWxlID0gewogICAgU1RBTkRBUkQy MF9NT0RVTEVfU1RVRkYsCiAgICBOVUxMLAkJCS8qIGRpciBjb25maWcgY3JlYXRlciAqLwog ICAgTlVMTCwJCQkvKiBkaXIgbWVyZ2VyIC0tLSBkZWZhdWx0IGlzIHRvIG92ZXJyaWRlICov CiAgICBzcGVjd2ViOTlfc2VydmVyX2NyZWF0ZSwJLyogc2VydmVyIGNvbmZpZyAqLwogICAg TlVMTCwJCQkvKiBtZXJnZSBzZXJ2ZXIgY29uZmlnICovCiAgICBOVUxMLAkJCS8qIGNvbW1h bmQgYXByX3RhYmxlX3QgKi8KICAgIHJlZ2lzdGVyX2hvb2tzCQkvKiByZWdpc3RlciBob29r cyAqLwp9OwoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNwZWN3ZWI5OS0yLjAv bW9kX3NwZWN3ZWI5OS5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNzU1ADAwMDA3NjcAMDAwMDc2 NQAwMDAwMDAxMTUwNQAwNzQ2MzU1NjM3NwAwMTYyMjUAIDAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIABncmVnYW1lcwAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAGdyZWdhbWVzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAALyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBM aWNlbnNlLCBWZXJzaW9uIDEuMQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBUaGUg QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCiAqIHJlc2VydmVkLgog KgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z LCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqCiAqIDEu IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg Y29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICoKICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90 aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp bWVyIGluCiAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg cHJvdmlkZWQgd2l0aCB0aGUKICogICAgZGlzdHJpYnV0aW9uLgogKgogKiAzLiBUaGUgZW5k LXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwK ICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVu dDoKICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQg YnkgdGhlCiAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3 dy5hcGFjaGUub3JnLykuIgogKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVu dCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCiAqICAgIGlmIGFuZCB3aGVy ZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIu CiAqCiAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uIiBtdXN0CiAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBw cm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwogKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9y IHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KICogICAgcGVybWlzc2lvbiwgcGxl YXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCiAqCiAqIDUuIFByb2R1Y3RzIGRlcml2 ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAogKiAg ICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9y IHdyaXR0ZW4KICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5k YXRpb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBB TlkgRVhQUkVTU0VEIE9SIElNUExJRUQKICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg Tk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKICogT0YgTUVSQ0hBTlRB QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKICogRElT Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRB VElPTiBPUgogKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg SU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJP Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgogKiBV U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF UiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAogKiBPUiBUT1JUIChJTkNMVURJTkcgTkVH TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhF IFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM SVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBUaGlzIHNv ZnR3YXJlIHdhcyBjb250cmlidXRlZCBieSBDb3ZhbGVudCBUZWNobm9sb2dpZXMgSW5jLCAK ICogaHR0cDovL3d3dy5jb3ZhbGVudC5uZXQgYXJvdW5kIEFwcmlsIDIwMDAyLgogKgogKiBt b2Rfc3BlY3dlYjk5LmggLS0gSGVhZGVyIGZpbGUgZm9yIEFwYWNoZSBzcGVjd2ViOTkgbW9k dWxlCiAqIHNjdGVtbWUgSnVseSAyMDAxCiAqCiAqIFNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4 dCBmb3IgbGljZW5zZSBpbmZvLgogKgogKiB7IHNjdGVtbWUgfCBkaXJreCB9QHsgYXBhY2hl Lm9yZyB8IGNvdmFsZW50Lm5ldCB9CiAqCiAqLwoKIC8qCiAgKiAhIEBoZWFkZXIgbW9kX3Nw ZWN3ZWI5OSBUaGUgbW9kX3NwZWN3ZWI5OSBtb2R1bGUgaW1wbGVtZW50cyB0aGUgU1BFQ1dl Yjk5CiAgKiBkeW5hbWljIGNvbnRlbnQgcmVxdWVzdHMuIEl0IHNob3VsZCB3b3JrIHdpdGgg QXBhY2hlIDIuMCBieSBlbmFibGluZyB0aGUKICAqIHJlcXVlc3QgaGFuZGxlcnMgaW4gdGhl IEFwYWNoZSBjb25maWd1cmF0aW9uIGZpbGUuIFNpbmNlIHRoaXMgbW9kdWxlIGlzCiAgKiBz ZWxmLWNvbnRhaW5lZCBhbmQgY2FsbGVkIGV4Y2x1c2l2ZWx5IHRocm91Z2ggaXRzIGhhbmRs ZXJzLCB0aGlzCiAgKiBkb2N1bWVudGF0aW9uIHNob3VsZCBiZSBzZWVuIHB1cmVseSBhcyBp bnRlcm5hbCwgbm90IHRvIHJldXNlIHRoZSBzeW1ib2xzCiAgKiBpdCBkZXNjcmliZXMuCiAg Ki8KCiNpZm5kZWYgTU9EX1NQRUNXRUI5OV9ICiNkZWZpbmUgTU9EX1NQRUNXRUI5OV9ICgoj ZGVmaW5lIEJPSUxFUlBMQVRFX1NUQVJUIFwKCSI8aHRtbD5cbiJcCgkiPGhlYWQ+PHRpdGxl PlNQRUN3ZWI5OSBEeW5hbWljIEdFVCAmIFBPU1QgVGVzdDwvdGl0bGU+PC9oZWFkPlxuIlwK CSI8Ym9keT5cbiJcCgkiPHA+U0VSVkVSX1NPRlRXQVJFID0gJXNcbiJcCgkiPHA+UkVNT1RF X0FERFIgPSAlc1xuIlwKCSI8cD5TQ1JJUFRfTkFNRSA9ICVzXG4iXAoJIjxwPlFVRVJZX1NU UklORyA9ICVzXG4iXAoJIjxwcmU+XG4iCgojZGVmaW5lIEJPSUxFUlBMQVRFX0VORCBcCgki XG48L3ByZT5cbjwvYm9keT48L2h0bWw+XG4iCgojZGVmaW5lIE1BUktFUiBcCgkiPCFXRUI5 OUNBRD48SU1HIFNSQz1cIi9maWxlX3NldC9kaXIiCgovKiBSZWNvcmQgbGVuZ3RocyBpbmNs dWRpbmcgbmV3bGluZSAqLwojZGVmaW5lIFVQUkxFTkdUSCAgCSgxNSkKI2RlZmluZSBDQURS TEVOR1RIIAkoMzkpCgojZGVmaW5lIEdFTkRFUl9NQVNLCSAoICAweDMgPDwgMjgpCiNkZWZp bmUgQUdFX0dST1VQX01BU0sgICAoICAweGYgPDwgMjQpCiNkZWZpbmUgUkVHSU9OX01BU0sg ICAgICAoICAweGYgPDwgMjApCiNkZWZpbmUgSU5URVJFU1QxX01BU0sgICAoMHgzZmYgPDwg MTApCiNkZWZpbmUgSU5URVJFU1QyX01BU0sgICAoMHgzZmYgPDwgIDApCgojZGVmaW5lIEdF TkRFUl9XVF9PRkYgICAgMTYKI2RlZmluZSBBR0VfR1JPVVBfV1RfT0ZGIDEyCiNkZWZpbmUg UkVHSU9OX1dUX09GRiAgICAgOAojZGVmaW5lIElOVEVSRVNUMV9XVF9PRkYgIDQKI2RlZmlu ZSBJTlRFUkVTVDJfV1RfT0ZGICAwCgojZGVmaW5lIERFRkFVTFRfRU5DVFlQRSAiYXBwbGlj YXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgojZGVmaW5lIFNQRUNfTUFOQUdFUl9QQVRD SCAiKioqIG1hbmFnZXIub3JpZyAgICAgICAgV2VkIEF1ZyAyMyAxNjoxOToxMiAyMDAwXG5c Ci0tLSBtYW5hZ2VyICAgICBXZWQgQXVnIDIzIDE2OjIwOjE4IDIwMDBcblwKKioqKioqKioq KioqKioqXG5cCioqKiAxNjkxLDE2OTYgKioqKlxuXAotLS0gMTY5MSwxNzAwIC0tLS1cblwK ICAgICAgICAkcmVxID0gbmV3IEhUVFA6OlJlcXVlc3QgJ1BPU1QnID0+ICR1cmwgLiBcImZc IjtcblwKICAgICAgICBteSgkdXJscm9vdCkgPSAoJHVybCA9fiBtI1w/KC4qZmlsZV9zZXQv KSMpO1xuXAogICAgICAgICRyZXEtPmNvbnRlbnQoXCJjbGFzcz0xJmNsaWVudD0yJmRpcj0w MDAwNCZudW09MyZ1cmxyb290PSR1cmxyb290XCIpO1xuXAorXG5cCisgICAgICAgIyBkZGhp bGwgYWRkZWQgXG5cCisgICAgICAgJHJlcS0+aGVhZGVyKCdDb250ZW50LXR5cGUnID0+ICdh cHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcblwKKyAgICAgICAjIGVuZCBk ZGhpbGwgYWRkZWRcblwKICAgICAgfVxuXAogICAgICBlbHNlIHtcblwKICAgICAgICAkcmVx ID0gbmV3IEhUVFA6OlJlcXVlc3QgJ0dFVCcgPT4gJHVybDtcbiIKCi8qIFN0cnVjdHVyZSB0 byBob2xkIGN1c3RvbSBhZCBkYXRhICovCgpzdHJ1Y3QgY2FkcmVjIHsKICAgIHVfaW50MzJf dCBhZGRlbW9ncmFwaGljczsKICAgIHVfaW50MzJfdCBhZ2Vfd2VpZ2h0aW5nczsKICAgIHVf aW50MzJfdCBnZW5fd2VpZ2h0aW5nczsKICAgIHVfaW50MzJfdCByZWdfd2VpZ2h0aW5nczsK ICAgIHVfaW50MzJfdCBpbnQxX3dlaWdodGluZ3M7CiAgICB1X2ludDMyX3QgaW50Ml93ZWln aHRpbmdzOwogICAgdV9pbnQxNl90IG1pbmltdW1fbWF0Y2hfdmFsdWU7CiAgICB1X2ludDMy X3QgZXhwaXJhdGlvbl90aW1lOwp9OwoKI2VuZGlmCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= --------------D0C47736C629AA0986AFC710--