<?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>233773</bug_id>
          
          <creation_ts>2021-12-02 10:54:06 -0800</creation_ts>
          <short_desc>[Cocoa] Web Inspector: Unify Grid overlay drawing code</short_desc>
          <delta_ts>2021-12-06 22:21:00 -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>Web Inspector</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</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="Patrick Angle">pangle</reporter>
          <assigned_to name="Patrick Angle">pangle</assigned_to>
          <cc>ews-watchlist</cc>
    
    <cc>hi</cc>
    
    <cc>inspector-bugzilla-changes</cc>
    
    <cc>joepeck</cc>
    
    <cc>pangle</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1819785</commentid>
    <comment_count>0</comment_count>
    <who name="Patrick Angle">pangle</who>
    <bug_when>2021-12-02 10:54:06 -0800</bug_when>
    <thetext>.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1819786</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2021-12-02 10:54:59 -0800</bug_when>
    <thetext>&lt;rdar://problem/85979433&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1819809</commentid>
    <comment_count>2</comment_count>
      <attachid>445756</attachid>
    <who name="Patrick Angle">pangle</who>
    <bug_when>2021-12-02 11:28:55 -0800</bug_when>
    <thetext>Created attachment 445756
Patch v1.0</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1819818</commentid>
    <comment_count>3</comment_count>
      <attachid>445756</attachid>
    <who name="Devin Rousso">hi</who>
    <bug_when>2021-12-02 12:07:46 -0800</bug_when>
    <thetext>Comment on attachment 445756
Patch v1.0

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

&gt; Source/WebKit/UIProcess/Inspector/ios/WKInspectorHighlightView.mm:43
&gt; +    self.opaque = NO;

Is this intentional?  If so, why?

&gt; Source/WebKit/UIProcess/Inspector/ios/WKInspectorHighlightView.mm:274
&gt; +    auto context = WebCore::GraphicsContextCG(UIGraphicsGetCurrentContext());

This seems possibly expensive (e.g. retain count churn).  How often is this likely to be called?  Is there any way we can avoid doing this on every `-drawRect:`?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1819822</commentid>
    <comment_count>4</comment_count>
      <attachid>445756</attachid>
    <who name="Patrick Angle">pangle</who>
    <bug_when>2021-12-02 12:20:25 -0800</bug_when>
    <thetext>Comment on attachment 445756
Patch v1.0

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

&gt;&gt; Source/WebKit/UIProcess/Inspector/ios/WKInspectorHighlightView.mm:43
&gt;&gt; +    self.opaque = NO;
&gt; 
&gt; Is this intentional?  If so, why?

Because we now set an actual frame for this view and views default to being opaque - Without this the background of the view is rendered solid black which prevents seeing the actual page underneath.

&gt;&gt; Source/WebKit/UIProcess/Inspector/ios/WKInspectorHighlightView.mm:274
&gt;&gt; +    auto context = WebCore::GraphicsContextCG(UIGraphicsGetCurrentContext());
&gt; 
&gt; This seems possibly expensive (e.g. retain count churn).  How often is this likely to be called?  Is there any way we can avoid doing this on every `-drawRect:`?

