<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>235504</bug_id>
          
          <creation_ts>2022-01-24 01:52:25 -0800</creation_ts>
          <short_desc>Refactor KeyframeEffect::getKeyframes()</short_desc>
          <delta_ts>2022-01-25 11:55:44 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Animations</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Antoine Quint">graouts</reporter>
          <assigned_to name="Antoine Quint">graouts</assigned_to>
          <cc>cdumez</cc>
    
    <cc>darin</cc>
    
    <cc>dino</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>graouts</cc>
    
    <cc>kondapallykalyan</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1833224</commentid>
    <comment_count>0</comment_count>
    <who name="Antoine Quint">graouts</who>
    <bug_when>2022-01-24 01:52:25 -0800</bug_when>
    <thetext>During the review of bug 232086, Darin made some comments about getKeyframes() and made some suggestions some improvements. We should look into that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1833228</commentid>
    <comment_count>1</comment_count>
    <who name="Antoine Quint">graouts</who>
    <bug_when>2022-01-24 02:02:06 -0800</bug_when>
    <thetext>We could probably solve this by using an intermediate struct that is the output of getKeyframes() and have some other function translate this to the required JS object. That struct would probably keep a map of CSSPropertyID to values which we&apos;d serialize in the bindings code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1833379</commentid>
    <comment_count>2</comment_count>
    <who name="Antoine Quint">graouts</who>
    <bug_when>2022-01-24 10:33:30 -0800</bug_when>
    <thetext>Plan here is to:

1. mark getKeyframes() as [Custom] in the idl
2. change the BaseComputedKeyframe struct to a ComputedKeyframe struct, add a map with CSSPropertyID as a key and String as values to store all the keyframe CSS properties
3. make getKeyframes() return a Vector&lt;ComputedKeyframe&gt;
4. add code in JSKeyframeEffectCustom.cpp to convert that returned Vector&lt;ComputedKeyframe&gt; to a Vector&lt;JSC::Strong&lt;JSC::JSObject&gt;&gt;, the code for which mostly exists in the current implementation of KeyframeEffect::getKeyframes().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1833664</commentid>
    <comment_count>3</comment_count>
      <attachid>449914</attachid>
    <who name="Antoine Quint">graouts</who>
    <bug_when>2022-01-25 04:25:33 -0800</bug_when>
    <thetext>Created attachment 449914
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1833697</commentid>
    <comment_count>4</comment_count>
      <attachid>449914</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2022-01-25 07:35:45 -0800</bug_when>
    <thetext>Comment on attachment 449914
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=449914&amp;action=review

r=me with suggestions

&gt; Source/WebCore/animation/KeyframeEffect.cpp:585
&gt; +Vector&lt;KeyframeEffect::ComputedKeyframe&gt; KeyframeEffect::getKeyframes(Document&amp; document)

This can also be written as so (if you prefer):
auto KeyframeEffect::getKeyframes(Document&amp; document) -&gt; Vector&lt;ComputedKeyframe&gt;

&gt; Source/WebCore/animation/KeyframeEffect.cpp:589
&gt; +    if (is&lt;DeclarativeAnimation&gt;(animation()))

To avoid calling animation() twice, you could write:
if (auto* declarativeAnimation = dynamicDowncast&lt;DeclarativeAnimation&gt;(animation()))
    declarativeAnimation-&gt;flushPendingStyleChanges();

&gt; Source/WebCore/animation/KeyframeEffect.cpp:598
&gt; +            computedKeyframes.append(computedKeyframe);

computedKeyframes.append(WTFMove(computedKeyframe));

&gt; Source/WebCore/animation/KeyframeEffect.cpp:607
&gt; +    auto computedStyleExtractor = ComputedStyleExtractor(target, false, m_pseudoId);

I know this is pre-existing code but I personally think this would look nicer (more concise):
ComputedStyleExtractor computedStyleExtractor(target, false, m_pseudoId);

&gt; Source/WebCore/animation/KeyframeEffect.cpp:647
&gt; +    HashSet&lt;CSSPropertyID&gt; zeroKeyframeProperties = computedKeyframeList.properties();

could use auto

&gt; Source/WebCore/animation/KeyframeEffect.cpp:648
&gt; +    HashSet&lt;CSSPropertyID&gt; oneKeyframeProperties = computedKeyframeList.properties();

ditto.

