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 1r5Gsu-00ChbX-K6 for pgsql-hackers@arkaria.postgresql.org; Tue, 21 Nov 2023 02:53:12 +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 1r5Gsr-00COT7-8H for pgsql-hackers@arkaria.postgresql.org; Tue, 21 Nov 2023 02:53:05 +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 1r5Gsq-00COSv-J1 for pgsql-hackers@lists.postgresql.org; Tue, 21 Nov 2023 02:53:04 +0000 Received: from mail-ua1-x934.google.com ([2607:f8b0:4864:20::934]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1r5Gsm-007X6g-Oe for pgsql-hackers@lists.postgresql.org; Tue, 21 Nov 2023 02:53:03 +0000 Received: by mail-ua1-x934.google.com with SMTP id a1e0cc1a2514c-7baea76391dso2956756241.1 for ; Mon, 20 Nov 2023 18:53:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bowt-ie.20230601.gappssmtp.com; s=20230601; t=1700535178; x=1701139978; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=Sbmu5xMPkbSjOZNxAl3IV6ZvtLQJrZNr2s33hcUNkAA=; b=kBMNTL5WUX7XEvLPK9xNro+zCbBaj1G23G1vj8Q5i7sf0K/2EyUsf7SbbWACxUGzZK p7I422IP1P4/f4jBNONJ+Q2BMTOV471xVL2KfsIxeWgt2kaEbS2KWoKNqDEhFNCYwgt9 BFzGZpZdvtHduKSD3lkC0mTT2TMg24S8Y8pyQUFbFPLe7+aH7RN946oKkmy9rvf7oQ2O u56f9J1MEZW8QauaubzgDxu64pdrdgp44JFfiOU+PlZpN8xdGvV/DiH8ftbGtnzOzqWA bDiLWBBK3g0VFI3VkTbkdK84LgYWLvuB8KqkXE7Ytu/fzaMXCi3c1rHbwhdZRV7mztSv xPSg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1700535178; x=1701139978; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Sbmu5xMPkbSjOZNxAl3IV6ZvtLQJrZNr2s33hcUNkAA=; b=HkKmXbKXbsyKS6paKBvcL8Hae13ZsWuNVeaJONEhruq3Lk/A21GlGJgBzMOt3a/pxS nP68y3xrWXVI2M6pTWt0asHyNL8zFFmpivk/1gH0nFhSydxLpHio7ZHUIXvfoXJV16hI 4RXXvh/BhrCXcOHEUceFRPUgbaEjos89D+arRF3IuJiiXdc9G3lae647Xlg7rrP57G2T 9ESVmdJf1cKFphq/2jKppWyJWliuu2MYV8llVIs8Eg9zmq4t+FEPJEbXSi5Jnu8GlPDO QMmjGJPmqO7OmCmI8Puv8npRVezdxwGljpB5M6JZVOcBdPm42Q4g+vUzC4cweb4ZvtnZ ek+A== X-Gm-Message-State: AOJu0YzaUNR0nGPww37Z8r6o9fY6Et6Kqza8mNuZrCgb2N2gzUMt8Fpm voI+jJ+ERcOyd6MSV4iMd7vbyz7ODJuasELVUVvL2Q== X-Google-Smtp-Source: AGHT+IEtRv3+8h9MUHb3JN0sWaDn+Blz8BOFLxX2smumzkUHJdRvNWit40mKRCkxeviAmCHzbqufuXkCI9oD928GjWY= X-Received: by 2002:a05:6102:3391:b0:45d:8c2a:f266 with SMTP id i17-20020a056102339100b0045d8c2af266mr1505321vsh.17.1700535178552; Mon, 20 Nov 2023 18:52:58 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Peter Geoghegan Date: Mon, 20 Nov 2023 18:52:32 -0800 Message-ID: Subject: Re: Optimizing nbtree ScalarArrayOp execution, allowing multi-column ordered scans, skip scan To: Matthias van de Meent Cc: PostgreSQL Hackers , Tom Lane , Tomas Vondra , Jeff Davis , benoit , Alexander Korotkov Content-Type: multipart/mixed; boundary="0000000000003f2371060aa0b369" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000003f2371060aa0b369 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sat, Nov 11, 2023 at 1:08=E2=80=AFPM Matthias van de Meent wrote: > Thanks. Here's my review of the btree-related code: Attached is v7. The main focus in v7 is making the handling of required inequality-strategy scan keys more explicit -- now there is an understanding of inequalities shared by _bt_check_compare (the function that becomes the guts of _bt_checkkeys) and the new _bt_advance_array_keys function/state machine. The big idea for v7 is to generalize how we handle required equality-strategy scan keys (always required in both scan directions), extending the same concept to deal with required inequality strategy scan keys (only ever required in one direction, which may or may not be the scan direction). This led to my discovering and fixing a couple of bugs related to inequality handling. These issues were of the same general character as many others I've dealt with before now: they involved subtle confusion about when and how to start another primitive index scan, leading to the scan reading many more pages than strictly necessary (potentially many more than master). In other words, cases where we didn't give up and start another primitive index scan, even though (with a repro of the issue) it's obviously not sensible. An accidental full index scan. While I'm still not completely happy with the way that inequalities are handled, things in this area are much improved in v7. It should be noted that the patch isn't strictly guaranteed to always read fewer index pages than master, for a given query plan and index. This is by design. Though the patch comes close, it's not quite a certainty. There are known cases where the patch reads the occasional extra page (relative to what master would have done under the same circumstances). These are cases where the implementation just cannot know for sure whether the next/sibling leaf page has key space covered by any of the scan's array keys (at least not in a way that seems practical). The implementation has simple heuristics that infer (a polite word for "make an educated guess") about what will be found on the next page. Theoretically we could be more conservative in how we go about this, but that seems like a bad idea to me. It's really easy to find cases where the maximally conservative approach loses by a lot, and really hard to show cases where it wins at all. These heuristics are more or less a limited form of the heuristics that skip scan would need. A *very* limited form. We're still conservative. Here's how it works, at a high level: if the scan can make it all the way to the end of the page without having to start a new primitive index scan (before reaching the end), and then finds that "finaltup" itself (which is usually the page high key) advances the array keys, we speculate: we move on to the sibling page. It's just about possible that we'll discover (once on the next page) that finaltup actually advanced the array keys by so much (in one single advancement step) that the current/new keys cover key space beyond the sibling page we just arrived at. The sibling page access will have been wasted (though I prefer to think of it as a cost of doing business). I go into a lot of detail on the trade-offs in this area in comments at the end of the new _bt_checkkeys(), just after it calls _bt_advance_array_keys(). Hopefully this is reasonably clear. It's always much easier to understand these things when you've written lots of test cases, though. So I wouldn't at all be surprised to hear that my explanation needs more work. I suspect that I'm spending more time on the topic than it actually warrants, but you have to spend a lot of time on it for yourself to be able to see why that is. > > +++ b/src/backend/access/nbtree/nbtsearch.c > > @@ -1625,8 +1633,9 @@ _bt_readpage(IndexScanDesc scan, ScanDirection di= r, OffsetNumber offnum) > > * set flag to true if all required keys are satisfied and fals= e > > * otherwise. > > */ > > - (void) _bt_checkkeys(scan, itup, indnatts, dir, > > - &requiredMatchedByPrecheck, false); > > + _bt_checkkeys(scan, &pstate, itup, false, false); > > + requiredMatchedByPrecheck =3D pstate.continuescan; > > + pstate.continuescan =3D true; /* reset */ > > The comment above the updated section needs to be updated. Updated. > > @@ -1625,8 +1633,9 @@ _bt_readpage(IndexScanDesc scan, ScanDirection di= r, OffsetNumber offnum) > > * set flag to true if all required keys are satisfied and fals= e > > * otherwise. > > */ > > - (void) _bt_checkkeys(scan, itup, indnatts, dir, > > - &requiredMatchedByPrecheck, false); > > + _bt_checkkeys(scan, &pstate, itup, false, false); > > This 'false' finaltup argument is surely wrong for the rightmost > page's rightmost tuple, no? Not in any practical sense. Since finaltup means "the tuple that you should use to decide whether to go to the next page or not", and a rightmost page doesn't have a next page. There are exactly two ways that the top-level scan can end (not to be confused with the primitive scan), at least in v7. They are: 1. The state machine can exhaust the scan's array keys, ending the top-level scan. 2. The scan can just run out of pages, without ever running out of array keys (some array keys can sort higher than any real value from the index). This is just like how an index scan ends when it lacks any required scan keys to terminate the scan, and eventually runs out of pages to scan (think of an index-only scan that performs a full scan of the index, feeding into a group aggregate). Note that it wouldn't be okay if the design relied on _bt_checkkeys advancing and exhausting the array keys -- we really do need both 1 and 2 to deal with various edge cases. For example, there is no way that we'll ever be able to call _bt_checkkeys with a completely empty index. It simply doesn't have any tuples at all. In fact, it doesn't even have any pages (apart from the metapage), so clearly we can't expect any calls to _bt_readpage (much less _bt_checkkeys). > > +++ b/src/backend/access/nbtree/nbtutils.c > > @@ -357,6 +431,46 @@ _bt_preprocess_array_keys(IndexScanDesc scan) > > + /* We could pfree(elem_values) after, but not worth the cy= cles */ > > + num_elems =3D _bt_merge_arrays(scan, cur, > > + (indoption[cur->sk_attno - 1]= & INDOPTION_DESC) !=3D 0, > > + prev->elem_values, prev->num_= elems, > > + elem_values, num_elems); > > This code can get hit several times when there are multiple =3D ANY > clauses, which may result in repeated leakage of these arrays during > this scan. I think cleaning up may well be worth the cycles when the > total size of the arrays is large enough. They won't leak because the memory is allocated in the same dedicated memory context. That said, I added a pfree(). It couldn't hurt. > > @@ -496,6 +627,48 @@ _bt_sort_array_elements(IndexScanDesc scan, ScanKe= y skey, > > _bt_compare_array_elements, &cxt); > > +_bt_merge_arrays(IndexScanDesc scan, ScanKey skey, bool reverse, > > + Datum *elems_orig, int nelems_orig, > > + Datum *elems_next, int nelems_next) > > [...] > > + /* > > + * Incrementally copy the original array into a temp buffer, skipp= ing over > > + * any items that are missing from the "next" array > > + */ > > Given that we only keep the members that both arrays have in common, > the result array will be a strict subset of the original array. So, I > don't quite see why we need the temporary buffer here - we can reuse > the entries of the elems_orig array that we've already compared > against the elems_next array. This code path is only hit when the query was written on autopilot, since it must have contained redundant SAOPs for the same index column -- a glaring inconsistency. Plus these arrays just aren't very big in practice (despite my concerns about huge arrays). Plus there is only one of these array-specific preprocessing steps per btrescan. So I don't think that it's worth going to too much trouble here. > We may want to optimize this further by iterating over only the > smallest array: With the current code, [1, 2] + [1....1000] is faster > to merge than [1..1000] + [1000, 1001], because 2 * log(1000) is much > smaller than 1000*log(2). In practice this may matter very little, > though. > An even better optimized version would do a merge join on the two > arrays, rather than loop + binary search. v7 allocates the temp buffer using the size of whatever array is the smaller of the two, just because it's an easy marginal improvement. > > @@ -515,6 +688,161 @@ _bt_compare_array_elements(const void *a, const v= oid *b, void *arg) > > [...] > > +_bt_binsrch_array_skey(FmgrInfo *orderproc, > > Is there a reason for this complex initialization of high/low_elem, > rather than the this easier to understand and more compact > initialization?: > > + low_elem =3D 0; > + high_elem =3D array->num_elems - 1; > + if (cur_elem_start) > + { > + if (ScanDirectionIsForward(dir)) > + low_elem =3D array->cur_elem; > + else > + high_elem =3D array->cur_elem; > + } I agree that it's better your way. Done that way in v7. > I think the conditional _bt_parallel_done(scan) feels misplaced here, > as the comment immediately below indicates the scan is to be > terminated after that comment. So, either move this _bt_parallel_done > call outside the function (which by name would imply it is read-only, > without side effects like this) or move it below the comment > "terminate the top-level scan". v7 moves the comment up, so that it's just before the _bt_parallel_done() c= all. > > +_bt_advance_array_keys(IndexScanDesc scan, BTReadPageState *pstate, > > [...] > > + * Set up ORDER 3-way comparison function and array state > > [...] > > + * Optimization: Skip over non-required scan keys when we know= that > > These two sections should probably be swapped, as the skip makes the > setup useless. Not quite: we need to increment arrayidx for later loop iterations/scan key= s. > Also, the comment here is wrong; the scan keys that are skipped are > 'required', not 'non-required'. Agreed. Fixed. > > +++ b/src/test/regress/expected/join.out > > @@ -8620,10 +8620,9 @@ where j1.id1 % 1000 =3D 1 and j2.id1 % 1000 =3D = 1 and j2.id1 >=3D any (array[1,5]); > > Merge Cond: (j1.id1 =3D j2.id1) > > Join Filter: (j2.id2 =3D j1.id2) > > -> Index Scan using j1_id1_idx on j1 > > - -> Index Only Scan using j2_pkey on j2 > > + -> Index Scan using j2_id1_idx on j2 > > Index Cond: (id1 >=3D ANY ('{1,5}'::integer[])) > > - Filter: ((id1 % 1000) =3D 1) > > -(7 rows) > > +(6 rows) > > I'm a bit surprised that we don't have the `id1 % 1000 =3D 1` filter > anymore. The output otherwise matches (quite possibly because the > other join conditions don't match) and I don't have time to > investigate the intricacies between IOS vs normal IS, but this feels > off. This happens because the new plan uses a completely different index -- which happens to be a partial index whose predicate exactly matches the old plan's filter quals. That factor makes the filter quals unnecessary. That's all this is. > As for the planner changes, I don't think I'm familiar enough with the > planner to make any authorative comments on this. However, it does > look like you've changed the meaning of 'amsearcharray', and I'm not > sure it's OK to assume all indexes that support amsearcharray will > also support for this new assumption of ordered retrieval of SAOPs. > For one, the pgroonga extension [0] does mark > amcanorder+amsearcharray. The changes that I've made to the planner are subtractive. We more or less go back to how things were just after the initial work on nbtree amsearcharray support. That work was (at least tacitly) assumed to have no impact on ordered scans. Because why should it? What other type of index clause has ever affected what seems like a rather unrelated thing (namely the sort order of the scan)? The oversight was understandable. The kinds of plans that master cannot produce output for in standard index order are really silly plans, independent of this issue; it makes zero sense to allow a non-required array scan key to affect how or when we skip. The code that I'm removing from the planner is code that quite obviously assumes nbtree-like behavior. So I'm taking away code like that, rather than adding new code like that. That said, I am really surprised that any extension creates an index AM amcanorder=3Dtrue (not to be confused with amcanorderbyop=3Dtrue, which is less surprising). That means that it promises the planner that it behaves just like nbtree. To quote the docs, it must have "btree-compatible strategy numbers for their [its] equality and ordering operators". Is that really something that pgroonga even attempts? And if so, why? I also find it bizarre that pgroonga's handler-stated capabilities include "amcanunique=3Dtrue". So pgroonga is a full text search engine, but also supports unique indexes? I find that particularly hard to believe, and suspect that the way that they set things up in the AM handler just isn't very well thought out. --=20 Peter Geoghegan --0000000000003f2371060aa0b369 Content-Type: application/octet-stream; name="v7-0001-Enhance-nbtree-ScalarArrayOp-execution.patch" Content-Disposition: attachment; filename="v7-0001-Enhance-nbtree-ScalarArrayOp-execution.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lp7qaowr0 RnJvbSA4ZTNkYjcxYzA5YWExZWNhZDFhOTBhOWVjOGI0Y2RiZDM4YzM3MDk3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRlciBHZW9naGVnYW4gPHBnQGJvd3QuaWU+CkRhdGU6IFNh dCwgMTcgSnVuIDIwMjMgMTc6MDM6MzYgLTA3MDAKU3ViamVjdDogW1BBVENIIHY3XSBFbmhhbmNl IG5idHJlZSBTY2FsYXJBcnJheU9wIGV4ZWN1dGlvbi4KCkNvbW1pdCA5ZThkYTBmNyB0YXVnaHQg bmJ0cmVlIHRvIGhhbmRsZSBTY2FsYXJBcnJheU9wRXhwciBxdWFscwpuYXRpdmVseS4gIFRoaXMg d29ya3MgYnkgcHVzaGluZyBkb3duIHRoZSBmdWxsIGNvbnRleHQgKHRoZSBhcnJheSBrZXlzKQp0 byB0aGUgbmJ0cmVlIGluZGV4IEFNLCBlbmFibGluZyBpdCB0byBleGVjdXRlIG11bHRpcGxlIHBy aW1pdGl2ZSBpbmRleApzY2FucyB0aGF0IHRoZSBwbGFubmVyIHRyZWF0cyBhcyBvbmUgY29udGlu dW91cyBpbmRleCBzY2FuL2luZGV4IHBhdGguClRoaXMgZWFybGllciBlbmhhbmNlbWVudCBlbmFi bGVkIG5idHJlZSBTY2FsYXJBcnJheU9wIGluZGV4LW9ubHkgc2NhbnMuCkl0IGFsc28gYWxsb3dl ZCBzY2FucyB3aXRoIFNjYWxhckFycmF5T3AgcXVhbHMgdG8gcmV0dXJuIG9yZGVyZWQgcmVzdWx0 cwood2l0aCBzb21lIG5vdGFibGUgcmVzdHJpY3Rpb25zLCBkZXNjcmliZWQgZnVydGhlciBkb3du KS4KClRha2UgdGhpcyBnZW5lcmFsIGFwcHJvYWNoIGEgbG90IGZ1cnRoZXI6IHRlYWNoIG5idHJl ZSBTQU9QIGluZGV4IHNjYW5zCnRvIGRldGVybWluZSBob3cgYmVzdCB0byBleGVjdXRlIFNjYWxh ckFycmF5T3Agc2NhbnMgKGhvdyBtYW55IHByaW1pdGl2ZQppbmRleCBzY2FucyB0byB1c2UgdW5k ZXIgdGhlIGhvb2QpIGJ5IGFwcGx5aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZQpwaHlzaWNhbCBj aGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGluZGV4IGF0IHJ1bnRpbWUuICBUaGlzIGFwcHJvYWNoIGNh biBiZQpmYXIgbW9yZSBlZmZpY2llbnQuICBNYW55IGNhc2VzIHRoYXQgcHJldmlvdXNseSByZXF1 aXJlZCB0aG91c2FuZHMgb2YKaW5kZXggZGVzY2VudHMgbm93IHJlcXVpcmUgYXMgZmV3IGFzIG9u ZSBzaW5nbGUgaW5kZXggZGVzY2VudC4gIEFuZCwgYWxsClNBT1Agc2NhbnMgcmVsaWFibHkgYXZv aWQgZHVwbGljYXRpdmUgbGVhZiBwYWdlIGFjY2Vzc2VzIChqdXN0IGxpa2UgYW55Cm90aGVyIG5i dHJlZSBpbmRleCBzY2FuKS4KClRoZSBhcnJheSBzdGF0ZSBtYWNoaW5lIG5vdyBhZHZhbmNlcyB1 c2luZyBiaW5hcnkgc2VhcmNoZXMgZm9yIHRoZSBhcnJheQplbGVtZW50IHRoYXQgYmVzdCBtYXRj aGVzIHRoZSBuZXh0IHR1cGxlJ3MgYXR0cmlidXRlIHZhbHVlLiAgVGhpcyB3aG9sZQpwcm9jZXNz IG1ha2VzIHJlcXVpcmVkIHNjYW4ga2V5IGFycmF5cyAoaS5lLiBhcnJheXMgZnJvbSBzY2FuIGtl eXMgdGhhdApjYW4gdGVybWluYXRlIHRoZSBzY2FuKSByYXRjaGV0IGZvcndhcmQgaW4gbG9ja3N0 ZXAgd2l0aCB0aGUgaW5kZXggc2Nhbi4KTm9uLXJlcXVpcmVkIGFycmF5cyAoaS5lLiBhcnJheXMg ZnJvbSBzY2FuIGtleXMgdGhhdCBjYW4gb25seSBleGNsdWRlCm5vbi1tYXRjaGluZyB0dXBsZXMp IGFyZSBmb3IgdGhlIG1vc3QgcGFydCBhZHZhbmNlZCB2aWEgdGhpcyBzYW1lIHNlYXJjaApwcm9j ZXNzLiAgV2UganVzdCBjYW4ndCBhc3N1bWUgYSBmaXhlZCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0 aGUgY3VycmVudAplbGVtZW50IG9mIGFueSBub24tcmVxdWlyZWQgYXJyYXkgYW5kIHRoZSBwcm9n cmVzcyBvZiB0aGUgaW5kZXggc2Nhbgp0aHJvdWdoIHRoZSBpbmRleCdzIGtleSBzcGFjZSAodGhh dCB3b3VsZCBiZSB3cm9uZykuCgpOYXR1cmFsbHksIG9ubHkgcmVxdWlyZWQgU0FPUCBzY2FuIGtl eXMgdHJpZ2dlciBza2lwcGluZyBvdmVyIGxlYWYgcGFnZXMKKG5vbi1yZXF1aXJlZCBhcnJheXMg Y2Fubm90IHNhZmVseSBlbmQgb3Igc3RhcnQgcHJpbWl0aXZlIGluZGV4IHNjYW5zKS4KQ29uc2Vx dWVudGx5LCBpbmRleCBzY2FucyBvZiBhIGNvbXBvc2l0ZSBpbmRleCB3aXRoIChzYXkpIGEgaGln aC1vcmRlcgppbmVxdWFsaXR5IHNjYW4ga2V5ICh3aGljaCB3ZSdsbCBtYXJrIHJlcXVpcmVkKSBh bmQgYSBsb3ctb3JkZXIgU0FPUApzY2FuIGtleSAod2hpY2ggd2UnbGwgbWFyayBub24tcmVxdWly ZWQpIHdpbGwgbm93IHJlbGlhYmx5IG91dHB1dCByb3dzCmluIGluZGV4IG9yZGVyLiAgU3VjaCBz Y2FucyBhcmUgYWx3YXlzIGV4ZWN1dGVkIGFzIG9uZSBsYXJnZSBpbmRleCBzY2FuCnVuZGVyIHRo ZSBob29kLCB3aGljaCBpcyBvYnZpb3VzbHkgdGhlIG1vc3QgZWZmaWNpZW50IHdheSB0byBkbyBp dCwgZm9yCnRoZSB1c3VhbCByZWFzb24gKG5vIG1vcmUgd2FzdGluZyBjeWNsZXMgb24gcmVwZWF0 IGxlYWYgcGFnZSBhY2Nlc3NlcykuCkdlbmVyYWxpemluZyBTQU9QIGV4ZWN1dGlvbiBhbG9uZyB0 aGVzZSBsaW5lcyByZW1vdmVzIGFueSBxdWVzdGlvbiBvZgppbmRleCBzY2FucyBvdXRwdXR0aW5n IHR1cGxlcyBpbiBhbnkgb3JkZXIgdGhhdCBpc24ndCB0aGUgaW5kZXgncyBvcmRlci4KVGhpcyBh bGxvdyB1cyB0byByZW1vdmUgdmFyaW91cyBzcGVjaWFsIGNhc2VzIGZyb20gdGhlIHBsYW5uZXIg LS0gd2hpY2gKaW4gdHVybiBtYWtlcyB0aGUgbmJ0cmVlIHdvcmsgbW9yZSB3aWRlbHkgYXBwbGlj YWJsZSBhbmQgbW9yZSBlZmZlY3RpdmUuCgpCdWdmaXggY29tbWl0IDgwN2E0MGM1IHRhdWdodCB0 aGUgcGxhbm5lciB0byBhdm9pZCBnZW5lcmF0aW5nIHVuc2FmZQpwYXRoIGtleXM6IHBhdGgga2V5 cyBvbiBhIG11bHRpY29sdW1uIGluZGV4IHBhdGgsIHdpdGggYSBTQU9QIGNsYXVzZSBvbgphbnkg YXR0cmlidXRlIGJleW9uZCB0aGUgZmlyc3QvbW9zdCBzaWduaWZpY2FudCBhdHRyaWJ1dGUuICBU aGVzZSBjYXNlcwphcmUgbm93IGFsbCBzYWZlLCBzbyB3ZSBnbyBiYWNrIHRvIGdlbmVyYXRpbmcg cGF0aCBrZXlzIHdpdGhvdXQgcmVnYXJkCmZvciB0aGUgcHJlc2VuY2Ugb2YgU0FPUCBjbGF1c2Vz IChqdXN0IGxpa2Ugd2l0aCBhbnkgb3RoZXIgY2xhdXNlIHR5cGUpLgpBbHNvIHVuZG8gY2hhbmdl cyBmcm9tIGZvbGxvdy11cCBidWdmaXggY29tbWl0IGE0NTIzYzVhLCB3aGljaCB0YXVnaHQKdGhl IHBsYW5uZXIgdG8gcHJvZHVjZSBhbHRlcm5hdGl2ZSBpbmRleCBwYXRocyB3aXRob3V0IGFueSBs b3ctb3JkZXIKU2NhbGFyQXJyYXlPcEV4cHIgcXVhbHMgKG1ha2luZyB0aGUgU0FPUCBxdWFscyBp bnRvIGZpbHRlciBxdWFscykuCldlJ2xsIG5vIGxvbmdlciBnZW5lcmF0ZSB0aGVzZSBhbHRlcm5h dGl2ZSBwYXRocywgd2hpY2ggY2FuIG5vIGxvbmdlcgpvZmZlciBhbnkgYWR2YW50YWdlIG92ZXIg dGhlIGluZGV4IHF1YWwgcGF0aHMgdGhhdCB3ZSBkbyBzdGlsbCBnZW5lcmF0ZS4KCkFmZmVjdGVk IHF1ZXJpZXMgdGhlcmVieSBhdm9pZCBhbGwgb2YgdGhlIGRpc2FkdmFudGFnZXMgdGhhdCBjb21l IGZyb20KdXNpbmcgZmlsdGVyIHF1YWxzIHdpdGhpbiBpbmRleCBzY2FuIG5vZGVzLiAgSW4gcGFy dGljdWxhciwgdGhleSBjYW4KYXZvaWQgdGhlIGV4dHJhIGhlYXAgcGFnZSBhY2Nlc3NlcyBwcmV2 aW91c2x5IGluY3VycmVkIHdoZW4gdXNpbmcgZmlsdGVyCnF1YWxzIHRvIGV4Y2x1ZGUgbm9uLW1h dGNoaW5nIHR1cGxlcyAoaW5kZXggcXVhbHMgY2FuIGJlIHVzZWQgaW5zdGVhZCkuClRoaXMgc2hp ZnQgaXMgZXhwZWN0ZWQgdG8gYmUgZmFpcmx5IGNvbW1vbiBpbiByZWFsIHdvcmxkIGFwcGxpY2F0 aW9ucywKZXNwZWNpYWxseSB3aXRoIHF1ZXJpZXMgdGhhdCBoYXZlIG11bHRpcGxlIFNBT1BzIHRo YXQgY2FuIG5vdyBhbGwgYmUKdXNlZCBhcyBpbmRleCBxdWFscyB3aGVuIHNjYW5uaW5nIGEgY29t cG9zaXRlIGluZGV4LiAgUXVlcmllcyB3aXRoCmxvdy1vcmRlciBTQU9QcyAoZXNwZWNpYWxseSBu b24tcmVxdWlyZWQgb25lcykgYXJlIGFsc28gbGlrZWx5IHRvIHNlZSBhCnNpZ25pZmljYW50IHJl ZHVjdGlvbiBpbiBoZWFwIHBhZ2UgYWNjZXNzZXMuCgpBdXRob3I6IFBldGVyIEdlb2doZWdhbiA8 cGdAYm93dC5pZT4KUmV2aWV3ZWQtQnk6IE1hdHRoaWFzIHZhbiBkZSBNZWVudCA8Ym9la2V3dXJt K3Bvc3RncmVzQGdtYWlsLmNvbT4KRGlzY3Vzc2lvbjogaHR0cHM6Ly9wb3N0Z3IuZXMvbS9DQUgy LVd6PWtzdk5fc2pjbkQxK0J0LVd0aWZSQTVvazQ4YURZbnEzcGtLaHhnTVFwY3dAbWFpbC5nbWFp bC5jb20KLS0tCiBzcmMvaW5jbHVkZS9hY2Nlc3MvbmJ0cmVlLmggICAgICAgICAgICAgICAgfCAg IDQyICstCiBzcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHJlZS5jICAgICAgICAgfCAgIDYz ICstCiBzcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHNlYXJjaC5jICAgICAgfCAgIDg0ICst CiBzcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHV0aWxzLmMgICAgICAgfCAxNzI3ICsrKysr KysrKysrKysrKysrKystCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4cGF0aC5jICAg ICAgfCAgIDg2ICstCiBzcmMvYmFja2VuZC91dGlscy9hZHQvc2VsZnVuY3MuYyAgICAgICAgICAg fCAgMTIyICstCiBkb2Mvc3JjL3NnbWwvbW9uaXRvcmluZy5zZ21sICAgICAgICAgICAgICAgfCAg IDEzICsKIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY3JlYXRlX2luZGV4Lm91dCB8ICAgNjEg Ky0KIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQgICAgICAgICB8ICAgIDUgKy0K IHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2NyZWF0ZV9pbmRleC5zcWwgICAgICB8ICAgMjAgKy0KIDEw IGZpbGVzIGNoYW5nZWQsIDE5MzIgaW5zZXJ0aW9ucygrKSwgMjkxIGRlbGV0aW9ucygtKQoKZGlm ZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2FjY2Vzcy9uYnRyZWUuaCBiL3NyYy9pbmNsdWRlL2FjY2Vz cy9uYnRyZWUuaAppbmRleCA3YmZiZjMwODYuLjU2NmUxYzE1ZCAxMDA2NDQKLS0tIGEvc3JjL2lu Y2x1ZGUvYWNjZXNzL25idHJlZS5oCisrKyBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9uYnRyZWUuaApA QCAtOTY1LDcgKzk2NSw3IEBAIHR5cGVkZWYgc3RydWN0IEJUU2NhblBvc0RhdGEKIAkgKiBtb3Jl TGVmdCBhbmQgbW9yZVJpZ2h0IHRyYWNrIHdoZXRoZXIgd2UgdGhpbmsgdGhlcmUgbWF5IGJlIG1h dGNoaW5nCiAJICogaW5kZXggZW50cmllcyB0byB0aGUgbGVmdCBhbmQgcmlnaHQgb2YgdGhlIGN1 cnJlbnQgcGFnZSwgcmVzcGVjdGl2ZWx5LgogCSAqIFdlIGNhbiBjbGVhciB0aGUgYXBwcm9wcmlh dGUgb25lIG9mIHRoZXNlIGZsYWdzIHdoZW4gX2J0X2NoZWNra2V5cygpCi0JICogcmV0dXJucyBj b250aW51ZXNjYW4gPSBmYWxzZS4KKwkgKiBzZXRzIEJUUmVhZFBhZ2VTdGF0ZS5jb250aW51ZXNj YW4gPSBmYWxzZS4KIAkgKi8KIAlib29sCQltb3JlTGVmdDsKIAlib29sCQltb3JlUmlnaHQ7CkBA IC0xMDQzLDEzICsxMDQzLDEzIEBAIHR5cGVkZWYgc3RydWN0IEJUU2Nhbk9wYXF1ZURhdGEKIAog CS8qIHdvcmtzcGFjZSBmb3IgU0tfU0VBUkNIQVJSQVkgc3VwcG9ydCAqLwogCVNjYW5LZXkJCWFy cmF5S2V5RGF0YTsJLyogbW9kaWZpZWQgY29weSBvZiBzY2FuLT5rZXlEYXRhICovCi0JYm9vbAkJ YXJyYXlzU3RhcnRlZDsJLyogU3RhcnRlZCBhcnJheSBrZXlzLCBidXQgaGF2ZSB5ZXQgdG8gInJl YWNoCi0JCQkJCQkJCSAqIHBhc3QgdGhlIGVuZCIgb2YgYWxsIGFycmF5cz8gKi8KIAlpbnQJCQlu dW1BcnJheUtleXM7CS8qIG51bWJlciBvZiBlcXVhbGl0eS10eXBlIGFycmF5IGtleXMgKC0xIGlm CiAJCQkJCQkJCSAqIHRoZXJlIGFyZSBhbnkgdW5zYXRpc2ZpYWJsZSBhcnJheSBrZXlzKSAqLwot CWludAkJCWFycmF5S2V5Q291bnQ7CS8qIGNvdW50IGluZGljYXRpbmcgbnVtYmVyIG9mIGFycmF5 IHNjYW4ga2V5cwotCQkJCQkJCQkgKiBwcm9jZXNzZWQgKi8KKwlib29sCQluZWVkUHJpbVNjYW47 CS8qIFBlcmZvcm0gYW5vdGhlciBwcmltaXRpdmUgc2Nhbj8gKi8KIAlCVEFycmF5S2V5SW5mbyAq YXJyYXlLZXlzOwkvKiBpbmZvIGFib3V0IGVhY2ggZXF1YWxpdHktdHlwZSBhcnJheSBrZXkgKi8K KwlGbWdySW5mbyAgICpvcmRlclByb2NzOwkJLyogT1JERVIgcHJvY3MgZm9yIGVxdWFsaXR5IGNv bnN0cmFpbnQga2V5cyAqLworCWludAkJCW51bVByaW1TY2FuczsJLyogUnVubmluZyB0YWxseSBv ZiAjIHByaW1pdGl2ZSBpbmRleCBzY2FucworCQkJCQkJCQkgKiAodXNlZCB0byBjb29yZGluYXRl IHBhcmFsbGVsIHdvcmtlcnMpICovCiAJTWVtb3J5Q29udGV4dCBhcnJheUNvbnRleHQ7IC8qIHNj YW4tbGlmZXNwYW4gY29udGV4dCBmb3IgYXJyYXkgZGF0YSAqLwogCiAJLyogaW5mbyBhYm91dCBr aWxsZWQgaXRlbXMgaWYgYW55IChraWxsZWRJdGVtcyBpcyBOVUxMIGlmIG5ldmVyIHVzZWQpICov CkBAIC0xMDgzLDYgKzEwODMsMjkgQEAgdHlwZWRlZiBzdHJ1Y3QgQlRTY2FuT3BhcXVlRGF0YQog CiB0eXBlZGVmIEJUU2Nhbk9wYXF1ZURhdGEgKkJUU2Nhbk9wYXF1ZTsKIAorLyoKKyAqIF9idF9y ZWFkcGFnZSBzdGF0ZSB1c2VkIGFjcm9zcyBfYnRfY2hlY2trZXlzIGNhbGxzIGZvciBhIHBhZ2UK KyAqCisgKiBXaGVuIF9idF9yZWFkcGFnZSBpcyBjYWxsZWQgZHVyaW5nIGEgZm9yd2FyZCBzY2Fu IHRoYXQgaGFzIG9uZSBvciBtb3JlCisgKiBlcXVhbGl0eS10eXBlIFNLX1NFQVJDSEFSUkFZIHNj YW4ga2V5cywgaXQgaGFzIGFuIGV4dHJhIHJlc3BvbnNpYmlsaXR5OiB0bworICogc2V0IHVwIGlu Zm9ybWF0aW9uIGFib3V0IHRoZSBmaW5hbCB0dXBsZSBmcm9tIHRoZSBwYWdlLiAgVGhpcyBtdXN0 IGhhcHBlbgorICogYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvIF9idF9jaGVja2tleXMuICBfYnRf Y2hlY2trZXlzIHVzZXMgdGhlIGZpbmFsIHR1cGxlCisgKiB0byBtYW5hZ2UgYWR2YW5jZW1lbnQg b2YgdGhlIHNjYW4ncyBhcnJheSBrZXlzIG1vcmUgZWZmaWNpZW50bHkuCisgKi8KK3R5cGVkZWYg c3RydWN0IEJUUmVhZFBhZ2VTdGF0ZQoreworCS8qIElucHV0IHBhcmFtZXRlcnMsIHNldCBieSBf YnRfcmVhZHBhZ2UgKi8KKwlTY2FuRGlyZWN0aW9uIGRpcjsJCQkvKiBjdXJyZW50IHNjYW4gZGly ZWN0aW9uICovCisJSW5kZXhUdXBsZQlmaW5hbHR1cDsJCS8qIGZpbmFsIHR1cGxlIChoaWdoIGtl eSBmb3IgZm9yd2FyZCBzY2FucykgKi8KKworCS8qIE91dHB1dCBwYXJhbWV0ZXJzLCBzZXQgYnkg X2J0X2NoZWNra2V5cyAqLworCWJvb2wJCWNvbnRpbnVlc2NhbjsJLyogVGVybWluYXRlIG9uZ29p bmcgKHByaW1pdGl2ZSkgaW5kZXggc2Nhbj8gKi8KKworCS8qIFByaXZhdGUgX2J0X2NoZWNra2V5 cy1tYW5hZ2VkIHN0YXRlICovCisJYm9vbAkJZmluYWx0dXBjaGVja2VkOwkvKiBmaW5hbCB0dXBs ZSBjaGVja2VkIGFnYWluc3QgY3VycmVudAorCQkJCQkJCQkJICogU0tfU0VBUkNIQVJSQVkgYXJy YXkga2V5cz8gKi8KK30gQlRSZWFkUGFnZVN0YXRlOworCiAvKgogICogV2UgdXNlIHNvbWUgcHJp dmF0ZSBza19mbGFncyBiaXRzIGluIHByZXByb2Nlc3NlZCBzY2FuIGtleXMuICBXZSdyZSBhbGxv d2VkCiAgKiB0byB1c2UgYml0cyAxNi0zMSAoc2VlIHNrZXkuaCkuICBUaGUgdXBwZXJtb3N0IGJp dHMgYXJlIGNvcGllZCBmcm9tIHRoZQpAQCAtMTA5MCw2ICsxMTEzLDcgQEAgdHlwZWRlZiBCVFNj YW5PcGFxdWVEYXRhICpCVFNjYW5PcGFxdWU7CiAgKi8KICNkZWZpbmUgU0tfQlRfUkVRRldECTB4 MDAwMTAwMDAJLyogcmVxdWlyZWQgdG8gY29udGludWUgZm9yd2FyZCBzY2FuICovCiAjZGVmaW5l IFNLX0JUX1JFUUJLV0QJMHgwMDAyMDAwMAkvKiByZXF1aXJlZCB0byBjb250aW51ZSBiYWNrd2Fy ZCBzY2FuICovCisjZGVmaW5lIFNLX0JUX1JERE5BUlJBWQkweDAwMDQwMDAwCS8qIHJlZHVuZGFu dCBpbiBhcnJheSBwcmVwcm9jZXNzaW5nICovCiAjZGVmaW5lIFNLX0JUX0lORE9QVElPTl9TSElG VCAgMjQJLyogbXVzdCBjbGVhciB0aGUgYWJvdmUgYml0cyAqLwogI2RlZmluZSBTS19CVF9ERVND CQkJKElORE9QVElPTl9ERVNDIDw8IFNLX0JUX0lORE9QVElPTl9TSElGVCkKICNkZWZpbmUgU0tf QlRfTlVMTFNfRklSU1QJKElORE9QVElPTl9OVUxMU19GSVJTVCA8PCBTS19CVF9JTkRPUFRJT05f U0hJRlQpCkBAIC0xMTYwLDcgKzExODQsNyBAQCBleHRlcm4gYm9vbCBidGNhbnJldHVybihSZWxh dGlvbiBpbmRleCwgaW50IGF0dG5vKTsKIGV4dGVybiBib29sIF9idF9wYXJhbGxlbF9zZWl6ZShJ bmRleFNjYW5EZXNjIHNjYW4sIEJsb2NrTnVtYmVyICpwYWdlbm8pOwogZXh0ZXJuIHZvaWQgX2J0 X3BhcmFsbGVsX3JlbGVhc2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBCbG9ja051bWJlciBzY2FuX3Bh Z2UpOwogZXh0ZXJuIHZvaWQgX2J0X3BhcmFsbGVsX2RvbmUoSW5kZXhTY2FuRGVzYyBzY2FuKTsK LWV4dGVybiB2b2lkIF9idF9wYXJhbGxlbF9hZHZhbmNlX2FycmF5X2tleXMoSW5kZXhTY2FuRGVz YyBzY2FuKTsKK2V4dGVybiB2b2lkIF9idF9wYXJhbGxlbF9uZXh0X3ByaW1pdGl2ZV9zY2FuKElu ZGV4U2NhbkRlc2Mgc2Nhbik7CiAKIC8qCiAgKiBwcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgaW4g bmJ0ZGVkdXAuYwpAQCAtMTI1MywxMiArMTI3NywxMiBAQCBleHRlcm4gQlRTY2FuSW5zZXJ0IF9i dF9ta3NjYW5rZXkoUmVsYXRpb24gcmVsLCBJbmRleFR1cGxlIGl0dXApOwogZXh0ZXJuIHZvaWQg X2J0X2ZyZWVzdGFjayhCVFN0YWNrIHN0YWNrKTsKIGV4dGVybiB2b2lkIF9idF9wcmVwcm9jZXNz X2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKTsKIGV4dGVybiB2b2lkIF9idF9zdGFydF9h cnJheV9rZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpOwotZXh0ZXJu IGJvb2wgX2J0X2FkdmFuY2VfYXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJl Y3Rpb24gZGlyKTsKK2V4dGVybiBib29sIF9idF9hcnJheV9rZXlzX3JlbWFpbihJbmRleFNjYW5E ZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKTsKIGV4dGVybiB2b2lkIF9idF9tYXJrX2FycmF5 X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKTsKIGV4dGVybiB2b2lkIF9idF9yZXN0b3JlX2FycmF5 X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKTsKIGV4dGVybiB2b2lkIF9idF9wcmVwcm9jZXNzX2tl eXMoSW5kZXhTY2FuRGVzYyBzY2FuKTsKLWV4dGVybiBib29sIF9idF9jaGVja2tleXMoSW5kZXhT Y2FuRGVzYyBzY2FuLCBJbmRleFR1cGxlIHR1cGxlLAotCQkJCQkJICBpbnQgdHVwbmF0dHMsIFNj YW5EaXJlY3Rpb24gZGlyLCBib29sICpjb250aW51ZXNjYW4sCitleHRlcm4gYm9vbCBfYnRfY2hl Y2trZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgQlRSZWFkUGFnZVN0YXRlICpwc3RhdGUsCisJCQkJ CQkgIEluZGV4VHVwbGUgdHVwbGUsIGJvb2wgZmluYWx0dXAsCiAJCQkJCQkgIGJvb2wgcmVxdWly ZWRNYXRjaGVkQnlQcmVjaGVjayk7CiBleHRlcm4gdm9pZCBfYnRfa2lsbGl0ZW1zKEluZGV4U2Nh bkRlc2Mgc2Nhbik7CiBleHRlcm4gQlRDeWNsZUlkIF9idF92YWN1dW1fY3ljbGVpZChSZWxhdGlv biByZWwpOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRyZWUuYyBi L3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0cmVlLmMKaW5kZXggYTg4YjM2YTU4Li42MzI4 YThhNjMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0cmVlLmMKKysr IGIvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRyZWUuYwpAQCAtNDgsOCArNDgsOCBAQAog ICogQlRQQVJBTExFTF9JRExFIGluZGljYXRlcyB0aGF0IG5vIGJhY2tlbmQgaXMgY3VycmVudGx5 IGFkdmFuY2luZyB0aGUgc2NhbgogICogdG8gYSBuZXcgcGFnZTsgc29tZSBwcm9jZXNzIGNhbiBz dGFydCBkb2luZyB0aGF0LgogICoKLSAqIEJUUEFSQUxMRUxfRE9ORSBpbmRpY2F0ZXMgdGhhdCB0 aGUgc2NhbiBpcyBjb21wbGV0ZSAoaW5jbHVkaW5nIGVycm9yIGV4aXQpLgotICogV2UgcmVhY2gg dGhpcyBzdGF0ZSBvbmNlIGZvciBldmVyeSBkaXN0aW5jdCBjb21iaW5hdGlvbiBvZiBhcnJheSBr ZXlzLgorICogQlRQQVJBTExFTF9ET05FIGluZGljYXRlcyB0aGF0IHRoZSBwcmltaXRpdmUgaW5k ZXggc2NhbiBpcyBjb21wbGV0ZQorICogKGluY2x1ZGluZyBlcnJvciBleGl0KS4gIFJlYWNoZWQg b25jZSBwZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4uCiAgKi8KIHR5cGVkZWYgZW51bQogewpAQCAt NjksOCArNjksOCBAQCB0eXBlZGVmIHN0cnVjdCBCVFBhcmFsbGVsU2NhbkRlc2NEYXRhCiAJQlRQ U19TdGF0ZQlidHBzX3BhZ2VTdGF0dXM7CS8qIGluZGljYXRlcyB3aGV0aGVyIG5leHQgcGFnZSBp cwogCQkJCQkJCQkJICogYXZhaWxhYmxlIGZvciBzY2FuLiBzZWUgYWJvdmUgZm9yCiAJCQkJCQkJ CQkgKiBwb3NzaWJsZSBzdGF0ZXMgb2YgcGFyYWxsZWwgc2Nhbi4gKi8KLQlpbnQJCQlidHBzX2Fy cmF5S2V5Q291bnQ7IC8qIGNvdW50IGluZGljYXRpbmcgbnVtYmVyIG9mIGFycmF5IHNjYW4KLQkJ CQkJCQkJCSAqIGtleXMgcHJvY2Vzc2VkIGJ5IHBhcmFsbGVsIHNjYW4gKi8KKwlpbnQJCQlidHBz X251bVByaW1TY2FuczsJLyogY291bnQgaW5kaWNhdGluZyBudW1iZXIgb2YgcHJpbWl0aXZlCisJ CQkJCQkJCQkgKiBpbmRleCBzY2FucyAodXNlZCB3aXRoIGFycmF5IGtleXMpICovCiAJc2xvY2tf dAkJYnRwc19tdXRleDsJCS8qIHByb3RlY3RzIGFib3ZlIHZhcmlhYmxlcyAqLwogCUNvbmRpdGlv blZhcmlhYmxlIGJ0cHNfY3Y7CS8qIHVzZWQgdG8gc3luY2hyb25pemUgcGFyYWxsZWwgc2NhbiAq LwogfQkJCUJUUGFyYWxsZWxTY2FuRGVzY0RhdGE7CkBAIC0yNzUsOCArMjc1LDggQEAgYnRnZXR0 dXBsZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKQogCQkvKiBJZiB3ZSBo YXZlIGEgdHVwbGUsIHJldHVybiBpdCAuLi4gKi8KIAkJaWYgKHJlcykKIAkJCWJyZWFrOwotCQkv KiAuLi4gb3RoZXJ3aXNlIHNlZSBpZiB3ZSBoYXZlIG1vcmUgYXJyYXkga2V5cyB0byBkZWFsIHdp dGggKi8KLQl9IHdoaWxlIChzby0+bnVtQXJyYXlLZXlzICYmIF9idF9hZHZhbmNlX2FycmF5X2tl eXMoc2NhbiwgZGlyKSk7CisJCS8qIC4uLiBvdGhlcndpc2Ugc2VlIGlmIHdlIG5lZWQgYW5vdGhl ciBwcmltaXRpdmUgaW5kZXggc2NhbiAqLworCX0gd2hpbGUgKHNvLT5udW1BcnJheUtleXMgJiYg X2J0X2FycmF5X2tleXNfcmVtYWluKHNjYW4sIGRpcikpOwogCiAJcmV0dXJuIHJlczsKIH0KQEAg LTMzMyw4ICszMzMsOCBAQCBidGdldGJpdG1hcChJbmRleFNjYW5EZXNjIHNjYW4sIFRJREJpdG1h cCAqdGJtKQogCQkJCW50aWRzKys7CiAJCQl9CiAJCX0KLQkJLyogTm93IHNlZSBpZiB3ZSBoYXZl IG1vcmUgYXJyYXkga2V5cyB0byBkZWFsIHdpdGggKi8KLQl9IHdoaWxlIChzby0+bnVtQXJyYXlL ZXlzICYmIF9idF9hZHZhbmNlX2FycmF5X2tleXMoc2NhbiwgRm9yd2FyZFNjYW5EaXJlY3Rpb24p KTsKKwkJLyogTm93IHNlZSBpZiB3ZSBuZWVkIGFub3RoZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4g Ki8KKwl9IHdoaWxlIChzby0+bnVtQXJyYXlLZXlzICYmIF9idF9hcnJheV9rZXlzX3JlbWFpbihz Y2FuLCBGb3J3YXJkU2NhbkRpcmVjdGlvbikpOwogCiAJcmV0dXJuIG50aWRzOwogfQpAQCAtMzY0 LDkgKzM2NCwxMCBAQCBidGJlZ2luc2NhbihSZWxhdGlvbiByZWwsIGludCBua2V5cywgaW50IG5v cmRlcmJ5cykKIAkJc28tPmtleURhdGEgPSBOVUxMOwogCiAJc28tPmFycmF5S2V5RGF0YSA9IE5V TEw7CS8qIGFzc3VtZSBubyBhcnJheSBrZXlzIGZvciBub3cgKi8KLQlzby0+YXJyYXlzU3RhcnRl ZCA9IGZhbHNlOwogCXNvLT5udW1BcnJheUtleXMgPSAwOworCXNvLT5uZWVkUHJpbVNjYW4gPSBm YWxzZTsKIAlzby0+YXJyYXlLZXlzID0gTlVMTDsKKwlzby0+b3JkZXJQcm9jcyA9IE5VTEw7CiAJ c28tPmFycmF5Q29udGV4dCA9IE5VTEw7CiAKIAlzby0+a2lsbGVkSXRlbXMgPSBOVUxMOwkJLyog dW50aWwgbmVlZGVkICovCkBAIC00MDYsNyArNDA3LDggQEAgYnRyZXNjYW4oSW5kZXhTY2FuRGVz YyBzY2FuLCBTY2FuS2V5IHNjYW5rZXksIGludCBuc2NhbmtleXMsCiAJfQogCiAJc28tPm1hcmtJ dGVtSW5kZXggPSAtMTsKLQlzby0+YXJyYXlLZXlDb3VudCA9IDA7CisJc28tPm5lZWRQcmltU2Nh biA9IGZhbHNlOworCXNvLT5udW1QcmltU2NhbnMgPSAwOwogCXNvLT5maXJzdFBhZ2UgPSBmYWxz ZTsKIAlCVFNjYW5Qb3NVbnBpbklmUGlubmVkKHNvLT5tYXJrUG9zKTsKIAlCVFNjYW5Qb3NJbnZh bGlkYXRlKHNvLT5tYXJrUG9zKTsKQEAgLTU4OCw3ICs1OTAsNyBAQCBidGluaXRwYXJhbGxlbHNj YW4odm9pZCAqdGFyZ2V0KQogCVNwaW5Mb2NrSW5pdCgmYnRfdGFyZ2V0LT5idHBzX211dGV4KTsK IAlidF90YXJnZXQtPmJ0cHNfc2NhblBhZ2UgPSBJbnZhbGlkQmxvY2tOdW1iZXI7CiAJYnRfdGFy Z2V0LT5idHBzX3BhZ2VTdGF0dXMgPSBCVFBBUkFMTEVMX05PVF9JTklUSUFMSVpFRDsKLQlidF90 YXJnZXQtPmJ0cHNfYXJyYXlLZXlDb3VudCA9IDA7CisJYnRfdGFyZ2V0LT5idHBzX251bVByaW1T Y2FucyA9IDA7CiAJQ29uZGl0aW9uVmFyaWFibGVJbml0KCZidF90YXJnZXQtPmJ0cHNfY3YpOwog fQogCkBAIC02MTQsNyArNjE2LDcgQEAgYnRwYXJhbGxlbHJlc2NhbihJbmRleFNjYW5EZXNjIHNj YW4pCiAJU3BpbkxvY2tBY3F1aXJlKCZidHNjYW4tPmJ0cHNfbXV0ZXgpOwogCWJ0c2Nhbi0+YnRw c19zY2FuUGFnZSA9IEludmFsaWRCbG9ja051bWJlcjsKIAlidHNjYW4tPmJ0cHNfcGFnZVN0YXR1 cyA9IEJUUEFSQUxMRUxfTk9UX0lOSVRJQUxJWkVEOwotCWJ0c2Nhbi0+YnRwc19hcnJheUtleUNv dW50ID0gMDsKKwlidHNjYW4tPmJ0cHNfbnVtUHJpbVNjYW5zID0gMDsKIAlTcGluTG9ja1JlbGVh c2UoJmJ0c2Nhbi0+YnRwc19tdXRleCk7CiB9CiAKQEAgLTYyNSw3ICs2MjcsMTEgQEAgYnRwYXJh bGxlbHJlc2NhbihJbmRleFNjYW5EZXNjIHNjYW4pCiAgKgogICogVGhlIHJldHVybiB2YWx1ZSBp cyB0cnVlIGlmIHdlIHN1Y2Nlc3NmdWxseSBzZWl6ZWQgdGhlIHNjYW4gYW5kIGZhbHNlCiAgKiBp ZiB3ZSBkaWQgbm90LiAgVGhlIGxhdHRlciBjYXNlIG9jY3VycyBpZiBubyBwYWdlcyByZW1haW4g Zm9yIHRoZSBjdXJyZW50Ci0gKiBzZXQgb2Ygc2NhbmtleXMuCisgKiBwcmltaXRpdmUgaW5kZXgg c2Nhbi4KKyAqCisgKiBXaGVuIGFycmF5IHNjYW4ga2V5cyBhcmUgaW4gdXNlLCBlYWNoIHdvcmtl ciBwcm9jZXNzIGluZGVwZW5kZW50bHkgYWR2YW5jZXMKKyAqIGl0cyBhcnJheSBrZXlzLiAgSXQn cyBjcnVjaWFsIHRoYXQgZWFjaCB3b3JrZXIgcHJvY2VzcyBuZXZlciBiZSBhbGxvd2VkIHRvCisg KiBzY2FuIGEgcGFnZSBmcm9tIGJlZm9yZSB0aGUgY3VycmVudCBzY2FuIHBvc2l0aW9uLgogICoK ICAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSwgKnBhZ2VubyByZXR1cm5zIHRoZSBuZXh0 IG9yIGN1cnJlbnQgcGFnZQogICogb2YgdGhlIHNjYW4gKGRlcGVuZGluZyBvbiB0aGUgc2NhbiBk aXJlY3Rpb24pLiAgQW4gaW52YWxpZCBibG9jayBudW1iZXIKQEAgLTY1NiwxNiArNjYyLDE3IEBA IF9idF9wYXJhbGxlbF9zZWl6ZShJbmRleFNjYW5EZXNjIHNjYW4sIEJsb2NrTnVtYmVyICpwYWdl bm8pCiAJCVNwaW5Mb2NrQWNxdWlyZSgmYnRzY2FuLT5idHBzX211dGV4KTsKIAkJcGFnZVN0YXR1 cyA9IGJ0c2Nhbi0+YnRwc19wYWdlU3RhdHVzOwogCi0JCWlmIChzby0+YXJyYXlLZXlDb3VudCA8 IGJ0c2Nhbi0+YnRwc19hcnJheUtleUNvdW50KQorCQlpZiAoc28tPm51bVByaW1TY2FucyA8IGJ0 c2Nhbi0+YnRwc19udW1QcmltU2NhbnMpCiAJCXsKLQkJCS8qIFBhcmFsbGVsIHNjYW4gaGFzIGFs cmVhZHkgYWR2YW5jZWQgdG8gYSBuZXcgc2V0IG9mIHNjYW5rZXlzLiAqLworCQkJLyogVG9wLWxl dmVsIHNjYW4gYWxyZWFkeSBtb3ZlZCBvbiB0byBuZXh0IHByaW1pdGl2ZSBpbmRleCBzY2FuICov CiAJCQlzdGF0dXMgPSBmYWxzZTsKIAkJfQogCQllbHNlIGlmIChwYWdlU3RhdHVzID09IEJUUEFS QUxMRUxfRE9ORSkKIAkJewogCQkJLyoKLQkJCSAqIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHNldCBv ZiBzY2Fua2V5cy4gIFRoaXMgbWF5IGJlIHRoZSBlbmQsIG9yCi0JCQkgKiB0aGVyZSBjb3VsZCBi ZSBtb3JlIHNldHMgdG8gdHJ5LgorCQkJICogV2UncmUgZG9uZSB3aXRoIHRoaXMgcHJpbWl0aXZl IGluZGV4IHNjYW4uICBUaGlzIG1pZ2h0IGhhdmUKKwkJCSAqIGJlZW4gdGhlIGZpbmFsIHByaW1p dGl2ZSBpbmRleCBzY2FuIHJlcXVpcmVkLCBvciB0aGUgdG9wLWxldmVsCisJCQkgKiBpbmRleCBz Y2FuIG1pZ2h0IHJlcXVpcmUgYWRkaXRpb25hbCBwcmltaXRpdmUgc2NhbnMuCiAJCQkgKi8KIAkJ CXN0YXR1cyA9IGZhbHNlOwogCQl9CkBAIC02OTcsOSArNzA0LDEyIEBAIF9idF9wYXJhbGxlbF9z ZWl6ZShJbmRleFNjYW5EZXNjIHNjYW4sIEJsb2NrTnVtYmVyICpwYWdlbm8pCiB2b2lkCiBfYnRf cGFyYWxsZWxfcmVsZWFzZShJbmRleFNjYW5EZXNjIHNjYW4sIEJsb2NrTnVtYmVyIHNjYW5fcGFn ZSkKIHsKKwlCVFNjYW5PcGFxdWUgc28gUEdfVVNFRF9GT1JfQVNTRVJUU19PTkxZID0gKEJUU2Nh bk9wYXF1ZSkgc2Nhbi0+b3BhcXVlOwogCVBhcmFsbGVsSW5kZXhTY2FuRGVzYyBwYXJhbGxlbF9z Y2FuID0gc2Nhbi0+cGFyYWxsZWxfc2NhbjsKIAlCVFBhcmFsbGVsU2NhbkRlc2MgYnRzY2FuOwog CisJQXNzZXJ0KCFzby0+bmVlZFByaW1TY2FuKTsKKwogCWJ0c2NhbiA9IChCVFBhcmFsbGVsU2Nh bkRlc2MpIE9mZnNldFRvUG9pbnRlcigodm9pZCAqKSBwYXJhbGxlbF9zY2FuLAogCQkJCQkJCQkJ CQkJICBwYXJhbGxlbF9zY2FuLT5wc19vZmZzZXQpOwogCkBAIC03MzMsMTIgKzc0MywxMSBAQCBf YnRfcGFyYWxsZWxfZG9uZShJbmRleFNjYW5EZXNjIHNjYW4pCiAJCQkJCQkJCQkJCQkgIHBhcmFs bGVsX3NjYW4tPnBzX29mZnNldCk7CiAKIAkvKgotCSAqIE1hcmsgdGhlIHBhcmFsbGVsIHNjYW4g YXMgZG9uZSBmb3IgdGhpcyBjb21iaW5hdGlvbiBvZiBzY2FuIGtleXMsCi0JICogdW5sZXNzIHNv bWUgb3RoZXIgcHJvY2VzcyBhbHJlYWR5IGRpZCBzby4gIFNlZSBhbHNvCi0JICogX2J0X2FkdmFu Y2VfYXJyYXlfa2V5cy4KKwkgKiBNYXJrIHRoZSBwcmltaXRpdmUgaW5kZXggc2NhbiBhcyBkb25l LCB1bmxlc3Mgc29tZSBvdGhlciBwcm9jZXNzCisJICogYWxyZWFkeSBkaWQgc28uICBTZWUgYWxz byBfYnRfYXJyYXlfa2V5c19yZW1haW4uCiAJICovCiAJU3BpbkxvY2tBY3F1aXJlKCZidHNjYW4t PmJ0cHNfbXV0ZXgpOwotCWlmIChzby0+YXJyYXlLZXlDb3VudCA+PSBidHNjYW4tPmJ0cHNfYXJy YXlLZXlDb3VudCAmJgorCWlmIChzby0+bnVtUHJpbVNjYW5zID49IGJ0c2Nhbi0+YnRwc19udW1Q cmltU2NhbnMgJiYKIAkJYnRzY2FuLT5idHBzX3BhZ2VTdGF0dXMgIT0gQlRQQVJBTExFTF9ET05F KQogCXsKIAkJYnRzY2FuLT5idHBzX3BhZ2VTdGF0dXMgPSBCVFBBUkFMTEVMX0RPTkU7CkBAIC03 NTIsMTQgKzc2MSwxNCBAQCBfYnRfcGFyYWxsZWxfZG9uZShJbmRleFNjYW5EZXNjIHNjYW4pCiB9 CiAKIC8qCi0gKiBfYnRfcGFyYWxsZWxfYWR2YW5jZV9hcnJheV9rZXlzKCkgLS0gQWR2YW5jZXMg dGhlIHBhcmFsbGVsIHNjYW4gZm9yIGFycmF5Ci0gKgkJCWtleXMuCisgKiBfYnRfcGFyYWxsZWxf bmV4dF9wcmltaXRpdmVfc2NhbigpIC0tIEFkdmFuY2VzIHBhcmFsbGVsIHByaW1pdGl2ZSBzY2Fu CisgKgkJCWNvdW50ZXIgd2hlbiBhcnJheSBrZXlzIGFyZSBpbiB1c2UuCiAgKgotICogVXBkYXRl cyB0aGUgY291bnQgb2YgYXJyYXkga2V5cyBwcm9jZXNzZWQgZm9yIGJvdGggbG9jYWwgYW5kIHBh cmFsbGVsCisgKiBVcGRhdGVzIHRoZSBjb3VudCBvZiBwcmltaXRpdmUgaW5kZXggc2NhbnMgZm9y IGJvdGggbG9jYWwgYW5kIHBhcmFsbGVsCiAgKiBzY2Fucy4KICAqLwogdm9pZAotX2J0X3BhcmFs bGVsX2FkdmFuY2VfYXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNjYW4pCitfYnRfcGFyYWxsZWxf bmV4dF9wcmltaXRpdmVfc2NhbihJbmRleFNjYW5EZXNjIHNjYW4pCiB7CiAJQlRTY2FuT3BhcXVl IHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVlOwogCVBhcmFsbGVsSW5kZXhTY2FuRGVz YyBwYXJhbGxlbF9zY2FuID0gc2Nhbi0+cGFyYWxsZWxfc2NhbjsKQEAgLTc2OCwxMyArNzc3LDEz IEBAIF9idF9wYXJhbGxlbF9hZHZhbmNlX2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKQog CWJ0c2NhbiA9IChCVFBhcmFsbGVsU2NhbkRlc2MpIE9mZnNldFRvUG9pbnRlcigodm9pZCAqKSBw YXJhbGxlbF9zY2FuLAogCQkJCQkJCQkJCQkJICBwYXJhbGxlbF9zY2FuLT5wc19vZmZzZXQpOwog Ci0Jc28tPmFycmF5S2V5Q291bnQrKzsKKwlzby0+bnVtUHJpbVNjYW5zKys7CiAJU3BpbkxvY2tB Y3F1aXJlKCZidHNjYW4tPmJ0cHNfbXV0ZXgpOwogCWlmIChidHNjYW4tPmJ0cHNfcGFnZVN0YXR1 cyA9PSBCVFBBUkFMTEVMX0RPTkUpCiAJewogCQlidHNjYW4tPmJ0cHNfc2NhblBhZ2UgPSBJbnZh bGlkQmxvY2tOdW1iZXI7CiAJCWJ0c2Nhbi0+YnRwc19wYWdlU3RhdHVzID0gQlRQQVJBTExFTF9O T1RfSU5JVElBTElaRUQ7Ci0JCWJ0c2Nhbi0+YnRwc19hcnJheUtleUNvdW50Kys7CisJCWJ0c2Nh bi0+YnRwc19udW1QcmltU2NhbnMrKzsKIAl9CiAJU3BpbkxvY2tSZWxlYXNlKCZidHNjYW4tPmJ0 cHNfbXV0ZXgpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRz ZWFyY2guYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0c2VhcmNoLmMKaW5kZXggZWZj NTI4NGU1Li44MzQwMTI1MTQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUv bmJ0c2VhcmNoLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRzZWFyY2guYwpA QCAtODkzLDcgKzg5Myw3IEBAIF9idF9maXJzdChJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJl Y3Rpb24gZGlyKQogCSAqLwogCWlmICghc28tPnF1YWxfb2spCiAJewotCQkvKiBOb3RpZnkgYW55 IG90aGVyIHdvcmtlcnMgdGhhdCB3ZSdyZSBkb25lIHdpdGggdGhpcyBzY2FuIGtleS4gKi8KKwkJ LyogTm90aWZ5IGFueSBvdGhlciB3b3JrZXJzIHRoYXQgdGhpcyBwcmltaXRpdmUgc2NhbiBpcyBk b25lICovCiAJCV9idF9wYXJhbGxlbF9kb25lKHNjYW4pOwogCQlyZXR1cm4gZmFsc2U7CiAJfQpA QCAtMTUzNyw5ICsxNTM3LDkgQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2Nh bkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0pCiAJQlRQYWdlT3BhcXVlIG9wYXF1 ZTsKIAlPZmZzZXROdW1iZXIgbWlub2ZmOwogCU9mZnNldE51bWJlciBtYXhvZmY7Ci0JaW50CQkJ aXRlbUluZGV4OwotCWJvb2wJCWNvbnRpbnVlc2NhbjsKLQlpbnQJCQlpbmRuYXR0czsKKwlCVFJl YWRQYWdlU3RhdGUgcHN0YXRlOworCWludAkJCW51bUFycmF5S2V5cywKKwkJCQlpdGVtSW5kZXg7 CiAJYm9vbAkJcmVxdWlyZWRNYXRjaGVkQnlQcmVjaGVjazsKIAogCS8qCkBAIC0xNTYwLDggKzE1 NjAsMTIgQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBk aXIsIE9mZnNldE51bWJlciBvZmZudW0pCiAJCQlfYnRfcGFyYWxsZWxfcmVsZWFzZShzY2FuLCBC dWZmZXJHZXRCbG9ja051bWJlcihzby0+Y3VyclBvcy5idWYpKTsKIAl9CiAKLQljb250aW51ZXNj YW4gPSB0cnVlOwkJLyogZGVmYXVsdCBhc3N1bXB0aW9uICovCi0JaW5kbmF0dHMgPSBJbmRleFJl bGF0aW9uR2V0TnVtYmVyT2ZBdHRyaWJ1dGVzKHNjYW4tPmluZGV4UmVsYXRpb24pOworCXBzdGF0 ZS5kaXIgPSBkaXI7CisJcHN0YXRlLmZpbmFsdHVwID0gTlVMTDsKKwlwc3RhdGUuY29udGludWVz Y2FuID0gdHJ1ZTsgLyogZGVmYXVsdCBhc3N1bXB0aW9uICovCisJcHN0YXRlLmZpbmFsdHVwY2hl Y2tlZCA9IGZhbHNlOworCW51bUFycmF5S2V5cyA9IHNvLT5udW1BcnJheUtleXM7CisKIAltaW5v ZmYgPSBQX0ZJUlNUREFUQUtFWShvcGFxdWUpOwogCW1heG9mZiA9IFBhZ2VHZXRNYXhPZmZzZXRO dW1iZXIocGFnZSk7CiAKQEAgLTE2MDksOSArMTYxMywxMiBAQCBfYnRfcmVhZHBhZ2UoSW5kZXhT Y2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51bSkKIAkg KiB0aGUgbGFzdCBpdGVtIG9uIHRoZSBwYWdlIHdvdWxkIGdpdmUgYSBtb3JlIHByZWNpc2UgYW5z d2VyLgogCSAqCiAJICogV2Ugc2tpcCB0aGlzIGZvciB0aGUgZmlyc3QgcGFnZSBpbiB0aGUgc2Nh biB0byBldmFkZSB0aGUgcG9zc2libGUKLQkgKiBzbG93ZG93biBvZiB0aGUgcG9pbnQgcXVlcmll cy4KKwkgKiBzbG93ZG93biBvZiBwb2ludCBxdWVyaWVzLiAgTmV2ZXIgYXBwbHkgdGhlIG9wdGlt aXphdGlvbiB3aXRoIGEgc2NhbnMKKwkgKiB0aGF0IHVzZXMgYXJyYXkga2V5cywgZWl0aGVyLCBz aW5jZSB0aGF0IGJyZWFrcyBjZXJ0YWluIGFzc3VtcHRpb25zLgorCSAqIChPdXIgc2VhcmNoLXR5 cGUgc2NhbiBrZXlzIGNoYW5nZSB3aGVuZXZlciBfYnRfY2hlY2trZXlzIGFkdmFuY2VzIHRoZQor CSAqIGFycmF5cywgaW52YWxpZGF0aW5nIGFueSBwcmVjaGVjay4gIFRyYWNraW5nIGFsbCB0aGF0 IHdvdWxkIGJlIHRyaWNreS4pCiAJICovCi0JaWYgKCFzby0+Zmlyc3RQYWdlICYmIG1pbm9mZiA8 IG1heG9mZikKKwlpZiAoIXNvLT5maXJzdFBhZ2UgJiYgIW51bUFycmF5S2V5cyAmJiBtaW5vZmYg PCBtYXhvZmYpCiAJewogCQlJdGVtSWQJCWlpZDsKIAkJSW5kZXhUdXBsZQlpdHVwOwpAQCAtMTYy NSw4ICsxNjMyLDkgQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVj dGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0pCiAJCSAqIHNldCBmbGFnIHRvIHRydWUgaWYg YWxsIHJlcXVpcmVkIGtleXMgYXJlIHNhdGlzZmllZCBhbmQgZmFsc2UKIAkJICogb3RoZXJ3aXNl LgogCQkgKi8KLQkJKHZvaWQpIF9idF9jaGVja2tleXMoc2NhbiwgaXR1cCwgaW5kbmF0dHMsIGRp ciwKLQkJCQkJCQkgJnJlcXVpcmVkTWF0Y2hlZEJ5UHJlY2hlY2ssIGZhbHNlKTsKKwkJX2J0X2No ZWNra2V5cyhzY2FuLCAmcHN0YXRlLCBpdHVwLCBmYWxzZSwgZmFsc2UpOworCQlyZXF1aXJlZE1h dGNoZWRCeVByZWNoZWNrID0gcHN0YXRlLmNvbnRpbnVlc2NhbjsKKwkJcHN0YXRlLmNvbnRpbnVl c2NhbiA9IHRydWU7IC8qIHJlc2V0ICovCiAJfQogCWVsc2UKIAl7CkBAIC0xNjM2LDYgKzE2NDQs MTQgQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIs IE9mZnNldE51bWJlciBvZmZudW0pCiAKIAlpZiAoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIp KQogCXsKKwkJLyogU0tfU0VBUkNIQVJSQVkgZm9yd2FyZCBzY2FucyBtdXN0IHByb3ZpZGUgaGln aCBrZXkgdXAgZnJvbnQgKi8KKwkJaWYgKG51bUFycmF5S2V5cyAmJiAhUF9SSUdIVE1PU1Qob3Bh cXVlKSkKKwkJeworCQkJSXRlbUlkCQlpaWQgPSBQYWdlR2V0SXRlbUlkKHBhZ2UsIFBfSElLRVkp OworCisJCQlwc3RhdGUuZmluYWx0dXAgPSAoSW5kZXhUdXBsZSkgUGFnZUdldEl0ZW0ocGFnZSwg aWlkKTsKKwkJfQorCiAJCS8qIGxvYWQgaXRlbXNbXSBpbiBhc2NlbmRpbmcgb3JkZXIgKi8KIAkJ aXRlbUluZGV4ID0gMDsKIApAQCAtMTY1OSw4ICsxNjc1LDggQEAgX2J0X3JlYWRwYWdlKEluZGV4 U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0pCiAK IAkJCWl0dXAgPSAoSW5kZXhUdXBsZSkgUGFnZUdldEl0ZW0ocGFnZSwgaWlkKTsKIAotCQkJcGFz c2VzX3F1YWxzID0gX2J0X2NoZWNra2V5cyhzY2FuLCBpdHVwLCBpbmRuYXR0cywgZGlyLAotCQkJ CQkJCQkJCSAmY29udGludWVzY2FuLCByZXF1aXJlZE1hdGNoZWRCeVByZWNoZWNrKTsKKwkJCXBh c3Nlc19xdWFscyA9IF9idF9jaGVja2tleXMoc2NhbiwgJnBzdGF0ZSwgaXR1cCwgZmFsc2UsCisJ CQkJCQkJCQkJIHJlcXVpcmVkTWF0Y2hlZEJ5UHJlY2hlY2spOwogCiAJCQkvKgogCQkJICogSWYg dGhlIHJlc3VsdCBvZiBwcmVjaGVja2luZyByZXF1aXJlZCBrZXlzIHdhcyB0cnVlLCB0aGVuIGlu CkBAIC0xNjY4LDggKzE2ODQsOCBAQCBfYnRfcmVhZHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBT Y2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51bSkKIAkJCSAqIHJlc3VsdCBpcyB0 aGUgc2FtZS4KIAkJCSAqLwogCQkJQXNzZXJ0KCFyZXF1aXJlZE1hdGNoZWRCeVByZWNoZWNrIHx8 Ci0JCQkJICAgcGFzc2VzX3F1YWxzID09IF9idF9jaGVja2tleXMoc2NhbiwgaXR1cCwgaW5kbmF0 dHMsIGRpciwKLQkJCQkJCQkJCQkJCSAmY29udGludWVzY2FuLCBmYWxzZSkpOworCQkJCSAgIHBh c3Nlc19xdWFscyA9PSBfYnRfY2hlY2trZXlzKHNjYW4sICZwc3RhdGUsIGl0dXAsIGZhbHNlLAor CQkJCQkJCQkJCQkJIGZhbHNlKSk7CiAJCQlpZiAocGFzc2VzX3F1YWxzKQogCQkJewogCQkJCS8q IHR1cGxlIHBhc3NlcyBhbGwgc2NhbiBrZXkgY29uZGl0aW9ucyAqLwpAQCAtMTcwMyw3ICsxNzE5 LDcgQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIs IE9mZnNldE51bWJlciBvZmZudW0pCiAJCQkJfQogCQkJfQogCQkJLyogV2hlbiAhY29udGludWVz Y2FuLCB0aGVyZSBjYW4ndCBiZSBhbnkgbW9yZSBtYXRjaGVzLCBzbyBzdG9wICovCi0JCQlpZiAo IWNvbnRpbnVlc2NhbikKKwkJCWlmICghcHN0YXRlLmNvbnRpbnVlc2NhbikKIAkJCQlicmVhazsK IAogCQkJb2ZmbnVtID0gT2Zmc2V0TnVtYmVyTmV4dChvZmZudW0pOwpAQCAtMTcyMCwxNyArMTcz NiwxNiBAQCBfYnRfcmVhZHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRp ciwgT2Zmc2V0TnVtYmVyIG9mZm51bSkKIAkJICogb25seSBhcHBlYXIgb24gbm9uLXBpdm90IHR1 cGxlcyBvbiB0aGUgcmlnaHQgc2libGluZyBwYWdlIGFyZQogCQkgKiBjb21tb24uCiAJCSAqLwot CQlpZiAoY29udGludWVzY2FuICYmICFQX1JJR0hUTU9TVChvcGFxdWUpKQorCQlpZiAocHN0YXRl LmNvbnRpbnVlc2NhbiAmJiAhUF9SSUdIVE1PU1Qob3BhcXVlKSkKIAkJewogCQkJSXRlbUlkCQlp aWQgPSBQYWdlR2V0SXRlbUlkKHBhZ2UsIFBfSElLRVkpOwotCQkJSW5kZXhUdXBsZQlpdHVwID0g KEluZGV4VHVwbGUpIFBhZ2VHZXRJdGVtKHBhZ2UsIGlpZCk7Ci0JCQlpbnQJCQl0cnVuY2F0dDsK KwkJCUluZGV4VHVwbGUJaXR1cDsKIAotCQkJdHJ1bmNhdHQgPSBCVHJlZVR1cGxlR2V0TkF0dHMo aXR1cCwgc2Nhbi0+aW5kZXhSZWxhdGlvbik7Ci0JCQlfYnRfY2hlY2trZXlzKHNjYW4sIGl0dXAs IHRydW5jYXR0LCBkaXIsICZjb250aW51ZXNjYW4sIGZhbHNlKTsKKwkJCWl0dXAgPSAoSW5kZXhU dXBsZSkgUGFnZUdldEl0ZW0ocGFnZSwgaWlkKTsKKwkJCV9idF9jaGVja2tleXMoc2NhbiwgJnBz dGF0ZSwgaXR1cCwgdHJ1ZSwgZmFsc2UpOwogCQl9CiAKLQkJaWYgKCFjb250aW51ZXNjYW4pCisJ CWlmICghcHN0YXRlLmNvbnRpbnVlc2NhbikKIAkJCXNvLT5jdXJyUG9zLm1vcmVSaWdodCA9IGZh bHNlOwogCiAJCUFzc2VydChpdGVtSW5kZXggPD0gTWF4VElEc1BlckJUcmVlUGFnZSk7CkBAIC0x NzQwLDYgKzE3NTUsMTQgQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRp cmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0pCiAJfQogCWVsc2UKIAl7CisJCS8qIFNL X1NFQVJDSEFSUkFZIGJhY2t3YXJkIHNjYW5zIG11c3QgcHJvdmlkZSBmaW5hbCB0dXBsZSB1cCBm cm9udCAqLworCQlpZiAobnVtQXJyYXlLZXlzICYmIG1pbm9mZiA8PSBtYXhvZmYpCisJCXsKKwkJ CUl0ZW1JZAkJaWlkID0gUGFnZUdldEl0ZW1JZChwYWdlLCBtaW5vZmYpOworCisJCQlwc3RhdGUu ZmluYWx0dXAgPSAoSW5kZXhUdXBsZSkgUGFnZUdldEl0ZW0ocGFnZSwgaWlkKTsKKwkJfQorCiAJ CS8qIGxvYWQgaXRlbXNbXSBpbiBkZXNjZW5kaW5nIG9yZGVyICovCiAJCWl0ZW1JbmRleCA9IE1h eFRJRHNQZXJCVHJlZVBhZ2U7CiAKQEAgLTE3NTEsNiArMTc3NCw3IEBAIF9idF9yZWFkcGFnZShJ bmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyLCBPZmZzZXROdW1iZXIgb2ZmbnVt KQogCQkJSW5kZXhUdXBsZQlpdHVwOwogCQkJYm9vbAkJdHVwbGVfYWxpdmU7CiAJCQlib29sCQlw YXNzZXNfcXVhbHM7CisJCQlib29sCQlmaW5hbHR1cCA9IChvZmZudW0gPT0gbWlub2ZmKTsKIAog CQkJLyoKIAkJCSAqIElmIHRoZSBzY2FuIHNwZWNpZmllcyBub3QgdG8gcmV0dXJuIGtpbGxlZCB0 dXBsZXMsIHRoZW4gd2UKQEAgLTE3NjEsMTIgKzE3ODUsMTggQEAgX2J0X3JlYWRwYWdlKEluZGV4 U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0pCiAJ CQkgKiB0dXBsZSBvbiB0aGUgcGFnZSwgd2UgZG8gY2hlY2sgdGhlIGluZGV4IGtleXMsIHRvIHBy ZXZlbnQKIAkJCSAqIHVzZWxlc3NseSBhZHZhbmNpbmcgdG8gdGhlIHBhZ2UgdG8gdGhlIGxlZnQu ICBUaGlzIGlzIHNpbWlsYXIKIAkJCSAqIHRvIHRoZSBoaWdoIGtleSBvcHRpbWl6YXRpb24gdXNl ZCBieSBmb3J3YXJkIHNjYW5zLgorCQkJICoKKwkJCSAqIFNlcGFyYXRlbHksIF9idF9jaGVja2tl eXMgYWN0dWFsbHkgcmVxdWlyZXMgdGhhdCB3ZSBjYWxsIGl0CisJCQkgKiB3aXRoIHRoZSBmaW5h bCBub24tcGl2b3QgdHVwbGUgZnJvbSB0aGUgcGFnZSwgaWYgdGhlcmUncyBvbmUKKwkJCSAqIChm aW5hbCBwcm9jZXNzZWQgdHVwbGUsIG9yIGZpcnN0IHR1cGxlIGluIG9mZnNldCBudW1iZXIgdGVy bXMpLgorCQkJICogV2UgbXVzdCBpbmRpY2F0ZSB3aGljaCBwYXJ0aWN1bGFyIHR1cGxlIGNvbWVz IGxhc3QsIHRvby4KIAkJCSAqLwogCQkJaWYgKHNjYW4tPmlnbm9yZV9raWxsZWRfdHVwbGVzICYm IEl0ZW1JZElzRGVhZChpaWQpKQogCQkJewogCQkJCUFzc2VydChvZmZudW0gPj0gUF9GSVJTVERB VEFLRVkob3BhcXVlKSk7Ci0JCQkJaWYgKG9mZm51bSA+IFBfRklSU1REQVRBS0VZKG9wYXF1ZSkp CisJCQkJaWYgKCFmaW5hbHR1cCkKIAkJCQl7CisJCQkJCUFzc2VydChvZmZudW0gPiBtaW5vZmYp OwogCQkJCQlvZmZudW0gPSBPZmZzZXROdW1iZXJQcmV2KG9mZm51bSk7CiAJCQkJCWNvbnRpbnVl OwogCQkJCX0KQEAgLTE3NzgsOCArMTgwOCw4IEBAIF9idF9yZWFkcGFnZShJbmRleFNjYW5EZXNj IHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyLCBPZmZzZXROdW1iZXIgb2ZmbnVtKQogCiAJCQlpdHVw ID0gKEluZGV4VHVwbGUpIFBhZ2VHZXRJdGVtKHBhZ2UsIGlpZCk7CiAKLQkJCXBhc3Nlc19xdWFs cyA9IF9idF9jaGVja2tleXMoc2NhbiwgaXR1cCwgaW5kbmF0dHMsIGRpciwKLQkJCQkJCQkJCQkg JmNvbnRpbnVlc2NhbiwgcmVxdWlyZWRNYXRjaGVkQnlQcmVjaGVjayk7CisJCQlwYXNzZXNfcXVh bHMgPSBfYnRfY2hlY2trZXlzKHNjYW4sICZwc3RhdGUsIGl0dXAsIGZpbmFsdHVwLAorCQkJCQkJ CQkJCSByZXF1aXJlZE1hdGNoZWRCeVByZWNoZWNrKTsKIAogCQkJLyoKIAkJCSAqIElmIHRoZSBy ZXN1bHQgb2YgcHJlY2hlY2tpbmcgcmVxdWlyZWQga2V5cyB3YXMgdHJ1ZSwgdGhlbiBpbgpAQCAt MTc4Nyw4ICsxODE3LDggQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRp cmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0pCiAJCQkgKiByZXN1bHQgaXMgdGhlIHNh bWUuCiAJCQkgKi8KIAkJCUFzc2VydCghcmVxdWlyZWRNYXRjaGVkQnlQcmVjaGVjayB8fAotCQkJ CSAgIHBhc3Nlc19xdWFscyA9PSBfYnRfY2hlY2trZXlzKHNjYW4sIGl0dXAsIGluZG5hdHRzLCBk aXIsCi0JCQkJCQkJCQkJCQkgJmNvbnRpbnVlc2NhbiwgZmFsc2UpKTsKKwkJCQkgICBwYXNzZXNf cXVhbHMgPT0gX2J0X2NoZWNra2V5cyhzY2FuLCAmcHN0YXRlLCBpdHVwLAorCQkJCQkJCQkJCQkJ IGZpbmFsdHVwLCBmYWxzZSkpOwogCQkJaWYgKHBhc3Nlc19xdWFscyAmJiB0dXBsZV9hbGl2ZSkK IAkJCXsKIAkJCQkvKiB0dXBsZSBwYXNzZXMgYWxsIHNjYW4ga2V5IGNvbmRpdGlvbnMgKi8KQEAg LTE4MjcsNyArMTg1Nyw3IEBAIF9idF9yZWFkcGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5E aXJlY3Rpb24gZGlyLCBPZmZzZXROdW1iZXIgb2ZmbnVtKQogCQkJCQl9CiAJCQkJfQogCQkJfQot CQkJaWYgKCFjb250aW51ZXNjYW4pCisJCQlpZiAoIXBzdGF0ZS5jb250aW51ZXNjYW4pCiAJCQl7 CiAJCQkJLyogdGhlcmUgY2FuJ3QgYmUgYW55IG1vcmUgbWF0Y2hlcywgc28gc3RvcCAqLwogCQkJ CXNvLT5jdXJyUG9zLm1vcmVMZWZ0ID0gZmFsc2U7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9h Y2Nlc3MvbmJ0cmVlL25idHV0aWxzLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHV0 aWxzLmMKaW5kZXggMTUxMGI5N2ZiLi40ZDhlMzNhNGQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L2FjY2Vzcy9uYnRyZWUvbmJ0dXRpbHMuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVl L25idHV0aWxzLmMKQEAgLTMzLDcgKzMzLDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgQlRTb3J0QXJy YXlDb250ZXh0CiB7Ci0JRm1nckluZm8JZmxpbmZvOworCUZtZ3JJbmZvICAgKm9yZGVycHJvYzsK IAlPaWQJCQljb2xsYXRpb247CiAJYm9vbAkJcmV2ZXJzZTsKIH0gQlRTb3J0QXJyYXlDb250ZXh0 OwpAQCAtNDEsMTUgKzQxLDQxIEBAIHR5cGVkZWYgc3RydWN0IEJUU29ydEFycmF5Q29udGV4dAog c3RhdGljIERhdHVtIF9idF9maW5kX2V4dHJlbWVfZWxlbWVudChJbmRleFNjYW5EZXNjIHNjYW4s IFNjYW5LZXkgc2tleSwKIAkJCQkJCQkJCSAgU3RyYXRlZ3lOdW1iZXIgc3RyYXQsCiAJCQkJCQkJ CQkgIERhdHVtICplbGVtcywgaW50IG5lbGVtcyk7CitzdGF0aWMgdm9pZCBfYnRfc29ydF9hcnJh eV9jbXBfc2V0dXAoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuS2V5IHNrZXkpOwogc3RhdGljIGlu dAlfYnRfc29ydF9hcnJheV9lbGVtZW50cyhJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5LZXkgc2tl eSwKIAkJCQkJCQkJCWJvb2wgcmV2ZXJzZSwKIAkJCQkJCQkJCURhdHVtICplbGVtcywgaW50IG5l bGVtcyk7CitzdGF0aWMgaW50CV9idF9tZXJnZV9hcnJheXMoSW5kZXhTY2FuRGVzYyBzY2FuLCBT Y2FuS2V5IHNrZXksIGJvb2wgcmV2ZXJzZSwKKwkJCQkJCQkgRGF0dW0gKmVsZW1zX29yaWcsIGlu dCBuZWxlbXNfb3JpZywKKwkJCQkJCQkgRGF0dW0gKmVsZW1zX25leHQsIGludCBuZWxlbXNfbmV4 dCk7CiBzdGF0aWMgaW50CV9idF9jb21wYXJlX2FycmF5X2VsZW1lbnRzKGNvbnN0IHZvaWQgKmEs IGNvbnN0IHZvaWQgKmIsIHZvaWQgKmFyZyk7CitzdGF0aWMgaW5saW5lIGludDMyIF9idF9jb21w YXJlX2FycmF5X3NrZXkoRm1nckluZm8gKm9yZGVycHJvYywKKwkJCQkJCQkJCQkgICBEYXR1bSB0 dXBkYXR1bSwgYm9vbCB0dXBudWxsLAorCQkJCQkJCQkJCSAgIERhdHVtIGFycmRhdHVtLCBTY2Fu S2V5IGN1cik7CitzdGF0aWMgaW50CV9idF9iaW5zcmNoX2FycmF5X3NrZXkoRm1nckluZm8gKm9y ZGVycHJvYywKKwkJCQkJCQkJICAgYm9vbCBjdXJfZWxlbV9zdGFydCwgU2NhbkRpcmVjdGlvbiBk aXIsCisJCQkJCQkJCSAgIERhdHVtIHR1cGRhdHVtLCBib29sIHR1cG51bGwsCisJCQkJCQkJCSAg IEJUQXJyYXlLZXlJbmZvICphcnJheSwgU2NhbktleSBjdXIsCisJCQkJCQkJCSAgIGludDMyICpm aW5hbF9yZXN1bHQpOworc3RhdGljIGJvb2wgX2J0X2FkdmFuY2VfYXJyYXlfa2V5c19pbmNyZW1l bnQoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcik7CitzdGF0aWMgYm9vbCBf YnRfdHVwbGVfYmVmb3JlX2FycmF5X3NrZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwKKwkJCQkJCQkJ CQkgQlRSZWFkUGFnZVN0YXRlICpwc3RhdGUsCisJCQkJCQkJCQkJIEluZGV4VHVwbGUgdHVwbGUs IGludCBza3RyaWcpOworc3RhdGljIGJvb2wgX2J0X2FkdmFuY2VfYXJyYXlfa2V5cyhJbmRleFNj YW5EZXNjIHNjYW4sIEJUUmVhZFBhZ2VTdGF0ZSAqcHN0YXRlLAorCQkJCQkJCQkgICBJbmRleFR1 cGxlIHR1cGxlLCBpbnQgc2t0cmlnKTsKK3N0YXRpYyB2b2lkIF9idF91cGRhdGVfa2V5c193aXRo X2FycmF5a2V5cyhJbmRleFNjYW5EZXNjIHNjYW4pOworI2lmZGVmIFVTRV9BU1NFUlRfQ0hFQ0tJ TkcKK3N0YXRpYyBib29sIF9idF92ZXJpZnlfa2V5c193aXRoX2FycmF5a2V5cyhJbmRleFNjYW5E ZXNjIHNjYW4pOworI2VuZGlmCiBzdGF0aWMgYm9vbCBfYnRfY29tcGFyZV9zY2Fua2V5X2FyZ3Mo SW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuS2V5IG9wLAogCQkJCQkJCQkJIFNjYW5LZXkgbGVmdGFy ZywgU2NhbktleSByaWdodGFyZywKIAkJCQkJCQkJCSBib29sICpyZXN1bHQpOwogc3RhdGljIGJv b2wgX2J0X2ZpeF9zY2Fua2V5X3N0cmF0ZWd5KFNjYW5LZXkgc2tleSwgaW50MTYgKmluZG9wdGlv bik7CiBzdGF0aWMgdm9pZCBfYnRfbWFya19zY2Fua2V5X3JlcXVpcmVkKFNjYW5LZXkgc2tleSk7 CitzdGF0aWMgYm9vbCBfYnRfY2hlY2tfY29tcGFyZShTY2FuRGlyZWN0aW9uIGRpciwgQlRTY2Fu T3BhcXVlIHNvLAorCQkJCQkJCSAgSW5kZXhUdXBsZSB0dXBsZSwgaW50IHR1cG5hdHRzLCBUdXBs ZURlc2MgdHVwZGVzYywKKwkJCQkJCQkgIGJvb2wgKmNvbnRpbnVlc2NhbiwgaW50ICpza3RyaWcs CisJCQkJCQkJICBib29sIHJlcXVpcmVkTWF0Y2hlZEJ5UHJlY2hlY2spOwogc3RhdGljIGJvb2wg X2J0X2NoZWNrX3Jvd2NvbXBhcmUoU2NhbktleSBza2V5LAogCQkJCQkJCQkgSW5kZXhUdXBsZSB0 dXBsZSwgaW50IHR1cG5hdHRzLCBUdXBsZURlc2MgdHVwZGVzYywKIAkJCQkJCQkJIFNjYW5EaXJl Y3Rpb24gZGlyLCBib29sICpjb250aW51ZXNjYW4pOwpAQCAtMTk4LDEzICsyMjQsNDggQEAgX2J0 X2ZyZWVzdGFjayhCVFN0YWNrIHN0YWNrKQogICogSWYgdGhlcmUgYXJlIGFueSBTS19TRUFSQ0hB UlJBWSBzY2FuIGtleXMsIGRlY29uc3RydWN0IHRoZSBhcnJheShzKSBhbmQKICAqIHNldCB1cCBC VEFycmF5S2V5SW5mbyBpbmZvIGZvciBlYWNoIG9uZSB0aGF0IGlzIGFuIGVxdWFsaXR5LXR5cGUg a2V5LgogICogUHJlcGFyZSBtb2RpZmllZCBzY2FuIGtleXMgaW4gc28tPmFycmF5S2V5RGF0YSwg d2hpY2ggd2lsbCBob2xkIHRoZSBjdXJyZW50Ci0gKiBhcnJheSBlbGVtZW50cyBkdXJpbmcgZWFj aCBwcmltaXRpdmUgaW5kZXhzY2FuIG9wZXJhdGlvbi4gIEZvciBpbmVxdWFsaXR5Ci0gKiBhcnJh eSBrZXlzLCBpdCdzIHN1ZmZpY2llbnQgdG8gZmluZCB0aGUgZXh0cmVtZSBlbGVtZW50IHZhbHVl IGFuZCByZXBsYWNlCi0gKiB0aGUgd2hvbGUgYXJyYXkgd2l0aCB0aGF0IHNjYWxhciB2YWx1ZS4K KyAqIGFycmF5IGVsZW1lbnRzLgorICoKKyAqIF9idF9wcmVwcm9jZXNzX2tleXMgdHJlYXRzIGVh Y2ggcHJpbWl0aXZlIHNjYW4gYXMgYW4gaW5kZXBlbmRlbnQgcGllY2Ugb2YKKyAqIHdvcmsuICBU aGF0IHN0cnVjdHVyZSBwdXNoZXMgdGhlIHJlc3BvbnNpYmlsaXR5IGZvciBwcmVwcm9jZXNzaW5n IHRoYXQgbXVzdAorICogd29yayAiYWNyb3NzIGFycmF5IGtleXMiIG9udG8gdXMuICBUaGlzIGRp dmlzaW9uIG9mIGxhYm9yIG1ha2VzIHNlbnNlIG9uY2UKKyAqIHlvdSBjb25zaWRlciB0aGF0IHdl J3JlIHR5cGljYWxseSBjYWxsZWQgbm8gbW9yZSB0aGFuIG9uY2UgcGVyIGJ0cmVzY2FuLAorICog d2hlcmVhcyBfYnRfcHJlcHJvY2Vzc19rZXlzIGlzIGFsd2F5cyBjYWxsZWQgb25jZSBwZXIgcHJp bWl0aXZlIGluZGV4IHNjYW4uCisgKgorICogQ3VycmVudGx5IHdlIHBlcmZvcm0gdHdvIGtpbmRz IG9mIHByZXByb2Nlc3NpbmcgdG8gZGVhbCB3aXRoIHJlZHVuZGFuY2llcy4KKyAqIEZvciBpbmVx dWFsaXR5IGFycmF5IGtleXMsIGl0J3Mgc3VmZmljaWVudCB0byBmaW5kIHRoZSBleHRyZW1lIGVs ZW1lbnQKKyAqIHZhbHVlIGFuZCByZXBsYWNlIHRoZSB3aG9sZSBhcnJheSB3aXRoIHRoYXQgc2Nh bGFyIHZhbHVlLiAgVGhpcyBlbGltaW5hdGVzCisgKiBhbGwgYnV0IG9uZSBhcnJheSBrZXkgYXMg cmVkdW5kYW50LiAgU2ltaWxhcmx5LCB3ZSBhcmUgY2FwYWJsZSBvZiAibWVyZ2luZworICogdG9n ZXRoZXIiIG11bHRpcGxlIGVxdWFsaXR5IGFycmF5IGtleXMgZnJvbSB0d28gb3IgbW9yZSBpbnB1 dCBzY2FuIGtleXMKKyAqIGludG8gYSBzaW5nbGUgb3V0cHV0IHNjYW4ga2V5IHRoYXQgY29udGFp bnMgb25seSB0aGUgaW50ZXJzZWN0aW5nIGFycmF5CisgKiBlbGVtZW50cy4gIFRoaXMgY2FuIGVs aW1pbmF0ZSBtYW55IHJlZHVuZGFudCBhcnJheSBlbGVtZW50cywgYXMgd2VsbCBhcworICogZWxp bWluYXRpbmcgd2hvbGUgYXJyYXkgc2NhbiBrZXlzIGFzIHJlZHVuZGFudC4KKyAqCisgKiBOb3Rl OiBfYnRfc3RhcnRfYXJyYXlfa2V5cyBhY3R1YWxseSBzZXRzIHVwIHRoZSBjdXJfZWxlbSBjb3Vu dGVycyBsYXRlciBvbiwKKyAqIG9uY2UgdGhlIHNjYW4gZGlyZWN0aW9uIGlzIGtub3duLgogICoK ICAqIE5vdGU6IHRoZSByZWFzb24gd2UgbmVlZCBzby0+YXJyYXlLZXlEYXRhLCByYXRoZXIgdGhh biBqdXN0IHNjcmliYmxpbmcKICAqIG9uIHNjYW4tPmtleURhdGEsIGlzIHRoYXQgY2FsbGVycyBh cmUgcGVybWl0dGVkIHRvIGNhbGwgYnRyZXNjYW4gd2l0aG91dAogICogc3VwcGx5aW5nIGEgbmV3 IHNldCBvZiBzY2Fua2V5IGRhdGEuCisgKgorICogTm90ZTogX2J0X3ByZXByb2Nlc3Nfa2V5cyBp cyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIHNvLT5rZXlEYXRhIHNjYW4KKyAqIGtleXMg dXNlZCBieSBfYnRfY2hlY2trZXlzLiAgSW5kZXggc2NhbnMgdGhhdCBkb24ndCB1c2UgZXF1YWxp dHkgYXJyYXkga2V5cworICogd2lsbCBoYXZlIF9idF9wcmVwcm9jZXNzX2tleXMgdHJlYXQgc2Nh bi0+a2V5RGF0YSBhcyBpbnB1dCBhbmQgc28tPmtleURhdGEKKyAqIGFzIG91dHB1dC4gIFNjYW5z IHRoYXQgdXNlIGVxdWFsaXR5IGFycmF5IGtleXMgaGF2ZSBfYnRfcHJlcHJvY2Vzc19rZXlzCisg KiB0cmVhdCBzby0+YXJyYXlLZXlEYXRhICh3aGljaCBpcyBvdXIgb3V0cHV0KSBhcyB0aGVpciBp bnB1dCwgd2hpbGUgKGFzIHBlcgorICogdXN1YWwpIG91dHB1dHRpbmcgc28tPmtleURhdGEgZm9y IF9idF9jaGVja2tleXMuICBUaGlzIGZ1bmN0aW9uIGFkZHMgYW4KKyAqIGFkZGl0aW9uYWwgbGF5 ZXIgb2YgaW5kaXJlY3Rpb24gdGhhdCBhbGxvd3MgX2J0X3ByZXByb2Nlc3Nfa2V5cyB0byBtb3Jl IG9yCisgKiBsZXNzIGF2b2lkIGRlYWxpbmcgd2l0aCBTS19TRUFSQ0hBUlJBWSBhcyBhIHNwZWNp YWwgY2FzZS4KKyAqCisgKiBOb3RlOiBfYnRfdXBkYXRlX2tleXNfd2l0aF9hcnJheWtleXMgd29y a3MgYnkgdXBkYXRpbmcgYWxyZWFkeS1wcm9jZXNzZWQKKyAqIG91dHB1dCBrZXlzIChzby0+a2V5 RGF0YSkgaW4tcGxhY2UuICBJdCBjYW5ub3QgZWxpbWluYXRlIHJlZHVuZGFudCBvcgorICogY29u dHJhZGljdG9yeSBzY2FuIGtleXMuICBUaGlzIG5lY2Vzc2l0YXRlcyBoYXZpbmcgX2J0X3ByZXBy b2Nlc3Nfa2V5cworICogdW5kZXJzdGFuZCB0aGF0IGl0IGlzIHVuc2FmZSB0byBlbGltaW5hdGUg InJlZHVuZGFudCIgU0tfU0VBUkNIQVJSQVkKKyAqIGVxdWFsaXR5IHNjYW4ga2V5cyBvbiB0aGUg YmFzaXMgb2Ygd2hhdCBpcyBhY3R1YWxseSBqdXN0IHRoZSBjdXJyZW50IGFycmF5CisgKiBrZXkg dmFsdWVzIC0tIGl0IG11c3QgY29uc2VydmF0aXZlbHkgYXNzdW1lIHRoYXQgc3VjaCBhIHNjYW4g a2V5IG1pZ2h0IG5vCisgKiBsb25nZXIgYmUgcmVkdW5kYW50IGFmdGVyIHRoZSBuZXh0IF9idF91 cGRhdGVfa2V5c193aXRoX2FycmF5a2V5cyBjYWxsLgorICogSWRlYWxseSB3ZSdkIGJlIGFibGUg dG8gZGVhbCB3aXRoIHRoYXQgYnkgZWxpbWluYXRpbmcgYSBzdWJzZXQgb2YgdHJ1bHkKKyAqIHJl ZHVuZGFudCBhcnJheSBrZXlzIHVwLWZyb250LCBidXQgaXQgZG9lc24ndCBzZWVtIHdvcnRoIHRo ZSB0cm91YmxlLgogICovCiB2b2lkCiBfYnRfcHJlcHJvY2Vzc19hcnJheV9rZXlzKEluZGV4U2Nh bkRlc2Mgc2NhbikKQEAgLTIxMiw3ICsyNzMsOSBAQCBfYnRfcHJlcHJvY2Vzc19hcnJheV9rZXlz KEluZGV4U2NhbkRlc2Mgc2NhbikKIAlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBz Y2FuLT5vcGFxdWU7CiAJaW50CQkJbnVtYmVyT2ZLZXlzID0gc2Nhbi0+bnVtYmVyT2ZLZXlzOwog CWludDE2CSAgICppbmRvcHRpb24gPSBzY2FuLT5pbmRleFJlbGF0aW9uLT5yZF9pbmRvcHRpb247 CisJaW50MTYJCW5rZXlhdHRzID0gSW5kZXhSZWxhdGlvbkdldE51bWJlck9mS2V5QXR0cmlidXRl cyhzY2FuLT5pbmRleFJlbGF0aW9uKTsKIAlpbnQJCQludW1BcnJheUtleXM7CisJaW50CQkJbGFz dEVxdWFsaXR5QXJyYXlBdHQgPSAtMTsKIAlTY2FuS2V5CQljdXI7CiAJaW50CQkJaTsKIAlNZW1v cnlDb250ZXh0IG9sZENvbnRleHQ7CkBAIC0yNjUsNiArMzI4LDcgQEAgX2J0X3ByZXByb2Nlc3Nf YXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNjYW4pCiAKIAkvKiBBbGxvY2F0ZSBzcGFjZSBmb3Ig cGVyLWFycmF5IGRhdGEgaW4gdGhlIHdvcmtzcGFjZSBjb250ZXh0ICovCiAJc28tPmFycmF5S2V5 cyA9IChCVEFycmF5S2V5SW5mbyAqKSBwYWxsb2MwKG51bUFycmF5S2V5cyAqIHNpemVvZihCVEFy cmF5S2V5SW5mbykpOworCXNvLT5vcmRlclByb2NzID0gKEZtZ3JJbmZvICopIHBhbGxvYzAobmtl eWF0dHMgKiBzaXplb2YoRm1nckluZm8pKTsKIAogCS8qIE5vdyBwcm9jZXNzIGVhY2ggYXJyYXkg a2V5ICovCiAJbnVtQXJyYXlLZXlzID0gMDsKQEAgLTI4MSw2ICszNDUsMTYgQEAgX2J0X3ByZXBy b2Nlc3NfYXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNjYW4pCiAJCWludAkJCWo7CiAKIAkJY3Vy ID0gJnNvLT5hcnJheUtleURhdGFbaV07CisKKwkJLyoKKwkJICogQXR0cmlidXRlcyB3aXRoIGVx dWFsaXR5LXR5cGUgc2NhbiBrZXlzIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkCisJCSAqIHRv IGFycmF5IHNjYW4ga2V5cykgd2lsbCBuZWVkIGEgMy13YXkgY29tcGFyaXNvbiBmdW5jdGlvbi4g ICBTZXQKKwkJICogdGhhdCB1cCBub3cuICAoQXZvaWRzIHJlcGVhdGluZyB3b3JrIGZvciB0aGUg c2FtZSBhdHRyaWJ1dGUuKQorCQkgKi8KKwkJaWYgKGN1ci0+c2tfc3RyYXRlZ3kgPT0gQlRFcXVh bFN0cmF0ZWd5TnVtYmVyICYmCisJCQkhT2lkSXNWYWxpZChzby0+b3JkZXJQcm9jc1tjdXItPnNr X2F0dG5vIC0gMV0uZm5fb2lkKSkKKwkJCV9idF9zb3J0X2FycmF5X2NtcF9zZXR1cChzY2FuLCBj dXIpOworCiAJCWlmICghKGN1ci0+c2tfZmxhZ3MgJiBTS19TRUFSQ0hBUlJBWSkpCiAJCQljb250 aW51ZTsKIApAQCAtMzU3LDYgKzQzMSw0NyBAQCBfYnRfcHJlcHJvY2Vzc19hcnJheV9rZXlzKElu ZGV4U2NhbkRlc2Mgc2NhbikKIAkJCQkJCQkJCQkJKGluZG9wdGlvbltjdXItPnNrX2F0dG5vIC0g MV0gJiBJTkRPUFRJT05fREVTQykgIT0gMCwKIAkJCQkJCQkJCQkJZWxlbV92YWx1ZXMsIG51bV9u b25udWxscyk7CiAKKwkJLyoKKwkJICogSWYgdGhpcyBzY2FuIGtleSBpcyBzZW1hbnRpY2FsbHkg ZXF1aXZhbGVudCB0byBhIHByZXZpb3VzIGVxdWFsaXR5CisJCSAqIG9wZXJhdG9yIGFycmF5IHNj YW4ga2V5LCBtZXJnZSB0aGUgdHdvIGFycmF5cyB0b2dldGhlciB0byBlbGltaW5hdGUKKwkJICog cmVkdW5kYW50IG5vbi1pbnRlcnNlY3RpbmcgZWxlbWVudHMgKGFuZCByZWR1bmRhbnQgd2hvbGUg c2NhbiBrZXlzKQorCQkgKi8KKwkJaWYgKGxhc3RFcXVhbGl0eUFycmF5QXR0ID09IGN1ci0+c2tf YXR0bm8pCisJCXsKKwkJCUJUQXJyYXlLZXlJbmZvICpwcmV2ID0gJnNvLT5hcnJheUtleXNbbnVt QXJyYXlLZXlzIC0gMV07CisKKwkJCUFzc2VydChzby0+YXJyYXlLZXlEYXRhW3ByZXYtPnNjYW5f a2V5XS5za19mdW5jLmZuX29pZCA9PQorCQkJCSAgIGN1ci0+c2tfZnVuYy5mbl9vaWQpOworCQkJ QXNzZXJ0KHNvLT5hcnJheUtleURhdGFbcHJldi0+c2Nhbl9rZXldLnNrX3N1YnR5cGUgPT0KKwkJ CQkgICBjdXItPnNrX3N1YnR5cGUpOworCisJCQludW1fZWxlbXMgPSBfYnRfbWVyZ2VfYXJyYXlz KHNjYW4sIGN1ciwKKwkJCQkJCQkJCQkgKGluZG9wdGlvbltjdXItPnNrX2F0dG5vIC0gMV0gJiBJ TkRPUFRJT05fREVTQykgIT0gMCwKKwkJCQkJCQkJCQkgcHJldi0+ZWxlbV92YWx1ZXMsIHByZXYt Pm51bV9lbGVtcywKKwkJCQkJCQkJCQkgZWxlbV92YWx1ZXMsIG51bV9lbGVtcyk7CisKKwkJCXBm cmVlKGVsZW1fdmFsdWVzKTsKKworCQkJLyoKKwkJCSAqIElmIHRoZXJlIGFyZSBubyBpbnRlcnNl Y3RpbmcgZWxlbWVudHMgbGVmdCBmcm9tIG1lcmdpbmcgdGhpcworCQkJICogYXJyYXkgaW50byB0 aGUgcHJldmlvdXMgYXJyYXkgb24gdGhlIHNhbWUgYXR0cmlidXRlLCB0aGUgc2NhbgorCQkJICog cXVhbCBpcyB1bnNhdGlzZmlhYmxlCisJCQkgKi8KKwkJCWlmIChudW1fZWxlbXMgPT0gMCkKKwkJ CXsKKwkJCQludW1BcnJheUtleXMgPSAtMTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJ CSAqIExvd2VyIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgZnJvbSB0aGUgcHJldmlvdXMgYXJyYXks IGFuZCBtYXJrCisJCQkgKiB0aGlzIHNjYW4ga2V5L2FycmF5IGFzIHJlZHVuZGFudCBmb3IgZXZl cnkgcHJpbWl0aXZlIGluZGV4IHNjYW4KKwkJCSAqLworCQkJcHJldi0+bnVtX2VsZW1zID0gbnVt X2VsZW1zOworCQkJY3VyLT5za19mbGFncyB8PSBTS19CVF9SREROQVJSQVk7CisJCQljb250aW51 ZTsKKwkJfQorCiAJCS8qCiAJCSAqIEFuZCBzZXQgdXAgdGhlIEJUQXJyYXlLZXlJbmZvIGRhdGEu CiAJCSAqLwpAQCAtMzY0LDYgKzQ3OSw3IEBAIF9idF9wcmVwcm9jZXNzX2FycmF5X2tleXMoSW5k ZXhTY2FuRGVzYyBzY2FuKQogCQlzby0+YXJyYXlLZXlzW251bUFycmF5S2V5c10ubnVtX2VsZW1z ID0gbnVtX2VsZW1zOwogCQlzby0+YXJyYXlLZXlzW251bUFycmF5S2V5c10uZWxlbV92YWx1ZXMg PSBlbGVtX3ZhbHVlczsKIAkJbnVtQXJyYXlLZXlzKys7CisJCWxhc3RFcXVhbGl0eUFycmF5QXR0 ID0gY3VyLT5za19hdHRubzsKIAl9CiAKIAlzby0+bnVtQXJyYXlLZXlzID0gbnVtQXJyYXlLZXlz OwpAQCAtNDM3LDI2ICs1NTMsMjggQEAgX2J0X2ZpbmRfZXh0cmVtZV9lbGVtZW50KEluZGV4U2Nh bkRlc2Mgc2NhbiwgU2NhbktleSBza2V5LAogfQogCiAvKgotICogX2J0X3NvcnRfYXJyYXlfZWxl bWVudHMoKSAtLSBzb3J0IGFuZCBkZS1kdXAgYXJyYXkgZWxlbWVudHMKKyAqIF9idF9zb3J0X2Fy cmF5X2NtcF9zZXR1cCgpIC0tIExvb2sgdXAgYXJyYXkgY29tcGFyaXNvbiBmdW5jdGlvbgogICoK LSAqIFRoZSBhcnJheSBlbGVtZW50cyBhcmUgc29ydGVkIGluLXBsYWNlLCBhbmQgdGhlIG5ldyBu dW1iZXIgb2YgZWxlbWVudHMKLSAqIGFmdGVyIGR1cGxpY2F0ZSByZW1vdmFsIGlzIHJldHVybmVk LgotICoKLSAqIHNjYW4gYW5kIHNrZXkgaWRlbnRpZnkgdGhlIGluZGV4IGNvbHVtbiwgd2hvc2Ug b3BmYW1pbHkgZGV0ZXJtaW5lcyB0aGUKLSAqIGNvbXBhcmlzb24gc2VtYW50aWNzLiAgSWYgcmV2 ZXJzZSBpcyB0cnVlLCB3ZSBzb3J0IGluIGRlc2NlbmRpbmcgb3JkZXIuCisgKiBTZXRzIHNvLT5v cmRlclByb2NzW10gZm9yIHNjYW4ga2V5J3MgYXR0cmlidXRlLiAgVGhpcyBpcyB1c2VkIHRvIHNv cnQgYW5kCisgKiBkZWR1cGxpY2F0ZSB0aGUgYXR0cmlidXRlJ3MgYXJyYXkgKGlmIGFueSkuICBJ dCdzIGFsc28gdXNlZCBkdXJpbmcgYmluYXJ5CisgKiBzZWFyY2hlcyBvZiB0aGUgbmV4dCBhcnJh eSBrZXkgbWF0Y2hpbmcgaW5kZXggdHVwbGVzIGp1c3QgYmV5b25kIHRoZSByYW5nZQorICogb2Yg dGhlIHNjYW4ncyBjdXJyZW50IHNldCBvZiBhcnJheSBrZXlzLgogICovCi1zdGF0aWMgaW50Ci1f YnRfc29ydF9hcnJheV9lbGVtZW50cyhJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5LZXkgc2tleSwK LQkJCQkJCWJvb2wgcmV2ZXJzZSwKLQkJCQkJCURhdHVtICplbGVtcywgaW50IG5lbGVtcykKK3N0 YXRpYyB2b2lkCitfYnRfc29ydF9hcnJheV9jbXBfc2V0dXAoSW5kZXhTY2FuRGVzYyBzY2FuLCBT Y2FuS2V5IHNrZXkpCiB7CisJQlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+ b3BhcXVlOwogCVJlbGF0aW9uCXJlbCA9IHNjYW4tPmluZGV4UmVsYXRpb247CiAJT2lkCQkJZWxl bXR5cGU7CiAJUmVnUHJvY2VkdXJlIGNtcF9wcm9jOwotCUJUU29ydEFycmF5Q29udGV4dCBjeHQ7 CisJRm1nckluZm8gICAqb3JkZXJwcm9jID0gJnNvLT5vcmRlclByb2NzW3NrZXktPnNrX2F0dG5v IC0gMV07CiAKLQlpZiAobmVsZW1zIDw9IDEpCi0JCXJldHVybiBuZWxlbXM7CQkJLyogbm8gd29y ayB0byBkbyAqLworCS8qCisJICogU2hvdWxkIGRvIHRoaXMgZm9yIGFsbCBlcXVhbGl0eSBzdHJh dGVneSBzY2FuIGtleXMgb25seSAoaW5jbHVkaW5nCisJICogdGhvc2Ugd2l0aG91dCBhbnkgYXJy YXkpLiAgU2VlIF9idF9hZHZhbmNlX2FycmF5X2tleXMgZm9yIGRldGFpbHMgb2YKKwkgKiB3aHkg d2UgbmVlZCBhbiBPUkRFUiBwcm9jIGZvciBub24tYXJyYXkgZXF1YWxpdHkgc3RyYXRlZ3kgc2Nh biBrZXlzLgorCSAqLworCUFzc2VydChza2V5LT5za19zdHJhdGVneSA9PSBCVEVxdWFsU3RyYXRl Z3lOdW1iZXIpOwogCiAJLyoKIAkgKiBEZXRlcm1pbmUgdGhlIG5vbWluYWwgZGF0YXR5cGUgb2Yg dGhlIGFycmF5IGVsZW1lbnRzLiAgV2UgaGF2ZSB0bwpAQCAtNDcxLDEyICs1ODksMTAgQEAgX2J0 X3NvcnRfYXJyYXlfZWxlbWVudHMoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuS2V5IHNrZXksCiAJ ICogTG9vayB1cCB0aGUgYXBwcm9wcmlhdGUgY29tcGFyaXNvbiBmdW5jdGlvbiBpbiB0aGUgb3Bm YW1pbHkuCiAJICoKIAkgKiBOb3RlOiBpdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyB3b3VsZCBmYWls LCBpZiB0aGUgb3BmYW1pbHkgaXMKLQkgKiBpbmNvbXBsZXRlLCBidXQgaXQgc2VlbXMgcXVpdGUg dW5saWtlbHkgdGhhdCBhbiBvcGZhbWlseSB3b3VsZCBvbWl0Ci0JICogbm9uLWNyb3NzLXR5cGUg c3VwcG9ydCBmdW5jdGlvbnMgZm9yIGFueSBkYXRhdHlwZSB0aGF0IGl0IHN1cHBvcnRzIGF0Ci0J ICogYWxsLgorCSAqIGluY29tcGxldGUuCiAJICovCiAJY21wX3Byb2MgPSBnZXRfb3BmYW1pbHlf cHJvYyhyZWwtPnJkX29wZmFtaWx5W3NrZXktPnNrX2F0dG5vIC0gMV0sCi0JCQkJCQkJCSBlbGVt dHlwZSwKKwkJCQkJCQkJIHJlbC0+cmRfb3BjaW50eXBlW3NrZXktPnNrX2F0dG5vIC0gMV0sCiAJ CQkJCQkJCSBlbGVtdHlwZSwKIAkJCQkJCQkJIEJUT1JERVJfUFJPQyk7CiAJaWYgKCFSZWdQcm9j ZWR1cmVJc1ZhbGlkKGNtcF9wcm9jKSkKQEAgLTQ4NCw4ICs2MDAsMzIgQEAgX2J0X3NvcnRfYXJy YXlfZWxlbWVudHMoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuS2V5IHNrZXksCiAJCQkgQlRPUkRF Ul9QUk9DLCBlbGVtdHlwZSwgZWxlbXR5cGUsCiAJCQkgcmVsLT5yZF9vcGZhbWlseVtza2V5LT5z a19hdHRubyAtIDFdKTsKIAorCS8qIFNhdmUgaW4gb3JkZXJwcm9jIGVudHJ5IGZvciBhdHRyaWJ1 dGUgKi8KKwlmbWdyX2luZm9fY3h0KGNtcF9wcm9jLCBvcmRlcnByb2MsIHNvLT5hcnJheUNvbnRl eHQpOworfQorCisvKgorICogX2J0X3NvcnRfYXJyYXlfZWxlbWVudHMoKSAtLSBzb3J0IGFuZCBk ZS1kdXAgYXJyYXkgZWxlbWVudHMKKyAqCisgKiBUaGUgYXJyYXkgZWxlbWVudHMgYXJlIHNvcnRl ZCBpbi1wbGFjZSwgYW5kIHRoZSBuZXcgbnVtYmVyIG9mIGVsZW1lbnRzCisgKiBhZnRlciBkdXBs aWNhdGUgcmVtb3ZhbCBpcyByZXR1cm5lZC4KKyAqCisgKiBzY2FuIGFuZCBza2V5IGlkZW50aWZ5 IHRoZSBpbmRleCBjb2x1bW4sIHdob3NlIG9wZmFtaWx5IGRldGVybWluZXMgdGhlCisgKiBjb21w YXJpc29uIHNlbWFudGljcy4gIElmIHJldmVyc2UgaXMgdHJ1ZSwgd2Ugc29ydCBpbiBkZXNjZW5k aW5nIG9yZGVyLgorICovCitzdGF0aWMgaW50CitfYnRfc29ydF9hcnJheV9lbGVtZW50cyhJbmRl eFNjYW5EZXNjIHNjYW4sIFNjYW5LZXkgc2tleSwKKwkJCQkJCWJvb2wgcmV2ZXJzZSwKKwkJCQkJ CURhdHVtICplbGVtcywgaW50IG5lbGVtcykKK3sKKwlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2Fu T3BhcXVlKSBzY2FuLT5vcGFxdWU7CisJQlRTb3J0QXJyYXlDb250ZXh0IGN4dDsKKworCWlmIChu ZWxlbXMgPD0gMSkKKwkJcmV0dXJuIG5lbGVtczsJCQkvKiBubyB3b3JrIHRvIGRvICovCisKIAkv KiBTb3J0IHRoZSBhcnJheSBlbGVtZW50cyAqLwotCWZtZ3JfaW5mbyhjbXBfcHJvYywgJmN4dC5m bGluZm8pOworCWN4dC5vcmRlcnByb2MgPSAmc28tPm9yZGVyUHJvY3Nbc2tleS0+c2tfYXR0bm8g LSAxXTsKIAljeHQuY29sbGF0aW9uID0gc2tleS0+c2tfY29sbGF0aW9uOwogCWN4dC5yZXZlcnNl ID0gcmV2ZXJzZTsKIAlxc29ydF9hcmcoZWxlbXMsIG5lbGVtcywgc2l6ZW9mKERhdHVtKSwKQEAg LTQ5Niw2ICs2MzYsNDggQEAgX2J0X3NvcnRfYXJyYXlfZWxlbWVudHMoSW5kZXhTY2FuRGVzYyBz Y2FuLCBTY2FuS2V5IHNrZXksCiAJCQkJCSAgIF9idF9jb21wYXJlX2FycmF5X2VsZW1lbnRzLCAm Y3h0KTsKIH0KIAorLyoKKyAqIF9idF9tZXJnZV9hcnJheXMoKSAtLSBtZXJnZSB0b2dldGhlciBk dXBsaWNhdGUgYXJyYXkga2V5cworICoKKyAqIEJvdGggc2NhbiBrZXlzIGhhdmUgYXJyYXkgZWxl bWVudHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBzb3J0ZWQgYW5kCisgKiBkZWR1cGxpY2F0ZWQu CisgKi8KK3N0YXRpYyBpbnQKK19idF9tZXJnZV9hcnJheXMoSW5kZXhTY2FuRGVzYyBzY2FuLCBT Y2FuS2V5IHNrZXksIGJvb2wgcmV2ZXJzZSwKKwkJCQkgRGF0dW0gKmVsZW1zX29yaWcsIGludCBu ZWxlbXNfb3JpZywKKwkJCQkgRGF0dW0gKmVsZW1zX25leHQsIGludCBuZWxlbXNfbmV4dCkKK3sK KwlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CisJQlRTb3J0 QXJyYXlDb250ZXh0IGN4dDsKKwlEYXR1bQkgICAqbWVyZ2VkID0gcGFsbG9jKHNpemVvZihEYXR1 bSkgKiBNaW4obmVsZW1zX29yaWcsIG5lbGVtc19uZXh0KSk7CisJaW50CQkJbWVyZ2VkX25lbGVt cyA9IDA7CisKKwkvKgorCSAqIEluY3JlbWVudGFsbHkgY29weSB0aGUgb3JpZ2luYWwgYXJyYXkg aW50byBhIHRlbXAgYnVmZmVyLCBza2lwcGluZyBvdmVyCisJICogYW55IGl0ZW1zIHRoYXQgYXJl IG1pc3NpbmcgZnJvbSB0aGUgIm5leHQiIGFycmF5CisJICovCisJY3h0Lm9yZGVycHJvYyA9ICZz by0+b3JkZXJQcm9jc1tza2V5LT5za19hdHRubyAtIDFdOworCWN4dC5jb2xsYXRpb24gPSBza2V5 LT5za19jb2xsYXRpb247CisJY3h0LnJldmVyc2UgPSByZXZlcnNlOworCWZvciAoaW50IGkgPSAw OyBpIDwgbmVsZW1zX29yaWc7IGkrKykKKwl7CisJCURhdHVtCSAgICplbGVtID0gZWxlbXNfb3Jp ZyArIGk7CisKKwkJaWYgKGJzZWFyY2hfYXJnKGVsZW0sIGVsZW1zX25leHQsIG5lbGVtc19uZXh0 LCBzaXplb2YoRGF0dW0pLAorCQkJCQkJX2J0X2NvbXBhcmVfYXJyYXlfZWxlbWVudHMsICZjeHQp KQorCQkJbWVyZ2VkW21lcmdlZF9uZWxlbXMrK10gPSAqZWxlbTsKKwl9CisKKwkvKgorCSAqIE92 ZXJ3cml0ZSB0aGUgb3JpZ2luYWwgYXJyYXkgd2l0aCB0ZW1wIGJ1ZmZlciBzbyB0aGF0IHdlJ3Jl IG9ubHkgbGVmdAorCSAqIHdpdGggaW50ZXJzZWN0aW5nIGFycmF5IGVsZW1lbnRzCisJICovCisJ bWVtY3B5KGVsZW1zX29yaWcsIG1lcmdlZCwgbWVyZ2VkX25lbGVtcyAqIHNpemVvZihEYXR1bSkp OworCXBmcmVlKG1lcmdlZCk7CisKKwlyZXR1cm4gbWVyZ2VkX25lbGVtczsKK30KKwogLyoKICAq IHFzb3J0X2FyZyBjb21wYXJhdG9yIGZvciBzb3J0aW5nIGFycmF5IGVsZW1lbnRzCiAgKi8KQEAg LTUwNyw3ICs2ODksNyBAQCBfYnRfY29tcGFyZV9hcnJheV9lbGVtZW50cyhjb25zdCB2b2lkICph LCBjb25zdCB2b2lkICpiLCB2b2lkICphcmcpCiAJQlRTb3J0QXJyYXlDb250ZXh0ICpjeHQgPSAo QlRTb3J0QXJyYXlDb250ZXh0ICopIGFyZzsKIAlpbnQzMgkJY29tcGFyZTsKIAotCWNvbXBhcmUg PSBEYXR1bUdldEludDMyKEZ1bmN0aW9uQ2FsbDJDb2xsKCZjeHQtPmZsaW5mbywKKwljb21wYXJl ID0gRGF0dW1HZXRJbnQzMihGdW5jdGlvbkNhbGwyQ29sbChjeHQtPm9yZGVycHJvYywKIAkJCQkJ CQkJCQkJICBjeHQtPmNvbGxhdGlvbiwKIAkJCQkJCQkJCQkJICBkYSwgZGIpKTsKIAlpZiAoY3h0 LT5yZXZlcnNlKQpAQCAtNTE1LDYgKzY5NywxNTggQEAgX2J0X2NvbXBhcmVfYXJyYXlfZWxlbWVu dHMoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYiwgdm9pZCAqYXJnKQogCXJldHVybiBjb21w YXJlOwogfQogCisvKgorICogX2J0X2NvbXBhcmVfYXJyYXlfc2tleSgpIC0tIGFwcGx5IGFycmF5 IGNvbXBhcmlzb24gZnVuY3Rpb24KKyAqCisgKiBDb21wYXJlcyBjYWxsZXIncyB0dXBsZSBhdHRy aWJ1dGUgdmFsdWUgdG8gYSBzY2FuIGtleS9hcnJheSBlbGVtZW50LgorICogSGVscGVyIGZ1bmN0 aW9uIHVzZWQgZHVyaW5nIGJpbmFyeSBzZWFyY2hlcyBvZiBTS19TRUFSQ0hBUlJBWSBhcnJheXMu CisgKgorICoJCVRoaXMgcm91dGluZSByZXR1cm5zOgorICoJCQk8MCBpZiB0dXBkYXR1bSA8IGFy cmRhdHVtOworICoJCQkgMCBpZiB0dXBkYXR1bSA9PSBhcnJkYXR1bTsKKyAqCQkJPjAgaWYgdHVw ZGF0dW0gPiBhcnJkYXR1bS4KKyAqCisgKiBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGlu dGVyZmFjZSBhcyBfYnRfY29tcGFyZTogYm90aCBmdW5jdGlvbnMKKyAqIGNvbXBhcmUgdGhlIHZh bHVlIHRoYXQgdGhleSdyZSBzZWFyY2hpbmcgZm9yIHRvIGEgYmluYXJ5IHNlYXJjaCBwaXZvdC4K KyAqIEhvd2V2ZXIsIHVubGlrZSBfYnRfY29tcGFyZSwgdGhpcyBmdW5jdGlvbidzICJ0dXBsZSBh cmd1bWVudCIgY29tZXMgZmlyc3QsCisgKiB3aGlsZSBpdHMgImFycmF5L3NjYW5rZXkgYXJndW1l bnQiIGNvbWVzIHNlY29uZC4KKyovCitzdGF0aWMgaW5saW5lIGludDMyCitfYnRfY29tcGFyZV9h cnJheV9za2V5KEZtZ3JJbmZvICpvcmRlcnByb2MsCisJCQkJCSAgIERhdHVtIHR1cGRhdHVtLCBi b29sIHR1cG51bGwsCisJCQkJCSAgIERhdHVtIGFycmRhdHVtLCBTY2FuS2V5IGN1cikKK3sKKwlp bnQzMgkJcmVzdWx0ID0gMDsKKworCUFzc2VydChjdXItPnNrX3N0cmF0ZWd5ID09IEJURXF1YWxT dHJhdGVneU51bWJlcik7CisKKwlpZiAodHVwbnVsbCkJCQkJLyogTlVMTCB0dXBkYXR1bSAqLwor CXsKKwkJaWYgKGN1ci0+c2tfZmxhZ3MgJiBTS19JU05VTEwpCisJCQlyZXN1bHQgPSAwOwkJCS8q IE5VTEwgIj0iIE5VTEwgKi8KKwkJZWxzZSBpZiAoY3VyLT5za19mbGFncyAmIFNLX0JUX05VTExT X0ZJUlNUKQorCQkJcmVzdWx0ID0gLTE7CQkvKiBOVUxMICI8IiBOT1RfTlVMTCAqLworCQllbHNl CisJCQlyZXN1bHQgPSAxOwkJCS8qIE5VTEwgIj4iIE5PVF9OVUxMICovCisJfQorCWVsc2UgaWYg KGN1ci0+c2tfZmxhZ3MgJiBTS19JU05VTEwpIC8qIE5PVF9OVUxMIHR1cGRhdHVtLCBOVUxMIGFy cmRhdHVtICovCisJeworCQlpZiAoY3VyLT5za19mbGFncyAmIFNLX0JUX05VTExTX0ZJUlNUKQor CQkJcmVzdWx0ID0gMTsJCQkvKiBOT1RfTlVMTCAiPiIgTlVMTCAqLworCQllbHNlCisJCQlyZXN1 bHQgPSAtMTsJCS8qIE5PVF9OVUxMICI8IiBOVUxMICovCisJfQorCWVsc2UKKwl7CisJCS8qCisJ CSAqIExpa2UgX2J0X2NvbXBhcmUsIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBvZiBjcm9zcy10eXBl IGNvbXBhcmlzb25zLAorCQkgKiBzbyB0aGUgbGVmdCB2YWx1ZSBoYXMgdG8gYmUgdGhlIHZhbHVl IHRoYXQgY2FtZSBmcm9tIGFuIGluZGV4IHR1cGxlCisJCSAqLworCQlyZXN1bHQgPSBEYXR1bUdl dEludDMyKEZ1bmN0aW9uQ2FsbDJDb2xsKG9yZGVycHJvYywgY3VyLT5za19jb2xsYXRpb24sCisJ CQkJCQkJCQkJCQkgdHVwZGF0dW0sIGFycmRhdHVtKSk7CisKKwkJLyoKKwkJICogV2UgZmxpcCB0 aGUgc2lnbiBieSBmb2xsb3dpbmcgdGhlIG9idmlvdXMgcnVsZTogZmxpcCB3aGVuZXZlciB0aGUK KwkJICogY29sdW1uIGlzIGEgREVTQyBjb2x1bW4uCisJCSAqCisJCSAqIF9idF9jb21wYXJlIGRv ZXMgaXQgdGhlIHdyb25nIHdheSBhcm91bmQgKGZsaXAgd2hlbiAqQVNDKikgaW4gb3JkZXIKKwkJ ICogdG8gY29tcGVuc2F0ZSBmb3IgcGFzc2luZyBpdHMgb3JkZXJwcm9jIGFyZ3VtZW50cyBiYWNr d2FyZHMuICBXZQorCQkgKiBkb24ndCBuZWVkIHRvIHBsYXkgdGhlc2UgZ2FtZXMgYmVjYXVzZSB3 ZSBmaW5kIGl0IG5hdHVyYWwgdG8gcGFzcworCQkgKiB0dXBkYXR1bSBhcyB0aGUgbGVmdCB2YWx1 ZSAoYW5kIGFycmRhdHVtIGFzIHRoZSByaWdodCB2YWx1ZSkuCisJCSAqLworCQlpZiAoY3VyLT5z a19mbGFncyAmIFNLX0JUX0RFU0MpCisJCQlJTlZFUlRfQ09NUEFSRV9SRVNVTFQocmVzdWx0KTsK Kwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogX2J0X2JpbnNyY2hfYXJyYXlfc2tl eSgpIC0tIEJpbmFyeSBzZWFyY2ggZm9yIG5leHQgbWF0Y2hpbmcgYXJyYXkga2V5CisgKgorICog UmV0dXJucyBhbiBpbmRleCB0byB0aGUgZmlyc3QgYXJyYXkgZWxlbWVudCA+PSBjYWxsZXIncyB0 dXBkYXR1bSBhcmd1bWVudC4KKyAqIFRoaXMgY29udmVudGlvbiBpcyBtb3JlIG5hdHVyYWwgZm9y IGZvcndhcmRzIHNjYW4gY2FsbGVycywgYnV0IHRoYXQgY2FuJ3QKKyAqIHJlYWxseSBtYXR0ZXIg dG8gYmFja3dhcmRzIHNjYW4gY2FsbGVycy4gIEJvdGggY2FsbGVycyByZXF1aXJlIGhhbmRsaW5n IGZvcgorICogdGhlIGNhc2Ugd2hlcmUgdGhlIG1hdGNoIHdlIHJldHVybiBpcyA8IHR1cGRhdHVt LCBhbmQgc3ltbWV0cmljIGhhbmRsaW5nCisgKiBmb3IgdGhlIGNhc2Ugd2hlcmUgb3VyIGJlc3Qg bWF0Y2ggaXMgPiB0dXBkYXR1bS4KKyAqCisgKiBBbHNvIHNldHMgKmZpbmFsX3Jlc3VsdCB0byB3 aGF0ZXZlciBfYnRfY29tcGFyZV9hcnJheV9za2V5IHJldHVybmVkIHdoZW4gd2UKKyAqIGNvbXBh cmVkIHRoZSByZXR1cm5lZCBhcnJheSBlbGVtZW50IHRvIGNhbGxlcidzIHR1cGRhdHVtIGFyZ3Vt ZW50LiAgVGhpcworICogaGVscHMgY2FsbGVyIHRvIGRlY2lkZSB3aGF0IHRvIGRvIG5leHQuICBD YWxsZXIgc2hvdWxkIG9ubHkgYWNjZXB0IHRoZQorICogZWxlbWVudCB3ZSBsb2NhdGUgYXMtaXMg d2hlbiBpdCdzIGFuIGV4YWN0IG1hdGNoIChpLmUuICpmaW5hbF9yZXN1bHQgaXMgMCkuCisgKgor ICogY3VyX2VsZW1fc3RhcnQgaW5kaWNhdGVzIGlmIHRoZSBiaW5hcnkgc2VhcmNoIHNob3VsZCBi ZWdpbiBhdCB0aGUgYXJyYXkncworICogY3VycmVudCBlbGVtZW50IChvciBoYXZlIHRoZSBjdXJy ZW50IGVsZW1lbnQgYXMgYW4gdXBwZXIgYm91bmQgaWYgaXQncyBhCisgKiBiYWNrd2FyZCBzY2Fu KS4gIFRoaXMgKGFuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2NhbidzIGRpcmVjdGlvbikgYWxs b3dzCisgKiBzZWFyY2hlcyBhZ2FpbnN0IHJlcXVpcmVkIHNjYW4ga2V5IGFycmF5cyB0byByZXVz ZSBlYXJsaWVyIHNlYXJjaCBib3VuZHMuCisgKi8KK3N0YXRpYyBpbnQKK19idF9iaW5zcmNoX2Fy cmF5X3NrZXkoRm1nckluZm8gKm9yZGVycHJvYywKKwkJCQkJICAgYm9vbCBjdXJfZWxlbV9zdGFy dCwgU2NhbkRpcmVjdGlvbiBkaXIsCisJCQkJCSAgIERhdHVtIHR1cGRhdHVtLCBib29sIHR1cG51 bGwsCisJCQkJCSAgIEJUQXJyYXlLZXlJbmZvICphcnJheSwgU2NhbktleSBjdXIsCisJCQkJCSAg IGludDMyICpmaW5hbF9yZXN1bHQpCit7CisJaW50CQkJbG93X2VsZW0sCisJCQkJbWlkX2VsZW0s CisJCQkJaGlnaF9lbGVtLAorCQkJCXJlc3VsdCA9IDA7CisKKwlBc3NlcnQoY3VyLT5za19mbGFn cyAmIFNLX1NFQVJDSEFSUkFZKTsKKwlBc3NlcnQoY3VyLT5za19zdHJhdGVneSA9PSBCVEVxdWFs U3RyYXRlZ3lOdW1iZXIpOworCisJbG93X2VsZW0gPSAwOworCW1pZF9lbGVtID0gLTE7CisJaGln aF9lbGVtID0gYXJyYXktPm51bV9lbGVtcyAtIDE7CisJaWYgKGN1cl9lbGVtX3N0YXJ0KQorCXsK KwkJaWYgKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSkKKwkJCWxvd19lbGVtID0gYXJyYXkt PmN1cl9lbGVtOworCQllbHNlCisJCQloaWdoX2VsZW0gPSBhcnJheS0+Y3VyX2VsZW07CisJfQor CisJd2hpbGUgKGhpZ2hfZWxlbSA+IGxvd19lbGVtKQorCXsKKwkJRGF0dW0JCWFycmRhdHVtOwor CisJCW1pZF9lbGVtID0gbG93X2VsZW0gKyAoKGhpZ2hfZWxlbSAtIGxvd19lbGVtKSAvIDIpOwor CQlhcnJkYXR1bSA9IGFycmF5LT5lbGVtX3ZhbHVlc1ttaWRfZWxlbV07CisKKwkJcmVzdWx0ID0g X2J0X2NvbXBhcmVfYXJyYXlfc2tleShvcmRlcnByb2MsIHR1cGRhdHVtLCB0dXBudWxsLAorCQkJ CQkJCQkJCWFycmRhdHVtLCBjdXIpOworCisJCWlmIChyZXN1bHQgPT0gMCkKKwkJeworCQkJLyoK KwkJCSAqIEVhY2ggYXJyYXkgd2FzIGRlZHVwbGljYXRlZCBkdXJpbmcgaW5pdGlhbCBwcmVwcm9j ZXNzaW5nLCBzbworCQkJICogaXQncyBzYWZlIHRvIHF1aXQgYXMgc29vbiBhcyB3ZSBzZWUgYW4g ZXF1YWwgYXJyYXkgZWxlbWVudC4KKwkJCSAqIFRoaXMgb2Z0ZW4gc2F2ZXMgYW4gZXh0cmEgY29t cGFyaXNvbiBvciB0d28uLi4KKwkJCSAqLworCQkJbG93X2VsZW0gPSBtaWRfZWxlbTsKKwkJCWJy ZWFrOworCQl9CisKKwkJaWYgKHJlc3VsdCA+IDApCisJCQlsb3dfZWxlbSA9IG1pZF9lbGVtICsg MTsKKwkJZWxzZQorCQkJaGlnaF9lbGVtID0gbWlkX2VsZW07CisJfQorCisJLyoKKwkgKiAuLi5i dXQgb3VyIGNhbGxlciBhbHNvIGNhcmVzIGFib3V0IGhvdyBpdHMgc2VhcmNoZWQtZm9yIHR1cGxl IGRhdHVtCisJICogY29tcGFyZXMgdG8gdGhlIGFycmF5IGVsZW1lbnQgd2UnbGwgcmV0dXJuLiAg V2UgbXVzdCBzZXQgKmZpbmFsX3Jlc3VsdAorCSAqIHdpdGggdGhlIHJlc3VsdCBvZiB0aGF0IGNv bXBhcmlzb24gc3BlY2lmaWNhbGx5LgorCSAqLworCWlmIChsb3dfZWxlbSAhPSBtaWRfZWxlbSkK KwkJcmVzdWx0ID0gX2J0X2NvbXBhcmVfYXJyYXlfc2tleShvcmRlcnByb2MsIHR1cGRhdHVtLCB0 dXBudWxsLAorCQkJCQkJCQkJCWFycmF5LT5lbGVtX3ZhbHVlc1tsb3dfZWxlbV0sIGN1cik7CisK KwkqZmluYWxfcmVzdWx0ID0gcmVzdWx0OworCisJcmV0dXJuIGxvd19lbGVtOworfQorCiAvKgog ICogX2J0X3N0YXJ0X2FycmF5X2tleXMoKSAtLSBJbml0aWFsaXplIGFycmF5IGtleXMgYXQgc3Rh cnQgb2YgYSBzY2FuCiAgKgpAQCAtNTM5LDMwICs4NzMsMzUgQEAgX2J0X3N0YXJ0X2FycmF5X2tl eXMoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKIAkJCWN1ckFycmF5S2V5 LT5jdXJfZWxlbSA9IDA7CiAJCXNrZXktPnNrX2FyZ3VtZW50ID0gY3VyQXJyYXlLZXktPmVsZW1f dmFsdWVzW2N1ckFycmF5S2V5LT5jdXJfZWxlbV07CiAJfQotCi0Jc28tPmFycmF5c1N0YXJ0ZWQg PSB0cnVlOwogfQogCiAvKgotICogX2J0X2FkdmFuY2VfYXJyYXlfa2V5cygpIC0tIEFkdmFuY2Ug dG8gbmV4dCBzZXQgb2YgYXJyYXkgZWxlbWVudHMKKyAqIF9idF9hZHZhbmNlX2FycmF5X2tleXNf aW5jcmVtZW50KCkgLS0gQWR2YW5jZSB0byBuZXh0IHNldCBvZiBhcnJheSBlbGVtZW50cworICoK KyAqIEFkdmFuY2VzIHRoZSBhcnJheSBrZXlzIGJ5IGEgc2luZ2xlIGluY3JlbWVudCBpbiB0aGUg Y3VycmVudCBzY2FuCisgKiBkaXJlY3Rpb24uICBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBhcnJh eSBrZXlzIHRoaXMgY2FuIHJvbGwgb3ZlciBmcm9tIHRoZQorICogbG93ZXN0IG9yZGVyIGFycmF5 IHRvIGhpZ2hlciBvcmRlciBhcnJheXMuCiAgKgogICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlz IGFub3RoZXIgc2V0IG9mIHZhbHVlcyB0byBjb25zaWRlciwgZmFsc2UgaWYgbm90LgogICogT24g dHJ1ZSByZXN1bHQsIHRoZSBzY2Fua2V5cyBhcmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgbmV4dCBz ZXQgb2YgdmFsdWVzLgorICogT24gZmFsc2UgcmVzdWx0LCB0aGUgc2NhbmtleXMgc3RheSB0aGUg c2FtZSwgYW5kIHRoZSBhcnJheSBrZXlzIGFyZSBub3QKKyAqIGFkdmFuY2VkIChldmVyeSBhcnJh eSBpcyBzdGlsbCBhdCBpdHMgZmluYWwgZWxlbWVudCBmb3Igc2NhbiBkaXJlY3Rpb24pLgogICov Ci1ib29sCi1fYnRfYWR2YW5jZV9hcnJheV9rZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRp cmVjdGlvbiBkaXIpCitzdGF0aWMgYm9vbAorX2J0X2FkdmFuY2VfYXJyYXlfa2V5c19pbmNyZW1l bnQoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKIHsKIAlCVFNjYW5PcGFx dWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CiAJYm9vbAkJZm91bmQgPSBmYWxz ZTsKLQlpbnQJCQlpOworCisJQXNzZXJ0KCFzby0+bmVlZFByaW1TY2FuKTsKIAogCS8qCiAJICog V2UgbXVzdCBhZHZhbmNlIHRoZSBsYXN0IGFycmF5IGtleSBtb3N0IHF1aWNrbHksIHNpbmNlIGl0 IHdpbGwKIAkgKiBjb3JyZXNwb25kIHRvIHRoZSBsb3dlc3Qtb3JkZXIgaW5kZXggY29sdW1uIGFt b25nIHRoZSBhdmFpbGFibGUKLQkgKiBxdWFsaWZpY2F0aW9ucy4gVGhpcyBpcyBuZWNlc3Nhcnkg dG8gZW5zdXJlIGNvcnJlY3Qgb3JkZXJpbmcgb2Ygb3V0cHV0Ci0JICogd2hlbiB0aGVyZSBhcmUg bXVsdGlwbGUgYXJyYXkga2V5cy4KKwkgKiBxdWFsaWZpY2F0aW9ucy4gIFJvbGxpbmcgb3ZlciBs aWtlIHRoaXMgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSBjb3JyZWN0CisJICogb3JkZXJpbmcgb2Yg b3V0cHV0IHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGFycmF5IGtleXMuCiAJICovCi0JZm9yIChp ID0gc28tPm51bUFycmF5S2V5cyAtIDE7IGkgPj0gMDsgaS0tKQorCWZvciAoaW50IGkgPSBzby0+ bnVtQXJyYXlLZXlzIC0gMTsgaSA+PSAwOyBpLS0pCiAJewogCQlCVEFycmF5S2V5SW5mbyAqY3Vy QXJyYXlLZXkgPSAmc28tPmFycmF5S2V5c1tpXTsKIAkJU2NhbktleQkJc2tleSA9ICZzby0+YXJy YXlLZXlEYXRhW2N1ckFycmF5S2V5LT5zY2FuX2tleV07CkBAIC01OTYsMTkgKzkzNSwzMSBAQCBf YnRfYWR2YW5jZV9hcnJheV9rZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBk aXIpCiAJCQlicmVhazsKIAl9CiAKLQkvKiBhZHZhbmNlIHBhcmFsbGVsIHNjYW4gKi8KLQlpZiAo c2Nhbi0+cGFyYWxsZWxfc2NhbiAhPSBOVUxMKQotCQlfYnRfcGFyYWxsZWxfYWR2YW5jZV9hcnJh eV9rZXlzKHNjYW4pOworCWlmIChmb3VuZCkKKwkJcmV0dXJuIHRydWU7CiAKIAkvKgotCSAqIFdo ZW4gbm8gbmV3IGFycmF5IGtleXMgd2VyZSBmb3VuZCwgdGhlIHNjYW4gaXMgInBhc3QgdGhlIGVu ZCIgb2YgdGhlCi0JICogYXJyYXkga2V5cy4gIF9idF9zdGFydF9hcnJheV9rZXlzIGNhbiBzdGls bCAicmVzdGFydCIgdGhlIGFycmF5IGtleXMgaWYKLQkgKiBhIHJlc2NhbiBpcyByZXF1aXJlZC4K KwkgKiBEb24ndCBhbGxvdyB0aGUgZW50aXJlIHNldCBvZiBhcnJheSBrZXlzIHRvIHJvbGwgb3Zl cjogcmVzdG9yZSB0aGUKKwkgKiBhcnJheSBrZXlzIHRvIHRoZSBzdGF0ZSB0aGV5IHdlcmUgaW4g YmVmb3JlIHdlIHdlcmUgY2FsbGVkLgorCSAqCisJICogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGFy cmF5IGtleXMgb25seSByYXRjaGV0IGZvcndhcmQgKG9yIGJhY2t3YXJkcyBpbgorCSAqIHRoZSBj YXNlIG9mIGJhY2t3YXJkIHNjYW5zKS4gIE91ciAic28tPmFycmF5S2V5RGF0YVtdIiBzY2FuIGtl eXMgc2hvdWxkCisJICogYWx3YXlzIG1hdGNoIHRoZSBjdXJyZW50ICJzby0+a2V5RGF0YVtdIiBz ZWFyY2gtdHlwZSBzY2FuIGtleXMgKGV4Y2VwdAorCSAqIGZvciBhIGJyaWVmIG1vbWVudCBkdXJp bmcgYXJyYXkga2V5IGFkdmFuY2VtZW50KS4KIAkgKi8KLQlpZiAoIWZvdW5kKQotCQlzby0+YXJy YXlzU3RhcnRlZCA9IGZhbHNlOworCWZvciAoaW50IGkgPSAwOyBpIDwgc28tPm51bUFycmF5S2V5 czsgaSsrKQorCXsKKwkJQlRBcnJheUtleUluZm8gKnJvbGxhcnJheSA9ICZzby0+YXJyYXlLZXlz W2ldOworCQlTY2FuS2V5CQlza2V5ID0gJnNvLT5hcnJheUtleURhdGFbcm9sbGFycmF5LT5zY2Fu X2tleV07CiAKLQlyZXR1cm4gZm91bmQ7CisJCWlmIChTY2FuRGlyZWN0aW9uSXNCYWNrd2FyZChk aXIpKQorCQkJcm9sbGFycmF5LT5jdXJfZWxlbSA9IDA7CisJCWVsc2UKKwkJCXJvbGxhcnJheS0+ Y3VyX2VsZW0gPSByb2xsYXJyYXktPm51bV9lbGVtcyAtIDE7CisJCXNrZXktPnNrX2FyZ3VtZW50 ID0gcm9sbGFycmF5LT5lbGVtX3ZhbHVlc1tyb2xsYXJyYXktPmN1cl9lbGVtXTsKKwl9CisKKwly ZXR1cm4gZmFsc2U7CiB9CiAKIC8qCkBAIC02NjEsMjAgKzEwMTIsODQ1IEBAIF9idF9yZXN0b3Jl X2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKQogCSAqIElmIHdlIGNoYW5nZWQgYW55IGtl eXMsIHdlIG11c3QgcmVkbyBfYnRfcHJlcHJvY2Vzc19rZXlzLiAgVGhhdCBtaWdodAogCSAqIHNv dW5kIGxpa2Ugb3ZlcmtpbGwsIGJ1dCBpbiBjYXNlcyB3aXRoIG11bHRpcGxlIGtleXMgcGVyIGlu ZGV4IGNvbHVtbgogCSAqIGl0IHNlZW1zIG5lY2Vzc2FyeSB0byBkbyB0aGUgZnVsbCBzZXQgb2Yg cHVzaHVwcy4KLQkgKgotCSAqIEFsc28gZG8gdGhpcyB3aGVuZXZlciB0aGUgc2NhbidzIHNldCBv ZiBhcnJheSBrZXlzICJ3cmFwcGVkIGFyb3VuZCIgYXQKLQkgKiB0aGUgZW5kIG9mIHRoZSBsYXN0 IHByaW1pdGl2ZSBpbmRleCBzY2FuLiAgVGhlcmUgd29uJ3QgaGF2ZSBiZWVuIGEgY2FsbAotCSAq IHRvIF9idF9wcmVwcm9jZXNzX2tleXMgZnJvbSBzb21lIG90aGVyIHBsYWNlIGZvbGxvd2luZyB3 cmFwIGFyb3VuZCwgc28KLQkgKiB3ZSBkbyBpdCBmb3Igb3Vyc2VsdmVzLgogCSAqLwotCWlmIChj aGFuZ2VkIHx8ICFzby0+YXJyYXlzU3RhcnRlZCkKLQl7CisJaWYgKGNoYW5nZWQpCiAJCV9idF9w cmVwcm9jZXNzX2tleXMoc2Nhbik7Ci0JCS8qIFRoZSBtYXJrIHNob3VsZCBoYXZlIGJlZW4gc2V0 IG9uIGEgY29uc2lzdGVudCBzZXQgb2Yga2V5cy4uLiAqLwotCQlBc3NlcnQoc28tPnF1YWxfb2sp OwotCX0KKworCUFzc2VydChfYnRfdmVyaWZ5X2tleXNfd2l0aF9hcnJheWtleXMoc2NhbikpOwog fQogCisvKgorICogX2J0X3R1cGxlX2JlZm9yZV9hcnJheV9za2V5cygpIC0tIF9idF9jaGVja2tl eXMgYXJyYXkgaGVscGVyIGZ1bmN0aW9uCisgKgorICogUm91dGluZSB0byBkZXRlcm1pbmUgaWYg YSBjb250aW51ZXNjYW49ZmFsc2UgdHVwbGUgKHNldCB0aGF0IHdheSBieSBhbgorICogaW5pdGlh bCBjYWxsIHRvIF9idF9jaGVja19jb21wYXJlKSBtdXN0IGFkdmFuY2UgdGhlIHNjYW4ncyBhcnJh eSBrZXlzLgorICogT25seSBjYWxsIGhlcmUgd2hlbiBfYnRfY2hlY2tfY29tcGFyZSBhbHJlYWR5 IHNldCBjb250aW51ZXNjYW49ZmFsc2UuCisgKgorICogUmV0dXJucyB0cnVlIHdoZW4gY2FsbGVy IHBhc3NlcyBhIHR1cGxlIHRoYXQgaXMgPCB0aGUgY3VycmVudCBzZXQgb2YgYXJyYXkKKyAqIGtl eXMgZm9yIHRoZSBtb3N0IHNpZ25pZmljYW50IG5vbi1lcXVhbCBjb2x1bW4vc2NhbiBrZXkgKG9y ID4gZm9yIGJhY2t3YXJkcworICogc2NhbnMpLiAgVGhpcyBtZWFucyB0aGF0IGl0IGNhbm5vdCBw b3NzaWJseSBiZSB0aW1lIHRvIGFkdmFuY2UgdGhlIGFycmF5CisgKiBrZXlzIGp1c3QgeWV0LiAg X2J0X2NoZWNra2V5cyBjYWxsZXIgc2hvdWxkIHN1cHByZXNzIGl0cyBfYnRfY2hlY2tfY29tcGFy ZQorICogY2FsbCwgYW5kIHJldHVybiAtLSB0aGUgdHVwbGUgaXMgdHJlYXRlZCBhcyBub3Qgc2F0 aXNmeWluZyBvdXIgaW5kZXhxdWFscy4KKyAqCisgKiBSZXR1cm5zIGZhbHNlIHdoZW4gY2FsbGVy J3MgdHVwbGUgaXMgPj0gdGhlIGN1cnJlbnQgYXJyYXkga2V5cyAob3IgPD0sIGluCisgKiB0aGUg Y2FzZSBvZiBiYWNrd2FyZHMgc2NhbnMpLiAgVGhpcyBtZWFucyB0aGF0IGl0IGlzIG5vdyB0aW1l IGZvciBvdXIKKyAqIGNhbGxlciB0byBhZHZhbmNlIHRoZSBhcnJheSBrZXlzICh1bmxlc3MgY2Fs bGVyIGJyb2tlIHRoZSBydWxlcyBieSBub3QKKyAqIGNoZWNraW5nIHdpdGggX2J0X2NoZWNrX2Nv bXBhcmUgYmVmb3JlIGNhbGxpbmcgaGVyZSkuCisgKgorICogTm90ZTogYWR2YW5jaW5nIHRoZSBh cnJheSBrZXlzIG1heSBiZSByZXF1aXJlZCB3aGVuIGV2ZXJ5IGF0dHJpYnV0ZSB2YWx1ZQorICog ZnJvbSBjYWxsZXIncyB0dXBsZSBpcyBlcXVhbCB0byBjb3JyZXNwb25kaW5nIHNjYW4ga2V5L2Fy cmF5IGRhdHVtcy4gIFNlZQorICogX2J0X2FkdmFuY2VfYXJyYXlfa2V5cyBhbmQgaXRzIGhhbmRs aW5nIG9mIGluZXF1YWxpdGllcyBmb3IgZGV0YWlscy4KKyAqCisgKiBOb3RlOiBjYWxsZXIgcGFz c2VzIF9idF9jaGVja19jb21wYXJlLXNldCBza3RyaWcgdmFsdWUgdG8gaW5kaWNhdGUgd2hpY2gK KyAqIHNjYW4ga2V5IHRyaWdnZXJlZCB0aGUgY2FsbC4gIElmIHRoaXMgaXMgZm9yIGFueSBzY2Fu IGtleSB0aGF0IGlzbid0IGEKKyAqIHJlcXVpcmVkIGVxdWFsaXR5IHN0cmF0ZWd5IHNjYW4ga2V5 LCBjYWxsaW5nIGhlcmUgaXMgYSBuby1vcCwgbWVhbmluZyB0aGF0CisgKiB3ZSdsbCBpbnZhcmlh Ymx5IHJldHVybiBmYWxzZS4gIFdlIGp1c3QgYWNjZXB0IHdoYXRldmVyIF9idF9jaGVja19jb21w YXJlCisgKiBpbmRpY2F0ZWQgYWJvdXQgdGhlIHNjYW4gd2hlbiBpdCBpbnZvbHZlcyBhIHJlcXVp cmVkIGluZXF1YWxpdHkgc2NhbiBrZXkuCisgKiBXZSBuZXZlciBjYXJlIGFib3V0IG5vbnJlcXVp cmVkIHNjYW4ga2V5cywgaW5jbHVkaW5nIGVxdWFsaXR5IHN0cmF0ZWd5CisgKiBhcnJheSBzY2Fu IGtleXMgKHRob3VnaCBfYnRfY2hlY2tfY29tcGFyZSBjYW4gdGVtcG9yYXJpbHkgZW5kIHRoZSBz Y2FuIHRvCisgKiBhZHZhbmNlIHRoZWlyIGFyYXJ5cyBpbiBfYnRfYWR2YW5jZV9hcnJheV9rZXlz LCB3aGljaCB3ZSdsbCBuZXZlciBwcmV2ZW50KS4KKyAqLworc3RhdGljIGJvb2wKK19idF90dXBs ZV9iZWZvcmVfYXJyYXlfc2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuLCBCVFJlYWRQYWdlU3RhdGUg KnBzdGF0ZSwKKwkJCQkJCQkgSW5kZXhUdXBsZSB0dXBsZSwgaW50IHNrdHJpZykKK3sKKwlCVFNj YW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CisJUmVsYXRpb24JcmVs ID0gc2Nhbi0+aW5kZXhSZWxhdGlvbjsKKwlTY2FuRGlyZWN0aW9uIGRpciA9IHBzdGF0ZS0+ZGly OworCVR1cGxlRGVzYwlpdHVwZGVzYyA9IFJlbGF0aW9uR2V0RGVzY3IocmVsKTsKKwlib29sCQl0 dXBsZV9iZWZvcmVfYXJyYXlfa2V5cyA9IGZhbHNlOworCVNjYW5LZXkJCWN1cjsKKwlpbnQJCQlu dHVwYXR0cyA9IEJUcmVlVHVwbGVHZXROQXR0cyh0dXBsZSwgcmVsKSwKKwkJCQlpa2V5OworCisJ QXNzZXJ0KHNvLT5udW1BcnJheUtleXMgPiAwKTsKKwlBc3NlcnQoc28tPm51bWJlck9mS2V5cyA+ IDApOworCUFzc2VydCghc28tPm5lZWRQcmltU2Nhbik7CisKKwlmb3IgKGN1ciA9IHNvLT5rZXlE YXRhICsgc2t0cmlnLCBpa2V5ID0gc2t0cmlnOworCQkgaWtleSA8IHNvLT5udW1iZXJPZktleXM7 CisJCSBjdXIrKywgaWtleSsrKQorCXsKKwkJaW50CQkJYXR0bnVtID0gY3VyLT5za19hdHRubzsK KwkJRm1nckluZm8gICAqb3JkZXJwcm9jOworCQlEYXR1bQkJdHVwZGF0dW07CisJCWJvb2wJCXR1 cG51bGw7CisJCWludDMyCQlyZXN1bHQ7CisKKwkJLyoKKwkJICogVW5saWtlIF9idF9jaGVja19j b21wYXJlIGFuZCBfYnRfYWR2YW5jZV9hcnJheV9rZXlzLCB3ZSBuZXZlciBkZWFsCisJCSAqIHdp dGggaW5lcXVhbGl0eSBzdHJhdGVneSBzY2FuIGtleXMgKGV2ZW4gdGhvc2UgbWFya2VkIHJlcXVp cmVkKS4gV2UKKwkJICogYWxzbyBkb24ndCBkZWFsIHdpdGggbm9uLXJlcXVpcmVkIGVxdWFsaXR5 IGtleXMgLS0gZXZlbiB3aGVuIHRoZXkKKwkJICogaGFwcGVuIHRvIGhhdmUgYXJyYXlzIHRoYXQg bWlnaHQgbmVlZCB0byBiZSBhZHZhbmNlZC4KKwkJICoKKwkJICogTm90ZTogY2Fubm90ICJicmVh ayIgaGVyZSBkdWUgdG8gY29ybmVyIGNhc2VzIGludm9sdmluZyByZWR1bmRhbnQKKwkJICogc2Nh biBrZXlzIHRoYXQgd2VyZW4ndCBlbGltaW5hdGVkIHdpdGhpbiBfYnRfcHJlcHJvY2Vzc19rZXlz LgorCQkgKi8KKwkJaWYgKGN1ci0+c2tfc3RyYXRlZ3kgIT0gQlRFcXVhbFN0cmF0ZWd5TnVtYmVy IHx8CisJCQkoY3VyLT5za19mbGFncyAmIFNLX0JUX1JFUUZXRCkgPT0gMCkKKwkJCWNvbnRpbnVl OworCisJCS8qIFJlcXVpcmVkIGVxdWFsaXR5IHNjYW4ga2V5cyBhbHdheXMgcmVxdWlyZWQgaW4g Ym90aCBkaXJlY3Rpb25zICovCisJCUFzc2VydCgoY3VyLT5za19mbGFncyAmIFNLX0JUX1JFUUZX RCkgJiYKKwkJCSAgIChjdXItPnNrX2ZsYWdzICYgU0tfQlRfUkVRQktXRCkpOworCisJCWlmIChh dHRudW0gPiBudHVwYXR0cykKKwkJeworCQkJLyoKKwkJCSAqIFdoZW4gd2UgcmVhY2ggYSBoaWdo IGtleSdzIHRydW5jYXRlZCBhdHRyaWJ1dGUsIGFzc3VtZSB0aGF0IHRoZQorCQkJICogdHVwbGUg YXR0cmlidXRlJ3MgdmFsdWUgaXMgPj0gdGhlIHNjYW4ncyBlcXVhbGl0eSBjb25zdHJhaW50CisJ CQkgKiBzY2FuIGtleXMsIGZvcmNpbmcgYW5vdGhlciBfYnRfYWR2YW5jZV9hcnJheV9rZXlzIGNh bGwuCisJCQkgKgorCQkJICogWW91IG1pZ2h0IHdvbmRlciB3aHkgd2UgZG9uJ3QgdHJlYXQgdHJ1 bmNhdGVkIGF0dHJpYnV0ZXMgYXMKKwkJCSAqIGhhdmluZyB2YWx1ZXMgPCBvdXIgZXF1YWxpdHkg Y29uc3RyYWludHMgaW5zdGVhZDsgd2UncmUgbm90CisJCQkgKiB0cmVhdGluZyB0aGUgdHJ1bmNh dGVkIGF0dHJpYnV0ZXMgYXMgaGF2aW5nIC1pbmYgdmFsdWVzIGhlcmUsCisJCQkgKiB3aGljaCBp cyBob3cgdGhpbmdzIGFyZSBkb25lIGluIF9idF9jb21wYXJlLgorCQkJICoKKwkJCSAqIFdlJ3Jl IG9mdGVuIGNhbGxlZCBkdXJpbmcgZmluYWx0dXAgcHJlY2hlY2tzLCB3aGVyZSB3ZSBoZWxwIG91 cgorCQkJICogY2FsbGVyIHRvIGRlY2lkZSB3aGV0aGVyIG9yIG5vdCBpdCBzaG91bGQgdGVybWlu YXRlIHRoZSBjdXJyZW50CisJCQkgKiBwcmltaXRpdmUgaW5kZXggc2Nhbi4gIE91ciBiZWhhdmlv ciBoZXJlIGltcGxlbWVudHMgYSBwb2xpY3kgb2YKKwkJCSAqIGJlaW5nIHNsaWdodGx5IG9wdGlt aXN0aWMgYWJvdXQgd2hhdCB3aWxsIGJlIGZvdW5kIG9uIHRoZSBuZXh0CisJCQkgKiBwYWdlIHdo ZW4gdGhlIGN1cnJlbnQgcHJpbWl0aXZlIHNjYW4gY29udGludWVzIG9udG8gdGhhdCBwYWdlLgor CQkJICogKFRoaXMgaXMgYWxzbyBjbG9zZXN0IHRvIHdoYXQgX2J0X2NoZWNrX2NvbXBhcmUgZG9l cy4pCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJdHVwZGF0dW0gPSBpbmRleF9nZXRhdHRy KHR1cGxlLCBhdHRudW0sIGl0dXBkZXNjLCAmdHVwbnVsbCk7CisKKwkJb3JkZXJwcm9jID0gJnNv LT5vcmRlclByb2NzW2F0dG51bSAtIDFdOworCQlyZXN1bHQgPSBfYnRfY29tcGFyZV9hcnJheV9z a2V5KG9yZGVycHJvYywgdHVwZGF0dW0sIHR1cG51bGwsCisJCQkJCQkJCQkJY3VyLT5za19hcmd1 bWVudCwgY3VyKTsKKworCQlpZiAocmVzdWx0ICE9IDApCisJCXsKKwkJCWlmIChTY2FuRGlyZWN0 aW9uSXNGb3J3YXJkKGRpcikpCisJCQkJdHVwbGVfYmVmb3JlX2FycmF5X2tleXMgPSByZXN1bHQg PCAwOworCQkJZWxzZQorCQkJCXR1cGxlX2JlZm9yZV9hcnJheV9rZXlzID0gcmVzdWx0ID4gMDsK KworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gdHVwbGVfYmVmb3JlX2FycmF5X2tleXM7 Cit9CisKKy8qCisgKiBfYnRfYXJyYXlfa2V5c19yZW1haW4oKSAtLSBzdGFydCBzY2hlZHVsZWQg cHJpbWl0aXZlIGluZGV4IHNjYW4/CisgKgorICogUmV0dXJucyB0cnVlIGlmIF9idF9jaGVja2tl eXMgc2NoZWR1bGVkIGFub3RoZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4sIGp1c3QKKyAqIGFzIHRo ZSBsYXN0IG9uZSBlbmRlZC4gIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLCBpbmRpY2F0aW5nIHRo YXQgdGhlIGFycmF5CisgKiBrZXlzIGFyZSBub3cgZnVsbHkgZXhoYXVzdGVkLgorICoKKyAqIE9u bHkgY2FsbCBoZXJlIGR1cmluZyBzY2FucyB3aXRoIG9uZSBvciBtb3JlIGVxdWFsaXR5IHR5cGUg YXJyYXkgc2NhbiBrZXlzLgorICovCitib29sCitfYnRfYXJyYXlfa2V5c19yZW1haW4oSW5kZXhT Y2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKK3sKKwlCVFNjYW5PcGFxdWUgc28gPSAo QlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CisKKwlBc3NlcnQoc28tPm51bUFycmF5S2V5cyk7 CisKKwkvKgorCSAqIEFycmF5IGtleXMgYXJlIGFkdmFuY2VkIHdpdGhpbiBfYnRfY2hlY2trZXlz IHdoZW4gdGhlIHNjYW4gcmVhY2hlcyB0aGUKKwkgKiBsZWFmIGxldmVsIChtb3JlIHByZWNpc2Vs eSwgdGhleSdyZSBhZHZhbmNlZCB3aGVuIHRoZSBzY2FuIHJlYWNoZXMgdGhlCisJICogZW5kIG9m IGVhY2ggZGlzdGluY3Qgc2V0IG9mIGFycmF5IGVsZW1lbnRzKS4gIFRoaXMgcHJvY2VzcyBhdm9p ZHMKKwkgKiByZXBlYXQgYWNjZXNzIHRvIGxlYWYgcGFnZXMgKGFjcm9zcyBtdWx0aXBsZSBwcmlt aXRpdmUgaW5kZXggc2NhbnMpIGJ5CisJICogYWR2YW5jaW5nIHRoZSBzY2FuJ3MgYXJyYXkga2V5 cyB3aGVuIGl0IGFsbG93cyB0aGUgcHJpbWl0aXZlIGluZGV4IHNjYW4KKwkgKiB0byBmaW5kIG5l YXJieSBtYXRjaGluZyB0dXBsZXMgKG9yIHdoZW4gaXQgZWxpbWluYXRlcyByYW5nZXMgb2YgYXJy YXkKKwkgKiBrZXkgc3BhY2UgdGhhdCBjYW4ndCBwb3NzaWJseSBiZSBzYXRpc2ZpZWQgYnkgYW55 IGluZGV4IHR1cGxlKS4KKwkgKgorCSAqIF9idF9jaGVja2tleXMgc2V0cyBhIHNpbXBsZSBmbGFn IHZhcmlhYmxlIHRvIHNjaGVkdWxlIGFub3RoZXIgcHJpbWl0aXZlCisJICogaW5kZXggc2Nhbi4g IFRoaXMgdGVsbHMgdXMgd2hhdCB0byBkby4gIFdlIGNhbm5vdCByZWx5IG9uIF9idF9maXJzdAor CSAqIGFsd2F5cyByZWFjaGluZyBfYnRfY2hlY2trZXlzLCB0aG91Z2guICBUaGVyZSBhcmUgdmFy aW91cyBjYXNlcyB3aGVyZQorCSAqIHRoYXQgd29uJ3QgaGFwcGVuLiAgRm9yIGV4YW1wbGUsIGlm IHRoZSBpbmRleCBpcyBjb21wbGV0ZWx5IGVtcHR5LCB0aGVuCisJICogX2J0X2ZpcnN0IHdvbid0 IGdldCBhcyBmYXIgYXMgY2FsbGluZyBfYnRfcmVhZHBhZ2UvX2J0X2NoZWNra2V5cy4KKwkgKgor CSAqIFdlIGFsc28gZG9uJ3QgZXhwZWN0IF9idF9jaGVja2tleXMgdG8gYmUgcmVhY2hlZCB3aGVu IHNlYXJjaGluZyBmb3IgYQorCSAqIG5vbi1leGlzdGVudCB2YWx1ZSB0aGF0IGhhcHBlbnMgdG8g YmUgaGlnaGVyIHRoYW4gYW55IGV4aXN0aW5nIHZhbHVlIGluCisJICogdGhlIGluZGV4LiAgTm8g X2J0X2NoZWNra2V5cyBhcmUgZXhwZWN0ZWQgd2hlbiBfYnRfcmVhZHBhZ2UgcmVhZHMgdGhlCisJ ICogcmlnaHRtb3N0IHBhZ2UgZHVyaW5nIHN1Y2ggYSBzY2FuIC0tIGV2ZW4gYSBfYnRfY2hlY2tr ZXlzIGNhbGwgYWdhaW5zdAorCSAqIHRoZSBoaWdoIGtleSB3b24ndCBoYXBwZW4uICBUaGVyZSBp cyBhbiBhbmFsb2dvdXMgaXNzdWUgZm9yIGJhY2t3YXJkcworCSAqIHNjYW5zIHRoYXQgc2VhcmNo IGZvciBhIHZhbHVlIGxvd2VyIHRoYW4gYWxsIGV4aXN0aW5nIGluZGV4IHR1cGxlcy4KKwkgKgor CSAqIFdlIGRvbid0IGFjdHVhbGx5IHJlcXVpcmUgc3BlY2lhbCBoYW5kbGluZyBmb3IgdGhlc2Ug Y2FzZXMgLS0gd2UgZG9uJ3QKKwkgKiBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgaW5zdHJ1Y3RlZCB0 byBfbm90XyBwZXJmb3JtIGFub3RoZXIgcHJpbWl0aXZlCisJICogaW5kZXggc2Nhbi4gIFRoaXMg aXMgY29ycmVjdCBmb3IgYWxsIG9mIHRoZSBjYXNlcyB3ZSd2ZSBsaXN0ZWQgc28gZmFyLAorCSAq IHdoaWNoIGFsbCBpbnZvbHZlIHByaW1pdGl2ZSBpbmRleCBzY2FucyB0aGF0IGFjY2VzcyBwYWdl cyAibmVhciB0aGUKKwkgKiBib3VuZGFyaWVzIG9mIHRoZSBrZXkgc3BhY2UiICh0aGUgbGVmdG1v c3QgcGFnZSwgdGhlIHJpZ2h0bW9zdCBwYWdlLCBvcgorCSAqIGFuIGltYWdpbmFyeSBlbXB0eSBs ZWFmIHJvb3QgcGFnZSkuICBJZiBfYnRfY2hlY2trZXlzIGNhbm5vdCBiZSByZWFjaGVkCisJICog YnkgYSBwcmltaXRpdmUgaW5kZXggc2NhbiBmb3Igb25lIHNldCBvZiBhcnJheSBrZXlzLCBpdCBm b2xsb3dzIHRoYXQgaXQKKwkgKiBhbHNvIHdvbid0IGJlIHJlYWNoZWQgZm9yIGFueSBsYXRlciBz ZXQgb2YgYXJyYXkga2V5cy4uLgorCSAqLworCWlmICghc28tPnF1YWxfb2spCisJeworCQkvKgor CQkgKiAuLi50aG91Z2ggdGhlcmUgaXMgb25lIGV4Y2VwdGlvbjogX2J0X2ZpcnN0J3MgX2J0X3By ZXByb2Nlc3Nfa2V5cworCQkgKiBjYWxsIGNhbiBkZXRlcm1pbmUgdGhhdCB0aGUgc2NhbidzIGlu cHV0IHNjYW4ga2V5cyBjYW4gbmV2ZXIgYmUKKwkJICogc2F0aXNmaWVkLiAgVGhhdCBtaWdodCBi ZSB0cnVlIGZvciBvbmUgc2V0IG9mIGFycmF5IGtleXMsIGJ1dCBub3QKKwkJICogdGhlIG5leHQg c2V0LgorCQkgKgorCQkgKiBIYW5kbGUgdGhpcyBieSBhZHZhbmNpbmcgdGhlIGFycmF5IGtleXMg aW5jcmVtZW50YWxseSBvdXJzZWx2ZXMuCisJCSAqIFdoZW4gdGhpcyBzdWNjZWVkcywgc3RhcnQg YW5vdGhlciBwcmltaXRpdmUgaW5kZXggc2Nhbi4KKwkJICovCisJCUNIRUNLX0ZPUl9JTlRFUlJV UFRTKCk7CisKKwkJQXNzZXJ0KCFzby0+bmVlZFByaW1TY2FuKTsKKwkJaWYgKF9idF9hZHZhbmNl X2FycmF5X2tleXNfaW5jcmVtZW50KHNjYW4sIGRpcikpCisJCQlyZXR1cm4gdHJ1ZTsKKworCQkv KiBBcnJheSBrZXlzIGFyZSBub3cgZXhoYXVzdGVkICovCisJfQorCisJLyoKKwkgKiBIYXMgYW5v dGhlciBwcmltaXRpdmUgaW5kZXggc2NhbiBiZWVuIHNjaGVkdWxlZCBieSBfYnRfY2hlY2trZXlz PworCSAqLworCWlmIChzby0+bmVlZFByaW1TY2FuKQorCXsKKwkJLyogWWVzIC0tIHRlbGwgY2Fs bGVyIHRvIGNhbGwgX2J0X2ZpcnN0IG9uY2UgYWdhaW4gKi8KKwkJc28tPm5lZWRQcmltU2NhbiA9 IGZhbHNlOworCQlpZiAoc2Nhbi0+cGFyYWxsZWxfc2NhbiAhPSBOVUxMKQorCQkJX2J0X3BhcmFs bGVsX25leHRfcHJpbWl0aXZlX3NjYW4oc2Nhbik7CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJ LyoKKwkgKiBObyBtb3JlIHByaW1pdGl2ZSBpbmRleCBzY2Fucy4gIFRlcm1pbmF0ZSB0aGUgdG9w LWxldmVsIHNjYW4uCisJICovCisJaWYgKHNjYW4tPnBhcmFsbGVsX3NjYW4gIT0gTlVMTCkKKwkJ X2J0X3BhcmFsbGVsX2RvbmUoc2Nhbik7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgKiBf YnRfYWR2YW5jZV9hcnJheV9rZXlzKCkgLS0gQWR2YW5jZSBhcnJheSBlbGVtZW50cyB1c2luZyBh IHR1cGxlCisgKgorICogTGlrZSBfYnRfY2hlY2tfY29tcGFyZSwgb3VyIHJldHVybiB2YWx1ZSBp bmRpY2F0ZXMgaWYgdHVwbGUgc2F0aXNmaWVkIHRoZQorICogcXVhbCAoc3BlY2lmaWNhbGx5IG91 ciBuZXcgcXVhbCkuICBXZSBhbHNvIHNldCBwc3RhdGUuY29udGludWVzY2FuPWZhbHNlCisgKiBm b3IgY2FsbGVyIHdoZW4gdGhlIHRvcC1sZXZlbCBpbmRleCBzY2FuIGlzIG92ZXIgKHdoZW4gYWxs IHJlcXVpcmVkIGFycmF5CisgKiBrZXlzIGFyZSBub3cgZXhoYXVzdGVkKS4gIE90aGVyd2lzZSwg d2UnbGwgc2V0IHBzdGF0ZS5jb250aW51ZXNjYW49dHJ1ZSwKKyAqIGluZGljYXRpbmcgdGhhdCB0 b3AtbGV2ZWwgc2NhbiBzaG91bGQgcHJvY2VlZCBvbnRvIHRoZSBuZXh0IHR1cGxlLiAgQWZ0ZXIK KyAqIHdlIHJldHVybiwgYWxsIGZ1cnRoZXIgY2FsbHMgdG8gX2J0X2NoZWNrX2NvbXBhcmUgd2ls bCBhbHNvIHVzZSBvdXIgbmV3CisgKiBxdWFsIChhIHF1YWwgd2l0aCBuZXdseSBhZHZhbmNlZCBh cnJheSBrZXkgdmFsdWVzLCBzZXQgaGVyZSBieSB1cykuCisgKgorICogX2J0X3R1cGxlX2JlZm9y ZV9hcnJheV9za2V5cyBpcyByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGN1cnJl bnQKKyAqIHBsYWNlIGluIHRoZSBzY2FuIGlzID49IHRoZSBjdXJyZW50IGFycmF5IGtleXMuICBD YWxsaW5nIGhlcmUgYmVmb3JlIHRoYXQKKyAqIHBvaW50IHdpbGwgcHJlbWF0dXJlbHkgYWR2YW5j ZSB0aGUgYXJyYXkga2V5cywgbGVhZGluZyB0byB3cm9uZyBxdWVyeQorICogcmVzdWx0cy4gIChB Y3R1YWxseSwgdGhlIGNhc2Ugd2hlcmUgdGhlIHRvcC1sZXZlbCBzY2FuIGVuZHMgbWlnaHQgbm90 CisgKiBhZHZhbmNlIHRoZSBhcnJheSBrZXlzLCBzaW5jZSB0aGVyZSBtYXkgYmUgbm8gZnVydGhl ciBrZXlzIGluIHRoZSBjdXJyZW50CisgKiBzY2FuIGRpcmVjdGlvbi4pCisgKgorICogV2UncmUg cmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgY2FsbGVyJ3MgdHVwbGUgaXMgPD0gY3VycmVu dC9uZXdseQorICogYWR2YW5jZWQgcmVxdWlyZWQgYXJyYXkga2V5cyBvbmNlIHdlIHJldHVybiAo dGhpcyBwb3N0Y29uZGl0aW9uIGlzIGFsc28KKyAqIGNoZWNrZWQgdmlhIGFub3RoZXIgYXNzZXJ0 aW9uKS4gIFdlIHRyeSB0byBmaW5kIGFuIGV4YWN0IG1hdGNoLCBidXQgZmFpbGluZworICogdGhh dCB3ZSdsbCBhZHZhbmNlIHRoZSBhcnJheSBrZXlzIHRvIHdoYXRldmVyIHNldCBvZiBrZXlzIGNv bWVzIG5leHQgaW4gdGhlCisgKiBrZXkgc3BhY2UgKGFtb25nIHRoZSBrZXlzIHRoYXQgd2UgYWN0 dWFsbHkgaGF2ZSkuICBSZXF1aXJlZCBhcnJheSBrZXlzIG9ubHkKKyAqIGV2ZXIgInJhdGNoZXQg Zm9yd2FyZHMiLCBwcm9ncmVzc2luZyBpbiBsb2NrIHN0ZXAgd2l0aCB0aGUgc2NhbiBpdHNlbGYu CisgKgorICogKFRoZSBpbnZhcmlhbnRzIGFyZSB0aGUgc2FtZSBmb3IgYmFja3dhcmRzIHNjYW5z LCBleGNlcHQgdGhhdCB0aGUgb3BlcmF0b3JzCisgKiBhcmUgZmxpcHBlZDoganVzdCByZXBsYWNl IHRoZSBwcmVjb25kaXRpb24ncyA+PSBvcGVyYXRvciB3aXRoIGEgPD0sIGFuZCB0aGUKKyAqIHBv c3Rjb25kaXRpb24ncyA8PSBvcGVyYXRvciB3aXRoIHdpdGggYSA+PS4gIEluIG90aGVyIHdvcmRz LCBqdXN0IHN3YXAgdGhlCisgKiBwcmVjb25kaXRpb24gd2l0aCB0aGUgcG9zdGNvbmRpdGlvbi4p CisgKgorICogTm90ZSB0aGF0IHdlIGRlYWwgd2l0aCBhbGwgcmVxdWlyZWQgZXF1YWxpdHkgc3Ry YXRlZ3kgc2NhbiBrZXlzIGhlcmU7IGl0J3MKKyAqIG5vdCBsaW1pdGVkIHRvIGFycmF5IHNjYW4g a2V5cy4gIFRoZXkncmUgZXF1YWxpdHkgY29uc3RyYWludHMgZm9yIG91cgorICogcHVycG9zZXMs IGFuZCBzbyBhcmUgaGFuZGxlZCBhcyBkZWdlbmVyYXRlIHNpbmdsZSBlbGVtZW50IGFycmF5cyBo ZXJlLgorICogT2J2aW91c2x5LCB0aGV5IGNhbiBuZXZlciByZWFsbHkgYWR2YW5jZSBpbiB0aGUg d2F5IHRoYXQgcmVhbCBhcnJheXMgY2FuLAorICogYnV0IHRoZXkgbXVzdCBzdGlsbCBhZmZlY3Qg aG93IHdlIGFkdmFuY2UgcmVhbCBhcnJheSBzY2FuIGtleXMsIGp1c3QgbGlrZQorICogYW55IG90 aGVyIGVxdWFsaXR5IGNvbnN0cmFpbnQuICBXZSBoYXZlIHRvIGtlZXAgYXJvdW5kIGEgMy13YXkg T1JERVIgcHJvYworICogZm9yIHRoZXNlIChqdXN0IHVzaW5nIHRoZSAiPSIgb3BlcmF0b3Igd29u J3QgZG8pLCBzaW5jZSBpbiBnZW5lcmFsIHdoZXRoZXIKKyAqIHRoZSB0dXBsZSBpcyA8IG9yID4g c29tZSBub24tYXJyYXkgZXF1YWxpdHkga2V5IG1pZ2h0IGluZmx1ZW5jZSBhZHZhbmNlbWVudAor ICogb2YgYW55IG9mIHRoZSBzY2FuJ3MgYWN0dWFsIGFycmF5cy4gIFRoZSB0b3AtbGV2ZWwgc2Nh biBjYW4gb25seSB0ZXJtaW5hdGUKKyAqIGFmdGVyIGl0IGhhcyBwcm9jZXNzZWQgdGhlIGtleSBz cGFjZSBjb3ZlcmVkIGJ5IHRoZSBwcm9kdWN0IG9mIGVhY2ggYW5kCisgKiBldmVyeSBlcXVhbGl0 eSBjb25zdHJhaW50LCBpbmNsdWRpbmcgYm90aCBub24tYXJyYXlzIGFuZCAocmVxdWlyZWQpIGFy cmF5cy4KKyAqIChBbHNvLCBfYnRfdHVwbGVfYmVmb3JlX2FycmF5X3NrZXlzIG5lZWRzIHRvIGtu b3cgdGhlIGRpZmZlcmVuY2Ugc28gdGhhdCBpdAorICogY2FuIGNvcnJlY3RseSBzdXBwcmVzcyBf YnRfY2hlY2tfY29tcGFyZSBzZXR0aW5nIGNvbnRpbnVlc2Nhbj1mYWxzZS4pCisgKgorICogTm90 ZSBhbHNvIHRoYXQgd2UgbWF5IHNvbWV0aW1lcyBuZWVkIHRvIGFkdmFuY2UgdGhlIGFycmF5IGtl eXMgd2hlbiB0aGUKKyAqIGV4aXN0aW5nIGFycmF5IGtleXMgYXJlIGFscmVhZHkgYW4gZXhhY3Qg bWF0Y2ggZm9yIGV2ZXJ5IGNvcnJlc3BvbmRpbmcKKyAqIHZhbHVlIGZyb20gY2FsbGVyJ3MgdHVw bGUgYWNjb3JkaW5nIHRvIF9idF9jaGVja19jb21wYXJlLiAgVGhpcyBpcyBob3cgd2UKKyAqIGRl YWwgd2l0aCBpbmVxdWFsaXRpZXMgdGhhdCBhcmUgcmVxdWlyZWQgaW4gdGhlIGN1cnJlbnQgc2Nh biBkaXJlY3Rpb24uCisgKiBUaGV5IGNhbiBhZHZhbmNlIHRoZSBhcnJheSBrZXlzIGhlcmUsIGV2 ZW4gdGhvdWdoIHRoZXkgZG9uJ3QgaW5mbHVlbmNlIHRoZQorICogaW5pdGlhbCBwb3NpdGlvbmlu ZyBzdHJhdGVneSB3aXRoaW4gX2J0X2ZpcnN0LgorICovCitzdGF0aWMgYm9vbAorX2J0X2FkdmFu Y2VfYXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNjYW4sIEJUUmVhZFBhZ2VTdGF0ZSAqcHN0YXRl LAorCQkJCQkgICBJbmRleFR1cGxlIHR1cGxlLCBpbnQgc2t0cmlnKQoreworCUJUU2Nhbk9wYXF1 ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsKKwlSZWxhdGlvbglyZWwgPSBzY2Fu LT5pbmRleFJlbGF0aW9uOworCVNjYW5EaXJlY3Rpb24gZGlyID0gcHN0YXRlLT5kaXI7CisJVHVw bGVEZXNjCWl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihyZWwpOworCVNjYW5LZXkJCWN1cjsK KwlpbnQJCQlpa2V5LAorCQkJCWZpcnN0X25vbnJlcXVpcmVkX2lrZXkgUEdfVVNFRF9GT1JfQVNT RVJUU19PTkxZID0gLTEsCisJCQkJYXJyYXlpZHggPSAwLAorCQkJCW50dXBhdHRzID0gQlRyZWVU dXBsZUdldE5BdHRzKHR1cGxlLCByZWwpOworCWJvb2wJCWFycmF5c19hZHZhbmNlZCA9IGZhbHNl LAorCQkJCWFycmF5c19leGhhdXN0ZWQsCisJCQkJYmV5b25kX2VuZF9hZHZhbmNlID0gZmFsc2Us CisJCQkJZm91bmRSZXF1aXJlZE9wcG9zaXRlRGlyT25seSA9IGZhbHNlLAorCQkJCWFsbF9lcXR5 cGVfc2tfZXF1YWwgPSB0cnVlLAorCQkJCWFsbF9yZXF1aXJlZF9lcXR5cGVfc2tfZXF1YWwgUEdf VVNFRF9GT1JfQVNTRVJUU19PTkxZID0gdHJ1ZTsKKworCUFzc2VydChfYnRfdmVyaWZ5X2tleXNf d2l0aF9hcnJheWtleXMoc2NhbikpOworCisJLyoKKwkgKiBUcnkgdG8gYWR2YW5jZSBhcnJheSBr ZXlzIHZpYSBhIHNlcmllcyBvZiBiaW5hcnkgc2VhcmNoZXMuCisJICoKKwkgKiBMb29wIGl0ZXJh dGVzIHRocm91Z2ggdGhlIGN1cnJlbnQgc2NhbmtleXMgKHNvLT5rZXlEYXRhW10sIHdoaWNoIHdl cmUKKwkgKiBvdXRwdXQgYnkgX2J0X3ByZXByb2Nlc3Nfa2V5cyBlYXJsaWVyKSBhbmQgdGhlbiBz ZXRzIGlucHV0IHNjYW4ga2V5cworCSAqIChzby0+YXJyYXlLZXlEYXRhW10gc2NhbiBrZXlzKSB0 byBuZXcgYXJyYXkgdmFsdWVzLgorCSAqLworCWZvciAoY3VyID0gc28tPmtleURhdGEsIGlrZXkg PSAwOyBpa2V5IDwgc28tPm51bWJlck9mS2V5czsgY3VyKyssIGlrZXkrKykKKwl7CisJCUJUQXJy YXlLZXlJbmZvICphcnJheSA9IE5VTEw7CisJCVNjYW5LZXkJCXNrZXlhcnJheSA9IE5VTEw7CisJ CUZtZ3JJbmZvICAgKm9yZGVycHJvYzsKKwkJaW50CQkJYXR0bnVtID0gY3VyLT5za19hdHRubzsK KwkJRGF0dW0JCXR1cGRhdHVtOworCQlib29sCQlyZXF1aXJlZFNhbWVEaXIgPSBmYWxzZSwKKwkJ CQkJcmVxdWlyZWRPcHBvc2l0ZURpck9ubHkgPSBmYWxzZSwKKwkJCQkJdHVwbnVsbDsKKwkJaW50 MzIJCXJlc3VsdDsKKwkJaW50CQkJc2V0X2VsZW0gPSAwOworCisJCS8qCisJCSAqIFNldCB1cCBP UkRFUiAzLXdheSBjb21wYXJpc29uIGZ1bmN0aW9uIGFuZCBhcnJheSBzdGF0ZQorCQkgKi8KKwkJ b3JkZXJwcm9jID0gJnNvLT5vcmRlclByb2NzW2F0dG51bSAtIDFdOworCQlpZiAoY3VyLT5za19m bGFncyAmIFNLX1NFQVJDSEFSUkFZICYmCisJCQljdXItPnNrX3N0cmF0ZWd5ID09IEJURXF1YWxT dHJhdGVneU51bWJlcikKKwkJeworCQkJQXNzZXJ0KGFycmF5aWR4IDwgc28tPm51bUFycmF5S2V5 cyk7CisJCQlhcnJheSA9ICZzby0+YXJyYXlLZXlzW2FycmF5aWR4KytdOworCQkJc2tleWFycmF5 ID0gJnNvLT5hcnJheUtleURhdGFbYXJyYXktPnNjYW5fa2V5XTsKKwkJCUFzc2VydChza2V5YXJy YXktPnNrX2F0dG5vID09IGF0dG51bSk7CisJCX0KKworCQlpZiAoKChjdXItPnNrX2ZsYWdzICYg U0tfQlRfUkVRRldEKSAmJiBTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikpIHx8CisJCQkoKGN1 ci0+c2tfZmxhZ3MgJiBTS19CVF9SRVFCS1dEKSAmJiBTY2FuRGlyZWN0aW9uSXNCYWNrd2FyZChk aXIpKSkKKwkJCXJlcXVpcmVkU2FtZURpciA9IHRydWU7CisJCWVsc2UgaWYgKCgoY3VyLT5za19m bGFncyAmIFNLX0JUX1JFUUZXRCkgJiYgU2NhbkRpcmVjdGlvbklzQmFja3dhcmQoZGlyKSkgfHwK KwkJCQkgKChjdXItPnNrX2ZsYWdzICYgU0tfQlRfUkVRQktXRCkgJiYgU2NhbkRpcmVjdGlvbklz Rm9yd2FyZChkaXIpKSkKKwkJCXJlcXVpcmVkT3Bwb3NpdGVEaXJPbmx5ID0gdHJ1ZTsKKworCQkv KgorCQkgKiBSZW1lbWJlciBmaXJzdCBub24tcmVxdWlyZWQgYXJyYXkgc2NhbiBrZXkgb2Zmc2V0 IChmb3IgYXNzZXJ0aW9ucykKKwkJICovCisJCWlmICghcmVxdWlyZWRTYW1lRGlyICYmIGFycmF5 ICYmIGZpcnN0X25vbnJlcXVpcmVkX2lrZXkgPT0gLTEpCisJCQlmaXJzdF9ub25yZXF1aXJlZF9p a2V5ID0gaWtleTsKKworCQkvKgorCQkgKiBPcHRpbWl6YXRpb246IFNraXAgb3ZlciBrbm93bi1z YXRpc2ZpZWQgc2NhbiBrZXlzCisJCSAqLworCQlpZiAoaWtleSA8IHNrdHJpZykKKwkJCWNvbnRp bnVlOworCisJCS8qCisJCSAqIFdoZW4gd2UgY29tZSBhY3Jvc3MgYW4gaW5lcXVhbGl0eSBzY2Fu IGtleSB0aGF0J3MgcmVxdWlyZWQgaW4gdGhlCisJCSAqIG9wcG9zaXRlIGRpcmVjdGlvbiBvbmx5 LCBhbmQgaXMgcG9zaXRpb25lZCBhZnRlciBhbiB1bnNhdGlzZmllZAorCQkgKiBzY2FuIGtleSB0 aGF0J3MgcmVxdWlyZWQgaW4gdGhlIGN1cnJlbnQgc2NhbiBkaXJlY3Rpb24sIHJlbWVtYmVyIGl0 CisJCSAqLworCQlpZiAocmVxdWlyZWRPcHBvc2l0ZURpck9ubHkpCisJCXsKKwkJCUFzc2VydChp a2V5ID4gc2t0cmlnKTsKKwkJCUFzc2VydChjdXItPnNrX3N0cmF0ZWd5ICE9IEJURXF1YWxTdHJh dGVneU51bWJlcik7CisJCQlBc3NlcnQoIWZvdW5kUmVxdWlyZWRPcHBvc2l0ZURpck9ubHkpOwor CisJCQlmb3VuZFJlcXVpcmVkT3Bwb3NpdGVEaXJPbmx5ID0gdHJ1ZTsKKworCQkJY29udGludWU7 CisJCX0KKworCQkvKgorCQkgKiBPdGhlciB0aGFuIHRoYXQsIHdlJ3JlIG5vdCBpbnRlcmVzdGVk IGluIHNjYW4ga2V5cyB0aGF0IGFyZW4ndAorCQkgKiByZXF1aXJlZCBpbiB0aGUgY3VycmVudCBz Y2FuIGRpcmVjdGlvbiAodW5sZXNzIHRoZXkncmUgbm9uLXJlcXVpcmVkCisJCSAqIGFycmF5IGVx dWFsaXR5IHNjYW4ga2V5cywgd2hpY2ggc3RpbGwgbmVlZCB0byBiZSBhZHZhbmNlZCBieSB1cykK KwkJICovCisJCWlmICghcmVxdWlyZWRTYW1lRGlyICYmICFhcnJheSkKKwkJCWNvbnRpbnVlOwor CisJCS8qCisJCSAqIFdoZW5ldmVyIGEgcmVxdWlyZWQgc2NhbiBrZXkgdHJpZ2dlcnMgYXJyYXkg a2V5IGFkdmFuY2VtZW50IHdpdGhpbgorCQkgKiBfYnRfY2hlY2tfY29tcGFyZSwgdGhlIGNvcnJl c3BvbmRpbmcgdHVwbGUgYXR0cmlidXRlJ3MgdmFsdWUgaXMKKwkJICogdHlwaWNhbGx5IDwgdGhl IHNjYW4ga2V5IHZhbHVlIChvciA+IGluIHRoZSBiYWNrd2FyZHMgc2NhbiBjYXNlKS4KKwkJICoK KwkJICogSWYgdGhpcyBpcyBhIHJlcXVpcmVkIGVxdWFsaXR5IHN0cmF0ZWd5IHNjYW4ga2V5LCB0 aGlzIGlzIGp1c3QgYW4KKwkJICogb3B0aW1pemF0aW9uOyB3ZSBrbm93IHRoYXQgX2J0X3R1cGxl X2JlZm9yZV9hcnJheV9za2V5cyBoYXMgYWxyZWFkeQorCQkgKiBkZXRlcm1pbmVkIHRoYXQgdGhp cyBzY2FuIGtleSBwbGFjZXMgdXMgYWhlYWQgb2YgY2FsbGVyJ3MgdHVwbGUuCisJCSAqIFRoZXJl J3Mgbm8gbmVlZCB0byBjb21wYXJlIGl0IGEgc2Vjb25kIHRpbWUgYmVsb3cuCisJCSAqCisJCSAq IElmIHRoaXMgaXMgYSByZXF1aXJlZCBpbmVxdWFsaXR5IHN0cmF0ZWd5IHNjYW4ga2V5LCB3ZSBf bXVzdF8gcmVseQorCQkgKiBvbiBfYnRfY2hlY2tfY29tcGFyZSBsaWtlIHRoaXM7IGl0IGtub3dz IGFsbCB0aGUgaW50cmljYWNpZXMgYXJvdW5kCisJCSAqIGV2YWx1YXRpbmcgaW5lcXVhbGl0eSBz dHJhdGVneSBzY2FuIGtleXMgKGUuZy4sIHJvdyBjb21wYXJpc29ucykuCisJCSAqIFRoZXJlIGlz IG5vIHNpbXBsZSBtYXBwaW5nIG9udG8gdGhlIG9wY2xhc3MgT1JERVIgcHJvYyB3ZSBjYW4gdXNl LgorCQkgKiBCdXQgb25jZSB3ZSBrbm93IHRoYXQgd2UgaGF2ZSBhbiB1bnNhdGlzZmllZCBpbmVx dWFsaXR5LCB3ZSBjYW4KKwkJICogdHJlYXQgaXQgaW4gdGhlIHNhbWUgd2F5IGFzIGFuIHVuc2F0 aXNmaWVkIGVxdWFsaXR5IGF0IHRoaXMgcG9pbnQuCisJCSAqCisJCSAqIFRoZSBhcnJheXMgYWR2 YW5jZSBjb3JyZWN0bHkgaW4gYm90aCBjYXNlcyBiZWNhdXNlIGJvdGggaW52b2x2ZSB0aGUKKwkJ ICogc2NhbiByZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBrZXkgc3BhY2UgZm9yIHNvbWUgYXJyYXkg a2V5IChvciBzb21lCisJCSAqIGRpc3RpbmN0IHNldCBvZiBhcnJheSBrZXlzKS4gIFRoZSBvbmx5 IGRpZmZlcmVuY2UgaXMgdGhhdCBpbiB0aGUKKwkJICogZXF1YWxpdHkgc3RyYXRlZ3kgY2FzZSB0 aGUgZW5kIGlzICJiZXR3ZWVuIGFycmF5IGtleXMiLCB3aGlsZSBpbgorCQkgKiB0aGUgaW5lcXVh bGl0eSBzdHJhdGVneSBjYXNlIHRoZSBlbmQgaXMgIndpdGhpbiBhbiBhcnJheSBrZXkiLgorCQkg KiBFaXRoZXIgd2F5LCB3ZSBqdXN0IGFkdmFuY2UgaGlnaGVyIG9yZGVyIGFycmF5cyBieSBvbmUg aW5jcmVtZW50LgorCQkgKgorCQkgKiBTZWUgYmVsb3cgZm9yIGEgZnVsbCBleHBsYW5hdGlvbiBv ZiAiYmV5b25kIGVuZCIgYWR2YW5jZW1lbnQuCisJCSAqLworCQlpZiAoaWtleSA9PSBza3RyaWcg JiYgIWFycmF5KQorCQl7CisJCQlBc3NlcnQocmVxdWlyZWRTYW1lRGlyKTsKKwkJCUFzc2VydCgh YXJyYXlzX2FkdmFuY2VkKTsKKworCQkJYmV5b25kX2VuZF9hZHZhbmNlID0gdHJ1ZTsKKworCQkJ Y29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBOb3RoaW5nIGZvciB1cyB0byBkbyB3aXRoIGEg cmVxdWlyZWQgaW5lcXVhbGl0eSBzdHJhdGVneSBzY2FuIGtleQorCQkgKiB0aGF0IHdhc24ndCB0 aGUgb25lIHRoYXQgX2J0X2NoZWNrX2NvbXBhcmUgc3RvcHBlZCBvbgorCQkgKi8KKwkJaWYgKGN1 ci0+c2tfc3RyYXRlZ3kgIT0gQlRFcXVhbFN0cmF0ZWd5TnVtYmVyKQorCQkJY29udGludWU7CisK KwkJLyoKKwkJICogSGVyZSB3ZSBwZXJmb3JtIHN0ZXBzIGZvciBhbGwgYXJyYXkgc2NhbiBrZXlz IGFmdGVyIGEgcmVxdWlyZWQKKwkJICogYXJyYXkgc2NhbiBrZXkgd2hvc2UgYmluYXJ5IHNlYXJj aCB0cmlnZ2VyZWQgImJleW9uZCBlbmQgb2YgYXJyYXkKKwkJICogZWxlbWVudCIgYXJyYXkgYWR2 YW5jZW1lbnQgZHVlIHRvIGVuY291bnRlcmluZyBhIHR1cGxlIGF0dHJpYnV0ZQorCQkgKiB2YWx1 ZSA+IHRoZSBjbG9zZXN0IG1hdGNoaW5nIGFycmF5IGtleSAob3IgPCBmb3IgYmFja3dhcmRzIHNj YW5zKS4KKwkJICoKKwkJICogU2VlIGJlbG93IGZvciBhIGZ1bGwgZXhwbGFuYXRpb24gb2YgImJl eW9uZCBlbmQiIGFkdmFuY2VtZW50LgorCQkgKgorCQkgKiBOQjogV2UgbXVzdCBkbyB0aGlzIGZv ciBhbGwgYXJyYXlzIC0tIG5vdCBqdXN0IHJlcXVpcmVkIGFycmF5cy4KKwkJICogT3RoZXJ3aXNl IHRoZSBpbmNyZW1lbnRhbCBhcnJheSBhZHZhbmNlbWVudCBzdGVwIHdvbid0ICJjYXJyeSIuCisJ CSAqLworCQlpZiAoYmV5b25kX2VuZF9hZHZhbmNlKQorCQl7CisJCQlpbnQJCQlmaW5hbF9lbGVt X2RpcjsKKworCQkJaWYgKFNjYW5EaXJlY3Rpb25Jc0JhY2t3YXJkKGRpcikgfHwgIWFycmF5KQor CQkJCWZpbmFsX2VsZW1fZGlyID0gMDsKKwkJCWVsc2UKKwkJCQlmaW5hbF9lbGVtX2RpciA9IGFy cmF5LT5udW1fZWxlbXMgLSAxOworCisJCQlpZiAoYXJyYXkgJiYgYXJyYXktPmN1cl9lbGVtICE9 IGZpbmFsX2VsZW1fZGlyKQorCQkJeworCQkJCWFycmF5LT5jdXJfZWxlbSA9IGZpbmFsX2VsZW1f ZGlyOworCQkJCXNrZXlhcnJheS0+c2tfYXJndW1lbnQgPSBhcnJheS0+ZWxlbV92YWx1ZXNbZmlu YWxfZWxlbV9kaXJdOworCQkJCWFycmF5c19hZHZhbmNlZCA9IHRydWU7CisJCQl9CisKKwkJCWNv bnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogSGVyZSB3ZSBwZXJmb3JtIHN0ZXBzIGZvciBhbnkg cmVxdWlyZWQgc2NhbiBrZXlzIGFmdGVyIHRoZSBmaXJzdAorCQkgKiByZXF1aXJlZCBzY2FuIGtl eSB3aG9zZSB0dXBsZSBhdHRyaWJ1dGUgd2FzIDwgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcKKwkJICog YXJyYXkga2V5IHdoZW4gd2UgZGVhbHQgd2l0aCBpdCAob3IgPiBmb3IgYmFja3dhcmRzIHNjYW5z KS4KKwkJICoKKwkJICogVGhpcyBlYXJsaWVyIHJlcXVpcmVkIGFycmF5IGtleSBhbHJlYWR5IHB1 dHMgdXMgYWhlYWQgb2YgY2FsbGVyJ3MKKwkJICogdHVwbGUgaW4gdGhlIGtleSBzcGFjZSAoZm9y IHRoZSBjdXJyZW50IHNjYW4gZGlyZWN0aW9uKS4gIFdlIG11c3QKKwkJICogbWFrZSBzdXJlIHRo YXQgc3Vic2VxdWVudCBsb3dlci1vcmRlciBhcnJheSBrZXlzIGRvIG5vdCBwdXQgdXMgdG9vCisJ CSAqIGZhciBhaGVhZCAoYWhlYWQgb2YgdHVwbGVzIHRoYXQgaGF2ZSB5ZXQgdG8gYmUgc2VlbiBi eSBvdXIgY2FsbGVyKS4KKwkJICogRm9yIGV4YW1wbGUsIHdoZW4gYSB0dXBsZSAiKGEsIGIpID0g KDQyLCA1KSIgYWR2YW5jZXMgdGhlIGFycmF5CisJCSAqIGtleXMgb24gImEiIGZyb20gNDAgdG8g NDUsIHdlIG11c3QgYWxzbyBzZXQgImIiIHRvIHdoYXRldmVyIHRoZQorCQkgKiBmaXJzdCBhcnJh eSBlbGVtZW50IGZvciAiYiIgaXMuICBJdCB3b3VsZCBiZSB3cm9uZyB0byBhbGxvdyAiYiIgdG8K KwkJICogYmUgc2V0IGJhc2VkIG9uIHRoZSB0dXBsZSB2YWx1ZS4KKwkJICoKKwkJICogUGVyZm9y bSB0aGUgc2FtZSBzdGVwcyB3aXRoIHRydW5jYXRlZCBoaWdoIGtleSBhdHRyaWJ1dGVzLiAgWW91 IGNhbgorCQkgKiB0aGluayBvZiB0aGlzIGFzIGEgImJpbmFyeSBzZWFyY2giIGZvciB0aGUgZWxl bWVudCBjbG9zZXN0IHRvIHRoZQorCQkgKiB2YWx1ZSAtaW5mLiAgQWdhaW4sIHRoZSBhcnJheXMg bXVzdCBuZXZlciBnZXQgYWhlYWQgb2YgdGhlIHNjYW4uCisJCSAqLworCQlpZiAoIWFsbF9lcXR5 cGVfc2tfZXF1YWwgfHwgYXR0bnVtID4gbnR1cGF0dHMpCisJCXsKKwkJCWludAkJCWZpcnN0X2Vs ZW1fZGlyOworCisJCQlpZiAoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIpIHx8ICFhcnJheSkK KwkJCQlmaXJzdF9lbGVtX2RpciA9IDA7CisJCQllbHNlCisJCQkJZmlyc3RfZWxlbV9kaXIgPSBh cnJheS0+bnVtX2VsZW1zIC0gMTsKKworCQkJaWYgKGFycmF5ICYmIGFycmF5LT5jdXJfZWxlbSAh PSBmaXJzdF9lbGVtX2RpcikKKwkJCXsKKwkJCQlhcnJheS0+Y3VyX2VsZW0gPSBmaXJzdF9lbGVt X2RpcjsKKwkJCQlza2V5YXJyYXktPnNrX2FyZ3VtZW50ID0gYXJyYXktPmVsZW1fdmFsdWVzW2Zp cnN0X2VsZW1fZGlyXTsKKwkJCQlhcnJheXNfYWR2YW5jZWQgPSB0cnVlOworCQkJfQorCisJCQkv KgorCQkJICogVHJ1bmNhdGVkIC1pbmYgdmFsdWUgd2lsbCBhbHdheXMgYmUgYXNzdW1lZCB0byBz YXRpc2Z5IGFueQorCQkJICogcmVxdWlyZWQgZXF1YWxpdHkgc2NhbiBrZXlzIGFjY29yZGluZyB0 byBfYnRfY2hlY2tfY29tcGFyZS4KKwkJCSAqIFVuc2V0IGFsbF9lcXR5cGVfc2tfZXF1YWwgdG8g YXZvaWQgX2J0X2NoZWNrX2NvbXBhcmUgcmVjaGVjay4KKwkJCSAqCisJCQkgKiBEZWxpYmVyYXRl bHkgZG9uJ3QgdW5zZXQgYWxsX3JlcXVpcmVkX2VxdHlwZV9za19lcXVhbCBoZXJlIHRvCisJCQkg KiBhdm9pZCBzcHVyaW91cyBwb3N0Y29uZGl0aW9uIGFzc2VydGlvbiBmYWlsdXJlcy4gIFdlIG11 c3QKKwkJCSAqIGZvbGxvdyBfYnRfdHVwbGVfYmVmb3JlX2FycmF5X3NrZXlzJ3MgZXhhbXBsZSBi eSBub3QgdHJlYXRpbmcKKwkJCSAqIHRydW5jYXRlZCBhdHRyaWJ1dGVzIGFzIGhhdmluZyB0aGUg ZXhhY3QgdmFsdWUgLWluZi4KKwkJCSAqLworCQkJYWxsX2VxdHlwZV9za19lcXVhbCA9IGZhbHNl OworCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFNlYXJjaCBpbiBzY2Fua2V5J3Mg YXJyYXkgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHR1cGxlIGF0dHJpYnV0ZQorCQkgKiB2YWx1ZSBm cm9tIGNhbGxlcidzIHR1cGxlCisJCSAqLworCQl0dXBkYXR1bSA9IGluZGV4X2dldGF0dHIodHVw bGUsIGF0dG51bSwgaXR1cGRlc2MsICZ0dXBudWxsKTsKKworCQlpZiAoYXJyYXkpCisJCXsKKwkJ CWJvb2wJCXJhdGNoZXRzID0gKHJlcXVpcmVkU2FtZURpciAmJiAhYXJyYXlzX2FkdmFuY2VkKTsK KworCQkJLyoKKwkJCSAqIEJpbmFyeSBzZWFyY2ggZm9yIGNsb3Nlc3QgbWF0Y2ggdGhhdCdzIGF2 YWlsYWJsZSBmcm9tIHRoZSBhcnJheQorCQkJICovCisJCQlzZXRfZWxlbSA9IF9idF9iaW5zcmNo X2FycmF5X3NrZXkob3JkZXJwcm9jLCByYXRjaGV0cywgZGlyLAorCQkJCQkJCQkJCQkgIHR1cGRh dHVtLCB0dXBudWxsLCBhcnJheSwgY3VyLAorCQkJCQkJCQkJCQkgICZyZXN1bHQpOworCisJCQkv KgorCQkJICogUmVxdWlyZWQgYXJyYXlzIG9ubHkgZXZlciByYXRjaGV0IGZvcndhcmRzIChiYWNr d2FyZHMpLgorCQkJICoKKwkJCSAqIFRoaXMgY29uZGl0aW9uIG1ha2VzIGl0IHNhZmUgZm9yIGJp bmFyeSBzZWFyY2hlcyB0byBza2lwIG92ZXIKKwkJCSAqIGFycmF5IGVsZW1lbnRzIHRoYXQgdGhl IHNjYW4gbXVzdCBhbHJlYWR5IGJlIGFoZWFkIG9mIGJ5IG5vdy4KKwkJCSAqIFRoYXQgaXMgc3Ry aWN0bHkgYW4gb3B0aW1pemF0aW9uLiAgT3VyIGFzc2VydGlvbiB2ZXJpZmllcyB0aGF0CisJCQkg KiB0aGUgY29uZGl0aW9uIGhvbGRzLCB3aGljaCBkb2Vzbid0IGRlcGVuZCBvbiB0aGUgb3B0aW1p emF0aW9uLgorCQkJICovCisJCQlBc3NlcnQoIXJhdGNoZXRzIHx8CisJCQkJICAgKChTY2FuRGly ZWN0aW9uSXNGb3J3YXJkKGRpcikgJiYgc2V0X2VsZW0gPj0gYXJyYXktPmN1cl9lbGVtKSB8fAor CQkJCQkoU2NhbkRpcmVjdGlvbklzQmFja3dhcmQoZGlyKSAmJiBzZXRfZWxlbSA8PSBhcnJheS0+ Y3VyX2VsZW0pKSk7CisJCQlBc3NlcnQoc2V0X2VsZW0gPj0gMCAmJiBzZXRfZWxlbSA8IGFycmF5 LT5udW1fZWxlbXMpOworCQl9CisJCWVsc2UKKwkJeworCQkJQXNzZXJ0KHJlcXVpcmVkU2FtZURp cik7CisKKwkJCS8qCisJCQkgKiBUaGlzIGlzIGEgcmVxdWlyZWQgbm9uLWFycmF5IGVxdWFsaXR5 IHN0cmF0ZWd5IHNjYW4ga2V5LCB3aGljaAorCQkJICogd2UnbGwgdHJlYXQgYXMgYSBkZWdlbmVy YXRlIHNpbmdsZSB2YWx1ZSBhcnJheS4KKwkJCSAqCisJCQkgKiBfYnRfYWR2YW5jZV9hcnJheV9r ZXlzX2luY3JlbWVudCB3b24ndCBoYXZlIGFuIGFycmF5IGZvciB0aGlzCisJCQkgKiBzY2FuIGtl eSwgYnV0IGl0IGNhbid0IG1hdHRlci4gIElmIHlvdSB0aGluayBhYm91dCBob3cgcmVhbAorCQkJ ICogc2luZ2xlIHZhbHVlIGFycmF5cyByb2xsIG92ZXIsIHlvdSdsbCB1bmRlcnN0YW5kIHdoeSB0 aGlzIGlzLgorCQkJICovCisJCQlyZXN1bHQgPSBfYnRfY29tcGFyZV9hcnJheV9za2V5KG9yZGVy cHJvYywgdHVwZGF0dW0sIHR1cG51bGwsCisJCQkJCQkJCQkJCWN1ci0+c2tfYXJndW1lbnQsIGN1 cik7CisJCX0KKworCQkvKgorCQkgKiBDb25zaWRlciAiYmV5b25kIGVuZCBvZiBhcnJheSBlbGVt ZW50IiBhcnJheSBhZHZhbmNlbWVudC4KKwkJICoKKwkJICogV2hlbiB0aGUgdHVwbGUgYXR0cmli dXRlIHZhbHVlIGlzID4gdGhlIGNsb3Nlc3QgbWF0Y2hpbmcgYXJyYXkga2V5CisJCSAqIChvciA8 IGluIHRoZSBiYWNrd2FyZHMgc2NhbiBjYXNlKSwgd2UgbmVlZCB0byByYXRjaGV0IHRoaXMgYXJy YXkKKwkJICogZm9yd2FyZCAoYmFja3dhcmQpIGJ5IG9uZSBpbmNyZW1lbnQsIHNvIHRoYXQgY2Fs bGVyJ3MgdHVwbGUgZW5kcyB1cAorCQkgKiBiZWluZyA8IGZpbmFsIGFycmF5IHZhbHVlIGluc3Rl YWQgKG9yID4gZmluYWwgYXJyYXkgdmFsdWUgaW5zdGVhZCkuCisJCSAqIFNlZSBhbHNvOiBzdGF0 ZSBtYWNoaW5lIHBvc3Rjb25kaXRpb24gYXNzZXJ0aW9ucywgYmVsb3cuCisJCSAqCisJCSAqIFRo aXMgcHJvY2VzcyBoYXMgdG8gd29yayBmb3IgYWxsIG9mIHRoZSBhcnJheXMsIG5vdCBqdXN0IHRo aXMgb25lOgorCQkgKiBpdCBtdXN0ICJjYXJyeSIgdG8gaGlnaGVyLW9yZGVyIGFycmF5cyB3aGVu IHRoZSBzZXRfZWxlbSB0aGF0IHdlCisJCSAqIGp1c3QgdXNlZCBmb3IgdGhpcyBhcnJheSBoYXBw ZW5zIHRvIGhhdmUgYmVlbiB0aGUgZmluYWwgZWxlbWVudAorCQkgKiAoZm9yIGN1cnJlbnQgc2Nh biBkaXJlY3Rpb24pLiAgV2UgY2FuJ3QganVzdCBpbmNyZW1lbnQgKGRlY3JlbWVudCkKKwkJICog c2V0X2VsZW0gaXRzZWxmIGFuZCBleHBlY3QgY29ycmVjdCBiZWhhdmlvciAtLSBhdCBsZWFzdCBu b3Qgd2hlbgorCQkgKiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUgYXJyYXkgdG8gY29uc2lkZXIuCisJ CSAqCisJCSAqIE91ciBhcHByb2FjaCBpcyB0byBzZXQgZWFjaCBzdWJzZXF1ZW50L2xvd2VyLW9y ZGVyIGFycmF5IHRvIGl0cworCQkgKiBmaW5hbCBlbGVtZW50LiAgV2UnbGwgdGhlbiBhZHZhbmNl IGFsbCBhcnJheSBrZXlzIGluY3JlbWVudGFsbHksCisJCSAqIGp1c3Qgb3V0c2lkZSB0aGUgbG9v cC4gIFRoYXQgd2F5IGFsbCBlYXJsaWVyL2hpZ2hlciBvcmRlciBhcnJheXMKKwkJICogKGFycmF5 cyBfYmVmb3JlXyB0aGlzIG9uZSkgd2lsbCBhZHZhbmNlIGFzIG5lZWRlZCBieSByb2xsaW5nIG92 ZXIuCisJCSAqCisJCSAqIFRoZSBhcnJheSBrZXlzIGFkdmFuY2UgYSBsaXR0bGUgbGlrZSB0aGUg d2F5IHRoYXQgYSBtaWxlYWdlIGdhdWdlCisJCSAqIGFkdmFuY2VzLiAgSW1hZ2luZSBhIG1lY2hh bmljYWwgZGlzcGxheSB0aGF0IHJvbGxzIG92ZXIgZnJvbSA5OTkgdG8KKwkJICogMDAwIGV2ZXJ5 IHRpbWUgd2UgZHJpdmUgb3VyIGNhciBhbm90aGVyIDEsMDAwIG1pbGVzLiAgRWFjaCBkZWNpbWFs CisJCSAqIGRpZ2l0IGJlaGF2ZXMgYSBsaXR0bGUgbGlrZSBhbiBhcnJheSBmcm9tIHRoZSBhcnJh eSBzdGF0ZSBtYWNoaW5lCisJCSAqIGltcGxlbWVudGVkIGJ5IHRoaXMgZnVuY3Rpb24uICAoX2J0 X2FkdmFuY2VfYXJyYXlfa2V5c19pbmNyZW1lbnQKKwkJICogd29uJ3QgYWN0dWFsbHkgYWxsb3cg dGhlIG1vc3Qgc2lnbmlmaWNhbnQgYXJyYXkgdG8gcm9sbCBvdmVyLCBidXQKKwkJICogdGhhdCdz IGp1c3QgZGVmZW5zaXZlLikKKwkJICoKKwkJICogU3VwcG9zZSB3ZSBoYXZlIDMgYXJyYXkga2V5 cyBhLCBiLCBhbmQgYy4gIEVhY2ggImRpZ2l0Ii9hcnJheSBoYXMKKwkJICogMTAgZGlzdGluY3Qg ZWxlbWVudHMgdGhhdCBoYXBwZW4gdG8gbWF0Y2ggYWNyb3NzIGVhY2ggYXJyYXk6IHZhbHVlcwor CQkgKiAwIHRocm91Z2ggdG8gOS4gIENhbGxlcidzIHR1cGxlICIoYSwgYiwgYykgPSAoMywgNy45 LCAyKSIgbWlnaHQKKwkJICogaW5pdGlhbGx5IGhhdmUgaXRzICJiIiBhcnJheSBhZHZhbmNlZCB1 cCB0byB0aGUgdmFsdWUgNyAoYmVjYXVzZSA3CisJCSAqIHdhcyBtYXRjaGVkIGJ5IGl0cyBiaW5h cnkgc2VhcmNoKSwgYW5kIGl0cyAiYyIgYXJyYXkgYWR2YW5jZWQgdG8gOS4KKwkJICogVGhlIGZp bmFsIGluY3JlbWVudGFsIGFkdmFuY2VtZW50IHN0ZXAgKG91dHNpZGUgdGhlIGxvb3ApIHdpbGwg dGhlbgorCQkgKiBmaW5pc2ggdGhpbmdzIG9mZiBieSAiYWR2YW5jaW5nIiB0aGUgYXJyYXkgb24g ImMiIHRvIDAsIHdoaWNoIHRoZW4KKwkJICogY2FycmllcyBvdmVyIHRvICJiIiAoc2luY2UgImMi IHJvbGxlZCBvdmVyIHdoZW4gaXQgYWR2YW5jZWQpLiAgT25jZQorCQkgKiB3ZSdyZSBkb25lIHdl J2xsIGhhdmUgInJvdW5kZWQgdXAgZnJvbSA3LjkgdG8gOCIgZm9yIHRoZSAiYiIgYXJyYXksCisJ CSAqIHdpdGhvdXQgbmVlZGluZyB0byBkaXJlY3RseSBhbHRlciBpdHMgc2V0X2VsZW0uCisJCSAq CisJCSAqIFRoZSAiYSIgYXJyYXkgd29uJ3QgaGF2ZSBhZHZhbmNlZCBvbiB0aGlzIG9jY2FzaW9u LCBzaW5jZSB0aGUgImIiCisJCSAqIGFycmF5IGRpZG4ndCByb2xsIG92ZXIgaW4gdHVybi4gIEJ1 dCBpdCB3b3VsZCBnaXZlbiBhIHR1cGxlIGxpa2UKKwkJICogIihhLCBiLCBjKSA9ICgzLCA5Ljks IDQpIi4gIEEgdHVwbGUgbGlrZSAiKGEsIGIsIGMpID0gKDksIDkuOSwgOCkiCisJCSAqIHdpbGwg ZXZlbnR1YWxseSB0cnkgKHRob3VnaCBmYWlsKSB0byByb2xsIG92ZXIgdGhlIGFycmF5IG9uICJh Ii4KKwkJICogRmFpbGluZyB0byByb2xsIG92ZXIgZXZlcnl0aGluZyBsaWtlIHRoaXMgZXhoYXVz dHMgYWxsIHRoZSBhcnJheXMuCisJCSAqCisJCSAqIFVuZGVyIHRoaXMgc2NoZW1lIHJlcXVpcmVk IGFycmF5IGtleXMgb25seSBldmVyIHJhdGNoZXQgZm9yd2FyZHMKKwkJICogKG9yIGJhY2t3YXJk cyksIGFuZCBhbHdheXMgZG8gc28gdG8gdGhlIG1heGltdW0gcG9zc2libGUgZXh0ZW50CisJCSAq IHRoYXQgd2UgY2FuIGtub3cgd2lsbCBiZSBzYWZlIHdpdGhvdXQgc2VlaW5nIHRoZSBzY2FuJ3Mg bmV4dCB0dXBsZS4KKwkJICovCisJCWlmIChyZXF1aXJlZFNhbWVEaXIgJiYKKwkJCSgoU2NhbkRp cmVjdGlvbklzRm9yd2FyZChkaXIpICYmIHJlc3VsdCA+IDApIHx8CisJCQkgKFNjYW5EaXJlY3Rp b25Jc0JhY2t3YXJkKGRpcikgJiYgcmVzdWx0IDwgMCkpKQorCQkJYmV5b25kX2VuZF9hZHZhbmNl ID0gdHJ1ZTsKKworCQkvKgorCQkgKiBBbHNvIHRyYWNrIHdoZXRoZXIgYWxsIHJlbGV2YW50IGF0 dHJpYnV0ZXMgZnJvbSBjYWxsZXIncyB0dXBsZSB3aWxsCisJCSAqIGJlIGVxdWFsIHRvIHRoZSBz Y2FuJ3MgYXJyYXkga2V5cyBvbmNlIHdlJ3JlIGRvbmUgd2l0aCBpdAorCQkgKi8KKwkJaWYgKHJl c3VsdCAhPSAwKQorCQl7CisJCQlhbGxfZXF0eXBlX3NrX2VxdWFsID0gZmFsc2U7CisJCQlpZiAo cmVxdWlyZWRTYW1lRGlyKQorCQkJCWFsbF9yZXF1aXJlZF9lcXR5cGVfc2tfZXF1YWwgPSBmYWxz ZTsKKwkJfQorCisJCS8qCisJCSAqIE9wdGltaXphdGlvbjogSWYgdGhpcyBjYWxsIHdhcyB0cmln Z2VyZWQgYnkgYSBub24tcmVxdWlyZWQgYXJyYXksCisJCSAqIGFuZCB3ZSBrbm93IHRoYXQgdHVw bGUgd29uJ3Qgc2F0aXNmeSB0aGUgcXVhbCwgd2UgZ2l2ZSB1cCByaWdodAorCQkgKiBhd2F5LiAg VGhpcyBvZnRlbiBhdm9pZHMgYWR2YW5jaW5nIHRoZSBhcnJheSBrZXlzLCB3aGljaCB3aWxsIHNh dmUKKwkJICogd2FzdGVkIGN5Y2xlcyBmcm9tIGNhbGxpbmcgX2J0X3VwZGF0ZV9rZXlzX3dpdGhf YXJyYXlrZXlzIGJlbG93CisJCSAqIChwbHVzIGl0IGF2b2lkcyBuZWVkbGVzc2x5IHVuc2V0dGlu ZyBwc3RhdGUuZmluYWx0dXBjaGVja2VkKS4KKwkJICovCisJCWlmICghYWxsX2VxdHlwZV9za19l cXVhbCAmJiAhcmVxdWlyZWRTYW1lRGlyICYmIHNrdHJpZyA9PSBpa2V5KQorCQl7CisJCQlBc3Nl cnQoIWFycmF5c19hZHZhbmNlZCk7CisJCQlBc3NlcnQoIWZvdW5kUmVxdWlyZWRPcHBvc2l0ZURp ck9ubHkpOworCisJCQlicmVhazsKKwkJfQorCisJCS8qIEFkdmFuY2UgYXJyYXkga2V5cywgZXZl biBpZiBzZXRfZWxlbSBpc24ndCBhbiBleGFjdCBtYXRjaCAqLworCQlpZiAoYXJyYXkgJiYgYXJy YXktPmN1cl9lbGVtICE9IHNldF9lbGVtKQorCQl7CisJCQlhcnJheS0+Y3VyX2VsZW0gPSBzZXRf ZWxlbTsKKwkJCXNrZXlhcnJheS0+c2tfYXJndW1lbnQgPSBhcnJheS0+ZWxlbV92YWx1ZXNbc2V0 X2VsZW1dOworCQkJYXJyYXlzX2FkdmFuY2VkID0gdHJ1ZTsKKwkJfQorCX0KKworCS8qCisJICog Q29uc2lkZXIgaWYgd2UgbmVlZCB0byBhZHZhbmNlIHRoZSBhcnJheSBrZXlzIGluY3JlbWVudGFs bHkgdG8gZmluaXNoCisJICogb2ZmICJiZXlvbmQgZW5kIG9mIGFycmF5IGVsZW1lbnQiIGFycmF5 IGFkdmFuY2VtZW50LiAgVGhpcyBpcyB0aGUgb25seQorCSAqIHdheSB0aGF0IHRoZSBhcnJheSBr ZXlzIGNhbiBiZSBleGhhdXN0ZWQuCisJICovCisJYXJyYXlzX2V4aGF1c3RlZCA9IGZhbHNlOwor CWlmIChiZXlvbmRfZW5kX2FkdmFuY2UpCisJeworCQkvKiBOb24tcmVxdWlyZWQgc2NhbiBrZXlz IG5ldmVyIGV4aGF1c3QgYXJyYXlzL2VuZCB0b3AtbGV2ZWwgc2NhbiAqLworCQlBc3NlcnQoc2t0 cmlnIDwgZmlyc3Rfbm9ucmVxdWlyZWRfaWtleSB8fAorCQkJICAgZmlyc3Rfbm9ucmVxdWlyZWRf aWtleSA9PSAtMSk7CisKKwkJaWYgKCFfYnRfYWR2YW5jZV9hcnJheV9rZXlzX2luY3JlbWVudChz Y2FuLCBkaXIpKQorCQkJYXJyYXlzX2V4aGF1c3RlZCA9IHRydWU7CisJCWVsc2UKKwkJCWFycmF5 c19hZHZhbmNlZCA9IHRydWU7CisKKwkJLyoKKwkJICogVGhlIG5ld2x5IGFkdmFuY2VkIGFycmF5 IGtleXMgd29uJ3QgYmUgZXF1YWwgYW55bW9yZSwgc28gcmVtZW1iZXIKKwkJICogdGhhdCBpbiBv cmRlciB0byBhdm9pZCBhIHNlY29uZCBfYnRfY2hlY2tfY29tcGFyZSBjYWxsIGZvciB0dXBsZQor CQkgKi8KKwkJYWxsX2VxdHlwZV9za19lcXVhbCA9IGFsbF9yZXF1aXJlZF9lcXR5cGVfc2tfZXF1 YWwgPSBmYWxzZTsKKwl9CisKKwlpZiAoYXJyYXlzX2FkdmFuY2VkKQorCXsKKwkJLyoKKwkJICog V2UgYWR2YW5jZWQgdGhlIGFycmF5IGtleXMuICBGaW5hbGl6ZSBldmVyeXRoaW5nIGJ5IHBlcmZv cm1pbmcgYW4KKwkJICogaW4tcGxhY2UgdXBkYXRlIG9mIHRoZSBzY2FuJ3Mgc2VhcmNoLXR5cGUg c2NhbiBrZXlzLgorCQkgKgorCQkgKiBJZiB3ZSBtaXNzZWQgdGhpcyBmaW5hbCBzdGVwIHRoZW4g YW55IGNhbGwgdG8gX2J0X2NoZWNrX2NvbXBhcmUKKwkJICogd291bGQgdXNlIHN0YWxlIGFycmF5 IGtleXMgdW50aWwgc3VjaCB0aW1lIGFzIF9idF9wcmVwcm9jZXNzX2tleXMKKwkJICogd2FzIG9u Y2UgYWdhaW4gY2FsbGVkIGJ5IF9idF9maXJzdC4KKwkJICovCisJCV9idF91cGRhdGVfa2V5c193 aXRoX2FycmF5a2V5cyhzY2FuKTsKKworCQkvKgorCQkgKiBJZiBhbnkgcmVxdWlyZWQgYXJyYXkg a2V5cyB3ZXJlIGFkdmFuY2VkLCBiZSBwcmVwYXJlZCB0byByZWNoZWNrCisJCSAqIHRoZSBmaW5h bCB0dXBsZSBhZ2FpbnN0IHRoZSBuZXcgYXJyYXkga2V5cyAoYXMgYW4gb3B0aW1pemF0aW9uKQor CQkgKi8KKwkJcHN0YXRlLT5maW5hbHR1cGNoZWNrZWQgPSBmYWxzZTsKKwl9CisKKwkvKgorCSAq IFN0YXRlIG1hY2hpbmUgcG9zdGNvbmRpdGlvbiBhc3NlcnRpb25zLgorCSAqCisJICogVHVwbGUg bXVzdCBub3cgYmUgPD0gY3VycmVudC9uZXdseSBhZHZhbmNlZCByZXF1aXJlZCBhcnJheSBrZXlz LiAgU2FtZQorCSAqIGdvZXMgZm9yIG90aGVyIHJlcXVpcmVkIGVxdWFsaXR5IHR5cGUgc2NhbiBr ZXlzLCB3aGljaCBhcmUgImRlZ2VuZXJhdGUKKwkgKiBzaW5nbGUgdmFsdWUgYXJyYXlzIiBmb3Ig b3VyIHB1cnBvc2VzLiAgKEFzIHVzdWFsIHRoZSBydWxlIGlzIHRoZSBzYW1lCisJICogZm9yIGJh Y2t3YXJkcyBzY2FucyBvbmNlIHRoZSBvcGVyYXRvcnMgYXJlIGZsaXBwZWQgYXJvdW5kLikKKwkg KgorCSAqIFdlJ3JlIHN0cmljdGVyIHRoYW4gdGhhdCBpbiBjYXNlcyB3aGVyZSB0aGUgdHVwbGUg d2FzIGFscmVhZHkgZXF1YWwgdG8KKwkgKiB0aGUgcHJldmlvdXMgYXJyYXkga2V5cyB3aGVuIHdl IHdlcmUgY2FsbGVkOiB0dXBsZSBtdXN0IG5vdyBiZSA8IHRoZQorCSAqIG5ldyBhcnJheSBrZXlz IChvciA+IHRoZSBhcnJheSBrZXlzKS4gIFRoaXMgaXMgYSBjb25zZXF1ZW5jZSBvZiBhbm90aGVy CisJICogcnVsZTogd2UgbXVzdCBhbHdheXMgYWR2YW5jZSB0aGUgYXJyYXkga2V5cyBieSBhdCBs ZWFzdCBvbmUgaW5jcmVtZW50CisJICogKHVubGVzcyBfYnRfYWR2YW5jZV9hcnJheV9rZXlzX2lu Y3JlbWVudCBmb3VuZCB0aGF0IHdlJ2QgZXhoYXVzdGVkIGFsbAorCSAqIGFycmF5cywgZW5kaW5n IHRoZSB0b3AtbGV2ZWwgaW5kZXggc2NhbikuCisJICoKKwkgKiBPdXIgY2FsbGVyIGRlY2lkZXMg d2hlbiB0byBzdGFydCBwcmltaXRpdmUgaW5kZXggc2NhbnMgYmFzZWQgaW4gcGFydCBvbgorCSAq IHRoZSBjdXJyZW50IGFycmF5IGtleXMuICBJdCBhbHdheXMgbmVlZHMgdG8gc2VlIGEgcHJlY2lz ZSBhcnJheS13aXNlCisJICogcGljdHVyZSBvZiB0aGUgc2NhbidzIHByb2dyZXNzLiAgSWYgd2Ug d2VyZSB0byBhZHZhbmNlIHRoZSBhcnJheSBrZXlzCisJICogYnkgbGVzcyB0aGFuIHRoZSBleGFj dCBtYXhpbXVtIHNhZmUgYW1vdW50LCBvdXIgY2FsbGVyIG1pZ2h0IHRoZW4gbWFrZQorCSAqIGEg c3VidGx5IHdyb25nIGRlY2lzaW9uIGFib3V0IHdoZW4gdG8gZW5kIHRoZSBvbmdvaW5nIHByaW1p dGl2ZSBzY2FuLgorCSAqIChUaGVzZSBhc3NlcnRpb25zIHdvbid0IHJlbGlhYmx5IGRldGVjdCBl dmVyeSBjYXNlIHdoZXJlIHRoZSBhcnJheSBrZXlzCisJICogaGF2ZW4ndCBhZHZhbmNlZCBieSB0 aGUgZXhwZWN0ZWQvbWF4aW11bSBhbW91bnQsIGJ1dCB0aGV5IGNvbWUgY2xvc2UuKQorCSAqLwor CUFzc2VydChfYnRfdmVyaWZ5X2tleXNfd2l0aF9hcnJheWtleXMoc2NhbikpOworCUFzc2VydChh cnJheXNfZXhoYXVzdGVkIHx8CisJCSAgIChfYnRfdHVwbGVfYmVmb3JlX2FycmF5X3NrZXlzKHNj YW4sIHBzdGF0ZSwgdHVwbGUsIDApID09CisJCQkhYWxsX3JlcXVpcmVkX2VxdHlwZV9za19lcXVh bCkpOworCisJLyoKKwkgKiBJZiB0aGUgYXJyYXkga2V5cyBhcmUgbm93IGV4aGF1c3RlZCwgZW5k IHRoZSB0b3AtbGV2ZWwgaW5kZXggc2NhbgorCSAqLworCUFzc2VydCghc28tPm5lZWRQcmltU2Nh bik7CisJaWYgKGFycmF5c19leGhhdXN0ZWQpCisJeworCQkvKiBDYWxsZXIncyB0dXBsZSBjYW4n dCBtYXRjaCBuZXcgcXVhbCAqLworCQlwc3RhdGUtPmNvbnRpbnVlc2NhbiA9IGZhbHNlOworCQly ZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBUaGUgYXJyYXkga2V5cyBhcmVuJ3QgZXhoYXVz dGVkLCBzbyBwcm92aXNpb25hbGx5IGFzc3VtZSB0aGF0IHRoZQorCSAqIGN1cnJlbnQgcHJpbWl0 aXZlIGluZGV4IHNjYW4gd2lsbCBjb250aW51ZQorCSAqLworCXBzdGF0ZS0+Y29udGludWVzY2Fu ID0gdHJ1ZTsKKworCS8qCisJICogRG9lcyBjYWxsZXIncyB0dXBsZSBub3cgbWF0Y2ggdGhlIG5l dyBxdWFsPyAgQ2FsbCBfYnRfY2hlY2tfY29tcGFyZSBhCisJICogc2Vjb25kIHRpbWUgdG8gZmlu ZCBvdXQgKHVubGVzcyBpdCdzIGFscmVhZHkgY2xlYXIgdGhhdCBpdCBjYW4ndCkuCisJICovCisJ aWYgKGFsbF9lcXR5cGVfc2tfZXF1YWwpCisJeworCQlib29sCQljb250aW51ZXNjYW47CisJCWlu dAkJCWluc2t0cmlnOworCisJCUFzc2VydChhcnJheXNfYWR2YW5jZWQpOworCisJCWlmIChsaWtl bHkoX2J0X2NoZWNrX2NvbXBhcmUoZGlyLCBzbywgdHVwbGUsIG50dXBhdHRzLCBpdHVwZGVzYywK KwkJCQkJCQkJCSAmY29udGludWVzY2FuLCAmaW5za3RyaWcsIGZhbHNlKSkpCisJCQlyZXR1cm4g dHJ1ZTsKKworCQkvKgorCQkgKiBIYW5kbGUgaW5lcXVhbGl0aWVzIG1hcmtlZCByZXF1aXJlZCBp biB0aGUgY3VycmVudCBzY2FuIGRpcmVjdGlvbi4KKwkJICoKKwkJICogSXQncyBqdXN0IGFib3V0 IHBvc3NpYmxlIHRoYXQgb3VyIF9idF9jaGVja19jb21wYXJlIGNhbGwgaW5kaWNhdGVzCisJCSAq IHRoYXQgdGhlIHNjYW4gc2hvdWxkIGJlIHRlcm1pbmF0ZWQgZHVlIHRvIGFuIHVuc2F0aXNmaWVk IGluZXF1YWxpdHkKKwkJICogdGhhdCB3YXNuJ3QgaW5pdGlhbGx5IHJlY29nbml6ZWQgYXMgc3Vj aCBieSB1cy4gIEhhbmRsZSB0aGlzIGJ5CisJCSAqIGNhbGxpbmcgb3Vyc2VsdmVzIHJlY3Vyc2l2 ZWx5IHdoaWxlIGluZGljYXRpbmcgdGhhdCB0aGUgdHJpZ2dlciBpcworCQkgKiBub3cgdGhlIGlu ZXF1YWxpdHkgdGhhdCB3ZSBtaXNzZWQgZmlyc3QgdGltZSBhcm91bmQuCisJCSAqCisJCSAqIE5v dGU6IHdlIG9ubHkgbmVlZCB0byBkbyB0aGlzIGluIGNhc2VzIHdoZXJlIHRoZSBpbml0aWFsIGNh bGwgdG8KKwkJICogX2J0X2NoZWNrX2NvbXBhcmUgKHRoYXQgbGVkIHRvIGNhbGxpbmcgaGVyZSkg Z2F2ZSB1cCB1cG9uIGZpbmRpbmcKKwkJICogYW4gdW5zYXRpc2ZpZWQgcmVxdWlyZWQgZXF1YWxp dHkvYXJyYXkgc2NhbiBrZXkgYmVmb3JlIGl0IGNvdWxkCisJCSAqIHJlYWNoIHRoZSBpbmVxdWFs aXR5LiAgVGhlIHNlY29uZCBfYnRfY2hlY2tfY29tcGFyZSBjYWxsIHRvb2sgcGxhY2UKKwkJICog YWZ0ZXIgdGhlIGFycmF5IGtleXMgd2VyZSBhZHZhbmNlZCAodG8gYXJyYXkga2V5cyB0aGF0IGRl ZmluaXRlbHkKKwkJICogbWF0Y2ggdGhlIHR1cGxlKSwgc28gaXQgY2FuJ3QgaGF2ZSBiZWVuIG92 ZXJsb29rZWQgYSBzZWNvbmQgdGltZS4KKwkJICoKKwkJICogTm90ZTogdGhpcyBpcyB1c2VmdWwg YmVjYXVzZSB3ZSB3b24ndCBoYXZlIHRvIHdhaXQgdW50aWwgdGhlIG5leHQKKwkJICogdHVwbGUg dG8gYWR2YW5jZSB0aGUgYXJyYXkga2V5cyBhIHNlY29uZCB0aW1lICh0byB2YWx1ZXMgdGhhdCds bAorCQkgKiBwdXQgdGhlIHNjYW4gYWhlYWQgb2YgdGhpcyB0dXBsZSkuICBIYW5kbGluZyB0aGlz IG91cnNlbHZlcyBpc24ndAorCQkgKiB0cnVseSByZXF1aXJlZC4gIEJ1dCBpdCBhdm9pZHMgY29t cGxpY2F0aW5nIG91ciBjb250cmFjdC4gIFRoZSBvbmx5CisJCSAqIGFsdGVybmF0aXZlIGlzIHRv IGFsbG93IGFuIGF3a3dhcmQgZXhjZXB0aW9uIHRvIHRoZSBnZW5lcmFsIHJ1bGUKKwkJICogKHRo ZSBydWxlIGFib3V0IGFsd2F5cyBhZHZhbmNpbmcgdGhlIGFycmF5cyB0byB0aGUgbWF4aW11bSBw b3NzaWJsZQorCQkgKiBleHRlbnQgdGhhdCBjYWxsZXIncyB0dXBsZSBjYW4gc2FmZWx5IGFsbG93 KS4KKwkJICovCisJCWlmICghY29udGludWVzY2FuKQorCQl7CisJCQlBc3NlcnQoaW5za3RyaWcg PiBza3RyaWcpOworCQkJQXNzZXJ0KGluc2t0cmlnIDwgZmlyc3Rfbm9ucmVxdWlyZWRfaWtleSB8 fAorCQkJCSAgIGZpcnN0X25vbnJlcXVpcmVkX2lrZXkgPT0gLTEpOworCQkJcmV0dXJuIF9idF9h ZHZhbmNlX2FycmF5X2tleXMoc2NhbiwgcHN0YXRlLCB0dXBsZSwgaW5za3RyaWcpOworCQl9CisJ fQorCisJLyoKKwkgKiBIYW5kbGUgaW5lcXVhbGl0aWVzIG1hcmtlZCByZXF1aXJlZCBpbiB0aGUg b3Bwb3NpdGUgc2NhbiBkaXJlY3Rpb24uCisJICoKKwkgKiBJZiB3ZSBhZHZhbmNlZCB0aGUgYXJy YXkga2V5cyAod2hpY2ggaXMgbm93IGNlcnRhaW4gZXhjZXB0IGluIHRoZSBjYXNlCisJICogd2hl cmUgd2Ugb25seSBuZWVkZWQgdG8gZGVhbCB3aXRoIG5vbi1yZXF1aXJlZCBhcnJheXMpLCBpdCdz IHBvc3NpYmxlCisJICogdGhhdCB0aGUgc2NhbiBpcyBub3cgYXQgdGhlIHN0YXJ0IG9mICJtYXRj aGluZyIgdHVwbGVzIChhdCBsZWFzdCBieSB0aGUKKwkgKiBkZWZpbml0aW9uIHVzZWQgYnkgX2J0 X3R1cGxlX2JlZm9yZV9hcnJheV9za2V5cyksIGJ1dCBpcyBuZXZlcnRoZWxlc3MKKwkgKiBzdGls bCBtYW55IGxlYWYgcGFnZXMgYmVmb3JlIHRoZSBwb3NpdGlvbiB0aGF0IF9idF9maXJzdCBpcyBj YXBhYmxlIG9mCisJICogcmVwb3NpdGlvbmluZyB0aGUgc2NhbiB0by4KKwkgKgorCSAqIFRoaXMg Y2FuIGhhcHBlbiB3aGVuIHdlIGhhdmUgYW4gaW5lcXVhbGl0eSBzY2FuIGtleSByZXF1aXJlZCBp biB0aGUKKwkgKiBvcHBvc2l0ZSBkaXJlY3Rpb24gb25seSwgdGhhdCdzIGxlc3Mgc2lnbmlmaWNh bnQgdGhhbiB0aGUgc2NhbiBrZXkgdGhhdAorCSAqIHRyaWdnZXJlZCBhcnJheSBhZHZhbmNlbWVu dCBkdXJpbmcgb3VyIGluaXRpYWwgX2J0X2NoZWNrX2NvbXBhcmUgY2FsbC4KKwkgKiBJZiBldmVu IGZpbmFsdHVwIGRvZXNuJ3Qgc2F0aXNmeSB0aGlzIGxlc3Mgc2lnbmlmaWNhbnQgaW5lcXVhbGl0 eSBzY2FuCisJICoga2V5IG9uY2Ugd2UgdGVtcG9yYXJpbHkgZmxpcCB0aGUgc2NhbiBkaXJlY3Rp b24sIHRoYXQgaW5kaWNhdGVzIHRoYXQKKwkgKiBldmVuIGZpbmFsdHVwIGlzIGJlZm9yZSB0aGUg X2J0X2ZpcnN0LXdpc2UgaW5pdGlhbCBwb3NpdGlvbiBmb3IgdGhlc2UKKwkgKiBuZXdseSBhZHZh bmNlZCBhcnJheSBrZXlzLgorCSAqLworCWlmIChmb3VuZFJlcXVpcmVkT3Bwb3NpdGVEaXJPbmx5 ICYmIHBzdGF0ZS0+ZmluYWx0dXAgJiYKKwkJIV9idF90dXBsZV9iZWZvcmVfYXJyYXlfc2tleXMo c2NhbiwgcHN0YXRlLCBwc3RhdGUtPmZpbmFsdHVwLCAwKSkKKwl7CisJCWludAkJCW5maW5hbHR1 cGF0dHMgPSBCVHJlZVR1cGxlR2V0TkF0dHMocHN0YXRlLT5maW5hbHR1cCwgcmVsKTsKKwkJU2Nh bkRpcmVjdGlvbiBmbGlwcGVkID0gLWRpcjsKKwkJYm9vbAkJY29udGludWVzY2FuOworCQlpbnQJ CQlvcHNrdHJpZzsKKworCQlBc3NlcnQoYXJyYXlzX2FkdmFuY2VkKTsKKworCQlfYnRfY2hlY2tf Y29tcGFyZShmbGlwcGVkLCBzbywgcHN0YXRlLT5maW5hbHR1cCwgbmZpbmFsdHVwYXR0cywKKwkJ CQkJCSAgaXR1cGRlc2MsICZjb250aW51ZXNjYW4sICZvcHNrdHJpZywgZmFsc2UpOworCisJCWlm ICghY29udGludWVzY2FuICYmIG9wc2t0cmlnID4gc2t0cmlnKQorCQl7CisJCQkvKgorCQkJICog Q29udGludWluZyB0aGUgb25nb2luZyBwcmltaXRpdmUgaW5kZXggc2NhbiBhcy1pcyByaXNrcwor CQkJICogdXNlbGVzc2x5IHNjYW5uaW5nIGEgaHVnZSBudW1iZXIgb2YgbGVhZiBwYWdlcyBmcm9t IGJlZm9yZSB0aGUKKwkJCSAqIHBhZ2UgdGhhdCB3ZSdsbCBxdWlja2x5IGp1bXAgdG8gYnkgZGVz Y2VuZGluZyB0aGUgaW5kZXggYW5ldy4KKwkJCSAqCisJCQkgKiBQbGF5IGl0IHNhZmU6IHN0YXJ0 IGEgbmV3IHByaW1pdGl2ZSBpbmRleCBzY2FuLiAgX2J0X2ZpcnN0IGlzCisJCQkgKiBndWFyYW50 ZWVkIHRvIGF0IGxlYXN0IG1vdmUgdGhlIHNjYW4gdG8gdGhlIG5leHQgbGVhZiBwYWdlLgorCQkJ ICovCisJCQlBc3NlcnQob3Bza3RyaWcgPCBmaXJzdF9ub25yZXF1aXJlZF9pa2V5IHx8CisJCQkJ ICAgZmlyc3Rfbm9ucmVxdWlyZWRfaWtleSA9PSAtMSk7CisJCQlwc3RhdGUtPmNvbnRpbnVlc2Nh biA9IGZhbHNlOworCQkJc28tPm5lZWRQcmltU2NhbiA9IHRydWU7CisKKwkJCXJldHVybiBmYWxz ZTsKKwkJfQorCisJCS8qCisJCSAqIENhbGxlcidzIHR1cGxlIG1pZ2h0IHN0aWxsIGJlIGJlZm9y ZSB0aGUgX2J0X2ZpcnN0LXdpc2Ugc3RhcnQgb2YKKwkJICogbWF0Y2hlcyBmb3IgdGhlIG5ldyBh cnJheSBrZXlzLCBidXQgYXQgbGVhc3QgZmluYWx0dXAgaXMgYXQgb3IKKwkJICogYWhlYWQgb2Yg dGhhdCBwb3NpdGlvbi4gIFRoYXQncyBnb29kIGVub3VnaDsgY29udGludWUgYXMtaXMuCisJCSAq LworCX0KKworCS8qCisJICogQ2FsbGVyJ3MgdHVwbGUgaXMgPCB0aGUgbmV3bHkgYWR2YW5jZWQg YXJyYXkga2V5cyAob3IgPiB3aGVuIHRoaXMgaXMgYQorCSAqIGJhY2t3YXJkcyBzY2FuKS4KKwkg KgorCSAqIEl0J3MgcG9zc2libGUgdGhhdCBsYXRlciB0dXBsZXMgd2lsbCBhbHNvIHR1cm4gb3V0 IHRvIGhhdmUgdmFsdWVzIHRoYXQKKwkgKiBhcmUgc3RpbGwgPCB0aGUgbm93LWN1cnJlbnQgYXJy YXkga2V5cyAob3IgPiB0aGUgY3VycmVudCBhcnJheSBrZXlzKS4KKwkgKiBPdXIgY2FsbGVyIHdp bGwgaGFuZGxlIHRoaXMgYnkgcGVyZm9ybWluZyB3aGF0IGFtb3VudHMgdG8gYSBsaW5lYXIKKwkg KiBzZWFyY2ggb2YgdGhlIHBhZ2UsIGltcGxlbWVudGVkIGJ5IGNhbGxpbmcgX2J0X2NoZWNrX2Nv bXBhcmUgYW5kIHRoZW4KKwkgKiBfYnRfdHVwbGVfYmVmb3JlX2FycmF5X3NrZXlzIGZvciBlYWNo IHR1cGxlLiAgT3VyIGNhbGxlciBzaG91bGQgbG9jYXRlCisJICogdGhlIGZpcnN0IHR1cGxlID49 IHRoZSBhcnJheSBrZXlzIGJlZm9yZSBsb25nIChvciBsb2NhdGUgdGhlIGZpcnN0CisJICogdHVw bGUgPD0gdGhlIGFycmF5IGtleXMgYmVmb3JlIGxvbmcpLgorCSAqCisJICogVGhpcyBhcHByb2Fj aCBoYXMgdmFyaW91cyBhZHZhbnRhZ2VzIG92ZXIgYSBiaW5hcnkgc2VhcmNoIG9mIHRoZSBwYWdl LgorCSAqIFdlIGV4cGVjdCB0aGF0IG91ciBjYWxsZXIgd2lsbCBlaXRoZXIgcXVpY2tseSBkaXNj b3ZlciB0aGUgbmV4dCB0dXBsZQorCSAqIGNvdmVyZWQgYnkgdGhlIGN1cnJlbnQgYXJyYXkga2V5 cywgb3IgcXVpY2tseSBkaXNjb3ZlciB0aGF0IGl0IG5lZWRzCisJICogYW5vdGhlciBwcmltaXRp dmUgaW5kZXggc2NhbiAodXNpbmcgaXRzIGZpbmFsdHVwIHByZWNoZWNrKSBpbnN0ZWFkLgorCSAq IEVpdGhlciB3YXksIGEgYmluYXJ5IHNlYXJjaCBpcyB1bmxpa2VseSB0byBiZWF0IGEgc2ltcGxl IGxpbmVhciBzZWFyY2guCisJICoKKwkgKiBJdCdzIGFsc28gbm90IGNsZWFyIHRoYXQgYSBiaW5h cnkgc2VhcmNoIHdpbGwgYmUgYW55IGZhc3RlciB3aGVuIHdlCisJICogcmVhbGx5IGRvIGhhdmUg dG8gc2VhcmNoIHRocm91Z2ggaHVuZHJlZHMgb2YgdHVwbGVzIGJleW9uZCB0aGlzIG9uZS4KKwkg KiBTZXZlcmFsIGJpbmFyeSBzZWFyY2hlcyAob25lIHBlciBhcnJheSBhZHZhbmNlbWVudCkgbWln aHQgYmUgcmVxdWlyZWQKKwkgKiB3aGlsZSByZWFkaW5nIHRocm91Z2ggYSBzaW5nbGUgcGFnZS4g IE91ciBsaW5lYXIgc2VhcmNoIGlzIHN0cnVjdHVyZWQKKwkgKiBhcyBvbmUgY29udGludW91cyBz ZWFyY2ggdGhhdCBqdXN0IGFkdmFuY2VzIHRoZSBhcnJheXMgaW4gcGFzc2luZywgYW5kCisJICog dGhhdCBvbmx5IG5lZWRzIGEgbGl0dGxlIGV4dHJhIGxvZ2ljIHRvIGRlYWwgd2l0aCBpbmVxdWFs aXR5IHNjYW4ga2V5cy4KKwkgKi8KKwlyZXR1cm4gZmFsc2U7Cit9CiAKIC8qCiAgKglfYnRfcHJl cHJvY2Vzc19rZXlzKCkgLS0gUHJlcHJvY2VzcyBzY2FuIGtleXMKQEAgLTc0OSw2ICsxOTI1LDE5 IEBAIF9idF9yZXN0b3JlX2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKQogICogQWdhaW4s IG1pc3NpbmcgY3Jvc3MtdHlwZSBvcGVyYXRvcnMgbWlnaHQgY2F1c2UgdXMgdG8gZmFpbCB0byBw cm92ZSB0aGUKICAqIHF1YWxzIGNvbnRyYWRpY3Rvcnkgd2hlbiB0aGV5IHJlYWxseSBhcmUsIGJ1 dCB0aGUgc2NhbiB3aWxsIHdvcmsgY29ycmVjdGx5LgogICoKKyAqIEluZGV4IHNjYW5zIHdpdGgg YXJyYXkga2V5cyBuZWVkIHRvIGJlIGFibGUgdG8gYWR2YW5jZSBlYWNoIGFycmF5J3Mga2V5cwor ICogYW5kIG1ha2UgdGhlbSB0aGUgY3VycmVudCBzZWFyY2gtdHlwZSBzY2FuIGtleXMgd2l0aG91 dCBjYWxsaW5nIGhlcmUuICBUaGV5CisgKiBleHBlY3QgdG8gYmUgYWJsZSB0byBjYWxsIF9idF91 cGRhdGVfa2V5c193aXRoX2FycmF5a2V5cyBpbnN0ZWFkLiAgV2UgbmVlZAorICogdG8gYmUgY2Fy ZWZ1bCBhYm91dCB0aGF0IGNhc2Ugd2hlbiB3ZSBkZXRlcm1pbmUgcmVkdW5kYW5jeTsgZXF1YWxp dHkgcXVhbHMKKyAqIG11c3Qgbm90IGJlIGVsaW1pbmF0ZWQgYXMgcmVkdW5kYW50IG9uIHRoZSBi YXNpcyBvZiBhcnJheSBpbnB1dCBrZXlzIHRoYXQKKyAqIG1pZ2h0IGNoYW5nZSBiZWZvcmUgYW5v dGhlciBjYWxsIGhlcmUgY2FuIHRha2UgcGxhY2UuCisgKgorICogTm90ZSwgaG93ZXZlciwgdGhh dCB0aGUgcHJlc2VuY2Ugb2YgYW4gYXJyYXkgc2NhbiBrZXkgZG9lc24ndCBhZmZlY3QgaG93IHdl CisgKiBkZXRlcm1pbmUgaWYgaW5kZXggcXVhbHMgYXJlIGNvbnRyYWRpY3RvcnkuICBDb250cmFk aWN0b3J5IHF1YWwgc2NhbnMgbW92ZQorICogb24gdG8gdGhlIG5leHQgcHJpbWl0aXZlIGluZGV4 IHNjYW4gcmlnaHQgYXdheSwgYnkgaW5jcmVtZW50aW5nIHRoZSBzY2FuJ3MKKyAqIGFycmF5IGtl eXMgb25jZSBjb250cm9sIHJlYWNoZXMgX2J0X2FycmF5X2tleXNfcmVtYWluLiAgVGhlcmUgd29u J3QgYmUgYQorICogY2FsbCB0byBfYnRfdXBkYXRlX2tleXNfd2l0aF9hcnJheWtleXMsIHNvIHRo ZXJlJ3Mgbm90aGluZyBmb3IgdXMgdG8gYnJlYWsuCisgKgogICogUm93IGNvbXBhcmlzb24ga2V5 cyBhcmUgY3VycmVudGx5IGFsc28gdHJlYXRlZCB3aXRob3V0IGFueSBzbWFydHM6CiAgKiB3ZSBq dXN0IHRyYW5zZmVyIHRoZW0gaW50byB0aGUgcHJlcHJvY2Vzc2VkIGFycmF5IHdpdGhvdXQgYW55 CiAgKiBlZGl0b3JpYWxpemF0aW9uLiAgV2UgY2FuIHRyZWF0IHRoZW0gdGhlIHNhbWUgYXMgYW4g b3JkaW5hcnkgaW5lcXVhbGl0eQpAQCAtODk1LDggKzIwODQsMTEgQEAgX2J0X3ByZXByb2Nlc3Nf a2V5cyhJbmRleFNjYW5EZXNjIHNjYW4pCiAJCQkJCQkJc28tPnF1YWxfb2sgPSBmYWxzZTsKIAkJ CQkJCQlyZXR1cm47CiAJCQkJCQl9Ci0JCQkJCQkvKiBlbHNlIGRpc2NhcmQgdGhlIHJlZHVuZGFu dCBub24tZXF1YWxpdHkga2V5ICovCi0JCQkJCQl4Zm9ybVtqXSA9IE5VTEw7CisJCQkJCQllbHNl IGlmICghKGVxLT5za19mbGFncyAmIFNLX1NFQVJDSEFSUkFZKSkKKwkJCQkJCXsKKwkJCQkJCQkv KiBlbHNlIGRpc2NhcmQgdGhlIHJlZHVuZGFudCBub24tZXF1YWxpdHkga2V5ICovCisJCQkJCQkJ eGZvcm1bal0gPSBOVUxMOworCQkJCQkJfQogCQkJCQl9CiAJCQkJCS8qIGVsc2UsIGNhbm5vdCBk ZXRlcm1pbmUgcmVkdW5kYW5jeSwga2VlcCBib3RoIGtleXMgKi8KIAkJCQl9CkBAIC05ODYsNiAr MjE3OCwyMiBAQCBfYnRfcHJlcHJvY2Vzc19rZXlzKEluZGV4U2NhbkRlc2Mgc2NhbikKIAkJCWNv bnRpbnVlOwogCQl9CiAKKwkJLyoKKwkJICogSXMgdGhpcyBhbiBhcnJheSBzY2FuIGtleSB0aGF0 IF9idF9wcmVwcm9jZXNzX2FycmF5X2tleXMgbWVyZ2VkCisJCSAqIHdpdGggc29tZSBlYXJsaWVy IGFycmF5IGtleSBkdXJpbmcgaXRzIGluaXRpYWwgcHJlcHJvY2Vzc2luZyBwYXNzPworCQkgKi8K KwkJaWYgKGN1ci0+c2tfZmxhZ3MgJiBTS19CVF9SREROQVJSQVkpCisJCXsKKwkJCS8qCisJCQkg KiBrZXkgaXMgcmVkdW5kYW50IGZvciB0aGlzIHByaW1pdGl2ZSBpbmRleCBzY2FuIChhbmQgd2ls bCBiZQorCQkJICogcmVkdW5kYW50IGR1cmluZyBhbGwgc3Vic2VxdWVudCBwcmltaXRpdmUgaW5k ZXggc2NhbnMpCisJCQkgKi8KKwkJCUFzc2VydChjdXItPnNrX2ZsYWdzICYgU0tfU0VBUkNIQVJS QVkpOworCQkJQXNzZXJ0KGogPT0gKEJURXF1YWxTdHJhdGVneU51bWJlciAtIDEpKTsKKwkJCUFz c2VydChzby0+bnVtQXJyYXlLZXlzID4gMCk7CisJCQljb250aW51ZTsKKwkJfQorCiAJCS8qIGhh dmUgd2Ugc2VlbiBvbmUgb2YgdGhlc2UgYmVmb3JlPyAqLwogCQlpZiAoeGZvcm1bal0gPT0gTlVM TCkKIAkJewpAQCAtOTk5LDcgKzIyMDcsMjYgQEAgX2J0X3ByZXByb2Nlc3Nfa2V5cyhJbmRleFNj YW5EZXNjIHNjYW4pCiAJCQkJCQkJCQkJICZ0ZXN0X3Jlc3VsdCkpCiAJCQl7CiAJCQkJaWYgKHRl c3RfcmVzdWx0KQotCQkJCQl4Zm9ybVtqXSA9IGN1cjsKKwkJCQl7CisJCQkJCWlmIChqID09IChC VEVxdWFsU3RyYXRlZ3lOdW1iZXIgLSAxKSAmJgorCQkJCQkJKCh4Zm9ybVtqXS0+c2tfZmxhZ3Mg JiBTS19TRUFSQ0hBUlJBWSkgfHwKKwkJCQkJCSAoY3VyLT5za19mbGFncyAmIFNLX1NFQVJDSEFS UkFZKSkpCisJCQkJCXsKKwkJCQkJCS8qCisJCQkJCQkgKiBNdXN0IG5ldmVyIHJlcGxhY2UgYW4g PSBhcnJheSBvcGVyYXRvciBvdXJzZWx2ZXMsCisJCQkJCQkgKiBub3IgY2FuIHdlIGV2ZXIgZmFp bCB0byByZW1lbWJlciBhbiA9IGFycmF5CisJCQkJCQkgKiBvcGVyYXRvci4gIF9idF91cGRhdGVf a2V5c193aXRoX2FycmF5a2V5cyBleHBlY3RzCisJCQkJCQkgKiB0aGlzLgorCQkJCQkJICovCisJ CQkJCQlTY2FuS2V5CQlvdXRrZXkgPSAmb3V0a2V5c1tuZXdfbnVtYmVyT2ZLZXlzKytdOworCisJ CQkJCQltZW1jcHkob3V0a2V5LCBjdXIsIHNpemVvZihTY2FuS2V5RGF0YSkpOworCQkJCQkJaWYg KG51bWJlck9mRXF1YWxDb2xzID09IGF0dG5vIC0gMSkKKwkJCQkJCQlfYnRfbWFya19zY2Fua2V5 X3JlcXVpcmVkKG91dGtleSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJeGZvcm1bal0gPSBj dXI7CisJCQkJfQogCQkJCWVsc2UgaWYgKGogPT0gKEJURXF1YWxTdHJhdGVneU51bWJlciAtIDEp KQogCQkJCXsKIAkJCQkJLyoga2V5ID09IGEgJiYga2V5ID09IGIsIGJ1dCBhICE9IGIgKi8KQEAg LTEwMjcsNiArMjI1NCw5OCBAQCBfYnRfcHJlcHJvY2Vzc19rZXlzKEluZGV4U2NhbkRlc2Mgc2Nh bikKIAlzby0+bnVtYmVyT2ZLZXlzID0gbmV3X251bWJlck9mS2V5czsKIH0KIAorLyoKKyAqCV9i dF91cGRhdGVfa2V5c193aXRoX2FycmF5a2V5cygpIC0tIEZpbmFsaXplIGFkdmFuY2luZyBhcnJh eSBrZXlzCisgKgorICogVGhpcyBmdW5jdGlvbiBqdXN0IHRyYW5zZmVycyBuZXdseSBhZHZhbmNl ZCBhcnJheSBrZXlzIHRoYXQgd2VyZSBzZXQgaW4KKyAqICJzby0+YXJyYXlLZXlEYXRhW10iIG92 ZXIgdG8gY29ycmVzcG9uZGluZyAic28tPmtleURhdGFbXSIgc2NhbiBrZXlzLiAgVGhpcworICog YXZvaWRzIHRoZSBmdWxsIHNldCBvZiBwdXNoLXVwcyB0aGF0IHRha2UgcGxhY2UgaW4gX2J0X3By ZXByb2Nlc3Nfa2V5cyBhdAorICogdGhlIHN0YXJ0IG9mIGVhY2ggbmV3IHByaW1pdGl2ZSBpbmRl eCBzY2FuLiAgSW4gcGFydGljdWxhciwgaXQgYXZvaWRzIGRvaW5nCisgKiBhbnl0aGluZyB0aGF0 IHdvdWxkIGJlIGNvbnNpZGVyZWQgdW5zYWZlIHdoaWxlIGhvbGRpbmcgYSBidWZmZXIgbG9jay4K KyAqCisgKiBOb3RlIHRoYXQgX2J0X3ByZXByb2Nlc3Nfa2V5cyBpcyBhd2FyZSBvZiBvdXIgc3Bl Y2lhbCByZXF1aXJlbWVudHMgd2hlbgorICogY29uc2lkZXJpbmcgaWYgcXVhbHMgYXJlIHJlZHVu ZGFudC4gIEZvciBmdWxsIGRldGFpbHMgc2VlIGNvbW1lbnRzIGFib3ZlCisgKiBfYnRfcHJlcHJv Y2Vzc19hcnJheV9rZXlzIChhbmQgYWJvdmUgX2J0X3ByZXByb2Nlc3Nfa2V5cyBpdHNlbGYpLgor ICovCitzdGF0aWMgdm9pZAorX2J0X3VwZGF0ZV9rZXlzX3dpdGhfYXJyYXlrZXlzKEluZGV4U2Nh bkRlc2Mgc2NhbikKK3sKKwlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5v cGFxdWU7CisJU2NhbktleQkJY3VyOworCWludAkJCWlrZXksCisJCQkJYXJyYXlpZHggPSAwOwor CisJQXNzZXJ0KHNvLT5xdWFsX29rKTsKKworCWZvciAoY3VyID0gc28tPmtleURhdGEsIGlrZXkg PSAwOyBpa2V5IDwgc28tPm51bWJlck9mS2V5czsgY3VyKyssIGlrZXkrKykKKwl7CisJCUJUQXJy YXlLZXlJbmZvICphcnJheTsKKwkJU2NhbktleQkJc2tleWFycmF5OworCisJCUFzc2VydCgoY3Vy LT5za19mbGFncyAmIFNLX0JUX1JERE5BUlJBWSkgPT0gMCk7CisKKwkJLyogSnVzdCB1cGRhdGUg ZXF1YWxpdHkgYXJyYXkgc2NhbiBrZXlzICovCisJCWlmIChjdXItPnNrX3N0cmF0ZWd5ICE9IEJU RXF1YWxTdHJhdGVneU51bWJlciB8fAorCQkJIShjdXItPnNrX2ZsYWdzICYgU0tfU0VBUkNIQVJS QVkpKQorCQkJY29udGludWU7CisKKwkJYXJyYXkgPSAmc28tPmFycmF5S2V5c1thcnJheWlkeCsr XTsKKwkJc2tleWFycmF5ID0gJnNvLT5hcnJheUtleURhdGFbYXJyYXktPnNjYW5fa2V5XTsKKwor CQkvKiBVcGRhdGUgdGhlIHNjYW4ga2V5J3MgYXJndW1lbnQgKi8KKwkJQXNzZXJ0KGN1ci0+c2tf YXR0bm8gPT0gc2tleWFycmF5LT5za19hdHRubyk7CisJCWN1ci0+c2tfYXJndW1lbnQgPSBza2V5 YXJyYXktPnNrX2FyZ3VtZW50OworCX0KKworCUFzc2VydChhcnJheWlkeCA9PSBzby0+bnVtQXJy YXlLZXlzKTsKK30KKworLyoKKyAqIFZlcmlmeSB0aGF0IHRoZSBzY2FuJ3MgInNvLT5hcnJheUtl eURhdGFbXSIgc2NhbiBrZXlzIGFyZSBpbiBhZ3JlZW1lbnQgd2l0aAorICogdGhlIGN1cnJlbnQg InNvLT5rZXlEYXRhW10iIHNlYXJjaC10eXBlIHNjYW4ga2V5cy4gIFVzZWQgd2l0aGluIGFzc2Vy dGlvbnMuCisgKi8KKyNpZmRlZiBVU0VfQVNTRVJUX0NIRUNLSU5HCitzdGF0aWMgYm9vbAorX2J0 X3ZlcmlmeV9rZXlzX3dpdGhfYXJyYXlrZXlzKEluZGV4U2NhbkRlc2Mgc2NhbikKK3sKKwlCVFNj YW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CisJU2NhbktleQkJY3Vy OworCWludAkJCWlrZXksCisJCQkJYXJyYXlpZHggPSAwOworCisJaWYgKCFzby0+cXVhbF9vaykK KwkJcmV0dXJuIGZhbHNlOworCisJZm9yIChjdXIgPSBzby0+a2V5RGF0YSwgaWtleSA9IDA7IGlr ZXkgPCBzby0+bnVtYmVyT2ZLZXlzOyBjdXIrKywgaWtleSsrKQorCXsKKwkJQlRBcnJheUtleUlu Zm8gKmFycmF5OworCQlTY2FuS2V5CQlza2V5YXJyYXk7CisKKwkJaWYgKGN1ci0+c2tfc3RyYXRl Z3kgIT0gQlRFcXVhbFN0cmF0ZWd5TnVtYmVyIHx8CisJCQkhKGN1ci0+c2tfZmxhZ3MgJiBTS19T RUFSQ0hBUlJBWSkpCisJCQljb250aW51ZTsKKworCQlhcnJheSA9ICZzby0+YXJyYXlLZXlzW2Fy cmF5aWR4KytdOworCQlza2V5YXJyYXkgPSAmc28tPmFycmF5S2V5RGF0YVthcnJheS0+c2Nhbl9r ZXldOworCisJCS8qIFZlcmlmeSBzby0+YXJyYXlLZXlEYXRhW10gaW5wdXQga2V5IGhhcyBleHBl Y3RlZCBza19hcmd1bWVudCAqLworCQlpZiAoc2tleWFycmF5LT5za19hcmd1bWVudCAhPSBhcnJh eS0+ZWxlbV92YWx1ZXNbYXJyYXktPmN1cl9lbGVtXSkKKwkJCXJldHVybiBmYWxzZTsKKworCQkv KiBWZXJpZnkgc28tPmFycmF5S2V5RGF0YVtdIGlucHV0IGtleSBhZ3JlZXMgd2l0aCBvdXRwdXQg a2V5ICovCisJCWlmIChjdXItPnNrX2F0dG5vICE9IHNrZXlhcnJheS0+c2tfYXR0bm8pCisJCQly ZXR1cm4gZmFsc2U7CisJCWlmIChjdXItPnNrX2FyZ3VtZW50ICE9IHNrZXlhcnJheS0+c2tfYXJn dW1lbnQpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKGFycmF5aWR4ICE9IHNvLT5udW1B cnJheUtleXMpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorI2VuZGlmCisK IC8qCiAgKiBDb21wYXJlIHR3byBzY2Fua2V5IHZhbHVlcyB1c2luZyBhIHNwZWNpZmllZCBvcGVy YXRvci4KICAqCkBAIC0xMzYwLDU4ICsyNjc5LDI2NyBAQCBfYnRfbWFya19zY2Fua2V5X3JlcXVp cmVkKFNjYW5LZXkgc2tleSkKICAqCiAgKiBSZXR1cm4gdHJ1ZSBpZiBzbywgZmFsc2UgaWYgbm90 LiAgSWYgdGhlIHR1cGxlIGZhaWxzIHRvIHBhc3MgdGhlIHF1YWwsCiAgKiB3ZSBhbHNvIGRldGVy bWluZSB3aGV0aGVyIHRoZXJlJ3MgYW55IG5lZWQgdG8gY29udGludWUgdGhlIHNjYW4gYmV5b25k Ci0gKiB0aGlzIHR1cGxlLCBhbmQgc2V0ICpjb250aW51ZXNjYW4gYWNjb3JkaW5nbHkuICBTZWUg Y29tbWVudHMgZm9yCisgKiB0aGlzIHR1cGxlLCBhbmQgc2V0IHBzdGF0ZS5jb250aW51ZXNjYW4g YWNjb3JkaW5nbHkuICBTZWUgY29tbWVudHMgZm9yCiAgKiBfYnRfcHJlcHJvY2Vzc19rZXlzKCks IGFib3ZlLCBhYm91dCBob3cgdGhpcyBpcyBkb25lLgogICoKLSAqIEZvcndhcmQgc2NhbiBjYWxs ZXJzIGNhbiBwYXNzIGEgaGlnaCBrZXkgdHVwbGUgaW4gdGhlIGhvcGVzIG9mIGhhdmluZwotICog dXMgc2V0ICpjb250aW51ZXNjYW4gdG8gZmFsc2UsIGFuZCBhdm9pZGluZyBhbiB1bm5lY2Vzc2Fy eSB2aXNpdCB0bwotICogdGhlIHBhZ2UgdG8gdGhlIHJpZ2h0LgorICogRm9yd2FyZCBzY2FuIGNh bGxlcnMgY2FuIHBhc3MgYSBoaWdoIGtleSB0dXBsZSBpbiB0aGUgaG9wZXMgb2YgaGF2aW5nIHVz CisgKiBzZXQgcHN0YXRlLmNvbnRpbnVlc2NhbiB0byBmYWxzZSwgYW5kIGF2b2lkaW5nIGFuIHVu bmVjZXNzYXJ5IHZpc2l0IHRvIHRoZQorICogcGFnZSB0byB0aGUgcmlnaHQuCisgKgorICogRm9y d2FyZHMgc2NhbiBjYWxsZXJzIHdpdGggZXF1YWxpdHkgdHlwZSBhcnJheSBzY2FuIGtleXMgYXJl IG9ibGlnYXRlZCB0bworICogc2V0IHVwIHBhZ2Ugc3RhdGUgaW4gYSB3YXkgdGhhdCBtYWtlcyBp dCBwb3NzaWJsZSBmb3IgdXMgdG8gY2hlY2sgdGhlIGZpbmFsCisgKiB0dXBsZSAodGhlIGhpZ2gg a2V5IGZvciBhIGZvcndhcmQgc2NhbikgZWFybHksIGJlZm9yZSB3ZSd2ZSBleHBlbmRlZCB0b28K KyAqIG11Y2ggZWZmb3J0IG9uIGNvbXBhcmluZyB0dXBsZXMgdGhhdCBjYW5ub3QgcG9zc2libHkg YmUgbWF0Y2hlcyBmb3IgYW55IHNldAorICogb2YgYXJyYXkga2V5cy4gIFRoaXMgaXMganVzdCBh biBvcHRpbWl6YXRpb24uCisgKgorICogQWR2YW5jZXMgdGhlIGN1cnJlbnQgc2V0IG9mIGFycmF5 IGtleXMgZm9yIFNLX1NFQVJDSEFSUkFZIHNjYW5zIHdoZXJlCisgKiBhcHByb3ByaWF0ZS4gIFRo ZXNlIGNhbGxlcnMgYXJlIHJlcXVpcmVkIHRvIGluaXRpYWxpemUgdGhlIHBhZ2UgbGV2ZWwgaGln aAorICoga2V5IGluIHBzdGF0ZSBiZWZvcmUgdGhlIGZpcnN0IGNhbGwgaGVyZSBmb3IgdGhlIHBh Z2UgKHdoZW4gdGhlIHNjYW4KKyAqIGRpcmVjdGlvbiBpcyBmb3J3YXJkcykuICBOb3RlIHRoYXQg d2UgcmVseSBvbiBfYnRfcmVhZHBhZ2UgY2FsbGluZyBoZXJlIGluCisgKiBwYWdlIG9mZnNldCBu dW1iZXIgb3JkZXIgKGZvciBpdHMgc2NhbiBkaXJlY3Rpb24pLiAgQW55IG90aGVyIG9yZGVyIHdp bGwKKyAqIGxlYWQgdG8gaW5jb25zaXN0ZW50IGFycmF5IGtleSBzdGF0ZS4KICAqCiAgKiBzY2Fu OiBpbmRleCBzY2FuIGRlc2NyaXB0b3IgKGNvbnRhaW5pbmcgYSBzZWFyY2gtdHlwZSBzY2Fua2V5 KQorICogcHN0YXRlOiBQYWdlIGxldmVsIGlucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVycwogICog dHVwbGU6IGluZGV4IHR1cGxlIHRvIHRlc3QKLSAqIHR1cG5hdHRzOiBudW1iZXIgb2YgYXR0cmli dXRlcyBpbiB0dXBuYXR0cyAoaGlnaCBrZXkgbWF5IGJlIHRydW5jYXRlZCkKLSAqIGRpcjogZGly ZWN0aW9uIHdlIGFyZSBzY2FubmluZyBpbgotICogY29udGludWVzY2FuOiBvdXRwdXQgcGFyYW1l dGVyICh3aWxsIGJlIHNldCBjb3JyZWN0bHkgaW4gYWxsIGNhc2VzKQorICogZmluYWx0dXA6IElz IHR1cGxlIHRoZSBmaW5hbCBvbmUgd2UnbGwgYmUgY2FsbGVkIHdpdGggZm9yIHRoaXMgcGFnZT8K ICAqIHJlcXVpcmVkTWF0Y2hlZEJ5UHJlY2hlY2s6IGluZGljYXRlcyB0aGF0IHNjYW4ga2V5cyBy ZXF1aXJlZCBmb3IKICAqIAkJCQkJCQkgIGRpcmVjdGlvbiBzY2FuIGFyZSBhbHJlYWR5IG1hdGNo ZWQKICAqLwogYm9vbAotX2J0X2NoZWNra2V5cyhJbmRleFNjYW5EZXNjIHNjYW4sIEluZGV4VHVw bGUgdHVwbGUsIGludCB0dXBuYXR0cywKLQkJCSAgU2NhbkRpcmVjdGlvbiBkaXIsIGJvb2wgKmNv bnRpbnVlc2NhbiwKK19idF9jaGVja2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuLCBCVFJlYWRQYWdl U3RhdGUgKnBzdGF0ZSwKKwkJCSAgSW5kZXhUdXBsZSB0dXBsZSwgYm9vbCBmaW5hbHR1cCwKIAkJ CSAgYm9vbCByZXF1aXJlZE1hdGNoZWRCeVByZWNoZWNrKQogewotCVR1cGxlRGVzYwl0dXBkZXNj OwotCUJUU2Nhbk9wYXF1ZSBzbzsKLQlpbnQJCQlrZXlzejsKKwlUdXBsZURlc2MJdHVwZGVzYyA9 IFJlbGF0aW9uR2V0RGVzY3Ioc2Nhbi0+aW5kZXhSZWxhdGlvbik7CisJaW50CQkJbmF0dHMgPSBC VHJlZVR1cGxlR2V0TkF0dHModHVwbGUsIHNjYW4tPmluZGV4UmVsYXRpb24pOworCUJUU2Nhbk9w YXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsKKwlib29sCQlyZXM7CisJaW50 CQkJc2t0cmlnOworCisJQXNzZXJ0KHBzdGF0ZS0+Y29udGludWVzY2FuKTsKKwlBc3NlcnQoIXNv LT5uZWVkUHJpbVNjYW4pOworCisJcmVzID0gX2J0X2NoZWNrX2NvbXBhcmUocHN0YXRlLT5kaXIs IHNvLCB0dXBsZSwgbmF0dHMsIHR1cGRlc2MsCisJCQkJCQkJJnBzdGF0ZS0+Y29udGludWVzY2Fu LCAmc2t0cmlnLAorCQkJCQkJCXJlcXVpcmVkTWF0Y2hlZEJ5UHJlY2hlY2spOworCisJLyoKKwkg KiBPbmx5IG9uZSBfYnRfY2hlY2tfY29tcGFyZSBjYWxsIGlzIHJlcXVpcmVkIGluIHRoZSBjb21t b24gY2FzZSB3aGVyZQorCSAqIHRoZXJlIGFyZSBubyBlcXVhbGl0eS10eXBlIGFycmF5IHNjYW4g a2V5cy4gIE90aGVyd2lzZSB3ZSBjYW4gb25seQorCSAqIGFjY2VwdCBfYnRfY2hlY2tfY29tcGFy ZSdzIGFuc3dlciB1bnJlc2VydmVkbHkgd2hlbiBpdCBkaWRuJ3Qgc2V0CisJICogY29udGludWVz Y2FuPWZhbHNlLgorCSAqLworCWlmICghc28tPm51bUFycmF5S2V5cyB8fCBwc3RhdGUtPmNvbnRp bnVlc2NhbikKKwkJcmV0dXJuIHJlczsKKworCS8qCisJICogX2J0X2NoZWNrX2NvbXBhcmUgY2Fs bCBzZXQgY29udGludWVzY2FuPWZhbHNlIGluIHRoZSBwcmVzZW5jZSBvZgorCSAqIGVxdWFsaXR5 IHR5cGUgYXJyYXkga2V5cy4KKwkgKgorCSAqIFdoaWxlIHdlIG1pZ2h0IHJlYWxseSBuZWVkIHRv IGVuZCB0aGUgdG9wLWxldmVsIGluZGV4IHNjYW4sIG1vc3Qgb2YgdGhlCisJICogdGltZSB0aGlz IGp1c3QgbWVhbnMgdGhhdCB0aGUgc2NhbiBuZWVkcyB0byByZWNvbnNpZGVyIGl0cyBhcnJheSBr ZXlzLgorCSAqLworCWlmIChfYnRfdHVwbGVfYmVmb3JlX2FycmF5X3NrZXlzKHNjYW4sIHBzdGF0 ZSwgdHVwbGUsIHNrdHJpZykpCisJeworCQkvKgorCQkgKiBDdXJyZW50IHR1cGxlIGlzIDwgdGhl IGN1cnJlbnQgYXJyYXkgc2NhbiBrZXlzL2VxdWFsaXR5IGNvbnN0cmFpbnRzCisJCSAqIChvciA+ IGluIHRoZSBiYWNrd2FyZCBzY2FuIGNhc2UpLiAgRG9uJ3QgbmVlZCB0byBhZHZhbmNlIHRoZSBh cnJheQorCQkgKiBrZXlzLiAgTXVzdCBkZWNpZGUgd2hldGhlciB0byBzdGFydCBhIG5ldyBwcmlt aXRpdmUgc2NhbiBpbnN0ZWFkLgorCQkgKgorCQkgKiBJZiB0aGlzIHR1cGxlIGlzbid0IHRoZSBm aW5hbHR1cCBmb3IgdGhlIHBhZ2UsIHRoZW4gcmVjaGVjayB0aGUKKwkJICogZmluYWx0dXAgc3Rh c2hlZCBpbiBwc3RhdGUgYXMgYW4gb3B0aW1pemF0aW9uLiAgVGhhdCBhbGxvd3MgdXMgdG8KKwkJ ICogcXVpdCBzY2FubmluZyB0aGlzIHBhZ2UgZWFybHkgd2hlbiBpdCdzIGNsZWFybHkgaG9wZWxl c3MgKHdlIGRvbid0CisJCSAqIG5lZWQgdG8gd2FpdCBmb3IgdGhlIGZpbmFsdHVwIGNhbGwgdG8g Z2l2ZSB1cCBvbiBhIHByaW1pdGl2ZSBzY2FuKS4KKwkJICovCisJCWlmIChmaW5hbHR1cCB8fCAo IXBzdGF0ZS0+ZmluYWx0dXBjaGVja2VkICYmIHBzdGF0ZS0+ZmluYWx0dXAgJiYKKwkJCQkJCSBf YnRfdHVwbGVfYmVmb3JlX2FycmF5X3NrZXlzKHNjYW4sIHBzdGF0ZSwKKwkJCQkJCQkJCQkJCQkg IHBzdGF0ZS0+ZmluYWx0dXAsIDApKSkKKwkJeworCQkJLyoKKwkJCSAqIEdpdmUgdXAgb24gdGhl IG9uZ29pbmcgcHJpbWl0aXZlIGluZGV4IHNjYW4uCisJCQkgKgorCQkJICogRXZlbiB0aGUgZmlu YWwgdHVwbGUgKHRoZSBoaWdoIGtleSBmb3IgZm9yd2FyZCBzY2Fucywgb3IgdGhlCisJCQkgKiB0 dXBsZSBmcm9tIHBhZ2Ugb2Zmc2V0IG51bWJlciAxIGZvciBiYWNrd2FyZCBzY2FucykgaXMgYmVm b3JlCisJCQkgKiB0aGUgY3VycmVudCBhcnJheSBrZXlzLiAgVGhhdCBzdHJvbmdseSBzdWdnZXN0 cyB0aGF0IGNvbnRpbnVpbmcKKwkJCSAqIHRoaXMgcHJpbWl0aXZlIHNjYW4gd291bGQgYmUgbGVz cyBlZmZpY2llbnQgdGhhbiBzdGFydGluZyBhbmV3LgorCQkJICoKKwkJCSAqIFNlZSBhbHNvOiBm aW5hbHR1cCByZW1hcmtzIGFmdGVyIHRoZSBfYnRfYWR2YW5jZV9hcnJheV9rZXlzCisJCQkgKiBj YWxsIGJlbG93LCB3aGljaCBmdWxseSBleHBsYWluIG91ciBwb2xpY3kgYXJvdW5kIGhvdyBhbmQg d2hlbgorCQkJICogcHJpbWl0aXZlIGluZGV4IHNjYW5zIGVuZC4KKwkJCSAqLworCQkJcHN0YXRl LT5jb250aW51ZXNjYW4gPSBmYWxzZTsKKworCQkJLyoKKwkJCSAqIFNldCB1cCBhIG5ldyBwcmlt aXRpdmUgaW5kZXggc2NhbiB0aGF0IHdpbGwgcmVwb3NpdGlvbiB0aGUKKwkJCSAqIHRvcC1sZXZl bCBzY2FuIHRvIHRoZSBmaXJzdCBsZWFmIHBhZ2Ugd2hvc2Uga2V5IHNwYWNlIGlzCisJCQkgKiBj b3ZlcmVkIGJ5IG91ciBhcnJheSBrZXlzLiAgVGhlIHRvcC1sZXZlbCBzY2FuIHdpbGwgInNraXAi IGEKKwkJCSAqIHBhcnQgb2YgdGhlIGluZGV4IHRoYXQgY2FuIG9ubHkgY29udGFpbiBub24tbWF0 Y2hpbmcgdHVwbGVzLgorCQkJICoKKwkJCSAqIE5vdGU6IHRoZSBuZXh0IHByaW1pdGl2ZSBpbmRl eCBzY2FuIGlzIGd1YXJhbnRlZWQgdG8gbGFuZCBvbgorCQkJICogc29tZSBsYXRlciBsZWFmIHBh Z2UgKGlkZWFsbHkgaXQgd29uJ3QgYmUgdGhpcyBwYWdlJ3Mgc2libGluZykuCisJCQkgKiBJdCBm b2xsb3dzIHRoYXQgdGhlIHRvcC1sZXZlbCBzY2FuIGNhbiBuZXZlciBhY2Nlc3MgdGhlIHNhbWUK KwkJCSAqIGxlYWYgcGFnZSBtb3JlIHRoYW4gb25jZSAodW5sZXNzIHRoZSBzY2FuIGNoYW5nZXMg ZGlyZWN0aW9uIG9yCisJCQkgKiBidHJlc3RycG9zIGlzIGNhbGxlZCkuICBidGNvc3Rlc3RpbWF0 ZSByZWxpZXMgb24gdGhpcy4KKwkJCSAqLworCQkJc28tPm5lZWRQcmltU2NhbiA9IHRydWU7CisJ CX0KKwkJZWxzZQorCQl7CisJCQkvKgorCQkJICogU3RpY2sgd2l0aCB0aGUgb25nb2luZyBwcmlt aXRpdmUgaW5kZXggc2NhbiwgZm9yIG5vdyAob3ZlcnJpZGUKKwkJCSAqIF9idF9jaGVja19jb21w YXJlJ3Mgc3VnZ2VzdGlvbiB0aGF0IHdlIGVuZCB0aGUgc2NhbikuCisJCQkgKgorCQkJICogTm90 ZTogd2Ugd2lsbCBlbmQgdXAgaGVyZSBhZ2FpbiBhbmQgYWdhaW4gZ2l2ZW4gYSBncm91cCBvZgor CQkJICogdHVwbGVzID4gdGhlIHByZXZpb3VzIGFycmF5IGtleXMgYW5kIDwgdGhlIG5vdy1jdXJy ZW50IGtleXMKKwkJCSAqICh0aG91Z2ggb25seSBhZnRlciBhbiBpbml0aWFsIGZpbmFsdHVwIHBy ZWNoZWNrIGRldGVybWluZWQgdGhhdAorCQkJICogdGhpcyBwYWdlIGRlZmluaXRlbHkgY292ZXJz IGtleSBzcGFjZSBmcm9tIGJvdGggYXJyYXkga2V5c2V0cykuCisJCQkgKiBJbiBlZmZlY3QsIHdl IHBlcmZvcm0gYSBsaW5lYXIgc2VhcmNoIG9mIHRoZSBwYWdlJ3MgcmVtYWluaW5nCisJCQkgKiB1 bnNjYW5uZWQgdHVwbGVzIGV2ZXJ5IHRpbWUgdGhlIGFycmF5cyBhZHZhbmNlIHBhc3QgdGhlIGtl eQorCQkJICogc3BhY2Ugb2YgdGhlIHNjYW4ncyB0aGVuLWN1cnJlbnQgdHVwbGUuCisJCQkgKi8K KwkJCXBzdGF0ZS0+Y29udGludWVzY2FuID0gdHJ1ZTsKKworCQkJLyoKKwkJCSAqIE91ciBmaW5h bHR1cCBwcmVjaGVjayBkZXRlcm1pbmVkIHRoYXQgaXQgaXMgPj0gdGhlIGN1cnJlbnQga2V5cwor CQkJICogKGFsdGhvdWdoIHRoZSBjdXJyZW50IHR1cGxlIGlzIHN0aWxsIDwgdGhlIGN1cnJlbnQg YXJyYXkga2V5cykuCisJCQkgKgorCQkJICogUmVtZW1iZXIgdGhhdCBmYWN0IGluIHBzdGF0ZSBu b3cuICBUaGlzIGF2b2lkcyB3YXN0aW5nIGN5Y2xlcworCQkJICogb24gcmVwZWF0aW5nIHRoZSBz YW1lIHByZWNoZWNrIHN0ZXAgKGNoZWNraW5nIHRoZSBzYW1lIGZpbmFsdHVwCisJCQkgKiBhZ2Fp bnN0IHRoZSBzYW1lIGFycmF5IGtleXMpIGR1cmluZyBsYXRlciBjYWxscyBoZXJlIGZvciBsYXRl cgorCQkJICogdHVwbGVzIGZyb20gdGhpcyBzYW1lIGxlYWYgcGFnZS4KKwkJCSAqLworCQkJcHN0 YXRlLT5maW5hbHR1cGNoZWNrZWQgPSB0cnVlOworCQl9CisKKwkJLyogSW4gYW55IGNhc2UsIHRo aXMgaW5kZXh0dXBsZSBkb2Vzbid0IG1hdGNoIHRoZSBxdWFsICovCisJCXJldHVybiBmYWxzZTsK Kwl9CisKKwkvKgorCSAqIENhbGxlcidzIHR1cGxlIGlzID49IHRoZSBjdXJyZW50IHNldCBvZiBh cnJheSBrZXlzIGFuZCBvdGhlciBlcXVhbGl0eQorCSAqIGNvbnN0cmFpbnQgc2NhbiBrZXlzIChv ciA8PSBpZiB0aGlzIGlzIGEgYmFja3dhcmRzIHNjYW5zKS4gIEl0J3Mgbm93CisJICogY2xlYXIg dGhhdCB3ZSBfbXVzdF8gYWR2YW5jZSBhbnkgcmVxdWlyZWQgYXJyYXkga2V5cyBpbiBsb2Nrc3Rl cCB3aXRoCisJICogdGhlIHNjYW4gKG9yIGF0IGxlYXN0IG5vdGljZSB0aGF0IHRoZSByZXF1aXJl ZCBhcnJheSBrZXlzIGhhdmUgYmVlbgorCSAqIGV4aGF1c3RlZCwgd2hpY2ggd2lsbCBlbmQgdGhl IHRvcC1sZXZlbCBzY2FuKS4KKwkgKgorCSAqIE5vdGU6IHdlIG1pZ2h0IGV2ZW4gYWR2YW5jZSB0 aGUgYXJyYXlzIHdoZW4gYWxsIGV4aXN0aW5nIGtleXMgYXJlCisJICogYWxyZWFkeSBlcXVhbCB0 byB0aGUgdmFsdWVzIGZyb20gdGhlIHR1cGxlIGF0IHRoaXMgcG9pbnQuICBTZWUgY29tbWVudHMK KwkgKiBhYm91dCBpbmVxdWFsaXR5LWRyaXZlbiBhcnJheSBhZHZhbmNlbWVudCBhYm92ZSBfYnRf YWR2YW5jZV9hcnJheV9rZXlzLgorCSAqLworCWlmIChfYnRfYWR2YW5jZV9hcnJheV9rZXlzKHNj YW4sIHBzdGF0ZSwgdHVwbGUsIHNrdHJpZykpCisJeworCQkvKiBUdXBsZSAod2hpY2ggZGlkbid0 IG1hdGNoIHRoZSBvbGQgcXVhbCkgbm93IG1hdGNoZXMgdGhlIG5ldyBxdWFsICovCisJCUFzc2Vy dChwc3RhdGUtPmNvbnRpbnVlc2Nhbik7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qCisJICog QXQgdGhpcyBwb2ludCB3ZSd2ZSBlaXRoZXIgYWR2YW5jZWQgdGhlIGFycmF5IGtleXMgYmV5b25k IHRoZSB0dXBsZSwgb3IKKwkgKiBleGhhdXN0ZWQgYWxsIGFycmF5IGtleXMgKHdoaWNoIHdpbGwg ZW5kIHRoZSB0b3AtbGV2ZWwgaW5kZXggc2NhbikuCisJICogRWl0aGVyIHdheSwgdGhpcyBpbmRl eCB0dXBsZSBkb2Vzbid0IG1hdGNoIHRoZSBuZXcgcXVhbC4KKwkgKgorCSAqIFRoZSBhcnJheSBr ZXlzIHVzdWFsbHkgYWR2YW5jZSB1c2luZyBhIHR1cGxlIGZyb20gYmVmb3JlIGZpbmFsdHVwCisJ ICogKHRoZXJlIGNhbiBvbmx5IGJlIG9uZSBmaW5hbHR1cCBwZXIgcGFnZSwgb2YgY291cnNlKS4g IEluIHRoZSBjb21tb24KKwkgKiBjYXNlIHdoZXJlIHdlIGp1c3QgYWR2YW5jZWQgdGhlIGFycmF5 IGtleXMgZHVyaW5nIGEgIWZpbmFsdHVwIGNhbGwsIHdlCisJICogY2FuIGJlIHN1cmUgdGhhdCB0 aGVyZSdsbCBiZSBhdCBsZWFzdCBvbmUgbW9yZSBvcHBvcnR1bml0eSB0byBjaGVjayB0aGUKKwkg KiBuZXcgYXJyYXkga2V5cyBhZ2FpbnN0IGFub3RoZXIgdHVwbGUgZnJvbSB0aGlzIHNhbWUgcGFn ZS4gIFRoaW5ncyBhcmUKKwkgKiBtb3JlIGNvbXBsaWNhdGVkIGZvciBmaW5hbHR1cCBjYWxscyB0 aGF0IGFkdmFuY2UgdGhlIGFycmF5IGtleXMgYXQgYQorCSAqIHBhZ2UgYm91bmRhcnkuICBUaGV5 J2xsIG9mdGVuIGFkdmFuY2UgdGhlIGFycmF5cyB0byB2YWx1ZXMgPiBmaW5hbHR1cCwKKwkgKiBs ZWF2aW5nIHVzIHdpdGggbm8gcmVsaWFibGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBoeXNpY2Fs IHByb3hpbWl0eSBvZgorCSAqIHRoZSBmaXJzdCBsZWFmIHBhZ2Ugd2hlcmUgbWF0Y2hlcyBmb3Ig dGhlIG5ldyBrZXlzIGFyZSB0byBiZSBmb3VuZC4KKwkgKgorCSAqIE91ciBwb2xpY3kgaXMgdG8g YWxsb3cgb3VyIGNhbGxlciB0byBtb3ZlIG9uIHRvIHRoZSBuZXh0IHNpYmxpbmcgcGFnZQorCSAq IGluIHRoZXNlIGNhc2VzLiAgVGhpcyBpcyBzcGVjdWxhdGl2ZSwgaW4gYSB3YXk6IGl0J3MgYWx3 YXlzIHBvc3NpYmxlCisJICogdGhhdCB0aGUgYXJyYXkga2V5cyB3aWxsIGhhdmUgYWR2YW5jZWQg d2VsbCBiZXlvbmQgdGhlIGtleSBzcGFjZQorCSAqIGNvdmVyZWQgYnkgdGhlIG5leHQgc2libGlu ZyBwYWdlLiAgQW5kIGlmIGl0IHR1cm5zIG91dCBsaWtlIHRoYXQgdGhlbgorCSAqIG91ciBjYWxs ZXIgd2lsbCBpbmN1ciBhIHdhc3RlZCBsZWFmIHBhZ2UgYWNjZXNzLgorCSAqCisJICogSW4gcHJh Y3RpY2UgdGhpcyBwb2xpY3kgd2lucyBzaWduaWZpY2FudGx5IG1vcmUgb2Z0ZW4gdGhhbiBpdCBs b3Nlcy4KKwkgKiBUaGUgZmFjdCB0aGF0IHRoZSBmaW5hbCB0dXBsZSBhZHZhbmNlZCB0aGUgYXJy YXkga2V5cyBpcyBhbiBlbmNvdXJhZ2luZworCSAqIHNpZ25hbCAtLSBlc3BlY2lhbGx5IGR1cmlu ZyBmb3J3YXJkcyBzY2Fucywgd2hlcmUgb3VyIGhpZ2gga2V5L3Bpdm90CisJICogZmluYWx0dXAg aGFzIHZhbHVlcyBkZXJpdmVkIGZyb20gdGhlIHJpZ2h0IHNpYmxpbmcncyBmaXJzdHJpZ2h0IHR1 cGxlLgorCSAqIFRoaXMgaXNzdWUgaXMgcXVpdGUgbGlrZWx5IHRvIGNvbWUgdXAgd2hlbmV2ZXIg bXVsdGlwbGUgYXJyYXkga2V5cyBhcmUKKwkgKiB1c2VkIGJ5IGZvcndhcmQgc2NhbnMuICBUaGVy ZSBpcyBhIGRlY2VudCBjaGFuY2UgdGhhdCBldmVyeSBmaW5hbHR1cAorCSAqIGZyb20gZXZlcnkg cGFnZSB3aWxsIGhhdmUgYXQgbGVhc3Qgb25lIHRydW5jYXRlZCAtaW5mIGF0dHJpYnV0ZSwgd2hp Y2gKKwkgKiBtYWtlcyBpdCBpbXBvc3NpYmxlIGZvciBmaW5hbHR1cCBhcnJheSBhZHZhbmNlbWVu dCB0byBhZHZhbmNlIHRoZSBsb3dlcgorCSAqIG9yZGVyIGFycmF5cyB0byBleGFjdGx5IG1hdGNo aW5nIGFycmF5IGVsZW1lbnRzLiAgV29ya2xvYWRzIGxpa2UgdGhhdAorCSAqIHdvdWxkIHNlZSBw b29yIHBlcmZvcm1hbmNlIGZyb20gYSBwb2xpY3kgdGhhdCBjb25kaXRpb25zIGdvaW5nIHRvIHRo ZQorCSAqIG5leHQgc2libGluZyBwYWdlIG9uIGhhdmluZyBhbiBleGFjdGx5LW1hdGNoaW5nIGZp bmFsdHVwIG9uIHRoaXMgcGFnZS4KKwkgKgorCSAqIENhc2VzIHdoZXJlIGNvbnRpbnVpbmcgdGhl IHNjYW4gb250byB0aGUgbmV4dCBzaWJsaW5nIHBhZ2UgaXMgYSBiYWQKKwkgKiBpZGVhIHVzdWFs bHkgcXVpdCBzY2FubmluZyB0aGUgcGFnZSBiZWZvcmUgZXZlbiByZWFjaGluZyBmaW5hbHR1cDsg anVzdAorCSAqIG1ha2luZyBpdCBhcyBmYXIgYXMgZmluYWx0dXAgaXMgYSB1c2VmdWwgY3VlIGlu IGl0cyBvd24gcmlnaHQuICBUaGlzIGlzCisJICogcGFydGx5IGR1ZSB0byBhIHByb21pc2UgdGhh dCBfYnRfYWR2YW5jZV9hcnJheV9rZXlzIG1ha2VzOiBpdCBhbHdheXMKKwkgKiBhZHZhbmNlcyB0 aGUgc2NhbidzIGFycmF5IGtleXMgdG8gdGhlIG1heGltdW0gcG9zc2libGUgZXh0ZW50IHRoYXQg aXMKKwkgKiBzdXJlIHRvIGJlIHNhZmUsIGdpdmVuIHdoYXQgaXMga25vd24gYWJvdXQgdGhlIHNj YW4gd2hlbiBpdCBpcyBjYWxsZWQKKwkgKiAobmFtZWx5IHRoZSBzY2FuJ3MgY3VycmVudCB0dXBs ZSBhbmQgaXRzIGFycmF5IGtleXMsIHRob3VnaCBfbm90XyB0aGUKKwkgKiBuZXh0IHR1cGxlIHdo b3NlIGtleSBzcGFjZSBpcyBjb3ZlcmVkIGJ5IGFueSBvZiB0aGUgc2NhbidzIGFycmF5cykuCisJ ICogVGhhdCBmYWN0b3IgbGltaXRzIGFycmF5IGFkdmFuY2VtZW50IHVzaW5nIGZpbmFsdHVwIHRv IGNhc2VzIHdoZXJlIG5vCisJICogZWFybGllciB0dXBsZSBjb3VsZCBidW1wIHRoZSBhcnJheSBr ZXlzIHRvIGtleSBzcGFjZSBiZXlvbmQgZmluYWx0dXAsCisJICogZGVzcGl0ZSBiZWluZyBnaXZl biBldmVyeSBvcHBvcnR1bml0eSB0byBkbyBzbyBieSB1cyAod2l0aCBzb21lIGhlbHAKKwkgKiBm cm9tIF9idF9hZHZhbmNlX2FycmF5X2tleXMpLgorCSAqCisJICogQ2hhbmNlcyBhcmUgZ29vZCB0 aGF0IGZpbmFsdHVwIHdvbid0IGJlIGFsbCB0aGF0IGRpZmZlcmVudCB0byBlYXJsaWVyCisJICog bmVhcmJ5IHR1cGxlczogaXQgaXMgdW5saWtlbHkgdG8gbWFrZSB0aGUgdHVwbGUtd2lzZSBwb3Np dGlvbiB0aGF0CisJICogbWF0Y2hpbmcgdHVwbGVzIHN0YXJ0IGF0IGp1bXAgZm9yd2FyZCBieSBh IGdyZWF0IG1hbnkgdHVwbGVzLCBlaXRoZXIuCisJICogSW4gcGFydGljdWxhciwgaXQgaXMgdW5s aWtlbHkgdG8ganVtcCBieSBtb3JlIHR1cGxlcyB0aGFuIGNhbGxlciB3aWxsCisJICogZmluZCBv biB0aGUgbmV4dCBsZWFmIHBhZ2UuICBUaGF0J3Mgd2h5IGl0IG1ha2VzIHNlbnNlIHRvIGFsbG93 IHRoZQorCSAqIG9uZ29pbmcgcHJpbWl0aXZlIGluZGV4IHNjYW4gdG8gYXQgbGVhc3QgY29udGlu dWUgdG8gdGhlIG5leHQgcGFnZS4KKwkgKi8KKworCS8qIEluIGFueSBjYXNlLCB0dXBsZSBkb2Vz bid0IG1hdGNoIHRoZSBuZXcgcXVhbCwgZWl0aGVyICovCisJcmV0dXJuIGZhbHNlOworfQorCisv KgorICogVGVzdCB3aGV0aGVyIGFuIGluZGV4dHVwbGUgc2F0aXNmaWVzIGN1cnJlbnQgc2NhbiBj b25kaXRpb24uCisgKgorICogUmV0dXJuIHRydWUgaWYgc28sIGZhbHNlIGlmIG5vdC4gIElmIG5v dCwgYWxzbyBjbGVhciAqY29udGludWVzY2FuIGlmCisgKiBpdCdzIG5vdCBwb3NzaWJsZSBmb3Ig YW55IGZ1dHVyZSB0dXBsZXMgaW4gdGhlIGN1cnJlbnQgc2NhbiBkaXJlY3Rpb24gdG8KKyAqIHBh c3MgdGhlIHF1YWwgd2l0aCB0aGUgY3VycmVudCBzZXQgb2YgYXJyYXkga2V5cy4KKyAqCisgKiBU aGlzIGlzIGEgc3Vicm91dGluZSBmb3IgX2J0X2NoZWNra2V5cy4gIEl0IGlzIHdyaXR0ZW4gd2l0 aCB0aGUgYXNzdW1wdGlvbgorICogdGhhdCByZWFjaGluZyB0aGUgZW5kIG9mIGVhY2ggZGlzdGlu Y3Qgc2V0IG9mIGFycmF5IGtleXMgdGVybWluYXRlcyB0aGUKKyAqIG9uZ29pbmcgcHJpbWl0aXZl IGluZGV4IHNjYW4uICBJdCBpcyB1cCB0byBvdXIgY2FsbGVyICh3aGljaCBoYXMgbW9yZSBoaWdo CisgKiBsZXZlbCBjb250ZXh0IHRoYW4gdXMpIHRvIG92ZXJyaWRlIHRoYXQgaW5pdGlhbCBkZXRl cm1pbmF0aW9uIHdoZW4gaXQgbWFrZXMKKyAqIG1vcmUgc2Vuc2UgdG8gYWR2YW5jZSB0aGUgYXJy YXkga2V5cyBhbmQgY29udGludWUgd2l0aCBmdXJ0aGVyIHR1cGxlcyBmcm9tCisgKiB0aGUgc2Ft ZSBsZWFmIHBhZ2UuCisgKi8KK3N0YXRpYyBib29sCitfYnRfY2hlY2tfY29tcGFyZShTY2FuRGly ZWN0aW9uIGRpciwgQlRTY2FuT3BhcXVlIHNvLAorCQkJCSAgSW5kZXhUdXBsZSB0dXBsZSwgaW50 IHR1cG5hdHRzLCBUdXBsZURlc2MgdHVwZGVzYywKKwkJCQkgIGJvb2wgKmNvbnRpbnVlc2Nhbiwg aW50ICpza3RyaWcsCisJCQkJICBib29sIHJlcXVpcmVkTWF0Y2hlZEJ5UHJlY2hlY2spCit7CiAJ aW50CQkJaWtleTsKIAlTY2FuS2V5CQlrZXk7CiAKLQlBc3NlcnQoQlRyZWVUdXBsZUdldE5BdHRz KHR1cGxlLCBzY2FuLT5pbmRleFJlbGF0aW9uKSA9PSB0dXBuYXR0cyk7CisJQXNzZXJ0KCFzby0+ bnVtQXJyYXlLZXlzIHx8ICFyZXF1aXJlZE1hdGNoZWRCeVByZWNoZWNrKTsKIAogCSpjb250aW51 ZXNjYW4gPSB0cnVlOwkJLyogZGVmYXVsdCBhc3N1bXB0aW9uICovCisJKnNrdHJpZyA9IDA7CQkJ CS8qIGRlZmF1bHQgYXNzdW1wdGlvbiAqLwogCi0JdHVwZGVzYyA9IFJlbGF0aW9uR2V0RGVzY3Io c2Nhbi0+aW5kZXhSZWxhdGlvbik7Ci0Jc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7 Ci0Ja2V5c3ogPSBzby0+bnVtYmVyT2ZLZXlzOwotCi0JZm9yIChrZXkgPSBzby0+a2V5RGF0YSwg aWtleSA9IDA7IGlrZXkgPCBrZXlzejsga2V5KyssIGlrZXkrKykKKwlmb3IgKGtleSA9IHNvLT5r ZXlEYXRhLCBpa2V5ID0gMDsgaWtleSA8IHNvLT5udW1iZXJPZktleXM7IGtleSsrLCBpa2V5Kysp CiAJewogCQlEYXR1bQkJZGF0dW07CiAJCWJvb2wJCWlzTnVsbDsKIAkJRGF0dW0JCXRlc3Q7CiAJ CWJvb2wJCXJlcXVpcmVkU2FtZURpciA9IGZhbHNlLAotCQkJCQlyZXF1aXJlZE9wcG9zaXRlRGly ID0gZmFsc2U7CisJCQkJCXJlcXVpcmVkT3Bwb3NpdGVEaXJPbmx5ID0gZmFsc2U7CiAKIAkJLyoK IAkJICogQ2hlY2sgaWYgdGhlIGtleSBpcyByZXF1aXJlZCBmb3Igb3JkZXJlZCBzY2FuIGluIHRo ZSBzYW1lIG9yCi0JCSAqIG9wcG9zaXRlIGRpcmVjdGlvbi4gIFNhdmUgYXMgZmxhZyB2YXJpYWJs ZXMgZm9yIGZ1dHVyZSB1c2FnZS4KKwkJICogb3Bwb3NpdGUgZGlyZWN0aW9uLiAgQWxzbyBzZXQg YW4gb2Zmc2V0IHRvIHRoaXMgc2NhbiBrZXkgZm9yIGNhbGxlcgorCQkgKiBpbiBjYXNlIGl0IHN0 b3BzIHRoZSBzY2FuICh1c2VkIGJ5IHNjYW5zIHRoYXQgaGF2ZSBhcnJheSBrZXlzKS4KIAkJICov CiAJCWlmICgoKGtleS0+c2tfZmxhZ3MgJiBTS19CVF9SRVFGV0QpICYmIFNjYW5EaXJlY3Rpb25J c0ZvcndhcmQoZGlyKSkgfHwKIAkJCSgoa2V5LT5za19mbGFncyAmIFNLX0JUX1JFUUJLV0QpICYm IFNjYW5EaXJlY3Rpb25Jc0JhY2t3YXJkKGRpcikpKQogCQkJcmVxdWlyZWRTYW1lRGlyID0gdHJ1 ZTsKIAkJZWxzZSBpZiAoKChrZXktPnNrX2ZsYWdzICYgU0tfQlRfUkVRRldEKSAmJiBTY2FuRGly ZWN0aW9uSXNCYWNrd2FyZChkaXIpKSB8fAogCQkJCSAoKGtleS0+c2tfZmxhZ3MgJiBTS19CVF9S RVFCS1dEKSAmJiBTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikpKQotCQkJcmVxdWlyZWRPcHBv c2l0ZURpciA9IHRydWU7CisJCQlyZXF1aXJlZE9wcG9zaXRlRGlyT25seSA9IHRydWU7CisJCSpz a3RyaWcgPSBpa2V5OwogCiAJCS8qCiAJCSAqIElzIHRoZSBrZXkgcmVxdWlyZWQgZm9yIHNjYW5u aW5nIGZvciBlaXRoZXIgZm9yd2FyZCBvciBiYWNrd2FyZApAQCAtMTQxOSw3ICsyOTQ3LDcgQEAg X2J0X2NoZWNra2V5cyhJbmRleFNjYW5EZXNjIHNjYW4sIEluZGV4VHVwbGUgdHVwbGUsIGludCB0 dXBuYXR0cywKIAkJICoga25vd24gdG8gYmUgbWF0Y2hlZCwgc2tpcCB0aGUgY2hlY2suICBFeGNl cHQgZm9yIHRoZSByb3cga2V5cywKIAkJICogd2hlcmUgTlVMTHMgY291bGQgYmUgZm91bmQgaW4g dGhlIG1pZGRsZSBvZiBtYXRjaGluZyB2YWx1ZXMuCiAJCSAqLwotCQlpZiAoKHJlcXVpcmVkU2Ft ZURpciB8fCByZXF1aXJlZE9wcG9zaXRlRGlyKSAmJgorCQlpZiAoKHJlcXVpcmVkU2FtZURpciB8 fCByZXF1aXJlZE9wcG9zaXRlRGlyT25seSkgJiYKIAkJCSEoa2V5LT5za19mbGFncyAmIFNLX1JP V19IRUFERVIpICYmIHJlcXVpcmVkTWF0Y2hlZEJ5UHJlY2hlY2spCiAJCQljb250aW51ZTsKIApA QCAtMTUyMiwxMSArMzA1MCwyOCBAQCBfYnRfY2hlY2trZXlzKEluZGV4U2NhbkRlc2Mgc2Nhbiwg SW5kZXhUdXBsZSB0dXBsZSwgaW50IHR1cG5hdHRzLAogCiAJCS8qCiAJCSAqIEFwcGx5IHRoZSBr ZXkgY2hlY2tpbmcgZnVuY3Rpb24uICBXaGVuIHRoZSBrZXkgaXMgcmVxdWlyZWQgZm9yCi0JCSAq IG9wcG9zaXRlIGRpcmVjdGlvbiBzY2FuLCBpdCBtdXN0IGJlIGFscmVhZHkgc2F0aXNmaWVkIGJ5 Ci0JCSAqIF9idF9maXJzdCgpIGV4Y2VwdCBmb3IgdGhlIE5VTExzIGNoZWNraW5nLCB3aGljaCBo YXZlIGFscmVhZHkgZG9uZQotCQkgKiBhYm92ZS4KKwkJICogb3Bwb3NpdGUtZGlyZWN0aW9uIHNj YW5zIGl0IG11c3QgYmUgYW4gaW5lcXVhbGl0eSBzYXRpc2ZpZWQgYnkKKwkJICogX2J0X2ZpcnN0 KCksIGJhcnJpbmcgTlVMTHMsIHdoaWNoIHdlIGp1c3QgY2hlY2tlZCBhIG1vbWVudCBhZ28uCisJ CSAqCisJCSAqIChBbHNvIGNhbid0IGFwcGx5IHRoaXMgb3B0aW1pemF0aW9uIHdpdGggc2NhbnMg dGhhdCB1c2UgYXJyYXlzLAorCQkgKiBzaW5jZSBfYnRfYWR2YW5jZV9hcnJheV9rZXlzKCkgc29t ZXRpbWVzIGFsbG93cyB0aGUgc2NhbiB0byBzZWUgYQorCQkgKiBmZXcgdHVwbGVzIGZyb20gYmVm b3JlIHRoZSB3b3VsZC1iZSBfYnRfZmlyc3QoKSBzdGFydGluZyBwb3NpdGlvbgorCQkgKiBmb3Ig dGhlIHNjYW4ncyBqdXN0LWFkdmFuY2VkIGFycmF5IGtleXMuKQorCQkgKgorCQkgKiBFdmVuIHJl cXVpcmVkIGVxdWFsaXR5IHF1YWxzICh0aGF0IGNhbid0IHVzZSB0aGlzIG9wdGltaXphdGlvbiBk dWUKKwkJICogdG8gYmVpbmcgcmVxdWlyZWQgaW4gYm90aCBzY2FuIGRpcmVjdGlvbnMpIHJlbHkg b24gdGhlIGFzc3VtcHRpb24KKwkJICogdGhhdCBfYnRfZmlyc3QoKSB3aWxsIGFsd2F5cyB1c2Ug dGhlIHF1YWxzIGZvciBpbml0aWFsIHBvc2l0aW9uaW5nCisJCSAqIHB1cnBvc2VzLiAgV2Ugc3Rv cCB0aGUgc2NhbiBhcyBzb29uIGFzIGFueSByZXF1aXJlZCBlcXVhbGl0eSBxdWFsCisJCSAqIGZh aWxzLCBzbyBpdCBoYWQgYmV0dGVyIG9ubHkgaGFwcGVuIGF0IHRoZSBlbmQgb2YgZXF1YWwgdHVw bGVzIGluCisJCSAqIHRoZSBjdXJyZW50IHNjYW4gZGlyZWN0aW9uIChuZXZlciBhdCB0aGUgc3Rh cnQgb2YgZXF1YWwgdHVwbGVzKS4KKwkJICogU2VlIGNvbW1lbnRzIGluIF9idF9maXJzdCgpLgor CQkgKgorCQkgKiAoVGhlIHJlcXVpcmVkIGVxdWFsaXR5IHF1YWxzIGlzc3VlIGFsc28gaGFzIHNw ZWNpZmljIGltcGxpY2F0aW9ucworCQkgKiBmb3Igc2NhbnMgdGhhdCB1c2UgYXJyYXlzLiAgVGhl eSBzb21ldGltZXMgcGVyZm9ybSBhIGxpbmVhciBzZWFyY2gKKwkJICogb2YgcmVtYWluaW5nIHVu c2Nhbm5lZCB0dXBsZXMsIGZvcmNpbmcgdGhlIHByaW1pdGl2ZSBpbmRleCBzY2FuIHRvCisJCSAq IGNvbnRpbnVlIHVudGlsIGl0IGxvY2F0ZXMgdHVwbGVzID49IHRoZSBzY2FuJ3MgbmV3IGFycmF5 IGtleXMuKQogCQkgKi8KLQkJaWYgKCFyZXF1aXJlZE9wcG9zaXRlRGlyKQorCQlpZiAoIXJlcXVp cmVkT3Bwb3NpdGVEaXJPbmx5IHx8IHNvLT5udW1BcnJheUtleXMpCiAJCXsKIAkJCXRlc3QgPSBG dW5jdGlvbkNhbGwyQ29sbCgma2V5LT5za19mdW5jLCBrZXktPnNrX2NvbGxhdGlvbiwKIAkJCQkJ CQkJCSBkYXR1bSwga2V5LT5za19hcmd1bWVudCk7CkBAIC0xNTQ0LDE1ICszMDg5LDI1IEBAIF9i dF9jaGVja2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuLCBJbmRleFR1cGxlIHR1cGxlLCBpbnQgdHVw bmF0dHMsCiAJCQkgKiBUdXBsZSBmYWlscyB0aGlzIHF1YWwuICBJZiBpdCdzIGEgcmVxdWlyZWQg cXVhbCBmb3IgdGhlIGN1cnJlbnQKIAkJCSAqIHNjYW4gZGlyZWN0aW9uLCB0aGVuIHdlIGNhbiBj b25jbHVkZSBubyBmdXJ0aGVyIHR1cGxlcyB3aWxsCiAJCQkgKiBwYXNzLCBlaXRoZXIuCi0JCQkg KgotCQkJICogTm90ZTogYmVjYXVzZSB3ZSBzdG9wIHRoZSBzY2FuIGFzIHNvb24gYXMgYW55IHJl cXVpcmVkIGVxdWFsaXR5Ci0JCQkgKiBxdWFsIGZhaWxzLCBpdCBpcyBjcml0aWNhbCB0aGF0IGVx dWFsaXR5IHF1YWxzIGJlIHVzZWQgZm9yIHRoZQotCQkJICogaW5pdGlhbCBwb3NpdGlvbmluZyBp biBfYnRfZmlyc3QoKSB3aGVuIHRoZXkgYXJlIGF2YWlsYWJsZS4gU2VlCi0JCQkgKiBjb21tZW50 cyBpbiBfYnRfZmlyc3QoKS4KIAkJCSAqLwogCQkJaWYgKHJlcXVpcmVkU2FtZURpcikKIAkJCQkq Y29udGludWVzY2FuID0gZmFsc2U7CiAKKwkJCS8qCisJCQkgKiBBbHdheXMgc2V0IGNvbnRpbnVl c2Nhbj1mYWxzZSBmb3IgZXF1YWxpdHktdHlwZSBhcnJheSBrZXlzIHRoYXQKKwkJCSAqIGRvbid0 IHBhc3MgLS0gZXZlbiBmb3IgYW4gYXJyYXkgc2NhbiBrZXkgbm90IG1hcmtlZCByZXF1aXJlZC4K KwkJCSAqCisJCQkgKiBBIG5vbi1yZXF1aXJlZCBzY2FuIGtleSAoYXJyYXkgb3Igb3RoZXJ3aXNl KSBjYW4gbmV2ZXIgYWN0dWFsbHkKKwkJCSAqIHRlcm1pbmF0ZSB0aGUgc2Nhbi4gIEl0J3MganVz dCBjb252ZW5pZW50IGZvciBjYWxsZXJzIHRvIHRyZWF0CisJCQkgKiBjb250aW51ZXNjYW49ZmFs c2UgYXMgYSBzaWduYWwgdGhhdCBpdCBtaWdodCBiZSB0aW1lIHRvIGFkdmFuY2UKKwkJCSAqIHRo ZSBhcnJheSBrZXlzLCBpbmRlcGVuZGVudCBvZiB3aGV0aGVyIHRoZXkncmUgcmVxdWlyZWQgb3Ig bm90LgorCQkJICogKEV2ZW4gc2V0dGluZyBjb250aW51ZXNjYW49ZmFsc2Ugd2l0aCBhIHJlcXVp cmVkIHNjYW4ga2V5IHdvbid0CisJCQkgKiB1c3VhbGx5IGVuZCBhIHNjYW4gdGhhdCB1c2VzIGFy cmF5cy4pCisJCQkgKi8KKwkJCWlmICgoa2V5LT5za19mbGFncyAmIFNLX1NFQVJDSEFSUkFZKSAm JgorCQkJCWtleS0+c2tfc3RyYXRlZ3kgPT0gQlRFcXVhbFN0cmF0ZWd5TnVtYmVyKQorCQkJCSpj b250aW51ZXNjYW4gPSBmYWxzZTsKKwogCQkJLyoKIAkJCSAqIEluIGFueSBjYXNlLCB0aGlzIGlu ZGV4dHVwbGUgZG9lc24ndCBtYXRjaCB0aGUgcXVhbC4KIAkJCSAqLwpAQCAtMTU3MSw3ICszMTI2 LDcgQEAgX2J0X2NoZWNra2V5cyhJbmRleFNjYW5EZXNjIHNjYW4sIEluZGV4VHVwbGUgdHVwbGUs IGludCB0dXBuYXR0cywKICAqIGl0J3Mgbm90IHBvc3NpYmxlIGZvciBhbnkgZnV0dXJlIHR1cGxl cyBpbiB0aGUgY3VycmVudCBzY2FuIGRpcmVjdGlvbgogICogdG8gcGFzcyB0aGUgcXVhbC4KICAq Ci0gKiBUaGlzIGlzIGEgc3Vicm91dGluZSBmb3IgX2J0X2NoZWNra2V5cywgd2hpY2ggc2VlIGZv ciBtb3JlIGluZm8uCisgKiBUaGlzIGlzIGEgc3Vicm91dGluZSBmb3IgX2J0X2NoZWNra2V5cy9f YnRfY2hlY2tfY29tcGFyZS4KICAqLwogc3RhdGljIGJvb2wKIF9idF9jaGVja19yb3djb21wYXJl KFNjYW5LZXkgc2tleSwgSW5kZXhUdXBsZSB0dXBsZSwgaW50IHR1cG5hdHRzLApkaWZmIC0tZ2l0 IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYyBiL3NyYy9iYWNrZW5kL29w dGltaXplci9wYXRoL2luZHhwYXRoLmMKaW5kZXggMDNhNWZiZGM2Li5lMzc1OTdjMjYgMTAwNjQ0 Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2luZHhwYXRoLmMKKysrIGIvc3JjL2Jh Y2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYwpAQCAtMTA2LDggKzEwNiw3IEBAIHN0YXRp YyBMaXN0ICpidWlsZF9pbmRleF9wYXRocyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAq cmVsLAogCQkJCQkJCSAgIEluZGV4T3B0SW5mbyAqaW5kZXgsIEluZGV4Q2xhdXNlU2V0ICpjbGF1 c2VzLAogCQkJCQkJCSAgIGJvb2wgdXNlZnVsX3ByZWRpY2F0ZSwKIAkJCQkJCQkgICBTY2FuVHlw ZUNvbnRyb2wgc2NhbnR5cGUsCi0JCQkJCQkJICAgYm9vbCAqc2tpcF9ub25uYXRpdmVfc2FvcCwK LQkJCQkJCQkgICBib29sICpza2lwX2xvd2VyX3Nhb3ApOworCQkJCQkJCSAgIGJvb2wgKnNraXBf bm9ubmF0aXZlX3Nhb3ApOwogc3RhdGljIExpc3QgKmJ1aWxkX3BhdGhzX2Zvcl9PUihQbGFubmVy SW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCQkJCQkJCQlMaXN0ICpjbGF1c2VzLCBMaXN0 ICpvdGhlcl9jbGF1c2VzKTsKIHN0YXRpYyBMaXN0ICpnZW5lcmF0ZV9iaXRtYXBfb3JfcGF0aHMo UGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKQEAgLTcwNiw4ICs3MDUsNiBAQCBl Y2xhc3NfYWxyZWFkeV91c2VkKEVxdWl2YWxlbmNlQ2xhc3MgKnBhcmVudF9lYywgUmVsaWRzIG9s ZHJlbGlkcywKICAqIGluZGV4IEFNIHN1cHBvcnRzIHRoZW0gbmF0aXZlbHksIHdlIHNob3VsZCBq dXN0IGluY2x1ZGUgdGhlbSBpbiBzaW1wbGUKICAqIGluZGV4IHBhdGhzLiAgSWYgbm90LCB3ZSBz aG91bGQgZXhjbHVkZSB0aGVtIHdoaWxlIGJ1aWxkaW5nIHNpbXBsZSBpbmRleAogICogcGF0aHMs IGFuZCB0aGVuIG1ha2UgYSBzZXBhcmF0ZSBhdHRlbXB0IHRvIGluY2x1ZGUgdGhlbSBpbiBiaXRt YXAgcGF0aHMuCi0gKiBGdXJ0aGVybW9yZSwgd2Ugc2hvdWxkIGNvbnNpZGVyIGV4Y2x1ZGluZyBs b3dlci1vcmRlciBTY2FsYXJBcnJheU9wRXhwcgotICogcXVhbHMgc28gYXMgdG8gY3JlYXRlIG9y ZGVyZWQgcGF0aHMuCiAgKi8KIHN0YXRpYyB2b2lkCiBnZXRfaW5kZXhfcGF0aHMoUGxhbm5lcklu Zm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKQEAgLTcxNiwzNyArNzEzLDE3IEBAIGdldF9pbmRl eF9wYXRocyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogewogCUxpc3QJICAg KmluZGV4cGF0aHM7CiAJYm9vbAkJc2tpcF9ub25uYXRpdmVfc2FvcCA9IGZhbHNlOwotCWJvb2wJ CXNraXBfbG93ZXJfc2FvcCA9IGZhbHNlOwogCUxpc3RDZWxsICAgKmxjOwogCiAJLyoKIAkgKiBC dWlsZCBzaW1wbGUgaW5kZXggcGF0aHMgdXNpbmcgdGhlIGNsYXVzZXMuICBBbGxvdyBTY2FsYXJB cnJheU9wRXhwcgotCSAqIGNsYXVzZXMgb25seSBpZiB0aGUgaW5kZXggQU0gc3VwcG9ydHMgdGhl bSBuYXRpdmVseSwgYW5kIHNraXAgYW55IHN1Y2gKLQkgKiBjbGF1c2VzIGZvciBpbmRleCBjb2x1 bW5zIGFmdGVyIHRoZSBmaXJzdCAoc28gdGhhdCB3ZSBwcm9kdWNlIG9yZGVyZWQKLQkgKiBwYXRo cyBpZiBwb3NzaWJsZSkuCisJICogY2xhdXNlcyBvbmx5IGlmIHRoZSBpbmRleCBBTSBzdXBwb3J0 cyB0aGVtIG5hdGl2ZWx5LgogCSAqLwogCWluZGV4cGF0aHMgPSBidWlsZF9pbmRleF9wYXRocyhy b290LCByZWwsCiAJCQkJCQkJCSAgIGluZGV4LCBjbGF1c2VzLAogCQkJCQkJCQkgICBpbmRleC0+ cHJlZE9LLAogCQkJCQkJCQkgICBTVF9BTllTQ0FOLAotCQkJCQkJCQkgICAmc2tpcF9ub25uYXRp dmVfc2FvcCwKLQkJCQkJCQkJICAgJnNraXBfbG93ZXJfc2FvcCk7Ci0KLQkvKgotCSAqIElmIHdl IHNraXBwZWQgYW55IGxvd2VyLW9yZGVyIFNjYWxhckFycmF5T3BFeHBycyBvbiBhbiBpbmRleCB3 aXRoIGFuIEFNCi0JICogdGhhdCBzdXBwb3J0cyB0aGVtLCB0aGVuIHRyeSBhZ2FpbiBpbmNsdWRp bmcgdGhvc2UgY2xhdXNlcy4gIFRoaXMgd2lsbAotCSAqIHByb2R1Y2UgcGF0aHMgd2l0aCBtb3Jl IHNlbGVjdGl2aXR5IGJ1dCBubyBvcmRlcmluZy4KLQkgKi8KLQlpZiAoc2tpcF9sb3dlcl9zYW9w KQotCXsKLQkJaW5kZXhwYXRocyA9IGxpc3RfY29uY2F0KGluZGV4cGF0aHMsCi0JCQkJCQkJCSBi dWlsZF9pbmRleF9wYXRocyhyb290LCByZWwsCi0JCQkJCQkJCQkJCQkgICBpbmRleCwgY2xhdXNl cywKLQkJCQkJCQkJCQkJCSAgIGluZGV4LT5wcmVkT0ssCi0JCQkJCQkJCQkJCQkgICBTVF9BTllT Q0FOLAotCQkJCQkJCQkJCQkJICAgJnNraXBfbm9ubmF0aXZlX3Nhb3AsCi0JCQkJCQkJCQkJCQkg ICBOVUxMKSk7Ci0JfQorCQkJCQkJCQkgICAmc2tpcF9ub25uYXRpdmVfc2FvcCk7CiAKIAkvKgog CSAqIFN1Ym1pdCBhbGwgdGhlIG9uZXMgdGhhdCBjYW4gZm9ybSBwbGFpbiBJbmRleFNjYW4gcGxh bnMgdG8gYWRkX3BhdGguIChBCkBAIC03ODQsNyArNzYxLDYgQEAgZ2V0X2luZGV4X3BhdGhzKFBs YW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAJCQkJCQkJCQkgICBpbmRleCwgY2xh dXNlcywKIAkJCQkJCQkJCSAgIGZhbHNlLAogCQkJCQkJCQkJICAgU1RfQklUTUFQU0NBTiwKLQkJ CQkJCQkJCSAgIE5VTEwsCiAJCQkJCQkJCQkgICBOVUxMKTsKIAkJKmJpdGluZGV4cGF0aHMgPSBs aXN0X2NvbmNhdCgqYml0aW5kZXhwYXRocywgaW5kZXhwYXRocyk7CiAJfQpAQCAtODE3LDI3ICs3 OTMsMTkgQEAgZ2V0X2luZGV4X3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpy ZWwsCiAgKiB0byB0cnVlIGlmIHdlIGZvdW5kIGFueSBzdWNoIGNsYXVzZXMgKGNhbGxlciBtdXN0 IGluaXRpYWxpemUgdGhlIHZhcmlhYmxlCiAgKiB0byBmYWxzZSkuICBJZiBpdCdzIE5VTEwsIHdl IGRvIG5vdCBpZ25vcmUgU2NhbGFyQXJyYXlPcEV4cHIgY2xhdXNlcy4KICAqCi0gKiBJZiBza2lw X2xvd2VyX3Nhb3AgaXMgbm9uLU5VTEwsIHdlIGlnbm9yZSBTY2FsYXJBcnJheU9wRXhwciBjbGF1 c2VzIGZvcgotICogbm9uLWZpcnN0IGluZGV4IGNvbHVtbnMsIGFuZCB3ZSBzZXQgKnNraXBfbG93 ZXJfc2FvcCB0byB0cnVlIGlmIHdlIGZvdW5kCi0gKiBhbnkgc3VjaCBjbGF1c2VzIChjYWxsZXIg bXVzdCBpbml0aWFsaXplIHRoZSB2YXJpYWJsZSB0byBmYWxzZSkuICBJZiBpdCdzCi0gKiBOVUxM LCB3ZSBkbyBub3QgaWdub3JlIG5vbi1maXJzdCBTY2FsYXJBcnJheU9wRXhwciBjbGF1c2VzLCBi dXQgdGhleSB3aWxsCi0gKiByZXN1bHQgaW4gY29uc2lkZXJpbmcgdGhlIHNjYW4ncyBvdXRwdXQg dG8gYmUgdW5vcmRlcmVkLgotICoKICAqICdyZWwnIGlzIHRoZSBpbmRleCdzIGhlYXAgcmVsYXRp b24KICAqICdpbmRleCcgaXMgdGhlIGluZGV4IGZvciB3aGljaCB3ZSB3YW50IHRvIGdlbmVyYXRl IHBhdGhzCiAgKiAnY2xhdXNlcycgaXMgdGhlIGNvbGxlY3Rpb24gb2YgaW5kZXhhYmxlIGNsYXVz ZXMgKEluZGV4Q2xhdXNlIG5vZGVzKQogICogJ3VzZWZ1bF9wcmVkaWNhdGUnIGluZGljYXRlcyB3 aGV0aGVyIHRoZSBpbmRleCBoYXMgYSB1c2VmdWwgcHJlZGljYXRlCiAgKiAnc2NhbnR5cGUnIGlu ZGljYXRlcyB3aGV0aGVyIHdlIG5lZWQgcGxhaW4gb3IgYml0bWFwIHNjYW4gc3VwcG9ydAogICog J3NraXBfbm9ubmF0aXZlX3Nhb3AnIGluZGljYXRlcyB3aGV0aGVyIHRvIGFjY2VwdCBTQU9QIGlm IGluZGV4IEFNIGRvZXNuJ3QKLSAqICdza2lwX2xvd2VyX3Nhb3AnIGluZGljYXRlcyB3aGV0aGVy IHRvIGFjY2VwdCBub24tZmlyc3QtY29sdW1uIFNBT1AKICAqLwogc3RhdGljIExpc3QgKgogYnVp bGRfaW5kZXhfcGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJCQkg IEluZGV4T3B0SW5mbyAqaW5kZXgsIEluZGV4Q2xhdXNlU2V0ICpjbGF1c2VzLAogCQkJCSAgYm9v bCB1c2VmdWxfcHJlZGljYXRlLAogCQkJCSAgU2NhblR5cGVDb250cm9sIHNjYW50eXBlLAotCQkJ CSAgYm9vbCAqc2tpcF9ub25uYXRpdmVfc2FvcCwKLQkJCQkgIGJvb2wgKnNraXBfbG93ZXJfc2Fv cCkKKwkJCQkgIGJvb2wgKnNraXBfbm9ubmF0aXZlX3Nhb3ApCiB7CiAJTGlzdAkgICAqcmVzdWx0 ID0gTklMOwogCUluZGV4UGF0aCAgKmlwYXRoOwpAQCAtODQ4LDcgKzgxNiw2IEBAIGJ1aWxkX2lu ZGV4X3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAJTGlzdAkgICAq b3JkZXJieWNsYXVzZWNvbHM7CiAJTGlzdAkgICAqaW5kZXhfcGF0aGtleXM7CiAJTGlzdAkgICAq dXNlZnVsX3BhdGhrZXlzOwotCWJvb2wJCWZvdW5kX2xvd2VyX3Nhb3BfY2xhdXNlOwogCWJvb2wJ CXBhdGhrZXlzX3Bvc3NpYmx5X3VzZWZ1bDsKIAlib29sCQlpbmRleF9pc19vcmRlcmVkOwogCWJv b2wJCWluZGV4X29ubHlfc2NhbjsKQEAgLTg4MCwxOSArODQ3LDExIEBAIGJ1aWxkX2luZGV4X3Bh dGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAJICogb24gYnkgYnRyZWUg YW5kIHBvc3NpYmx5IG90aGVyIHBsYWNlcy4pICBUaGUgbGlzdCBjYW4gYmUgZW1wdHksIGlmIHRo ZQogCSAqIGluZGV4IEFNIGFsbG93cyB0aGF0LgogCSAqCi0JICogZm91bmRfbG93ZXJfc2FvcF9j bGF1c2UgaXMgc2V0IHRydWUgaWYgd2UgYWNjZXB0IGEgU2NhbGFyQXJyYXlPcEV4cHIKLQkgKiBp bmRleCBjbGF1c2UgZm9yIGEgbm9uLWZpcnN0IGluZGV4IGNvbHVtbi4gIFRoaXMgcHJldmVudHMg dXMgZnJvbQotCSAqIGFzc3VtaW5nIHRoYXQgdGhlIHNjYW4gcmVzdWx0IGlzIG9yZGVyZWQuICAo QWN0dWFsbHksIHRoZSByZXN1bHQgaXMKLQkgKiBzdGlsbCBvcmRlcmVkIGlmIHRoZXJlIGFyZSBl cXVhbGl0eSBjb25zdHJhaW50cyBmb3IgYWxsIGVhcmxpZXIKLQkgKiBjb2x1bW5zLCBidXQgaXQg c2VlbXMgdG9vIGV4cGVuc2l2ZSBhbmQgbm9uLW1vZHVsYXIgZm9yIHRoaXMgY29kZSB0byBiZQot CSAqIGF3YXJlIG9mIHRoYXQgcmVmaW5lbWVudC4pCi0JICoKIAkgKiBXZSBhbHNvIGJ1aWxkIGEg UmVsaWRzIHNldCBzaG93aW5nIHdoaWNoIG91dGVyIHJlbHMgYXJlIHJlcXVpcmVkIGJ5IHRoZQog CSAqIHNlbGVjdGVkIGNsYXVzZXMuICBBbnkgbGF0ZXJhbF9yZWxpZHMgYXJlIGluY2x1ZGVkIGlu IHRoYXQsIGJ1dCBub3QKIAkgKiBvdGhlcndpc2UgYWNjb3VudGVkIGZvci4KIAkgKi8KIAlpbmRl eF9jbGF1c2VzID0gTklMOwotCWZvdW5kX2xvd2VyX3Nhb3BfY2xhdXNlID0gZmFsc2U7CiAJb3V0 ZXJfcmVsaWRzID0gYm1zX2NvcHkocmVsLT5sYXRlcmFsX3JlbGlkcyk7CiAJZm9yIChpbmRleGNv bCA9IDA7IGluZGV4Y29sIDwgaW5kZXgtPm5rZXljb2x1bW5zOyBpbmRleGNvbCsrKQogCXsKQEAg LTkwMywzMCArODYyLDIwIEBAIGJ1aWxkX2luZGV4X3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBS ZWxPcHRJbmZvICpyZWwsCiAJCQlJbmRleENsYXVzZSAqaWNsYXVzZSA9IChJbmRleENsYXVzZSAq KSBsZmlyc3QobGMpOwogCQkJUmVzdHJpY3RJbmZvICpyaW5mbyA9IGljbGF1c2UtPnJpbmZvOwog Ci0JCQkvKiBXZSBtaWdodCBuZWVkIHRvIG9taXQgU2NhbGFyQXJyYXlPcEV4cHIgY2xhdXNlcyAq LwotCQkJaWYgKElzQShyaW5mby0+Y2xhdXNlLCBTY2FsYXJBcnJheU9wRXhwcikpCisJCQkvKgor CQkJICogV2UgbWlnaHQgbmVlZCB0byBvbWl0IFNjYWxhckFycmF5T3BFeHByIGNsYXVzZXMgd2hl biBpbmRleCBBTQorCQkJICogbGFja3MgbmF0aXZlIHN1cHBvcnQKKwkJCSAqLworCQkJaWYgKCFp bmRleC0+YW1zZWFyY2hhcnJheSAmJiBJc0EocmluZm8tPmNsYXVzZSwgU2NhbGFyQXJyYXlPcEV4 cHIpKQogCQkJewotCQkJCWlmICghaW5kZXgtPmFtc2VhcmNoYXJyYXkpCisJCQkJaWYgKHNraXBf bm9ubmF0aXZlX3Nhb3ApCiAJCQkJewotCQkJCQlpZiAoc2tpcF9ub25uYXRpdmVfc2FvcCkKLQkJ CQkJewotCQkJCQkJLyogSWdub3JlIGJlY2F1c2Ugbm90IHN1cHBvcnRlZCBieSBpbmRleCAqLwot CQkJCQkJKnNraXBfbm9ubmF0aXZlX3Nhb3AgPSB0cnVlOwotCQkJCQkJY29udGludWU7Ci0JCQkJ CX0KLQkJCQkJLyogQ2FsbGVyIGhhZCBiZXR0ZXIgaW50ZW5kIHRoaXMgb25seSBmb3IgYml0bWFw IHNjYW4gKi8KLQkJCQkJQXNzZXJ0KHNjYW50eXBlID09IFNUX0JJVE1BUFNDQU4pOwotCQkJCX0K LQkJCQlpZiAoaW5kZXhjb2wgPiAwKQotCQkJCXsKLQkJCQkJaWYgKHNraXBfbG93ZXJfc2FvcCkK LQkJCQkJewotCQkJCQkJLyogQ2FsbGVyIGRvZXNuJ3Qgd2FudCB0byBsb3NlIGluZGV4IG9yZGVy aW5nICovCi0JCQkJCQkqc2tpcF9sb3dlcl9zYW9wID0gdHJ1ZTsKLQkJCQkJCWNvbnRpbnVlOwot CQkJCQl9Ci0JCQkJCWZvdW5kX2xvd2VyX3Nhb3BfY2xhdXNlID0gdHJ1ZTsKKwkJCQkJLyogSWdu b3JlIGJlY2F1c2Ugbm90IHN1cHBvcnRlZCBieSBpbmRleCAqLworCQkJCQkqc2tpcF9ub25uYXRp dmVfc2FvcCA9IHRydWU7CisJCQkJCWNvbnRpbnVlOwogCQkJCX0KKwkJCQkvKiBDYWxsZXIgaGFk IGJldHRlciBpbnRlbmQgdGhpcyBvbmx5IGZvciBiaXRtYXAgc2NhbiAqLworCQkJCUFzc2VydChz Y2FudHlwZSA9PSBTVF9CSVRNQVBTQ0FOKTsKIAkJCX0KIAogCQkJLyogT0sgdG8gaW5jbHVkZSB0 aGlzIGNsYXVzZSAqLwpAQCAtOTU2LDExICs5MDUsOSBAQCBidWlsZF9pbmRleF9wYXRocyhQbGFu bmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCS8qCiAJICogMi4gQ29tcHV0ZSBwYXRo a2V5cyBkZXNjcmliaW5nIGluZGV4J3Mgb3JkZXJpbmcsIGlmIGFueSwgdGhlbiBzZWUgaG93CiAJ ICogbWFueSBvZiB0aGVtIGFyZSBhY3R1YWxseSB1c2VmdWwgZm9yIHRoaXMgcXVlcnkuICBUaGlz IGlzIG5vdCByZWxldmFudAotCSAqIGlmIHdlIGFyZSBvbmx5IHRyeWluZyB0byBidWlsZCBiaXRt YXAgaW5kZXhzY2Fucywgbm9yIGlmIHdlIGhhdmUgdG8KLQkgKiBhc3N1bWUgdGhlIHNjYW4gaXMg dW5vcmRlcmVkLgorCSAqIGlmIHdlIGFyZSBvbmx5IHRyeWluZyB0byBidWlsZCBiaXRtYXAgaW5k ZXhzY2Fucy4KIAkgKi8KIAlwYXRoa2V5c19wb3NzaWJseV91c2VmdWwgPSAoc2NhbnR5cGUgIT0g U1RfQklUTUFQU0NBTiAmJgotCQkJCQkJCQkhZm91bmRfbG93ZXJfc2FvcF9jbGF1c2UgJiYKIAkJ CQkJCQkJaGFzX3VzZWZ1bF9wYXRoa2V5cyhyb290LCByZWwpKTsKIAlpbmRleF9pc19vcmRlcmVk ID0gKGluZGV4LT5zb3J0b3BmYW1pbHkgIT0gTlVMTCk7CiAJaWYgKGluZGV4X2lzX29yZGVyZWQg JiYgcGF0aGtleXNfcG9zc2libHlfdXNlZnVsKQpAQCAtMTIxMiw3ICsxMTU5LDYgQEAgYnVpbGRf cGF0aHNfZm9yX09SKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAJCQkJCQkJ CQkgICBpbmRleCwgJmNsYXVzZXNldCwKIAkJCQkJCQkJCSAgIHVzZWZ1bF9wcmVkaWNhdGUsCiAJ CQkJCQkJCQkgICBTVF9CSVRNQVBTQ0FOLAotCQkJCQkJCQkJICAgTlVMTCwKIAkJCQkJCQkJCSAg IE5VTEwpOwogCQlyZXN1bHQgPSBsaXN0X2NvbmNhdChyZXN1bHQsIGluZGV4cGF0aHMpOwogCX0K ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jIGIvc3JjL2JhY2tl bmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMKaW5kZXggMzVjOWUzYzg2Li4yYjYyMmI3YTUgMTAwNjQ0 Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jCisrKyBiL3NyYy9iYWNrZW5k L3V0aWxzL2FkdC9zZWxmdW5jcy5jCkBAIC02NTEyLDggKzY1MTIsNiBAQCBnZW5lcmljY29zdGVz dGltYXRlKFBsYW5uZXJJbmZvICpyb290LAogCWRvdWJsZQkJbnVtSW5kZXhUdXBsZXM7CiAJZG91 YmxlCQlzcGNfcmFuZG9tX3BhZ2VfY29zdDsKIAlkb3VibGUJCW51bV9zYV9zY2FuczsKLQlkb3Vi bGUJCW51bV9vdXRlcl9zY2FuczsKLQlkb3VibGUJCW51bV9zY2FuczsKIAlkb3VibGUJCXF1YWxf b3BfY29zdDsKIAlkb3VibGUJCXF1YWxfYXJnX2Nvc3Q7CiAJTGlzdAkgICAqc2VsZWN0aXZpdHlR dWFsczsKQEAgLTY1MjgsNyArNjUyNiw3IEBAIGdlbmVyaWNjb3N0ZXN0aW1hdGUoUGxhbm5lcklu Zm8gKnJvb3QsCiAKIAkvKgogCSAqIENoZWNrIGZvciBTY2FsYXJBcnJheU9wRXhwciBpbmRleCBx dWFscywgYW5kIGVzdGltYXRlIHRoZSBudW1iZXIgb2YKLQkgKiBpbmRleCBzY2FucyB0aGF0IHdp bGwgYmUgcGVyZm9ybWVkLgorCSAqIHByaW1pdGl2ZSBpbmRleCBzY2FucyB0aGF0IHdpbGwgYmUg cGVyZm9ybWVkIGZvciBjYWxsZXIKIAkgKi8KIAludW1fc2Ffc2NhbnMgPSAxOwogCWZvcmVhY2go bCwgaW5kZXhRdWFscykKQEAgLTY1NTgsMTkgKzY1NTYsOCBAQCBnZW5lcmljY29zdGVzdGltYXRl KFBsYW5uZXJJbmZvICpyb290LAogCSAqLwogCW51bUluZGV4VHVwbGVzID0gY29zdHMtPm51bUlu ZGV4VHVwbGVzOwogCWlmIChudW1JbmRleFR1cGxlcyA8PSAwLjApCi0JewogCQludW1JbmRleFR1 cGxlcyA9IGluZGV4U2VsZWN0aXZpdHkgKiBpbmRleC0+cmVsLT50dXBsZXM7CiAKLQkJLyoKLQkJ ICogVGhlIGFib3ZlIGNhbGN1bGF0aW9uIGNvdW50cyBhbGwgdGhlIHR1cGxlcyB2aXNpdGVkIGFj cm9zcyBhbGwKLQkJICogc2NhbnMgaW5kdWNlZCBieSBTY2FsYXJBcnJheU9wRXhwciBub2Rlcy4g IFdlIHdhbnQgdG8gY29uc2lkZXIgdGhlCi0JCSAqIGF2ZXJhZ2UgcGVyLWluZGV4c2NhbiBudW1i ZXIsIHNvIGFkanVzdC4gIFRoaXMgaXMgYSBoYW5keSBwbGFjZSB0bwotCQkgKiByb3VuZCB0byBp bnRlZ2VyLCB0b28uICAoSWYgY2FsbGVyIHN1cHBsaWVkIHR1cGxlIGVzdGltYXRlLCBpdCdzCi0J CSAqIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyB0aGVzZSBjb25zaWRlcmF0aW9ucy4pCi0JCSAq LwotCQludW1JbmRleFR1cGxlcyA9IHJpbnQobnVtSW5kZXhUdXBsZXMgLyBudW1fc2Ffc2NhbnMp OwotCX0KLQogCS8qCiAJICogV2UgY2FuIGJvdW5kIHRoZSBudW1iZXIgb2YgdHVwbGVzIGJ5IHRo ZSBpbmRleCBzaXplIGluIGFueSBjYXNlLiBBbHNvLAogCSAqIGFsd2F5cyBlc3RpbWF0ZSBhdCBs ZWFzdCBvbmUgdHVwbGUgaXMgdG91Y2hlZCwgZXZlbiB3aGVuCkBAIC02NjA4LDI3ICs2NTk1LDMx IEBAIGdlbmVyaWNjb3N0ZXN0aW1hdGUoUGxhbm5lckluZm8gKnJvb3QsCiAJICoKIAkgKiBUaGUg YWJvdmUgY2FsY3VsYXRpb25zIGFyZSBhbGwgcGVyLWluZGV4LXNjYW4uICBIb3dldmVyLCBpZiB3 ZSBhcmUgaW4gYQogCSAqIG5lc3Rsb29wIGlubmVyIHNjYW4sIHdlIGNhbiBleHBlY3QgdGhlIHNj YW4gdG8gYmUgcmVwZWF0ZWQgKHdpdGgKLQkgKiBkaWZmZXJlbnQgc2VhcmNoIGtleXMpIGZvciBl YWNoIHJvdyBvZiB0aGUgb3V0ZXIgcmVsYXRpb24uICBMaWtld2lzZSwKLQkgKiBTY2FsYXJBcnJh eU9wRXhwciBxdWFscyByZXN1bHQgaW4gbXVsdGlwbGUgaW5kZXggc2NhbnMuICBUaGlzIGNyZWF0 ZXMKLQkgKiB0aGUgcG90ZW50aWFsIGZvciBjYWNoZSBlZmZlY3RzIHRvIHJlZHVjZSB0aGUgbnVt YmVyIG9mIGRpc2sgcGFnZQotCSAqIGZldGNoZXMgbmVlZGVkLiAgV2Ugd2FudCB0byBlc3RpbWF0 ZSB0aGUgYXZlcmFnZSBwZXItc2NhbiBJL08gY29zdCBpbgotCSAqIHRoZSBwcmVzZW5jZSBvZiBj YWNoaW5nLgorCSAqIGRpZmZlcmVudCBzZWFyY2gga2V5cykgZm9yIGVhY2ggcm93IG9mIHRoZSBv dXRlciByZWxhdGlvbi4gIFRoaXMKKwkgKiBjcmVhdGVzIHRoZSBwb3RlbnRpYWwgZm9yIGNhY2hl IGVmZmVjdHMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgZGlzaworCSAqIHBhZ2UgZmV0Y2hlcyBu ZWVkZWQuICBXZSB3YW50IHRvIGVzdGltYXRlIHRoZSBhdmVyYWdlIHBlci1zY2FuIEkvTyBjb3N0 CisJICogaW4gdGhlIHByZXNlbmNlIG9mIGNhY2hpbmcuCiAJICoKIAkgKiBXZSB1c2UgdGhlIE1h Y2tlcnQtTG9obWFuIGZvcm11bGEgKHNlZSBjb3N0c2l6ZS5jIGZvciBkZXRhaWxzKSB0bwogCSAq IGVzdGltYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZSBmZXRjaGVzIHRoYXQgb2NjdXIuICBX aGlsZSB0aGlzCiAJICogd2Fzbid0IHdoYXQgaXQgd2FzIGRlc2lnbmVkIGZvciwgaXQgc2VlbXMg YSByZWFzb25hYmxlIG1vZGVsIGFueXdheS4KIAkgKiBOb3RlIHRoYXQgd2UgYXJlIGNvdW50aW5n IHBhZ2VzIG5vdCB0dXBsZXMgYW55bW9yZSwgc28gd2UgdGFrZSBOID0gVCA9CiAJICogaW5kZXgg c2l6ZSwgYXMgaWYgdGhlcmUgd2VyZSBvbmUgInR1cGxlIiBwZXIgcGFnZS4KKwkgKgorCSAqIE5v dGU6IHdlIGFzc3VtZSB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gcmVwZWF0IGluZGV4IHBhZ2UgZmV0 Y2hlcyBhY3Jvc3MKKwkgKiBTY2FsYXJBcnJheU9wRXhwciBwcmltaXRpdmUgc2NhbnMgZnJvbSB0 aGUgc2FtZSBsb2dpY2FsIGluZGV4IHNjYW4uCisJICogVGhpcyBpcyBndWFyYW50ZWVkIHRvIGJl IHRydWUgZm9yIGJ0cmVlIGluZGV4ZXMsIGJ1dCBpcyB2ZXJ5IG9wdGltaXN0aWMKKwkgKiB3aXRo IGluZGV4IEFNcyB0aGF0IGNhbm5vdCBuYXRpdmVseSBleGVjdXRlIFNjYWxhckFycmF5T3BFeHBy IHF1YWxzLgorCSAqIEhvd2V2ZXIsIHRoZXNlIHNhbWUgaW5kZXggQU1zIGFsc28gYWNjZXB0IG91 ciBkZWZhdWx0IHBlc3NpbWlzdGljCisJICogYXBwcm9hY2ggdG8gY291bnRpbmcgbnVtX3NhX3Nj YW5zIChidHJlZSBjYWxsZXIgY2FwcyB0aGlzKSwgc28gd2UgZG9uJ3QKKwkgKiBleHBlY3QgdGhl IGZpbmFsIGluZGV4VG90YWxDb3N0IHRvIGJlIHdpbGRseSBvdmVyLW9wdGltaXN0aWMuCiAJICov Ci0JbnVtX291dGVyX3NjYW5zID0gbG9vcF9jb3VudDsKLQludW1fc2NhbnMgPSBudW1fc2Ffc2Nh bnMgKiBudW1fb3V0ZXJfc2NhbnM7Ci0KLQlpZiAobnVtX3NjYW5zID4gMSkKKwlpZiAobG9vcF9j b3VudCA+IDEpCiAJewogCQlkb3VibGUJCXBhZ2VzX2ZldGNoZWQ7CiAKIAkJLyogdG90YWwgcGFn ZSBmZXRjaGVzIGlnbm9yaW5nIGNhY2hlIGVmZmVjdHMgKi8KLQkJcGFnZXNfZmV0Y2hlZCA9IG51 bUluZGV4UGFnZXMgKiBudW1fc2NhbnM7CisJCXBhZ2VzX2ZldGNoZWQgPSBudW1JbmRleFBhZ2Vz ICogbG9vcF9jb3VudDsKIAogCQkvKiB1c2UgTWFja2VydCBhbmQgTG9obWFuIGZvcm11bGEgdG8g YWRqdXN0IGZvciBjYWNoZSBlZmZlY3RzICovCiAJCXBhZ2VzX2ZldGNoZWQgPSBpbmRleF9wYWdl c19mZXRjaGVkKHBhZ2VzX2ZldGNoZWQsCkBAIC02NjM4LDExICs2NjI5LDkgQEAgZ2VuZXJpY2Nv c3Rlc3RpbWF0ZShQbGFubmVySW5mbyAqcm9vdCwKIAogCQkvKgogCQkgKiBOb3cgY29tcHV0ZSB0 aGUgdG90YWwgZGlzayBhY2Nlc3MgY29zdCwgYW5kIHRoZW4gcmVwb3J0IGEgcHJvLXJhdGVkCi0J CSAqIHNoYXJlIGZvciBlYWNoIG91dGVyIHNjYW4uICAoRG9uJ3QgcHJvLXJhdGUgZm9yIFNjYWxh ckFycmF5T3BFeHByLAotCQkgKiBzaW5jZSB0aGF0J3MgaW50ZXJuYWwgdG8gdGhlIGluZGV4c2Nh bi4pCisJCSAqIHNoYXJlIGZvciBlYWNoIG91dGVyIHNjYW4KIAkJICovCi0JCWluZGV4VG90YWxD b3N0ID0gKHBhZ2VzX2ZldGNoZWQgKiBzcGNfcmFuZG9tX3BhZ2VfY29zdCkKLQkJCS8gbnVtX291 dGVyX3NjYW5zOworCQlpbmRleFRvdGFsQ29zdCA9IChwYWdlc19mZXRjaGVkICogc3BjX3JhbmRv bV9wYWdlX2Nvc3QpIC8gbG9vcF9jb3VudDsKIAl9CiAJZWxzZQogCXsKQEAgLTY2NTgsMTAgKzY2 NDcsOCBAQCBnZW5lcmljY29zdGVzdGltYXRlKFBsYW5uZXJJbmZvICpyb290LAogCSAqIGV2YWx1 YXRlZCBvbmNlIGF0IHRoZSBzdGFydCBvZiB0aGUgc2NhbiB0byByZWR1Y2UgdGhlbSB0byBydW50 aW1lIGtleXMKIAkgKiB0byBwYXNzIHRvIHRoZSBpbmRleCBBTSAoc2VlIG5vZGVJbmRleHNjYW4u YykuICBXZSBtb2RlbCB0aGUgcGVyLXR1cGxlCiAJICogQ1BVIGNvc3RzIGFzIGNwdV9pbmRleF90 dXBsZV9jb3N0IHBsdXMgb25lIGNwdV9vcGVyYXRvcl9jb3N0IHBlcgotCSAqIGluZGV4cXVhbCBv cGVyYXRvci4gIEJlY2F1c2Ugd2UgaGF2ZSBudW1JbmRleFR1cGxlcyBhcyBhIHBlci1zY2FuCi0J ICogbnVtYmVyLCB3ZSBoYXZlIHRvIG11bHRpcGx5IGJ5IG51bV9zYV9zY2FucyB0byBnZXQgdGhl IGNvcnJlY3QgcmVzdWx0Ci0JICogZm9yIFNjYWxhckFycmF5T3BFeHByIGNhc2VzLiAgU2ltaWxh cmx5IGFkZCBpbiBjb3N0cyBmb3IgYW55IGluZGV4Ci0JICogT1JERVIgQlkgZXhwcmVzc2lvbnMu CisJICogaW5kZXhxdWFsIG9wZXJhdG9yLiAgU2ltaWxhcmx5IGFkZCBpbiBjb3N0cyBmb3IgYW55 IGluZGV4IE9SREVSIEJZCisJICogZXhwcmVzc2lvbnMuCiAJICoKIAkgKiBOb3RlOiB0aGlzIG5l Z2xlY3RzIHRoZSBwb3NzaWJsZSBjb3N0cyBvZiByZWNoZWNraW5nIGxvc3N5IG9wZXJhdG9ycy4K IAkgKiBEZXRlY3RpbmcgdGhhdCB0aGF0IG1pZ2h0IGJlIG5lZWRlZCBzZWVtcyBtb3JlIGV4cGVu c2l2ZSB0aGFuIGl0J3MKQEAgLTY2NzQsNyArNjY2MSw3IEBAIGdlbmVyaWNjb3N0ZXN0aW1hdGUo UGxhbm5lckluZm8gKnJvb3QsCiAKIAlpbmRleFN0YXJ0dXBDb3N0ID0gcXVhbF9hcmdfY29zdDsK IAlpbmRleFRvdGFsQ29zdCArPSBxdWFsX2FyZ19jb3N0OwotCWluZGV4VG90YWxDb3N0ICs9IG51 bUluZGV4VHVwbGVzICogbnVtX3NhX3NjYW5zICogKGNwdV9pbmRleF90dXBsZV9jb3N0ICsgcXVh bF9vcF9jb3N0KTsKKwlpbmRleFRvdGFsQ29zdCArPSBudW1JbmRleFR1cGxlcyAqIChjcHVfaW5k ZXhfdHVwbGVfY29zdCArIHF1YWxfb3BfY29zdCk7CiAKIAkvKgogCSAqIEdlbmVyaWMgYXNzdW1w dGlvbiBhYm91dCBpbmRleCBjb3JyZWxhdGlvbjogdGhlcmUgaXNuJ3QgYW55LgpAQCAtNjc1Miw3 ICs2NzM5LDYgQEAgYnRjb3N0ZXN0aW1hdGUoUGxhbm5lckluZm8gKnJvb3QsIEluZGV4UGF0aCAq cGF0aCwgZG91YmxlIGxvb3BfY291bnQsCiAJYm9vbAkJZXFRdWFsSGVyZTsKIAlib29sCQlmb3Vu ZF9zYW9wOwogCWJvb2wJCWZvdW5kX2lzX251bGxfb3A7Ci0JZG91YmxlCQludW1fc2Ffc2NhbnM7 CiAJTGlzdENlbGwgICAqbGM7CiAKIAkvKgpAQCAtNjc2NywxNyArNjc1MywxMiBAQCBidGNvc3Rl c3RpbWF0ZShQbGFubmVySW5mbyAqcm9vdCwgSW5kZXhQYXRoICpwYXRoLCBkb3VibGUgbG9vcF9j b3VudCwKIAkgKgogCSAqIEZvciBhIFJvd0NvbXBhcmVFeHByLCB3ZSBjb25zaWRlciBvbmx5IHRo ZSBmaXJzdCBjb2x1bW4sIGp1c3QgYXMKIAkgKiByb3djb21wYXJlc2VsKCkgZG9lcy4KLQkgKgot CSAqIElmIHRoZXJlJ3MgYSBTY2FsYXJBcnJheU9wRXhwciBpbiB0aGUgcXVhbHMsIHdlJ2xsIGFj dHVhbGx5IHBlcmZvcm0gTgotCSAqIGluZGV4IHNjYW5zIG5vdCBvbmUsIGJ1dCB0aGUgU2NhbGFy QXJyYXlPcEV4cHIncyBvcGVyYXRvciBjYW4gYmUKLQkgKiBjb25zaWRlcmVkIHRvIGFjdCB0aGUg c2FtZSBhcyBpdCBub3JtYWxseSBkb2VzLgogCSAqLwogCWluZGV4Qm91bmRRdWFscyA9IE5JTDsK IAlpbmRleGNvbCA9IDA7CiAJZXFRdWFsSGVyZSA9IGZhbHNlOwogCWZvdW5kX3Nhb3AgPSBmYWxz ZTsKIAlmb3VuZF9pc19udWxsX29wID0gZmFsc2U7Ci0JbnVtX3NhX3NjYW5zID0gMTsKIAlmb3Jl YWNoKGxjLCBwYXRoLT5pbmRleGNsYXVzZXMpCiAJewogCQlJbmRleENsYXVzZSAqaWNsYXVzZSA9 IGxmaXJzdF9ub2RlKEluZGV4Q2xhdXNlLCBsYyk7CkBAIC02ODE3LDE0ICs2Nzk4LDkgQEAgYnRj b3N0ZXN0aW1hdGUoUGxhbm5lckluZm8gKnJvb3QsIEluZGV4UGF0aCAqcGF0aCwgZG91YmxlIGxv b3BfY291bnQsCiAJCQllbHNlIGlmIChJc0EoY2xhdXNlLCBTY2FsYXJBcnJheU9wRXhwcikpCiAJ CQl7CiAJCQkJU2NhbGFyQXJyYXlPcEV4cHIgKnNhb3AgPSAoU2NhbGFyQXJyYXlPcEV4cHIgKikg Y2xhdXNlOwotCQkJCU5vZGUJICAgKm90aGVyX29wZXJhbmQgPSAoTm9kZSAqKSBsc2Vjb25kKHNh b3AtPmFyZ3MpOwotCQkJCWludAkJCWFsZW5ndGggPSBlc3RpbWF0ZV9hcnJheV9sZW5ndGgob3Ro ZXJfb3BlcmFuZCk7CiAKIAkJCQljbGF1c2Vfb3AgPSBzYW9wLT5vcG5vOwogCQkJCWZvdW5kX3Nh b3AgPSB0cnVlOwotCQkJCS8qIGNvdW50IG51bWJlciBvZiBTQSBzY2FucyBpbmR1Y2VkIGJ5IGlu ZGV4Qm91bmRRdWFscyBvbmx5ICovCi0JCQkJaWYgKGFsZW5ndGggPiAxKQotCQkJCQludW1fc2Ff c2NhbnMgKj0gYWxlbmd0aDsKIAkJCX0KIAkJCWVsc2UgaWYgKElzQShjbGF1c2UsIE51bGxUZXN0 KSkKIAkJCXsKQEAgLTY4ODQsMTMgKzY4NjAsNiBAQCBidGNvc3Rlc3RpbWF0ZShQbGFubmVySW5m byAqcm9vdCwgSW5kZXhQYXRoICpwYXRoLCBkb3VibGUgbG9vcF9jb3VudCwKIAkJCQkJCQkJCQkJ CSAgSk9JTl9JTk5FUiwKIAkJCQkJCQkJCQkJCSAgTlVMTCk7CiAJCW51bUluZGV4VHVwbGVzID0g YnRyZWVTZWxlY3Rpdml0eSAqIGluZGV4LT5yZWwtPnR1cGxlczsKLQotCQkvKgotCQkgKiBBcyBp biBnZW5lcmljY29zdGVzdGltYXRlKCksIHdlIGhhdmUgdG8gYWRqdXN0IGZvciBhbnkKLQkJICog U2NhbGFyQXJyYXlPcEV4cHIgcXVhbHMgaW5jbHVkZWQgaW4gaW5kZXhCb3VuZFF1YWxzLCBhbmQg dGhlbiByb3VuZAotCQkgKiB0byBpbnRlZ2VyLgotCQkgKi8KLQkJbnVtSW5kZXhUdXBsZXMgPSBy aW50KG51bUluZGV4VHVwbGVzIC8gbnVtX3NhX3NjYW5zKTsKIAl9CiAKIAkvKgpAQCAtNjkwMCw2 ICs2ODY5LDQ4IEBAIGJ0Y29zdGVzdGltYXRlKFBsYW5uZXJJbmZvICpyb290LCBJbmRleFBhdGgg KnBhdGgsIGRvdWJsZSBsb29wX2NvdW50LAogCiAJZ2VuZXJpY2Nvc3Rlc3RpbWF0ZShyb290LCBw YXRoLCBsb29wX2NvdW50LCAmY29zdHMpOwogCisJLyoKKwkgKiBOb3cgY29tcGVuc2F0ZSBmb3Ig YnRyZWUncyBhYmlsaXR5IHRvIGVmZmljaWVudGx5IGV4ZWN1dGUgc2NhbnMgd2l0aAorCSAqIFNB T1AgY2xhdXNlcy4KKwkgKgorCSAqIGJ0cmVlIGF1dG9tYXRpY2FsbHkgY29tYmluZXMgaW5kaXZp ZHVhbCBTY2FsYXJBcnJheU9wRXhwciBwcmltaXRpdmUKKwkgKiBpbmRleCBzY2FucyB3aGVuZXZl ciB0aGUgdHVwbGVzIGNvdmVyZWQgYnkgdGhlIG5leHQgc2V0IG9mIGFycmF5IGtleXMKKwkgKiBh cmUgY2xvc2UgdG8gdHVwbGVzIGNvdmVyZWQgYnkgdGhlIGN1cnJlbnQgc2V0LiAgVGhpcyBtYWtl cyB0aGUgZmluYWwKKwkgKiBudW1iZXIgb2YgZGVzY2VudHMgcGFydGljdWxhcmx5IGRpZmZpY3Vs dCB0byBlc3RpbWF0ZS4gIEhvd2V2ZXIsIGJ0cmVlCisJICogc2NhbnMgbmV2ZXIgdmlzaXQgYW55 IHNpbmdsZSBsZWFmIHBhZ2UgbW9yZSB0aGFuIG9uY2UuICBUaGF0IHB1dHMgYQorCSAqIG5hdHVy YWwgZmxvb3IgdW5kZXIgdGhlIHdvcnN0IGNhc2UgbnVtYmVyIG9mIGRlc2NlbnRzLgorCSAqCisJ ICogSXQncyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IHRoYXQgd2Ugbm90IHdpbGRseSBvdmVyZXN0 aW1hdGUgdGhlIG51bWJlcgorCSAqIG9mIGRlc2NlbnRzIG5lZWRlZCBmb3IgYSBjbGF1c2UgbGlz dCB3aXRoIHNldmVyYWwgU0FPUHMgLS0gdGhlIGNvc3RzCisJICogcmVhbGx5IGFyZW4ndCBtdWx0 aXBsaWNhdGl2ZSBpbiB0aGUgd2F5IGdlbmVyaWNjb3N0ZXN0aW1hdGUgZXhwZWN0cy4gSW4KKwkg KiBnZW5lcmFsLCBtb3N0IGRpc3RpbmN0IGNvbWJpbmF0aW9ucyBvZiBTQU9QIGtleXMgd2lsbCB0 ZW5kIHRvIG5vdCBmaW5kCisJICogYW55IG1hdGNoaW5nIHR1cGxlcy4gIEZ1cnRoZXJtb3JlLCBi dHJlZSBzY2FucyBzZWFyY2ggZm9yIHRoZSBuZXh0IHNldAorCSAqIG9mIGFycmF5IGtleXMgdXNp bmcgdGhlIG5leHQgdHVwbGUgaW4gbGluZSwgYW5kIHNvIHdvbid0IGV2ZW4gbmVlZCBhCisJICog ZGlyZWN0IGNvbXBhcmlzb24gdG8gZWxpbWluYXRlIG1vc3Qgbm9uLW1hdGNoaW5nIHNldHMgb2Yg YXJyYXkga2V5cy4KKwkgKgorCSAqIENsYW1wIHRoZSBudW1iZXIgb2YgZGVzY2VudHMgdG8gdGhl IGVzdGltYXRlZCBudW1iZXIgb2YgbGVhZiBwYWdlCisJICogdmlzaXRzLiAgVGhpcyBpcyBzdGls bCBmYWlybHkgcGVzc2ltaXN0aWMsIGJ1dCB0ZW5kcyB0byByZXN1bHQgaW4gbW9yZQorCSAqIGFj Y3VyYXRlIGNvc3Rpbmcgb2Ygc2NhbnMgd2l0aCBzZXZlcmFsIFNBT1AgY2xhdXNlcyAtLSBlc3Bl Y2lhbGx5IHdoZW4KKwkgKiBlYWNoIGFycmF5IGhhcyBtb3JlIHRoYW4gYSBmZXcgZWxlbWVudHMu ICBUaGUgY29zdCBvZiBhZGRpbmcgYWRkaXRpb25hbAorCSAqIGFycmF5IGNvbnN0YW50cyB0byBh IGxvdy1vcmRlciBTQU9QIGNvbHVtbiBzaG91bGQgc2F0dXJhdGUgcGFzdCBhCisJICogY2VydGFp biBwb2ludCAoZXhjZXB0IHdoZXJlIHNlbGVjdGl2aXR5IGVzdGltYXRlcyBjb250aW51ZSB0byBz aGlmdCkuCisJICoKKwkgKiBBbHNvIGNsYW1wIHRoZSBudW1iZXIgb2YgZGVzY2VudHMgdG8gMS8z IHRoZSBudW1iZXIgb2YgaW5kZXggcGFnZXMuCisJICogVGhpcyBhdm9pZHMgaW1wbGF1c2libHkg aGlnaCBlc3RpbWF0ZXMgd2l0aCBsb3cgc2VsZWN0aXZpdHkgcGF0aHMsCisJICogd2hlcmUgc2Nh bnMgZnJlcXVlbnRseSByZXF1aXJlIG5vIG1vcmUgdGhhbiBvbmUgb3IgdHdvIGRlc2NlbnRzLgor CSAqCisJICogWFhYIElkZWFsbHksIHdlJ2QgYWxzbyBhY2NvdW50IGZvciB0aGUgZmFjdCB0aGF0 IG5vbi1ib3VuZGFyeSBTQU9QCisJICogY2xhdXNlIHF1YWxzICh3aGljaCB0aGUgQi1UcmVlIGNv ZGUgdXNlcyAibm9uLXJlcXVpcmVkIiBzY2FuIGtleXMgZm9yKQorCSAqIHdvbid0IGFjdHVhbGx5 IGNvbnRyaWJ1dGUgdG8gdGhlIHRvdGFsIG51bWJlciBvZiBkZXNjZW50cyBvZiB0aGUgaW5kZXgu CisJICogVGhpcyB3b3VsZCByZXF1aXJlIHB1c2hpbmcgZG93biBtb3JlIGNvbnRleHQgaW50byBn ZW5lcmljY29zdGVzdGltYXRlLgorCSAqLworCWlmIChjb3N0cy5udW1fc2Ffc2NhbnMgPiAxKQor CXsKKwkJY29zdHMubnVtX3NhX3NjYW5zID0gTWluKGNvc3RzLm51bV9zYV9zY2FucywgY29zdHMu bnVtSW5kZXhQYWdlcyk7CisJCWNvc3RzLm51bV9zYV9zY2FucyA9IE1pbihjb3N0cy5udW1fc2Ff c2NhbnMsIGluZGV4LT5wYWdlcyAvIDMpOworCQljb3N0cy5udW1fc2Ffc2NhbnMgPSBNYXgoY29z dHMubnVtX3NhX3NjYW5zLCAxKTsKKwl9CisKIAkvKgogCSAqIEFkZCBhIENQVS1jb3N0IGNvbXBv bmVudCB0byByZXByZXNlbnQgdGhlIGNvc3RzIG9mIGluaXRpYWwgYnRyZWUKIAkgKiBkZXNjZW50 LiAgV2UgZG9uJ3QgY2hhcmdlIGFueSBJL08gY29zdCBmb3IgdG91Y2hpbmcgdXBwZXIgYnRyZWUg bGV2ZWxzLApAQCAtNjkwNyw5ICs2OTE4LDkgQEAgYnRjb3N0ZXN0aW1hdGUoUGxhbm5lckluZm8g KnJvb3QsIEluZGV4UGF0aCAqcGF0aCwgZG91YmxlIGxvb3BfY291bnQsCiAJICogY29tcGFyaXNv bnMgdG8gZGVzY2VuZCBhIGJ0cmVlIG9mIE4gbGVhZiB0dXBsZXMuICBXZSBjaGFyZ2Ugb25lCiAJ ICogY3B1X29wZXJhdG9yX2Nvc3QgcGVyIGNvbXBhcmlzb24uCiAJICoKLQkgKiBJZiB0aGVyZSBh cmUgU2NhbGFyQXJyYXlPcEV4cHJzLCBjaGFyZ2UgdGhpcyBvbmNlIHBlciBTQSBzY2FuLiAgVGhl Ci0JICogb25lcyBhZnRlciB0aGUgZmlyc3Qgb25lIGFyZSBub3Qgc3RhcnR1cCBjb3N0IHNvIGZh ciBhcyB0aGUgb3ZlcmFsbAotCSAqIHBsYW4gaXMgY29uY2VybmVkLCBzbyBhZGQgdGhlbSBvbmx5 IHRvICJ0b3RhbCIgY29zdC4KKwkgKiBJZiB0aGVyZSBhcmUgU2NhbGFyQXJyYXlPcEV4cHJzLCBj aGFyZ2UgdGhpcyBvbmNlIHBlciBlc3RpbWF0ZWQKKwkgKiBwcmltaXRpdmUgU0Egc2Nhbi4gIFRo ZSBvbmVzIGFmdGVyIHRoZSBmaXJzdCBvbmUgYXJlIG5vdCBzdGFydHVwIGNvc3QKKwkgKiBzbyBm YXIgYXMgdGhlIG92ZXJhbGwgcGxhbiBnb2VzLCBzbyBqdXN0IGFkZCB0aGVtIHRvICJ0b3RhbCIg Y29zdC4KIAkgKi8KIAlpZiAoaW5kZXgtPnR1cGxlcyA+IDEpCQkvKiBhdm9pZCBjb21wdXRpbmcg bG9nKDApICovCiAJewpAQCAtNjkyNiw3ICs2OTM3LDggQEAgYnRjb3N0ZXN0aW1hdGUoUGxhbm5l ckluZm8gKnJvb3QsIEluZGV4UGF0aCAqcGF0aCwgZG91YmxlIGxvb3BfY291bnQsCiAJICogaW4g Y2FzZXMgd2hlcmUgb25seSBhIHNpbmdsZSBsZWFmIHBhZ2UgaXMgZXhwZWN0ZWQgdG8gYmUgdmlz aXRlZC4gIFRoaXMKIAkgKiBjb3N0IGlzIHNvbWV3aGF0IGFyYml0cmFyaWx5IHNldCBhdCA1MHgg Y3B1X29wZXJhdG9yX2Nvc3QgcGVyIHBhZ2UKIAkgKiB0b3VjaGVkLiAgVGhlIG51bWJlciBvZiBz dWNoIHBhZ2VzIGlzIGJ0cmVlIHRyZWUgaGVpZ2h0IHBsdXMgb25lIChpZSwKLQkgKiB3ZSBjaGFy Z2UgZm9yIHRoZSBsZWFmIHBhZ2UgdG9vKS4gIEFzIGFib3ZlLCBjaGFyZ2Ugb25jZSBwZXIgU0Eg c2Nhbi4KKwkgKiB3ZSBjaGFyZ2UgZm9yIHRoZSBsZWFmIHBhZ2UgdG9vKS4gIEFzIGFib3ZlLCBj aGFyZ2Ugb25jZSBwZXIgZXN0aW1hdGVkCisJICogcHJpbWl0aXZlIFNBIHNjYW4uCiAJICovCiAJ ZGVzY2VudENvc3QgPSAoaW5kZXgtPnRyZWVfaGVpZ2h0ICsgMSkgKiBERUZBVUxUX1BBR0VfQ1BV X01VTFRJUExJRVIgKiBjcHVfb3BlcmF0b3JfY29zdDsKIAljb3N0cy5pbmRleFN0YXJ0dXBDb3N0 ICs9IGRlc2NlbnRDb3N0OwpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL21vbml0b3Jpbmcuc2dt bCBiL2RvYy9zcmMvc2dtbC9tb25pdG9yaW5nLnNnbWwKaW5kZXggNDI1MDkwNDJhLi4xNTE1YmJk NDAgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9tb25pdG9yaW5nLnNnbWwKKysrIGIvZG9jL3Ny Yy9zZ21sL21vbml0b3Jpbmcuc2dtbApAQCAtNDAzNSw2ICs0MDM1LDE5IEBAIGRlc2NyaXB0aW9u IHwgV2FpdGluZyBmb3IgYSBuZXdseSBpbml0aWFsaXplZCBXQUwgZmlsZSB0byByZWFjaCBkdXJh YmxlIHN0b3JhZ2UKICAgIDwvcGFyYT4KICAgPC9ub3RlPgogCisgIDxub3RlPgorICAgPHBhcmE+ CisgICAgRXZlcnkgdGltZSBhbiBpbmRleCBpcyBzZWFyY2hlZCwgdGhlIGluZGV4J3MKKyAgICA8 c3RydWN0bmFtZT5wZ19zdGF0X2FsbF9pbmRleGVzPC9zdHJ1Y3RuYW1lPi48c3RydWN0ZmllbGQ+ aWR4X3NjYW48L3N0cnVjdGZpZWxkPgorICAgIGZpZWxkIGlzIGluY3JlbWVudGVkLiAgVGhpcyB1 c3VhbGx5IGhhcHBlbnMgb25jZSBwZXIgaW5kZXggc2NhbiBub2RlCisgICAgZXhlY3V0aW9uLCBi dXQgbWlnaHQgdGFrZSBwbGFjZSBzZXZlcmFsIHRpbWVzIGR1cmluZyBleGVjdXRpb24gb2YgYSBz Y2FuCisgICAgdGhhdCBzZWFyY2hlcyBmb3IgbXVsdGlwbGUgdmFsdWVzIHRvZ2V0aGVyLiAgT25s eSBxdWVyaWVzIHRoYXQgdXNlIGNlcnRhaW4KKyAgICA8YWNyb255bT5TUUw8L2Fjcm9ueW0+IGNv bnN0cnVjdHMgdG8gc2VhcmNoIGZvciByb3dzIG1hdGNoaW5nIGFueSB2YWx1ZQorICAgIG91dCBv ZiBhIGxpc3QgKG9yIGFuIGFycmF5KSBvZiBtdWx0aXBsZSBzY2FsYXIgdmFsdWVzIGFyZSBhZmZl Y3RlZC4gIFNlZQorICAgIDx4cmVmIGxpbmtlbmQ9ImZ1bmN0aW9ucy1jb21wYXJpc29ucyIvPiBm b3IgZGV0YWlscy4KKyAgIDwvcGFyYT4KKyAgPC9ub3RlPgorCiAgPC9zZWN0Mj4KIAogIDxzZWN0 MiBpZD0ibW9uaXRvcmluZy1wZy1zdGF0aW8tYWxsLXRhYmxlcy12aWV3Ij4KZGlmZiAtLWdpdCBh L3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY3JlYXRlX2luZGV4Lm91dCBiL3NyYy90ZXN0L3Jl Z3Jlc3MvZXhwZWN0ZWQvY3JlYXRlX2luZGV4Lm91dAppbmRleCBhY2ZkOWQxZjQuLjg0YzA2OGFl MyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9jcmVhdGVfaW5kZXgub3V0 CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY3JlYXRlX2luZGV4Lm91dApAQCAtMTkx MCw3ICsxOTEwLDcgQEAgU0VMRUNUIGNvdW50KCopIEZST00gZHVwaW5kZXhjb2xzCiAoMSByb3cp CiAKIC0tCi0tLSBDaGVjayBvcmRlcmluZyBvZiA9QU5ZIGluZGV4cXVhbCByZXN1bHRzIChidWcg aW4gOS4yLjApCistLSBDaGVjayB0aGF0IGluZGV4IHNjYW5zIHdpdGggPUFOWSBpbmRleHF1YWxz IHJldHVybiByb3dzIGluIGluZGV4IG9yZGVyCiAtLQogZXhwbGFpbiAoY29zdHMgb2ZmKQogU0VM RUNUIHVuaXF1ZTEgRlJPTSB0ZW5rMQpAQCAtMTkzNiwxMiArMTkzNiwxMSBAQCBleHBsYWluIChj b3N0cyBvZmYpCiBTRUxFQ1QgdGhvdXNhbmQsIHRlbnRob3VzIEZST00gdGVuazEKIFdIRVJFIHRo b3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4gKDEwMDEsMzAwMCkKIE9SREVSIEJZIHRob3VzYW5k OwotICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAg IAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgSW5k ZXggT25seSBTY2FuIHVzaW5nIHRlbmsxX3Rob3VzX3RlbnRob3VzIG9uIHRlbmsxCi0gICBJbmRl eCBDb25kOiAodGhvdXNhbmQgPCAyKQotICAgRmlsdGVyOiAodGVudGhvdXMgPSBBTlkgKCd7MTAw MSwzMDAwfSc6OmludGVnZXJbXSkpCi0oMyByb3dzKQorICAgSW5kZXggQ29uZDogKCh0aG91c2Fu ZCA8IDIpIEFORCAodGVudGhvdXMgPSBBTlkgKCd7MTAwMSwzMDAwfSc6OmludGVnZXJbXSkpKQor KDIgcm93cykKIAogU0VMRUNUIHRob3VzYW5kLCB0ZW50aG91cyBGUk9NIHRlbmsxCiBXSEVSRSB0 aG91c2FuZCA8IDIgQU5EIHRlbnRob3VzIElOICgxMDAxLDMwMDApCkBAIC0xOTUyLDE4ICsxOTUx LDM1IEBAIE9SREVSIEJZIHRob3VzYW5kOwogICAgICAgICAxIHwgICAgIDEwMDEKICgyIHJvd3Mp CiAKK2V4cGxhaW4gKGNvc3RzIG9mZikKK1NFTEVDVCB0aG91c2FuZCwgdGVudGhvdXMgRlJPTSB0 ZW5rMQorV0hFUkUgdGhvdXNhbmQgPCAyIEFORCB0ZW50aG91cyBJTiAoMTAwMSwzMDAwKQorT1JE RVIgQlkgdGhvdXNhbmQgREVTQywgdGVudGhvdXMgREVTQzsKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEluZGV4IE9ubHkgU2NhbiBCYWNrd2FyZCB1 c2luZyB0ZW5rMV90aG91c190ZW50aG91cyBvbiB0ZW5rMQorICAgSW5kZXggQ29uZDogKCh0aG91 c2FuZCA8IDIpIEFORCAodGVudGhvdXMgPSBBTlkgKCd7MTAwMSwzMDAwfSc6OmludGVnZXJbXSkp KQorKDIgcm93cykKKworU0VMRUNUIHRob3VzYW5kLCB0ZW50aG91cyBGUk9NIHRlbmsxCitXSEVS RSB0aG91c2FuZCA8IDIgQU5EIHRlbnRob3VzIElOICgxMDAxLDMwMDApCitPUkRFUiBCWSB0aG91 c2FuZCBERVNDLCB0ZW50aG91cyBERVNDOworIHRob3VzYW5kIHwgdGVudGhvdXMgCistLS0tLS0t LS0tKy0tLS0tLS0tLS0KKyAgICAgICAgMSB8ICAgICAxMDAxCisgICAgICAgIDAgfCAgICAgMzAw MAorKDIgcm93cykKKwogU0VUIGVuYWJsZV9pbmRleG9ubHlzY2FuID0gT0ZGOwogZXhwbGFpbiAo Y29zdHMgb2ZmKQogU0VMRUNUIHRob3VzYW5kLCB0ZW50aG91cyBGUk9NIHRlbmsxCiBXSEVSRSB0 aG91c2FuZCA8IDIgQU5EIHRlbnRob3VzIElOICgxMDAxLDMwMDApCiBPUkRFUiBCWSB0aG91c2Fu ZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQotIFNvcnQKLSAgIFNvcnQgS2V5OiB0aG91c2FuZAotICAgLT4gIEluZGV4IFNjYW4g dXNpbmcgdGVuazFfdGhvdXNfdGVudGhvdXMgb24gdGVuazEKLSAgICAgICAgIEluZGV4IENvbmQ6 ICgodGhvdXNhbmQgPCAyKSBBTkQgKHRlbnRob3VzID0gQU5ZICgnezEwMDEsMzAwMH0nOjppbnRl Z2VyW10pKSkKLSg0IHJvd3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFV RVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBJbmRleCBTY2FuIHVzaW5nIHRlbmsxX3Rob3VzX3RlbnRob3VzIG9uIHRl bmsxCisgICBJbmRleCBDb25kOiAoKHRob3VzYW5kIDwgMikgQU5EICh0ZW50aG91cyA9IEFOWSAo J3sxMDAxLDMwMDB9Jzo6aW50ZWdlcltdKSkpCisoMiByb3dzKQogCiBTRUxFQ1QgdGhvdXNhbmQs IHRlbnRob3VzIEZST00gdGVuazEKIFdIRVJFIHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4g KDEwMDEsMzAwMCkKQEAgLTE5NzQsNiArMTk5MCwyNSBAQCBPUkRFUiBCWSB0aG91c2FuZDsKICAg ICAgICAgMSB8ICAgICAxMDAxCiAoMiByb3dzKQogCitleHBsYWluIChjb3N0cyBvZmYpCitTRUxF Q1QgdGhvdXNhbmQsIHRlbnRob3VzIEZST00gdGVuazEKK1dIRVJFIHRob3VzYW5kIDwgMiBBTkQg dGVudGhvdXMgSU4gKDEwMDEsMzAwMCkKK09SREVSIEJZIHRob3VzYW5kIERFU0MsIHRlbnRob3Vz IERFU0M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBJbmRleCBTY2FuIEJhY2t3YXJkIHVzaW5nIHRlbmsxX3Rob3VzX3RlbnRob3VzIG9uIHRlbmsx CisgICBJbmRleCBDb25kOiAoKHRob3VzYW5kIDwgMikgQU5EICh0ZW50aG91cyA9IEFOWSAoJ3sx MDAxLDMwMDB9Jzo6aW50ZWdlcltdKSkpCisoMiByb3dzKQorCitTRUxFQ1QgdGhvdXNhbmQsIHRl bnRob3VzIEZST00gdGVuazEKK1dIRVJFIHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4gKDEw MDEsMzAwMCkKK09SREVSIEJZIHRob3VzYW5kIERFU0MsIHRlbnRob3VzIERFU0M7CisgdGhvdXNh bmQgfCB0ZW50aG91cyAKKy0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICAgICAgICAxIHwgICAgIDEw MDEKKyAgICAgICAgMCB8ICAgICAzMDAwCisoMiByb3dzKQorCiBSRVNFVCBlbmFibGVfaW5kZXhv bmx5c2NhbjsKIC0tCiAtLSBDaGVjayBlbGltaW5hdGlvbiBvZiBjb25zdGFudC1OVUxMIHN1YmV4 cHJlc3Npb25zCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0 IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dAppbmRleCAyYzczMjcwMTQuLjg2 ZTU0MTc4MCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dAor KysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0CkBAIC04NjgwLDEwICs4Njgw LDkgQEAgd2hlcmUgajEuaWQxICUgMTAwMCA9IDEgYW5kIGoyLmlkMSAlIDEwMDAgPSAxIGFuZCBq Mi5pZDEgPj0gYW55IChhcnJheVsxLDVdKTsKICAgIE1lcmdlIENvbmQ6IChqMS5pZDEgPSBqMi5p ZDEpCiAgICBKb2luIEZpbHRlcjogKGoyLmlkMiA9IGoxLmlkMikKICAgIC0+ICBJbmRleCBTY2Fu IHVzaW5nIGoxX2lkMV9pZHggb24gajEKLSAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgajJf cGtleSBvbiBqMgorICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgajJfaWQxX2lkeCBvbiBqMgogICAg ICAgICAgSW5kZXggQ29uZDogKGlkMSA+PSBBTlkgKCd7MSw1fSc6OmludGVnZXJbXSkpCi0gICAg ICAgICBGaWx0ZXI6ICgoaWQxICUgMTAwMCkgPSAxKQotKDcgcm93cykKKyg2IHJvd3MpCiAKIHNl bGVjdCAqIGZyb20gajEKIGlubmVyIGpvaW4gajIgb24gajEuaWQxID0gajIuaWQxIGFuZCBqMS5p ZDIgPSBqMi5pZDIKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2NyZWF0ZV9pbmRl eC5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9jcmVhdGVfaW5kZXguc3FsCmluZGV4IGQ0OWNl OWYzMC4uNDFiOTU1YTI3IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9jcmVhdGVf aW5kZXguc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2NyZWF0ZV9pbmRleC5zcWwKQEAg LTc1Myw3ICs3NTMsNyBAQCBTRUxFQ1QgY291bnQoKikgRlJPTSBkdXBpbmRleGNvbHMKICAgV0hF UkUgZjEgQkVUV0VFTiAnV0EnIEFORCAnWlpaJyBhbmQgaWQgPCAxMDAwIGFuZCBmMSB+PH4gJ1lY JzsKIAogLS0KLS0tIENoZWNrIG9yZGVyaW5nIG9mID1BTlkgaW5kZXhxdWFsIHJlc3VsdHMgKGJ1 ZyBpbiA5LjIuMCkKKy0tIENoZWNrIHRoYXQgaW5kZXggc2NhbnMgd2l0aCA9QU5ZIGluZGV4cXVh bHMgcmV0dXJuIHJvd3MgaW4gaW5kZXggb3JkZXIKIC0tCiAKIGV4cGxhaW4gKGNvc3RzIG9mZikK QEAgLTc3NCw2ICs3NzQsMTUgQEAgU0VMRUNUIHRob3VzYW5kLCB0ZW50aG91cyBGUk9NIHRlbmsx CiBXSEVSRSB0aG91c2FuZCA8IDIgQU5EIHRlbnRob3VzIElOICgxMDAxLDMwMDApCiBPUkRFUiBC WSB0aG91c2FuZDsKIAorZXhwbGFpbiAoY29zdHMgb2ZmKQorU0VMRUNUIHRob3VzYW5kLCB0ZW50 aG91cyBGUk9NIHRlbmsxCitXSEVSRSB0aG91c2FuZCA8IDIgQU5EIHRlbnRob3VzIElOICgxMDAx LDMwMDApCitPUkRFUiBCWSB0aG91c2FuZCBERVNDLCB0ZW50aG91cyBERVNDOworCitTRUxFQ1Qg dGhvdXNhbmQsIHRlbnRob3VzIEZST00gdGVuazEKK1dIRVJFIHRob3VzYW5kIDwgMiBBTkQgdGVu dGhvdXMgSU4gKDEwMDEsMzAwMCkKK09SREVSIEJZIHRob3VzYW5kIERFU0MsIHRlbnRob3VzIERF U0M7CisKIFNFVCBlbmFibGVfaW5kZXhvbmx5c2NhbiA9IE9GRjsKIAogZXhwbGFpbiAoY29zdHMg b2ZmKQpAQCAtNzg1LDYgKzc5NCwxNSBAQCBTRUxFQ1QgdGhvdXNhbmQsIHRlbnRob3VzIEZST00g dGVuazEKIFdIRVJFIHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4gKDEwMDEsMzAwMCkKIE9S REVSIEJZIHRob3VzYW5kOwogCitleHBsYWluIChjb3N0cyBvZmYpCitTRUxFQ1QgdGhvdXNhbmQs IHRlbnRob3VzIEZST00gdGVuazEKK1dIRVJFIHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4g KDEwMDEsMzAwMCkKK09SREVSIEJZIHRob3VzYW5kIERFU0MsIHRlbnRob3VzIERFU0M7CisKK1NF TEVDVCB0aG91c2FuZCwgdGVudGhvdXMgRlJPTSB0ZW5rMQorV0hFUkUgdGhvdXNhbmQgPCAyIEFO RCB0ZW50aG91cyBJTiAoMTAwMSwzMDAwKQorT1JERVIgQlkgdGhvdXNhbmQgREVTQywgdGVudGhv dXMgREVTQzsKKwogUkVTRVQgZW5hYmxlX2luZGV4b25seXNjYW47CiAKIC0tCi0tIAoyLjQyLjAK Cg== --0000000000003f2371060aa0b369--