<?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>130855</bug_id>
          
          <creation_ts>2014-03-27 13:14:25 -0700</creation_ts>
          <short_desc>Add support for AirPlay picker in WK2 for iOS</short_desc>
          <delta_ts>2014-03-28 08:57:22 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Media</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>iPhone / iPad</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="Enrica Casucci">enrica</reporter>
          <assigned_to name="Enrica Casucci">enrica</assigned_to>
          <cc>eric.carlson</cc>
    
    <cc>joepeck</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>995028</commentid>
    <comment_count>0</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2014-03-27 13:14:25 -0700</bug_when>
    <thetext>This tracks the work required to support the airplay picker on WK2.

&lt;rdar://problem/15349859&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>995029</commentid>
    <comment_count>1</comment_count>
      <attachid>227970</attachid>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2014-03-27 13:23:07 -0700</bug_when>
    <thetext>Created attachment 227970
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>995055</commentid>
    <comment_count>2</comment_count>
      <attachid>227970</attachid>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2014-03-27 14:20:21 -0700</bug_when>
    <thetext>Comment on attachment 227970
Patch

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

r=me on the WebCore changes

&gt; Source/WebCore/html/HTMLMediaSession.cpp:213
&gt; -    MediaSessionManager::sharedManager().showPlaybackTargetPicker();
&gt; +#if PLATFORM(IOS)
&gt; +    element.document().frame()-&gt;page()-&gt;chrome().client().showAirPlayRoutePicker(element.hasVideo());
&gt; +#endif

MediaSessionManager::showPlaybackTargetPicker doesn&apos;t have any purpose now, it should be removed.

&gt; Source/WebCore/page/ChromeClient.h:260
&gt; +    virtual void showAirPlayRoutePicker(bool hasVideo) = 0;

This name shouldn&apos;t be be AirPlay specific, maybe showPlaybackTargetPicker?

&gt; Source/WebCore/platform/audio/MediaSessionManager.cpp:280
&gt; +    // FIXME: Add implementation.

It would be good to have a call to notImplemented() here.

&gt; Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm:76
&gt; +SOFT_LINK_CLASS(MediaPlayer, MPVolumeView)

Nit: we usually group all of the SOFT_LINK_CLASS() macros together.

&gt; Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:2077
&gt; -    m_allowsWirelessVideoPlayback = ![m_avPlayer.get() allowsExternalPlayback];
&gt; +    m_allowsWirelessVideoPlayback = [m_avPlayer.get() allowsExternalPlayback];

:-O</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>995059</commentid>
    <comment_count>3</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2014-03-27 14:39:02 -0700</bug_when>
    <thetext>thanks for the review.
&gt; MediaSessionManager::showPlaybackTargetPicker doesn&apos;t have any purpose now, it should be removed.
I&apos;ll remove it.
&gt; 
&gt; &gt; Source/WebCore/page/ChromeClient.h:260
&gt; &gt; +    virtual void showAirPlayRoutePicker(bool hasVideo) = 0;
&gt; 
&gt; This name shouldn&apos;t be be AirPlay specific, maybe showPlaybackTargetPicker?
Good idea, I&apos;ll change it.
&gt; 
&gt; &gt; Source/WebCore/platform/audio/MediaSessionManager.cpp:280
&gt; &gt; +    // FIXME: Add implementation.
&gt; 
&gt; It would be good to have a call to notImplemented() here.
Will do.
&gt; 
&gt; &gt; Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm:76
&gt; &gt; +SOFT_LINK_CLASS(MediaPlayer, MPVolumeView)
&gt; 
&gt; Nit: we usually group all of the SOFT_LINK_CLASS() macros together.
Ok.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>995066</commentid>
    <comment_count>4</comment_count>
      <attachid>227970</attachid>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2014-03-27 14:49:38 -0700</bug_when>
    <thetext>Comment on attachment 227970
Patch

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

&gt;&gt; Source/WebCore/page/ChromeClient.h:260
&gt;&gt; +    virtual void showAirPlayRoutePicker(bool hasVideo) = 0;
&gt; 
&gt; This name shouldn&apos;t be be AirPlay specific, maybe showPlaybackTargetPicker?

Does this need to be pure virtual? Can we provide a stub empty implementation so ports not interested do not need to include it?

I would also expect, because this is in PLATFORM(IOS) that it be behind ENABLE(IOS_AIRPLAY) as well. But maybe that ENABLE flag is not as important now.

&gt; Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm:257
&gt; +    _airPlayPresenceRoutingController = [[getMPAVRoutingControllerClass() alloc] initWithName:@&quot;WebCore - HTML media element checking for AirPlay route presence&quot;];

I think this should adoptNS(...), otherwise we will leak.

&gt; Source/WebKit2/Configurations/WebKit2.xcconfig:33
&gt; +FRAMEWORK_AND_LIBRARY_LDFLAGS_iphonesimulator = -lobjc -framework CFNetwork -framework CoreFoundation -framework CoreGraphics -framework CorePDF -framework CoreText -framework Foundation -framework GraphicsServices -framework ImageIO -framework UIKit -framework MediaPlayer -framework OpenGLES -framework MobileAsset -framework WebKit -lMobileGestalt -lassertion_extension;

Would it help performance to soft link MediaPlayer framework?

&gt; Source/WebKit2/UIProcess/ios/PageClientImplIOS.h:116
&gt; +    virtual void showAirPlayRoutePicker(bool hasVideo, const WebCore::IntRect&amp; elementRect);

Nit: override. In fact, these should all probably have override but at least add it for the new functions.

&gt; Source/WebKit2/UIProcess/ios/forms/WKAirPlayRoutePicker.mm:39
&gt; +#import &lt;MediaPlayer/MPAudioVideoRoutingPopoverController.h&gt;
&gt; +#import &lt;MediaPlayer/MPAudioVideoRoutingActionSheet.h&gt;
&gt; +#import &lt;MediaPlayer/MPAudioVideoRoutingPopoverController.h&gt;
&gt; +#import &lt;MediaPlayer/MPAudioVideoRoutingActionSheet.h&gt;

Duplicate includes.

&gt; Source/WebKit2/UIProcess/ios/forms/WKAirPlayRoutePicker.mm:47
&gt; +    RetainPtr&lt;id&lt;WKFormControl&gt;&gt; _control;

This does not appear to be used. Can we remove it?

&gt; Source/WebKit2/UIProcess/ios/forms/WKAirPlayRoutePicker.mm:50
&gt; +    RetainPtr&lt;MPAVRoutingController&gt; _airPlayPickerRoutingController;
&gt; +    RetainPtr&lt;MPAudioVideoRoutingPopoverController&gt; _airPlayPopoverController;  // iPad
&gt; +    RetainPtr&lt;MPAudioVideoRoutingActionSheet&gt; _airPlayActionSheet;              // iPhone

These all have &quot;_airPlay&quot; in the name, but that is redundant considering the class name. Maybe you can drop the prefix, and just have _popoverController, _actionSheet, and _routingController. Much easier to distinguish down below.

&gt; Source/WebKit2/UIProcess/ios/forms/WKAirPlayRoutePicker.mm:96
&gt; +    [self _dismissAirPlayRoutePickerIPad];

Shouldn&apos;t this re-present the picker (-show:fromRect:), instead of dismissing?

&gt; Source/WebKit2/UIProcess/ios/forms/WKAirPlayRoutePicker.mm:162
&gt; +#endif  // PLATFORM(IOS)

Weird double space here.

&gt; Source/WebKit/ios/WebCoreSupport/WebChromeClientIOS.h:86
&gt; +    virtual void showAirPlayRoutePicker(bool hasVideo) override;

If this is stubbed in ChromeClient.h, we don&apos;t even need to update WebKit1. Unless we really will need to fix this later, then I would suggest not stubbing it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>995072</commentid>
    <comment_count>5</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2014-03-27 14:57:12 -0700</bug_when>
    <thetext>&gt; &gt; Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm:257
&gt; &gt; +    _airPlayPresenceRoutingController = [[getMPAVRoutingControllerClass() alloc] initWithName:@&quot;WebCore - HTML media element checking for AirPlay route presence&quot;];
&gt; 
&gt; I think this should adoptNS(...), otherwise we will leak.
OOPS! good catch!
&gt; 
&gt; &gt; Source/WebKit2/Configurations/WebKit2.xcconfig:33
&gt; &gt; +FRAMEWORK_AND_LIBRARY_LDFLAGS_iphonesimulator = -lobjc -framework CFNetwork -framework CoreFoundation -framework CoreGraphics -framework CorePDF -framework CoreText -framework Foundation -framework GraphicsServices -framework ImageIO -framework UIKit -framework MediaPlayer -framework OpenGLES -framework MobileAsset -framework WebKit -lMobileGestalt -lassertion_extension;
&gt; 
&gt; Would it help performance to soft link MediaPlayer framework?
I don&apos;t know.
&gt; 
&gt; &gt; Source/WebKit2/UIProcess/ios/PageClientImplIOS.h:116
&gt; &gt; +    virtual void showAirPlayRoutePicker(bool hasVideo, const WebCore::IntRect&amp; elementRect);
&gt; 
&gt; Nit: override. In fact, these should all probably have override but at least add it for the new functions.
&gt; 
I&apos;ll fix it.
&gt; &gt; Source/WebKit2/UIProcess/ios/forms/WKAirPlayRoutePicker.mm:39
&gt; &gt; +#import &lt;MediaPlayer/MPAudioVideoRoutingPopoverController.h&gt;
&gt; &gt; +#import &lt;MediaPlayer/MPAudioVideoRoutingActionSheet.h&gt;
&gt; &gt; +#import &lt;MediaPlayer/MPAudioVideoRoutingPopoverController.h&gt;
&gt; &gt; +#import &lt;MediaPlayer/MPAudioVideoRoutingActionSheet.h&gt;
&gt; 
&gt; Duplicate includes.
&gt; 
&gt; &gt; Source/WebKit2/UIProcess/ios/forms/WKAirPlayRoutePicker.mm:47
&gt; &gt; +    RetainPtr&lt;id&lt;WKFormControl&gt;&gt; _control;
&gt; 
&gt; This does not appear to be used. Can we remove it?
&gt; 
OOPS leftover from cut&amp;paste :-)


&gt; These all have &quot;_airPlay&quot; in the name, but that is redundant considering the class name. Maybe you can drop the prefix, and just have _popoverController, _actionSheet, and _routingController. Much easier to distinguish down below.
&gt; 
Sure.
&gt; &gt; Source/WebKit2/UIProcess/ios/forms/WKAirPlayRoutePicker.mm:96
&gt; &gt; +    [self _dismissAirPlayRoutePickerIPad];
&gt; 
No, we decided to remove it upon rotation.

&gt; Shouldn&apos;t this re-present the picker (-show:fromRect:), instead of dismissing?
&gt; 
&gt; &gt; Source/WebKit2/UIProcess/ios/forms/WKAirPlayRoutePicker.mm:162
&gt; &gt; +#endif  // PLATFORM(IOS)
&gt; 
&gt; Weird double space here.
&gt; 

&gt; &gt; Source/WebKit/ios/WebCoreSupport/WebChromeClientIOS.h:86
&gt; &gt; +    virtual void showAirPlayRoutePicker(bool hasVideo) override;
&gt; 
&gt; If this is stubbed in ChromeClient.h, we don&apos;t even need to update WebKit1. Unless we really will need to fix this later, then I would suggest not stubbing it.
I&apos;ll post the patch for WK1 shortly.

thanks for the comments!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>995127</commentid>
    <comment_count>6</comment_count>
      <attachid>227970</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2014-03-27 16:08:52 -0700</bug_when>
    <thetext>Comment on attachment 227970
Patch

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

&gt; Source/WebCore/html/HTMLMediaSession.cpp:212
&gt; +    element.document().frame()-&gt;page()-&gt;chrome().client().showAirPlayRoutePicker(element.hasVideo());

Is it safe to assume the element has a document/frame etc?
Can&apos;t the JavaScript use the API from a detached element? Or an element into a detached frame?

&gt; Source/WebKit2/Configurations/WebKit2.xcconfig:33
&gt; +FRAMEWORK_AND_LIBRARY_LDFLAGS_iphonesimulator = -lobjc -framework CFNetwork -framework CoreFoundation -framework CoreGraphics -framework CorePDF -framework CoreText -framework Foundation -framework GraphicsServices -framework ImageIO -framework UIKit -framework MediaPlayer -framework OpenGLES -framework MobileAsset -framework WebKit -lMobileGestalt -lassertion_extension;

Maybe we should soft link?

&gt; Source/WebKit2/UIProcess/ios/forms/WKAirPlayRoutePicker.h:34
&gt; +- (void)show:(BOOL)hasVideo fromRect:(CGRect)elementRect;

This is a little confusing. For audio, you would call show:NO, which makes it looks like you want to hide the picker.
Probably better to used a type enum and do something like showMedia:(typed enum) fromRect:()...

&gt; Source/WebKit2/UIProcess/ios/forms/WKAirPlayRoutePicker.mm:51
&gt; +    WKContentView* _view;   // Weak reference.

Would __weak work?

