<?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>132143</bug_id>
          
          <creation_ts>2014-04-24 14:01:47 -0700</creation_ts>
          <short_desc>implement video using media foundation</short_desc>
          <delta_ts>2015-01-13 15:02:08 -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>Media</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Windows Vista</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>DUPLICATE</resolution>
          <dup_id>140337</dup_id>
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Alex Christensen">alex.christensen</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>bfulgham</cc>
    
    <cc>peavo</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1003764</commentid>
    <comment_count>0</comment_count>
    <who name="Alex Christensen">alex.christensen</who>
    <bug_when>2014-04-24 14:01:47 -0700</bug_when>
    <thetext>I have a hacky proof-of-concept with much of the functionality of the media foundation example at http://msdn.microsoft.com/en-us/library/windows/desktop/ff728866(v=vs.85).aspx

I wrote the seek functionality and a few other things.  The mimeTypeCache is taken directly from GStreamer and needs to be replaced.  The CPlayer needs to be put into MediaPlayerPrivateMediaFoundation instead of using a global variable for one player.  I need to figure out how to get the pixels from the other window into the GraphicsContext in the paint method and hide the video window.  WebKit.dll needs to link with mf.lib, mfplat.lib, mfuuid.lib, strmiids.lib, and Shlwapi.lib.  WTF_USE_MEDIA_FOUNDATION needs to be defined in Platform.h instead of the glib, gstreamer, and gst api definitions.  The functionality needs to be refined, but it works with http://www.w3.org/2010/05/video/mediaevents.html and play/pause/seek controls work.

I&apos;m not sure how much I&apos;ll be able to work on this in the near future, so I&apos;m uploading what I have in case someone wants to play with it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1003765</commentid>
    <comment_count>1</comment_count>
      <attachid>230102</attachid>
    <who name="Alex Christensen">alex.christensen</who>
    <bug_when>2014-04-24 14:02:31 -0700</bug_when>
    <thetext>Created attachment 230102
hacky prototype patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1060952</commentid>
    <comment_count>2</comment_count>
    <who name="Alex Christensen">alex.christensen</who>
    <bug_when>2015-01-13 15:02:08 -0800</bug_when>
    <thetext>This is being done much better by Peavo in bug 140337.

*** This bug has been marked as a duplicate of bug 140337 ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>230102</attachid>
            <date>2014-04-24 14:02:31 -0700</date>
            <delta_ts>2014-04-24 14:02:31 -0700</delta_ts>
            <desc>hacky prototype patch</desc>
            <filename>media_foundation_prototype.diff</filename>
            <type>application/octet-stream</type>
            <size>44738</size>
            <attacher name="Alex Christensen">alex.christensen</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9NZWRpYVBsYXllclBy
