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 1u79Zs-00BSzT-TO for pgsql-hackers@arkaria.postgresql.org; Tue, 22 Apr 2025 09:06:05 +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 1u79Zq-00CfBZ-J3 for pgsql-hackers@arkaria.postgresql.org; Tue, 22 Apr 2025 09:06:03 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1u79Zp-00CfBR-SR for pgsql-hackers@lists.postgresql.org; Tue, 22 Apr 2025 09:06:03 +0000 Received: from mail-ua1-x930.google.com ([2607:f8b0:4864:20::930]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1u79Zl-001KBm-35 for pgsql-hackers@lists.postgresql.org; Tue, 22 Apr 2025 09:06:01 +0000 Received: by mail-ua1-x930.google.com with SMTP id a1e0cc1a2514c-86b9ea43955so1688308241.2 for ; Tue, 22 Apr 2025 02:05:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1745312757; x=1745917557; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=4qurWI9GJTb/5NEh3SsYqKbii+i1lMcdCETwxQbbZl0=; b=EV51QkM2pjE5Grl1Qw0yeDs/93JnXngEuiEvRZjeHUTld0jM7hO+W8BGllC2Co77QF H6gpO/aWdbZCWSWSv63q9k4t1gPEXzr0valnRj7z7v2tD7cbkIiiicQbnRl0M5ctngqV Atj+q0pg+4E8VfeYANNLkYx52DK8nMM+rfVek9tapqdhQs5oW5cM6Rm9jxKBNyENwQYd L5hvpoYUNwi2rFm941wV6zBgIbf/jy1zftLllZ+G3KrCWCIBqaXULfvc/6QYu/fx+Fqo W1k0kG3UeWtkBZwZiTFv10Pw4wfrkjoe1kD2r8ByAcY8nKwmjMORSYu8Tzym+ZWSG+kK zH2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745312757; x=1745917557; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=4qurWI9GJTb/5NEh3SsYqKbii+i1lMcdCETwxQbbZl0=; b=VY/So95hosxEQ/iH92svR5CfFDfOAO2MDjvl96WyqoRcvIcxcoih/ARumj4N22eqzk OMyT/Arlvc+QC9y0nh3AY8ME3oddwDtNsv+QY75CzLlBVAELoj3vtHYZouMwyBYnfx60 5iEhQ5XfmZGfF8ZU0ofLI1TUeGv+5KRbj3Yw0kLsp9rgrKen8hzsWIG+Ej4S6Uxyvmtp IStyIh/I7ofiv7v+yFztYQBL1hN4rInj0lnLrRzNAVYoteBE/AvubC3Mm2/L3pAkb/5V FJtvtKFzWdxQgm8bn0xEO7RhmoArzR1ymw5u1FMsPGFKpIu7ItcjLYi8eSfr6VkWc+4a OG6g== X-Gm-Message-State: AOJu0YwPIRbQZmCDHdVM85iAuPvGpn+4JTcDSvyM4h7YI7mIj2w1V9// 7iM+lQRxC9n+/3O1SHSwc4PPB9MkNBvn9jP/+jbEgCbi1hJzgzQdlgKEl86fYFPEnlykpYX064A YgQ8IrpWT4QdRrb9/LmrOTFPaFeIHlyxUqiET5g== X-Gm-Gg: ASbGnctHX6UqdZgqrCxFi7/MqWyV1xmWrYJBDk1NSfPQ7trWSlGcMSZX6fGNOPUgRn8 54z46KPC3Bn+NYeuPlZHjSEIxImU40sw8I6eZPoSderojcYyzI14jecWJ+Op8CamHVGK6epOhSq p2yeCnw3ZEpk+3BQ6ND19O8BE= X-Google-Smtp-Source: AGHT+IF4Uc+nypPFwCnzbdNypLzu3tIM/WOZrDNIgH8RYtQwQ7LjlX4txEp6gjk3mBCUWWR5Jzi6nGMAAbSVpkEFVAc= X-Received: by 2002:a67:f081:0:b0:4c4:e36b:e8bf with SMTP id ada2fe7eead31-4cb800b4b31mr8308420137.3.1745312757249; Tue, 22 Apr 2025 02:05:57 -0700 (PDT) MIME-Version: 1.0 From: Arseniy Mukhin Date: Tue, 22 Apr 2025 12:05:46 +0300 X-Gm-Features: ATxdqUE3Zy8YJLGa6S7cETrhb_fJUPVIW8MIvbO4RP_zRmHMg_M6b_YKSS6MTng Message-ID: Subject: amcheck support for BRIN indexes To: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="000000000000eb12c906335a4aad" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000eb12c906335a4aad Content-Type: text/plain; charset="UTF-8" Hi, It's not for v18, just wanted to share with the community and register it in the upcoming Commitfest 2025-07. Here is the patch with amcheck support for BRIN indexes. Patch uses amcheck common infrastructure that was introduced in [1]. It works and I deleted all the code that I copied from btree check at first. Great. During the check we hold ShareUpdateExclusiveLock, so we don't block regular reads/inserts/updates and the same time range summarizations/desummarizations are impossible during the check which simplifies check logic. While checking we do ereport(ERROR) on the first issue, the same way as btree, gin checks do. There are two parts: First part is 'index structure check': 1) Meta page check 2) Revmap check. Walk revmap and check every valid revmap item points to the index tuple with the expected range blkno, and index tuple is consistent with the tuple description. Also it's not documented, but known from the brin code that for every empty range we should have allnulls = true, hasnulls = false. So this is also checked here. 3) Regular pages check. Walk regular pages and check that every index tuple has a corresponding revmap item that points to it. We don't check index tuple structures here, because it was already done in 2 steps. Regular pages check is optional. Orphan index tuple errors in this check doesn't necessary mean that index is corrupted, but AFAIS brin is not supposed to have such orphan index tuples now, so if we encounter one than probably something wrong with the index. Second part is 'all consistent check': We check all heap tuples are consistent with the index. It's the most expensive part and it's optional. Here we call consistent functions for every heap tuple. Also here we check that fields like 'has_nulls', 'all_nulls', 'empty_range' are consistent with what we see in the heap. There are two patch files: 0001-brin-refactoring.patch It's just two tiny changes in the brin code. 1) For index tuple structure check we need to know how on-disk index tuples look like. Function that lets you get it 'brtuple_disk_tupdesc' is internal. This patch makes it extern. 2) Create macros for BRIN_MAX_PAGES_PER_RANGE. For the meta page check. 0002-amechek-brin-support.patch It's check functionality itself + regression tests + amcheck extension updates. Some open questions: 1) How to get the correct strategy number for the scan key in "all heap consistent" check. The consistent function wants a scan key, and to generate it we have to pick a strategy number. We can't just use the same strategy number for all indexes because its meaning differs from opclass to opclass (for example equal strategy number is 1 in Bloom and 3 in min_max). We also can't pick an operator and use it for every check, because opclasses don't have any requirements about what operators they should support. The solution was to let user to define check operator (parameter consistent_operator_names). It's an array as we can have a multicolumn index. We can use '=' as default check operator, because AFAIS '=' operator is supported by all core opclasses except 'box_inclusion_ops', and IMHO it's the most obvious candidate for such a check. So if param 'consistent_operator_names' is an empty array (param default value), then for all attributes we use operator '='. In most cases operator '=' does the job and you don't need to worry about consistent_operator_names param. Not sure about it, what do you think? 2) The current implementation of "all heap consistent" uses the scan of the entire heap. So if we have a lot of unsummarized ranges, we do a lot of wasted work because we can't use the tuples that belong to the unsummarized ranges. Instead of having one scan for the entire heap, we can walk the revmap, take only the summarized ranges, and scan only the pages that belong to those ranges. So we have one scan per range. This approach helps us avoid touching those heap tuples that we can't use for index checks. But I'm not sure if we should to worry about that because every autovacuum summarizes all the unsummarized ranges, so don't expect a lot of unsummarized ranges on average. TODO list: 1) add TAP tests 2) update SGML docs for amcheck (think it's better to do after patch is reviewed and more or less finalized) 3) pg_amcheck integration Big thanks to Tomas Vondra for the first patch idea and initial review. [1] https://www.postgresql.org/message-id/45AC9B0A-2B45-40EE-B08F-BDCF5739D1E1%40yandex-team.ru Best regards, Arseniy Mukhin --000000000000eb12c906335a4aad Content-Type: text/x-patch; charset="US-ASCII"; name="0002-amcheck-brin-support.patch" Content-Disposition: attachment; filename="0002-amcheck-brin-support.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m9sa44ur1 RnJvbSA3ZGU2MGU4ZGE4MjRhOTczMjdhNWMyOGNjZDlkOGEzODRjMDdiOTk3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBcnNlbml5IE11a2hpbiA8YXJzZW5peS5tdWtoaW4uZGV2QGdt YWlsLmNvbT4KRGF0ZTogVHVlLCAyMiBBcHIgMjAyNSAxMTowMDozNiArMDMwMApTdWJqZWN0OiBb UEFUQ0ggMi8yXSBhbWNoZWNrIC0gYnJpbiBzdXBwb3J0CgotLS0KIGNvbnRyaWIvYW1jaGVjay9N YWtlZmlsZSAgICAgICAgICAgICAgICB8ICAgIDUgKy0KIGNvbnRyaWIvYW1jaGVjay9hbWNoZWNr LS0xLjUtLTEuNi5zcWwgICB8ICAgMjAgKwogY29udHJpYi9hbWNoZWNrL2FtY2hlY2suY29udHJv bCAgICAgICAgIHwgICAgMiArLQogY29udHJpYi9hbWNoZWNrL2V4cGVjdGVkL2NoZWNrX2JyaW4u b3V0IHwgIDEzNCArKysKIGNvbnRyaWIvYW1jaGVjay9tZXNvbi5idWlsZCAgICAgICAgICAgICB8 ICAgIDMgKwogY29udHJpYi9hbWNoZWNrL3NxbC9jaGVja19icmluLnNxbCAgICAgIHwgIDEwMiAr KwogY29udHJpYi9hbWNoZWNrL3ZlcmlmeV9icmluYW0uYyAgICAgICAgIHwgMTI3MCArKysrKysr KysrKysrKysrKysrKysrKwogNyBmaWxlcyBjaGFuZ2VkLCAxNTMzIGluc2VydGlvbnMoKyksIDMg ZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgY29udHJpYi9hbWNoZWNrL2FtY2hlY2st LTEuNS0tMS42LnNxbAogY3JlYXRlIG1vZGUgMTAwNjQ0IGNvbnRyaWIvYW1jaGVjay9leHBlY3Rl ZC9jaGVja19icmluLm91dAogY3JlYXRlIG1vZGUgMTAwNjQ0IGNvbnRyaWIvYW1jaGVjay9zcWwv Y2hlY2tfYnJpbi5zcWwKIGNyZWF0ZSBtb2RlIDEwMDY0NCBjb250cmliL2FtY2hlY2svdmVyaWZ5 X2JyaW5hbS5jCgpkaWZmIC0tZ2l0IGEvY29udHJpYi9hbWNoZWNrL01ha2VmaWxlIGIvY29udHJp Yi9hbWNoZWNrL01ha2VmaWxlCmluZGV4IDFiN2E2M2NiYWE0Li4xMGNiYTZjOGZlYiAxMDA2NDQK LS0tIGEvY29udHJpYi9hbWNoZWNrL01ha2VmaWxlCisrKyBiL2NvbnRyaWIvYW1jaGVjay9NYWtl ZmlsZQpAQCAtNiwxMSArNiwxMiBAQCBPQkpTID0gXAogCXZlcmlmeV9jb21tb24ubyBcCiAJdmVy aWZ5X2dpbi5vIFwKIAl2ZXJpZnlfaGVhcGFtLm8gXAotCXZlcmlmeV9uYnRyZWUubworCXZlcmlm eV9uYnRyZWUubyBcCisJdmVyaWZ5X2JyaW5hbS5vCiAKIEVYVEVOU0lPTiA9IGFtY2hlY2sKIERB VEEgPSBhbWNoZWNrLS0xLjItLTEuMy5zcWwgYW1jaGVjay0tMS4xLS0xLjIuc3FsIGFtY2hlY2st LTEuMC0tMS4xLnNxbCBhbWNoZWNrLS0xLjAuc3FsIFwKLQkJYW1jaGVjay0tMS4zLS0xLjQuc3Fs IGFtY2hlY2stLTEuNC0tMS41LnNxbAorCQlhbWNoZWNrLS0xLjMtLTEuNC5zcWwgYW1jaGVjay0t MS40LS0xLjUuc3FsIGFtY2hlY2stLTEuNS0tMS42LnNxbAogUEdGSUxFREVTQyA9ICJhbWNoZWNr IC0gZnVuY3Rpb24gZm9yIHZlcmlmeWluZyByZWxhdGlvbiBpbnRlZ3JpdHkiCiAKIFJFR1JFU1Mg PSBjaGVjayBjaGVja19idHJlZSBjaGVja19naW4gY2hlY2tfaGVhcApkaWZmIC0tZ2l0IGEvY29u dHJpYi9hbWNoZWNrL2FtY2hlY2stLTEuNS0tMS42LnNxbCBiL2NvbnRyaWIvYW1jaGVjay9hbWNo ZWNrLS0xLjUtLTEuNi5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAu LjBjODUwYTk3ZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9hbWNoZWNrL2FtY2hlY2st LTEuNS0tMS42LnNxbApAQCAtMCwwICsxLDIwIEBACisvKiBjb250cmliL2FtY2hlY2svYW1jaGVj ay0tMS41LS0xLjYuc3FsICovCisKKy0tIGNvbXBsYWluIGlmIHNjcmlwdCBpcyBzb3VyY2VkIGlu IHBzcWwsIHJhdGhlciB0aGFuIHZpYSBDUkVBVEUgRVhURU5TSU9OCitcZWNobyBVc2UgIkFMVEVS IEVYVEVOU0lPTiBhbWNoZWNrIFVQREFURSBUTyAnMS42JyIgdG8gbG9hZCB0aGlzIGZpbGUuIFxx dWl0CisKKworLS0KKy0tIGJyaW5faW5kZXhfY2hlY2soKQorLS0KK0NSRUFURSBGVU5DVElPTiBi cmluX2luZGV4X2NoZWNrKGluZGV4IHJlZ2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcmVndWxhcl9wYWdlc19jaGVjayBib29sZWFuIGRlZmF1bHQgZmFsc2UsCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwX2FsbF9jb25zaXN0ZW50IGJvb2xlYW4g ZGVmYXVsdCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNpc3Rl bnRfb3BlcmF0b3JfbmFtZXMgdGV4dFtdIGRlZmF1bHQgJ3t9JworKQorICAgIFJFVFVSTlMgVk9J RAorQVMgJ01PRFVMRV9QQVRITkFNRScsICdicmluX2luZGV4X2NoZWNrJworTEFOR1VBR0UgQyBT VFJJQ1QgUEFSQUxMRUwgUkVTVFJJQ1RFRDsKKworLS0gV2UgZG9uJ3Qgd2FudCB0aGlzIHRvIGJl IGF2YWlsYWJsZSB0byBwdWJsaWMKK1JFVk9LRSBBTEwgT04gRlVOQ1RJT04gYnJpbl9pbmRleF9j aGVjayhyZWdjbGFzcywgYm9vbGVhbiwgYm9vbGVhbiwgdGV4dFtdKSBGUk9NIFBVQkxJQzsKXCBO byBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250cmliL2FtY2hlY2svYW1j aGVjay5jb250cm9sIGIvY29udHJpYi9hbWNoZWNrL2FtY2hlY2suY29udHJvbAppbmRleCBjOGJh NmQ3YzliYy4uMmYzMjllZjJjZjQgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvYW1jaGVjay9hbWNoZWNr LmNvbnRyb2wKKysrIGIvY29udHJpYi9hbWNoZWNrL2FtY2hlY2suY29udHJvbApAQCAtMSw1ICsx LDUgQEAKICMgYW1jaGVjayBleHRlbnNpb24KIGNvbW1lbnQgPSAnZnVuY3Rpb25zIGZvciB2ZXJp ZnlpbmcgcmVsYXRpb24gaW50ZWdyaXR5JwotZGVmYXVsdF92ZXJzaW9uID0gJzEuNScKK2RlZmF1 bHRfdmVyc2lvbiA9ICcxLjYnCiBtb2R1bGVfcGF0aG5hbWUgPSAnJGxpYmRpci9hbWNoZWNrJwog cmVsb2NhdGFibGUgPSB0cnVlCmRpZmYgLS1naXQgYS9jb250cmliL2FtY2hlY2svZXhwZWN0ZWQv Y2hlY2tfYnJpbi5vdXQgYi9jb250cmliL2FtY2hlY2svZXhwZWN0ZWQvY2hlY2tfYnJpbi5vdXQK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjI2OTBkNjI5NzIzCi0tLSAv ZGV2L251bGwKKysrIGIvY29udHJpYi9hbWNoZWNrL2V4cGVjdGVkL2NoZWNrX2JyaW4ub3V0CkBA IC0wLDAgKzEsMTM0IEBACistLSBoZWxwZXIgZnVuYworQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJ T04gIHJhbmRvbV9zdHJpbmcoIElOVCApIFJFVFVSTlMgVEVYVCBBUyAkJAorU0VMRUNUIHN0cmlu Z19hZ2coc3Vic3RyaW5nKCcwMTIzNDU2Nzg5YmNkZmdoamttbnBxcnN0dnd4eXonLCBjZWlsKHJh bmRvbSgpICogMzApOjpJTlRFR0VSLCAxKSwgJycpIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsICQx KTsKKyQkIExBTkdVQUdFIHNxbDsKKy0tIGVtcHR5IHRhYmxlIGluZGV4IHNob3VsZCBiZSB2YWxp ZAorQ1JFQVRFIFRBQkxFIGJyaW50ZXN0IChhIEJJR0lOVCkgV0lUSCAoRklMTEZBQ1RPUiA9IDEw KTsKK0NSRUFURSBJTkRFWCBicmludGVzdF9hX2lkeCBPTiBicmludGVzdCBVU0lORyBCUklOIChh KTsKK1NFTEVDVCBicmluX2luZGV4X2NoZWNrKCdicmludGVzdF9hX2lkeCc6OlJFR0NMQVNTLCB0 cnVlLCB0cnVlKTsKKyBicmluX2luZGV4X2NoZWNrIAorLS0tLS0tLS0tLS0tLS0tLS0tCisgCiso MSByb3cpCisKKy0tIGNsZWFudXAKK0RST1AgVEFCTEUgYnJpbnRlc3Q7CistLSBtdWx0aSBhdHRy aWJ1dGVzIHdpdGggdmFybGVuYSBhdHRyaWJ1dGUgdGVzdAorQ1JFQVRFIFRBQkxFIGJyaW50ZXN0 IChpZCBCSUdTRVJJQUwsIGEgVEVYVCkgV0lUSCAoRklMTEZBQ1RPUiA9IDEwKTsKK0NSRUFURSBJ TkRFWCBicmludGVzdF9hX2lkeCBPTiBicmludGVzdCBVU0lORyBCUklOIChhIFRFWFRfbWlubWF4 X29wcywgaWQgaW50OF9taW5tYXhfb3BzKSBXSVRIIChQQUdFU19QRVJfUkFOR0UgPSAyKTsKK0lO U0VSVCBJTlRPIGJyaW50ZXN0IChhKSBTRUxFQ1QgcmFuZG9tX3N0cmluZygoeCAlIDEwMCkpIEZS T00gZ2VuZXJhdGVfc2VyaWVzKDEsNTAwMCkgeDsKKy0tIGNyZWF0ZSBzb21lIGVtcHR5IHJhbmdl cworREVMRVRFIEZST00gYnJpbnRlc3QgV0hFUkUgaWQgPiAyMDAwIEFORCBpZCA8IDQwMDA7CitT RUxFQ1QgYnJpbl9pbmRleF9jaGVjaygnYnJpbnRlc3RfYV9pZHgnOjpSRUdDTEFTUyk7CisgYnJp bl9pbmRleF9jaGVjayAKKy0tLS0tLS0tLS0tLS0tLS0tLQorIAorKDEgcm93KQorCistLSByZWJ1 aWxkIGluZGV4CitEUk9QIElOREVYIGJyaW50ZXN0X2FfaWR4OworQ1JFQVRFIElOREVYIGJyaW50 ZXN0X2FfaWR4IE9OIGJyaW50ZXN0IFVTSU5HIEJSSU4gKGEgVEVYVF9taW5tYXhfb3BzKSBXSVRI IChQQUdFU19QRVJfUkFOR0UgPSAyKTsKK1NFTEVDVCBicmluX2luZGV4X2NoZWNrKCdicmludGVz dF9hX2lkeCc6OlJFR0NMQVNTKTsKKyBicmluX2luZGV4X2NoZWNrIAorLS0tLS0tLS0tLS0tLS0t LS0tCisgCisoMSByb3cpCisKKy0tIGNsZWFudXAKK0RST1AgVEFCTEUgYnJpbnRlc3Q7CistLSBt aW5fbWF4IG9wY2xhc3MKK0NSRUFURSBUQUJMRSBicmludGVzdCAoYSBCSUdJTlQpIFdJVEggKEZJ TExGQUNUT1IgPSAxMCk7CitDUkVBVEUgSU5ERVggYnJpbnRlc3RfYV9pZHggT04gYnJpbnRlc3Qg VVNJTkcgQlJJTiAoYSBpbnQ4X21pbm1heF9vcHMpIFdJVEggKFBBR0VTX1BFUl9SQU5HRSA9IDIp OworSU5TRVJUIElOVE8gYnJpbnRlc3QgKGEpIFNFTEVDVCB4IEZST00gZ2VuZXJhdGVfc2VyaWVz KDEsMTAwMDAwKSB4OworLS0gY3JlYXRlIHNvbWUgZW1wdHkgcmFuZ2VzCitERUxFVEUgRlJPTSBi cmludGVzdCBXSEVSRSBhID4gMjAwMDAgQU5EIGEgPCA0MDAwMDsKK1NFTEVDVCBicmluX2luZGV4 X2NoZWNrKCdicmludGVzdF9hX2lkeCc6OlJFR0NMQVNTLCB0cnVlLCB0cnVlKTsKKyBicmluX2lu ZGV4X2NoZWNrIAorLS0tLS0tLS0tLS0tLS0tLS0tCisgCisoMSByb3cpCisKKy0tIHJlYnVpbGQg aW5kZXgKK0RST1AgSU5ERVggYnJpbnRlc3RfYV9pZHg7CitDUkVBVEUgSU5ERVggYnJpbnRlc3Rf YV9pZHggT04gYnJpbnRlc3QgVVNJTkcgQlJJTiAoYSBpbnQ4X21pbm1heF9vcHMpIFdJVEggKFBB R0VTX1BFUl9SQU5HRSA9IDIpOworU0VMRUNUIGJyaW5faW5kZXhfY2hlY2soJ2JyaW50ZXN0X2Ff aWR4Jzo6UkVHQ0xBU1MsIHRydWUsIHRydWUpOworIGJyaW5faW5kZXhfY2hlY2sgCistLS0tLS0t LS0tLS0tLS0tLS0KKyAKKygxIHJvdykKKworLS0gY2xlYW51cAorRFJPUCBUQUJMRSBicmludGVz dDsKKy0tIG11bHRpX21pbl9tYXggb3BjbGFzcworQ1JFQVRFIFRBQkxFIGJyaW50ZXN0IChhIEJJ R0lOVCkgV0lUSCAoRklMTEZBQ1RPUiA9IDEwKTsKK0NSRUFURSBJTkRFWCBicmludGVzdF9hX2lk eCBPTiBicmludGVzdCBVU0lORyBCUklOIChhIGludDhfbWlubWF4X211bHRpX29wcykgV0lUSCAo UEFHRVNfUEVSX1JBTkdFID0gMik7CitJTlNFUlQgSU5UTyBicmludGVzdCAoYSkgU0VMRUNUIHgg RlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwxMDAwMDApIHg7CistLSBjcmVhdGUgc29tZSBlbXB0eSBy YW5nZXMKK0RFTEVURSBGUk9NIGJyaW50ZXN0IFdIRVJFIGEgPiAyMDAwMCBBTkQgYSA8IDQwMDAw OworU0VMRUNUIGJyaW5faW5kZXhfY2hlY2soJ2JyaW50ZXN0X2FfaWR4Jzo6UkVHQ0xBU1MsIHRy dWUsIHRydWUpOworIGJyaW5faW5kZXhfY2hlY2sgCistLS0tLS0tLS0tLS0tLS0tLS0KKyAKKygx IHJvdykKKworLS0gcmVidWlsZCBpbmRleAorRFJPUCBJTkRFWCBicmludGVzdF9hX2lkeDsKK0NS RUFURSBJTkRFWCBicmludGVzdF9hX2lkeCBPTiBicmludGVzdCBVU0lORyBCUklOIChhIGludDhf bWlubWF4X211bHRpX29wcykgV0lUSCAoUEFHRVNfUEVSX1JBTkdFID0gMik7CitTRUxFQ1QgYnJp bl9pbmRleF9jaGVjaygnYnJpbnRlc3RfYV9pZHgnOjpSRUdDTEFTUywgdHJ1ZSwgdHJ1ZSk7Cisg YnJpbl9pbmRleF9jaGVjayAKKy0tLS0tLS0tLS0tLS0tLS0tLQorIAorKDEgcm93KQorCistLSBj bGVhbnVwCitEUk9QIFRBQkxFIGJyaW50ZXN0OworLS0gYmxvb20gb3BjbGFzcworQ1JFQVRFIFRB QkxFIGJyaW50ZXN0IChhIEJJR0lOVCkgV0lUSCAoRklMTEZBQ1RPUiA9IDEwKTsKK0NSRUFURSBJ TkRFWCBicmludGVzdF9hX2lkeCBPTiBicmludGVzdCBVU0lORyBCUklOIChhIGludDhfYmxvb21f b3BzKSBXSVRIIChQQUdFU19QRVJfUkFOR0UgPSAyKTsKK0lOU0VSVCBJTlRPIGJyaW50ZXN0IChh KSBTRUxFQ1QgeCBGUk9NIGdlbmVyYXRlX3NlcmllcygxLDEwMDAwMCkgeDsKKy0tIGNyZWF0ZSBz b21lIGVtcHR5IHJhbmdlcworREVMRVRFIEZST00gYnJpbnRlc3QgV0hFUkUgYSA+IDIwMDAwIEFO RCBhIDwgNDAwMDA7CitTRUxFQ1QgYnJpbl9pbmRleF9jaGVjaygnYnJpbnRlc3RfYV9pZHgnOjpS RUdDTEFTUywgdHJ1ZSwgdHJ1ZSk7CisgYnJpbl9pbmRleF9jaGVjayAKKy0tLS0tLS0tLS0tLS0t LS0tLQorIAorKDEgcm93KQorCistLSByZWJ1aWxkIGluZGV4CitEUk9QIElOREVYIGJyaW50ZXN0 X2FfaWR4OworQ1JFQVRFIElOREVYIGJyaW50ZXN0X2FfaWR4IE9OIGJyaW50ZXN0IFVTSU5HIEJS SU4gKGEgaW50OF9ibG9vbV9vcHMpIFdJVEggKFBBR0VTX1BFUl9SQU5HRSA9IDIpOworU0VMRUNU IGJyaW5faW5kZXhfY2hlY2soJ2JyaW50ZXN0X2FfaWR4Jzo6UkVHQ0xBU1MsIHRydWUsIHRydWUp OworIGJyaW5faW5kZXhfY2hlY2sgCistLS0tLS0tLS0tLS0tLS0tLS0KKyAKKygxIHJvdykKKwor LS0gY2xlYW51cAorRFJPUCBUQUJMRSBicmludGVzdDsKKy0tIGluY2x1c2lvbiBvcGNsYXNzCitD UkVBVEUgVEFCTEUgYnJpbnRlc3QgKGlkIFNFUklBTCBQUklNQVJZIEtFWSwgYSBCT1gpOworQ1JF QVRFIElOREVYIGJyaW50ZXN0X2FfaWR4IE9OIGJyaW50ZXN0IFVTSU5HIEJSSU4gKGEgQk9YX0lO Q0xVU0lPTl9PUFMpIFdJVEggKFBBR0VTX1BFUl9SQU5HRSA9IDIpOworSU5TRVJUIElOVE8gYnJp bnRlc3QgKGEpCitTRUxFQ1QgQk9YKHBvaW50KHJhbmRvbSgpICogMTAwMCwgcmFuZG9tKCkgKiAx MDAwKSwgcG9pbnQocmFuZG9tKCkgKiAxMDAwLCByYW5kb20oKSAqIDEwMDApKQorRlJPTSBnZW5l cmF0ZV9zZXJpZXMoMSwgMTAwMDApOworLS0gY3JlYXRlIHNvbWUgZW1wdHkgcmFuZ2VzCitERUxF VEUgRlJPTSBicmludGVzdCBXSEVSRSBpZCA+IDIwMDAgQU5EIGlkIDwgNDAwMDsKK1NFTEVDVCBi cmluX2luZGV4X2NoZWNrKCdicmludGVzdF9hX2lkeCc6OlJFR0NMQVNTLCB0cnVlLCB0cnVlLCAn eyJAPiJ9Jyk7CisgYnJpbl9pbmRleF9jaGVjayAKKy0tLS0tLS0tLS0tLS0tLS0tLQorIAorKDEg cm93KQorCistLSByZWJ1aWxkIGluZGV4CitEUk9QIElOREVYIGJyaW50ZXN0X2FfaWR4OworQ1JF QVRFIElOREVYIGJyaW50ZXN0X2FfaWR4IE9OIGJyaW50ZXN0IFVTSU5HIEJSSU4gKGEgQk9YX0lO Q0xVU0lPTl9PUFMpIFdJVEggKFBBR0VTX1BFUl9SQU5HRSA9IDIpOworU0VMRUNUIGJyaW5faW5k ZXhfY2hlY2soJ2JyaW50ZXN0X2FfaWR4Jzo6UkVHQ0xBU1MsIHRydWUsIHRydWUsICd7IkA+In0n KTsKKyBicmluX2luZGV4X2NoZWNrIAorLS0tLS0tLS0tLS0tLS0tLS0tCisgCisoMSByb3cpCisK Ky0tIGNsZWFudXAKK0RST1AgVEFCTEUgYnJpbnRlc3Q7CistLSBjbGVhbnVwCitEUk9QIEZVTkNU SU9OIHJhbmRvbV9zdHJpbmc7CmRpZmYgLS1naXQgYS9jb250cmliL2FtY2hlY2svbWVzb24uYnVp bGQgYi9jb250cmliL2FtY2hlY2svbWVzb24uYnVpbGQKaW5kZXggYjMzZThjOWIwNjIuLjE1YzRk MTdhOWJjIDEwMDY0NAotLS0gYS9jb250cmliL2FtY2hlY2svbWVzb24uYnVpbGQKKysrIGIvY29u dHJpYi9hbWNoZWNrL21lc29uLmJ1aWxkCkBAIC01LDYgKzUsNyBAQCBhbWNoZWNrX3NvdXJjZXMg PSBmaWxlcygKICAgJ3ZlcmlmeV9naW4uYycsCiAgICd2ZXJpZnlfaGVhcGFtLmMnLAogICAndmVy aWZ5X25idHJlZS5jJywKKyAgJ3ZlcmlmeV9icmluYW0uYycKICkKIAogaWYgaG9zdF9zeXN0ZW0g PT0gJ3dpbmRvd3MnCkBAIC0yNyw2ICsyOCw3IEBAIGluc3RhbGxfZGF0YSgKICAgJ2FtY2hlY2st LTEuMi0tMS4zLnNxbCcsCiAgICdhbWNoZWNrLS0xLjMtLTEuNC5zcWwnLAogICAnYW1jaGVjay0t MS40LS0xLjUuc3FsJywKKyAgJ2FtY2hlY2stLTEuNS0tMS42LnNxbCcsCiAgIGt3YXJnczogY29u dHJpYl9kYXRhX2FyZ3MsCiApCiAKQEAgLTQwLDYgKzQyLDcgQEAgdGVzdHMgKz0gewogICAgICAg J2NoZWNrX2J0cmVlJywKICAgICAgICdjaGVja19naW4nLAogICAgICAgJ2NoZWNrX2hlYXAnLAor ICAgICAgJ2NoZWNrX2JyaW4nCiAgICAgXSwKICAgfSwKICAgJ3RhcCc6IHsKZGlmZiAtLWdpdCBh L2NvbnRyaWIvYW1jaGVjay9zcWwvY2hlY2tfYnJpbi5zcWwgYi9jb250cmliL2FtY2hlY2svc3Fs L2NoZWNrX2JyaW4uc3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4z NmUwOTFhNjg4NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvYW1jaGVjay9zcWwvY2hlY2tf YnJpbi5zcWwKQEAgLTAsMCArMSwxMDIgQEAKKy0tIGhlbHBlciBmdW5jCitDUkVBVEUgT1IgUkVQ TEFDRSBGVU5DVElPTiAgcmFuZG9tX3N0cmluZyggSU5UICkgUkVUVVJOUyBURVhUIEFTICQkCitT RUxFQ1Qgc3RyaW5nX2FnZyhzdWJzdHJpbmcoJzAxMjM0NTY3ODliY2RmZ2hqa21ucHFyc3R2d3h5 eicsIGNlaWwocmFuZG9tKCkgKiAzMCk6OklOVEVHRVIsIDEpLCAnJykgRlJPTSBnZW5lcmF0ZV9z ZXJpZXMoMSwgJDEpOworJCQgTEFOR1VBR0Ugc3FsOworCisKKy0tIGVtcHR5IHRhYmxlIGluZGV4 IHNob3VsZCBiZSB2YWxpZAorQ1JFQVRFIFRBQkxFIGJyaW50ZXN0IChhIEJJR0lOVCkgV0lUSCAo RklMTEZBQ1RPUiA9IDEwKTsKK0NSRUFURSBJTkRFWCBicmludGVzdF9hX2lkeCBPTiBicmludGVz dCBVU0lORyBCUklOIChhKTsKK1NFTEVDVCBicmluX2luZGV4X2NoZWNrKCdicmludGVzdF9hX2lk eCc6OlJFR0NMQVNTLCB0cnVlLCB0cnVlKTsKKy0tIGNsZWFudXAKK0RST1AgVEFCTEUgYnJpbnRl c3Q7CisKKworLS0gbXVsdGkgYXR0cmlidXRlcyB3aXRoIHZhcmxlbmEgYXR0cmlidXRlIHRlc3QK K0NSRUFURSBUQUJMRSBicmludGVzdCAoaWQgQklHU0VSSUFMLCBhIFRFWFQpIFdJVEggKEZJTExG QUNUT1IgPSAxMCk7CitDUkVBVEUgSU5ERVggYnJpbnRlc3RfYV9pZHggT04gYnJpbnRlc3QgVVNJ TkcgQlJJTiAoYSBURVhUX21pbm1heF9vcHMsIGlkIGludDhfbWlubWF4X29wcykgV0lUSCAoUEFH RVNfUEVSX1JBTkdFID0gMik7CitJTlNFUlQgSU5UTyBicmludGVzdCAoYSkgU0VMRUNUIHJhbmRv bV9zdHJpbmcoKHggJSAxMDApKSBGUk9NIGdlbmVyYXRlX3NlcmllcygxLDUwMDApIHg7CistLSBj cmVhdGUgc29tZSBlbXB0eSByYW5nZXMKK0RFTEVURSBGUk9NIGJyaW50ZXN0IFdIRVJFIGlkID4g MjAwMCBBTkQgaWQgPCA0MDAwOworU0VMRUNUIGJyaW5faW5kZXhfY2hlY2soJ2JyaW50ZXN0X2Ff aWR4Jzo6UkVHQ0xBU1MpOworCistLSByZWJ1aWxkIGluZGV4CitEUk9QIElOREVYIGJyaW50ZXN0 X2FfaWR4OworQ1JFQVRFIElOREVYIGJyaW50ZXN0X2FfaWR4IE9OIGJyaW50ZXN0IFVTSU5HIEJS SU4gKGEgVEVYVF9taW5tYXhfb3BzKSBXSVRIIChQQUdFU19QRVJfUkFOR0UgPSAyKTsKK1NFTEVD VCBicmluX2luZGV4X2NoZWNrKCdicmludGVzdF9hX2lkeCc6OlJFR0NMQVNTKTsKKy0tIGNsZWFu dXAKK0RST1AgVEFCTEUgYnJpbnRlc3Q7CisKKworCistLSBtaW5fbWF4IG9wY2xhc3MKK0NSRUFU RSBUQUJMRSBicmludGVzdCAoYSBCSUdJTlQpIFdJVEggKEZJTExGQUNUT1IgPSAxMCk7CitDUkVB VEUgSU5ERVggYnJpbnRlc3RfYV9pZHggT04gYnJpbnRlc3QgVVNJTkcgQlJJTiAoYSBpbnQ4X21p bm1heF9vcHMpIFdJVEggKFBBR0VTX1BFUl9SQU5HRSA9IDIpOworSU5TRVJUIElOVE8gYnJpbnRl c3QgKGEpIFNFTEVDVCB4IEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsMTAwMDAwKSB4OworLS0gY3Jl YXRlIHNvbWUgZW1wdHkgcmFuZ2VzCitERUxFVEUgRlJPTSBicmludGVzdCBXSEVSRSBhID4gMjAw MDAgQU5EIGEgPCA0MDAwMDsKK1NFTEVDVCBicmluX2luZGV4X2NoZWNrKCdicmludGVzdF9hX2lk eCc6OlJFR0NMQVNTLCB0cnVlLCB0cnVlKTsKKworLS0gcmVidWlsZCBpbmRleAorRFJPUCBJTkRF WCBicmludGVzdF9hX2lkeDsKK0NSRUFURSBJTkRFWCBicmludGVzdF9hX2lkeCBPTiBicmludGVz dCBVU0lORyBCUklOIChhIGludDhfbWlubWF4X29wcykgV0lUSCAoUEFHRVNfUEVSX1JBTkdFID0g Mik7CitTRUxFQ1QgYnJpbl9pbmRleF9jaGVjaygnYnJpbnRlc3RfYV9pZHgnOjpSRUdDTEFTUywg dHJ1ZSwgdHJ1ZSk7CistLSBjbGVhbnVwCitEUk9QIFRBQkxFIGJyaW50ZXN0OworCisKKworLS0g bXVsdGlfbWluX21heCBvcGNsYXNzCitDUkVBVEUgVEFCTEUgYnJpbnRlc3QgKGEgQklHSU5UKSBX SVRIIChGSUxMRkFDVE9SID0gMTApOworQ1JFQVRFIElOREVYIGJyaW50ZXN0X2FfaWR4IE9OIGJy aW50ZXN0IFVTSU5HIEJSSU4gKGEgaW50OF9taW5tYXhfbXVsdGlfb3BzKSBXSVRIIChQQUdFU19Q RVJfUkFOR0UgPSAyKTsKK0lOU0VSVCBJTlRPIGJyaW50ZXN0IChhKSBTRUxFQ1QgeCBGUk9NIGdl bmVyYXRlX3NlcmllcygxLDEwMDAwMCkgeDsKKy0tIGNyZWF0ZSBzb21lIGVtcHR5IHJhbmdlcwor REVMRVRFIEZST00gYnJpbnRlc3QgV0hFUkUgYSA+IDIwMDAwIEFORCBhIDwgNDAwMDA7CitTRUxF Q1QgYnJpbl9pbmRleF9jaGVjaygnYnJpbnRlc3RfYV9pZHgnOjpSRUdDTEFTUywgdHJ1ZSwgdHJ1 ZSk7CisKKy0tIHJlYnVpbGQgaW5kZXgKK0RST1AgSU5ERVggYnJpbnRlc3RfYV9pZHg7CitDUkVB VEUgSU5ERVggYnJpbnRlc3RfYV9pZHggT04gYnJpbnRlc3QgVVNJTkcgQlJJTiAoYSBpbnQ4X21p bm1heF9tdWx0aV9vcHMpIFdJVEggKFBBR0VTX1BFUl9SQU5HRSA9IDIpOworU0VMRUNUIGJyaW5f aW5kZXhfY2hlY2soJ2JyaW50ZXN0X2FfaWR4Jzo6UkVHQ0xBU1MsIHRydWUsIHRydWUpOworLS0g Y2xlYW51cAorRFJPUCBUQUJMRSBicmludGVzdDsKKworCisKKy0tIGJsb29tIG9wY2xhc3MKK0NS RUFURSBUQUJMRSBicmludGVzdCAoYSBCSUdJTlQpIFdJVEggKEZJTExGQUNUT1IgPSAxMCk7CitD UkVBVEUgSU5ERVggYnJpbnRlc3RfYV9pZHggT04gYnJpbnRlc3QgVVNJTkcgQlJJTiAoYSBpbnQ4 X2Jsb29tX29wcykgV0lUSCAoUEFHRVNfUEVSX1JBTkdFID0gMik7CitJTlNFUlQgSU5UTyBicmlu dGVzdCAoYSkgU0VMRUNUIHggRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwxMDAwMDApIHg7CistLSBj cmVhdGUgc29tZSBlbXB0eSByYW5nZXMKK0RFTEVURSBGUk9NIGJyaW50ZXN0IFdIRVJFIGEgPiAy MDAwMCBBTkQgYSA8IDQwMDAwOworU0VMRUNUIGJyaW5faW5kZXhfY2hlY2soJ2JyaW50ZXN0X2Ff aWR4Jzo6UkVHQ0xBU1MsIHRydWUsIHRydWUpOworCistLSByZWJ1aWxkIGluZGV4CitEUk9QIElO REVYIGJyaW50ZXN0X2FfaWR4OworQ1JFQVRFIElOREVYIGJyaW50ZXN0X2FfaWR4IE9OIGJyaW50 ZXN0IFVTSU5HIEJSSU4gKGEgaW50OF9ibG9vbV9vcHMpIFdJVEggKFBBR0VTX1BFUl9SQU5HRSA9 IDIpOworU0VMRUNUIGJyaW5faW5kZXhfY2hlY2soJ2JyaW50ZXN0X2FfaWR4Jzo6UkVHQ0xBU1Ms IHRydWUsIHRydWUpOworLS0gY2xlYW51cAorRFJPUCBUQUJMRSBicmludGVzdDsKKworCistLSBp bmNsdXNpb24gb3BjbGFzcworQ1JFQVRFIFRBQkxFIGJyaW50ZXN0IChpZCBTRVJJQUwgUFJJTUFS WSBLRVksIGEgQk9YKTsKK0NSRUFURSBJTkRFWCBicmludGVzdF9hX2lkeCBPTiBicmludGVzdCBV U0lORyBCUklOIChhIEJPWF9JTkNMVVNJT05fT1BTKSBXSVRIIChQQUdFU19QRVJfUkFOR0UgPSAy KTsKK0lOU0VSVCBJTlRPIGJyaW50ZXN0IChhKQorU0VMRUNUIEJPWChwb2ludChyYW5kb20oKSAq IDEwMDAsIHJhbmRvbSgpICogMTAwMCksIHBvaW50KHJhbmRvbSgpICogMTAwMCwgcmFuZG9tKCkg KiAxMDAwKSkKK0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwMDAwKTsKKy0tIGNyZWF0ZSBzb21l IGVtcHR5IHJhbmdlcworREVMRVRFIEZST00gYnJpbnRlc3QgV0hFUkUgaWQgPiAyMDAwIEFORCBp ZCA8IDQwMDA7CisKK1NFTEVDVCBicmluX2luZGV4X2NoZWNrKCdicmludGVzdF9hX2lkeCc6OlJF R0NMQVNTLCB0cnVlLCB0cnVlLCAneyJAPiJ9Jyk7CisKKy0tIHJlYnVpbGQgaW5kZXgKK0RST1Ag SU5ERVggYnJpbnRlc3RfYV9pZHg7CitDUkVBVEUgSU5ERVggYnJpbnRlc3RfYV9pZHggT04gYnJp bnRlc3QgVVNJTkcgQlJJTiAoYSBCT1hfSU5DTFVTSU9OX09QUykgV0lUSCAoUEFHRVNfUEVSX1JB TkdFID0gMik7CitTRUxFQ1QgYnJpbl9pbmRleF9jaGVjaygnYnJpbnRlc3RfYV9pZHgnOjpSRUdD TEFTUywgdHJ1ZSwgdHJ1ZSwgJ3siQD4ifScpOworLS0gY2xlYW51cAorRFJPUCBUQUJMRSBicmlu dGVzdDsKKworCistLSBjbGVhbnVwCitEUk9QIEZVTkNUSU9OIHJhbmRvbV9zdHJpbmc7ClwgTm8g bmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9hbWNoZWNrL3Zlcmlm eV9icmluYW0uYyBiL2NvbnRyaWIvYW1jaGVjay92ZXJpZnlfYnJpbmFtLmMKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmQwMWIzYTJhZDY0Ci0tLSAvZGV2L251bGwKKysr IGIvY29udHJpYi9hbWNoZWNrL3ZlcmlmeV9icmluYW0uYwpAQCAtMCwwICsxLDEyNzAgQEAKKy8q LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIHZlcmlmeV9icmluYW0uYworICoJICBGdW5jdGlvbnMg dG8gY2hlY2sgcG9zdGdyZXNxbCBicmluIGluZGV4ZXMgZm9yIGNvcnJ1cHRpb24KKyAqCisgKiBD b3B5cmlnaHQgKGMpIDIwMTYtMjAyNCwgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3Jv dXAKKyAqCisgKgkgIGNvbnRyaWIvYW1jaGVjay92ZXJpZnlfYnJpbmFtLmMKKyAqLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorICovCisjaW5jbHVkZSAicG9zdGdyZXMuaCIKKworI2luY2x1ZGUgImFjY2Vzcy9o dHVwX2RldGFpbHMuaCIKKyNpbmNsdWRlICJhY2Nlc3MvdGFibGUuaCIKKyNpbmNsdWRlICJhY2Nl c3MvdGFibGVhbS5oIgorI2luY2x1ZGUgImFjY2Vzcy90cmFuc2FtLmgiCisjaW5jbHVkZSAiYWNj ZXNzL2JyaW4uaCIKKyNpbmNsdWRlICJjYXRhbG9nL2luZGV4LmgiCisjaW5jbHVkZSAiY2F0YWxv Zy9wZ19hbV9kLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19vcGVyYXRvci5oIgorI2luY2x1ZGUg Im1pc2NhZG1pbi5oIgorI2luY2x1ZGUgInN0b3JhZ2UvbG1nci5oIgorI2luY2x1ZGUgInN0b3Jh Z2Uvc21nci5oIgorI2luY2x1ZGUgInV0aWxzL2d1Yy5oIgorI2luY2x1ZGUgInV0aWxzL21lbXV0 aWxzLmgiCisjaW5jbHVkZSAiYWNjZXNzL2JyaW5fcGFnZS5oIgorI2luY2x1ZGUgImFjY2Vzcy9i cmluX3Jldm1hcC5oIgorI2luY2x1ZGUgInV0aWxzL2xzeXNjYWNoZS5oIgorI2luY2x1ZGUgInZl cmlmeV9jb21tb24uaCIKKyNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgorI2luY2x1ZGUgInV0 aWxzL2FycmF5LmgiCisKKworUEdfRlVOQ1RJT05fSU5GT19WMShicmluX2luZGV4X2NoZWNrKTsK KwordHlwZWRlZiBzdHJ1Y3QgQnJpbkNoZWNrU3RhdGUKK3sKKworCS8qIENoZWNrIGFyZ3VtZW50 cyAqLworCisJYm9vbAkJcmVndWxhcl9wYWdlc19jaGVjazsKKwlib29sCQloZWFwX2FsbF9jb25z aXN0ZW50OworCUFycmF5VHlwZSAgKmhlYXBfYWxsX2NvbnNpc3RlbnRfb3Blcl9uYW1lczsKKwor CS8qIEJSSU4gY2hlY2sgY29tbW9uIGZpZWxkcyAqLworCisJUmVsYXRpb24JaWR4cmVsOworCVJl bGF0aW9uCWhlYXByZWw7CisJQnJpbkRlc2MgICAqYmRlc2M7CisJaW50CQkJbmF0dHM7CisJQmxv Y2tOdW1iZXIgcGFnZXNQZXJSYW5nZTsKKworCS8qIEluZGV4IHN0cnVjdHVyZSBjaGVjayBmaWVs ZHMgKi8KKworCUJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IGNoZWNrc3RyYXRlZ3k7CisJQmxvY2tOdW1i ZXIgaWR4bmJsb2NrczsKKwlCbG9ja051bWJlciBoZWFwbmJsb2NrczsKKwlCbG9ja051bWJlciBs YXN0UmV2bWFwUGFnZTsKKwkvKiBDdXJyZW50IHJhbmdlIGJsa25vICovCisJQmxvY2tOdW1iZXIg cmFuZ2VCbGtubzsKKwkvKiBDdXJyZW50IHJldm1hcCBpdGVtICovCisJQmxvY2tOdW1iZXIgcmV2 bWFwQmxrOworCUJ1ZmZlcgkJcmV2bWFwYnVmOworCVBhZ2UJCXJldm1hcHBhZ2U7CisJdWludDMy CQlyZXZtYXBpZHg7CisJLyogQ3VycmVudCBpbmRleCB0dXBsZSAqLworCUJsb2NrTnVtYmVyIHJl Z3BhZ2VCbGs7CisJQnVmZmVyCQlyZWdwYWdlYnVmOworCVBhZ2UJCXJlZ3BhZ2U7CisJT2Zmc2V0 TnVtYmVyIHJlZ3BhZ2VvZmZzZXQ7CisKKwkvKiBBbGwgaGVhcCBjb25zaXN0ZW50IGNoZWNrIGZp ZWxkcyAqLworCisJU3RyaW5nCSAgKipvcGVyYXRvck5hbWVzOworCUJyaW5SZXZtYXAgKnJldm1h cDsKKwlCdWZmZXIJCWJ1ZjsKKwlGbWdySW5mbyAgICpjb25zaXN0ZW50Rm47CisJLyogU2NhbiBr ZXlzIGZvciByZWd1bGFyIHZhbHVlcyAqLworCVNjYW5LZXkgICAgKm5vbm51bGxfc2s7CisJLyog U2NhbiBrZXlzIGZvciBudWxsIHZhbHVlcyAqLworCVNjYW5LZXkgICAgKmlzbnVsbF9zazsKKwlk b3VibGUJCXJhbmdlX2NudDsKKwkvKiBmaXJzdCBibG9jayBvZiB0aGUgbmV4dCByYW5nZSAqLwor CUJsb2NrTnVtYmVyIG5leHRyYW5nZUJsazsKKworCS8qCisJICogY2hlY2thYmxlX3JhbmdlIHNo b3dzIGlmIGN1cnJlbnQgcmFuZ2UgY291bGQgYmUgY2hlY2tlZCBhbmQgZHR1cAorCSAqIGNvbnRh aW5zIHZhbGlkIGluZGV4IHR1cGxlIGZvciB0aGUgcmFuZ2UuIEl0IGNvdWxkIGJlIGZhbHNlIGlm IHRoZQorCSAqIGN1cnJlbnQgcmFuZ2UgaXMgbm90IHN1bW1hcml6ZWQsIG9yIGl0J3MgcGxhY2Vo b2xkZXIsIG9yIGl0J3MganVzdCBhCisJICogYmVnaW5uaW5nIG9mIHRoZSBjaGVjaworCSAqLwor CWJvb2wJCWNoZWNrYWJsZV9yYW5nZTsKKwlCcmluTWVtVHVwbGUgKmR0dXA7CisJTWVtb3J5Q29u dGV4dCByYW5nZUN0eDsKKwlNZW1vcnlDb250ZXh0IGhlYXB0dXBsZUN0eDsKK30JCQlCcmluQ2hl Y2tTdGF0ZTsKKworc3RhdGljIHZvaWQgYnJpbl9jaGVjayhSZWxhdGlvbiBpZHhyZWwsIFJlbGF0 aW9uIGhlYXByZWwsIHZvaWQgKmNhbGxiYWNrX3N0YXRlLCBib29sIHJlYWRvbmx5KTsKKworc3Rh dGljIHZvaWQgY2hlY2tfYnJpbl9pbmRleF9zdHJ1Y3R1cmUoQnJpbkNoZWNrU3RhdGUgKiBwU3Rh dGUpOworCitzdGF0aWMgdm9pZCBjaGVja19tZXRhKEJyaW5DaGVja1N0YXRlICogc3RhdGUpOwor CitzdGF0aWMgdm9pZCBjaGVja19yZXZtYXAoQnJpbkNoZWNrU3RhdGUgKiBzdGF0ZSk7CisKK3N0 YXRpYyB2b2lkIGNoZWNrX3Jldm1hcF9pdGVtKEJyaW5DaGVja1N0YXRlICogc3RhdGUpOworCitz dGF0aWMgdm9pZCBjaGVja19pbmRleF90dXBsZShCcmluQ2hlY2tTdGF0ZSAqIHN0YXRlLCBCcmlu VHVwbGUgKnR1cGxlLCBJdGVtSWQgbHApOworCitzdGF0aWMgdm9pZCBjaGVja19yZWd1bGFyX3Bh Z2VzKEJyaW5DaGVja1N0YXRlICogc3RhdGUpOworCitzdGF0aWMgYm9vbCByZXZtYXBfcG9pbnRz X3RvX2luZGV4X3R1cGxlKEJyaW5DaGVja1N0YXRlICogc3RhdGUpOworCitzdGF0aWMgSXRlbUlk IFBhZ2VHZXRJdGVtSWRDYXJlZnVsKEJyaW5DaGVja1N0YXRlICogc3RhdGUpOworCitzdGF0aWMg dm9pZCBjaGVja19hbGxfaGVhcF9jb25zaXN0ZW50KEJyaW5DaGVja1N0YXRlICogc3RhdGUpOwor CitzdGF0aWMgdm9pZCBjaGVja19hbmRfcHJlcGFyZV9vcGVyYXRvcl9uYW1lcyhCcmluQ2hlY2tT dGF0ZSAqIHN0YXRlKTsKKworc3RhdGljIHZvaWQgYnJpbl9jaGVja19jYWxsYmFjayhSZWxhdGlv biBpbmRleCwKKwkJCQkJCQkJSXRlbVBvaW50ZXIgdGlkLAorCQkJCQkJCQlEYXR1bSAqdmFsdWVz LAorCQkJCQkJCQlib29sICppc251bGwsCisJCQkJCQkJCWJvb2wgdHVwbGVJc0FsaXZlLAorCQkJ CQkJCQl2b2lkICpicnN0YXRlKTsKKworc3RhdGljIHZvaWQgY2hlY2tfaGVhcF90dXBsZShCcmlu Q2hlY2tTdGF0ZSAqIHN0YXRlLCBjb25zdCBEYXR1bSAqdmFsdWVzLCBjb25zdCBib29sICpudWxs cywgSXRlbVBvaW50ZXIgdGlkKTsKKworc3RhdGljIFNjYW5LZXkgcHJlcGFyZV9ub25udWxsX3Nj YW5fa2V5KGNvbnN0IEJyaW5DaGVja1N0YXRlICogc3RhdGUsIEF0dHJOdW1iZXIgYXR0bm8pOwor CitzdGF0aWMgU2NhbktleSBwcmVwYXJlX2lzbnVsbF9zY2FuX2tleShBdHRyTnVtYmVyIGF0dG5v KTsKKworc3RhdGljIHZvaWQgYnJpbl9jaGVja19lcmVwb3J0KGNvbnN0IGNoYXIgKmZtdCk7CisK K3N0YXRpYyB2b2lkIHJldm1hcF9pdGVtX2VyZXBvcnQoQnJpbkNoZWNrU3RhdGUgKiBzdGF0ZSwg Y29uc3QgY2hhciAqZm10KTsKKworc3RhdGljIHZvaWQgaW5kZXhfdHVwbGVfZXJlcG9ydChCcmlu Q2hlY2tTdGF0ZSAqIHN0YXRlLCBjb25zdCBjaGFyICpmbXQpOworCitzdGF0aWMgdm9pZCBpbmRl eF90dXBsZV9vbmx5X2VyZXBvcnQoQnJpbkNoZWNrU3RhdGUgKiBzdGF0ZSwgY29uc3QgY2hhciAq Zm10KTsKKworc3RhdGljIHZvaWQgYWxsX2NvbnNpc3RfZXJlcG9ydChjb25zdCBCcmluQ2hlY2tT dGF0ZSAqIHN0YXRlLCBjb25zdCBJdGVtUG9pbnRlckRhdGEgKnRpZCwgY29uc3QgY2hhciAqbWVz c2FnZSk7CisKK0RhdHVtCiticmluX2luZGV4X2NoZWNrKFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJ T2lkCQkJaW5kcmVsaWQgPSBQR19HRVRBUkdfT0lEKDApOworCUJyaW5DaGVja1N0YXRlICpzdGF0 ZSA9IHBhbGxvYzAoc2l6ZW9mKEJyaW5DaGVja1N0YXRlKSk7CisKKwlzdGF0ZS0+cmVndWxhcl9w YWdlc19jaGVjayA9IFBHX0dFVEFSR19CT09MKDEpOworCXN0YXRlLT5oZWFwX2FsbF9jb25zaXN0 ZW50ID0gUEdfR0VUQVJHX0JPT0woMik7CisJc3RhdGUtPmhlYXBfYWxsX2NvbnNpc3RlbnRfb3Bl cl9uYW1lcyA9IFBHX0dFVEFSR19BUlJBWVRZUEVfUCgzKTsKKworCWFtY2hlY2tfbG9ja19yZWxh dGlvbl9hbmRfY2hlY2soaW5kcmVsaWQsCisJCQkJCQkJCQlCUklOX0FNX09JRCwKKwkJCQkJCQkJ CWJyaW5fY2hlY2ssCisJCQkJCQkJCQlTaGFyZVVwZGF0ZUV4Y2x1c2l2ZUxvY2ssCisJCQkJCQkJ CQlzdGF0ZSk7CisKKwlQR19SRVRVUk5fVk9JRCgpOworfQorCisvKgorICogTWFpbiBjaGVjayBm dW5jdGlvbgorICovCitzdGF0aWMgdm9pZAorYnJpbl9jaGVjayhSZWxhdGlvbiBpZHhyZWwsIFJl bGF0aW9uIGhlYXByZWwsIHZvaWQgKmNhbGxiYWNrX3N0YXRlLCBib29sIHJlYWRvbmx5KQorewor CUJyaW5DaGVja1N0YXRlICpzdGF0ZSA9IChCcmluQ2hlY2tTdGF0ZSAqKSBjYWxsYmFja19zdGF0 ZTsKKworCS8qIEluaXRpYWxpemUgY2hlY2sgY29tbW9uIGZpZWxkcyAqLworCXN0YXRlLT5pZHhy ZWwgPSBpZHhyZWw7CisJc3RhdGUtPmhlYXByZWwgPSBoZWFwcmVsOworCXN0YXRlLT5iZGVzYyA9 IGJyaW5fYnVpbGRfZGVzYyhpZHhyZWwpOworCXN0YXRlLT5uYXR0cyA9IHN0YXRlLT5iZGVzYy0+ YmRfdHVwZGVzYy0+bmF0dHM7CisKKwkvKgorCSAqIFdlIGtub3cgaG93IG1hbnkgYXR0cmlidXRl cyBpbmRleCBoYXMsIHNvIGxldCdzIHByb2Nlc3Mgb3BlcmF0b3IgbmFtZXMKKwkgKiBhcnJheQor CSAqLworCWlmIChzdGF0ZS0+aGVhcF9hbGxfY29uc2lzdGVudCkKKwl7CisJCWNoZWNrX2FuZF9w cmVwYXJlX29wZXJhdG9yX25hbWVzKHN0YXRlKTsKKwl9CisKKwljaGVja19icmluX2luZGV4X3N0 cnVjdHVyZShzdGF0ZSk7CisKKwlpZiAoc3RhdGUtPmhlYXBfYWxsX2NvbnNpc3RlbnQpCisJewor CQljaGVja19hbGxfaGVhcF9jb25zaXN0ZW50KHN0YXRlKTsKKwl9CisKKwlicmluX2ZyZWVfZGVz YyhzdGF0ZS0+YmRlc2MpOworfQorCisvKgorICogQ2hlY2sgdGhhdCBpbmRleCBoYXMgZXhwZWN0 ZWQgc3RydWN0dXJlCisgKgorICogIFNvbWUgY2hlY2sgZXhwZWN0YXRpb25zOgorICogLSB3ZSBo b2xkIFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jaywgc28gcmV2bWFwIGNvdWxkIG5vdCBiZSBleHRl bmRlZCAoaS5lLiBubyBldmFjdWF0aW9uKSB3aGlsZSBjaGVjayBhcyB3ZWxsIGFzCisgKiAgIGFs bCByZWd1bGFyIHBhZ2VzIHNob3VsZCBzdGF5IHJlZ3VsYXIgYW5kIHJhbmdlcyBjb3VsZCBub3Qg YmUgc3VtbWFyaXplZCBhbmQgZGVzdW1tYXJpemVkLgorICogICBOZXZlcnRoZWxlc3MsIGNvbmN1 cnJlbnQgdXBkYXRlcyBjb3VsZCBsZWFkIHRvIG5ldyByZWd1bGFyIHBhZ2UgYWxsb2NhdGlvbnMK KyAqICAgYW5kIG1vdmluZyBvZiBpbmRleCB0dXBsZXMuCisgKiAtIGlmIHJldm1hcCBwb2ludGVy IGlzIHZhbGlkIHRoZXJlIHNob3VsZCBiZSB2YWxpZCBpbmRleCB0dXBsZSBpdCBwb2ludHMgdG8u CisgKiAtIHRoZXJlIGFyZSBubyBvcnBoYW4gaW5kZXggdHVwbGVzIChpZiB0aGVyZSBpcyBhbiBp bmRleCB0dXBsZSwgdGhlIHJldm1hcCBpdGVtIHBvaW50cyB0byB0aGlzIHR1cGxlIGFsc28gbXVz dCBleGlzdCkKKyAqIC0gaXQncyBwb3NzaWJsZSB0byBlbmNvdW50ZXIgcGxhY2Vob2xkZXIgdHVw bGVzIChhcyBhIHJlc3VsdCBvZiBjcmFzaCkKKyAqIC0gaXQncyBwb3NzaWJsZSB0byBlbmNvdW50 ZXIgbmV3IHBhZ2VzIGluc3RlYWQgb2YgcmVndWxhciAoYXMgYSByZXN1bHQgb2YgY3Jhc2gpCisg KiAtIGl0J3MgcG9zc2libGUgdG8gZW5jb3VudGVyIHBhZ2VzIHdpdGggZXZhY3VhdGlvbiBiaXQg KGFzIGEgcmVzdWx0IG9mIGNyYXNoKQorICoKKyAqLworc3RhdGljIHZvaWQKK2NoZWNrX2JyaW5f aW5kZXhfc3RydWN0dXJlKEJyaW5DaGVja1N0YXRlICogc3RhdGUpCit7CisJLyogSW5kZXggc3Ry dWN0dXJlIGNoZWNrIGZpZWxkcyBpbml0aWFsaXphdGlvbiAqLworCXN0YXRlLT5jaGVja3N0cmF0 ZWd5ID0gR2V0QWNjZXNzU3RyYXRlZ3koQkFTX0JVTEtSRUFEKTsKKworCWNoZWNrX21ldGEoc3Rh dGUpOworCisJLyogQ2hlY2sgcmV2bWFwIGZpcnN0LCBibG9ja3M6IFsxLCBsYXN0UmV2bWFwUGFn ZV0gKi8KKwljaGVja19yZXZtYXAoc3RhdGUpOworCisJLyogQ2hlY2sgcmVndWxhciBwYWdlcywg YmxvY2tzOiBbbGFzdFJldm1hcFBhZ2UgKyAxLCBpZHhuYmxvY2tzXSAqLworCWNoZWNrX3JlZ3Vs YXJfcGFnZXMoc3RhdGUpOworfQorCisvKiBNZXRhIHBhZ2UgY2hlY2sgYW5kIHNhdmUgc29tZSBk YXRhIGZvciB0aGUgZnVydGhlciBjaGVjayAqLworc3RhdGljIHZvaWQKK2NoZWNrX21ldGEoQnJp bkNoZWNrU3RhdGUgKiBzdGF0ZSkKK3sKKwlCdWZmZXIJCW1ldGFidWY7CisJUGFnZQkJbWV0YXBh Z2U7CisJQnJpbk1ldGFQYWdlRGF0YSAqbWV0YWRhdGE7CisKKwkvKiBNZXRhIHBhZ2UgY2hlY2sg Ki8KKwltZXRhYnVmID0gUmVhZEJ1ZmZlckV4dGVuZGVkKHN0YXRlLT5pZHhyZWwsIE1BSU5fRk9S S05VTSwgQlJJTl9NRVRBUEFHRV9CTEtOTywgUkJNX05PUk1BTCwKKwkJCQkJCQkJIHN0YXRlLT5j aGVja3N0cmF0ZWd5KTsKKwlMb2NrQnVmZmVyKG1ldGFidWYsIEJVRkZFUl9MT0NLX1NIQVJFKTsK KwltZXRhcGFnZSA9IEJ1ZmZlckdldFBhZ2UobWV0YWJ1Zik7CisJbWV0YWRhdGEgPSAoQnJpbk1l dGFQYWdlRGF0YSAqKSBQYWdlR2V0Q29udGVudHMobWV0YXBhZ2UpOworCXN0YXRlLT5pZHhuYmxv Y2tzID0gUmVsYXRpb25HZXROdW1iZXJPZkJsb2NrcyhzdGF0ZS0+aWR4cmVsKTsKKworCisJaWYg KCFCUklOX0lTX01FVEFfUEFHRShtZXRhcGFnZSkgfHwKKwkJbWV0YWRhdGEtPmJyaW5NYWdpYyAh PSBCUklOX01FVEFfTUFHSUMgfHwKKwkJbWV0YWRhdGEtPmJyaW5WZXJzaW9uICE9IEJSSU5fQ1VS UkVOVF9WRVJTSU9OIHx8CisJCW1ldGFkYXRhLT5wYWdlc1BlclJhbmdlIDwgMSB8fCBtZXRhZGF0 YS0+cGFnZXNQZXJSYW5nZSA+IEJSSU5fTUFYX1BBR0VTX1BFUl9SQU5HRSB8fAorCQltZXRhZGF0 YS0+bGFzdFJldm1hcFBhZ2UgPD0gQlJJTl9NRVRBUEFHRV9CTEtOTyB8fCBtZXRhZGF0YS0+bGFz dFJldm1hcFBhZ2UgPj0gc3RhdGUtPmlkeG5ibG9ja3MpCisJeworCQlicmluX2NoZWNrX2VyZXBv cnQoIm1ldGFwYWdlIGlzIGNvcnJ1cHRlZCIpOworCX0KKworCXN0YXRlLT5sYXN0UmV2bWFwUGFn ZSA9IG1ldGFkYXRhLT5sYXN0UmV2bWFwUGFnZTsKKwlzdGF0ZS0+cGFnZXNQZXJSYW5nZSA9IG1l dGFkYXRhLT5wYWdlc1BlclJhbmdlOworCVVubG9ja1JlbGVhc2VCdWZmZXIobWV0YWJ1Zik7Cit9 CisKKy8qCisgKiBXYWxrIHJldm1hcCBwYWdlIGJ5IHBhZ2UgZnJvbSB0aGUgYmVnaW5uaW5nIGFu ZCBjaGVjayBldmVyeSByZXZtYXAgaXRlbS4KKyAqIEFsc28gY2hlY2sgdGhhdCBhbGwgcGFnZXMg d2l0aGluIFsxLCBsYXN0UmV2bWFwUGFnZV0gYXJlIHJldm1hcCBwYWdlcy4KKyAqLworc3RhdGlj IHZvaWQKK2NoZWNrX3Jldm1hcChCcmluQ2hlY2tTdGF0ZSAqIHN0YXRlKQoreworCVJlbGF0aW9u CWlkeHJlbCA9IHN0YXRlLT5pZHhyZWw7CisJQmxvY2tOdW1iZXIgbGFzdFJldm1hcFBhZ2UgPSBz dGF0ZS0+bGFzdFJldm1hcFBhZ2U7CisKKwlzdGF0ZS0+cmFuZ2VCbGtubyA9IDA7CisJc3RhdGUt PnJlZ3BhZ2VidWYgPSBJbnZhbGlkQnVmZmVyOworCXN0YXRlLT5oZWFwbmJsb2NrcyA9IFJlbGF0 aW9uR2V0TnVtYmVyT2ZCbG9ja3Moc3RhdGUtPmhlYXByZWwpOworCisJLyogV2FsayBlYWNoIHJl dm1hcCBwYWdlICovCisJZm9yIChzdGF0ZS0+cmV2bWFwQmxrID0gQlJJTl9NRVRBUEFHRV9CTEtO TyArIDE7IHN0YXRlLT5yZXZtYXBCbGsgPD0gbGFzdFJldm1hcFBhZ2U7IHN0YXRlLT5yZXZtYXBC bGsrKykKKwl7CisKKwkJc3RhdGUtPnJldm1hcGJ1ZiA9IFJlYWRCdWZmZXJFeHRlbmRlZChpZHhy ZWwsIE1BSU5fRk9SS05VTSwgc3RhdGUtPnJldm1hcEJsaywgUkJNX05PUk1BTCwKKwkJCQkJCQkJ CQkJICBzdGF0ZS0+Y2hlY2tzdHJhdGVneSk7CisJCUxvY2tCdWZmZXIoc3RhdGUtPnJldm1hcGJ1 ZiwgQlVGRkVSX0xPQ0tfU0hBUkUpOworCQlzdGF0ZS0+cmV2bWFwcGFnZSA9IEJ1ZmZlckdldFBh Z2Uoc3RhdGUtPnJldm1hcGJ1Zik7CisKKwkJLyoKKwkJICogUGFnZXMgd2l0aCBibG9jayBudW1i ZXJzIGluIFsxLCBsYXN0UmV2bWFwUGFnZV0gc2hvdWxkIGJlIHJldm1hcAorCQkgKiBwYWdlcwor CQkgKi8KKwkJaWYgKCFCUklOX0lTX1JFVk1BUF9QQUdFKHN0YXRlLT5yZXZtYXBwYWdlKSkKKwkJ eworCQkJYnJpbl9jaGVja19lcmVwb3J0KHBzcHJpbnRmKCJyZXZtYXAgcGFnZSBpcyBleHBlY3Rl ZCBhdCBibG9jayAldSwgbGFzdCByZXZtYXAgcGFnZSAldSIsCisJCQkJCQkJCQkJc3RhdGUtPnJl dm1hcEJsaywKKwkJCQkJCQkJCQlsYXN0UmV2bWFwUGFnZSkpOworCQl9CisJCUxvY2tCdWZmZXIo c3RhdGUtPnJldm1hcGJ1ZiwgQlVGRkVSX0xPQ0tfVU5MT0NLKTsKKworCQkvKiBXYWxrIGFuZCBj aGVjayBhbGwgYnJpbiB0dXBsZXMgZnJvbSB0aGUgY3VycmVudCByZXZtYXAgcGFnZSAqLworCQlz dGF0ZS0+cmV2bWFwaWR4ID0gMDsKKwkJd2hpbGUgKHN0YXRlLT5yZXZtYXBpZHggPCBSRVZNQVBf UEFHRV9NQVhJVEVNUykKKwkJeworCQkJQ0hFQ0tfRk9SX0lOVEVSUlVQVFMoKTsKKworCQkJLyog Q2hlY2sgcmV2bWFwIGl0ZW0gKi8KKwkJCWNoZWNrX3Jldm1hcF9pdGVtKHN0YXRlKTsKKworCQkJ c3RhdGUtPnJhbmdlQmxrbm8gKz0gc3RhdGUtPnBhZ2VzUGVyUmFuZ2U7CisJCQlzdGF0ZS0+cmV2 bWFwaWR4Kys7CisJCX0KKworCQllbG9nKERFQlVHMSwgIkNvbXBsZXRlIHJldm1hcCBwYWdlIGNo ZWNrOiAlZCIsIHN0YXRlLT5yZXZtYXBCbGspOworCisJCVJlbGVhc2VCdWZmZXIoc3RhdGUtPnJl dm1hcGJ1Zik7CisJfQorCisJaWYgKEJ1ZmZlcklzVmFsaWQoc3RhdGUtPnJlZ3BhZ2VidWYpKQor CXsKKwkJUmVsZWFzZUJ1ZmZlcihzdGF0ZS0+cmVncGFnZWJ1Zik7CisJfQorfQorCisvKgorICog Q2hlY2sgcmV2bWFwIGl0ZW0uCisgKgorICogV2UgY2hlY2sgcmV2bWFwIGl0ZW0gcG9pbnRlciBp dHNlbGYgYW5kIGlmIGl0IGlzIG9rIHdlIGNoZWNrIHRoZSBpbmRleCB0dXBsZSBpdCBwb2ludHMg dG8uCisgKgorICogVG8gYXZvaWQgZGVhZGxvY2sgd2UgbmVlZCB0byB1bmxvY2sgcmV2bWFwIHBh Z2UgYmVmb3JlIGxvY2tpbmcgcmVndWxhciBwYWdlLAorICogc28gd2hlbiB3ZSBnZXQgdGhlIGxv Y2sgb24gdGhlIHJlZ3VsYXIgcGFnZSBvdXIgaW5kZXggdHVwbGUgcG9pbnRlciBtYXkgbm8gbG9u Z2VyIGJlIHJlbGV2YW50LgorICogU28gZm9yIHNvbWUgY2hlY2tzIGJlZm9yZSByZXBvcnRpbmcg YW4gZXJyb3Igd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBvdXIgcG9pbnRlciBpcyBzdGlsbCBy ZWxldmFudCBhbmQgaWYgaXQncyBub3QgLSByZXRyeS4KKyAqLworc3RhdGljIHZvaWQKK2NoZWNr X3Jldm1hcF9pdGVtKEJyaW5DaGVja1N0YXRlICogc3RhdGUpCit7CisJSXRlbVBvaW50ZXJEYXRh ICpyZXZtYXB0aWRzOworCVJldm1hcENvbnRlbnRzICpjb250ZW50czsKKwlJdGVtUG9pbnRlckRh dGEgKmlwdHI7CisJSXRlbUlkCQlscDsKKwlCcmluVHVwbGUgICp0dXA7CisJUmVsYXRpb24JaWR4 cmVsID0gc3RhdGUtPmlkeHJlbDsKKworCS8qIExvb3AgdG8gcmV0cnkgcmV2bWFwIGl0ZW0gY2hl Y2sgaWYgdGhlcmUgd2FzIGEgY29uY3VycmVudCB1cGRhdGUuICovCisJZm9yICg7OykKKwl7CisJ CUxvY2tCdWZmZXIoc3RhdGUtPnJldm1hcGJ1ZiwgQlVGRkVSX0xPQ0tfU0hBUkUpOworCisJCWNv bnRlbnRzID0gKFJldm1hcENvbnRlbnRzICopIFBhZ2VHZXRDb250ZW50cyhCdWZmZXJHZXRQYWdl KHN0YXRlLT5yZXZtYXBidWYpKTsKKwkJcmV2bWFwdGlkcyA9IGNvbnRlbnRzLT5ybV90aWRzOwor CQkvKiBQb2ludGVyIGZvciB0aGUgcmFuZ2Ugd2l0aCBzdGFydCBhdCBzdGF0ZS0+cmFuZ2VCbGtu byAqLworCQlpcHRyID0gcmV2bWFwdGlkcyArIHN0YXRlLT5yZXZtYXBpZHg7CisKKwkJLyogQXQg Zmlyc3QgY2hlY2sgcmV2bWFwIGl0ZW0gcG9pbnRlciAqLworCisJCS8qCisJCSAqIFR1cGxlIHBv aW50ZXIgaXMgaW52YWxpZCBtZWFucyByYW5nZSBpc24ndCBzdW1tYXJpemVkLCBqdXN0IG1vdmUK KwkJICogZnVydGhlcgorCQkgKi8KKwkJaWYgKCFJdGVtUG9pbnRlcklzVmFsaWQoaXB0cikpCisJ CXsKKwkJCWVsb2coREVCVUcxLCAiUmFuZ2UgJXUgaXMgbm90IHN1bW1hcml6ZWQiLCBzdGF0ZS0+ cmFuZ2VCbGtubyk7CisJCQlMb2NrQnVmZmVyKHN0YXRlLT5yZXZtYXBidWYsIEJVRkZFUl9MT0NL X1VOTE9DSyk7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIFBvaW50ZXIgaXMgdmFsaWQs IGl0IHNob3VsZCBwb2ludHMgdG8gaW5kZXggdHVwbGUgZm9yIHRoZSByYW5nZQorCQkgKiB3aXRo IGJsa25vIHJhbmdlQmxrbm8uIFJlbWVtYmVyIGl0IGFuZCB1bmxvY2sgcmV2bWFwIHBhZ2UgdG8g YXZvaWQKKwkJICogZGVhZGxvY2sKKwkJICovCisJCXN0YXRlLT5yZWdwYWdlQmxrID0gSXRlbVBv aW50ZXJHZXRCbG9ja051bWJlcihpcHRyKTsKKwkJc3RhdGUtPnJlZ3BhZ2VvZmZzZXQgPSBJdGVt UG9pbnRlckdldE9mZnNldE51bWJlcihpcHRyKTsKKworCQlMb2NrQnVmZmVyKHN0YXRlLT5yZXZt YXBidWYsIEJVRkZFUl9MT0NLX1VOTE9DSyk7CisKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhlIHJl Z3BhZ2UgYmxvY2sgbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcmVsYXRpb24KKwkJICogc2l6 ZS4gVG8gYXZvaWQgZmV0Y2hpbmcgdGhlIG51bWJlciBvZiBibG9ja3MgZm9yIGVhY2ggdHVwbGUs IHVzZQorCQkgKiBjYWNoZWQgdmFsdWUgZmlyc3QKKwkJICovCisJCWlmIChzdGF0ZS0+cmVncGFn ZUJsayA+PSBzdGF0ZS0+aWR4bmJsb2NrcykKKwkJeworCQkJLyoKKwkJCSAqIFJlZ3VsYXIgcGFn ZXMgbWF5IGhhdmUgYmVlbiBhZGRlZCwgc28gcmVmcmVzaCBpZHhuYmxvY2tzIGFuZAorCQkJICog cmVjaGVjaworCQkJICovCisJCQlzdGF0ZS0+aWR4bmJsb2NrcyA9IFJlbGF0aW9uR2V0TnVtYmVy T2ZCbG9ja3MoaWR4cmVsKTsKKwkJCWlmIChzdGF0ZS0+cmVncGFnZUJsayA+PSBzdGF0ZS0+aWR4 bmJsb2NrcykKKwkJCXsKKwkJCQlyZXZtYXBfaXRlbV9lcmVwb3J0KHN0YXRlLAorCQkJCQkJCQkJ cHNwcmludGYoInJldm1hcCBpdGVtIHBvaW50cyB0byBhIG5vbiBleGlzdGluZyBibG9jayAldSwg aW5kZXggbWF4IGJsb2NrICV1IiwKKwkJCQkJCQkJCQkJIHN0YXRlLT5yZWdwYWdlQmxrLAorCQkJ CQkJCQkJCQkgc3RhdGUtPmlkeG5ibG9ja3MpKTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIFRv IGF2b2lkIHNvbWUgcGluL3VucGluIGN5Y2xlcyB3ZSBjYWNoZSBsYXN0IHVzZWQgcmVndWxhciBw YWdlLgorCQkgKiBDaGVjayBpZiB3ZSBuZWVkIGRpZmZlcmVudCByZWd1bGFyIHBhZ2UgYW5kIGZl dGNoIGl0LgorCQkgKi8KKwkJaWYgKCFCdWZmZXJJc1ZhbGlkKHN0YXRlLT5yZWdwYWdlYnVmKSB8 fCBCdWZmZXJHZXRCbG9ja051bWJlcihzdGF0ZS0+cmVncGFnZWJ1ZikgIT0gc3RhdGUtPnJlZ3Bh Z2VCbGspCisJCXsKKwkJCWlmIChCdWZmZXJJc1ZhbGlkKHN0YXRlLT5yZWdwYWdlYnVmKSkKKwkJ CXsKKwkJCQlSZWxlYXNlQnVmZmVyKHN0YXRlLT5yZWdwYWdlYnVmKTsKKwkJCX0KKwkJCXN0YXRl LT5yZWdwYWdlYnVmID0gUmVhZEJ1ZmZlckV4dGVuZGVkKGlkeHJlbCwgTUFJTl9GT1JLTlVNLCBz dGF0ZS0+cmVncGFnZUJsaywgUkJNX05PUk1BTCwKKwkJCQkJCQkJCQkJCSAgIHN0YXRlLT5jaGVj a3N0cmF0ZWd5KTsKKwkJfQorCisJCUxvY2tCdWZmZXIoc3RhdGUtPnJlZ3BhZ2VidWYsIEJVRkZF Ul9MT0NLX1NIQVJFKTsKKwkJc3RhdGUtPnJlZ3BhZ2UgPSBCdWZmZXJHZXRQYWdlKHN0YXRlLT5y ZWdwYWdlYnVmKTsKKworCQkvKiBSZXZtYXAgc2hvdWxkIGFsd2F5cyBwb2ludCB0byBhIHJlZ3Vs YXIgcGFnZSAqLworCQlpZiAoIUJSSU5fSVNfUkVHVUxBUl9QQUdFKHN0YXRlLT5yZWdwYWdlKSkK KwkJeworCQkJcmV2bWFwX2l0ZW1fZXJlcG9ydChzdGF0ZSwKKwkJCQkJCQkJcHNwcmludGYoInJl dm1hcCBpdGVtIHBvaW50cyB0byB0aGUgcGFnZSB3aGljaCBpcyBub3QgcmVndWxhciAoYmxrbm86 ICV1KSIsCisJCQkJCQkJCQkJIHN0YXRlLT5yZWdwYWdlQmxrKSk7CisKKwkJfQorCisJCS8qIENo ZWNrIGl0ZW0gb2Zmc2V0IGlzIHZhbGlkICovCisJCWlmIChzdGF0ZS0+cmVncGFnZW9mZnNldCA+ IFBhZ2VHZXRNYXhPZmZzZXROdW1iZXIoc3RhdGUtPnJlZ3BhZ2UpKQorCQl7CisKKwkJCS8qIElm IGNvbmN1cnJlbnQgdXBkYXRlIG1vdmVkIG91ciB0dXBsZSB3ZSBuZWVkIHRvIHJldHJ5ICovCisJ CQlpZiAoIXJldm1hcF9wb2ludHNfdG9faW5kZXhfdHVwbGUoc3RhdGUpKQorCQkJeworCQkJCUxv Y2tCdWZmZXIoc3RhdGUtPnJlZ3BhZ2VidWYsIEJVRkZFUl9MT0NLX1VOTE9DSyk7CisJCQkJY29u dGludWU7CisJCQl9CisKKwkJCXJldm1hcF9pdGVtX2VyZXBvcnQoc3RhdGUsCisJCQkJCQkJCXBz cHJpbnRmKCJyZXZtYXAgaXRlbSBvZmZzZXQgbnVtYmVyICV1IGlzIGdyZWF0ZXIgdGhhbiByZWd1 bGFyIHBhZ2UgJXUgbWF4IG9mZnNldCAldSIsCisJCQkJCQkJCQkJIHN0YXRlLT5yZWdwYWdlb2Zm c2V0LAorCQkJCQkJCQkJCSBzdGF0ZS0+cmVncGFnZUJsaywKKwkJCQkJCQkJCQkgUGFnZUdldE1h eE9mZnNldE51bWJlcihzdGF0ZS0+cmVncGFnZSkpKTsKKwkJfQorCisJCWVsb2coREVCVUcxLCAi UHJvY2VzcyByYW5nZTogJXUsIGlwdHI6ICgldSwldSkiLCBzdGF0ZS0+cmFuZ2VCbGtubywgc3Rh dGUtPnJlZ3BhZ2VCbGssIHN0YXRlLT5yZWdwYWdlb2Zmc2V0KTsKKworCQkvKgorCQkgKiBSZXZt YXAgcG9pbnRlciBpcyBPSy4gSXQgcG9pbnRzIHRvIGV4aXN0aW5nIHJlZ3VsYXIgcGFnZSwgb2Zm c2V0CisJCSAqIGFsc28gaXMgb2suIExldCdzIGNoZWNrIGluZGV4IHR1cGxlIGl0IHBvaW50cyB0 by4KKwkJICovCisKKwkJbHAgPSBQYWdlR2V0SXRlbUlkQ2FyZWZ1bChzdGF0ZSk7CisKKwkJLyog UmV2bWFwIHNob3VsZCBwb2ludCB0byBOT1JNQUwgdHVwbGVzIG9ubHkgKi8KKwkJaWYgKCFJdGVt SWRJc1VzZWQobHApKQorCQl7CisKKwkJCS8qIElmIGNvbmN1cnJlbnQgdXBkYXRlIG1vdmVkIG91 ciB0dXBsZSB3ZSBuZWVkIHRvIHJldHJ5ICovCisJCQlpZiAoIXJldm1hcF9wb2ludHNfdG9faW5k ZXhfdHVwbGUoc3RhdGUpKQorCQkJeworCQkJCUxvY2tCdWZmZXIoc3RhdGUtPnJlZ3BhZ2VidWYs IEJVRkZFUl9MT0NLX1VOTE9DSyk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWluZGV4X3R1 cGxlX2VyZXBvcnQoc3RhdGUsICJyZXZtYXAgaXRlbSBwb2ludHMgdG8gdW51c2VkIGluZGV4IHR1 cGxlIik7CisJCX0KKworCisJCXR1cCA9IChCcmluVHVwbGUgKikgUGFnZUdldEl0ZW0oc3RhdGUt PnJlZ3BhZ2UsIGxwKTsKKworCQkvKiBDaGVjayBpZiByYW5nZSBibG9jayBudW1iZXIgaXMgYXMg ZXhwZWN0ZWQgKi8KKwkJaWYgKHR1cC0+YnRfYmxrbm8gIT0gc3RhdGUtPnJhbmdlQmxrbm8pCisJ CXsKKworCQkJLyogSWYgY29uY3VycmVudCB1cGRhdGUgbW92ZWQgb3VyIHR1cGxlIHdlIG5lZWQg dG8gcmV0cnkgKi8KKwkJCWlmICghcmV2bWFwX3BvaW50c190b19pbmRleF90dXBsZShzdGF0ZSkp CisJCQl7CisJCQkJTG9ja0J1ZmZlcihzdGF0ZS0+cmVncGFnZWJ1ZiwgQlVGRkVSX0xPQ0tfVU5M T0NLKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaW5kZXhfdHVwbGVfZXJlcG9ydChzdGF0 ZSwgcHNwcmludGYoImluZGV4IHR1cGxlIGhhcyBpbnZhbGlkIGJsa25vICV1IiwgdHVwLT5idF9i bGtubykpOworCQl9CisKKwkJLyoKKwkJICogSWYgdGhlIHJhbmdlIGlzIGJleW9uZCB0aGUgdGFi bGUgc2l6ZSAtIHRoZSByYW5nZSBtdXN0IGJlIGVtcHR5LgorCQkgKiBJdCdzIHZhbGlkIHNpdHVh dGlvbiBmb3IgZW1wdHkgdGFibGUgbm93LgorCQkgKi8KKwkJaWYgKHN0YXRlLT5yYW5nZUJsa25v ID49IHN0YXRlLT5oZWFwbmJsb2NrcykKKwkJeworCQkJaWYgKCFCcmluVHVwbGVJc0VtcHR5UmFu Z2UodHVwKSkKKwkJCXsKKwkJCQlpbmRleF90dXBsZV9lcmVwb3J0KHN0YXRlLAorCQkJCQkJCQkJ cHNwcmludGYoInRoZSByYW5nZSBpcyBiZXlvbmQgdGhlIHRhYmxlIHNpemUsICIKKwkJCQkJCQkJ CQkJICJidXQgaXMgbm90IG1hcmtlZCBhcyBlbXB0eSwgdGFibGUgc2l6ZTogJXUgYmxvY2tzIiwK KwkJCQkJCQkJCQkJIHN0YXRlLT5oZWFwbmJsb2NrcykpOworCQkJfQorCQl9CisKKwkJLyogQ2hl Y2sgaW5kZXggdHVwbGUgaXRzZWxmICovCisJCWNoZWNrX2luZGV4X3R1cGxlKHN0YXRlLCB0dXAs IGxwKTsKKworCQlMb2NrQnVmZmVyKHN0YXRlLT5yZWdwYWdlYnVmLCBCVUZGRVJfTE9DS19VTkxP Q0spOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBDaGVjayB0aGF0IGluZGV4IHR1cGxlIGhh cyBleHBlY3RlZCBzdHJ1Y3R1cmUuCisgKgorICogVGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBs b2dpYyBwZXJmb3JtZWQgYnkgYnJpbl9kZWZvcm1fdHVwbGUoKS4KKyAqIEFmdGVyIHRoaXMgY2hl Y2sgaXMgY29tcGxldGUgd2UgYXJlIHN1cmUgdGhhdCBicmluX2RlZm9ybV90dXBsZSBjYW4gcHJv Y2VzcyBpdC4KKyAqCisgKiBJbiBjYXNlIG9mIGVtcHR5IHJhbmdlIGNoZWNrIHRoYXQgZm9yIGFs bCBhdHRyaWJ1dGVzIGFsbG51bGxzIGFyZSB0cnVlLCBoYXNudWxscyBhcmUgZmFsc2UgYW5kCisg KiB0aGVyZSBpcyBubyBkYXRhLiBBbGwgY29yZSBvcGNsYXNzZXMgZXhwZWN0IGFsbG51bGxzIGlz IHRydWUgZm9yIGVtcHR5IHJhbmdlLgorICovCitzdGF0aWMgdm9pZAorY2hlY2tfaW5kZXhfdHVw bGUoQnJpbkNoZWNrU3RhdGUgKiBzdGF0ZSwgQnJpblR1cGxlICp0dXBsZSwgSXRlbUlkIGxwKQor eworCisJY2hhcgkgICAqdHA7CQkJCS8qIHR1cGxlIGRhdGEgKi8KKwlTaXplCQlvZmY7CisJYml0 czgJICAgKm51bGxiaXRzOworCVR1cGxlRGVzYwlkaXNrdGRlc2M7CisJaW50CQkJc3RvcmVkOwor CWJvb2wJCWVtcHR5X3JhbmdlID0gQnJpblR1cGxlSXNFbXB0eVJhbmdlKHR1cGxlKTsKKwlib29s CQloYXNudWxsYml0bWFwID0gQnJpblR1cGxlSGFzTnVsbHModHVwbGUpOworCVNpemUJCWhvZmYg PSBCcmluVHVwbGVEYXRhT2Zmc2V0KHR1cGxlKTsKKwlTaXplCQl0dXBsZW4gPSBJdGVtSWRHZXRM ZW5ndGgobHApOworCisKKwkvKiBDaGVjayB0aGF0IGhlYWRlciBsZW5ndGggaXMgbm90IGdyZWF0 ZXIgdGhhbiB0dXBsZSBsZW5ndGggKi8KKwlpZiAoaG9mZiA+IHR1cGxlbikKKwl7CisJCWluZGV4 X3R1cGxlX2VyZXBvcnQoc3RhdGUsIHBzcHJpbnRmKCJpbmRleCB0dXBsZSBoZWFkZXIgbGVuZ3Ro ICVsdSBpcyBncmVhdGVyIHRoYW4gdHVwbGUgbGVuICVsdSIsIGhvZmYsIHR1cGxlbikpOworCX0K KworCS8qIElmIHR1cGxlIGhhcyBudWxsIGJpdG1hcCAtIGluaXRpYWxpemUgaXQgKi8KKwlpZiAo aGFzbnVsbGJpdG1hcCkKKwl7CisJCW51bGxiaXRzID0gKGJpdHM4ICopICgoY2hhciAqKSB0dXBs ZSArIFNpemVPZkJyaW5UdXBsZSk7CisJfQorCWVsc2UKKwl7CisJCW51bGxiaXRzID0gTlVMTDsK Kwl9CisKKwkvKiBFbXB0eSByYW5nZSBpbmRleCB0dXBsZSBjaGVja3MgKi8KKwlpZiAoZW1wdHlf cmFuZ2UpCisJeworCQkvKiBFbXB0eSByYW5nZSB0dXBsZSBzaG91bGQgaGF2ZSBudWxsIGJpdG1h cCAqLworCQlpZiAoIWhhc251bGxiaXRtYXApCisJCXsKKwkJCWluZGV4X3R1cGxlX2VyZXBvcnQo c3RhdGUsICJlbXB0eSByYW5nZSBpbmRleCB0dXBsZSBkb2Vzbid0IGhhdmUgbnVsbCBiaXRtYXAi KTsKKwkJfQorCisJCUFzc2VydChudWxsYml0cyAhPSBOVUxMKTsKKworCQkvKiBDaGVjayBldmVy eSBhdHRyaWJ1dGUgaGFzIGFsbG51bGxzIGlzIHRydWUgYW5kIGhhc251bGxzIGlzIGZhbHNlICov CisJCWZvciAoaW50IGF0dGluZGV4ID0gMDsgYXR0aW5kZXggPCBzdGF0ZS0+bmF0dHM7ICsrYXR0 aW5kZXgpCisJCXsKKworCQkJLyogQXR0cmlidXRlIGFsbG51bGxzIHNob3VsZCBiZSB0cnVlIGZv ciBlbXB0eSByYW5nZSAqLworCQkJaWYgKGF0dF9pc251bGwoYXR0aW5kZXgsIG51bGxiaXRzKSkK KwkJCXsKKwkJCQlpbmRleF90dXBsZV9lcmVwb3J0KHN0YXRlLAorCQkJCQkJCQkJcHNwcmludGYo ImVtcHR5IHJhbmdlIGluZGV4IHR1cGxlIGF0dHJpYnV0ZSAlZCB3aXRoIGFsbG51bGxzIGlzIGZh bHNlIiwKKwkJCQkJCQkJCQkJIGF0dGluZGV4KSk7CisJCQl9CisKKwkJCS8qIEF0dHJpYnV0ZSBo YXNudWxscyBzaG91bGQgYmUgZmFsc2UgZm9yIGVtcHR5IHJhbmdlICovCisJCQlpZiAoIWF0dF9p c251bGwoc3RhdGUtPm5hdHRzICsgYXR0aW5kZXgsIG51bGxiaXRzKSkKKwkJCXsKKwkJCQlpbmRl eF90dXBsZV9lcmVwb3J0KHN0YXRlLAorCQkJCQkJCQkJcHNwcmludGYoImVtcHR5IHJhbmdlIGlu ZGV4IHR1cGxlIGF0dHJpYnV0ZSAlZCB3aXRoIGhhc251bGxzIGlzIHRydWUiLAorCQkJCQkJCQkJ CQkgYXR0aW5kZXgpKTsKKwkJCX0KKwkJfQorCisJCS8qIFdlIGFyZSBkb25lIHdpdGggZW1wdHkg cmFuZ2UgdHVwbGUgKi8KKwkJcmV0dXJuOworCX0KKworCS8qCisJICogUmFuZ2UgaXMgbWFya2Vk IGFzIG5vdCBlbXB0eSBzbyB3ZSBjYW4gaGF2ZSBzb21lIGRhdGEgaW4gdGhlIHR1cGxlLgorCSAq IFdhbGsgYWxsIGF0dHJpYnV0ZXMgYW5kIGNoZWNrcyB0aGF0IGFsbCBzdG9yZWQgdmFsdWVzIGZp dCBpbnRvIHRoZQorCSAqIHR1cGxlCisJICovCisKKwl0cCA9IChjaGFyICopIHR1cGxlICsgQnJp blR1cGxlRGF0YU9mZnNldCh0dXBsZSk7CisJc3RvcmVkID0gMDsKKwlvZmYgPSAwOworCisJZGlz a3RkZXNjID0gYnJ0dXBsZV9kaXNrX3R1cGRlc2Moc3RhdGUtPmJkZXNjKTsKKworCWZvciAoaW50 IGF0dGluZGV4ID0gMDsgYXR0aW5kZXggPCBzdGF0ZS0+bmF0dHM7ICsrYXR0aW5kZXgpCisJewor CQlCcmluT3BjSW5mbyAqb3BjbGFzcyA9IHN0YXRlLT5iZGVzYy0+YmRfaW5mb1thdHRpbmRleF07 CisKKwkJLyoKKwkJICogaWYgYWxsbnVsbHMgaXMgc2V0IHdlIGhhdmUgbm8gZGF0YSBmb3IgdGhp cyBhdHRyaWJ1dGUsIG1vdmUgdG8gdGhlCisJCSAqIG5leHQKKwkJICovCisJCWlmIChoYXNudWxs Yml0bWFwICYmICFhdHRfaXNudWxsKGF0dGluZGV4LCBudWxsYml0cykpCisJCXsKKwkJCXN0b3Jl ZCArPSBvcGNsYXNzLT5vaV9uc3RvcmVkOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBXYWxr IGFsbCBzdG9yZWQgdmFsdWVzIGZvciB0aGUgY3VycmVudCBhdHRyaWJ1dGUgKi8KKwkJZm9yIChp bnQgZGF0dW1ubyA9IDA7IGRhdHVtbm8gPCBvcGNsYXNzLT5vaV9uc3RvcmVkOyBkYXR1bW5vKysp CisJCXsKKwkJCUNvbXBhY3RBdHRyaWJ1dGUgKnRoaXNhdHQgPSBUdXBsZURlc2NDb21wYWN0QXR0 cihkaXNrdGRlc2MsIHN0b3JlZCk7CisKKwkJCWlmICh0aGlzYXR0LT5hdHRsZW4gPT0gLTEpCisJ CQl7CisJCQkJb2ZmID0gYXR0X3BvaW50ZXJfYWxpZ25ieShvZmYsCisJCQkJCQkJCQkJICB0aGlz YXR0LT5hdHRhbGlnbmJ5LAorCQkJCQkJCQkJCSAgLTEsCisJCQkJCQkJCQkJICB0cCArIG9mZik7 CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJb2ZmID0gYXR0X25vbWluYWxfYWxpZ25ieShvZmYs IHRoaXNhdHQtPmF0dGFsaWduYnkpOworCQkJfQorCisJCQkvKiBDaGVjayB0aGF0IHdlIGFyZSBz dGlsbCBpbiB0aGUgdHVwbGUgKi8KKwkJCWlmIChob2ZmICsgb2ZmID4gdHVwbGVuKQorCQkJewor CQkJCWluZGV4X3R1cGxlX2VyZXBvcnQoc3RhdGUsCisJCQkJCQkJCQlwc3ByaW50ZigiYXR0cmli dXRlICV1IHN0b3JlZCB2YWx1ZSAldSB3aXRoIGxlbmd0aCAldSAiCisJCQkJCQkJCQkJCSAic3Rh cnRzIGF0IG9mZnNldCAlbHUgYmV5b25kIHRvdGFsIHR1cGxlIGxlbmd0aCAlbHUiLAorCQkJCQkJ CQkJCQkgYXR0aW5kZXgsIGRhdHVtbm8sIHRoaXNhdHQtPmF0dGxlbiwgb2ZmLCB0dXBsZW4pKTsK KwkJCX0KKworCQkJb2ZmID0gYXR0X2FkZGxlbmd0aF9wb2ludGVyKG9mZiwgdGhpc2F0dC0+YXR0 bGVuLCB0cCArIG9mZik7CisKKwkJCS8qIENoZWNrIHRoYXQgd2UgYXJlIHN0aWxsIGluIHRoZSB0 dXBsZSAqLworCQkJaWYgKGhvZmYgKyBvZmYgPiB0dXBsZW4pCisJCQl7CisJCQkJaW5kZXhfdHVw bGVfZXJlcG9ydChzdGF0ZSwKKwkJCQkJCQkJCXBzcHJpbnRmKCJhdHRyaWJ1dGUgJXUgc3RvcmVk IHZhbHVlICV1IHdpdGggbGVuZ3RoICV1ICIKKwkJCQkJCQkJCQkJICJlbmRzIGF0IG9mZnNldCAl bHUgYmV5b25kIHRvdGFsIHR1cGxlIGxlbmd0aCAlbHUiLAorCQkJCQkJCQkJCQkgYXR0aW5kZXgs IGRhdHVtbm8sIHRoaXNhdHQtPmF0dGxlbiwgb2ZmLCB0dXBsZW4pKTsKKwkJCX0KKwkJCXN0b3Jl ZCsrOworCQl9CisKKwl9CisKK30KKworLyoKKyAqIENoZWNrIGFsbCBwYWdlcyB3aXRoaW4gdGhl IHJhbmdlIFtsYXN0UmV2bWFwUGFnZSArIDEsIGluZGV4bmJsb2Nrc10gYXJlIHJlZ3VsYXIgcGFn ZXMgb3IgbmV3CisgKiBhbmQgdGhlcmUgaXMgYSBwb2ludGVyIGluIHJldm1hcCB0byBlYWNoIE5P Uk1BTCBpbmRleCB0dXBsZS4KKyAqLworc3RhdGljIHZvaWQKK2NoZWNrX3JlZ3VsYXJfcGFnZXMo QnJpbkNoZWNrU3RhdGUgKiBzdGF0ZSkKK3sKKwlpZiAoIXN0YXRlLT5yZWd1bGFyX3BhZ2VzX2No ZWNrKQorCXsKKwkJcmV0dXJuOworCX0KKworCS8qIHJlc2V0IHN0YXRlICovCisJc3RhdGUtPnJl dm1hcEJsayA9IEludmFsaWRCbG9ja051bWJlcjsKKwlzdGF0ZS0+cmV2bWFwYnVmID0gSW52YWxp ZEJ1ZmZlcjsKKwlzdGF0ZS0+cmV2bWFwaWR4ID0gLTE7CisJc3RhdGUtPnJlZ3BhZ2VCbGsgPSBJ bnZhbGlkQmxvY2tOdW1iZXI7CisJc3RhdGUtPnJlZ3BhZ2VidWYgPSBJbnZhbGlkQnVmZmVyOwor CXN0YXRlLT5yZWdwYWdlb2Zmc2V0ID0gSW52YWxpZE9mZnNldE51bWJlcjsKKwlzdGF0ZS0+aWR4 bmJsb2NrcyA9IFJlbGF0aW9uR2V0TnVtYmVyT2ZCbG9ja3Moc3RhdGUtPmlkeHJlbCk7CisKKwlm b3IgKHN0YXRlLT5yZWdwYWdlQmxrID0gc3RhdGUtPmxhc3RSZXZtYXBQYWdlICsgMTsgc3RhdGUt PnJlZ3BhZ2VCbGsgPCBzdGF0ZS0+aWR4bmJsb2Nrczsgc3RhdGUtPnJlZ3BhZ2VCbGsrKykKKwl7 CisJCU9mZnNldE51bWJlciBtYXhvZmY7CisKKwkJc3RhdGUtPnJlZ3BhZ2VidWYgPSBSZWFkQnVm ZmVyRXh0ZW5kZWQoc3RhdGUtPmlkeHJlbCwgTUFJTl9GT1JLTlVNLCBzdGF0ZS0+cmVncGFnZUJs aywgUkJNX05PUk1BTCwKKwkJCQkJCQkJCQkJICAgc3RhdGUtPmNoZWNrc3RyYXRlZ3kpOworCQlM b2NrQnVmZmVyKHN0YXRlLT5yZWdwYWdlYnVmLCBCVUZGRVJfTE9DS19TSEFSRSk7CisJCXN0YXRl LT5yZWdwYWdlID0gQnVmZmVyR2V0UGFnZShzdGF0ZS0+cmVncGFnZWJ1Zik7CisKKwkJLyogU2tp cCBuZXcgcGFnZXMgKi8KKwkJaWYgKFBhZ2VJc05ldyhzdGF0ZS0+cmVncGFnZSkpCisJCXsKKwkJ CVVubG9ja1JlbGVhc2VCdWZmZXIoc3RhdGUtPnJlZ3BhZ2VidWYpOworCQkJY29udGludWU7CisJ CX0KKworCQlpZiAoIUJSSU5fSVNfUkVHVUxBUl9QQUdFKHN0YXRlLT5yZWdwYWdlKSkKKwkJewor CQkJYnJpbl9jaGVja19lcmVwb3J0KHBzcHJpbnRmKCJleHBlY3RlZCBuZXcgb3IgcmVndWxhciBw YWdlIGF0IGJsb2NrICV1Iiwgc3RhdGUtPnJlZ3BhZ2VCbGspKTsKKwkJfQorCisJCS8qIENoZWNr IHRoYXQgYWxsIE5PUk1BTCBpbmRleCB0dXBsZXMgd2l0aGluIHRoZSBwYWdlIGFyZSBub3Qgb3Jw aGFucyAqLworCQltYXhvZmYgPSBQYWdlR2V0TWF4T2Zmc2V0TnVtYmVyKHN0YXRlLT5yZWdwYWdl KTsKKwkJZm9yIChzdGF0ZS0+cmVncGFnZW9mZnNldCA9IEZpcnN0T2Zmc2V0TnVtYmVyOyBzdGF0 ZS0+cmVncGFnZW9mZnNldCA8PSBtYXhvZmY7IHN0YXRlLT5yZWdwYWdlb2Zmc2V0KyspCisJCXsK KwkJCUl0ZW1JZAkJbHA7CisJCQlCcmluVHVwbGUgICp0dXA7CisJCQlCbG9ja051bWJlciByZXZt YXBCbGs7CisKKwkJCWxwID0gUGFnZUdldEl0ZW1JZENhcmVmdWwoc3RhdGUpOworCisJCQlpZiAo SXRlbUlkSXNVc2VkKGxwKSkKKwkJCXsKKwkJCQl0dXAgPSAoQnJpblR1cGxlICopIFBhZ2VHZXRJ dGVtKHN0YXRlLT5yZWdwYWdlLCBscCk7CisKKwkJCQkvKiBHZXQgcmV2bWFwIGJsb2NrIG51bWJl ciBmb3IgaW5kZXggdHVwbGUgYmxrbm8gKi8KKwkJCQlyZXZtYXBCbGsgPSAoKHR1cC0+YnRfYmxr bm8gLyBzdGF0ZS0+cGFnZXNQZXJSYW5nZSkgLyBSRVZNQVBfUEFHRV9NQVhJVEVNUykgKyAxOwor CQkJCWlmIChyZXZtYXBCbGsgPiBzdGF0ZS0+bGFzdFJldm1hcFBhZ2UpCisJCQkJeworCQkJCQlp bmRleF90dXBsZV9vbmx5X2VyZXBvcnQoc3RhdGUsIHBzcHJpbnRmKCJubyByZXZtYXAgcGFnZSBm b3IgdGhlIGluZGV4IHR1cGxlIHdpdGggYmxrbm8gJXUiLAorCQkJCQkJCQkJCQkJCQkJIHR1cC0+ YnRfYmxrbm8pKTsKKwkJCQl9CisKKwkJCQkvKiBGZXRjaCBhbm90aGVyIHJldm1hcCBwYWdlIGlm IG5lZWRlZCAqLworCQkJCWlmIChzdGF0ZS0+cmV2bWFwQmxrICE9IHJldm1hcEJsaykKKwkJCQl7 CisJCQkJCWlmIChCbG9ja051bWJlcklzVmFsaWQoc3RhdGUtPnJldm1hcEJsaykpCisJCQkJCXsK KwkJCQkJCVJlbGVhc2VCdWZmZXIoc3RhdGUtPnJldm1hcGJ1Zik7CisJCQkJCX0KKwkJCQkJc3Rh dGUtPnJldm1hcEJsayA9IHJldm1hcEJsazsKKwkJCQkJc3RhdGUtPnJldm1hcGJ1ZiA9IFJlYWRC dWZmZXJFeHRlbmRlZChzdGF0ZS0+aWR4cmVsLCBNQUlOX0ZPUktOVU0sIHN0YXRlLT5yZXZtYXBC bGssIFJCTV9OT1JNQUwsCisJCQkJCQkJCQkJCQkJCSAgc3RhdGUtPmNoZWNrc3RyYXRlZ3kpOwor CQkJCX0KKworCQkJCXN0YXRlLT5yZXZtYXBpZHggPSAodHVwLT5idF9ibGtubyAvIHN0YXRlLT5w YWdlc1BlclJhbmdlKSAlIFJFVk1BUF9QQUdFX01BWElURU1TOworCQkJCXN0YXRlLT5yYW5nZUJs a25vID0gdHVwLT5idF9ibGtubzsKKworCQkJCS8qIGNoZWNrIHRoYXQgcmV2bWFwIGl0ZW0gcG9p bnRzIHRvIGluZGV4IHR1cGxlICovCisJCQkJaWYgKCFyZXZtYXBfcG9pbnRzX3RvX2luZGV4X3R1 cGxlKHN0YXRlKSkKKwkJCQl7CisJCQkJCWluZGV4X3R1cGxlX2VyZXBvcnQoc3RhdGUsIHBzcHJp bnRmKCJyZXZtYXAgZG9lc24ndCBwb2ludCB0byBpbmRleCB0dXBsZSIpKTsKKwkJCQl9CisKKwkJ CX0KKwkJfQorCisJCVVubG9ja1JlbGVhc2VCdWZmZXIoc3RhdGUtPnJlZ3BhZ2VidWYpOworCX0K KworCWlmIChzdGF0ZS0+cmV2bWFwYnVmICE9IEludmFsaWRCdWZmZXIpCisJeworCQlSZWxlYXNl QnVmZmVyKHN0YXRlLT5yZXZtYXBidWYpOworCX0KK30KKworLyoKKyAqIENoZWNrIGlmIHRoZSBy ZXZtYXAgaXRlbSBwb2ludHMgdG8gdGhlIGluZGV4IHR1cGxlIChyZWdwYWdlQmxrLCByZWdwYWdl b2Zmc2V0KS4KKyAqIFdlIGhhdmUgbG9ja2VkIHJlZyBwYWdlLCBhbmQgbG9jayByZXZtYXAgcGFn ZSBoZXJlLgorICogSXQncyBhIHZhbGlkIGxvY2sgb3JkZXJpbmcsIHNvIG5vIGRlYWRsb2NrIGlz IHBvc3NpYmxlLgorICovCitzdGF0aWMgYm9vbAorcmV2bWFwX3BvaW50c190b19pbmRleF90dXBs ZShCcmluQ2hlY2tTdGF0ZSAqIHN0YXRlKQoreworCUl0ZW1Qb2ludGVyRGF0YSAqcmV2bWFwdGlk czsKKwlSZXZtYXBDb250ZW50cyAqY29udGVudHM7CisJSXRlbVBvaW50ZXJEYXRhICp0aWQ7CisJ Ym9vbAkJcG9pbnRzOworCisJTG9ja0J1ZmZlcihzdGF0ZS0+cmV2bWFwYnVmLCBCVUZGRVJfTE9D S19TSEFSRSk7CisJY29udGVudHMgPSAoUmV2bWFwQ29udGVudHMgKikgUGFnZUdldENvbnRlbnRz KEJ1ZmZlckdldFBhZ2Uoc3RhdGUtPnJldm1hcGJ1ZikpOworCXJldm1hcHRpZHMgPSBjb250ZW50 cy0+cm1fdGlkczsKKwl0aWQgPSByZXZtYXB0aWRzICsgc3RhdGUtPnJldm1hcGlkeDsKKworCXBv aW50cyA9IEl0ZW1Qb2ludGVyR2V0QmxvY2tOdW1iZXIodGlkKSA9PSBzdGF0ZS0+cmVncGFnZUJs ayAmJgorCQlJdGVtUG9pbnRlckdldE9mZnNldE51bWJlcih0aWQpID09IHN0YXRlLT5yZWdwYWdl b2Zmc2V0OworCisJTG9ja0J1ZmZlcihzdGF0ZS0+cmV2bWFwYnVmLCBCVUZGRVJfTE9DS19VTkxP Q0spOworCXJldHVybiBwb2ludHM7Cit9CisKKy8qCisgKiBQYWdlR2V0SXRlbUlkKCkgd3JhcHBl ciB0aGF0IHZhbGlkYXRlcyByZXR1cm5lZCBsaW5lIHBvaW50ZXIuCisgKgorICogaXRlbUlkIGlu IGJyaW4gaW5kZXggY291bGQgYmUgVU5VU0VEIG9yIE5PUk1BTC4KKyAqLworc3RhdGljIEl0ZW1J ZAorUGFnZUdldEl0ZW1JZENhcmVmdWwoQnJpbkNoZWNrU3RhdGUgKiBzdGF0ZSkKK3sKKwlQYWdl CQlwYWdlID0gc3RhdGUtPnJlZ3BhZ2U7CisJT2Zmc2V0TnVtYmVyIG9mZnNldCA9IHN0YXRlLT5y ZWdwYWdlb2Zmc2V0OworCUl0ZW1JZAkJaXRlbWlkID0gUGFnZUdldEl0ZW1JZChwYWdlLCBvZmZz ZXQpOworCisJaWYgKEl0ZW1JZEdldE9mZnNldChpdGVtaWQpICsgSXRlbUlkR2V0TGVuZ3RoKGl0 ZW1pZCkgPgorCQlCTENLU1ogLSBNQVhBTElHTihzaXplb2YoQnJpblNwZWNpYWxTcGFjZSkpKQor CQlpbmRleF90dXBsZV9lcmVwb3J0KHN0YXRlLAorCQkJCQkJCXBzcHJpbnRmKCJsaW5lIHBvaW50 ZXIgcG9pbnRzIHBhc3QgZW5kIG9mIHR1cGxlIHNwYWNlIGluIGluZGV4LiAiCisJCQkJCQkJCQkg ImxwX29mZj0ldSwgbHBfbGVuPSV1IGxwX2ZsYWdzPSV1IiwKKwkJCQkJCQkJCSBJdGVtSWRHZXRP ZmZzZXQoaXRlbWlkKSwKKwkJCQkJCQkJCSBJdGVtSWRHZXRMZW5ndGgoaXRlbWlkKSwKKwkJCQkJ CQkJCSBJdGVtSWRHZXRGbGFncyhpdGVtaWQpCisJCQkJCQkJCQkgKQorCQkJKTsKKworCS8qIFZl cmlmeSB0aGF0IGxpbmUgcG9pbnRlciBpcyBMUF9OT1JNQUwgb3IgTFBfVU5VU0VEICovCisJaWYg KCEoKEl0ZW1JZElzTm9ybWFsKGl0ZW1pZCkgJiYgSXRlbUlkR2V0TGVuZ3RoKGl0ZW1pZCkgIT0g MCkgfHwKKwkJICAoIUl0ZW1JZElzVXNlZChpdGVtaWQpICYmIEl0ZW1JZEdldExlbmd0aChpdGVt aWQpID09IDApKSkKKwl7CisJCWluZGV4X3R1cGxlX2VyZXBvcnQoc3RhdGUsCisJCQkJCQkJcHNw cmludGYoImludmFsaWQgbGluZSBwb2ludGVyIHN0b3JhZ2UgaW4gaW5kZXguICIKKwkJCQkJCQkJ CSAibHBfb2ZmPSV1LCBscF9sZW49JXUgbHBfZmxhZ3M9JXUiLAorCQkJCQkJCQkJIEl0ZW1JZEdl dE9mZnNldChpdGVtaWQpLAorCQkJCQkJCQkJIEl0ZW1JZEdldExlbmd0aChpdGVtaWQpLAorCQkJ CQkJCQkJIEl0ZW1JZEdldEZsYWdzKGl0ZW1pZCkKKwkJCQkJCQkJCSApKTsKKwl9CisKKwlyZXR1 cm4gaXRlbWlkOworfQorCisvKgorICogQ2hlY2sgdGhhdCBldmVyeSBoZWFwIHR1cGxlIGFyZSBj b25zaXN0ZW50IHdpdGggdGhlIGluZGV4LgorICoKKyAqIEFsc28gY2hlY2sgdGhhdCBmaWVsZHMg J2VtcHR5X3JhbmdlJywgJ2FsbF9udWxscycgYW5kICdoYXNfbnVsbHMnCisgKiBhcmUgbm90IHRv byAibmFycm93IiBmb3IgZWFjaCByYW5nZSwgd2hpY2ggbWVhbnM6CisgKiAxKSBoYXNfbnVsbHMg PSBmYWxzZSwgYnV0IHdlIHNlZSBudWxsIHZhbHVlIChvbmx5IGZvciBvaV9yZWd1bGFyX251bGxz IGlzIHRydWUpCisgKiAyKSBhbGxfbnVsbHMgPSB0cnVlLCBidXQgd2Ugc2VlIG5vbm51bGwgdmFs dWUuCisgKiAzKSBlbXB0eV9yYW5nZSA9IHRydWUsIGJ1dCB3ZSBzZWUgdHVwbGUgd2l0aGluIHRo ZSByYW5nZS4KKyAqCisgKiBXZSB1c2UgYWxsb3dTeW5jID0gZmFsc2UsIGJlY2F1c2UgdGhpcyB3 YXkKKyAqIHdlIHByb2Nlc3MgZnVsbCByYW5nZXMgb25lIGJ5IG9uZSBmcm9tIHRoZSBmaXJzdCBy YW5nZS4KKyAqIEl0J3Mgbm90IG5lY2Vzc2FyeSwgYnV0IG1ha2VzIHRoZSBjb2RlIHNpbXBsZXIg YW5kIHRoaXMgd2F5CisgKiB3ZSBuZWVkIHRvIGZldGNoIGV2ZXJ5IGluZGV4IHR1cGxlIG9ubHkg b25jZS4KKyAqLworc3RhdGljIHZvaWQKK2NoZWNrX2FsbF9oZWFwX2NvbnNpc3RlbnQoQnJpbkNo ZWNrU3RhdGUgKiBzdGF0ZSkKK3sKKwlSZWxhdGlvbglpZHhyZWwgPSBzdGF0ZS0+aWR4cmVsOwor CVJlbGF0aW9uCWhlYXByZWwgPSBzdGF0ZS0+aGVhcHJlbDsKKwlkb3VibGUJCXJlbHR1cGxlczsK KwlJbmRleEluZm8gICppbmRleEluZm87CisKKwkvKiBBbGwgaGVhcCBjb25zaXN0ZW50IGNoZWNr IGZpZWxkcyBpbml0aWFsaXphdGlvbiAqLworCisJc3RhdGUtPnJldm1hcCA9IGJyaW5SZXZtYXBJ bml0aWFsaXplKGlkeHJlbCwgJnN0YXRlLT5wYWdlc1BlclJhbmdlKTsKKwlzdGF0ZS0+ZHR1cCA9 IGJyaW5fbmV3X21lbXR1cGxlKHN0YXRlLT5iZGVzYyk7CisJc3RhdGUtPmNoZWNrYWJsZV9yYW5n ZSA9IGZhbHNlOworCXN0YXRlLT5jb25zaXN0ZW50Rm4gPSBwYWxsb2MwX2FycmF5KEZtZ3JJbmZv LCBzdGF0ZS0+bmF0dHMpOworCXN0YXRlLT5yYW5nZV9jbnQgPSAwOworCS8qIG5leHQgcmFuZ2Ug aXMgdGhlIGZpcnN0IHJhbmdlIGluIHRoZSBiZWdpbm5pbmcgKi8KKwlzdGF0ZS0+bmV4dHJhbmdl QmxrID0gMDsKKwlzdGF0ZS0+bm9ubnVsbF9zayA9IHBhbGxvYzBfYXJyYXkoU2NhbktleSwgc3Rh dGUtPm5hdHRzKTsKKwlzdGF0ZS0+aXNudWxsX3NrID0gcGFsbG9jMF9hcnJheShTY2FuS2V5LCBz dGF0ZS0+bmF0dHMpOworCXN0YXRlLT5yYW5nZUN0eCA9IEFsbG9jU2V0Q29udGV4dENyZWF0ZShD dXJyZW50TWVtb3J5Q29udGV4dCwKKwkJCQkJCQkJCQkJImJyaW4gY2hlY2sgcmFuZ2UgY29udGV4 dCIsCisJCQkJCQkJCQkJCUFMTE9DU0VUX0RFRkFVTFRfU0laRVMpOworCXN0YXRlLT5oZWFwdHVw bGVDdHggPSBBbGxvY1NldENvbnRleHRDcmVhdGUoQ3VycmVudE1lbW9yeUNvbnRleHQsCisJCQkJ CQkJCQkJCQkiYnJpbiBjaGVjayB0dXBsZSBjb250ZXh0IiwKKwkJCQkJCQkJCQkJCUFMTE9DU0VU X0RFRkFVTFRfU0laRVMpOworCisJLyoKKwkgKiBQcmVwYXJlICJub24tbnVsbCIgYW5kICJpc19u dWxsIiBzY2FuIGtleXMgYW5kIGNvbnNpc3RlbnQgZm4gZm9yIGVhY2gKKwkgKiBhdHRyaWJ1dGUK KwkgKi8KKwlmb3IgKEF0dHJOdW1iZXIgYXR0bm8gPSAxOyBhdHRubyA8PSBzdGF0ZS0+bmF0dHM7 IGF0dG5vKyspCisJeworCQlGbWdySW5mbyAgICp0bXA7CisKKwkJdG1wID0gaW5kZXhfZ2V0cHJv Y2luZm8oaWR4cmVsLCBhdHRubywgQlJJTl9QUk9DTlVNX0NPTlNJU1RFTlQpOworCQlmbWdyX2lu Zm9fY29weSgmc3RhdGUtPmNvbnNpc3RlbnRGblthdHRubyAtIDFdLCB0bXAsIEN1cnJlbnRNZW1v cnlDb250ZXh0KTsKKworCQlzdGF0ZS0+bm9ubnVsbF9za1thdHRubyAtIDFdID0gcHJlcGFyZV9u b25udWxsX3NjYW5fa2V5KHN0YXRlLCBhdHRubyk7CisJCXN0YXRlLT5pc251bGxfc2tbYXR0bm8g LSAxXSA9IHByZXBhcmVfaXNudWxsX3NjYW5fa2V5KGF0dG5vKTsKKwl9CisKKwlpbmRleEluZm8g PSBCdWlsZEluZGV4SW5mbyhpZHhyZWwpOworCisJLyoKKwkgKiBVc2Ugc25hcHNob3QgdG8gY2hl Y2sgb25seSB0aG9zZSB0dXBsZXMgdGhhdCBhcmUgZ3VhcmFudGVlZCB0byBiZQorCSAqIGluZGV4 ZWQgYWxyZWFkeS4gVXNpbmcgU25hcHNob3RBbnkgd291bGQgbWFrZSBpdCBtb3JlIGRpZmZpY3Vs dCB0byBzYXkKKwkgKiBpZiB0aGVyZSBpcyBhIGNvcnJ1cHRpb24gb3IgY2hlY2tlZCB0dXBsZSBq dXN0IGhhdmVuJ3QgYmVlbiBpbmRleGVkCisJICogeWV0LgorCSAqLworCWluZGV4SW5mby0+aWlf Q29uY3VycmVudCA9IHRydWU7CisJcmVsdHVwbGVzID0gdGFibGVfaW5kZXhfYnVpbGRfc2Nhbiho ZWFwcmVsLCBpZHhyZWwsIGluZGV4SW5mbywgZmFsc2UsIHRydWUsCisJCQkJCQkJCQkgICBicmlu X2NoZWNrX2NhbGxiYWNrLCAodm9pZCAqKSBzdGF0ZSwgTlVMTCk7CisKKwllbG9nKERFQlVHMSwg InJhbmdlcyB3ZXJlIGNoZWNrZWQ6ICVmIiwgc3RhdGUtPnJhbmdlX2NudCk7CisJZWxvZyhERUJV RzEsICJzY2FuIHRvdGFsIHR1cGxlczogJWYiLCByZWx0dXBsZXMpOworCisJaWYgKHN0YXRlLT5i dWYgIT0gSW52YWxpZEJ1ZmZlcikKKwkJUmVsZWFzZUJ1ZmZlcihzdGF0ZS0+YnVmKTsKKworCWJy aW5SZXZtYXBUZXJtaW5hdGUoc3RhdGUtPnJldm1hcCk7CisJTWVtb3J5Q29udGV4dERlbGV0ZShz dGF0ZS0+cmFuZ2VDdHgpOworCU1lbW9yeUNvbnRleHREZWxldGUoc3RhdGUtPmhlYXB0dXBsZUN0 eCk7Cit9CisKKy8qCisgKiBDaGVjayBvcGVyYXRvciBuYW1lcyBhcnJheSBpbnB1dCBwYXJhbWV0 ZXIgYW5kIGNvbnZlcnQgaXQgdG8gYXJyYXkgb2Ygc3RyaW5ncworICogRW1wdHkgaW5wdXQgYXJy YXkgbWVhbnMgd2UgdXNlICI9IiBvcGVyYXRvciBmb3IgZXZlcnkgYXR0cmlidXRlCisgKi8KK3N0 YXRpYyB2b2lkCitjaGVja19hbmRfcHJlcGFyZV9vcGVyYXRvcl9uYW1lcyhCcmluQ2hlY2tTdGF0 ZSAqIHN0YXRlKQoreworCU9pZAkJCWVsZW1lbnRfdHlwZSA9IEFSUl9FTEVNVFlQRShzdGF0ZS0+ aGVhcF9hbGxfY29uc2lzdGVudF9vcGVyX25hbWVzKTsKKwlpbnQxNgkJdHlwbGVuOworCWJvb2wJ CXR5cGJ5dmFsOworCWNoYXIJCXR5cGFsaWduOworCURhdHVtCSAgICp2YWx1ZXM7CisJYm9vbAkg ICAqZWxlbV9udWxsczsKKwlpbnQJCQludW1fZWxlbXM7CisKKwlzdGF0ZS0+b3BlcmF0b3JOYW1l cyA9IHBhbGxvYyhzaXplb2YoU3RyaW5nKSAqIHN0YXRlLT5uYXR0cyk7CisKKwlnZXRfdHlwbGVu Ynl2YWxhbGlnbihlbGVtZW50X3R5cGUsICZ0eXBsZW4sICZ0eXBieXZhbCwgJnR5cGFsaWduKTsK KwlkZWNvbnN0cnVjdF9hcnJheShzdGF0ZS0+aGVhcF9hbGxfY29uc2lzdGVudF9vcGVyX25hbWVz LCBlbGVtZW50X3R5cGUsIHR5cGxlbiwgdHlwYnl2YWwsIHR5cGFsaWduLAorCQkJCQkgICZ2YWx1 ZXMsICZlbGVtX251bGxzLCAmbnVtX2VsZW1zKTsKKworCS8qIElmIHdlIGhhdmUgc29tZSBpbnB1 dCBjaGVjayBpdCBhbmQgY29udmVydCB0byBTdHJpbmcqKiAqLworCWlmIChudW1fZWxlbXMgIT0g MCkKKwl7CisJCWlmIChudW1fZWxlbXMgIT0gc3RhdGUtPm5hdHRzKQorCQl7CisJCQllcmVwb3J0 KEVSUk9SLAorCQkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFKSwK KwkJCQkJIGVycm1zZygiT3BlcmF0b3IgbmFtZXMgYXJyYXkgbGVuZ3RoICV1LCBidXQgaW5kZXgg aGFzICV1IGF0dHJpYnV0ZXMiLAorCQkJCQkJCW51bV9lbGVtcywgc3RhdGUtPm5hdHRzKSkpOwor CQl9CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZWxlbXM7IGkrKykKKwkJeworCQkJaWYg KGVsZW1fbnVsbHNbaV0pCisJCQl7CisJCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJCShlcnJjb2Rl KEVSUkNPREVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUUpLAorCQkJCQkJIGVycm1zZygiT3BlcmF0 b3IgbmFtZXMgYXJyYXkgY29udGFpbnMgTlVMTCIpKSk7CisJCQl9CisJCQlzdGF0ZS0+b3BlcmF0 b3JOYW1lc1tpXSA9IG1ha2VTdHJpbmcoVGV4dERhdHVtR2V0Q1N0cmluZyh2YWx1ZXNbaV0pKTsK KwkJfQorCX0KKwllbHNlCisJeworCQkvKiBJZiB0aGVyZSBpcyBubyBpbnB1dCBqdXN0IHVzZSAi PSIgb3BlcmF0b3IgZm9yIGFsbCBhdHRyaWJ1dGVzICovCisJCWZvciAoaW50IGkgPSAwOyBpIDwg c3RhdGUtPm5hdHRzOyBpKyspCisJCXsKKwkJCXN0YXRlLT5vcGVyYXRvck5hbWVzW2ldID0gbWFr ZVN0cmluZygiPSIpOworCQl9CisJfQorfQorCisvKgorICogUHJlcGFyZSBlcXVhbHMgU2Nhbktl eSBmb3IgaW5kZXggYXR0cmlidXRlLgorICoKKyAqIEdlbmVyYXRlZCBvbmNlLCBhbmQgd2lsbCBi ZSByZXVzZWQgZm9yIGFsbCBoZWFwIHR1cGxlcy4KKyAqIEFyZ3VtZW50IGZpZWxkIHdpbGwgYmUg ZmlsbGVkIGZvciBldmVyeSBoZWFwIHR1cGxlIGJlZm9yZQorICogY29uc2lzdGVudCBmdW5jdGlv biBpbnZvY2F0aW9uLCBzbyBsZWF2ZSBpdCBOVUxMIGZvciBhIHdoaWxlLgorICoKKyAqIE9wZXJh dG9yIHN0cmF0ZWd5IG51bWJlciBjYW4gdmFyeSBmcm9tIG9wY2xhc3MgdG8gb3BjbGFzcywgc28g d2UgbmVlZCB0byBsb29rdXAgaXQgZm9yIGV2ZXJ5IGF0dHJpYnV0ZS4KKyAqLworc3RhdGljIFNj YW5LZXkKK3ByZXBhcmVfbm9ubnVsbF9zY2FuX2tleShjb25zdCBCcmluQ2hlY2tTdGF0ZSAqIHN0 YXRlLCBBdHRyTnVtYmVyIGF0dG5vKQoreworCVNjYW5LZXkJCXNjYW5LZXk7CisJT2lkCQkJb3BP aWQ7CisJT2lkCQkJb3BGYW1pbHlPaWQ7CisJYm9vbAkJZGVmaW5lZDsKKwlTdHJhdGVneU51bWJl ciBzdHJhdGVneTsKKwlSZWdQcm9jZWR1cmUgb3BSZWdQcm9jOworCUxpc3QJICAgKm9wZXJOYW1l TGlzdDsKKwlpbnQJCQlhdHRpbmRleCA9IGF0dG5vIC0gMTsKKwlGb3JtX3BnX2F0dHJpYnV0ZSBh dHRyID0gVHVwbGVEZXNjQXR0cihzdGF0ZS0+YmRlc2MtPmJkX3R1cGRlc2MsIGF0dGluZGV4KTsK KwlPaWQJCQl0eXBlID0gYXR0ci0+YXR0dHlwaWQ7CisJU3RyaW5nCSAgICpvcG5hbWUgPSBzdGF0 ZS0+b3BlcmF0b3JOYW1lc1thdHRubyAtIDFdOworCisJb3BGYW1pbHlPaWQgPSBzdGF0ZS0+aWR4 cmVsLT5yZF9vcGZhbWlseVthdHRpbmRleF07CisJb3Blck5hbWVMaXN0ID0gbGlzdF9tYWtlMShv cG5hbWUpOworCW9wT2lkID0gT3BlcmF0b3JMb29rdXAob3Blck5hbWVMaXN0LCB0eXBlLCB0eXBl LCAmZGVmaW5lZCk7CisKKwlpZiAob3BPaWQgPT0gSW52YWxpZE9pZCkKKwl7CisJCWVyZXBvcnQo RVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9VTkRFRklORURfRlVOQ1RJT04pLAorCQkJCSBl cnJtc2coIlRoZXJlIGlzIG5vIG9wZXJhdG9yICVzIGZvciB0eXBlICV1IiwKKwkJCQkJCW9wbmFt ZS0+c3ZhbCwgdHlwZSkpKTsKKwl9CisKKwlzdHJhdGVneSA9IGdldF9vcF9vcGZhbWlseV9zdHJh dGVneShvcE9pZCwgb3BGYW1pbHlPaWQpOworCisJaWYgKHN0cmF0ZWd5ID09IDApCisJeworCQll cmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfV1JPTkdfT0JKRUNUX1RZUEUpLAor CQkJCSBlcnJtc2coIm9wZXJhdG9yICVzIGlzIG5vdCBhIG1lbWJlciBvZiBvcGVyYXRvciBmYW1p bHkgXCIlc1wiIiwKKwkJCQkJCW9wbmFtZS0+c3ZhbCwKKwkJCQkJCWdldF9vcGZhbWlseV9uYW1l KG9wRmFtaWx5T2lkLCBmYWxzZSkpKSk7CisJfQorCisJb3BSZWdQcm9jID0gZ2V0X29wY29kZShv cE9pZCk7CisJc2NhbktleSA9IHBhbGxvYzAoc2l6ZW9mKFNjYW5LZXlEYXRhKSk7CisJU2Nhbktl eUVudHJ5SW5pdGlhbGl6ZSgKKwkJCQkJCSAgIHNjYW5LZXksCisJCQkJCQkgICAwLAorCQkJCQkJ ICAgYXR0bm8sCisJCQkJCQkgICBzdHJhdGVneSwKKwkJCQkJCSAgIHR5cGUsCisJCQkJCQkgICBh dHRyLT5hdHRjb2xsYXRpb24sCisJCQkJCQkgICBvcFJlZ1Byb2MsCisJCQkJCQkgICAoRGF0dW0p IE5VTEwKKwkJKTsKKwlwZnJlZShvcGVyTmFtZUxpc3QpOworCisJcmV0dXJuIHNjYW5LZXk7Cit9 CisKK3N0YXRpYyBTY2FuS2V5CitwcmVwYXJlX2lzbnVsbF9zY2FuX2tleShBdHRyTnVtYmVyIGF0 dG5vKQoreworCVNjYW5LZXkJCXNjYW5LZXk7CisKKwlzY2FuS2V5ID0gcGFsbG9jMChzaXplb2Yo U2NhbktleURhdGEpKTsKKwlTY2FuS2V5RW50cnlJbml0aWFsaXplKHNjYW5LZXksCisJCQkJCQkg ICBTS19JU05VTEwgfCBTS19TRUFSQ0hOVUxMLAorCQkJCQkJICAgYXR0bm8sCisJCQkJCQkgICBJ bnZhbGlkU3RyYXRlZ3ksCisJCQkJCQkgICBJbnZhbGlkT2lkLAorCQkJCQkJICAgSW52YWxpZE9p ZCwKKwkJCQkJCSAgIEludmFsaWRPaWQsCisJCQkJCQkgICAoRGF0dW0pIDApOworCXJldHVybiBz Y2FuS2V5OworfQorCisvKgorICogV2Ugd2FsayBmcm9tIHRoZSBmaXJzdCByYW5nZSAoYmxrbm8g PSAwKSB0byB0aGUgbGFzdCBhcyB0aGUgc2NhbiBwcm9jZWVkLgorICogRm9yIGV2ZXJ5IGhlYXAg dHVwbGUgd2UgY2hlY2sgaWYgd2UgYXJlIGRvbmUgd2l0aCB0aGUgY3VycmVudCByYW5nZSwgYW5k IHdlIG5lZWQgdG8gbW92ZSBmdXJ0aGVyCisgKiB0byB0aGUgY3VycmVudCBoZWFwIHR1cGxlJ3Mg cmFuZ2UuIFdoaWxlIG1vdmluZyB0byB0aGUgbmV4dCByYW5nZSB3ZSBjaGVjayB0aGF0IGl0J3Mg bm90IGVtcHR5IChiZWNhdXNlCisgKiB3ZSBoYXZlIGF0IGxlYXN0IG9uZSB0dXBsZSBmb3IgdGhp cyByYW5nZSkuCisgKiBFdmVyeSBoZWFwIHR1cGxlIGFyZSBjaGVja2VkIHRvIGJlIGNvbnNpc3Rl bnQgd2l0aCB0aGUgcmFuZ2UgaXQgYmVsb25ncyB0by4KKyAqIEluIGNhc2Ugb2YgdW5zdW1tYXJp emVkIHJhbmdlcyBhbmQgcGxhY2Vob2xkZXJzIHdlIHNraXAgYWxsIGNoZWNrcy4KKyAqCisgKiBX aGlsZSBtb3ZpbmcsIHdlIG1heSBqdW1wIG92ZXIgc29tZSByYW5nZXMsCisgKiBidXQgaXQncyBv a2F5IGJlY2F1c2Ugd2Ugd291bGQgbm90IGJlIGFibGUgdG8gY2hlY2sgdGhlbSBhbnl3YXkuCisg KiBXZSBhbHNvIGNhbid0IHNheSB3aGV0aGVyIHNraXBwZWQgcmFuZ2VzIHNob3VsZCBiZSBtYXJr ZWQgYXMgZW1wdHkgb3Igbm90LAorICogc2luY2UgaXQncyBwb3NzaWJsZSB0aGF0IHRoZXJlIHdl cmUgc29tZSB0dXBsZXMgYmVmb3JlIHRoYXQgYXJlIG5vdyBkZWxldGVkLgorICoKKyAqLworc3Rh dGljIHZvaWQKK2JyaW5fY2hlY2tfY2FsbGJhY2soUmVsYXRpb24gaW5kZXgsIEl0ZW1Qb2ludGVy IHRpZCwgRGF0dW0gKnZhbHVlcywgYm9vbCAqaXNudWxsLCBib29sIHR1cGxlSXNBbGl2ZSwgdm9p ZCAqYnJzdGF0ZSkKK3sKKwlCcmluQ2hlY2tTdGF0ZSAqc3RhdGU7CisJQmxvY2tOdW1iZXIgaGVh cGJsazsKKworCXN0YXRlID0gKEJyaW5DaGVja1N0YXRlICopIGJyc3RhdGU7CisJaGVhcGJsayA9 IEl0ZW1Qb2ludGVyR2V0QmxvY2tOdW1iZXIodGlkKTsKKworCS8qIElmIHdlIHdlbnQgYmV5b25k IHRoZSBjdXJyZW50IHJhbmdlIGxldCdzIGZldGNoIG5ldyByYW5nZSAqLworCWlmIChoZWFwYmxr ID49IHN0YXRlLT5uZXh0cmFuZ2VCbGspCisJeworCQlCcmluVHVwbGUgICp0dXA7CisJCUJyaW5U dXBsZSAgKnR1cGNvcHkgPSBOVUxMOworCQlNZW1vcnlDb250ZXh0IG9sZEN0eDsKKwkJT2Zmc2V0 TnVtYmVyIG9mZjsKKwkJU2l6ZQkJc2l6ZTsKKwkJU2l6ZQkJYnR1cHN6ID0gMDsKKworCQlNZW1v cnlDb250ZXh0UmVzZXQoc3RhdGUtPnJhbmdlQ3R4KTsKKwkJb2xkQ3R4ID0gTWVtb3J5Q29udGV4 dFN3aXRjaFRvKHN0YXRlLT5yYW5nZUN0eCk7CisKKwkJc3RhdGUtPnJhbmdlX2NudCsrOworCisJ CS8qIE1vdmUgdG8gdGhlIHJhbmdlIHRoYXQgY29udGFpbnMgY3VycmVudCBoZWFwIHR1cGxlICov CisJCXR1cCA9IGJyaW5HZXRUdXBsZUZvckhlYXBCbG9jayhzdGF0ZS0+cmV2bWFwLCBoZWFwYmxr LCAmc3RhdGUtPmJ1ZiwKKwkJCQkJCQkJCSAgICZvZmYsICZzaXplLCBCVUZGRVJfTE9DS19TSEFS RSk7CisKKwkJaWYgKHR1cCkKKwkJeworCQkJdHVwY29weSA9IGJyaW5fY29weV90dXBsZSh0dXAs IHNpemUsIHR1cGNvcHksICZidHVwc3opOworCQkJTG9ja0J1ZmZlcihzdGF0ZS0+YnVmLCBCVUZG RVJfTE9DS19VTkxPQ0spOworCQkJc3RhdGUtPmR0dXAgPSBicmluX2RlZm9ybV90dXBsZShzdGF0 ZS0+YmRlc2MsIHR1cGNvcHksIHN0YXRlLT5kdHVwKTsKKworCQkJLyogV2UgY2FuJ3QgY2hlY2sg cGxhY2Vob2xkZXIgcmFuZ2VzICovCisJCQlzdGF0ZS0+Y2hlY2thYmxlX3JhbmdlID0gIXN0YXRl LT5kdHVwLT5idF9wbGFjZWhvbGRlcjsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIFdlIGNhbid0 IGNoZWNrIHVuc3VtbWFyaXplZCByYW5nZXMuICovCisJCQlzdGF0ZS0+Y2hlY2thYmxlX3Jhbmdl ID0gZmFsc2U7CisJCX0KKworCQkvKgorCQkgKiBVcGRhdGUgbmV4dHJhbmdlQmxrIHNvIHdlIGtu b3cgd2hlbiB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBjdXJyZW50CisJCSAqIHJhbmdlCisJCSAqLwor CQlzdGF0ZS0+bmV4dHJhbmdlQmxrID0gKGhlYXBibGsgLyBzdGF0ZS0+cGFnZXNQZXJSYW5nZSAr IDEpICogc3RhdGUtPnBhZ2VzUGVyUmFuZ2U7CisKKwkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9s ZEN0eCk7CisKKwkJLyogUmFuZ2UgbXVzdCBub3QgYmUgZW1wdHkgKi8KKwkJaWYgKHN0YXRlLT5j aGVja2FibGVfcmFuZ2UgJiYgc3RhdGUtPmR0dXAtPmJ0X2VtcHR5X3JhbmdlKQorCQl7CisJCQlh bGxfY29uc2lzdF9lcmVwb3J0KHN0YXRlLCB0aWQsICJyYW5nZSBpcyBtYXJrZWQgYXMgZW1wdHkg YnV0IGNvbnRhaW5zIHF1YWxpZmllZCBsaXZlIHR1cGxlcyIpOworCQl9CisKKwl9CisKKwkvKiBD aGVjayB0dXBsZSBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGluZGV4ICovCisJaWYgKHN0YXRlLT5j aGVja2FibGVfcmFuZ2UpCisJeworCQljaGVja19oZWFwX3R1cGxlKHN0YXRlLCB2YWx1ZXMsIGlz bnVsbCwgdGlkKTsKKwl9CisKK30KKworLyoKKyAqIFdlIGNoZWNrIGhhc251bGxzIGZsYWdzIGZv ciBudWxsIHZhbHVlcyBhbmQgb2lfcmVndWxhcl9udWxscyA9IHRydWUsCisgKiBjaGVjayBhbGxu dWxscyBpcyBmYWxzZSBmb3IgYWxsIG5vbm51bGwgdmFsdWVzIG5vdCBtYXR0ZXIgb2lfcmVndWxh cl9udWxscyBpcyBzZXQgb3Igbm90LAorICogRm9yIGFsbCBvdGhlciBjYXNlcyB3ZSBjYWxsIGNv bnNpc3RlbnRGbiB3aXRoIGFwcHJvcHJpYXRlIHNjYW5LZXk6CisgKiAtIGZvciBvaV9yZWd1bGFy X251bGxzID0gZmFsc2UgYW5kIG51bGwgdmFsdWVzIHdlIHVzZSAnaXNOdWxsJyBzY2FuS2V5LAor ICogLSBmb3Igbm9ubnVsbCB2YWx1ZXMgd2UgdXNlICdub25udWxsJyBzY2FuS2V5CisgKi8KK3N0 YXRpYyB2b2lkCitjaGVja19oZWFwX3R1cGxlKEJyaW5DaGVja1N0YXRlICogc3RhdGUsIGNvbnN0 IERhdHVtICp2YWx1ZXMsIGNvbnN0IGJvb2wgKm51bGxzLCBJdGVtUG9pbnRlciB0aWQpCit7CisJ aW50CQkJYXR0aW5kZXg7CisJQnJpbk1lbVR1cGxlICpkdHVwID0gc3RhdGUtPmR0dXA7CisJQnJp bkRlc2MgICAqYmRlc2MgPSBzdGF0ZS0+YmRlc2M7CisJTWVtb3J5Q29udGV4dCBvbGRDdHg7CisK KwlBc3NlcnQoc3RhdGUtPmNoZWNrYWJsZV9yYW5nZSk7CisKKwlNZW1vcnlDb250ZXh0UmVzZXQo c3RhdGUtPmhlYXB0dXBsZUN0eCk7CisJb2xkQ3R4ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKHN0 YXRlLT5oZWFwdHVwbGVDdHgpOworCisJLyogY2hlY2sgZXZlcnkgaW5kZXggYXR0cmlidXRlICov CisJZm9yIChhdHRpbmRleCA9IDA7IGF0dGluZGV4IDwgc3RhdGUtPm5hdHRzOyBhdHRpbmRleCsr KQorCXsKKwkJQnJpblZhbHVlcyAqYnZhbDsKKwkJRGF0dW0JCWNvbnNpc3RlbnRGblJlc3VsdDsK KwkJYm9vbAkJY29uc2lzdGVudDsKKwkJU2NhbktleQkJc2NhbktleTsKKwkJYm9vbAkJb2lfcmVn dWxhcl9udWxscyA9IGJkZXNjLT5iZF9pbmZvW2F0dGluZGV4XS0+b2lfcmVndWxhcl9udWxsczsK KworCQlidmFsID0gJmR0dXAtPmJ0X2NvbHVtbnNbYXR0aW5kZXhdOworCisJCWlmIChudWxsc1th dHRpbmRleF0pCisJCXsKKwkJCS8qCisJCQkgKiBVc2UgaGFzbnVsbHMgZmxhZyBmb3Igb2lfcmVn dWxhcl9udWxscyBpcyB0cnVlLiBPdGhlcndpc2UsCisJCQkgKiBkZWxlZ2F0ZSBjaGVjayB0byBj b25zaXN0ZW50Rm4KKwkJCSAqLworCQkJaWYgKG9pX3JlZ3VsYXJfbnVsbHMpCisJCQl7CisJCQkJ LyogV2UgaGF2ZSBudWxsIHZhbHVlLCBzbyBoYXNudWxscyBvciBhbGxudWxscyBtdXN0IGJlIHRy dWUgKi8KKwkJCQlpZiAoIShidmFsLT5idl9oYXNudWxscyB8fCBidmFsLT5idl9hbGxudWxscykp CisJCQkJeworCQkJCQlhbGxfY29uc2lzdF9lcmVwb3J0KHN0YXRlLCB0aWQsICJyYW5nZSBoYXNu dWxscyBhbmQgYWxsbnVsbHMgYXJlIGZhbHNlLCBidXQgY29udGFpbnMgYSBudWxsIHZhbHVlIik7 CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogSW4gY2FzZSBvZiBu dWxsIGFuZCBvaV9yZWd1bGFyX251bGxzID0gZmFsc2Ugd2UgdXNlIGlzTnVsbAorCQkJICogc2Nh bktleSBmb3IgaW52b2NhdGlvbiBvZiBjb25zaXN0ZW50Rm4KKwkJCSAqLworCQkJc2NhbktleSA9 IHN0YXRlLT5pc251bGxfc2tbYXR0aW5kZXhdOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogV2Ug aGF2ZSBhIG5vbm51bGwgdmFsdWUsIHNvIGFsbG51bGxzIHNob3VsZCBiZSBmYWxzZSAqLworCQkJ aWYgKGJ2YWwtPmJ2X2FsbG51bGxzKQorCQkJeworCQkJCWFsbF9jb25zaXN0X2VyZXBvcnQoc3Rh dGUsIHRpZCwgInJhbmdlIGFsbG51bGxzIGlzIHRydWUsIGJ1dCBjb250YWlucyBub25udWxsIHZh bHVlIik7CisJCQl9CisKKwkJCS8qIHVzZSAiYXR0ciA9IHZhbHVlIiBzY2FuIGtleSBmb3Igbm9u bnVsbCB2YWx1ZXMgKi8KKwkJCXNjYW5LZXkgPSBzdGF0ZS0+bm9ubnVsbF9za1thdHRpbmRleF07 CisJCQlzY2FuS2V5LT5za19hcmd1bWVudCA9IHZhbHVlc1thdHRpbmRleF07CisJCX0KKworCQkv KiBJZiBvaV9yZWd1bGFyX251bGxzID0gdHJ1ZSB3ZSBzaG91bGQgbmV2ZXIgZ2V0IHRoZXJlIHdp dGggbnVsbCAqLworCQlBc3NlcnQoIW9pX3JlZ3VsYXJfbnVsbHMgfHwgIW51bGxzW2F0dGluZGV4 XSk7CisKKwkJaWYgKHN0YXRlLT5jb25zaXN0ZW50Rm5bYXR0aW5kZXhdLmZuX25hcmdzID49IDQp CisJCXsKKwkJCWNvbnNpc3RlbnRGblJlc3VsdCA9IEZ1bmN0aW9uQ2FsbDRDb2xsKCZzdGF0ZS0+ Y29uc2lzdGVudEZuW2F0dGluZGV4XSwKKwkJCQkJCQkJCQkJCSAgIHN0YXRlLT5pZHhyZWwtPnJk X2luZGNvbGxhdGlvblthdHRpbmRleF0sCisJCQkJCQkJCQkJCQkgICBQb2ludGVyR2V0RGF0dW0o c3RhdGUtPmJkZXNjKSwKKwkJCQkJCQkJCQkJCSAgIFBvaW50ZXJHZXREYXR1bShidmFsKSwKKwkJ CQkJCQkJCQkJCSAgIFBvaW50ZXJHZXREYXR1bSgmc2NhbktleSksCisJCQkJCQkJCQkJCQkgICBJ bnQzMkdldERhdHVtKDEpCisJCQkJKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWNvbnNpc3RlbnRG blJlc3VsdCA9IEZ1bmN0aW9uQ2FsbDNDb2xsKCZzdGF0ZS0+Y29uc2lzdGVudEZuW2F0dGluZGV4 XSwKKwkJCQkJCQkJCQkJCSAgIHN0YXRlLT5pZHhyZWwtPnJkX2luZGNvbGxhdGlvblthdHRpbmRl eF0sCisJCQkJCQkJCQkJCQkgICBQb2ludGVyR2V0RGF0dW0oc3RhdGUtPmJkZXNjKSwKKwkJCQkJ CQkJCQkJCSAgIFBvaW50ZXJHZXREYXR1bShidmFsKSwKKwkJCQkJCQkJCQkJCSAgIFBvaW50ZXJH ZXREYXR1bShzY2FuS2V5KQorCQkJCSk7CisJCX0KKworCQljb25zaXN0ZW50ID0gRGF0dW1HZXRC b29sKGNvbnNpc3RlbnRGblJlc3VsdCk7CisKKwkJaWYgKCFjb25zaXN0ZW50KQorCQl7CisJCQlh bGxfY29uc2lzdF9lcmVwb3J0KHN0YXRlLCB0aWQsICJoZWFwIHR1cGxlIGluY29uc2lzdGVudCB3 aXRoIGluZGV4Iik7CisJCX0KKworCX0KKworCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRDdHgp OworfQorCisvKiBSZXBvcnQgd2l0aG91dCBhbnkgYWRkaXRpb25hbCBpbmZvICovCitzdGF0aWMg dm9pZAorYnJpbl9jaGVja19lcmVwb3J0KGNvbnN0IGNoYXIgKmZtdCkKK3sKKwllcmVwb3J0KEVS Uk9SLAorCQkJKGVycmNvZGUoRVJSQ09ERV9EQVRBX0NPUlJVUFRFRCksCisJCQkgZXJybXNnKCJp bmRleCBpcyBjb3JydXB0ZWQgLSAlcyIsIGZtdCkpKTsKK30KKworLyogUmVwb3J0IHdpdGggcmFu Z2UgYmxrbm8sIHJldm1hcCBpdGVtIGluZm8sIGluZGV4IHR1cGxlIGluZm8gKi8KK3ZvaWQKK2lu ZGV4X3R1cGxlX2VyZXBvcnQoQnJpbkNoZWNrU3RhdGUgKiBzdGF0ZSwgY29uc3QgY2hhciAqZm10 KQoreworCUFzc2VydChzdGF0ZS0+cmFuZ2VCbGtubyAhPSBJbnZhbGlkQmxvY2tOdW1iZXIpOwor CUFzc2VydChzdGF0ZS0+cmV2bWFwQmxrICE9IEludmFsaWRCbG9ja051bWJlcik7CisJQXNzZXJ0 KHN0YXRlLT5yZXZtYXBpZHggPj0gMCAmJiBzdGF0ZS0+cmV2bWFwaWR4IDwgUkVWTUFQX1BBR0Vf TUFYSVRFTVMpOworCUFzc2VydChzdGF0ZS0+cmVncGFnZUJsayAhPSBJbnZhbGlkQmxvY2tOdW1i ZXIpOworCUFzc2VydChzdGF0ZS0+cmVncGFnZW9mZnNldCAhPSBJbnZhbGlkT2Zmc2V0TnVtYmVy KTsKKworCWVyZXBvcnQoRVJST1IsCisJCQkoZXJyY29kZShFUlJDT0RFX0RBVEFfQ09SUlVQVEVE KSwKKwkJCSBlcnJtc2coImluZGV4IGlzIGNvcnJ1cHRlZCAtICVzLiBSYW5nZSBibGtubzogJXUs IHJldm1hcCBpdGVtOiAoJXUsJXUpLCBpbmRleCB0dXBsZTogKCV1LCV1KSIsCisJCQkJCWZtdCwK KwkJCQkJc3RhdGUtPnJhbmdlQmxrbm8sCisJCQkJCXN0YXRlLT5yZXZtYXBCbGssCisJCQkJCXN0 YXRlLT5yZXZtYXBpZHgsCisJCQkJCXN0YXRlLT5yZWdwYWdlQmxrLAorCQkJCQlzdGF0ZS0+cmVn cGFnZW9mZnNldCkpKTsKK30KKworLyogUmVwb3J0IHdpdGggaW5kZXggdHVwbGUgaW5mbyAqLwor dm9pZAoraW5kZXhfdHVwbGVfb25seV9lcmVwb3J0KEJyaW5DaGVja1N0YXRlICogc3RhdGUsIGNv bnN0IGNoYXIgKmZtdCkKK3sKKwlBc3NlcnQoc3RhdGUtPnJlZ3BhZ2VCbGsgIT0gSW52YWxpZEJs b2NrTnVtYmVyKTsKKwlBc3NlcnQoc3RhdGUtPnJlZ3BhZ2VvZmZzZXQgIT0gSW52YWxpZE9mZnNl dE51bWJlcik7CisKKwllcmVwb3J0KEVSUk9SLAorCQkJKGVycmNvZGUoRVJSQ09ERV9EQVRBX0NP UlJVUFRFRCksCisJCQkgZXJybXNnKCJpbmRleCBpcyBjb3JydXB0ZWQgLSAlcy4gSW5kZXggdHVw bGU6ICgldSwldSkiLAorCQkJCQlmbXQsCisJCQkJCXN0YXRlLT5yZWdwYWdlQmxrLAorCQkJCQlz dGF0ZS0+cmVncGFnZW9mZnNldCkpKTsKK30KKworLyogUmVwb3J0IHdpdGggcmFuZ2UgYmxrbm8s IHJldm1hcCBpdGVtIGluZm8gKi8KK3ZvaWQKK3Jldm1hcF9pdGVtX2VyZXBvcnQoQnJpbkNoZWNr U3RhdGUgKiBzdGF0ZSwgY29uc3QgY2hhciAqZm10KQoreworCUFzc2VydChzdGF0ZS0+cmFuZ2VC bGtubyAhPSBJbnZhbGlkQmxvY2tOdW1iZXIpOworCUFzc2VydChzdGF0ZS0+cmV2bWFwQmxrICE9 IEludmFsaWRCbG9ja051bWJlcik7CisJQXNzZXJ0KHN0YXRlLT5yZXZtYXBpZHggPj0gMCAmJiBz dGF0ZS0+cmV2bWFwaWR4IDwgUkVWTUFQX1BBR0VfTUFYSVRFTVMpOworCisJZXJlcG9ydChFUlJP UiwKKwkJCShlcnJjb2RlKEVSUkNPREVfREFUQV9DT1JSVVBURUQpLAorCQkJIGVycm1zZygiaW5k ZXggaXMgY29ycnVwdGVkIC0gJXMuIFJhbmdlIGJsa25vOiAldSwgcmV2bWFwIGl0ZW06ICgldSwl dSkuIiwKKwkJCQkJZm10LAorCQkJCQlzdGF0ZS0+cmFuZ2VCbGtubywKKwkJCQkJc3RhdGUtPnJl dm1hcEJsaywKKwkJCQkJc3RhdGUtPnJldm1hcGlkeCkpKTsKK30KKworLyogUmVwb3J0IHdpdGgg cmFuZ2UgYmxrbm8sIGhlYXAgdHVwbGUgaW5mbyAqLworc3RhdGljIHZvaWQKK2FsbF9jb25zaXN0 X2VyZXBvcnQoY29uc3QgQnJpbkNoZWNrU3RhdGUgKiBzdGF0ZSwgY29uc3QgSXRlbVBvaW50ZXJE YXRhICp0aWQsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisJQXNzZXJ0KHN0YXRlLT5yYW5nZUJs a25vICE9IEludmFsaWRCbG9ja051bWJlcik7CisKKwllcmVwb3J0KEVSUk9SLAorCQkJKGVycmNv ZGUoRVJSQ09ERV9EQVRBX0NPUlJVUFRFRCksCisJCQkgZXJybXNnKCJpbmRleCBpcyBjb3JydXB0 ZWQgLSAlcy4gUmFuZ2UgYmxrbm86ICV1LCBoZWFwIHRpZCAoJXUsJXUpIiwKKwkJCQkJbWVzc2Fn ZSwKKwkJCQkJc3RhdGUtPmR0dXAtPmJ0X2Jsa25vLAorCQkJCQlJdGVtUG9pbnRlckdldEJsb2Nr TnVtYmVyKHRpZCksCisJCQkJCUl0ZW1Qb2ludGVyR2V0T2Zmc2V0TnVtYmVyKHRpZCkpKSk7Cit9 Ci0tIAoyLjQzLjAKCg== --000000000000eb12c906335a4aad Content-Type: text/x-patch; charset="US-ASCII"; name="0001-brin-refactoring.patch" Content-Disposition: attachment; filename="0001-brin-refactoring.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m9sa44uj0 RnJvbSA4OWNhM2ZiOWVkOTkyODMxZGU2MGYwYmNjMjI0NmUyOGFhODlhNWFjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBcnNlbml5IE11a2hpbiA8YXJzZW5peS5tdWtoaW4uZGV2QGdt YWlsLmNvbT4KRGF0ZTogV2VkLCAxNiBBcHIgMjAyNSAxMToyNjo0NSArMDMwMApTdWJqZWN0OiBb UEFUQ0ggMS8yXSBicmluIHJlZmFjdG9yaW5nCgotLS0KIHNyYy9iYWNrZW5kL2FjY2Vzcy9icmlu L2JyaW5fdHVwbGUuYyAgIHwgMiArLQogc3JjL2JhY2tlbmQvYWNjZXNzL2NvbW1vbi9yZWxvcHRp b25zLmMgfCAzICsrLQogc3JjL2luY2x1ZGUvYWNjZXNzL2JyaW4uaCAgICAgICAgICAgICAgfCAx ICsKIHNyYy9pbmNsdWRlL2FjY2Vzcy9icmluX3R1cGxlLmggICAgICAgIHwgMiArKwogNCBmaWxl cyBjaGFuZ2VkLCA2IGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEv c3JjL2JhY2tlbmQvYWNjZXNzL2JyaW4vYnJpbl90dXBsZS5jIGIvc3JjL2JhY2tlbmQvYWNjZXNz L2JyaW4vYnJpbl90dXBsZS5jCmluZGV4IDg2MWYzOTdlNmRiLi40ZDFkOGQ5YWRkZCAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL2JyaW4vYnJpbl90dXBsZS5jCisrKyBiL3NyYy9iYWNr ZW5kL2FjY2Vzcy9icmluL2JyaW5fdHVwbGUuYwpAQCAtNTcsNyArNTcsNyBAQCBzdGF0aWMgaW5s aW5lIHZvaWQgYnJpbl9kZWNvbnN0cnVjdF90dXBsZShCcmluRGVzYyAqYnJkZXNjLAogLyoKICAq IFJldHVybiBhIHR1cGxlIGRlc2NyaXB0b3IgdXNlZCBmb3Igb24tZGlzayBzdG9yYWdlIG9mIEJS SU4gdHVwbGVzLgogICovCi1zdGF0aWMgVHVwbGVEZXNjCitUdXBsZURlc2MKIGJydHVwbGVfZGlz a190dXBkZXNjKEJyaW5EZXNjICpicmRlc2MpCiB7CiAJLyogV2UgY2FjaGUgdGhlc2UgaW4gdGhl IEJyaW5EZXNjICovCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvY29tbW9uL3JlbG9w dGlvbnMuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9jb21tb24vcmVsb3B0aW9ucy5jCmluZGV4IDQ2 YzFkY2UyMjJkLi43MjcwM2JhMTUwZCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL2Nv bW1vbi9yZWxvcHRpb25zLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2NvbW1vbi9yZWxvcHRp b25zLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlICJhY2Nlc3MvaGVhcHRvYXN0LmgiCiAj aW5jbHVkZSAiYWNjZXNzL2h0dXBfZGV0YWlscy5oIgogI2luY2x1ZGUgImFjY2Vzcy9uYnRyZWUu aCIKKyNpbmNsdWRlICJhY2Nlc3MvYnJpbi5oIgogI2luY2x1ZGUgImFjY2Vzcy9yZWxvcHRpb25z LmgiCiAjaW5jbHVkZSAiYWNjZXNzL3NwZ2lzdF9wcml2YXRlLmgiCiAjaW5jbHVkZSAiY2F0YWxv Zy9wZ190eXBlLmgiCkBAIC0zNDMsNyArMzQ0LDcgQEAgc3RhdGljIHJlbG9wdF9pbnQgaW50UmVs T3B0c1tdID0KIAkJCSJOdW1iZXIgb2YgcGFnZXMgdGhhdCBlYWNoIHBhZ2UgcmFuZ2UgY292ZXJz IGluIGEgQlJJTiBpbmRleCIsCiAJCQlSRUxPUFRfS0lORF9CUklOLAogCQkJQWNjZXNzRXhjbHVz aXZlTG9jawotCQl9LCAxMjgsIDEsIDEzMTA3MgorCQl9LCAxMjgsIDEsIEJSSU5fTUFYX1BBR0VT X1BFUl9SQU5HRQogCX0sCiAJewogCQl7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9hY2Nlc3Mv YnJpbi5oIGIvc3JjL2luY2x1ZGUvYWNjZXNzL2JyaW4uaAppbmRleCA4MjFmMWUwMjgwNi4uMzM0 Y2U5NzNiNjcgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2FjY2Vzcy9icmluLmgKKysrIGIvc3Jj L2luY2x1ZGUvYWNjZXNzL2JyaW4uaApAQCAtMzcsNiArMzcsNyBAQCB0eXBlZGVmIHN0cnVjdCBC cmluU3RhdHNEYXRhCiAKIAogI2RlZmluZSBCUklOX0RFRkFVTFRfUEFHRVNfUEVSX1JBTkdFCTEy OAorI2RlZmluZSBCUklOX01BWF9QQUdFU19QRVJfUkFOR0UJMTMxMDcyCiAjZGVmaW5lIEJyaW5H ZXRQYWdlc1BlclJhbmdlKHJlbGF0aW9uKSBcCiAJKEFzc2VydE1hY3JvKHJlbGF0aW9uLT5yZF9y ZWwtPnJlbGtpbmQgPT0gUkVMS0lORF9JTkRFWCAmJiBcCiAJCQkJIHJlbGF0aW9uLT5yZF9yZWwt PnJlbGFtID09IEJSSU5fQU1fT0lEKSwgXApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvYWNjZXNz L2JyaW5fdHVwbGUuaCBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9icmluX3R1cGxlLmgKaW5kZXggMDEw YmE0ZWEzYzAuLjk0NzJjYTYzOGRkIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9hY2Nlc3MvYnJp bl90dXBsZS5oCisrKyBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9icmluX3R1cGxlLmgKQEAgLTEwOSw0 ICsxMDksNiBAQCBleHRlcm4gQnJpbk1lbVR1cGxlICpicmluX21lbXR1cGxlX2luaXRpYWxpemUo QnJpbk1lbVR1cGxlICpkdHVwbGUsCiBleHRlcm4gQnJpbk1lbVR1cGxlICpicmluX2RlZm9ybV90 dXBsZShCcmluRGVzYyAqYnJkZXNjLAogCQkJCQkJCQkJICAgQnJpblR1cGxlICp0dXBsZSwgQnJp bk1lbVR1cGxlICpkTWVtdHVwbGUpOwogCitleHRlcm4gVHVwbGVEZXNjIGJydHVwbGVfZGlza190 dXBkZXNjKEJyaW5EZXNjICpicmRlc2MpOworCiAjZW5kaWYJCQkJCQkJLyogQlJJTl9UVVBMRV9I ICovCi0tIAoyLjQzLjAKCg== --000000000000eb12c906335a4aad--