&gt; Source/WebKit2/UIProcess/ios/forms/WKAirPlayRoutePicker.mm:65
&gt; +    if (_airPlayActionSheet) {

You don&apos;t need the if().

&gt; Source/WebKit2/UIProcess/ios/forms/WKAirPlayRoutePicker.mm:70
&gt; +    if (_airPlayPopoverController)

Maybe ditto here.

&gt; Source/WebKit2/UIProcess/ios/forms/WKAirPlayRoutePicker.mm:118
&gt; +    if (_airPlayPopoverController)
&gt; +        return;

Shouldn&apos;t we check for _airPlayPickerRoutingController in show:fromRect: instead?

&gt; Source/WebKit2/WebProcess/WebPage/WebPage.h:1129
&gt; +    WebCore::IntPoint m_interactionLocation;

Maybe m_lastInteractionLocation?

&gt; Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm:307
&gt; +    m_interactionLocation = point;

I think this should use the roundedAdjustedPoint.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>995138</commentid>
    <comment_count>7</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2014-03-27 16:33:03 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 227970 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=227970&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/html/HTMLMediaSession.cpp:212
&gt; &gt; +    element.document().frame()-&gt;page()-&gt;chrome().client().showAirPlayRoutePicker(element.hasVideo());
&gt; 
&gt; Is it safe to assume the element has a document/frame etc?
&gt; Can&apos;t the JavaScript use the API from a detached element? Or an element into a detached frame?
&gt; 
I believe the answer is no, but I&apos;d like Eric to comment on this. 

&gt; This is a little confusing. For audio, you would call show:NO, which makes it looks like you want to hide the picker.
&gt; Probably better to used a type enum and do something like showMedia:(typed enum) fromRect:()...
&gt; 
At the call site this looks like show:hasVideo, I think it is ok.

I&apos;ve addressed all your other comments. thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>995147</commentid>
    <comment_count>8</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2014-03-27 16:42:20 -0700</bug_when>
    <thetext>Committed revision 166384.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>995165</commentid>
    <comment_count>9</comment_count>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2014-03-27 17:07:08 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (In reply to comment #6)
&gt; &gt; (From update of attachment 227970 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=227970&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/html/HTMLMediaSession.cpp:212
&gt; &gt; &gt; +    element.document().frame()-&gt;page()-&gt;chrome().client().showAirPlayRoutePicker(element.hasVideo());
&gt; &gt; 
&gt; &gt; Is it safe to assume the element has a document/frame etc?
&gt; &gt; Can&apos;t the JavaScript use the API from a detached element? Or an element into a detached frame?
&gt; &gt; 
&gt; I believe the answer is no, but I&apos;d like Eric to comment on this. 
&gt; 
Oops, it looks like I forgot to save my comment about guarding against a NULL frame!

It is safe to assume there is a document because there is an element. showingPlaybackTargetPickerPermitted (called earlier in the method) returns false if there isn&apos;t a page, but it is probably worth adding something like ASSERT(element.document().page()).</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>227970</attachid>
            <date>2014-03-27 13:23:07 -0700</date>
            <delta_ts>2014-03-28 08:57:22 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>airpicker-wk2.txt</filename>
            <type>text/plain</type>
            <size>44393</size>
            <attacher name="Enrica Casucci">enrica</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE2NjM2OCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQwIEBACisyMDE0LTAzLTI3ICBFbnJpY2Eg
Q2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgQWRkIHN1cHBvcnQgZm9yIEFp
clBsYXkgcGlja2VyIGluIFdLMiBmb3IgaU9TLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTMwODU1CisgICAgICAgIDxyZGFyOi8vcHJvYmxlbS8xNTM0
OTg1OT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGRzIHN1cHBvcnQgaW4gSFRNTE1lZGlhU2Vzc2lvbiB0byBkaXNwbGF5IHRoZSBhaXJwbGF5IHBp
Y2tlcgorICAgICAgICBhbmQgdG8gbW9uaXRvciBwcmVzZW5jZSBvZiBhdmFpbGFibGUgd2lyZWxl
c3MgdGFyZ2V0cy4KKworICAgICAgICAqIGh0bWwvSFRNTE1lZGlhU2Vzc2lvbi5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpIVE1MTWVkaWFTZXNzaW9uOjpzaG93UGxheWJhY2tUYXJnZXRQaWNrZXIp
OgorICAgICAgICAoV2ViQ29yZTo6SFRNTE1lZGlhU2Vzc2lvbjo6aGFzV2lyZWxlc3NQbGF5YmFj
a1RhcmdldHMpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTE1lZGlhU2Vzc2lvbjo6c2V0SGFzUGxh
eWJhY2tUYXJnZXRBdmFpbGFiaWxpdHlMaXN0ZW5lcnMpOgorICAgICAgICAqIGxvYWRlci9FbXB0
eUNsaWVudHMuaDoKKyAgICAgICAgKiBwYWdlL0Nocm9tZUNsaWVudC5oOgorICAgICAgICAqIHBs
YXRmb3JtL2F1ZGlvL01lZGlhU2Vzc2lvbk1hbmFnZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6
TWVkaWFTZXNzaW9uTWFuYWdlcjo6d2lyZWxlc3NSb3V0ZXNBdmFpbGFibGVDaGFuZ2VkKToKKyAg
ICAgICAgKiBwbGF0Zm9ybS9hdWRpby9NZWRpYVNlc3Npb25NYW5hZ2VyLmg6CisgICAgICAgIChX
ZWJDb3JlOjpNZWRpYVNlc3Npb25NYW5hZ2VyOjpoYXNXaXJlbGVzc1RhcmdldHNBdmFpbGFibGUp
OgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFTZXNzaW9uTWFuYWdlcjo6c3RhcnRNb25pdG9yaW5n
QWlyUGxheVJvdXRlcyk6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYVNlc3Npb25NYW5hZ2VyOjpz
dG9wTW9uaXRvcmluZ0FpclBsYXlSb3V0ZXMpOgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL2lv
cy9NZWRpYVNlc3Npb25NYW5hZ2VySU9TLmg6CisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vaW9z
L01lZGlhU2Vzc2lvbk1hbmFnZXJJT1MubW06CisgICAgICAgIChXZWJDb3JlOjpNZWRpYVNlc3Np
b25NYW5hZ2VyaU9TOjpoYXNXaXJlbGVzc1RhcmdldHNBdmFpbGFibGUpOgorICAgICAgICAoV2Vi
Q29yZTo6TWVkaWFTZXNzaW9uTWFuYWdlcmlPUzo6c3RhcnRNb25pdG9yaW5nQWlyUGxheVJvdXRl
cyk6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYVNlc3Npb25NYW5hZ2VyaU9TOjpzdG9wTW9uaXRv
cmluZ0FpclBsYXlSb3V0ZXMpOgorICAgICAgICAoLVtXZWJNZWRpYVNlc3Npb25IZWxwZXIgaW5p
dFdpdGhDYWxsYmFjazpdKToKKyAgICAgICAgKC1bV2ViTWVkaWFTZXNzaW9uSGVscGVyIGhhc1dp
cmVsZXNzVGFyZ2V0c0F2YWlsYWJsZV0pOgorICAgICAgICAoLVtXZWJNZWRpYVNlc3Npb25IZWxw
ZXIgc3RhcnRNb25pdG9yaW5nQWlyUGxheVJvdXRlc10pOgorICAgICAgICAoLVtXZWJNZWRpYVNl
c3Npb25IZWxwZXIgc3RvcE1vbml0b3JpbmdBaXJQbGF5Um91dGVzXSk6CisgICAgICAgICgtW1dl
Yk1lZGlhU2Vzc2lvbkhlbHBlciB3aXJlbGVzc1JvdXRlc0F2YWlsYWJsZURpZENoYW5nZTpdKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9hdmZvdW5kYXRpb24vb2JqYy9NZWRpYVBsYXll
clByaXZhdGVBVkZvdW5kYXRpb25PYmpDLm1tOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFQbGF5
ZXJQcml2YXRlQVZGb3VuZGF0aW9uT2JqQzo6d2lyZWxlc3NWaWRlb1BsYXliYWNrRGlzYWJsZWQp
OgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uT2JqQzo6
c2V0V2lyZWxlc3NWaWRlb1BsYXliYWNrRGlzYWJsZWQpOgorCiAyMDE0LTAzLTI3ICBBZGVuaWxz
b24gQ2F2YWxjYW50aSAgPGNhdmFsY2FudGlpQGdtYWlsLmNvbT4KIAogICAgICAgICBSZW1vdmUg
Y29tbWVudCBmcm9tIEZpbHRlci5oCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxNZWRp
YVNlc3Npb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTE1lZGlh
U2Vzc2lvbi5jcHAJKHJldmlzaW9uIDE2NjIzOCkKKysrIFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRN
TE1lZGlhU2Vzc2lvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI5LDYgKzI5LDkgQEAKIAogI2lu
Y2x1ZGUgIkhUTUxNZWRpYVNlc3Npb24uaCIKIAorI2luY2x1ZGUgIkNocm9tZS5oIgorI2luY2x1
ZGUgIkNocm9tZUNsaWVudC5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCiAjaW5jbHVkZSAiSFRNTE1l
ZGlhRWxlbWVudC5oIgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgogI2luY2x1ZGUgIkxvZ2dpbmcu
aCIKQEAgLTIwNSw3ICsyMDgsOSBAQCB2b2lkIEhUTUxNZWRpYVNlc3Npb246OnNob3dQbGF5YmFj
a1RhcmdlCiAgICAgfQogI2VuZGlmCiAKLSAgICBNZWRpYVNlc3Npb25NYW5hZ2VyOjpzaGFyZWRN
YW5hZ2VyKCkuc2hvd1BsYXliYWNrVGFyZ2V0UGlja2VyKCk7CisjaWYgUExBVEZPUk0oSU9TKQor
ICAgIGVsZW1lbnQuZG9jdW1lbnQoKS5mcmFtZSgpLT5wYWdlKCktPmNocm9tZSgpLmNsaWVudCgp
LnNob3dBaXJQbGF5Um91dGVQaWNrZXIoZWxlbWVudC5oYXNWaWRlbygpKTsKKyNlbmRpZgogfQog
CiBib29sIEhUTUxNZWRpYVNlc3Npb246Omhhc1dpcmVsZXNzUGxheWJhY2tUYXJnZXRzKGNvbnN0
IEhUTUxNZWRpYUVsZW1lbnQmIGVsZW1lbnQpIGNvbnN0CkBAIC0yMjIsOSArMjI3LDcgQEAgYm9v
bCBIVE1MTWVkaWFTZXNzaW9uOjpoYXNXaXJlbGVzc1BsYXliYQogICAgIFVOVVNFRF9QQVJBTShl
bGVtZW50KTsKICNlbmRpZgogCi0gICAgLy8gRklYTUU6IHRoaXMgb25seSBsZXRzIHVzIGtub3cg
aWYgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBwbGF5aW5nIHRvIGFuIGV4dGVybmFsIHRhcmdldCwg
d2Ugd2FudCB0bwotICAgIC8vIGtub3cgaWYgdGhlcmUgYXJlICphbnkqIGV4dGVybmFsIHRhcmdl
dHMuCi0gICAgYm9vbCBoYXNUYXJnZXRzID0gY3VycmVudFBsYXliYWNrVGFyZ2V0SXNXaXJlbGVz
cyhlbGVtZW50KTsKKyAgICBib29sIGhhc1RhcmdldHMgPSBNZWRpYVNlc3Npb25NYW5hZ2VyOjpz
aGFyZWRNYW5hZ2VyKCkuaGFzV2lyZWxlc3NUYXJnZXRzQXZhaWxhYmxlKCk7CiAgICAgTE9HKE1l
ZGlhLCAiSFRNTE1lZGlhU2Vzc2lvbjo6aGFzV2lyZWxlc3NQbGF5YmFja1RhcmdldHMgLSByZXR1
cm5pbmcgJXMiLCBoYXNUYXJnZXRzID8gIlRSVUUiIDogIkZBTFNFIik7CiAKICAgICByZXR1cm4g
aGFzVGFyZ2V0czsKQEAgLTI5MCwxMSArMjkzLDEzIEBAIHZvaWQgSFRNTE1lZGlhU2Vzc2lvbjo6
c2V0SGFzUGxheWJhY2tUYXIKICAgICAgICAgcmV0dXJuOwogICAgIH0KICNlbHNlCi0gICAgVU5V
U0VEX1BBUkFNKGhhc0xpc3RlbmVycyk7CiAgICAgVU5VU0VEX1BBUkFNKGVsZW1lbnQpOwogI2Vu
ZGlmCiAKLSAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIGlmIChoYXNMaXN0ZW5lcnMpCisgICAg
ICAgIE1lZGlhU2Vzc2lvbk1hbmFnZXI6OnNoYXJlZE1hbmFnZXIoKS5zdGFydE1vbml0b3JpbmdB
aXJQbGF5Um91dGVzKCk7CisgICAgZWxzZQorICAgICAgICBNZWRpYVNlc3Npb25NYW5hZ2VyOjpz
aGFyZWRNYW5hZ2VyKCkuc3RvcE1vbml0b3JpbmdBaXJQbGF5Um91dGVzKCk7CiB9CiAjZW5kaWYK
IApJbmRleDogU291cmNlL1dlYkNvcmUvbG9hZGVyL0VtcHR5Q2xpZW50cy5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL2xvYWRlci9FbXB0eUNsaWVudHMuaAkocmV2aXNpb24gMTY2MjM4
KQorKysgU291cmNlL1dlYkNvcmUvbG9hZGVyL0VtcHR5Q2xpZW50cy5oCSh3b3JraW5nIGNvcHkp
CkBAIC0yMDcsNiArMjA3LDcgQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCByZW1vdmVTY3Jv
bGxpbmdMYXllcihOb2RlKiwgUGxhdGZvcm1MYXllciosIFBsYXRmb3JtTGF5ZXIqKSBvdmVycmlk
ZSB7IH0KIAogICAgIHZpcnR1YWwgdm9pZCB3ZWJBcHBPcmllbnRhdGlvbnNVcGRhdGVkKCkgb3Zl
cnJpZGUgeyB9OworICAgIHZpcnR1YWwgdm9pZCBzaG93QWlyUGxheVJvdXRlUGlja2VyKGJvb2wp
IG92ZXJyaWRlIHsgfTsKICNlbmRpZiAvLyBQTEFURk9STShJT1MpCiAKICNpZiBQTEFURk9STShJ
T1MpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL0Nocm9tZUNsaWVudC5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3BhZ2UvQ2hyb21lQ2xpZW50LmgJKHJldmlzaW9uIDE2NjIzOCkK
KysrIFNvdXJjZS9XZWJDb3JlL3BhZ2UvQ2hyb21lQ2xpZW50LmgJKHdvcmtpbmcgY29weSkKQEAg
LTI1Nyw2ICsyNTcsNyBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIHJlbW92ZVNjcm9sbGlu
Z0xheWVyKE5vZGUqLCBQbGF0Zm9ybUxheWVyKiBzY3JvbGxpbmdMYXllciwgUGxhdGZvcm1MYXll
ciogY29udGVudHNMYXllcikgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkIHdlYkFwcE9yaWVudGF0
aW9uc1VwZGF0ZWQoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNob3dBaXJQbGF5Um91dGVQaWNr
ZXIoYm9vbCBoYXNWaWRlbykgPSAwOwogI2VuZGlmCiAKICNpZiBFTkFCTEUoSU5QVVRfVFlQRV9D
T0xPUikKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL01lZGlhU2Vzc2lvbk1h
bmFnZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL01l
ZGlhU2Vzc2lvbk1hbmFnZXIuY3BwCShyZXZpc2lvbiAxNjYyMzgpCisrKyBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9hdWRpby9NZWRpYVNlc3Npb25NYW5hZ2VyLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMjc1LDYgKzI3NSwxMSBAQCB2b2lkIE1lZGlhU2Vzc2lvbk1hbmFnZXI6OmFwcGxpY2F0aW9u
V2lsCiAgICAgfQogfQogCit2b2lkIE1lZGlhU2Vzc2lvbk1hbmFnZXI6OndpcmVsZXNzUm91dGVz
QXZhaWxhYmxlQ2hhbmdlZCgpCit7CisgICAgLy8gRklYTUU6IEFkZCBpbXBsZW1lbnRhdGlvbi4K
K30KKwogI2lmICFQTEFURk9STShDT0NPQSkKIHZvaWQgTWVkaWFTZXNzaW9uTWFuYWdlcjo6dXBk
YXRlU2Vzc2lvblN0YXRlKCkKIHsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlv
L01lZGlhU2Vzc2lvbk1hbmFnZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9hdWRpby9NZWRpYVNlc3Npb25NYW5hZ2VyLmgJKHJldmlzaW9uIDE2NjIzOCkKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL01lZGlhU2Vzc2lvbk1hbmFnZXIuaAkod29ya2lu
ZyBjb3B5KQpAQCAtNjQsNiArNjQsNyBAQCBwdWJsaWM6CiAKICAgICB2b2lkIGFwcGxpY2F0aW9u
V2lsbEVudGVyRm9yZWdyb3VuZCgpIGNvbnN0OwogICAgIHZvaWQgYXBwbGljYXRpb25XaWxsRW50
ZXJCYWNrZ3JvdW5kKCkgY29uc3Q7CisgICAgdm9pZCB3aXJlbGVzc1JvdXRlc0F2YWlsYWJsZUNo
YW5nZWQoKTsKIAogICAgIGVudW0gU2Vzc2lvblJlc3RyaWN0aW9uRmxhZ3MgewogICAgICAgICBO
b1Jlc3RyaWN0aW9ucyA9IDAsCkBAIC04Nyw2ICs4OCw5IEBAIHB1YmxpYzoKIAogI2lmIEVOQUJM
RShJT1NfQUlSUExBWSkKICAgICB2aXJ0dWFsIHZvaWQgc2hvd1BsYXliYWNrVGFyZ2V0UGlja2Vy
KCkgeyB9CisgICAgdmlydHVhbCBib29sIGhhc1dpcmVsZXNzVGFyZ2V0c0F2YWlsYWJsZSgpIHsg
cmV0dXJuIGZhbHNlOyB9CisgICAgdmlydHVhbCB2b2lkIHN0YXJ0TW9uaXRvcmluZ0FpclBsYXlS
b3V0ZXMoKSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQgc3RvcE1vbml0b3JpbmdBaXJQbGF5Um91dGVz
KCkgeyB9CiAjZW5kaWYKIAogICAgIHZpcnR1YWwgdm9pZCBkaWRSZWNlaXZlUmVtb3RlQ29udHJv
bENvbW1hbmQoTWVkaWFTZXNzaW9uOjpSZW1vdGVDb250cm9sQ29tbWFuZFR5cGUpIG92ZXJyaWRl
OwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vaW9zL01lZGlhU2Vzc2lvbk1h
bmFnZXJJT1MuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9p
b3MvTWVkaWFTZXNzaW9uTWFuYWdlcklPUy5oCShyZXZpc2lvbiAxNjYyMzgpCisrKyBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9pb3MvTWVkaWFTZXNzaW9uTWFuYWdlcklPUy5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC01Nyw2ICs1Nyw5IEBAIHByaXZhdGU6CiAKICNpZiBFTkFCTEUoSU9TX0FJ
UlBMQVkpCiAgICAgdmlydHVhbCB2b2lkIHNob3dQbGF5YmFja1RhcmdldFBpY2tlcigpIG92ZXJy
aWRlOworICAgIHZpcnR1YWwgYm9vbCBoYXNXaXJlbGVzc1RhcmdldHNBdmFpbGFibGUoKSBvdmVy
cmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnRNb25pdG9yaW5nQWlyUGxheVJvdXRlcygpIG92
ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBzdG9wTW9uaXRvcmluZ0FpclBsYXlSb3V0ZXMoKSBv
dmVycmlkZTsKICNlbmRpZgogCiAgICAgTWVkaWFTZXNzaW9uTWFuYWdlcmlPUygpOwpJbmRleDog
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vaW9zL01lZGlhU2Vzc2lvbk1hbmFnZXJJT1Mu
bW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vaW9zL01lZGlh
U2Vzc2lvbk1hbmFnZXJJT1MubW0JKHJldmlzaW9uIDE2NjIzOCkKKysrIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2F1ZGlvL2lvcy9NZWRpYVNlc3Npb25NYW5hZ2VySU9TLm1tCSh3b3JraW5nIGNv
cHkpCkBAIC0zNiw4ICszNiwxMCBAQAogI2ltcG9ydCAiV2ViQ29yZVN5c3RlbUludGVyZmFjZS5o
IgogI2ltcG9ydCAiV2ViQ29yZVRocmVhZFJ1bi5oIgogI2ltcG9ydCA8QVZGb3VuZGF0aW9uL0FW
QXVkaW9TZXNzaW9uLmg+CisjaW1wb3J0IDxNZWRpYVBsYXllci9NUEFWUm91dGluZ0NvbnRyb2xs
ZXIuaD4KICNpbXBvcnQgPE1lZGlhUGxheWVyL01QTWVkaWFJdGVtLmg+CiAjaW1wb3J0IDxNZWRp
YVBsYXllci9NUE5vd1BsYXlpbmdJbmZvQ2VudGVyLmg+CisjaW1wb3J0IDxNZWRpYVBsYXllci9N
UFZvbHVtZVZpZXcuaD4KICNpbXBvcnQgPFVJS2l0L1VJQXBwbGljYXRpb24uaD4KICNpbXBvcnQg
PG9iamMvcnVudGltZS5oPgogI2ltcG9ydCA8d3RmL1JldGFpblB0ci5oPgpAQCAtNjUsMTYgKzY3
LDIxIEBAIFNPRlRfTElOS19QT0lOVEVSKFVJS2l0LCBVSUFwcGxpY2F0aW9uRGkKICNkZWZpbmUg
VUlBcHBsaWNhdGlvbkRpZEJlY29tZUFjdGl2ZU5vdGlmaWNhdGlvbiBnZXRVSUFwcGxpY2F0aW9u
RGlkQmVjb21lQWN0aXZlTm90aWZpY2F0aW9uKCkKIAogU09GVF9MSU5LX0ZSQU1FV09SSyhNZWRp
YVBsYXllcikKK1NPRlRfTElOS19DTEFTUyhNZWRpYVBsYXllciwgTVBBVlJvdXRpbmdDb250cm9s
bGVyKQogU09GVF9MSU5LX0NMQVNTKE1lZGlhUGxheWVyLCBNUE5vd1BsYXlpbmdJbmZvQ2VudGVy
KQogU09GVF9MSU5LX1BPSU5URVIoTWVkaWFQbGF5ZXIsIE1QTWVkaWFJdGVtUHJvcGVydHlUaXRs
ZSwgTlNTdHJpbmcgKikKIFNPRlRfTElOS19QT0lOVEVSKE1lZGlhUGxheWVyLCBNUE1lZGlhSXRl
bVByb3BlcnR5UGxheWJhY2tEdXJhdGlvbiwgTlNTdHJpbmcgKikKIFNPRlRfTElOS19QT0lOVEVS
KE1lZGlhUGxheWVyLCBNUE5vd1BsYXlpbmdJbmZvUHJvcGVydHlFbGFwc2VkUGxheWJhY2tUaW1l
LCBOU1N0cmluZyAqKQogU09GVF9MSU5LX1BPSU5URVIoTWVkaWFQbGF5ZXIsIE1QTm93UGxheWlu
Z0luZm9Qcm9wZXJ0eVBsYXliYWNrUmF0ZSwgTlNTdHJpbmcgKikKK1NPRlRfTElOS19DTEFTUyhN
ZWRpYVBsYXllciwgTVBWb2x1bWVWaWV3KQorU09GVF9MSU5LX1BPSU5URVIoTWVkaWFQbGF5ZXIs
IE1QVm9sdW1lVmlld1dpcmVsZXNzUm91dGVzQXZhaWxhYmxlRGlkQ2hhbmdlTm90aWZpY2F0aW9u
LCBOU1N0cmluZyAqKQorCiAKICNkZWZpbmUgTVBNZWRpYUl0ZW1Qcm9wZXJ0eVRpdGxlIGdldE1Q
TWVkaWFJdGVtUHJvcGVydHlUaXRsZSgpCiAjZGVmaW5lIE1QTWVkaWFJdGVtUHJvcGVydHlQbGF5
YmFja0R1cmF0aW9uIGdldE1QTWVkaWFJdGVtUHJvcGVydHlQbGF5YmFja0R1cmF0aW9uKCkKICNk
ZWZpbmUgTVBOb3dQbGF5aW5nSW5mb1Byb3BlcnR5RWxhcHNlZFBsYXliYWNrVGltZSBnZXRNUE5v
d1BsYXlpbmdJbmZvUHJvcGVydHlFbGFwc2VkUGxheWJhY2tUaW1lKCkKICNkZWZpbmUgTVBOb3dQ
bGF5aW5nSW5mb1Byb3BlcnR5UGxheWJhY2tSYXRlIGdldE1QTm93UGxheWluZ0luZm9Qcm9wZXJ0
eVBsYXliYWNrUmF0ZSgpCisjZGVmaW5lIE1QVm9sdW1lVmlld1dpcmVsZXNzUm91dGVzQXZhaWxh
YmxlRGlkQ2hhbmdlTm90aWZpY2F0aW9uIGdldE1QVm9sdW1lVmlld1dpcmVsZXNzUm91dGVzQXZh
aWxhYmxlRGlkQ2hhbmdlTm90aWZpY2F0aW9uKCkKIAogTlNTdHJpbmcqIFdlYlVJQXBwbGljYXRp
b25XaWxsUmVzaWduQWN0aXZlTm90aWZpY2F0aW9uID0gQCJXZWJVSUFwcGxpY2F0aW9uV2lsbFJl
c2lnbkFjdGl2ZU5vdGlmaWNhdGlvbiI7CiBOU1N0cmluZyogV2ViVUlBcHBsaWNhdGlvbldpbGxF
bnRlckZvcmVncm91bmROb3RpZmljYXRpb24gPSBAIldlYlVJQXBwbGljYXRpb25XaWxsRW50ZXJG
b3JlZ3JvdW5kTm90aWZpY2F0aW9uIjsKQEAgLTg0LDYgKzkxLDggQEAgdXNpbmcgbmFtZXNwYWNl
IFdlYkNvcmU7CiAKIEBpbnRlcmZhY2UgV2ViTWVkaWFTZXNzaW9uSGVscGVyIDogTlNPYmplY3Qg
ewogICAgIE1lZGlhU2Vzc2lvbk1hbmFnZXJpT1MqIF9jYWxsYmFjazsKKyAgICBSZXRhaW5QdHI8
TVBWb2x1bWVWaWV3PiBfdm9sdW1lVmlldzsKKyAgICBSZXRhaW5QdHI8TVBBVlJvdXRpbmdDb250
cm9sbGVyPiBfYWlyUGxheVByZXNlbmNlUm91dGluZ0NvbnRyb2xsZXI7CiB9CiAKIC0gKGlkKWlu
aXRXaXRoQ2FsbGJhY2s6KE1lZGlhU2Vzc2lvbk1hbmFnZXJpT1MqKWNhbGxiYWNrOwpAQCAtOTEs
NiArMTAwLDkgQEAgLSAodm9pZCljbGVhckNhbGxiYWNrOwogLSAodm9pZClpbnRlcnJ1cHRpb246
KE5TTm90aWZpY2F0aW9uICopbm90aWZpY2F0aW9uOwogLSAodm9pZClhcHBsaWNhdGlvbldpbGxF
bnRlckZvcmVncm91bmQ6KE5TTm90aWZpY2F0aW9uICopbm90aWZpY2F0aW9uOwogLSAodm9pZClh
cHBsaWNhdGlvbldpbGxSZXNpZ25BY3RpdmU6KE5TTm90aWZpY2F0aW9uICopbm90aWZpY2F0aW9u
OworLSAoQk9PTCloYXNXaXJlbGVzc1RhcmdldHNBdmFpbGFibGU7CistICh2b2lkKXN0YXJ0TW9u
aXRvcmluZ0FpclBsYXlSb3V0ZXM7CistICh2b2lkKXN0b3BNb25pdG9yaW5nQWlyUGxheVJvdXRl
czsKIEBlbmQKIAogbmFtZXNwYWNlIFdlYkNvcmUgewpAQCAtMTM1LDYgKzE0NywyMSBAQCB2b2lk
IE1lZGlhU2Vzc2lvbk1hbmFnZXJpT1M6OnNob3dQbGF5YmFjCiB7CiAgICAgbm90SW1wbGVtZW50
ZWQoKTsKIH0KKworYm9vbCBNZWRpYVNlc3Npb25NYW5hZ2VyaU9TOjpoYXNXaXJlbGVzc1Rhcmdl
dHNBdmFpbGFibGUoKQoreworICAgIHJldHVybiBbbV9vYmpjT2JzZXJ2ZXIgaGFzV2lyZWxlc3NU
YXJnZXRzQXZhaWxhYmxlXTsKK30KKwordm9pZCBNZWRpYVNlc3Npb25NYW5hZ2VyaU9TOjpzdGFy
dE1vbml0b3JpbmdBaXJQbGF5Um91dGVzKCkKK3sKKyAgICBbbV9vYmpjT2JzZXJ2ZXIgc3RhcnRN
b25pdG9yaW5nQWlyUGxheVJvdXRlc107Cit9CisKK3ZvaWQgTWVkaWFTZXNzaW9uTWFuYWdlcmlP
Uzo6c3RvcE1vbml0b3JpbmdBaXJQbGF5Um91dGVzKCkKK3sKKyAgICBbbV9vYmpjT2JzZXJ2ZXIg
c3RvcE1vbml0b3JpbmdBaXJQbGF5Um91dGVzXTsKK30KICNlbmRpZgogICAgIAogdm9pZCBNZWRp
YVNlc3Npb25NYW5hZ2VyaU9TOjpzZXNzaW9uV2lsbEJlZ2luUGxheWJhY2soTWVkaWFTZXNzaW9u
JiBzZXNzaW9uKQpAQCAtMTg3LDYgKzIxNCw3IEBAIC0gKGlkKWluaXRXaXRoQ2FsbGJhY2s6KE1l
ZGlhU2Vzc2lvbk1hbmEKICAgICAgICAgcmV0dXJuIG5pbDsKICAgICAKICAgICBfY2FsbGJhY2sg
PSBjYWxsYmFjazsKKyAgICBfdm9sdW1lVmlldyA9IGFkb3B0TlMoW1tnZXRNUFZvbHVtZVZpZXdD
bGFzcygpIGFsbG9jXSBpbml0XSk7CiAKICAgICBOU05vdGlmaWNhdGlvbkNlbnRlciAqY2VudGVy
ID0gW05TTm90aWZpY2F0aW9uQ2VudGVyIGRlZmF1bHRDZW50ZXJdOwogICAgIFtjZW50ZXIgYWRk
T2JzZXJ2ZXI6c2VsZiBzZWxlY3RvcjpAc2VsZWN0b3IoaW50ZXJydXB0aW9uOikgbmFtZTpBVkF1
ZGlvU2Vzc2lvbkludGVycnVwdGlvbk5vdGlmaWNhdGlvbiBvYmplY3Q6W0FWQXVkaW9TZXNzaW9u
IHNoYXJlZEluc3RhbmNlXV07CkBAIC0xOTcsNyArMjI1LDggQEAgLSAoaWQpaW5pdFdpdGhDYWxs
YmFjazooTWVkaWFTZXNzaW9uTWFuYQogICAgIFtjZW50ZXIgYWRkT2JzZXJ2ZXI6c2VsZiBzZWxl
Y3RvcjpAc2VsZWN0b3IoYXBwbGljYXRpb25EaWRCZWNvbWVBY3RpdmU6KSBuYW1lOldlYlVJQXBw
bGljYXRpb25EaWRCZWNvbWVBY3RpdmVOb3RpZmljYXRpb24gb2JqZWN0Om5pbF07CiAgICAgW2Nl
bnRlciBhZGRPYnNlcnZlcjpzZWxmIHNlbGVjdG9yOkBzZWxlY3RvcihhcHBsaWNhdGlvbldpbGxS
ZXNpZ25BY3RpdmU6KSBuYW1lOlVJQXBwbGljYXRpb25XaWxsUmVzaWduQWN0aXZlTm90aWZpY2F0
aW9uIG9iamVjdDpuaWxdOwogICAgIFtjZW50ZXIgYWRkT2JzZXJ2ZXI6c2VsZiBzZWxlY3RvcjpA
c2VsZWN0b3IoYXBwbGljYXRpb25XaWxsUmVzaWduQWN0aXZlOikgbmFtZTpXZWJVSUFwcGxpY2F0
aW9uV2lsbFJlc2lnbkFjdGl2ZU5vdGlmaWNhdGlvbiBvYmplY3Q6bmlsXTsKLSAgICAKKyAgICBb
Y2VudGVyIGFkZE9ic2VydmVyOnNlbGYgc2VsZWN0b3I6QHNlbGVjdG9yKHdpcmVsZXNzUm91dGVz
QXZhaWxhYmxlRGlkQ2hhbmdlOikgbmFtZTpNUFZvbHVtZVZpZXdXaXJlbGVzc1JvdXRlc0F2YWls
YWJsZURpZENoYW5nZU5vdGlmaWNhdGlvbiBvYmplY3Q6X3ZvbHVtZVZpZXcuZ2V0KCldOworCiAg
ICAgLy8gTm93IHBsYXlpbmcgd29uJ3Qgd29yayB1bmxlc3Mgd2UgdHVybiBvbiB0aGUgZGVsaXZl
cnkgb2YgcmVtb3RlIGNvbnRyb2wgZXZlbnRzLgogICAgIFtbVUlBcHBsaWNhdGlvbiBzaGFyZWRB
cHBsaWNhdGlvbl0gYmVnaW5SZWNlaXZpbmdSZW1vdGVDb250cm9sRXZlbnRzXTsKICAgICAKQEAg
LTIxNSw2ICsyNDQsMjUgQEAgLSAodm9pZCljbGVhckNhbGxiYWNrCiAgICAgX2NhbGxiYWNrID0g
bmlsOwogfQogCistIChCT09MKWhhc1dpcmVsZXNzVGFyZ2V0c0F2YWlsYWJsZQoreworICAgIHJl
dHVybiBbX3ZvbHVtZVZpZXcgYXJlV2lyZWxlc3NSb3V0ZXNBdmFpbGFibGVdOworfQorCistICh2
b2lkKXN0YXJ0TW9uaXRvcmluZ0FpclBsYXlSb3V0ZXMKK3sKKyAgICBpZiAoX2FpclBsYXlQcmVz
ZW5jZVJvdXRpbmdDb250cm9sbGVyKQorICAgICAgICByZXR1cm47CisKKyAgICBfYWlyUGxheVBy
ZXNlbmNlUm91dGluZ0NvbnRyb2xsZXIgPSBbW2dldE1QQVZSb3V0aW5nQ29udHJvbGxlckNsYXNz
KCkgYWxsb2NdIGluaXRXaXRoTmFtZTpAIldlYkNvcmUgLSBIVE1MIG1lZGlhIGVsZW1lbnQgY2hl
Y2tpbmcgZm9yIEFpclBsYXkgcm91dGUgcHJlc2VuY2UiXTsKKyAgICBbX2FpclBsYXlQcmVzZW5j
ZVJvdXRpbmdDb250cm9sbGVyIHNldERpc2NvdmVyeU1vZGU6TVBSb3V0ZURpc2NvdmVyeU1vZGVQ
cmVzZW5jZV07Cit9CisKKy0gKHZvaWQpc3RvcE1vbml0b3JpbmdBaXJQbGF5Um91dGVzCit7Cisg
ICAgX2FpclBsYXlQcmVzZW5jZVJvdXRpbmdDb250cm9sbGVyID0gbmlsOworfQorCiAtICh2b2lk
KWludGVycnVwdGlvbjooTlNOb3RpZmljYXRpb24gKilub3RpZmljYXRpb24KIHsKICAgICBpZiAo
IV9jYWxsYmFjaykKQEAgLTI4Myw2ICszMzEsMjAgQEAgLSAodm9pZClhcHBsaWNhdGlvbldpbGxS
ZXNpZ25BY3RpdmU6KE5TTgogICAgIH0pOwogfQogCistICh2b2lkKXdpcmVsZXNzUm91dGVzQXZh
aWxhYmxlRGlkQ2hhbmdlOihOU05vdGlmaWNhdGlvbiAqKW5vdGlmaWNhdGlvbgoreworICAgIFVO
VVNFRF9QQVJBTShub3RpZmljYXRpb24pOworCisgICAgaWYgKCFfY2FsbGJhY2spCisgICAgICAg
IHJldHVybjsKKworICAgIFdlYlRocmVhZFJ1biheeworICAgICAgICBpZiAoIV9jYWxsYmFjaykK
KyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBfY2FsbGJhY2stPndpcmVsZXNzUm91dGVz
QXZhaWxhYmxlQ2hhbmdlZCgpOworICAgIH0pOworfQogQGVuZAogCiAjZW5kaWYgLy8gUExBVEZP
Uk0oSU9TKQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYXZmb3VuZGF0
aW9uL29iamMvTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uT2JqQy5tbQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9hdmZvdW5kYXRpb24vb2JqYy9N
ZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25PYmpDLm1tCShyZXZpc2lvbiAxNjYyMzgpCisr
KyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9hdmZvdW5kYXRpb24vb2JqYy9NZWRp
YVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25PYmpDLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0yMDc0
LDcgKzIwNzQsNyBAQCBib29sIE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbk9iakM6CiAg
ICAgaWYgKCFtX2F2UGxheWVyKQogICAgICAgICByZXR1cm4gIW1fYWxsb3dzV2lyZWxlc3NWaWRl
b1BsYXliYWNrOwogICAgIAotICAgIG1fYWxsb3dzV2lyZWxlc3NWaWRlb1BsYXliYWNrID0gIVtt
X2F2UGxheWVyLmdldCgpIGFsbG93c0V4dGVybmFsUGxheWJhY2tdOworICAgIG1fYWxsb3dzV2ly
ZWxlc3NWaWRlb1BsYXliYWNrID0gW21fYXZQbGF5ZXIuZ2V0KCkgYWxsb3dzRXh0ZXJuYWxQbGF5
YmFja107CiAgICAgTE9HKE1lZGlhLCAiTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uT2Jq
Qzo6d2lyZWxlc3NWaWRlb1BsYXliYWNrRGlzYWJsZWQoJXApIC0gcmV0dXJuaW5nICVzIiwgdGhp
cywgYm9vbFN0cmluZyghbV9hbGxvd3NXaXJlbGVzc1ZpZGVvUGxheWJhY2spKTsKIAogICAgIHJl
dHVybiAhbV9hbGxvd3NXaXJlbGVzc1ZpZGVvUGxheWJhY2s7CkBAIC0yMDg3LDcgKzIwODcsNyBA
QCB2b2lkIE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbk9iakM6CiAgICAgaWYgKCFtX2F2
UGxheWVyKQogICAgICAgICByZXR1cm47CiAgICAgCi0gICAgW21fYXZQbGF5ZXIuZ2V0KCkgc2V0
QWxsb3dzRXh0ZXJuYWxQbGF5YmFjazpkaXNhYmxlZF07CisgICAgW21fYXZQbGF5ZXIuZ2V0KCkg
c2V0QWxsb3dzRXh0ZXJuYWxQbGF5YmFjazohZGlzYWJsZWRdOwogfQogI2VuZGlmCiAKSW5kZXg6
IFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9D
aGFuZ2VMb2cJKHJldmlzaW9uIDE2NjM2OCkKKysrIFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwko
d29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDUxIEBACisyMDE0LTAzLTI3ICBFbnJpY2EgQ2FzdWNj
aSAgPGVucmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgQWRkIHN1cHBvcnQgZm9yIEFpclBsYXkg
cGlja2VyIGluIFdLMiBmb3IgaU9TLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MTMwODU1CisgICAgICAgIDxyZGFyOi8vcHJvYmxlbS8xNTM0OTg1OT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGRzIHN1
cHBvcnQgdG8gZGlzcGxheSB0aGUgYWlycGxheSBwaWNrZXIgZm9yIGlQaG9uZSBhbmQgaVBhZAor
ICAgICAgICBpbiBXSzIuCisgICAgICAgIFRoZSBwaWNrZXIgb24gaVBhZCBpcyBkaXNwbGF5ZWQg
bmV4dCB0byB0aGUgYWlycGxheSBidXR0b24uCisKKyAgICAgICAgKiBDb25maWd1cmF0aW9ucy9X
ZWJLaXQyLnhjY29uZmlnOgorICAgICAgICAqIFVJUHJvY2Vzcy9QYWdlQ2xpZW50Lmg6CisgICAg
ICAgICogVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5oOgorICAgICAgICAqIFVJUHJvY2Vzcy9XZWJQ
YWdlUHJveHkubWVzc2FnZXMuaW46CisgICAgICAgICogVUlQcm9jZXNzL2lvcy9QYWdlQ2xpZW50
SW1wbElPUy5oOgorICAgICAgICAqIFVJUHJvY2Vzcy9pb3MvUGFnZUNsaWVudEltcGxJT1MubW06
CisgICAgICAgIChXZWJLaXQ6OlBhZ2VDbGllbnRJbXBsOjpzaG93QWlyUGxheVJvdXRlUGlja2Vy
KToKKyAgICAgICAgKiBVSVByb2Nlc3MvaW9zL1dLQ29udGVudFZpZXdJbnRlcmFjdGlvbi5oOgor
ICAgICAgICAqIFVJUHJvY2Vzcy9pb3MvV0tDb250ZW50Vmlld0ludGVyYWN0aW9uLm1tOgorICAg
ICAgICAoLVtXS0NvbnRlbnRWaWV3IF9zaG93QWlyUGxheVJvdXRlUGlja2VyOmZyb21SZWN0Ol0p
OgorICAgICAgICAqIFVJUHJvY2Vzcy9pb3MvV2ViUGFnZVByb3h5SU9TLm1tOgorICAgICAgICAo
V2ViS2l0OjpXZWJQYWdlUHJveHk6OnNob3dBaXJQbGF5Um91dGVQaWNrZXIpOgorICAgICAgICAq
IFVJUHJvY2Vzcy9pb3MvZm9ybXMvV0tBaXJQbGF5Um91dGVQaWNrZXIuaDogQWRkZWQuCisgICAg
ICAgICogVUlQcm9jZXNzL2lvcy9mb3Jtcy9XS0FpclBsYXlSb3V0ZVBpY2tlci5tbTogQWRkZWQu
CisgICAgICAgICgtW1dLQWlyUGxheVJvdXRlUGlja2VyIGluaXRXaXRoVmlldzpdKToKKyAgICAg
ICAgKC1bV0tBaXJQbGF5Um91dGVQaWNrZXIgZGVhbGxvY10pOgorICAgICAgICAoLVtXS0FpclBs
YXlSb3V0ZVBpY2tlciBwb3BvdmVyQ29udHJvbGxlckRpZERpc21pc3NQb3BvdmVyOl0pOgorICAg
ICAgICAoLVtXS0FpclBsYXlSb3V0ZVBpY2tlciBfcHJlc2VudEFpclBsYXlQb3BvdmVyQW5pbWF0
ZWQ6ZnJvbVJlY3Q6XSk6CisgICAgICAgICgtW1dLQWlyUGxheVJvdXRlUGlja2VyIF93aW5kb3dX
aWxsUm90YXRlOl0pOgorICAgICAgICAoLVtXS0FpclBsYXlSb3V0ZVBpY2tlciBfd2luZG93RGlk
Um90YXRlOl0pOgorICAgICAgICAoLVtXS0FpclBsYXlSb3V0ZVBpY2tlciBfZGlzbWlzc0FpclBs
YXlSb3V0ZVBpY2tlcklQYWRdKToKKyAgICAgICAgKC1bV0tBaXJQbGF5Um91dGVQaWNrZXIgc2hv
d0FpclBsYXlQaWNrZXJJUGFkOmZyb21SZWN0Ol0pOgorICAgICAgICAoLVtXS0FpclBsYXlSb3V0
ZVBpY2tlciBzaG93QWlyUGxheVBpY2tlcklQaG9uZTpdKToKKyAgICAgICAgKC1bV0tBaXJQbGF5
Um91dGVQaWNrZXIgc2hvdzpmcm9tUmVjdDpdKToKKyAgICAgICAgKiBXZWJLaXQyLnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9X
ZWJDaHJvbWVDbGllbnQuaDoKKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L2lv
cy9XZWJDaHJvbWVDbGllbnRJT1MubW06CisgICAgICAgIChXZWJLaXQ6OldlYkNocm9tZUNsaWVu
dDo6c2hvd0FpclBsYXlSb3V0ZVBpY2tlcik6CisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdl
L1dlYlBhZ2UuY3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJQYWdlOjp0b3VjaEV2ZW50KToKKyAg
ICAgICAgKFdlYktpdDo6V2ViUGFnZTo6dG91Y2hFdmVudFN5bmNGb3JUZXN0aW5nKToKKyAgICAg
ICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5oOgorICAgICAgICAqIFdlYlByb2Nlc3Mv
V2ViUGFnZS9pb3MvV2ViUGFnZUlPUy5tbToKKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZTo6cmVj
dEZvckVsZW1lbnRBdEludGVyYWN0aW9uTG9jYXRpb24pOgorICAgICAgICAoV2ViS2l0OjpXZWJQ
YWdlOjpoYW5kbGVUYXApOgorCiAyMDE0LTAzLTI3ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNj
YUBhcHBsZS5jb20+CiAKICAgICAgICAgUmVuYW1lIFdLRnJhbWVIYW5kbGUgdG8gX1dLRnJhbWVI
YW5kbGUKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL0NvbmZpZ3VyYXRpb25zL1dlYktpdDIueGNjb25m
aWcKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvQ29uZmlndXJhdGlvbnMvV2ViS2l0Mi54
Y2NvbmZpZwkocmV2aXNpb24gMTY2MjM4KQorKysgU291cmNlL1dlYktpdDIvQ29uZmlndXJhdGlv
bnMvV2ViS2l0Mi54Y2NvbmZpZwkod29ya2luZyBjb3B5KQpAQCAtMzAsNyArMzAsNyBAQCBJTlNU
QUxMX1BBVEhfQUNUVUFMID0gJChXRUJLSVQyX0ZSQU1FV09SCiBEWUxJQl9JTlNUQUxMX05BTUVf
QkFTRSA9ICQoTk9STUFMX1dFQktJVDJfRlJBTUVXT1JLU19ESVIpOwogCiBGUkFNRVdPUktfQU5E
X0xJQlJBUllfTERGTEFHUyA9ICQoRlJBTUVXT1JLX0FORF9MSUJSQVJZX0xERkxBR1NfJChQTEFU
Rk9STV9OQU1FKSk7Ci1GUkFNRVdPUktfQU5EX0xJQlJBUllfTERGTEFHU19pcGhvbmVzaW11bGF0
b3IgPSAtbG9iamMgLWZyYW1ld29yayBDRk5ldHdvcmsgLWZyYW1ld29yayBDb3JlRm91bmRhdGlv
biAtZnJhbWV3b3JrIENvcmVHcmFwaGljcyAtZnJhbWV3b3JrIENvcmVQREYgLWZyYW1ld29yayBD
b3JlVGV4dCAtZnJhbWV3b3JrIEZvdW5kYXRpb24gLWZyYW1ld29yayBHcmFwaGljc1NlcnZpY2Vz
IC1mcmFtZXdvcmsgSW1hZ2VJTyAtZnJhbWV3b3JrIFVJS2l0IC1mcmFtZXdvcmsgT3BlbkdMRVMg
LWZyYW1ld29yayBNb2JpbGVBc3NldCAtZnJhbWV3b3JrIFdlYktpdCAtbE1vYmlsZUdlc3RhbHQg
LWxhc3NlcnRpb25fZXh0ZW5zaW9uOworRlJBTUVXT1JLX0FORF9MSUJSQVJZX0xERkxBR1NfaXBo
b25lc2ltdWxhdG9yID0gLWxvYmpjIC1mcmFtZXdvcmsgQ0ZOZXR3b3JrIC1mcmFtZXdvcmsgQ29y
ZUZvdW5kYXRpb24gLWZyYW1ld29yayBDb3JlR3JhcGhpY3MgLWZyYW1ld29yayBDb3JlUERGIC1m
cmFtZXdvcmsgQ29yZVRleHQgLWZyYW1ld29yayBGb3VuZGF0aW9uIC1mcmFtZXdvcmsgR3JhcGhp
Y3NTZXJ2aWNlcyAtZnJhbWV3b3JrIEltYWdlSU8gLWZyYW1ld29yayBVSUtpdCAtZnJhbWV3b3Jr
IE1lZGlhUGxheWVyIC1mcmFtZXdvcmsgT3BlbkdMRVMgLWZyYW1ld29yayBNb2JpbGVBc3NldCAt
ZnJhbWV3b3JrIFdlYktpdCAtbE1vYmlsZUdlc3RhbHQgLWxhc3NlcnRpb25fZXh0ZW5zaW9uOwog
RlJBTUVXT1JLX0FORF9MSUJSQVJZX0xERkxBR1NfaXBob25lb3MgPSAkKEZSQU1FV09SS19BTkRf
TElCUkFSWV9MREZMQUdTX2lwaG9uZXNpbXVsYXRvcikgLWZyYW1ld29yayBJT1N1cmZhY2U7CiBG
UkFNRVdPUktfQU5EX0xJQlJBUllfTERGTEFHU19tYWNvc3ggPSAtZnJhbWV3b3JrIEFwcGxpY2F0
aW9uU2VydmljZXMgLWZyYW1ld29yayBDYXJib24gLWZyYW1ld29yayBDb2NvYSAtZnJhbWV3b3Jr
IENvcmVTZXJ2aWNlcyAtZnJhbWV3b3JrIElPS2l0IC1mcmFtZXdvcmsgQ29yZUF1ZGlvIC1mcmFt
ZXdvcmsgSU9TdXJmYWNlIC1mcmFtZXdvcmsgT3BlbkdMOwogCkluZGV4OiBTb3VyY2UvV2ViS2l0
Mi9VSVByb2Nlc3MvUGFnZUNsaWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJ
UHJvY2Vzcy9QYWdlQ2xpZW50LmgJKHJldmlzaW9uIDE2NjIzOCkKKysrIFNvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9QYWdlQ2xpZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTI0OSw2ICsyNDksNyBA
QCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIHBvc2l0aW9uSW5mb3JtYXRpb25EaWRDaGFuZ2Uo
Y29uc3QgSW50ZXJhY3Rpb25JbmZvcm1hdGlvbkF0UG9zaXRpb24mKSA9IDA7CiAgICAgdmlydHVh
bCB2b2lkIHNhdmVJbWFnZVRvTGlicmFyeShQYXNzUmVmUHRyPFdlYkNvcmU6OlNoYXJlZEJ1ZmZl
cj4pID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgZGlkVXBkYXRlQmxvY2tTZWxlY3Rpb25XaXRoVG91
Y2godWludDMyX3QgdG91Y2gsIHVpbnQzMl90IGZsYWdzLCBmbG9hdCBncm93VGhyZXNob2xkLCBm
bG9hdCBzaHJpbmtUaHJlc2hvbGQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2hvd0FpclBsYXlS
b3V0ZVBpY2tlcihib29sIGhhc1ZpZGVvLCBjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiBlbGVtZW50
UmVjdCkgPSAwOwogI2VuZGlmCiAKICAgICAvLyBBdXhpbGlhcnkgQ2xpZW50IENyZWF0aW9uCklu
ZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5oCShyZXZpc2lvbiAxNjYy
MzgpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmgJKHdvcmtpbmcg
Y29weSkKQEAgLTEyODQsNiArMTI4NCw3IEBAIHByaXZhdGU6CiAgICAgdm9pZCBhdXRvY29ycmVj
dGlvbkNvbnRleHRDYWxsYmFjayhjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmLCBjb25zdCBT
dHJpbmcmLCBjb25zdCBTdHJpbmcmLCB1aW50NjRfdCwgdWludDY0X3QsIHVpbnQ2NF90KTsKICAg
ICB2b2lkIGRpY3RhdGlvbkNvbnRleHRDYWxsYmFjayhjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJp
bmcmLCBjb25zdCBTdHJpbmcmLCB1aW50NjRfdCk7CiAgICAgdm9pZCBpbnRlcnByZXRLZXlFdmVu
dChjb25zdCBFZGl0b3JTdGF0ZSYsIGJvb2wgaXNDaGFyRXZlbnQsIGJvb2wmIGhhbmRsZWQpOwor
ICAgIHZvaWQgc2hvd0FpclBsYXlSb3V0ZVBpY2tlcihib29sIGhhc1ZpZGVvLCBjb25zdCBXZWJD
b3JlOjpJbnRSZWN0JiBlbGVtZW50UmVjdCk7CiAjZW5kaWYKICNpZiBQTEFURk9STShHVEspCiAg
ICAgdm9pZCBwcmludEZpbmlzaGVkQ2FsbGJhY2soY29uc3QgV2ViQ29yZTo6UmVzb3VyY2VFcnJv
ciYsIHVpbnQ2NF90KTsKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJv
eHkubWVzc2FnZXMuaW4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dl
YlBhZ2VQcm94eS5tZXNzYWdlcy5pbgkocmV2aXNpb24gMTY2MjM4KQorKysgU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5tZXNzYWdlcy5pbgkod29ya2luZyBjb3B5KQpAQCAt
MTY3LDYgKzE2Nyw3IEBAIG1lc3NhZ2VzIC0+IFdlYlBhZ2VQcm94eSB7CiAgICAgRGlkUmVjZWl2
ZVBvc2l0aW9uSW5mb3JtYXRpb24oV2ViS2l0OjpJbnRlcmFjdGlvbkluZm9ybWF0aW9uQXRQb3Np
dGlvbiBpbmZvcm1hdGlvbikKICAgICBTYXZlSW1hZ2VUb0xpYnJhcnkoV2ViS2l0OjpTaGFyZWRN
ZW1vcnk6OkhhbmRsZSBoYW5kbGUsIHVpbnQ2NF90IHNpemUpCiAgICAgRGlkVXBkYXRlQmxvY2tT
ZWxlY3Rpb25XaXRoVG91Y2godWludDMyX3QgdG91Y2gsIHVpbnQzMl90IGZsYWdzLCBmbG9hdCBn
cm93VGhyZXNob2xkLCBmbG9hdCBzaHJpbmtUaHJlc2hvbGQpCisgICAgU2hvd0FpclBsYXlSb3V0
ZVBpY2tlcihib29sIGhhc1ZpZGVvLCBXZWJDb3JlOjpJbnRSZWN0IGVsZW1lbnRSZWN0KQogI2Vu
ZGlmCiAjaWYgUExBVEZPUk0oR1RLKQogICAgIFByaW50RmluaXNoZWRDYWxsYmFjayhXZWJDb3Jl
OjpSZXNvdXJjZUVycm9yIGVycm9yLCB1aW50NjRfdCBjYWxsYmFja0lEKQpJbmRleDogU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL2lvcy9QYWdlQ2xpZW50SW1wbElPUy5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9pb3MvUGFnZUNsaWVudEltcGxJT1MuaAkocmV2aXNp
b24gMTY2MjM4KQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL2lvcy9QYWdlQ2xpZW50SW1w
bElPUy5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMTMsNiArMTEzLDcgQEAgcHJpdmF0ZToKICAgICB2
aXJ0dWFsIHZvaWQgcG9zaXRpb25JbmZvcm1hdGlvbkRpZENoYW5nZShjb25zdCBJbnRlcmFjdGlv
bkluZm9ybWF0aW9uQXRQb3NpdGlvbiYpOwogICAgIHZpcnR1YWwgdm9pZCBzYXZlSW1hZ2VUb0xp
YnJhcnkoUGFzc1JlZlB0cjxXZWJDb3JlOjpTaGFyZWRCdWZmZXI+KTsKICAgICB2aXJ0dWFsIHZv
aWQgZGlkVXBkYXRlQmxvY2tTZWxlY3Rpb25XaXRoVG91Y2godWludDMyX3QgdG91Y2gsIHVpbnQz
Ml90IGZsYWdzLCBmbG9hdCBncm93VGhyZXNob2xkLCBmbG9hdCBzaHJpbmtUaHJlc2hvbGQpOwor
ICAgIHZpcnR1YWwgdm9pZCBzaG93QWlyUGxheVJvdXRlUGlja2VyKGJvb2wgaGFzVmlkZW8sIGNv
bnN0IFdlYkNvcmU6OkludFJlY3QmIGVsZW1lbnRSZWN0KTsKIAogICAgIC8vIEF1eGlsaWFyeSBD
bGllbnQgQ3JlYXRpb24KICNpZiBFTkFCTEUoRlVMTFNDUkVFTl9BUEkpCkluZGV4OiBTb3VyY2Uv
V2ViS2l0Mi9VSVByb2Nlc3MvaW9zL1BhZ2VDbGllbnRJbXBsSU9TLm1tCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9pb3MvUGFnZUNsaWVudEltcGxJT1MubW0JKHJldmlz
aW9uIDE2NjIzOCkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9pb3MvUGFnZUNsaWVudElt
cGxJT1MubW0JKHdvcmtpbmcgY29weSkKQEAgLTM2Myw2ICszNjMsMTEgQEAgdm9pZCBQYWdlQ2xp
ZW50SW1wbDo6ZGlkVXBkYXRlQmxvY2tTZWxlYwogICAgIFttX2NvbnRlbnRWaWV3IF9kaWRVcGRh
dGVCbG9ja1NlbGVjdGlvbldpdGhUb3VjaDooV0tTZWxlY3Rpb25Ub3VjaCl0b3VjaCB3aXRoRmxh
Z3M6KFdLU2VsZWN0aW9uRmxhZ3MpZmxhZ3MgZ3Jvd1RocmVzaG9sZDpncm93VGhyZXNob2xkIHNo
cmlua1RocmVzaG9sZDpzaHJpbmtUaHJlc2hvbGRdOwogfQogCit2b2lkIFBhZ2VDbGllbnRJbXBs
OjpzaG93QWlyUGxheVJvdXRlUGlja2VyKGJvb2wgaGFzVmlkZW8sIGNvbnN0IEludFJlY3QmIGVs
ZW1lbnRSZWN0KQoreworICAgIFttX2NvbnRlbnRWaWV3IF9zaG93QWlyUGxheVJvdXRlUGlja2Vy
Omhhc1ZpZGVvIGZyb21SZWN0OmVsZW1lbnRSZWN0XTsKK30KKwogI2lmIEVOQUJMRShGVUxMU0NS
RUVOX0FQSSkKIAogV2ViRnVsbFNjcmVlbk1hbmFnZXJQcm94eUNsaWVudCYgUGFnZUNsaWVudElt
cGw6OmZ1bGxTY3JlZW5NYW5hZ2VyUHJveHlDbGllbnQoKQpJbmRleDogU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL2lvcy9XS0NvbnRlbnRWaWV3SW50ZXJhY3Rpb24uaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvaW9zL1dLQ29udGVudFZpZXdJbnRlcmFjdGlvbi5oCShy
ZXZpc2lvbiAxNjYyMzgpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvaW9zL1dLQ29udGVu
dFZpZXdJbnRlcmFjdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw2ICsyOSw3IEBACiAKICNp
bXBvcnQgIkFzc2lzdGVkTm9kZUluZm9ybWF0aW9uLmgiCiAjaW1wb3J0ICJJbnRlcmFjdGlvbklu
Zm9ybWF0aW9uQXRQb3NpdGlvbi5oIgorI2ltcG9ydCAiV0tBaXJQbGF5Um91dGVQaWNrZXIuaCIK
ICNpbXBvcnQgIldLRm9ybVBlcmlwaGVyYWwuaCIKICNpbXBvcnQgIldLR2VzdHVyZVR5cGVzLmgi
CiAjaW1wb3J0IDxVSUtpdC9VSVRleHRJbnB1dF9Qcml2YXRlLmg+CkBAIC05NSw2ICs5Niw3IEBA
IHN0cnVjdCBXS0F1dG9Db3JyZWN0aW9uRGF0YSB7CiAgICAgUmV0YWluUHRyPF9VSUhpZ2hsaWdo
dFZpZXc+IF9oaWdobGlnaHRWaWV3OwogICAgIFJldGFpblB0cjxOU1N0cmluZz4gX21hcmtlZFRl
eHQ7CiAgICAgUmV0YWluUHRyPFdLQWN0aW9uU2hlZXRBc3Npc3RhbnQ+IF9hY3Rpb25TaGVldEFz
c2lzdGFudDsKKyAgICBSZXRhaW5QdHI8V0tBaXJQbGF5Um91dGVQaWNrZXI+IF9haXJQbGF5Um91
dGVQaWNrZXI7CiAKICAgICBzdGQ6OnVuaXF1ZV9wdHI8V2ViS2l0OjpTbWFydE1hZ25pZmljYXRp
b25Db250cm9sbGVyPiBfc21hcnRNYWduaWZpY2F0aW9uQ29udHJvbGxlcjsKIApAQCAtMTQxLDYg
KzE0Myw3IEBAIHN0cnVjdCBXS0F1dG9Db3JyZWN0aW9uRGF0YSB7CiAtICh2b2lkKV93aWxsU3Rh
cnRVc2VyVHJpZ2dlcmVkU2Nyb2xsaW5nT3Jab29taW5nOwogLSAodm9pZClfZGlkRW5kU2Nyb2xs
aW5nT3Jab29taW5nOwogLSAodm9pZClfZGlkVXBkYXRlQmxvY2tTZWxlY3Rpb25XaXRoVG91Y2g6
KFdlYktpdDo6V0tTZWxlY3Rpb25Ub3VjaCl0b3VjaCB3aXRoRmxhZ3M6KFdlYktpdDo6V0tTZWxl
Y3Rpb25GbGFncylmbGFncyBncm93VGhyZXNob2xkOihDR0Zsb2F0KWdyb3dUaHJlc2hvbGQgc2hy
aW5rVGhyZXNob2xkOihDR0Zsb2F0KXNocmlua1RocmVzaG9sZDsKKy0gKHZvaWQpX3Nob3dBaXJQ
bGF5Um91dGVQaWNrZXI6KEJPT0wpaGFzVmlkZW8gZnJvbVJlY3Q6KGNvbnN0IFdlYkNvcmU6Oklu
dFJlY3QmKWVsZW1lbnRSZWN0OwogLSAodm9pZClhY2Nlc3NvcnlEb25lOwogLSAoVmVjdG9yPFdl
YktpdDo6V0tPcHRpb25JdGVtPiYpIGFzc2lzdGVkTm9kZVNlbGVjdE9wdGlvbnM7CiBAZW5kCklu
ZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvaW9zL1dLQ29udGVudFZpZXdJbnRlcmFjdGlv
bi5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvaW9zL1dLQ29udGVu
dFZpZXdJbnRlcmFjdGlvbi5tbQkocmV2aXNpb24gMTY2MjM4KQorKysgU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL2lvcy9XS0NvbnRlbnRWaWV3SW50ZXJhY3Rpb24ubW0JKHdvcmtpbmcgY29weSkK
QEAgLTE5NTEsNiArMTk1MSwxMyBAQCAtICh2b2lkKV91cGRhdGVDaGFuZ2VkU2VsZWN0aW9uCiAg
ICAgX3NlbGVjdGlvbk5lZWRzVXBkYXRlID0gTk87CiB9CiAKKy0gKHZvaWQpX3Nob3dBaXJQbGF5
Um91dGVQaWNrZXI6KEJPT0wpaGFzVmlkZW8gZnJvbVJlY3Q6KGNvbnN0IEludFJlY3QmKWVsZW1l
bnRSZWN0Cit7CisgICAgaWYgKCFfYWlyUGxheVJvdXRlUGlja2VyKQorICAgICAgICBfYWlyUGxh
eVJvdXRlUGlja2VyID0gYWRvcHROUyhbW1dLQWlyUGxheVJvdXRlUGlja2VyIGFsbG9jXSBpbml0
V2l0aFZpZXc6c2VsZl0pOworICAgIFtfYWlyUGxheVJvdXRlUGlja2VyIHNob3c6aGFzVmlkZW8g
ZnJvbVJlY3Q6ZWxlbWVudFJlY3RdOworfQorCiAjcHJhZ21hIG1hcmsgLSBJbXBsZW1lbnRhdGlv
biBvZiBVSVdlYlRvdWNoRXZlbnRzR2VzdHVyZVJlY29nbml6ZXJEZWxlZ2F0ZS4KIAogLSAoQk9P
TClzaG91bGRJZ25vcmVXZWJUb3VjaApJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL2lv
cy9XZWJQYWdlUHJveHlJT1MubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL2lvcy9XZWJQYWdlUHJveHlJT1MubW0JKHJldmlzaW9uIDE2NjIzOCkKKysrIFNvdXJjZS9X
ZWJLaXQyL1VJUHJvY2Vzcy9pb3MvV2ViUGFnZVByb3h5SU9TLm1tCSh3b3JraW5nIGNvcHkpCkBA
IC01MjIsNiArNTIyLDExIEBAIHZvaWQgV2ViUGFnZVByb3h5OjpzZXRBY2NlbGVyYXRlZENvbXBv
c2kKICAgICBtX3BhZ2VDbGllbnQuc2V0QWNjZWxlcmF0ZWRDb21wb3NpdGluZ1Jvb3RMYXllcihy
b290TGF5ZXIpOwogfQogCit2b2lkIFdlYlBhZ2VQcm94eTo6c2hvd0FpclBsYXlSb3V0ZVBpY2tl
cihib29sIGhhc1ZpZGVvLCBjb25zdCBJbnRSZWN0JiBlbGVtZW50UmVjdCkKK3sKKyAgICBtX3Bh
Z2VDbGllbnQuc2hvd0FpclBsYXlSb3V0ZVBpY2tlcihoYXNWaWRlbywgZWxlbWVudFJlY3QpOwor
fQorCiB9IC8vIG5hbWVzcGFjZSBXZWJLaXQKIAogI2VuZGlmIC8vIFBMQVRGT1JNKElPUykKSW5k
ZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9pb3MvZm9ybXMvV0tBaXJQbGF5Um91dGVQaWNr
ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvaW9zL2Zvcm1zL1dL
QWlyUGxheVJvdXRlUGlja2VyLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVBy
b2Nlc3MvaW9zL2Zvcm1zL1dLQWlyUGxheVJvdXRlUGlja2VyLmgJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZiBQTEFURk9STShJT1MpCisKKyNpbXBvcnQg
PFVJS2l0L1VJUG9wb3ZlckNvbnRyb2xsZXIuaD4KKworQGNsYXNzIFdLQ29udGVudFZpZXc7CisK
K0BpbnRlcmZhY2UgV0tBaXJQbGF5Um91dGVQaWNrZXIgOiBVSVZpZXcgPFVJUG9wb3ZlckNvbnRy
b2xsZXJEZWxlZ2F0ZT4KKy0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZpZXc6KFdLQ29udGVudFZp
ZXcgKil2aWV3OworLSAodm9pZClzaG93OihCT09MKWhhc1ZpZGVvIGZyb21SZWN0OihDR1JlY3Qp
ZWxlbWVudFJlY3Q7CitAZW5kCisKKyNlbmRpZiAvLyBQTEFURk9STShJT1MpCisKSW5kZXg6IFNv
dXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9pb3MvZm9ybXMvV0tBaXJQbGF5Um91dGVQaWNrZXIubW0K
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL2lvcy9mb3Jtcy9XS0FpclBs
YXlSb3V0ZVBpY2tlci5tbQkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9pb3MvZm9ybXMvV0tBaXJQbGF5Um91dGVQaWNrZXIubW0JKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW1wb3J0ICJjb25maWcuaCIKKyNpbXBvcnQgIldL
QWlyUGxheVJvdXRlUGlja2VyLmgiCisKKyNpZiBQTEFURk9STShJT1MpCisKKyNpbXBvcnQgIldL
Q29udGVudFZpZXcuaCIKKyNpbXBvcnQgIldLQ29udGVudFZpZXdJbnRlcmFjdGlvbi5oIgorI2lt
cG9ydCAiV2ViUGFnZVByb3h5LmgiCisjaW1wb3J0IDxNZWRpYVBsYXllci9NUEFWSXRlbS5oPgor
I2ltcG9ydCA8TWVkaWFQbGF5ZXIvTVBBVlJvdXRpbmdDb250cm9sbGVyLmg+CisjaW1wb3J0IDxN
ZWRpYVBsYXllci9NUEF1ZGlvVmlkZW9Sb3V0aW5nUG9wb3ZlckNvbnRyb2xsZXIuaD4KKyNpbXBv
cnQgPE1lZGlhUGxheWVyL01QQXVkaW9WaWRlb1JvdXRpbmdBY3Rpb25TaGVldC5oPgorI2ltcG9y
dCA8TWVkaWFQbGF5ZXIvTVBBdWRpb1ZpZGVvUm91dGluZ1BvcG92ZXJDb250cm9sbGVyLmg+Cisj
aW1wb3J0IDxNZWRpYVBsYXllci9NUEF1ZGlvVmlkZW9Sb3V0aW5nQWN0aW9uU2hlZXQuaD4KKyNp
bXBvcnQgPFVJS2l0L1VJQXBwbGljYXRpb25fUHJpdmF0ZS5oPgorI2ltcG9ydCA8VUlLaXQvVUlX
aW5kb3dfUHJpdmF0ZS5oPgorI2ltcG9ydCA8d3RmL1JldGFpblB0ci5oPgorCit1c2luZyBuYW1l
c3BhY2UgV2ViS2l0OworCitAaW1wbGVtZW50YXRpb24gV0tBaXJQbGF5Um91dGVQaWNrZXIgewor
ICAgIFJldGFpblB0cjxpZDxXS0Zvcm1Db250cm9sPj4gX2NvbnRyb2w7CisgICAgUmV0YWluUHRy
PE1QQVZSb3V0aW5nQ29udHJvbGxlcj4gX2FpclBsYXlQaWNrZXJSb3V0aW5nQ29udHJvbGxlcjsK
KyAgICBSZXRhaW5QdHI8TVBBdWRpb1ZpZGVvUm91dGluZ1BvcG92ZXJDb250cm9sbGVyPiBfYWly
UGxheVBvcG92ZXJDb250cm9sbGVyOyAgLy8gaVBhZAorICAgIFJldGFpblB0cjxNUEF1ZGlvVmlk
ZW9Sb3V0aW5nQWN0aW9uU2hlZXQ+IF9haXJQbGF5QWN0aW9uU2hlZXQ7ICAgICAgICAgICAgICAv
LyBpUGhvbmUKKyAgICBXS0NvbnRlbnRWaWV3KiBfdmlldzsgICAvLyBXZWFrIHJlZmVyZW5jZS4K
K30KKworLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmlldzooV0tDb250ZW50VmlldyAqKXZpZXcK
K3sKKyAgICBpZiAoIShzZWxmID0gW3N1cGVyIGluaXRdKSkKKyAgICAgICAgcmV0dXJuIG5pbDsK
KworICAgIF92aWV3ID0gdmlldzsKKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZClkZWFs
bG9jCit7CisgICAgaWYgKF9haXJQbGF5QWN0aW9uU2hlZXQpIHsKKyAgICAgICAgLy8gVGhlIEFj
dGlvblNoZWV0J3MgY29tcGxldGlvbiBoYW5kbGVyIHdpbGwgcmVsZWFzZSBhbmQgY2xlYXIgdGhl
IEFjdGlvblNoZWV0LgorICAgICAgICBbX2FpclBsYXlBY3Rpb25TaGVldCBkaXNtaXNzV2l0aENs
aWNrZWRCdXR0b25JbmRleDpbX2FpclBsYXlBY3Rpb25TaGVldCBjYW5jZWxCdXR0b25JbmRleF0g
YW5pbWF0ZWQ6WUVTXTsKKyAgICB9CisKKyAgICBpZiAoX2FpclBsYXlQb3BvdmVyQ29udHJvbGxl
cikKKyAgICAgICAgW3NlbGYgX2Rpc21pc3NBaXJQbGF5Um91dGVQaWNrZXJJUGFkXTsKKworICAg
IFtzdXBlciBkZWFsbG9jXTsKK30KKworLSAodm9pZClwb3BvdmVyQ29udHJvbGxlckRpZERpc21p
c3NQb3BvdmVyOihVSVBvcG92ZXJDb250cm9sbGVyICopcG9wb3ZlckNvbnRyb2xsZXIKK3sKKyAg
ICBpZiAocG9wb3ZlckNvbnRyb2xsZXIgIT0gX2FpclBsYXlQb3BvdmVyQ29udHJvbGxlcikKKyAg
ICAgICAgcmV0dXJuOworCisgICAgW3NlbGYgX2Rpc21pc3NBaXJQbGF5Um91dGVQaWNrZXJJUGFk
XTsKK30KKworLSAodm9pZClfcHJlc2VudEFpclBsYXlQb3BvdmVyQW5pbWF0ZWQ6KEJPT0wpYW5p
bWF0ZWQgZnJvbVJlY3Q6KENHUmVjdCllbGVtZW50UmVjdAoreworICAgIFtfYWlyUGxheVBvcG92
ZXJDb250cm9sbGVyIHByZXNlbnRQb3BvdmVyRnJvbVJlY3Q6ZWxlbWVudFJlY3QgaW5WaWV3Ol92
aWV3IHBlcm1pdHRlZEFycm93RGlyZWN0aW9uczpVSVBvcG92ZXJBcnJvd0RpcmVjdGlvbkFueSBh
bmltYXRlZDphbmltYXRlZF07Cit9CisKKy0gKHZvaWQpX3dpbmRvd1dpbGxSb3RhdGU6KE5TTm90
aWZpY2F0aW9uICopbm90aWZpY2F0aW9uCit7CisgICAgW19haXJQbGF5UG9wb3ZlckNvbnRyb2xs
ZXIgZGlzbWlzc1BvcG92ZXJBbmltYXRlZDpOT107Cit9CisKKy0gKHZvaWQpX3dpbmRvd0RpZFJv
dGF0ZTooTlNOb3RpZmljYXRpb24gKilub3RpZmljYXRpb24KK3sKKyAgICBbc2VsZiBfZGlzbWlz
c0FpclBsYXlSb3V0ZVBpY2tlcklQYWRdOworfQorCistICh2b2lkKV9kaXNtaXNzQWlyUGxheVJv
dXRlUGlja2VySVBhZAoreworICAgIF9haXJQbGF5UGlja2VyUm91dGluZ0NvbnRyb2xsZXIgPSBu
aWw7CisKKyAgICBpZiAoIV9haXJQbGF5UG9wb3ZlckNvbnRyb2xsZXIpCisgICAgICAgIHJldHVy
bjsKKworICAgIE5TTm90aWZpY2F0aW9uQ2VudGVyICpjZW50ZXIgPSBbTlNOb3RpZmljYXRpb25D
ZW50ZXIgZGVmYXVsdENlbnRlcl07CisgICAgW2NlbnRlciByZW1vdmVPYnNlcnZlcjpzZWxmIG5h
bWU6VUlXaW5kb3dXaWxsUm90YXRlTm90aWZpY2F0aW9uIG9iamVjdDpuaWxdOworICAgIFtjZW50
ZXIgcmVtb3ZlT2JzZXJ2ZXI6c2VsZiBuYW1lOlVJV2luZG93RGlkUm90YXRlTm90aWZpY2F0aW9u
IG9iamVjdDpuaWxdOworCisgICAgW19haXJQbGF5UG9wb3ZlckNvbnRyb2xsZXIgZGlzbWlzc1Bv
cG92ZXJBbmltYXRlZDpOT107CisgICAgW19haXJQbGF5UG9wb3ZlckNvbnRyb2xsZXIgc2V0RGVs
ZWdhdGU6bmlsXTsKKyAgICBfYWlyUGxheVBvcG92ZXJDb250cm9sbGVyID0gbmlsOworfQorCist
ICh2b2lkKXNob3dBaXJQbGF5UGlja2VySVBhZDooTVBBVkl0ZW1UeXBlKWl0ZW1UeXBlIGZyb21S
ZWN0OihDR1JlY3QpZWxlbWVudFJlY3QKK3sKKyAgICBpZiAoX2FpclBsYXlQb3BvdmVyQ29udHJv
bGxlcikKKyAgICAgICAgcmV0dXJuOworCisgICAgX2FpclBsYXlQb3BvdmVyQ29udHJvbGxlciA9
IGFkb3B0TlMoW1tNUEF1ZGlvVmlkZW9Sb3V0aW5nUG9wb3ZlckNvbnRyb2xsZXIgYWxsb2NdIGlu
aXRXaXRoVHlwZTppdGVtVHlwZV0pOworICAgIFtfYWlyUGxheVBvcG92ZXJDb250cm9sbGVyIHNl
dERlbGVnYXRlOnNlbGZdOworCisgICAgTlNOb3RpZmljYXRpb25DZW50ZXIgKmNlbnRlciA9IFtO
U05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXTsKKyAgICBbY2VudGVyIGFkZE9ic2Vy
dmVyOnNlbGYgc2VsZWN0b3I6QHNlbGVjdG9yKF93aW5kb3dXaWxsUm90YXRlOikgbmFtZTpVSVdp
bmRvd1dpbGxSb3RhdGVOb3RpZmljYXRpb24gb2JqZWN0Om5pbF07CisgICAgW2NlbnRlciBhZGRP
YnNlcnZlcjpzZWxmIHNlbGVjdG9yOkBzZWxlY3Rvcihfd2luZG93RGlkUm90YXRlOikgbmFtZTpV
SVdpbmRvd0RpZFJvdGF0ZU5vdGlmaWNhdGlvbiBvYmplY3Q6bmlsXTsKKworICAgIFtzZWxmIF9w
cmVzZW50QWlyUGxheVBvcG92ZXJBbmltYXRlZDpZRVMgZnJvbVJlY3Q6ZWxlbWVudFJlY3RdOwor
fQorCistICh2b2lkKXNob3dBaXJQbGF5UGlja2VySVBob25lOihNUEFWSXRlbVR5cGUpaXRlbVR5
cGUKK3sKKyAgICBpZiAoX2FpclBsYXlBY3Rpb25TaGVldCkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgX2FpclBsYXlBY3Rpb25TaGVldCA9IGFkb3B0TlMoW1tNUEF1ZGlvVmlkZW9Sb3V0aW5nQWN0
aW9uU2hlZXQgYWxsb2NdIGluaXRXaXRoVHlwZTppdGVtVHlwZV0pOworCisgICAgW19haXJQbGF5
QWN0aW9uU2hlZXQKKyAgICAgICAgc2hvd1dpdGhWYWxpZEludGVyZmFjZU9yaWVudGF0aW9uTWFz
a0Jsb2NrOl5VSUludGVyZmFjZU9yaWVudGF0aW9uTWFzayB7CisgICAgICAgICAgICByZXR1cm4g
VUlJbnRlcmZhY2VPcmllbnRhdGlvbk1hc2tQb3J0cmFpdDsKKyAgICAgICAgfQorICAgICAgICBj
b21wbGV0aW9uSGFuZGxlcjpeeworICAgICAgICAgICAgX2FpclBsYXlQaWNrZXJSb3V0aW5nQ29u
dHJvbGxlciA9IG5pbDsKKyAgICAgICAgICAgIF9haXJQbGF5QWN0aW9uU2hlZXQgPSBuaWw7Cisg
ICAgICAgIH0KKyAgICAgXTsKK30KKworLSAodm9pZClzaG93OihCT09MKWhhc1ZpZGVvIGZyb21S
ZWN0OihDR1JlY3QpZWxlbWVudFJlY3QKK3sKKyAgICBfYWlyUGxheVBpY2tlclJvdXRpbmdDb250
cm9sbGVyID0gYWRvcHROUyhbW01QQVZSb3V0aW5nQ29udHJvbGxlciBhbGxvY10gaW5pdFdpdGhO
YW1lOkAiV2ViS2l0MiAtIEhUTUwgbWVkaWEgZWxlbWVudCBzaG93aW5nIEFpclBsYXkgcm91dGUg
cGlja2VyIl0pOworICAgIFtfYWlyUGxheVBpY2tlclJvdXRpbmdDb250cm9sbGVyIHNldERpc2Nv
dmVyeU1vZGU6TVBSb3V0ZURpc2NvdmVyeU1vZGVEZXRhaWxlZF07CisKKyAgICBNUEFWSXRlbVR5
cGUgaXRlbVR5cGUgPSBoYXNWaWRlbyA/IE1QQVZJdGVtVHlwZVZpZGVvIDogTVBBVkl0ZW1UeXBl
QXVkaW87CisgICAgaWYgKFVJQ3VycmVudFVzZXJJbnRlcmZhY2VJZGlvbUlzUGFkKCkpCisgICAg
ICAgIFtzZWxmIHNob3dBaXJQbGF5UGlja2VySVBhZDppdGVtVHlwZSBmcm9tUmVjdDplbGVtZW50
UmVjdF07CisgICAgZWxzZQorICAgICAgICBbc2VsZiBzaG93QWlyUGxheVBpY2tlcklQaG9uZTpp
dGVtVHlwZV07Cit9CisKK0BlbmQKKworI2VuZGlmICAvLyBQTEFURk9STShJT1MpCkluZGV4OiBT
b3VyY2UvV2ViS2l0Mi9XZWJLaXQyLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYktpdDIvV2ViS2l0Mi54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShy
ZXZpc2lvbiAxNjYyMzgpCisrKyBTb3VyY2UvV2ViS2l0Mi9XZWJLaXQyLnhjb2RlcHJvai9wcm9q
ZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTE0NDIsNiArMTQ0Miw4IEBACiAJCUM1RTFB
RkVEMTZCMjEwMTcwMDZDQzFGMiAvKiBXZWJBcmNoaXZlLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQzMyOUQ5QTE2QUNDRTk5MDAzMTZERTIgLyogV2Vi
QXJjaGl2ZS5oICovOyB9OwogCQlDNUUxQUZFRTE2QjIxMDI1MDA2Q0MxRjIgLyogV2ViQXJjaGl2
ZVJlc291cmNlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEJDMzI5RDlFMTZBQ0Q0NzgwMDMxNkRFMiAvKiBXZWJBcmNoaXZlUmVzb3VyY2UuY3BwICov
OyB9OwogCQlDNUUxQUZFRjE2QjIxMDI5MDA2Q0MxRjIgLyogV2ViQXJjaGl2ZVJlc291cmNlLmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQzMyOUQ5RjE2
QUNENDc4MDAzMTZERTIgLyogV2ViQXJjaGl2ZVJlc291cmNlLmggKi87IH07CisJCUM1RkExRUQz
MThFMTA2MjIwMEIzRjQwMiAvKiBXS0FpclBsYXlSb3V0ZVBpY2tlci5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQzVGQTFFRDExOEUxMDYyMjAwQjNGNDAy
IC8qIFdLQWlyUGxheVJvdXRlUGlja2VyLmggKi87IH07CisJCUM1RkExRUQ0MThFMTA2MjIwMEIz
RjQwMiAvKiBXS0FpclBsYXlSb3V0ZVBpY2tlci5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEM1RkExRUQyMThFMTA2MjIwMEIzRjQwMiAvKiBXS0FpclBs
YXlSb3V0ZVBpY2tlci5tbSAqLzsgfTsKIAkJQ0Q1QzY2QTAxMzRCOUQzODAwNEZFMkE4IC8qIElu
amVjdGVkQnVuZGxlUGFnZUZ1bGxTY3JlZW5DbGllbnQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQ0Q1QzY2OUUxMzRCOUQzNjAwNEZFMkE4IC8qIElu
amVjdGVkQnVuZGxlUGFnZUZ1bGxTY3JlZW5DbGllbnQuY3BwICovOyB9OwogCQlDRDVDNjZBMTEz
NEI5RDM4MDA0RkUyQTggLyogSW5qZWN0ZWRCdW5kbGVQYWdlRnVsbFNjcmVlbkNsaWVudC5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQ0Q1QzY2OUYxMzRC
OUQzNzAwNEZFMkE4IC8qIEluamVjdGVkQnVuZGxlUGFnZUZ1bGxTY3JlZW5DbGllbnQuaCAqLzsg
fTsKIAkJQ0Q2N0QzMEUxNUMwOEY5QTAwODQzQURGIC8qIEluamVjdGVkQnVuZGxlUGFnZURpYWdu
b3N0aWNMb2dnaW5nQ2xpZW50LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IENENjdEMzA4MTVDMDdCRTAwMDg0M0FERiAvKiBJbmplY3RlZEJ1bmRsZVBh
Z2VEaWFnbm9zdGljTG9nZ2luZ0NsaWVudC5jcHAgKi87IH07CkBAIC0zMzAwLDYgKzMzMDIsOCBA
QAogCQlDNThDREYyQzE4ODc2MDlGMDA4NzE1MzYgLyogSW50ZXJhY3Rpb25JbmZvcm1hdGlvbkF0
UG9zaXRpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSW50ZXJhY3Rpb25J
bmZvcm1hdGlvbkF0UG9zaXRpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQzU5
QzRBNTYxOEI4MTE3NDAwN0JEQ0I2IC8qIEFzc2lzdGVkTm9kZUluZm9ybWF0aW9uLmNwcCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEFzc2lzdGVkTm9kZUluZm9ybWF0aW9u
LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQzU5QzRBNTcxOEI4MTE3NDAwN0JE
Q0I2IC8qIEFzc2lzdGVkTm9kZUluZm9ybWF0aW9uLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IEFzc2lzdGVkTm9kZUluZm9ybWF0aW9uLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CisJCUM1RkExRUQxMThFMTA2MjIwMEIzRjQwMiAvKiBXS0FpclBsYXlSb3V0ZVBpY2tl
ci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBXS0FpclBsYXlSb3V0ZVBpY2tl
ci5oOyBwYXRoID0gaW9zL2Zvcm1zL1dLQWlyUGxheVJvdXRlUGlja2VyLmg7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CisJCUM1RkExRUQyMThFMTA2MjIwMEIzRjQwMiAvKiBXS0FpclBsYXlS
b3V0ZVBpY2tlci5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgbmFtZSA9IFdL
QWlyUGxheVJvdXRlUGlja2VyLm1tOyBwYXRoID0gaW9zL2Zvcm1zL1dLQWlyUGxheVJvdXRlUGlj
a2VyLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlDRDVDNjY5RTEzNEI5RDM2MDA0
RkUyQTggLyogSW5qZWN0ZWRCdW5kbGVQYWdlRnVsbFNjcmVlbkNsaWVudC5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBJbmplY3RlZEJ1bmRsZVBhZ2VGdWxsU2NyZWVu
Q2xpZW50LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQ0Q1QzY2OUYxMzRCOUQz
NzAwNEZFMkE4IC8qIEluamVjdGVkQnVuZGxlUGFnZUZ1bGxTY3JlZW5DbGllbnQuaCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSW5qZWN0ZWRCdW5kbGVQYWdlRnVsbFNjcmVlbkNs
aWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlDRDY3RDMwODE1QzA3QkUwMDA4
NDNBREYgLyogSW5qZWN0ZWRCdW5kbGVQYWdlRGlhZ25vc3RpY0xvZ2dpbmdDbGllbnQuY3BwICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSW5qZWN0ZWRCdW5kbGVQYWdlRGlh
Z25vc3RpY0xvZ2dpbmdDbGllbnQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAt
NjM2Nyw2ICs2MzcxLDggQEAKIAkJQzU0MjU2QUUxOEJFQzE2MTAwREU0MTc5IC8qIGZvcm1zICov
ID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQljaGlsZHJlbiA9ICgKKwkJCQlDNUZBMUVEMTE4
RTEwNjIyMDBCM0Y0MDIgLyogV0tBaXJQbGF5Um91dGVQaWNrZXIuaCAqLywKKwkJCQlDNUZBMUVE
MjE4RTEwNjIyMDBCM0Y0MDIgLyogV0tBaXJQbGF5Um91dGVQaWNrZXIubW0gKi8sCiAJCQkJQzU0
MjU2QUYxOEJFQzE4QjAwREU0MTc5IC8qIFdLRm9ybUlucHV0Q29udHJvbC5oICovLAogCQkJCUM1
NDI1NkIwMThCRUMxOEIwMERFNDE3OSAvKiBXS0Zvcm1JbnB1dENvbnRyb2wubW0gKi8sCiAJCQkJ
QzU0MjU2QjExOEJFQzE4QjAwREU0MTc5IC8qIFdLRm9ybVBlcmlwaGVyYWwuaCAqLywKQEAgLTY1
NTYsNiArNjU2Miw3IEBACiAJCQkJMjk4OUE0MTQxNjdEMTg0QjAwNEY5NkQyIC8qIEN1c3RvbVBy
b3RvY29sTWFuYWdlci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMzcxQjMyREUxODRENjc0OTAwMTNF
MkIyIC8qIFdLTlNVUkxQcm90ZWN0aW9uU3BhY2UuaCBpbiBIZWFkZXJzICovLAogCQkJCTI5ODRG
NTg5MTY0QkEwOTUwMDRCQzBDNiAvKiBDdXN0b21Qcm90b2NvbE1hbmFnZXJNZXNzYWdlcy5oIGlu
IEhlYWRlcnMgKi8sCisJCQkJQzVGQTFFRDMxOEUxMDYyMjAwQjNGNDAyIC8qIFdLQWlyUGxheVJv
dXRlUGlja2VyLmggaW4gSGVhZGVycyAqLywKIAkJCQkyOUFEMzA5MzE2NEI0QzVEMDA3MkRFQTkg
LyogQ3VzdG9tUHJvdG9jb2xNYW5hZ2VyUHJveHkuaCBpbiBIZWFkZXJzICovLAogCQkJCTI5ODRG
NTdEMTY0QjkxNUYwMDRCQzBDNiAvKiBDdXN0b21Qcm90b2NvbE1hbmFnZXJQcm94eU1lc3NhZ2Vz
LmggaW4gSGVhZGVycyAqLywKIAkJCQk1MTgzNTNERjE4ODcxMjhCMDBEOUZFNDQgLyogS2V5ZWRE
ZWNvZGVyLmggaW4gSGVhZGVycyAqLywKQEAgLTg0MDEsNiArODQwOCw3IEBACiAJCQkJQzU4Q0RG
MkQxODg3NjA5RjAwODcxNTM2IC8qIEludGVyYWN0aW9uSW5mb3JtYXRpb25BdFBvc2l0aW9uLmNw
cCBpbiBTb3VyY2VzICovLAogCQkJCTUxQjMwMDUxMTI1MjlEMEUwMDBCNUNBMCAvKiBXZWJQYWdl
UHJveHlDRi5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkxRjc1MDZBRDE4NTkxNjFDMDBFQzBGRjcg
LyogV0tXZWJQcm9jZXNzUGx1Z0luRnJhbWUubW0gaW4gU291cmNlcyAqLywKKwkJCQlDNUZBMUVE
NDE4RTEwNjIyMDBCM0Y0MDIgLyogV0tBaXJQbGF5Um91dGVQaWNrZXIubW0gaW4gU291cmNlcyAq
LywKIAkJCQlCQzg1N0U4NzEyQjcxRUJCMDBFREVCMkUgLyogV2ViUGFnZVByb3h5TWFjLm1tIGlu
IFNvdXJjZXMgKi8sCiAJCQkJMkRBOTQ0QTExODg0RTRGMDAwRUQ4NkRCIC8qIFdlYklPU0V2ZW50
RmFjdG9yeS5tbSBpbiBTb3VyY2VzICovLAogCQkJCUJDQkQzOTE0MTI1QkIxQTgwMEQyQzI5RiAv
KiBXZWJQYWdlUHJveHlNZXNzYWdlUmVjZWl2ZXIuY3BwIGluIFNvdXJjZXMgKi8sCkluZGV4OiBT
b3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L1dlYkNocm9tZUNsaWVudC5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQv
V2ViQ2hyb21lQ2xpZW50LmgJKHJldmlzaW9uIDE2NjIzOCkKKysrIFNvdXJjZS9XZWJLaXQyL1dl
YlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50LmgJKHdvcmtpbmcgY29weSkK
QEAgLTE3NSw2ICsxNzUsNyBAQCBwcml2YXRlOgogICAgIHZpcnR1YWwgdm9pZCByZW1vdmVTY3Jv
bGxpbmdMYXllcihXZWJDb3JlOjpOb2RlKiwgUGxhdGZvcm1MYXllciogc2Nyb2xsaW5nTGF5ZXIs
IFBsYXRmb3JtTGF5ZXIqIGNvbnRlbnRzTGF5ZXIpIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCB2
b2lkIHdlYkFwcE9yaWVudGF0aW9uc1VwZGF0ZWQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZv
aWQgc2hvd0FpclBsYXlSb3V0ZVBpY2tlcihib29sIGhhc1ZpZGVvKSBvdmVycmlkZTsKICNlbmRp
ZgogCiAgICAgdmlydHVhbCB2b2lkIHJ1bk9wZW5QYW5lbChXZWJDb3JlOjpGcmFtZSosIFBhc3NS
ZWZQdHI8V2ViQ29yZTo6RmlsZUNob29zZXI+KSBvdmVycmlkZTsKSW5kZXg6IFNvdXJjZS9XZWJL
aXQyL1dlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQvaW9zL1dlYkNocm9tZUNsaWVudElPUy5tbQo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L2lv
cy9XZWJDaHJvbWVDbGllbnRJT1MubW0JKHJldmlzaW9uIDE2NjIzOCkKKysrIFNvdXJjZS9XZWJL
aXQyL1dlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQvaW9zL1dlYkNocm9tZUNsaWVudElPUy5tbQko
d29ya2luZyBjb3B5KQpAQCAtMTI0LDYgKzEyNCwxMSBAQCB2b2lkIFdlYkNocm9tZUNsaWVudDo6
d2ViQXBwT3JpZW50YXRpb25zCiAgICAgbm90SW1wbGVtZW50ZWQoKTsKIH0KIAordm9pZCBXZWJD
aHJvbWVDbGllbnQ6OnNob3dBaXJQbGF5Um91dGVQaWNrZXIoYm9vbCBoYXNWaWRlbykKK3sKKyAg
ICBtX3BhZ2UtPnNlbmQoTWVzc2FnZXM6OldlYlBhZ2VQcm94eTo6U2hvd0FpclBsYXlSb3V0ZVBp
Y2tlcihoYXNWaWRlbywgbV9wYWdlLT5yZWN0Rm9yRWxlbWVudEF0SW50ZXJhY3Rpb25Mb2NhdGlv
bigpKSk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdlYktpdAogCiAjZW5kaWYgLy8gUExBVEZPUk0o
SU9TKQpJbmRleDogU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdl
LmNwcAkocmV2aXNpb24gMTY2MjM4KQorKysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQ
YWdlL1dlYlBhZ2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xOTYyLDggKzE5NjIsMTAgQEAgc3Rh
dGljIGJvb2wgaGFuZGxlVG91Y2hFdmVudChjb25zdCBXZWJUbwogCiB2b2lkIFdlYlBhZ2U6OnRv
dWNoRXZlbnQoY29uc3QgV2ViVG91Y2hFdmVudCYgdG91Y2hFdmVudCkKIHsKKyNpZiBQTEFURk9S
TShJT1MpCisgICAgbV9pbnRlcmFjdGlvbkxvY2F0aW9uID0gdG91Y2hFdmVudC5wb3NpdGlvbigp
OworI2VuZGlmCiAgICAgYm9vbCBoYW5kbGVkID0gZmFsc2U7Ci0KICAgICBpZiAoY2FuSGFuZGxl
VXNlckV2ZW50cygpKSB7CiAgICAgICAgIEN1cnJlbnRFdmVudCBjdXJyZW50RXZlbnQodG91Y2hF
dmVudCk7CiAKQEAgLTE5NzQsNiArMTk3Niw5IEBAIHZvaWQgV2ViUGFnZTo6dG91Y2hFdmVudChj
b25zdCBXZWJUb3VjaEUKIAogdm9pZCBXZWJQYWdlOjp0b3VjaEV2ZW50U3luY0ZvclRlc3Rpbmco
Y29uc3QgV2ViVG91Y2hFdmVudCYgdG91Y2hFdmVudCwgYm9vbCYgaGFuZGxlZCkKIHsKKyNpZiBQ
TEFURk9STShJT1MpCisgICAgbV9pbnRlcmFjdGlvbkxvY2F0aW9uID0gdG91Y2hFdmVudC5wb3Np
dGlvbigpOworI2VuZGlmCiAgICAgQ3VycmVudEV2ZW50IGN1cnJlbnRFdmVudCh0b3VjaEV2ZW50
KTsKICAgICBoYW5kbGVkID0gaGFuZGxlVG91Y2hFdmVudCh0b3VjaEV2ZW50LCBtX3BhZ2UuZ2V0
KCkpOwogfQpJbmRleDogU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2Uu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFn
ZS5oCShyZXZpc2lvbiAxNjYyMzgpCisrKyBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBh
Z2UvV2ViUGFnZS5oCSh3b3JraW5nIGNvcHkpCkBAIC00NjgsNiArNDY4LDcgQEAgcHVibGljOgog
ICAgIHZvaWQgc2V0QXNzaXN0ZWROb2RlVmFsdWUoY29uc3QgU3RyaW5nJik7CiAgICAgdm9pZCBz
ZXRBc3Npc3RlZE5vZGVWYWx1ZUFzTnVtYmVyKGRvdWJsZSk7CiAgICAgdm9pZCBzZXRBc3Npc3Rl
ZE5vZGVTZWxlY3RlZEluZGV4KHVpbnQzMl90IGluZGV4LCBib29sIGFsbG93TXVsdGlwbGVTZWxl
Y3Rpb24pOworICAgIFdlYkNvcmU6OkludFJlY3QgcmVjdEZvckVsZW1lbnRBdEludGVyYWN0aW9u
TG9jYXRpb24oKTsKICNlbmRpZgogCiAgICAgTm90aWZpY2F0aW9uUGVybWlzc2lvblJlcXVlc3RN
YW5hZ2VyKiBub3RpZmljYXRpb25QZXJtaXNzaW9uUmVxdWVzdE1hbmFnZXIoKTsKQEAgLTExMjUs
NiArMTEyNiw3IEBAIHByaXZhdGU6CiAgICAgUmVmUHRyPFdlYkNvcmU6OlJhbmdlPiBtX2N1cnJl
bnRXb3JkUmFuZ2U7CiAgICAgUmVmUHRyPFdlYkNvcmU6Ok5vZGU+IG1faW50ZXJhY3Rpb25Ob2Rl
OwogICAgIGJvb2wgbV9zaG91bGRSZXR1cm5Xb3JkQXRTZWxlY3Rpb247CisgICAgV2ViQ29yZTo6
SW50UG9pbnQgbV9pbnRlcmFjdGlvbkxvY2F0aW9uOwogCiAgICAgV2ViQ29yZTo6Vmlld3BvcnRD
b25maWd1cmF0aW9uIG1fdmlld3BvcnRDb25maWd1cmF0aW9uOwogICAgIHVpbnQ2NF90IG1fbGFz
dFZpc2libGVDb250ZW50UmVjdFVwZGF0ZUlEOwpJbmRleDogU291cmNlL1dlYktpdDIvV2ViUHJv
Y2Vzcy9XZWJQYWdlL2lvcy9XZWJQYWdlSU9TLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJL
aXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9pb3MvV2ViUGFnZUlPUy5tbQkocmV2aXNpb24gMTY2MjM4
KQorKysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL2lvcy9XZWJQYWdlSU9TLm1t
CSh3b3JraW5nIGNvcHkpCkBAIC0yODEsNiArMjgxLDE1IEBAIHZvaWQgV2ViUGFnZTo6YWR2YW5j
ZVRvTmV4dE1pc3NwZWxsaW5nKGIKICAgICBub3RJbXBsZW1lbnRlZCgpOwogfQogCitJbnRSZWN0
IFdlYlBhZ2U6OnJlY3RGb3JFbGVtZW50QXRJbnRlcmFjdGlvbkxvY2F0aW9uKCkKK3sKKyAgICBI
aXRUZXN0UmVzdWx0IHJlc3VsdCA9IG1fcGFnZS0+bWFpbkZyYW1lKCkuZXZlbnRIYW5kbGVyKCku
aGl0VGVzdFJlc3VsdEF0UG9pbnQobV9pbnRlcmFjdGlvbkxvY2F0aW9uLCBIaXRUZXN0UmVxdWVz
dDo6UmVhZE9ubHkgfCBIaXRUZXN0UmVxdWVzdDo6QWN0aXZlIHwgSGl0VGVzdFJlcXVlc3Q6OkFs
bG93Q2hpbGRGcmFtZUNvbnRlbnQpOworICAgIE5vZGUqIGhpdE5vZGUgPSByZXN1bHQuaW5uZXJO
b2RlKCk7CisgICAgaWYgKCFoaXROb2RlIHx8ICFoaXROb2RlLT5yZW5kZXJlcigpKQorICAgICAg
ICByZXR1cm4gSW50UmVjdCgpOworICAgIHJldHVybiByZXN1bHQuaW5uZXJOb2RlRnJhbWUoKS0+
dmlldygpLT5jb250ZW50c1RvUm9vdFZpZXcoaGl0Tm9kZS0+cmVuZGVyZXIoKS0+YWJzb2x1dGVC
b3VuZGluZ0JveFJlY3QodHJ1ZSkpOworfQorCiB2b2lkIFdlYlBhZ2U6OmhhbmRsZVRhcChjb25z
dCBJbnRQb2ludCYgcG9pbnQpCiB7CiAgICAgRnJhbWUmIG1haW5mcmFtZSA9IG1fcGFnZS0+bWFp
bkZyYW1lKCk7CkBAIC0yOTUsNiArMzA0LDcgQEAgdm9pZCBXZWJQYWdlOjpoYW5kbGVUYXAoY29u
c3QgSW50UG9pbnQmIAogICAgIGlmIChXS09ic2VydmVkQ29udGVudENoYW5nZSgpICE9IFdLQ29u
dGVudE5vQ2hhbmdlKQogICAgICAgICByZXR1cm47CiAKKyAgICBtX2ludGVyYWN0aW9uTG9jYXRp
b24gPSBwb2ludDsKICAgICBtYWluZnJhbWUuZXZlbnRIYW5kbGVyKCkuaGFuZGxlTW91c2VQcmVz
c0V2ZW50KFBsYXRmb3JtTW91c2VFdmVudChyb3VuZGVkQWRqdXN0ZWRQb2ludCwgcm91bmRlZEFk
anVzdGVkUG9pbnQsIExlZnRCdXR0b24sIFBsYXRmb3JtRXZlbnQ6Ok1vdXNlUHJlc3NlZCwgMSwg
ZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDApKTsKICAgICBtYWluZnJhbWUuZXZlbnRIYW5k
bGVyKCkuaGFuZGxlTW91c2VSZWxlYXNlRXZlbnQoUGxhdGZvcm1Nb3VzZUV2ZW50KHJvdW5kZWRB
ZGp1c3RlZFBvaW50LCByb3VuZGVkQWRqdXN0ZWRQb2ludCwgTGVmdEJ1dHRvbiwgUGxhdGZvcm1F
dmVudDo6TW91c2VSZWxlYXNlZCwgMSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDApKTsK
IH0KSW5kZXg6IFNvdXJjZS9XZWJLaXQvaW9zL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViS2l0L2lvcy9DaGFuZ2VMb2cJKHJldmlzaW9uIDE2NjM2OCkKKysrIFNvdXJjZS9XZWJL
aXQvaW9zL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE3IEBACisyMDE0LTAz
LTI3ICBFbnJpY2EgQ2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgQWRkIHN1
cHBvcnQgZm9yIEFpclBsYXkgcGlja2VyIGluIFdLMiBmb3IgaU9TLgorICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTMwODU1CisgICAgICAgIDxyZGFyOi8v
cHJvYmxlbS8xNTM0OTg1OT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICBBZGRzIHN0dWIgZm9yIG5ldyBXZWJLaXQgY2hyb21lIGNsaWVudCBtZXRob2Qu
CisKKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9XZWJDaHJvbWVDbGllbnRJT1MuaDoKKyAgICAg
ICAgKiBXZWJDb3JlU3VwcG9ydC9XZWJDaHJvbWVDbGllbnRJT1MubW06CisgICAgICAgIChXZWJD
aHJvbWVDbGllbnRJT1M6OnNob3dBaXJQbGF5Um91dGVQaWNrZXIpOgorCiAyMDE0LTAzLTI1ICBK
b3NlcGggUGVjb3Jhcm8gIDxwZWNvcmFyb0BhcHBsZS5jb20+CiAKICAgICAgICAgW2lPU10gSW5z
cGVjdG9yIFZpZXcgSW5kaWNhdGlvbiBTdXBwb3J0CkluZGV4OiBTb3VyY2UvV2ViS2l0L2lvcy9X
ZWJDb3JlU3VwcG9ydC9XZWJDaHJvbWVDbGllbnRJT1MuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViS2l0L2lvcy9XZWJDb3JlU3VwcG9ydC9XZWJDaHJvbWVDbGllbnRJT1MuaAkocmV2aXNpb24g
MTY2MjM4KQorKysgU291cmNlL1dlYktpdC9pb3MvV2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xp
ZW50SU9TLmgJKHdvcmtpbmcgY29weSkKQEAgLTgzLDYgKzgzLDcgQEAgcHVibGljOgogCiAgICAg
dmlydHVhbCB2b2lkIHdlYkFwcE9yaWVudGF0aW9uc1VwZGF0ZWQoKSBvdmVycmlkZTsKICAgICB2
aXJ0dWFsIHZvaWQgZm9jdXNlZEVsZW1lbnRDaGFuZ2VkKFdlYkNvcmU6OkVsZW1lbnQqKSBvdmVy
cmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgc2hvd0FpclBsYXlSb3V0ZVBpY2tlcihib29sIGhhc1Zp
ZGVvKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgICBpbnQgbV9mb3JtTm90aWZpY2F0aW9uU3Vw
cHJlc3Npb25zOwpJbmRleDogU291cmNlL1dlYktpdC9pb3MvV2ViQ29yZVN1cHBvcnQvV2ViQ2hy
b21lQ2xpZW50SU9TLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvaW9zL1dlYkNvcmVT
dXBwb3J0L1dlYkNocm9tZUNsaWVudElPUy5tbQkocmV2aXNpb24gMTY2MjM4KQorKysgU291cmNl
L1dlYktpdC9pb3MvV2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50SU9TLm1tCSh3b3JraW5n
IGNvcHkpCkBAIC0zMTMsNCArMzEzLDkgQEAgdm9pZCBXZWJDaHJvbWVDbGllbnRJT1M6OmZvY3Vz
ZWRFbGVtZW50QwogICAgIENhbGxGb3JtRGVsZWdhdGUod2ViVmlldygpLCBAc2VsZWN0b3IoZGlk
Rm9jdXNUZXh0RmllbGQ6aW5GcmFtZTopLCBraXQoaW5wdXRFbGVtZW50KSwga2l0KGlucHV0RWxl
bWVudC0+ZG9jdW1lbnQoKS5mcmFtZSgpKSk7CiB9CiAKK3ZvaWQgV2ViQ2hyb21lQ2xpZW50SU9T
OjpzaG93QWlyUGxheVJvdXRlUGlja2VyKGJvb2wpCit7CisgICAgLy8gRklYTUU6IEFkZCBpbXBs
ZW1lbnRhdGlvbiBoZXJlLgorfQorCiAjZW5kaWYgLy8gUExBVEZPUk0oSU9TKQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>