aXZhdGVNZWRpYUZvdW5kYXRpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9NZWRpYVBsYXllclByaXZhdGVNZWRpYUZvdW5kYXRpb24uY3Bw
CShyZXZpc2lvbiAxNjc3MzMpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW4vTWVkaWFQbGF5ZXJQcml2YXRlTWVkaWFGb3VuZGF0aW9uLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMjcsMjAgKzI3LDEzMjggQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJNZWRp
YVBsYXllclByaXZhdGVNZWRpYUZvdW5kYXRpb24uaCIKIAorI2luY2x1ZGUgIkJpdG1hcEluZm8u
aCIKKyNpbmNsdWRlICJCaXRtYXBJbWFnZS5oIgorI2luY2x1ZGUgIkRJQlBpeGVsRGF0YS5oIgog
I2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgotI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgi
CisjaW5jbHVkZSAiSFduZERDLmgiCisjaW5jbHVkZSAiTG9jYWxXaW5kb3dzQ29udGV4dC5oIgor
I2luY2x1ZGUgIldlYkNvcmVJbnN0YW5jZUhhbmRsZS5oIgogCi0jaWYgVVNFKE1FRElBX0ZPVU5E
QVRJT04pCisjaW5jbHVkZSA8U2hsd2FwaS5oPgogCisvLyBCYXNlZCBvbiBodHRwOi8vbXNkbi5t
aWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9kZXNrdG9wL2ZmNzI4ODY2KHY9dnMu
ODUpLmFzcHgKKworY29uc3QgVUlOVCBXTV9BUFBfUExBWUVSX0VWRU5UID0gV01fQVBQICsgMjsK
KworLy8jaWYgVVNFKE1FRElBX0ZPVU5EQVRJT04pCisNCitIUkVTVUxUIENyZWF0ZVNvdXJjZVN0
cmVhbU5vZGUoDQorCUlNRk1lZGlhU291cmNlICpwU291cmNlLA0KKwlJTUZQcmVzZW50YXRpb25E
ZXNjcmlwdG9yICpwU291cmNlUEQsDQorCUlNRlN0cmVhbURlc2NyaXB0b3IgKnBTb3VyY2VTRCwN
CisJSU1GVG9wb2xvZ3lOb2RlICoqcHBOb2RlDQorCSk7DQorDQorSFJFU1VMVCBDcmVhdGVPdXRw
dXROb2RlKA0KKwlJTUZTdHJlYW1EZXNjcmlwdG9yICpwU291cmNlU0QsDQorCUhXTkQgaHduZFZp
ZGVvLA0KKwlJTUZUb3BvbG9neU5vZGUgKipwcE5vZGUNCisJKTsNCisNCisNCisvLyAgU3RhdGlj
IGNsYXNzIG1ldGhvZCB0byBjcmVhdGUgdGhlIENQbGF5ZXIgb2JqZWN0Lg0KKy8vDQorLy8gIGhW
aWRlbzogICBIYW5kbGUgdG8gdGhlIHZpZGVvIHdpbmRvdy4NCisvLyAgaEV2ZW50OiAgIEhhbmRs
ZSB0byB0aGUgd2luZG93IHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy4NCisvLyAgcHBQbGF5ZXI6
IFJlY2VpdmVzIGFuIEFkZFJlZidzIHBvaW50ZXIgdG8gdGhlIENQbGF5ZXIgb2JqZWN0Lg0KKy8v
ICAgICAgICAgICAgVGhlIGNhbGxlciBtdXN0IHJlbGVhc2UgdGhlIHBvaW50ZXIuDQorDQorSFJF
U1VMVCBDUGxheWVyOjpDcmVhdGVJbnN0YW5jZShIV05EIGhWaWRlbywgSFdORCBoRXZlbnQsIENQ
bGF5ZXIgKipwcFBsYXllcikNCit7DQorCWFzc2VydChoVmlkZW8gIT0gTlVMTCk7DQorCWFzc2Vy
dChoRXZlbnQgIT0gTlVMTCk7DQorDQorCWlmIChwcFBsYXllciA9PSBOVUxMKQ0KKwl7DQorCQly
ZXR1cm4gRV9QT0lOVEVSOw0KKwl9DQorDQorCUhSRVNVTFQgaHIgPSBTX09LOw0KKw0KKwlDUGxh
eWVyICpwUGxheWVyID0gbmV3IENQbGF5ZXIoaFZpZGVvLCBoRXZlbnQpOw0KKw0KKwlpZiAocFBs
YXllciA9PSBOVUxMKQ0KKwl7DQorCQlyZXR1cm4gRV9PVVRPRk1FTU9SWTsNCisJfQ0KKw0KKwlo
ciA9IHBQbGF5ZXItPkluaXRpYWxpemUoKTsNCisNCisJaWYgKFNVQ0NFRURFRChocikpDQorCXsN
CisJCSpwcFBsYXllciA9IHBQbGF5ZXI7DQorCQkoKnBwUGxheWVyKS0+QWRkUmVmKCk7DQorCX0N
CisNCisJLy8gVGhlIENQbGF5ZXIgY29uc3RydWN0b3Igc2V0cyB0aGUgcmVmIGNvdW50IHRvIDEu
DQorCS8vIElmIHRoZSBtZXRob2Qgc3VjY2VlZHMsIHRoZSBjYWxsZXIgcmVjZWl2ZXMgYW4gQWRk
UmVmJ2QgcG9pbnRlci4NCisJLy8gV2hldGhlciB0aGUgbWV0aG9kIHN1Y2NlZWRzIG9yIGZhaWxz
LCB3ZSBtdXN0IHJlbGVhc2UgdGhlIHBvaW50ZXIuDQorDQorCVNhZmVSZWxlYXNlKCZwUGxheWVy
KTsNCisNCisJcmV0dXJuIGhyOw0KK30NCisNCisNCitDUGxheWVyOjpDUGxheWVyKEhXTkQgaFZp
ZGVvLCBIV05EIGhFdmVudCkgOg0KK21fcFNlc3Npb24oTlVMTCksDQorbV9wU291cmNlKE5VTEwp
LA0KK21fcFZpZGVvRGlzcGxheShOVUxMKSwNCittX2h3bmRWaWRlbyhoVmlkZW8pLA0KK21faHdu
ZEV2ZW50KGhFdmVudCksDQorbV9zdGF0ZShDbG9zZWQpLA0KK21faENsb3NlRXZlbnQoTlVMTCks
DQorbV9uUmVmQ291bnQoMSkNCit7DQorDQorfQ0KKw0KK0NQbGF5ZXI6On5DUGxheWVyKCkNCit7
DQorCWFzc2VydChtX3BTZXNzaW9uID09IE5VTEwpOyAgLy8gSWYgRkFMU0UsIHRoZSBhcHAgZGlk
IG5vdCBjYWxsIFNodXRkb3duKCkuDQorDQorCS8vIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGNhbGwg
U2h1dGRvd24gYmVjYXVzZSB0aGUgbWVkaWEgc2Vzc2lvbiBob2xkcyBhIA0KKwkvLyByZWZlcmVu
Y2UgY291bnQgb24gdGhlIENQbGF5ZXIgb2JqZWN0LiAoVGhpcyBoYXBwZW5zIHdoZW4gQ1BsYXll
ciBjYWxscyANCisJLy8gSU1lZGlhRXZlbnRHZW5lcmF0b3I6OkJlZ2luR2V0RXZlbnQgb24gdGhl
IG1lZGlhIHNlc3Npb24uKSBBcyBhIHJlc3VsdCwNCisJLy8gdGhlcmUgaXMgYSBjaXJjdWxhciBy
ZWZlcmVuY2UgY291bnQgYmV0d2VlbiB0aGUgQ1BsYXllciBvYmplY3QgYW5kIHRoZSANCisJLy8g
bWVkaWEgc2Vzc2lvbi4gQ2FsbGluZyBTaHV0ZG93biBicmVha3MgdGhlIGNpcmN1bGFyIHJlZmVy
ZW5jZSBjb3VudC4NCisNCisJLy8gSWYgQ3JlYXRlSW5zdGFuY2UgZmFpbGVkLCB0aGUgYXBwbGlj
YXRpb24gd2lsbCBub3QgY2FsbCBTaHV0ZG93bi4gVG8gDQorCS8vIGhhbmRsZSB0aGF0IGNhc2Us
IHdlIG11c3QgY2FsbCBTaHV0ZG93bigpIGluIHRoZSBkZXN0cnVjdG9yLiBUaGUgDQorCS8vIGNp
cmN1bGFyIHJlZi1jb3VudCBwcm9ibGVtIGRvZXMgbm90IG9jY2N1ciBpZiBDcmVhdGVJbnN0YW5j
ZSBoYXMgZmFpbGVkLiANCisJLy8gQWxzbywgY2FsbGluZyBTaHV0ZG93biB0d2ljZSBpcyBoYXJt
bGVzcy4NCisNCisJU2h1dGRvd24oKTsNCit9DQorDQorDQorDQorLy8gIEluaXRpYWxpemVzIHRo
ZSBDUGxheWVyIG9iamVjdC4gDQorDQorSFJFU1VMVCBDUGxheWVyOjpJbml0aWFsaXplKCkNCit7
DQorCWlmIChtX2hDbG9zZUV2ZW50KQ0KKwl7DQorCQlyZXR1cm4gTUZfRV9BTFJFQURZX0lOSVRJ
QUxJWkVEOw0KKwl9DQorDQorCS8vIFN0YXJ0IHVwIE1lZGlhIEZvdW5kYXRpb24gcGxhdGZvcm0u
DQorCUhSRVNVTFQgaHIgPSBNRlN0YXJ0dXAoTUZfVkVSU0lPTik7DQorCWlmIChGQUlMRUQoaHIp
KQ0KKwl7DQorCQlyZXR1cm4gaHI7DQorCX0NCisNCisJbV9oQ2xvc2VFdmVudCA9IENyZWF0ZUV2
ZW50KE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCk7DQorCWlmIChtX2hDbG9zZUV2ZW50ID09IE5V
TEwpDQorCXsNCisJCWhyID0gSFJFU1VMVF9GUk9NX1dJTjMyKEdldExhc3RFcnJvcigpKTsNCisJ
fQ0KKwlyZXR1cm4gaHI7DQorfQ0KKw0KKy8vIElVbmtub3duIG1ldGhvZHMNCisNCitIUkVTVUxU
IENQbGF5ZXI6OlF1ZXJ5SW50ZXJmYWNlKFJFRklJRCByaWlkLCB2b2lkKiogcHB2KQ0KK3sNCisJ
c3RhdGljIGNvbnN0IFFJVEFCIHFpdFtdID0NCisJew0KKwkJUUlUQUJFTlQoQ1BsYXllciwgSU1G
QXN5bmNDYWxsYmFjayksDQorCQl7IDAgfSwNCisJfTsNCisJcmV0dXJuIFFJU2VhcmNoKHRoaXMs
IHFpdCwgcmlpZCwgcHB2KTsNCit9DQorDQorVUxPTkcgQ1BsYXllcjo6QWRkUmVmKCkNCit7DQor
CXJldHVybiBJbnRlcmxvY2tlZEluY3JlbWVudCgmbV9uUmVmQ291bnQpOw0KK30NCisNCitVTE9O
RyBDUGxheWVyOjpSZWxlYXNlKCkNCit7DQorCVVMT05HIHVDb3VudCA9IEludGVybG9ja2VkRGVj
cmVtZW50KCZtX25SZWZDb3VudCk7DQorCWlmICh1Q291bnQgPT0gMCkNCisJew0KKwkJZGVsZXRl
IHRoaXM7DQorCX0NCisJcmV0dXJuIHVDb3VudDsNCit9DQorDQorDQorLy8gT3BlbnMgYSBVUkwg
Zm9yIHBsYXliYWNrLg0KKw0KK0hSRVNVTFQgQ1BsYXllcjo6T3BlblVSTChQQ1dTVFIgc1VSTCkN
Cit7DQorCS8vIDEuIENyZWF0ZSBhIG5ldyBtZWRpYSBzZXNzaW9uLg0KKwkvLyAyLiBDcmVhdGUg
dGhlIG1lZGlhIHNvdXJjZS4NCisJLy8gMy4gQ3JlYXRlIHRoZSB0b3BvbG9neS4NCisJLy8gNC4g
UXVldWUgdGhlIHRvcG9sb2d5IFthc3luY2hyb25vdXNdDQorCS8vIDUuIFN0YXJ0IHBsYXliYWNr
IFthc3luY2hyb25vdXMgLSBkb2VzIG5vdCBoYXBwZW4gaW4gdGhpcyBtZXRob2QuXQ0KKw0KKwlJ
TUZUb3BvbG9neSAqcFRvcG9sb2d5ID0gTlVMTDsNCisNCisJLy8gQ3JlYXRlIHRoZSBtZWRpYSBz
ZXNzaW9uLg0KKwlIUkVTVUxUIGhyID0gQ3JlYXRlU2Vzc2lvbigpOw0KKwlpZiAoRkFJTEVEKGhy
KSkNCisJew0KKwkJZ290byBkb25lOw0KKwl9DQorDQorCS8vIENyZWF0ZSB0aGUgbWVkaWEgc291
cmNlLg0KKwlociA9IENyZWF0ZU1lZGlhU291cmNlKHNVUkwpOw0KKwlpZiAoRkFJTEVEKGhyKSkN
CisJew0KKwkJZ290byBkb25lOw0KKwl9DQorDQorCS8vIENyZWF0ZSBhIHBhcnRpYWwgdG9wb2xv
Z3kuDQorCWhyID0gQ3JlYXRlVG9wb2xvZ3lGcm9tU291cmNlKCZwVG9wb2xvZ3kpOw0KKwlpZiAo
RkFJTEVEKGhyKSkNCisJew0KKwkJZ290byBkb25lOw0KKwl9DQorDQorCS8vIFNldCB0aGUgdG9w
b2xvZ3kgb24gdGhlIG1lZGlhIHNlc3Npb24uDQorCWhyID0gbV9wU2Vzc2lvbi0+U2V0VG9wb2xv
Z3koMCwgcFRvcG9sb2d5KTsNCisJaWYgKEZBSUxFRChocikpDQorCXsNCisJCWdvdG8gZG9uZTsN
CisJfQ0KKw0KKwkvLyBTZXQgb3VyIHN0YXRlIHRvICJvcGVuIHBlbmRpbmciDQorCW1fc3RhdGUg
PSBPcGVuUGVuZGluZzsNCisNCisJLy8gSWYgU2V0VG9wb2xvZ3kgc3VjY2VlZHMsIHRoZSBtZWRp
YSBzZXNzaW9uIHdpbGwgcXVldWUgYW4NCisJLy8gTUVTZXNzaW9uVG9wb2xvZ3lTZXQgZXZlbnQu
DQorDQorZG9uZToNCisJaWYgKEZBSUxFRChocikpDQorCXsNCisJCW1fc3RhdGUgPSBDbG9zZWQ7
DQorCX0NCisJU2FmZVJlbGVhc2UoJnBUb3BvbG9neSk7DQorCXJldHVybiBocjsNCit9DQorDQor
DQorLy8gIFN0YXJ0cyBwbGF5YmFjayBmcm9tIHBhdXNlZCBvciBzdG9wcGVkIHN0YXRlLg0KKw0K
K0hSRVNVTFQgQ1BsYXllcjo6UGxheSgpDQorew0KKwlpZiAobV9zdGF0ZSAhPSBQYXVzZWQgJiYg
bV9zdGF0ZSAhPSBTdG9wcGVkKQ0KKwl7DQorCQlyZXR1cm4gTUZfRV9JTlZBTElEUkVRVUVTVDsN
CisJfQ0KKwlpZiAobV9wU2Vzc2lvbiA9PSBOVUxMIHx8IG1fcFNvdXJjZSA9PSBOVUxMKQ0KKwl7
DQorCQlyZXR1cm4gRV9VTkVYUEVDVEVEOw0KKwl9DQorDQorCUhSRVNVTFQgaHIgPSBTdGFydFBs
YXliYWNrKCk7DQorDQorCXJldHVybiBocjsNCit9DQorDQorDQorLy8gIFBhdXNlcyBwbGF5YmFj
ay4NCisNCitIUkVTVUxUIENQbGF5ZXI6OlBhdXNlKCkNCit7DQorCWlmIChtX3N0YXRlICE9IFN0
YXJ0ZWQpDQorCXsNCisJCXJldHVybiBNRl9FX0lOVkFMSURSRVFVRVNUOw0KKwl9DQorCWlmICht
X3BTZXNzaW9uID09IE5VTEwgfHwgbV9wU291cmNlID09IE5VTEwpDQorCXsNCisJCXJldHVybiBF
X1VORVhQRUNURUQ7DQorCX0NCisNCisJSFJFU1VMVCBociA9IG1fcFNlc3Npb24tPlBhdXNlKCk7
DQorDQorCWlmIChTVUNDRUVERUQoaHIpKQ0KKwl7DQorCQltX3N0YXRlID0gUGF1c2VkOw0KKwl9
DQorDQorCXJldHVybiBocjsNCit9DQorDQorLy8gIFJlcGFpbnRzIHRoZSB2aWRlbyB3aW5kb3cu
DQorLy8NCisvLyAgVGhlIGFwcGxpY2F0aW9uIGNhbGxzIHRoaXMgbWV0aG9kIHdoZW4gaXQgcmVj
ZWl2ZXMgYSBXTV9QQUlOVCBtZXNzYWdlLg0KKw0KK0hSRVNVTFQgQ1BsYXllcjo6UmVwYWludCgp
DQorew0KKwlIUkVTVUxUIGhyID0gU19PSzsNCisNCisJaWYgKG1fcFZpZGVvRGlzcGxheSkNCisJ
ew0KKwkJaHIgPSBtX3BWaWRlb0Rpc3BsYXktPlJlcGFpbnRWaWRlbygpOw0KKwl9DQorCXJldHVy
biBocjsNCit9DQorDQorDQorLy8gIFJlc2l6ZXMgdGhlIHZpZGVvIHJlY3RhbmdsZS4NCisvLw0K
Ky8vICBUaGUgYXBwbGljYXRpb24gY2FsbHMgdGhpcyBtZXRob2QgaWYgdGhlIHNpemUgb2YgdGhl
IHZpZGVvIHdpbmRvdyBjaGFuZ2VzOyANCisvLyAgZS5nLiwgd2hlbiB0aGUgYXBwbGljYXRpb24g
cmVjZWl2ZXMgYSBXTV9TSVpFIG1lc3NhZ2UuDQorDQorSFJFU1VMVCBDUGxheWVyOjpSZXNpemVW
aWRlbyhXT1JEIHdpZHRoLCBXT1JEIGhlaWdodCkNCit7DQorCUhSRVNVTFQgaHIgPSBTX09LOw0K
Kw0KKwlpZiAobV9wVmlkZW9EaXNwbGF5KQ0KKwl7DQorCQkvLyBTZXQgdGhlIGRlc3RpbmF0aW9u
IHJlY3RhbmdsZS4NCisJCS8vIExlYXZlIHRoZSBkZWZhdWx0IHNvdXJjZSByZWN0YW5nbGUgKDAs
MCwxLDEpLg0KKw0KKwkJUkVDVCByY0Rlc3QgPSB7IDAsIDAsIHdpZHRoLCBoZWlnaHQgfTsNCisN
CisJCWhyID0gbV9wVmlkZW9EaXNwbGF5LT5TZXRWaWRlb1Bvc2l0aW9uKE5VTEwsICZyY0Rlc3Qp
Ow0KKwl9DQorCXJldHVybiBocjsNCit9DQorDQorDQorLy8gIENhbGxiYWNrIGZvciBhc3luY2hy
b25vdXMgQmVnaW5HZXRFdmVudCBtZXRob2QuDQorLy8NCisvLyAgcEFzeW5jUmVzdWx0OiBQb2lu
dGVyIHRvIHRoZSByZXN1bHQuDQorDQorSFJFU1VMVCBDUGxheWVyOjpJbnZva2UoSU1GQXN5bmNS
ZXN1bHQgKnBSZXN1bHQpDQorew0KKwlJTUZNZWRpYUV2ZW50ICpwRXZlbnQgPSBOVUxMOw0KKw0K
KwkvLyBHZXQgdGhlIGV2ZW50IGZyb20gdGhlIGV2ZW50IHF1ZXVlLg0KKwlIUkVTVUxUIGhyID0g
bV9wU2Vzc2lvbi0+RW5kR2V0RXZlbnQocFJlc3VsdCwgJnBFdmVudCk7DQorCWlmIChGQUlMRUQo
aHIpKQ0KKwl7DQorCQlnb3RvIGRvbmU7DQorCX0NCisNCisJLy8gR2V0IHRoZSBldmVudCB0eXBl
Lg0KKwlNZWRpYUV2ZW50VHlwZSBtZVR5cGU7DQorCWhyID0gcEV2ZW50LT5HZXRUeXBlKCZtZVR5
cGUpOw0KKwlpZiAoRkFJTEVEKGhyKSkNCisJew0KKwkJZ290byBkb25lOw0KKwl9DQorDQorCWlm
IChtZVR5cGUgPT0gTUVTZXNzaW9uQ2xvc2VkKQ0KKwl7DQorCQkvLyBJZiB0aGUgc2Vzc2lvbiBp
cyBjbG9zZWQsIHRoZSBhcHBsaWNhdGlvbiBpcyB3YWl0aW5nIG9uIHRoZSBldmVudCANCisJCS8v
IGhhbmRsZS4gQWxzbywgZG8gbm90IHJlcXVlc3QgYW55IG1vcmUgZXZlbnRzIGZyb20gdGhlIHNl
c3Npb24uDQorDQorCQlTZXRFdmVudChtX2hDbG9zZUV2ZW50KTsNCisJfQ0KKwllbHNlDQorCXsN
CisJCS8vIEZvciBhbGwgb3RoZXIgZXZlbnRzLCBhc2sgdGhlIG1lZGlhIHNlc3Npb24gZm9yIHRo
ZQ0KKwkJLy8gbmV4dCBldmVudCBpbiB0aGUgcXVldWUuDQorCQlociA9IG1fcFNlc3Npb24tPkJl
Z2luR2V0RXZlbnQodGhpcywgTlVMTCk7DQorCQlpZiAoRkFJTEVEKGhyKSkNCisJCXsNCisJCQln
b3RvIGRvbmU7DQorCQl9DQorCX0NCisNCisJLy8gRm9yIG1vc3QgZXZlbnRzLCBwb3N0IHRoZSBl
dmVudCBhcyBhIHByaXZhdGUgd2luZG93IG1lc3NhZ2UgdG8gdGhlDQorCS8vIGFwcGxpY2F0aW9u
LiBUaGlzIGxldHMgdGhlIGFwcGxpY2F0aW9uIHByb2Nlc3MgdGhlIGV2ZW50IG9uIGl0cyBtYWlu
IA0KKwkvLyB0aHJlYWQuDQorDQorCS8vIEhvd2V2ZXIsIGlmIGEgY2FsbCB0byBJTUZNZWRpYVNl
c3Npb246OkNsb3NlIGlzIHBlbmRpbmcsIGl0IG1lYW5zIHRoZQ0KKwkvLyBhcHBsaWNhdGlvbiBp
cyB3YWl0aW5nIG9uIHRoZSBtX2hDbG9zZUV2ZW50IGV2ZW50IGhhbmRsZS4gKEJsb2NraW5nDQor
CS8vIGNhbGwuKSBJbiB0aGF0IGNhc2UsIHdlIHNpbXBseSBkaXNjYXJkIHRoZSBldmVudC4NCisN
CisJLy8gV2hlbiBJTUZNZWRpYVNlc3Npb246OkNsb3NlIGlzIGNhbGxlZCwgTUVTZXNzaW9uQ2xv
c2VkIGlzIE5PVA0KKwkvLyBuZWNlc3NhcmlseSB0aGUgbmV4dCBldmVudCB0aGF0IHdlIHdpbGwg
cmVjZWl2ZS4gV2UgbWF5IHJlY2VpdmUgYW55IA0KKwkvLyBudW1iZXIgb2Ygb3RoZXIgZXZlbnRz
IGJlZm9yZSByZWNlaXZpbmcgTUVTZXNzaW9uQ2xvc2VkLg0KKw0KKwlpZiAobV9zdGF0ZSAhPSBD
bG9zaW5nKQ0KKwl7DQorCQkvLyBMZWF2ZSBhIHJlZmVyZW5jZSBjb3VudCBvbiB0aGUgZXZlbnQu
DQorCQlwRXZlbnQtPkFkZFJlZigpOw0KKwkJUG9zdE1lc3NhZ2UobV9od25kRXZlbnQsIFdNX0FQ
UF9QTEFZRVJfRVZFTlQsIChXUEFSQU0pcEV2ZW50LCAoTFBBUkFNKTApOw0KKwl9DQorDQorZG9u
ZToNCisJU2FmZVJlbGVhc2UoJnBFdmVudCk7DQorCXJldHVybiBTX09LOw0KK30NCisNCitjb25z
dCBfX2ludDY0IHRlbk1lZ2FIZXJ0eiA9IDEwMDAwMDAwOw0KKw0KK2Zsb2F0IENQbGF5ZXI6OmN1
cnJlbnRUaW1lKCkgY29uc3QNCit7DQorCUlNRkNsb2NrKiBjbG9jazsNCisJRFdPUkQgY2xvY2tD
aGFyYWN0ZXJpc3RpY3M7DQorCXVuc2lnbmVkIF9faW50NjQgY2xvY2tGcmVxdWVuY3k7DQorCUxP
TkdMT05HIGNsb2NrVGltZTsNCisJTUZUSU1FIHN5c3RlbVRpbWU7DQorDQorCWlmICghbV9wU2Vz
c2lvbg0KKwkJfHwgIVNVQ0NFRURFRChtX3BTZXNzaW9uLT5HZXRDbG9jaygmY2xvY2spKQ0KKwkJ
fHwgIVNVQ0NFRURFRChjbG9jay0+R2V0Q2xvY2tDaGFyYWN0ZXJpc3RpY3MoJmNsb2NrQ2hhcmFj
dGVyaXN0aWNzKSkpDQorCQlyZXR1cm4gMC4wZjsNCisNCisJaWYgKGNsb2NrQ2hhcmFjdGVyaXN0
aWNzICYgTUZDTE9DS19DSEFSQUNURVJJU1RJQ1NfRkxBR19GUkVRVUVOQ1lfMTBNSFopDQorCQlj
bG9ja0ZyZXF1ZW5jeSA9IHRlbk1lZ2FIZXJ0ejsNCisJZWxzZSB7DQorCQlNRkNMT0NLX1BST1BF
UlRJRVMgY2xvY2tQcm9wZXJ0aWVzOw0KKwkJaWYgKCFTVUNDRUVERUQoY2xvY2stPkdldFByb3Bl
cnRpZXMoJmNsb2NrUHJvcGVydGllcykpKQ0KKwkJCXJldHVybiAwLjBmOw0KKwkJY2xvY2tGcmVx
dWVuY3kgPSBjbG9ja1Byb3BlcnRpZXMucXdDbG9ja0ZyZXF1ZW5jeTsNCisJfQ0KKw0KKwlpZiAo
IVNVQ0NFRURFRChjbG9jay0+R2V0Q29ycmVsYXRlZFRpbWUoMCwgJmNsb2NrVGltZSwgJnN5c3Rl
bVRpbWUpKSkNCisJCXJldHVybiAwLjBmOw0KKw0KKwlyZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+
KHN0YXRpY19jYXN0PGRvdWJsZT4oY2xvY2tUaW1lKSAvIGNsb2NrRnJlcXVlbmN5KTsNCit9DQor
DQorV2ViQ29yZTo6SW50U2l6ZSBDUGxheWVyOjpuYXR1cmFsU2l6ZSgpIGNvbnN0DQorew0KKwlT
SVpFIHNpemUgPSB7MCwgMH07CisJU0laRSBhc3BlY3RSYXRpbyA9IHswLCAwfTsKKwlpZiAoIW1f
cFZpZGVvRGlzcGxheQ0KKwkJfHwgRkFJTEVEKG1fcFZpZGVvRGlzcGxheS0+R2V0TmF0aXZlVmlk
ZW9TaXplKCZzaXplLCAmYXNwZWN0UmF0aW8pKSkNCisJCXJldHVybiBXZWJDb3JlOjpJbnRTaXpl
KCk7DQorCXJldHVybiBXZWJDb3JlOjpJbnRTaXplKHNpemUuY3gsIHNpemUuY3kpOw0KK30NCisN
Citib29sIENQbGF5ZXI6OnBhdXNlZCgpIGNvbnN0DQorew0KKwlyZXR1cm4gbV9zdGF0ZSA9PSBQ
YXVzZWQ7DQorfQ0KKw0KK3ZvaWQgQ1BsYXllcjo6c2VlayhmbG9hdCBuZXdUaW1lKQ0KK3sNCisJ
Ly8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3Rv
cC9tczY5NDkwOCh2PXZzLjg1KS5hc3B4DQorCVBST1BWQVJJQU5UIHByb3BWYXJpYW50Ow0KKwlQ
cm9wVmFyaWFudEluaXQoJnByb3BWYXJpYW50KTsNCisJcHJvcFZhcmlhbnQudnQgPSBWVF9JODsN
CisJcHJvcFZhcmlhbnQuaFZhbC5RdWFkUGFydCA9IHN0YXRpY19jYXN0PF9faW50NjQ+KHN0YXRp
Y19jYXN0PGRvdWJsZT4obmV3VGltZSkqIHRlbk1lZ2FIZXJ0eik7DQorCWlmICghU1VDQ0VFREVE
KG1fcFNlc3Npb24tPlN0YXJ0KCZHVUlEX05VTEwsICZwcm9wVmFyaWFudCkpKXsNCisJCVByb3BW
YXJpYW50Q2xlYXIoJnByb3BWYXJpYW50KTsNCisJCXJldHVybjsNCisJfQ0KKwlQcm9wVmFyaWFu
dENsZWFyKCZwcm9wVmFyaWFudCk7DQorDQorCXJldHVybjsNCit9DQorDQorLy8gdXNlIGh0dHA6
Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvaGg0NDgw
MzModj12cy44NSkuYXNweCBpbnN0ZWFkIG9mIGdzdF9xdWVyeV9nZXRfbl9idWZmZXJpbmdfcmFu
Z2VzDQorDQorZmxvYXQgQ1BsYXllcjo6ZHVyYXRpb24oKSBjb25zdA0KK3sNCisJaWYgKCFtX3BT
b3VyY2UpDQorCQlyZXR1cm4gOTk5OTk5OTk5LmY7DQorDQorCS8vIGh0dHA6Ly9tc2RuLm1pY3Jv
c29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvbXM3MDIwNjAodj12cy44NSku
YXNweA0KKw0KKwlJTUZQcmVzZW50YXRpb25EZXNjcmlwdG9yKiBkZXNjcmlwdG9yOw0KKwlpZiAo
IVNVQ0NFRURFRChtX3BTb3VyY2UtPkNyZWF0ZVByZXNlbnRhdGlvbkRlc2NyaXB0b3IoJmRlc2Ny
aXB0b3IpKSkNCisJCXJldHVybiA5OTk5OTk5OTkuZjsNCisNCisJVUlOVDY0IGR1cmF0aW9uOw0K
KwlpZiAoIVNVQ0NFRURFRChkZXNjcmlwdG9yLT5HZXRVSU5UNjQoTUZfUERfRFVSQVRJT04sICZk
dXJhdGlvbikpKSB7DQorCQlkZXNjcmlwdG9yLT5SZWxlYXNlKCk7DQorCQlyZXR1cm4gOTk5OTk5
OTk5LmY7DQorCX0NCisJZGVzY3JpcHRvci0+UmVsZWFzZSgpOw0KKw0KKwlyZXR1cm4gc3RhdGlj
X2Nhc3Q8ZmxvYXQ+KHN0YXRpY19jYXN0PGRvdWJsZT4oZHVyYXRpb24pIC8gdGVuTWVnYUhlcnR6
KTsNCit9DQorDQordm9pZCBDUGxheWVyOjpwYWludChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQq
IGNvbnRleHQsIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIHJlY3QpDQorew0KKwlSZXBhaW50KCk7
DQorDQorCQ0KKwlpZiAobV9od25kVmlkZW8pew0KKy8qCQlIREMgc291cmNlREMgPSBHZXREQyht
X2h3bmRWaWRlbyk7DQorCQlXZWJDb3JlOjpMb2NhbFdpbmRvd3NDb250ZXh0IHdpbmRvd3NDb250
ZXh0KGNvbnRleHQsIHJlY3QpOw0KKwkJSEJJVE1BUCBiaXRtYXAgPSBDcmVhdGVDb21wYXRpYmxl
Qml0bWFwKHNvdXJjZURDLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOw0KKwkJSEJJVE1B
UCBvbGRCaXRtYXAgPSAoSEJJVE1BUClTZWxlY3RPYmplY3Qod2luZG93c0NvbnRleHQuaGRjKCks
IGJpdG1hcCk7DQorCQlib29sIGEgPSBCaXRCbHQod2luZG93c0NvbnRleHQuaGRjKCksIHJlY3Qu
eCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpLCBzb3VyY2VEQywgMCwg
MCwgU1JDQ09QWSk7DQorDQorCQlIR0RJT0JKIG8gPSBTZWxlY3RPYmplY3Qod2luZG93c0NvbnRl
eHQuaGRjKCksIG9sZEJpdG1hcCk7DQorCQlCT09MIGIgPSBEZWxldGVPYmplY3QoYml0bWFwKTsN
CisJCWludCBjID0gUmVsZWFzZURDKG1faHduZFZpZGVvLCBzb3VyY2VEQyk7DQorCQkqLw0KKwkJ
LyoNCisJCUhEQyBkYyA9IEdldERDKG1faHduZFZpZGVvKTsNCisJCUhEQyBtZW1EQyA9IENyZWF0
ZUNvbXBhdGlibGVEQyhkYyk7DQorCQlIQklUTUFQIGJpdG1hcCA9IENyZWF0ZUNvbXBhdGlibGVC
aXRtYXAoZGMsIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7DQorCQlIQklUTUFQIG9sZEJp
dG1hcCA9IChIQklUTUFQKVNlbGVjdE9iamVjdChtZW1EQywgYml0bWFwKTsNCisJCWJvb2wgeCA9
IEJpdEJsdChtZW1EQywgMCwgMCwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpLCBkYywgMCwg
MCwgU1JDQ09QWSk7DQorDQorCQlSZWZQdHI8V2ViQ29yZTo6Qml0bWFwSW1hZ2U+IGltYWdlID0g
V2ViQ29yZTo6Qml0bWFwSW1hZ2U6OmNyZWF0ZShiaXRtYXApOw0KKwkJY29udGV4dC0+ZHJhd0lt
YWdlKGltYWdlLmdldCgpLCBXZWJDb3JlOjpDb2xvclNwYWNlU1JHQiwKKwkJCXJlY3QsIHJlY3Qs
IFdlYkNvcmU6OkNvbXBvc2l0ZUNvcHksIFdlYkNvcmU6OkltYWdlT3JpZW50YXRpb25EZXNjcmlw
dGlvbigpLCBmYWxzZSk7CisJCUhHRElPQkogbyA9IFNlbGVjdE9iamVjdChtZW1EQywgb2xkQml0
bWFwKTsNCisJCUJPT0wgYSA9IERlbGV0ZURDKG1lbURDKTsNCisJCUJPT0wgYiA9IERlbGV0ZU9i
amVjdChiaXRtYXApOw0KKwkJaW50IGMgPSBSZWxlYXNlREMobV9od25kVmlkZW8sIGRjKTsNCisJ
CSovCisKKwkJV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpXaW5kb3dzQml0bWFwIGJpdG1hcChH
ZXREQyhtX2h3bmRWaWRlbyksIFdlYkNvcmU6OkludFNpemUocmVjdC53aWR0aCgpLCByZWN0Lmhl
aWdodCgpKSk7CisJCWNvbnRleHQtPmRyYXdXaW5kb3dzQml0bWFwKCZiaXRtYXAsIFdlYkNvcmU6
OkludFBvaW50KHJlY3QueCgpLCByZWN0LnkoKSkpOworCX0NCisJDQorCS8qDQorCUJJVE1BUElO
Rk9IRUFERVIgaGVhZGVyOw0KKwlCWVRFKiBkZXZpY2VJbmRlcGVuZGVudEJpdG1hcDsNCisJRFdP
UkQgZGliTGVuZ3RoOw0KKwlMT05HTE9ORyB0aW1lc3RhbXA7DQorCWlmIChTVUNDRUVERUQobV9w
VmlkZW9EaXNwbGF5LT5HZXRDdXJyZW50SW1hZ2UoJmhlYWRlciwgJmRldmljZUluZGVwZW5kZW50
Qml0bWFwLCAmZGliTGVuZ3RoLCAmdGltZXN0YW1wKSkpew0KKwkJSEJJVE1BUCBiaXRtYXAgPSBD
cmVhdGVCaXRtYXAoaGVhZGVyLmJpV2lkdGgsIGhlYWRlci5iaUhlaWdodCwgaGVhZGVyLmJpUGxh
bmVzLCBoZWFkZXIuYmlCaXRDb3VudCwgZGV2aWNlSW5kZXBlbmRlbnRCaXRtYXApOw0KKwkJaWYg
KGJpdG1hcCl7DQorCQkJUmVmUHRyPFdlYkNvcmU6OkJpdG1hcEltYWdlPiBpbWFnZSA9IFdlYkNv
cmU6OkJpdG1hcEltYWdlOjpjcmVhdGUoYml0bWFwKTsNCisJCQljb250ZXh0LT5kcmF3SW1hZ2Uo
aW1hZ2UuZ2V0KCksIFdlYkNvcmU6OkNvbG9yU3BhY2VTUkdCLAorCQkJCXJlY3QsIHJlY3QsIFdl
YkNvcmU6OkNvbXBvc2l0ZUNvcHksIFdlYkNvcmU6OkltYWdlT3JpZW50YXRpb25EZXNjcmlwdGlv
bigpLCBmYWxzZSk7CisNCisJCQlEZWxldGVPYmplY3QoYml0bWFwKTsNCisJCX0NCisJCUNvVGFz
a01lbUZyZWUoZGV2aWNlSW5kZXBlbmRlbnRCaXRtYXApOw0KKwl9DQorCSovDQorfQ0KKw0KKy8v
ICBDYWxsZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHdoZW4gaXQgcmVjZWl2ZXMgYSBXTV9BUFBfUExB
WUVSX0VWRU5UDQorLy8gIG1lc3NhZ2UuDQorLy8NCisvLyAgVGhpcyBtZXRob2QgaXMgdXNlZCB0
byBwcm9jZXNzIG1lZGlhIHNlc3Npb24gZXZlbnRzIG9uIHRoZQ0KKy8vICBhcHBsaWNhdGlvbidz
IG1haW4gdGhyZWFkLg0KKy8vDQorLy8gIHBVbmtQdHI6IFBvaW50ZXIgdG8gdGhlIElVbmtub3du
IGludGVyZmFjZSBvZiBhIG1lZGlhIHNlc3Npb24NCisvLyAgZXZlbnQgKElNRk1lZGlhRXZlbnQp
Lg0KKw0KK0hSRVNVTFQgQ1BsYXllcjo6SGFuZGxlRXZlbnQoVUlOVF9QVFIgcFVua1B0cikNCit7
DQorCUhSRVNVTFQgaHJTdGF0dXMgPSBTX09LOyAgICAgICAgICAgIC8vIEV2ZW50IHN0YXR1cw0K
KwlNRl9UT1BPU1RBVFVTIFRvcG9TdGF0dXMgPSBNRl9UT1BPU1RBVFVTX0lOVkFMSUQ7DQorDQor
CUlVbmtub3duICpwVW5rID0gTlVMTDsNCisJSU1GTWVkaWFFdmVudCAqcEV2ZW50ID0gTlVMTDsN
CisNCisJLy8gcFVua1B0ciBpcyByZWFsbHkgYW4gSVVua25vd24gcG9pbnRlci4NCisJcFVuayA9
IChJVW5rbm93biopcFVua1B0cjsNCisNCisJaWYgKHBVbmsgPT0gTlVMTCkNCisJew0KKwkJcmV0
dXJuIEVfUE9JTlRFUjsNCisJfQ0KKw0KKwlIUkVTVUxUIGhyID0gcFVuay0+UXVlcnlJbnRlcmZh
Y2UoSUlEX1BQVl9BUkdTKCZwRXZlbnQpKTsNCisJaWYgKEZBSUxFRChocikpDQorCXsNCisJCWdv
dG8gZG9uZTsNCisJfQ0KKw0KKwkvLyBHZXQgdGhlIGV2ZW50IHR5cGUuDQorCU1lZGlhRXZlbnRU
eXBlIG1lVHlwZTsNCisJaHIgPSBwRXZlbnQtPkdldFR5cGUoJm1lVHlwZSk7DQorCWlmIChGQUlM
RUQoaHIpKQ0KKwl7DQorCQlnb3RvIGRvbmU7DQorCX0NCisNCisJLy8gR2V0IHRoZSBldmVudCBz
dGF0dXMuIElmIHRoZSBvcGVyYXRpb24gdGhhdCB0cmlnZ2VyZWQgdGhlIGV2ZW50IGRpZA0KKwkv
LyBub3Qgc3VjY2VlZCwgdGhlIHN0YXR1cyBpcyBhIGZhaWx1cmUgY29kZS4NCisJaHIgPSBwRXZl
bnQtPkdldFN0YXR1cygmaHJTdGF0dXMpOw0KKwlpZiAoRkFJTEVEKGhyKSkNCisJew0KKwkJZ290
byBkb25lOw0KKwl9DQorDQorCS8vIENoZWNrIGlmIHRoZSBhc3luYyBvcGVyYXRpb24gc3VjY2Vl
ZGVkLg0KKwlpZiAoRkFJTEVEKGhyU3RhdHVzKSkNCisJew0KKwkJaHIgPSBoclN0YXR1czsNCisJ
CWdvdG8gZG9uZTsNCisJfQ0KKw0KKwkvLyBTd2l0Y2ggb24gdGhlIGV2ZW50IHR5cGUuIFVwZGF0
ZSB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIENQbGF5ZXIgYXMgbmVlZGVkLg0KKwlzd2l0Y2gg
KG1lVHlwZSkNCisJew0KKwljYXNlIE1FU2Vzc2lvblRvcG9sb2d5U3RhdHVzOg0KKwkJLy8gR2V0
IHRoZSBzdGF0dXMgY29kZS4NCisJCWhyID0gcEV2ZW50LT5HZXRVSU5UMzIoTUZfRVZFTlRfVE9Q
T0xPR1lfU1RBVFVTLCAoVUlOVDMyKikmVG9wb1N0YXR1cyk7DQorCQlpZiAoRkFJTEVEKGhyKSkN
CisJCXsNCisJCQlnb3RvIGRvbmU7DQorCQl9DQorDQorCQlzd2l0Y2ggKFRvcG9TdGF0dXMpDQor
CQl7DQorCQljYXNlIE1GX1RPUE9TVEFUVVNfUkVBRFk6DQorCQkJaHIgPSBPblRvcG9sb2d5UmVh
ZHkocEV2ZW50KTsNCisJCQlicmVhazsNCisJCWRlZmF1bHQ6DQorCQkJLy8gTm90aGluZyB0byBk
by4NCisJCQlicmVhazsNCisJCX0NCisJCWJyZWFrOw0KKw0KKwljYXNlIE1FRW5kT2ZQcmVzZW50
YXRpb246DQorCQlociA9IE9uUHJlc2VudGF0aW9uRW5kZWQocEV2ZW50KTsNCisJCWJyZWFrOw0K
Kwl9DQorDQorZG9uZToNCisJU2FmZVJlbGVhc2UoJnBVbmspOw0KKwlTYWZlUmVsZWFzZSgmcEV2
ZW50KTsNCisJcmV0dXJuIGhyOw0KK30NCisNCisNCisvLyAgUmVsZWFzZXMgYWxsIHJlc291cmNl
cyBoZWxkIGJ5IHRoaXMgb2JqZWN0Lg0KKw0KK0hSRVNVTFQgQ1BsYXllcjo6U2h1dGRvd24oKQ0K
K3sNCisJSFJFU1VMVCBociA9IFNfT0s7DQorDQorCS8vIENsb3NlIHRoZSBzZXNzaW9uDQorCWhy
ID0gQ2xvc2VTZXNzaW9uKCk7DQorDQorCS8vIFNodXRkb3duIHRoZSBNZWRpYSBGb3VuZGF0aW9u
IHBsYXRmb3JtDQorCU1GU2h1dGRvd24oKTsNCisNCisJaWYgKG1faENsb3NlRXZlbnQpDQorCXsN
CisJCUNsb3NlSGFuZGxlKG1faENsb3NlRXZlbnQpOw0KKwkJbV9oQ2xvc2VFdmVudCA9IE5VTEw7
DQorCX0NCisNCisJcmV0dXJuIGhyOw0KK30NCisNCisNCisvLy8NCisvLy8gQWxsIG1ldGhvZHMg
dGhhdCBmb2xsb3cgYXJlIHByaXZhdGUgdG8gdGhlIENQbGF5ZXIgY2xhc3MuDQorLy8vDQorDQor
DQorLy8gIEhhbmRsZXIgZm9yIE1FU2Vzc2lvblRvcG9sb2d5UmVhZHkgZXZlbnQuDQorLy8NCisv
LyAgLSBUaGUgTUVTZXNzaW9uVG9wb2xvZ3lTZXQgZXZlbnQgbWVhbnMgdGhlIHNlc3Npb24gcXVl
dWVkIHRoZQ0KKy8vICAgIHRvcG9sb2d5LCBidXQgdGhlIHRvcG9sb2d5IGlzIG5vdCByZWFkeSB5
ZXQuIEdlbmVyYWxseSwgdGhlDQorLy8gICAgYXBwbGljYXRpb24gZG9lcyBub3QgbmVlZCB0byBy
ZXNwb25kIHRvIHRoaXMgZXZlbnQsIHVubGVzcw0KKy8vICAgIHRoZXJlIGlzIGFuIGVycm9yLg0K
Ky8vICAtIFRoZSBNRVNlc3Npb25Ub3BvbG9neVJlYWR5IGV2ZW50IG1lYW5zIHRoZSBuZXcgdG9w
b2xvZ3kgaXMNCisvLyAgICByZWFkeSBmb3IgcGxheWJhY2suIEFmdGVyIHRoaXMgZXZlbnQgaXMg
cmVjZWl2ZWQsIGFueSBjYWxscyB0bw0KKy8vICAgIElNRkdldFNlcnZpY2Ugd2lsbCBnZXQgc2Vy
dmljZSBpbnRlcmZhY2VzIGZyb20gdGhlIG5ldyB0b3BvbG9neS4NCisvLy0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisN
CitIUkVTVUxUIENQbGF5ZXI6Ok9uVG9wb2xvZ3lSZWFkeShJTUZNZWRpYUV2ZW50ICpwRXZlbnQp
DQorew0KKwlTYWZlUmVsZWFzZSgmbV9wVmlkZW9EaXNwbGF5KTsNCisNCisJLy8gQXNrIGZvciB0
aGUgSU1GVmlkZW9EaXNwbGF5Q29udHJvbCBpbnRlcmZhY2UuIFRoaXMgaW50ZXJmYWNlIGlzIA0K
KwkvLyBpbXBsZW1lbnRlZCBieSB0aGUgRVZSIGFuZCBpcyBleHBvc2VkIGJ5IHRoZSBtZWRpYSBz
ZXNzaW9uIGFzIGEgc2VydmljZS4NCisNCisJLy8gTm90ZTogVGhpcyBjYWxsIGlzIGV4cGVjdGVk
IHRvIGZhaWwgaWYgdGhlIHNvdXJjZSBkb2VzIG5vdCBoYXZlIHZpZGVvLg0KKw0KKwlNRkdldFNl
cnZpY2UobV9wU2Vzc2lvbiwgTVJfVklERU9fUkVOREVSX1NFUlZJQ0UsDQorCQlJSURfUFBWX0FS
R1MoJm1fcFZpZGVvRGlzcGxheSkpOw0KKw0KKwlIUkVTVUxUIGhyID0gU3RhcnRQbGF5YmFjaygp
Ow0KKwkvL0hSRVNVTFQgaHIgPSBTX09LOw0KKwlyZXR1cm4gaHI7DQorfQ0KKw0KKw0KKy8vICBI
YW5kbGVyIGZvciBNRUVuZE9mUHJlc2VudGF0aW9uIGV2ZW50Lg0KKw0KK0hSRVNVTFQgQ1BsYXll
cjo6T25QcmVzZW50YXRpb25FbmRlZChJTUZNZWRpYUV2ZW50ICpwRXZlbnQpDQorew0KKwkvLyBU
aGUgc2Vzc2lvbiBwdXRzIGl0c2VsZiBpbnRvIHRoZSBzdG9wcGVkIHN0YXRlIGF1dG9tYXRpY2Fs
bHkuDQorCW1fc3RhdGUgPSBTdG9wcGVkOw0KKwlyZXR1cm4gU19PSzsNCit9DQorDQorDQorLy8g
IENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIG1lZGlhIHNlc3Npb24uDQorDQorSFJFU1VM
VCBDUGxheWVyOjpDcmVhdGVTZXNzaW9uKCkNCit7DQorCS8vIENsb3NlIHRoZSBvbGQgc2Vzc2lv
biwgaWYgYW55Lg0KKwlIUkVTVUxUIGhyID0gQ2xvc2VTZXNzaW9uKCk7DQorCWlmIChGQUlMRUQo
aHIpKQ0KKwl7DQorCQlnb3RvIGRvbmU7DQorCX0NCisNCisJYXNzZXJ0KG1fc3RhdGUgPT0gQ2xv
c2VkKTsNCisNCisJLy8gQ3JlYXRlIHRoZSBtZWRpYSBzZXNzaW9uLg0KKwlociA9IE1GQ3JlYXRl
TWVkaWFTZXNzaW9uKE5VTEwsICZtX3BTZXNzaW9uKTsNCisJaWYgKEZBSUxFRChocikpDQorCXsN
CisJCWdvdG8gZG9uZTsNCisJfQ0KKw0KKwltX3N0YXRlID0gUmVhZHk7DQorDQorCS8vIFN0YXJ0
IHB1bGxpbmcgZXZlbnRzIGZyb20gdGhlIG1lZGlhIHNlc3Npb24NCisJaHIgPSBtX3BTZXNzaW9u
LT5CZWdpbkdldEV2ZW50KChJTUZBc3luY0NhbGxiYWNrKil0aGlzLCBOVUxMKTsNCisJaWYgKEZB
SUxFRChocikpDQorCXsNCisJCWdvdG8gZG9uZTsNCisJfQ0KKw0KK2RvbmU6DQorCXJldHVybiBo
cjsNCit9DQorDQorDQorLy8gIENsb3NlcyB0aGUgbWVkaWEgc2Vzc2lvbi4NCisvLw0KKy8vICBU
aGUgSU1GTWVkaWFTZXNzaW9uOjpDbG9zZSBtZXRob2QgaXMgYXN5bmNocm9ub3VzLCBidXQgdGhl
IENsb3NlU2Vzc2lvbiANCisvLyAgbWV0aG9kIHdhaXRzIG9uIHRoZSBNRVNlc3Npb25DbG9zZWQg
ZXZlbnQuIFRoZSBNRVNlc3Npb25DbG9zZWQgZXZlbnQgaXMgDQorLy8gIGd1YXJhbnRlZWQgdG8g
YmUgdGhlIGxhc3QgZXZlbnQgdGhhdCB0aGUgbWVkaWEgc2Vzc2lvbiBmaXJlcy4NCisNCitIUkVT
VUxUIENQbGF5ZXI6OkNsb3NlU2Vzc2lvbigpDQorew0KKwlIUkVTVUxUIGhyID0gU19PSzsNCisN
CisJU2FmZVJlbGVhc2UoJm1fcFZpZGVvRGlzcGxheSk7DQorDQorCS8vIEZpcnN0IGNsb3NlIHRo
ZSBtZWRpYSBzZXNzaW9uLg0KKwlpZiAobV9wU2Vzc2lvbikNCisJew0KKwkJRFdPUkQgZHdXYWl0
UmVzdWx0ID0gMDsNCisNCisJCW1fc3RhdGUgPSBDbG9zaW5nOw0KKw0KKwkJaHIgPSBtX3BTZXNz
aW9uLT5DbG9zZSgpOw0KKwkJaWYgKEZBSUxFRChocikpDQorCQl7DQorCQkJZ290byBkb25lOw0K
KwkJfQ0KKw0KKwkJLy8gV2FpdCBmb3IgdGhlIGNsb3NlIG9wZXJhdGlvbiB0byBjb21wbGV0ZQ0K
Kw0KKwkJV2FpdEZvclNpbmdsZU9iamVjdChtX2hDbG9zZUV2ZW50LCA1MDAwKTsNCisJCS8vIE5v
dyB0aGVyZSB3aWxsIGJlIG5vIG1vcmUgZXZlbnRzIGZyb20gdGhpcyBzZXNzaW9uLg0KKwl9DQor
DQorCS8vIENvbXBsZXRlIHNodXRkb3duIG9wZXJhdGlvbnMuDQorDQorCS8vIFNodXQgZG93biB0
aGUgbWVkaWEgc291cmNlLiAoU3luY2hyb25vdXMgb3BlcmF0aW9uLCBubyBldmVudHMuKQ0KKwlp
ZiAobV9wU291cmNlKQ0KKwl7DQorCQltX3BTb3VyY2UtPlNodXRkb3duKCk7DQorCX0NCisNCisJ
Ly8gU2h1dCBkb3duIHRoZSBtZWRpYSBzZXNzaW9uLiAoU3luY2hyb25vdXMgb3BlcmF0aW9uLCBu
byBldmVudHMuKQ0KKwlpZiAobV9wU2Vzc2lvbikNCisJew0KKwkJbV9wU2Vzc2lvbi0+U2h1dGRv
d24oKTsNCisJfQ0KKw0KKwlTYWZlUmVsZWFzZSgmbV9wU291cmNlKTsNCisJU2FmZVJlbGVhc2Uo
Jm1fcFNlc3Npb24pOw0KKw0KKwltX3N0YXRlID0gQ2xvc2VkOw0KKw0KK2RvbmU6DQorCXJldHVy
biBocjsNCit9DQorDQorDQorLy8gIFN0YXJ0cyBwbGF5YmFjayBmcm9tIHRoZSBjdXJyZW50IHBv
c2l0aW9uLg0KKw0KK0hSRVNVTFQgQ1BsYXllcjo6U3RhcnRQbGF5YmFjaygpDQorew0KKwlhc3Nl
cnQobV9wU2Vzc2lvbiAhPSBOVUxMKTsNCisNCisJUFJPUFZBUklBTlQgdmFyU3RhcnQ7DQorCVBy
b3BWYXJpYW50SW5pdCgmdmFyU3RhcnQpOw0KKw0KKwl2YXJTdGFydC52dCA9IFZUX0VNUFRZOw0K
Kw0KKwlIUkVTVUxUIGhyID0gbV9wU2Vzc2lvbi0+U3RhcnQoJkdVSURfTlVMTCwgJnZhclN0YXJ0
KTsNCisJaWYgKFNVQ0NFRURFRChocikpDQorCXsNCisJCS8vIFN0YXJ0IGlzIGFuIGFzeW5jaHJv
bm91cyBvcGVyYXRpb24uIEhvd2V2ZXIsIHdlIGNhbiB0cmVhdCBvdXIgc3RhdGUgDQorCQkvLyBh
cyBiZWluZyBhbHJlYWR5IHN0YXJ0ZWQuIElmIFN0YXJ0IGZhaWxzIGxhdGVyLCB3ZSdsbCBnZXQg
YW4gDQorCQkvLyBNRVNlc3Npb25TdGFydGVkIGV2ZW50IHdpdGggYW4gZXJyb3IgY29kZSwgYW5k
IHdpbGwgdXBkYXRlIG91ciBzdGF0ZS4NCisJCW1fc3RhdGUgPSBTdGFydGVkOw0KKwl9DQorDQor
CVByb3BWYXJpYW50Q2xlYXIoJnZhclN0YXJ0KTsNCisJcmV0dXJuIGhyOw0KK30NCisNCisNCisv
LyAgQ3JlYXRlcyBhIG1lZGlhIHNvdXJjZSBmcm9tIGEgVVJMLg0KKw0KK0hSRVNVTFQgQ1BsYXll
cjo6Q3JlYXRlTWVkaWFTb3VyY2UoUENXU1RSIHNVUkwpDQorew0KKwlNRl9PQkpFQ1RfVFlQRSBP
YmplY3RUeXBlID0gTUZfT0JKRUNUX0lOVkFMSUQ7DQorDQorCUlNRlNvdXJjZVJlc29sdmVyKiBw
U291cmNlUmVzb2x2ZXIgPSBOVUxMOw0KKwlJVW5rbm93biogcFNvdXJjZSA9IE5VTEw7DQorDQor
CVNhZmVSZWxlYXNlKCZtX3BTb3VyY2UpOw0KKw0KKwkvLyBDcmVhdGUgdGhlIHNvdXJjZSByZXNv
bHZlci4NCisJSFJFU1VMVCBociA9IE1GQ3JlYXRlU291cmNlUmVzb2x2ZXIoJnBTb3VyY2VSZXNv
bHZlcik7DQorCWlmIChGQUlMRUQoaHIpKQ0KKwl7DQorCQlnb3RvIGRvbmU7DQorCX0NCisNCisJ
Ly8gVXNlIHRoZSBzb3VyY2UgcmVzb2x2ZXIgdG8gY3JlYXRlIHRoZSBtZWRpYSBzb3VyY2UuDQor
DQorCS8vIE5vdGU6IEZvciBzaW1wbGljaXR5IHRoaXMgc2FtcGxlIHVzZXMgdGhlIHN5bmNocm9u
b3VzIG1ldGhvZCBvbg0KKwkvLyBJTUZTb3VyY2VSZXNvbHZlciB0byBjcmVhdGUgdGhlIG1lZGlh
IHNvdXJjZS4gSG93ZXZlciwgY3JlYXRpbmcgYSBtZWRpYSANCisJLy8gc291cmNlIGNhbiB0YWtl
IGEgbm90aWNlYWJsZSBhbW91bnQgb2YgdGltZSwgZXNwZWNpYWxseSBmb3IgYSBuZXR3b3JrIA0K
KwkvLyBzb3VyY2UuIEZvciBhIG1vcmUgcmVzcG9uc2l2ZSBVSSwgdXNlIHRoZSBhc3luY2hyb25v
dXMgDQorCS8vIEJlZ2luQ3JlYXRlT2JqZWN0RnJvbVVSTCBtZXRob2QuDQorDQorCWhyID0gcFNv
dXJjZVJlc29sdmVyLT5DcmVhdGVPYmplY3RGcm9tVVJMKA0KKwkJc1VSTCwgICAgICAgICAgICAg
ICAgICAgICAgIC8vIFVSTCBvZiB0aGUgc291cmNlLg0KKwkJTUZfUkVTT0xVVElPTl9NRURJQVNP
VVJDRSwgIC8vIENyZWF0ZSBhIHNvdXJjZSBvYmplY3QuDQorCQlOVUxMLCAgICAgICAgICAgICAg
ICAgICAgICAgLy8gT3B0aW9uYWwgcHJvcGVydHkgc3RvcmUuDQorCQkmT2JqZWN0VHlwZSwgICAg
ICAgICAgICAgICAgLy8gUmVjZWl2ZXMgdGhlIGNyZWF0ZWQgb2JqZWN0IHR5cGUuDQorCQkmcFNv
dXJjZSAgICAgICAgICAgICAgICAgICAgLy8gUmVjZWl2ZXMgYSBwb2ludGVyIHRvIHRoZSBtZWRp
YSBzb3VyY2UuDQorCQkpOw0KKwlpZiAoRkFJTEVEKGhyKSkNCisJew0KKwkJZ290byBkb25lOw0K
Kwl9DQorDQorCS8vIEdldCB0aGUgSU1GTWVkaWFTb3VyY2UgaW50ZXJmYWNlIGZyb20gdGhlIG1l
ZGlhIHNvdXJjZS4NCisJaHIgPSBwU291cmNlLT5RdWVyeUludGVyZmFjZShJSURfUFBWX0FSR1Mo
Jm1fcFNvdXJjZSkpOw0KKw0KK2RvbmU6DQorCVNhZmVSZWxlYXNlKCZwU291cmNlUmVzb2x2ZXIp
Ow0KKwlTYWZlUmVsZWFzZSgmcFNvdXJjZSk7DQorCXJldHVybiBocjsNCit9DQorDQorDQorDQor
Ly8gIENyZWF0ZXMgYSBwbGF5YmFjayB0b3BvbG9neSBmcm9tIHRoZSBtZWRpYSBzb3VyY2UuDQor
Ly8NCisvLyAgUHJlLWNvbmRpdGlvbjogVGhlIG1lZGlhIHNvdXJjZSBtdXN0IGJlIGNyZWF0ZWQg
YWxyZWFkeS4NCisvLyAgICAgICAgICAgICAgICAgQ2FsbCBDcmVhdGVNZWRpYVNvdXJjZSgpIGJl
Zm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLg0KKw0KK0hSRVNVTFQgQ1BsYXllcjo6Q3JlYXRlVG9w
b2xvZ3lGcm9tU291cmNlKElNRlRvcG9sb2d5ICoqcHBUb3BvbG9neSkNCit7DQorCWFzc2VydCht
X3BTZXNzaW9uICE9IE5VTEwpOw0KKwlhc3NlcnQobV9wU291cmNlICE9IE5VTEwpOw0KKw0KKwlJ
TUZUb3BvbG9neSAqcFRvcG9sb2d5ID0gTlVMTDsNCisJSU1GUHJlc2VudGF0aW9uRGVzY3JpcHRv
ciogcFNvdXJjZVBEID0gTlVMTDsNCisJRFdPUkQgY1NvdXJjZVN0cmVhbXMgPSAwOw0KKw0KKwkv
LyBDcmVhdGUgYSBuZXcgdG9wb2xvZ3kuDQorCUhSRVNVTFQgaHIgPSBNRkNyZWF0ZVRvcG9sb2d5
KCZwVG9wb2xvZ3kpOw0KKwlpZiAoRkFJTEVEKGhyKSkNCisJew0KKwkJZ290byBkb25lOw0KKwl9
DQorDQorCS8vIENyZWF0ZSB0aGUgcHJlc2VudGF0aW9uIGRlc2NyaXB0b3IgZm9yIHRoZSBtZWRp
YSBzb3VyY2UuDQorCWhyID0gbV9wU291cmNlLT5DcmVhdGVQcmVzZW50YXRpb25EZXNjcmlwdG9y
KCZwU291cmNlUEQpOw0KKwlpZiAoRkFJTEVEKGhyKSkNCisJew0KKwkJZ290byBkb25lOw0KKwl9
DQorDQorCS8vIEdldCB0aGUgbnVtYmVyIG9mIHN0cmVhbXMgaW4gdGhlIG1lZGlhIHNvdXJjZS4N
CisJaHIgPSBwU291cmNlUEQtPkdldFN0cmVhbURlc2NyaXB0b3JDb3VudCgmY1NvdXJjZVN0cmVh
bXMpOw0KKwlpZiAoRkFJTEVEKGhyKSkNCisJew0KKwkJZ290byBkb25lOw0KKwl9DQorDQorCS8v
IEZvciBlYWNoIHN0cmVhbSwgY3JlYXRlIHRoZSB0b3BvbG9neSBub2RlcyBhbmQgYWRkIHRoZW0g
dG8gdGhlIHRvcG9sb2d5Lg0KKwlmb3IgKERXT1JEIGkgPSAwOyBpIDwgY1NvdXJjZVN0cmVhbXM7
IGkrKykNCisJew0KKwkJaHIgPSBBZGRCcmFuY2hUb1BhcnRpYWxUb3BvbG9neShwVG9wb2xvZ3ks
IHBTb3VyY2VQRCwgaSk7DQorCQlpZiAoRkFJTEVEKGhyKSkNCisJCXsNCisJCQlnb3RvIGRvbmU7
DQorCQl9DQorCX0NCisNCisJLy8gUmV0dXJuIHRoZSBJTUZUb3BvbG9neSBwb2ludGVyIHRvIHRo
ZSBjYWxsZXIuDQorCSpwcFRvcG9sb2d5ID0gcFRvcG9sb2d5Ow0KKwkoKnBwVG9wb2xvZ3kpLT5B
ZGRSZWYoKTsNCisNCitkb25lOg0KKwlTYWZlUmVsZWFzZSgmcFRvcG9sb2d5KTsNCisJU2FmZVJl
bGVhc2UoJnBTb3VyY2VQRCk7DQorCXJldHVybiBocjsNCit9DQorDQorDQorLy8gIEFkZHMgYSB0
b3BvbG9neSBicmFuY2ggZm9yIG9uZSBzdHJlYW0uDQorLy8NCisvLyAgcFRvcG9sb2d5OiBQb2lu
dGVyIHRvIHRoZSB0b3BvbG9neSBvYmplY3QuDQorLy8gIHBTb3VyY2VQRDogVGhlIHNvdXJjZSdz
IHByZXNlbnRhdGlvbiBkZXNjcmlwdG9yLg0KKy8vICBpU3RyZWFtOiBJbmRleCBvZiB0aGUgc3Ry
ZWFtIHRvIHJlbmRlci4NCisvLw0KKy8vICBQcmUtY29uZGl0aW9uczogVGhlIHRvcG9sb2d5IG11
c3QgYmUgY3JlYXRlZCBhbHJlYWR5Lg0KKy8vDQorLy8gIE5vdGVzOiBGb3IgZWFjaCBzdHJlYW0s
IHdlIG11c3QgZG8gdGhlIGZvbGxvd2luZzoNCisvLyAgICAxLiBDcmVhdGUgYSBzb3VyY2Ugbm9k
ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHN0cmVhbS4NCisvLyAgICAyLiBDcmVhdGUgYW4gb3V0cHV0
IG5vZGUgZm9yIHRoZSByZW5kZXJlci4NCisvLyAgICAzLiBDb25uZWN0IHRoZSB0d28gbm9kZXMu
DQorLy8gIFRoZSBtZWRpYSBzZXNzaW9uIHdpbGwgcmVzb2x2ZSB0aGUgdG9wb2xvZ3ksIHNvIHdl
IGRvIG5vdCBoYXZlDQorLy8gIHRvIHdvcnJ5IGFib3V0IGRlY29kZXJzIG9yIG90aGVyIHRyYW5z
Zm9ybXMuDQorDQorSFJFU1VMVCBDUGxheWVyOjpBZGRCcmFuY2hUb1BhcnRpYWxUb3BvbG9neSgN
CisJSU1GVG9wb2xvZ3kgKnBUb3BvbG9neSwNCisJSU1GUHJlc2VudGF0aW9uRGVzY3JpcHRvciAq
cFNvdXJjZVBELA0KKwlEV09SRCBpU3RyZWFtDQorCSkNCit7DQorCWFzc2VydChwVG9wb2xvZ3kg
IT0gTlVMTCk7DQorDQorCUlNRlN0cmVhbURlc2NyaXB0b3IqIHBTb3VyY2VTRCA9IE5VTEw7DQor
CUlNRlRvcG9sb2d5Tm9kZSogcFNvdXJjZU5vZGUgPSBOVUxMOw0KKwlJTUZUb3BvbG9neU5vZGUq
IHBPdXRwdXROb2RlID0gTlVMTDsNCisJQk9PTCBmU2VsZWN0ZWQgPSBGQUxTRTsNCisNCisJLy8g
R2V0IHRoZSBzdHJlYW0gZGVzY3JpcHRvciBmb3IgdGhpcyBzdHJlYW0uDQorCUhSRVNVTFQgaHIg
PSBwU291cmNlUEQtPkdldFN0cmVhbURlc2NyaXB0b3JCeUluZGV4KGlTdHJlYW0sICZmU2VsZWN0
ZWQsICZwU291cmNlU0QpOw0KKwlpZiAoRkFJTEVEKGhyKSkNCisJew0KKwkJZ290byBkb25lOw0K
Kwl9DQorDQorCS8vIENyZWF0ZSB0aGUgdG9wb2xvZ3kgYnJhbmNoIG9ubHkgaWYgdGhlIHN0cmVh
bSBpcyBzZWxlY3RlZC4NCisJLy8gT3RoZXJ3aXNlLCBkbyBub3RoaW5nLg0KKwlpZiAoZlNlbGVj
dGVkKQ0KKwl7DQorCQkvLyBDcmVhdGUgYSBzb3VyY2Ugbm9kZSBmb3IgdGhpcyBzdHJlYW0uDQor
CQlociA9IENyZWF0ZVNvdXJjZVN0cmVhbU5vZGUobV9wU291cmNlLCBwU291cmNlUEQsIHBTb3Vy
Y2VTRCwgJnBTb3VyY2VOb2RlKTsNCisJCWlmIChGQUlMRUQoaHIpKQ0KKwkJew0KKwkJCWdvdG8g
ZG9uZTsNCisJCX0NCisNCisJCS8vIENyZWF0ZSB0aGUgb3V0cHV0IG5vZGUgZm9yIHRoZSByZW5k
ZXJlci4NCisJCWhyID0gQ3JlYXRlT3V0cHV0Tm9kZShwU291cmNlU0QsIG1faHduZFZpZGVvLCAm
cE91dHB1dE5vZGUpOw0KKwkJaWYgKEZBSUxFRChocikpDQorCQl7DQorCQkJZ290byBkb25lOw0K
KwkJfQ0KKw0KKwkJLy8gQWRkIGJvdGggbm9kZXMgdG8gdGhlIHRvcG9sb2d5Lg0KKwkJaHIgPSBw
VG9wb2xvZ3ktPkFkZE5vZGUocFNvdXJjZU5vZGUpOw0KKwkJaWYgKEZBSUxFRChocikpDQorCQl7
DQorCQkJZ290byBkb25lOw0KKwkJfQ0KKw0KKwkJaHIgPSBwVG9wb2xvZ3ktPkFkZE5vZGUocE91
dHB1dE5vZGUpOw0KKwkJaWYgKEZBSUxFRChocikpDQorCQl7DQorCQkJZ290byBkb25lOw0KKwkJ
fQ0KKw0KKwkJLy8gQ29ubmVjdCB0aGUgc291cmNlIG5vZGUgdG8gdGhlIG91dHB1dCBub2RlLg0K
KwkJaHIgPSBwU291cmNlTm9kZS0+Q29ubmVjdE91dHB1dCgwLCBwT3V0cHV0Tm9kZSwgMCk7DQor
CX0NCisNCitkb25lOg0KKwkvLyBDbGVhbiB1cC4NCisJU2FmZVJlbGVhc2UoJnBTb3VyY2VTRCk7
DQorCVNhZmVSZWxlYXNlKCZwU291cmNlTm9kZSk7DQorCVNhZmVSZWxlYXNlKCZwT3V0cHV0Tm9k
ZSk7DQorCXJldHVybiBocjsNCit9DQorDQorDQorDQorLy8gIENyZWF0ZXMgYSBzb3VyY2Utc3Ry
ZWFtIG5vZGUgZm9yIGEgc3RyZWFtLg0KKy8vDQorLy8gIHBTb3VyY2U6IFBvaW50ZXIgdG8gdGhl
IG1lZGlhIHNvdXJjZSB0aGF0IGNvbnRhaW5zIHRoZSBzdHJlYW0uDQorLy8gIHBTb3VyY2VQRDog
UHJlc2VudGF0aW9uIGRlc2NyaXB0b3IgZm9yIHRoZSBtZWRpYSBzb3VyY2UuDQorLy8gIHBTb3Vy
Y2VTRDogU3RyZWFtIGRlc2NyaXB0b3IgZm9yIHRoZSBzdHJlYW0uDQorLy8gIHBwTm9kZTogUmVj
ZWl2ZXMgYSBwb2ludGVyIHRvIHRoZSBuZXcgbm9kZS4NCisNCitIUkVTVUxUIENyZWF0ZVNvdXJj
ZVN0cmVhbU5vZGUoDQorCUlNRk1lZGlhU291cmNlICpwU291cmNlLA0KKwlJTUZQcmVzZW50YXRp
b25EZXNjcmlwdG9yICpwU291cmNlUEQsDQorCUlNRlN0cmVhbURlc2NyaXB0b3IgKnBTb3VyY2VT
RCwNCisJSU1GVG9wb2xvZ3lOb2RlICoqcHBOb2RlDQorCSkNCit7DQorCWlmICghcFNvdXJjZSB8
fCAhcFNvdXJjZVBEIHx8ICFwU291cmNlU0QgfHwgIXBwTm9kZSkNCisJew0KKwkJcmV0dXJuIEVf
UE9JTlRFUjsNCisJfQ0KKw0KKwlJTUZUb3BvbG9neU5vZGUgKnBOb2RlID0gTlVMTDsNCisNCisJ
Ly8gQ3JlYXRlIHRoZSBzb3VyY2Utc3RyZWFtIG5vZGUuDQorCUhSRVNVTFQgaHIgPSBNRkNyZWF0
ZVRvcG9sb2d5Tm9kZShNRl9UT1BPTE9HWV9TT1VSQ0VTVFJFQU1fTk9ERSwgJnBOb2RlKTsNCisJ
aWYgKEZBSUxFRChocikpDQorCXsNCisJCWdvdG8gZG9uZTsNCisJfQ0KKw0KKwkvLyBTZXQgYXR0
cmlidXRlOiBQb2ludGVyIHRvIHRoZSBtZWRpYSBzb3VyY2UuDQorCWhyID0gcE5vZGUtPlNldFVu
a25vd24oTUZfVE9QT05PREVfU09VUkNFLCBwU291cmNlKTsNCisJaWYgKEZBSUxFRChocikpDQor
CXsNCisJCWdvdG8gZG9uZTsNCisJfQ0KKw0KKwkvLyBTZXQgYXR0cmlidXRlOiBQb2ludGVyIHRv
IHRoZSBwcmVzZW50YXRpb24gZGVzY3JpcHRvci4NCisJaHIgPSBwTm9kZS0+U2V0VW5rbm93bihN
Rl9UT1BPTk9ERV9QUkVTRU5UQVRJT05fREVTQ1JJUFRPUiwgcFNvdXJjZVBEKTsNCisJaWYgKEZB
SUxFRChocikpDQorCXsNCisJCWdvdG8gZG9uZTsNCisJfQ0KKw0KKwkvLyBTZXQgYXR0cmlidXRl
OiBQb2ludGVyIHRvIHRoZSBzdHJlYW0gZGVzY3JpcHRvci4NCisJaHIgPSBwTm9kZS0+U2V0VW5r
bm93bihNRl9UT1BPTk9ERV9TVFJFQU1fREVTQ1JJUFRPUiwgcFNvdXJjZVNEKTsNCisJaWYgKEZB
SUxFRChocikpDQorCXsNCisJCWdvdG8gZG9uZTsNCisJfQ0KKw0KKwkvLyBSZXR1cm4gdGhlIElN
RlRvcG9sb2d5Tm9kZSBwb2ludGVyIHRvIHRoZSBjYWxsZXIuDQorCSpwcE5vZGUgPSBwTm9kZTsN
CisJKCpwcE5vZGUpLT5BZGRSZWYoKTsNCisNCitkb25lOg0KKwlTYWZlUmVsZWFzZSgmcE5vZGUp
Ow0KKwlyZXR1cm4gaHI7DQorfQ0KKw0KKw0KKw0KKw0KKy8vICBDcmVhdGVzIGFuIG91dHB1dCBu
b2RlIGZvciBhIHN0cmVhbS4NCisvLw0KKy8vICBwU291cmNlU0Q6IFN0cmVhbSBkZXNjcmlwdG9y
IGZvciB0aGUgc3RyZWFtLg0KKy8vICBwcE5vZGU6IFJlY2VpdmVzIGEgcG9pbnRlciB0byB0aGUg
bmV3IG5vZGUuDQorLy8NCisvLyAgTm90ZXM6DQorLy8gIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUg
Zm9sbG93aW5nOg0KKy8vICAxLiBDaG9vc2VzIGEgcmVuZGVyZXIgYmFzZWQgb24gdGhlIG1lZGlh
IHR5cGUgb2YgdGhlIHN0cmVhbS4NCisvLyAgMi4gQ3JlYXRlcyBhbiBJQWN0aXZhdGUgb2JqZWN0
IGZvciB0aGUgcmVuZGVyZXIuDQorLy8gIDMuIENyZWF0ZXMgYW4gb3V0cHV0IHRvcG9sb2d5IG5v
ZGUuDQorLy8gIDQuIFNldHMgdGhlIElBY3RpdmF0ZSBwb2ludGVyIG9uIHRoZSBub2RlLg0KKw0K
K0hSRVNVTFQgQ3JlYXRlT3V0cHV0Tm9kZSgNCisJSU1GU3RyZWFtRGVzY3JpcHRvciAqcFNvdXJj
ZVNELA0KKwlIV05EIGh3bmRWaWRlbywNCisJSU1GVG9wb2xvZ3lOb2RlICoqcHBOb2RlDQorCSkN
Cit7DQorDQorCUlNRlRvcG9sb2d5Tm9kZSAqcE5vZGUgPSBOVUxMOw0KKwlJTUZNZWRpYVR5cGVI
YW5kbGVyICpwSGFuZGxlciA9IE5VTEw7DQorCUlNRkFjdGl2YXRlICpwUmVuZGVyZXJBY3RpdmF0
ZSA9IE5VTEw7DQorDQorCUdVSUQgZ3VpZE1ham9yVHlwZSA9IEdVSURfTlVMTDsNCisNCisJLy8g
R2V0IHRoZSBzdHJlYW0gSUQuDQorCURXT1JEIHN0cmVhbUlEID0gMDsNCisJcFNvdXJjZVNELT5H
ZXRTdHJlYW1JZGVudGlmaWVyKCZzdHJlYW1JRCk7IC8vIEp1c3QgZm9yIGRlYnVnZ2luZywgaWdu
b3JlIGFueSBmYWlsdXJlcy4NCisNCisJLy8gR2V0IHRoZSBtZWRpYSB0eXBlIGhhbmRsZXIgZm9y
IHRoZSBzdHJlYW0uDQorCUhSRVNVTFQgaHIgPSBwU291cmNlU0QtPkdldE1lZGlhVHlwZUhhbmRs
ZXIoJnBIYW5kbGVyKTsNCisJaWYgKEZBSUxFRChocikpDQorCXsNCisJCWdvdG8gZG9uZTsNCisJ
fQ0KKw0KKwkvLyBHZXQgdGhlIG1ham9yIG1lZGlhIHR5cGUuDQorCWhyID0gcEhhbmRsZXItPkdl
dE1ham9yVHlwZSgmZ3VpZE1ham9yVHlwZSk7DQorCWlmIChGQUlMRUQoaHIpKQ0KKwl7DQorCQln
b3RvIGRvbmU7DQorCX0NCisNCisJLy8gQ3JlYXRlIGEgZG93bnN0cmVhbSBub2RlLg0KKwlociA9
IE1GQ3JlYXRlVG9wb2xvZ3lOb2RlKE1GX1RPUE9MT0dZX09VVFBVVF9OT0RFLCAmcE5vZGUpOw0K
KwlpZiAoRkFJTEVEKGhyKSkNCisJew0KKwkJZ290byBkb25lOw0KKwl9DQorDQorCS8vIENyZWF0
ZSBhbiBJTUZBY3RpdmF0ZSBvYmplY3QgZm9yIHRoZSByZW5kZXJlciwgYmFzZWQgb24gdGhlIG1l
ZGlhIHR5cGUuDQorCWlmIChNRk1lZGlhVHlwZV9BdWRpbyA9PSBndWlkTWFqb3JUeXBlKQ0KKwl7
DQorCQkvLyBDcmVhdGUgdGhlIGF1ZGlvIHJlbmRlcmVyLg0KKwkJaHIgPSBNRkNyZWF0ZUF1ZGlv
UmVuZGVyZXJBY3RpdmF0ZSgmcFJlbmRlcmVyQWN0aXZhdGUpOw0KKwl9DQorCWVsc2UgaWYgKE1G
TWVkaWFUeXBlX1ZpZGVvID09IGd1aWRNYWpvclR5cGUpDQorCXsNCisJCS8vIENyZWF0ZSB0aGUg
dmlkZW8gcmVuZGVyZXIuDQorCQlociA9IE1GQ3JlYXRlVmlkZW9SZW5kZXJlckFjdGl2YXRlKGh3
bmRWaWRlbywgJnBSZW5kZXJlckFjdGl2YXRlKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCWhyID0g
RV9GQUlMOw0KKwl9DQorCWlmIChGQUlMRUQoaHIpKQ0KKwl7DQorCQlnb3RvIGRvbmU7DQorCX0N
CisNCisJLy8gU2V0IHRoZSBJQWN0aXZhdGUgb2JqZWN0IG9uIHRoZSBvdXRwdXQgbm9kZS4NCisJ
aHIgPSBwTm9kZS0+U2V0T2JqZWN0KHBSZW5kZXJlckFjdGl2YXRlKTsNCisJaWYgKEZBSUxFRCho
cikpDQorCXsNCisJCWdvdG8gZG9uZTsNCisJfQ0KKw0KKwkvLyBSZXR1cm4gdGhlIElNRlRvcG9s
b2d5Tm9kZSBwb2ludGVyIHRvIHRoZSBjYWxsZXIuDQorCSpwcE5vZGUgPSBwTm9kZTsNCisJKCpw
cE5vZGUpLT5BZGRSZWYoKTsNCisNCitkb25lOg0KKwlTYWZlUmVsZWFzZSgmcE5vZGUpOw0KKwlT
YWZlUmVsZWFzZSgmcEhhbmRsZXIpOw0KKwlTYWZlUmVsZWFzZSgmcFJlbmRlcmVyQWN0aXZhdGUp
Ow0KKwlyZXR1cm4gaHI7DQorfQ0KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLw0KKy8vIFRISVMg
Q09ERSBBTkQgSU5GT1JNQVRJT04gSVMgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZ
IE9GDQorLy8gQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5H
IEJVVCBOT1QgTElNSVRFRCBUTw0KKy8vIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORC9PUiBGSVRORVNTIEZPUiBBDQorLy8gUEFSVElDVUxBUiBQVVJQT1NFLg0K
Ky8vDQorLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMg
cmVzZXJ2ZWQuDQorLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KKy8vIE5vdGU6IE1vc3Qgb2Yg
dGhlIGludGVyZXN0aW5nIGNvZGUgaXMgaW4gUGxheWVyLmNwcA0KKw0KKyNpbmNsdWRlIDxhc3Nl
cnQuaD4NCisNCitjb25zdCB3Y2hhcl90IHN6VGl0bGVbXSA9IEwiQmFzaWNQbGF5YmFjayI7DQor
Y29uc3Qgd2NoYXJfdCBzeldpbmRvd0NsYXNzW10gPSBMIk1GQkFTSUNQTEFZQkFDSyI7DQorDQor
SElOU1RBTkNFICAgZ19oSW5zdGFuY2U7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVu
dCBpbnN0YW5jZQ0KK0JPT0wgICAgICAgIGdfYlJlcGFpbnRDbGllbnQgPSBUUlVFOyAgICAgICAg
ICAgIC8vIFJlcGFpbnQgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBhcmVhPw0KK0NQbGF5ZXIgICAg
ICpnX3BQbGF5ZXIgPSBOVUxMOyAgICAgICAgICAgICAgICAgIC8vIEdsb2JhbCBwbGF5ZXIgb2Jq
ZWN0Lg0KKw0KKy8vIE5vdGU6IEFmdGVyIFdNX0NSRUFURSBpcyBwcm9jZXNzZWQsIGdfcFBsYXll
ciByZW1haW5zIHZhbGlkIHVudGlsIHRoZQ0KKy8vIHdpbmRvdyBpcyBkZXN0cm95ZWQuDQorDQor
TFJFU1VMVCBDQUxMQkFDSyAgICBXbmRQcm9jKEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNKTsN
Cit2b2lkICAgICAgICAgICAgICAgIE5vdGlmeUVycm9yKEhXTkQgaHduZCwgUENXU1RSIHNFcnJv
ck1lc3NhZ2UsIEhSRVNVTFQgaHIpOw0KK0hSRVNVTFQgICAgICAgICAgICAgQWxsb2NHZXRXaW5k
b3dUZXh0KEhXTkQgaHduZCwgUFdTVFIqIHBzelRleHQsIERXT1JEICpwY2NoTGVuKTsNCisNCisv
LyBNZXNzYWdlIGhhbmRsZXJzDQorTFJFU1VMVCAgICAgICAgICAgICBPbkNyZWF0ZVdpbmRvdyhI
V05EIGh3bmQpOw0KK3ZvaWQgICAgICAgICAgICAgICAgT25GaWxlT3BlbihIV05EIGh3bmQpOw0K
K3ZvaWQgICAgICAgICAgICAgICAgT25PcGVuVVJMKEhXTkQgaHduZCk7DQordm9pZCAgICAgICAg
ICAgICAgICBPblBsYXllckV2ZW50KEhXTkQgaHduZCwgV1BBUkFNIHBVbmtQdHIpOw0KK3ZvaWQg
ICAgICAgICAgICAgICAgT25QYWludChIV05EIGh3bmQpOw0KKw0KK0xSRVNVTFQgQ0FMTEJBQ0sg
V25kUHJvYyhIV05EIGh3bmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQ
YXJhbSkNCit7DQorCXN3aXRjaCAobWVzc2FnZSkNCisJew0KKwljYXNlIFdNX0NSRUFURToNCisJ
CXJldHVybiBPbkNyZWF0ZVdpbmRvdyhod25kKTsNCisNCisJY2FzZSBXTV9QQUlOVDoNCisJCU9u
UGFpbnQoaHduZCk7DQorCQlicmVhazsNCisNCisJY2FzZSBXTV9TSVpFOg0KKwkJZ19wUGxheWVy
LT5SZXNpemVWaWRlbyhMT1dPUkQobFBhcmFtKSwgSElXT1JEKGxQYXJhbSkpOw0KKwkJYnJlYWs7
DQorDQorCWNhc2UgV01fRVJBU0VCS0dORDoNCisJCS8vIFN1cHByZXNzIHdpbmRvdyBlcmFzaW5n
LCB0byByZWR1Y2UgZmxpY2tlcmluZyB3aGlsZSB0aGUgdmlkZW8gaXMgcGxheWluZy4NCisJCXJl
dHVybiAxOw0KKw0KKwljYXNlIFdNX0RFU1RST1k6DQorCQlQb3N0UXVpdE1lc3NhZ2UoMCk7DQor
CQlicmVhazsNCisNCisJY2FzZSBXTV9BUFBfUExBWUVSX0VWRU5UOg0KKwkJT25QbGF5ZXJFdmVu
dChod25kLCB3UGFyYW0pOw0KKwkJYnJlYWs7DQorDQorCWRlZmF1bHQ6DQorCQlyZXR1cm4gRGVm
V2luZG93UHJvYyhod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7DQorCX0NCisJcmV0dXJu
IDA7DQorfQ0KKw0KKw0KKy8vICBIYW5kbGVzIHRoZSBXTV9DUkVBVEUgbWVzc2FnZS4NCisvLw0K
Ky8vICBod25kOiBIYW5kbGUgdG8gdGhlIHZpZGVvIGNsaXBwaW5nIHdpbmRvdy4gKEZvciB0aGlz
IHNhbXBsZSwgdGhlDQorLy8gICAgICAgIHZpZGVvIHdpbmRvdyBpcyBqdXN0IHRoZSBtYWluIGFw
cGxpY2F0aW9uIHdpbmRvdy4pDQorDQorTFJFU1VMVCBPbkNyZWF0ZVdpbmRvdyhIV05EIGh3bmQp
DQorew0KKwkvLyBJbml0aWFsaXplIHRoZSBwbGF5ZXIgb2JqZWN0Lg0KKwlIUkVTVUxUIGhyID0g
Q1BsYXllcjo6Q3JlYXRlSW5zdGFuY2UoaHduZCwgaHduZCwgJmdfcFBsYXllcik7DQorDQorCWlm
IChTVUNDRUVERUQoaHIpKQ0KKwl7DQorCQlyZXR1cm4gMDsgICAvLyBTdWNjZXNzLg0KKwl9DQor
CWVsc2UNCisJew0KKwkJTm90aWZ5RXJyb3IoTlVMTCwgTCJDb3VsZCBub3QgaW5pdGlhbGl6ZSB0
aGUgcGxheWVyIG9iamVjdC4iLCBocik7DQorCQlyZXR1cm4gLTE7ICAvLyBEZXN0cm95IHRoZSB3
aW5kb3cNCisJfQ0KK30NCisNCisvLyAgRGVzY3JpcHRpb246IEhhbmRsZXMgV01fUEFJTlQgbWVz
c2FnZXMuDQorDQordm9pZCBPblBhaW50KEhXTkQgaHduZCkNCit7DQorCWlmIChnX2JSZXBhaW50
Q2xpZW50KQ0KKwl7DQorCQlQQUlOVFNUUlVDVCBwczsNCisJCUhEQyBoZGMgPSBCZWdpblBhaW50
KGh3bmQsICZwcyk7DQorDQorCQkvLyBUaGUgdmlkZW8gaXMgbm90IHBsYXlpbmcsIHNvIHdlIG11
c3QgcGFpbnQgdGhlIGFwcGxpY2F0aW9uIHdpbmRvdy4NCisJCVJFQ1QgcmM7DQorCQlHZXRDbGll
bnRSZWN0KGh3bmQsICZyYyk7DQorCQlGaWxsUmVjdChoZGMsICZyYywgKEhCUlVTSClDT0xPUl9X
SU5ET1cpOw0KKw0KKwkJRW5kUGFpbnQoaHduZCwgJnBzKTsNCisJfQ0KKwllbHNlDQorCXsNCisJ
CS8vIFZpZGVvIGlzIHBsYXlpbmcuIEFzayB0aGUgcGxheWVyIHRvIHJlcGFpbnQuDQorCQlnX3BQ
bGF5ZXItPlJlcGFpbnQoKTsNCisJfQ0KK30NCisNCit2b2lkIE9uUGxheWVyRXZlbnQoSFdORCBo
d25kLCBXUEFSQU0gcFVua1B0cikNCit7DQorCUhSRVNVTFQgaHIgPSBTX09LOw0KKw0KKwlociA9
IGdfcFBsYXllci0+SGFuZGxlRXZlbnQocFVua1B0cik7DQorDQorCWlmIChGQUlMRUQoaHIpKQ0K
Kwl7DQorCQlOb3RpZnlFcnJvcihod25kLCBMIkFuIGVycm9yIG9jY3VycmVkLiIsIGhyKTsNCisJ
fQ0KK30NCisNCisvLyAgU2hvdyBhIG1lc3NhZ2UgYm94IHdpdGggYW4gZXJyb3IgbWVzc2FnZS4N
CisNCit2b2lkIE5vdGlmeUVycm9yKEhXTkQgaHduZCwgUENXU1RSIHNFcnJvck1lc3NhZ2UsIEhS
RVNVTFQgaHJFcnIpDQorew0KKwljb25zdCBzaXplX3QgTUVTU0FHRV9MRU4gPSA1MTI7DQorCXdj
aGFyX3QgbWVzc2FnZVtNRVNTQUdFX0xFTl07DQorDQorCUhSRVNVTFQgaHIgPSBTdHJpbmdDY2hQ
cmludGYobWVzc2FnZSwgTUVTU0FHRV9MRU4sIEwiJXMgKEhSRVNVTFQgPSAweCVYKSIsIHNFcnJv
ck1lc3NhZ2UsIGhyRXJyKTsNCisJaWYgKFNVQ0NFRURFRChocikpDQorCXsNCisJCU1lc3NhZ2VC
b3goaHduZCwgbWVzc2FnZSwgTlVMTCwgTUJfT0sgfCBNQl9JQ09ORVJST1IpOw0KKwl9DQorfQ0K
Kw0KK0hSRVNVTFQgQWxsb2NHZXRXaW5kb3dUZXh0KEhXTkQgaHduZCwgUFdTVFIqIHBzelRleHQs
IERXT1JEICpwY2NoTGVuKQ0KK3sNCisJaWYgKHBzelRleHQgPT0gTlVMTCkNCisJew0KKwkJcmV0
dXJuIEVfUE9JTlRFUjsNCisJfQ0KKw0KKwkqcHN6VGV4dCA9IE5VTEw7DQorDQorCWludCBjY2gg
PSBHZXRXaW5kb3dUZXh0TGVuZ3RoKGh3bmQpOw0KKwlpZiAoY2NoIDwgMCkNCisJew0KKwkJcmV0
dXJuIEVfVU5FWFBFQ1RFRDsgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IHJldHVybiBhIG5l
Z2F0aXZlIHZhbHVlLg0KKwl9DQorDQorCVRDSEFSICpzelRtcCA9IChUQ0hBUiopQ29UYXNrTWVt
QWxsb2Moc2l6ZW9mKFRDSEFSKSogKGNjaCArIDEpKTsgLy8gSW5jbHVkZSByb29tIGZvciB0ZXJt
aW5hdGluZyBOVUxMIGNoYXJhY3Rlcg0KKw0KKwlpZiAoIXN6VG1wKQ0KKwl7DQorCQlyZXR1cm4g
RV9PVVRPRk1FTU9SWTsNCisJfQ0KKw0KKwlpZiAoY2NoID09IDApDQorCXsNCisJCXN6VG1wWzBd
ID0gTCdcMCc7ICAvLyBObyB0ZXh0Lg0KKwl9DQorCWVsc2UNCisJew0KKwkJaW50IHJlcyA9IEdl
dFdpbmRvd1RleHQoaHduZCwgc3pUbXAsIChjY2ggKyAxKSk7ICAvLyBTaXplIGluY2x1ZGVzIE5V
TEwgY2hhcmFjdGVyDQorDQorCQkvLyBHZXRXaW5kb3dUZXh0IHJldHVybnMgMCBpZiAoYSkgdGhl
cmUgaXMgbm8gdGV4dCBvciAoYikgaXQgZmFpbGVkLg0KKwkJLy8gV2UgY2hlY2tlZCBmb3IgKGEp
IGFscmVhZHksIHNvIDAgbWVhbnMgZmFpbHVyZSBoZXJlLg0KKwkJaWYgKHJlcyA9PSAwKQ0KKwkJ
ew0KKwkJCUNvVGFza01lbUZyZWUoc3pUbXApOw0KKwkJCXJldHVybiBfX0hSRVNVTFRfRlJPTV9X
SU4zMihHZXRMYXN0RXJyb3IoKSk7DQorCQl9DQorCX0NCisNCisJLy8gSWYgd2UgZ290IGhlcmUs
IHN6VG1wIGlzIHZhbGlkLCBzbyByZXR1cm4gaXQgdG8gdGhlIGNhbGxlci4NCisJKnBzelRleHQg
PSBzelRtcDsNCisJaWYgKHBjY2hMZW4pDQorCXsNCisJCSpwY2NoTGVuID0gc3RhdGljX2Nhc3Q8
RFdPUkQ+KGNjaCk7ICAvLyBSZXR1cm4gdGhlIGxlbmd0aCBOT1QgaW5jbHVkaW5nIHRoZSAnXDAn
IA0KKwl9DQorCXJldHVybiBTX09LOw0KK30KKwogbmFtZXNwYWNlIFdlYkNvcmUgewogCi0vLyBU
T0RPOiBJbXBsZW1lbnQgdmlkZW8gZnVuY3Rpb25hbGl0eSB1c2luZyBNZWRpYSBGb3VuZGF0aW9u
Ci0KIE1lZGlhUGxheWVyUHJpdmF0ZU1lZGlhRm91bmRhdGlvbjo6TWVkaWFQbGF5ZXJQcml2YXRl
TWVkaWFGb3VuZGF0aW9uKE1lZGlhUGxheWVyKiBwbGF5ZXIpIAogICAgIDogbV9wbGF5ZXIocGxh
eWVyKQogeworCVdORENMQVNTRVggd2NleDsNCisJSElOU1RBTkNFIGhJbnN0YW5jZSA9IFdlYkNv
cmU6Omluc3RhbmNlSGFuZGxlKCk7DQorDQorCS8vIFJlZ2lzdGVyIHRoZSB3aW5kb3cgY2xhc3Mu
DQorCVplcm9NZW1vcnkoJndjZXgsIHNpemVvZihXTkRDTEFTU0VYKSk7DQorCXdjZXguY2JTaXpl
ID0gc2l6ZW9mKFdORENMQVNTRVgpOw0KKwl3Y2V4LnN0eWxlID0gQ1NfSFJFRFJBVyB8IENTX1ZS
RURSQVc7DQorCXdjZXgubHBmblduZFByb2MgPSBXbmRQcm9jOw0KKwl3Y2V4LmhJbnN0YW5jZSA9
IGhJbnN0YW5jZTsNCisJd2NleC5scHN6Q2xhc3NOYW1lID0gc3pXaW5kb3dDbGFzczsNCisNCisJ
UmVnaXN0ZXJDbGFzc0V4KCZ3Y2V4KTsNCisNCisJLy8gQ3JlYXRlIHRoZSBhcHBsaWNhdGlvbiB3
aW5kb3cuDQorCW1fd2luZG93ID0gQ3JlYXRlV2luZG93KHN6V2luZG93Q2xhc3MsIHN6VGl0bGUs
IFdTX09WRVJMQVBQRURXSU5ET1csDQorCQlDV19VU0VERUZBVUxULCAwLCBDV19VU0VERUZBVUxU
LCAwLCBOVUxMLCBOVUxMLCBoSW5zdGFuY2UsIE5VTEwpOw0KKw0KKwkvLyBGaXhtZTogaGlkZSB0
aGUgd2luZG93IG9uY2UgSSBmaWd1cmUgb3V0IGhvdyB0byB0cmFuc2ZlciBwaXhlbHMgZnJvbSBp
dC4KKwlTaG93V2luZG93KG1fd2luZG93LCBTV19TSE9XREVGQVVMVCk7DQorCVVwZGF0ZVdpbmRv
dyhtX3dpbmRvdyk7DQogfQogCitNZWRpYVBsYXllclByaXZhdGVNZWRpYUZvdW5kYXRpb246On5N
ZWRpYVBsYXllclByaXZhdGVNZWRpYUZvdW5kYXRpb24oKQoreworLy8JZ19wUGxheWVyLT5TaHV0
ZG93bigpOw0KKy8vCWdfcFBsYXllci0+UmVsZWFzZSgpOworfQorCiBQYXNzT3duUHRyPE1lZGlh
UGxheWVyUHJpdmF0ZUludGVyZmFjZT4gTWVkaWFQbGF5ZXJQcml2YXRlTWVkaWFGb3VuZGF0aW9u
OjpjcmVhdGUoTWVkaWFQbGF5ZXIqIHBsYXllcikKIHsKICAgICByZXR1cm4gYWRvcHRQdHIobmV3
IE1lZGlhUGxheWVyUHJpdmF0ZU1lZGlhRm91bmRhdGlvbihwbGF5ZXIpKTsKQEAgLTU0LDExNiAr
MTM2MiwyNTIgQEAKIAogYm9vbCBNZWRpYVBsYXllclByaXZhdGVNZWRpYUZvdW5kYXRpb246Omlz
QXZhaWxhYmxlKCkgCiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKICAgICByZXR1cm4gdHJ1ZTsK
IH0KIAorc3RhdGljIEhhc2hTZXQ8U3RyaW5nPiBtaW1lVHlwZUNhY2hlKCkKK3sKKwlERVBSRUNB
VEVEX0RFRklORV9TVEFUSUNfTE9DQUwoSGFzaFNldDxTdHJpbmc+LCBjYWNoZSwgKCkpOworCXN0
YXRpYyBib29sIHR5cGVMaXN0SW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCWlmICh0eXBlTGlzdElu
aXRpYWxpemVkKQorCQlyZXR1cm4gY2FjaGU7CisKKwljb25zdCBjaGFyKiBtaW1lVHlwZXNbXSA9
IHsKKwkJImFwcGxpY2F0aW9uL29nZyIsCisJCSJhcHBsaWNhdGlvbi92bmQuYXBwbGUubXBlZ3Vy
bCIsCisJCSJhcHBsaWNhdGlvbi92bmQucm4tcmVhbG1lZGlhIiwKKwkJImFwcGxpY2F0aW9uL3gt
M2dwIiwKKwkJImFwcGxpY2F0aW9uL3gtcG4tcmVhbGF1ZGlvIiwKKwkJImF1ZGlvLzNncHAiLAor
CQkiYXVkaW8vYWFjIiwKKwkJImF1ZGlvL2ZsYWMiLAorCQkiYXVkaW8vaUxCQy1zaCIsCisJCSJh
dWRpby9taWRpIiwKKwkJImF1ZGlvL21vYmlsZS14bWYiLAorCQkiYXVkaW8vbXAxIiwKKwkJImF1
ZGlvL21wMiIsCisJCSJhdWRpby9tcDMiLAorCQkiYXVkaW8vbXA0IiwKKwkJImF1ZGlvL21wZWci
LAorCQkiYXVkaW8vb2dnIiwKKwkJImF1ZGlvL29wdXMiLAorCQkiYXVkaW8vcWNlbHAiLAorCQki
YXVkaW8vcmlmZi1taWRpIiwKKwkJImF1ZGlvL3NwZWV4IiwKKwkJImF1ZGlvL3dhdiIsCisJCSJh
dWRpby93ZWJtIiwKKwkJImF1ZGlvL3gtYWMzIiwKKwkJImF1ZGlvL3gtYWlmZiIsCisJCSJhdWRp
by94LWFtci1uYi1zaCIsCisJCSJhdWRpby94LWFtci13Yi1zaCIsCisJCSJhdWRpby94LWF1IiwK
KwkJImF1ZGlvL3gtYXkiLAorCQkiYXVkaW8veC1jZWx0IiwKKwkJImF1ZGlvL3gtZHRzIiwKKwkJ
ImF1ZGlvL3gtZmxhYyIsCisJCSJhdWRpby94LWdicyIsCisJCSJhdWRpby94LWdzbSIsCisJCSJh
dWRpby94LWd5bSIsCisJCSJhdWRpby94LWltZWxvZHkiLAorCQkiYXVkaW8veC1pcmNhbSIsCisJ
CSJhdWRpby94LWtzcyIsCisJCSJhdWRpby94LW00YSIsCisJCSJhdWRpby94LW1vZCIsCisJCSJh
dWRpby94LW1wMyIsCisJCSJhdWRpby94LW1wZWciLAorCQkiYXVkaW8veC1tdXNlcGFjayIsCisJ
CSJhdWRpby94LW5pc3QiLAorCQkiYXVkaW8veC1uc2YiLAorCQkiYXVkaW8veC1wYXJpcyIsCisJ
CSJhdWRpby94LXNhcCIsCisJCSJhdWRpby94LXNiYyIsCisJCSJhdWRpby94LXNkcyIsCisJCSJh
dWRpby94LXNob3J0ZW4iLAorCQkiYXVkaW8veC1zaWQiLAorCQkiYXVkaW8veC1zcGMiLAorCQki
YXVkaW8veC1zcGVleCIsCisJCSJhdWRpby94LXN2eCIsCisJCSJhdWRpby94LXR0YWZpbGUiLAor
CQkiYXVkaW8veC12Z20iLAorCQkiYXVkaW8veC12b2MiLAorCQkiYXVkaW8veC12b3JiaXMrb2dn
IiwKKwkJImF1ZGlvL3gtdzY0IiwKKwkJImF1ZGlvL3gtd2F2IiwKKwkJImF1ZGlvL3gtd2F2cGFj
ayIsCisJCSJhdWRpby94LXdhdnBhY2stY29ycmVjdGlvbiIsCisJCSJ2aWRlby8zZ3BwIiwKKwkJ
InZpZGVvL21qMiIsCisJCSJ2aWRlby9tcDQiLAorCQkidmlkZW8vbXBlZyIsCisJCSJ2aWRlby9t
cGVndHMiLAorCQkidmlkZW8vb2dnIiwKKwkJInZpZGVvL3F1aWNrdGltZSIsCisJCSJ2aWRlby92
aXZvIiwKKwkJInZpZGVvL3dlYm0iLAorCQkidmlkZW8veC1jZHhhIiwKKwkJInZpZGVvL3gtZGly
YWMiLAorCQkidmlkZW8veC1kdiIsCisJCSJ2aWRlby94LWZsaSIsCisJCSJ2aWRlby94LWZsdiIs
CisJCSJ2aWRlby94LWgyNjMiLAorCQkidmlkZW8veC1pdmYiLAorCQkidmlkZW8veC1tNHYiLAor
CQkidmlkZW8veC1tYXRyb3NrYSIsCisJCSJ2aWRlby94LW1uZyIsCisJCSJ2aWRlby94LW1zLWFz
ZiIsCisJCSJ2aWRlby94LW1zdmlkZW8iLAorCQkidmlkZW8veC1tdmUiLAorCQkidmlkZW8veC1u
dXYiLAorCQkidmlkZW8veC12Y2QiCisJfTsKKworCWZvciAodW5zaWduZWQgaSA9IDA7IGkgPCAo
c2l6ZW9mKG1pbWVUeXBlcykgLyBzaXplb2YoKm1pbWVUeXBlcykpOyArK2kpCisJCWNhY2hlLmFk
ZChTdHJpbmcobWltZVR5cGVzW2ldKSk7CisKKwl0eXBlTGlzdEluaXRpYWxpemVkID0gdHJ1ZTsK
KwlyZXR1cm4gY2FjaGU7Cit9CisKIHZvaWQgTWVkaWFQbGF5ZXJQcml2YXRlTWVkaWFGb3VuZGF0
aW9uOjpnZXRTdXBwb3J0ZWRUeXBlcyhIYXNoU2V0PFN0cmluZz4mIHR5cGVzKQogewotICAgIG5v
dEltcGxlbWVudGVkKCk7Ci0gICAgdHlwZXMgPSBIYXNoU2V0PFN0cmluZz4oKTsKKwl0eXBlcyA9
IG1pbWVUeXBlQ2FjaGUoKTsKIH0KIAogTWVkaWFQbGF5ZXI6OlN1cHBvcnRzVHlwZSBNZWRpYVBs
YXllclByaXZhdGVNZWRpYUZvdW5kYXRpb246OnN1cHBvcnRzVHlwZShjb25zdCBNZWRpYUVuZ2lu
ZVN1cHBvcnRQYXJhbWV0ZXJzJiBwYXJhbWV0ZXJzKQogewotICAgIG5vdEltcGxlbWVudGVkKCk7
Ci0gICAgcmV0dXJuIE1lZGlhUGxheWVyOjpJc05vdFN1cHBvcnRlZDsKKwlpZiAocGFyYW1ldGVy
cy50eXBlLmlzTnVsbCgpIHx8IHBhcmFtZXRlcnMudHlwZS5pc0VtcHR5KCkpCisJCXJldHVybiBN
ZWRpYVBsYXllcjo6SXNOb3RTdXBwb3J0ZWQ7CisKKwkvLyBzcGVjIHNheXMgd2Ugc2hvdWxkIG5v
dCByZXR1cm4gInByb2JhYmx5IiBpZiB0aGUgY29kZWNzIHN0cmluZyBpcyBlbXB0eQorCWlmICht
aW1lVHlwZUNhY2hlKCkuY29udGFpbnMocGFyYW1ldGVycy50eXBlKSkKKwkJcmV0dXJuIHBhcmFt
ZXRlcnMuY29kZWNzLmlzRW1wdHkoKSA/IE1lZGlhUGxheWVyOjpNYXlCZVN1cHBvcnRlZCA6IE1l
ZGlhUGxheWVyOjpJc1N1cHBvcnRlZDsKKwlyZXR1cm4gTWVkaWFQbGF5ZXI6OklzTm90U3VwcG9y
dGVkOwogfQogCi12b2lkIE1lZGlhUGxheWVyUHJpdmF0ZU1lZGlhRm91bmRhdGlvbjo6bG9hZChj
b25zdCBTdHJpbmcmKQordm9pZCBNZWRpYVBsYXllclByaXZhdGVNZWRpYUZvdW5kYXRpb246Omxv
YWQoY29uc3QgU3RyaW5nJiB1cmwpCiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKKwl3Y2hhcl90
IHdidWZmZXJbMTAwMF07CisJY2hhciBidWZmZXJbMTAwMF07CisJc3RybmNweShidWZmZXIsIHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHVybC5jaGFyYWN0ZXJzOCgpKSwgdXJsLmxlbmd0
aCgpKTsKKwlidWZmZXJbdXJsLmxlbmd0aCgpXSA9IDA7CisJTXVsdGlCeXRlVG9XaWRlQ2hhcihD
UF9BQ1AsIE1CX1BSRUNPTVBPU0VELCBidWZmZXIsIC0xLCB3YnVmZmVyLCB1cmwubGVuZ3RoKCkg
KyAxKTsKKworCWlmIChnX3BQbGF5ZXIpCisJCWdfcFBsYXllci0+T3BlblVSTCh3YnVmZmVyKTsK
IH0KIAotdm9pZCBNZWRpYVBsYXllclByaXZhdGVNZWRpYUZvdW5kYXRpb246OmNhbmNlbExvYWQo
KQorCit2b2lkIE1lZGlhUGxheWVyUHJpdmF0ZU1lZGlhRm91bmRhdGlvbjo6Y2FuY2VsTG9hZCgp
IAogewotICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXJQcml2YXRl
TWVkaWFGb3VuZGF0aW9uOjpwbGF5KCkKIHsKLSAgICBub3RJbXBsZW1lbnRlZCgpOworCW1fcGxh
eWVyLT5yZWFkeVN0YXRlQ2hhbmdlZCgpOworCWlmIChnX3BQbGF5ZXIpCisJCWdfcFBsYXllci0+
UGxheSgpOwogfQogCi12b2lkIE1lZGlhUGxheWVyUHJpdmF0ZU1lZGlhRm91bmRhdGlvbjo6cGF1
c2UoKQordm9pZCBNZWRpYVBsYXllclByaXZhdGVNZWRpYUZvdW5kYXRpb246OnBhdXNlKCkgCiB7
Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKKwltX3BsYXllci0+cmVhZHlTdGF0ZUNoYW5nZWQoKTsK
KwlpZiAoZ19wUGxheWVyKQorCQlnX3BQbGF5ZXItPlBhdXNlKCk7CiB9CiAKLUludFNpemUgTWVk
aWFQbGF5ZXJQcml2YXRlTWVkaWFGb3VuZGF0aW9uOjpuYXR1cmFsU2l6ZSgpIGNvbnN0IAorSW50
U2l6ZSBNZWRpYVBsYXllclByaXZhdGVNZWRpYUZvdW5kYXRpb246Om5hdHVyYWxTaXplKCkgY29u
c3QKIHsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIHJldHVybiBJbnRTaXplKDAsIDApOwor
CWlmIChnX3BQbGF5ZXIpCisJCXJldHVybiBnX3BQbGF5ZXItPm5hdHVyYWxTaXplKCk7CisJcmV0
dXJuIEludFNpemUoKTsKIH0KIAogYm9vbCBNZWRpYVBsYXllclByaXZhdGVNZWRpYUZvdW5kYXRp
b246Omhhc1ZpZGVvKCkgY29uc3QKIHsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIHJldHVy
biBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogYm9vbCBNZWRpYVBsYXllclByaXZhdGVNZWRp
YUZvdW5kYXRpb246Omhhc0F1ZGlvKCkgY29uc3QKIHsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwot
ICAgIHJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBNZWRpYVBsYXllclBy
aXZhdGVNZWRpYUZvdW5kYXRpb246OnNldFZpc2libGUoYm9vbCkKIHsKLSAgICBub3RJbXBsZW1l
bnRlZCgpOworCiB9CiAKIGJvb2wgTWVkaWFQbGF5ZXJQcml2YXRlTWVkaWFGb3VuZGF0aW9uOjpz
ZWVraW5nKCkgY29uc3QKIHsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIHJldHVybiBmYWxz
ZTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIGJvb2wgTWVkaWFQbGF5ZXJQcml2YXRlTWVkaWFGb3Vu
ZGF0aW9uOjpwYXVzZWQoKSBjb25zdAogewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0
dXJuIGZhbHNlOworCXJldHVybiBnX3BQbGF5ZXIgJiYgZ19wUGxheWVyLT5wYXVzZWQoKTsKIH0K
IAogTWVkaWFQbGF5ZXI6Ok5ldHdvcmtTdGF0ZSBNZWRpYVBsYXllclByaXZhdGVNZWRpYUZvdW5k
YXRpb246Om5ldHdvcmtTdGF0ZSgpIGNvbnN0Ci17IAotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0g
ICAgcmV0dXJuIE1lZGlhUGxheWVyOjpFbXB0eTsKK3sKKwlyZXR1cm4gTWVkaWFQbGF5ZXI6Okxv
YWRlZDsKIH0KIAogTWVkaWFQbGF5ZXI6OlJlYWR5U3RhdGUgTWVkaWFQbGF5ZXJQcml2YXRlTWVk
aWFGb3VuZGF0aW9uOjpyZWFkeVN0YXRlKCkgY29uc3QKIHsKLSAgICBub3RJbXBsZW1lbnRlZCgp
OwotICAgIHJldHVybiBNZWRpYVBsYXllcjo6SGF2ZU5vdGhpbmc7CisJcmV0dXJuIE1lZGlhUGxh
eWVyOjpIYXZlRW5vdWdoRGF0YTsKIH0KIAogc3RkOjp1bmlxdWVfcHRyPFBsYXRmb3JtVGltZVJh
bmdlcz4gTWVkaWFQbGF5ZXJQcml2YXRlTWVkaWFGb3VuZGF0aW9uOjpidWZmZXJlZCgpIGNvbnN0
Ci17IAotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIFBsYXRmb3JtVGltZVJhbmdl
czo6Y3JlYXRlKCk7Cit7CisJcmV0dXJuIFBsYXRmb3JtVGltZVJhbmdlczo6Y3JlYXRlKCk7CiB9
CiAKLWJvb2wgTWVkaWFQbGF5ZXJQcml2YXRlTWVkaWFGb3VuZGF0aW9uOjpkaWRMb2FkaW5nUHJv
Z3Jlc3MoKSBjb25zdAorZmxvYXQgTWVkaWFQbGF5ZXJQcml2YXRlTWVkaWFGb3VuZGF0aW9uOjpj
dXJyZW50VGltZSgpIGNvbnN0CiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1cm4g
ZmFsc2U7CisJaWYgKGdfcFBsYXllcikKKwkJcmV0dXJuIGdfcFBsYXllci0+Y3VycmVudFRpbWUo
KTsKKwlyZXR1cm4gMDsKIH0KIAotdm9pZCBNZWRpYVBsYXllclByaXZhdGVNZWRpYUZvdW5kYXRp
b246OnNldFNpemUoY29uc3QgSW50U2l6ZSYpCit2b2lkIE1lZGlhUGxheWVyUHJpdmF0ZU1lZGlh
Rm91bmRhdGlvbjo6c2VlayhmbG9hdCBuZXdUaW1lKQogewotICAgIG5vdEltcGxlbWVudGVkKCk7
CisJaWYgKGdfcFBsYXllcikKKwkJZ19wUGxheWVyLT5zZWVrKG5ld1RpbWUpOwogfQogCitmbG9h
dCBNZWRpYVBsYXllclByaXZhdGVNZWRpYUZvdW5kYXRpb246OmR1cmF0aW9uKCkgY29uc3QKK3sK
KwlpZiAoZ19wUGxheWVyKQorCQlyZXR1cm4gZ19wUGxheWVyLT5kdXJhdGlvbigpOworCXJldHVy
biAwOworfQorCitmbG9hdCBNZWRpYVBsYXllclByaXZhdGVNZWRpYUZvdW5kYXRpb246Om1heFRp
bWVTZWVrYWJsZSgpIGNvbnN0Cit7CisJaWYgKGdfcFBsYXllcikKKwkJcmV0dXJuIGdfcFBsYXll
ci0+ZHVyYXRpb24oKTsKKwlyZXR1cm4gMDsKK30KKworYm9vbCBNZWRpYVBsYXllclByaXZhdGVN
ZWRpYUZvdW5kYXRpb246OmRpZExvYWRpbmdQcm9ncmVzcygpIGNvbnN0IHsgcmV0dXJuIHRydWU7
IH0KKwordm9pZCBNZWRpYVBsYXllclByaXZhdGVNZWRpYUZvdW5kYXRpb246OnNldFNpemUoY29u
c3QgSW50U2l6ZSYgc2l6ZSkKK3sKKwlpZiAoZ19wUGxheWVyKQorCQlnX3BQbGF5ZXItPlJlc2l6
ZVZpZGVvKHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSk7Cit9CisKIHZvaWQgTWVkaWFQbGF5
ZXJQcml2YXRlTWVkaWFGb3VuZGF0aW9uOjpwYWludChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQs
IGNvbnN0IEludFJlY3QmIHJlY3QpCiB7CiAgICAgaWYgKGNvbnRleHQtPnBhaW50aW5nRGlzYWJs
ZWQoKQotICAgICAgICB8fCAhbV9wbGF5ZXItPnZpc2libGUoKSkKKyAgICAgICAgfHwgIW1fcGxh
eWVyLT52aXNpYmxlKCkKKwkJfHwgIWdfcFBsYXllcikKICAgICAgICAgcmV0dXJuOwotCisJZ19w
UGxheWVyLT5wYWludChjb250ZXh0LCByZWN0KTsKICAgICAvLyBUT0RPOiBQYWludCB0aGUgY29u
dGVudHMgb2YgdGhlIHZpZGVvIHRvIHRoZSBjb250ZXh0Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsK
IH0KIAogfQogCi0jZW5kaWYKKy8vI2VuZGlmCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vTWVkaWFQbGF5ZXJQcml2YXRlTWVkaWFGb3VuZGF0aW9uLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL01lZGlhUGxheWVy
UHJpdmF0ZU1lZGlhRm91bmRhdGlvbi5oCShyZXZpc2lvbiAxNjc3MzMpCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vTWVkaWFQbGF5ZXJQcml2YXRlTWVkaWFGb3VuZGF0
aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTI2LDExICsyNiwxMzIgQEAKIAogI2luY2x1ZGUgIk1l
ZGlhUGxheWVyUHJpdmF0ZS5oIgogCisjaW5jbHVkZSA8ZXZyLmg+CisjaW5jbHVkZSA8bWZhcGku
aD4NCisjaW5jbHVkZSA8bWZpZGwuaD4NCisjaW5jbHVkZSA8bWZlcnJvci5oPg0KKw0KK2VudW0g
UGxheWVyU3RhdGUNCit7DQorCUNsb3NlZCA9IDAsICAgICAvLyBObyBzZXNzaW9uLg0KKwlSZWFk
eSwgICAgICAgICAgLy8gU2Vzc2lvbiB3YXMgY3JlYXRlZCwgcmVhZHkgdG8gb3BlbiBhIGZpbGUu
DQorCU9wZW5QZW5kaW5nLCAgICAvLyBTZXNzaW9uIGlzIG9wZW5pbmcgYSBmaWxlLg0KKwlTdGFy
dGVkLCAgICAgICAgLy8gU2Vzc2lvbiBpcyBwbGF5aW5nIGEgZmlsZS4NCisJUGF1c2VkLCAgICAg
ICAgIC8vIFNlc3Npb24gaXMgcGF1c2VkLg0KKwlTdG9wcGVkLCAgICAgICAgLy8gU2Vzc2lvbiBp
cyBzdG9wcGVkIChyZWFkeSB0byBwbGF5KS4NCisJQ2xvc2luZyAgICAgICAgIC8vIEFwcGxpY2F0
aW9uIGhhcyBjbG9zZWQgdGhlIHNlc3Npb24sIGJ1dCBpcyB3YWl0aW5nIGZvciBNRVNlc3Npb25D
bG9zZWQuDQorfTsNCisNCitjbGFzcyBDUGxheWVyIDogcHVibGljIElNRkFzeW5jQ2FsbGJhY2sN
Cit7DQorcHVibGljOg0KKwlzdGF0aWMgSFJFU1VMVCBDcmVhdGVJbnN0YW5jZSgNCisJCUhXTkQg
aFZpZGVvLA0KKwkJSFdORCBoRXZlbnQsDQorCQlDUGxheWVyICoqcHBQbGF5ZXINCisJCSk7DQor
DQorCS8vIElVbmtub3duIG1ldGhvZHMNCisJU1RETUVUSE9ESU1QIFF1ZXJ5SW50ZXJmYWNlKFJF
RklJRCBpaWQsIHZvaWQqKiBwcHYpOw0KKwlTVERNRVRIT0RJTVBfKFVMT05HKSBBZGRSZWYoKTsN
CisJU1RETUVUSE9ESU1QXyhVTE9ORykgUmVsZWFzZSgpOw0KKw0KKwkvLyBJTUZBc3luY0NhbGxi
YWNrIG1ldGhvZHMNCisJU1RETUVUSE9ESU1QICBHZXRQYXJhbWV0ZXJzKERXT1JEKiwgRFdPUkQq
KQ0KKwl7DQorCQkvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBpcyBvcHRpb25hbC4N
CisJCXJldHVybiBFX05PVElNUEw7DQorCX0NCisJU1RETUVUSE9ESU1QICBJbnZva2UoSU1GQXN5
bmNSZXN1bHQqIHBBc3luY1Jlc3VsdCk7DQorDQorCS8vIFBsYXliYWNrDQorCUhSRVNVTFQgICAg
ICAgT3BlblVSTChQQ1dTVFIgc1VSTCk7DQorCUhSRVNVTFQgICAgICAgUGxheSgpOw0KKwlIUkVT
VUxUICAgICAgIFBhdXNlKCk7DQorCUhSRVNVTFQgICAgICAgU2h1dGRvd24oKTsNCisJSFJFU1VM
VCAgICAgICBIYW5kbGVFdmVudChVSU5UX1BUUiBwVW5rUHRyKTsNCisJUGxheWVyU3RhdGUgICBH
ZXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGU7IH0NCisNCisJZmxvYXQgZHVyYXRpb24o
KSBjb25zdDsNCisJdm9pZCBzZWVrKGZsb2F0KTsNCisJZmxvYXQgY3VycmVudFRpbWUoKSBjb25z
dDsNCisJV2ViQ29yZTo6SW50U2l6ZSBuYXR1cmFsU2l6ZSgpIGNvbnN0Ow0KKwlib29sIHBhdXNl
ZCgpIGNvbnN0Ow0KKwl2b2lkIHBhaW50KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dCogY29udGV4
dCwgY29uc3QgV2ViQ29yZTo6SW50UmVjdCYgcmVjdCk7DQorDQorCS8vIFZpZGVvIGZ1bmN0aW9u
YWxpdHkNCisJSFJFU1VMVCAgICAgICBSZXBhaW50KCk7DQorCUhSRVNVTFQgICAgICAgUmVzaXpl
VmlkZW8oV09SRCB3aWR0aCwgV09SRCBoZWlnaHQpOw0KKwlCT09MICAgICAgICAgIEhhc1ZpZGVv
KCkgY29uc3QgeyByZXR1cm4gKG1fcFZpZGVvRGlzcGxheSAhPSBOVUxMKTsgfQ0KKw0KK3Byb3Rl
Y3RlZDoNCisNCisJLy8gQ29uc3RydWN0b3IgaXMgcHJpdmF0ZS4gVXNlIHN0YXRpYyBDcmVhdGVJ
bnN0YW5jZSBtZXRob2QgdG8gaW5zdGFudGlhdGUuDQorCUNQbGF5ZXIoSFdORCBoVmlkZW8sIEhX
TkQgaEV2ZW50KTsNCisNCisJLy8gRGVzdHJ1Y3RvciBpcyBwcml2YXRlLiBDYWxsZXIgc2hvdWxk
IGNhbGwgUmVsZWFzZS4NCisJdmlydHVhbCB+Q1BsYXllcigpOw0KKw0KKwlIUkVTVUxUIEluaXRp
YWxpemUoKTsNCisJSFJFU1VMVCBDcmVhdGVTZXNzaW9uKCk7DQorCUhSRVNVTFQgQ2xvc2VTZXNz
aW9uKCk7DQorCUhSRVNVTFQgU3RhcnRQbGF5YmFjaygpOw0KKwlIUkVTVUxUIENyZWF0ZU1lZGlh
U291cmNlKFBDV1NUUiBzVVJMKTsNCisJSFJFU1VMVCBDcmVhdGVUb3BvbG9neUZyb21Tb3VyY2Uo
SU1GVG9wb2xvZ3kgKipwcFRvcG9sb2d5KTsNCisNCisJSFJFU1VMVCBBZGRCcmFuY2hUb1BhcnRp
YWxUb3BvbG9neSgNCisJCUlNRlRvcG9sb2d5ICpwVG9wb2xvZ3ksDQorCQlJTUZQcmVzZW50YXRp
b25EZXNjcmlwdG9yICpwU291cmNlUEQsDQorCQlEV09SRCBpU3RyZWFtDQorCQkpOw0KKw0KKwkv
LyBNZWRpYSBldmVudCBoYW5kbGVycw0KKwlIUkVTVUxUIE9uVG9wb2xvZ3lSZWFkeShJTUZNZWRp
YUV2ZW50ICpwRXZlbnQpOw0KKwlIUkVTVUxUIE9uUHJlc2VudGF0aW9uRW5kZWQoSU1GTWVkaWFF
dmVudCAqcEV2ZW50KTsNCisNCisJbG9uZyAgICAgICAgICAgICAgICAgICAgbV9uUmVmQ291bnQ7
ICAgICAgICAvLyBSZWZlcmVuY2UgY291bnQuDQorDQorCUlNRk1lZGlhU2Vzc2lvbiAgICAgICAg
ICptX3BTZXNzaW9uOw0KKwlJTUZNZWRpYVNvdXJjZSAgICAgICAgICAqbV9wU291cmNlOw0KKwlJ
TUZWaWRlb0Rpc3BsYXlDb250cm9sICAqbV9wVmlkZW9EaXNwbGF5Ow0KKw0KKwlIV05EICAgICAg
ICAgICAgICAgICAgICBtX2h3bmRWaWRlbzsgICAgICAgIC8vIFZpZGVvIHdpbmRvdy4NCisJSFdO
RCAgICAgICAgICAgICAgICAgICAgbV9od25kRXZlbnQ7ICAgICAgICAvLyBBcHAgd2luZG93IHRv
IHJlY2VpdmUgZXZlbnRzLg0KKwlQbGF5ZXJTdGF0ZSAgICAgICAgICAgICBtX3N0YXRlOyAgICAg
ICAgICAgIC8vIEN1cnJlbnQgc3RhdGUgb2YgdGhlIG1lZGlhIHNlc3Npb24uDQorCUhBTkRMRSAg
ICAgICAgICAgICAgICAgIG1faENsb3NlRXZlbnQ7ICAgICAgLy8gRXZlbnQgdG8gd2FpdCBvbiB3
aGlsZSBjbG9zaW5nDQorfTsKKw0KKyNpbmNsdWRlIDx3aW5kb3dzLmg+DQorI2luY2x1ZGUgPHNo
bHdhcGkuaD4NCisNCisvLyBNZWRpYSBGb3VuZGF0aW9uIGhlYWRlcnMNCisjaW5jbHVkZSA8bWZh
cGkuaD4NCisjaW5jbHVkZSA8bWZpZGwuaD4NCisjaW5jbHVkZSA8bWZlcnJvci5oPg0KKyNpbmNs
dWRlIDxldnIuaD4NCisNCisvLyBTYWZlIHN0cmluZyBmdW5jdGlvbnMNCisjaW5jbHVkZSA8c3Ry
c2FmZS5oPg0KKw0KK3RlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIFNhZmVSZWxlYXNlKFQgKipwcFQp
DQorew0KKwlpZiAoKnBwVCkNCisJew0KKwkJKCpwcFQpLT5SZWxlYXNlKCk7DQorCQkqcHBUID0g
TlVMTDsNCisJfQ0KK30NCisKKwogbmFtZXNwYWNlIFdlYkNvcmUgeworCQorY29uc3QgVUlOVCB3
ZWJraXRNZWRpYUZvdW5kYXRpb25FdmVudCA9IFdNX0FQUCArIDI7CiAKLWNsYXNzIE1lZGlhUGxh
eWVyUHJpdmF0ZU1lZGlhRm91bmRhdGlvbiA6IHB1YmxpYyBNZWRpYVBsYXllclByaXZhdGVJbnRl
cmZhY2UgeworY2xhc3MgTWVkaWFQbGF5ZXJQcml2YXRlTWVkaWFGb3VuZGF0aW9uIDogcHVibGlj
IE1lZGlhUGxheWVyUHJpdmF0ZUludGVyZmFjZXsKIHB1YmxpYzoKICAgICBNZWRpYVBsYXllclBy
aXZhdGVNZWRpYUZvdW5kYXRpb24oTWVkaWFQbGF5ZXIqKTsKKwl+TWVkaWFQbGF5ZXJQcml2YXRl
TWVkaWFGb3VuZGF0aW9uKCkgb3ZlcnJpZGU7CisKICAgICBzdGF0aWMgdm9pZCByZWdpc3Rlck1l
ZGlhRW5naW5lKE1lZGlhRW5naW5lUmVnaXN0cmFyKTsKIAogICAgIHN0YXRpYyBQYXNzT3duUHRy
PE1lZGlhUGxheWVyUHJpdmF0ZUludGVyZmFjZT4gY3JlYXRlKE1lZGlhUGxheWVyKik7CkBAIC01
Myw4ICsxNzQsMTMgQEAKIAogICAgIHZpcnR1YWwgYm9vbCBzZWVraW5nKCkgY29uc3Q7CiAKLSAg
ICB2aXJ0dWFsIGJvb2wgcGF1c2VkKCkgY29uc3Q7CisJdmlydHVhbCBmbG9hdCBjdXJyZW50VGlt
ZSgpIGNvbnN0IG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBzZWVrKGZsb2F0KSBvdmVycmlkZTsK
Kwl2aXJ0dWFsIGZsb2F0IGR1cmF0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisJdmlydHVhbCBmbG9h
dCBtYXhUaW1lU2Vla2FibGUoKSBjb25zdCBvdmVycmlkZTsKIAorCXZpcnR1YWwgYm9vbCBwYXVz
ZWQoKSBjb25zdDsKKwogICAgIHZpcnR1YWwgTWVkaWFQbGF5ZXI6Ok5ldHdvcmtTdGF0ZSBuZXR3
b3JrU3RhdGUoKSBjb25zdDsKICAgICB2aXJ0dWFsIE1lZGlhUGxheWVyOjpSZWFkeVN0YXRlIHJl
YWR5U3RhdGUoKSBjb25zdDsKIApAQCAtNjksNyArMTk1LDcgQEAKIHByaXZhdGU6CiAKICAgICBN
ZWRpYVBsYXllciogbV9wbGF5ZXI7Ci0KKwlIV05EIG1fd2luZG93OwogfTsKIAogfQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>