&gt; Source/WebCore/animation/KeyframeEffect.cpp:651
&gt; +    for (size_t i = 0; i &lt; computedKeyframeList.size(); ++i) {

Why for use:
for (auto&amp; keyframe : computedKeyframeList)

&gt; Source/WebCore/animation/KeyframeEffect.cpp:662
&gt; +    for (size_t i = 0; i &lt; computedKeyframeList.size(); ++i) {

ditto.

&gt; Source/WebCore/animation/KeyframeEffect.cpp:679
&gt; +            String styleString = &quot;&quot;;

= emptyString() ?

&gt; Source/WebCore/animation/KeyframeEffect.cpp:718
&gt; +        computedKeyframes.append(computedKeyframe);

computedKeyframes.append(WTFMove(computedKeyframe));

&gt; Source/WebCore/bindings/js/JSKeyframeEffectCustom.cpp:46
&gt; +    for (auto&amp; computedKeyframe : wrapped().getKeyframes(downcast&lt;Document&gt;(*context))) {

May be nice to store the result of wrapped().getKeyframes() in a local so we can reserve capacity for keyframeObjects.
E.g.
```
Vector&lt;Strong&lt;JSObject&gt;&gt; keyframeObjects;
auto keyFrames = wrapped().getKeyframes(downcast&lt;Document&gt;(*context));
keyframeObjects.reserveInitialCapacity(keyFrames.size());
```

&gt; Source/WebCore/bindings/js/JSKeyframeEffectCustom.cpp:48
&gt; +        for (auto it = computedKeyframe.styleStrings.begin(), end = computedKeyframe.styleStrings.end(); it != end; ++it) {

Could use:
for (auto&amp; [propertyID, propertyValue] : computedKeyframe.styleStrings)

&gt; Source/WebCore/bindings/js/JSKeyframeEffectCustom.cpp:53
&gt; +        keyframeObjects.append({ lexicalGlobalObject.vm(), keyframeObject });

Could use uncheckedAppend() if you reserve capacity as suggested above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1833708</commentid>
    <comment_count>5</comment_count>
      <attachid>449914</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2022-01-25 08:00:13 -0800</bug_when>
    <thetext>Comment on attachment 449914
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=449914&amp;action=review

&gt;&gt; Source/WebCore/bindings/js/JSKeyframeEffectCustom.cpp:46
&gt;&gt; +    for (auto&amp; computedKeyframe : wrapped().getKeyframes(downcast&lt;Document&gt;(*context))) {
&gt; 
&gt; May be nice to store the result of wrapped().getKeyframes() in a local so we can reserve capacity for keyframeObjects.
&gt; E.g.
&gt; ```
&gt; Vector&lt;Strong&lt;JSObject&gt;&gt; keyframeObjects;
&gt; auto keyFrames = wrapped().getKeyframes(downcast&lt;Document&gt;(*context));
&gt; keyframeObjects.reserveInitialCapacity(keyFrames.size());
&gt; ```

Even better, use Vector:.map to create the new vector.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1833728</commentid>
    <comment_count>6</comment_count>
    <who name="Antoine Quint">graouts</who>
    <bug_when>2022-01-25 08:53:44 -0800</bug_when>
    <thetext>(In reply to Chris Dumez from comment #4)
&gt; Comment on attachment 449914 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=449914&amp;action=review
&gt; 
&gt; r=me with suggestions
&gt; 
&gt; &gt; Source/WebCore/animation/KeyframeEffect.cpp:585
&gt; &gt; +Vector&lt;KeyframeEffect::ComputedKeyframe&gt; KeyframeEffect::getKeyframes(Document&amp; document)
&gt; 
&gt; This can also be written as so (if you prefer):
&gt; auto KeyframeEffect::getKeyframes(Document&amp; document) -&gt;
&gt; Vector&lt;ComputedKeyframe&gt;

Is this a new style we&apos;re adopting throughout WebKit? Does it have any benefit? I&apos;ve seen this used before, but wasn&apos;t sure whether it had any practical benefit.

&gt; &gt; Source/WebCore/animation/KeyframeEffect.cpp:589
&gt; &gt; +    if (is&lt;DeclarativeAnimation&gt;(animation()))
&gt; 
&gt; To avoid calling animation() twice, you could write:
&gt; if (auto* declarativeAnimation =
&gt; dynamicDowncast&lt;DeclarativeAnimation&gt;(animation()))
&gt;     declarativeAnimation-&gt;flushPendingStyleChanges();

This is awesome, didn&apos;t know it existed. Will adopt this.

&gt; &gt; Source/WebCore/animation/KeyframeEffect.cpp:598
&gt; &gt; +            computedKeyframes.append(computedKeyframe);
&gt; 
&gt; computedKeyframes.append(WTFMove(computedKeyframe));

Will fix.

&gt; &gt; Source/WebCore/animation/KeyframeEffect.cpp:607
&gt; &gt; +    auto computedStyleExtractor = ComputedStyleExtractor(target, false, m_pseudoId);
&gt; 
&gt; I know this is pre-existing code but I personally think this would look
&gt; nicer (more concise):
&gt; ComputedStyleExtractor computedStyleExtractor(target, false, m_pseudoId);

Yes, will do this.

&gt; &gt; Source/WebCore/animation/KeyframeEffect.cpp:647
&gt; &gt; +    HashSet&lt;CSSPropertyID&gt; zeroKeyframeProperties = computedKeyframeList.properties();
&gt; 
&gt; could use auto

Indeed, will fix.

&gt; &gt; Source/WebCore/animation/KeyframeEffect.cpp:648
&gt; &gt; +    HashSet&lt;CSSPropertyID&gt; oneKeyframeProperties = computedKeyframeList.properties();
&gt; 
&gt; ditto.

Will fix.

&gt; &gt; Source/WebCore/animation/KeyframeEffect.cpp:651
&gt; &gt; +    for (size_t i = 0; i &lt; computedKeyframeList.size(); ++i) {
&gt; 
&gt; Why for use:
&gt; for (auto&amp; keyframe : computedKeyframeList)

This is a KeyframeList, and it cannot (yet?) be iterated.

&gt; &gt; Source/WebCore/animation/KeyframeEffect.cpp:662
&gt; &gt; +    for (size_t i = 0; i &lt; computedKeyframeList.size(); ++i) {
&gt; 
&gt; ditto.
&gt; 
&gt; &gt; Source/WebCore/animation/KeyframeEffect.cpp:679
&gt; &gt; +            String styleString = &quot;&quot;;
&gt; 
&gt; = emptyString() ?

Yes, will fix.

&gt; &gt; Source/WebCore/animation/KeyframeEffect.cpp:718
&gt; &gt; +        computedKeyframes.append(computedKeyframe);
&gt; 
&gt; computedKeyframes.append(WTFMove(computedKeyframe));

Will fix.

&gt; &gt; Source/WebCore/bindings/js/JSKeyframeEffectCustom.cpp:46
&gt; &gt; +    for (auto&amp; computedKeyframe : wrapped().getKeyframes(downcast&lt;Document&gt;(*context))) {
&gt; 
&gt; May be nice to store the result of wrapped().getKeyframes() in a local so we
&gt; can reserve capacity for keyframeObjects.
&gt; E.g.
&gt; ```
&gt; Vector&lt;Strong&lt;JSObject&gt;&gt; keyframeObjects;
&gt; auto keyFrames = wrapped().getKeyframes(downcast&lt;Document&gt;(*context));
&gt; keyframeObjects.reserveInitialCapacity(keyFrames.size());
&gt; ```

Darin&apos;s suggestion to use Vector::map(), which I didn&apos;t know we had, will be even better.

&gt; &gt; Source/WebCore/bindings/js/JSKeyframeEffectCustom.cpp:48
&gt; &gt; +        for (auto it = computedKeyframe.styleStrings.begin(), end = computedKeyframe.styleStrings.end(); it != end; ++it) {
&gt; 
&gt; Could use:
&gt; for (auto&amp; [propertyID, propertyValue] : computedKeyframe.styleStrings)

I didn&apos;t know this could be done either, this is so much better.

&gt; &gt; Source/WebCore/bindings/js/JSKeyframeEffectCustom.cpp:53
&gt; &gt; +        keyframeObjects.append({ lexicalGlobalObject.vm(), keyframeObject });
&gt; 
&gt; Could use uncheckedAppend() if you reserve capacity as suggested above.

Thanks so much for all of this, this will greatly improve this patch and my coding going forward.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1833730</commentid>
    <comment_count>7</comment_count>
      <attachid>449914</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2022-01-25 09:00:31 -0800</bug_when>
    <thetext>Comment on attachment 449914
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=449914&amp;action=review

&gt;&gt;&gt; Source/WebCore/animation/KeyframeEffect.cpp:585
&gt;&gt;&gt; +Vector&lt;KeyframeEffect::ComputedKeyframe&gt; KeyframeEffect::getKeyframes(Document&amp; document)
&gt;&gt; 
&gt;&gt; This can also be written as so (if you prefer):
&gt;&gt; auto KeyframeEffect::getKeyframes(Document&amp; document) -&gt; Vector&lt;ComputedKeyframe&gt;
&gt; 
&gt; Is this a new style we&apos;re adopting throughout WebKit? Does it have any benefit? I&apos;ve seen this used before, but wasn&apos;t sure whether it had any practical benefit.

The benefit is not having to qualify from the class’s scope. Vector&lt;ComputedKeyframe&gt; instead of Vector&lt;KeyframeEffect::ComputedKeyframe&gt;. In some cases it can get even more extreme.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1833737</commentid>
    <comment_count>8</comment_count>
    <who name="Antoine Quint">graouts</who>
    <bug_when>2022-01-25 09:29:13 -0800</bug_when>
    <thetext>&gt; &gt; &gt; Source/WebCore/animation/KeyframeEffect.cpp:651
&gt; &gt; &gt; +    for (size_t i = 0; i &lt; computedKeyframeList.size(); ++i) {
&gt; &gt; 
&gt; &gt; Why for use:
&gt; &gt; for (auto&amp; keyframe : computedKeyframeList)
&gt; 
&gt; This is a KeyframeList, and it cannot (yet?) be iterated.

But KeyframeList expose the keyframes via keyframes() so we can write this as:

for (auto&amp; keyframe : computedKeyframeList.keyframes())</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1833740</commentid>
    <comment_count>9</comment_count>
    <who name="Antoine Quint">graouts</who>
    <bug_when>2022-01-25 09:36:51 -0800</bug_when>
    <thetext>Committed r288560 (?): &lt;https://commits.webkit.org/r288560&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1833742</commentid>
    <comment_count>10</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2022-01-25 09:37:17 -0800</bug_when>
    <thetext>&lt;rdar://problem/88028485&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1833744</commentid>
    <comment_count>11</comment_count>
    <who name="Antoine Quint">graouts</who>
    <bug_when>2022-01-25 09:37:41 -0800</bug_when>
    <thetext>I&apos;ll make similar changes to setKeyframes() in bug 235593.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1833751</commentid>
    <comment_count>12</comment_count>
      <attachid>449914</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2022-01-25 09:51:49 -0800</bug_when>
    <thetext>Comment on attachment 449914
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=449914&amp;action=review

&gt;&gt;&gt; Source/WebCore/animation/KeyframeEffect.cpp:589
&gt;&gt;&gt; +    if (is&lt;DeclarativeAnimation&gt;(animation()))
&gt;&gt; 
&gt;&gt; To avoid calling animation() twice, you could write:
&gt;&gt; if (auto* declarativeAnimation = dynamicDowncast&lt;DeclarativeAnimation&gt;(animation()))
&gt;&gt;     declarativeAnimation-&gt;flushPendingStyleChanges();
&gt; 
&gt; This is awesome, didn&apos;t know it existed. Will adopt this.

Maybe because Chris added it less than two weeks ago?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1833801</commentid>
    <comment_count>13</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2022-01-25 11:55:44 -0800</bug_when>
    <thetext>(In reply to Darin Adler from comment #12)
&gt; Comment on attachment 449914 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=449914&amp;action=review
&gt; 
&gt; &gt;&gt;&gt; Source/WebCore/animation/KeyframeEffect.cpp:589
&gt; &gt;&gt;&gt; +    if (is&lt;DeclarativeAnimation&gt;(animation()))
&gt; &gt;&gt; 
&gt; &gt;&gt; To avoid calling animation() twice, you could write:
&gt; &gt;&gt; if (auto* declarativeAnimation = dynamicDowncast&lt;DeclarativeAnimation&gt;(animation()))
&gt; &gt;&gt;     declarativeAnimation-&gt;flushPendingStyleChanges();
&gt; &gt; 
&gt; &gt; This is awesome, didn&apos;t know it existed. Will adopt this.
&gt; 
&gt; Maybe because Chris added it less than two weeks ago?

Hehe, yes, it is very new, which is why I am publicizing it :P</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>449914</attachid>
            <date>2022-01-25 04:25:33 -0800</date>
            <delta_ts>2022-01-25 07:58:15 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-235504-20220125132532.patch</filename>
            <type>text/plain</type>
            <size>35300</size>
            <attacher name="Antoine Quint">graouts</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjg4NDU0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNDQ2Mjc3YjQxNjNmN2Q3
YWRjZmY3NDMwYjBmMDEwNjI5ZTk3Yzg5Yy4uMGZhZjE0OWNjYzdhYjQ0MjA5ODdiOGY0OWJhYjEz
NGVmNWJhNDgzZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQ0IEBACisyMDIyLTAxLTI1ICBBbnRv
aW5lIFF1aW50ICA8Z3Jhb3V0c0B3ZWJraXQub3JnPgorCisgICAgICAgIFJlZmFjdG9yIEtleWZy
YW1lRWZmZWN0OjpnZXRLZXlmcmFtZXMoKQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MjM1NTA0CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgV2UgbW92ZSBhbGwgdGhlIEpTIGNvbnZlcnNpb24gY29kZSB0byBh
IG5ldyBjdXN0b20gaW1wbGVtZW50YXRpb24gZm9yIEpTS2V5ZnJhbWVFZmZlY3Q6OmdldEtleWZy
YW1lcygpCisgICAgICAgIHN1Y2ggdGhhdCBLZXlmcmFtZUVmZmVjdDo6Z2V0S2V5ZnJhbWVzKCkg
aXMgc2ltcGx5IGluIHRoZSBidXNpbmVzcyBvZiBjb21waWxpbmcgdGhlIGxpc3Qgb2YgY29tcHV0
ZWQKKyAgICAgICAga2V5ZnJhbWVzLgorCisgICAgICAgIFRvIGRvIHRoaXMsIHdlIHN0YXJ0IGJ5
IGNoYW5naW5nIHRoZSB3YXkgdGhlIHZhcmlvdXMgS2V5ZnJhbWVFZmZlY3Qgc3RydWN0cyBhcmUg
b3JnYW5pemVkLiBXZSBtYWtlCisgICAgICAgIEJhc2VDb21wdXRlZEtleWZyYW1lIGV4dGVuZCBC
YXNlS2V5ZnJhbWUsIHRoZW4gQ29tcHV0ZWRLZXlmcmFtZSBleHRlbmQgQmFzZUNvbXB1dGVkS2V5
ZnJhbWUgYnkgYWRkaW5nCisgICAgICAgIGEgbWFwIG9mIENTU1Byb3BlcnR5SUQgdG8gU3RyaW5n
IHZhbHVlcywgdGhlbiBQYXJzZWRLZXlmcmFtZSBjYW4gc2ltcGx5IGV4dGVuZCBDb21wdXRlZEtl
eWZyYW1lLgorICAgICAgICBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gY29weSBQYXJzZWRLZXlmcmFt
ZSBpbnRvIGEgQ29tcHV0ZWRLZXlmcmFtZSBmb3IgdGhlIHByb3BlcnRpZXMgcmVsZXZhbnQKKyAg
ICAgICAgdG8gdGhlIG91dHB1dCBvZiBnZXRLZXlmcmFtZXMoKS4KKworICAgICAgICBXZSBhbHNv
IHRha2UgdGhlIG9wcG9ydHVuaXR5IHRvIG1lcmdlIHdoYXQgdXNlZCB0byBiZSB0d28gbWV0aG9k
cywgZ2V0QmluZGluZ3NLZXlmcmFtZXMoKSBhbmQgZ2V0S2V5ZnJhbWVzKCksCisgICAgICAgIGlu
dG8gYSBzaW5nbGUgbWV0aG9kIHNpbmNlIGdldEtleWZyYW1lcygpIGlzIG9ubHkgZXZlciBjYWxs
ZWQgdGhyb3VnaCB0aGUgSlMgYmluZGluZ3MuCisKKyAgICAgICAgRmluYWxseSwgd2UgcmVtb3Zl
IHRoZSBiaWcgaWYvZWxzZSBzdGF0ZW1lbnQgaW4gS2V5ZnJhbWVFZmZlY3Q6OmdldEtleWZyYW1l
cygpIHRvIGhhdmUgYSBzbWFsbCBpZiBibG9jaworICAgICAgICBmb3IgdGhlIGNhc2Ugd2hlcmUg
dGhlIGtleWZyYW1lcyBhcmUgYWxyZWFkeSBzZXQgdmlhIHRoZSBzZXRLZXlmcmFtZXMoKSBBUEkg
YW5kIHJldHVybiBlYXJseS4KKworICAgICAgICAqIFNvdXJjZXMudHh0OgorICAgICAgICAqIFdl
YkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiBhbmltYXRpb24vS2V5
ZnJhbWVFZmZlY3QuY3BwOgorICAgICAgICAoV2ViQ29yZTo6S2V5ZnJhbWVFZmZlY3Q6OkNTU1By
b3BlcnR5SURUb0lETEF0dHJpYnV0ZU5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6SURMQXR0cmli
dXRlTmFtZVRvQW5pbWF0aW9uUHJvcGVydHlOYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OnByb2Nl
c3NJdGVyYWJsZUtleWZyYW1lcyk6CisgICAgICAgIChXZWJDb3JlOjpwcm9jZXNzUHJvcGVydHlJ
bmRleGVkS2V5ZnJhbWVzKToKKyAgICAgICAgKFdlYkNvcmU6OktleWZyYW1lRWZmZWN0Ojpjb3B5
UHJvcGVydGllc0Zyb21Tb3VyY2UpOgorICAgICAgICAoV2ViQ29yZTo6S2V5ZnJhbWVFZmZlY3Q6
OmdldEtleWZyYW1lcyk6CisgICAgICAgIChXZWJDb3JlOjpLZXlmcmFtZUVmZmVjdDo6YW5pbWF0
ZWRQcm9wZXJ0aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OktleWZyYW1lRWZmZWN0OjphbmltYXRl
c1Byb3BlcnR5IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1Byb3BlcnR5SURUb0lETEF0
dHJpYnV0ZU5hbWUpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6S2V5ZnJhbWVFZmZlY3Q6
OmdldEJpbmRpbmdzS2V5ZnJhbWVzKTogRGVsZXRlZC4KKyAgICAgICAgKiBhbmltYXRpb24vS2V5
ZnJhbWVFZmZlY3QuaDoKKyAgICAgICAgKiBhbmltYXRpb24vS2V5ZnJhbWVFZmZlY3QuaWRsOgor
ICAgICAgICAqIGJpbmRpbmdzL2pzL0pTS2V5ZnJhbWVFZmZlY3RDdXN0b20uY3BwOiBBZGRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OkpTS2V5ZnJhbWVFZmZlY3Q6OmdldEtleWZyYW1lcyk6CisKIDIw
MjItMDEtMjQgIEFudG9pbmUgUXVpbnQgIDxncmFvdXRzQHdlYmtpdC5vcmc+CiAKICAgICAgICAg
UGFzcyB0aGUgRG9jdW1lbnQgdGhyb3VnaCBiaW5kaW5ncyB0byBLZXlmcmFtZUVmZmVjdDo6c2V0
S2V5ZnJhbWVzKCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1NvdXJjZXMudHh0IGIvU291
cmNlL1dlYkNvcmUvU291cmNlcy50eHQKaW5kZXggNjBmNjE3MGJiMDBmZDY4YmU5MTIyODQzOTEw
Y2ZjOGQwMGUxOTQ3MC4uNzc2YjE5NjA1NThhZTQ2ODgzOWFlYzhjZTFhOTRmNDRhYjk0NjYwOCAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvU291cmNlcy50eHQKKysrIGIvU291cmNlL1dlYkNv
cmUvU291cmNlcy50eHQKQEAgLTU3MCw2ICs1NzAsNyBAQCBiaW5kaW5ncy9qcy9KU0lEQlNlcmlh
bGl6YXRpb25HbG9iYWxPYmplY3QuY3BwCiBiaW5kaW5ncy9qcy9KU0ltYWdlRGF0YUN1c3RvbS5j
cHAKIGJpbmRpbmdzL2pzL0pTSW50ZXJzZWN0aW9uT2JzZXJ2ZXJDdXN0b20uY3BwCiBiaW5kaW5n
cy9qcy9KU0ludGVyc2VjdGlvbk9ic2VydmVyRW50cnlDdXN0b20uY3BwCitiaW5kaW5ncy9qcy9K
U0tleWZyYW1lRWZmZWN0Q3VzdG9tLmNwcAogYmluZGluZ3MvanMvSlNMYXp5RXZlbnRMaXN0ZW5l
ci5jcHAKIGJpbmRpbmdzL2pzL0pTTG9jYXRpb25DdXN0b20uY3BwCiBiaW5kaW5ncy9qcy9KU01l
ZGlhU3RyZWFtVHJhY2tDdXN0b20uY3BwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJD
b3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhj
b2RlcHJvai9wcm9qZWN0LnBieHByb2oKaW5kZXggZGY5ZmZjNzMyZGYzYzQ3MzA3YTc4MDc1NDIw
N2RhMWIyOTQzYjM0Yy4uYTU4ZWJjZWNkYmU1NjYzMzM4NDRjN2Q5NTk4NjI2YjQwZDBhMmFhNyAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhw
cm9qCisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
agpAQCAtMTExMjYsNiArMTExMjYsNyBAQAogCQk3MTVBRDcxRDIwNTA1MTI0MDBENTkyREMgLyog
RGVjbGFyYXRpdmVBbmltYXRpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
RGVjbGFyYXRpdmVBbmltYXRpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNzE1
QUQ3MUYyMDUwNTEyNDAwRDU5MkRDIC8qIERlY2xhcmF0aXZlQW5pbWF0aW9uLmNwcCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IERlY2xhcmF0aXZlQW5pbWF0aW9uLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNzE1REE1RDMyMDFCQjkwMjAwMkVGMkIwIC8q
IEpTV2ViQW5pbWF0aW9uQ3VzdG9tLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsg
cGF0aCA9IEpTV2ViQW5pbWF0aW9uQ3VzdG9tLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJNzE2MDE3MTgyNzlGMkQ3RTAwNUEyNUFFIC8qIEpTS2V5ZnJhbWVFZmZlY3RDdXN0b20u
Y3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSlNLZXlmcmFtZUVmZmVjdEN1c3RvbS5jcHA7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTcxNkE1NUFCMjZGQTM0OUIwMEM5NkQ2OSAvKiByYW5n
ZS1idXR0b24uY3NzICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVU
eXBlID0gdGV4dC5jc3M7IHBhdGggPSAicmFuZ2UtYnV0dG9uLmNzcyI7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CiAJCTcxNkE1NUFEMjZGQTM0OUMwMEM5NkQ2OSAvKiB2b2x1bWUtYnV0dG9u
LmpzICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5qYXZhc2NyaXB0OyBwYXRoID0gInZvbHVtZS1idXR0b24uanMiOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQk3MTZBNTVBRTI2RkEzNDlDMDBDOTZENjkgLyogcmFuZ2UtYnV0
dG9uLmpzICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5qYXZhc2NyaXB0OyBwYXRoID0gInJhbmdlLWJ1dHRvbi5qcyI7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0yNDgzNSw2ICsyNDgzNiw3IEBACiAJCQkJQTdEMDMxOEQw
RTkzNTQwMzAwRTI0QUNEIC8qIEpTSW1hZ2VEYXRhQ3VzdG9tLmNwcCAqLywKIAkJCQk1ODY4QzdE
NTI1NDZFMEIzMDBCRjlERjMgLyogSlNJbnRlcnNlY3Rpb25PYnNlcnZlckN1c3RvbS5jcHAgKi8s
CiAJCQkJNzdDMTNGMDQyMTY1NjU4QTAwMkQ5QzVGIC8qIEpTSW50ZXJzZWN0aW9uT2JzZXJ2ZXJF
bnRyeUN1c3RvbS5jcHAgKi8sCisJCQkJNzE2MDE3MTgyNzlGMkQ3RTAwNUEyNUFFIC8qIEpTS2V5
ZnJhbWVFZmZlY3RDdXN0b20uY3BwICovLAogCQkJCUFENzI2RkU3MTZEOUYyMDQwMDNBNEU2RCAv
KiBKU01lZGlhTGlzdEN1c3RvbS5oICovLAogCQkJCTQxNUNEQUY2MUU2Q0UwRDMwMDRGMTFFRSAv
KiBKU01lZGlhU3RyZWFtVHJhY2tDdXN0b20uY3BwICovLAogCQkJCUUxQTVGOTlBMEU3RUFBMjUw
MEFGODVFQSAvKiBKU01lc3NhZ2VDaGFubmVsQ3VzdG9tLmNwcCAqLywKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2FuaW1hdGlvbi9LZXlmcmFtZUVmZmVjdC5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9hbmltYXRpb24vS2V5ZnJhbWVFZmZlY3QuY3BwCmluZGV4IGY5NDNmNTY1M2VmZjg3YjE2Yjlh
ZDUzNmJiNmQwNzYzOGY2MWZiNDkuLmFmYjk2MmU2NTUxYzk3YzlhMjNkYmJiMTE3OTJhNWFhNjQ2
YjkzMWMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2FuaW1hdGlvbi9LZXlmcmFtZUVmZmVj
dC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvYW5pbWF0aW9uL0tleWZyYW1lRWZmZWN0LmNwcApA
QCAtNzUsNyArNzUsNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgaW52YWxpZGF0ZUVsZW1lbnQoY29u
c3Qgc3RkOjpvcHRpb25hbDxjb25zdCBTdHlsZWFibGU+JiBzdHlsZQogICAgICAgICBzdHlsZWFi
bGUtPmVsZW1lbnQuaW52YWxpZGF0ZVN0eWxlSW50ZXJuYWwoKTsKIH0KIAotc3RhdGljIGlubGlu
ZSBTdHJpbmcgQ1NTUHJvcGVydHlJRFRvSURMQXR0cmlidXRlTmFtZShDU1NQcm9wZXJ0eUlEIGNz
c1Byb3BlcnR5SWQpCitTdHJpbmcgS2V5ZnJhbWVFZmZlY3Q6OkNTU1Byb3BlcnR5SURUb0lETEF0
dHJpYnV0ZU5hbWUoQ1NTUHJvcGVydHlJRCBjc3NQcm9wZXJ0eUlkKQogewogICAgIC8vIGh0dHBz
Oi8vZHJhZnRzLmNzc3dnLm9yZy93ZWItYW5pbWF0aW9ucy0xLyNhbmltYXRpb24tcHJvcGVydHkt
bmFtZS10by1pZGwtYXR0cmlidXRlLW5hbWUKICAgICAvLyAxLiBJZiBwcm9wZXJ0eSBmb2xsb3dz
IHRoZSA8Y3VzdG9tLXByb3BlcnR5LW5hbWU+IHByb2R1Y3Rpb24sIHJldHVybiBwcm9wZXJ0eS4K
QEAgLTExMCw3ICsxMTAsNyBAQCBzdGF0aWMgaW5saW5lIENTU1Byb3BlcnR5SUQgSURMQXR0cmli
dXRlTmFtZVRvQW5pbWF0aW9uUHJvcGVydHlOYW1lKGNvbnN0IFN0cmluZwogCiAgICAgLy8gV2Ug
bmVlZCB0byBjaGVjayB0aGF0IGNvbnZlcnRpbmcgdGhlIHByb3BlcnR5IGJhY2sgdG8gSURMIGZv
cm0geWllbGRzIHRoZSBzYW1lIHJlc3VsdCBzdWNoIHRoYXQgYSBwcm9wZXJ0eSBwYXNzZWQKICAg
ICAvLyBpbiBub24tSURMIGZvcm0gaXMgcmVqZWN0ZWQsIGZvciBpbnN0YW5jZSAiZm9udC1zaXpl
Ii4KLSAgICBpZiAoaWRsQXR0cmlidXRlTmFtZSAhPSBDU1NQcm9wZXJ0eUlEVG9JRExBdHRyaWJ1
dGVOYW1lKGNzc1Byb3BlcnR5SWQpKQorICAgIGlmIChpZGxBdHRyaWJ1dGVOYW1lICE9IEtleWZy
YW1lRWZmZWN0OjpDU1NQcm9wZXJ0eUlEVG9JRExBdHRyaWJ1dGVOYW1lKGNzc1Byb3BlcnR5SWQp
KQogICAgICAgICByZXR1cm4gQ1NTUHJvcGVydHlJbnZhbGlkOwogCiAgICAgcmV0dXJuIGNzc1By
b3BlcnR5SWQ7CkBAIC0zMjcsNyArMzI3LDcgQEAgc3RhdGljIGlubGluZSBFeGNlcHRpb25Pcjx2
b2lkPiBwcm9jZXNzSXRlcmFibGVLZXlmcmFtZXMoSlNHbG9iYWxPYmplY3QmIGxleGljYWwKICAg
ICAgICAgICAgIEFTU0VSVChwcm9wZXJ0eUFuZFZhbHVlLnZhbHVlcy5zaXplKCkgPT0gMSk7CiAg
ICAgICAgICAgICBhdXRvIHN0cmluZ1ZhbHVlID0gcHJvcGVydHlBbmRWYWx1ZS52YWx1ZXNbMF07
CiAgICAgICAgICAgICBpZiAoa2V5ZnJhbWVPdXRwdXQuc3R5bGUtPnNldFByb3BlcnR5KGNzc1By
b3BlcnR5SWQsIHN0cmluZ1ZhbHVlLCBmYWxzZSwgcGFyc2VyQ29udGV4dCkpCi0gICAgICAgICAg
ICAgICAga2V5ZnJhbWVPdXRwdXQudW5wYXJzZWRTdHlsZS5zZXQoY3NzUHJvcGVydHlJZCwgc3Ry
aW5nVmFsdWUpOworICAgICAgICAgICAgICAgIGtleWZyYW1lT3V0cHV0LnN0eWxlU3RyaW5ncy5z
ZXQoY3NzUHJvcGVydHlJZCwgc3RyaW5nVmFsdWUpOwogICAgICAgICB9CiAKICAgICAgICAgcGFy
c2VkS2V5ZnJhbWVzLmFwcGVuZChXVEZNb3ZlKGtleWZyYW1lT3V0cHV0KSk7CkBAIC0zNjUsNyAr
MzY1LDcgQEAgc3RhdGljIGlubGluZSBFeGNlcHRpb25Pcjx2b2lkPiBwcm9jZXNzUHJvcGVydHlJ
bmRleGVkS2V5ZnJhbWVzKEpTR2xvYmFsT2JqZWN0JgogICAgICAgICAgICAgS2V5ZnJhbWVFZmZl
Y3Q6OlBhcnNlZEtleWZyYW1lIGs7CiAgICAgICAgICAgICAvLyAyLiBBZGQgdGhlIHByb3BlcnR5
LXZhbHVlIHBhaXIsIHByb3BlcnR5IG5hbWUg4oaSIHYsIHRvIGsuCiAgICAgICAgICAgICBpZiAo
ay5zdHlsZS0+c2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2LCBmYWxzZSwgcGFyc2VyQ29udGV4
dCkpCi0gICAgICAgICAgICAgICAgay51bnBhcnNlZFN0eWxlLnNldChwcm9wZXJ0eU5hbWUsIHYp
OworICAgICAgICAgICAgICAgIGsuc3R5bGVTdHJpbmdzLnNldChwcm9wZXJ0eU5hbWUsIHYpOwog
ICAgICAgICAgICAgLy8gMy4gQXBwZW5kIGsgdG8gcHJvcGVydHkga2V5ZnJhbWVzLgogICAgICAg
ICAgICAgcHJvcGVydHlLZXlmcmFtZXMuYXBwZW5kKFdURk1vdmUoaykpOwogICAgICAgICB9CkBA
IC00MDIsNyArNDAyLDcgQEAgc3RhdGljIGlubGluZSBFeGNlcHRpb25Pcjx2b2lkPiBwcm9jZXNz
UHJvcGVydHlJbmRleGVkS2V5ZnJhbWVzKEpTR2xvYmFsT2JqZWN0JgogICAgICAgICBpZiAoa2V5
ZnJhbWUuc3R5bGUtPnByb3BlcnR5Q291bnQoKSkgewogICAgICAgICAgICAgYXV0byBwcm9wZXJ0
eSA9IGtleWZyYW1lLnN0eWxlLT5wcm9wZXJ0eUF0KDApOwogICAgICAgICAgICAgcHJldmlvdXNL
ZXlmcmFtZS5zdHlsZS0+c2V0UHJvcGVydHkocHJvcGVydHkuaWQoKSwgcHJvcGVydHkudmFsdWUo
KSk7Ci0gICAgICAgICAgICBwcmV2aW91c0tleWZyYW1lLnVucGFyc2VkU3R5bGUuc2V0KHByb3Bl
cnR5LmlkKCksIGtleWZyYW1lLnVucGFyc2VkU3R5bGUuZ2V0KHByb3BlcnR5LmlkKCkpKTsKKyAg
ICAgICAgICAgIHByZXZpb3VzS2V5ZnJhbWUuc3R5bGVTdHJpbmdzLnNldChwcm9wZXJ0eS5pZCgp
LCBrZXlmcmFtZS5zdHlsZVN0cmluZ3MuZ2V0KHByb3BlcnR5LmlkKCkpKTsKICAgICAgICAgfQog
ICAgICAgICAvLyBTaW5jZSB3ZSd2ZSBwcm9jZXNzZWQgdGhpcyBrZXlmcmFtZSwgd2UgY2FuIHJl
bW92ZSBpdCBhbmQga2VlcCBpIHRoZSBzYW1lCiAgICAgICAgIC8vIHNvIHRoYXQgd2UgcHJvY2Vz
cyB0aGUgbmV4dCBrZXlmcmFtZSBpbiB0aGUgbmV4dCBsb29wIGl0ZXJhdGlvbi4KQEAgLTU1OSw3
ICs1NTksNyBAQCB2b2lkIEtleWZyYW1lRWZmZWN0Ojpjb3B5UHJvcGVydGllc0Zyb21Tb3VyY2Uo
UmVmPEtleWZyYW1lRWZmZWN0PiYmIHNvdXJjZSkKICAgICAgICAgcGFyc2VkS2V5ZnJhbWUuZWFz
aW5nID0gc291cmNlUGFyc2VkS2V5ZnJhbWUuZWFzaW5nOwogICAgICAgICBwYXJzZWRLZXlmcmFt
ZS5vZmZzZXQgPSBzb3VyY2VQYXJzZWRLZXlmcmFtZS5vZmZzZXQ7CiAgICAgICAgIHBhcnNlZEtl
eWZyYW1lLmNvbXBvc2l0ZSA9IHNvdXJjZVBhcnNlZEtleWZyYW1lLmNvbXBvc2l0ZTsKLSAgICAg
ICAgcGFyc2VkS2V5ZnJhbWUudW5wYXJzZWRTdHlsZSA9IHNvdXJjZVBhcnNlZEtleWZyYW1lLnVu
cGFyc2VkU3R5bGU7CisgICAgICAgIHBhcnNlZEtleWZyYW1lLnN0eWxlU3RyaW5ncyA9IHNvdXJj
ZVBhcnNlZEtleWZyYW1lLnN0eWxlU3RyaW5nczsKICAgICAgICAgcGFyc2VkS2V5ZnJhbWUuY29t
cHV0ZWRPZmZzZXQgPSBzb3VyY2VQYXJzZWRLZXlmcmFtZS5jb21wdXRlZE9mZnNldDsKICAgICAg
ICAgcGFyc2VkS2V5ZnJhbWUudGltaW5nRnVuY3Rpb24gPSBzb3VyY2VQYXJzZWRLZXlmcmFtZS50
aW1pbmdGdW5jdGlvbjsKICAgICAgICAgcGFyc2VkS2V5ZnJhbWUuc3R5bGUgPSBzb3VyY2VQYXJz
ZWRLZXlmcmFtZS5zdHlsZS0+bXV0YWJsZUNvcHkoKTsKQEAgLTU4MiwyMTQgKzU4MiwxNDMgQEAg
dm9pZCBLZXlmcmFtZUVmZmVjdDo6Y29weVByb3BlcnRpZXNGcm9tU291cmNlKFJlZjxLZXlmcmFt
ZUVmZmVjdD4mJiBzb3VyY2UpCiAgICAgc2V0QmxlbmRpbmdLZXlmcmFtZXMoa2V5ZnJhbWVMaXN0
KTsKIH0KIAotVmVjdG9yPFN0cm9uZzxKU09iamVjdD4+IEtleWZyYW1lRWZmZWN0OjpnZXRCaW5k
aW5nc0tleWZyYW1lcyhKU0dsb2JhbE9iamVjdCYgbGV4aWNhbEdsb2JhbE9iamVjdCwgRG9jdW1l
bnQmIGRvY3VtZW50KQotewotICAgIGlmIChpczxEZWNsYXJhdGl2ZUFuaW1hdGlvbj4oYW5pbWF0
aW9uKCkpKQotICAgICAgICBkb3duY2FzdDxEZWNsYXJhdGl2ZUFuaW1hdGlvbj4oKmFuaW1hdGlv
bigpKS5mbHVzaFBlbmRpbmdTdHlsZUNoYW5nZXMoKTsKLSAgICByZXR1cm4gZ2V0S2V5ZnJhbWVz
KGxleGljYWxHbG9iYWxPYmplY3QsIGRvY3VtZW50KTsKLX0KLQotVmVjdG9yPFN0cm9uZzxKU09i
amVjdD4+IEtleWZyYW1lRWZmZWN0OjpnZXRLZXlmcmFtZXMoSlNHbG9iYWxPYmplY3QmIGxleGlj
YWxHbG9iYWxPYmplY3QsIERvY3VtZW50JiBkb2N1bWVudCkKK1ZlY3RvcjxLZXlmcmFtZUVmZmVj
dDo6Q29tcHV0ZWRLZXlmcmFtZT4gS2V5ZnJhbWVFZmZlY3Q6OmdldEtleWZyYW1lcyhEb2N1bWVu
dCYgZG9jdW1lbnQpCiB7CiAgICAgLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL3dlYi1hbmlt
YXRpb25zLTEvI2RvbS1rZXlmcmFtZWVmZmVjdHJlYWRvbmx5LWdldGtleWZyYW1lcwogCi0gICAg
YXV0byBzdXBwb3J0c0NvbXBvc2l0ZU9wZXJhdGlvbiA9IGRvY3VtZW50LnNldHRpbmdzKCkud2Vi
QW5pbWF0aW9uc0NvbXBvc2l0ZU9wZXJhdGlvbnNFbmFibGVkKCk7Ci0KLSAgICBhdXRvIGxvY2sg
PSBKU0xvY2tIb2xkZXIgeyAmbGV4aWNhbEdsb2JhbE9iamVjdCB9OworICAgIGlmIChpczxEZWNs
YXJhdGl2ZUFuaW1hdGlvbj4oYW5pbWF0aW9uKCkpKQorICAgICAgICBkb3duY2FzdDxEZWNsYXJh
dGl2ZUFuaW1hdGlvbj4oKmFuaW1hdGlvbigpKS5mbHVzaFBlbmRpbmdTdHlsZUNoYW5nZXMoKTsK
IAotICAgIC8vIFNpbmNlIGtleWZyYW1lcyBhcmUgcmVwcmVzZW50ZWQgYnkgYSBwYXJ0aWFsbHkg
b3Blbi1lbmRlZCBkaWN0aW9uYXJ5IHR5cGUgdGhhdCBpcyBub3QgY3VycmVudGx5IGFibGUgdG8g
YmUgZXhwcmVzc2VkIHdpdGggV2ViSURMLAotICAgIC8vIHRoZSBwcm9jZWR1cmUgdXNlZCB0byBw
cmVwYXJlIHRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgaXMgZGVmaW5lZCBpbiBwcm9zZSBiZWxv
dzoKLSAgICAvLwotICAgIC8vIDEuIExldCByZXN1bHQgYmUgYW4gZW1wdHkgc2VxdWVuY2Ugb2Yg
b2JqZWN0cy4KLSAgICBWZWN0b3I8U3Ryb25nPEpTT2JqZWN0Pj4gcmVzdWx0OworICAgIFZlY3Rv
cjxDb21wdXRlZEtleWZyYW1lPiBjb21wdXRlZEtleWZyYW1lczsKIAotICAgIC8vIDIuIExldCBr
ZXlmcmFtZXMgYmUgdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgcHJvY2VkdXJlIHRvIGNvbXB1
dGUgbWlzc2luZyBrZXlmcmFtZSBvZmZzZXRzIHRvIHRoZSBrZXlmcmFtZXMgZm9yIHRoaXMga2V5
ZnJhbWUgZWZmZWN0LgorICAgIGlmICghbV9wYXJzZWRLZXlmcmFtZXMuaXNFbXB0eSgpIHx8IG1f
YmxlbmRpbmdLZXlmcmFtZXNTb3VyY2UgPT0gQmxlbmRpbmdLZXlmcmFtZXNTb3VyY2U6OldlYkFu
aW1hdGlvbiB8fCAhbV9ibGVuZGluZ0tleWZyYW1lcy5jb250YWluc0FuaW1hdGFibGVQcm9wZXJ0
eSgpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9wYXJzZWRLZXlmcmFtZXMu
c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIENvbXB1dGVkS2V5ZnJhbWUgY29tcHV0ZWRLZXlm
cmFtZSB7IG1fcGFyc2VkS2V5ZnJhbWVzW2ldIH07CisgICAgICAgICAgICBjb21wdXRlZEtleWZy
YW1lLmVhc2luZyA9IHRpbWluZ0Z1bmN0aW9uRm9yS2V5ZnJhbWVBdEluZGV4KGkpLT5jc3NUZXh0
KCk7CisgICAgICAgICAgICBjb21wdXRlZEtleWZyYW1lcy5hcHBlbmQoY29tcHV0ZWRLZXlmcmFt
ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbXB1dGVkS2V5ZnJhbWVzOworICAgIH0K
IAotICAgIC8vIDMuIEZvciBlYWNoIGtleWZyYW1lIGluIGtleWZyYW1lcyBwZXJmb3JtIHRoZSBm
b2xsb3dpbmcgc3RlcHM6Ci0gICAgaWYgKG1fcGFyc2VkS2V5ZnJhbWVzLmlzRW1wdHkoKSAmJiBt
X2JsZW5kaW5nS2V5ZnJhbWVzU291cmNlICE9IEJsZW5kaW5nS2V5ZnJhbWVzU291cmNlOjpXZWJB
bmltYXRpb24gJiYgbV9ibGVuZGluZ0tleWZyYW1lcy5jb250YWluc0FuaW1hdGFibGVQcm9wZXJ0
eSgpKSB7Ci0gICAgICAgIGF1dG8qIHRhcmdldCA9IG1fdGFyZ2V0LmdldCgpOwotICAgICAgICBh
dXRvKiByZW5kZXJlciA9IHRoaXMtPnJlbmRlcmVyKCk7Ci0gICAgICAgIGF1dG8qIGxhc3RTdHls
ZUNoYW5nZUV2ZW50U3R5bGUgPSB0YXJnZXRTdHlsZWFibGUoKS0+bGFzdFN0eWxlQ2hhbmdlRXZl
bnRTdHlsZSgpOworICAgIGF1dG8qIHRhcmdldCA9IG1fdGFyZ2V0LmdldCgpOworICAgIGF1dG8q
IHJlbmRlcmVyID0gdGhpcy0+cmVuZGVyZXIoKTsKKyAgICBhdXRvKiBsYXN0U3R5bGVDaGFuZ2VF
dmVudFN0eWxlID0gdGFyZ2V0U3R5bGVhYmxlKCktPmxhc3RTdHlsZUNoYW5nZUV2ZW50U3R5bGUo
KTsKIAotICAgICAgICBhdXRvIGNvbXB1dGVkU3R5bGVFeHRyYWN0b3IgPSBDb21wdXRlZFN0eWxl
RXh0cmFjdG9yKHRhcmdldCwgZmFsc2UsIG1fcHNldWRvSWQpOworICAgIGF1dG8gY29tcHV0ZWRT
dHlsZUV4dHJhY3RvciA9IENvbXB1dGVkU3R5bGVFeHRyYWN0b3IodGFyZ2V0LCBmYWxzZSwgbV9w
c2V1ZG9JZCk7CiAKLSAgICAgICAgS2V5ZnJhbWVMaXN0IGNvbXB1dGVkS2V5ZnJhbWVzKG1fYmxl
bmRpbmdLZXlmcmFtZXMuYW5pbWF0aW9uTmFtZSgpKTsKLSAgICAgICAgY29tcHV0ZWRLZXlmcmFt
ZXMuY29weUtleWZyYW1lcyhtX2JsZW5kaW5nS2V5ZnJhbWVzKTsKLSAgICAgICAgY29tcHV0ZWRL
ZXlmcmFtZXMuZmlsbEltcGxpY2l0S2V5ZnJhbWVzKCptX3RhcmdldCwgbV90YXJnZXQtPnN0eWxl
UmVzb2x2ZXIoKSwgbGFzdFN0eWxlQ2hhbmdlRXZlbnRTdHlsZSwgbnVsbHB0cik7CisgICAgS2V5
ZnJhbWVMaXN0IGNvbXB1dGVkS2V5ZnJhbWVMaXN0KG1fYmxlbmRpbmdLZXlmcmFtZXMuYW5pbWF0
aW9uTmFtZSgpKTsKKyAgICBjb21wdXRlZEtleWZyYW1lTGlzdC5jb3B5S2V5ZnJhbWVzKG1fYmxl
bmRpbmdLZXlmcmFtZXMpOworICAgIGNvbXB1dGVkS2V5ZnJhbWVMaXN0LmZpbGxJbXBsaWNpdEtl
eWZyYW1lcygqbV90YXJnZXQsIG1fdGFyZ2V0LT5zdHlsZVJlc29sdmVyKCksIGxhc3RTdHlsZUNo
YW5nZUV2ZW50U3R5bGUsIG51bGxwdHIpOwogCi0gICAgICAgIGF1dG8ga2V5ZnJhbWVSdWxlcyA9
IFsmXSgpIC0+IGNvbnN0IFZlY3RvcjxSZWY8U3R5bGVSdWxlS2V5ZnJhbWU+PiB7Ci0gICAgICAg
ICAgICBpZiAoIWlzPENTU0FuaW1hdGlvbj4oYW5pbWF0aW9uKCkpKQotICAgICAgICAgICAgICAg
IHJldHVybiB7IH07CisgICAgYXV0byBrZXlmcmFtZVJ1bGVzID0gWyZdKCkgLT4gY29uc3QgVmVj
dG9yPFJlZjxTdHlsZVJ1bGVLZXlmcmFtZT4+IHsKKyAgICAgICAgaWYgKCFpczxDU1NBbmltYXRp
b24+KGFuaW1hdGlvbigpKSkKKyAgICAgICAgICAgIHJldHVybiB7IH07CiAKLSAgICAgICAgICAg
IGF1dG8mIGJhY2tpbmdBbmltYXRpb24gPSBkb3duY2FzdDxDU1NBbmltYXRpb24+KCphbmltYXRp
b24oKSkuYmFja2luZ0FuaW1hdGlvbigpOwotICAgICAgICAgICAgYXV0byogc3R5bGVTY29wZSA9
IFN0eWxlOjpTY29wZTo6Zm9yT3JkaW5hbCgqbV90YXJnZXQsIGJhY2tpbmdBbmltYXRpb24ubmFt
ZVN0eWxlU2NvcGVPcmRpbmFsKCkpOwotICAgICAgICAgICAgaWYgKCFzdHlsZVNjb3BlKQotICAg
ICAgICAgICAgICAgIHJldHVybiB7IH07CisgICAgICAgIGF1dG8mIGJhY2tpbmdBbmltYXRpb24g
PSBkb3duY2FzdDxDU1NBbmltYXRpb24+KCphbmltYXRpb24oKSkuYmFja2luZ0FuaW1hdGlvbigp
OworICAgICAgICBhdXRvKiBzdHlsZVNjb3BlID0gU3R5bGU6OlNjb3BlOjpmb3JPcmRpbmFsKCpt
X3RhcmdldCwgYmFja2luZ0FuaW1hdGlvbi5uYW1lU3R5bGVTY29wZU9yZGluYWwoKSk7CisgICAg
ICAgIGlmICghc3R5bGVTY29wZSkKKyAgICAgICAgICAgIHJldHVybiB7IH07CiAKLSAgICAgICAg
ICAgIHJldHVybiBzdHlsZVNjb3BlLT5yZXNvbHZlcigpLmtleWZyYW1lUnVsZXNGb3JOYW1lKGNv
bXB1dGVkS2V5ZnJhbWVzLmFuaW1hdGlvbk5hbWUoKSk7Ci0gICAgICAgIH0oKTsKKyAgICAgICAg
cmV0dXJuIHN0eWxlU2NvcGUtPnJlc29sdmVyKCkua2V5ZnJhbWVSdWxlc0Zvck5hbWUoY29tcHV0
ZWRLZXlmcmFtZUxpc3QuYW5pbWF0aW9uTmFtZSgpKTsKKyAgICB9KCk7CiAKLSAgICAgICAgYXV0
byBrZXlmcmFtZVJ1bGVGb3JLZXkgPSBbJl0oZG91YmxlIGtleSkgLT4gU3R5bGVSdWxlS2V5ZnJh
bWUqIHsKLSAgICAgICAgICAgIGZvciAoYXV0byYga2V5ZnJhbWVSdWxlIDoga2V5ZnJhbWVSdWxl
cykgewotICAgICAgICAgICAgICAgIGZvciAoYXV0byBrZXlmcmFtZVJ1bGVLZXkgOiBrZXlmcmFt
ZVJ1bGUtPmtleXMoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ZnJhbWVSdWxlS2V5
ID09IGtleSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXlmcmFtZVJ1bGUucHRy
KCk7Ci0gICAgICAgICAgICAgICAgfQorICAgIGF1dG8ga2V5ZnJhbWVSdWxlRm9yS2V5ID0gWyZd
KGRvdWJsZSBrZXkpIC0+IFN0eWxlUnVsZUtleWZyYW1lKiB7CisgICAgICAgIGZvciAoYXV0byYg
a2V5ZnJhbWVSdWxlIDoga2V5ZnJhbWVSdWxlcykgeworICAgICAgICAgICAgZm9yIChhdXRvIGtl
eWZyYW1lUnVsZUtleSA6IGtleWZyYW1lUnVsZS0+a2V5cygpKSB7CisgICAgICAgICAgICAgICAg
aWYgKGtleWZyYW1lUnVsZUtleSA9PSBrZXkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBr
ZXlmcmFtZVJ1bGUucHRyKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVs
bHB0cjsKLSAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAg
ICB9OwogCi0gICAgICAgIGF1dG8gc3R5bGVQcm9wZXJ0aWVzID0gTXV0YWJsZVN0eWxlUHJvcGVy
dGllczo6Y3JlYXRlKCk7Ci0gICAgICAgIGlmIChtX2JsZW5kaW5nS2V5ZnJhbWVzU291cmNlID09
IEJsZW5kaW5nS2V5ZnJhbWVzU291cmNlOjpDU1NBbmltYXRpb24pIHsKLSAgICAgICAgICAgIGF1
dG8gbWF0Y2hpbmdSdWxlcyA9IG1fdGFyZ2V0LT5zdHlsZVJlc29sdmVyKCkucHNldWRvU3R5bGVS
dWxlc0ZvckVsZW1lbnQodGFyZ2V0LCBtX3BzZXVkb0lkLCBTdHlsZTo6UmVzb2x2ZXI6OkFsbENT
U1J1bGVzKTsKLSAgICAgICAgICAgIGZvciAoYXV0byYgbWF0Y2hlZFJ1bGUgOiBtYXRjaGluZ1J1
bGVzKQotICAgICAgICAgICAgICAgIHN0eWxlUHJvcGVydGllcy0+bWVyZ2VBbmRPdmVycmlkZU9u
Q29uZmxpY3QobWF0Y2hlZFJ1bGUtPnByb3BlcnRpZXMoKSk7Ci0gICAgICAgICAgICBpZiAoaXM8
U3R5bGVkRWxlbWVudD4obV90YXJnZXQpICYmIG1fcHNldWRvSWQgPT0gUHNldWRvSWQ6Ok5vbmUp
IHsKLSAgICAgICAgICAgICAgICBpZiAoYXV0byogaW5saW5lUHJvcGVydGllcyA9IGRvd25jYXN0
PFN0eWxlZEVsZW1lbnQ+KCptX3RhcmdldCkuaW5saW5lU3R5bGUoKSkKLSAgICAgICAgICAgICAg
ICAgICAgc3R5bGVQcm9wZXJ0aWVzLT5tZXJnZUFuZE92ZXJyaWRlT25Db25mbGljdCgqaW5saW5l
UHJvcGVydGllcyk7Ci0gICAgICAgICAgICB9CisgICAgYXV0byBzdHlsZVByb3BlcnRpZXMgPSBN
dXRhYmxlU3R5bGVQcm9wZXJ0aWVzOjpjcmVhdGUoKTsKKyAgICBpZiAobV9ibGVuZGluZ0tleWZy
YW1lc1NvdXJjZSA9PSBCbGVuZGluZ0tleWZyYW1lc1NvdXJjZTo6Q1NTQW5pbWF0aW9uKSB7Cisg
ICAgICAgIGF1dG8gbWF0Y2hpbmdSdWxlcyA9IG1fdGFyZ2V0LT5zdHlsZVJlc29sdmVyKCkucHNl
dWRvU3R5bGVSdWxlc0ZvckVsZW1lbnQodGFyZ2V0LCBtX3BzZXVkb0lkLCBTdHlsZTo6UmVzb2x2
ZXI6OkFsbENTU1J1bGVzKTsKKyAgICAgICAgZm9yIChhdXRvJiBtYXRjaGVkUnVsZSA6IG1hdGNo
aW5nUnVsZXMpCisgICAgICAgICAgICBzdHlsZVByb3BlcnRpZXMtPm1lcmdlQW5kT3ZlcnJpZGVP
bkNvbmZsaWN0KG1hdGNoZWRSdWxlLT5wcm9wZXJ0aWVzKCkpOworICAgICAgICBpZiAoaXM8U3R5
bGVkRWxlbWVudD4obV90YXJnZXQpICYmIG1fcHNldWRvSWQgPT0gUHNldWRvSWQ6Ok5vbmUpIHsK
KyAgICAgICAgICAgIGlmIChhdXRvKiBpbmxpbmVQcm9wZXJ0aWVzID0gZG93bmNhc3Q8U3R5bGVk
RWxlbWVudD4oKm1fdGFyZ2V0KS5pbmxpbmVTdHlsZSgpKQorICAgICAgICAgICAgICAgIHN0eWxl
UHJvcGVydGllcy0+bWVyZ2VBbmRPdmVycmlkZU9uQ29uZmxpY3QoKmlubGluZVByb3BlcnRpZXMp
OwogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIC8vIFdlIG5lZWQgdG8gZXN0YWJsaXNoIHdo
aWNoIHByb3BlcnRpZXMgYXJlIGltcGxpY2l0IGZvciAwJSBhbmQgMTAwJS4KLSAgICAgICAgSGFz
aFNldDxDU1NQcm9wZXJ0eUlEPiB6ZXJvS2V5ZnJhbWVQcm9wZXJ0aWVzID0gY29tcHV0ZWRLZXlm
cmFtZXMucHJvcGVydGllcygpOwotICAgICAgICBIYXNoU2V0PENTU1Byb3BlcnR5SUQ+IG9uZUtl
eWZyYW1lUHJvcGVydGllcyA9IGNvbXB1dGVkS2V5ZnJhbWVzLnByb3BlcnRpZXMoKTsKLSAgICAg
ICAgemVyb0tleWZyYW1lUHJvcGVydGllcy5yZW1vdmUoQ1NTUHJvcGVydHlDdXN0b20pOwotICAg
ICAgICBvbmVLZXlmcmFtZVByb3BlcnRpZXMucmVtb3ZlKENTU1Byb3BlcnR5Q3VzdG9tKTsKLSAg
ICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb21wdXRlZEtleWZyYW1lcy5zaXplKCk7ICsr
aSkgewotICAgICAgICAgICAgYXV0byYga2V5ZnJhbWUgPSBjb21wdXRlZEtleWZyYW1lc1tpXTsK
LSAgICAgICAgICAgIGlmICgha2V5ZnJhbWUua2V5KCkpIHsKLSAgICAgICAgICAgICAgICBmb3Ig
KGF1dG8gY3NzUHJvcGVydHlJZCA6IGtleWZyYW1lLnByb3BlcnRpZXMoKSkKLSAgICAgICAgICAg
ICAgICAgICAgemVyb0tleWZyYW1lUHJvcGVydGllcy5yZW1vdmUoY3NzUHJvcGVydHlJZCk7Ci0g
ICAgICAgICAgICB9IGVsc2UgaWYgKGtleWZyYW1lLmtleSgpID09IDEpIHsKLSAgICAgICAgICAg
ICAgICBmb3IgKGF1dG8gY3NzUHJvcGVydHlJZCA6IGtleWZyYW1lLnByb3BlcnRpZXMoKSkKLSAg
ICAgICAgICAgICAgICAgICAgb25lS2V5ZnJhbWVQcm9wZXJ0aWVzLnJlbW92ZShjc3NQcm9wZXJ0
eUlkKTsKLSAgICAgICAgICAgIH0KKyAgICAvLyBXZSBuZWVkIHRvIGVzdGFibGlzaCB3aGljaCBw
cm9wZXJ0aWVzIGFyZSBpbXBsaWNpdCBmb3IgMCUgYW5kIDEwMCUuCisgICAgSGFzaFNldDxDU1NQ
cm9wZXJ0eUlEPiB6ZXJvS2V5ZnJhbWVQcm9wZXJ0aWVzID0gY29tcHV0ZWRLZXlmcmFtZUxpc3Qu
cHJvcGVydGllcygpOworICAgIEhhc2hTZXQ8Q1NTUHJvcGVydHlJRD4gb25lS2V5ZnJhbWVQcm9w
ZXJ0aWVzID0gY29tcHV0ZWRLZXlmcmFtZUxpc3QucHJvcGVydGllcygpOworICAgIHplcm9LZXlm
cmFtZVByb3BlcnRpZXMucmVtb3ZlKENTU1Byb3BlcnR5Q3VzdG9tKTsKKyAgICBvbmVLZXlmcmFt
ZVByb3BlcnRpZXMucmVtb3ZlKENTU1Byb3BlcnR5Q3VzdG9tKTsKKyAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IGNvbXB1dGVkS2V5ZnJhbWVMaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgIGF1
dG8mIGtleWZyYW1lID0gY29tcHV0ZWRLZXlmcmFtZUxpc3RbaV07CisgICAgICAgIGlmICgha2V5
ZnJhbWUua2V5KCkpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byBjc3NQcm9wZXJ0eUlkIDoga2V5
ZnJhbWUucHJvcGVydGllcygpKQorICAgICAgICAgICAgICAgIHplcm9LZXlmcmFtZVByb3BlcnRp
ZXMucmVtb3ZlKGNzc1Byb3BlcnR5SWQpOworICAgICAgICB9IGVsc2UgaWYgKGtleWZyYW1lLmtl
eSgpID09IDEpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byBjc3NQcm9wZXJ0eUlkIDoga2V5ZnJh
bWUucHJvcGVydGllcygpKQorICAgICAgICAgICAgICAgIG9uZUtleWZyYW1lUHJvcGVydGllcy5y
ZW1vdmUoY3NzUHJvcGVydHlJZCk7CiAgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCBjb21wdXRlZEtleWZyYW1lcy5zaXplKCk7ICsraSkgewotICAgICAg
ICAgICAgLy8gMS4gSW5pdGlhbGl6ZSBhIGRpY3Rpb25hcnkgb2JqZWN0LCBvdXRwdXQga2V5ZnJh
bWUsIHVzaW5nIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbjoKLSAgICAgICAgICAgIC8vCi0gICAg
ICAgICAgICAvLyBkaWN0aW9uYXJ5IEJhc2VDb21wdXRlZEtleWZyYW1lIHsKLSAgICAgICAgICAg
IC8vICAgICAgZG91YmxlPyAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG51bGw7Ci0gICAgICAg
ICAgICAvLyAgICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBjb21wdXRlZE9mZnNldDsKLSAg
ICAgICAgICAgIC8vICAgICAgRE9NU3RyaW5nICAgICAgICAgICAgICAgIGVhc2luZyA9ICJsaW5l
YXIiOwotICAgICAgICAgICAgLy8gICAgICBDb21wb3NpdGVPcGVyYXRpb25PckF1dG8gY29tcG9z
aXRlID0gImF1dG8iOwotICAgICAgICAgICAgLy8gfTsKLQotICAgICAgICAgICAgYXV0byYga2V5
ZnJhbWUgPSBjb21wdXRlZEtleWZyYW1lc1tpXTsKLSAgICAgICAgICAgIGF1dG8mIHN0eWxlID0g
KmtleWZyYW1lLnN0eWxlKCk7Ci0gICAgICAgICAgICBhdXRvKiBrZXlmcmFtZVJ1bGUgPSBrZXlm
cmFtZVJ1bGVGb3JLZXkoa2V5ZnJhbWUua2V5KCkpOwotCi0gICAgICAgICAgICAvLyAyLiBTZXQg
b2Zmc2V0LCBjb21wdXRlZE9mZnNldCwgZWFzaW5nIG1lbWJlcnMgb2Ygb3V0cHV0IGtleWZyYW1l
IHRvIHRoZSByZXNwZWN0aXZlIHZhbHVlcyBrZXlmcmFtZSBvZmZzZXQsIGNvbXB1dGVkIGtleWZy
YW1lIG9mZnNldCwKLSAgICAgICAgICAgIC8vIGFuZCBrZXlmcmFtZS1zcGVjaWZpYyB0aW1pbmcg
ZnVuY3Rpb24gb2Yga2V5ZnJhbWUuCi0gICAgICAgICAgICBCYXNlQ29tcHV0ZWRLZXlmcmFtZSBj
b21wdXRlZEtleWZyYW1lOwotICAgICAgICAgICAgY29tcHV0ZWRLZXlmcmFtZS5vZmZzZXQgPSBr
ZXlmcmFtZS5rZXkoKTsKLSAgICAgICAgICAgIGNvbXB1dGVkS2V5ZnJhbWUuY29tcHV0ZWRPZmZz
ZXQgPSBrZXlmcmFtZS5rZXkoKTsKLSAgICAgICAgICAgIC8vIEZvciBDU1MgdHJhbnNpdGlvbnMs
IGFsbCBrZXlmcmFtZXMgc2hvdWxkIHJldHVybiAibGluZWFyIiBzaW5jZSB0aGUgZWZmZWN0J3Mg
Z2xvYmFsIHRpbWluZyBmdW5jdGlvbiBhcHBsaWVzLgotICAgICAgICAgICAgY29tcHV0ZWRLZXlm
cmFtZS5lYXNpbmcgPSBpczxDU1NUcmFuc2l0aW9uPihhbmltYXRpb24oKSkgPyAibGluZWFyIiA6
IHRpbWluZ0Z1bmN0aW9uRm9yQmxlbmRpbmdLZXlmcmFtZShrZXlmcmFtZSktPmNzc1RleHQoKTsK
LQotICAgICAgICAgICAgaWYgKHN1cHBvcnRzQ29tcG9zaXRlT3BlcmF0aW9uKSB7Ci0gICAgICAg
ICAgICAgICAgaWYgKGF1dG8gY29tcG9zaXRlT3BlcmF0aW9uID0ga2V5ZnJhbWUuY29tcG9zaXRl
T3BlcmF0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkS2V5ZnJhbWUuY29tcG9z
aXRlID0gdG9Db21wb3NpdGVPcGVyYXRpb25PckF1dG8oKmNvbXBvc2l0ZU9wZXJhdGlvbik7Ci0g
ICAgICAgICAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb21wdXRlZEtleWZyYW1l
TGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICBhdXRvJiBrZXlmcmFtZSA9IGNvbXB1dGVkS2V5
ZnJhbWVMaXN0W2ldOworICAgICAgICBhdXRvJiBzdHlsZSA9ICprZXlmcmFtZS5zdHlsZSgpOwor
ICAgICAgICBhdXRvKiBrZXlmcmFtZVJ1bGUgPSBrZXlmcmFtZVJ1bGVGb3JLZXkoa2V5ZnJhbWUu
a2V5KCkpOwogCi0gICAgICAgICAgICBhdXRvIG91dHB1dEtleWZyYW1lID0gY29udmVydERpY3Rp
b25hcnlUb0pTKGxleGljYWxHbG9iYWxPYmplY3QsICpqc0Nhc3Q8SlNET01HbG9iYWxPYmplY3Qq
PigmbGV4aWNhbEdsb2JhbE9iamVjdCksIGNvbXB1dGVkS2V5ZnJhbWUpOwotCi0gICAgICAgICAg
ICBhdXRvIGFkZFByb3BlcnR5VG9LZXlmcmFtZSA9IFsmXShDU1NQcm9wZXJ0eUlEIGNzc1Byb3Bl
cnR5SWQpIHsKLSAgICAgICAgICAgICAgICAvLyAxLiBMZXQgcHJvcGVydHkgbmFtZSBiZSB0aGUg
cmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBhbmltYXRpb24gcHJvcGVydHkgbmFtZSB0byBJREwgYXR0
cmlidXRlIG5hbWUgYWxnb3JpdGhtIHRvIHRoZSBwcm9wZXJ0eSBuYW1lIG9mIGRlY2xhcmF0aW9u
LgotICAgICAgICAgICAgICAgIGF1dG8gcHJvcGVydHlOYW1lID0gQ1NTUHJvcGVydHlJRFRvSURM
QXR0cmlidXRlTmFtZShjc3NQcm9wZXJ0eUlkKTsKLSAgICAgICAgICAgICAgICAvLyAyLiBMZXQg
SURMIHZhbHVlIGJlIHRoZSByZXN1bHQgb2Ygc2VyaWFsaXppbmcgdGhlIHByb3BlcnR5IHZhbHVl
IG9mIGRlY2xhcmF0aW9uIGJ5IHBhc3NpbmcgZGVjbGFyYXRpb24gdG8gdGhlIGFsZ29yaXRobSB0
byBzZXJpYWxpemUgYSBDU1MgdmFsdWUuCi0gICAgICAgICAgICAgICAgU3RyaW5nIGlkbFZhbHVl
ID0gIiI7Ci0gICAgICAgICAgICAgICAgaWYgKGtleWZyYW1lUnVsZSkgewotICAgICAgICAgICAg
ICAgICAgICBpZiAoYXV0byBjc3NWYWx1ZSA9IGtleWZyYW1lUnVsZS0+cHJvcGVydGllcygpLmdl
dFByb3BlcnR5Q1NTVmFsdWUoY3NzUHJvcGVydHlJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIGlmICghY3NzVmFsdWUtPmhhc1ZhcmlhYmxlUmVmZXJlbmNlcygpKQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGlkbFZhbHVlID0ga2V5ZnJhbWVSdWxlLT5wcm9wZXJ0aWVzKCkuZ2V0
UHJvcGVydHlWYWx1ZShjc3NQcm9wZXJ0eUlkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaWRsVmFsdWUuaXNFbXB0eSgpKSB7
Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdXRvIGNzc1ZhbHVlID0gc3R5bGVQcm9wZXJ0aWVz
LT5nZXRQcm9wZXJ0eUNTU1ZhbHVlKGNzc1Byb3BlcnR5SWQpKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBpZiAoIWNzc1ZhbHVlLT5oYXNWYXJpYWJsZVJlZmVyZW5jZXMoKSkKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpZGxWYWx1ZSA9IHN0eWxlUHJvcGVydGllcy0+Z2V0UHJvcGVy
dHlWYWx1ZShjc3NQcm9wZXJ0eUlkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaWRsVmFsdWUuaXNFbXB0eSgpKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIGlmIChhdXRvIGNzc1ZhbHVlID0gY29tcHV0ZWRTdHlsZUV4dHJhY3Rv
ci52YWx1ZUZvclByb3BlcnR5SW5TdHlsZShzdHlsZSwgY3NzUHJvcGVydHlJZCwgcmVuZGVyZXIp
KQotICAgICAgICAgICAgICAgICAgICAgICAgaWRsVmFsdWUgPSBjc3NWYWx1ZS0+Y3NzVGV4dCgp
OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyAzLiBMZXQgdmFsdWUgYmUg
dGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIElETCB2YWx1ZSB0byBhbiBFQ01BU2NyaXB0IFN0cmlu
ZyB2YWx1ZS4KLSAgICAgICAgICAgICAgICBhdXRvIHZhbHVlID0gdG9KUzxJRExET01TdHJpbmc+
KGxleGljYWxHbG9iYWxPYmplY3QsIGlkbFZhbHVlKTsKLSAgICAgICAgICAgICAgICAvLyA0LiBD
YWxsIHRoZSBbW0RlZmluZU93blByb3BlcnR5XV0gaW50ZXJuYWwgbWV0aG9kIG9uIG91dHB1dCBr
ZXlmcmFtZSB3aXRoIHByb3BlcnR5IG5hbWUgcHJvcGVydHkgbmFtZSwKLSAgICAgICAgICAgICAg
ICAvLyAgICBQcm9wZXJ0eSBEZXNjcmlwdG9yIHsgW1tXcml0YWJsZV1dOiB0cnVlLCBbW0VudW1l
cmFibGVdXTogdHJ1ZSwgW1tDb25maWd1cmFibGVdXTogdHJ1ZSwgW1tWYWx1ZV1dOiB2YWx1ZSB9
IGFuZCBCb29sZWFuIGZsYWcgZmFsc2UuCi0gICAgICAgICAgICAgICAgSlNPYmplY3Q6OmRlZmlu
ZU93blByb3BlcnR5KG91dHB1dEtleWZyYW1lLCAmbGV4aWNhbEdsb2JhbE9iamVjdCwgQXRvbVN0
cmluZyhwcm9wZXJ0eU5hbWUpLmltcGwoKSwgUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCAwKSwg
ZmFsc2UpOwotICAgICAgICAgICAgfTsKKyAgICAgICAgQ29tcHV0ZWRLZXlmcmFtZSBjb21wdXRl
ZEtleWZyYW1lOworICAgICAgICBjb21wdXRlZEtleWZyYW1lLm9mZnNldCA9IGtleWZyYW1lLmtl
eSgpOworICAgICAgICBjb21wdXRlZEtleWZyYW1lLmNvbXB1dGVkT2Zmc2V0ID0ga2V5ZnJhbWUu
a2V5KCk7CisgICAgICAgIC8vIEZvciBDU1MgdHJhbnNpdGlvbnMsIGFsbCBrZXlmcmFtZXMgc2hv
dWxkIHJldHVybiAibGluZWFyIiBzaW5jZSB0aGUgZWZmZWN0J3MgZ2xvYmFsIHRpbWluZyBmdW5j
dGlvbiBhcHBsaWVzLgorICAgICAgICBjb21wdXRlZEtleWZyYW1lLmVhc2luZyA9IGlzPENTU1Ry
YW5zaXRpb24+KGFuaW1hdGlvbigpKSA/ICJsaW5lYXIiIDogdGltaW5nRnVuY3Rpb25Gb3JCbGVu
ZGluZ0tleWZyYW1lKGtleWZyYW1lKS0+Y3NzVGV4dCgpOwogCi0gICAgICAgICAgICAvLyAzLiBG
b3IgZWFjaCBhbmltYXRpb24gcHJvcGVydHktdmFsdWUgcGFpciBzcGVjaWZpZWQgb24ga2V5ZnJh
bWUsIGRlY2xhcmF0aW9uLCBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0gICAgICAgICAg
ICBmb3IgKGF1dG8gY3NzUHJvcGVydHlJZCA6IGtleWZyYW1lLnByb3BlcnRpZXMoKSkgewotICAg
ICAgICAgICAgICAgIGlmIChjc3NQcm9wZXJ0eUlkID09IENTU1Byb3BlcnR5Q3VzdG9tKQotICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eVRv
S2V5ZnJhbWUoY3NzUHJvcGVydHlJZCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChkb2N1
bWVudC5zZXR0aW5ncygpLndlYkFuaW1hdGlvbnNDb21wb3NpdGVPcGVyYXRpb25zRW5hYmxlZCgp
KSB7CisgICAgICAgICAgICBpZiAoYXV0byBjb21wb3NpdGVPcGVyYXRpb24gPSBrZXlmcmFtZS5j
b21wb3NpdGVPcGVyYXRpb24oKSkKKyAgICAgICAgICAgICAgICBjb21wdXRlZEtleWZyYW1lLmNv
bXBvc2l0ZSA9IHRvQ29tcG9zaXRlT3BlcmF0aW9uT3JBdXRvKCpjb21wb3NpdGVPcGVyYXRpb24p
OworICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIE5vdyBhZGQgdGhlIGltcGxpY2l0IHByb3Bl
cnRpZXMgaW4gY2FzZSB0aGVyZSBhcmUgYW55IGFuZCB3ZSdyZSBkZWFsaW5nIHdpdGggYSAwJSBv
ciAxMDAlIGtleWZyYW1lLgotICAgICAgICAgICAgaWYgKGxhc3RTdHlsZUNoYW5nZUV2ZW50U3R5
bGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWtleWZyYW1lLmtleSgpKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIGZvciAoYXV0byBjc3NQcm9wZXJ0eUlkIDogemVyb0tleWZyYW1lUHJvcGVydGll
cykKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5VG9LZXlmcmFtZShjc3NQcm9w
ZXJ0eUlkKTsKLSAgICAgICAgICAgICAgICAgICAgemVyb0tleWZyYW1lUHJvcGVydGllcy5jbGVh
cigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ZnJhbWUua2V5KCkgPT0gMSkgewot
ICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8gY3NzUHJvcGVydHlJZCA6IG9uZUtleWZyYW1l
UHJvcGVydGllcykKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5VG9LZXlmcmFt
ZShjc3NQcm9wZXJ0eUlkKTsKLSAgICAgICAgICAgICAgICAgICAgb25lS2V5ZnJhbWVQcm9wZXJ0
aWVzLmNsZWFyKCk7CisgICAgICAgIGF1dG8gYWRkUHJvcGVydHlUb0tleWZyYW1lID0gWyZdKENT
U1Byb3BlcnR5SUQgY3NzUHJvcGVydHlJZCkgeworICAgICAgICAgICAgU3RyaW5nIHN0eWxlU3Ry
aW5nID0gIiI7CisgICAgICAgICAgICBpZiAoa2V5ZnJhbWVSdWxlKSB7CisgICAgICAgICAgICAg
ICAgaWYgKGF1dG8gY3NzVmFsdWUgPSBrZXlmcmFtZVJ1bGUtPnByb3BlcnRpZXMoKS5nZXRQcm9w
ZXJ0eUNTU1ZhbHVlKGNzc1Byb3BlcnR5SWQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgh
Y3NzVmFsdWUtPmhhc1ZhcmlhYmxlUmVmZXJlbmNlcygpKQorICAgICAgICAgICAgICAgICAgICAg
ICAgc3R5bGVTdHJpbmcgPSBrZXlmcmFtZVJ1bGUtPnByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eVZh
bHVlKGNzc1Byb3BlcnR5SWQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGlmIChzdHlsZVN0cmluZy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBp
ZiAoYXV0byBjc3NWYWx1ZSA9IHN0eWxlUHJvcGVydGllcy0+Z2V0UHJvcGVydHlDU1NWYWx1ZShj
c3NQcm9wZXJ0eUlkKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWNzc1ZhbHVlLT5oYXNW
YXJpYWJsZVJlZmVyZW5jZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlU3RyaW5n
ID0gc3R5bGVQcm9wZXJ0aWVzLT5nZXRQcm9wZXJ0eVZhbHVlKGNzc1Byb3BlcnR5SWQpOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHlsZVN0cmlu
Zy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXV0byBjc3NWYWx1ZSA9IGNvbXB1
dGVkU3R5bGVFeHRyYWN0b3IudmFsdWVGb3JQcm9wZXJ0eUluU3R5bGUoc3R5bGUsIGNzc1Byb3Bl
cnR5SWQsIHJlbmRlcmVyKSkKKyAgICAgICAgICAgICAgICAgICAgc3R5bGVTdHJpbmcgPSBjc3NW
YWx1ZS0+Y3NzVGV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29tcHV0ZWRLZXlm
cmFtZS5zdHlsZVN0cmluZ3Muc2V0KGNzc1Byb3BlcnR5SWQsIHN0eWxlU3RyaW5nKTsKKyAgICAg
ICAgfTsKIAotICAgICAgICAgICAgLy8gNS4gQXBwZW5kIG91dHB1dCBrZXlmcmFtZSB0byByZXN1
bHQuCi0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKEpTQzo6U3Ryb25nPEpTQzo6SlNPYmplY3Q+
IHsgbGV4aWNhbEdsb2JhbE9iamVjdC52bSgpLCBvdXRwdXRLZXlmcmFtZSB9KTsKKyAgICAgICAg
Zm9yIChhdXRvIGNzc1Byb3BlcnR5SWQgOiBrZXlmcmFtZS5wcm9wZXJ0aWVzKCkpIHsKKyAgICAg
ICAgICAgIGlmIChjc3NQcm9wZXJ0eUlkID09IENTU1Byb3BlcnR5Q3VzdG9tKQorICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgYWRkUHJvcGVydHlUb0tleWZyYW1lKGNzc1By
b3BlcnR5SWQpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBtX3BhcnNlZEtleWZyYW1lcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAg
Ly8gMS4gSW5pdGlhbGl6ZSBhIGRpY3Rpb25hcnkgb2JqZWN0LCBvdXRwdXQga2V5ZnJhbWUsIHVz
aW5nIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbjoKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAg
ICAvLyBkaWN0aW9uYXJ5IEJhc2VDb21wdXRlZEtleWZyYW1lIHsKLSAgICAgICAgICAgIC8vICAg
ICAgZG91YmxlPyAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG51bGw7Ci0gICAgICAgICAgICAv
LyAgICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBjb21wdXRlZE9mZnNldDsKLSAgICAgICAg
ICAgIC8vICAgICAgRE9NU3RyaW5nICAgICAgICAgICAgICAgIGVhc2luZyA9ICJsaW5lYXIiOwot
ICAgICAgICAgICAgLy8gICAgICBDb21wb3NpdGVPcGVyYXRpb25PckF1dG8gY29tcG9zaXRlID0g
ImF1dG8iOwotICAgICAgICAgICAgLy8gfTsKLQotICAgICAgICAgICAgYXV0byYgcGFyc2VkS2V5
ZnJhbWUgPSBtX3BhcnNlZEtleWZyYW1lc1tpXTsKLQotICAgICAgICAgICAgLy8gMi4gU2V0IG9m
ZnNldCwgY29tcHV0ZWRPZmZzZXQsIGVhc2luZywgY29tcG9zaXRlIG1lbWJlcnMgb2Ygb3V0cHV0
IGtleWZyYW1lIHRvIHRoZSByZXNwZWN0aXZlIHZhbHVlcyBrZXlmcmFtZSBvZmZzZXQsIGNvbXB1
dGVkIGtleWZyYW1lCi0gICAgICAgICAgICAvLyBvZmZzZXQsIGtleWZyYW1lLXNwZWNpZmljIHRp
bWluZyBmdW5jdGlvbiBhbmQga2V5ZnJhbWUtc3BlY2lmaWMgY29tcG9zaXRlIG9wZXJhdGlvbiBv
ZiBrZXlmcmFtZS4KLSAgICAgICAgICAgIEJhc2VDb21wdXRlZEtleWZyYW1lIGNvbXB1dGVkS2V5
ZnJhbWU7Ci0gICAgICAgICAgICBjb21wdXRlZEtleWZyYW1lLm9mZnNldCA9IHBhcnNlZEtleWZy
YW1lLm9mZnNldDsKLSAgICAgICAgICAgIGNvbXB1dGVkS2V5ZnJhbWUuY29tcHV0ZWRPZmZzZXQg
PSBwYXJzZWRLZXlmcmFtZS5jb21wdXRlZE9mZnNldDsKLSAgICAgICAgICAgIGNvbXB1dGVkS2V5
ZnJhbWUuZWFzaW5nID0gdGltaW5nRnVuY3Rpb25Gb3JLZXlmcmFtZUF0SW5kZXgoaSktPmNzc1Rl
eHQoKTsKIAotICAgICAgICAgICAgaWYgKHN1cHBvcnRzQ29tcG9zaXRlT3BlcmF0aW9uKQotICAg
ICAgICAgICAgICAgIGNvbXB1dGVkS2V5ZnJhbWUuY29tcG9zaXRlID0gcGFyc2VkS2V5ZnJhbWUu
Y29tcG9zaXRlOwotCi0gICAgICAgICAgICBhdXRvIG91dHB1dEtleWZyYW1lID0gY29udmVydERp
Y3Rpb25hcnlUb0pTKGxleGljYWxHbG9iYWxPYmplY3QsICpqc0Nhc3Q8SlNET01HbG9iYWxPYmpl
Y3QqPigmbGV4aWNhbEdsb2JhbE9iamVjdCksIGNvbXB1dGVkS2V5ZnJhbWUpOwotCi0gICAgICAg
ICAgICAvLyAzLiBGb3IgZWFjaCBhbmltYXRpb24gcHJvcGVydHktdmFsdWUgcGFpciBzcGVjaWZp
ZWQgb24ga2V5ZnJhbWUsIGRlY2xhcmF0aW9uLCBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgc3RlcHM6
Ci0gICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBwYXJzZWRLZXlmcmFtZS51bnBhcnNlZFN0eWxl
LmJlZ2luKCksIGVuZCA9IHBhcnNlZEtleWZyYW1lLnVucGFyc2VkU3R5bGUuZW5kKCk7IGl0ICE9
IGVuZDsgKytpdCkgewotICAgICAgICAgICAgICAgIC8vIDEuIExldCBwcm9wZXJ0eSBuYW1lIGJl
IHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGFuaW1hdGlvbiBwcm9wZXJ0eSBuYW1lIHRvIElE
TCBhdHRyaWJ1dGUgbmFtZSBhbGdvcml0aG0gdG8gdGhlIHByb3BlcnR5IG5hbWUgb2YgZGVjbGFy
YXRpb24uCi0gICAgICAgICAgICAgICAgYXV0byBwcm9wZXJ0eU5hbWUgPSBDU1NQcm9wZXJ0eUlE
VG9JRExBdHRyaWJ1dGVOYW1lKGl0LT5rZXkpOwotICAgICAgICAgICAgICAgIC8vIDIuIExldCBJ
REwgdmFsdWUgYmUgdGhlIHJlc3VsdCBvZiBzZXJpYWxpemluZyB0aGUgcHJvcGVydHkgdmFsdWUg
b2YgZGVjbGFyYXRpb24gYnkgcGFzc2luZyBkZWNsYXJhdGlvbiB0byB0aGUgYWxnb3JpdGhtIHRv
IHNlcmlhbGl6ZSBhIENTUyB2YWx1ZS4KLSAgICAgICAgICAgICAgICAvLyAzLiBMZXQgdmFsdWUg
YmUgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIElETCB2YWx1ZSB0byBhbiBFQ01BU2NyaXB0IFN0
cmluZyB2YWx1ZS4KLSAgICAgICAgICAgICAgICBhdXRvIHZhbHVlID0gdG9KUzxJRExET01TdHJp
bmc+KGxleGljYWxHbG9iYWxPYmplY3QsIGl0LT52YWx1ZSk7Ci0gICAgICAgICAgICAgICAgLy8g
NC4gQ2FsbCB0aGUgW1tEZWZpbmVPd25Qcm9wZXJ0eV1dIGludGVybmFsIG1ldGhvZCBvbiBvdXRw
dXQga2V5ZnJhbWUgd2l0aCBwcm9wZXJ0eSBuYW1lIHByb3BlcnR5IG5hbWUsCi0gICAgICAgICAg
ICAgICAgLy8gICAgUHJvcGVydHkgRGVzY3JpcHRvciB7IFtbV3JpdGFibGVdXTogdHJ1ZSwgW1tF
bnVtZXJhYmxlXV06IHRydWUsIFtbQ29uZmlndXJhYmxlXV06IHRydWUsIFtbVmFsdWVdXTogdmFs
dWUgfSBhbmQgQm9vbGVhbiBmbGFnIGZhbHNlLgotICAgICAgICAgICAgICAgIEpTT2JqZWN0Ojpk
ZWZpbmVPd25Qcm9wZXJ0eShvdXRwdXRLZXlmcmFtZSwgJmxleGljYWxHbG9iYWxPYmplY3QsIEF0
b21TdHJpbmcocHJvcGVydHlOYW1lKS5pbXBsKCksIFByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwg
MCksIGZhbHNlKTsKKyAgICAgICAgLy8gTm93IGFkZCB0aGUgaW1wbGljaXQgcHJvcGVydGllcyBp
biBjYXNlIHRoZXJlIGFyZSBhbnkgYW5kIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIDAlIG9yIDEwMCUg
a2V5ZnJhbWUuCisgICAgICAgIGlmIChsYXN0U3R5bGVDaGFuZ2VFdmVudFN0eWxlKSB7CisgICAg
ICAgICAgICBpZiAoIWtleWZyYW1lLmtleSgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChhdXRv
IGNzc1Byb3BlcnR5SWQgOiB6ZXJvS2V5ZnJhbWVQcm9wZXJ0aWVzKQorICAgICAgICAgICAgICAg
ICAgICBhZGRQcm9wZXJ0eVRvS2V5ZnJhbWUoY3NzUHJvcGVydHlJZCk7CisgICAgICAgICAgICAg
ICAgemVyb0tleWZyYW1lUHJvcGVydGllcy5jbGVhcigpOworICAgICAgICAgICAgfSBlbHNlIGlm
IChrZXlmcmFtZS5rZXkoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGNzc1By
b3BlcnR5SWQgOiBvbmVLZXlmcmFtZVByb3BlcnRpZXMpCisgICAgICAgICAgICAgICAgICAgIGFk
ZFByb3BlcnR5VG9LZXlmcmFtZShjc3NQcm9wZXJ0eUlkKTsKKyAgICAgICAgICAgICAgICBvbmVL
ZXlmcmFtZVByb3BlcnRpZXMuY2xlYXIoKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAg
Ly8gNC4gQXBwZW5kIG91dHB1dCBrZXlmcmFtZSB0byByZXN1bHQuCi0gICAgICAgICAgICByZXN1
bHQuYXBwZW5kKEpTQzo6U3Ryb25nPEpTQzo6SlNPYmplY3Q+IHsgbGV4aWNhbEdsb2JhbE9iamVj
dC52bSgpLCBvdXRwdXRLZXlmcmFtZSB9KTsKICAgICAgICAgfQorCisgICAgICAgIGNvbXB1dGVk
S2V5ZnJhbWVzLmFwcGVuZChjb21wdXRlZEtleWZyYW1lKTsKICAgICB9CiAKLSAgICAvLyA0LiBS
ZXR1cm4gcmVzdWx0LgotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIGNvbXB1dGVkS2V5
ZnJhbWVzOwogfQogCiBFeGNlcHRpb25Pcjx2b2lkPiBLZXlmcmFtZUVmZmVjdDo6c2V0QmluZGlu
Z3NLZXlmcmFtZXMoSlNHbG9iYWxPYmplY3QmIGxleGljYWxHbG9iYWxPYmplY3QsIERvY3VtZW50
JiBkb2N1bWVudCwgU3Ryb25nPEpTT2JqZWN0PiYmIGtleWZyYW1lc0lucHV0KQpAQCAtOTM2LDcg
Kzg2NSw3IEBAIGNvbnN0IEhhc2hTZXQ8Q1NTUHJvcGVydHlJRD4mIEtleWZyYW1lRWZmZWN0Ojph
bmltYXRlZFByb3BlcnRpZXMoKQogCiAgICAgaWYgKG1fYW5pbWF0ZWRQcm9wZXJ0aWVzLmlzRW1w
dHkoKSkgewogICAgICAgICBmb3IgKGF1dG8mIGtleWZyYW1lIDogbV9wYXJzZWRLZXlmcmFtZXMp
IHsKLSAgICAgICAgICAgIGZvciAoYXV0byBrZXlmcmFtZVByb3BlcnR5IDoga2V5ZnJhbWUudW5w
YXJzZWRTdHlsZS5rZXlzKCkpCisgICAgICAgICAgICBmb3IgKGF1dG8ga2V5ZnJhbWVQcm9wZXJ0
eSA6IGtleWZyYW1lLnN0eWxlU3RyaW5ncy5rZXlzKCkpCiAgICAgICAgICAgICAgICAgbV9hbmlt
YXRlZFByb3BlcnRpZXMuYWRkKGtleWZyYW1lUHJvcGVydHkpOwogICAgICAgICB9CiAgICAgfQpA
QCAtOTUwLDcgKzg3OSw3IEBAIGJvb2wgS2V5ZnJhbWVFZmZlY3Q6OmFuaW1hdGVzUHJvcGVydHko
Q1NTUHJvcGVydHlJRCBwcm9wZXJ0eSkgY29uc3QKICAgICAgICAgcmV0dXJuIG1fYmxlbmRpbmdL
ZXlmcmFtZXMucHJvcGVydGllcygpLmNvbnRhaW5zKHByb3BlcnR5KTsKIAogICAgIGZvciAoYXV0
byYga2V5ZnJhbWUgOiBtX3BhcnNlZEtleWZyYW1lcykgewotICAgICAgICBmb3IgKGF1dG8ga2V5
ZnJhbWVQcm9wZXJ0eSA6IGtleWZyYW1lLnVucGFyc2VkU3R5bGUua2V5cygpKSB7CisgICAgICAg
IGZvciAoYXV0byBrZXlmcmFtZVByb3BlcnR5IDoga2V5ZnJhbWUuc3R5bGVTdHJpbmdzLmtleXMo
KSkgewogICAgICAgICAgICAgaWYgKGtleWZyYW1lUHJvcGVydHkgPT0gcHJvcGVydHkpCiAgICAg
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL2FuaW1hdGlvbi9LZXlmcmFtZUVmZmVjdC5oIGIvU291cmNlL1dlYkNvcmUvYW5pbWF0
aW9uL0tleWZyYW1lRWZmZWN0LmgKaW5kZXggZDMxZGMwNTExODFjNjg4Nzg5NzE0Mjg0MjZhZGYz
Nzg0NjNlZTIzZi4uYzI4MzNjNjU2ZGU1ZWM2YWU5NGUyN2YzNmU2ZjhjYWY1NzQ5MjcxNSAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvYW5pbWF0aW9uL0tleWZyYW1lRWZmZWN0LmgKKysrIGIv
U291cmNlL1dlYkNvcmUvYW5pbWF0aW9uL0tleWZyYW1lRWZmZWN0LmgKQEAgLTgwLDE0ICs4MCwx
NyBAQCBwdWJsaWM6CiAgICAgICAgIFZlY3RvcjxQcm9wZXJ0eUFuZFZhbHVlcz4gcHJvcGVydGll
c0FuZFZhbHVlczsKICAgICB9OwogCi0gICAgc3RydWN0IFBhcnNlZEtleWZyYW1lIHsKLSAgICAg
ICAgTWFya2FibGVEb3VibGUgb2Zmc2V0OworICAgIHN0cnVjdCBCYXNlQ29tcHV0ZWRLZXlmcmFt
ZSA6IEJhc2VLZXlmcmFtZSB7CiAgICAgICAgIGRvdWJsZSBjb21wdXRlZE9mZnNldDsKLSAgICAg
ICAgQ29tcG9zaXRlT3BlcmF0aW9uT3JBdXRvIGNvbXBvc2l0ZSB7IENvbXBvc2l0ZU9wZXJhdGlv
bk9yQXV0bzo6QXV0byB9OwotICAgICAgICBTdHJpbmcgZWFzaW5nOworICAgIH07CisKKyAgICBz
dHJ1Y3QgQ29tcHV0ZWRLZXlmcmFtZSA6IEJhc2VDb21wdXRlZEtleWZyYW1lIHsKKyAgICAgICAg
SGFzaE1hcDxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+IHN0eWxlU3RyaW5nczsKKyAgICB9OworCisg
ICAgc3RydWN0IFBhcnNlZEtleWZyYW1lIDogQ29tcHV0ZWRLZXlmcmFtZSB7CiAgICAgICAgIFJl
ZlB0cjxUaW1pbmdGdW5jdGlvbj4gdGltaW5nRnVuY3Rpb247CiAgICAgICAgIFJlZjxNdXRhYmxl
U3R5bGVQcm9wZXJ0aWVzPiBzdHlsZTsKLSAgICAgICAgSGFzaE1hcDxDU1NQcm9wZXJ0eUlELCBT
dHJpbmc+IHVucGFyc2VkU3R5bGU7CiAKICAgICAgICAgUGFyc2VkS2V5ZnJhbWUoKQogICAgICAg
ICAgICAgOiBzdHlsZShNdXRhYmxlU3R5bGVQcm9wZXJ0aWVzOjpjcmVhdGUoKSkKQEAgLTk1LDEz
ICs5OCw2IEBAIHB1YmxpYzoKICAgICAgICAgfQogICAgIH07CiAKLSAgICBzdHJ1Y3QgQmFzZUNv
bXB1dGVkS2V5ZnJhbWUgewotICAgICAgICBNYXJrYWJsZURvdWJsZSBvZmZzZXQ7Ci0gICAgICAg
IGRvdWJsZSBjb21wdXRlZE9mZnNldDsKLSAgICAgICAgU3RyaW5nIGVhc2luZyB7ICJsaW5lYXIi
IH07Ci0gICAgICAgIENvbXBvc2l0ZU9wZXJhdGlvbk9yQXV0byBjb21wb3NpdGUgeyBDb21wb3Np
dGVPcGVyYXRpb25PckF1dG86OkF1dG8gfTsKLSAgICB9OwotCiAgICAgY29uc3QgVmVjdG9yPFBh
cnNlZEtleWZyYW1lPiYgcGFyc2VkS2V5ZnJhbWVzKCkgY29uc3QgeyByZXR1cm4gbV9wYXJzZWRL
ZXlmcmFtZXM7IH0KIAogICAgIEVsZW1lbnQqIHRhcmdldCgpIGNvbnN0IHsgcmV0dXJuIG1fdGFy
Z2V0LmdldCgpOyB9CkBAIC0xMTQsOCArMTEwLDcgQEAgcHVibGljOgogCiAgICAgY29uc3Qgc3Rk
OjpvcHRpb25hbDxjb25zdCBTdHlsZWFibGU+IHRhcmdldFN0eWxlYWJsZSgpIGNvbnN0OwogCi0g
ICAgVmVjdG9yPEpTQzo6U3Ryb25nPEpTQzo6SlNPYmplY3Q+PiBnZXRCaW5kaW5nc0tleWZyYW1l
cyhKU0M6OkpTR2xvYmFsT2JqZWN0JiwgRG9jdW1lbnQmKTsKLSAgICBWZWN0b3I8SlNDOjpTdHJv
bmc8SlNDOjpKU09iamVjdD4+IGdldEtleWZyYW1lcyhKU0M6OkpTR2xvYmFsT2JqZWN0JiwgRG9j
dW1lbnQmKTsKKyAgICBWZWN0b3I8Q29tcHV0ZWRLZXlmcmFtZT4gZ2V0S2V5ZnJhbWVzKERvY3Vt
ZW50Jik7CiAgICAgRXhjZXB0aW9uT3I8dm9pZD4gc2V0QmluZGluZ3NLZXlmcmFtZXMoSlNDOjpK
U0dsb2JhbE9iamVjdCYsIERvY3VtZW50JiwgSlNDOjpTdHJvbmc8SlNDOjpKU09iamVjdD4mJik7
CiAgICAgRXhjZXB0aW9uT3I8dm9pZD4gc2V0S2V5ZnJhbWVzKEpTQzo6SlNHbG9iYWxPYmplY3Qm
LCBEb2N1bWVudCYsIEpTQzo6U3Ryb25nPEpTQzo6SlNPYmplY3Q+JiYpOwogCkBAIC0xNzMsNiAr
MTY4LDggQEAgcHVibGljOgogCiAgICAgdm9pZCBrZXlmcmFtZXNSdWxlRGlkQ2hhbmdlKCk7CiAK
KyAgICBzdGF0aWMgU3RyaW5nIENTU1Byb3BlcnR5SURUb0lETEF0dHJpYnV0ZU5hbWUoQ1NTUHJv
cGVydHlJRCk7CisKIHByaXZhdGU6CiAgICAgS2V5ZnJhbWVFZmZlY3QoRWxlbWVudCosIFBzZXVk
b0lkKTsKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYW5pbWF0aW9uL0tleWZyYW1lRWZm
ZWN0LmlkbCBiL1NvdXJjZS9XZWJDb3JlL2FuaW1hdGlvbi9LZXlmcmFtZUVmZmVjdC5pZGwKaW5k
ZXggY2VmNGIxMjFjNDY2MWJkZjk4NTdjMzVmNzk1OTQ1YjY3ZTZjYTk1OS4uNjQxNGE1NDhiN2U3
MWZiM2M1YTYyZTRiZDdiMWNiMzFiYjg2MjNhZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
YW5pbWF0aW9uL0tleWZyYW1lRWZmZWN0LmlkbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9hbmltYXRp
b24vS2V5ZnJhbWVFZmZlY3QuaWRsCkBAIC0zNiw3ICszNiw3IEBAIHR5cGVkZWYgVVNWU3RyaW5n
IENTU09NU3RyaW5nOwogICAgIGF0dHJpYnV0ZSBDU1NPTVN0cmluZz8gcHNldWRvRWxlbWVudDsK
ICAgICBbRW5hYmxlZEJ5U2V0dGluZz1XZWJBbmltYXRpb25zQ29tcG9zaXRlT3BlcmF0aW9uc0Vu
YWJsZWRdIGF0dHJpYnV0ZSBJdGVyYXRpb25Db21wb3NpdGVPcGVyYXRpb24gaXRlcmF0aW9uQ29t
cG9zaXRlOwogICAgIFtFbmFibGVkQnlTZXR0aW5nPVdlYkFuaW1hdGlvbnNDb21wb3NpdGVPcGVy
YXRpb25zRW5hYmxlZCwgSW1wbGVtZW50ZWRBcz1iaW5kaW5nc0NvbXBvc2l0ZV0gYXR0cmlidXRl
IENvbXBvc2l0ZU9wZXJhdGlvbiBjb21wb3NpdGU7Ci0gICAgW0NhbGxXaXRoPUdsb2JhbE9iamVj
dCZEb2N1bWVudCwgSW1wbGVtZW50ZWRBcz1nZXRCaW5kaW5nc0tleWZyYW1lc10gc2VxdWVuY2U8
b2JqZWN0PiBnZXRLZXlmcmFtZXMoKTsKKyAgICBbQ3VzdG9tXSBzZXF1ZW5jZTxvYmplY3Q+IGdl
dEtleWZyYW1lcygpOwogICAgIFtDYWxsV2l0aD1HbG9iYWxPYmplY3QmRG9jdW1lbnQsIEltcGxl
bWVudGVkQXM9c2V0QmluZGluZ3NLZXlmcmFtZXNdIHVuZGVmaW5lZCBzZXRLZXlmcmFtZXMob2Jq
ZWN0PyBrZXlmcmFtZXMpOwogfTsKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmluZGlu
Z3MvanMvSlNLZXlmcmFtZUVmZmVjdEN1c3RvbS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5n
cy9qcy9KU0tleWZyYW1lRWZmZWN0Q3VzdG9tLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kZDlmZjQ3MzJkMTAw
MTE3NDYzN2YzYjI0NDJhODBkMWEwOTExZDRhCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvYmluZGluZ3MvanMvSlNLZXlmcmFtZUVmZmVjdEN1c3RvbS5jcHAKQEAgLTAsMCArMSw2
MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJKU0tleWZyYW1lRWZmZWN0LmgiCisKKyNpbmNsdWRl
ICJDU1NQcm9wZXJ0eU5hbWVzLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordXNpbmcgbmFt
ZXNwYWNlIEpTQzsKKworSlNWYWx1ZSBKU0tleWZyYW1lRWZmZWN0OjpnZXRLZXlmcmFtZXMoSlNH
bG9iYWxPYmplY3QmIGxleGljYWxHbG9iYWxPYmplY3QsIENhbGxGcmFtZSYpCit7CisgICAgYXV0
byBsb2NrID0gSlNMb2NrSG9sZGVyIHsgJmxleGljYWxHbG9iYWxPYmplY3QgfTsKKworICAgIGF1
dG8qIGNvbnRleHQgPSBqc0Nhc3Q8SlNET01HbG9iYWxPYmplY3QqPigmbGV4aWNhbEdsb2JhbE9i
amVjdCktPnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKTsKKyAgICBpZiAoVU5MSUtFTFkoIWNvbnRl
eHQpKQorICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKyAgICBBU1NFUlQoY29udGV4dC0+
aXNEb2N1bWVudCgpKTsKKworICAgIFZlY3RvcjxTdHJvbmc8SlNPYmplY3Q+PiBrZXlmcmFtZU9i
amVjdHM7CisgICAgYXV0byYgZG9tR2xvYmFsT2JqZWN0ID0gKmpzQ2FzdDxKU0RPTUdsb2JhbE9i
amVjdCo+KCZsZXhpY2FsR2xvYmFsT2JqZWN0KTsKKyAgICBmb3IgKGF1dG8mIGNvbXB1dGVkS2V5
ZnJhbWUgOiB3cmFwcGVkKCkuZ2V0S2V5ZnJhbWVzKGRvd25jYXN0PERvY3VtZW50PigqY29udGV4
dCkpKSB7CisgICAgICAgIGF1dG8ga2V5ZnJhbWVPYmplY3QgPSBjb252ZXJ0RGljdGlvbmFyeVRv
SlMobGV4aWNhbEdsb2JhbE9iamVjdCwgZG9tR2xvYmFsT2JqZWN0LCB7IGNvbXB1dGVkS2V5ZnJh
bWUgfSk7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGNvbXB1dGVkS2V5ZnJhbWUuc3R5bGVTdHJp
bmdzLmJlZ2luKCksIGVuZCA9IGNvbXB1dGVkS2V5ZnJhbWUuc3R5bGVTdHJpbmdzLmVuZCgpOyBp
dCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgICAgIGF1dG8gcHJvcGVydHlOYW1lID0gS2V5ZnJh
bWVFZmZlY3Q6OkNTU1Byb3BlcnR5SURUb0lETEF0dHJpYnV0ZU5hbWUoaXQtPmtleSk7CisgICAg
ICAgICAgICBhdXRvIHZhbHVlID0gdG9KUzxJRExET01TdHJpbmc+KGxleGljYWxHbG9iYWxPYmpl
Y3QsIGl0LT52YWx1ZSk7CisgICAgICAgICAgICBKU09iamVjdDo6ZGVmaW5lT3duUHJvcGVydHko
a2V5ZnJhbWVPYmplY3QsICZsZXhpY2FsR2xvYmFsT2JqZWN0LCBBdG9tU3RyaW5nKHByb3BlcnR5
TmFtZSkuaW1wbCgpLCBQcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIDApLCBmYWxzZSk7CisgICAg
ICAgIH0KKyAgICAgICAga2V5ZnJhbWVPYmplY3RzLmFwcGVuZCh7IGxleGljYWxHbG9iYWxPYmpl
Y3Qudm0oKSwga2V5ZnJhbWVPYmplY3QgfSk7CisgICAgfQorCisgICAgYXV0byB0aHJvd1Njb3Bl
ID0gREVDTEFSRV9USFJPV19TQ09QRShsZXhpY2FsR2xvYmFsT2JqZWN0LnZtKCkpOworICAgIHJl
dHVybiB0b0pTPElETFNlcXVlbmNlPElETE9iamVjdD4+KGxleGljYWxHbG9iYWxPYmplY3QsIGRv
bUdsb2JhbE9iamVjdCwgdGhyb3dTY29wZSwga2V5ZnJhbWVPYmplY3RzKTsKK30KKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQo=
</data>
<flag name="review"
          id="476143"
          type_id="1"
          status="+"
          setter="cdumez"
    />
    <flag name="commit-queue"
          id="476160"
          type_id="3"
          status="-"
          setter="ews-feeder"
    />
          </attachment>
      

    </bug>

</bugzilla>