Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qgVZi-00G4rB-F2 for pgsql-hackers@arkaria.postgresql.org; Wed, 13 Sep 2023 19:30:59 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1qgVZg-001q5x-Ov for pgsql-hackers@arkaria.postgresql.org; Wed, 13 Sep 2023 19:30:56 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qgVZf-001q5h-Ri for pgsql-hackers@lists.postgresql.org; Wed, 13 Sep 2023 19:30:56 +0000 Received: from mail-yw1-x1131.google.com ([2607:f8b0:4864:20::1131]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1qgVZZ-004tUc-9D for pgsql-hackers@postgresql.org; Wed, 13 Sep 2023 19:30:55 +0000 Received: by mail-yw1-x1131.google.com with SMTP id 00721157ae682-58fa51a0d97so1949587b3.3 for ; Wed, 13 Sep 2023 12:30:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joeconway.com; s=google; t=1694633447; x=1695238247; darn=postgresql.org; h=in-reply-to:subject:references:cc:to:from:content-language :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=0Cn58e8rEiZBQRhcUSm6/jrMw4VRY2/YtGYcBV8hS/4=; b=jcTidCJsi9LuqCVgly9bRfqPE6COKEvGQ4g6Ikg74iFC5Kg2ixzGtoB0mZ5l+YKBn8 vdHol00ag73lOivUusO2zeJPv8knqso972LaS3b0gpXUisVWUyWbEhjc3F3HJYenD1Ea 8+RXNYCaHhbKWVSJGepon4kP2v0A/xeG4atmIpGvuA6nG0rmmDtAajrqyqsuRAg9cHY4 p4RSd7oUeSRzVq6wmHZWrFvGsxFjo2Cm4EzKlEjYpUakYhmInwd7W5A2fRDtNmnerlY4 iXFqqlaXU3tW7IHVpUXIRBZK5aVTkdczZs5qduuRuBPI2KmLtkL2V/nTNDrD9Kfbd8Le x73A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694633447; x=1695238247; h=in-reply-to:subject:references:cc:to:from:content-language :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=0Cn58e8rEiZBQRhcUSm6/jrMw4VRY2/YtGYcBV8hS/4=; b=ODADMQew3BqrOlti/UTUcBmIzzYQbFxoGbtwPH4mKhnOSKTm1TGn0mM8MAN/aTvqk9 7QBzmjJxaGg2tfzG0aplVVoIOfiFAlfi51uxvfxpsrUoOTsmAh8/UjHz/c6n3LwtLREU UGC9pqMJqYck2gKIoDupPXro0rf2tdY6JT6KTcPssuVlqY+cmFKFAoVsNYXMrHRRFkmu vIJBFjM6OPh69r3tyW/HSd314EMCi0IBG2XpWDk6m7e/by7vCaVLbGDbwhuI8o1o2sIT ZMIvsbdmu+ylhLhZy4pGC4Ee8SRrkK0mhYth8T28zumxk7BHEP1L6LA5vDqJgFifei9A cmZw== X-Gm-Message-State: AOJu0YwJUyoARUnsfRhB7e/iWTSDP75PIwc0pvQnwhdSPX90xqGUVPo/ 5syr2K7SDyFfvTx0ZDWSBlFBWg== X-Google-Smtp-Source: AGHT+IF18FSiI1+dKGCO2/lqmHNQpVhnx73BCtAtoe4XjiTTPRWYuLhetzZrr24lQ8EABsxgOkA3gQ== X-Received: by 2002:a81:7cc2:0:b0:59b:9f06:1706 with SMTP id x185-20020a817cc2000000b0059b9f061706mr3339091ywc.26.1694633447323; Wed, 13 Sep 2023 12:30:47 -0700 (PDT) Received: from [192.168.4.41] (162-239-31-113.lightspeed.dybhfl.sbcglobal.net. [162.239.31.113]) by smtp.gmail.com with ESMTPSA id j6-20020a0de006000000b005704c4d3579sm3291292ywe.40.2023.09.13.12.30.46 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 13 Sep 2023 12:30:46 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------h8dLgnFNFvy0cX7pF1ZHR9y4" Message-ID: Date: Wed, 13 Sep 2023 15:30:45 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.15.0 Content-Language: en-US From: Joe Conway To: Gurjeet Singh , Masahiko Sawada Cc: PostgreSQL-development References: <89742024-d51a-c66b-90b9-67f837072cd2@joeconway.com> <3b1683bc-2630-a0d0-6083-8a45aa1b54bf@joeconway.com> Subject: Re: RFC: pg_stat_logmsg In-Reply-To: <3b1683bc-2630-a0d0-6083-8a45aa1b54bf@joeconway.com> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------h8dLgnFNFvy0cX7pF1ZHR9y4 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 7/9/23 14:13, Joe Conway wrote: > On 7/7/23 01:38, Gurjeet Singh wrote: >>> In this case, the error message stored in pg_stat_logmsg is just '%s'. >>> The filename and line number columns might help identify the actual >>> error but it requires users to read the source code and cannot know >>> the actual error message. >> >> I believe that the number of such error messages, the ones with very >> little descriptive content, is very low in Postgres code. These kinds >> of messages are not prevalent, and must be used when code hits obscure >> conditions, like seen in your example above. These are the kinds of >> errors that Joe is referring to as "should not happen". In these >> cases, even if the error message was descriptive, the user will very >> likely have to dive deep into code to find out the real cause. > > Agreed. As an example, after running `make installcheck` > > 8<----------------- > select sum(count) from pg_stat_logmsg; > sum > ------ > 6005 > (1 row) > > select message,sum(count) > from pg_stat_logmsg > where length(message) < 30 > and elevel in ('ERROR','FATAL','PANIC') > and message like '%\%s%' escape '\' > group by message > order by length(message); > message | sum > -------------------------------+----- > %s | 107 > "%s" is a view | 9 > "%s" is a table | 4 > %s is a procedure | 1 > invalid size: "%s" | 13 > %s at or near "%s" | 131 > %s at end of input | 3 > ... > 8<----------------- > > I only see three message formats there that are generic enough to be of > concern (the first and last two shown -- FWIW I did not see any more of > them as the fmt string gets longer) > > So out of 6005 log events, 241 fit this concern. > > Perhaps given the small number of message format strings affected, it > would make sense to special case those, but I am not sure it is worth > the effort, at least for version 1. Attached is an update, this time as a patch against 17devel. It is not quite complete, but getting close IMHO. Changes: -------- 1. Now is integrated into contrib as a "Additional Supplied Extension" 2. Documentation added 3. I had a verbal conversation with Andres and he reminded me that the original idea for this was to collect data across fleets of pg hosts so we could look for how often "should never happen" errors actually happen. As such, we need to think in terms of aggregating the info from many hosts, potentially with many localized languages for the messages. So I converted the "message" column back to an untranslated string, and added a "translated_message" column which is localized. An alternative approach might be to provide a separate function that accepts the message string and returns the translation. Thoughts on that? 4. In the same vein, I added a pgversion column since the filename and line number for the same log message could vary across major or even minor releases. Not done: --------- 1. The main thing lacking at this point is a regression test. 2. No special casing for message == "%s". I am still not convinced it is worthwhile to do so. Comments gratefully welcomed. Thanks, -- Joe Conway PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com --------------h8dLgnFNFvy0cX7pF1ZHR9y4 Content-Type: text/x-patch; charset=UTF-8; name="20230912-000.diff" Content-Disposition: attachment; filename="20230912-000.diff" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2NvbnRyaWIvTWFrZWZpbGUgYi9jb250cmliL01ha2VmaWxlCmluZGV4 IGRhNGUyMzEuLjkxNDRjYjcgMTAwNjQ0CioqKiBhL2NvbnRyaWIvTWFrZWZpbGUKLS0tIGIv Y29udHJpYi9NYWtlZmlsZQoqKioqKioqKioqKioqKiogU1VCRElSUyA9IFwKKioqIDM0LDM5 ICoqKioKLS0tIDM0LDQwIC0tLS0KICAJCXBnX2J1ZmZlcmNhY2hlCVwKICAJCXBnX2ZyZWVz cGFjZW1hcCBcCiAgCQlwZ19wcmV3YXJtCVwKKyAJCXBnX3N0YXRfbG9nbXNnIFwKICAJCXBn X3N0YXRfc3RhdGVtZW50cyBcCiAgCQlwZ19zdXJnZXJ5CVwKICAJCXBnX3RyZ20JCVwKZGlm ZiAtLWdpdCBhL2NvbnRyaWIvbWVzb24uYnVpbGQgYi9jb250cmliL21lc29uLmJ1aWxkCmlu ZGV4IDg0ZDRlMTguLjRlOGFjMzkgMTAwNjQ0CioqKiBhL2NvbnRyaWIvbWVzb24uYnVpbGQK LS0tIGIvY29udHJpYi9tZXNvbi5idWlsZAoqKioqKioqKioqKioqKiogc3ViZGlyKCdwZ2Ny eXB0bycpCioqKiA0NCw0OSAqKioqCi0tLSA0NCw1MCAtLS0tCiAgc3ViZGlyKCdwZ19mcmVl c3BhY2VtYXAnKQogIHN1YmRpcigncGdfcHJld2FybScpCiAgc3ViZGlyKCdwZ3Jvd2xvY2tz JykKKyBzdWJkaXIoJ3BnX3N0YXRfbG9nbXNnJykKICBzdWJkaXIoJ3BnX3N0YXRfc3RhdGVt ZW50cycpCiAgc3ViZGlyKCdwZ3N0YXR0dXBsZScpCiAgc3ViZGlyKCdwZ19zdXJnZXJ5JykK ZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9jb250cmliLnNnbWwgYi9kb2Mvc3JjL3NnbWwv Y29udHJpYi5zZ21sCmluZGV4IGFiN2UzOGIuLjRkZmM1ZGQgMTAwNjQ0CioqKiBhL2RvYy9z cmMvc2dtbC9jb250cmliLnNnbWwKLS0tIGIvZG9jL3NyYy9zZ21sL2NvbnRyaWIuc2dtbAoq KioqKioqKioqKioqKiogQ1JFQVRFIEVYVEVOU0lPTiA8cmVwbGFjZWFibGU+ZXh0ZW5zaW9u XwoqKiogMTU3LDE2MiAqKioqCi0tLSAxNTcsMTYzIC0tLS0KICAgJnBnZnJlZXNwYWNlbWFw OwogICAmcGdwcmV3YXJtOwogICAmcGdyb3dsb2NrczsKKyAgJnBnc3RhdGxvZ21zZzsKICAg JnBnc3RhdHN0YXRlbWVudHM7CiAgICZwZ3N0YXR0dXBsZTsKICAgJnBnc3VyZ2VyeTsKZGlm ZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9maWxlbGlzdC5zZ21sIGIvZG9jL3NyYy9zZ21sL2Zp bGVsaXN0LnNnbWwKaW5kZXggNGM2M2E3ZS4uYWNlZGU2NiAxMDA2NDQKKioqIGEvZG9jL3Ny Yy9zZ21sL2ZpbGVsaXN0LnNnbWwKLS0tIGIvZG9jL3NyYy9zZ21sL2ZpbGVsaXN0LnNnbWwK KioqKioqKioqKioqKioqCioqKiAxNDUsMTUwICoqKioKLS0tIDE0NSwxNTEgLS0tLQogIDwh RU5USVRZIHBnZnJlZXNwYWNlbWFwICBTWVNURU0gInBnZnJlZXNwYWNlbWFwLnNnbWwiPgog IDwhRU5USVRZIHBncHJld2FybSAgICAgICBTWVNURU0gInBncHJld2FybS5zZ21sIj4KICA8 IUVOVElUWSBwZ3Jvd2xvY2tzICAgICAgU1lTVEVNICJwZ3Jvd2xvY2tzLnNnbWwiPgorIDwh RU5USVRZIHBnc3RhdGxvZ21zZyAgICBTWVNURU0gInBnc3RhdGxvZ21zZy5zZ21sIj4KICA8 IUVOVElUWSBwZ3N0YXRzdGF0ZW1lbnRzIFNZU1RFTSAicGdzdGF0c3RhdGVtZW50cy5zZ21s Ij4KICA8IUVOVElUWSBwZ3N0YXR0dXBsZSAgICAgU1lTVEVNICJwZ3N0YXR0dXBsZS5zZ21s Ij4KICA8IUVOVElUWSBwZ3N1cmdlcnkgICAgICAgU1lTVEVNICJwZ3N1cmdlcnkuc2dtbCI+ CmRpZmYgLS1naXQgYS9jb250cmliL3BnX3N0YXRfbG9nbXNnLy5naXRpZ25vcmUgYi9jb250 cmliL3BnX3N0YXRfbG9nbXNnLy5naXRpZ25vcmUKaW5kZXggLi4uNWRjYjNmZiAuCioqKiBh L2NvbnRyaWIvcGdfc3RhdF9sb2dtc2cvLmdpdGlnbm9yZQotLS0gYi9jb250cmliL3BnX3N0 YXRfbG9nbXNnLy5naXRpZ25vcmUKKioqKioqKioqKioqKioqCioqKiAwICoqKioKLS0tIDEs NCAtLS0tCisgIyBHZW5lcmF0ZWQgc3ViZGlyZWN0b3JpZXMKKyAvbG9nLworIC9yZXN1bHRz LworIC90bXBfY2hlY2svCmRpZmYgLS1naXQgYS9jb250cmliL3BnX3N0YXRfbG9nbXNnL0xJ Q0VOU0UgYi9jb250cmliL3BnX3N0YXRfbG9nbXNnL0xJQ0VOU0UKaW5kZXggLi4uOTk4Zjgx NCAuCioqKiBhL2NvbnRyaWIvcGdfc3RhdF9sb2dtc2cvTElDRU5TRQotLS0gYi9jb250cmli L3BnX3N0YXRfbG9nbXNnL0xJQ0VOU0UKKioqKioqKioqKioqKioqCioqKiAwICoqKioKLS0t IDEsNCAtLS0tCisgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBQb3N0Z3JlU1FM IGxpY2VuY2UsIGFzIGdpdmVuIGF0CisgaHR0cDovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9hYm91 dC9saWNlbmNlLworIAorIENvcHlyaWdodCBpcyBub3ZhdGVkIHRvIHRoZSBQb3N0Z3JlU1FM IEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cC4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfc3Rh dF9sb2dtc2cvTWFrZWZpbGUgYi9jb250cmliL3BnX3N0YXRfbG9nbXNnL01ha2VmaWxlCmlu ZGV4IC4uLjczZTJmMGUgLgoqKiogYS9jb250cmliL3BnX3N0YXRfbG9nbXNnL01ha2VmaWxl Ci0tLSBiL2NvbnRyaWIvcGdfc3RhdF9sb2dtc2cvTWFrZWZpbGUKKioqKioqKioqKioqKioq CioqKiAwICoqKioKLS0tIDEsMjkgLS0tLQorICMgY29udHJpYi9wZ19zdGF0X2xvZ21zZy9N YWtlZmlsZQorIAorIE1PRFVMRV9iaWcgPSBwZ19zdGF0X2xvZ21zZworIE9CSlMgPSBcCisg CSQoV0lOMzJSRVMpIFwKKyAJcGdfc3RhdF9sb2dtc2cubworIAorIEVYVEVOU0lPTiA9IHBn X3N0YXRfbG9nbXNnCisgREFUQSA9IHBnX3N0YXRfbG9nbXNnLS0xLjAuc3FsCisgUEdGSUxF REVTQyA9ICJwZ19zdGF0X2xvZ21zZyAtIHN0YXRpc3RpY3Mgb2YgbG9nIG1lc3NhZ2VzIgor IAorIExERkxBR1NfU0wgKz0gJChmaWx0ZXIgLWxtLCAkKExJQlMpKQorIAorIFJFR1JFU1Nf T1BUUyA9IC0tdGVtcC1jb25maWcgJCh0b3Bfc3JjZGlyKS9jb250cmliL3BnX3N0YXRfbG9n bXNnL3BnX3N0YXRfbG9nbXNnLmNvbmYKKyBSRUdSRVNTID0gc2VsZWN0CisgIyBEaXNhYmxl ZCBiZWNhdXNlIHRoZXNlIHRlc3RzIHJlcXVpcmUgInNoYXJlZF9wcmVsb2FkX2xpYnJhcmll cz1wZ19zdGF0X2xvZ21zZyIsCisgIyB3aGljaCB0eXBpY2FsIGluc3RhbGxjaGVjayB1c2Vy cyBkbyBub3QgaGF2ZSAoZS5nLiBidWlsZGZhcm0gY2xpZW50cykuCisgTk9fSU5TVEFMTENI RUNLID0gMQorIAorIGlmZGVmIFVTRV9QR1hTCisgUEdfQ09ORklHID0gcGdfY29uZmlnCisg UEdYUyA6PSAkKHNoZWxsICQoUEdfQ09ORklHKSAtLXBneHMpCisgaW5jbHVkZSAkKFBHWFMp CisgZWxzZQorIHN1YmRpciA9IGNvbnRyaWIvcGdfc3RhdF9sb2dtc2cKKyB0b3BfYnVpbGRk aXIgPSAuLi8uLgorIGluY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL3NyYy9NYWtlZmlsZS5nbG9i YWwKKyBpbmNsdWRlICQodG9wX3NyY2RpcikvY29udHJpYi9jb250cmliLWdsb2JhbC5tawor IGVuZGlmCmRpZmYgLS1naXQgYS9jb250cmliL3BnX3N0YXRfbG9nbXNnL1JFQURNRS5tZCBi L2NvbnRyaWIvcGdfc3RhdF9sb2dtc2cvUkVBRE1FLm1kCmluZGV4IC4uLmIxNmVmMWYgLgoq KiogYS9jb250cmliL3BnX3N0YXRfbG9nbXNnL1JFQURNRS5tZAotLS0gYi9jb250cmliL3Bn X3N0YXRfbG9nbXNnL1JFQURNRS5tZAoqKioqKioqKioqKioqKioKKioqIDAgKioqKgotLS0g MSwxMzcgLS0tLQorICMgUG9zdGdyZVNRTCBwZ19zdGF0X2xvZ21zZyBFeHRlbnNpb24gTW9k dWxlCisgCisgIyMgT3ZlcnZpZXcKKyBUaGlzIGV4dGVuc2lvbiBhZGRzIHN1cHBvcnQgdG8g dHJhY2sgc3RhdGlzdGljcyBvZiBsb2cgbWVzc2FnZXMgaW50byBQb3N0Z3JlU1FMLiBJdCBi ZWhhdmVzIGluIGEgdmVyeSBzaW1pbGFyIG1hbm5lciB0byBwZ19zdGF0X3N0YXllbWVudHMs IGV4Y2VwdCBjb3VudHMgYXJlIGFnZ3JlZ2F0ZWQgYnkgbG9nIG1lc3NhZ2UgZmlsZSwgbGlu ZSBudW1iZXIsIGFuZCBsZXZlbC4gVGhlIFNRTCBlcnJvciBjb2RlIGFuZCBsb2cgbWVzc2Fn ZSBmb3JtYXQgc3RyaW5nIGFyZSBhbHNvIHByb3ZpZGVkIGZvciBjb250ZXh0LgorIAorICMj IFN5bnRheAorIAorIAorIAorICMjIENvbmZpZ3VyYXRpb24KKyAqIEFkZCBwZ19zdGF0X2xv Z21zZyB0byBzaGFyZWRfcHJlbG9hZF9saWJyYXJpZXMgaW4gcG9zdGdyZXNxbC5jb25mLgor IGBgYAorIHNoYXJlZF9wcmVsb2FkX2xpYnJhcmllcyA9ICdwZ19zdGF0X2xvZ21zZycKKyBg YGAKKyAqIFRoZSBmb2xsb3dpbmcgY3VzdG9tIHBhcmFtZXRlcnMgbWF5IGJlIHNldDoKKyBg YGAKKyAjIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIHRyYWNrZWQgYnkg cGdfc3RhdF9sb2dtc2cuCisgcGdfc3RhdF9sb2dtc2cubWF4ID0gNTAwMAorIAorIGBgYAor IAorICMjIEluc3RhbGxhdGlvbgorIAorICMjIyBSZXF1aXJlbWVudHMKKyAKKyAqIFBvc3Rn cmVTUUwgdmVyc2lvbiAxMSBvciBuZXdlcgorIAorICMjIyBDb21waWxlIGFuZCBJbnN0YWxs CisgCisgQ2xvbmUgUG9zdGdyZVNRTCByZXBvc2l0b3J5OgorIAorIGBgYGJhc2gKKyAkPiBn aXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL3Bvc3RncmVzL3Bvc3RncmVzLmdpdAorIGBg YAorIAorIENoZWNrb3V0IFJFTF8xNl9TVEFCTEUgKGZvciBleGFtcGxlKSBicmFuY2g6Cisg CisgYGBgYmFzaAorICQ+IGdpdCBjaGVja291dCBSRUxfMTZfU1RBQkxFCisgYGBgCisgCisg TWFrZSBQb3N0Z3JlU1FMOgorIAorIGBgYGJhc2gKKyAkPiAuL2NvbmZpZ3VyZQorICQ+IG1h a2UgaW5zdGFsbCAtcworIGBgYAorIAorIENoYW5nZSB0byB0aGUgY29udHJpYiBkaXJlY3Rv cnk6CisgCisgYGBgYmFzaAorICQ+IGNkIGNvbnRyaWIKKyBgYGAKKyAKKyBDbG9uZSBgYGBw Z19zdGF0X2xvZ21zZ2BgYCBleHRlbnNpb246CisgCisgYGBgYmFzaAorICQ+IGdpdCBjbG9u ZSBodHRwczovL2dpdGh1Yi5jb20vcGctZXh0L3BnX3N0YXRfbG9nbXNnCisgYGBgCisgCisg Q2hhbmdlIHRvIGBgYHBnX3N0YXRfbG9nbXNnYGBgIGRpcmVjdG9yeToKKyAKKyBgYGBiYXNo CisgJD4gY2QgcGdfc3RhdF9sb2dtc2cKKyBgYGAKKyAKKyBCdWlsZCBgYGBwZ19zdGF0X2xv Z21zZ2BgYDoKKyAKKyBgYGBiYXNoCisgJD4gbWFrZQorIGBgYAorIAorIEluc3RhbGwgYGBg cGdfc3RhdF9sb2dtc2dgYGA6CisgCisgYGBgYmFzaAorICQ+IG1ha2UgaW5zdGFsbAorIGBg YAorIAorICMjIyMgVXNpbmcgUEdYUworIAorIElmIGFuIGluc3RhbmNlIG9mIFBvc3RncmVT UUwgaXMgYWxyZWFkeSBpbnN0YWxsZWQsIHRoZW4gUEdYUyBjYW4gYmUgdXRpbGl6ZWQgdG8g YnVpbGQgYW5kIGluc3RhbGwgYGBgcGdfc3RhdF9sb2dtc2dgYGAuICBFbnN1cmUgdGhhdCBQ b3N0Z3JlU1FMIGJpbmFyaWVzIGFyZSBhdmFpbGFibGUgdmlhIHRoZSBgYGAkUEFUSGBgYCBl bnZpcm9ubWVudCB2YXJpYWJsZSB0aGVuIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmRzLgor IAorIGBgYGJhc2gKKyAkPiBtYWtlIFVTRV9QR1hTPTEKKyAkPiBtYWtlIFVTRV9QR1hTPTEg aW5zdGFsbAorIGBgYAorIAorICMjIyBDb25maWd1cmUKKyAKKyBUaGUgZm9sbG93aW5nIGJh c2ggY29tbWFuZHMgc2hvdWxkIGNvbmZpZ3VyZSB5b3VyIHN5c3RlbSB0byB1dGlsaXplIHBn X3N0YXRfbG9nbXNnLiBSZXBsYWNlIGFsbCBwYXRocyBhcyBhcHByb3ByaWF0ZS4gSXQgbWF5 IGJlIHBydWRlbnQgdG8gdmlzdWFsbHkgaW5zcGVjdCB0aGUgZmlsZXMgYWZ0ZXJ3YXJkIHRv IGVuc3VyZSB0aGUgY2hhbmdlcyB0b29rIHBsYWNlLgorIAorICMjIyMjIyBJbml0aWFsaXpl IFBvc3RncmVTUUwgKGlmIG5lZWRlZCk6CisgCisgYGBgYmFzaAorICQ+IGluaXRkYiAtRCAv cGF0aC90by9kYXRhL2RpcmVjdG9yeQorIGBgYAorIAorICMjIyMjIyBDcmVhdGUgVGFyZ2V0 IERhdGFiYXNlIChpZiBuZWVkZWQpOgorIAorIGBgYGJhc2gKKyAkPiBjcmVhdGVkYiA8ZGF0 YWJhc2U+CisgYGBgCisgCisgIyMjIyMjIEluc3RhbGwgYGBgcGdfc3RhdF9sb2dtc2dgYGAg ZnVuY3Rpb25zOgorIAorIEVkaXQgcG9zdGdyZXNxbC5jb25mIGFuZCBhZGQgYGBgcGdfc3Rh dF9sb2dtc2dgYGAgdG8gdGhlIHNoYXJlZF9wcmVsb2FkX2xpYnJhcmllcyBsaW5lLCBhbmQg Y2hhbmdlIGN1c3RvbSBzZXR0aW5ncyBhcyBtZW50aW9uZWQgYWJvdmUuCisgCisgRmluYWxs eSwgcmVzdGFydCBQb3N0Z3JlU1FMIChtZXRob2QgbWF5IHZhcnkpOgorIAorIGBgYAorICQ+ IHNlcnZpY2UgcG9zdGdyZXNxbCByZXN0YXJ0CisgYGBgCisgSW5zdGFsbCB0aGUgZXh0ZW5z aW9uIGludG8geW91ciBkYXRhYmFzZToKKyAKKyBgYGBiYXNoCisgcHNxbCA8ZGF0YWJhc2U+ CisgQ1JFQVRFIEVYVEVOU0lPTiBwZ19zdGF0X2xvZ21zZzsKKyBgYGAKKyAKKyAjIyMjIyMg VGVzdCBiYXNpYyBmdW5jdGlvbmFsaXR5OgorIAorIEV4YW1wbGVzOgorIGBgYAorIHNlbGVj dCAqIGZyb20gcGdfc3RhdF9sb2dtc2c7CisgCisgCisgCisgCisgYGBgCisgCisgIyMgTm90 ZXMKKyAKKyAjIyAgTGljZW5zaW5nCisgCisgUGxlYXNlIHNlZSB0aGUgW0xJQ0VOU0VdKC4v TElDRU5TRSkgZmlsZS4KKyAKKyAKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfc3RhdF9sb2dt c2cvbWVzb24uYnVpbGQgYi9jb250cmliL3BnX3N0YXRfbG9nbXNnL21lc29uLmJ1aWxkCmlu ZGV4IC4uLjI1ZmRhNjMgLgoqKiogYS9jb250cmliL3BnX3N0YXRfbG9nbXNnL21lc29uLmJ1 aWxkCi0tLSBiL2NvbnRyaWIvcGdfc3RhdF9sb2dtc2cvbWVzb24uYnVpbGQKKioqKioqKioq KioqKioqCioqKiAwICoqKioKLS0tIDEsNDEgLS0tLQorICMgQ29weXJpZ2h0IChjKSAyMDIy LTIwMjMsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3VwCisgCisgcGdfc3Rh dF9sb2dtc2dfc291cmNlcyA9IGZpbGVzKAorICAgJ3BnX3N0YXRfbG9nbXNnLmMnLAorICkK KyAKKyBpZiBob3N0X3N5c3RlbSA9PSAnd2luZG93cycKKyAgIHBnX3N0YXRfbG9nbXNnX3Nv dXJjZXMgKz0gcmNfbGliX2dlbi5wcm9jZXNzKHdpbjMydmVyX3JjLCBleHRyYV9hcmdzOiBb CisgICAgICctLU5BTUUnLCAncGdfc3RhdF9sb2dtc2cnLAorICAgICAnLS1GSUxFREVTQycs ICdwZ19zdGF0X2xvZ21zZyAtIGV4ZWN1dGlvbiBzdGF0aXN0aWNzIG9mIGxvZyBtZXNzYWdl cycsXSkKKyBlbmRpZgorIAorIHBnX3N0YXRfbG9nbXNnID0gc2hhcmVkX21vZHVsZSgncGdf c3RhdF9sb2dtc2cnLAorICAgcGdfc3RhdF9sb2dtc2dfc291cmNlcywKKyAgIGt3YXJnczog Y29udHJpYl9tb2RfYXJncyArIHsKKyAgICAgJ2RlcGVuZGVuY2llcyc6IGNvbnRyaWJfbW9k X2FyZ3NbJ2RlcGVuZGVuY2llcyddLAorICAgfSwKKyApCisgY29udHJpYl90YXJnZXRzICs9 IHBnX3N0YXRfbG9nbXNnCisgCisgaW5zdGFsbF9kYXRhKAorICAgJ3BnX3N0YXRfbG9nbXNn LmNvbnRyb2wnLAorICAgJ3BnX3N0YXRfbG9nbXNnLS0xLjAuc3FsJywKKyAgIGt3YXJnczog Y29udHJpYl9kYXRhX2FyZ3MsCisgKQorIAorIHRlc3RzICs9IHsKKyAgICduYW1lJzogJ3Bn X3N0YXRfbG9nbXNnJywKKyAgICdzZCc6IG1lc29uLmN1cnJlbnRfc291cmNlX2RpcigpLAor ICAgJ2JkJzogbWVzb24uY3VycmVudF9idWlsZF9kaXIoKSwKKyAgICdyZWdyZXNzJzogewor ICAgICAnc3FsJzogWworICAgICAgICdzZWxlY3QnLAorICAgICBdLAorICAgICAncmVncmVz c19hcmdzJzogWyctLXRlbXAtY29uZmlnJywgZmlsZXMoJ3BnX3N0YXRfbG9nbXNnLmNvbmYn KV0sCisgICAgICMgRGlzYWJsZWQgYmVjYXVzZSB0aGVzZSB0ZXN0cyByZXF1aXJlCisgICAg ICMgInNoYXJlZF9wcmVsb2FkX2xpYnJhcmllcz1wZ19zdGF0X2xvZ21zZyIsIHdoaWNoIHR5 cGljYWwKKyAgICAgIyBydW5uaW5nY2hlY2sgdXNlcnMgZG8gbm90IGhhdmUgKGUuZy4gYnVp bGRmYXJtIGNsaWVudHMpLgorICAgICAncnVubmluZ2NoZWNrJzogZmFsc2UsCisgICB9LAor IH0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfc3RhdF9sb2dtc2cvcGdfc3RhdF9sb2dtc2ct LTEuMC5zcWwgYi9jb250cmliL3BnX3N0YXRfbG9nbXNnL3BnX3N0YXRfbG9nbXNnLS0xLjAu c3FsCmluZGV4IC4uLjRjY2I2NTcgLgoqKiogYS9jb250cmliL3BnX3N0YXRfbG9nbXNnL3Bn X3N0YXRfbG9nbXNnLS0xLjAuc3FsCi0tLSBiL2NvbnRyaWIvcGdfc3RhdF9sb2dtc2cvcGdf c3RhdF9sb2dtc2ctLTEuMC5zcWwKKioqKioqKioqKioqKioqCioqKiAwICoqKioKLS0tIDEs NDkgLS0tLQorIC8qIGNvbnRyaWIvcGdfc3RhdF9sb2dtc2cvcGdfc3RhdF9sb2dtc2ctLTEu MC5zcWwgKi8KKyAKKyAtLSBjb21wbGFpbiBpZiBzY3JpcHQgaXMgc291cmNlZCBpbiBwc3Fs LCByYXRoZXIgdGhhbiB2aWEgQ1JFQVRFIEVYVEVOU0lPTgorIFxlY2hvIFVzZSAiQ1JFQVRF IEVYVEVOU0lPTiBwZ19zdGF0X2xvZ21zZyIgdG8gbG9hZCB0aGlzIGZpbGUuIFxxdWl0Cisg CisgLS0gUmVnaXN0ZXIgZnVuY3Rpb25zLgorIENSRUFURSBGVU5DVElPTiBwZ19zdGF0X2xv Z21zZ19yZXNldCgpCisgUkVUVVJOUyB2b2lkCisgQVMgJ01PRFVMRV9QQVRITkFNRScKKyBM QU5HVUFHRSBDIFBBUkFMTEVMIFNBRkU7CisgCisgQ1JFQVRFIEZVTkNUSU9OIHBnX3N0YXRf bG9nbXNnKAorICAgICBPVVQgcGd2ZXJzaW9uIHRleHQsCisgICAgIE9VVCBmaWxlbmFtZSB0 ZXh0LAorICAgICBPVVQgbGluZW5vIGludCwKKyAgICAgT1VUIGVsZXZlbCB0ZXh0LAorICAg ICBPVVQgZnVuY25hbWUgdGV4dCwKKyAgICAgT1VUIHNxbGVycmNvZGUgdGV4dCwKKyAgICAg T1VUIG1lc3NhZ2UgdGV4dCwKKyAgICAgT1VUIHRyYW5zbGF0ZWRfbWVzc2FnZSB0ZXh0LAor ICAgICBPVVQgY291bnQgYmlnaW50CisgKQorIFJFVFVSTlMgU0VUT0YgcmVjb3JkCisgQVMg J01PRFVMRV9QQVRITkFNRScsICdwZ19zdGF0X2xvZ21zZycKKyBMQU5HVUFHRSBDIFNUUklD VCBWT0xBVElMRSBQQVJBTExFTCBTQUZFOworIAorIC0tIFJlZ2lzdGVyIGEgdmlldyBvbiB0 aGUgZnVuY3Rpb24gZm9yIGVhc2Ugb2YgdXNlLgorIENSRUFURSBWSUVXIHBnX3N0YXRfbG9n bXNnIEFTCisgICBTRUxFQ1QgKiBGUk9NIHBnX3N0YXRfbG9nbXNnKCk7CisgCisgR1JBTlQg U0VMRUNUIE9OIHBnX3N0YXRfbG9nbXNnIFRPIFBVQkxJQzsKKyAKKyAtLSBEb24ndCB3YW50 IHRoaXMgdG8gYmUgYXZhaWxhYmxlIHRvIG5vbi1zdXBlcnVzZXJzLgorIFJFVk9LRSBBTEwg T04gRlVOQ1RJT04gcGdfc3RhdF9sb2dtc2dfcmVzZXQoKSBGUk9NIFBVQkxJQzsKKyAKKyAt LS0gRGVmaW5lIHBnX3N0YXRfbG9nbXNnX2luZm8KKyBDUkVBVEUgRlVOQ1RJT04gcGdfc3Rh dF9sb2dtc2dfaW5mbygKKyAgICAgT1VUIGRlYWxsb2MgYmlnaW50LAorICAgICBPVVQgc3Rh dHNfcmVzZXQgdGltZXN0YW1wIHdpdGggdGltZSB6b25lCisgKQorIFJFVFVSTlMgcmVjb3Jk CisgQVMgJ01PRFVMRV9QQVRITkFNRScKKyBMQU5HVUFHRSBDIFNUUklDVCBWT0xBVElMRSBQ QVJBTExFTCBTQUZFOworIAorIENSRUFURSBWSUVXIHBnX3N0YXRfbG9nbXNnX2luZm8gQVMK KyAgIFNFTEVDVCAqIEZST00gcGdfc3RhdF9sb2dtc2dfaW5mbygpOworIAorIEdSQU5UIFNF TEVDVCBPTiBwZ19zdGF0X2xvZ21zZ19pbmZvIFRPIFBVQkxJQzsKKyAKZGlmZiAtLWdpdCBh L2NvbnRyaWIvcGdfc3RhdF9sb2dtc2cvcGdfc3RhdF9sb2dtc2cuYyBiL2NvbnRyaWIvcGdf c3RhdF9sb2dtc2cvcGdfc3RhdF9sb2dtc2cuYwppbmRleCAuLi40NjkyNTI3IC4KKioqIGEv Y29udHJpYi9wZ19zdGF0X2xvZ21zZy9wZ19zdGF0X2xvZ21zZy5jCi0tLSBiL2NvbnRyaWIv cGdfc3RhdF9sb2dtc2cvcGdfc3RhdF9sb2dtc2cuYwoqKioqKioqKioqKioqKioKKioqIDAg KioqKgotLS0gMSwxODIyIC0tLS0KKyAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgKgorICAq IHBnX3N0YXRfbG9nbXNnLmMKKyAgKgkJVHJhY2sgbG9nIG1lc3NhZ2VzIGFjcm9zcyBhIHdo b2xlIGRhdGFiYXNlIGNsdXN0ZXIuCisgICoKKyAgKiBTdGFydGluZyBjb2RlIGNyaWJiZWQg ZnJvbSBwZ19zdGF0X3N0YXRlbWVudHMgYW5kIG1vZGlmaWVkIHRvIHN1aXQKKyAgKgorICAq IENvcHlyaWdodCAoYykgMjAyMywgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3Jv dXAKKyAgKgorICAqIElERU5USUZJQ0FUSU9OCisgICoJICBjb250cmliL3BnX3N0YXRfbG9n bXNnL3BnX3N0YXRfbG9nbXNnLmMKKyAgKgorICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAq LworICNpbmNsdWRlICJwb3N0Z3Jlcy5oIgorIAorICNpbmNsdWRlIDxtYXRoLmg+CisgI2lu Y2x1ZGUgPHN5cy9zdGF0Lmg+CisgI2luY2x1ZGUgPHVuaXN0ZC5oPgorIAorICNpbmNsdWRl ICJhY2Nlc3MvaHR1cF9kZXRhaWxzLmgiCisgI2luY2x1ZGUgImFjY2Vzcy9wYXJhbGxlbC5o IgorICNpbmNsdWRlICJhY2Nlc3MveGFjdC5oIgorICNpbmNsdWRlICJjYXRhbG9nL3BnX2F1 dGhpZC5oIgorICNpZiBQR19WRVJTSU9OX05VTSA+PSAxMzAwMDAKKyAjaW5jbHVkZSAiY29t bW9uL2hhc2hmbi5oIgorICNlbHNlCisgI2luY2x1ZGUgInV0aWxzL2hhc2h1dGlscy5oIgor ICNlbmRpZiAvKiBQR19WRVJTSU9OX05VTSA+PSAxMzAwMDAgKi8KKyAjaW5jbHVkZSAiZnVu Y2FwaS5oIgorICNpbmNsdWRlICJtYi9wZ193Y2hhci5oIgorICNpbmNsdWRlICJtaXNjYWRt aW4uaCIKKyAjaW5jbHVkZSAicGdzdGF0LmgiCisgI2luY2x1ZGUgInN0b3JhZ2UvZmQuaCIK KyAjaW5jbHVkZSAic3RvcmFnZS9pcGMuaCIKKyAjaW5jbHVkZSAic3RvcmFnZS9sd2xvY2su aCIKKyAjaW5jbHVkZSAic3RvcmFnZS9zaG1lbS5oIgorICNpbmNsdWRlICJzdG9yYWdlL3Nw aW4uaCIKKyAjaW5jbHVkZSAidGNvcC91dGlsaXR5LmgiCisgI2luY2x1ZGUgInV0aWxzL2Fj bC5oIgorICNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgorICNpbmNsdWRlICJ1dGlscy9t ZW11dGlscy5oIgorICNpbmNsdWRlICJ1dGlscy90aW1lc3RhbXAuaCIKKyAKKyBQR19NT0RV TEVfTUFHSUM7CisgCisgLyogTG9jYXRpb24gb2YgcGVybWFuZW50IHN0YXRzIGZpbGUgKHZh bGlkIHdoZW4gZGF0YWJhc2UgaXMgc2h1dCBkb3duKSAqLworICNkZWZpbmUgUEdMTV9EVU1Q X0ZJTEUJUEdTVEFUX1NUQVRfUEVSTUFORU5UX0RJUkVDVE9SWSAiL3BnX3N0YXRfbG9nbXNn LnN0YXQiCisgCisgLyoKKyAgKiBMb2NhdGlvbiBvZiBleHRlcm5hbCBsb2dtc2cgdGV4dCBm aWxlLgorICAqLworICNkZWZpbmUgUEdMTV9URVhUX0ZJTEUJUEdfU1RBVF9UTVBfRElSICIv cGdsbV9sb2dtc2dfdGV4dHMuc3RhdCIKKyAKKyAvKiBNYWdpYyBudW1iZXIgaWRlbnRpZnlp bmcgdGhlIHN0YXRzIGZpbGUgZm9ybWF0ICovCisgc3RhdGljIGNvbnN0IHVpbnQzMiBQR0xN X0ZJTEVfSEVBREVSID0gMHgyMDIzMDYyNTsKKyAKKyAvKiBQb3N0Z3JlU1FMIG1ham9yIHZl cnNpb24gbnVtYmVyLCBjaGFuZ2VzIGluIHdoaWNoIGludmFsaWRhdGUgYWxsIGVudHJpZXMg Ki8KKyBzdGF0aWMgY29uc3QgdWludDMyIFBHTE1fUEdfTUFKT1JfVkVSU0lPTiA9IFBHX1ZF UlNJT05fTlVNIC8gMTAwOworIAorICNkZWZpbmUgQVNTVU1FRF9NRURJQU5fSU5JVAkJKDEw LjApCS8qIGluaXRpYWwgYXNzdW1lZCBtZWRpYW4gdXNhZ2UgKi8KKyAjZGVmaW5lIEFTU1VN RURfTEVOR1RIX0lOSVQJCTEwMjQJLyogaW5pdGlhbCBhc3N1bWVkIG1lYW4gcXVlcnkgbGVu Z3RoICovCisgI2RlZmluZSBVU0FHRV9ERUNSRUFTRV9GQUNUT1IJKDAuOTkpCS8qIGRlY3Jl YXNlZCBldmVyeSBlbnRyeV9kZWFsbG9jICovCisgI2RlZmluZSBVU0FHRV9ERUFMTE9DX1BF UkNFTlQJNQkJLyogZnJlZSB0aGlzICUgb2YgZW50cmllcyBhdCBvbmNlICovCisgI2RlZmlu ZSBVU0FHRV9JTklUCQkJCSgxLjApCS8qIGluY2x1ZGluZyBpbml0aWFsIHBsYW5uaW5nICov CisgI2RlZmluZSBNQVhGSUxFTkFNRUxFTgkJCTY0CisgI2RlZmluZSBNQVhGVU5DTkFNRUxF TgkJCTY0CisgCisgLyoKKyAgKiBIYXNodGFibGUga2V5IHRoYXQgZGVmaW5lcyB0aGUgaWRl bnRpdHkgb2YgYSBoYXNodGFibGUgZW50cnkuCisgICoKKyAgKiBJZiB5b3UgYWRkIGEgbmV3 IGtleSB0byB0aGlzIHN0cnVjdCwgbWFrZSBzdXJlIHRvIHRlYWNoIHBnbG1fc3RvcmUoKSB0 bworICAqIHplcm8gdGhlIHBhZGRpbmcgYnl0ZXMuICBPdGhlcndpc2UsIHRoaW5ncyB3aWxs IGJyZWFrLCBiZWNhdXNlIHBnbG1faGFzaCBpcworICAqIGNyZWF0ZWQgdXNpbmcgSEFTSF9C TE9CUywgYW5kIHRodXMgdGFnX2hhc2ggaXMgdXNlZCB0byBoYXNoIHRoaXMuCisgICovCisg dHlwZWRlZiBzdHJ1Y3QgcGdsbUhhc2hLZXkKKyB7CisgCWNoYXIJZmlsZW5hbWVbTUFYRklM RU5BTUVMRU5dOwkvKiBmaWxlbmFtZSAqLworIAlpbnQJCWxpbmVubzsJCQkJCQkvKiBsaW5l IG51bWJlciAqLworIAlpbnQJCWVsZXZlbDsJCQkJCQkvKiBsb2cgbGV2ZWwgKi8KKyB9IHBn bG1IYXNoS2V5OworIAorIC8qCisgICogVGhlIGFjdHVhbCBzdGF0cyBjb3VudGVycyBrZXB0 IHdpdGhpbiBwZ2xtRW50cnkuCisgICovCisgdHlwZWRlZiBzdHJ1Y3QgQ291bnRlcnMKKyB7 CisgCWludDY0CW1zZ2NudDsJCS8qICMgb2YgdGltZXMgcGxhbm5lZC9leGVjdXRlZCAqLwor IAlkb3VibGUJdXNhZ2U7CQkvKiB1c2FnZSBmYWN0b3IgKi8KKyB9IENvdW50ZXJzOworIAor IC8qCisgICogR2xvYmFsIHN0YXRpc3RpY3MgZm9yIHBnX3N0YXRfbG9nbXNnCisgICovCisg dHlwZWRlZiBzdHJ1Y3QgcGdsbUdsb2JhbFN0YXRzCisgeworIAlpbnQ2NAkJZGVhbGxvYzsJ CS8qICMgb2YgdGltZXMgZW50cmllcyB3ZXJlIGRlYWxsb2NhdGVkICovCisgCVRpbWVzdGFt cFR6IHN0YXRzX3Jlc2V0OwkvKiB0aW1lc3RhbXAgd2l0aCBhbGwgc3RhdHMgcmVzZXQgKi8K KyB9IHBnbG1HbG9iYWxTdGF0czsKKyAKKyAvKgorICAqIFN0YXRpc3RpY3MgcGVyIHN0YXRl bWVudAorICAqCisgICogTm90ZTogaW4gZXZlbnQgb2YgYSBmYWlsdXJlIGluIGdhcmJhZ2Ug Y29sbGVjdGlvbiBvZiB0aGUgbG9nbXNnIHRleHQgZmlsZSwKKyAgKiB3ZSByZXNldCBsb2dt c2dfb2Zmc2V0IHRvIHplcm8gYW5kIGxvZ21zZ19sZW4gdG8gLTEuICBUaGlzIHdpbGwgYmUg c2VlbiBhcworICAqIGFuIGludmFsaWQgc3RhdGUgYnkgbG9nbXNnX2ZldGNoKCkuCisgICov CisgdHlwZWRlZiBzdHJ1Y3QgcGdsbUVudHJ5CisgeworIAlwZ2xtSGFzaEtleSBrZXk7CQkJ CQkJLyogaGFzaCBrZXkgb2YgZW50cnkgLSBNVVNUIEJFIEZJUlNUICovCisgCUNvdW50ZXJz CWNvdW50ZXJzOwkJCQkJLyogdGhlIHN0YXRpc3RpY3MgZm9yIHRoaXMgbG9nbXNnICovCisg CVNpemUJCWxvZ21zZ19vZmZzZXQ7CQkJCS8qIGxvZ21zZyB0ZXh0IG9mZnNldCBpbiBleHRl cm5hbCBmaWxlICovCisgCWludAkJCWxvZ21zZ19sZW47CQkJCQkvKiAjIG9mIHZhbGlkIGJ5 dGVzIGluIGxvZ21zZyBzdHJpbmcsIG9yIC0xICovCisgCWludAkJCWVuY29kaW5nOwkJCQkJ LyogbG9nbXNnIHRleHQgZW5jb2RpbmcgKi8KKyAJaW50CQkJc3FsZXJyY29kZTsJCQkJCS8q IGVuY29kZWQgRVJSU1RBVEUgKi8KKyAJY2hhcgkJZnVuY25hbWVbTUFYRlVOQ05BTUVMRU5d OwkvKiBlZGF0YSBmdW5jdGlvbiBuYW1lICovCisgCXNsb2NrX3QJCW11dGV4OwkJCQkJCS8q IHByb3RlY3RzIHRoZSBjb3VudGVycyBvbmx5ICovCisgfSBwZ2xtRW50cnk7CisgCisgLyoK KyAgKiBHbG9iYWwgc2hhcmVkIHN0YXRlCisgICovCisgdHlwZWRlZiBzdHJ1Y3QgcGdsbVNo YXJlZFN0YXRlCisgeworIAlMV0xvY2sJICAgKmxvY2s7CQkJLyogcHJvdGVjdHMgaGFzaHRh YmxlIHNlYXJjaC9tb2RpZmljYXRpb24gKi8KKyAJZG91YmxlCQljdXJfbWVkaWFuX3VzYWdl OwkvKiBjdXJyZW50IG1lZGlhbiB1c2FnZSBpbiBoYXNodGFibGUgKi8KKyAJU2l6ZQkJbWVh bl9sb2dtc2dfbGVuOyAvKiBjdXJyZW50IG1lYW4gZW50cnkgdGV4dCBsZW5ndGggKi8KKyAJ c2xvY2tfdAkJbXV0ZXg7CQkJLyogcHJvdGVjdHMgZm9sbG93aW5nIGZpZWxkcyBvbmx5OiAq LworIAlTaXplCQlleHRlbnQ7CQkJLyogY3VycmVudCBleHRlbnQgb2YgcXVlcnkgZmlsZSAq LworIAlpbnQJCQluX3dyaXRlcnM7CQkvKiBudW1iZXIgb2YgYWN0aXZlIHdyaXRlcnMgdG8g cXVlcnkgZmlsZSAqLworIAlpbnQJCQlnY19jb3VudDsJCS8qIHF1ZXJ5IGZpbGUgZ2FyYmFn ZSBjb2xsZWN0aW9uIGN5Y2xlIGNvdW50ICovCisgCXBnbG1HbG9iYWxTdGF0cyBzdGF0czsJ CS8qIGdsb2JhbCBzdGF0aXN0aWNzIGZvciBwZ2xtICovCisgfSBwZ2xtU2hhcmVkU3RhdGU7 CisgCisgLyotLS0tIExvY2FsIHZhcmlhYmxlcyAtLS0tKi8KKyAKKyAvKiBhbnRpIHJlY3Vy c2lvbiAqLworIHN0YXRpYyBib29sIGlzX2luX2xvZ19ob29rID0gZmFsc2U7CisgCisgLyog U2F2ZWQgaG9vayB2YWx1ZXMgaW4gY2FzZSBvZiB1bmxvYWQgKi8KKyAjaWYgUEdfVkVSU0lP Tl9OVU0gPj0gMTUwMDAwCisgc3RhdGljIHNobWVtX3JlcXVlc3RfaG9va190eXBlIHByZXZf c2htZW1fcmVxdWVzdF9ob29rID0gTlVMTDsKKyAjZW5kaWYgLyogUEdfVkVSU0lPTl9OVU0g Pj0gMTUwMDAwICovCisgc3RhdGljIHNobWVtX3N0YXJ0dXBfaG9va190eXBlIHByZXZfc2ht ZW1fc3RhcnR1cF9ob29rID0gTlVMTDsKKyBzdGF0aWMgZW1pdF9sb2dfaG9va190eXBlIHBy ZXZfZW1pdF9sb2dfaG9vayA9IE5VTEw7CisgCisgLyogTGlua3MgdG8gc2hhcmVkIG1lbW9y eSBzdGF0ZSAqLworIHN0YXRpYyBwZ2xtU2hhcmVkU3RhdGUgKnBnbG0gPSBOVUxMOworIHN0 YXRpYyBIVEFCICpwZ2xtX2hhc2ggPSBOVUxMOworIAorIC8qLS0tLSBHVUMgdmFyaWFibGVz IC0tLS0qLworIHN0YXRpYyBpbnQJcGdsbV9tYXggPSA1MDAwOwkvKiBtYXggIyBzdGF0ZW1l bnRzIHRvIHRyYWNrICovCisgCisgI2RlZmluZSByZWNvcmRfZ2NfbXNnZm10cygpIFwKKyAJ ZG8geyBcCisgCQl2b2xhdGlsZSBwZ2xtU2hhcmVkU3RhdGUgKnMgPSAodm9sYXRpbGUgcGds bVNoYXJlZFN0YXRlICopIHBnbG07IFwKKyAJCVNwaW5Mb2NrQWNxdWlyZSgmcy0+bXV0ZXgp OyBcCisgCQlzLT5nY19jb3VudCsrOyBcCisgCQlTcGluTG9ja1JlbGVhc2UoJnMtPm11dGV4 KTsgXAorIAl9IHdoaWxlKDApCisgCisgLyotLS0tIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAt LS0tKi8KKyB2b2lkIF9QR19pbml0KHZvaWQpOworIFBHX0ZVTkNUSU9OX0lORk9fVjEocGdf c3RhdF9sb2dtc2dfcmVzZXQpOworIFBHX0ZVTkNUSU9OX0lORk9fVjEocGdfc3RhdF9sb2dt c2cpOworIFBHX0ZVTkNUSU9OX0lORk9fVjEocGdfc3RhdF9sb2dtc2dfaW5mbyk7CisgCisg I2lmIFBHX1ZFUlNJT05fTlVNID49IDE1MDAwMAorIHN0YXRpYyB2b2lkIHBnbG1fc2htZW1f cmVxdWVzdCh2b2lkKTsKKyAjZW5kaWYgLyogUEdfVkVSU0lPTl9OVU0gPj0gMTUwMDAwICov Cisgc3RhdGljIHZvaWQgcGdsbV9zaG1lbV9zdGFydHVwKHZvaWQpOworIHN0YXRpYyB2b2lk IHBnbG1fc2htZW1fc2h1dGRvd24oaW50IGNvZGUsIERhdHVtIGFyZyk7Cisgc3RhdGljIHZv aWQgcGdsbV9sb2dfaG9vayhFcnJvckRhdGEgKmVkYXRhKTsKKyBzdGF0aWMgdm9pZCBwZ2xt X3N0b3JlKEVycm9yRGF0YSAqZWRhdGEpOworIHN0YXRpYyB2b2lkIHBnX3N0YXRfbG9nbXNn X2ludGVybmFsKEZ1bmN0aW9uQ2FsbEluZm8gZmNpbmZvKTsKKyBzdGF0aWMgU2l6ZSBwZ2xt X21lbXNpemUodm9pZCk7Cisgc3RhdGljIHBnbG1FbnRyeSAqZW50cnlfYWxsb2MocGdsbUhh c2hLZXkgKmtleSwgU2l6ZSBsb2dtc2dfb2Zmc2V0LAorIAkJCQkJCQkgIGludCBsb2dtc2df bGVuLCBpbnQgZW5jb2RpbmcsCisgCQkJCQkJCSAgaW50IHNxbGVycmNvZGUsIGNoYXIgKmZ1 bmNuYW1lKTsKKyBzdGF0aWMgdm9pZCBlbnRyeV9kZWFsbG9jKHZvaWQpOworIHN0YXRpYyBi b29sIGxvZ21zZ19zdG9yZShFcnJvckRhdGEgKmVkYXRhLCBTaXplICpsb2dtc2dfb2Zmc2V0 LAorIAkJCQkJCSBpbnQgKmxvZ21zZ19sZW4sIGludCAqZ2NfY291bnQpOworIHN0YXRpYyBj aGFyICpsb2dtc2dfbG9hZF9maWxlKFNpemUgKmJ1ZmZlcl9zaXplKTsKKyBzdGF0aWMgY2hh ciAqbG9nbXNnX2ZldGNoKFNpemUgbG9nbXNnX29mZnNldCwgaW50IGxvZ21zZ19sZW4sCisg CQkJCQkJIGNoYXIgKmJ1ZmZlciwgU2l6ZSBidWZmZXJfc2l6ZSk7Cisgc3RhdGljIGJvb2wg bmVlZF9nY19sb2dtc2dzKHZvaWQpOworIHN0YXRpYyB2b2lkIGdjX2xvZ21zZ3Modm9pZCk7 Cisgc3RhdGljIHZvaWQgZW50cnlfcmVzZXQoY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbm8s IGludCBlbGV2ZWwpOworIHN0YXRpYyB2b2lkIGxvZ21zZ194YWN0X2NhbGxiYWNrKFhhY3RF dmVudCBldmVudCwgdm9pZCAqYXJnKTsKKyAjaWYgUEdfVkVSU0lPTl9OVU0gPCAxNTAwMDAK KyBzdGF0aWMgdm9pZCBJbml0TWF0ZXJpYWxpemVkU1JGKEZ1bmN0aW9uQ2FsbEluZm8gZmNp bmZvLCBiaXRzMzIgZmxhZ3MpOworIHN0YXRpYyBjb25zdCBjaGFyICplcnJvcl9zZXZlcml0 eShpbnQgZWxldmVsKTsKKyAjZW5kaWYgLyogUEdfVkVSU0lPTl9OVU0gPCAxNTAwMDAgKi8K KyAKKyAvKgorICAqIE1vZHVsZSBsb2FkIGNhbGxiYWNrCisgICovCisgdm9pZAorIF9QR19p bml0KHZvaWQpCisgeworIAkvKgorIAkgKiBJbiBvcmRlciB0byBjcmVhdGUgb3VyIHNoYXJl ZCBtZW1vcnkgYXJlYSwgd2UgaGF2ZSB0byBiZSBsb2FkZWQgdmlhCisgCSAqIHNoYXJlZF9w cmVsb2FkX2xpYnJhcmllcy4gIElmIG5vdCwgZmFsbCBvdXQgd2l0aG91dCBob29raW5nIGlu dG8gYW55IG9mCisgCSAqIHRoZSBtYWluIHN5c3RlbS4gIChXZSBkb24ndCB0aHJvdyBlcnJv ciBoZXJlIGJlY2F1c2UgaXQgc2VlbXMgdXNlZnVsIHRvCisgCSAqIGFsbG93IHRoZSBwZ19z dGF0X2xvZ21zZyBmdW5jdGlvbnMgdG8gYmUgY3JlYXRlZCBldmVuIHdoZW4gdGhlCisgCSAq IG1vZHVsZSBpc24ndCBhY3RpdmUuICBUaGUgZnVuY3Rpb25zIG11c3QgcHJvdGVjdCB0aGVt c2VsdmVzIGFnYWluc3QKKyAJICogYmVpbmcgY2FsbGVkIHRoZW4sIGhvd2V2ZXIuKQorIAkg Ki8KKyAJaWYgKCFwcm9jZXNzX3NoYXJlZF9wcmVsb2FkX2xpYnJhcmllc19pbl9wcm9ncmVz cykKKyAJCXJldHVybjsKKyAKKyAJLyoKKyAJICogRGVmaW5lIChvciByZWRlZmluZSkgY3Vz dG9tIEdVQyB2YXJpYWJsZXMuCisgCSAqLworIAlEZWZpbmVDdXN0b21JbnRWYXJpYWJsZSgi cGdfc3RhdF9sb2dtc2cubWF4IiwKKyAJCQkJCQkJIlNldHMgdGhlIG1heGltdW0gbnVtYmVy IG9mIG1lc3NhZ2VzIHRyYWNrZWQgYnkgcGdfc3RhdF9sb2dtc2cuIiwKKyAJCQkJCQkJTlVM TCwKKyAJCQkJCQkJJnBnbG1fbWF4LAorIAkJCQkJCQk1MDAwLAorIAkJCQkJCQkxMDAsCisg CQkJCQkJCUlOVF9NQVggLyAyLAorIAkJCQkJCQlQR0NfUE9TVE1BU1RFUiwKKyAJCQkJCQkJ MCwKKyAJCQkJCQkJTlVMTCwKKyAJCQkJCQkJTlVMTCwKKyAJCQkJCQkJTlVMTCk7CisgCisg I2lmIFBHX1ZFUlNJT05fTlVNID49IDE1MDAwMAorIAlNYXJrR1VDUHJlZml4UmVzZXJ2ZWQo InBnX3N0YXRfbG9nbXNnIik7CisgCisgCS8qCisgCSAqIEluc3RhbGwgaG9va3MuCisgCSAq LworIAlwcmV2X3NobWVtX3JlcXVlc3RfaG9vayA9IHNobWVtX3JlcXVlc3RfaG9vazsKKyAJ c2htZW1fcmVxdWVzdF9ob29rID0gcGdsbV9zaG1lbV9yZXF1ZXN0OworICNlbHNlCisgCUVt aXRXYXJuaW5nc09uUGxhY2Vob2xkZXJzKCJwZ19zdGF0X2xvZ21zZyIpOworIAorIAkvKgor IAkgKiBSZXF1ZXN0IGFkZGl0aW9uYWwgc2hhcmVkIHJlc291cmNlcy4gIChUaGVzZSBhcmUg bm8tb3BzIGlmIHdlJ3JlIG5vdCBpbgorIAkgKiB0aGUgcG9zdG1hc3RlciBwcm9jZXNzLikg IFdlJ2xsIGFsbG9jYXRlIG9yIGF0dGFjaCB0byB0aGUgc2hhcmVkCisgCSAqIHJlc291cmNl cyBpbiBwZ3NzX3NobWVtX3N0YXJ0dXAoKS4KKyAJICovCisgCVJlcXVlc3RBZGRpblNobWVt U3BhY2UocGdsbV9tZW1zaXplKCkpOworIAlSZXF1ZXN0TmFtZWRMV0xvY2tUcmFuY2hlKCJw Z19zdGF0X2xvZ21zZyIsIDEpOworIAorIAkvKgorIAkgKiBJbnN0YWxsIGhvb2tzLgorIAkg Ki8KKyAjZW5kaWYgLyogUEdfVkVSU0lPTl9OVU0gPj0gMTUwMDAwICovCisgCisgCXByZXZf c2htZW1fc3RhcnR1cF9ob29rID0gc2htZW1fc3RhcnR1cF9ob29rOworIAlzaG1lbV9zdGFy dHVwX2hvb2sgPSBwZ2xtX3NobWVtX3N0YXJ0dXA7CisgCisgCXByZXZfZW1pdF9sb2dfaG9v ayA9IGVtaXRfbG9nX2hvb2s7CisgCWVtaXRfbG9nX2hvb2sgPSBwZ2xtX2xvZ19ob29rOwor IAorIAkvKiBBcnJhbmdlIHRvIHJlc3RvcmUgc3RhdGUgaW4gY2FzZSBvZiBFUlJPUiAqLwor IAlSZWdpc3RlclhhY3RDYWxsYmFjayhsb2dtc2dfeGFjdF9jYWxsYmFjaywgTlVMTCk7Cisg fQorIAorICNpZiBQR19WRVJTSU9OX05VTSA+PSAxNTAwMDAKKyAvKgorICAqIHNobWVtX3Jl cXVlc3QgaG9vazogcmVxdWVzdCBhZGRpdGlvbmFsIHNoYXJlZCByZXNvdXJjZXMuICBXZSds bCBhbGxvY2F0ZSBvcgorICAqIGF0dGFjaCB0byB0aGUgc2hhcmVkIHJlc291cmNlcyBpbiBw Z2xtX3NobWVtX3N0YXJ0dXAoKS4KKyAgKi8KKyBzdGF0aWMgdm9pZAorIHBnbG1fc2htZW1f cmVxdWVzdCh2b2lkKQorIHsKKyAJaWYgKHByZXZfc2htZW1fcmVxdWVzdF9ob29rKQorIAkJ cHJldl9zaG1lbV9yZXF1ZXN0X2hvb2soKTsKKyAKKyAJUmVxdWVzdEFkZGluU2htZW1TcGFj ZShwZ2xtX21lbXNpemUoKSk7CisgCVJlcXVlc3ROYW1lZExXTG9ja1RyYW5jaGUoInBnX3N0 YXRfbG9nbXNnIiwgMSk7CisgfQorICNlbmRpZiAvKiBQR19WRVJTSU9OX05VTSA+PSAxNTAw MDAgKi8KKyAKKyAvKgorICAqIHNobWVtX3N0YXJ0dXAgaG9vazogYWxsb2NhdGUgb3IgYXR0 YWNoIHRvIHNoYXJlZCBtZW1vcnksCisgICogdGhlbiBsb2FkIGFueSBwcmUtZXhpc3Rpbmcg c3RhdGlzdGljcyBmcm9tIGZpbGUuCisgICogQWxzbyBjcmVhdGUgYW5kIGxvYWQgdGhlIHF1 ZXJ5LXRleHRzIGZpbGUsIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGV4aXN0CisgICogKGV2ZW4g aWYgZW1wdHkpIHdoaWxlIHRoZSBtb2R1bGUgaXMgZW5hYmxlZC4KKyAgKi8KKyBzdGF0aWMg dm9pZAorIHBnbG1fc2htZW1fc3RhcnR1cCh2b2lkKQorIHsKKyAJYm9vbAkJZm91bmQ7Cisg CUhBU0hDVEwJCWluZm87CisgCUZJTEUJICAgKmZpbGUgPSBOVUxMOworIAlGSUxFCSAgICps bWZpbGUgPSBOVUxMOworIAl1aW50MzIJCWhlYWRlcjsKKyAJaW50MzIJCW51bTsKKyAJaW50 MzIJCXBndmVyOworIAlpbnQzMgkJaTsKKyAJaW50CQkJYnVmZmVyX3NpemU7CisgCWNoYXIJ ICAgKmJ1ZmZlciA9IE5VTEw7CisgCisgCWlmIChwcmV2X3NobWVtX3N0YXJ0dXBfaG9vaykK KyAJCXByZXZfc2htZW1fc3RhcnR1cF9ob29rKCk7CisgCisgCS8qIHJlc2V0IGluIGNhc2Ug dGhpcyBpcyBhIHJlc3RhcnQgd2l0aGluIHRoZSBwb3N0bWFzdGVyICovCisgCXBnbG0gPSBO VUxMOworIAlwZ2xtX2hhc2ggPSBOVUxMOworIAorIAkvKgorIAkgKiBDcmVhdGUgb3IgYXR0 YWNoIHRvIHRoZSBzaGFyZWQgbWVtb3J5IHN0YXRlLCBpbmNsdWRpbmcgaGFzaCB0YWJsZQor IAkgKi8KKyAJTFdMb2NrQWNxdWlyZShBZGRpblNobWVtSW5pdExvY2ssIExXX0VYQ0xVU0lW RSk7CisgCisgCXBnbG0gPSBTaG1lbUluaXRTdHJ1Y3QoInBnX3N0YXRfbG9nbXNnIiwKKyAJ CQkJCQkgICBzaXplb2YocGdsbVNoYXJlZFN0YXRlKSwKKyAJCQkJCQkgICAmZm91bmQpOwor IAorIAlpZiAoIWZvdW5kKQorIAl7CisgCQkvKiBGaXJzdCB0aW1lIHRocm91Z2ggLi4uICov CisgCQlwZ2xtLT5sb2NrID0gJihHZXROYW1lZExXTG9ja1RyYW5jaGUoInBnX3N0YXRfbG9n bXNnIikpLT5sb2NrOworIAkJcGdsbS0+Y3VyX21lZGlhbl91c2FnZSA9IEFTU1VNRURfTUVE SUFOX0lOSVQ7CisgCQlwZ2xtLT5tZWFuX2xvZ21zZ19sZW4gPSBBU1NVTUVEX0xFTkdUSF9J TklUOworIAkJU3BpbkxvY2tJbml0KCZwZ2xtLT5tdXRleCk7CisgCQlwZ2xtLT5leHRlbnQg PSAwOworIAkJcGdsbS0+bl93cml0ZXJzID0gMDsKKyAJCXBnbG0tPmdjX2NvdW50ID0gMDsK KyAJCXBnbG0tPnN0YXRzLmRlYWxsb2MgPSAwOworIAkJcGdsbS0+c3RhdHMuc3RhdHNfcmVz ZXQgPSBHZXRDdXJyZW50VGltZXN0YW1wKCk7CisgCX0KKyAKKyAJaW5mby5rZXlzaXplID0g c2l6ZW9mKHBnbG1IYXNoS2V5KTsKKyAJaW5mby5lbnRyeXNpemUgPSBzaXplb2YocGdsbUVu dHJ5KTsKKyAJcGdsbV9oYXNoID0gU2htZW1Jbml0SGFzaCgicGdfc3RhdF9sb2dtc2cgaGFz aCIsCisgCQkJCQkJCSAgcGdsbV9tYXgsIHBnbG1fbWF4LAorIAkJCQkJCQkgICZpbmZvLAor IAkJCQkJCQkgIEhBU0hfRUxFTSB8IEhBU0hfQkxPQlMpOworIAorIAlMV0xvY2tSZWxlYXNl KEFkZGluU2htZW1Jbml0TG9jayk7CisgCisgCS8qCisgCSAqIElmIHdlJ3JlIGluIHRoZSBw b3N0bWFzdGVyIChvciBhIHN0YW5kYWxvbmUgYmFja2VuZC4uLiksIHNldCB1cCBhIHNobWVt CisgCSAqIGV4aXQgaG9vayB0byBkdW1wIHRoZSBzdGF0aXN0aWNzIHRvIGRpc2suCisgCSAq LworIAlpZiAoIUlzVW5kZXJQb3N0bWFzdGVyKQorIAkJb25fc2htZW1fZXhpdChwZ2xtX3No bWVtX3NodXRkb3duLCAoRGF0dW0pIDApOworIAorIAkvKgorIAkgKiBEb25lIGlmIHNvbWUg b3RoZXIgcHJvY2VzcyBhbHJlYWR5IGNvbXBsZXRlZCBvdXIgaW5pdGlhbGl6YXRpb24uCisg CSAqLworIAlpZiAoZm91bmQpCisgCQlyZXR1cm47CisgCisgCS8qCisgCSAqIE5vdGU6IHdl IGRvbid0IGJvdGhlciB3aXRoIGxvY2tzIGhlcmUsIGJlY2F1c2UgdGhlcmUgc2hvdWxkIGJl IG5vIG90aGVyCisgCSAqIHByb2Nlc3NlcyBydW5uaW5nIHdoZW4gdGhpcyBjb2RlIGlzIHJl YWNoZWQuCisgCSAqLworIAorIAkvKiBVbmxpbmsgbG9nbXNnIHRleHQgZmlsZSBwb3NzaWJs eSBsZWZ0IG92ZXIgZnJvbSBjcmFzaCAqLworIAl1bmxpbmsoUEdMTV9URVhUX0ZJTEUpOwor IAorIAkvKiBBbGxvY2F0ZSBuZXcgbG9nbXNnIHRleHQgdGVtcCBmaWxlICovCisgCWxtZmls ZSA9IEFsbG9jYXRlRmlsZShQR0xNX1RFWFRfRklMRSwgUEdfQklOQVJZX1cpOworIAlpZiAo bG1maWxlID09IE5VTEwpCisgCQlnb3RvIHdyaXRlX2Vycm9yOworIAorIAkvKgorIAkgKiBB dHRlbXB0IHRvIGxvYWQgb2xkIHN0YXRpc3RpY3MgZnJvbSB0aGUgZHVtcCBmaWxlLgorIAkg Ki8KKyAJZmlsZSA9IEFsbG9jYXRlRmlsZShQR0xNX0RVTVBfRklMRSwgUEdfQklOQVJZX1Ip OworIAlpZiAoZmlsZSA9PSBOVUxMKQorIAl7CisgCQlpZiAoZXJybm8gIT0gRU5PRU5UKQor IAkJCWdvdG8gcmVhZF9lcnJvcjsKKyAJCS8qIE5vIGV4aXN0aW5nIHBlcnNpc3RlZCBzdGF0 cyBmaWxlLCBzbyB3ZSdyZSBkb25lICovCisgCQlGcmVlRmlsZShsbWZpbGUpOworIAkJcmV0 dXJuOworIAl9CisgCisgCWJ1ZmZlcl9zaXplID0gMjA0ODsKKyAJYnVmZmVyID0gKGNoYXIg KikgcGFsbG9jKGJ1ZmZlcl9zaXplKTsKKyAKKyAJaWYgKGZyZWFkKCZoZWFkZXIsIHNpemVv Zih1aW50MzIpLCAxLCBmaWxlKSAhPSAxIHx8CisgCQlmcmVhZCgmcGd2ZXIsIHNpemVvZih1 aW50MzIpLCAxLCBmaWxlKSAhPSAxIHx8CisgCQlmcmVhZCgmbnVtLCBzaXplb2YoaW50MzIp LCAxLCBmaWxlKSAhPSAxKQorIAkJZ290byByZWFkX2Vycm9yOworIAorIAlpZiAoaGVhZGVy ICE9IFBHTE1fRklMRV9IRUFERVIgfHwKKyAJCXBndmVyICE9IFBHTE1fUEdfTUFKT1JfVkVS U0lPTikKKyAJCWdvdG8gZGF0YV9lcnJvcjsKKyAKKyAJZm9yIChpID0gMDsgaSA8IG51bTsg aSsrKQorIAl7CisgCQlwZ2xtRW50cnkJdGVtcDsKKyAJCXBnbG1FbnRyeSAgKmVudHJ5Owor IAkJU2l6ZQkJbG9nbXNnX29mZnNldDsKKyAKKyAJCWlmIChmcmVhZCgmdGVtcCwgc2l6ZW9m KHBnbG1FbnRyeSksIDEsIGZpbGUpICE9IDEpCisgCQkJZ290byByZWFkX2Vycm9yOworIAor IAkJLyogRW5jb2RpbmcgaXMgdGhlIG9ubHkgZmllbGQgd2UgY2FuIGVhc2lseSBzYW5pdHkt Y2hlY2sgKi8KKyAJCWlmICghUEdfVkFMSURfQkVfRU5DT0RJTkcodGVtcC5lbmNvZGluZykp CisgCQkJZ290byBkYXRhX2Vycm9yOworIAorIAkJLyogUmVzaXplIGJ1ZmZlciBhcyBuZWVk ZWQgKi8KKyAJCWlmICh0ZW1wLmxvZ21zZ19sZW4gPj0gYnVmZmVyX3NpemUpCisgCQl7Cisg CQkJYnVmZmVyX3NpemUgPSBNYXgoYnVmZmVyX3NpemUgKiAyLCB0ZW1wLmxvZ21zZ19sZW4g KyAxKTsKKyAJCQlidWZmZXIgPSByZXBhbGxvYyhidWZmZXIsIGJ1ZmZlcl9zaXplKTsKKyAJ CX0KKyAKKyAJCWlmIChmcmVhZChidWZmZXIsIDEsIHRlbXAubG9nbXNnX2xlbiArIDEsIGZp bGUpICE9IHRlbXAubG9nbXNnX2xlbiArIDEpCisgCQkJZ290byByZWFkX2Vycm9yOworIAor IAkJLyogU2hvdWxkIGhhdmUgYSB0cmFpbGluZyBudWxsLCBidXQgbGV0J3MgbWFrZSBzdXJl ICovCisgCQlidWZmZXJbdGVtcC5sb2dtc2dfbGVuXSA9ICdcMCc7CisgCisgCQkvKiBTdG9y ZSB0aGUgbG9nbXNnIHRleHQgKi8KKyAJCWxvZ21zZ19vZmZzZXQgPSBwZ2xtLT5leHRlbnQ7 CisgCQlpZiAoZndyaXRlKGJ1ZmZlciwgMSwgdGVtcC5sb2dtc2dfbGVuICsgMSwgbG1maWxl KSAhPSB0ZW1wLmxvZ21zZ19sZW4gKyAxKQorIAkJCWdvdG8gd3JpdGVfZXJyb3I7CisgCQlw Z2xtLT5leHRlbnQgKz0gdGVtcC5sb2dtc2dfbGVuICsgMTsKKyAKKyAJCS8qIG1ha2UgdGhl IGhhc2h0YWJsZSBlbnRyeSAoZGlzY2FyZHMgb2xkIGVudHJpZXMgaWYgdG9vIG1hbnkpICov CisgCQllbnRyeSA9IGVudHJ5X2FsbG9jKCZ0ZW1wLmtleSwgbG9nbXNnX29mZnNldCwgdGVt cC5sb2dtc2dfbGVuLAorIAkJCQkJCQl0ZW1wLmVuY29kaW5nLCB0ZW1wLnNxbGVycmNvZGUs IHRlbXAuZnVuY25hbWUpOworIAorIAkJLyogY29weSBpbiB0aGUgYWN0dWFsIHN0YXRzICov CisgCQllbnRyeS0+Y291bnRlcnMgPSB0ZW1wLmNvdW50ZXJzOworIAl9CisgCisgCS8qIFJl YWQgZ2xvYmFsIHN0YXRpc3RpY3MgZm9yIHBnX3N0YXRfbG9nbXNnICovCisgCWlmIChmcmVh ZCgmcGdsbS0+c3RhdHMsIHNpemVvZihwZ2xtR2xvYmFsU3RhdHMpLCAxLCBmaWxlKSAhPSAx KQorIAkJZ290byByZWFkX2Vycm9yOworIAorIAlwZnJlZShidWZmZXIpOworIAlGcmVlRmls ZShmaWxlKTsKKyAJRnJlZUZpbGUobG1maWxlKTsKKyAKKyAJLyoKKyAJICogUmVtb3ZlIHRo ZSBwZXJzaXN0ZWQgc3RhdHMgZmlsZSBzbyBpdCdzIG5vdCBpbmNsdWRlZCBpbgorIAkgKiBi YWNrdXBzL3JlcGxpY2F0aW9uIHN0YW5kYnlzLCBldGMuICBBIG5ldyBmaWxlIHdpbGwgYmUg d3JpdHRlbiBvbiBuZXh0CisgCSAqIHNodXRkb3duLgorIAkgKgorIAkgKiBOb3RlOiBpdCdz IG9rYXkgaWYgdGhlIFBHTE1fVEVYVF9GSUxFIGlzIGluY2x1ZGVkIGluIGEgYmFzZWJhY2t1 cCwKKyAJICogYmVjYXVzZSB3ZSByZW1vdmUgdGhhdCBmaWxlIG9uIHN0YXJ0dXA7IGl0IGFj dHMgaW52ZXJzZWx5IHRvCisgCSAqIFBHTE1fRFVNUF9GSUxFLCBpbiB0aGF0IGl0IGlzIG9u bHkgc3VwcG9zZWQgdG8gYmUgYXJvdW5kIHdoZW4gdGhlCisgCSAqIHNlcnZlciBpcyBydW5u aW5nLCB3aGVyZWFzIFBHTE1fRFVNUF9GSUxFIGlzIG9ubHkgc3VwcG9zZWQgdG8gYmUgYXJv dW5kCisgCSAqIHdoZW4gdGhlIHNlcnZlciBpcyBub3QgcnVubmluZy4gIExlYXZpbmcgdGhl IGZpbGUgY3JlYXRlcyBubyBkYW5nZXIgb2YKKyAJICogYSBuZXdseSByZXN0b3JlZCBkYXRh YmFzZSBoYXZpbmcgYSBzcHVyaW91cyByZWNvcmQgb2YgZXhlY3V0aW9uIGNvc3RzLAorIAkg KiB3aGljaCBpcyB3aGF0IHdlJ3JlIHJlYWxseSBjb25jZXJuZWQgYWJvdXQgaGVyZS4KKyAJ ICovCisgCXVubGluayhQR0xNX0RVTVBfRklMRSk7CisgCisgCXJldHVybjsKKyAKKyByZWFk X2Vycm9yOgorIAllcmVwb3J0KExPRywKKyAJCQkoZXJyY29kZV9mb3JfZmlsZV9hY2Nlc3Mo KSwKKyAJCQkgZXJybXNnKCJjb3VsZCBub3QgcmVhZCBmaWxlIFwiJXNcIjogJW0iLAorIAkJ CQkJUEdMTV9EVU1QX0ZJTEUpKSk7CisgCWdvdG8gZmFpbDsKKyBkYXRhX2Vycm9yOgorIAll cmVwb3J0KExPRywKKyAJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfUEFSQU1FVEVSX1ZB TFVFKSwKKyAJCQkgZXJybXNnKCJpZ25vcmluZyBpbnZhbGlkIGRhdGEgaW4gZmlsZSBcIiVz XCIiLAorIAkJCQkJUEdMTV9EVU1QX0ZJTEUpKSk7CisgCWdvdG8gZmFpbDsKKyB3cml0ZV9l cnJvcjoKKyAJZXJlcG9ydChMT0csCisgCQkJKGVycmNvZGVfZm9yX2ZpbGVfYWNjZXNzKCks CisgCQkJIGVycm1zZygiY291bGQgbm90IHdyaXRlIGZpbGUgXCIlc1wiOiAlbSIsCisgCQkJ CQlQR0xNX1RFWFRfRklMRSkpKTsKKyBmYWlsOgorIAlpZiAoYnVmZmVyKQorIAkJcGZyZWUo YnVmZmVyKTsKKyAJaWYgKGZpbGUpCisgCQlGcmVlRmlsZShmaWxlKTsKKyAJaWYgKGxtZmls ZSkKKyAJCUZyZWVGaWxlKGxtZmlsZSk7CisgCS8qIElmIHBvc3NpYmxlLCB0aHJvdyBhd2F5 IHRoZSBib2d1cyBmaWxlOyBpZ25vcmUgYW55IGVycm9yICovCisgCXVubGluayhQR0xNX0RV TVBfRklMRSk7CisgCisgCS8qCisgCSAqIERvbid0IHVubGluayBQR0xNX1RFWFRfRklMRSBo ZXJlOyBpdCBzaG91bGQgYWx3YXlzIGJlIGFyb3VuZCB3aGlsZSB0aGUKKyAJICogc2VydmVy IGlzIHJ1bm5pbmcgd2l0aCBwZ19zdGF0X2xvZ21zZyBlbmFibGVkCisgCSAqLworIH0KKyAK KyAvKgorICAqIHNobWVtX3NodXRkb3duIGhvb2s6IER1bXAgc3RhdGlzdGljcyBpbnRvIGZp bGUuCisgICoKKyAgKiBOb3RlOiB3ZSBkb24ndCBib3RoZXIgd2l0aCBhY3F1aXJpbmcgbG9j aywgYmVjYXVzZSB0aGVyZSBzaG91bGQgYmUgbm8KKyAgKiBvdGhlciBwcm9jZXNzZXMgcnVu bmluZyB3aGVuIHRoaXMgaXMgY2FsbGVkLgorICAqLworIHN0YXRpYyB2b2lkCisgcGdsbV9z aG1lbV9zaHV0ZG93bihpbnQgY29kZSwgRGF0dW0gYXJnKQorIHsKKyAJRklMRQkgICAqZmls ZTsKKyAJY2hhcgkgICAqbWxidWZmZXIgPSBOVUxMOworIAlTaXplCQltbGJ1ZmZlcl9zaXpl ID0gMDsKKyAJSEFTSF9TRVFfU1RBVFVTIGhhc2hfc2VxOworIAlpbnQzMgkJbnVtX2VudHJp ZXM7CisgCXBnbG1FbnRyeSAgKmVudHJ5OworIAorIAkvKiBEb24ndCB0cnkgdG8gZHVtcCBk dXJpbmcgYSBjcmFzaC4gKi8KKyAJaWYgKGNvZGUpCisgCQlyZXR1cm47CisgCisgCS8qIFNh ZmV0eSBjaGVjayAuLi4gc2hvdWxkbid0IGdldCBoZXJlIHVubGVzcyBzaG1lbSBpcyBzZXQg dXAuICovCisgCWlmICghcGdsbSB8fCAhcGdsbV9oYXNoKQorIAkJcmV0dXJuOworIAorIAlm aWxlID0gQWxsb2NhdGVGaWxlKFBHTE1fRFVNUF9GSUxFICIudG1wIiwgUEdfQklOQVJZX1cp OworIAlpZiAoZmlsZSA9PSBOVUxMKQorIAkJZ290byBlcnJvcjsKKyAKKyAJaWYgKGZ3cml0 ZSgmUEdMTV9GSUxFX0hFQURFUiwgc2l6ZW9mKHVpbnQzMiksIDEsIGZpbGUpICE9IDEpCisg CQlnb3RvIGVycm9yOworIAlpZiAoZndyaXRlKCZQR0xNX1BHX01BSk9SX1ZFUlNJT04sIHNp emVvZih1aW50MzIpLCAxLCBmaWxlKSAhPSAxKQorIAkJZ290byBlcnJvcjsKKyAJbnVtX2Vu dHJpZXMgPSBoYXNoX2dldF9udW1fZW50cmllcyhwZ2xtX2hhc2gpOworIAlpZiAoZndyaXRl KCZudW1fZW50cmllcywgc2l6ZW9mKGludDMyKSwgMSwgZmlsZSkgIT0gMSkKKyAJCWdvdG8g ZXJyb3I7CisgCisgCW1sYnVmZmVyID0gbG9nbXNnX2xvYWRfZmlsZSgmbWxidWZmZXJfc2l6 ZSk7CisgCWlmIChtbGJ1ZmZlciA9PSBOVUxMKQorIAkJZ290byBlcnJvcjsKKyAKKyAJLyoK KyAJICogV2hlbiBzZXJpYWxpemluZyB0byBkaXNrLCB3ZSBzdG9yZSBsb2dtc2cgdGV4dHMg aW1tZWRpYXRlbHkgYWZ0ZXIgdGhlaXIKKyAJICogZW50cnkgZGF0YS4gIEFueSBvcnBoYW5l ZCBsb2dtc2cgdGV4dHMgYXJlIHRoZXJlYnkgZXhjbHVkZWQuCisgCSAqLworIAloYXNoX3Nl cV9pbml0KCZoYXNoX3NlcSwgcGdsbV9oYXNoKTsKKyAJd2hpbGUgKChlbnRyeSA9IGhhc2hf c2VxX3NlYXJjaCgmaGFzaF9zZXEpKSAhPSBOVUxMKQorIAl7CisgCQlpbnQJCQlsZW4gPSBl bnRyeS0+bG9nbXNnX2xlbjsKKyAJCWNoYXIJICAgKnFzdHIgPSBsb2dtc2dfZmV0Y2goZW50 cnktPmxvZ21zZ19vZmZzZXQsIGxlbiwKKyAJCQkJCQkJCQkgICBtbGJ1ZmZlciwgbWxidWZm ZXJfc2l6ZSk7CisgCisgCQlpZiAocXN0ciA9PSBOVUxMKQorIAkJCWNvbnRpbnVlOwkJCS8q IElnbm9yZSBhbnkgZW50cmllcyB3aXRoIGJvZ3VzIHRleHRzICovCisgCisgCQlpZiAoZndy aXRlKGVudHJ5LCBzaXplb2YocGdsbUVudHJ5KSwgMSwgZmlsZSkgIT0gMSB8fAorIAkJCWZ3 cml0ZShxc3RyLCAxLCBsZW4gKyAxLCBmaWxlKSAhPSBsZW4gKyAxKQorIAkJeworIAkJCS8q IG5vdGU6IHdlIGFzc3VtZSBoYXNoX3NlcV90ZXJtIHdvbid0IGNoYW5nZSBlcnJubyAqLwor IAkJCWhhc2hfc2VxX3Rlcm0oJmhhc2hfc2VxKTsKKyAJCQlnb3RvIGVycm9yOworIAkJfQor IAl9CisgCisgCS8qIER1bXAgZ2xvYmFsIHN0YXRpc3RpY3MgZm9yIHBnX3N0YXRfbG9nbXNn ICovCisgCWlmIChmd3JpdGUoJnBnbG0tPnN0YXRzLCBzaXplb2YocGdsbUdsb2JhbFN0YXRz KSwgMSwgZmlsZSkgIT0gMSkKKyAJCWdvdG8gZXJyb3I7CisgCisgCWZyZWUobWxidWZmZXIp OworIAltbGJ1ZmZlciA9IE5VTEw7CisgCisgCWlmIChGcmVlRmlsZShmaWxlKSkKKyAJewor IAkJZmlsZSA9IE5VTEw7CisgCQlnb3RvIGVycm9yOworIAl9CisgCisgCS8qCisgCSAqIFJl bmFtZSBmaWxlIGludG8gcGxhY2UsIHNvIHdlIGF0b21pY2FsbHkgcmVwbGFjZSBhbnkgb2xk IG9uZS4KKyAJICovCisgCSh2b2lkKSBkdXJhYmxlX3JlbmFtZShQR0xNX0RVTVBfRklMRSAi LnRtcCIsIFBHTE1fRFVNUF9GSUxFLCBMT0cpOworIAorIAkvKiBVbmxpbmsgbG9nbXNnLXRl eHRzIGZpbGU7IGl0J3Mgbm90IG5lZWRlZCB3aGlsZSBzaHV0ZG93biAqLworIAl1bmxpbmso UEdMTV9URVhUX0ZJTEUpOworIAorIAlyZXR1cm47CisgCisgZXJyb3I6CisgCWVyZXBvcnQo TE9HLAorIAkJCShlcnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAorIAkJCSBlcnJtc2coImNv dWxkIG5vdCB3cml0ZSBmaWxlIFwiJXNcIjogJW0iLAorIAkJCQkJUEdMTV9EVU1QX0ZJTEUg Ii50bXAiKSkpOworIAlmcmVlKG1sYnVmZmVyKTsKKyAJaWYgKGZpbGUpCisgCQlGcmVlRmls ZShmaWxlKTsKKyAJdW5saW5rKFBHTE1fRFVNUF9GSUxFICIudG1wIik7CisgCXVubGluayhQ R0xNX1RFWFRfRklMRSk7CisgfQorIAorIC8qCisgICogbG9nIGhvb2s6IHN0b3JlIHJlc3Vs dHMgaWYgbmVlZGVkCisgICovCisgc3RhdGljIHZvaWQKKyBwZ2xtX2xvZ19ob29rKEVycm9y RGF0YSAqZWRhdGEpCisgeworIAlpZiAoIWlzX2luX2xvZ19ob29rKQorIAl7CisgCQlpc19p bl9sb2dfaG9vayA9IHRydWU7CisgCQlwZ2xtX3N0b3JlKGVkYXRhKTsKKyAJCWlzX2luX2xv Z19ob29rID0gZmFsc2U7CisgCX0KKyAKKyAJaWYgKHByZXZfZW1pdF9sb2dfaG9vaykKKyAJ CXByZXZfZW1pdF9sb2dfaG9vayhlZGF0YSk7CisgfQorIAorIC8qCisgICogU3RvcmUgc3Rh dGlzdGljcyBmb3IgYSBsb2cgbWVzc2FnZS4KKyAgKi8KKyBzdGF0aWMgdm9pZAorIHBnbG1f c3RvcmUoRXJyb3JEYXRhICplZGF0YSkKKyB7CisgCXBnbG1IYXNoS2V5IGtleTsKKyAJcGds bUVudHJ5ICAqZW50cnk7CisgCWludAkJCWVuY29kaW5nID0gR2V0RGF0YWJhc2VFbmNvZGlu ZygpOworIAlzaXplX3QJCWZpbGVuYW1lX2xlbjsKKyAKKyAJQXNzZXJ0KGVkYXRhICE9IE5V TEwpOworIAorIAkvKiBTYWZldHkgY2hlY2suLi4gKi8KKyAJaWYgKCFwZ2xtIHx8ICFwZ2xt X2hhc2gpCisgCQlyZXR1cm47CisgCisgCS8qIFNldCB1cCBrZXkgZm9yIGhhc2h0YWJsZSBz ZWFyY2ggKi8KKyAKKyAJLyogbWVtc2V0KCkgaXMgcmVxdWlyZWQgd2hlbiBwZ2xtSGFzaEtl eSBpcyB3aXRob3V0IHBhZGRpbmcgb25seSAqLworIAltZW1zZXQoJmtleSwgMCwgc2l6ZW9m KHBnbG1IYXNoS2V5KSk7CisgCisgCS8qIG1ha2UgcGVyc2lzdGVudCBjb3BpZXMgb2Ygc3Ry aW5ncyAqLworIAlpZiAoZWRhdGEtPmZpbGVuYW1lKQorIAl7CisgCQlmaWxlbmFtZV9sZW4g PSBzdHJsZW4oZWRhdGEtPmZpbGVuYW1lKTsKKyAJCW1lbWNweShrZXkuZmlsZW5hbWUsIGVk YXRhLT5maWxlbmFtZSwKKyAJCQkgICBmaWxlbmFtZV9sZW4gPCBNQVhGSUxFTkFNRUxFTiA/ CisgCQkJCQkJCSAgZmlsZW5hbWVfbGVuIDogTUFYRklMRU5BTUVMRU4gKTsKKyAJfQorIAor IAlrZXkubGluZW5vID0gZWRhdGEtPmxpbmVubzsKKyAJa2V5LmVsZXZlbCA9IGVkYXRhLT5l bGV2ZWw7CisgCisgCS8qIExvb2t1cCB0aGUgaGFzaCB0YWJsZSBlbnRyeSB3aXRoIHNoYXJl ZCBsb2NrLiAqLworIAlMV0xvY2tBY3F1aXJlKHBnbG0tPmxvY2ssIExXX1NIQVJFRCk7Cisg CisgCWVudHJ5ID0gKHBnbG1FbnRyeSAqKSBoYXNoX3NlYXJjaChwZ2xtX2hhc2gsICZrZXks IEhBU0hfRklORCwgTlVMTCk7CisgCisgCS8qIENyZWF0ZSBuZXcgZW50cnksIGlmIG5vdCBw cmVzZW50ICovCisgCWlmICghZW50cnkpCisgCXsKKyAJCVNpemUJCWxvZ21zZ19vZmZzZXQ7 CisgCQlpbnQJCQlsb2dtc2dfbGVuOyAKKyAJCWludAkJCWdjX2NvdW50OworIAkJYm9vbAkJ c3RvcmVkOworIAkJYm9vbAkJZG9fZ2M7CisgCisgCQkvKiBBcHBlbmQgbmV3IGxvZ21zZyB0 ZXh0IHRvIGZpbGUgd2l0aCBvbmx5IHNoYXJlZCBsb2NrIGhlbGQgKi8KKyAJCXN0b3JlZCA9 IGxvZ21zZ19zdG9yZShlZGF0YSwgJmxvZ21zZ19vZmZzZXQsICZsb2dtc2dfbGVuLCAmZ2Nf Y291bnQpOworIAorIAkJLyoKKyAJCSAqIERldGVybWluZSB3aGV0aGVyIHdlIG5lZWQgdG8g Z2FyYmFnZSBjb2xsZWN0IGV4dGVybmFsIGxvZ21zZyB0ZXh0cworIAkJICogd2hpbGUgdGhl IHNoYXJlZCBsb2NrIGlzIHN0aWxsIGhlbGQuICBUaGlzIG1pY3JvLW9wdGltaXphdGlvbgor IAkJICogYXZvaWRzIHRha2luZyB0aGUgdGltZSB0byBkZWNpZGUgdGhpcyB3aGlsZSBob2xk aW5nIGV4Y2x1c2l2ZSBsb2NrLgorIAkJICovCisgCQlkb19nYyA9IG5lZWRfZ2NfbG9nbXNn cygpOworIAorIAkJLyogTmVlZCBleGNsdXNpdmUgbG9jayB0byBtYWtlIGEgbmV3IGhhc2h0 YWJsZSBlbnRyeSAtIHByb21vdGUgKi8KKyAJCUxXTG9ja1JlbGVhc2UocGdsbS0+bG9jayk7 CisgCQlMV0xvY2tBY3F1aXJlKHBnbG0tPmxvY2ssIExXX0VYQ0xVU0lWRSk7CisgCisgCQkv KgorIAkJICogQSBnYXJiYWdlIGNvbGxlY3Rpb24gbWF5IGhhdmUgb2NjdXJyZWQgd2hpbGUg d2Ugd2VyZW4ndCBob2xkaW5nIHRoZQorIAkJICogbG9jay4gIEluIHRoZSB1bmxpa2VseSBl dmVudCB0aGF0IHRoaXMgaGFwcGVucywgdGhlIGxvZ21zZyB0ZXh0IHdlCisgCQkgKiBzdG9y ZWQgYWJvdmUgd2lsbCBoYXZlIGJlZW4gZ2FyYmFnZSBjb2xsZWN0ZWQsIHNvIHdyaXRlIGl0 IGFnYWluLgorIAkJICogVGhpcyBzaG91bGQgYmUgaW5mcmVxdWVudCBlbm91Z2ggdGhhdCBk b2luZyBpdCB3aGlsZSBob2xkaW5nCisgCQkgKiBleGNsdXNpdmUgbG9jayBpc24ndCBhIHBl cmZvcm1hbmNlIHByb2JsZW0uCisgCQkgKi8KKyAJCWlmICghc3RvcmVkIHx8IHBnbG0tPmdj X2NvdW50ICE9IGdjX2NvdW50KQorIAkJCXN0b3JlZCA9IGxvZ21zZ19zdG9yZShlZGF0YSwg JmxvZ21zZ19vZmZzZXQsICZsb2dtc2dfbGVuLCBOVUxMKTsKKyAKKyAJCS8qIElmIHdlIGZh aWxlZCB0byB3cml0ZSB0byB0aGUgdGV4dCBmaWxlLCBnaXZlIHVwICovCisgCQlpZiAoIXN0 b3JlZCkKKyAJCQlnb3RvIGRvbmU7CisgCisgCQkvKiBPSyB0byBjcmVhdGUgYSBuZXcgaGFz aHRhYmxlIGVudHJ5ICovCisgCQllbnRyeSA9IGVudHJ5X2FsbG9jKCZrZXksIGxvZ21zZ19v ZmZzZXQsIGxvZ21zZ19sZW4sCisgCQkJCQkJCWVuY29kaW5nLCBlZGF0YS0+c3FsZXJyY29k ZSwKKyAJCQkJCQkJKGNoYXIgKikgZWRhdGEtPmZ1bmNuYW1lKTsKKyAKKyAJCS8qIElmIG5l ZWRlZCwgcGVyZm9ybSBnYXJiYWdlIGNvbGxlY3Rpb24gd2hpbGUgZXhjbHVzaXZlIGxvY2sg aGVsZCAqLworIAkJaWYgKGRvX2djKQorIAkJCWdjX2xvZ21zZ3MoKTsKKyAJfQorIAorIAkv KgorIAkgKiBHcmFiIHRoZSBzcGlubG9jayB3aGlsZSB1cGRhdGluZyB0aGUgY291bnRlcnMg KHNlZSBjb21tZW50IGFib3V0CisgCSAqIGxvY2tpbmcgcnVsZXMgYXQgdGhlIGhlYWQgb2Yg dGhlIGZpbGUpCisgCSAqLworIAl7CisgCQl2b2xhdGlsZSBwZ2xtRW50cnkgKmUgPSAodm9s YXRpbGUgcGdsbUVudHJ5ICopIGVudHJ5OworIAorIAkJU3BpbkxvY2tBY3F1aXJlKCZlLT5t dXRleCk7CisgCQllLT5jb3VudGVycy5tc2djbnQgKz0gMTsKKyAJCVNwaW5Mb2NrUmVsZWFz ZSgmZS0+bXV0ZXgpOworIAl9CisgCisgZG9uZToKKyAJTFdMb2NrUmVsZWFzZShwZ2xtLT5s b2NrKTsKKyB9CisgCisgLyoKKyAgKiBSZXNldCBzdGF0ZW1lbnQgc3RhdGlzdGljcy4KKyAg Ki8KKyBEYXR1bQorIHBnX3N0YXRfbG9nbXNnX3Jlc2V0KFBHX0ZVTkNUSU9OX0FSR1MpCisg eworIAllbnRyeV9yZXNldChOVUxMLCAwLCAwKTsKKyAKKyAJUEdfUkVUVVJOX1ZPSUQoKTsK KyB9CisgCisgLyogTnVtYmVyIG9mIG91dHB1dCBhcmd1bWVudHMgKGNvbHVtbnMpICovCisg I2RlZmluZSBQR19TVEFUX0xPR01TR19DT0xTCQkJOQorIAorIERhdHVtCisgcGdfc3RhdF9s b2dtc2coUEdfRlVOQ1RJT05fQVJHUykKKyB7CisgCXBnX3N0YXRfbG9nbXNnX2ludGVybmFs KGZjaW5mbyk7CisgCisgCXJldHVybiAoRGF0dW0pIDA7CisgfQorIAorIC8qIENvbW1vbiBj b2RlIGZvciBhbGwgdmVyc2lvbnMgb2YgcGdfc3RhdF9zdGF0ZW1lbnRzKCkgKi8KKyBzdGF0 aWMgdm9pZAorIHBnX3N0YXRfbG9nbXNnX2ludGVybmFsKEZ1bmN0aW9uQ2FsbEluZm8gZmNp bmZvKQorIHsKKyAJUmV0dXJuU2V0SW5mbyAgKnJzaW5mbyA9IChSZXR1cm5TZXRJbmZvICop IGZjaW5mby0+cmVzdWx0aW5mbzsKKyAJT2lkCQkJCXVzZXJpZCA9IEdldFVzZXJJZCgpOwor IAljaGFyCQkgICAqbWxidWZmZXIgPSBOVUxMOworIAlTaXplCQkJbWxidWZmZXJfc2l6ZSA9 IDA7CisgCVNpemUJCQlleHRlbnQgPSAwOworIAlpbnQJCQkJZ2NfY291bnQgPSAwOworIAlI QVNIX1NFUV9TVEFUVVMgaGFzaF9zZXE7CisgCXBnbG1FbnRyeQkgICAqZW50cnk7CisgCWlu dAkJCQluX3dyaXRlcnM7CisgCisgCS8qCisgCSAqIFN1cGVydXNlcnMgb3Igcm9sZXMgd2l0 aCB0aGUgcHJpdmlsZWdlcyBvZiBwZ19yZWFkX2FsbF9zdGF0cyBtZW1iZXJzCisgCSAqIGFy ZSBhbGxvd2VkCisgCSAqLworICNpZiBQR19WRVJTSU9OX05VTSA+PSAxNDAwMDAKKyAjZGVm aW5lIFBHTE1fU1RBVFNST0xFCQlST0xFX1BHX1JFQURfQUxMX1NUQVRTCisgI2Vsc2UKKyAj ZGVmaW5lIFBHTE1fU1RBVFNST0xFCQlERUZBVUxUX1JPTEVfUkVBRF9BTExfU1RBVFMKKyAj ZW5kaWYgLyogUEdfVkVSU0lPTl9OVU0gPj0gMTQwMDAwICovCisgCWlmICghaGFzX3ByaXZz X29mX3JvbGUodXNlcmlkLCBQR0xNX1NUQVRTUk9MRSkpCisgCQllcmVwb3J0KEVSUk9SLAor IAkJCQkoZXJyY29kZShFUlJDT0RFX0lOU1VGRklDSUVOVF9QUklWSUxFR0UpLAorIAkJCQkg ZXJybXNnKCJtdXN0IGJlIG1lbWJlciBvZiAlcyByb2xlIiwKKyAJCQkJIEdldFVzZXJOYW1l RnJvbUlkKFBHTE1fU1RBVFNST0xFLCBmYWxzZSkpKSk7CisgCisgCS8qIGhhc2ggdGFibGUg bXVzdCBleGlzdCBhbHJlYWR5ICovCisgCWlmICghcGdsbSB8fCAhcGdsbV9oYXNoKQorIAkJ ZXJlcG9ydChFUlJPUiwKKyAJCQkJKGVycmNvZGUoRVJSQ09ERV9PQkpFQ1RfTk9UX0lOX1BS RVJFUVVJU0lURV9TVEFURSksCisgCQkJCSBlcnJtc2coInBnX3N0YXRfbG9nbXNnIG11c3Qg YmUgbG9hZGVkIHZpYSBzaGFyZWRfcHJlbG9hZF9saWJyYXJpZXMiKSkpOworIAorIAlJbml0 TWF0ZXJpYWxpemVkU1JGKGZjaW5mbywgMCk7CisgCisgCS8qIENoZWNrIHdlIGhhdmUgdGhl IGV4cGVjdGVkIG51bWJlciBvZiBvdXRwdXQgYXJndW1lbnRzLiAqLworIAlpZiAocnNpbmZv LT5zZXREZXNjLT5uYXR0cyAhPSBQR19TVEFUX0xPR01TR19DT0xTKQorIAkJZWxvZyhFUlJP UiwgImluY29ycmVjdCBudW1iZXIgb2Ygb3V0cHV0IGFyZ3VtZW50cyIpOworIAorIAkvKgor IAkgKiBXZSdkIGxpa2UgdG8gbG9hZCB0aGUgbG9nbXNnIHRleHQgZmlsZSAoaWYgbmVlZGVk KSB3aGlsZSBub3QgaG9sZGluZyBhbnkKKyAJICogbG9jayBvbiBwZ2xtLT5sb2NrLiAgSW4g dGhlIHdvcnN0IGNhc2Ugd2UnbGwgaGF2ZSB0byBkbyB0aGlzIGFnYWluCisgCSAqIGFmdGVy IHdlIGhhdmUgdGhlIGxvY2ssIGJ1dCBpdCdzIHVubGlrZWx5IGVub3VnaCB0byBtYWtlIHRo aXMgYSB3aW4KKyAJICogZGVzcGl0ZSBvY2Nhc2lvbmFsIGR1cGxpY2F0ZWQgd29yay4gIFdl IG5lZWQgdG8gcmVsb2FkIGlmIGFueWJvZHkKKyAJICogd3JpdGVzIHRvIHRoZSBmaWxlIChl aXRoZXIgYSByZXRhaWwgbG9nbXNnX3N0b3JlKCksIG9yIGEgZ2FyYmFnZQorIAkgKiBjb2xs ZWN0aW9uKSBiZXR3ZWVuIHRoaXMgcG9pbnQgYW5kIHdoZXJlIHdlJ3ZlIGdvdHRlbiBzaGFy ZWQgbG9jay4gIElmCisgCSAqIGEgbG9nbXNnX3N0b3JlIGlzIGFjdHVhbGx5IGluIHByb2dy ZXNzIHdoZW4gd2UgbG9vaywgd2UgbWlnaHQgYXMgd2VsbAorIAkgKiBza2lwIHRoZSBzcGVj dWxhdGl2ZSBsb2FkIGVudGlyZWx5LgorIAkgKi8KKyAKKyAJLyogVGFrZSB0aGUgbXV0ZXgg c28gd2UgY2FuIGV4YW1pbmUgdmFyaWFibGVzICovCisgCXsKKyAJCXZvbGF0aWxlIHBnbG1T aGFyZWRTdGF0ZSAqcyA9ICh2b2xhdGlsZSBwZ2xtU2hhcmVkU3RhdGUgKikgcGdsbTsKKyAK KyAJCVNwaW5Mb2NrQWNxdWlyZSgmcy0+bXV0ZXgpOworIAkJZXh0ZW50ID0gcy0+ZXh0ZW50 OworIAkJbl93cml0ZXJzID0gcy0+bl93cml0ZXJzOworIAkJZ2NfY291bnQgPSBzLT5nY19j b3VudDsKKyAJCVNwaW5Mb2NrUmVsZWFzZSgmcy0+bXV0ZXgpOworIAl9CisgCisgCS8qIE5v IHBvaW50IGluIGxvYWRpbmcgZmlsZSBub3cgaWYgdGhlcmUgYXJlIGFjdGl2ZSB3cml0ZXJz ICovCisgCWlmIChuX3dyaXRlcnMgPT0gMCkKKyAJCW1sYnVmZmVyID0gbG9nbXNnX2xvYWRf ZmlsZSgmbWxidWZmZXJfc2l6ZSk7CisgCisgCS8qCisgCSAqIEdldCBzaGFyZWQgbG9jaywg bG9hZCBvciByZWxvYWQgdGhlIGxvZ21zZyB0ZXh0IGZpbGUgaWYgd2UgbXVzdCwgYW5kCisg CSAqIGl0ZXJhdGUgb3ZlciB0aGUgaGFzaHRhYmxlIGVudHJpZXMuCisgCSAqCisgCSAqIFdp dGggYSBsYXJnZSBoYXNoIHRhYmxlLCB3ZSBtaWdodCBiZSBob2xkaW5nIHRoZSBsb2NrIHJh dGhlciBsb25nZXIKKyAJICogdGhhbiBvbmUgY291bGQgd2lzaC4gIEhvd2V2ZXIsIHRoaXMg b25seSBibG9ja3MgY3JlYXRpb24gb2YgbmV3IGhhc2gKKyAJICogdGFibGUgZW50cmllcywg YW5kIHRoZSBsYXJnZXIgdGhlIGhhc2ggdGFibGUgdGhlIGxlc3MgbGlrZWx5IHRoYXQgaXMg dG8KKyAJICogYmUgbmVlZGVkLiAgU28gd2UgY2FuIGhvcGUgdGhpcyBpcyBva2F5LiAgUGVy aGFwcyBzb21lZGF5IHdlJ2xsIGRlY2lkZQorIAkgKiB3ZSBuZWVkIHRvIHBhcnRpdGlvbiB0 aGUgaGFzaCB0YWJsZSB0byBsaW1pdCB0aGUgdGltZSBzcGVudCBob2xkaW5nIGFueQorIAkg KiBvbmUgbG9jay4KKyAJICovCisgCUxXTG9ja0FjcXVpcmUocGdsbS0+bG9jaywgTFdfU0hB UkVEKTsKKyAKKyAJLyoKKyAJICogSGVyZSBpdCBpcyBzYWZlIHRvIGV4YW1pbmUgZXh0ZW50 IGFuZCBnY19jb3VudCB3aXRob3V0IHRha2luZyB0aGUKKyAJICogbXV0ZXguICBOb3RlIHRo YXQgYWx0aG91Z2ggb3RoZXIgcHJvY2Vzc2VzIG1pZ2h0IGNoYW5nZQorIAkgKiBwZ2xtLT5l eHRlbnQganVzdCBhZnRlciB3ZSBsb29rIGF0IGl0LCB0aGUgc3RyaW5ncyB0aGV5IHRoZW4g d3JpdGUKKyAJICogaW50byB0aGUgZmlsZSBjYW5ub3QgeWV0IGJlIHJlZmVyZW5jZWQgaW4g dGhlIGhhc2h0YWJsZSwgc28gd2UKKyAJICogZG9uJ3QgY2FyZSB3aGV0aGVyIHdlIHNlZSB0 aGVtIG9yIG5vdC4KKyAJICoKKyAJICogSWYgbG9nbXNnX2xvYWRfZmlsZSBmYWlscywgd2Ug anVzdCBwcmVzcyBvbjsgd2UnbGwgcmV0dXJuIE5VTEwgZm9yCisgCSAqIGV2ZXJ5IGxvZ21z ZyB0ZXh0LgorIAkgKi8KKyAJaWYgKG1sYnVmZmVyID09IE5VTEwgfHwKKyAJCXBnbG0tPmV4 dGVudCAhPSBleHRlbnQgfHwKKyAJCXBnbG0tPmdjX2NvdW50ICE9IGdjX2NvdW50KQorIAl7 CisgCQlmcmVlKG1sYnVmZmVyKTsKKyAJCW1sYnVmZmVyID0gbG9nbXNnX2xvYWRfZmlsZSgm bWxidWZmZXJfc2l6ZSk7CisgCX0KKyAKKyAJaGFzaF9zZXFfaW5pdCgmaGFzaF9zZXEsIHBn bG1faGFzaCk7CisgCXdoaWxlICgoZW50cnkgPSBoYXNoX3NlcV9zZWFyY2goJmhhc2hfc2Vx KSkgIT0gTlVMTCkKKyAJeworIAkJRGF0dW0JCXZhbHVlc1tQR19TVEFUX0xPR01TR19DT0xT XTsKKyAJCWJvb2wJCW51bGxzW1BHX1NUQVRfTE9HTVNHX0NPTFNdOworIAkJaW50CQkJaSA9 IDA7CisgCQlDb3VudGVycwl0bXA7CisgCQljaGFyCSAgICptc3RyOworIAorIAkJbWVtc2V0 KHZhbHVlcywgMCwgc2l6ZW9mKHZhbHVlcykpOworIAkJbWVtc2V0KG51bGxzLCAwLCBzaXpl b2YobnVsbHMpKTsKKyAKKyAJCXZhbHVlc1tpKytdID0gQ1N0cmluZ0dldFRleHREYXR1bShQ R19WRVJTSU9OKTsKKyAJCXZhbHVlc1tpKytdID0gQ1N0cmluZ0dldFRleHREYXR1bShlbnRy eS0+a2V5LmZpbGVuYW1lKTsKKyAJCXZhbHVlc1tpKytdID0gSW50MzJHZXREYXR1bShlbnRy eS0+a2V5LmxpbmVubyk7CisgCQl2YWx1ZXNbaSsrXSA9IENTdHJpbmdHZXRUZXh0RGF0dW0o ZXJyb3Jfc2V2ZXJpdHkoZW50cnktPmtleS5lbGV2ZWwpKTsKKyAKKyAJCWlmIChlbnRyeS0+ ZnVuY25hbWVbMF0pCisgCQkJdmFsdWVzW2krK10gPSBDU3RyaW5nR2V0VGV4dERhdHVtKGVu dHJ5LT5mdW5jbmFtZSk7CisgCQllbHNlCisgCQkJbnVsbHNbaSsrXSA9IHRydWU7CisgCisg CQl2YWx1ZXNbaSsrXSA9IENTdHJpbmdHZXRUZXh0RGF0dW0odW5wYWNrX3NxbF9zdGF0ZShl bnRyeS0+c3FsZXJyY29kZSkpOworIAorIAkJbXN0ciA9IGxvZ21zZ19mZXRjaChlbnRyeS0+ bG9nbXNnX29mZnNldCwKKyAJCQkJCQkJZW50cnktPmxvZ21zZ19sZW4sCisgCQkJCQkJCW1s YnVmZmVyLAorIAkJCQkJCQltbGJ1ZmZlcl9zaXplKTsKKyAKKyAJCWlmIChtc3RyKQorIAkJ eworIAkJCWNoYXIJICAgKmVuYzsKKyAKKyAJCQllbmMgPSBwZ19hbnlfdG9fc2VydmVyKG1z dHIsCisgCQkJCQkJCQkgICBlbnRyeS0+bG9nbXNnX2xlbiwKKyAJCQkJCQkJCSAgIGVudHJ5 LT5lbmNvZGluZyk7CisgCQkJLyogZmlyc3QgdGhlIG9yaWdpbmFsIGZvcm1hdCBzdHJpbmcg Ki8KKyAJCQl2YWx1ZXNbaSsrXSA9IENTdHJpbmdHZXRUZXh0RGF0dW0oZW5jKTsKKyAJCQkv KiB0aGVuIHRoZSBsb2NhbGl6ZWQgc3RyaW5nICovCisgCQkJdmFsdWVzW2krK10gPSBDU3Ry aW5nR2V0VGV4dERhdHVtKF8oZW5jKSk7CisgCisgCQkJaWYgKGVuYyAhPSBtc3RyKQorIAkJ CQlwZnJlZShlbmMpOworIAkJfQorIAkJZWxzZQorIAkJeworIAkJCS8qIEp1c3QgcmV0dXJu IGEgbnVsbCBpZiB3ZSBmYWlsIHRvIGZpbmQgdGhlIHRleHQgKi8KKyAJCQludWxsc1tpKytd ID0gdHJ1ZTsKKyAJCQludWxsc1tpKytdID0gdHJ1ZTsKKyAJCX0KKyAKKyAJCS8qIGNvcHkg Y291bnRlcnMgdG8gYSBsb2NhbCB2YXJpYWJsZSB0byBrZWVwIGxvY2tpbmcgdGltZSBzaG9y dCAqLworIAkJeworIAkJCXZvbGF0aWxlIHBnbG1FbnRyeSAqZSA9ICh2b2xhdGlsZSBwZ2xt RW50cnkgKikgZW50cnk7CisgCisgCQkJU3BpbkxvY2tBY3F1aXJlKCZlLT5tdXRleCk7Cisg CQkJdG1wID0gZS0+Y291bnRlcnM7CisgCQkJU3BpbkxvY2tSZWxlYXNlKCZlLT5tdXRleCk7 CisgCQl9CisgCisgCQl2YWx1ZXNbaSsrXSA9IEludDY0R2V0RGF0dW1GYXN0KHRtcC5tc2dj bnQpOworIAorIAkJdHVwbGVzdG9yZV9wdXR2YWx1ZXMocnNpbmZvLT5zZXRSZXN1bHQsIHJz aW5mby0+c2V0RGVzYywgdmFsdWVzLCBudWxscyk7CisgCX0KKyAKKyAJTFdMb2NrUmVsZWFz ZShwZ2xtLT5sb2NrKTsKKyAKKyAJZnJlZShtbGJ1ZmZlcik7CisgfQorIAorIC8qIE51bWJl ciBvZiBvdXRwdXQgYXJndW1lbnRzIChjb2x1bW5zKSBmb3IgcGdfc3RhdF9sb2dtc2dfaW5m byAqLworICNkZWZpbmUgUEdfU1RBVF9MT0dNU0dfSU5GT19DT0xTCTIKKyAKKyAvKgorICAq IFJldHVybiBzdGF0aXN0aWNzIG9mIHBnX3N0YXRfbG9nbXNnLgorICAqLworIERhdHVtCisg cGdfc3RhdF9sb2dtc2dfaW5mbyhQR19GVU5DVElPTl9BUkdTKQorIHsKKyAJcGdsbUdsb2Jh bFN0YXRzIHN0YXRzOworIAlUdXBsZURlc2MJdHVwZGVzYzsKKyAJRGF0dW0JCXZhbHVlc1tQ R19TVEFUX0xPR01TR19JTkZPX0NPTFNdID0gezB9OworIAlib29sCQludWxsc1tQR19TVEFU X0xPR01TR19JTkZPX0NPTFNdID0gezB9OworIAorIAlpZiAoIXBnbG0gfHwgIXBnbG1faGFz aCkKKyAJCWVyZXBvcnQoRVJST1IsCisgCQkJCShlcnJjb2RlKEVSUkNPREVfT0JKRUNUX05P VF9JTl9QUkVSRVFVSVNJVEVfU1RBVEUpLAorIAkJCQkgZXJybXNnKCJwZ19zdGF0X2xvZ21z ZyBtdXN0IGJlIGxvYWRlZCB2aWEgc2hhcmVkX3ByZWxvYWRfbGlicmFyaWVzIikpKTsKKyAK KyAJLyogQnVpbGQgYSB0dXBsZSBkZXNjcmlwdG9yIGZvciBvdXIgcmVzdWx0IHR5cGUgKi8K KyAJaWYgKGdldF9jYWxsX3Jlc3VsdF90eXBlKGZjaW5mbywgTlVMTCwgJnR1cGRlc2MpICE9 IFRZUEVGVU5DX0NPTVBPU0lURSkKKyAJCWVsb2coRVJST1IsICJyZXR1cm4gdHlwZSBtdXN0 IGJlIGEgcm93IHR5cGUiKTsKKyAKKyAJLyogUmVhZCBnbG9iYWwgc3RhdGlzdGljcyBmb3Ig cGdfc3RhdF9sb2dtc2cgKi8KKyAJeworIAkJdm9sYXRpbGUgcGdsbVNoYXJlZFN0YXRlICpz ID0gKHZvbGF0aWxlIHBnbG1TaGFyZWRTdGF0ZSAqKSBwZ2xtOworIAorIAkJU3BpbkxvY2tB Y3F1aXJlKCZzLT5tdXRleCk7CisgCQlzdGF0cyA9IHMtPnN0YXRzOworIAkJU3BpbkxvY2tS ZWxlYXNlKCZzLT5tdXRleCk7CisgCX0KKyAKKyAJdmFsdWVzWzBdID0gSW50NjRHZXREYXR1 bShzdGF0cy5kZWFsbG9jKTsKKyAJdmFsdWVzWzFdID0gVGltZXN0YW1wVHpHZXREYXR1bShz dGF0cy5zdGF0c19yZXNldCk7CisgCisgCVBHX1JFVFVSTl9EQVRVTShIZWFwVHVwbGVHZXRE YXR1bShoZWFwX2Zvcm1fdHVwbGUodHVwZGVzYywgdmFsdWVzLCBudWxscykpKTsKKyB9Cisg CisgLyoKKyAgKiBFc3RpbWF0ZSBzaGFyZWQgbWVtb3J5IHNwYWNlIG5lZWRlZC4KKyAgKi8K KyBzdGF0aWMgU2l6ZQorIHBnbG1fbWVtc2l6ZSh2b2lkKQorIHsKKyAJU2l6ZQkJc2l6ZTsK KyAKKyAJc2l6ZSA9IE1BWEFMSUdOKHNpemVvZihwZ2xtU2hhcmVkU3RhdGUpKTsKKyAJc2l6 ZSA9IGFkZF9zaXplKHNpemUsIGhhc2hfZXN0aW1hdGVfc2l6ZShwZ2xtX21heCwgc2l6ZW9m KHBnbG1FbnRyeSkpKTsKKyAKKyAJcmV0dXJuIHNpemU7CisgfQorIAorIC8qCisgICogQWxs b2NhdGUgYSBuZXcgaGFzaHRhYmxlIGVudHJ5LgorICAqIGNhbGxlciBtdXN0IGhvbGQgYW4g ZXhjbHVzaXZlIGxvY2sgb24gcGdsbS0+bG9jaworICAqCisgICogTm90ZTogZGVzcGl0ZSBu ZWVkaW5nIGV4Y2x1c2l2ZSBsb2NrLCBpdCdzIG5vdCBhbiBlcnJvciBmb3IgdGhlIHRhcmdl dAorICAqIGVudHJ5IHRvIGFscmVhZHkgZXhpc3QuICBUaGlzIGlzIGJlY2F1c2UgcGdsbV9z dG9yZSByZWxlYXNlcyBhbmQKKyAgKiByZWFjcXVpcmVzIGxvY2sgYWZ0ZXIgZmFpbGluZyB0 byBmaW5kIGEgbWF0Y2g7IHNvIHNvbWVvbmUgZWxzZSBjb3VsZAorICAqIGhhdmUgbWFkZSB0 aGUgZW50cnkgd2hpbGUgd2Ugd2FpdGVkIHRvIGdldCBleGNsdXNpdmUgbG9jay4KKyAgKi8K KyBzdGF0aWMgcGdsbUVudHJ5ICoKKyBlbnRyeV9hbGxvYyhwZ2xtSGFzaEtleSAqa2V5LAor IAkJCVNpemUgbG9nbXNnX29mZnNldCwKKyAJCQlpbnQgbG9nbXNnX2xlbiwKKyAJCQlpbnQg ZW5jb2RpbmcsCisgCQkJaW50IHNxbGVycmNvZGUsCisgCQkJY2hhciAqZWZ1bmNuYW1lKQor IHsKKyAJcGdsbUVudHJ5ICAqZW50cnk7CisgCWJvb2wJCWZvdW5kOworIAorIAkvKiBNYWtl IHNwYWNlIGlmIG5lZWRlZCAqLworIAl3aGlsZSAoaGFzaF9nZXRfbnVtX2VudHJpZXMocGds bV9oYXNoKSA+PSBwZ2xtX21heCkKKyAJCWVudHJ5X2RlYWxsb2MoKTsKKyAKKyAJLyogRmlu ZCBvciBjcmVhdGUgYW4gZW50cnkgd2l0aCBkZXNpcmVkIGhhc2ggY29kZSAqLworIAllbnRy eSA9IChwZ2xtRW50cnkgKikgaGFzaF9zZWFyY2gocGdsbV9oYXNoLCBrZXksIEhBU0hfRU5U RVIsICZmb3VuZCk7CisgCisgCWlmICghZm91bmQpCisgCXsKKyAJCS8qIE5ldyBlbnRyeSwg aW5pdGlhbGl6ZSBpdCAqLworIAorIAkJLyogcmVzZXQgdGhlIHN0YXRpc3RpY3MgKi8KKyAJ CW1lbXNldCgmZW50cnktPmNvdW50ZXJzLCAwLCBzaXplb2YoQ291bnRlcnMpKTsKKyAJCS8q IHNldCB0aGUgYXBwcm9wcmlhdGUgaW5pdGlhbCB1c2FnZSBjb3VudCAqLworIAkJZW50cnkt PmNvdW50ZXJzLnVzYWdlID0gVVNBR0VfSU5JVDsKKyAJCS8qIHJlLWluaXRpYWxpemUgdGhl IG11dGV4IGVhY2ggdGltZSAuLi4gd2UgYXNzdW1lIG5vIG9uZSB1c2luZyBpdCAqLworIAkJ U3BpbkxvY2tJbml0KCZlbnRyeS0+bXV0ZXgpOworIAkJLyogLi4uIGFuZCBkb24ndCBmb3Jn ZXQgdGhlIGxvZ21zZyB0ZXh0IG1ldGFkYXRhICovCisgCQlBc3NlcnQobG9nbXNnX2xlbiA+ PSAwKTsKKyAJCWVudHJ5LT5sb2dtc2dfb2Zmc2V0ID0gbG9nbXNnX29mZnNldDsKKyAJCWVu dHJ5LT5sb2dtc2dfbGVuID0gbG9nbXNnX2xlbjsKKyAJCWVudHJ5LT5lbmNvZGluZyA9IGVu Y29kaW5nOworIAkJZW50cnktPnNxbGVycmNvZGUgPSBzcWxlcnJjb2RlOworIAorIAkJaWYg KGVmdW5jbmFtZSkKKyAJCXsKKyAJCQlzaXplX3QJCWZ1bmNuYW1lX2xlbiA9IHN0cmxlbihl ZnVuY25hbWUpOworIAorIAkJCW1lbWNweShlbnRyeS0+ZnVuY25hbWUsIGVmdW5jbmFtZSwK KyAJCQkJICAgZnVuY25hbWVfbGVuIDwgTUFYRlVOQ05BTUVMRU4gPworIAkJCQkJCQkJICBm dW5jbmFtZV9sZW4gOiBNQVhGVU5DTkFNRUxFTiApOworIAkJfQorIAl9CisgCisgCXJldHVy biBlbnRyeTsKKyB9CisgCisgLyoKKyAgKiBxc29ydCBjb21wYXJhdG9yIGZvciBzb3J0aW5n IGludG8gaW5jcmVhc2luZyB1c2FnZSBvcmRlcgorICAqLworIHN0YXRpYyBpbnQKKyBlbnRy eV9jbXAoY29uc3Qgdm9pZCAqbGhzLCBjb25zdCB2b2lkICpyaHMpCisgeworIAlkb3VibGUJ CWxfdXNhZ2UgPSAoKihwZ2xtRW50cnkgKmNvbnN0ICopIGxocyktPmNvdW50ZXJzLnVzYWdl OworIAlkb3VibGUJCXJfdXNhZ2UgPSAoKihwZ2xtRW50cnkgKmNvbnN0ICopIHJocyktPmNv dW50ZXJzLnVzYWdlOworIAorIAlpZiAobF91c2FnZSA8IHJfdXNhZ2UpCisgCQlyZXR1cm4g LTE7CisgCWVsc2UgaWYgKGxfdXNhZ2UgPiByX3VzYWdlKQorIAkJcmV0dXJuICsxOworIAll bHNlCisgCQlyZXR1cm4gMDsKKyB9CisgCisgLyoKKyAgKiBEZWFsbG9jYXRlIGxlYXN0LXVz ZWQgZW50cmllcy4KKyAgKgorICAqIENhbGxlciBtdXN0IGhvbGQgYW4gZXhjbHVzaXZlIGxv Y2sgb24gcGdsbS0+bG9jay4KKyAgKi8KKyBzdGF0aWMgdm9pZAorIGVudHJ5X2RlYWxsb2Mo dm9pZCkKKyB7CisgCUhBU0hfU0VRX1NUQVRVUyBoYXNoX3NlcTsKKyAJcGdsbUVudHJ5ICoq ZW50cmllczsKKyAJcGdsbUVudHJ5ICAqZW50cnk7CisgCWludAkJCW52aWN0aW1zOworIAlp bnQJCQlpOworIAlTaXplCQl0b3R0ZXh0bGVuOworIAlpbnQJCQludmFsaWR0ZXh0czsKKyAK KyAJLyoKKyAJICogU29ydCBlbnRyaWVzIGJ5IHVzYWdlIGFuZCBkZWFsbG9jYXRlIFVTQUdF X0RFQUxMT0NfUEVSQ0VOVCBvZiB0aGVtLgorIAkgKiBXaGlsZSB3ZSdyZSBzY2FubmluZyB0 aGUgdGFibGUsIGFwcGx5IHRoZSBkZWNheSBmYWN0b3IgdG8gdGhlIHVzYWdlCisgCSAqIHZh bHVlcywgYW5kIHVwZGF0ZSB0aGUgbWVhbiBxdWVyeSBsZW5ndGguCisgCSAqCisgCSAqIE5v dGUgdGhhdCB0aGUgbWVhbiBxdWVyeSBsZW5ndGggaXMgYWxtb3N0IGltbWVkaWF0ZWx5IG9i c29sZXRlLCBzaW5jZQorIAkgKiB3ZSBjb21wdXRlIGl0IGJlZm9yZSBub3QgYWZ0ZXIgZGlz Y2FyZGluZyB0aGUgbGVhc3QtdXNlZCBlbnRyaWVzLgorIAkgKiBIb3BlZnVsbHksIHRoYXQg ZG9lc24ndCBhZmZlY3QgdGhlIG1lYW4gdG9vIG11Y2g7IGl0IGRvZXNuJ3Qgc2VlbSB3b3J0 aAorIAkgKiBtYWtpbmcgdHdvIHBhc3NlcyB0byBnZXQgYSBtb3JlIGN1cnJlbnQgcmVzdWx0 LiAgTGlrZXdpc2UsIHRoZSBuZXcKKyAJICogY3VyX21lZGlhbl91c2FnZSBpbmNsdWRlcyB0 aGUgZW50cmllcyB3ZSdyZSBhYm91dCB0byB6YXAuCisgCSAqLworIAorIAllbnRyaWVzID0g cGFsbG9jKGhhc2hfZ2V0X251bV9lbnRyaWVzKHBnbG1faGFzaCkgKiBzaXplb2YocGdsbUVu dHJ5ICopKTsKKyAKKyAJaSA9IDA7CisgCXRvdHRleHRsZW4gPSAwOworIAludmFsaWR0ZXh0 cyA9IDA7CisgCisgCWhhc2hfc2VxX2luaXQoJmhhc2hfc2VxLCBwZ2xtX2hhc2gpOworIAl3 aGlsZSAoKGVudHJ5ID0gaGFzaF9zZXFfc2VhcmNoKCZoYXNoX3NlcSkpICE9IE5VTEwpCisg CXsKKyAJCWVudHJpZXNbaSsrXSA9IGVudHJ5OworIAkJZW50cnktPmNvdW50ZXJzLnVzYWdl ICo9IFVTQUdFX0RFQ1JFQVNFX0ZBQ1RPUjsKKyAJCS8qIEluIHRoZSBtZWFuIGxlbmd0aCBj b21wdXRhdGlvbiwgaWdub3JlIGRyb3BwZWQgdGV4dHMuICovCisgCQlpZiAoZW50cnktPmxv Z21zZ19sZW4gPj0gMCkKKyAJCXsKKyAJCQl0b3R0ZXh0bGVuICs9IGVudHJ5LT5sb2dtc2df bGVuICsgMTsKKyAJCQludmFsaWR0ZXh0cysrOworIAkJfQorIAl9CisgCisgCS8qIFNvcnQg aW50byBpbmNyZWFzaW5nIG9yZGVyIGJ5IHVzYWdlICovCisgCXFzb3J0KGVudHJpZXMsIGks IHNpemVvZihwZ2xtRW50cnkgKiksIGVudHJ5X2NtcCk7CisgCisgCS8qIFJlY29yZCB0aGUg KGFwcHJveGltYXRlKSBtZWRpYW4gdXNhZ2UgKi8KKyAJaWYgKGkgPiAwKQorIAkJcGdsbS0+ Y3VyX21lZGlhbl91c2FnZSA9IGVudHJpZXNbaSAvIDJdLT5jb3VudGVycy51c2FnZTsKKyAJ LyogUmVjb3JkIHRoZSBtZWFuIHF1ZXJ5IGxlbmd0aCAqLworIAlpZiAobnZhbGlkdGV4dHMg PiAwKQorIAkJcGdsbS0+bWVhbl9sb2dtc2dfbGVuID0gdG90dGV4dGxlbiAvIG52YWxpZHRl eHRzOworIAllbHNlCisgCQlwZ2xtLT5tZWFuX2xvZ21zZ19sZW4gPSBBU1NVTUVEX0xFTkdU SF9JTklUOworIAorIAkvKiBOb3cgemFwIGFuIGFwcHJvcHJpYXRlIGZyYWN0aW9uIG9mIGxv d2VzdC11c2FnZSBlbnRyaWVzICovCisgCW52aWN0aW1zID0gTWF4KDEwLCBpICogVVNBR0Vf REVBTExPQ19QRVJDRU5UIC8gMTAwKTsKKyAJbnZpY3RpbXMgPSBNaW4obnZpY3RpbXMsIGkp OworIAorIAlmb3IgKGkgPSAwOyBpIDwgbnZpY3RpbXM7IGkrKykKKyAJCWhhc2hfc2VhcmNo KHBnbG1faGFzaCwgJmVudHJpZXNbaV0tPmtleSwgSEFTSF9SRU1PVkUsIE5VTEwpOworIAor IAlwZnJlZShlbnRyaWVzKTsKKyAKKyAJLyogSW5jcmVtZW50IHRoZSBudW1iZXIgb2YgdGlt ZXMgZW50cmllcyBhcmUgZGVhbGxvY2F0ZWQgKi8KKyAJeworIAkJdm9sYXRpbGUgcGdsbVNo YXJlZFN0YXRlICpzID0gKHZvbGF0aWxlIHBnbG1TaGFyZWRTdGF0ZSAqKSBwZ2xtOworIAor IAkJU3BpbkxvY2tBY3F1aXJlKCZzLT5tdXRleCk7CisgCQlzLT5zdGF0cy5kZWFsbG9jICs9 IDE7CisgCQlTcGluTG9ja1JlbGVhc2UoJnMtPm11dGV4KTsKKyAJfQorIH0KKyAKKyAvKgor ICAqIEdpdmVuIGEgbG9nbXNnIHN0cmluZyAobm90IG5lY2Vzc2FyaWx5IG51bGwtdGVybWlu YXRlZCksIGFsbG9jYXRlIGEgbmV3CisgICogZW50cnkgaW4gdGhlIGV4dGVybmFsIGxvZ21z ZyB0ZXh0IGZpbGUgYW5kIHN0b3JlIHRoZSBzdHJpbmcgdGhlcmUuCisgICoKKyAgKiBJZiBz dWNjZXNzZnVsLCByZXR1cm5zIHRydWUsIGFuZCBzdG9yZXMgdGhlIG5ldyBlbnRyeSdzIG9m ZnNldCBpbiB0aGUgZmlsZQorICAqIGludG8gKmxvZ21zZ19vZmZzZXQuICBBbHNvLCBpZiBn Y19jb3VudCBpc24ndCBOVUxMLCAqZ2NfY291bnQgaXMgc2V0IHRvIHRoZQorICAqIG51bWJl ciBvZiBnYXJiYWdlIGNvbGxlY3Rpb25zIHRoYXQgaGF2ZSBvY2N1cnJlZCBzbyBmYXIuCisg ICoKKyAgKiBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlLgorICAqCisgICogQXQgbGVhc3Qg YSBzaGFyZWQgbG9jayBvbiBwZ2xtLT5sb2NrIG11c3QgYmUgaGVsZCBieSB0aGUgY2FsbGVy LCBzbyBhcworICAqIHRvIHByZXZlbnQgYSBjb25jdXJyZW50IGdhcmJhZ2UgY29sbGVjdGlv bi4gIFNoYXJlLWxvY2staG9sZGluZyBjYWxsZXJzCisgICogc2hvdWxkIHBhc3MgYSBnY19j b3VudCBwb2ludGVyIHRvIG9idGFpbiB0aGUgbnVtYmVyIG9mIGdhcmJhZ2UgY29sbGVjdGlv bnMsCisgICogc28gdGhhdCB0aGV5IGNhbiByZWNoZWNrIHRoZSBjb3VudCBhZnRlciBvYnRh aW5pbmcgZXhjbHVzaXZlIGxvY2sgdG8KKyAgKiBkZXRlY3Qgd2hldGhlciBhIGdhcmJhZ2Ug Y29sbGVjdGlvbiBvY2N1cnJlZCAoYW5kIHJlbW92ZWQgdGhpcyBlbnRyeSkuCisgICovCisg c3RhdGljIGJvb2wKKyBsb2dtc2dfc3RvcmUoRXJyb3JEYXRhICplZGF0YSwgU2l6ZSAqbG9n bXNnX29mZnNldCwKKyAJCQkgaW50ICpsb2dtc2dfbGVuLCBpbnQgKmdjX2NvdW50KQorIHsK KyAJU2l6ZQkJb2ZmOworIAlpbnQJCQlmZDsKKyAKKyAJaWYgKGVkYXRhLT5tZXNzYWdlX2lk KQorIAkJKmxvZ21zZ19sZW4gPSBzdHJsZW4oZWRhdGEtPm1lc3NhZ2VfaWQpOworIAorIAkv KgorIAkgKiBXZSB1c2UgYSBzcGlubG9jayB0byBwcm90ZWN0IGV4dGVudC9uX3dyaXRlcnMv Z2NfY291bnQsIHNvIHRoYXQKKyAJICogbXVsdGlwbGUgcHJvY2Vzc2VzIG1heSBleGVjdXRl IHRoaXMgZnVuY3Rpb24gY29uY3VycmVudGx5LgorIAkgKi8KKyAJeworIAkJdm9sYXRpbGUg cGdsbVNoYXJlZFN0YXRlICpzID0gKHZvbGF0aWxlIHBnbG1TaGFyZWRTdGF0ZSAqKSBwZ2xt OworIAorIAkJU3BpbkxvY2tBY3F1aXJlKCZzLT5tdXRleCk7CisgCQlvZmYgPSBzLT5leHRl bnQ7CisgCQlzLT5leHRlbnQgKz0gKmxvZ21zZ19sZW4gKyAxOworIAkJcy0+bl93cml0ZXJz Kys7CisgCQlpZiAoZ2NfY291bnQpCisgCQkJKmdjX2NvdW50ID0gcy0+Z2NfY291bnQ7Cisg CQlTcGluTG9ja1JlbGVhc2UoJnMtPm11dGV4KTsKKyAJfQorIAorIAkqbG9nbXNnX29mZnNl dCA9IG9mZjsKKyAKKyAJLyoKKyAJICogRG9uJ3QgYWxsb3cgdGhlIGZpbGUgdG8gZ3JvdyBs YXJnZXIgdGhhbiB3aGF0IGxvZ21zZ19sb2FkX2ZpbGUgY2FuCisgCSAqICh0aGVvcmV0aWNh bGx5KSBoYW5kbGUuICBUaGlzIGhhcyBiZWVuIHNlZW4gdG8gYmUgcmVhY2hhYmxlIG9uIDMy LWJpdAorIAkgKiBwbGF0Zm9ybXMuCisgCSAqLworIAlpZiAodW5saWtlbHkoKmxvZ21zZ19s ZW4gPj0gTWF4QWxsb2NIdWdlU2l6ZSAtIG9mZikpCisgCXsKKyAJCWVycm5vID0gRUZCSUc7 CQkJLyogbm90IHF1aXRlIHJpZ2h0LCBidXQgaXQnbGwgZG8gKi8KKyAJCWZkID0gLTE7Cisg CQlnb3RvIGVycm9yOworIAl9CisgCisgCS8qIE5vdyB3cml0ZSB0aGUgZGF0YSBpbnRvIHRo ZSBzdWNjZXNzZnVsbHktcmVzZXJ2ZWQgcGFydCBvZiB0aGUgZmlsZSAqLworIAlmZCA9IE9w ZW5UcmFuc2llbnRGaWxlKFBHTE1fVEVYVF9GSUxFLCBPX1JEV1IgfCBPX0NSRUFUIHwgUEdf QklOQVJZKTsKKyAJaWYgKGZkIDwgMCkKKyAJCWdvdG8gZXJyb3I7CisgCisgI2lmIFBHX1ZF UlNJT05fTlVNID49IDEyMDAwMAorIAlpZiAocGdfcHdyaXRlKGZkLCBlZGF0YS0+bWVzc2Fn ZV9pZCwgKmxvZ21zZ19sZW4sIG9mZikgIT0gKmxvZ21zZ19sZW4pCisgCQlnb3RvIGVycm9y OworIAlpZiAocGdfcHdyaXRlKGZkLCAiXDAiLCAxLCBvZmYgKyAqbG9nbXNnX2xlbikgIT0g MSkKKyAJCWdvdG8gZXJyb3I7CisgI2Vsc2UKKyAJaWYgKGxzZWVrKGZkLCBvZmYsIFNFRUtf U0VUKSAhPSBvZmYpCisgCQlnb3RvIGVycm9yOworIAorIAlpZiAod3JpdGUoZmQsIGVkYXRh LT5tZXNzYWdlX2lkLCAqbG9nbXNnX2xlbikgIT0gKmxvZ21zZ19sZW4pCisgCQlnb3RvIGVy cm9yOworIAlpZiAod3JpdGUoZmQsICJcMCIsIDEpICE9IDEpCisgCQlnb3RvIGVycm9yOwor ICNlbmRpZiAvKiBQR19WRVJTSU9OX05VTSA+PSAxMjAwMDAgKi8KKyAKKyAJQ2xvc2VUcmFu c2llbnRGaWxlKGZkKTsKKyAKKyAJLyogTWFyayBvdXIgd3JpdGUgY29tcGxldGUgKi8KKyAJ eworIAkJdm9sYXRpbGUgcGdsbVNoYXJlZFN0YXRlICpzID0gKHZvbGF0aWxlIHBnbG1TaGFy ZWRTdGF0ZSAqKSBwZ2xtOworIAorIAkJU3BpbkxvY2tBY3F1aXJlKCZzLT5tdXRleCk7Cisg CQlzLT5uX3dyaXRlcnMtLTsKKyAJCVNwaW5Mb2NrUmVsZWFzZSgmcy0+bXV0ZXgpOworIAl9 CisgCisgCXJldHVybiB0cnVlOworIAorIGVycm9yOgorIAllcmVwb3J0KExPRywKKyAJCQko ZXJyY29kZV9mb3JfZmlsZV9hY2Nlc3MoKSwKKyAJCQkgZXJybXNnKCJjb3VsZCBub3Qgd3Jp dGUgZmlsZSBcIiVzXCI6ICVtIiwKKyAJCQkJCVBHTE1fVEVYVF9GSUxFKSkpOworIAorIAlp ZiAoZmQgPj0gMCkKKyAJCUNsb3NlVHJhbnNpZW50RmlsZShmZCk7CisgCisgCS8qIE1hcmsg b3VyIHdyaXRlIGNvbXBsZXRlICovCisgCXsKKyAJCXZvbGF0aWxlIHBnbG1TaGFyZWRTdGF0 ZSAqcyA9ICh2b2xhdGlsZSBwZ2xtU2hhcmVkU3RhdGUgKikgcGdsbTsKKyAKKyAJCVNwaW5M b2NrQWNxdWlyZSgmcy0+bXV0ZXgpOworIAkJcy0+bl93cml0ZXJzLS07CisgCQlTcGluTG9j a1JlbGVhc2UoJnMtPm11dGV4KTsKKyAJfQorIAorIAlyZXR1cm4gZmFsc2U7CisgfQorIAor IC8qCisgICogUmVhZCB0aGUgZXh0ZXJuYWwgbG9nbXNnIHRleHQgZmlsZSBpbnRvIGEgbWFs bG9jJ2QgYnVmZmVyLgorICAqCisgICogUmV0dXJucyBOVUxMICh3aXRob3V0IHRocm93aW5n IGFuIGVycm9yKSBpZiB1bmFibGUgdG8gcmVhZCwgZWcKKyAgKiBmaWxlIG5vdCB0aGVyZSBv ciBpbnN1ZmZpY2llbnQgbWVtb3J5LgorICAqCisgICogT24gc3VjY2VzcywgdGhlIGJ1ZmZl ciBzaXplIGlzIGFsc28gcmV0dXJuZWQgaW50byAqYnVmZmVyX3NpemUuCisgICoKKyAgKiBU aGlzIGNhbiBiZSBjYWxsZWQgd2l0aG91dCBhbnkgbG9jayBvbiBwZ2xtLT5sb2NrLCBidXQg aW4gdGhhdCBjYXNlCisgICogdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgdmVyaWZ5 aW5nIHRoYXQgdGhlIHJlc3VsdCBpcyBzYW5lLgorICAqLworIHN0YXRpYyBjaGFyICoKKyBs b2dtc2dfbG9hZF9maWxlKFNpemUgKmJ1ZmZlcl9zaXplKQorIHsKKyAJY2hhcgkgICAqYnVm OworIAlpbnQJCQlmZDsKKyAJc3RydWN0IHN0YXQgc3RhdDsKKyAJU2l6ZQkJbnJlYWQ7Cisg CisgCWZkID0gT3BlblRyYW5zaWVudEZpbGUoUEdMTV9URVhUX0ZJTEUsIE9fUkRPTkxZIHwg UEdfQklOQVJZKTsKKyAJaWYgKGZkIDwgMCkKKyAJeworIAkJaWYgKGVycm5vICE9IEVOT0VO VCkKKyAJCQllcmVwb3J0KExPRywKKyAJCQkJCShlcnJjb2RlX2Zvcl9maWxlX2FjY2Vzcygp LAorIAkJCQkJIGVycm1zZygiY291bGQgbm90IHJlYWQgZmlsZSBcIiVzXCI6ICVtIiwKKyAJ CQkJCQkJUEdMTV9URVhUX0ZJTEUpKSk7CisgCQlyZXR1cm4gTlVMTDsKKyAJfQorIAorIAkv KiBHZXQgZmlsZSBsZW5ndGggKi8KKyAJaWYgKGZzdGF0KGZkLCAmc3RhdCkpCisgCXsKKyAJ CWVyZXBvcnQoTE9HLAorIAkJCQkoZXJyY29kZV9mb3JfZmlsZV9hY2Nlc3MoKSwKKyAJCQkJ IGVycm1zZygiY291bGQgbm90IHN0YXQgZmlsZSBcIiVzXCI6ICVtIiwKKyAJCQkJCQlQR0xN X1RFWFRfRklMRSkpKTsKKyAJCUNsb3NlVHJhbnNpZW50RmlsZShmZCk7CisgCQlyZXR1cm4g TlVMTDsKKyAJfQorIAorIAkvKiBBbGxvY2F0ZSBidWZmZXI7IGJld2FyZSB0aGF0IG9mZl90 IG1pZ2h0IGJlIHdpZGVyIHRoYW4gc2l6ZV90ICovCisgCWlmIChzdGF0LnN0X3NpemUgPD0g TWF4QWxsb2NIdWdlU2l6ZSkKKyAJCWJ1ZiA9IChjaGFyICopIG1hbGxvYyhzdGF0LnN0X3Np emUpOworIAllbHNlCisgCQlidWYgPSBOVUxMOworIAorIAlpZiAoYnVmID09IE5VTEwpCisg CXsKKyAJCWVyZXBvcnQoTE9HLAorIAkJCQkoZXJyY29kZShFUlJDT0RFX09VVF9PRl9NRU1P UlkpLAorIAkJCQkgZXJybXNnKCJvdXQgb2YgbWVtb3J5IiksCisgCQkJCSBlcnJkZXRhaWwo IkNvdWxkIG5vdCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgZmlsZSBcIiVzXCIu IiwKKyAJCQkJCQkgICBQR0xNX1RFWFRfRklMRSkpKTsKKyAJCUNsb3NlVHJhbnNpZW50Rmls ZShmZCk7CisgCQlyZXR1cm4gTlVMTDsKKyAJfQorIAorIAkvKgorIAkgKiBPSywgc2x1cnAg aW4gdGhlIGZpbGUuICBXaW5kb3dzIGZhaWxzIGlmIHdlIHRyeSB0byByZWFkIG1vcmUgdGhh bgorIAkgKiBJTlRfTUFYIGJ5dGVzIGF0IG9uY2UsIGFuZCBvdGhlciBwbGF0Zm9ybXMgbWln aHQgbm90IGxpa2UgdGhhdCBlaXRoZXIsCisgCSAqIHNvIHJlYWQgYSB2ZXJ5IGxhcmdlIGZp bGUgaW4gMUdCIHNlZ21lbnRzLgorIAkgKi8KKyAJbnJlYWQgPSAwOworIAl3aGlsZSAobnJl YWQgPCBzdGF0LnN0X3NpemUpCisgCXsKKyAJCWludAkJCXRvcmVhZCA9IE1pbigxMDI0ICog MTAyNCAqIDEwMjQsIHN0YXQuc3Rfc2l6ZSAtIG5yZWFkKTsKKyAKKyAJCS8qCisgCQkgKiBJ ZiB3ZSBnZXQgYSBzaG9ydCByZWFkIGFuZCBlcnJubyBkb2Vzbid0IGdldCBzZXQsIHRoZSBy ZWFzb24gaXMKKyAJCSAqIHByb2JhYmx5IHRoYXQgZ2FyYmFnZSBjb2xsZWN0aW9uIHRydW5j YXRlZCB0aGUgZmlsZSBzaW5jZSB3ZSBkaWQKKyAJCSAqIHRoZSBmc3RhdCgpLCBzbyB3ZSBk b24ndCBsb2cgYSBjb21wbGFpbnQgLS0tIGJ1dCB3ZSBkb24ndCByZXR1cm4KKyAJCSAqIHRo ZSBkYXRhLCBlaXRoZXIsIHNpbmNlIGl0J3MgbW9zdCBsaWtlbHkgY29ycnVwdCBkdWUgdG8g Y29uY3VycmVudAorIAkJICogd3JpdGVzIGZyb20gZ2FyYmFnZSBjb2xsZWN0aW9uLgorIAkJ ICovCisgCQllcnJubyA9IDA7CisgCQlpZiAocmVhZChmZCwgYnVmICsgbnJlYWQsIHRvcmVh ZCkgIT0gdG9yZWFkKQorIAkJeworIAkJCWlmIChlcnJubykKKyAJCQkJZXJlcG9ydChMT0cs CisgCQkJCQkJKGVycmNvZGVfZm9yX2ZpbGVfYWNjZXNzKCksCisgCQkJCQkJIGVycm1zZygi Y291bGQgbm90IHJlYWQgZmlsZSBcIiVzXCI6ICVtIiwKKyAJCQkJCQkJCVBHTE1fVEVYVF9G SUxFKSkpOworIAkJCWZyZWUoYnVmKTsKKyAJCQlDbG9zZVRyYW5zaWVudEZpbGUoZmQpOwor IAkJCXJldHVybiBOVUxMOworIAkJfQorIAkJbnJlYWQgKz0gdG9yZWFkOworIAl9CisgCisg CWlmIChDbG9zZVRyYW5zaWVudEZpbGUoZmQpICE9IDApCisgCQllcmVwb3J0KExPRywKKyAJ CQkJKGVycmNvZGVfZm9yX2ZpbGVfYWNjZXNzKCksCisgCQkJCSBlcnJtc2coImNvdWxkIG5v dCBjbG9zZSBmaWxlIFwiJXNcIjogJW0iLCBQR0xNX1RFWFRfRklMRSkpKTsKKyAKKyAJKmJ1 ZmZlcl9zaXplID0gbnJlYWQ7CisgCXJldHVybiBidWY7CisgfQorIAorIC8qCisgICogTG9j YXRlIGEgbG9nbXNnIHRleHQgaW4gdGhlIGZpbGUgaW1hZ2UgcHJldmlvdXNseSByZWFkIGJ5 IGxvZ21zZ19sb2FkX2ZpbGUoKS4KKyAgKgorICAqIFdlIHZhbGlkYXRlIHRoZSBnaXZlbiBv ZmZzZXQvbGVuZ3RoLCBhbmQgcmV0dXJuIE5VTEwgaWYgYm9ndXMuICBPdGhlcndpc2UsCisg ICogdGhlIHJlc3VsdCBwb2ludHMgdG8gYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHdpdGhp biB0aGUgYnVmZmVyLgorICAqLworIHN0YXRpYyBjaGFyICoKKyBsb2dtc2dfZmV0Y2goU2l6 ZSBsb2dtc2dfb2Zmc2V0LCBpbnQgbG9nbXNnX2xlbiwKKyAJCQljaGFyICpidWZmZXIsIFNp emUgYnVmZmVyX3NpemUpCisgeworIAkvKiBGaWxlIHJlYWQgZmFpbGVkPyAqLworIAlpZiAo YnVmZmVyID09IE5VTEwpCisgCQlyZXR1cm4gTlVMTDsKKyAJLyogQm9ndXMgb2Zmc2V0L2xl bmd0aD8gKi8KKyAJaWYgKGxvZ21zZ19sZW4gPCAwIHx8CisgCQlsb2dtc2dfb2Zmc2V0ICsg bG9nbXNnX2xlbiA+PSBidWZmZXJfc2l6ZSkKKyAJCXJldHVybiBOVUxMOworIAkvKiBBcyBh IGZ1cnRoZXIgc2FuaXR5IGNoZWNrLCBtYWtlIHN1cmUgdGhlcmUncyBhIHRyYWlsaW5nIG51 bGwgKi8KKyAJaWYgKGJ1ZmZlcltsb2dtc2dfb2Zmc2V0ICsgbG9nbXNnX2xlbl0gIT0gJ1ww JykKKyAJCXJldHVybiBOVUxMOworIAkvKiBMb29rcyBPSyAqLworIAlyZXR1cm4gYnVmZmVy ICsgbG9nbXNnX29mZnNldDsKKyB9CisgCisgLyoKKyAgKiBEbyB3ZSBuZWVkIHRvIGdhcmJh Z2UtY29sbGVjdCB0aGUgZXh0ZXJuYWwgbG9nbXNnIHRleHQgZmlsZT8KKyAgKgorICAqIENh bGxlciBzaG91bGQgaG9sZCBhdCBsZWFzdCBhIHNoYXJlZCBsb2NrIG9uIHBnbG0tPmxvY2su CisgICovCisgc3RhdGljIGJvb2wKKyBuZWVkX2djX2xvZ21zZ3Modm9pZCkKKyB7CisgCVNp emUJCWV4dGVudDsKKyAKKyAJLyogUmVhZCBzaGFyZWQgZXh0ZW50IHBvaW50ZXIgKi8KKyAJ eworIAkJdm9sYXRpbGUgcGdsbVNoYXJlZFN0YXRlICpzID0gKHZvbGF0aWxlIHBnbG1TaGFy ZWRTdGF0ZSAqKSBwZ2xtOworIAorIAkJU3BpbkxvY2tBY3F1aXJlKCZzLT5tdXRleCk7Cisg CQlleHRlbnQgPSBzLT5leHRlbnQ7CisgCQlTcGluTG9ja1JlbGVhc2UoJnMtPm11dGV4KTsK KyAJfQorIAorIAkvKgorIAkgKiBEb24ndCBwcm9jZWVkIGlmIGZpbGUgZG9lcyBub3QgZXhj ZWVkIDUxMiBieXRlcyBwZXIgcG9zc2libGUgZW50cnkuCisgCSAqCisgCSAqIEhlcmUgYW5k IGluIHRoZSBuZXh0IHRlc3QsIDMyLWJpdCBtYWNoaW5lcyBoYXZlIG92ZXJmbG93IGhhemFy ZHMgaWYKKyAJICogcGdsbV9tYXggYW5kL29yIG1lYW5fbG9nbXNnX2xlbiBhcmUgbGFyZ2Uu ICBGb3JjZSB0aGUgbXVsdGlwbGljYXRpb25zCisgCSAqIGFuZCBjb21wYXJpc29ucyB0byBi ZSBkb25lIGluIHVpbnQ2NCBhcml0aG1ldGljIHRvIGZvcmVzdGFsbCB0cm91YmxlLgorIAkg Ki8KKyAJaWYgKCh1aW50NjQpIGV4dGVudCA8ICh1aW50NjQpIDUxMiAqIHBnbG1fbWF4KQor IAkJcmV0dXJuIGZhbHNlOworIAorIAkvKgorIAkgKiBEb24ndCBwcm9jZWVkIGlmIGZpbGUg aXMgbGVzcyB0aGFuIGFib3V0IDUwJSBibG9hdC4gIE5vdGhpbmcgY2FuIG9yCisgCSAqIHNo b3VsZCBiZSBkb25lIGluIHRoZSBldmVudCBvZiB1bnVzdWFsbHkgbGFyZ2UgbG9nbXNnIHRl eHRzIGFjY291bnRpbmcKKyAJICogZm9yIGZpbGUncyBsYXJnZSBzaXplLiAgV2UgZ28gdG8g dGhlIHRyb3VibGUgb2YgbWFpbnRhaW5pbmcgdGhlIG1lYW4KKyAJICogcXVlcnkgbGVuZ3Ro IGluIG9yZGVyIHRvIHByZXZlbnQgZ2FyYmFnZSBjb2xsZWN0aW9uIGZyb20gdGhyYXNoaW5n CisgCSAqIHVzZWxlc3NseS4KKyAJICovCisgCWlmICgodWludDY0KSBleHRlbnQgPCAodWlu dDY0KSBwZ2xtLT5tZWFuX2xvZ21zZ19sZW4gKiBwZ2xtX21heCAqIDIpCisgCQlyZXR1cm4g ZmFsc2U7CisgCisgCXJldHVybiB0cnVlOworIH0KKyAKKyAvKgorICAqIEdhcmJhZ2UtY29s bGVjdCBvcnBoYW5lZCBsb2dtc2cgdGV4dHMgaW4gZXh0ZXJuYWwgZmlsZS4KKyAgKgorICAq IFRoaXMgd29uJ3QgYmUgY2FsbGVkIG9mdGVuIGluIHRoZSB0eXBpY2FsIGNhc2UsIHNpbmNl IGl0J3MgbGlrZWx5IHRoYXQKKyAgKiB0aGVyZSB3b24ndCBiZSB0b28gbXVjaCBjaHVybiwg YW5kIGJlc2lkZXMsIGEgc2ltaWxhciBjb21wYWN0aW9uIHByb2Nlc3MKKyAgKiBvY2N1cnMg d2hlbiBzZXJpYWxpemluZyB0byBkaXNrIGF0IHNodXRkb3duIG9yIGFzIHBhcnQgb2YgcmVz ZXR0aW5nLgorICAqIERlc3BpdGUgdGhpcywgaXQgc2VlbXMgcHJ1ZGVudCB0byBwbGFuIGZv ciB0aGUgZWRnZSBjYXNlIHdoZXJlIHRoZSBmaWxlCisgICogYmVjb21lcyB1bnJlYXNvbmFi bHkgbGFyZ2UsIHdpdGggbm8gb3RoZXIgbWV0aG9kIG9mIGNvbXBhY3Rpb24gbGlrZWx5IHRv CisgICogb2NjdXIgaW4gdGhlIGZvcmVzZWVhYmxlIGZ1dHVyZS4KKyAgKgorICAqIFRoZSBj YWxsZXIgbXVzdCBob2xkIGFuIGV4Y2x1c2l2ZSBsb2NrIG9uIHBnbG0tPmxvY2suCisgICoK KyAgKiBBdCB0aGUgZmlyc3Qgc2lnbiBvZiB0cm91YmxlIHdlIHVubGluayB0aGUgbG9nbXNn IHRleHQgZmlsZSB0byBnZXQgYSBjbGVhbgorICAqIHNsYXRlIChhbHRob3VnaCBleGlzdGlu ZyBzdGF0aXN0aWNzIGFyZSByZXRhaW5lZCksIHJhdGhlciB0aGFuIHJpc2sKKyAgKiB0aHJh c2hpbmcgYnkgYWxsb3dpbmcgdGhlIHNhbWUgcHJvYmxlbSBjYXNlIHRvIHJlY3VyIGluZGVm aW5pdGVseS4KKyAgKi8KKyBzdGF0aWMgdm9pZAorIGdjX2xvZ21zZ3Modm9pZCkKKyB7Cisg CWNoYXIJICAgKm1sYnVmZmVyOworIAlTaXplCQltbGJ1ZmZlcl9zaXplOworIAlGSUxFCSAg ICpsbWZpbGUgPSBOVUxMOworIAlIQVNIX1NFUV9TVEFUVVMgaGFzaF9zZXE7CisgCXBnbG1F bnRyeSAgKmVudHJ5OworIAlTaXplCQlleHRlbnQ7CisgCWludAkJCW5lbnRyaWVzOworIAor IAkvKgorIAkgKiBXaGVuIGNhbGxlZCBmcm9tIHBnbG1fc3RvcmUsIHNvbWUgb3RoZXIgc2Vz c2lvbiBtaWdodCBoYXZlIHByb2NlZWRlZAorIAkgKiB3aXRoIGdhcmJhZ2UgY29sbGVjdGlv biBpbiB0aGUgbm8tbG9jay1oZWxkIGludGVyaW0gb2YgbG9jayBzdHJlbmd0aAorIAkgKiBl c2NhbGF0aW9uLiAgQ2hlY2sgb25jZSBtb3JlIHRoYXQgdGhpcyBpcyBhY3R1YWxseSBuZWNl c3NhcnkuCisgCSAqLworIAlpZiAoIW5lZWRfZ2NfbG9nbXNncygpKQorIAkJcmV0dXJuOwor IAorIAkvKgorIAkgKiBMb2FkIHRoZSBvbGQgdGV4dHMgZmlsZS4gIElmIHdlIGZhaWwgKG91 dCBvZiBtZW1vcnksIGZvciBpbnN0YW5jZSksCisgCSAqIGludmFsaWRhdGUgbG9nbXNnIHRl eHRzLiAgSG9wZWZ1bGx5IHRoaXMgaXMgcmFyZS4gIEl0IG1pZ2h0IHNlZW0gYmV0dGVyCisg CSAqIHRvIGxlYXZlIHRoaW5ncyBhbG9uZSBvbiBhbiBPT00gZmFpbHVyZSwgYnV0IHRoZSBw cm9ibGVtIGlzIHRoYXQgdGhlCisgCSAqIGZpbGUgaXMgb25seSBnb2luZyB0byBnZXQgYmln Z2VyOyBob3BpbmcgZm9yIGEgZnV0dXJlIG5vbi1PT00gcmVzdWx0IGlzCisgCSAqIHJpc2t5 IGFuZCBjYW4gZWFzaWx5IGxlYWQgdG8gY29tcGxldGUgZGVuaWFsIG9mIHNlcnZpY2UuCisg CSAqLworIAltbGJ1ZmZlciA9IGxvZ21zZ19sb2FkX2ZpbGUoJm1sYnVmZmVyX3NpemUpOwor IAlpZiAobWxidWZmZXIgPT0gTlVMTCkKKyAJCWdvdG8gZ2NfZmFpbDsKKyAKKyAJLyoKKyAJ ICogV2Ugb3ZlcndyaXRlIHRoZSBsb2dtc2cgdGV4dHMgZmlsZSBpbiBwbGFjZSwgc28gYXMg dG8gcmVkdWNlIHRoZSByaXNrIG9mCisgCSAqIGFuIG91dC1vZi1kaXNrLXNwYWNlIGZhaWx1 cmUuICBTaW5jZSB0aGUgZmlsZSBpcyBndWFyYW50ZWVkIG5vdCB0byBnZXQKKyAJICogbGFy Z2VyLCB0aGlzIHNob3VsZCBhbHdheXMgd29yayBvbiB0cmFkaXRpb25hbCBmaWxlc3lzdGVt czsgdGhvdWdoIHdlCisgCSAqIGNvdWxkIHN0aWxsIGxvc2Ugb24gY29weS1vbi13cml0ZSBm aWxlc3lzdGVtcy4KKyAJICovCisgCWxtZmlsZSA9IEFsbG9jYXRlRmlsZShQR0xNX1RFWFRf RklMRSwgUEdfQklOQVJZX1cpOworIAlpZiAobG1maWxlID09IE5VTEwpCisgCXsKKyAJCWVy ZXBvcnQoTE9HLAorIAkJCQkoZXJyY29kZV9mb3JfZmlsZV9hY2Nlc3MoKSwKKyAJCQkJIGVy cm1zZygiY291bGQgbm90IHdyaXRlIGZpbGUgXCIlc1wiOiAlbSIsCisgCQkJCQkJUEdMTV9U RVhUX0ZJTEUpKSk7CisgCQlnb3RvIGdjX2ZhaWw7CisgCX0KKyAKKyAJZXh0ZW50ID0gMDsK KyAJbmVudHJpZXMgPSAwOworIAorIAloYXNoX3NlcV9pbml0KCZoYXNoX3NlcSwgcGdsbV9o YXNoKTsKKyAJd2hpbGUgKChlbnRyeSA9IGhhc2hfc2VxX3NlYXJjaCgmaGFzaF9zZXEpKSAh PSBOVUxMKQorIAl7CisgCQlpbnQJCQlsb2dtc2dfbGVuID0gZW50cnktPmxvZ21zZ19sZW47 CisgCQljaGFyCSAgICptc2cgPSBsb2dtc2dfZmV0Y2goZW50cnktPmxvZ21zZ19vZmZzZXQs CisgCQkJCQkJCQkJICAgbG9nbXNnX2xlbiwKKyAJCQkJCQkJCQkgICBtbGJ1ZmZlciwKKyAJ CQkJCQkJCQkgICBtbGJ1ZmZlcl9zaXplKTsKKyAKKyAJCWlmIChtc2cgPT0gTlVMTCkKKyAJ CXsKKyAJCQkvKiBUcm91YmxlIC4uLiBkcm9wIHRoZSB0ZXh0ICovCisgCQkJZW50cnktPmxv Z21zZ19vZmZzZXQgPSAwOworIAkJCWVudHJ5LT5sb2dtc2dfbGVuID0gLTE7CisgCQkJLyog ZW50cnkgd2lsbCBub3QgYmUgY291bnRlZCBpbiBtZWFuIGxvZ21zZyBsZW5ndGggY29tcHV0 YXRpb24gKi8KKyAJCQljb250aW51ZTsKKyAJCX0KKyAKKyAJCWlmIChmd3JpdGUobXNnLCAx LCBsb2dtc2dfbGVuICsgMSwgbG1maWxlKSAhPSBsb2dtc2dfbGVuICsgMSkKKyAJCXsKKyAJ CQllcmVwb3J0KExPRywKKyAJCQkJCShlcnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAorIAkJ CQkJIGVycm1zZygiY291bGQgbm90IHdyaXRlIGZpbGUgXCIlc1wiOiAlbSIsCisgCQkJCQkJ CVBHTE1fVEVYVF9GSUxFKSkpOworIAkJCWhhc2hfc2VxX3Rlcm0oJmhhc2hfc2VxKTsKKyAJ CQlnb3RvIGdjX2ZhaWw7CisgCQl9CisgCisgCQllbnRyeS0+bG9nbXNnX29mZnNldCA9IGV4 dGVudDsKKyAJCWV4dGVudCArPSBsb2dtc2dfbGVuICsgMTsKKyAJCW5lbnRyaWVzKys7Cisg CX0KKyAKKyAJLyoKKyAJICogVHJ1bmNhdGUgYXdheSBhbnkgbm93LXVudXNlZCBzcGFjZS4g IElmIHRoaXMgZmFpbHMgZm9yIHNvbWUgb2RkIHJlYXNvbiwKKyAJICogd2UgbG9nIGl0LCBi dXQgdGhlcmUncyBubyBuZWVkIHRvIGZhaWwuCisgCSAqLworIAlpZiAoZnRydW5jYXRlKGZp bGVubyhsbWZpbGUpLCBleHRlbnQpICE9IDApCisgCQllcmVwb3J0KExPRywKKyAJCQkJKGVy cmNvZGVfZm9yX2ZpbGVfYWNjZXNzKCksCisgCQkJCSBlcnJtc2coImNvdWxkIG5vdCB0cnVu Y2F0ZSBmaWxlIFwiJXNcIjogJW0iLAorIAkJCQkJCVBHTE1fVEVYVF9GSUxFKSkpOworIAor IAlpZiAoRnJlZUZpbGUobG1maWxlKSkKKyAJeworIAkJZXJlcG9ydChMT0csCisgCQkJCShl cnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAorIAkJCQkgZXJybXNnKCJjb3VsZCBub3Qgd3Jp dGUgZmlsZSBcIiVzXCI6ICVtIiwKKyAJCQkJCQlQR0xNX1RFWFRfRklMRSkpKTsKKyAJCWxt ZmlsZSA9IE5VTEw7CisgCQlnb3RvIGdjX2ZhaWw7CisgCX0KKyAKKyAJZWxvZyhERUJVRzEs ICJwZ2xtIGdjIG9mIHF1ZXJpZXMgZmlsZSBzaHJ1bmsgc2l6ZSBmcm9tICV6dSB0byAlenUi LAorIAkJIHBnbG0tPmV4dGVudCwgZXh0ZW50KTsKKyAKKyAJLyogUmVzZXQgdGhlIHNoYXJl ZCBleHRlbnQgcG9pbnRlciAqLworIAlwZ2xtLT5leHRlbnQgPSBleHRlbnQ7CisgCisgCS8q CisgCSAqIEFsc28gdXBkYXRlIHRoZSBtZWFuIGxvZ21zZyBsZW5ndGgsIHRvIGJlIHN1cmUg dGhhdCBuZWVkX2djX2xvZ21zZ3MoKQorIAkgKiB3b24ndCBzdGlsbCB0aGluayB3ZSBoYXZl IGEgcHJvYmxlbS4KKyAJICovCisgCWlmIChuZW50cmllcyA+IDApCisgCQlwZ2xtLT5tZWFu X2xvZ21zZ19sZW4gPSBleHRlbnQgLyBuZW50cmllczsKKyAJZWxzZQorIAkJcGdsbS0+bWVh bl9sb2dtc2dfbGVuID0gQVNTVU1FRF9MRU5HVEhfSU5JVDsKKyAKKyAJZnJlZShtbGJ1ZmZl cik7CisgCisgCS8qCisgCSAqIE9LLCBjb3VudCBhIGdhcmJhZ2UgY29sbGVjdGlvbiBjeWNs ZS4gIChOb3RlOiBldmVuIHRob3VnaCB3ZSBoYXZlCisgCSAqIGV4Y2x1c2l2ZSBsb2NrIG9u IHBnbG0tPmxvY2ssIHdlIG11c3QgdGFrZSBwZ2xtLT5tdXRleCBmb3IgdGhpcywgc2luY2UK KyAJICogb3RoZXIgcHJvY2Vzc2VzIG1heSBleGFtaW5lIGdjX2NvdW50IHdoaWxlIGhvbGRp bmcgb25seSB0aGUgbXV0ZXguCisgCSAqIEFsc28sIHdlIGhhdmUgdG8gYWR2YW5jZSB0aGUg Y291bnQgKmFmdGVyKiB3ZSd2ZSByZXdyaXR0ZW4gdGhlIGZpbGUsCisgCSAqIGVsc2Ugb3Ro ZXIgcHJvY2Vzc2VzIG1pZ2h0IG5vdCByZWFsaXplIHRoZXkgcmVhZCBhIHN0YWxlIGZpbGUu KQorIAkgKi8KKyAJcmVjb3JkX2djX21zZ2ZtdHMoKTsKKyAKKyAJcmV0dXJuOworIAorIGdj X2ZhaWw6CisgCS8qIGNsZWFuIHVwIHJlc291cmNlcyAqLworIAlpZiAobG1maWxlKQorIAkJ RnJlZUZpbGUobG1maWxlKTsKKyAJZnJlZShtbGJ1ZmZlcik7CisgCisgCS8qCisgCSAqIFNp bmNlIHRoZSBjb250ZW50cyBvZiB0aGUgZXh0ZXJuYWwgZmlsZSBhcmUgbm93IHVuY2VydGFp biwgbWFyayBhbGwKKyAJICogaGFzaHRhYmxlIGVudHJpZXMgYXMgaGF2aW5nIGludmFsaWQg dGV4dHMuCisgCSAqLworIAloYXNoX3NlcV9pbml0KCZoYXNoX3NlcSwgcGdsbV9oYXNoKTsK KyAJd2hpbGUgKChlbnRyeSA9IGhhc2hfc2VxX3NlYXJjaCgmaGFzaF9zZXEpKSAhPSBOVUxM KQorIAl7CisgCQllbnRyeS0+bG9nbXNnX29mZnNldCA9IDA7CisgCQllbnRyeS0+bG9nbXNn X2xlbiA9IC0xOworIAl9CisgCisgCS8qCisgCSAqIERlc3Ryb3kgdGhlIGxvZ21zZyB0ZXh0 IGZpbGUgYW5kIGNyZWF0ZSBhIG5ldywgZW1wdHkgb25lCisgCSAqLworIAkodm9pZCkgdW5s aW5rKFBHTE1fVEVYVF9GSUxFKTsKKyAJbG1maWxlID0gQWxsb2NhdGVGaWxlKFBHTE1fVEVY VF9GSUxFLCBQR19CSU5BUllfVyk7CisgCWlmIChsbWZpbGUgPT0gTlVMTCkKKyAJCWVyZXBv cnQoTE9HLAorIAkJCQkoZXJyY29kZV9mb3JfZmlsZV9hY2Nlc3MoKSwKKyAJCQkJIGVycm1z ZygiY291bGQgbm90IHJlY3JlYXRlIGZpbGUgXCIlc1wiOiAlbSIsCisgCQkJCQkJUEdMTV9U RVhUX0ZJTEUpKSk7CisgCWVsc2UKKyAJCUZyZWVGaWxlKGxtZmlsZSk7CisgCisgCS8qIFJl c2V0IHRoZSBzaGFyZWQgZXh0ZW50IHBvaW50ZXIgKi8KKyAJcGdsbS0+ZXh0ZW50ID0gMDsK KyAKKyAJLyogUmVzZXQgbWVhbl9sb2dtc2dfbGVuIHRvIG1hdGNoIHRoZSBuZXcgc3RhdGUg Ki8KKyAJcGdsbS0+bWVhbl9sb2dtc2dfbGVuID0gQVNTVU1FRF9MRU5HVEhfSU5JVDsKKyAK KyAJLyoKKyAJICogQnVtcCB0aGUgR0MgY291bnQgZXZlbiB0aG91Z2ggd2UgZmFpbGVkLgor IAkgKgorIAkgKiBUaGlzIGlzIG5lZWRlZCB0byBtYWtlIGNvbmN1cnJlbnQgcmVhZGVycyBv ZiBmaWxlIHdpdGhvdXQgYW55IGxvY2sgb24KKyAJICogcGdsbS0+bG9jayBub3RpY2UgZXhp c3RlbmNlIG9mIG5ldyB2ZXJzaW9uIG9mIGZpbGUuICBPbmNlIHJlYWRlcnMKKyAJICogc3Vi c2VxdWVudGx5IG9ic2VydmUgYSBjaGFuZ2UgaW4gR0MgY291bnQgd2l0aCBwZ2xtLT5sb2Nr IGhlbGQsIHRoYXQKKyAJICogZm9yY2VzIGEgc2FmZSByZW9wZW4gb2YgZmlsZS4gIFdyaXRl cnMgYWxzbyByZXF1aXJlIHRoYXQgd2UgYnVtcCBoZXJlLAorIAkgKiBvZiBjb3Vyc2UuICAo QXMgcmVxdWlyZWQgYnkgbG9ja2luZyBwcm90b2NvbCwgcmVhZGVycyBhbmQgd3JpdGVycyBk b24ndAorIAkgKiB0cnVzdCBlYXJsaWVyIGZpbGUgY29udGVudHMgdW50aWwgZ2NfY291bnQg aXMgZm91bmQgdW5jaGFuZ2VkIGFmdGVyCisgCSAqIHBnbG0tPmxvY2sgYWNxdWlyZWQgaW4g c2hhcmVkIG9yIGV4Y2x1c2l2ZSBtb2RlIHJlc3BlY3RpdmVseS4pCisgCSAqLworIAlyZWNv cmRfZ2NfbXNnZm10cygpOworIH0KKyAKKyAvKgorICAqIFJlbGVhc2UgZW50cmllcyBjb3Jy ZXNwb25kaW5nIHRvIHBhcmFtZXRlcnMgcGFzc2VkLgorICAqLworIHN0YXRpYyB2b2lkCisg ZW50cnlfcmVzZXQoY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbm8sIGludCBlbGV2ZWwpCisg eworIAlIQVNIX1NFUV9TVEFUVVMgaGFzaF9zZXE7CisgCXBnbG1FbnRyeSAgKmVudHJ5Owor IAlGSUxFCSAgICpsbWZpbGU7CisgCWxvbmcJCW51bV9lbnRyaWVzOworIAlsb25nCQludW1f cmVtb3ZlID0gMDsKKyAJcGdsbUhhc2hLZXkga2V5OworIAorIAlpZiAoIXBnbG0gfHwgIXBn bG1faGFzaCkKKyAJCWVyZXBvcnQoRVJST1IsCisgCQkJCShlcnJjb2RlKEVSUkNPREVfT0JK RUNUX05PVF9JTl9QUkVSRVFVSVNJVEVfU1RBVEUpLAorIAkJCQkgZXJybXNnKCJwZ19zdGF0 X2xvZ21zZyBtdXN0IGJlIGxvYWRlZCB2aWEgc2hhcmVkX3ByZWxvYWRfbGlicmFyaWVzIikp KTsKKyAKKyAJTFdMb2NrQWNxdWlyZShwZ2xtLT5sb2NrLCBMV19FWENMVVNJVkUpOworIAlu dW1fZW50cmllcyA9IGhhc2hfZ2V0X251bV9lbnRyaWVzKHBnbG1faGFzaCk7CisgCisgCWlm IChmaWxlbmFtZSAhPSBOVUxMICYmIGxpbmVubyAhPSAwICYmIGVsZXZlbCAhPSAwKQorIAl7 CisgCQkvKiBJZiBhbGwgdGhlIHBhcmFtZXRlcnMgYXJlIGF2YWlsYWJsZSwgdXNlIHRoZSBm YXN0IHBhdGguICovCisgCQltZW1zZXQoJmtleSwgMCwgc2l6ZW9mKHBnbG1IYXNoS2V5KSk7 CisgCisgCQlpZiAoZmlsZW5hbWUpCisgCQl7CisgCQkJc2l6ZV90CQlmaWxlbmFtZV9sZW4g PSBzdHJsZW4oZmlsZW5hbWUpOworIAorIAkJCW1lbWNweShrZXkuZmlsZW5hbWUsIGZpbGVu YW1lLAorIAkJCQkgICBmaWxlbmFtZV9sZW4gPCBNQVhGSUxFTkFNRUxFTiA/CisgCQkJCQkJ CQkgIGZpbGVuYW1lX2xlbiA6IE1BWEZJTEVOQU1FTEVOICk7CisgCQl9CisgCQllbHNlCisg CQkJbWVtc2V0KGtleS5maWxlbmFtZSwgJ1wwJywgTUFYRklMRU5BTUVMRU4pOworIAorIAkJ a2V5LmxpbmVubyA9IGxpbmVubzsKKyAJCWtleS5lbGV2ZWwgPSBlbGV2ZWw7CisgCisgCQkv KiBSZW1vdmUgdGhlIGtleSBpZiBleGlzdHMgKi8KKyAJCWVudHJ5ID0gKHBnbG1FbnRyeSAq KSBoYXNoX3NlYXJjaChwZ2xtX2hhc2gsICZrZXksIEhBU0hfUkVNT1ZFLCBOVUxMKTsKKyAJ CWlmIChlbnRyeSkJCQkJLyogZm91bmQgKi8KKyAJCQludW1fcmVtb3ZlKys7CisgCX0KKyAJ ZWxzZSBpZiAoZmlsZW5hbWUgIT0gTlVMTCB8fCBsaW5lbm8gIT0gMCB8fCBlbGV2ZWwgIT0g MCkKKyAJeworIAkJLyogUmVtb3ZlIGVudHJpZXMgY29ycmVzcG9uZGluZyB0byB2YWxpZCBw YXJhbWV0ZXJzLiAqLworIAkJaGFzaF9zZXFfaW5pdCgmaGFzaF9zZXEsIHBnbG1faGFzaCk7 CisgCQl3aGlsZSAoKGVudHJ5ID0gaGFzaF9zZXFfc2VhcmNoKCZoYXNoX3NlcSkpICE9IE5V TEwpCisgCQl7CisgCQkJaWYgKCghZmlsZW5hbWUgfHwgZW50cnktPmtleS5maWxlbmFtZSA9 PSBmaWxlbmFtZSkgJiYKKyAJCQkJKCFsaW5lbm8gfHwgZW50cnktPmtleS5saW5lbm8gPT0g bGluZW5vKSAmJgorIAkJCQkoIWVsZXZlbCB8fCBlbnRyeS0+a2V5LmVsZXZlbCA9PSBlbGV2 ZWwpKQorIAkJCXsKKyAJCQkJaGFzaF9zZWFyY2gocGdsbV9oYXNoLCAmZW50cnktPmtleSwg SEFTSF9SRU1PVkUsIE5VTEwpOworIAkJCQludW1fcmVtb3ZlKys7CisgCQkJfQorIAkJfQor IAl9CisgCWVsc2UKKyAJeworIAkJLyogUmVtb3ZlIGFsbCBlbnRyaWVzLiAqLworIAkJaGFz aF9zZXFfaW5pdCgmaGFzaF9zZXEsIHBnbG1faGFzaCk7CisgCQl3aGlsZSAoKGVudHJ5ID0g aGFzaF9zZXFfc2VhcmNoKCZoYXNoX3NlcSkpICE9IE5VTEwpCisgCQl7CisgCQkJaGFzaF9z ZWFyY2gocGdsbV9oYXNoLCAmZW50cnktPmtleSwgSEFTSF9SRU1PVkUsIE5VTEwpOworIAkJ CW51bV9yZW1vdmUrKzsKKyAJCX0KKyAJfQorIAorIAkvKiBBbGwgZW50cmllcyBhcmUgcmVt b3ZlZD8gKi8KKyAJaWYgKG51bV9lbnRyaWVzICE9IG51bV9yZW1vdmUpCisgCQlnb3RvIHJl bGVhc2VfbG9jazsKKyAKKyAJLyoKKyAJICogUmVzZXQgZ2xvYmFsIHN0YXRpc3RpY3MgZm9y IHBnX3N0YXRfbG9nbXNnIHNpbmNlIGFsbCBlbnRyaWVzIGFyZQorIAkgKiByZW1vdmVkLgor IAkgKi8KKyAJeworIAkJdm9sYXRpbGUgcGdsbVNoYXJlZFN0YXRlICpzID0gKHZvbGF0aWxl IHBnbG1TaGFyZWRTdGF0ZSAqKSBwZ2xtOworIAkJVGltZXN0YW1wVHogc3RhdHNfcmVzZXQg PSBHZXRDdXJyZW50VGltZXN0YW1wKCk7CisgCisgCQlTcGluTG9ja0FjcXVpcmUoJnMtPm11 dGV4KTsKKyAJCXMtPnN0YXRzLmRlYWxsb2MgPSAwOworIAkJcy0+c3RhdHMuc3RhdHNfcmVz ZXQgPSBzdGF0c19yZXNldDsKKyAJCVNwaW5Mb2NrUmVsZWFzZSgmcy0+bXV0ZXgpOworIAl9 CisgCisgCS8qCisgCSAqIFdyaXRlIG5ldyBlbXB0eSBsb2dtc2cgZmlsZSwgcGVyaGFwcyBl dmVuIGNyZWF0aW5nIGEgbmV3IG9uZSB0byByZWNvdmVyCisgCSAqIGlmIHRoZSBmaWxlIHdh cyBtaXNzaW5nLgorIAkgKi8KKyAJbG1maWxlID0gQWxsb2NhdGVGaWxlKFBHTE1fVEVYVF9G SUxFLCBQR19CSU5BUllfVyk7CisgCWlmIChsbWZpbGUgPT0gTlVMTCkKKyAJeworIAkJZXJl cG9ydChMT0csCisgCQkJCShlcnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAorIAkJCQkgZXJy bXNnKCJjb3VsZCBub3QgY3JlYXRlIGZpbGUgXCIlc1wiOiAlbSIsCisgCQkJCQkJUEdMTV9U RVhUX0ZJTEUpKSk7CisgCQlnb3RvIGRvbmU7CisgCX0KKyAKKyAJLyogSWYgZnRydW5jYXRl IGZhaWxzLCBsb2cgaXQsIGJ1dCBpdCdzIG5vdCBhIGZhdGFsIHByb2JsZW0gKi8KKyAJaWYg KGZ0cnVuY2F0ZShmaWxlbm8obG1maWxlKSwgMCkgIT0gMCkKKyAJCWVyZXBvcnQoTE9HLAor IAkJCQkoZXJyY29kZV9mb3JfZmlsZV9hY2Nlc3MoKSwKKyAJCQkJIGVycm1zZygiY291bGQg bm90IHRydW5jYXRlIGZpbGUgXCIlc1wiOiAlbSIsCisgCQkJCQkJUEdMTV9URVhUX0ZJTEUp KSk7CisgCisgCUZyZWVGaWxlKGxtZmlsZSk7CisgCisgZG9uZToKKyAJcGdsbS0+ZXh0ZW50 ID0gMDsKKyAJLyogVGhpcyBjb3VudHMgYXMgYSBsb2dtc2cgdGV4dCBnYXJiYWdlIGNvbGxl Y3Rpb24gZm9yIG91ciBwdXJwb3NlcyAqLworIAlyZWNvcmRfZ2NfbXNnZm10cygpOworIAor IHJlbGVhc2VfbG9jazoKKyAJTFdMb2NrUmVsZWFzZShwZ2xtLT5sb2NrKTsKKyB9CisgCisg LyoKKyAgKiBsb2dtc2dfeGFjdF9jYWxsYmFjayAtLS0gY2xlYW51cCBhdCBtYWluLXRyYW5z YWN0aW9uIGVuZC4KKyAgKi8KKyBzdGF0aWMgdm9pZAorIGxvZ21zZ194YWN0X2NhbGxiYWNr KFhhY3RFdmVudCBldmVudCwgdm9pZCAqYXJnKQorIHsKKyAJaXNfaW5fbG9nX2hvb2sgPSBm YWxzZTsKKyB9CisgCisgI2lmIFBHX1ZFUlNJT05fTlVNIDwgMTUwMDAwCisgLyogZmxhZyBi aXRzIGZvciBJbml0TWF0ZXJpYWxpemVkU1JGKCkgKi8KKyAjZGVmaW5lIE1BVF9TUkZfVVNF X0VYUEVDVEVEX0RFU0MJMHgwMQkvKiB1c2UgZXhwZWN0ZWREZXNjIGFzIHR1cGRlc2MuICov CisgI2RlZmluZSBNQVRfU1JGX0JMRVNTCQkJCTB4MDIJLyogIkJsZXNzIiBhIHR1cGxlIGRl c2NyaXB0b3Igd2l0aAorIAkJCQkJCQkJCQkJICogQmxlc3NUdXBsZURlc2MoKS4gKi8KKyAK KyAvKgorICAqIEluaXRNYXRlcmlhbGl6ZWRTUkYKKyAgKgorICAqIEhlbHBlciBmdW5jdGlv biB0byBidWlsZCB0aGUgc3RhdGUgb2YgYSBzZXQtcmV0dXJuaW5nIGZ1bmN0aW9uIHVzZWQK KyAgKiBpbiB0aGUgY29udGV4dCBvZiBhIHNpbmdsZSBjYWxsIHdpdGggbWF0ZXJpYWxpemUg bW9kZS4gIFRoaXMgY29kZQorICAqIGluY2x1ZGVzIHNhbml0eSBjaGVja3Mgb24gUmV0dXJu U2V0SW5mbywgY3JlYXRlcyB0aGUgVHVwbGVzdG9yZSBhbmQKKyAgKiB0aGUgVHVwbGVEZXNj IHVzZWQgd2l0aCB0aGUgZnVuY3Rpb24gYW5kIHN0b3JlcyB0aGVtIGludG8gdGhlCisgICog ZnVuY3Rpb24ncyBSZXR1cm5TZXRJbmZvLgorICAqCisgICogImZsYWdzIiBjYW4gYmUgc2V0 IHRvIE1BVF9TUkZfVVNFX0VYUEVDVEVEX0RFU0MsIHRvIHVzZSB0aGUgdHVwbGUKKyAgKiBk ZXNjcmlwdG9yIGNvbWluZyBmcm9tIGV4cGVjdGVkRGVzYywgd2hpY2ggaXMgdGhlIHR1cGxl IGRlc2NyaXB0b3IKKyAgKiBleHBlY3RlZCBieSB0aGUgY2FsbGVyLiAgTUFUX1NSRl9CTEVT UyBjYW4gYmUgc2V0IHRvIGNvbXBsZXRlIHRoZQorICAqIGluZm9ybWF0aW9uIGFzc29jaWF0 ZWQgdG8gdGhlIHR1cGxlIGRlc2NyaXB0b3IsIHdoaWNoIGlzIG5lY2Vzc2FyeQorICAqIGlu IHNvbWUgY2FzZXMgd2hlcmUgdGhlIHR1cGxlIGRlc2NyaXB0b3IgY29tZXMgZnJvbSBhIHRy YW5zaWVudAorICAqIFJFQ09SRCBkYXRhdHlwZS4KKyAgKi8KKyBzdGF0aWMgdm9pZAorIElu aXRNYXRlcmlhbGl6ZWRTUkYoRnVuY3Rpb25DYWxsSW5mbyBmY2luZm8sIGJpdHMzMiBmbGFn cykKKyB7CisgCWJvb2wJCXJhbmRvbV9hY2Nlc3M7CisgCVJldHVyblNldEluZm8gKnJzaW5m byA9IChSZXR1cm5TZXRJbmZvICopIGZjaW5mby0+cmVzdWx0aW5mbzsKKyAJVHVwbGVzdG9y ZXN0YXRlICp0dXBzdG9yZTsKKyAJTWVtb3J5Q29udGV4dCBvbGRfY29udGV4dCwKKyAJCQkJ cGVyX3F1ZXJ5X2N0eDsKKyAJVHVwbGVEZXNjCXN0b3JlZF90dXBkZXNjOworIAorIAkvKiBj aGVjayB0byBzZWUgaWYgY2FsbGVyIHN1cHBvcnRzIHJldHVybmluZyBhIHR1cGxlc3RvcmUg Ki8KKyAJaWYgKHJzaW5mbyA9PSBOVUxMIHx8ICFJc0EocnNpbmZvLCBSZXR1cm5TZXRJbmZv KSkKKyAJCWVyZXBvcnQoRVJST1IsCisgCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9O T1RfU1VQUE9SVEVEKSwKKyAJCQkJIGVycm1zZygic2V0LXZhbHVlZCBmdW5jdGlvbiBjYWxs ZWQgaW4gY29udGV4dCB0aGF0IGNhbm5vdCBhY2NlcHQgYSBzZXQiKSkpOworIAlpZiAoIShy c2luZm8tPmFsbG93ZWRNb2RlcyAmIFNGUk1fTWF0ZXJpYWxpemUpIHx8CisgCQkoKGZsYWdz ICYgTUFUX1NSRl9VU0VfRVhQRUNURURfREVTQykgIT0gMCAmJiByc2luZm8tPmV4cGVjdGVk RGVzYyA9PSBOVUxMKSkKKyAJCWVyZXBvcnQoRVJST1IsCisgCQkJCShlcnJjb2RlKEVSUkNP REVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKyAJCQkJIGVycm1zZygibWF0ZXJpYWxpemUg bW9kZSByZXF1aXJlZCwgYnV0IGl0IGlzIG5vdCBhbGxvd2VkIGluIHRoaXMgY29udGV4dCIp KSk7CisgCisgCS8qCisgCSAqIFN0b3JlIHRoZSB0dXBsZXN0b3JlIGFuZCB0aGUgdHVwbGUg ZGVzY3JpcHRvciBpbiBSZXR1cm5TZXRJbmZvLiAgVGhpcworIAkgKiBtdXN0IGJlIGRvbmUg aW4gdGhlIHBlci1xdWVyeSBtZW1vcnkgY29udGV4dC4KKyAJICovCisgCXBlcl9xdWVyeV9j dHggPSByc2luZm8tPmVjb250ZXh0LT5lY3h0X3Blcl9xdWVyeV9tZW1vcnk7CisgCW9sZF9j b250ZXh0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKHBlcl9xdWVyeV9jdHgpOworIAorIAkv KiBidWlsZCBhIHR1cGxlIGRlc2NyaXB0b3IgZm9yIG91ciByZXN1bHQgdHlwZSAqLworIAlp ZiAoKGZsYWdzICYgTUFUX1NSRl9VU0VfRVhQRUNURURfREVTQykgIT0gMCkKKyAJCXN0b3Jl ZF90dXBkZXNjID0gQ3JlYXRlVHVwbGVEZXNjQ29weShyc2luZm8tPmV4cGVjdGVkRGVzYyk7 CisgCWVsc2UKKyAJeworIAkJaWYgKGdldF9jYWxsX3Jlc3VsdF90eXBlKGZjaW5mbywgTlVM TCwgJnN0b3JlZF90dXBkZXNjKSAhPSBUWVBFRlVOQ19DT01QT1NJVEUpCisgCQkJZWxvZyhF UlJPUiwgInJldHVybiB0eXBlIG11c3QgYmUgYSByb3cgdHlwZSIpOworIAl9CisgCisgCS8q IElmIHJlcXVlc3RlZCwgYmxlc3MgdGhlIHR1cGxlIGRlc2NyaXB0b3IgKi8KKyAJaWYgKChm bGFncyAmIE1BVF9TUkZfQkxFU1MpICE9IDApCisgCQlCbGVzc1R1cGxlRGVzYyhzdG9yZWRf dHVwZGVzYyk7CisgCisgCXJhbmRvbV9hY2Nlc3MgPSAocnNpbmZvLT5hbGxvd2VkTW9kZXMg JiBTRlJNX01hdGVyaWFsaXplX1JhbmRvbSkgIT0gMDsKKyAKKyAJdHVwc3RvcmUgPSB0dXBs ZXN0b3JlX2JlZ2luX2hlYXAocmFuZG9tX2FjY2VzcywgZmFsc2UsIHdvcmtfbWVtKTsKKyAJ cnNpbmZvLT5yZXR1cm5Nb2RlID0gU0ZSTV9NYXRlcmlhbGl6ZTsKKyAJcnNpbmZvLT5zZXRS ZXN1bHQgPSB0dXBzdG9yZTsKKyAJcnNpbmZvLT5zZXREZXNjID0gc3RvcmVkX3R1cGRlc2M7 CisgCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRfY29udGV4dCk7CisgfQorIAorIC8qCisg ICogZXJyb3Jfc2V2ZXJpdHkgLS0tIGdldCBzdHJpbmcgcmVwcmVzZW50aW5nIGVsZXZlbAor ICAqCisgICogVGhlIHN0cmluZyBpcyBub3QgbG9jYWxpemVkIGhlcmUsIGJ1dCB3ZSBtYXJr IHRoZSBzdHJpbmdzIGZvciB0cmFuc2xhdGlvbgorICAqIHNvIHRoYXQgY2FsbGVycyBjYW4g aW52b2tlIF8oKSBvbiB0aGUgcmVzdWx0LgorICAqLworIHN0YXRpYyBjb25zdCBjaGFyICoK KyBlcnJvcl9zZXZlcml0eShpbnQgZWxldmVsKQorIHsKKyAJY29uc3QgY2hhciAqcHJlZml4 OworIAorIAlzd2l0Y2ggKGVsZXZlbCkKKyAJeworIAkJY2FzZSBERUJVRzE6CisgCQljYXNl IERFQlVHMjoKKyAJCWNhc2UgREVCVUczOgorIAkJY2FzZSBERUJVRzQ6CisgCQljYXNlIERF QlVHNToKKyAJCQlwcmVmaXggPSBnZXR0ZXh0X25vb3AoIkRFQlVHIik7CisgCQkJYnJlYWs7 CisgCQljYXNlIExPRzoKKyAJCWNhc2UgTE9HX1NFUlZFUl9PTkxZOgorIAkJCXByZWZpeCA9 IGdldHRleHRfbm9vcCgiTE9HIik7CisgCQkJYnJlYWs7CisgCQljYXNlIElORk86CisgCQkJ cHJlZml4ID0gZ2V0dGV4dF9ub29wKCJJTkZPIik7CisgCQkJYnJlYWs7CisgCQljYXNlIE5P VElDRToKKyAJCQlwcmVmaXggPSBnZXR0ZXh0X25vb3AoIk5PVElDRSIpOworIAkJCWJyZWFr OworIAkJY2FzZSBXQVJOSU5HOgorICNpZiBQR19WRVJTSU9OX05VTSA+PSAxNDAwMDAKKyAJ CWNhc2UgV0FSTklOR19DTElFTlRfT05MWToKKyAjZW5kaWYgLyogUEdfVkVSU0lPTl9OVU0g Pj0gMTQwMDAwICovCisgCQkJcHJlZml4ID0gZ2V0dGV4dF9ub29wKCJXQVJOSU5HIik7Cisg CQkJYnJlYWs7CisgCQljYXNlIEVSUk9SOgorIAkJCXByZWZpeCA9IGdldHRleHRfbm9vcCgi RVJST1IiKTsKKyAJCQlicmVhazsKKyAJCWNhc2UgRkFUQUw6CisgCQkJcHJlZml4ID0gZ2V0 dGV4dF9ub29wKCJGQVRBTCIpOworIAkJCWJyZWFrOworIAkJY2FzZSBQQU5JQzoKKyAJCQlw cmVmaXggPSBnZXR0ZXh0X25vb3AoIlBBTklDIik7CisgCQkJYnJlYWs7CisgCQlkZWZhdWx0 OgorIAkJCXByZWZpeCA9ICI/Pz8iOworIAkJCWJyZWFrOworIAl9CisgCisgCXJldHVybiBw cmVmaXg7CisgfQorICNlbmRpZiAvKiBQR19WRVJTSU9OX05VTSA8IDE1MDAwMCAqLwpkaWZm IC0tZ2l0IGEvY29udHJpYi9wZ19zdGF0X2xvZ21zZy9wZ19zdGF0X2xvZ21zZy5jb25mIGIv Y29udHJpYi9wZ19zdGF0X2xvZ21zZy9wZ19zdGF0X2xvZ21zZy5jb25mCmluZGV4IC4uLmFi NjMzNmMgLgoqKiogYS9jb250cmliL3BnX3N0YXRfbG9nbXNnL3BnX3N0YXRfbG9nbXNnLmNv bmYKLS0tIGIvY29udHJpYi9wZ19zdGF0X2xvZ21zZy9wZ19zdGF0X2xvZ21zZy5jb25mCioq KioqKioqKioqKioqKgoqKiogMCAqKioqCi0tLSAxIC0tLS0KKyBzaGFyZWRfcHJlbG9hZF9s aWJyYXJpZXMgPSAncGdfc3RhdF9sb2dtc2cnCmRpZmYgLS1naXQgYS9jb250cmliL3BnX3N0 YXRfbG9nbXNnL3BnX3N0YXRfbG9nbXNnLmNvbnRyb2wgYi9jb250cmliL3BnX3N0YXRfbG9n bXNnL3BnX3N0YXRfbG9nbXNnLmNvbnRyb2wKaW5kZXggLi4uODAwYjU1MCAuCioqKiBhL2Nv bnRyaWIvcGdfc3RhdF9sb2dtc2cvcGdfc3RhdF9sb2dtc2cuY29udHJvbAotLS0gYi9jb250 cmliL3BnX3N0YXRfbG9nbXNnL3BnX3N0YXRfbG9nbXNnLmNvbnRyb2wKKioqKioqKioqKioq KioqCioqKiAwICoqKioKLS0tIDEsNSAtLS0tCisgIyBwZ19zdGF0X2xvZ21zZyBleHRlbnNp b24KKyBjb21tZW50ID0gJ3RyYWNrIHN0YXRpc3RpY3Mgb2YgbG9nIG1lc3NhZ2VzJworIGRl ZmF1bHRfdmVyc2lvbiA9ICcxLjAnCisgbW9kdWxlX3BhdGhuYW1lID0gJyRsaWJkaXIvcGdf c3RhdF9sb2dtc2cnCisgcmVsb2NhdGFibGUgPSB0cnVlCmRpZmYgLS1naXQgYS9kb2Mvc3Jj L3NnbWwvcGdzdGF0bG9nbXNnLnNnbWwgYi9kb2Mvc3JjL3NnbWwvcGdzdGF0bG9nbXNnLnNn bWwKaW5kZXggLi4uM2Y1MmJlYiAuCioqKiBhL2RvYy9zcmMvc2dtbC9wZ3N0YXRsb2dtc2cu c2dtbAotLS0gYi9kb2Mvc3JjL3NnbWwvcGdzdGF0bG9nbXNnLnNnbWwKKioqKioqKioqKioq KioqCioqKiAwICoqKioKLS0tIDEsNTk1IC0tLS0KKyA8IS0tIGRvYy9zcmMvc2dtbC9wZ3N0 YXRsb2dtc2cuc2dtbCAtLT4KKyAKKyA8c2VjdDEgaWQ9InBnc3RhdGxvZ21zZyIgeHJlZmxh YmVsPSJwZ19zdGF0X2xvZ21zZyI+CisgIDx0aXRsZT5wZ19zdGF0X2xvZ21zZyAmbWRhc2g7 IHRyYWNrIGNvdW50cyBvZiBub3JtYWxpemVkIHNlcnZlciBsb2cgbWVzc2FnZXM8L3RpdGxl PgorIAorICA8aW5kZXh0ZXJtIHpvbmU9InBnc3RhdGxvZ21zZyI+CisgICA8cHJpbWFyeT5w Z19zdGF0X2xvZ21zZzwvcHJpbWFyeT4KKyAgPC9pbmRleHRlcm0+CisgCisgIDxwYXJhPgor ICAgVGhlIDxmaWxlbmFtZT5wZ19zdGF0X2xvZ21zZzwvZmlsZW5hbWU+IG1vZHVsZSBwcm92 aWRlcyBhIG1lYW5zIGZvcgorICAgdHJhY2tpbmcgdGhlIGFnZ3JlZ2F0ZWQgY291bnRzIG9m IG5vcm1hbGl6ZWQgc2VydmVyIGxvZyBtZXNzYWdlIHN0cmluZ3MuCisgIDwvcGFyYT4KKyAK KyAgPHBhcmE+CisgICBUaGUgbW9kdWxlIG11c3QgYmUgbG9hZGVkIGJ5IGFkZGluZyA8bGl0 ZXJhbD5wZ19zdGF0X2xvZ21zZzwvbGl0ZXJhbD4gdG8KKyAgIDx4cmVmIGxpbmtlbmQ9Imd1 Yy1zaGFyZWQtcHJlbG9hZC1saWJyYXJpZXMiLz4gaW4KKyAgIDxmaWxlbmFtZT5wb3N0Z3Jl c3FsLmNvbmY8L2ZpbGVuYW1lPiwgYmVjYXVzZSBpdCByZXF1aXJlcyBhZGRpdGlvbmFsIHNo YXJlZCBtZW1vcnkuCisgICBUaGlzIG1lYW5zIHRoYXQgYSBzZXJ2ZXIgcmVzdGFydCBpcyBu ZWVkZWQgdG8gYWRkIG9yIHJlbW92ZSB0aGUgbW9kdWxlLgorICA8L3BhcmE+CisgCisgIDxw YXJhPgorICAgIFdoZW4gPGZpbGVuYW1lPnBnX3N0YXRfbG9nbXNnPC9maWxlbmFtZT4gaXMg YWN0aXZlLCBpdCB0cmFja3MKKyAgICBsb2cgbWVzc2FnZSBjb3VudHMgYWNyb3NzIGFsbCBk YXRhYmFzZXMgb2YgdGhlIHNlcnZlci4gVG8gYWNjZXNzIGFuZCBtYW5pcHVsYXRlCisgICAg dGhlc2Ugc3RhdGlzdGljcywgdGhlIG1vZHVsZSBwcm92aWRlcyB2aWV3cworICAgIDxzdHJ1 Y3RuYW1lPnBnX3N0YXRfbG9nbXNnPC9zdHJ1Y3RuYW1lPiBhbmQKKyAgICA8c3RydWN0bmFt ZT5wZ19zdGF0X2xvZ21zZ19pbmZvPC9zdHJ1Y3RuYW1lPiwKKyAgICBhbmQgdGhlIHV0aWxp dHkgZnVuY3Rpb25zIDxmdW5jdGlvbj5wZ19zdGF0X2xvZ21zZ19yZXNldDwvZnVuY3Rpb24+ IGFuZAorICAgIDxmdW5jdGlvbj5wZ19zdGF0X2xvZ21zZzwvZnVuY3Rpb24+LiAgVGhlc2Ug YXJlIG5vdCBhdmFpbGFibGUgZ2xvYmFsbHkgYnV0CisgICAgY2FuIGJlIGVuYWJsZWQgZm9y IGEgc3BlY2lmaWMgZGF0YWJhc2Ugd2l0aAorICAgIDxjb21tYW5kPkNSRUFURSBFWFRFTlNJ T04gcGdfc3RhdF9sb2dtc2c8L2NvbW1hbmQ+LgorICA8L3BhcmE+CisgCisgIDxzZWN0MiBp ZD0icGdzdGF0bG9nbXNnLXBnLXN0YXQtbG9nbXNnIj4KKyAgIDx0aXRsZT5UaGUgPHN0cnVj dG5hbWU+cGdfc3RhdF9sb2dtc2c8L3N0cnVjdG5hbWU+IFZpZXc8L3RpdGxlPgorIAorICAg PHBhcmE+CisgICAgVGhlIGNvdW50cyBnYXRoZXJlZCBieSB0aGUgbW9kdWxlIGFyZSBtYWRl IGF2YWlsYWJsZSB2aWEgYQorICAgIHZpZXcgbmFtZWQgPHN0cnVjdG5hbWU+cGdfc3RhdF9s b2dtc2c8L3N0cnVjdG5hbWU+LiAgVGhpcyB2aWV3CisgICAgY29udGFpbnMgb25lIHJvdyBm b3IgZWFjaCBkaXN0aW5jdCBjb21iaW5hdGlvbiBvZiBzb3VyY2UgY29kZQorICAgIGZpbGVu YW1lLCBzb3VyY2UgY29kZSBsaW5lIG51bWJlciwgYW5kIGxvZyBzZXZlcml0eSBsZXZlbAor ICAgICh1cCB0byB0aGUgbWF4aW11bSBudW1iZXIgb2YgZGlzdGluY3QgbWVzc2FnZXMgdGhh dCB0aGUgbW9kdWxlCisgICAgY2FuIHRyYWNrKS4gVGhlIGNvbHVtbnMgb2YgdGhlIHZpZXcg YXJlIHNob3duIGluCisgICAgPHhyZWYgbGlua2VuZD0icGdzdGF0bG9nbXNnLWNvbHVtbnMi Lz4uCisgICA8L3BhcmE+CisgCisgICA8dGFibGUgaWQ9InBnc3RhdGxvZ21zZy1jb2x1bW5z Ij4KKyAgICA8dGl0bGU+PHN0cnVjdG5hbWU+cGdfc3RhdF9sb2dtc2c8L3N0cnVjdG5hbWU+ IENvbHVtbnM8L3RpdGxlPgorICAgIDx0Z3JvdXAgY29scz0iMSI+CisgICAgIDx0aGVhZD4K KyAgICAgIDxyb3c+CisgICAgICAgPGVudHJ5IHJvbGU9ImNhdGFsb2dfdGFibGVfZW50cnki PjxwYXJhIHJvbGU9ImNvbHVtbl9kZWZpbml0aW9uIj4KKyAgICAgICAgQ29sdW1uIFR5cGUK KyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAgIERlc2NyaXB0aW9uCisg ICAgICAgPC9wYXJhPjwvZW50cnk+CisgICAgICA8L3Jvdz4KKyAgICAgPC90aGVhZD4KKyAK KyAgICAgPHRib2R5PgorIAorICAgICAgPHJvdz4KKyAgICAgICA8ZW50cnkgcm9sZT0iY2F0 YWxvZ190YWJsZV9lbnRyeSI+PHBhcmEgcm9sZT0iY29sdW1uX2RlZmluaXRpb24iPgorICAg ICAgICA8c3RydWN0ZmllbGQ+cGd2ZXJzaW9uPC9zdHJ1Y3RmaWVsZD4gPHR5cGU+dGV4dDwv dHlwZT4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAgIDxwcm9kdWN0 bmFtZT5Qb3N0Z3JlU1FMPC9wcm9kdWN0bmFtZT4gdmVyc2lvbiBudW1iZXIuIFVzZWZ1bCBm b3IKKyAgICAgICAgY29ycmVsYXRpbmcgc291cmNlIGNvZGUgZmlsZW5hbWUgYW5kIGxpbmUg bnVtYmVyIHdpdGggdGhlIGFjdHVhbAorICAgICAgICBlbnRyeSBzb3VyY2UgY29kZS4KKyAg ICAgICA8L3BhcmE+PC9lbnRyeT4KKyAgICAgIDwvcm93PgorIAorICAgICAgPHJvdz4KKyAg ICAgICA8ZW50cnkgcm9sZT0iY2F0YWxvZ190YWJsZV9lbnRyeSI+PHBhcmEgcm9sZT0iY29s dW1uX2RlZmluaXRpb24iPgorICAgICAgICA8c3RydWN0ZmllbGQ+ZmlsZW5hbWU8L3N0cnVj dGZpZWxkPiA8dHlwZT50ZXh0PC90eXBlPgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8cGFy YT4KKyAgICAgICAgU291cmNlIGNvZGUgZmlsZW5hbWUgd2hlcmUgdGhlIGxvZyBtZXNzYWdl IG9yaWdpbmF0ZXMuCisgICAgICAgPC9wYXJhPjwvZW50cnk+CisgICAgICA8L3Jvdz4KKyAK KyAgICAgIDxyb3c+CisgICAgICAgPGVudHJ5IHJvbGU9ImNhdGFsb2dfdGFibGVfZW50cnki PjxwYXJhIHJvbGU9ImNvbHVtbl9kZWZpbml0aW9uIj4KKyAgICAgICAgPHN0cnVjdGZpZWxk PmxpbmVubzwvc3RydWN0ZmllbGQ+IDx0eXBlPmludDwvdHlwZT4KKyAgICAgICA8L3BhcmE+ CisgICAgICAgPHBhcmE+CisgICAgICAgIFNvdXJjZSBjb2RlIGxpbmUgbnVtYmVyIHdoZXJl IHRoZSBsb2cgbWVzc2FnZSBvcmlnaW5hdGVzLgorICAgICAgIDwvcGFyYT48L2VudHJ5Pgor ICAgICAgPC9yb3c+CisgCisgICAgICA8cm93PgorICAgICAgIDxlbnRyeSByb2xlPSJjYXRh bG9nX3RhYmxlX2VudHJ5Ij48cGFyYSByb2xlPSJjb2x1bW5fZGVmaW5pdGlvbiI+CisgICAg ICAgIDxzdHJ1Y3RmaWVsZD5lbGV2ZWw8L3N0cnVjdGZpZWxkPiA8dHlwZT50ZXh0PC90eXBl PgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgTG9nIG1lc3NhZ2Ug c2V2ZXJpdHkgbGV2ZWwgYXMgY2FsbGVkIGF0IHJ1bnRpbWUuCisgICAgICAgPC9wYXJhPjwv ZW50cnk+CisgICAgICA8L3Jvdz4KKyAKKyAgICAgIDxyb3c+CisgICAgICAgPGVudHJ5IHJv bGU9ImNhdGFsb2dfdGFibGVfZW50cnkiPjxwYXJhIHJvbGU9ImNvbHVtbl9kZWZpbml0aW9u Ij4KKyAgICAgICAgPHN0cnVjdGZpZWxkPmZ1bmNuYW1lPC9zdHJ1Y3RmaWVsZD4gPHR5cGU+ dGV4dDwvdHlwZT4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAgIFNv dXJjZSBjb2RlIGZ1bmN0aW9uIG5hbWUgd2hlcmUgdGhlIGxvZyBtZXNzYWdlIG9yaWdpbmF0 ZXMuCisgICAgICAgPC9wYXJhPjwvZW50cnk+CisgICAgICA8L3Jvdz4KKyAKKyAgICAgIDxy b3c+CisgICAgICAgPGVudHJ5IHJvbGU9ImNhdGFsb2dfdGFibGVfZW50cnkiPjxwYXJhIHJv bGU9ImNvbHVtbl9kZWZpbml0aW9uIj4KKyAgICAgICAgPHN0cnVjdGZpZWxkPnNxbGVycmNv ZGU8L3N0cnVjdGZpZWxkPiA8dHlwZT50ZXh0PC90eXBlPgorICAgICAgIDwvcGFyYT4KKyAg ICAgICA8cGFyYT4KKyAgICAgICAgU1FMIGVycm9yIGNvZGUgb2YgdGhlIGxvZyBtZXNzYWdl LiBTZWUgPHhyZWYgbGlua2VuZD0iZXJyY29kZXMtYXBwZW5kaXgiLz4uCisgICAgICAgPC9w YXJhPjwvZW50cnk+CisgICAgICA8L3Jvdz4KKyAKKyAgICAgIDxyb3c+CisgICAgICAgPGVu dHJ5IHJvbGU9ImNhdGFsb2dfdGFibGVfZW50cnkiPjxwYXJhIHJvbGU9ImNvbHVtbl9kZWZp bml0aW9uIj4KKyAgICAgICAgPHN0cnVjdGZpZWxkPm1lc3NhZ2U8L3N0cnVjdGZpZWxkPiA8 dHlwZT50ZXh0PC90eXBlPgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8cGFyYT4KKyAgICAg ICAgTm9ybWFsaXplZCBsb2cgbWVzc2FnZS4gQmFzaWNhbGx5IHRoZSBsb2cgbWVzc2FnZSB0 ZXh0IHdpdGggdGhlCisgICAgICAgIHJlcGxhY2VhYmxlIGZvcm1hdCBwYXJhbWV0ZXJzIHJh dGhlciB0aGFuIHRoZSBhY3R1YWwgcnVudGltZQorICAgICAgICBkYXRhLgorICAgICAgIDwv cGFyYT48L2VudHJ5PgorICAgICAgPC9yb3c+CisgCisgICAgICA8cm93PgorICAgICAgIDxl bnRyeSByb2xlPSJjYXRhbG9nX3RhYmxlX2VudHJ5Ij48cGFyYSByb2xlPSJjb2x1bW5fZGVm aW5pdGlvbiI+CisgICAgICAgIDxzdHJ1Y3RmaWVsZD50cmFuc2xhdGVkX21lc3NhZ2U8L3N0 cnVjdGZpZWxkPiA8dHlwZT50ZXh0PC90eXBlPgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8 cGFyYT4KKyAgICAgICAgU2FtZSBhcyA8c3RydWN0ZmllbGQ+bWVzc2FnZTwvc3RydWN0Zmll bGQ+LCBleGNlcHQgbG9jYWxpemVkLgorICAgICAgIDwvcGFyYT48L2VudHJ5PgorICAgICAg PC9yb3c+CisgCisgICAgICA8cm93PgorICAgICAgIDxlbnRyeSByb2xlPSJjYXRhbG9nX3Rh YmxlX2VudHJ5Ij48cGFyYSByb2xlPSJjb2x1bW5fZGVmaW5pdGlvbiI+CisgICAgICAgIDxz dHJ1Y3RmaWVsZD5jb3VudDwvc3RydWN0ZmllbGQ+IDx0eXBlPmJpZ2ludDwvdHlwZT4KKyAg ICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAgIE51bWJlciBvZiB0aW1lcyB0 aGlzIGxvZyBtZXNzYWdlIGhhcyBvY2N1cnJlZC4KKyAgICAgICA8L3BhcmE+PC9lbnRyeT4K KyAgICAgIDwvcm93PgorICAgICA8L3Rib2R5PgorICAgIDwvdGdyb3VwPgorICAgPC90YWJs ZT4KKyAKKyAgIDxwYXJhPgorICAgIEZvciBzZWN1cml0eSByZWFzb25zLCBvbmx5IHN1cGVy dXNlcnMgYW5kIHJvbGVzIHdpdGggcHJpdmlsZWdlcyBvZiB0aGUKKyAgICA8bGl0ZXJhbD5w Z19yZWFkX2FsbF9zdGF0czwvbGl0ZXJhbD4gcm9sZSBhcmUgYWxsb3dlZCB0byB2aWV3IHRo aXMgZGF0YS4KKyAgIDwvcGFyYT4KKyAKKyAgIDxwYXJhPgorICAgIExvZyBtZXNzYWdlcyBh cmUgY29tYmluZWQgaW50byBhIHNpbmdsZQorICAgIDxzdHJ1Y3RuYW1lPnBnX3N0YXRfbG9n bXNnPC9zdHJ1Y3RuYW1lPiBlbnRyeSB3aGVuZXZlciB0aGV5CisgICAgb3JpZ2luYXRlIGZy b20gaWRlbnRpY2FsIHNvdXJjZSBjb2RlIDxzdHJ1Y3RmaWVsZD5maWxlbmFtZTwvc3RydWN0 ZmllbGQ+CisgICAgYW5kIGxpbmUgbnVtYmVyICg8c3RydWN0ZmllbGQ+bGluZW5vPC9zdHJ1 Y3RmaWVsZD4pLAorICAgIGFuZCB0aGV5IGhhdmUgdGhlIHNhbWUgcnVudGltZSBlcnJvciBz ZXZlcml0eSBsZXZlbAorICAgICg8c3RydWN0ZmllbGQ+ZWxldmVsPC9zdHJ1Y3RmaWVsZD4p LgorICAgPC9wYXJhPgorIAorICAgPHBhcmE+CisgICAgQXMgYSBydWxlIG9mIHRodW1iLCA8 c3RydWN0ZmllbGQ+ZmlsZW5hbWU8L3N0cnVjdGZpZWxkPiwKKyAgICA8c3RydWN0ZmllbGQ+ bGluZW5vPC9zdHJ1Y3RmaWVsZD4sIGFuZCA8c3RydWN0ZmllbGQ+ZWxldmVsPC9zdHJ1Y3Rm aWVsZD4KKyAgICB2YWx1ZXMgY2FuIGJlIGFzc3VtZWQgdG8gYmUgc3RhYmxlIGFuZCBjb21w YXJhYmxlIG9ubHkgc28gbG9uZyBhcworICAgIHRoZSB1bmRlcmx5aW5nIHNlcnZlciB2ZXJz aW9uIHN0YXlzIGV4YWN0bHkgdGhlIHNhbWUuCisgICA8L3BhcmE+CisgCisgICA8cGFyYT4K KyAgICBUaGUgcmVwcmVzZW50YXRpdmUgbG9nIG1lc3NhZ2VzIGFyZSBrZXB0IGluIGFuIGV4 dGVybmFsIGRpc2sgZmlsZSwgYW5kIGRvCisgICAgbm90IGNvbnN1bWUgc2hhcmVkIG1lbW9y eS4gVGhlcmVmb3JlLCBldmVuIHZlcnkgbGVuZ3RoeSBsb2cgbWVzc2FnZXMgY2FuCisgICAg YmUgc3RvcmVkIHN1Y2Nlc3NmdWxseS4gIEhvd2V2ZXIsIGlmIG1hbnkgbG9uZyBsb2cgbWVz c2FnZXMgYXJlCisgICAgYWNjdW11bGF0ZWQsIHRoZSBleHRlcm5hbCBmaWxlIG1pZ2h0IGdy b3cgdW5tYW5hZ2VhYmx5IGxhcmdlLiAgQXMgYQorICAgIHJlY292ZXJ5IG1ldGhvZCBpZiB0 aGF0IGhhcHBlbnMsIDxmaWxlbmFtZT5wZ19zdGF0X2xvZ21zZzwvZmlsZW5hbWU+IG1heQor ICAgIGNob29zZSB0byBkaXNjYXJkIHRoZSBsb2cgbWVzc2FnZXMsIHdoZXJldXBvbiBhbGwg ZXhpc3RpbmcgZW50cmllcyBpbgorICAgIHRoZSA8c3RydWN0bmFtZT5wZ19zdGF0X2xvZ21z Zzwvc3RydWN0bmFtZT4gdmlldyB3aWxsIHNob3cKKyAgICBudWxsIDxzdHJ1Y3RmaWVsZD5t ZXNzYWdlPC9zdHJ1Y3RmaWVsZD4gZmllbGRzLCB0aG91Z2ggdGhlIGNvdW50cworICAgIGFz c29jaWF0ZWQgd2l0aCBlYWNoIHJvdyBhcmUgcHJlc2VydmVkLiBJZiB0aGlzIGhhcHBlbnMs IGNvbnNpZGVyCisgICAgcmVkdWNpbmcgPHZhcm5hbWU+cGdfc3RhdF9sb2dtc2cubWF4PC92 YXJuYW1lPiB0byBwcmV2ZW50CisgICAgcmVjdXJyZW5jZXMuCisgICA8L3BhcmE+CisgIDwv c2VjdDI+CisgCisgIDxzZWN0MiBpZD0icGdzdGF0bG9nbXNnLXBnLXN0YXQtbG9nbXNnLWlu Zm8iPgorICAgPHRpdGxlPlRoZSA8c3RydWN0bmFtZT5wZ19zdGF0X2xvZ21zZ19pbmZvPC9z dHJ1Y3RuYW1lPiBWaWV3PC90aXRsZT4KKyAKKyAgIDxpbmRleHRlcm0+CisgICAgPHByaW1h cnk+cGdfc3RhdF9sb2dtc2dfaW5mbzwvcHJpbWFyeT4KKyAgIDwvaW5kZXh0ZXJtPgorIAor ICAgPHBhcmE+CisgICAgVGhlIHN0YXRpc3RpY3Mgb2YgdGhlIDxmaWxlbmFtZT5wZ19zdGF0 X2xvZ21zZzwvZmlsZW5hbWU+IG1vZHVsZQorICAgIGl0c2VsZiBhcmUgdHJhY2tlZCBhbmQg bWFkZSBhdmFpbGFibGUgdmlhIGEgdmlldyBuYW1lZAorICAgIDxzdHJ1Y3RuYW1lPnBnX3N0 YXRfbG9nbXNnX2luZm88L3N0cnVjdG5hbWU+LiAgVGhpcyB2aWV3IGNvbnRhaW5zCisgICAg b25seSBhIHNpbmdsZSByb3cuICBUaGUgY29sdW1ucyBvZiB0aGUgdmlldyBhcmUgc2hvd24g aW4KKyAgICA8eHJlZiBsaW5rZW5kPSJwZ3N0YXRsb2dtc2dpbmZvLWNvbHVtbnMiLz4uCisg ICA8L3BhcmE+CisgCisgICA8dGFibGUgaWQ9InBnc3RhdGxvZ21zZ2luZm8tY29sdW1ucyI+ CisgICAgPHRpdGxlPjxzdHJ1Y3RuYW1lPnBnX3N0YXRfbG9nbXNnX2luZm88L3N0cnVjdG5h bWU+IENvbHVtbnM8L3RpdGxlPgorICAgIDx0Z3JvdXAgY29scz0iMSI+CisgICAgIDx0aGVh ZD4KKyAgICAgIDxyb3c+CisgICAgICAgPGVudHJ5IHJvbGU9ImNhdGFsb2dfdGFibGVfZW50 cnkiPjxwYXJhIHJvbGU9ImNvbHVtbl9kZWZpbml0aW9uIj4KKyAgICAgICAgQ29sdW1uIFR5 cGUKKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAgIERlc2NyaXB0aW9u CisgICAgICAgPC9wYXJhPjwvZW50cnk+CisgICAgICA8L3Jvdz4KKyAgICAgPC90aGVhZD4K KyAKKyAgICAgPHRib2R5PgorICAgICAgPHJvdz4KKyAgICAgICA8ZW50cnkgcm9sZT0iY2F0 YWxvZ190YWJsZV9lbnRyeSI+PHBhcmEgcm9sZT0iY29sdW1uX2RlZmluaXRpb24iPgorICAg ICAgICA8c3RydWN0ZmllbGQ+ZGVhbGxvYzwvc3RydWN0ZmllbGQ+IDx0eXBlPmJpZ2ludDwv dHlwZT4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAgIFRvdGFsIG51 bWJlciBvZiB0aW1lcyA8c3RydWN0bmFtZT5wZ19zdGF0X2xvZ21zZzwvc3RydWN0bmFtZT4K KyAgICAgICAgZW50cmllcyBhYm91dCB0aGUgbGVhc3QtZXhlY3V0ZWQgc3RhdGVtZW50cyB3 ZXJlIGRlYWxsb2NhdGVkCisgICAgICAgIGJlY2F1c2UgbW9yZSBkaXN0aW5jdCBzdGF0ZW1l bnRzIHRoYW4KKyAgICAgICAgPHZhcm5hbWU+cGdfc3RhdF9sb2dtc2cubWF4PC92YXJuYW1l PiB3ZXJlIG9ic2VydmVkCisgICAgICAgPC9wYXJhPjwvZW50cnk+CisgICAgICA8L3Jvdz4K KyAgICAgIDxyb3c+CisgICAgICAgPGVudHJ5IHJvbGU9ImNhdGFsb2dfdGFibGVfZW50cnki PjxwYXJhIHJvbGU9ImNvbHVtbl9kZWZpbml0aW9uIj4KKyAgICAgICAgPHN0cnVjdGZpZWxk PnN0YXRzX3Jlc2V0PC9zdHJ1Y3RmaWVsZD4gPHR5cGU+dGltZXN0YW1wIHdpdGggdGltZSB6 b25lPC90eXBlPgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgVGlt ZSBhdCB3aGljaCBhbGwgc3RhdGlzdGljcyBpbiB0aGUKKyAgICAgICAgPHN0cnVjdG5hbWU+ cGdfc3RhdF9sb2dtc2c8L3N0cnVjdG5hbWU+IHZpZXcgd2VyZSBsYXN0IHJlc2V0LgorICAg ICAgIDwvcGFyYT48L2VudHJ5PgorICAgICAgPC9yb3c+CisgCisgICAgIDwvdGJvZHk+Cisg ICAgPC90Z3JvdXA+CisgICA8L3RhYmxlPgorICA8L3NlY3QyPgorIAorICA8c2VjdDIgaWQ9 InBnc3RhdGxvZ21zZy1mdW5jcyI+CisgICA8dGl0bGU+RnVuY3Rpb25zPC90aXRsZT4KKyAK KyAgIDx2YXJpYWJsZWxpc3Q+CisgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgPHRlcm0+Cisg ICAgICA8ZnVuY3Rpb24+cGdfc3RhdF9sb2dtc2dfcmVzZXQoKSByZXR1cm5zIHZvaWQ8L2Z1 bmN0aW9uPgorICAgICAgPGluZGV4dGVybT4KKyAgICAgICA8cHJpbWFyeT5wZ19zdGF0X2xv Z21zZ19yZXNldDwvcHJpbWFyeT4KKyAgICAgIDwvaW5kZXh0ZXJtPgorICAgICA8L3Rlcm0+ CisgCisgICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPgorICAgICAgIDxmdW5jdGlvbj5w Z19zdGF0X2xvZ21zZ19yZXNldDwvZnVuY3Rpb24+IGRpc2NhcmRzIGFsbCBzdGF0aXN0aWNz CisgICAgICAgZ2F0aGVyZWQgc28gZmFyIGJ5IDxmaWxlbmFtZT5wZ19zdGF0X2xvZ21zZzwv ZmlsZW5hbWU+LiBJdCB3aWxsCisgICAgICAgYWxzbyByZXNldCB0aGUgc3RhdGlzdGljcyBp biB0aGUKKyAgICAgICA8c3RydWN0bmFtZT5wZ19zdGF0X2xvZ21zZ19pbmZvPC9zdHJ1Y3Ru YW1lPiB2aWV3LgorICAgICAgIEJ5IGRlZmF1bHQsIHRoaXMgZnVuY3Rpb24gY2FuIG9ubHkg YmUgZXhlY3V0ZWQgYnkgc3VwZXJ1c2Vycy4KKyAgICAgICBBY2Nlc3MgbWF5IGJlIGdyYW50 ZWQgdG8gb3RoZXJzIHVzaW5nIDxjb21tYW5kPkdSQU5UPC9jb21tYW5kPi4KKyAgICAgIDwv cGFyYT4KKyAgICAgPC9saXN0aXRlbT4KKyAgICA8L3Zhcmxpc3RlbnRyeT4KKyAKKyAgICA8 dmFybGlzdGVudHJ5PgorICAgICA8dGVybT4KKyAgICAgIDxmdW5jdGlvbj5wZ19zdGF0X2xv Z21zZygpIHJldHVybnMgc2V0b2YgcmVjb3JkPC9mdW5jdGlvbj4KKyAgICAgIDxpbmRleHRl cm0+CisgICAgICAgPHByaW1hcnk+cGdfc3RhdF9sb2dtc2c8L3ByaW1hcnk+CisgICAgICAg PHNlY29uZGFyeT5mdW5jdGlvbjwvc2Vjb25kYXJ5PgorICAgICAgPC9pbmRleHRlcm0+Cisg ICAgIDwvdGVybT4KKyAKKyAgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+CisgICAgICAg VGhlIDxzdHJ1Y3RuYW1lPnBnX3N0YXRfbG9nbXNnPC9zdHJ1Y3RuYW1lPiB2aWV3IGlzIGRl ZmluZWQgaW4KKyAgICAgICB0ZXJtcyBvZiBhIGZ1bmN0aW9uIGFsc28gbmFtZWQgPGZ1bmN0 aW9uPnBnX3N0YXRfbG9nbXNnPC9mdW5jdGlvbj4uCisgICAgICAgSXQgaXMgcG9zc2libGUg Zm9yIGNsaWVudHMgdG8gY2FsbAorICAgICAgIHRoZSA8ZnVuY3Rpb24+cGdfc3RhdF9sb2dt c2c8L2Z1bmN0aW9uPiBmdW5jdGlvbiBkaXJlY3RseS4KKyAgICAgIDwvcGFyYT4KKyAgICAg PC9saXN0aXRlbT4KKyAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgIDwvdmFyaWFibGVsaXN0Pgor ICA8L3NlY3QyPgorIAorICA8c2VjdDIgaWQ9InBnc3RhdGxvZ21zZy1jb25maWctcGFyYW1z Ij4KKyAgIDx0aXRsZT5Db25maWd1cmF0aW9uIFBhcmFtZXRlcnM8L3RpdGxlPgorIAorICAg PHZhcmlhYmxlbGlzdD4KKyAgICA8dmFybGlzdGVudHJ5PgorICAgICA8dGVybT4KKyAgICAg IDx2YXJuYW1lPnBnX3N0YXRfbG9nbXNnLm1heDwvdmFybmFtZT4gKDx0eXBlPmludGVnZXI8 L3R5cGU+KQorICAgICAgPGluZGV4dGVybT4KKyAgICAgICA8cHJpbWFyeT48dmFybmFtZT5w Z19zdGF0X2xvZ21zZy5tYXg8L3Zhcm5hbWU+IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyPC9w cmltYXJ5PgorICAgICAgPC9pbmRleHRlcm0+CisgICAgIDwvdGVybT4KKyAKKyAgICAgPGxp c3RpdGVtPgorICAgICAgPHBhcmE+CisgICAgICAgPHZhcm5hbWU+cGdfc3RhdF9sb2dtc2cu bWF4PC92YXJuYW1lPiBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKKyAgICAgICBsb2cgbWVz c2FnZXMgdHJhY2tlZCBieSB0aGUgbW9kdWxlIChpLmUuLCB0aGUgbWF4aW11bSBudW1iZXIg b2Ygcm93cworICAgICAgIGluIHRoZSA8c3RydWN0bmFtZT5wZ19zdGF0X2xvZ21zZzwvc3Ry dWN0bmFtZT4gdmlldykuIElmIG1vcmUgZGlzdGluY3QKKyAgICAgICBsb2cgbWVzc2FnZXMg dGhhbiB0aGF0IGFyZSBvYnNlcnZlZCwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxlYXN0LXJl Y29yZGVkCisgICAgICAgbG9nIG1lc3NhZ2UgaXMgZGlzY2FyZGVkLiAgVGhlIG51bWJlciBv ZiB0aW1lcyBzdWNoIGluZm9ybWF0aW9uIHdhcworICAgICAgIGRpc2NhcmRlZCBjYW4gYmUg c2VlbiBpbiB0aGUKKyAgICAgICA8c3RydWN0bmFtZT5wZ19zdGF0X2xvZ21zZ19pbmZvPC9z dHJ1Y3RuYW1lPiB2aWV3LgorICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDUwMDAuCisg ICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIG9ubHkgYmUgc2V0IGF0IHNlcnZlciBzdGFydC4K KyAgICAgIDwvcGFyYT4KKyAgICAgPC9saXN0aXRlbT4KKyAgICA8L3Zhcmxpc3RlbnRyeT4K KyAgIDwvdmFyaWFibGVsaXN0PgorIAorICAgPHBhcmE+CisgICAgVGhlIG1vZHVsZSByZXF1 aXJlcyBhZGRpdGlvbmFsIHNoYXJlZCBtZW1vcnkgcHJvcG9ydGlvbmFsIHRvCisgICAgPHZh cm5hbWU+cGdfc3RhdF9sb2dtc2cubWF4PC92YXJuYW1lPi4gIE5vdGUgdGhhdCB0aGlzCisg ICAgbWVtb3J5IGlzIGNvbnN1bWVkIHdoZW5ldmVyIHRoZSBtb2R1bGUgaXMgbG9hZGVkLgor ICAgPC9wYXJhPgorIAorICAgPHBhcmE+CisgICAgVGhlc2UgcGFyYW1ldGVycyBtdXN0IGJl IHNldCBpbiA8ZmlsZW5hbWU+cG9zdGdyZXNxbC5jb25mPC9maWxlbmFtZT4uCisgICAgVHlw aWNhbCB1c2FnZSBtaWdodCBiZToKKyAKKyA8cHJvZ3JhbWxpc3Rpbmc+CisgIyBwb3N0Z3Jl c3FsLmNvbmYKKyBzaGFyZWRfcHJlbG9hZF9saWJyYXJpZXMgPSAncGdfc3RhdF9sb2dtc2cn CisgCisgcGdfc3RhdF9sb2dtc2cubWF4ID0gMTAwMDAKKyA8L3Byb2dyYW1saXN0aW5nPgor ICAgPC9wYXJhPgorICA8L3NlY3QyPgorIAorICA8c2VjdDIgaWQ9InBnc3RhdGxvZ21zZy1z YW1wbGUtb3V0cHV0Ij4KKyAgIDx0aXRsZT5TYW1wbGUgT3V0cHV0PC90aXRsZT4KKyAKKyA8 c2NyZWVuPgorICQgbWFrZSBpbnN0YWxsY2hlY2sKKyAkIHBzcWwgbG9nbXNnCisgbG9nbXNn PSMgXHgKKyBsb2dtc2c9IyAtLSBtb3N0IGNvbW1vbiBtZXNzYWdlcworIGxvZ21zZz0jIFNF TEVDVCAqIEZST00gcGdfc3RhdF9sb2dtc2cKKyAgICAgICAgICBPUkRFUiBCWSBjb3VudCBE RVNDIExJTUlUIDU7CisgLVsgUkVDT1JEIDEgXS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgcGd2ZXJzaW9uICAgICAgICAgIHwgMTdkZXZlbAor IGZpbGVuYW1lICAgICAgICAgICB8IGFjbGNoay5jCisgbGluZW5vICAgICAgICAgICAgIHwg MjgwNworIGVsZXZlbCAgICAgICAgICAgICB8IEVSUk9SCisgZnVuY25hbWUgICAgICAgICAg IHwgYWNsY2hlY2tfZXJyb3IKKyBzcWxlcnJjb2RlICAgICAgICAgfCA0MjUwMQorIG1lc3Nh Z2UgICAgICAgICAgICB8IHBlcm1pc3Npb24gZGVuaWVkIGZvciBzY2hlbWEgJXMKKyB0cmFu c2xhdGVkX21lc3NhZ2UgfCBwZXJtaXNzaW9uIGRlbmllZCBmb3Igc2NoZW1hICVzCisgY291 bnQgICAgICAgICAgICAgIHwgMjgyCisgLVsgUkVDT1JEIDIgXS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgcGd2ZXJzaW9uICAgICAgICAgIHwg MTdkZXZlbAorIGZpbGVuYW1lICAgICAgICAgICB8IG1jeHQuYworIGxpbmVubyAgICAgICAg ICAgICB8IDkxMworIGVsZXZlbCAgICAgICAgICAgICB8IExPRworIGZ1bmNuYW1lICAgICAg ICAgICB8IE1lbW9yeUNvbnRleHRTdGF0c1ByaW50Cisgc3FsZXJyY29kZSAgICAgICAgIHwg MDAwMDAKKyBtZXNzYWdlICAgICAgICAgICAgfCBsZXZlbDogJWQ7ICVzOiAlcyVzCisgdHJh bnNsYXRlZF9tZXNzYWdlIHwgbGV2ZWw6ICVkOyAlczogJXMlcworIGNvdW50ICAgICAgICAg ICAgICB8IDI1NQorIC1bIFJFQ09SRCAzIF0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorIHBndmVyc2lvbiAgICAgICAgICB8IDE3ZGV2ZWwKKyBm aWxlbmFtZSAgICAgICAgICAgfCBwbF9leGVjLmMKKyBsaW5lbm8gICAgICAgICAgICAgfCAz OTA5CisgZWxldmVsICAgICAgICAgICAgIHwgV0FSTklORworIGZ1bmNuYW1lICAgICAgICAg ICB8IGV4ZWNfc3RtdF9yYWlzZQorIHNxbGVycmNvZGUgICAgICAgICB8IDAxMDAwCisgbWVz c2FnZSAgICAgICAgICAgIHwgJXMKKyB0cmFuc2xhdGVkX21lc3NhZ2UgfCAlcworIGNvdW50 ICAgICAgICAgICAgICB8IDI0MQorIC1bIFJFQ09SRCA0IF0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHBndmVyc2lvbiAgICAgICAgICB8IDE3 ZGV2ZWwKKyBmaWxlbmFtZSAgICAgICAgICAgfCBzY2FuLmwKKyBsaW5lbm8gICAgICAgICAg ICAgfCAxMjQxCisgZWxldmVsICAgICAgICAgICAgIHwgRVJST1IKKyBmdW5jbmFtZSAgICAg ICAgICAgfCBzY2FubmVyX3l5ZXJyb3IKKyBzcWxlcnJjb2RlICAgICAgICAgfCA0MjYwMQor IG1lc3NhZ2UgICAgICAgICAgICB8ICVzIGF0IG9yIG5lYXIgIiVzIgorIHRyYW5zbGF0ZWRf bWVzc2FnZSB8ICVzIGF0IG9yIG5lYXIgIiVzIgorIGNvdW50ICAgICAgICAgICAgICB8IDEz MworIC1bIFJFQ09SRCA1IF0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorIHBndmVyc2lvbiAgICAgICAgICB8IDE3ZGV2ZWwKKyBmaWxlbmFtZSAg ICAgICAgICAgfCBkYXRldGltZS5jCisgbGluZW5vICAgICAgICAgICAgIHwgNDAwMgorIGVs ZXZlbCAgICAgICAgICAgICB8IEVSUk9SCisgZnVuY25hbWUgICAgICAgICAgIHwgRGF0ZVRp bWVQYXJzZUVycm9yCisgc3FsZXJyY29kZSAgICAgICAgIHwgMjIwMTUKKyBtZXNzYWdlICAg ICAgICAgICAgfCBpbnRlcnZhbCBmaWVsZCB2YWx1ZSBvdXQgb2YgcmFuZ2U6ICIlcyIKKyB0 cmFuc2xhdGVkX21lc3NhZ2UgfCBpbnRlcnZhbCBmaWVsZCB2YWx1ZSBvdXQgb2YgcmFuZ2U6 ICIlcyIKKyBjb3VudCAgICAgICAgICAgICAgfCAxMjAKKyAKKyBsb2dtc2c9IyAtLSBpbnRl cm5hbCBlcnJvcnMKKyBsb2dtc2c9IyBTRUxFQ1QgKiBGUk9NIHBnX3N0YXRfbG9nbXNnCisg ICAgICAgICAgV0hFUkUgc3FsZXJyY29kZSA9ICdYWDAwMCcKKyAgICAgICAgICBPUkRFUiBC WSBjb3VudCBERVNDIExJTUlUIDU7CisgLVsgUkVDT1JEIDEgXS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgcGd2ZXJz aW9uICAgICAgICAgIHwgMTdkZXZlbAorIGZpbGVuYW1lICAgICAgICAgICB8IHVzZXIuYwor IGxpbmVubyAgICAgICAgICAgICB8IDIxMzAKKyBlbGV2ZWwgICAgICAgICAgICAgfCBFUlJP UgorIGZ1bmNuYW1lICAgICAgICAgICB8IGNoZWNrX3JvbGVfbWVtYmVyc2hpcF9hdXRob3Jp emF0aW9uCisgc3FsZXJyY29kZSAgICAgICAgIHwgWFgwMDAKKyBtZXNzYWdlICAgICAgICAg ICAgfCByb2xlICIlcyIgY2Fubm90IGhhdmUgZXhwbGljaXQgbWVtYmVycworIHRyYW5zbGF0 ZWRfbWVzc2FnZSB8IHJvbGUgIiVzIiBjYW5ub3QgaGF2ZSBleHBsaWNpdCBtZW1iZXJzCisg Y291bnQgICAgICAgICAgICAgIHwgMgorIC1bIFJFQ09SRCAyIF0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHBndmVy c2lvbiAgICAgICAgICB8IDE3ZGV2ZWwKKyBmaWxlbmFtZSAgICAgICAgICAgfCB0YWJsZWNt ZHMuYworIGxpbmVubyAgICAgICAgICAgICB8IDExMjE2CisgZWxldmVsICAgICAgICAgICAg IHwgRVJST1IKKyBmdW5jbmFtZSAgICAgICAgICAgfCBBVEV4ZWNBbHRlckNvbnN0cmFpbnQK KyBzcWxlcnJjb2RlICAgICAgICAgfCBYWDAwMAorIG1lc3NhZ2UgICAgICAgICAgICB8IGNh bm5vdCBhbHRlciBjb25zdHJhaW50ICIlcyIgb24gcmVsYXRpb24gIiVzIgorIHRyYW5zbGF0 ZWRfbWVzc2FnZSB8IGNhbm5vdCBhbHRlciBjb25zdHJhaW50ICIlcyIgb24gcmVsYXRpb24g IiVzIgorIGNvdW50ICAgICAgICAgICAgICB8IDIKKyAtWyBSRUNPUkQgMyBdLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBwZ3ZlcnNpb24gICAgICAgICAgfCAxN2RldmVsCisgZmlsZW5hbWUgICAgICAgICAgIHwg dGlkLmMKKyBsaW5lbm8gICAgICAgICAgICAgfCAzNTgKKyBlbGV2ZWwgICAgICAgICAgICAg fCBFUlJPUgorIGZ1bmNuYW1lICAgICAgICAgICB8IGN1cnJ0aWRfZm9yX3ZpZXcKKyBzcWxl cnJjb2RlICAgICAgICAgfCBYWDAwMAorIG1lc3NhZ2UgICAgICAgICAgICB8IGN1cnJ0aWQg Y2Fubm90IGhhbmRsZSB2aWV3cyB3aXRoIG5vIENUSUQKKyB0cmFuc2xhdGVkX21lc3NhZ2Ug fCBjdXJydGlkIGNhbm5vdCBoYW5kbGUgdmlld3Mgd2l0aCBubyBDVElECisgY291bnQgICAg ICAgICAgICAgIHwgMQorIC1bIFJFQ09SRCA0IF0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHBndmVyc2lvbiAgICAg ICAgICB8IDE3ZGV2ZWwKKyBmaWxlbmFtZSAgICAgICAgICAgfCB0aWQuYworIGxpbmVubyAg ICAgICAgICAgICB8IDMxNQorIGVsZXZlbCAgICAgICAgICAgICB8IEVSUk9SCisgZnVuY25h bWUgICAgICAgICAgIHwgY3VycnRpZF9pbnRlcm5hbAorIHNxbGVycmNvZGUgICAgICAgICB8 IFhYMDAwCisgbWVzc2FnZSAgICAgICAgICAgIHwgY2Fubm90IGxvb2sgYXQgbGF0ZXN0IHZp c2libGUgdGlkIGZvciByZWxhdGlvbiAiJXMuJXMiCisgdHJhbnNsYXRlZF9tZXNzYWdlIHwg Y2Fubm90IGxvb2sgYXQgbGF0ZXN0IHZpc2libGUgdGlkIGZvciByZWxhdGlvbiAiJXMuJXMi CisgY291bnQgICAgICAgICAgICAgIHwgMQorIC1bIFJFQ09SRCA1IF0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHBn dmVyc2lvbiAgICAgICAgICB8IDE3ZGV2ZWwKKyBmaWxlbmFtZSAgICAgICAgICAgfCBwZ19s b2NhbGUuYworIGxpbmVubyAgICAgICAgICAgICB8IDI5MDQKKyBlbGV2ZWwgICAgICAgICAg ICAgfCBFUlJPUgorIGZ1bmNuYW1lICAgICAgICAgICB8IGljdV92YWxpZGF0ZV9sb2NhbGUK KyBzcWxlcnJjb2RlICAgICAgICAgfCBYWDAwMAorIG1lc3NhZ2UgICAgICAgICAgICB8IElD VSBsb2NhbGUgIiVzIiBoYXMgdW5rbm93biBsYW5ndWFnZSAiJXMiCisgdHJhbnNsYXRlZF9t ZXNzYWdlIHwgSUNVIGxvY2FsZSAiJXMiIGhhcyB1bmtub3duIGxhbmd1YWdlICIlcyIKKyBj b3VudCAgICAgICAgICAgICAgfCAxCisgCisgbG9nbXNnPSMgU0VMRUNUIHNxbGVycmNvZGUs IHN1bShjb3VudCkgQVMgdG90YWxfY291bnQKKyAgICAgICAgICBGUk9NIHBnX3N0YXRfbG9n bXNnCisgICAgICAgICAgR1JPVVAgQlkgc3FsZXJyY29kZSBPUkRFUiBCWSAxOworICBzcWxl cnJjb2RlIHwgdG90YWxfY291bnQgCisgLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0KKyAg MDAwMDAgICAgICB8ICAgICAgICAgMjk1CisgIDAxMDAwICAgICAgfCAgICAgICAgIDMxOAor ICAwMTAwNiAgICAgIHwgICAgICAgICAgIDEKKyAgMDEwMDcgICAgICB8ICAgICAgICAgICA1 CisgIDA4MDA2ICAgICAgfCAgICAgICAgICAgMgorICAwOFAwMSAgICAgIHwgICAgICAgICAg IDEKKyAgMDkwMDAgICAgICB8ICAgICAgICAgICA1CisgIDBBMDAwICAgICAgfCAgICAgICAg IDQwMAorICAwTFAwMSAgICAgIHwgICAgICAgICAgIDkKKyAgMFowMDIgICAgICB8ICAgICAg ICAgICAyCisgIDIxMDAwICAgICAgfCAgICAgICAgICAgOQorICAyMjAwMCAgICAgIHwgICAg ICAgICAgMTEKKyAgMjIwMDEgICAgICB8ICAgICAgICAgIDE3CisgIDIyMDAzICAgICAgfCAg ICAgICAgIDE4NAorICAyMjAwNCAgICAgIHwgICAgICAgICAgMjUKKyAgMjIwMDUgICAgICB8 ICAgICAgICAgICAxCisgIDIyMDA3ICAgICAgfCAgICAgICAgICA5MQorICAyMjAwOCAgICAg IHwgICAgICAgICAgOTUKKyAgMjIwMDkgICAgICB8ICAgICAgICAgICAyCisgIDIyMDBDICAg ICAgfCAgICAgICAgICAgMQorICAyMjAwRiAgICAgIHwgICAgICAgICAgIDEKKyAgMjIwMEgg ICAgICB8ICAgICAgICAgICAyCisgIDIyMDBMICAgICAgfCAgICAgICAgICAgNQorICAyMjAw TSAgICAgIHwgICAgICAgICAgIDIKKyAgMjIwME4gICAgICB8ICAgICAgICAgIDE2CisgIDIy MDBTICAgICAgfCAgICAgICAgICAgMgorICAyMjAwVCAgICAgIHwgICAgICAgICAgIDEKKyAg MjIwMTEgICAgICB8ICAgICAgICAgICA2CisgIDIyMDEyICAgICAgfCAgICAgICAgICA1NAor ICAyMjAxMyAgICAgIHwgICAgICAgICAgIDYKKyAgMjIwMTQgICAgICB8ICAgICAgICAgICAx CisgIDIyMDE1ICAgICAgfCAgICAgICAgIDEyMAorICAyMjAxNiAgICAgIHwgICAgICAgICAg IDEKKyAgMjIwMUIgICAgICB8ICAgICAgICAgICA3CisgIDIyMDFFICAgICAgfCAgICAgICAg ICAyMQorICAyMjAxRiAgICAgIHwgICAgICAgICAgMTEKKyAgMjIwMUcgICAgICB8ICAgICAg ICAgIDE0CisgIDIyMDFXICAgICAgfCAgICAgICAgICAgMQorICAyMjAyMSAgICAgIHwgICAg ICAgICAgIDEKKyAgMjIwMjMgICAgICB8ICAgICAgICAgMzMyCisgIDIyMDI1ICAgICAgfCAg ICAgICAgICAgMworICAyMjAyNiAgICAgIHwgICAgICAgICAgIDUKKyAgMjIwMkUgICAgICB8 ICAgICAgICAgIDMzCisgIDIyMDJHICAgICAgfCAgICAgICAgICAgMQorICAyMjAySCAgICAg IHwgICAgICAgICAgIDUKKyAgMjIwMzAgICAgICB8ICAgICAgICAgIDE0CisgIDIyMDMxICAg ICAgfCAgICAgICAgICAgOAorICAyMjAzMyAgICAgIHwgICAgICAgICAgIDcKKyAgMjIwMzYg ICAgICB8ICAgICAgICAgIDEzCisgIDIyMDM4ICAgICAgfCAgICAgICAgICAgOQorICAyMjAz OSAgICAgIHwgICAgICAgICAgIDMKKyAgMjIwM0EgICAgICB8ICAgICAgICAgICA4CisgIDIy MDNCICAgICAgfCAgICAgICAgICAgMgorICAyMjAzQyAgICAgIHwgICAgICAgICAgIDQKKyAg MjJQMDIgICAgICB8ICAgICAgICAgMzU3CisgIDIyUDA0ICAgICAgfCAgICAgICAgICAxMwor ICAyMlAwNSAgICAgIHwgICAgICAgICAgIDgKKyAgMjJQMDYgICAgICB8ICAgICAgICAgIDEw CisgIDIzNTAyICAgICAgfCAgICAgICAgICA2OQorICAyMzUwMyAgICAgIHwgICAgICAgICAx MzIKKyAgMjM1MDUgICAgICB8ICAgICAgICAgIDcwCisgIDIzNTE0ICAgICAgfCAgICAgICAg IDIyMAorICAyM1AwMSAgICAgIHwgICAgICAgICAgMTMKKyAgMjQwMDAgICAgICB8ICAgICAg ICAgICA5CisgIDI1MDAxICAgICAgfCAgICAgICAgICAyMQorICAyNTAwNiAgICAgIHwgICAg ICAgICAgMTYKKyAgMjVQMDEgICAgICB8ICAgICAgICAgIDMzCisgIDI1UDAyICAgICAgfCAg ICAgICAgICAxNAorICAyNzAwMCAgICAgIHwgICAgICAgICAgIDMKKyAgMkJQMDEgICAgICB8 ICAgICAgICAgIDg2CisgIDJGMDAzICAgICAgfCAgICAgICAgICAgMQorICAyRjAwNSAgICAg IHwgICAgICAgICAgIDEKKyAgMzQwMDAgICAgICB8ICAgICAgICAgICA1CisgIDM5UDAzICAg ICAgfCAgICAgICAgICAgMQorICAzQjAwMSAgICAgIHwgICAgICAgICAgIDEKKyAgM0QwMDAg ICAgICB8ICAgICAgICAgICA0CisgIDNGMDAwICAgICAgfCAgICAgICAgICAxNgorICA0MjUw MSAgICAgIHwgICAgICAgICA1MjUKKyAgNDI2MDEgICAgICB8ICAgICAgICAgMzg3CisgIDQy NjAyICAgICAgfCAgICAgICAgICAgOAorICA0MjYxMSAgICAgIHwgICAgICAgICAgIDcKKyAg NDI3MDEgICAgICB8ICAgICAgICAgIDE4CisgIDQyNzAyICAgICAgfCAgICAgICAgICAgNwor ICA0MjcwMyAgICAgIHwgICAgICAgICAxNDAKKyAgNDI3MDQgICAgICB8ICAgICAgICAgMTU0 CisgIDQyNzEwICAgICAgfCAgICAgICAgICA2NworICA0MjcxMiAgICAgIHwgICAgICAgICAg MTIKKyAgNDI3MjMgICAgICB8ICAgICAgICAgICA0CisgIDQyNzI1ICAgICAgfCAgICAgICAg ICAxNAorICA0MjgwMyAgICAgIHwgICAgICAgICAgMzgKKyAgNDI4MDQgICAgICB8ICAgICAg ICAgMTcxCisgIDQyODA5ICAgICAgfCAgICAgICAgIDEzNQorICA0MjgzMCAgICAgIHwgICAg ICAgICAgIDIKKyAgNDI4NDYgICAgICB8ICAgICAgICAgICA0CisgIDQyODgzICAgICAgfCAg ICAgICAgIDEzOAorICA0MjhDOSAgICAgIHwgICAgICAgICAgMjEKKyAgNDJQMDEgICAgICB8 ICAgICAgICAgMTI4CisgIDQyUDAyICAgICAgfCAgICAgICAgICAgMQorICA0MlAwNSAgICAg IHwgICAgICAgICAgIDEKKyAgNDJQMDYgICAgICB8ICAgICAgICAgICAxCisgIDQyUDA3ICAg ICAgfCAgICAgICAgICAyMAorICA0MlAwOSAgICAgIHwgICAgICAgICAgIDIKKyAgNDJQMTAg ICAgICB8ICAgICAgICAgIDg1CisgIDQyUDEzICAgICAgfCAgICAgICAgICA3OQorICA0MlAx NSAgICAgIHwgICAgICAgICAgMTUKKyAgNDJQMTYgICAgICB8ICAgICAgICAgMTE5CisgIDQy UDE3ICAgICAgfCAgICAgICAgICA5OAorICA0MlAxOCAgICAgIHwgICAgICAgICAgIDEKKyAg NDJQMTkgICAgICB8ICAgICAgICAgIDE5CisgIDQyUDIwICAgICAgfCAgICAgICAgICAxNAor ICA0MlAyMSAgICAgIHwgICAgICAgICAgMTcKKyAgNDJQMjIgICAgICB8ICAgICAgICAgICA4 CisgIDQ0MDAwICAgICAgfCAgICAgICAgICAzMQorICA1NDAwMCAgICAgIHwgICAgICAgICAg IDMKKyAgNTQwMDEgICAgICB8ICAgICAgICAgICA1CisgIDU0MDExICAgICAgfCAgICAgICAg ICAgMworICA1NTAwMCAgICAgIHwgICAgICAgICAxNDMKKyAgNTUwMDYgICAgICB8ICAgICAg ICAgICA4CisgIDU1UDA0ICAgICAgfCAgICAgICAgICAgNQorICA1OFAwMSAgICAgIHwgICAg ICAgICAgIDUKKyAgRjAwMDAgICAgICB8ICAgICAgICAgICAzCisgIFAwMDAxICAgICAgfCAg ICAgICAgICA0MgorICBQMDAwMiAgICAgIHwgICAgICAgICAgIDUKKyAgUDAwMDMgICAgICB8 ICAgICAgICAgIDExCisgIFAwMDA0ICAgICAgfCAgICAgICAgICAgNAorICBYWDAwMCAgICAg IHwgICAgICAgICAgMTQKKyAoMTI2IHJvd3MpCisgCisgPC9zY3JlZW4+CisgIDwvc2VjdDI+ CisgCisgIDxzZWN0MiBpZD0icGdzdGF0bG9nbXNnLWF1dGhvcnMiPgorICAgPHRpdGxlPkF1 dGhvcnM8L3RpdGxlPgorIAorICAgPHBhcmE+CisgICAgSm9lIENvbndheSA8ZW1haWw+bWFp bEBqb2Vjb253YXkuY29tPC9lbWFpbD4uCisgICA8L3BhcmE+CisgIDwvc2VjdDI+CisgCisg PC9zZWN0MT4K --------------h8dLgnFNFvy0cX7pF1ZHR9y4--