This gets called on every frame we draw. It doesn&apos;t seem to be possible to avoid this, given this comment in the `-drawRect:` documentation:
```
You can get a reference to the graphics context using the UIGraphicsGetCurrentContext function, but do not establish a strong reference to the graphics context because it can change between calls to the drawRect: method.
```
(https://developer.apple.com/documentation/uikit/uiview/1622529-drawrect)

One thing I can think to try is seeing if we can hold onto the same GraphicsContextCG so long as the underlying CGContextRef remains the same between calls to `-drawRect:`, but that feels a bit sketchy given the above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1819874</commentid>
    <comment_count>5</comment_count>
      <attachid>445756</attachid>
    <who name="Patrick Angle">pangle</who>
    <bug_when>2021-12-02 14:48:35 -0800</bug_when>
    <thetext>Comment on attachment 445756
Patch v1.0

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

&gt;&gt;&gt; Source/WebKit/UIProcess/Inspector/ios/WKInspectorHighlightView.mm:274
&gt;&gt;&gt; +    auto context = WebCore::GraphicsContextCG(UIGraphicsGetCurrentContext());
&gt;&gt; 
&gt;&gt; This seems possibly expensive (e.g. retain count churn).  How often is this likely to be called?  Is there any way we can avoid doing this on every `-drawRect:`?
&gt; 
&gt; This gets called on every frame we draw. It doesn&apos;t seem to be possible to avoid this, given this comment in the `-drawRect:` documentation:
&gt; ```
&gt; You can get a reference to the graphics context using the UIGraphicsGetCurrentContext function, but do not establish a strong reference to the graphics context because it can change between calls to the drawRect: method.
&gt; ```
&gt; (https://developer.apple.com/documentation/uikit/uiview/1622529-drawrect)
&gt; 
&gt; One thing I can think to try is seeing if we can hold onto the same GraphicsContextCG so long as the underlying CGContextRef remains the same between calls to `-drawRect:`, but that feels a bit sketchy given the above.

I just checked and unfortunately the `CGContextRef` is different on every invocation, so caching the `GraphicsContextCG` doesn&apos;t really win us anything.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1820640</commentid>
    <comment_count>6</comment_count>
      <attachid>445756</attachid>
    <who name="Patrick Angle">pangle</who>
    <bug_when>2021-12-06 09:39:22 -0800</bug_when>
    <thetext>Comment on attachment 445756
Patch v1.0

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

&gt;&gt;&gt;&gt; Source/WebKit/UIProcess/Inspector/ios/WKInspectorHighlightView.mm:274
&gt;&gt;&gt;&gt; +    auto context = WebCore::GraphicsContextCG(UIGraphicsGetCurrentContext());
&gt;&gt;&gt; 
&gt;&gt;&gt; This seems possibly expensive (e.g. retain count churn).  How often is this likely to be called?  Is there any way we can avoid doing this on every `-drawRect:`?
&gt;&gt; 
&gt;&gt; This gets called on every frame we draw. It doesn&apos;t seem to be possible to avoid this, given this comment in the `-drawRect:` documentation:
&gt;&gt; ```
&gt;&gt; You can get a reference to the graphics context using the UIGraphicsGetCurrentContext function, but do not establish a strong reference to the graphics context because it can change between calls to the drawRect: method.
&gt;&gt; ```
&gt;&gt; (https://developer.apple.com/documentation/uikit/uiview/1622529-drawrect)
&gt;&gt; 
&gt;&gt; One thing I can think to try is seeing if we can hold onto the same GraphicsContextCG so long as the underlying CGContextRef remains the same between calls to `-drawRect:`, but that feels a bit sketchy given the above.
&gt; 
&gt; I just checked and unfortunately the `CGContextRef` is different on every invocation, so caching the `GraphicsContextCG` doesn&apos;t really win us anything.

I should clarify that it gets called on every frame we need to update our drawing - Save for the possible redraw when switching away and back to the app, this should only really happen as a result of the `[self setNeedsDisplay]` call in `update:scale:frame:`. Additionally, the retain count churn/object churn in general here should be much less for any case with at least one grid, since previously every call to `update:scale:` would remove and forget about all current layers and rebuild all the layers from scratch. We could (and probably should) hit parity with the previous no-grid case and check for some number of grid highlights before creating a context to avoid this work in the no-grid case.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1820706</commentid>
    <comment_count>7</comment_count>
      <attachid>445756</attachid>
    <who name="Devin Rousso">hi</who>
    <bug_when>2021-12-06 11:58:35 -0800</bug_when>
    <thetext>Comment on attachment 445756
Patch v1.0

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

r=mews, love it =D

&gt;&gt;&gt; Source/WebKit/UIProcess/Inspector/ios/WKInspectorHighlightView.mm:43
&gt;&gt;&gt; +    self.opaque = NO;
&gt;&gt; 
&gt;&gt; Is this intentional?  If so, why?
&gt; 
&gt; Because we now set an actual frame for this view and views default to being opaque - Without this the background of the view is rendered solid black which prevents seeing the actual page underneath.

Can you mention this somewhere in the ChangeLog so that if someone comes across this in the future it&apos;s clear? :)

&gt;&gt;&gt;&gt;&gt; Source/WebKit/UIProcess/Inspector/ios/WKInspectorHighlightView.mm:274
&gt;&gt;&gt;&gt;&gt; +    auto context = WebCore::GraphicsContextCG(UIGraphicsGetCurrentContext());
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; This seems possibly expensive (e.g. retain count churn).  How often is this likely to be called?  Is there any way we can avoid doing this on every `-drawRect:`?
&gt;&gt;&gt; 
&gt;&gt;&gt; This gets called on every frame we draw. It doesn&apos;t seem to be possible to avoid this, given this comment in the `-drawRect:` documentation:
&gt;&gt;&gt; ```
&gt;&gt;&gt; You can get a reference to the graphics context using the UIGraphicsGetCurrentContext function, but do not establish a strong reference to the graphics context because it can change between calls to the drawRect: method.
&gt;&gt;&gt; ```
&gt;&gt;&gt; (https://developer.apple.com/documentation/uikit/uiview/1622529-drawrect)
&gt;&gt;&gt; 
&gt;&gt;&gt; One thing I can think to try is seeing if we can hold onto the same GraphicsContextCG so long as the underlying CGContextRef remains the same between calls to `-drawRect:`, but that feels a bit sketchy given the above.
&gt;&gt; 
&gt;&gt; I just checked and unfortunately the `CGContextRef` is different on every invocation, so caching the `GraphicsContextCG` doesn&apos;t really win us anything.
&gt; 
&gt; I should clarify that it gets called on every frame we need to update our drawing - Save for the possible redraw when switching away and back to the app, this should only really happen as a result of the `[self setNeedsDisplay]` call in `update:scale:frame:`. Additionally, the retain count churn/object churn in general here should be much less for any case with at least one grid, since previously every call to `update:scale:` would remove and forget about all current layers and rebuild all the layers from scratch. We could (and probably should) hit parity with the previous no-grid case and check for some number of grid highlights before creating a context to avoid this work in the no-grid case.

Ah!  If it&apos;s only when we `setNeedsDisplay` (and other rare circumstances) then that&apos;s fine :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1820831</commentid>
    <comment_count>8</comment_count>
      <attachid>446104</attachid>
    <who name="Patrick Angle">pangle</who>
    <bug_when>2021-12-06 17:14:15 -0800</bug_when>
    <thetext>Created attachment 446104
Patch v1.1 - Fix Debug builds, Update changelog</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1820896</commentid>
    <comment_count>9</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2021-12-06 22:20:59 -0800</bug_when>
    <thetext>Committed r286588 (?): &lt;https://commits.webkit.org/r286588&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 446104.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>445756</attachid>
            <date>2021-12-02 11:28:55 -0800</date>
            <delta_ts>2021-12-06 17:14:14 -0800</delta_ts>
            <desc>Patch v1.0</desc>
            <filename>bug-233773-20211202112855.patch</filename>
            <type>text/plain</type>
            <size>24293</size>
            <attacher name="Patrick Angle">pangle</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjg2MzkyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMDZlMmViMTUwNjUyMjll
ZTg3NTQ1N2UyZmI3ZDIxZGFiNDY4YzcyMy4uYmJlMjI2ZTgzZGJhMzI0MDAxMjM5MDY2N2Y0Mzc4
MzU0OTkwZTFhYiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI1IEBACisyMDIxLTEyLTAyICBQYXRy
aWNrIEFuZ2xlICA8cGFuZ2xlQGFwcGxlLmNvbT4KKworICAgICAgICBbQ29jb2FdIFdlYiBJbnNw
ZWN0b3I6IFVuaWZ5IEdyaWQgb3ZlcmxheSBkcmF3aW5nIGNvZGUKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIzMzc3MworCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEV4cG9zZSBJbnNwZWN0b3JPdmVybGF5Ojpk
cmF3R3JpZE92ZXJsYXkgYXMgYSBzdGF0aWMgbWV0aG9kIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQg
Zm9yIGlPUyBvdmVybGF5IGRyYXdpbmcgYW5kCisgICAgICAgIGNsZWFuIHVwIG90aGVyIHJlbGF0
ZWQgZHJhd2luZyBtZXRob2RzIHRvIGJlIHByaXZhdGUgc3RhdGljIGluc3RlYWQgb2YgaW5zdGFu
Y2UgbWV0aG9kcyBvciBwdWJsaWMgc3RhdGljIG1ldGhvZHMuCisKKyAgICAgICAgKiBpbnNwZWN0
b3IvSW5zcGVjdG9yT3ZlcmxheS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpkcmF3TGF5b3V0SGF0
Y2hpbmcpOgorICAgICAgICAoV2ViQ29yZTo6Zm9udEZvckxheW91dExhYmVsKToKKyAgICAgICAg
KFdlYkNvcmU6OmJhY2tncm91bmRQYXRoRm9yTGF5b3V0TGFiZWwpOgorICAgICAgICAoV2ViQ29y
ZTo6ZXhwZWN0ZWRTaXplRm9yTGF5b3V0TGFiZWwpOgorICAgICAgICAoV2ViQ29yZTo6ZHJhd0xh
eW91dExhYmVsKToKKyAgICAgICAgKFdlYkNvcmU6Okluc3BlY3Rvck92ZXJsYXk6OmRyYXdMYXlv
dXRIYXRjaGluZyk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpJbnNwZWN0b3JPdmVybGF5
Ojpmb250Rm9yTGF5b3V0TGFiZWwpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6SW5zcGVj
dG9yT3ZlcmxheTo6YmFja2dyb3VuZFBhdGhGb3JMYXlvdXRMYWJlbCk6IERlbGV0ZWQuCisgICAg
ICAgIChXZWJDb3JlOjpJbnNwZWN0b3JPdmVybGF5OjpkcmF3TGF5b3V0TGFiZWwpOiBEZWxldGVk
LgorICAgICAgICAqIGluc3BlY3Rvci9JbnNwZWN0b3JPdmVybGF5Lmg6CisKIDIwMjEtMTItMDEg
IE5pa29sYXMgWmltbWVybWFubiAgPG56aW1tZXJtYW5uQGlnYWxpYS5jb20+CiAKICAgICAgICAg
W0xCU0VdIFJlbmFtZSBSZW5kZXJTVkdSb290IC0+IExlZ2FjeVJlbmRlclNWR1Jvb3QKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cK
aW5kZXggY2M2YTI3MzFjODY3MmFkYWI0ZDZmYzE5Mzc2M2Q0YWU2NjRhOTE0ZC4uMGM2MWEyNTM3
MjQ4NzY1YmQwNjdkOTBjZDFhYzRiNWExNWUzNjZlNyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktp
dC9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzOCBA
QAorMjAyMS0xMi0wMiAgUGF0cmljayBBbmdsZSAgPHBhbmdsZUBhcHBsZS5jb20+CisKKyAgICAg
ICAgW0NvY29hXSBXZWIgSW5zcGVjdG9yOiBVbmlmeSBHcmlkIG92ZXJsYXkgZHJhd2luZyBjb2Rl
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMzM3NzMK
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBSZW1vdmUg
dGhlIChhbG1vc3QpIDEtdG8tMSBkdXBsaWNhdGVkIGxvZ2ljIGN1cnJlbnRseSBiZWluZyB1c2Vk
IHRvIHR1cm4gR3JpZCBPdmVybGF5cyBpbnRvIGEgbGF5ZXIgaGllcmFyY2h5CisgICAgICAgIGFu
ZCBpbnN0ZWFkIHVzZSBhIGdyYXBoaWNzIGNvbnRleHQgdG8gZHJhdyB0aGUgb3ZlcmxheXMgc3Ry
YWlnaHQgaW50byB0aGUgdmlldyB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZXhpc3RpbmcKKyAg
ICAgICAgZHJhd2luZyBjb2RlIHdlIHVzZSBmb3IgbWFjT1MgaW4gV2ViQ29yZTo6SW5zcGVjdG9y
T3ZlcmxheS4gVG8gYWNjb21tb2RhdGUgdGhpcywgd2Ugbm93IGNvcnJlY3RseSBzZXQgdGhlCisg
ICAgICAgIGNvbnRlbnQgc2NhbGUgZmFjdG9yIG9mIHRoZSB2aWV3IGl0c2VsZiAoc28gdGhhdCBv
dXIgZHJhd2luZyBkb2VzIG5vdCBhcHBlYXIgYmx1cnJ5KSBhbmQgc2V0IHRoZSBmcmFtZSBvZiB0
aGUKKyAgICAgICAgdmlldyBlcXVhbCB0byB0aGUgY3VycmVudCB2aXNpYmxlIHBvcnRpb24gb2Yg
dGhlIHBhcmVudCBzY3JvbGwgdmlldywgd2hpY2ggaGVscHMgdXMgdG8gYXZvaWQgaGF2aW5nIGFu
CisgICAgICAgIGluY3JlZGlibHkgbGFyZ2UgZ3JhcGhpY3MgY29udGV4dCB0byBkcmF3IGludG8g
KHdoaWNoIHdlIHdvdWxkIGlmIHRoZSB2aWV3J3MgZnJhbWUgd2FzIGp1c3Qgc2V0IHRvIG1hdGNo
IHRoZQorICAgICAgICBmcmFtZSBvZiB0aGUgd2VicGFnZSdzIHZpZXcpLiBUaGlzIGZyYW1lIHdp
bGwgbm90IGFsd2F5cyBiZSB0aGUgc2FtZSBzaXplLCBzdWNoIGFzIHdoZW4gem9vbWluZyBpbiB3
aGVyZSBsZXNzIG9mCisgICAgICAgIHRoZSBmcmFtZSBpcyB2aXNpYmxlLiBDb21iaW5lZCB3aXRo
IHRoZSBjdXJyZW50IGNvbnRlbnQgc2NhbGUsIHRoaXMgYWN0dWFsbHkgbWVhbnMgdGhhdCBvbiB6
b29tIHRoZSBlZmZlY3RpdmUKKyAgICAgICAgbnVtYmVyIG9mIHBpeGVscyB0aGF0IG5lZWQgdG8g
YmUgZHJhd24gaXMgY29uc2lzdGVudC4KKworICAgICAgICAqIFVJUHJvY2Vzcy9JbnNwZWN0b3Iv
aW9zL1dLSW5zcGVjdG9ySGlnaGxpZ2h0Vmlldy5oOgorICAgICAgICAqIFVJUHJvY2Vzcy9JbnNw
ZWN0b3IvaW9zL1dLSW5zcGVjdG9ySGlnaGxpZ2h0Vmlldy5tbToKKyAgICAgICAgKC1bV0tJbnNw
ZWN0b3JIaWdobGlnaHRWaWV3IGluaXRXaXRoRnJhbWU6XSk6CisgICAgICAgICgtW1dLSW5zcGVj
dG9ySGlnaGxpZ2h0VmlldyBfcmVtb3ZlQWxsTGF5ZXJzXSk6CisgICAgICAgICgtW1dLSW5zcGVj
dG9ySGlnaGxpZ2h0VmlldyBfY3JlYXRlTGF5ZXJzOl0pOgorICAgICAgICAtIEJlY2F1c2UgdGhl
IHZpZXcncyBmcmFtZSBvcmlnaW4gaXMgbm93IG9mZnNldCwgd2UgbmVlZCB0byBjcmVhdGUgdGhl
IG5vZGUgaGlnaGxpZ2h0IGxheWVycyBvZmZzZXQgYnkgdGhlCisgICAgICAgIG5lZ2F0aW9uIG9m
IHRoZSBmcmFtZSdzIG9yaWdpbiBzbyB0aGF0IHRoZXkgc3RpbGwgbGluZSB1cCBjb3JyZWN0bHkg
d2l0aCBwYWdlIGNvbnRlbnQuCisgICAgICAgICgtW1dLSW5zcGVjdG9ySGlnaGxpZ2h0VmlldyBk
cmF3UmVjdDpdKToKKyAgICAgICAgKC1bV0tJbnNwZWN0b3JIaWdobGlnaHRWaWV3IHVwZGF0ZTpz
Y2FsZTpmcmFtZTpdKToKKyAgICAgICAgKC1bV0tJbnNwZWN0b3JIaWdobGlnaHRWaWV3IF9jcmVh
dGVHcmlkT3ZlcmxheUxheWVyczpzY2FsZTpdKTogRGVsZXRlZC4KKyAgICAgICAgKGNyZWF0ZUxh
eW91dEhhdGNoaW5nTGF5ZXIpOiBEZWxldGVkLgorICAgICAgICAoY3JlYXRlTGF5b3V0TGFiZWxM
YXllcik6IERlbGV0ZWQuCisgICAgICAgICgtW1dLSW5zcGVjdG9ySGlnaGxpZ2h0VmlldyBfY3Jl
YXRlR3JpZE92ZXJsYXlMYXllcjpzY2FsZTpdKTogRGVsZXRlZC4KKyAgICAgICAgKC1bV0tJbnNw
ZWN0b3JIaWdobGlnaHRWaWV3IHVwZGF0ZTpzY2FsZTpdKTogRGVsZXRlZC4KKyAgICAgICAgKiBV
SVByb2Nlc3MvaW9zL1dLQ29udGVudFZpZXcubW06CisgICAgICAgICgtW1dLQ29udGVudFZpZXcg
X3Nob3dJbnNwZWN0b3JIaWdobGlnaHQ6XSk6CisKKwogMjAyMS0xMi0wMSAgQ29tbWl0IFF1ZXVl
ICA8Y29tbWl0LXF1ZXVlQHdlYmtpdC5vcmc+CiAKICAgICAgICAgVW5yZXZpZXdlZCwgcmV2ZXJ0
aW5nIHIyODYwMzcuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVj
dG9yT3ZlcmxheS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yT3Zlcmxh
eS5jcHAKaW5kZXggYzQ2ZTNlNzQ4ZjU5MTVkYmFmNTRiNTQyZTE0YmEyM2VmZDNjZjZkMi4uZDdm
ZTY5NDU0NmQ4YzA0ZTQwNzkzZmJmYTE3ZWU4YmI4ZTQ4ZDk2MSAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvck92ZXJsYXkuY3BwCisrKyBiL1NvdXJjZS9XZWJD
b3JlL2luc3BlY3Rvci9JbnNwZWN0b3JPdmVybGF5LmNwcApAQCAtMTE3MCw3ICsxMTcwLDcgQEAg
UGF0aCBJbnNwZWN0b3JPdmVybGF5OjpkcmF3RWxlbWVudFRpdGxlKEdyYXBoaWNzQ29udGV4dCYg
Y29udGV4dCwgTm9kZSYgbm9kZSwgY28KICAgICByZXR1cm4gcGF0aDsKIH0KIAotdm9pZCBJbnNw
ZWN0b3JPdmVybGF5OjpkcmF3TGF5b3V0SGF0Y2hpbmcoR3JhcGhpY3NDb250ZXh0JiBjb250ZXh0
LCBGbG9hdFF1YWQgcXVhZCkKK3N0YXRpYyB2b2lkIGRyYXdMYXlvdXRIYXRjaGluZyhHcmFwaGlj
c0NvbnRleHQmIGNvbnRleHQsIEZsb2F0UXVhZCBxdWFkKQogewogICAgIEdyYXBoaWNzQ29udGV4
dFN0YXRlU2F2ZXIgc2F2ZXIoY29udGV4dCk7CiAgICAgY29udGV4dC5jbGlwUGF0aChxdWFkVG9Q
YXRoKHF1YWQpKTsKQEAgLTEyMDQsNyArMTIwNCw3IEBAIHZvaWQgSW5zcGVjdG9yT3ZlcmxheTo6
ZHJhd0xheW91dEhhdGNoaW5nKEdyYXBoaWNzQ29udGV4dCYgY29udGV4dCwgRmxvYXRRdWFkIHF1
CiAgICAgY29udGV4dC5zdHJva2VQYXRoKGhhdGNoUGF0aCk7CiB9CiAKLUZvbnRDYXNjYWRlIElu
c3BlY3Rvck92ZXJsYXk6OmZvbnRGb3JMYXlvdXRMYWJlbCgpCitzdGF0aWMgRm9udENhc2NhZGUg
Zm9udEZvckxheW91dExhYmVsKCkKIHsKICAgICBGb250Q2FzY2FkZURlc2NyaXB0aW9uIGZvbnRE
ZXNjcmlwdGlvbjsKICAgICBmb250RGVzY3JpcHRpb24uc2V0RmFtaWxpZXMoeyAic3lzdGVtLXVp
IiB9KTsKQEAgLTEyMTYsNyArMTIxNiw3IEBAIEZvbnRDYXNjYWRlIEluc3BlY3Rvck92ZXJsYXk6
OmZvbnRGb3JMYXlvdXRMYWJlbCgpCiAgICAgcmV0dXJuIGZvbnQ7CiB9CiAKLVBhdGggSW5zcGVj
dG9yT3ZlcmxheTo6YmFja2dyb3VuZFBhdGhGb3JMYXlvdXRMYWJlbChmbG9hdCB3aWR0aCwgZmxv
YXQgaGVpZ2h0LCBJbnNwZWN0b3JPdmVybGF5OjpMYWJlbEFycm93RGlyZWN0aW9uIGFycm93RGly
ZWN0aW9uLCBJbnNwZWN0b3JPdmVybGF5OjpMYWJlbEFycm93RWRnZVBvc2l0aW9uIGFycm93RWRn
ZVBvc2l0aW9uLCBmbG9hdCBhcnJvd1NpemUpCitzdGF0aWMgUGF0aCBiYWNrZ3JvdW5kUGF0aEZv
ckxheW91dExhYmVsKGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQsIEluc3BlY3Rvck92ZXJsYXk6
OkxhYmVsQXJyb3dEaXJlY3Rpb24gYXJyb3dEaXJlY3Rpb24sIEluc3BlY3Rvck92ZXJsYXk6Okxh
YmVsQXJyb3dFZGdlUG9zaXRpb24gYXJyb3dFZGdlUG9zaXRpb24sIGZsb2F0IGFycm93U2l6ZSkK
IHsKICAgICBQYXRoIHBhdGg7CiAgICAgRmxvYXRTaXplIG9mZnNldEZvckFycm93RWRnZVBvc2l0
aW9uOwpAQCAtMTM0Niw3ICsxMzQ2LDcgQEAgUGF0aCBJbnNwZWN0b3JPdmVybGF5OjpiYWNrZ3Jv
dW5kUGF0aEZvckxheW91dExhYmVsKGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQsIEkKIAogc3Rh
dGljIEZsb2F0U2l6ZSBleHBlY3RlZFNpemVGb3JMYXlvdXRMYWJlbChTdHJpbmcgbGFiZWwsIElu
c3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJyb3dEaXJlY3Rpb24gZGlyZWN0aW9uLCBmbG9hdCBtYXhp
bXVtV2lkdGggPSAwKQogewotICAgIGF1dG8gZm9udCA9IEluc3BlY3Rvck92ZXJsYXk6OmZvbnRG
b3JMYXlvdXRMYWJlbCgpOworICAgIGF1dG8gZm9udCA9IGZvbnRGb3JMYXlvdXRMYWJlbCgpOwog
CiAgICAgZmxvYXQgdGV4dEhlaWdodCA9IGZvbnQuZm9udE1ldHJpY3MoKS5mbG9hdEhlaWdodCgp
OwogICAgIGZsb2F0IHRleHRXaWR0aCA9IGZvbnQud2lkdGgoVGV4dFJ1bihsYWJlbCkpOwpAQCAt
MTM2Nyw3ICsxMzY3LDcgQEAgc3RhdGljIEZsb2F0U2l6ZSBleHBlY3RlZFNpemVGb3JMYXlvdXRM
YWJlbChTdHJpbmcgbGFiZWwsIEluc3BlY3Rvck92ZXJsYXk6OkxhYmUKICAgICBSRUxFQVNFX0FT
U0VSVF9OT1RfUkVBQ0hFRCgpOwogfQogCi12b2lkIEluc3BlY3Rvck92ZXJsYXk6OmRyYXdMYXlv
dXRMYWJlbChHcmFwaGljc0NvbnRleHQmIGNvbnRleHQsIFN0cmluZyBsYWJlbCwgRmxvYXRQb2lu
dCBwb2ludCwgSW5zcGVjdG9yT3ZlcmxheTo6TGFiZWxBcnJvd0RpcmVjdGlvbiBhcnJvd0RpcmVj
dGlvbiwgSW5zcGVjdG9yT3ZlcmxheTo6TGFiZWxBcnJvd0VkZ2VQb3NpdGlvbiBhcnJvd0VkZ2VQ
b3NpdGlvbiwgQ29sb3IgYmFja2dyb3VuZENvbG9yLCBmbG9hdCBtYXhpbXVtV2lkdGgpCitzdGF0
aWMgdm9pZCBkcmF3TGF5b3V0TGFiZWwoR3JhcGhpY3NDb250ZXh0JiBjb250ZXh0LCBTdHJpbmcg
bGFiZWwsIEZsb2F0UG9pbnQgcG9pbnQsIEluc3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJyb3dEaXJl
Y3Rpb24gYXJyb3dEaXJlY3Rpb24sIEluc3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJyb3dFZGdlUG9z
aXRpb24gYXJyb3dFZGdlUG9zaXRpb24sIENvbG9yIGJhY2tncm91bmRDb2xvciwgZmxvYXQgbWF4
aW11bVdpZHRoID0gMCkKIHsKICAgICBBU1NFUlQoYXJyb3dFZGdlUG9zaXRpb24gIT0gTGFiZWxB
cnJvd0VkZ2VQb3NpdGlvbjo6Tm9uZSB8fCBhcnJvd0RpcmVjdGlvbiA9PSBMYWJlbEFycm93RGly
ZWN0aW9uOjpOb25lKTsKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0lu
c3BlY3Rvck92ZXJsYXkuaCBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JPdmVy
bGF5LmgKaW5kZXggYTczOWE1Yzg1YjViZDljOTg4NTdkNmZhNjllOTJiMzU4ZWIxMzhmYy4uODRm
ODkyMTc2NjI5ZjUyMDNmODkwZDE1YWVlODZiOTMxNGRjY2Y0NiAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvck92ZXJsYXkuaAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9pbnNwZWN0b3IvSW5zcGVjdG9yT3ZlcmxheS5oCkBAIC0yMTgsOCArMjE4LDcgQEAgcHVibGlj
OgogICAgIEluc3BlY3Rvcjo6RXJyb3JTdHJpbmdPcjx2b2lkPiBjbGVhckdyaWRPdmVybGF5Rm9y
Tm9kZShOb2RlJik7CiAgICAgdm9pZCBjbGVhckFsbEdyaWRPdmVybGF5cygpOwogCi0gICAgV0VC
Q09SRV9FWFBPUlQgc3RhdGljIEZvbnRDYXNjYWRlIGZvbnRGb3JMYXlvdXRMYWJlbCgpOwotICAg
IFdFQkNPUkVfRVhQT1JUIHN0YXRpYyBQYXRoIGJhY2tncm91bmRQYXRoRm9yTGF5b3V0TGFiZWwo
ZmxvYXQsIGZsb2F0LCBJbnNwZWN0b3JPdmVybGF5OjpMYWJlbEFycm93RGlyZWN0aW9uLCBJbnNw
ZWN0b3JPdmVybGF5OjpMYWJlbEFycm93RWRnZVBvc2l0aW9uLCBmbG9hdCBhcnJvd1NpemUpOwor
ICAgIFdFQkNPUkVfRVhQT1JUIHN0YXRpYyB2b2lkIGRyYXdHcmlkT3ZlcmxheShHcmFwaGljc0Nv
bnRleHQmLCBjb25zdCBJbnNwZWN0b3JPdmVybGF5OjpIaWdobGlnaHQ6OkdyaWRIaWdobGlnaHRP
dmVybGF5Jik7CiBwcml2YXRlOgogICAgIHVzaW5nIFRpbWVSZWN0UGFpciA9IHN0ZDo6cGFpcjxN
b25vdG9uaWNUaW1lLCBGbG9hdFJlY3Q+OwogCkBAIC0yMzYsMTAgKzIzNSw2IEBAIHByaXZhdGU6
CiAKICAgICBQYXRoIGRyYXdFbGVtZW50VGl0bGUoR3JhcGhpY3NDb250ZXh0JiwgTm9kZSYsIGNv
bnN0IEhpZ2hsaWdodDo6Qm91bmRzJik7CiAgICAgCi0gICAgdm9pZCBkcmF3TGF5b3V0SGF0Y2hp
bmcoR3JhcGhpY3NDb250ZXh0JiwgRmxvYXRRdWFkKTsKLSAgICB2b2lkIGRyYXdMYXlvdXRMYWJl
bChHcmFwaGljc0NvbnRleHQmLCBTdHJpbmcsIEZsb2F0UG9pbnQsIExhYmVsQXJyb3dEaXJlY3Rp
b24sIEluc3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJyb3dFZGdlUG9zaXRpb24sIENvbG9yIGJhY2tn
cm91bmRDb2xvciA9IENvbG9yOjp3aGl0ZSwgZmxvYXQgbWF4aW11bVdpZHRoID0gMCk7Ci0KLSAg
ICB2b2lkIGRyYXdHcmlkT3ZlcmxheShHcmFwaGljc0NvbnRleHQmLCBjb25zdCBJbnNwZWN0b3JP
dmVybGF5OjpIaWdobGlnaHQ6OkdyaWRIaWdobGlnaHRPdmVybGF5Jik7CiAgICAgc3RkOjpvcHRp
b25hbDxJbnNwZWN0b3JPdmVybGF5OjpIaWdobGlnaHQ6OkdyaWRIaWdobGlnaHRPdmVybGF5PiBi
dWlsZEdyaWRPdmVybGF5KGNvbnN0IEluc3BlY3Rvck92ZXJsYXk6OkdyaWQmLCBib29sIG9mZnNl
dEJvdW5kc0J5U2Nyb2xsID0gZmFsc2UpOwogCiAgICAgdm9pZCB1cGRhdGVQYWludFJlY3RzVGlt
ZXJGaXJlZCgpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvSW5zcGVjdG9y
L2lvcy9XS0luc3BlY3RvckhpZ2hsaWdodFZpZXcuaCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNz
L0luc3BlY3Rvci9pb3MvV0tJbnNwZWN0b3JIaWdobGlnaHRWaWV3LmgKaW5kZXggYTkzNjlmOTY3
ZTk1NzhmYTU1NDgxZGE2MDdjMzIyZGExNTVkYjViMC4uZWMzZmZmNTA5ZjA0NGU3YjRjZDc3NDQz
YjlmM2JiMjE4MTAzMDRiNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvSW5z
cGVjdG9yL2lvcy9XS0luc3BlY3RvckhpZ2hsaWdodFZpZXcuaAorKysgYi9Tb3VyY2UvV2ViS2l0
L1VJUHJvY2Vzcy9JbnNwZWN0b3IvaW9zL1dLSW5zcGVjdG9ySGlnaGxpZ2h0Vmlldy5oCkBAIC0x
LDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQsIDIwMjEgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yOCwx
MSArMjgsMTUgQEAKICNpbXBvcnQgPFVJS2l0L1VJS2l0Lmg+CiAjaW1wb3J0IDxXZWJDb3JlL0lu
c3BlY3Rvck92ZXJsYXkuaD4KIAorbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgRmxvYXRSZWN0
OworfQorCiBAaW50ZXJmYWNlIFdLSW5zcGVjdG9ySGlnaGxpZ2h0VmlldyA6IFVJVmlldyB7CiAg
ICAgUmV0YWluUHRyPE5TTXV0YWJsZUFycmF5PENBU2hhcGVMYXllciAqPj4gX2xheWVyczsKLSAg
ICBSZXRhaW5QdHI8TlNNdXRhYmxlQXJyYXk8Q0FMYXllciAqPj4gX2dyaWRPdmVybGF5TGF5ZXJz
OworICAgIHN0ZDo6b3B0aW9uYWw8V2ViQ29yZTo6SW5zcGVjdG9yT3ZlcmxheTo6SGlnaGxpZ2h0
PiBfaGlnaGxpZ2h0OwogfQotLSAodm9pZCl1cGRhdGU6KGNvbnN0IFdlYkNvcmU6Okluc3BlY3Rv
ck92ZXJsYXk6OkhpZ2hsaWdodCYpaGlnaGxpZ2h0IHNjYWxlOihkb3VibGUpc2NhbGU7CistICh2
b2lkKXVwZGF0ZTooY29uc3QgV2ViQ29yZTo6SW5zcGVjdG9yT3ZlcmxheTo6SGlnaGxpZ2h0Jilo
aWdobGlnaHQgc2NhbGU6KGRvdWJsZSlzY2FsZSBmcmFtZTooY29uc3QgV2ViQ29yZTo6RmxvYXRS
ZWN0JilmcmFtZTsKIEBlbmQKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJ
UHJvY2Vzcy9JbnNwZWN0b3IvaW9zL1dLSW5zcGVjdG9ySGlnaGxpZ2h0Vmlldy5tbSBiL1NvdXJj
ZS9XZWJLaXQvVUlQcm9jZXNzL0luc3BlY3Rvci9pb3MvV0tJbnNwZWN0b3JIaWdobGlnaHRWaWV3
Lm1tCmluZGV4IDY5NjQyZTY0ZWMyZWFiZGM3NDkzYmY4OWVkNmYzYTBkZTM1MGVkNjcuLjM4NzUy
NDgzMTMzZDhkOTE1YWZmNzk2OTNmOTZlMWE4NmY1Y2MwOTYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJLaXQvVUlQcm9jZXNzL0luc3BlY3Rvci9pb3MvV0tJbnNwZWN0b3JIaWdobGlnaHRWaWV3Lm1t
CisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL0luc3BlY3Rvci9pb3MvV0tJbnNwZWN0b3JI
aWdobGlnaHRWaWV3Lm1tCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAx
NCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQs
IDIwMjEgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAog
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCkBAIC0yOCwxMiArMjgsMTAgQEAKIAogI2lmIFBMQVRGT1JNKElPU19GQU1J
TFkpCiAKLSNpbXBvcnQgPFdlYkNvcmUvRmxvYXRMaW5lLmg+CiAjaW1wb3J0IDxXZWJDb3JlL0Zs
b2F0UXVhZC5oPgotI2ltcG9ydCA8V2ViQ29yZS9Gb250Q2FzY2FkZS5oPgotI2ltcG9ydCA8V2Vi
Q29yZS9Gb250Q2FzY2FkZURlc2NyaXB0aW9uLmg+CisjaW1wb3J0IDxXZWJDb3JlL0Zsb2F0UmVj
dC5oPgogI2ltcG9ydCA8V2ViQ29yZS9HZW9tZXRyeVV0aWxpdGllcy5oPgotI2ltcG9ydCA8V2Vi
Q29yZS9UZXh0UnVuLmg+CisjaW1wb3J0IDxXZWJDb3JlL0dyYXBoaWNzQ29udGV4dENHLmg+CiAK
IEBpbXBsZW1lbnRhdGlvbiBXS0luc3BlY3RvckhpZ2hsaWdodFZpZXcKIApAQCAtNDIsNyArNDAs
NyBAQAogICAgIGlmICghKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhGcmFtZTpmcmFtZV0pKQogICAg
ICAgICByZXR1cm4gbmlsOwogICAgIF9sYXllcnMgPSBhZG9wdE5TKFtbTlNNdXRhYmxlQXJyYXkg
YWxsb2NdIGluaXRdKTsKLSAgICBfZ3JpZE92ZXJsYXlMYXllcnMgPSBhZG9wdE5TKFtbTlNNdXRh
YmxlQXJyYXkgYWxsb2NdIGluaXRdKTsKKyAgICBzZWxmLm9wYXF1ZSA9IE5POwogICAgIHJldHVy
biBzZWxmOwogfQogCkBAIC01Nyw5ICs1NSw2IEBACiAgICAgZm9yIChDQVNoYXBlTGF5ZXIgKmxh
eWVyIGluIF9sYXllcnMuZ2V0KCkpCiAgICAgICAgIFtsYXllciByZW1vdmVGcm9tU3VwZXJsYXll
cl07CiAgICAgW19sYXllcnMgcmVtb3ZlQWxsT2JqZWN0c107Ci0gICAgZm9yIChDQUxheWVyICps
YXllciBpbiBfZ3JpZE92ZXJsYXlMYXllcnMuZ2V0KCkpCi0gICAgICAgIFtsYXllciByZW1vdmVG
cm9tU3VwZXJsYXllcl07Ci0gICAgW19ncmlkT3ZlcmxheUxheWVycyByZW1vdmVBbGxPYmplY3Rz
XTsKIH0KIAogLSAodm9pZClfY3JlYXRlTGF5ZXJzOihOU1VJbnRlZ2VyKW51bUxheWVycwpAQCAt
NjksNiArNjQsNyBAQAogCiAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgbnVtTGF5ZXJz
OyArK2kpIHsKICAgICAgICAgYXV0byBsYXllciA9IGFkb3B0TlMoW1tDQVNoYXBlTGF5ZXIgYWxs
b2NdIGluaXRdKTsKKyAgICAgICAgbGF5ZXIuZ2V0KCkucG9zaXRpb24gPSBDR1BvaW50TWFrZSgt
c2VsZi5mcmFtZS5vcmlnaW4ueCwgLXNlbGYuZnJhbWUub3JpZ2luLnkpOwogICAgICAgICBbX2xh
eWVycyBhZGRPYmplY3Q6bGF5ZXIuZ2V0KCldOwogICAgICAgICBbc2VsZi5sYXllciBhZGRTdWJs
YXllcjpsYXllci5nZXQoKV07CiAgICAgfQpAQCAtMjY4LDIyMCArMjY0LDM2IEBAIHN0YXRpYyB2
b2lkIGxheWVyUGF0aChDQVNoYXBlTGF5ZXIgKmxheWVyLCBjb25zdCBXZWJDb3JlOjpGbG9hdFF1
YWQmIG91dGVyUXVhZCkKICAgICB9CiB9CiAKLS0gKHZvaWQpX2NyZWF0ZUdyaWRPdmVybGF5TGF5
ZXJzOihjb25zdCBXZWJDb3JlOjpJbnNwZWN0b3JPdmVybGF5OjpIaWdobGlnaHQmKWhpZ2hsaWdo
dCBzY2FsZTooZG91YmxlKXNjYWxlCi17Ci0gICAgZm9yIChhdXRvIGdyaWRPdmVybGF5IDogaGln
aGxpZ2h0LmdyaWRIaWdobGlnaHRPdmVybGF5cykgewotICAgICAgICBhdXRvIGxheWVyID0gW3Nl
bGYgX2NyZWF0ZUdyaWRPdmVybGF5TGF5ZXI6Z3JpZE92ZXJsYXkgc2NhbGU6c2NhbGVdOwotICAg
ICAgICBbX2dyaWRPdmVybGF5TGF5ZXJzIGFkZE9iamVjdDpsYXllcl07Ci0gICAgICAgIFtzZWxm
LmxheWVyIGFkZFN1YmxheWVyOmxheWVyXTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBDQUxheWVyICog
Y3JlYXRlTGF5b3V0SGF0Y2hpbmdMYXllcihXZWJDb3JlOjpGbG9hdFF1YWQgcXVhZCwgV2ViQ29y
ZTo6Q29sb3Igc3Ryb2tlQ29sb3IpCi17Ci0gICAgQ0FTaGFwZUxheWVyICpsYXllciA9IFtDQVNo
YXBlTGF5ZXIgbGF5ZXJdOwotCi0gICAgY29uc3RleHByIGF1dG8gaGF0Y2hTcGFjaW5nID0gMTI7
Ci0gICAgYXV0byBoYXRjaFBhdGggPSBhZG9wdENGKENHUGF0aENyZWF0ZU11dGFibGUoKSk7Ci0K
LSAgICBXZWJDb3JlOjpGbG9hdExpbmUgdG9wU2lkZSA9IHsgcXVhZC5wMSgpLCBxdWFkLnAyKCkg
fTsKLSAgICBXZWJDb3JlOjpGbG9hdExpbmUgbGVmdFNpZGUgPSB7IHF1YWQucDEoKSwgcXVhZC5w
NCgpIH07Ci0KLSAgICAvLyBUaGUgb3Bwb3NpdGUgYXhpcycgbGVuZ3RoIGlzIHVzZWQgdG8gZGV0
ZXJtaW5lIGhvdyBmYXIgdG8gZHJhdyBhIGhhdGNoIGxpbmUgaW4gYm90aCBkaW1lbnNpb25zLCB3
aGljaCBrZWVwcyB0aGUgbGluZXMgYXQgYSA0NWRlZyBhbmdsZS4KLSAgICBpZiAodG9wU2lkZS5s
ZW5ndGgoKSA+IGxlZnRTaWRlLmxlbmd0aCgpKSB7Ci0gICAgICAgIFdlYkNvcmU6OkZsb2F0TGlu
ZSBib3R0b21TaWRlID0geyBxdWFkLnA0KCksIHF1YWQucDMoKSB9OwotICAgICAgICAvLyBNb3Zl
IGFjcm9zcyB0aGUgcmVsYXRpdmUgdG9wIG9mIHRoZSBxdWFkLCBzdGFydGluZyBsZWZ0IG9mIGAw
LCAwYCB0byBlbnN1cmUgdGhhdCB0aGUgdGFpbCBvZiB0aGUgcHJldmlvdXMgaGF0Y2ggbGluZSBp
cyBkcmF3biB3aGlsZSBzY3JvbGxpbmcuCi0gICAgICAgIGZvciAoZmxvYXQgeCA9IC1sZWZ0U2lk
ZS5sZW5ndGgoKTsgeCA8IHRvcFNpZGUubGVuZ3RoKCk7IHggKz0gaGF0Y2hTcGFjaW5nKSB7Ci0g
ICAgICAgICAgICBhdXRvIHN0YXJ0UG9pbnQgPSB0b3BTaWRlLnBvaW50QXRBYnNvbHV0ZURpc3Rh
bmNlKHgpOwotICAgICAgICAgICAgYXV0byBlbmRQb2ludCA9IGJvdHRvbVNpZGUucG9pbnRBdEFi
c29sdXRlRGlzdGFuY2UoeCArIGxlZnRTaWRlLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIENHUGF0
aE1vdmVUb1BvaW50KGhhdGNoUGF0aC5nZXQoKSwgMCwgc3RhcnRQb2ludC54KCksIHN0YXJ0UG9p
bnQueSgpKTsKLSAgICAgICAgICAgIENHUGF0aEFkZExpbmVUb1BvaW50KGhhdGNoUGF0aC5nZXQo
KSwgMCwgZW5kUG9pbnQueCgpLCBlbmRQb2ludC55KCkpOwotICAgICAgICB9Ci0gICAgfSBlbHNl
IHsKLSAgICAgICAgV2ViQ29yZTo6RmxvYXRMaW5lIHJpZ2h0U2lkZSA9IHsgcXVhZC5wMigpLCBx
dWFkLnAzKCkgfTsKLSAgICAgICAgLy8gTW92ZSBkb3duIHRoZSByZWxhdGl2ZSBsZWZ0IHNpZGUg
b2YgdGhlIHF1YWQsIHN0YXJ0aW5nIGFib3ZlIGAwLCAwYCB0byBlbnN1cmUgdGhhdCB0aGUgdGFp
bCBvZiB0aGUgcHJldmlvdXMgaGF0Y2ggbGluZSBpcyBkcmF3biB3aGlsZSBzY3JvbGxpbmcuCi0g
ICAgICAgIGZvciAoZmxvYXQgeSA9IC10b3BTaWRlLmxlbmd0aCgpOyB5IDwgbGVmdFNpZGUubGVu
Z3RoKCk7IHkgKz0gaGF0Y2hTcGFjaW5nKSB7Ci0gICAgICAgICAgICBhdXRvIHN0YXJ0UG9pbnQg
PSBsZWZ0U2lkZS5wb2ludEF0QWJzb2x1dGVEaXN0YW5jZSh5KTsKLSAgICAgICAgICAgIGF1dG8g
ZW5kUG9pbnQgPSByaWdodFNpZGUucG9pbnRBdEFic29sdXRlRGlzdGFuY2UoeSArIHRvcFNpZGUu
bGVuZ3RoKCkpOwotICAgICAgICAgICAgQ0dQYXRoTW92ZVRvUG9pbnQoaGF0Y2hQYXRoLmdldCgp
LCAwLCBzdGFydFBvaW50LngoKSwgc3RhcnRQb2ludC55KCkpOwotICAgICAgICAgICAgQ0dQYXRo
QWRkTGluZVRvUG9pbnQoaGF0Y2hQYXRoLmdldCgpLCAwLCBlbmRQb2ludC54KCksIGVuZFBvaW50
LnkoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbGF5ZXIucGF0aCA9IGhhdGNoUGF0aC5nZXQo
KTsKLSAgICBsYXllci5zdHJva2VDb2xvciA9IGNhY2hlZENHQ29sb3Ioc3Ryb2tlQ29sb3IpLmdl
dCgpOwotICAgIGxheWVyLmxpbmVXaWR0aCA9IDAuNTsKLSAgICBsYXllci5saW5lRGFzaFBhdHRl
cm4gPSBAW1tOU051bWJlciBudW1iZXJXaXRoSW50OjJdLCBbTlNOdW1iZXIgbnVtYmVyV2l0aElu
dDoyXV07Ci0KLSAgICBDQVNoYXBlTGF5ZXIgKm1hc2tMYXllciA9IFtDQVNoYXBlTGF5ZXIgbGF5
ZXJdOwotICAgIGxheWVyUGF0aChtYXNrTGF5ZXIsIHF1YWQpOwotICAgIGxheWVyLm1hc2sgPSBt
YXNrTGF5ZXI7Ci0gICAgcmV0dXJuIGxheWVyOwotfQotCi1zdGF0aWMgQ0FMYXllciAqIGNyZWF0
ZUxheW91dExhYmVsTGF5ZXIoU3RyaW5nIGxhYmVsLCBXZWJDb3JlOjpGbG9hdFBvaW50IHBvaW50
LCBXZWJDb3JlOjpJbnNwZWN0b3JPdmVybGF5OjpMYWJlbEFycm93RGlyZWN0aW9uIGFycm93RGly
ZWN0aW9uLCBXZWJDb3JlOjpJbnNwZWN0b3JPdmVybGF5OjpMYWJlbEFycm93RWRnZVBvc2l0aW9u
IGFycm93RWRnZVBvc2l0aW9uLCBXZWJDb3JlOjpDb2xvciBiYWNrZ3JvdW5kQ29sb3IsIFdlYkNv
cmU6OkNvbG9yIHN0cm9rZUNvbG9yLCBkb3VibGUgc2NhbGUsIGZsb2F0IG1heGltdW1XaWR0aCA9
IDApCistICh2b2lkKWRyYXdSZWN0OihDR1JlY3QpZGlydHlSZWN0CiB7Ci0gICAgYXV0byBmb250
ID0gV2ViQ29yZTo6SW5zcGVjdG9yT3ZlcmxheTo6Zm9udEZvckxheW91dExhYmVsKCk7Ci0KLSAg
ICBjb25zdGV4cHIgYXV0byBwYWRkaW5nID0gNDsKLSAgICBjb25zdGV4cHIgYXV0byBhcnJvd1Np
emUgPSA2OwotICAgIGZsb2F0IHRleHRIZWlnaHQgPSBmb250LmZvbnRNZXRyaWNzKCkuZmxvYXRI
ZWlnaHQoKTsKLQotICAgIGZsb2F0IHRleHRXaWR0aCA9IGZvbnQud2lkdGgoV2ViQ29yZTo6VGV4
dFJ1bihsYWJlbCkpOwotICAgIGlmIChtYXhpbXVtV2lkdGggJiYgdGV4dFdpZHRoICsgKHBhZGRp
bmcgKiAyKSA+IG1heGltdW1XaWR0aCkgewotICAgICAgICBsYWJlbC5hcHBlbmQoIi4uLiJfcyk7
Ci0gICAgICAgIHdoaWxlICh0ZXh0V2lkdGggKyAocGFkZGluZyAqIDIpID4gbWF4aW11bVdpZHRo
ICYmIGxhYmVsLmxlbmd0aCgpID49IDQpIHsKLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZm91
cnRoIGZyb20gbGFzdCBjaGFyYWN0ZXIgKHRoZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBlbGxpcHNp
cykgYW5kIHJlbWVhc3VyZS4KLSAgICAgICAgICAgIGxhYmVsLnJlbW92ZShsYWJlbC5sZW5ndGgo
KSAtIDQpOwotICAgICAgICAgICAgdGV4dFdpZHRoID0gZm9udC53aWR0aChXZWJDb3JlOjpUZXh0
UnVuKGxhYmVsKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOb3RlOiBJbXBsZW1lbnRh
dGlvbiBEaWZmZXJlbmNlIC0gVGhlIHRleHRQb3NpdGlvbiBpcyB0aGUgY2VudGVyIG9mIHRleHQs
IHVubGlrZSBXZWJDb3JlOjpJbnNwZWN0b3JPdmVybGF5LCB3aGVyZSB0aGUgdGV4dFBvc2l0aW9u
IGlzIGxlZnRtb3N0IHBvaW50IG9uIHRoZSBiYXNlbGluZSBvZiB0aGUgdGV4dC4KLSAgICBXZWJD
b3JlOjpGbG9hdFBvaW50IHRleHRQb3NpdGlvbjsKLSAgICBzd2l0Y2ggKGFycm93RGlyZWN0aW9u
KSB7Ci0gICAgY2FzZSBXZWJDb3JlOjpJbnNwZWN0b3JPdmVybGF5OjpMYWJlbEFycm93RGlyZWN0
aW9uOjpEb3duOgotICAgICAgICBzd2l0Y2ggKGFycm93RWRnZVBvc2l0aW9uKSB7Ci0gICAgICAg
IGNhc2UgV2ViQ29yZTo6SW5zcGVjdG9yT3ZlcmxheTo6TGFiZWxBcnJvd0VkZ2VQb3NpdGlvbjo6
TGVhZGluZzoKLSAgICAgICAgICAgIHRleHRQb3NpdGlvbiA9IFdlYkNvcmU6OkZsb2F0UG9pbnQo
KHRleHRXaWR0aCAvIDIpICsgcGFkZGluZywgLSh0ZXh0SGVpZ2h0IC8gMikgLSBhcnJvd1NpemUg
LSBwYWRkaW5nKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFdlYkNvcmU6Oklu
c3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJyb3dFZGdlUG9zaXRpb246Ok1pZGRsZToKLSAgICAgICAg
ICAgIHRleHRQb3NpdGlvbiA9IFdlYkNvcmU6OkZsb2F0UG9pbnQoMCwgLSh0ZXh0SGVpZ2h0IC8g
MikgLSBhcnJvd1NpemUgLSBwYWRkaW5nKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBj
YXNlIFdlYkNvcmU6Okluc3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJyb3dFZGdlUG9zaXRpb246OlRy
YWlsaW5nOgotICAgICAgICAgICAgdGV4dFBvc2l0aW9uID0gV2ViQ29yZTo6RmxvYXRQb2ludCgt
KHRleHRXaWR0aCAvIDIpIC0gcGFkZGluZywgLSh0ZXh0SGVpZ2h0IC8gMikgLSBhcnJvd1NpemUg
LSBwYWRkaW5nKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFdlYkNvcmU6Oklu
c3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJyb3dFZGdlUG9zaXRpb246Ok5vbmU6Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFdlYkNvcmU6Oklu
c3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJyb3dEaXJlY3Rpb246OlVwOgotICAgICAgICBzd2l0Y2gg
KGFycm93RWRnZVBvc2l0aW9uKSB7Ci0gICAgICAgIGNhc2UgV2ViQ29yZTo6SW5zcGVjdG9yT3Zl
cmxheTo6TGFiZWxBcnJvd0VkZ2VQb3NpdGlvbjo6TGVhZGluZzoKLSAgICAgICAgICAgIHRleHRQ
b3NpdGlvbiA9IFdlYkNvcmU6OkZsb2F0UG9pbnQoKHRleHRXaWR0aCAvIDIpICsgcGFkZGluZywg
KHRleHRIZWlnaHQgLyAyKSArIGFycm93U2l6ZSArIHBhZGRpbmcpOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGNhc2UgV2ViQ29yZTo6SW5zcGVjdG9yT3ZlcmxheTo6TGFiZWxBcnJvd0Vk
Z2VQb3NpdGlvbjo6TWlkZGxlOgotICAgICAgICAgICAgdGV4dFBvc2l0aW9uID0gV2ViQ29yZTo6
RmxvYXRQb2ludCgwLCAodGV4dEhlaWdodCAvIDIpICsgYXJyb3dTaXplICsgcGFkZGluZyk7Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBXZWJDb3JlOjpJbnNwZWN0b3JPdmVybGF5
OjpMYWJlbEFycm93RWRnZVBvc2l0aW9uOjpUcmFpbGluZzoKLSAgICAgICAgICAgIHRleHRQb3Np
dGlvbiA9IFdlYkNvcmU6OkZsb2F0UG9pbnQoLSh0ZXh0V2lkdGggLyAyKSAtIHBhZGRpbmcsICh0
ZXh0SGVpZ2h0IC8gMikgKyBhcnJvd1NpemUgKyBwYWRkaW5nKTsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICBjYXNlIFdlYkNvcmU6Okluc3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJyb3dFZGdl
UG9zaXRpb246Ok5vbmU6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBi
cmVhazsKLSAgICBjYXNlIFdlYkNvcmU6Okluc3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJyb3dEaXJl
Y3Rpb246OlJpZ2h0OgotICAgICAgICBzd2l0Y2ggKGFycm93RWRnZVBvc2l0aW9uKSB7Ci0gICAg
ICAgIGNhc2UgV2ViQ29yZTo6SW5zcGVjdG9yT3ZlcmxheTo6TGFiZWxBcnJvd0VkZ2VQb3NpdGlv
bjo6TGVhZGluZzoKLSAgICAgICAgICAgIHRleHRQb3NpdGlvbiA9IFdlYkNvcmU6OkZsb2F0UG9p
bnQoLSh0ZXh0V2lkdGggLyAyKSAtIGFycm93U2l6ZSAtIHBhZGRpbmcsICh0ZXh0SGVpZ2h0IC8g
MikgKyBwYWRkaW5nKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFdlYkNvcmU6
Okluc3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJyb3dFZGdlUG9zaXRpb246Ok1pZGRsZToKLSAgICAg
ICAgICAgIHRleHRQb3NpdGlvbiA9IFdlYkNvcmU6OkZsb2F0UG9pbnQoLSh0ZXh0V2lkdGggLyAy
KSAtIGFycm93U2l6ZSAtIHBhZGRpbmcsIDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IGNhc2UgV2ViQ29yZTo6SW5zcGVjdG9yT3ZlcmxheTo6TGFiZWxBcnJvd0VkZ2VQb3NpdGlvbjo6
VHJhaWxpbmc6Ci0gICAgICAgICAgICB0ZXh0UG9zaXRpb24gPSBXZWJDb3JlOjpGbG9hdFBvaW50
KC0odGV4dFdpZHRoIC8gMikgLSBhcnJvd1NpemUgLSBwYWRkaW5nLCAtKHRleHRIZWlnaHQgLyAy
KSAtIHBhZGRpbmcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgV2ViQ29yZTo6
SW5zcGVjdG9yT3ZlcmxheTo6TGFiZWxBcnJvd0VkZ2VQb3NpdGlvbjo6Tm9uZToKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgV2ViQ29yZTo6
SW5zcGVjdG9yT3ZlcmxheTo6TGFiZWxBcnJvd0RpcmVjdGlvbjo6TGVmdDoKLSAgICAgICAgc3dp
dGNoIChhcnJvd0VkZ2VQb3NpdGlvbikgewotICAgICAgICBjYXNlIFdlYkNvcmU6Okluc3BlY3Rv
ck92ZXJsYXk6OkxhYmVsQXJyb3dFZGdlUG9zaXRpb246OkxlYWRpbmc6Ci0gICAgICAgICAgICB0
ZXh0UG9zaXRpb24gPSBXZWJDb3JlOjpGbG9hdFBvaW50KCh0ZXh0V2lkdGggLyAyKSArIGFycm93
U2l6ZSArIHBhZGRpbmcsICh0ZXh0SGVpZ2h0IC8gMikgKyBwYWRkaW5nKTsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBjYXNlIFdlYkNvcmU6Okluc3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJy
b3dFZGdlUG9zaXRpb246Ok1pZGRsZToKLSAgICAgICAgICAgIHRleHRQb3NpdGlvbiA9IFdlYkNv
cmU6OkZsb2F0UG9pbnQoKHRleHRXaWR0aCAvIDIpICsgYXJyb3dTaXplICsgcGFkZGluZywgMCk7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBXZWJDb3JlOjpJbnNwZWN0b3JPdmVy
bGF5OjpMYWJlbEFycm93RWRnZVBvc2l0aW9uOjpUcmFpbGluZzoKLSAgICAgICAgICAgIHRleHRQ
b3NpdGlvbiA9IFdlYkNvcmU6OkZsb2F0UG9pbnQoKHRleHRXaWR0aCAvIDIpICsgYXJyb3dTaXpl
ICsgcGFkZGluZywgLSh0ZXh0SGVpZ2h0IC8gMikgLSBwYWRkaW5nKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICBjYXNlIFdlYkNvcmU6Okluc3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJyb3dF
ZGdlUG9zaXRpb246Ok5vbmU6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAg
ICBicmVhazsKLSAgICBjYXNlIFdlYkNvcmU6Okluc3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJyb3dE
aXJlY3Rpb246Ok5vbmU6Ci0gICAgICAgIC8vIFRleHQgcG9zaXRpb24gd2lsbCByZW1haW4gKDAs
IDApLgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBDQUxheWVyICpsYXllciA9IFtDQUxh
eWVyIGxheWVyXTsKKyAgICBbc3VwZXIgZHJhd1JlY3Q6ZGlydHlSZWN0XTsKIAotI2lmIFVTRShD
RykKLSAgICAvLyBXZWJDb3JlOjpQYXRoOjpQbGF0Zm9ybVBhdGhQdHIgaXMgb25seSBhIENHUGF0
aCogd2hlbiBgVVNFKENHKWAgaXMgdHJ1ZS4KLSAgICBhdXRvIGxhYmVsUGF0aCA9IFdlYkNvcmU6
Okluc3BlY3Rvck92ZXJsYXk6OmJhY2tncm91bmRQYXRoRm9yTGF5b3V0TGFiZWwodGV4dFdpZHRo
ICsgKHBhZGRpbmcgKiAyKSwgdGV4dEhlaWdodCArIChwYWRkaW5nICogMiksIGFycm93RGlyZWN0
aW9uLCBhcnJvd0VkZ2VQb3NpdGlvbiwgYXJyb3dTaXplKTsKLSAgICBDR1BhdGgqIHBsYXRmb3Jt
TGFiZWxQYXRoID0gbGFiZWxQYXRoLmVuc3VyZVBsYXRmb3JtUGF0aCgpOwotCi0gICAgQ0FTaGFw
ZUxheWVyICpsYWJlbFBhdGhMYXllciA9IFtDQVNoYXBlTGF5ZXIgbGF5ZXJdOwotICAgIGxhYmVs
UGF0aExheWVyLnBhdGggPSBwbGF0Zm9ybUxhYmVsUGF0aDsKLSAgICBsYWJlbFBhdGhMYXllci5m
aWxsQ29sb3IgPSBjYWNoZWRDR0NvbG9yKGJhY2tncm91bmRDb2xvcikuZ2V0KCk7Ci0gICAgbGFi
ZWxQYXRoTGF5ZXIuc3Ryb2tlQ29sb3IgPSBjYWNoZWRDR0NvbG9yKHN0cm9rZUNvbG9yKS5nZXQo
KTsKLSAgICBsYWJlbFBhdGhMYXllci5wb3NpdGlvbiA9IENHUG9pbnRNYWtlKHBvaW50LngoKSwg
cG9pbnQueSgpKTsKLSAgICBbbGF5ZXIgYWRkU3VibGF5ZXI6bGFiZWxQYXRoTGF5ZXJdOwotI2Vu
ZGlmCi0KLSAgICBDQVRleHRMYXllciAqdGV4dExheWVyID0gW0NBVGV4dExheWVyIGxheWVyXTsK
LSAgICB0ZXh0TGF5ZXIuZnJhbWUgPSBDR1JlY3RNYWtlKDAsIDAsIHRleHRXaWR0aCwgdGV4dEhl
aWdodCk7Ci0gICAgdGV4dExheWVyLnN0cmluZyA9IGxhYmVsOwotICAgIHRleHRMYXllci5mb250
ID0gZm9udC5wcmltYXJ5Rm9udCgpLmdldENURm9udCgpOwotICAgIHRleHRMYXllci5mb250U2l6
ZSA9IDEyOwotICAgIHRleHRMYXllci5hbGlnbm1lbnRNb2RlID0ga0NBQWxpZ25tZW50TGVmdDsK
LSAgICB0ZXh0TGF5ZXIuZm9yZWdyb3VuZENvbG9yID0gQ0dDb2xvckdldENvbnN0YW50Q29sb3Io
a0NHQ29sb3JCbGFjayk7Ci0gICAgdGV4dExheWVyLnBvc2l0aW9uID0gQ0dQb2ludE1ha2UodGV4
dFBvc2l0aW9uLngoKSArIHBvaW50LngoKSwgdGV4dFBvc2l0aW9uLnkoKSArIHBvaW50LnkoKSk7
Ci0gICAgdGV4dExheWVyLmNvbnRlbnRzU2NhbGUgPSBbW1VJU2NyZWVuIG1haW5TY3JlZW5dIHNj
YWxlXSAqIHNjYWxlOwotICAgIFtsYXllciBhZGRTdWJsYXllcjp0ZXh0TGF5ZXJdOwotCi0gICAg
cmV0dXJuIGxheWVyOwotfQotCi0tIChDQUxheWVyICopX2NyZWF0ZUdyaWRPdmVybGF5TGF5ZXI6
KGNvbnN0IFdlYkNvcmU6Okluc3BlY3Rvck92ZXJsYXk6OkhpZ2hsaWdodDo6R3JpZEhpZ2hsaWdo
dE92ZXJsYXkmKW92ZXJsYXkgc2NhbGU6KGRvdWJsZSlzY2FsZQotewotICAgIC8vIEtlZXAgaW1w
bGVtZW50YXRpb24gcm91Z2hseSBlcXVpdmFsZW50IHRvIGBXZWJDb3JlOjpJbnNwZWN0b3JPdmVy
bGF5OjpkcmF3R3JpZE92ZXJsYXlgLgotICAgIENBTGF5ZXIgKmxheWVyID0gW0NBTGF5ZXIgbGF5
ZXJdOwotCi0gICAgYXV0byBncmlkTGluZXNQYXRoID0gYWRvcHRDRihDR1BhdGhDcmVhdGVNdXRh
YmxlKCkpOwotICAgIGZvciAoYXV0byBncmlkTGluZSA6IG92ZXJsYXkuZ3JpZExpbmVzKSB7Ci0g
ICAgICAgIENHUGF0aE1vdmVUb1BvaW50KGdyaWRMaW5lc1BhdGguZ2V0KCksIDAsIGdyaWRMaW5l
LnN0YXJ0KCkueCgpLCBncmlkTGluZS5zdGFydCgpLnkoKSk7Ci0gICAgICAgIENHUGF0aEFkZExp
bmVUb1BvaW50KGdyaWRMaW5lc1BhdGguZ2V0KCksIDAsIGdyaWRMaW5lLmVuZCgpLngoKSwgZ3Jp
ZExpbmUuZW5kKCkueSgpKTsKLSAgICB9Ci0gICAgQ0FTaGFwZUxheWVyICpncmlkTGluZXNMYXll
ciA9IFtDQVNoYXBlTGF5ZXIgbGF5ZXJdOwotICAgIGdyaWRMaW5lc0xheWVyLnBhdGggPSBncmlk
TGluZXNQYXRoLmdldCgpOwotICAgIGdyaWRMaW5lc0xheWVyLmxpbmVXaWR0aCA9IDE7Ci0gICAg
Z3JpZExpbmVzTGF5ZXIuc3Ryb2tlQ29sb3IgPSBjYWNoZWRDR0NvbG9yKG92ZXJsYXkuY29sb3Ip
LmdldCgpOwotICAgIFtsYXllciBhZGRTdWJsYXllcjpncmlkTGluZXNMYXllcl07Ci0KLSAgICBm
b3IgKGF1dG8gZ2FwUXVhZCA6IG92ZXJsYXkuZ2FwcykKLSAgICAgICAgW2xheWVyIGFkZFN1Ymxh
eWVyOmNyZWF0ZUxheW91dEhhdGNoaW5nTGF5ZXIoZ2FwUXVhZCwgb3ZlcmxheS5jb2xvcildOwot
Ci0gICAgZm9yIChhdXRvIGFyZWEgOiBvdmVybGF5LmFyZWFzKSB7Ci0gICAgICAgIENBU2hhcGVM
YXllciAqYXJlYUxheWVyID0gW0NBU2hhcGVMYXllciBsYXllcl07Ci0gICAgICAgIGxheWVyUGF0
aChhcmVhTGF5ZXIsIGFyZWEucXVhZCk7Ci0gICAgICAgIGFyZWFMYXllci5saW5lV2lkdGggPSAz
OwotICAgICAgICBhcmVhTGF5ZXIuZmlsbENvbG9yID0gQ0dDb2xvckdldENvbnN0YW50Q29sb3Io
a0NHQ29sb3JDbGVhcik7Ci0gICAgICAgIGFyZWFMYXllci5zdHJva2VDb2xvciA9IGNhY2hlZENH
Q29sb3Iob3ZlcmxheS5jb2xvcikuZ2V0KCk7Ci0gICAgICAgIFtsYXllciBhZGRTdWJsYXllcjph
cmVhTGF5ZXJdOwotICAgIH0KLQotICAgIGNvbnN0ZXhwciBhdXRvIHRyYW5zbHVjZW50TGFiZWxC
YWNrZ3JvdW5kQ29sb3IgPSBXZWJDb3JlOjpDb2xvcjo6d2hpdGUuY29sb3JXaXRoQWxwaGFCeXRl
KDIzMCk7Ci0KLSAgICBmb3IgKGF1dG8gYXJlYSA6IG92ZXJsYXkuYXJlYXMpCi0gICAgICAgIFts
YXllciBhZGRTdWJsYXllcjpjcmVhdGVMYXlvdXRMYWJlbExheWVyKGFyZWEubmFtZSwgYXJlYS5x
dWFkLmNlbnRlcigpLCBXZWJDb3JlOjpJbnNwZWN0b3JPdmVybGF5OjpMYWJlbEFycm93RGlyZWN0
aW9uOjpOb25lLCBXZWJDb3JlOjpJbnNwZWN0b3JPdmVybGF5OjpMYWJlbEFycm93RWRnZVBvc2l0
aW9uOjpOb25lLCB0cmFuc2x1Y2VudExhYmVsQmFja2dyb3VuZENvbG9yLCBvdmVybGF5LmNvbG9y
LCBzY2FsZSwgYXJlYS5xdWFkLmJvdW5kaW5nQm94KCkud2lkdGgoKSldOworICAgIGlmICghX2hp
Z2hsaWdodCkKKyAgICAgICAgcmV0dXJuOwogCi0gICAgZm9yIChhdXRvIGxhYmVsIDogb3Zlcmxh
eS5sYWJlbHMpCi0gICAgICAgIFtsYXllciBhZGRTdWJsYXllcjpjcmVhdGVMYXlvdXRMYWJlbExh
eWVyKGxhYmVsLnRleHQsIGxhYmVsLmxvY2F0aW9uLCBsYWJlbC5hcnJvd0RpcmVjdGlvbiwgbGFi
ZWwuYXJyb3dFZGdlUG9zaXRpb24sIGxhYmVsLmJhY2tncm91bmRDb2xvciwgb3ZlcmxheS5jb2xv
ciwgc2NhbGUpXTsKKyAgICBhdXRvIGNvbnRleHQgPSBXZWJDb3JlOjpHcmFwaGljc0NvbnRleHRD
RyhVSUdyYXBoaWNzR2V0Q3VycmVudENvbnRleHQoKSk7CisgICAgY29udGV4dC5jbGlwKHsgZGly
dHlSZWN0IH0pOworICAgIGNvbnRleHQudHJhbnNsYXRlKC1zZWxmLmZyYW1lLm9yaWdpbi54LCAt
c2VsZi5mcmFtZS5vcmlnaW4ueSk7CiAKLSAgICByZXR1cm4gbGF5ZXI7CisgICAgZm9yIChhdXRv
IGdyaWRIaWdobGlnaHRPdmVybGF5IDogX2hpZ2hsaWdodC0+Z3JpZEhpZ2hsaWdodE92ZXJsYXlz
KQorICAgICAgICBXZWJDb3JlOjpJbnNwZWN0b3JPdmVybGF5OjpkcmF3R3JpZE92ZXJsYXkoY29u
dGV4dCwgZ3JpZEhpZ2hsaWdodE92ZXJsYXkpOwogfQogCi0tICh2b2lkKXVwZGF0ZTooY29uc3Qg
V2ViQ29yZTo6SW5zcGVjdG9yT3ZlcmxheTo6SGlnaGxpZ2h0JiloaWdobGlnaHQgc2NhbGU6KGRv
dWJsZSlzY2FsZQorLSAodm9pZCl1cGRhdGU6KGNvbnN0IFdlYkNvcmU6Okluc3BlY3Rvck92ZXJs
YXk6OkhpZ2hsaWdodCYpaGlnaGxpZ2h0IHNjYWxlOihkb3VibGUpc2NhbGUgZnJhbWU6KGNvbnN0
IFdlYkNvcmU6OkZsb2F0UmVjdCYpZnJhbWUKIHsKICAgICBbc2VsZiBfcmVtb3ZlQWxsTGF5ZXJz
XTsKIAorICAgIF9oaWdobGlnaHQgPSBoaWdobGlnaHQ7CisgICAgc2VsZi5jb250ZW50U2NhbGVG
YWN0b3IgPSBVSVNjcmVlbi5tYWluU2NyZWVuLnNjYWxlICogc2NhbGU7CisgICAgc2VsZi5mcmFt
ZSA9IGZyYW1lOworCiAgICAgaWYgKGhpZ2hsaWdodC50eXBlID09IFdlYkNvcmU6Okluc3BlY3Rv
ck92ZXJsYXk6OkhpZ2hsaWdodDo6VHlwZTo6Tm9kZSB8fCBoaWdobGlnaHQudHlwZSA9PSBXZWJD
b3JlOjpJbnNwZWN0b3JPdmVybGF5OjpIaWdobGlnaHQ6OlR5cGU6Ok5vZGVMaXN0KQogICAgICAg
ICBbc2VsZiBfbGF5b3V0Rm9yTm9kZUxpc3RIaWdobGlnaHQ6aGlnaGxpZ2h0XTsKICAgICBlbHNl
IGlmIChoaWdobGlnaHQudHlwZSA9PSBXZWJDb3JlOjpJbnNwZWN0b3JPdmVybGF5OjpIaWdobGln
aHQ6OlR5cGU6OlJlY3RzKQogICAgICAgICBbc2VsZiBfbGF5b3V0Rm9yUmVjdHNIaWdobGlnaHQ6
aGlnaGxpZ2h0XTsKIAotICAgIFtzZWxmIF9jcmVhdGVHcmlkT3ZlcmxheUxheWVyczpoaWdobGln
aHQgc2NhbGU6c2NhbGVdOworICAgIAorICAgIFtzZWxmIHNldE5lZWRzRGlzcGxheV07CiB9CiAK
IEBlbmQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL2lvcy9XS0NvbnRlbnRW
aWV3Lm1tIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvaW9zL1dLQ29udGVudFZpZXcubW0KaW5k
ZXggZDExZjcxZmIxMWQyMWZhYTVmNzE5M2JkZjUwMWU4ZmFlMGRkMGEyMC4uNDYzM2I5MzVhODAx
YjA2MmEzOTQyNGQ2OGNjNTA4ZmZiMTdiNWVhMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9V
SVByb2Nlc3MvaW9zL1dLQ29udGVudFZpZXcubW0KKysrIGIvU291cmNlL1dlYktpdC9VSVByb2Nl
c3MvaW9zL1dLQ29udGVudFZpZXcubW0KQEAgLTQxMiw4ICs0MTIsNyBAQCBBTExPV19ERVBSRUNB
VEVEX0RFQ0xBUkFUSU9OU19FTkQKICAgICAgICAgX2luc3BlY3RvckhpZ2hsaWdodFZpZXcgPSBh
ZG9wdE5TKFtbV0tJbnNwZWN0b3JIaWdobGlnaHRWaWV3IGFsbG9jXSBpbml0V2l0aEZyYW1lOkNH
UmVjdFplcm9dKTsKICAgICAgICAgW3NlbGYgaW5zZXJ0U3VidmlldzpfaW5zcGVjdG9ySGlnaGxp
Z2h0Vmlldy5nZXQoKSBhYm92ZVN1YnZpZXc6X3Jvb3RDb250ZW50Vmlldy5nZXQoKV07CiAgICAg
fQotCi0gICAgW19pbnNwZWN0b3JIaWdobGlnaHRWaWV3IHVwZGF0ZTpoaWdobGlnaHQgc2NhbGU6
W3NlbGYgX2NvbnRlbnRab29tU2NhbGVdXTsKKyAgICBbX2luc3BlY3RvckhpZ2hsaWdodFZpZXcg
dXBkYXRlOmhpZ2hsaWdodCBzY2FsZTpbc2VsZiBfY29udGVudFpvb21TY2FsZV0gZnJhbWU6X3Bh
Z2UtPnVub2JzY3VyZWRDb250ZW50UmVjdCgpXTsKIH0KIAogLSAodm9pZClfaGlkZUluc3BlY3Rv
ckhpZ2hsaWdodAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>446104</attachid>
            <date>2021-12-06 17:14:15 -0800</date>
            <delta_ts>2021-12-06 22:20:59 -0800</delta_ts>
            <desc>Patch v1.1 - Fix Debug builds, Update changelog</desc>
            <filename>bug-233773-20211206171415.patch</filename>
            <type>text/plain</type>
            <size>24826</size>
            <attacher name="Patrick Angle">pangle</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjg2NTcyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYjZkYmI5ODBkZDA0ODE5
NDBmYTFmZDAwNzY3ZTI0NDhiZTU0MDUzZi4uMzI1MjM0ZDdhMzI2MzgyZDU0NDkyMDM4YWZlNThl
MGQzNDIzZGU2YyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI1IEBACisyMDIxLTEyLTA2ICBQYXRy
aWNrIEFuZ2xlICA8cGFuZ2xlQGFwcGxlLmNvbT4KKworICAgICAgICBbQ29jb2FdIFdlYiBJbnNw
ZWN0b3I6IFVuaWZ5IEdyaWQgb3ZlcmxheSBkcmF3aW5nIGNvZGUKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIzMzc3MworCisgICAgICAgIFJldmlld2Vk
IGJ5IERldmluIFJvdXNzby4KKworICAgICAgICBFeHBvc2UgSW5zcGVjdG9yT3ZlcmxheTo6ZHJh
d0dyaWRPdmVybGF5IGFzIGEgc3RhdGljIG1ldGhvZCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGZv
ciBpT1Mgb3ZlcmxheSBkcmF3aW5nIGFuZAorICAgICAgICBjbGVhbiB1cCBvdGhlciByZWxhdGVk
IGRyYXdpbmcgbWV0aG9kcyB0byBiZSBwcml2YXRlIHN0YXRpYyBpbnN0ZWFkIG9mIGluc3RhbmNl
IG1ldGhvZHMgb3IgcHVibGljIHN0YXRpYyBtZXRob2RzLgorCisgICAgICAgICogaW5zcGVjdG9y
L0luc3BlY3Rvck92ZXJsYXkuY3BwOgorICAgICAgICAoV2ViQ29yZTo6ZHJhd0xheW91dEhhdGNo
aW5nKToKKyAgICAgICAgKFdlYkNvcmU6OmZvbnRGb3JMYXlvdXRMYWJlbCk6CisgICAgICAgIChX
ZWJDb3JlOjpiYWNrZ3JvdW5kUGF0aEZvckxheW91dExhYmVsKToKKyAgICAgICAgKFdlYkNvcmU6
OmV4cGVjdGVkU2l6ZUZvckxheW91dExhYmVsKToKKyAgICAgICAgKFdlYkNvcmU6OmRyYXdMYXlv
dXRMYWJlbCk6CisgICAgICAgIChXZWJDb3JlOjpJbnNwZWN0b3JPdmVybGF5OjpkcmF3TGF5b3V0
SGF0Y2hpbmcpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6SW5zcGVjdG9yT3ZlcmxheTo6
Zm9udEZvckxheW91dExhYmVsKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6Okluc3BlY3Rv
ck92ZXJsYXk6OmJhY2tncm91bmRQYXRoRm9yTGF5b3V0TGFiZWwpOiBEZWxldGVkLgorICAgICAg
ICAoV2ViQ29yZTo6SW5zcGVjdG9yT3ZlcmxheTo6ZHJhd0xheW91dExhYmVsKTogRGVsZXRlZC4K
KyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yT3ZlcmxheS5oOgorCiAyMDIxLTEyLTA2ICBS
eWFuIEhhZGRhZCAgPHJ5YW5oYWRkYWRAYXBwbGUuY29tPgogCiAgICAgICAgIFJFR1JFU1NJT04g
KHIyODY1MDcpOiBbbWFjT1NdIE1hbnkgZmlsZSBzeXN0ZW0gYWNjZXNzIGxheW91dCB0ZXN0cyBi
ZWNhbWUgZmxha3kgZmFpbHVyZXMKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9n
IGIvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKaW5kZXggNzFiYmYxOTE5ZmRiMWYyZWE0NTU3OGNk
MzJhNTg0NzVkOGZhM2U2Yy4uZWViOTM2ZTIxYzc5ZTNhMTY4YzhiYjAxYWJmYjAxOTg0NTdmYzE1
ZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktp
dC9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0MyBAQAorMjAyMS0xMi0wNiAgUGF0cmljayBBbmdsZSAg
PHBhbmdsZUBhcHBsZS5jb20+CisKKyAgICAgICAgW0NvY29hXSBXZWIgSW5zcGVjdG9yOiBVbmlm
eSBHcmlkIG92ZXJsYXkgZHJhd2luZyBjb2RlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD0yMzM3NzMKKworICAgICAgICBSZXZpZXdlZCBieSBEZXZpbiBS
b3Vzc28uCisKKyAgICAgICAgUmVtb3ZlIHRoZSAoYWxtb3N0KSAxLXRvLTEgZHVwbGljYXRlZCBs
b2dpYyBjdXJyZW50bHkgYmVpbmcgdXNlZCB0byB0dXJuIEdyaWQgT3ZlcmxheXMgaW50byBhIGxh
eWVyIGhpZXJhcmNoeQorICAgICAgICBhbmQgaW5zdGVhZCB1c2UgYSBncmFwaGljcyBjb250ZXh0
IHRvIGRyYXcgdGhlIG92ZXJsYXlzIHN0cmFpZ2h0IGludG8gdGhlIHZpZXcgdG8gdGFrZSBhZHZh
bnRhZ2Ugb2YgdGhlIGV4aXN0aW5nCisgICAgICAgIGRyYXdpbmcgY29kZSB3ZSB1c2UgZm9yIG1h
Y09TIGluIFdlYkNvcmU6Okluc3BlY3Rvck92ZXJsYXkuIFRvIGFjY29tbW9kYXRlIHRoaXMsIHdl
IG5vdyBjb3JyZWN0bHkgc2V0IHRoZQorICAgICAgICBjb250ZW50IHNjYWxlIGZhY3RvciBvZiB0
aGUgdmlldyBpdHNlbGYgKHNvIHRoYXQgb3VyIGRyYXdpbmcgZG9lcyBub3QgYXBwZWFyIGJsdXJy
eSkgYW5kIHNldCB0aGUgZnJhbWUgb2YgdGhlCisgICAgICAgIHZpZXcgZXF1YWwgdG8gdGhlIGN1
cnJlbnQgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBwYXJlbnQgc2Nyb2xsIHZpZXcsIHdoaWNoIGhl
bHBzIHVzIHRvIGF2b2lkIGhhdmluZyBhbgorICAgICAgICBpbmNyZWRpYmx5IGxhcmdlIGdyYXBo
aWNzIGNvbnRleHQgdG8gZHJhdyBpbnRvICh3aGljaCB3ZSB3b3VsZCBpZiB0aGUgdmlldydzIGZy
YW1lIHdhcyBqdXN0IHNldCB0byBtYXRjaCB0aGUKKyAgICAgICAgZnJhbWUgb2YgdGhlIHdlYnBh
Z2UncyB2aWV3KS4gVGhpcyBmcmFtZSB3aWxsIG5vdCBhbHdheXMgYmUgdGhlIHNhbWUgc2l6ZSwg
c3VjaCBhcyB3aGVuIHpvb21pbmcgaW4gd2hlcmUgbGVzcyBvZgorICAgICAgICB0aGUgZnJhbWUg
aXMgdmlzaWJsZS4gQ29tYmluZWQgd2l0aCB0aGUgY3VycmVudCBjb250ZW50IHNjYWxlLCB0aGlz
IGFjdHVhbGx5IG1lYW5zIHRoYXQgb24gem9vbSB0aGUgZWZmZWN0aXZlCisgICAgICAgIG51bWJl
ciBvZiBwaXhlbHMgdGhhdCBuZWVkIHRvIGJlIGRyYXduIGlzIGNvbnNpc3RlbnQuCisKKyAgICAg
ICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yL2lvcy9XS0luc3BlY3RvckhpZ2hsaWdodFZpZXcuaDoK
KyAgICAgICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yL2lvcy9XS0luc3BlY3RvckhpZ2hsaWdodFZp
ZXcubW06CisgICAgICAgICgtW1dLSW5zcGVjdG9ySGlnaGxpZ2h0VmlldyBpbml0V2l0aEZyYW1l
Ol0pOgorICAgICAgICAtIEV4cGxpY2l0bHkgc2V0IHRoaXMgdmlldyB0byBiZSBub24tb3BhcXVl
IHNvIHRoYXQgcGFnZSBjb250ZW50IGNhbiBiZSBzZWVuIGJlbG93IHRoaXMgdmlldy4gVGhpcyB3
YXNuJ3QKKyAgICAgICAgcHJldmlvdXNseSBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgYm91bmRzIG9m
IHRoaXMgdmlldyB3ZXJlIGEgemVyby1yZWN0LCB3aGljaCBtZWFudCB0aGUgYmFja2dyb3VuZCB3
YXMgbmV2ZXIKKyAgICAgICAgcGFpbnRlZC4KKworICAgICAgICAoLVtXS0luc3BlY3RvckhpZ2hs
aWdodFZpZXcgX3JlbW92ZUFsbExheWVyc10pOgorICAgICAgICAoLVtXS0luc3BlY3RvckhpZ2hs
aWdodFZpZXcgX2NyZWF0ZUxheWVyczpdKToKKyAgICAgICAgLSBCZWNhdXNlIHRoZSB2aWV3J3Mg
ZnJhbWUgb3JpZ2luIGlzIG5vdyBvZmZzZXQsIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBub2RlIGhp
Z2hsaWdodCBsYXllcnMgb2Zmc2V0IGJ5IHRoZQorICAgICAgICBuZWdhdGlvbiBvZiB0aGUgZnJh
bWUncyBvcmlnaW4gc28gdGhhdCB0aGV5IHN0aWxsIGxpbmUgdXAgY29ycmVjdGx5IHdpdGggcGFn
ZSBjb250ZW50LgorCisgICAgICAgICgtW1dLSW5zcGVjdG9ySGlnaGxpZ2h0VmlldyBkcmF3UmVj
dDpdKToKKyAgICAgICAgKC1bV0tJbnNwZWN0b3JIaWdobGlnaHRWaWV3IHVwZGF0ZTpzY2FsZTpm
cmFtZTpdKToKKyAgICAgICAgKC1bV0tJbnNwZWN0b3JIaWdobGlnaHRWaWV3IF9jcmVhdGVHcmlk
T3ZlcmxheUxheWVyczpzY2FsZTpdKTogRGVsZXRlZC4KKyAgICAgICAgKGNyZWF0ZUxheW91dEhh
dGNoaW5nTGF5ZXIpOiBEZWxldGVkLgorICAgICAgICAoY3JlYXRlTGF5b3V0TGFiZWxMYXllcik6
IERlbGV0ZWQuCisgICAgICAgICgtW1dLSW5zcGVjdG9ySGlnaGxpZ2h0VmlldyBfY3JlYXRlR3Jp
ZE92ZXJsYXlMYXllcjpzY2FsZTpdKTogRGVsZXRlZC4KKyAgICAgICAgKC1bV0tJbnNwZWN0b3JI
aWdobGlnaHRWaWV3IHVwZGF0ZTpzY2FsZTpdKTogRGVsZXRlZC4KKyAgICAgICAgKiBVSVByb2Nl
c3MvaW9zL1dLQ29udGVudFZpZXcubW06CisgICAgICAgICgtW1dLQ29udGVudFZpZXcgX3Nob3dJ
bnNwZWN0b3JIaWdobGlnaHQ6XSk6CisKKwogMjAyMS0xMi0wNiAgUnlhbiBIYWRkYWQgIDxyeWFu
aGFkZGFkQGFwcGxlLmNvbT4KIAogICAgICAgICBSRUdSRVNTSU9OIChyMjg2NTA3KTogW21hY09T
XSBNYW55IGZpbGUgc3lzdGVtIGFjY2VzcyBsYXlvdXQgdGVzdHMgYmVjYW1lIGZsYWt5IGZhaWx1
cmVzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yT3Zlcmxh
eS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yT3ZlcmxheS5jcHAKaW5k
ZXggODI3ZmE1ZTMxNzc0NWQ4ODZmMTQ1M2VjOWNlOTAxYzc5NjU5Y2ZhYS4uMmEwNGYwMDA4M2Jm
YzBmM2NlYjZkM2FiZjA4N2VlODM1MmZkMTU0YiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
aW5zcGVjdG9yL0luc3BlY3Rvck92ZXJsYXkuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3Bl
Y3Rvci9JbnNwZWN0b3JPdmVybGF5LmNwcApAQCAtMTE3MCw3ICsxMTcwLDcgQEAgUGF0aCBJbnNw
ZWN0b3JPdmVybGF5OjpkcmF3RWxlbWVudFRpdGxlKEdyYXBoaWNzQ29udGV4dCYgY29udGV4dCwg
Tm9kZSYgbm9kZSwgY28KICAgICByZXR1cm4gcGF0aDsKIH0KIAotdm9pZCBJbnNwZWN0b3JPdmVy
bGF5OjpkcmF3TGF5b3V0SGF0Y2hpbmcoR3JhcGhpY3NDb250ZXh0JiBjb250ZXh0LCBGbG9hdFF1
YWQgcXVhZCkKK3N0YXRpYyB2b2lkIGRyYXdMYXlvdXRIYXRjaGluZyhHcmFwaGljc0NvbnRleHQm
IGNvbnRleHQsIEZsb2F0UXVhZCBxdWFkKQogewogICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2
ZXIgc2F2ZXIoY29udGV4dCk7CiAgICAgY29udGV4dC5jbGlwUGF0aChxdWFkVG9QYXRoKHF1YWQp
KTsKQEAgLTEyMDQsNyArMTIwNCw3IEBAIHZvaWQgSW5zcGVjdG9yT3ZlcmxheTo6ZHJhd0xheW91
dEhhdGNoaW5nKEdyYXBoaWNzQ29udGV4dCYgY29udGV4dCwgRmxvYXRRdWFkIHF1CiAgICAgY29u
dGV4dC5zdHJva2VQYXRoKGhhdGNoUGF0aCk7CiB9CiAKLUZvbnRDYXNjYWRlIEluc3BlY3Rvck92
ZXJsYXk6OmZvbnRGb3JMYXlvdXRMYWJlbCgpCitzdGF0aWMgRm9udENhc2NhZGUgZm9udEZvckxh
eW91dExhYmVsKCkKIHsKICAgICBGb250Q2FzY2FkZURlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlv
bjsKICAgICBmb250RGVzY3JpcHRpb24uc2V0RmFtaWxpZXMoeyAic3lzdGVtLXVpIiB9KTsKQEAg
LTEyMTYsNyArMTIxNiw3IEBAIEZvbnRDYXNjYWRlIEluc3BlY3Rvck92ZXJsYXk6OmZvbnRGb3JM
YXlvdXRMYWJlbCgpCiAgICAgcmV0dXJuIGZvbnQ7CiB9CiAKLVBhdGggSW5zcGVjdG9yT3Zlcmxh
eTo6YmFja2dyb3VuZFBhdGhGb3JMYXlvdXRMYWJlbChmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0
LCBJbnNwZWN0b3JPdmVybGF5OjpMYWJlbEFycm93RGlyZWN0aW9uIGFycm93RGlyZWN0aW9uLCBJ
bnNwZWN0b3JPdmVybGF5OjpMYWJlbEFycm93RWRnZVBvc2l0aW9uIGFycm93RWRnZVBvc2l0aW9u
LCBmbG9hdCBhcnJvd1NpemUpCitzdGF0aWMgUGF0aCBiYWNrZ3JvdW5kUGF0aEZvckxheW91dExh
YmVsKGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQsIEluc3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJy
b3dEaXJlY3Rpb24gYXJyb3dEaXJlY3Rpb24sIEluc3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJyb3dF
ZGdlUG9zaXRpb24gYXJyb3dFZGdlUG9zaXRpb24sIGZsb2F0IGFycm93U2l6ZSkKIHsKICAgICBQ
YXRoIHBhdGg7CiAgICAgRmxvYXRTaXplIG9mZnNldEZvckFycm93RWRnZVBvc2l0aW9uOwpAQCAt
MTM0Niw3ICsxMzQ2LDcgQEAgUGF0aCBJbnNwZWN0b3JPdmVybGF5OjpiYWNrZ3JvdW5kUGF0aEZv
ckxheW91dExhYmVsKGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQsIEkKIAogc3RhdGljIEZsb2F0
U2l6ZSBleHBlY3RlZFNpemVGb3JMYXlvdXRMYWJlbChTdHJpbmcgbGFiZWwsIEluc3BlY3Rvck92
ZXJsYXk6OkxhYmVsQXJyb3dEaXJlY3Rpb24gZGlyZWN0aW9uLCBmbG9hdCBtYXhpbXVtV2lkdGgg
PSAwKQogewotICAgIGF1dG8gZm9udCA9IEluc3BlY3Rvck92ZXJsYXk6OmZvbnRGb3JMYXlvdXRM
YWJlbCgpOworICAgIGF1dG8gZm9udCA9IGZvbnRGb3JMYXlvdXRMYWJlbCgpOwogCiAgICAgZmxv
YXQgdGV4dEhlaWdodCA9IGZvbnQuZm9udE1ldHJpY3MoKS5mbG9hdEhlaWdodCgpOwogICAgIGZs
b2F0IHRleHRXaWR0aCA9IGZvbnQud2lkdGgoVGV4dFJ1bihsYWJlbCkpOwpAQCAtMTM2Nyw5ICsx
MzY3LDkgQEAgc3RhdGljIEZsb2F0U2l6ZSBleHBlY3RlZFNpemVGb3JMYXlvdXRMYWJlbChTdHJp
bmcgbGFiZWwsIEluc3BlY3Rvck92ZXJsYXk6OkxhYmUKICAgICBSRUxFQVNFX0FTU0VSVF9OT1Rf
UkVBQ0hFRCgpOwogfQogCi12b2lkIEluc3BlY3Rvck92ZXJsYXk6OmRyYXdMYXlvdXRMYWJlbChH
cmFwaGljc0NvbnRleHQmIGNvbnRleHQsIFN0cmluZyBsYWJlbCwgRmxvYXRQb2ludCBwb2ludCwg
SW5zcGVjdG9yT3ZlcmxheTo6TGFiZWxBcnJvd0RpcmVjdGlvbiBhcnJvd0RpcmVjdGlvbiwgSW5z
cGVjdG9yT3ZlcmxheTo6TGFiZWxBcnJvd0VkZ2VQb3NpdGlvbiBhcnJvd0VkZ2VQb3NpdGlvbiwg
Q29sb3IgYmFja2dyb3VuZENvbG9yLCBmbG9hdCBtYXhpbXVtV2lkdGgpCitzdGF0aWMgdm9pZCBk
cmF3TGF5b3V0TGFiZWwoR3JhcGhpY3NDb250ZXh0JiBjb250ZXh0LCBTdHJpbmcgbGFiZWwsIEZs
b2F0UG9pbnQgcG9pbnQsIEluc3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJyb3dEaXJlY3Rpb24gYXJy
b3dEaXJlY3Rpb24sIEluc3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJyb3dFZGdlUG9zaXRpb24gYXJy
b3dFZGdlUG9zaXRpb24sIENvbG9yIGJhY2tncm91bmRDb2xvciwgZmxvYXQgbWF4aW11bVdpZHRo
ID0gMCkKIHsKLSAgICBBU1NFUlQoYXJyb3dFZGdlUG9zaXRpb24gIT0gTGFiZWxBcnJvd0VkZ2VQ
b3NpdGlvbjo6Tm9uZSB8fCBhcnJvd0RpcmVjdGlvbiA9PSBMYWJlbEFycm93RGlyZWN0aW9uOjpO
b25lKTsKKyAgICBBU1NFUlQoYXJyb3dFZGdlUG9zaXRpb24gIT0gSW5zcGVjdG9yT3ZlcmxheTo6
TGFiZWxBcnJvd0VkZ2VQb3NpdGlvbjo6Tm9uZSB8fCBhcnJvd0RpcmVjdGlvbiA9PSBJbnNwZWN0
b3JPdmVybGF5OjpMYWJlbEFycm93RGlyZWN0aW9uOjpOb25lKTsKIAogICAgIEdyYXBoaWNzQ29u
dGV4dFN0YXRlU2F2ZXIgc2F2ZXIoY29udGV4dCk7CiAgICAgCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yT3ZlcmxheS5oIGIvU291cmNlL1dlYkNvcmUvaW5z
cGVjdG9yL0luc3BlY3Rvck92ZXJsYXkuaAppbmRleCBhNzM5YTVjODViNWJkOWM5ODg1N2Q2ZmE2
OWU5MmIzNThlYjEzOGZjLi44NGY4OTIxNzY2MjlmNTIwM2Y4OTBkMTVhZWU4NmI5MzE0ZGNjZjQ2
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yT3ZlcmxheS5o
CisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JPdmVybGF5LmgKQEAgLTIx
OCw4ICsyMTgsNyBAQCBwdWJsaWM6CiAgICAgSW5zcGVjdG9yOjpFcnJvclN0cmluZ09yPHZvaWQ+
IGNsZWFyR3JpZE92ZXJsYXlGb3JOb2RlKE5vZGUmKTsKICAgICB2b2lkIGNsZWFyQWxsR3JpZE92
ZXJsYXlzKCk7CiAKLSAgICBXRUJDT1JFX0VYUE9SVCBzdGF0aWMgRm9udENhc2NhZGUgZm9udEZv
ckxheW91dExhYmVsKCk7Ci0gICAgV0VCQ09SRV9FWFBPUlQgc3RhdGljIFBhdGggYmFja2dyb3Vu
ZFBhdGhGb3JMYXlvdXRMYWJlbChmbG9hdCwgZmxvYXQsIEluc3BlY3Rvck92ZXJsYXk6OkxhYmVs
QXJyb3dEaXJlY3Rpb24sIEluc3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJyb3dFZGdlUG9zaXRpb24s
IGZsb2F0IGFycm93U2l6ZSk7CisgICAgV0VCQ09SRV9FWFBPUlQgc3RhdGljIHZvaWQgZHJhd0dy
aWRPdmVybGF5KEdyYXBoaWNzQ29udGV4dCYsIGNvbnN0IEluc3BlY3Rvck92ZXJsYXk6OkhpZ2hs
aWdodDo6R3JpZEhpZ2hsaWdodE92ZXJsYXkmKTsKIHByaXZhdGU6CiAgICAgdXNpbmcgVGltZVJl
Y3RQYWlyID0gc3RkOjpwYWlyPE1vbm90b25pY1RpbWUsIEZsb2F0UmVjdD47CiAKQEAgLTIzNiwx
MCArMjM1LDYgQEAgcHJpdmF0ZToKIAogICAgIFBhdGggZHJhd0VsZW1lbnRUaXRsZShHcmFwaGlj
c0NvbnRleHQmLCBOb2RlJiwgY29uc3QgSGlnaGxpZ2h0OjpCb3VuZHMmKTsKICAgICAKLSAgICB2
b2lkIGRyYXdMYXlvdXRIYXRjaGluZyhHcmFwaGljc0NvbnRleHQmLCBGbG9hdFF1YWQpOwotICAg
IHZvaWQgZHJhd0xheW91dExhYmVsKEdyYXBoaWNzQ29udGV4dCYsIFN0cmluZywgRmxvYXRQb2lu
dCwgTGFiZWxBcnJvd0RpcmVjdGlvbiwgSW5zcGVjdG9yT3ZlcmxheTo6TGFiZWxBcnJvd0VkZ2VQ
b3NpdGlvbiwgQ29sb3IgYmFja2dyb3VuZENvbG9yID0gQ29sb3I6OndoaXRlLCBmbG9hdCBtYXhp
bXVtV2lkdGggPSAwKTsKLQotICAgIHZvaWQgZHJhd0dyaWRPdmVybGF5KEdyYXBoaWNzQ29udGV4
dCYsIGNvbnN0IEluc3BlY3Rvck92ZXJsYXk6OkhpZ2hsaWdodDo6R3JpZEhpZ2hsaWdodE92ZXJs
YXkmKTsKICAgICBzdGQ6Om9wdGlvbmFsPEluc3BlY3Rvck92ZXJsYXk6OkhpZ2hsaWdodDo6R3Jp
ZEhpZ2hsaWdodE92ZXJsYXk+IGJ1aWxkR3JpZE92ZXJsYXkoY29uc3QgSW5zcGVjdG9yT3Zlcmxh
eTo6R3JpZCYsIGJvb2wgb2Zmc2V0Qm91bmRzQnlTY3JvbGwgPSBmYWxzZSk7CiAKICAgICB2b2lk
IHVwZGF0ZVBhaW50UmVjdHNUaW1lckZpcmVkKCk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0
L1VJUHJvY2Vzcy9JbnNwZWN0b3IvaW9zL1dLSW5zcGVjdG9ySGlnaGxpZ2h0Vmlldy5oIGIvU291
cmNlL1dlYktpdC9VSVByb2Nlc3MvSW5zcGVjdG9yL2lvcy9XS0luc3BlY3RvckhpZ2hsaWdodFZp
ZXcuaAppbmRleCBhOTM2OWY5NjdlOTU3OGZhNTU0ODFkYTYwN2MzMjJkYTE1NWRiNWIwLi5lYzNm
ZmY1MDlmMDQ0ZTdiNGNkNzc0NDNiOWYzYmIyMTgxMDMwNGI0IDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViS2l0L1VJUHJvY2Vzcy9JbnNwZWN0b3IvaW9zL1dLSW5zcGVjdG9ySGlnaGxpZ2h0Vmlldy5o
CisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL0luc3BlY3Rvci9pb3MvV0tJbnNwZWN0b3JI
aWdobGlnaHRWaWV3LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE0
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxNCwg
MjAyMSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKQEAgLTI4LDExICsyOCwxNSBAQAogI2ltcG9ydCA8VUlLaXQvVUlLaXQuaD4K
ICNpbXBvcnQgPFdlYkNvcmUvSW5zcGVjdG9yT3ZlcmxheS5oPgogCituYW1lc3BhY2UgV2ViQ29y
ZSB7CitjbGFzcyBGbG9hdFJlY3Q7Cit9CisKIEBpbnRlcmZhY2UgV0tJbnNwZWN0b3JIaWdobGln
aHRWaWV3IDogVUlWaWV3IHsKICAgICBSZXRhaW5QdHI8TlNNdXRhYmxlQXJyYXk8Q0FTaGFwZUxh
eWVyICo+PiBfbGF5ZXJzOwotICAgIFJldGFpblB0cjxOU011dGFibGVBcnJheTxDQUxheWVyICo+
PiBfZ3JpZE92ZXJsYXlMYXllcnM7CisgICAgc3RkOjpvcHRpb25hbDxXZWJDb3JlOjpJbnNwZWN0
b3JPdmVybGF5OjpIaWdobGlnaHQ+IF9oaWdobGlnaHQ7CiB9Ci0tICh2b2lkKXVwZGF0ZTooY29u
c3QgV2ViQ29yZTo6SW5zcGVjdG9yT3ZlcmxheTo6SGlnaGxpZ2h0JiloaWdobGlnaHQgc2NhbGU6
KGRvdWJsZSlzY2FsZTsKKy0gKHZvaWQpdXBkYXRlOihjb25zdCBXZWJDb3JlOjpJbnNwZWN0b3JP
dmVybGF5OjpIaWdobGlnaHQmKWhpZ2hsaWdodCBzY2FsZTooZG91YmxlKXNjYWxlIGZyYW1lOihj
b25zdCBXZWJDb3JlOjpGbG9hdFJlY3QmKWZyYW1lOwogQGVuZAogCiAjZW5kaWYKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL0luc3BlY3Rvci9pb3MvV0tJbnNwZWN0b3JIaWdo
bGlnaHRWaWV3Lm1tIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvSW5zcGVjdG9yL2lvcy9XS0lu
c3BlY3RvckhpZ2hsaWdodFZpZXcubW0KaW5kZXggNjk2NDJlNjRlYzJlYWJkYzc0OTNiZjg5ZWQ2
ZjNhMGRlMzUwZWQ2Ny4uMzg3NTI0ODMxMzNkOGQ5MTVhZmY3OTY5M2Y5NmUxYTg2ZjVjYzA5NiAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvSW5zcGVjdG9yL2lvcy9XS0luc3Bl
Y3RvckhpZ2hsaWdodFZpZXcubW0KKysrIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvSW5zcGVj
dG9yL2lvcy9XS0luc3BlY3RvckhpZ2hsaWdodFZpZXcubW0KQEAgLTEsNSArMSw1IEBACiAvKgot
ICogQ29weXJpZ2h0IChDKSAyMDE0IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
IENvcHlyaWdodCAoQykgMjAxNCwgMjAyMSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI4LDEyICsyOCwxMCBAQAogCiAj
aWYgUExBVEZPUk0oSU9TX0ZBTUlMWSkKIAotI2ltcG9ydCA8V2ViQ29yZS9GbG9hdExpbmUuaD4K
ICNpbXBvcnQgPFdlYkNvcmUvRmxvYXRRdWFkLmg+Ci0jaW1wb3J0IDxXZWJDb3JlL0ZvbnRDYXNj
YWRlLmg+Ci0jaW1wb3J0IDxXZWJDb3JlL0ZvbnRDYXNjYWRlRGVzY3JpcHRpb24uaD4KKyNpbXBv
cnQgPFdlYkNvcmUvRmxvYXRSZWN0Lmg+CiAjaW1wb3J0IDxXZWJDb3JlL0dlb21ldHJ5VXRpbGl0
aWVzLmg+Ci0jaW1wb3J0IDxXZWJDb3JlL1RleHRSdW4uaD4KKyNpbXBvcnQgPFdlYkNvcmUvR3Jh
cGhpY3NDb250ZXh0Q0cuaD4KIAogQGltcGxlbWVudGF0aW9uIFdLSW5zcGVjdG9ySGlnaGxpZ2h0
VmlldwogCkBAIC00Miw3ICs0MCw3IEBACiAgICAgaWYgKCEoc2VsZiA9IFtzdXBlciBpbml0V2l0
aEZyYW1lOmZyYW1lXSkpCiAgICAgICAgIHJldHVybiBuaWw7CiAgICAgX2xheWVycyA9IGFkb3B0
TlMoW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdF0pOwotICAgIF9ncmlkT3ZlcmxheUxheWVy
cyA9IGFkb3B0TlMoW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdF0pOworICAgIHNlbGYub3Bh
cXVlID0gTk87CiAgICAgcmV0dXJuIHNlbGY7CiB9CiAKQEAgLTU3LDkgKzU1LDYgQEAKICAgICBm
b3IgKENBU2hhcGVMYXllciAqbGF5ZXIgaW4gX2xheWVycy5nZXQoKSkKICAgICAgICAgW2xheWVy
IHJlbW92ZUZyb21TdXBlcmxheWVyXTsKICAgICBbX2xheWVycyByZW1vdmVBbGxPYmplY3RzXTsK
LSAgICBmb3IgKENBTGF5ZXIgKmxheWVyIGluIF9ncmlkT3ZlcmxheUxheWVycy5nZXQoKSkKLSAg
ICAgICAgW2xheWVyIHJlbW92ZUZyb21TdXBlcmxheWVyXTsKLSAgICBbX2dyaWRPdmVybGF5TGF5
ZXJzIHJlbW92ZUFsbE9iamVjdHNdOwogfQogCiAtICh2b2lkKV9jcmVhdGVMYXllcnM6KE5TVUlu
dGVnZXIpbnVtTGF5ZXJzCkBAIC02OSw2ICs2NCw3IEBACiAKICAgICBmb3IgKE5TVUludGVnZXIg
aSA9IDA7IGkgPCBudW1MYXllcnM7ICsraSkgewogICAgICAgICBhdXRvIGxheWVyID0gYWRvcHRO
UyhbW0NBU2hhcGVMYXllciBhbGxvY10gaW5pdF0pOworICAgICAgICBsYXllci5nZXQoKS5wb3Np
dGlvbiA9IENHUG9pbnRNYWtlKC1zZWxmLmZyYW1lLm9yaWdpbi54LCAtc2VsZi5mcmFtZS5vcmln
aW4ueSk7CiAgICAgICAgIFtfbGF5ZXJzIGFkZE9iamVjdDpsYXllci5nZXQoKV07CiAgICAgICAg
IFtzZWxmLmxheWVyIGFkZFN1YmxheWVyOmxheWVyLmdldCgpXTsKICAgICB9CkBAIC0yNjgsMjIw
ICsyNjQsMzYgQEAgc3RhdGljIHZvaWQgbGF5ZXJQYXRoKENBU2hhcGVMYXllciAqbGF5ZXIsIGNv
bnN0IFdlYkNvcmU6OkZsb2F0UXVhZCYgb3V0ZXJRdWFkKQogICAgIH0KIH0KIAotLSAodm9pZClf
Y3JlYXRlR3JpZE92ZXJsYXlMYXllcnM6KGNvbnN0IFdlYkNvcmU6Okluc3BlY3Rvck92ZXJsYXk6
OkhpZ2hsaWdodCYpaGlnaGxpZ2h0IHNjYWxlOihkb3VibGUpc2NhbGUKLXsKLSAgICBmb3IgKGF1
dG8gZ3JpZE92ZXJsYXkgOiBoaWdobGlnaHQuZ3JpZEhpZ2hsaWdodE92ZXJsYXlzKSB7Ci0gICAg
ICAgIGF1dG8gbGF5ZXIgPSBbc2VsZiBfY3JlYXRlR3JpZE92ZXJsYXlMYXllcjpncmlkT3Zlcmxh
eSBzY2FsZTpzY2FsZV07Ci0gICAgICAgIFtfZ3JpZE92ZXJsYXlMYXllcnMgYWRkT2JqZWN0Omxh
eWVyXTsKLSAgICAgICAgW3NlbGYubGF5ZXIgYWRkU3VibGF5ZXI6bGF5ZXJdOwotICAgIH0KLX0K
LQotc3RhdGljIENBTGF5ZXIgKiBjcmVhdGVMYXlvdXRIYXRjaGluZ0xheWVyKFdlYkNvcmU6OkZs
b2F0UXVhZCBxdWFkLCBXZWJDb3JlOjpDb2xvciBzdHJva2VDb2xvcikKLXsKLSAgICBDQVNoYXBl
TGF5ZXIgKmxheWVyID0gW0NBU2hhcGVMYXllciBsYXllcl07Ci0KLSAgICBjb25zdGV4cHIgYXV0
byBoYXRjaFNwYWNpbmcgPSAxMjsKLSAgICBhdXRvIGhhdGNoUGF0aCA9IGFkb3B0Q0YoQ0dQYXRo
Q3JlYXRlTXV0YWJsZSgpKTsKLQotICAgIFdlYkNvcmU6OkZsb2F0TGluZSB0b3BTaWRlID0geyBx
dWFkLnAxKCksIHF1YWQucDIoKSB9OwotICAgIFdlYkNvcmU6OkZsb2F0TGluZSBsZWZ0U2lkZSA9
IHsgcXVhZC5wMSgpLCBxdWFkLnA0KCkgfTsKLQotICAgIC8vIFRoZSBvcHBvc2l0ZSBheGlzJyBs
ZW5ndGggaXMgdXNlZCB0byBkZXRlcm1pbmUgaG93IGZhciB0byBkcmF3IGEgaGF0Y2ggbGluZSBp
biBib3RoIGRpbWVuc2lvbnMsIHdoaWNoIGtlZXBzIHRoZSBsaW5lcyBhdCBhIDQ1ZGVnIGFuZ2xl
LgotICAgIGlmICh0b3BTaWRlLmxlbmd0aCgpID4gbGVmdFNpZGUubGVuZ3RoKCkpIHsKLSAgICAg
ICAgV2ViQ29yZTo6RmxvYXRMaW5lIGJvdHRvbVNpZGUgPSB7IHF1YWQucDQoKSwgcXVhZC5wMygp
IH07Ci0gICAgICAgIC8vIE1vdmUgYWNyb3NzIHRoZSByZWxhdGl2ZSB0b3Agb2YgdGhlIHF1YWQs
IHN0YXJ0aW5nIGxlZnQgb2YgYDAsIDBgIHRvIGVuc3VyZSB0aGF0IHRoZSB0YWlsIG9mIHRoZSBw
cmV2aW91cyBoYXRjaCBsaW5lIGlzIGRyYXduIHdoaWxlIHNjcm9sbGluZy4KLSAgICAgICAgZm9y
IChmbG9hdCB4ID0gLWxlZnRTaWRlLmxlbmd0aCgpOyB4IDwgdG9wU2lkZS5sZW5ndGgoKTsgeCAr
PSBoYXRjaFNwYWNpbmcpIHsKLSAgICAgICAgICAgIGF1dG8gc3RhcnRQb2ludCA9IHRvcFNpZGUu
cG9pbnRBdEFic29sdXRlRGlzdGFuY2UoeCk7Ci0gICAgICAgICAgICBhdXRvIGVuZFBvaW50ID0g
Ym90dG9tU2lkZS5wb2ludEF0QWJzb2x1dGVEaXN0YW5jZSh4ICsgbGVmdFNpZGUubGVuZ3RoKCkp
OwotICAgICAgICAgICAgQ0dQYXRoTW92ZVRvUG9pbnQoaGF0Y2hQYXRoLmdldCgpLCAwLCBzdGFy
dFBvaW50LngoKSwgc3RhcnRQb2ludC55KCkpOwotICAgICAgICAgICAgQ0dQYXRoQWRkTGluZVRv
UG9pbnQoaGF0Y2hQYXRoLmdldCgpLCAwLCBlbmRQb2ludC54KCksIGVuZFBvaW50LnkoKSk7Ci0g
ICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBXZWJDb3JlOjpGbG9hdExpbmUgcmlnaHRT
aWRlID0geyBxdWFkLnAyKCksIHF1YWQucDMoKSB9OwotICAgICAgICAvLyBNb3ZlIGRvd24gdGhl
IHJlbGF0aXZlIGxlZnQgc2lkZSBvZiB0aGUgcXVhZCwgc3RhcnRpbmcgYWJvdmUgYDAsIDBgIHRv
IGVuc3VyZSB0aGF0IHRoZSB0YWlsIG9mIHRoZSBwcmV2aW91cyBoYXRjaCBsaW5lIGlzIGRyYXdu
IHdoaWxlIHNjcm9sbGluZy4KLSAgICAgICAgZm9yIChmbG9hdCB5ID0gLXRvcFNpZGUubGVuZ3Ro
KCk7IHkgPCBsZWZ0U2lkZS5sZW5ndGgoKTsgeSArPSBoYXRjaFNwYWNpbmcpIHsKLSAgICAgICAg
ICAgIGF1dG8gc3RhcnRQb2ludCA9IGxlZnRTaWRlLnBvaW50QXRBYnNvbHV0ZURpc3RhbmNlKHkp
OwotICAgICAgICAgICAgYXV0byBlbmRQb2ludCA9IHJpZ2h0U2lkZS5wb2ludEF0QWJzb2x1dGVE
aXN0YW5jZSh5ICsgdG9wU2lkZS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBDR1BhdGhNb3ZlVG9Q
b2ludChoYXRjaFBhdGguZ2V0KCksIDAsIHN0YXJ0UG9pbnQueCgpLCBzdGFydFBvaW50LnkoKSk7
Ci0gICAgICAgICAgICBDR1BhdGhBZGRMaW5lVG9Qb2ludChoYXRjaFBhdGguZ2V0KCksIDAsIGVu
ZFBvaW50LngoKSwgZW5kUG9pbnQueSgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBsYXllci5w
YXRoID0gaGF0Y2hQYXRoLmdldCgpOwotICAgIGxheWVyLnN0cm9rZUNvbG9yID0gY2FjaGVkQ0dD
b2xvcihzdHJva2VDb2xvcikuZ2V0KCk7Ci0gICAgbGF5ZXIubGluZVdpZHRoID0gMC41OwotICAg
IGxheWVyLmxpbmVEYXNoUGF0dGVybiA9IEBbW05TTnVtYmVyIG51bWJlcldpdGhJbnQ6Ml0sIFtO
U051bWJlciBudW1iZXJXaXRoSW50OjJdXTsKLQotICAgIENBU2hhcGVMYXllciAqbWFza0xheWVy
ID0gW0NBU2hhcGVMYXllciBsYXllcl07Ci0gICAgbGF5ZXJQYXRoKG1hc2tMYXllciwgcXVhZCk7
Ci0gICAgbGF5ZXIubWFzayA9IG1hc2tMYXllcjsKLSAgICByZXR1cm4gbGF5ZXI7Ci19Ci0KLXN0
YXRpYyBDQUxheWVyICogY3JlYXRlTGF5b3V0TGFiZWxMYXllcihTdHJpbmcgbGFiZWwsIFdlYkNv
cmU6OkZsb2F0UG9pbnQgcG9pbnQsIFdlYkNvcmU6Okluc3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJy
b3dEaXJlY3Rpb24gYXJyb3dEaXJlY3Rpb24sIFdlYkNvcmU6Okluc3BlY3Rvck92ZXJsYXk6Okxh
YmVsQXJyb3dFZGdlUG9zaXRpb24gYXJyb3dFZGdlUG9zaXRpb24sIFdlYkNvcmU6OkNvbG9yIGJh
Y2tncm91bmRDb2xvciwgV2ViQ29yZTo6Q29sb3Igc3Ryb2tlQ29sb3IsIGRvdWJsZSBzY2FsZSwg
ZmxvYXQgbWF4aW11bVdpZHRoID0gMCkKKy0gKHZvaWQpZHJhd1JlY3Q6KENHUmVjdClkaXJ0eVJl
Y3QKIHsKLSAgICBhdXRvIGZvbnQgPSBXZWJDb3JlOjpJbnNwZWN0b3JPdmVybGF5Ojpmb250Rm9y
TGF5b3V0TGFiZWwoKTsKLQotICAgIGNvbnN0ZXhwciBhdXRvIHBhZGRpbmcgPSA0OwotICAgIGNv
bnN0ZXhwciBhdXRvIGFycm93U2l6ZSA9IDY7Ci0gICAgZmxvYXQgdGV4dEhlaWdodCA9IGZvbnQu
Zm9udE1ldHJpY3MoKS5mbG9hdEhlaWdodCgpOwotCi0gICAgZmxvYXQgdGV4dFdpZHRoID0gZm9u
dC53aWR0aChXZWJDb3JlOjpUZXh0UnVuKGxhYmVsKSk7Ci0gICAgaWYgKG1heGltdW1XaWR0aCAm
JiB0ZXh0V2lkdGggKyAocGFkZGluZyAqIDIpID4gbWF4aW11bVdpZHRoKSB7Ci0gICAgICAgIGxh
YmVsLmFwcGVuZCgiLi4uIl9zKTsKLSAgICAgICAgd2hpbGUgKHRleHRXaWR0aCArIChwYWRkaW5n
ICogMikgPiBtYXhpbXVtV2lkdGggJiYgbGFiZWwubGVuZ3RoKCkgPj0gNCkgewotICAgICAgICAg
ICAgLy8gUmVtb3ZlIHRoZSBmb3VydGggZnJvbSBsYXN0IGNoYXJhY3RlciAodGhlIGNoYXJhY3Rl
ciBiZWZvcmUgdGhlIGVsbGlwc2lzKSBhbmQgcmVtZWFzdXJlLgotICAgICAgICAgICAgbGFiZWwu
cmVtb3ZlKGxhYmVsLmxlbmd0aCgpIC0gNCk7Ci0gICAgICAgICAgICB0ZXh0V2lkdGggPSBmb250
LndpZHRoKFdlYkNvcmU6OlRleHRSdW4obGFiZWwpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAg
IC8vIE5vdGU6IEltcGxlbWVudGF0aW9uIERpZmZlcmVuY2UgLSBUaGUgdGV4dFBvc2l0aW9uIGlz
IHRoZSBjZW50ZXIgb2YgdGV4dCwgdW5saWtlIFdlYkNvcmU6Okluc3BlY3Rvck92ZXJsYXksIHdo
ZXJlIHRoZSB0ZXh0UG9zaXRpb24gaXMgbGVmdG1vc3QgcG9pbnQgb24gdGhlIGJhc2VsaW5lIG9m
IHRoZSB0ZXh0LgotICAgIFdlYkNvcmU6OkZsb2F0UG9pbnQgdGV4dFBvc2l0aW9uOwotICAgIHN3
aXRjaCAoYXJyb3dEaXJlY3Rpb24pIHsKLSAgICBjYXNlIFdlYkNvcmU6Okluc3BlY3Rvck92ZXJs
YXk6OkxhYmVsQXJyb3dEaXJlY3Rpb246OkRvd246Ci0gICAgICAgIHN3aXRjaCAoYXJyb3dFZGdl
UG9zaXRpb24pIHsKLSAgICAgICAgY2FzZSBXZWJDb3JlOjpJbnNwZWN0b3JPdmVybGF5OjpMYWJl
bEFycm93RWRnZVBvc2l0aW9uOjpMZWFkaW5nOgotICAgICAgICAgICAgdGV4dFBvc2l0aW9uID0g
V2ViQ29yZTo6RmxvYXRQb2ludCgodGV4dFdpZHRoIC8gMikgKyBwYWRkaW5nLCAtKHRleHRIZWln
aHQgLyAyKSAtIGFycm93U2l6ZSAtIHBhZGRpbmcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGNhc2UgV2ViQ29yZTo6SW5zcGVjdG9yT3ZlcmxheTo6TGFiZWxBcnJvd0VkZ2VQb3NpdGlv
bjo6TWlkZGxlOgotICAgICAgICAgICAgdGV4dFBvc2l0aW9uID0gV2ViQ29yZTo6RmxvYXRQb2lu
dCgwLCAtKHRleHRIZWlnaHQgLyAyKSAtIGFycm93U2l6ZSAtIHBhZGRpbmcpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgV2ViQ29yZTo6SW5zcGVjdG9yT3ZlcmxheTo6TGFiZWxB
cnJvd0VkZ2VQb3NpdGlvbjo6VHJhaWxpbmc6Ci0gICAgICAgICAgICB0ZXh0UG9zaXRpb24gPSBX
ZWJDb3JlOjpGbG9hdFBvaW50KC0odGV4dFdpZHRoIC8gMikgLSBwYWRkaW5nLCAtKHRleHRIZWln
aHQgLyAyKSAtIGFycm93U2l6ZSAtIHBhZGRpbmcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGNhc2UgV2ViQ29yZTo6SW5zcGVjdG9yT3ZlcmxheTo6TGFiZWxBcnJvd0VkZ2VQb3NpdGlv
bjo6Tm9uZToKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwot
ICAgIGNhc2UgV2ViQ29yZTo6SW5zcGVjdG9yT3ZlcmxheTo6TGFiZWxBcnJvd0RpcmVjdGlvbjo6
VXA6Ci0gICAgICAgIHN3aXRjaCAoYXJyb3dFZGdlUG9zaXRpb24pIHsKLSAgICAgICAgY2FzZSBX
ZWJDb3JlOjpJbnNwZWN0b3JPdmVybGF5OjpMYWJlbEFycm93RWRnZVBvc2l0aW9uOjpMZWFkaW5n
OgotICAgICAgICAgICAgdGV4dFBvc2l0aW9uID0gV2ViQ29yZTo6RmxvYXRQb2ludCgodGV4dFdp
ZHRoIC8gMikgKyBwYWRkaW5nLCAodGV4dEhlaWdodCAvIDIpICsgYXJyb3dTaXplICsgcGFkZGlu
Zyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBXZWJDb3JlOjpJbnNwZWN0b3JP
dmVybGF5OjpMYWJlbEFycm93RWRnZVBvc2l0aW9uOjpNaWRkbGU6Ci0gICAgICAgICAgICB0ZXh0
UG9zaXRpb24gPSBXZWJDb3JlOjpGbG9hdFBvaW50KDAsICh0ZXh0SGVpZ2h0IC8gMikgKyBhcnJv
d1NpemUgKyBwYWRkaW5nKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFdlYkNv
cmU6Okluc3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJyb3dFZGdlUG9zaXRpb246OlRyYWlsaW5nOgot
ICAgICAgICAgICAgdGV4dFBvc2l0aW9uID0gV2ViQ29yZTo6RmxvYXRQb2ludCgtKHRleHRXaWR0
aCAvIDIpIC0gcGFkZGluZywgKHRleHRIZWlnaHQgLyAyKSArIGFycm93U2l6ZSArIHBhZGRpbmcp
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgV2ViQ29yZTo6SW5zcGVjdG9yT3Zl
cmxheTo6TGFiZWxBcnJvd0VkZ2VQb3NpdGlvbjo6Tm9uZToKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgV2ViQ29yZTo6SW5zcGVjdG9yT3Zl
cmxheTo6TGFiZWxBcnJvd0RpcmVjdGlvbjo6UmlnaHQ6Ci0gICAgICAgIHN3aXRjaCAoYXJyb3dF
ZGdlUG9zaXRpb24pIHsKLSAgICAgICAgY2FzZSBXZWJDb3JlOjpJbnNwZWN0b3JPdmVybGF5OjpM
YWJlbEFycm93RWRnZVBvc2l0aW9uOjpMZWFkaW5nOgotICAgICAgICAgICAgdGV4dFBvc2l0aW9u
ID0gV2ViQ29yZTo6RmxvYXRQb2ludCgtKHRleHRXaWR0aCAvIDIpIC0gYXJyb3dTaXplIC0gcGFk
ZGluZywgKHRleHRIZWlnaHQgLyAyKSArIHBhZGRpbmcpOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGNhc2UgV2ViQ29yZTo6SW5zcGVjdG9yT3ZlcmxheTo6TGFiZWxBcnJvd0VkZ2VQb3Np
dGlvbjo6TWlkZGxlOgotICAgICAgICAgICAgdGV4dFBvc2l0aW9uID0gV2ViQ29yZTo6RmxvYXRQ
b2ludCgtKHRleHRXaWR0aCAvIDIpIC0gYXJyb3dTaXplIC0gcGFkZGluZywgMCk7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgY2FzZSBXZWJDb3JlOjpJbnNwZWN0b3JPdmVybGF5OjpMYWJl
bEFycm93RWRnZVBvc2l0aW9uOjpUcmFpbGluZzoKLSAgICAgICAgICAgIHRleHRQb3NpdGlvbiA9
IFdlYkNvcmU6OkZsb2F0UG9pbnQoLSh0ZXh0V2lkdGggLyAyKSAtIGFycm93U2l6ZSAtIHBhZGRp
bmcsIC0odGV4dEhlaWdodCAvIDIpIC0gcGFkZGluZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgY2FzZSBXZWJDb3JlOjpJbnNwZWN0b3JPdmVybGF5OjpMYWJlbEFycm93RWRnZVBvc2l0
aW9uOjpOb25lOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7
Ci0gICAgY2FzZSBXZWJDb3JlOjpJbnNwZWN0b3JPdmVybGF5OjpMYWJlbEFycm93RGlyZWN0aW9u
OjpMZWZ0OgotICAgICAgICBzd2l0Y2ggKGFycm93RWRnZVBvc2l0aW9uKSB7Ci0gICAgICAgIGNh
c2UgV2ViQ29yZTo6SW5zcGVjdG9yT3ZlcmxheTo6TGFiZWxBcnJvd0VkZ2VQb3NpdGlvbjo6TGVh
ZGluZzoKLSAgICAgICAgICAgIHRleHRQb3NpdGlvbiA9IFdlYkNvcmU6OkZsb2F0UG9pbnQoKHRl
eHRXaWR0aCAvIDIpICsgYXJyb3dTaXplICsgcGFkZGluZywgKHRleHRIZWlnaHQgLyAyKSArIHBh
ZGRpbmcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgV2ViQ29yZTo6SW5zcGVj
dG9yT3ZlcmxheTo6TGFiZWxBcnJvd0VkZ2VQb3NpdGlvbjo6TWlkZGxlOgotICAgICAgICAgICAg
dGV4dFBvc2l0aW9uID0gV2ViQ29yZTo6RmxvYXRQb2ludCgodGV4dFdpZHRoIC8gMikgKyBhcnJv
d1NpemUgKyBwYWRkaW5nLCAwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFdl
YkNvcmU6Okluc3BlY3Rvck92ZXJsYXk6OkxhYmVsQXJyb3dFZGdlUG9zaXRpb246OlRyYWlsaW5n
OgotICAgICAgICAgICAgdGV4dFBvc2l0aW9uID0gV2ViQ29yZTo6RmxvYXRQb2ludCgodGV4dFdp
ZHRoIC8gMikgKyBhcnJvd1NpemUgKyBwYWRkaW5nLCAtKHRleHRIZWlnaHQgLyAyKSAtIHBhZGRp
bmcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgV2ViQ29yZTo6SW5zcGVjdG9y
T3ZlcmxheTo6TGFiZWxBcnJvd0VkZ2VQb3NpdGlvbjo6Tm9uZToKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgV2ViQ29yZTo6SW5zcGVjdG9y
T3ZlcmxheTo6TGFiZWxBcnJvd0RpcmVjdGlvbjo6Tm9uZToKLSAgICAgICAgLy8gVGV4dCBwb3Np
dGlvbiB3aWxsIHJlbWFpbiAoMCwgMCkuCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIENB
TGF5ZXIgKmxheWVyID0gW0NBTGF5ZXIgbGF5ZXJdOworICAgIFtzdXBlciBkcmF3UmVjdDpkaXJ0
eVJlY3RdOwogCi0jaWYgVVNFKENHKQotICAgIC8vIFdlYkNvcmU6OlBhdGg6OlBsYXRmb3JtUGF0
aFB0ciBpcyBvbmx5IGEgQ0dQYXRoKiB3aGVuIGBVU0UoQ0cpYCBpcyB0cnVlLgotICAgIGF1dG8g
bGFiZWxQYXRoID0gV2ViQ29yZTo6SW5zcGVjdG9yT3ZlcmxheTo6YmFja2dyb3VuZFBhdGhGb3JM
YXlvdXRMYWJlbCh0ZXh0V2lkdGggKyAocGFkZGluZyAqIDIpLCB0ZXh0SGVpZ2h0ICsgKHBhZGRp
bmcgKiAyKSwgYXJyb3dEaXJlY3Rpb24sIGFycm93RWRnZVBvc2l0aW9uLCBhcnJvd1NpemUpOwot
ICAgIENHUGF0aCogcGxhdGZvcm1MYWJlbFBhdGggPSBsYWJlbFBhdGguZW5zdXJlUGxhdGZvcm1Q
YXRoKCk7Ci0KLSAgICBDQVNoYXBlTGF5ZXIgKmxhYmVsUGF0aExheWVyID0gW0NBU2hhcGVMYXll
ciBsYXllcl07Ci0gICAgbGFiZWxQYXRoTGF5ZXIucGF0aCA9IHBsYXRmb3JtTGFiZWxQYXRoOwot
ICAgIGxhYmVsUGF0aExheWVyLmZpbGxDb2xvciA9IGNhY2hlZENHQ29sb3IoYmFja2dyb3VuZENv
bG9yKS5nZXQoKTsKLSAgICBsYWJlbFBhdGhMYXllci5zdHJva2VDb2xvciA9IGNhY2hlZENHQ29s
b3Ioc3Ryb2tlQ29sb3IpLmdldCgpOwotICAgIGxhYmVsUGF0aExheWVyLnBvc2l0aW9uID0gQ0dQ
b2ludE1ha2UocG9pbnQueCgpLCBwb2ludC55KCkpOwotICAgIFtsYXllciBhZGRTdWJsYXllcjps
YWJlbFBhdGhMYXllcl07Ci0jZW5kaWYKLQotICAgIENBVGV4dExheWVyICp0ZXh0TGF5ZXIgPSBb
Q0FUZXh0TGF5ZXIgbGF5ZXJdOwotICAgIHRleHRMYXllci5mcmFtZSA9IENHUmVjdE1ha2UoMCwg
MCwgdGV4dFdpZHRoLCB0ZXh0SGVpZ2h0KTsKLSAgICB0ZXh0TGF5ZXIuc3RyaW5nID0gbGFiZWw7
Ci0gICAgdGV4dExheWVyLmZvbnQgPSBmb250LnByaW1hcnlGb250KCkuZ2V0Q1RGb250KCk7Ci0g
ICAgdGV4dExheWVyLmZvbnRTaXplID0gMTI7Ci0gICAgdGV4dExheWVyLmFsaWdubWVudE1vZGUg
PSBrQ0FBbGlnbm1lbnRMZWZ0OwotICAgIHRleHRMYXllci5mb3JlZ3JvdW5kQ29sb3IgPSBDR0Nv
bG9yR2V0Q29uc3RhbnRDb2xvcihrQ0dDb2xvckJsYWNrKTsKLSAgICB0ZXh0TGF5ZXIucG9zaXRp
b24gPSBDR1BvaW50TWFrZSh0ZXh0UG9zaXRpb24ueCgpICsgcG9pbnQueCgpLCB0ZXh0UG9zaXRp
b24ueSgpICsgcG9pbnQueSgpKTsKLSAgICB0ZXh0TGF5ZXIuY29udGVudHNTY2FsZSA9IFtbVUlT
Y3JlZW4gbWFpblNjcmVlbl0gc2NhbGVdICogc2NhbGU7Ci0gICAgW2xheWVyIGFkZFN1YmxheWVy
OnRleHRMYXllcl07Ci0KLSAgICByZXR1cm4gbGF5ZXI7Ci19Ci0KLS0gKENBTGF5ZXIgKilfY3Jl
YXRlR3JpZE92ZXJsYXlMYXllcjooY29uc3QgV2ViQ29yZTo6SW5zcGVjdG9yT3ZlcmxheTo6SGln
aGxpZ2h0OjpHcmlkSGlnaGxpZ2h0T3ZlcmxheSYpb3ZlcmxheSBzY2FsZTooZG91YmxlKXNjYWxl
Ci17Ci0gICAgLy8gS2VlcCBpbXBsZW1lbnRhdGlvbiByb3VnaGx5IGVxdWl2YWxlbnQgdG8gYFdl
YkNvcmU6Okluc3BlY3Rvck92ZXJsYXk6OmRyYXdHcmlkT3ZlcmxheWAuCi0gICAgQ0FMYXllciAq
bGF5ZXIgPSBbQ0FMYXllciBsYXllcl07Ci0KLSAgICBhdXRvIGdyaWRMaW5lc1BhdGggPSBhZG9w
dENGKENHUGF0aENyZWF0ZU11dGFibGUoKSk7Ci0gICAgZm9yIChhdXRvIGdyaWRMaW5lIDogb3Zl
cmxheS5ncmlkTGluZXMpIHsKLSAgICAgICAgQ0dQYXRoTW92ZVRvUG9pbnQoZ3JpZExpbmVzUGF0
aC5nZXQoKSwgMCwgZ3JpZExpbmUuc3RhcnQoKS54KCksIGdyaWRMaW5lLnN0YXJ0KCkueSgpKTsK
LSAgICAgICAgQ0dQYXRoQWRkTGluZVRvUG9pbnQoZ3JpZExpbmVzUGF0aC5nZXQoKSwgMCwgZ3Jp
ZExpbmUuZW5kKCkueCgpLCBncmlkTGluZS5lbmQoKS55KCkpOwotICAgIH0KLSAgICBDQVNoYXBl
TGF5ZXIgKmdyaWRMaW5lc0xheWVyID0gW0NBU2hhcGVMYXllciBsYXllcl07Ci0gICAgZ3JpZExp
bmVzTGF5ZXIucGF0aCA9IGdyaWRMaW5lc1BhdGguZ2V0KCk7Ci0gICAgZ3JpZExpbmVzTGF5ZXIu
bGluZVdpZHRoID0gMTsKLSAgICBncmlkTGluZXNMYXllci5zdHJva2VDb2xvciA9IGNhY2hlZENH
Q29sb3Iob3ZlcmxheS5jb2xvcikuZ2V0KCk7Ci0gICAgW2xheWVyIGFkZFN1YmxheWVyOmdyaWRM
aW5lc0xheWVyXTsKLQotICAgIGZvciAoYXV0byBnYXBRdWFkIDogb3ZlcmxheS5nYXBzKQotICAg
ICAgICBbbGF5ZXIgYWRkU3VibGF5ZXI6Y3JlYXRlTGF5b3V0SGF0Y2hpbmdMYXllcihnYXBRdWFk
LCBvdmVybGF5LmNvbG9yKV07Ci0KLSAgICBmb3IgKGF1dG8gYXJlYSA6IG92ZXJsYXkuYXJlYXMp
IHsKLSAgICAgICAgQ0FTaGFwZUxheWVyICphcmVhTGF5ZXIgPSBbQ0FTaGFwZUxheWVyIGxheWVy
XTsKLSAgICAgICAgbGF5ZXJQYXRoKGFyZWFMYXllciwgYXJlYS5xdWFkKTsKLSAgICAgICAgYXJl
YUxheWVyLmxpbmVXaWR0aCA9IDM7Ci0gICAgICAgIGFyZWFMYXllci5maWxsQ29sb3IgPSBDR0Nv
bG9yR2V0Q29uc3RhbnRDb2xvcihrQ0dDb2xvckNsZWFyKTsKLSAgICAgICAgYXJlYUxheWVyLnN0
cm9rZUNvbG9yID0gY2FjaGVkQ0dDb2xvcihvdmVybGF5LmNvbG9yKS5nZXQoKTsKLSAgICAgICAg
W2xheWVyIGFkZFN1YmxheWVyOmFyZWFMYXllcl07Ci0gICAgfQotCi0gICAgY29uc3RleHByIGF1
dG8gdHJhbnNsdWNlbnRMYWJlbEJhY2tncm91bmRDb2xvciA9IFdlYkNvcmU6OkNvbG9yOjp3aGl0
ZS5jb2xvcldpdGhBbHBoYUJ5dGUoMjMwKTsKLQotICAgIGZvciAoYXV0byBhcmVhIDogb3Zlcmxh
eS5hcmVhcykKLSAgICAgICAgW2xheWVyIGFkZFN1YmxheWVyOmNyZWF0ZUxheW91dExhYmVsTGF5
ZXIoYXJlYS5uYW1lLCBhcmVhLnF1YWQuY2VudGVyKCksIFdlYkNvcmU6Okluc3BlY3Rvck92ZXJs
YXk6OkxhYmVsQXJyb3dEaXJlY3Rpb246Ok5vbmUsIFdlYkNvcmU6Okluc3BlY3Rvck92ZXJsYXk6
OkxhYmVsQXJyb3dFZGdlUG9zaXRpb246Ok5vbmUsIHRyYW5zbHVjZW50TGFiZWxCYWNrZ3JvdW5k
Q29sb3IsIG92ZXJsYXkuY29sb3IsIHNjYWxlLCBhcmVhLnF1YWQuYm91bmRpbmdCb3goKS53aWR0
aCgpKV07CisgICAgaWYgKCFfaGlnaGxpZ2h0KQorICAgICAgICByZXR1cm47CiAKLSAgICBmb3Ig
KGF1dG8gbGFiZWwgOiBvdmVybGF5LmxhYmVscykKLSAgICAgICAgW2xheWVyIGFkZFN1YmxheWVy
OmNyZWF0ZUxheW91dExhYmVsTGF5ZXIobGFiZWwudGV4dCwgbGFiZWwubG9jYXRpb24sIGxhYmVs
LmFycm93RGlyZWN0aW9uLCBsYWJlbC5hcnJvd0VkZ2VQb3NpdGlvbiwgbGFiZWwuYmFja2dyb3Vu
ZENvbG9yLCBvdmVybGF5LmNvbG9yLCBzY2FsZSldOworICAgIGF1dG8gY29udGV4dCA9IFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dENHKFVJR3JhcGhpY3NHZXRDdXJyZW50Q29udGV4dCgpKTsKKyAg
ICBjb250ZXh0LmNsaXAoeyBkaXJ0eVJlY3QgfSk7CisgICAgY29udGV4dC50cmFuc2xhdGUoLXNl
bGYuZnJhbWUub3JpZ2luLngsIC1zZWxmLmZyYW1lLm9yaWdpbi55KTsKIAotICAgIHJldHVybiBs
YXllcjsKKyAgICBmb3IgKGF1dG8gZ3JpZEhpZ2hsaWdodE92ZXJsYXkgOiBfaGlnaGxpZ2h0LT5n
cmlkSGlnaGxpZ2h0T3ZlcmxheXMpCisgICAgICAgIFdlYkNvcmU6Okluc3BlY3Rvck92ZXJsYXk6
OmRyYXdHcmlkT3ZlcmxheShjb250ZXh0LCBncmlkSGlnaGxpZ2h0T3ZlcmxheSk7CiB9CiAKLS0g
KHZvaWQpdXBkYXRlOihjb25zdCBXZWJDb3JlOjpJbnNwZWN0b3JPdmVybGF5OjpIaWdobGlnaHQm
KWhpZ2hsaWdodCBzY2FsZTooZG91YmxlKXNjYWxlCistICh2b2lkKXVwZGF0ZTooY29uc3QgV2Vi
Q29yZTo6SW5zcGVjdG9yT3ZlcmxheTo6SGlnaGxpZ2h0JiloaWdobGlnaHQgc2NhbGU6KGRvdWJs
ZSlzY2FsZSBmcmFtZTooY29uc3QgV2ViQ29yZTo6RmxvYXRSZWN0JilmcmFtZQogewogICAgIFtz
ZWxmIF9yZW1vdmVBbGxMYXllcnNdOwogCisgICAgX2hpZ2hsaWdodCA9IGhpZ2hsaWdodDsKKyAg
ICBzZWxmLmNvbnRlbnRTY2FsZUZhY3RvciA9IFVJU2NyZWVuLm1haW5TY3JlZW4uc2NhbGUgKiBz
Y2FsZTsKKyAgICBzZWxmLmZyYW1lID0gZnJhbWU7CisKICAgICBpZiAoaGlnaGxpZ2h0LnR5cGUg
PT0gV2ViQ29yZTo6SW5zcGVjdG9yT3ZlcmxheTo6SGlnaGxpZ2h0OjpUeXBlOjpOb2RlIHx8IGhp
Z2hsaWdodC50eXBlID09IFdlYkNvcmU6Okluc3BlY3Rvck92ZXJsYXk6OkhpZ2hsaWdodDo6VHlw
ZTo6Tm9kZUxpc3QpCiAgICAgICAgIFtzZWxmIF9sYXlvdXRGb3JOb2RlTGlzdEhpZ2hsaWdodDpo
aWdobGlnaHRdOwogICAgIGVsc2UgaWYgKGhpZ2hsaWdodC50eXBlID09IFdlYkNvcmU6Okluc3Bl
Y3Rvck92ZXJsYXk6OkhpZ2hsaWdodDo6VHlwZTo6UmVjdHMpCiAgICAgICAgIFtzZWxmIF9sYXlv
dXRGb3JSZWN0c0hpZ2hsaWdodDpoaWdobGlnaHRdOwogCi0gICAgW3NlbGYgX2NyZWF0ZUdyaWRP
dmVybGF5TGF5ZXJzOmhpZ2hsaWdodCBzY2FsZTpzY2FsZV07CisgICAgCisgICAgW3NlbGYgc2V0
TmVlZHNEaXNwbGF5XTsKIH0KIAogQGVuZApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVBy
b2Nlc3MvaW9zL1dLQ29udGVudFZpZXcubW0gYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9pb3Mv
V0tDb250ZW50Vmlldy5tbQppbmRleCBhMmM4NTljYzI4NmI4OTFiYTRmOTY4MDIxOWZlZGY2ZGQ1
MzUzY2JmLi40Mjg0YjI4ZTQxMzJhNWVlYTE1ZGUzNzBhNzI2MGI4ZDBmNTA3ODRlIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9pb3MvV0tDb250ZW50Vmlldy5tbQorKysgYi9T
b3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9pb3MvV0tDb250ZW50Vmlldy5tbQpAQCAtNDEyLDggKzQx
Miw3IEBAIEFMTE9XX0RFUFJFQ0FURURfREVDTEFSQVRJT05TX0VORAogICAgICAgICBfaW5zcGVj
dG9ySGlnaGxpZ2h0VmlldyA9IGFkb3B0TlMoW1tXS0luc3BlY3RvckhpZ2hsaWdodFZpZXcgYWxs
b2NdIGluaXRXaXRoRnJhbWU6Q0dSZWN0WmVyb10pOwogICAgICAgICBbc2VsZiBpbnNlcnRTdWJ2
aWV3Ol9pbnNwZWN0b3JIaWdobGlnaHRWaWV3LmdldCgpIGFib3ZlU3Vidmlldzpfcm9vdENvbnRl
bnRWaWV3LmdldCgpXTsKICAgICB9Ci0KLSAgICBbX2luc3BlY3RvckhpZ2hsaWdodFZpZXcgdXBk
YXRlOmhpZ2hsaWdodCBzY2FsZTpbc2VsZiBfY29udGVudFpvb21TY2FsZV1dOworICAgIFtfaW5z
cGVjdG9ySGlnaGxpZ2h0VmlldyB1cGRhdGU6aGlnaGxpZ2h0IHNjYWxlOltzZWxmIF9jb250ZW50
Wm9vbVNjYWxlXSBmcmFtZTpfcGFnZS0+dW5vYnNjdXJlZENvbnRlbnRSZWN0KCldOwogfQogCiAt
ICh2b2lkKV9oaWRlSW5zcGVjdG9ySGlnaGxpZ2h0Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>